appium-chromedriver 5.2.15 → 5.2.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [5.2.16](https://github.com/appium/appium-chromedriver/compare/v5.2.15...v5.2.16) (2023-02-02)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Update Apple ARM architecture detection ([#287](https://github.com/appium/appium-chromedriver/issues/287)) ([a10d2d9](https://github.com/appium/appium-chromedriver/commit/a10d2d90f66632dd161aae47a95771fb1c7b5497))
7
+
1
8
  ## [5.2.15](https://github.com/appium/appium-chromedriver/compare/v5.2.14...v5.2.15) (2023-01-17)
2
9
 
3
10
 
@@ -12,6 +12,7 @@ var _xpath = _interopRequireDefault(require("xpath"));
12
12
  var _xmldom = require("@xmldom/xmldom");
13
13
  var _bluebird = _interopRequireDefault(require("bluebird"));
14
14
  var _path = _interopRequireDefault(require("path"));
15
+ var _os = _interopRequireDefault(require("os"));
15
16
  var _support = require("@appium/support");
16
17
  const TIMEOUT_MS = 15000;
17
18
  const MAX_PARALLEL_DOWNLOADS = 5;
@@ -191,14 +192,18 @@ class ChromedriverStorageClient {
191
192
  if (!_lodash.default.isEmpty(osInfo)) {
192
193
  let {
193
194
  name,
194
- arch,
195
- hardwareName
195
+ arch
196
196
  } = osInfo;
197
197
  if (arch === _utils.X64 && !driversToSync.some(cdName => cdName.includes(`_${name}${_utils.X64}`))) {
198
198
  arch = _utils.X86;
199
199
  }
200
- if (name === _utils.OS.mac && _lodash.default.includes(hardwareName, 'arm') && driversToSync.some(cdName => cdName.includes(_utils.M1_ARCH_SUFFIX))) {
201
- arch += _utils.M1_ARCH_SUFFIX;
200
+ if (name === _utils.OS.mac && _lodash.default.includes(_lodash.default.toLower(_os.default.cpus()[0].model), 'apple')) {
201
+ for (const armSuffix of _utils.APPLE_ARM_SUFFIXES) {
202
+ if (driversToSync.some(cdName => cdName.includes(armSuffix))) {
203
+ arch = armSuffix;
204
+ break;
205
+ }
206
+ }
202
207
  }
203
208
  log.debug(`Selecting chromedrivers whose platform matches to ${name}${arch}`);
204
209
  const platformRe = new RegExp(`(\\b|_)${name}${arch}\\b`);
@@ -292,4 +297,4 @@ class ChromedriverStorageClient {
292
297
  }
293
298
  var _default = ChromedriverStorageClient;
294
299
  exports.default = _default;
295
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ3JjT2siLCJzcmMiLCJjaGVja3N1bSIsIm1kNSIsImZzIiwiaGFzaCIsIl8iLCJ0b0xvd2VyIiwiZmluZENoaWxkTm9kZSIsInBhcmVudCIsImNoaWxkTmFtZSIsInRleHQiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGROb2RlSWR4IiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkTm9kZSIsImxvY2FsTmFtZSIsImNoaWxkVGV4dCIsImV4dHJhY3ROb2RlVGV4dCIsIm5vZGUiLCJmaXJzdENoaWxkIiwidXRpbCIsImhhc1ZhbHVlIiwibm9kZVZhbHVlIiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsImNocm9tZWRyaXZlckRpciIsImdldENocm9tZWRyaXZlckRpciIsInRpbWVvdXQiLCJtYXBwaW5nIiwicGFyc2VOb3RlcyIsImNvbnRlbnQiLCJyZXN1bHQiLCJ2ZXJzaW9uTWF0Y2giLCJleGVjIiwidmVyc2lvbiIsIm1pbkJyb3dzZXJWZXJzaW9uTWF0Y2giLCJtaW5Ccm93c2VyVmVyc2lvbiIsInJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8iLCJkcml2ZXJLZXkiLCJub3Rlc1VybCIsImluZm9EaWN0Iiwibm90ZXMiLCJyZXRyaWV2ZURhdGEiLCJhY2NlcHQiLCJkZWJ1ZyIsInBhcnNlU3RvcmFnZVhtbCIsImRvYyIsInNob3VsZFBhcnNlTm90ZXMiLCJkcml2ZXJOb2RlcyIsInhwYXRoIiwic2VsZWN0IiwiaXNFbXB0eSIsInByb21pc2VzIiwiZHJpdmVyTm9kZSIsImtleSIsImluY2x1ZGVzIiwiZXRhZyIsImNkSW5mbyIsInVybCIsIkNEX0NETiIsInRyaW0iLCJmaXJzdCIsInNwbGl0Iiwibm90ZXNQYXRoIiwiaXNOb3Rlc1ByZXNlbnQiLCJyZWR1Y2UiLCJhY2MiLCJpbmZvIiwicHVzaCIsIkIiLCJhbGwiLCJzaXplIiwicmV0cmlldmVNYXBwaW5nIiwieG1sIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiY2xvbmVEZWVwIiwidW56aXBEcml2ZXIiLCJkc3QiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJjaHJvbWVkcml2ZXJQYXRoIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXJlY3RvcnkiLCJwYXRoIiwicGFyc2UiLCJuYW1lIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwiYXJjaCIsImhhcmR3YXJlTmFtZSIsIlg2NCIsInNvbWUiLCJYODYiLCJPUyIsIm1hYyIsIk0xX0FSQ0hfU1VGRklYIiwicGxhdGZvcm1SZSIsIlJlZ0V4cCIsInRlc3QiLCJyZXRyaWV2ZURyaXZlciIsImluZGV4IiwiYXJjaGl2ZXNSb290IiwiaXNTdHJpY3QiLCJhcmNoaXZlUGF0aCIsInJlc29sdmUiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJpc01ldGVyZWQiLCJlIiwibXNnIiwibWVzc2FnZSIsImVycm9yIiwiZmlsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJ0YXJnZXRQYXRoIiwiY2htb2QiLCJzeW5jRHJpdmVycyIsImdldE9zSW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzeW5jaHJvbml6ZWREcml2ZXJzIiwiaWR4IiwiZW50cmllcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBnZXRDaHJvbWVkcml2ZXJEaXIsIENEX0NETiwgcmV0cmlldmVEYXRhLCBnZXRPc0luZm8sXG4gIE9TLCBYNjQsIFg4NiwgTTFfQVJDSF9TVUZGSVgsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB4cGF0aCBmcm9tICd4cGF0aCc7XG5pbXBvcnQgeyBET01QYXJzZXIgfSBmcm9tICdAeG1sZG9tL3htbGRvbSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHN5c3RlbSwgZnMsIGxvZ2dlciwgdGVtcERpciwgemlwLCB1dGlsLCBuZXQgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmNvbnN0IFRJTUVPVVRfTVMgPSAxNTAwMDtcbmNvbnN0IE1BWF9QQVJBTExFTF9ET1dOTE9BRFMgPSA1O1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50Jyk7XG5cblxuYXN5bmMgZnVuY3Rpb24gaXNDcmNPayAoc3JjLCBjaGVja3N1bSkge1xuICBjb25zdCBtZDUgPSBhd2FpdCBmcy5oYXNoKHNyYywgJ21kNScpO1xuICByZXR1cm4gXy50b0xvd2VyKG1kNSkgPT09IF8udG9Mb3dlcihjaGVja3N1bSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRDaGlsZE5vZGUgKHBhcmVudCwgY2hpbGROYW1lID0gbnVsbCwgdGV4dCA9IG51bGwpIHtcbiAgaWYgKCFjaGlsZE5hbWUgJiYgIXRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoIXBhcmVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAobGV0IGNoaWxkTm9kZUlkeCA9IDA7IGNoaWxkTm9kZUlkeCA8IHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aDsgY2hpbGROb2RlSWR4KyspIHtcbiAgICBjb25zdCBjaGlsZE5vZGUgPSBwYXJlbnQuY2hpbGROb2Rlc1tjaGlsZE5vZGVJZHhdO1xuICAgIGlmIChjaGlsZE5hbWUgJiYgIXRleHQgJiYgY2hpbGROYW1lID09PSBjaGlsZE5vZGUubG9jYWxOYW1lKSB7XG4gICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgIH1cbiAgICBpZiAodGV4dCkge1xuICAgICAgY29uc3QgY2hpbGRUZXh0ID0gZXh0cmFjdE5vZGVUZXh0KGNoaWxkTm9kZSk7XG4gICAgICBpZiAoIWNoaWxkVGV4dCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZE5hbWUgJiYgY2hpbGROYW1lID09PSBjaGlsZE5vZGUubG9jYWxOYW1lICYmIHRleHQgPT09IGNoaWxkVGV4dCkge1xuICAgICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgICAgfVxuICAgICAgaWYgKCFjaGlsZE5hbWUgJiYgdGV4dCA9PT0gY2hpbGRUZXh0KSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0Tm9kZVRleHQgKG5vZGUpIHtcbiAgcmV0dXJuICghbm9kZSB8fCAhbm9kZS5maXJzdENoaWxkIHx8ICF1dGlsLmhhc1ZhbHVlKG5vZGUuZmlyc3RDaGlsZC5ub2RlVmFsdWUpKVxuICAgID8gbnVsbFxuICAgIDogbm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZTtcbn1cblxuXG5jbGFzcyBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IHtcbiAgY29uc3RydWN0b3IgKGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNocm9tZWRyaXZlckRpciA9IGdldENocm9tZWRyaXZlckRpcigpLFxuICAgICAgdGltZW91dCA9IFRJTUVPVVRfTVMsXG4gICAgfSA9IGFyZ3M7XG4gICAgdGhpcy5jaHJvbWVkcml2ZXJEaXIgPSBjaHJvbWVkcml2ZXJEaXI7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgICB0aGlzLm1hcHBpbmcgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBBZGRpdGlvbmFsRHJpdmVyRGV0YWlsc1xuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IHZlcnNpb24gLSBDaHJvbWVkcml2ZXIgdmVyc2lvblxuICAgKiBvciBgbnVsbGAgaWYgaXQgY2Fubm90IGJlIGZvdW5kXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWluQnJvd3NlclZlcnNpb24gLSBUaGUgbWluaW11bSBicm93c2VyIHZlcnNpb25cbiAgICogc3VwcG9ydGVkIGJ5IGNocm9tZWRyaXZlciBvciBgbnVsbGAgaWYgaXQgY2Fubm90IGJlIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXRzIGFkZGl0aW9uYWwgY2hyb21lZHJpdmVyIGRldGFpbHMgZnJvbSBjaHJvbWVkcml2ZXJcbiAgICogcmVsZWFzZSBub3Rlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFJlbGVhc2Ugbm90ZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hyb21lZHJpdmVyXG4gICAqIEByZXR1cm5zIHtBZGRpdGlvbmFsRHJpdmVyRGV0YWlsc31cbiAgICovXG4gIHBhcnNlTm90ZXMgKGNvbnRlbnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSAvXlxccypbLV0rQ2hyb21lRHJpdmVyW1xcRF0rKFtcXGQuXSspL2ltLmV4ZWMoY29udGVudCk7XG4gICAgaWYgKHZlcnNpb25NYXRjaCkge1xuICAgICAgcmVzdWx0LnZlcnNpb24gPSB2ZXJzaW9uTWF0Y2hbMV07XG4gICAgfVxuICAgIGNvbnN0IG1pbkJyb3dzZXJWZXJzaW9uTWF0Y2ggPSAvXlxccypTdXBwb3J0cyBDaHJvbWVbXFxEXSsoXFxkKykvaW0uZXhlYyhjb250ZW50KTtcbiAgICBpZiAobWluQnJvd3NlclZlcnNpb25NYXRjaCkge1xuICAgICAgcmVzdWx0Lm1pbkJyb3dzZXJWZXJzaW9uID0gbWluQnJvd3NlclZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZHMgY2hyb21lZHJpdmVyIHJlbGVhc2Ugbm90ZXMgYW5kIHB1dHMgdGhlbVxuICAgKiBpbnRvIHRoZSBkaWN0aW9uYXJ5IGFyZ3VtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkcml2ZXJLZXkgLSBEcml2ZXIgdmVyc2lvbiBwbHVzIGFyY2hpdmUgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbm90ZXNVcmwgLSBUaGUgVVJMIG9mIGNocm9tZWRyaXZlciBub3Rlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gaW5mb0RpY3QgLSBUaGUgZGljdGlvbmFyeSBjb250YWluaW5nIGRyaXZlciBpbmZvLlxuICAgKiBUaGUgbWV0aG9kIGNhbGwgbXV0YXRlcyBieSBtZXJnaW5nIGBBZGRpdGlvbmFsRHJpdmVyRGV0YWlsc2BcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSByZWxlYXNlIG5vdGVzIGNhbm5vdCBiZSBkb3dubG9hZGVkXG4gICAqL1xuICBhc3luYyByZXRyaWV2ZUFkZGl0aW9uYWxEcml2ZXJJbmZvIChkcml2ZXJLZXksIG5vdGVzVXJsLCBpbmZvRGljdCkge1xuICAgIGNvbnN0IG5vdGVzID0gYXdhaXQgcmV0cmlldmVEYXRhKG5vdGVzVXJsLCB7XG4gICAgICAndXNlci1hZ2VudCc6ICdhcHBpdW0nLFxuICAgICAgYWNjZXB0OiAnKi8qJyxcbiAgICB9LCB7IHRpbWVvdXQ6IHRoaXMudGltZW91dCB9KTtcbiAgICBjb25zdCB7IG1pbkJyb3dzZXJWZXJzaW9uIH0gPSB0aGlzLnBhcnNlTm90ZXMobm90ZXMpO1xuICAgIGlmICghbWluQnJvd3NlclZlcnNpb24pIHtcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlIGRyaXZlciAnJHtkcml2ZXJLZXl9JyBkb2VzIG5vdCBjb250YWluIHZhbGlkIHJlbGVhc2Ugbm90ZXMgYXQgJHtub3Rlc1VybH0uIGAgK1xuICAgICAgICBgU2tpcHBpbmcgaXRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5mb0RpY3QubWluQnJvd3NlclZlcnNpb24gPSBtaW5Ccm93c2VyVmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgY2hyb21lZHJpdmVyIHN0b3JhZ2UgWE1MIGFuZCBzdG9yZXNcbiAgICogdGhlIHBhcnNlZCByZXN1bHRzIGludG8gYHRoaXMubWFwcGluZ2BcbiAgICpcbiAgICogQHBhcmFtIHtET01Eb2N1bWVudH0gZG9jIC0gVGhlIERPTSByZXByZXNlbnRhdGlvblxuICAgKiBvZiB0aGUgY2hyb21lZHJpdmVyIHN0b3JhZ2UgWE1MXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkUGFyc2VOb3RlcyBbdHJ1ZV0gLSBJZiBzZXQgdG8gYHRydWVgXG4gICAqIHRoZW4gYWRkaXRpb25hbCBkcml2ZXJzIGluZm9ybWF0aW9uIGlzIGdvaW5nIHRvIGJlIHBhcnNlZFxuICAgKiBhbmQgYXNzaWduZWQgdG8gYHRoaXMubWFwcGluZ2BcbiAgICovXG4gIGFzeW5jIHBhcnNlU3RvcmFnZVhtbCAoZG9jLCBzaG91bGRQYXJzZU5vdGVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGRyaXZlck5vZGVzID0geHBhdGguc2VsZWN0KGAvLypbbG9jYWwtbmFtZSguKT0nQ29udGVudHMnXWAsIGRvYyk7XG4gICAgbG9nLmRlYnVnKGBQYXJzZWQgJHtkcml2ZXJOb2Rlcy5sZW5ndGh9IGVudHJpZXMgZnJvbSBzdG9yYWdlIFhNTGApO1xuICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyTm9kZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRyaXZlck5vZGUgb2YgZHJpdmVyTm9kZXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IGV4dHJhY3ROb2RlVGV4dChmaW5kQ2hpbGROb2RlKGRyaXZlck5vZGUsICdLZXknKSk7XG4gICAgICBpZiAoIV8uaW5jbHVkZXMoa2V5LCAnL2Nocm9tZWRyaXZlcl8nKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXRhZyA9IGV4dHJhY3ROb2RlVGV4dChmaW5kQ2hpbGROb2RlKGRyaXZlck5vZGUsICdFVGFnJykpO1xuICAgICAgaWYgKCFldGFnKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgVGhlIGVudHJ5ICcke2tleX0nIGRvZXMgbm90IGNvbnRhaW4gdGhlIGNoZWNrc3VtLiBTa2lwcGluZyBpdGApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2RJbmZvID0ge1xuICAgICAgICB1cmw6IGAke0NEX0NETn0vJHtrZXl9YCxcbiAgICAgICAgZXRhZzogXy50cmltKGV0YWcsICdcIicpLFxuICAgICAgICB2ZXJzaW9uOiBfLmZpcnN0KGtleS5zcGxpdCgnLycpKSxcbiAgICAgIH07XG4gICAgICB0aGlzLm1hcHBpbmdba2V5XSA9IGNkSW5mbztcblxuICAgICAgY29uc3Qgbm90ZXNQYXRoID0gYCR7Y2RJbmZvLnZlcnNpb259L25vdGVzLnR4dGA7XG4gICAgICBjb25zdCBpc05vdGVzUHJlc2VudCA9ICEhZHJpdmVyTm9kZXNcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBub2RlKSA9PiBhY2MgfHwgZmluZENoaWxkTm9kZShub2RlLCAnS2V5Jywgbm90ZXNQYXRoKSwgZmFsc2UpO1xuICAgICAgaWYgKCFpc05vdGVzUHJlc2VudCkge1xuICAgICAgICBjZEluZm8ubWluQnJvd3NlclZlcnNpb24gPSBudWxsO1xuICAgICAgICBpZiAoc2hvdWxkUGFyc2VOb3Rlcykge1xuICAgICAgICAgIGxvZy5pbmZvKGBUaGUgZW50cnkgJyR7a2V5fScgZG9lcyBub3QgY29udGFpbiBhbnkgbm90ZXMuIFNraXBwaW5nIGl0YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRQYXJzZU5vdGVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9taXNlcy5wdXNoKHRoaXMucmV0cmlldmVBZGRpdGlvbmFsRHJpdmVySW5mbyhrZXksIGAke0NEX0NETn0vJHtub3Rlc1BhdGh9YCwgY2RJbmZvKSk7XG4gICAgICBpZiAocHJvbWlzZXMubGVuZ3RoICUgTUFYX1BBUkFMTEVMX0RPV05MT0FEUyA9PT0gMCkge1xuICAgICAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICBsb2cuaW5mbyhgVGhlIHRvdGFsIGNvdW50IG9mIGVudHJpZXMgaW4gdGhlIG1hcHBpbmc6ICR7Xy5zaXplKHRoaXMubWFwcGluZyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRHJpdmVyRGV0YWlsc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIC0gVGhlIGZ1bGwgdXJsIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRyaXZlciBpblxuICAgKiB0aGUgcmVtb3RlIHN0b3JhZ2VcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGV0YWcgLSBUaGUgQ1JDIG9mIHRoZSBkcml2ZXIgYXJjaGl2ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIENocm9tZWRyaXZlciB2ZXJzaW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBDaHJvbWVkcml2ZXJzTWFwcGluZ1xuICAgKiBAcHJvcGVydHkge0RyaXZlckRldGFpbHN9IC0gVGhlIGtleXMgYXJlIHVuaXF1ZSBkcml2ZXIgaWRlbnRpZmllcnNcbiAgICogKHZlcnNpb24vYXJjaGl2ZSBuYW1lKS4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGhhdmUgYERyaXZlckRldGFpbHNgXG4gICAqIGNvbnRhaW5pbmcgY2hyb21lZHJpdmVyIGRldGFpbHNcbiAgICovXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBjaHJvbWVkcml2ZXIgbWFwcGluZyBmcm9tIHRoZSBzdG9yYWdlXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkUGFyc2VOb3RlcyBbdHJ1ZV0gLSBpZiBzZXQgdG8gYHRydWVgXG4gICAqIHRoZW4gYWRkaXRpb25hbCBjaHJvbWVkcml2ZXJzIGluZm8gaXMgZ29pbmcgdG8gYmUgcmV0cmlldmVkIGFuZFxuICAgKiBwYXJzZWQgZnJvbSByZWxlYXNlIG5vdGVzXG4gICAqIEByZXR1cm5zIHtDaHJvbWVkcml2ZXJzTWFwcGluZ31cbiAgICovXG4gIGFzeW5jIHJldHJpZXZlTWFwcGluZyAoc2hvdWxkUGFyc2VOb3RlcyA9IHRydWUpIHtcbiAgICBjb25zdCB4bWwgPSBhd2FpdCByZXRyaWV2ZURhdGEoQ0RfQ0ROLCB7XG4gICAgICAndXNlci1hZ2VudCc6ICdhcHBpdW0nLFxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24veG1sLCAqLyonLFxuICAgIH0sIHsgdGltZW91dDogdGhpcy50aW1lb3V0IH0pO1xuICAgIGNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoeG1sKTtcbiAgICBhd2FpdCB0aGlzLnBhcnNlU3RvcmFnZVhtbChkb2MsIHNob3VsZFBhcnNlTm90ZXMpO1xuICAgIHJldHVybiBfLmNsb25lRGVlcCh0aGlzLm1hcHBpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGRvd25sb2FkZWQgY2hyb21lZHJpdmVyIGFyY2hpdmVcbiAgICogaW50byB0aGUgZ2l2ZW4gZGVzdGluYXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNyYyAtIFRoZSBzb3VyY2UgYXJjaGl2ZSBwYXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkc3QgLSBUaGUgZGVzdGluYXRpb24gY2hyb21lZHJpdmVyIHBhdGhcbiAgICovXG4gIGFzeW5jIHVuemlwRHJpdmVyIChzcmMsIGRzdCkge1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyhzcmMsIHRtcFJvb3QpO1xuICAgICAgY29uc3QgY2hyb21lZHJpdmVyUGF0aCA9IGF3YWl0IGZzLndhbGtEaXIodG1wUm9vdCwgdHJ1ZSwgKGl0ZW1QYXRoLCBpc0RpcmVjdG9yeSkgPT5cbiAgICAgICAgIWlzRGlyZWN0b3J5ICYmIF8udG9Mb3dlcihwYXRoLnBhcnNlKGl0ZW1QYXRoKS5uYW1lKSA9PT0gJ2Nocm9tZWRyaXZlcicpO1xuICAgICAgaWYgKCFjaHJvbWVkcml2ZXJQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGFyY2hpdmUgd2FzIHVuemlwcGVkIHByb3Blcmx5LCBidXQgd2UgY291bGQgbm90IGZpbmQgYW55IGNocm9tZWRyaXZlciBleGVjdXRhYmxlJyk7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYE1vdmluZyB0aGUgZXh0cmFjdGVkICcke3BhdGguYmFzZW5hbWUoY2hyb21lZHJpdmVyUGF0aCl9JyB0byAnJHtkc3R9J2ApO1xuICAgICAgYXdhaXQgZnMubXYoY2hyb21lZHJpdmVyUGF0aCwgZHN0LCB7XG4gICAgICAgIG1rZGlycDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT1NJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGhvc3QgT1NcbiAgICogQ2FuIGJlIGVpdGhlciBgbWFjYCwgYHdpbmRvd3NgIG9yIGBsaW51eGBcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFyY2ggLSBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBob3N0IE9ELlxuICAgKiBDYW4gYmUgZWl0aGVyIGAzMmAgb3IgYDY0YFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IGhhcmR3YXJlTmFtZSAtIFRoZSBvdXRwdXQgb2YgYHVuYW1lIC1tYCBjb21tYW5kXG4gICAqIG9uIGxpbnV4IGFuZCBtYWMgc3lzdGVtcy4gYG51bGxgIG9uIFdpbmRvd3NcbiAgICovXG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYHRoaXMubWFwcGluZ2AgdG8gb25seSBzZWxlY3QgbWF0Y2hpbmdcbiAgICogY2hyb21lZHJpdmVyIGVudHJpZXMgYnkgb3BlcmF0aW5nIHN5c3RlbSBpbmZvcm1hdGlvblxuICAgKiBhbmQvb3IgYWRkaXRpb25hbCBzeW5jaHJvbml6YXRpb24gb3B0aW9ucyAoaWYgcHJvdmlkZWQpXG4gICAqXG4gICAqIEBwYXJhbSB7P09TSW5mb30gb3NJbmZvXG4gICAqIEBwYXJhbSB7P1N5bmNPcHRpb25zfSBvcHRzXG4gICAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBmaWx0ZXJlZCBjaHJvbWVkcml2ZXJcbiAgICogZW50cnkgbmFtZXMgKHZlcnNpb24vYXJjaGl2ZSBuYW1lKVxuICAgKi9cbiAgc2VsZWN0TWF0Y2hpbmdEcml2ZXJzIChvc0luZm8sIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1pbkJyb3dzZXJWZXJzaW9uLFxuICAgICAgdmVyc2lvbnMgPSBbXSxcbiAgICB9ID0gb3B0cztcbiAgICBsZXQgZHJpdmVyc1RvU3luYyA9IF8ua2V5cyh0aGlzLm1hcHBpbmcpO1xuXG4gICAgaWYgKCFfLmlzRW1wdHkodmVyc2lvbnMpKSB7XG4gICAgICAvLyBIYW5kbGUgb25seSBzZWxlY3RlZCB2ZXJzaW9ucyBpZiByZXF1ZXN0ZWRcbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgdmVyc2lvbnMgbWF0Y2ggdG8gJHt2ZXJzaW9uc31gKTtcbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jXG4gICAgICAgIC5maWx0ZXIoKGNkTmFtZSkgPT4gdmVyc2lvbnMuaW5jbHVkZXMoYCR7dGhpcy5tYXBwaW5nW2NkTmFtZV0udmVyc2lvbn1gKSk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWlzTmFOKG1pbkJyb3dzZXJWZXJzaW9uKSkge1xuICAgICAgLy8gT25seSBzZWxlY3QgZHJpdmVycyB0aGF0IHN1cHBvcnQgdGhlIGN1cnJlbnQgYnJvd3NlciB3aG9zZSBtYWpvciB2ZXJzaW9uIG51bWJlciBlcXVhbHMgdG8gYG1pbkJyb3dzZXJWZXJzaW9uYFxuICAgICAgY29uc3QgbWluQnJvd3NlclZlcnNpb25JbnQgPSBwYXJzZUludChtaW5Ccm93c2VyVmVyc2lvbiwgMTApO1xuICAgICAgbG9nLmRlYnVnKGBTZWxlY3RpbmcgY2hyb21lZHJpdmVycyB3aG9zZSBtaW5pbXVtIHN1cHBvcnRlZCBicm93c2VyIHZlcnNpb24gbWF0Y2hlcyB0byAke21pbkJyb3dzZXJWZXJzaW9uSW50fWApO1xuICAgICAgbGV0IGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA9IDA7XG4gICAgICAvLyBTZWxlY3QgdGhlIG5ld2VzdCBhdmFpbGFibGUgYW5kIGNvbXBhdGlibGUgY2hyb21lZHJpdmVyXG4gICAgICBmb3IgKGNvbnN0IGNkTmFtZSBvZiBkcml2ZXJzVG9TeW5jKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbiA9IHBhcnNlSW50KHRoaXMubWFwcGluZ1tjZE5hbWVdLm1pbkJyb3dzZXJWZXJzaW9uLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4oY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uKVxuICAgICAgICAgICAgJiYgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uIDw9IG1pbkJyb3dzZXJWZXJzaW9uSW50XG4gICAgICAgICAgICAmJiBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPCBjdXJyZW50TWluQnJvd3NlclZlcnNpb24pIHtcbiAgICAgICAgICBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPSBjdXJyZW50TWluQnJvd3NlclZlcnNpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jLmZpbHRlcigoY2ROYW1lKSA9PiBgJHt0aGlzLm1hcHBpbmdbY2ROYW1lXS5taW5Ccm93c2VyVmVyc2lvbn1gID09PVxuICAgICAgICBgJHtjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPiAwID8gY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyIDogbWluQnJvd3NlclZlcnNpb25JbnR9YCk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgV2lsbCBzZWxlY3QgY2FuZGlkYXRlICR7dXRpbC5wbHVyYWxpemUoJ2RyaXZlcicsIGRyaXZlcnNUb1N5bmMubGVuZ3RoKX0gYCArXG4gICAgICAgIGB2ZXJzaW9uZWQgYXMgJyR7Xy51bmlxKGRyaXZlcnNUb1N5bmMubWFwKChjZE5hbWUpID0+IHRoaXMubWFwcGluZ1tjZE5hbWVdLnZlcnNpb24pKX0nYCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzRW1wdHkob3NJbmZvKSkge1xuICAgICAgLy8gRmlsdGVyIG91dCBkcml2ZXJzIGZvciB1bnN1cHBvcnRlZCBzeXN0ZW0gYXJjaGl0ZWN0dXJlc1xuICAgICAgbGV0IHtuYW1lLCBhcmNoLCBoYXJkd2FyZU5hbWV9ID0gb3NJbmZvO1xuICAgICAgaWYgKGFyY2ggPT09IFg2NCAmJiAhZHJpdmVyc1RvU3luYy5zb21lKChjZE5hbWUpID0+IGNkTmFtZS5pbmNsdWRlcyhgXyR7bmFtZX0ke1g2NH1gKSkpIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHg4NiBidWlsZCBpZiB4NjQgb25lIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBnaXZlbiBPU1xuICAgICAgICBhcmNoID0gWDg2O1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IE9TLm1hYyAmJiBfLmluY2x1ZGVzKGhhcmR3YXJlTmFtZSwgJ2FybScpXG4gICAgICAgICAgJiYgZHJpdmVyc1RvU3luYy5zb21lKChjZE5hbWUpID0+IGNkTmFtZS5pbmNsdWRlcyhNMV9BUkNIX1NVRkZJWCkpKSB7XG4gICAgICAgIC8vIHByZWZlciBleGVjdXRhYmxlIGZvciBNMSBhcmNoIGlmIHByZXNlbnRcbiAgICAgICAgYXJjaCArPSBNMV9BUkNIX1NVRkZJWDtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgcGxhdGZvcm0gbWF0Y2hlcyB0byAke25hbWV9JHthcmNofWApO1xuICAgICAgY29uc3QgcGxhdGZvcm1SZSA9IG5ldyBSZWdFeHAoYChcXFxcYnxfKSR7bmFtZX0ke2FyY2h9XFxcXGJgKTtcbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jLmZpbHRlcigoY2ROYW1lKSA9PiBwbGF0Zm9ybVJlLnRlc3QoY2ROYW1lKSk7XG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBkcml2ZXJzVG9TeW5jO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gY2hyb21lZHJpdmVyIGZyb20gdGhlIHN0b3JhZ2VcbiAgICogYW5kIHVucGFja3MgaXQgaW50byBgdGhpcy5jaHJvbWVkcml2ZXJEaXJgIGZvbGRlclxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgdW5pcXVlIGRyaXZlciBpbmRleFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZHJpdmVyS2V5IC0gVGhlIGRyaXZlciBrZXkgaW4gYHRoaXMubWFwcGluZ2BcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVzUm9vdCAtIFRoZSB0ZW1wb3JhcnkgZm9sZGVyIHBhdGggdG8gZXh0cmFjdFxuICAgKiBkb3dubG9hZGVkIGFyY2hpdmVzIHRvXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTdHJpY3QgW3RydWVdIC0gV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciAoYHRydWVgKVxuICAgKiBvciByZXR1cm4gYSBib29sZWFuIHJlc3VsdCBpZiB0aGUgZHJpdmVyIHJldHJpZXZhbCBwcm9jZXNzIGZhaWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHJldHJpZXZpbmcgdGhlIGRyaXZlclxuICAgKiBhbmQgYGlzU3RyaWN0YCBpcyBzZXQgdG8gYHRydWVgXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBpZiBgdHJ1ZWAgdGhlbiB0aGUgY2hyb21lZHJpdmVyIGlzIHN1Y2Nlc3NmdWxseVxuICAgKiBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWQuXG4gICAqL1xuICBhc3luYyByZXRyaWV2ZURyaXZlciAoaW5kZXgsIGRyaXZlcktleSwgYXJjaGl2ZXNSb290LCBpc1N0cmljdCA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyB1cmwsIGV0YWcsIHZlcnNpb24gfSA9IHRoaXMubWFwcGluZ1tkcml2ZXJLZXldO1xuICAgIGNvbnN0IGFyY2hpdmVQYXRoID0gcGF0aC5yZXNvbHZlKGFyY2hpdmVzUm9vdCwgYCR7aW5kZXh9LnppcGApO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyAnJHt1cmx9JyB0byAnJHthcmNoaXZlUGF0aH0nYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldC5kb3dubG9hZEZpbGUodXJsLCBhcmNoaXZlUGF0aCwge1xuICAgICAgICBpc01ldGVyZWQ6IGZhbHNlLFxuICAgICAgICB0aW1lb3V0OiBUSU1FT1VUX01TXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBtc2cgPSBgQ2Fubm90IGRvd25sb2FkIGNocm9tZWRyaXZlciBhcmNoaXZlLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YDtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihtc2cpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWF3YWl0IGlzQ3JjT2soYXJjaGl2ZVBhdGgsIGV0YWcpKSB7XG4gICAgICBjb25zdCBtc2cgPSBgVGhlIGNoZWNrc3VtIGZvciB0aGUgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXIgJyR7ZHJpdmVyS2V5fScgZGlkIG5vdCBtYXRjaGA7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IobXNnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWUgPSBgJHtwYXRoLnBhcnNlKHVybCkubmFtZX1fdiR7dmVyc2lvbn1gICtcbiAgICAgIChzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJyk7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLmNocm9tZWRyaXZlckRpciwgZmlsZU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnVuemlwRHJpdmVyKGFyY2hpdmVQYXRoLCB0YXJnZXRQYXRoKTtcbiAgICAgIGF3YWl0IGZzLmNobW9kKHRhcmdldFBhdGgsIDBvNzU1KTtcbiAgICAgIGxvZy5kZWJ1ZyhgUGVybWlzc2lvbnMgb2YgdGhlIGZpbGUgJyR7dGFyZ2V0UGF0aH0nIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDc1NWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKGUubWVzc2FnZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFN5bmNPcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXk8U3RyaW5nPn0gdmVyc2lvbnMgLSBUaGUgbGlzdCBvZiBjaHJvbWVkcml2ZXJcbiAgICogdmVyc2lvbnMgdG8gc3luYy4gSWYgZW1wdHkgKHRoZSBkZWZhdWx0IHZhbHVlKSB0aGVuIGFsbCBhdmFpbGFibGVcbiAgICogY2hyb21lZHJpdmVycyBhcmUgZ29pbmcgdG8gYmUgZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bWJlcn0gbWluQnJvd3NlclZlcnNpb24gLSBUaGUgbWludW11bSBzdXBwb3J0ZWRcbiAgICogQ2hyb21lIHZlcnNpb24gdGhhdCBkb3dubG9hZGVkIGNocm9tZWRyaXZlcnMgc2hvdWxkIHN1cHBvcnQuIENhbiBtYXRjaFxuICAgKiBtdWx0aXBsZSBkcml2ZXJzLlxuICAgKiBAcHJvcGVydHkgez9PU0luZm99IG9zSW5mbyAtIFN5c3RlbSBpbmZvcm1hdGlvbiB1c2VkIHRvIGZpbHRlciBvdXRcbiAgICogdGhlIGxpc3Qgb2YgdGhlIHJldHJpZXZlZCBkcml2ZXJzLiBJZiBub3QgcHJvdmlkZWQgdGhlbiB0aGUgc2NyaXB0XG4gICAqIHdpbGwgdHJ5IHRvIHJldHJpZXZlIGl0LlxuICAgKi9cblxuICAvKipcbiAgICogUmV0cmlldmVzIGNocm9tZWRyaXZlcnMgZnJvbSB0aGUgcmVtb3RlIHN0b3JhZ2VcbiAgICogdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtXG4gICAqXG4gICAqIEBwYXJhbSB7P1N5bmNPcHRpb25zfSBvcHRzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHdoaWxlIHJldHJpZXZpbmdcbiAgICogdGhlIGRyaXZlcnNcbiAgICogQHJldHVybnMge0FycmF5PFN0cmluZ30gVGhlIGxpc3Qgb2Ygc3VjY2Vzc2Z1bGx5IHN5bmNocm9uaXplZCBkcml2ZXIga2V5c1xuICAgKi9cbiAgYXN5bmMgc3luY0RyaXZlcnMgKG9wdHMgPSB7fSkge1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5tYXBwaW5nKSkge1xuICAgICAgYXdhaXQgdGhpcy5yZXRyaWV2ZU1hcHBpbmcoISFvcHRzLm1pbkJyb3dzZXJWZXJzaW9uKTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLm1hcHBpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBjaHJvbWVkcml2ZXJzIG1hcHBpbmcgZnJvbSBHb29nbGUgc3RvcmFnZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGRyaXZlcnNUb1N5bmMgPSB0aGlzLnNlbGVjdE1hdGNoaW5nRHJpdmVycyhvcHRzLm9zSW5mbyA/PyBhd2FpdCBnZXRPc0luZm8oKSwgb3B0cyk7XG4gICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGVyZSBhcmUgbm8gZHJpdmVycyB0byBzeW5jLiBFeGl0aW5nYCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2RyaXZlcicsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX0gdG8gc3luYzogYCArXG4gICAgICBKU09OLnN0cmluZ2lmeShkcml2ZXJzVG9TeW5jLCBudWxsLCAyKSk7XG5cbiAgICBjb25zdCBzeW5jaHJvbml6ZWREcml2ZXJzID0gW107XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICBjb25zdCBhcmNoaXZlc1Jvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBbaWR4LCBkcml2ZXJLZXldIG9mIGRyaXZlcnNUb1N5bmMuZW50cmllcygpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5yZXRyaWV2ZURyaXZlcihpZHgsIGRyaXZlcktleSwgYXJjaGl2ZXNSb290LCAhXy5pc0VtcHR5KG9wdHMpKSkge1xuICAgICAgICAgICAgc3luY2hyb25pemVkRHJpdmVycy5wdXNoKGRyaXZlcktleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpKTtcblxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoICUgTUFYX1BBUkFMTEVMX0RPV05MT0FEUyA9PT0gMCkge1xuICAgICAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYoYXJjaGl2ZXNSb290KTtcbiAgICB9XG4gICAgaWYgKCFfLmlzRW1wdHkoc3luY2hyb25pemVkRHJpdmVycykpIHtcbiAgICAgIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgc3luY2hyb25pemVkIGAgK1xuICAgICAgICBgJHt1dGlsLnBsdXJhbGl6ZSgnY2hyb21lZHJpdmVyJywgc3luY2hyb25pemVkRHJpdmVycy5sZW5ndGgsIHRydWUpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbyhgTm8gY2hyb21lZHJpdmVycyB3ZXJlIHN5bmNocm9uaXplZGApO1xuICAgIH1cbiAgICByZXR1cm4gc3luY2hyb25pemVkRHJpdmVycztcbiAgfVxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IENocm9tZWRyaXZlclN0b3JhZ2VDbGll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
300
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ3JjT2siLCJzcmMiLCJjaGVja3N1bSIsIm1kNSIsImZzIiwiaGFzaCIsIl8iLCJ0b0xvd2VyIiwiZmluZENoaWxkTm9kZSIsInBhcmVudCIsImNoaWxkTmFtZSIsInRleHQiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGROb2RlSWR4IiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkTm9kZSIsImxvY2FsTmFtZSIsImNoaWxkVGV4dCIsImV4dHJhY3ROb2RlVGV4dCIsIm5vZGUiLCJmaXJzdENoaWxkIiwidXRpbCIsImhhc1ZhbHVlIiwibm9kZVZhbHVlIiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsImNocm9tZWRyaXZlckRpciIsImdldENocm9tZWRyaXZlckRpciIsInRpbWVvdXQiLCJtYXBwaW5nIiwicGFyc2VOb3RlcyIsImNvbnRlbnQiLCJyZXN1bHQiLCJ2ZXJzaW9uTWF0Y2giLCJleGVjIiwidmVyc2lvbiIsIm1pbkJyb3dzZXJWZXJzaW9uTWF0Y2giLCJtaW5Ccm93c2VyVmVyc2lvbiIsInJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8iLCJkcml2ZXJLZXkiLCJub3Rlc1VybCIsImluZm9EaWN0Iiwibm90ZXMiLCJyZXRyaWV2ZURhdGEiLCJhY2NlcHQiLCJkZWJ1ZyIsInBhcnNlU3RvcmFnZVhtbCIsImRvYyIsInNob3VsZFBhcnNlTm90ZXMiLCJkcml2ZXJOb2RlcyIsInhwYXRoIiwic2VsZWN0IiwiaXNFbXB0eSIsInByb21pc2VzIiwiZHJpdmVyTm9kZSIsImtleSIsImluY2x1ZGVzIiwiZXRhZyIsImNkSW5mbyIsInVybCIsIkNEX0NETiIsInRyaW0iLCJmaXJzdCIsInNwbGl0Iiwibm90ZXNQYXRoIiwiaXNOb3Rlc1ByZXNlbnQiLCJyZWR1Y2UiLCJhY2MiLCJpbmZvIiwicHVzaCIsIkIiLCJhbGwiLCJzaXplIiwicmV0cmlldmVNYXBwaW5nIiwieG1sIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiY2xvbmVEZWVwIiwidW56aXBEcml2ZXIiLCJkc3QiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJjaHJvbWVkcml2ZXJQYXRoIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXJlY3RvcnkiLCJwYXRoIiwicGFyc2UiLCJuYW1lIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwiYXJjaCIsIlg2NCIsInNvbWUiLCJYODYiLCJPUyIsIm1hYyIsIm9zIiwiY3B1cyIsIm1vZGVsIiwiYXJtU3VmZml4IiwiQVBQTEVfQVJNX1NVRkZJWEVTIiwicGxhdGZvcm1SZSIsIlJlZ0V4cCIsInRlc3QiLCJyZXRyaWV2ZURyaXZlciIsImluZGV4IiwiYXJjaGl2ZXNSb290IiwiaXNTdHJpY3QiLCJhcmNoaXZlUGF0aCIsInJlc29sdmUiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJpc01ldGVyZWQiLCJlIiwibXNnIiwibWVzc2FnZSIsImVycm9yIiwiZmlsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJ0YXJnZXRQYXRoIiwiY2htb2QiLCJzeW5jRHJpdmVycyIsImdldE9zSW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzeW5jaHJvbml6ZWREcml2ZXJzIiwiaWR4IiwiZW50cmllcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBnZXRDaHJvbWVkcml2ZXJEaXIsIENEX0NETiwgcmV0cmlldmVEYXRhLCBnZXRPc0luZm8sXG4gIE9TLCBYNjQsIFg4NiwgQVBQTEVfQVJNX1NVRkZJWEVTLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeHBhdGggZnJvbSAneHBhdGgnO1xuaW1wb3J0IHsgRE9NUGFyc2VyIH0gZnJvbSAnQHhtbGRvbS94bWxkb20nO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcywgbG9nZ2VyLCB0ZW1wRGlyLCB6aXAsIHV0aWwsIG5ldCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cblxuY29uc3QgVElNRU9VVF9NUyA9IDE1MDAwO1xuY29uc3QgTUFYX1BBUkFMTEVMX0RPV05MT0FEUyA9IDU7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0Nocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQnKTtcblxuXG5hc3luYyBmdW5jdGlvbiBpc0NyY09rIChzcmMsIGNoZWNrc3VtKSB7XG4gIGNvbnN0IG1kNSA9IGF3YWl0IGZzLmhhc2goc3JjLCAnbWQ1Jyk7XG4gIHJldHVybiBfLnRvTG93ZXIobWQ1KSA9PT0gXy50b0xvd2VyKGNoZWNrc3VtKTtcbn1cblxuZnVuY3Rpb24gZmluZENoaWxkTm9kZSAocGFyZW50LCBjaGlsZE5hbWUgPSBudWxsLCB0ZXh0ID0gbnVsbCkge1xuICBpZiAoIWNoaWxkTmFtZSAmJiAhdGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChsZXQgY2hpbGROb2RlSWR4ID0gMDsgY2hpbGROb2RlSWR4IDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBjaGlsZE5vZGVJZHgrKykge1xuICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBhcmVudC5jaGlsZE5vZGVzW2NoaWxkTm9kZUlkeF07XG4gICAgaWYgKGNoaWxkTmFtZSAmJiAhdGV4dCAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUpIHtcbiAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgfVxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBjaGlsZFRleHQgPSBleHRyYWN0Tm9kZVRleHQoY2hpbGROb2RlKTtcbiAgICAgIGlmICghY2hpbGRUZXh0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkTmFtZSAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUgJiYgdGV4dCA9PT0gY2hpbGRUZXh0KSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgICB9XG4gICAgICBpZiAoIWNoaWxkTmFtZSAmJiB0ZXh0ID09PSBjaGlsZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3ROb2RlVGV4dCAobm9kZSkge1xuICByZXR1cm4gKCFub2RlIHx8ICFub2RlLmZpcnN0Q2hpbGQgfHwgIXV0aWwuaGFzVmFsdWUobm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZSkpXG4gICAgPyBudWxsXG4gICAgOiBub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlO1xufVxuXG5cbmNsYXNzIENocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hyb21lZHJpdmVyRGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKCksXG4gICAgICB0aW1lb3V0ID0gVElNRU9VVF9NUyxcbiAgICB9ID0gYXJncztcbiAgICB0aGlzLmNocm9tZWRyaXZlckRpciA9IGNocm9tZWRyaXZlckRpcjtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIHRoaXMubWFwcGluZyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmVyc2lvbiAtIENocm9tZWRyaXZlciB2ZXJzaW9uXG4gICAqIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBtaW5Ccm93c2VyVmVyc2lvbiAtIFRoZSBtaW5pbXVtIGJyb3dzZXIgdmVyc2lvblxuICAgKiBzdXBwb3J0ZWQgYnkgY2hyb21lZHJpdmVyIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEdldHMgYWRkaXRpb25hbCBjaHJvbWVkcml2ZXIgZGV0YWlscyBmcm9tIGNocm9tZWRyaXZlclxuICAgKiByZWxlYXNlIG5vdGVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gUmVsZWFzZSBub3RlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjaHJvbWVkcml2ZXJcbiAgICogQHJldHVybnMge0FkZGl0aW9uYWxEcml2ZXJEZXRhaWxzfVxuICAgKi9cbiAgcGFyc2VOb3RlcyAoY29udGVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IC9eXFxzKlstXStDaHJvbWVEcml2ZXJbXFxEXSsoW1xcZC5dKykvaW0uZXhlYyhjb250ZW50KTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQudmVyc2lvbiA9IHZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gICAgY29uc3QgbWluQnJvd3NlclZlcnNpb25NYXRjaCA9IC9eXFxzKlN1cHBvcnRzIENocm9tZVtcXERdKyhcXGQrKS9pbS5leGVjKGNvbnRlbnQpO1xuICAgIGlmIChtaW5Ccm93c2VyVmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQubWluQnJvd3NlclZlcnNpb24gPSBtaW5Ccm93c2VyVmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkcyBjaHJvbWVkcml2ZXIgcmVsZWFzZSBub3RlcyBhbmQgcHV0cyB0aGVtXG4gICAqIGludG8gdGhlIGRpY3Rpb25hcnkgYXJndW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRyaXZlcktleSAtIERyaXZlciB2ZXJzaW9uIHBsdXMgYXJjaGl2ZSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBub3Rlc1VybCAtIFRoZSBVUkwgb2YgY2hyb21lZHJpdmVyIG5vdGVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvRGljdCAtIFRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgZHJpdmVyIGluZm8uXG4gICAqIFRoZSBtZXRob2QgY2FsbCBtdXRhdGVzIGJ5IG1lcmdpbmcgYEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzYFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHJlbGVhc2Ugbm90ZXMgY2Fubm90IGJlIGRvd25sb2FkZWRcbiAgICovXG4gIGFzeW5jIHJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8gKGRyaXZlcktleSwgbm90ZXNVcmwsIGluZm9EaWN0KSB7XG4gICAgY29uc3Qgbm90ZXMgPSBhd2FpdCByZXRyaWV2ZURhdGEobm90ZXNVcmwsIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICcqLyonLFxuICAgIH0sIHsgdGltZW91dDogdGhpcy50aW1lb3V0IH0pO1xuICAgIGNvbnN0IHsgbWluQnJvd3NlclZlcnNpb24gfSA9IHRoaXMucGFyc2VOb3Rlcyhub3Rlcyk7XG4gICAgaWYgKCFtaW5Ccm93c2VyVmVyc2lvbikge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgZHJpdmVyICcke2RyaXZlcktleX0nIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgcmVsZWFzZSBub3RlcyBhdCAke25vdGVzVXJsfS4gYCArXG4gICAgICAgIGBTa2lwcGluZyBpdGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbmZvRGljdC5taW5Ccm93c2VyVmVyc2lvbiA9IG1pbkJyb3dzZXJWZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUwgYW5kIHN0b3Jlc1xuICAgKiB0aGUgcGFyc2VkIHJlc3VsdHMgaW50byBgdGhpcy5tYXBwaW5nYFxuICAgKlxuICAgKiBAcGFyYW0ge0RPTURvY3VtZW50fSBkb2MgLSBUaGUgRE9NIHJlcHJlc2VudGF0aW9uXG4gICAqIG9mIHRoZSBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUxcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIElmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGRyaXZlcnMgaW5mb3JtYXRpb24gaXMgZ29pbmcgdG8gYmUgcGFyc2VkXG4gICAqIGFuZCBhc3NpZ25lZCB0byBgdGhpcy5tYXBwaW5nYFxuICAgKi9cbiAgYXN5bmMgcGFyc2VTdG9yYWdlWG1sIChkb2MsIHNob3VsZFBhcnNlTm90ZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgZHJpdmVyTm9kZXMgPSB4cGF0aC5zZWxlY3QoYC8vKltsb2NhbC1uYW1lKC4pPSdDb250ZW50cyddYCwgZG9jKTtcbiAgICBsb2cuZGVidWcoYFBhcnNlZCAke2RyaXZlck5vZGVzLmxlbmd0aH0gZW50cmllcyBmcm9tIHN0b3JhZ2UgWE1MYCk7XG4gICAgaWYgKF8uaXNFbXB0eShkcml2ZXJOb2RlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZHJpdmVyTm9kZSBvZiBkcml2ZXJOb2Rlcykge1xuICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0tleScpKTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhrZXksICcvY2hyb21lZHJpdmVyXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBldGFnID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0VUYWcnKSk7XG4gICAgICBpZiAoIWV0YWcpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgZW50cnkgJyR7a2V5fScgZG9lcyBub3QgY29udGFpbiB0aGUgY2hlY2tzdW0uIFNraXBwaW5nIGl0YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjZEluZm8gPSB7XG4gICAgICAgIHVybDogYCR7Q0RfQ0ROfS8ke2tleX1gLFxuICAgICAgICBldGFnOiBfLnRyaW0oZXRhZywgJ1wiJyksXG4gICAgICAgIHZlcnNpb246IF8uZmlyc3Qoa2V5LnNwbGl0KCcvJykpLFxuICAgICAgfTtcbiAgICAgIHRoaXMubWFwcGluZ1trZXldID0gY2RJbmZvO1xuXG4gICAgICBjb25zdCBub3Rlc1BhdGggPSBgJHtjZEluZm8udmVyc2lvbn0vbm90ZXMudHh0YDtcbiAgICAgIGNvbnN0IGlzTm90ZXNQcmVzZW50ID0gISFkcml2ZXJOb2Rlc1xuICAgICAgICAucmVkdWNlKChhY2MsIG5vZGUpID0+IGFjYyB8fCBmaW5kQ2hpbGROb2RlKG5vZGUsICdLZXknLCBub3Rlc1BhdGgpLCBmYWxzZSk7XG4gICAgICBpZiAoIWlzTm90ZXNQcmVzZW50KSB7XG4gICAgICAgIGNkSW5mby5taW5Ccm93c2VyVmVyc2lvbiA9IG51bGw7XG4gICAgICAgIGlmIChzaG91bGRQYXJzZU5vdGVzKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFRoZSBlbnRyeSAnJHtrZXl9JyBkb2VzIG5vdCBjb250YWluIGFueSBub3Rlcy4gU2tpcHBpbmcgaXRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZFBhcnNlTm90ZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHByb21pc2VzLnB1c2godGhpcy5yZXRyaWV2ZUFkZGl0aW9uYWxEcml2ZXJJbmZvKGtleSwgYCR7Q0RfQ0ROfS8ke25vdGVzUGF0aH1gLCBjZEluZm8pKTtcbiAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggJSBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID09PSAwKSB7XG4gICAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgIGxvZy5pbmZvKGBUaGUgdG90YWwgY291bnQgb2YgZW50cmllcyBpbiB0aGUgbWFwcGluZzogJHtfLnNpemUodGhpcy5tYXBwaW5nKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgLSBUaGUgZnVsbCB1cmwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIGluXG4gICAqIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXRhZyAtIFRoZSBDUkMgb2YgdGhlIGRyaXZlciBhcmNoaXZlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uIC0gQ2hyb21lZHJpdmVyIHZlcnNpb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IENocm9tZWRyaXZlcnNNYXBwaW5nXG4gICAqIEBwcm9wZXJ0eSB7RHJpdmVyRGV0YWlsc30gLSBUaGUga2V5cyBhcmUgdW5pcXVlIGRyaXZlciBpZGVudGlmaWVyc1xuICAgKiAodmVyc2lvbi9hcmNoaXZlIG5hbWUpLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgaGF2ZSBgRHJpdmVyRGV0YWlsc2BcbiAgICogY29udGFpbmluZyBjaHJvbWVkcml2ZXIgZGV0YWlsc1xuICAgKi9cblxuICAvKipcbiAgICogUmV0cmlldmVzIGNocm9tZWRyaXZlciBtYXBwaW5nIGZyb20gdGhlIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIGlmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGNocm9tZWRyaXZlcnMgaW5mbyBpcyBnb2luZyB0byBiZSByZXRyaWV2ZWQgYW5kXG4gICAqIHBhcnNlZCBmcm9tIHJlbGVhc2Ugbm90ZXNcbiAgICogQHJldHVybnMge0Nocm9tZWRyaXZlcnNNYXBwaW5nfVxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVNYXBwaW5nIChzaG91bGRQYXJzZU5vdGVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHhtbCA9IGF3YWl0IHJldHJpZXZlRGF0YShDRF9DRE4sIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi94bWwsICovKicsXG4gICAgfSwgeyB0aW1lb3V0OiB0aGlzLnRpbWVvdXQgfSk7XG4gICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWwpO1xuICAgIGF3YWl0IHRoaXMucGFyc2VTdG9yYWdlWG1sKGRvYywgc2hvdWxkUGFyc2VOb3Rlcyk7XG4gICAgcmV0dXJuIF8uY2xvbmVEZWVwKHRoaXMubWFwcGluZyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXIgYXJjaGl2ZVxuICAgKiBpbnRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjIC0gVGhlIHNvdXJjZSBhcmNoaXZlIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRzdCAtIFRoZSBkZXN0aW5hdGlvbiBjaHJvbWVkcml2ZXIgcGF0aFxuICAgKi9cbiAgYXN5bmMgdW56aXBEcml2ZXIgKHNyYywgZHN0KSB7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHNyYywgdG1wUm9vdCk7XG4gICAgICBjb25zdCBjaHJvbWVkcml2ZXJQYXRoID0gYXdhaXQgZnMud2Fsa0Rpcih0bXBSb290LCB0cnVlLCAoaXRlbVBhdGgsIGlzRGlyZWN0b3J5KSA9PlxuICAgICAgICAhaXNEaXJlY3RvcnkgJiYgXy50b0xvd2VyKHBhdGgucGFyc2UoaXRlbVBhdGgpLm5hbWUpID09PSAnY2hyb21lZHJpdmVyJyk7XG4gICAgICBpZiAoIWNocm9tZWRyaXZlclBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYXJjaGl2ZSB3YXMgdW56aXBwZWQgcHJvcGVybHksIGJ1dCB3ZSBjb3VsZCBub3QgZmluZCBhbnkgY2hyb21lZHJpdmVyIGV4ZWN1dGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgTW92aW5nIHRoZSBleHRyYWN0ZWQgJyR7cGF0aC5iYXNlbmFtZShjaHJvbWVkcml2ZXJQYXRoKX0nIHRvICcke2RzdH0nYCk7XG4gICAgICBhd2FpdCBmcy5tdihjaHJvbWVkcml2ZXJQYXRoLCBkc3QsIHtcbiAgICAgICAgbWtkaXJwOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPU0luZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaG9zdCBPU1xuICAgKiBDYW4gYmUgZWl0aGVyIGBtYWNgLCBgd2luZG93c2Agb3IgYGxpbnV4YFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXJjaCAtIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGhvc3QgT1MuXG4gICAqIENhbiBiZSBlaXRoZXIgYDMyYCBvciBgNjRgXG4gICAqL1xuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGB0aGlzLm1hcHBpbmdgIHRvIG9ubHkgc2VsZWN0IG1hdGNoaW5nXG4gICAqIGNocm9tZWRyaXZlciBlbnRyaWVzIGJ5IG9wZXJhdGluZyBzeXN0ZW0gaW5mb3JtYXRpb25cbiAgICogYW5kL29yIGFkZGl0aW9uYWwgc3luY2hyb25pemF0aW9uIG9wdGlvbnMgKGlmIHByb3ZpZGVkKVxuICAgKlxuICAgKiBAcGFyYW0gez9PU0luZm99IG9zSW5mb1xuICAgKiBAcGFyYW0gez9TeW5jT3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZmlsdGVyZWQgY2hyb21lZHJpdmVyXG4gICAqIGVudHJ5IG5hbWVzICh2ZXJzaW9uL2FyY2hpdmUgbmFtZSlcbiAgICovXG4gIHNlbGVjdE1hdGNoaW5nRHJpdmVycyAob3NJbmZvLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBtaW5Ccm93c2VyVmVyc2lvbixcbiAgICAgIHZlcnNpb25zID0gW10sXG4gICAgfSA9IG9wdHM7XG4gICAgbGV0IGRyaXZlcnNUb1N5bmMgPSBfLmtleXModGhpcy5tYXBwaW5nKTtcblxuICAgIGlmICghXy5pc0VtcHR5KHZlcnNpb25zKSkge1xuICAgICAgLy8gSGFuZGxlIG9ubHkgc2VsZWN0ZWQgdmVyc2lvbnMgaWYgcmVxdWVzdGVkXG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIHZlcnNpb25zIG1hdGNoIHRvICR7dmVyc2lvbnN9YCk7XG4gICAgICBkcml2ZXJzVG9TeW5jID0gZHJpdmVyc1RvU3luY1xuICAgICAgICAuZmlsdGVyKChjZE5hbWUpID0+IHZlcnNpb25zLmluY2x1ZGVzKGAke3RoaXMubWFwcGluZ1tjZE5hbWVdLnZlcnNpb259YCkpO1xuXG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTihtaW5Ccm93c2VyVmVyc2lvbikpIHtcbiAgICAgIC8vIE9ubHkgc2VsZWN0IGRyaXZlcnMgdGhhdCBzdXBwb3J0IHRoZSBjdXJyZW50IGJyb3dzZXIgd2hvc2UgbWFqb3IgdmVyc2lvbiBudW1iZXIgZXF1YWxzIHRvIGBtaW5Ccm93c2VyVmVyc2lvbmBcbiAgICAgIGNvbnN0IG1pbkJyb3dzZXJWZXJzaW9uSW50ID0gcGFyc2VJbnQobWluQnJvd3NlclZlcnNpb24sIDEwKTtcbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgbWluaW11bSBzdXBwb3J0ZWQgYnJvd3NlciB2ZXJzaW9uIG1hdGNoZXMgdG8gJHttaW5Ccm93c2VyVmVyc2lvbkludH1gKTtcbiAgICAgIGxldCBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPSAwO1xuICAgICAgLy8gU2VsZWN0IHRoZSBuZXdlc3QgYXZhaWxhYmxlIGFuZCBjb21wYXRpYmxlIGNocm9tZWRyaXZlclxuICAgICAgZm9yIChjb25zdCBjZE5hbWUgb2YgZHJpdmVyc1RvU3luYykge1xuICAgICAgICBjb25zdCBjdXJyZW50TWluQnJvd3NlclZlcnNpb24gPSBwYXJzZUludCh0aGlzLm1hcHBpbmdbY2ROYW1lXS5taW5Ccm93c2VyVmVyc2lvbiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbilcbiAgICAgICAgICAgICYmIGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbiA8PSBtaW5Ccm93c2VyVmVyc2lvbkludFxuICAgICAgICAgICAgJiYgY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyIDwgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uKSB7XG4gICAgICAgICAgY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyID0gY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkcml2ZXJzVG9TeW5jID0gZHJpdmVyc1RvU3luYy5maWx0ZXIoKGNkTmFtZSkgPT4gYCR7dGhpcy5tYXBwaW5nW2NkTmFtZV0ubWluQnJvd3NlclZlcnNpb259YCA9PT1cbiAgICAgICAgYCR7Y2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyID4gMCA/IGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA6IG1pbkJyb3dzZXJWZXJzaW9uSW50fWApO1xuXG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFdpbGwgc2VsZWN0IGNhbmRpZGF0ZSAke3V0aWwucGx1cmFsaXplKCdkcml2ZXInLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCl9IGAgK1xuICAgICAgICBgdmVyc2lvbmVkIGFzICcke18udW5pcShkcml2ZXJzVG9TeW5jLm1hcCgoY2ROYW1lKSA9PiB0aGlzLm1hcHBpbmdbY2ROYW1lXS52ZXJzaW9uKSl9J2ApO1xuICAgIH1cblxuICAgIGlmICghXy5pc0VtcHR5KG9zSW5mbykpIHtcbiAgICAgIC8vIEZpbHRlciBvdXQgZHJpdmVycyBmb3IgdW5zdXBwb3J0ZWQgc3lzdGVtIGFyY2hpdGVjdHVyZXNcbiAgICAgIGxldCB7bmFtZSwgYXJjaH0gPSBvc0luZm87XG4gICAgICBpZiAoYXJjaCA9PT0gWDY0ICYmICFkcml2ZXJzVG9TeW5jLnNvbWUoKGNkTmFtZSkgPT4gY2ROYW1lLmluY2x1ZGVzKGBfJHtuYW1lfSR7WDY0fWApKSkge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8geDg2IGJ1aWxkIGlmIHg2NCBvbmUgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlIGdpdmVuIE9TXG4gICAgICAgIGFyY2ggPSBYODY7XG4gICAgICB9XG4gICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82NTE0Njc1MS9kZXRlY3RpbmctYXBwbGUtc2lsaWNvbi1tYWMtaW4tamF2YXNjcmlwdFxuICAgICAgaWYgKG5hbWUgPT09IE9TLm1hYyAmJiBfLmluY2x1ZGVzKF8udG9Mb3dlcihvcy5jcHVzKClbMF0ubW9kZWwpLCAnYXBwbGUnKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGFybVN1ZmZpeCBvZiBBUFBMRV9BUk1fU1VGRklYRVMpIHtcbiAgICAgICAgICBpZiAoZHJpdmVyc1RvU3luYy5zb21lKChjZE5hbWUpID0+IGNkTmFtZS5pbmNsdWRlcyhhcm1TdWZmaXgpKSkge1xuICAgICAgICAgICAgLy8gcHJlZmVyIGV4ZWN1dGFibGUgZm9yIEFSTSBhcmNoIGlmIHByZXNlbnRcbiAgICAgICAgICAgIGFyY2ggPSBhcm1TdWZmaXg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgcGxhdGZvcm0gbWF0Y2hlcyB0byAke25hbWV9JHthcmNofWApO1xuICAgICAgY29uc3QgcGxhdGZvcm1SZSA9IG5ldyBSZWdFeHAoYChcXFxcYnxfKSR7bmFtZX0ke2FyY2h9XFxcXGJgKTtcbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jLmZpbHRlcigoY2ROYW1lKSA9PiBwbGF0Zm9ybVJlLnRlc3QoY2ROYW1lKSk7XG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBkcml2ZXJzVG9TeW5jO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gY2hyb21lZHJpdmVyIGZyb20gdGhlIHN0b3JhZ2VcbiAgICogYW5kIHVucGFja3MgaXQgaW50byBgdGhpcy5jaHJvbWVkcml2ZXJEaXJgIGZvbGRlclxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgdW5pcXVlIGRyaXZlciBpbmRleFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZHJpdmVyS2V5IC0gVGhlIGRyaXZlciBrZXkgaW4gYHRoaXMubWFwcGluZ2BcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVzUm9vdCAtIFRoZSB0ZW1wb3JhcnkgZm9sZGVyIHBhdGggdG8gZXh0cmFjdFxuICAgKiBkb3dubG9hZGVkIGFyY2hpdmVzIHRvXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTdHJpY3QgW3RydWVdIC0gV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciAoYHRydWVgKVxuICAgKiBvciByZXR1cm4gYSBib29sZWFuIHJlc3VsdCBpZiB0aGUgZHJpdmVyIHJldHJpZXZhbCBwcm9jZXNzIGZhaWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHJldHJpZXZpbmcgdGhlIGRyaXZlclxuICAgKiBhbmQgYGlzU3RyaWN0YCBpcyBzZXQgdG8gYHRydWVgXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBpZiBgdHJ1ZWAgdGhlbiB0aGUgY2hyb21lZHJpdmVyIGlzIHN1Y2Nlc3NmdWxseVxuICAgKiBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWQuXG4gICAqL1xuICBhc3luYyByZXRyaWV2ZURyaXZlciAoaW5kZXgsIGRyaXZlcktleSwgYXJjaGl2ZXNSb290LCBpc1N0cmljdCA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyB1cmwsIGV0YWcsIHZlcnNpb24gfSA9IHRoaXMubWFwcGluZ1tkcml2ZXJLZXldO1xuICAgIGNvbnN0IGFyY2hpdmVQYXRoID0gcGF0aC5yZXNvbHZlKGFyY2hpdmVzUm9vdCwgYCR7aW5kZXh9LnppcGApO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyAnJHt1cmx9JyB0byAnJHthcmNoaXZlUGF0aH0nYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldC5kb3dubG9hZEZpbGUodXJsLCBhcmNoaXZlUGF0aCwge1xuICAgICAgICBpc01ldGVyZWQ6IGZhbHNlLFxuICAgICAgICB0aW1lb3V0OiBUSU1FT1VUX01TXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBtc2cgPSBgQ2Fubm90IGRvd25sb2FkIGNocm9tZWRyaXZlciBhcmNoaXZlLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YDtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihtc2cpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWF3YWl0IGlzQ3JjT2soYXJjaGl2ZVBhdGgsIGV0YWcpKSB7XG4gICAgICBjb25zdCBtc2cgPSBgVGhlIGNoZWNrc3VtIGZvciB0aGUgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXIgJyR7ZHJpdmVyS2V5fScgZGlkIG5vdCBtYXRjaGA7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IobXNnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWUgPSBgJHtwYXRoLnBhcnNlKHVybCkubmFtZX1fdiR7dmVyc2lvbn1gICtcbiAgICAgIChzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJyk7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLmNocm9tZWRyaXZlckRpciwgZmlsZU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnVuemlwRHJpdmVyKGFyY2hpdmVQYXRoLCB0YXJnZXRQYXRoKTtcbiAgICAgIGF3YWl0IGZzLmNobW9kKHRhcmdldFBhdGgsIDBvNzU1KTtcbiAgICAgIGxvZy5kZWJ1ZyhgUGVybWlzc2lvbnMgb2YgdGhlIGZpbGUgJyR7dGFyZ2V0UGF0aH0nIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDc1NWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKGUubWVzc2FnZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFN5bmNPcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXk8U3RyaW5nPn0gdmVyc2lvbnMgLSBUaGUgbGlzdCBvZiBjaHJvbWVkcml2ZXJcbiAgICogdmVyc2lvbnMgdG8gc3luYy4gSWYgZW1wdHkgKHRoZSBkZWZhdWx0IHZhbHVlKSB0aGVuIGFsbCBhdmFpbGFibGVcbiAgICogY2hyb21lZHJpdmVycyBhcmUgZ29pbmcgdG8gYmUgZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bWJlcn0gbWluQnJvd3NlclZlcnNpb24gLSBUaGUgbWludW11bSBzdXBwb3J0ZWRcbiAgICogQ2hyb21lIHZlcnNpb24gdGhhdCBkb3dubG9hZGVkIGNocm9tZWRyaXZlcnMgc2hvdWxkIHN1cHBvcnQuIENhbiBtYXRjaFxuICAgKiBtdWx0aXBsZSBkcml2ZXJzLlxuICAgKiBAcHJvcGVydHkgez9PU0luZm99IG9zSW5mbyAtIFN5c3RlbSBpbmZvcm1hdGlvbiB1c2VkIHRvIGZpbHRlciBvdXRcbiAgICogdGhlIGxpc3Qgb2YgdGhlIHJldHJpZXZlZCBkcml2ZXJzLiBJZiBub3QgcHJvdmlkZWQgdGhlbiB0aGUgc2NyaXB0XG4gICAqIHdpbGwgdHJ5IHRvIHJldHJpZXZlIGl0LlxuICAgKi9cblxuICAvKipcbiAgICogUmV0cmlldmVzIGNocm9tZWRyaXZlcnMgZnJvbSB0aGUgcmVtb3RlIHN0b3JhZ2VcbiAgICogdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtXG4gICAqXG4gICAqIEBwYXJhbSB7P1N5bmNPcHRpb25zfSBvcHRzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHdoaWxlIHJldHJpZXZpbmdcbiAgICogdGhlIGRyaXZlcnNcbiAgICogQHJldHVybnMge0FycmF5PFN0cmluZ30gVGhlIGxpc3Qgb2Ygc3VjY2Vzc2Z1bGx5IHN5bmNocm9uaXplZCBkcml2ZXIga2V5c1xuICAgKi9cbiAgYXN5bmMgc3luY0RyaXZlcnMgKG9wdHMgPSB7fSkge1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5tYXBwaW5nKSkge1xuICAgICAgYXdhaXQgdGhpcy5yZXRyaWV2ZU1hcHBpbmcoISFvcHRzLm1pbkJyb3dzZXJWZXJzaW9uKTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLm1hcHBpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBjaHJvbWVkcml2ZXJzIG1hcHBpbmcgZnJvbSBHb29nbGUgc3RvcmFnZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGRyaXZlcnNUb1N5bmMgPSB0aGlzLnNlbGVjdE1hdGNoaW5nRHJpdmVycyhvcHRzLm9zSW5mbyA/PyBhd2FpdCBnZXRPc0luZm8oKSwgb3B0cyk7XG4gICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGVyZSBhcmUgbm8gZHJpdmVycyB0byBzeW5jLiBFeGl0aW5nYCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2RyaXZlcicsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX0gdG8gc3luYzogYCArXG4gICAgICBKU09OLnN0cmluZ2lmeShkcml2ZXJzVG9TeW5jLCBudWxsLCAyKSk7XG5cbiAgICBjb25zdCBzeW5jaHJvbml6ZWREcml2ZXJzID0gW107XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICBjb25zdCBhcmNoaXZlc1Jvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBbaWR4LCBkcml2ZXJLZXldIG9mIGRyaXZlcnNUb1N5bmMuZW50cmllcygpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5yZXRyaWV2ZURyaXZlcihpZHgsIGRyaXZlcktleSwgYXJjaGl2ZXNSb290LCAhXy5pc0VtcHR5KG9wdHMpKSkge1xuICAgICAgICAgICAgc3luY2hyb25pemVkRHJpdmVycy5wdXNoKGRyaXZlcktleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpKTtcblxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoICUgTUFYX1BBUkFMTEVMX0RPV05MT0FEUyA9PT0gMCkge1xuICAgICAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYoYXJjaGl2ZXNSb290KTtcbiAgICB9XG4gICAgaWYgKCFfLmlzRW1wdHkoc3luY2hyb25pemVkRHJpdmVycykpIHtcbiAgICAgIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgc3luY2hyb25pemVkIGAgK1xuICAgICAgICBgJHt1dGlsLnBsdXJhbGl6ZSgnY2hyb21lZHJpdmVyJywgc3luY2hyb25pemVkRHJpdmVycy5sZW5ndGgsIHRydWUpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbyhgTm8gY2hyb21lZHJpdmVycyB3ZXJlIHN5bmNocm9uaXplZGApO1xuICAgIH1cbiAgICByZXR1cm4gc3luY2hyb25pemVkRHJpdmVycztcbiAgfVxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IENocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLFVBQVUsR0FBRyxLQUFLO0FBQ3hCLE1BQU1DLHNCQUFzQixHQUFHLENBQUM7QUFFaEMsTUFBTUMsR0FBRyxHQUFHQyxlQUFNLENBQUNDLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQztBQUd6RCxlQUFlQyxPQUFPLENBQUVDLEdBQUcsRUFBRUMsUUFBUSxFQUFFO0VBQ3JDLE1BQU1DLEdBQUcsR0FBRyxNQUFNQyxXQUFFLENBQUNDLElBQUksQ0FBQ0osR0FBRyxFQUFFLEtBQUssQ0FBQztFQUNyQyxPQUFPSyxlQUFDLENBQUNDLE9BQU8sQ0FBQ0osR0FBRyxDQUFDLEtBQUtHLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDTCxRQUFRLENBQUM7QUFDL0M7QUFFQSxTQUFTTSxhQUFhLENBQUVDLE1BQU0sRUFBRUMsU0FBUyxHQUFHLElBQUksRUFBRUMsSUFBSSxHQUFHLElBQUksRUFBRTtFQUM3RCxJQUFJLENBQUNELFNBQVMsSUFBSSxDQUFDQyxJQUFJLEVBQUU7SUFDdkIsT0FBTyxJQUFJO0VBQ2I7RUFDQSxJQUFJLENBQUNGLE1BQU0sQ0FBQ0csYUFBYSxFQUFFLEVBQUU7SUFDM0IsT0FBTyxJQUFJO0VBQ2I7RUFFQSxLQUFLLElBQUlDLFlBQVksR0FBRyxDQUFDLEVBQUVBLFlBQVksR0FBR0osTUFBTSxDQUFDSyxVQUFVLENBQUNDLE1BQU0sRUFBRUYsWUFBWSxFQUFFLEVBQUU7SUFDbEYsTUFBTUcsU0FBUyxHQUFHUCxNQUFNLENBQUNLLFVBQVUsQ0FBQ0QsWUFBWSxDQUFDO0lBQ2pELElBQUlILFNBQVMsSUFBSSxDQUFDQyxJQUFJLElBQUlELFNB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
@@ -1 +1 @@
1
- {"version":3,"file":"storage-client.js","names":["TIMEOUT_MS","MAX_PARALLEL_DOWNLOADS","log","logger","getLogger","isCrcOk","src","checksum","md5","fs","hash","_","toLower","findChildNode","parent","childName","text","hasChildNodes","childNodeIdx","childNodes","length","childNode","localName","childText","extractNodeText","node","firstChild","util","hasValue","nodeValue","ChromedriverStorageClient","constructor","args","chromedriverDir","getChromedriverDir","timeout","mapping","parseNotes","content","result","versionMatch","exec","version","minBrowserVersionMatch","minBrowserVersion","retrieveAdditionalDriverInfo","driverKey","notesUrl","infoDict","notes","retrieveData","accept","debug","parseStorageXml","doc","shouldParseNotes","driverNodes","xpath","select","isEmpty","promises","driverNode","key","includes","etag","cdInfo","url","CD_CDN","trim","first","split","notesPath","isNotesPresent","reduce","acc","info","push","B","all","size","retrieveMapping","xml","DOMParser","parseFromString","cloneDeep","unzipDriver","dst","tmpRoot","tempDir","openDir","zip","extractAllTo","chromedriverPath","walkDir","itemPath","isDirectory","path","parse","name","Error","basename","mv","mkdirp","rimraf","selectMatchingDrivers","osInfo","opts","versions","driversToSync","keys","filter","cdName","pluralize","isNaN","minBrowserVersionInt","parseInt","closestMatchedVersionNumber","currentMinBrowserVersion","uniq","map","arch","hardwareName","X64","some","X86","OS","mac","M1_ARCH_SUFFIX","platformRe","RegExp","test","retrieveDriver","index","archivesRoot","isStrict","archivePath","resolve","net","downloadFile","isMetered","e","msg","message","error","fileName","system","isWindows","targetPath","chmod","syncDrivers","getOsInfo","JSON","stringify","synchronizedDrivers","idx","entries"],"sources":["../../lib/storage-client.js"],"sourcesContent":["import {\n getChromedriverDir, CD_CDN, retrieveData, getOsInfo,\n OS, X64, X86, M1_ARCH_SUFFIX,\n} from './utils';\nimport _ from 'lodash';\nimport xpath from 'xpath';\nimport { DOMParser } from '@xmldom/xmldom';\nimport B from 'bluebird';\nimport path from 'path';\nimport { system, fs, logger, tempDir, zip, util, net } from '@appium/support';\n\n\nconst TIMEOUT_MS = 15000;\nconst MAX_PARALLEL_DOWNLOADS = 5;\n\nconst log = logger.getLogger('ChromedriverStorageClient');\n\n\nasync function isCrcOk (src, checksum) {\n const md5 = await fs.hash(src, 'md5');\n return _.toLower(md5) === _.toLower(checksum);\n}\n\nfunction findChildNode (parent, childName = null, text = null) {\n if (!childName && !text) {\n return null;\n }\n if (!parent.hasChildNodes()) {\n return null;\n }\n\n for (let childNodeIdx = 0; childNodeIdx < parent.childNodes.length; childNodeIdx++) {\n const childNode = parent.childNodes[childNodeIdx];\n if (childName && !text && childName === childNode.localName) {\n return childNode;\n }\n if (text) {\n const childText = extractNodeText(childNode);\n if (!childText) {\n continue;\n }\n if (childName && childName === childNode.localName && text === childText) {\n return childNode;\n }\n if (!childName && text === childText) {\n return childNode;\n }\n }\n }\n return null;\n}\n\nfunction extractNodeText (node) {\n return (!node || !node.firstChild || !util.hasValue(node.firstChild.nodeValue))\n ? null\n : node.firstChild.nodeValue;\n}\n\n\nclass ChromedriverStorageClient {\n constructor (args = {}) {\n const {\n chromedriverDir = getChromedriverDir(),\n timeout = TIMEOUT_MS,\n } = args;\n this.chromedriverDir = chromedriverDir;\n this.timeout = timeout;\n this.mapping = {};\n }\n\n /**\n * @typedef {Object} AdditionalDriverDetails\n * @property {?string} version - Chromedriver version\n * or `null` if it cannot be found\n * @property {?string} minBrowserVersion - The minimum browser version\n * supported by chromedriver or `null` if it cannot be found\n */\n\n /**\n * Gets additional chromedriver details from chromedriver\n * release notes\n *\n * @param {string} content - Release notes of the corresponding chromedriver\n * @returns {AdditionalDriverDetails}\n */\n parseNotes (content) {\n const result = {};\n const versionMatch = /^\\s*[-]+ChromeDriver[\\D]+([\\d.]+)/im.exec(content);\n if (versionMatch) {\n result.version = versionMatch[1];\n }\n const minBrowserVersionMatch = /^\\s*Supports Chrome[\\D]+(\\d+)/im.exec(content);\n if (minBrowserVersionMatch) {\n result.minBrowserVersion = minBrowserVersionMatch[1];\n }\n return result;\n }\n\n /**\n * Downloads chromedriver release notes and puts them\n * into the dictionary argument\n *\n * @param {string} driverKey - Driver version plus archive name\n * @param {string} notesUrl - The URL of chromedriver notes\n * @param {Object} infoDict - The dictionary containing driver info.\n * The method call mutates by merging `AdditionalDriverDetails`\n * @throws {Error} if the release notes cannot be downloaded\n */\n async retrieveAdditionalDriverInfo (driverKey, notesUrl, infoDict) {\n const notes = await retrieveData(notesUrl, {\n 'user-agent': 'appium',\n accept: '*/*',\n }, { timeout: this.timeout });\n const { minBrowserVersion } = this.parseNotes(notes);\n if (!minBrowserVersion) {\n log.debug(`The driver '${driverKey}' does not contain valid release notes at ${notesUrl}. ` +\n `Skipping it`);\n return;\n }\n infoDict.minBrowserVersion = minBrowserVersion;\n }\n\n /**\n * Parses chromedriver storage XML and stores\n * the parsed results into `this.mapping`\n *\n * @param {DOMDocument} doc - The DOM representation\n * of the chromedriver storage XML\n * @param {boolean} shouldParseNotes [true] - If set to `true`\n * then additional drivers information is going to be parsed\n * and assigned to `this.mapping`\n */\n async parseStorageXml (doc, shouldParseNotes = true) {\n const driverNodes = xpath.select(`//*[local-name(.)='Contents']`, doc);\n log.debug(`Parsed ${driverNodes.length} entries from storage XML`);\n if (_.isEmpty(driverNodes)) {\n return;\n }\n\n const promises = [];\n for (const driverNode of driverNodes) {\n const key = extractNodeText(findChildNode(driverNode, 'Key'));\n if (!_.includes(key, '/chromedriver_')) {\n continue;\n }\n\n const etag = extractNodeText(findChildNode(driverNode, 'ETag'));\n if (!etag) {\n log.debug(`The entry '${key}' does not contain the checksum. Skipping it`);\n continue;\n }\n\n const cdInfo = {\n url: `${CD_CDN}/${key}`,\n etag: _.trim(etag, '\"'),\n version: _.first(key.split('/')),\n };\n this.mapping[key] = cdInfo;\n\n const notesPath = `${cdInfo.version}/notes.txt`;\n const isNotesPresent = !!driverNodes\n .reduce((acc, node) => acc || findChildNode(node, 'Key', notesPath), false);\n if (!isNotesPresent) {\n cdInfo.minBrowserVersion = null;\n if (shouldParseNotes) {\n log.info(`The entry '${key}' does not contain any notes. Skipping it`);\n }\n continue;\n } else if (!shouldParseNotes) {\n continue;\n }\n\n promises.push(this.retrieveAdditionalDriverInfo(key, `${CD_CDN}/${notesPath}`, cdInfo));\n if (promises.length % MAX_PARALLEL_DOWNLOADS === 0) {\n await B.all(promises);\n }\n }\n await B.all(promises);\n log.info(`The total count of entries in the mapping: ${_.size(this.mapping)}`);\n }\n\n /**\n * @typedef {Object} DriverDetails\n * @property {string} url - The full url to the corresponding driver in\n * the remote storage\n * @property {string} etag - The CRC of the driver archive\n * @property {string} version - Chromedriver version\n */\n\n /**\n * @typedef {Object} ChromedriversMapping\n * @property {DriverDetails} - The keys are unique driver identifiers\n * (version/archive name). The corresponding values have `DriverDetails`\n * containing chromedriver details\n */\n\n /**\n * Retrieves chromedriver mapping from the storage\n *\n * @param {boolean} shouldParseNotes [true] - if set to `true`\n * then additional chromedrivers info is going to be retrieved and\n * parsed from release notes\n * @returns {ChromedriversMapping}\n */\n async retrieveMapping (shouldParseNotes = true) {\n const xml = await retrieveData(CD_CDN, {\n 'user-agent': 'appium',\n accept: 'application/xml, */*',\n }, { timeout: this.timeout });\n const doc = new DOMParser().parseFromString(xml);\n await this.parseStorageXml(doc, shouldParseNotes);\n return _.cloneDeep(this.mapping);\n }\n\n /**\n * Extracts downloaded chromedriver archive\n * into the given destination\n *\n * @param {string} src - The source archive path\n * @param {string} dst - The destination chromedriver path\n */\n async unzipDriver (src, dst) {\n const tmpRoot = await tempDir.openDir();\n try {\n await zip.extractAllTo(src, tmpRoot);\n const chromedriverPath = await fs.walkDir(tmpRoot, true, (itemPath, isDirectory) =>\n !isDirectory && _.toLower(path.parse(itemPath).name) === 'chromedriver');\n if (!chromedriverPath) {\n throw new Error('The archive was unzipped properly, but we could not find any chromedriver executable');\n }\n log.debug(`Moving the extracted '${path.basename(chromedriverPath)}' to '${dst}'`);\n await fs.mv(chromedriverPath, dst, {\n mkdirp: true\n });\n } finally {\n await fs.rimraf(tmpRoot);\n }\n }\n\n /**\n * @typedef {Object} OSInfo\n * @property {string} name - The name of the host OS\n * Can be either `mac`, `windows` or `linux`\n * @property {string} arch - The architecture of the host OD.\n * Can be either `32` or `64`\n * @property {?string} hardwareName - The output of `uname -m` command\n * on linux and mac systems. `null` on Windows\n */\n\n /**\n * Filters `this.mapping` to only select matching\n * chromedriver entries by operating system information\n * and/or additional synchronization options (if provided)\n *\n * @param {?OSInfo} osInfo\n * @param {?SyncOptions} opts\n * @returns {Array<String>} The list of filtered chromedriver\n * entry names (version/archive name)\n */\n selectMatchingDrivers (osInfo, opts = {}) {\n const {\n minBrowserVersion,\n versions = [],\n } = opts;\n let driversToSync = _.keys(this.mapping);\n\n if (!_.isEmpty(versions)) {\n // Handle only selected versions if requested\n log.debug(`Selecting chromedrivers whose versions match to ${versions}`);\n driversToSync = driversToSync\n .filter((cdName) => versions.includes(`${this.mapping[cdName].version}`));\n\n log.debug(`Got ${util.pluralize('item', driversToSync.length, true)}`);\n if (_.isEmpty(driversToSync)) {\n return [];\n }\n }\n\n if (!isNaN(minBrowserVersion)) {\n // Only select drivers that support the current browser whose major version number equals to `minBrowserVersion`\n const minBrowserVersionInt = parseInt(minBrowserVersion, 10);\n log.debug(`Selecting chromedrivers whose minimum supported browser version matches to ${minBrowserVersionInt}`);\n let closestMatchedVersionNumber = 0;\n // Select the newest available and compatible chromedriver\n for (const cdName of driversToSync) {\n const currentMinBrowserVersion = parseInt(this.mapping[cdName].minBrowserVersion, 10);\n if (!isNaN(currentMinBrowserVersion)\n && currentMinBrowserVersion <= minBrowserVersionInt\n && closestMatchedVersionNumber < currentMinBrowserVersion) {\n closestMatchedVersionNumber = currentMinBrowserVersion;\n }\n }\n driversToSync = driversToSync.filter((cdName) => `${this.mapping[cdName].minBrowserVersion}` ===\n `${closestMatchedVersionNumber > 0 ? closestMatchedVersionNumber : minBrowserVersionInt}`);\n\n log.debug(`Got ${util.pluralize('item', driversToSync.length, true)}`);\n if (_.isEmpty(driversToSync)) {\n return [];\n }\n log.debug(`Will select candidate ${util.pluralize('driver', driversToSync.length)} ` +\n `versioned as '${_.uniq(driversToSync.map((cdName) => this.mapping[cdName].version))}'`);\n }\n\n if (!_.isEmpty(osInfo)) {\n // Filter out drivers for unsupported system architectures\n let {name, arch, hardwareName} = osInfo;\n if (arch === X64 && !driversToSync.some((cdName) => cdName.includes(`_${name}${X64}`))) {\n // Fall back to x86 build if x64 one is not available for the given OS\n arch = X86;\n }\n if (name === OS.mac && _.includes(hardwareName, 'arm')\n && driversToSync.some((cdName) => cdName.includes(M1_ARCH_SUFFIX))) {\n // prefer executable for M1 arch if present\n arch += M1_ARCH_SUFFIX;\n }\n log.debug(`Selecting chromedrivers whose platform matches to ${name}${arch}`);\n const platformRe = new RegExp(`(\\\\b|_)${name}${arch}\\\\b`);\n driversToSync = driversToSync.filter((cdName) => platformRe.test(cdName));\n log.debug(`Got ${util.pluralize('item', driversToSync.length, true)}`);\n }\n\n return driversToSync;\n }\n\n /**\n * Retrieves the given chromedriver from the storage\n * and unpacks it into `this.chromedriverDir` folder\n *\n * @param {number} index - The unique driver index\n * @param {string} driverKey - The driver key in `this.mapping`\n * @param {string} archivesRoot - The temporary folder path to extract\n * downloaded archives to\n * @param {boolean} isStrict [true] - Whether to throw an error (`true`)\n * or return a boolean result if the driver retrieval process fails\n * @throws {Error} if there was a failure while retrieving the driver\n * and `isStrict` is set to `true`\n * @returns {boolean} if `true` then the chromedriver is successfully\n * downloaded and extracted.\n */\n async retrieveDriver (index, driverKey, archivesRoot, isStrict = false) {\n const { url, etag, version } = this.mapping[driverKey];\n const archivePath = path.resolve(archivesRoot, `${index}.zip`);\n log.debug(`Retrieving '${url}' to '${archivePath}'`);\n try {\n await net.downloadFile(url, archivePath, {\n isMetered: false,\n timeout: TIMEOUT_MS\n });\n } catch (e) {\n const msg = `Cannot download chromedriver archive. Original error: ${e.message}`;\n if (isStrict) {\n throw new Error(msg);\n }\n log.error(msg);\n return false;\n }\n if (!await isCrcOk(archivePath, etag)) {\n const msg = `The checksum for the downloaded chromedriver '${driverKey}' did not match`;\n if (isStrict) {\n throw new Error(msg);\n }\n log.error(msg);\n return false;\n }\n const fileName = `${path.parse(url).name}_v${version}` +\n (system.isWindows() ? '.exe' : '');\n const targetPath = path.resolve(this.chromedriverDir, fileName);\n try {\n await this.unzipDriver(archivePath, targetPath);\n await fs.chmod(targetPath, 0o755);\n log.debug(`Permissions of the file '${targetPath}' have been changed to 755`);\n } catch (e) {\n if (isStrict) {\n throw e;\n }\n log.error(e.message);\n return false;\n }\n return true;\n }\n\n /**\n * @typedef {Object} SyncOptions\n * @property {Array<String>} versions - The list of chromedriver\n * versions to sync. If empty (the default value) then all available\n * chromedrivers are going to be downloaded and extracted\n * @property {string|number} minBrowserVersion - The minumum supported\n * Chrome version that downloaded chromedrivers should support. Can match\n * multiple drivers.\n * @property {?OSInfo} osInfo - System information used to filter out\n * the list of the retrieved drivers. If not provided then the script\n * will try to retrieve it.\n */\n\n /**\n * Retrieves chromedrivers from the remote storage\n * to the local file system\n *\n * @param {?SyncOptions} opts\n * @throws {Error} if there was a problem while retrieving\n * the drivers\n * @returns {Array<String} The list of successfully synchronized driver keys\n */\n async syncDrivers (opts = {}) {\n if (_.isEmpty(this.mapping)) {\n await this.retrieveMapping(!!opts.minBrowserVersion);\n }\n if (_.isEmpty(this.mapping)) {\n throw new Error('Cannot retrieve chromedrivers mapping from Google storage');\n }\n\n const driversToSync = this.selectMatchingDrivers(opts.osInfo ?? await getOsInfo(), opts);\n if (_.isEmpty(driversToSync)) {\n log.debug(`There are no drivers to sync. Exiting`);\n return [];\n }\n log.debug(`Got ${util.pluralize('driver', driversToSync.length, true)} to sync: ` +\n JSON.stringify(driversToSync, null, 2));\n\n const synchronizedDrivers = [];\n const promises = [];\n const archivesRoot = await tempDir.openDir();\n try {\n for (const [idx, driverKey] of driversToSync.entries()) {\n promises.push((async () => {\n if (await this.retrieveDriver(idx, driverKey, archivesRoot, !_.isEmpty(opts))) {\n synchronizedDrivers.push(driverKey);\n }\n })());\n\n if (promises.length % MAX_PARALLEL_DOWNLOADS === 0) {\n await B.all(promises);\n }\n }\n await B.all(promises);\n } finally {\n await fs.rimraf(archivesRoot);\n }\n if (!_.isEmpty(synchronizedDrivers)) {\n log.info(`Successfully synchronized ` +\n `${util.pluralize('chromedriver', synchronizedDrivers.length, true)}`);\n } else {\n log.info(`No chromedrivers were synchronized`);\n }\n return synchronizedDrivers;\n }\n}\n\n\nexport default ChromedriverStorageClient;\n"],"mappings":"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"}
1
+ {"version":3,"file":"storage-client.js","names":["TIMEOUT_MS","MAX_PARALLEL_DOWNLOADS","log","logger","getLogger","isCrcOk","src","checksum","md5","fs","hash","_","toLower","findChildNode","parent","childName","text","hasChildNodes","childNodeIdx","childNodes","length","childNode","localName","childText","extractNodeText","node","firstChild","util","hasValue","nodeValue","ChromedriverStorageClient","constructor","args","chromedriverDir","getChromedriverDir","timeout","mapping","parseNotes","content","result","versionMatch","exec","version","minBrowserVersionMatch","minBrowserVersion","retrieveAdditionalDriverInfo","driverKey","notesUrl","infoDict","notes","retrieveData","accept","debug","parseStorageXml","doc","shouldParseNotes","driverNodes","xpath","select","isEmpty","promises","driverNode","key","includes","etag","cdInfo","url","CD_CDN","trim","first","split","notesPath","isNotesPresent","reduce","acc","info","push","B","all","size","retrieveMapping","xml","DOMParser","parseFromString","cloneDeep","unzipDriver","dst","tmpRoot","tempDir","openDir","zip","extractAllTo","chromedriverPath","walkDir","itemPath","isDirectory","path","parse","name","Error","basename","mv","mkdirp","rimraf","selectMatchingDrivers","osInfo","opts","versions","driversToSync","keys","filter","cdName","pluralize","isNaN","minBrowserVersionInt","parseInt","closestMatchedVersionNumber","currentMinBrowserVersion","uniq","map","arch","X64","some","X86","OS","mac","os","cpus","model","armSuffix","APPLE_ARM_SUFFIXES","platformRe","RegExp","test","retrieveDriver","index","archivesRoot","isStrict","archivePath","resolve","net","downloadFile","isMetered","e","msg","message","error","fileName","system","isWindows","targetPath","chmod","syncDrivers","getOsInfo","JSON","stringify","synchronizedDrivers","idx","entries"],"sources":["../../lib/storage-client.js"],"sourcesContent":["import {\n getChromedriverDir, CD_CDN, retrieveData, getOsInfo,\n OS, X64, X86, APPLE_ARM_SUFFIXES,\n} from './utils';\nimport _ from 'lodash';\nimport xpath from 'xpath';\nimport { DOMParser } from '@xmldom/xmldom';\nimport B from 'bluebird';\nimport path from 'path';\nimport os from 'os';\nimport { system, fs, logger, tempDir, zip, util, net } from '@appium/support';\n\n\nconst TIMEOUT_MS = 15000;\nconst MAX_PARALLEL_DOWNLOADS = 5;\n\nconst log = logger.getLogger('ChromedriverStorageClient');\n\n\nasync function isCrcOk (src, checksum) {\n const md5 = await fs.hash(src, 'md5');\n return _.toLower(md5) === _.toLower(checksum);\n}\n\nfunction findChildNode (parent, childName = null, text = null) {\n if (!childName && !text) {\n return null;\n }\n if (!parent.hasChildNodes()) {\n return null;\n }\n\n for (let childNodeIdx = 0; childNodeIdx < parent.childNodes.length; childNodeIdx++) {\n const childNode = parent.childNodes[childNodeIdx];\n if (childName && !text && childName === childNode.localName) {\n return childNode;\n }\n if (text) {\n const childText = extractNodeText(childNode);\n if (!childText) {\n continue;\n }\n if (childName && childName === childNode.localName && text === childText) {\n return childNode;\n }\n if (!childName && text === childText) {\n return childNode;\n }\n }\n }\n return null;\n}\n\nfunction extractNodeText (node) {\n return (!node || !node.firstChild || !util.hasValue(node.firstChild.nodeValue))\n ? null\n : node.firstChild.nodeValue;\n}\n\n\nclass ChromedriverStorageClient {\n constructor (args = {}) {\n const {\n chromedriverDir = getChromedriverDir(),\n timeout = TIMEOUT_MS,\n } = args;\n this.chromedriverDir = chromedriverDir;\n this.timeout = timeout;\n this.mapping = {};\n }\n\n /**\n * @typedef {Object} AdditionalDriverDetails\n * @property {?string} version - Chromedriver version\n * or `null` if it cannot be found\n * @property {?string} minBrowserVersion - The minimum browser version\n * supported by chromedriver or `null` if it cannot be found\n */\n\n /**\n * Gets additional chromedriver details from chromedriver\n * release notes\n *\n * @param {string} content - Release notes of the corresponding chromedriver\n * @returns {AdditionalDriverDetails}\n */\n parseNotes (content) {\n const result = {};\n const versionMatch = /^\\s*[-]+ChromeDriver[\\D]+([\\d.]+)/im.exec(content);\n if (versionMatch) {\n result.version = versionMatch[1];\n }\n const minBrowserVersionMatch = /^\\s*Supports Chrome[\\D]+(\\d+)/im.exec(content);\n if (minBrowserVersionMatch) {\n result.minBrowserVersion = minBrowserVersionMatch[1];\n }\n return result;\n }\n\n /**\n * Downloads chromedriver release notes and puts them\n * into the dictionary argument\n *\n * @param {string} driverKey - Driver version plus archive name\n * @param {string} notesUrl - The URL of chromedriver notes\n * @param {Object} infoDict - The dictionary containing driver info.\n * The method call mutates by merging `AdditionalDriverDetails`\n * @throws {Error} if the release notes cannot be downloaded\n */\n async retrieveAdditionalDriverInfo (driverKey, notesUrl, infoDict) {\n const notes = await retrieveData(notesUrl, {\n 'user-agent': 'appium',\n accept: '*/*',\n }, { timeout: this.timeout });\n const { minBrowserVersion } = this.parseNotes(notes);\n if (!minBrowserVersion) {\n log.debug(`The driver '${driverKey}' does not contain valid release notes at ${notesUrl}. ` +\n `Skipping it`);\n return;\n }\n infoDict.minBrowserVersion = minBrowserVersion;\n }\n\n /**\n * Parses chromedriver storage XML and stores\n * the parsed results into `this.mapping`\n *\n * @param {DOMDocument} doc - The DOM representation\n * of the chromedriver storage XML\n * @param {boolean} shouldParseNotes [true] - If set to `true`\n * then additional drivers information is going to be parsed\n * and assigned to `this.mapping`\n */\n async parseStorageXml (doc, shouldParseNotes = true) {\n const driverNodes = xpath.select(`//*[local-name(.)='Contents']`, doc);\n log.debug(`Parsed ${driverNodes.length} entries from storage XML`);\n if (_.isEmpty(driverNodes)) {\n return;\n }\n\n const promises = [];\n for (const driverNode of driverNodes) {\n const key = extractNodeText(findChildNode(driverNode, 'Key'));\n if (!_.includes(key, '/chromedriver_')) {\n continue;\n }\n\n const etag = extractNodeText(findChildNode(driverNode, 'ETag'));\n if (!etag) {\n log.debug(`The entry '${key}' does not contain the checksum. Skipping it`);\n continue;\n }\n\n const cdInfo = {\n url: `${CD_CDN}/${key}`,\n etag: _.trim(etag, '\"'),\n version: _.first(key.split('/')),\n };\n this.mapping[key] = cdInfo;\n\n const notesPath = `${cdInfo.version}/notes.txt`;\n const isNotesPresent = !!driverNodes\n .reduce((acc, node) => acc || findChildNode(node, 'Key', notesPath), false);\n if (!isNotesPresent) {\n cdInfo.minBrowserVersion = null;\n if (shouldParseNotes) {\n log.info(`The entry '${key}' does not contain any notes. Skipping it`);\n }\n continue;\n } else if (!shouldParseNotes) {\n continue;\n }\n\n promises.push(this.retrieveAdditionalDriverInfo(key, `${CD_CDN}/${notesPath}`, cdInfo));\n if (promises.length % MAX_PARALLEL_DOWNLOADS === 0) {\n await B.all(promises);\n }\n }\n await B.all(promises);\n log.info(`The total count of entries in the mapping: ${_.size(this.mapping)}`);\n }\n\n /**\n * @typedef {Object} DriverDetails\n * @property {string} url - The full url to the corresponding driver in\n * the remote storage\n * @property {string} etag - The CRC of the driver archive\n * @property {string} version - Chromedriver version\n */\n\n /**\n * @typedef {Object} ChromedriversMapping\n * @property {DriverDetails} - The keys are unique driver identifiers\n * (version/archive name). The corresponding values have `DriverDetails`\n * containing chromedriver details\n */\n\n /**\n * Retrieves chromedriver mapping from the storage\n *\n * @param {boolean} shouldParseNotes [true] - if set to `true`\n * then additional chromedrivers info is going to be retrieved and\n * parsed from release notes\n * @returns {ChromedriversMapping}\n */\n async retrieveMapping (shouldParseNotes = true) {\n const xml = await retrieveData(CD_CDN, {\n 'user-agent': 'appium',\n accept: 'application/xml, */*',\n }, { timeout: this.timeout });\n const doc = new DOMParser().parseFromString(xml);\n await this.parseStorageXml(doc, shouldParseNotes);\n return _.cloneDeep(this.mapping);\n }\n\n /**\n * Extracts downloaded chromedriver archive\n * into the given destination\n *\n * @param {string} src - The source archive path\n * @param {string} dst - The destination chromedriver path\n */\n async unzipDriver (src, dst) {\n const tmpRoot = await tempDir.openDir();\n try {\n await zip.extractAllTo(src, tmpRoot);\n const chromedriverPath = await fs.walkDir(tmpRoot, true, (itemPath, isDirectory) =>\n !isDirectory && _.toLower(path.parse(itemPath).name) === 'chromedriver');\n if (!chromedriverPath) {\n throw new Error('The archive was unzipped properly, but we could not find any chromedriver executable');\n }\n log.debug(`Moving the extracted '${path.basename(chromedriverPath)}' to '${dst}'`);\n await fs.mv(chromedriverPath, dst, {\n mkdirp: true\n });\n } finally {\n await fs.rimraf(tmpRoot);\n }\n }\n\n /**\n * @typedef {Object} OSInfo\n * @property {string} name - The name of the host OS\n * Can be either `mac`, `windows` or `linux`\n * @property {string} arch - The architecture of the host OS.\n * Can be either `32` or `64`\n */\n\n /**\n * Filters `this.mapping` to only select matching\n * chromedriver entries by operating system information\n * and/or additional synchronization options (if provided)\n *\n * @param {?OSInfo} osInfo\n * @param {?SyncOptions} opts\n * @returns {Array<String>} The list of filtered chromedriver\n * entry names (version/archive name)\n */\n selectMatchingDrivers (osInfo, opts = {}) {\n const {\n minBrowserVersion,\n versions = [],\n } = opts;\n let driversToSync = _.keys(this.mapping);\n\n if (!_.isEmpty(versions)) {\n // Handle only selected versions if requested\n log.debug(`Selecting chromedrivers whose versions match to ${versions}`);\n driversToSync = driversToSync\n .filter((cdName) => versions.includes(`${this.mapping[cdName].version}`));\n\n log.debug(`Got ${util.pluralize('item', driversToSync.length, true)}`);\n if (_.isEmpty(driversToSync)) {\n return [];\n }\n }\n\n if (!isNaN(minBrowserVersion)) {\n // Only select drivers that support the current browser whose major version number equals to `minBrowserVersion`\n const minBrowserVersionInt = parseInt(minBrowserVersion, 10);\n log.debug(`Selecting chromedrivers whose minimum supported browser version matches to ${minBrowserVersionInt}`);\n let closestMatchedVersionNumber = 0;\n // Select the newest available and compatible chromedriver\n for (const cdName of driversToSync) {\n const currentMinBrowserVersion = parseInt(this.mapping[cdName].minBrowserVersion, 10);\n if (!isNaN(currentMinBrowserVersion)\n && currentMinBrowserVersion <= minBrowserVersionInt\n && closestMatchedVersionNumber < currentMinBrowserVersion) {\n closestMatchedVersionNumber = currentMinBrowserVersion;\n }\n }\n driversToSync = driversToSync.filter((cdName) => `${this.mapping[cdName].minBrowserVersion}` ===\n `${closestMatchedVersionNumber > 0 ? closestMatchedVersionNumber : minBrowserVersionInt}`);\n\n log.debug(`Got ${util.pluralize('item', driversToSync.length, true)}`);\n if (_.isEmpty(driversToSync)) {\n return [];\n }\n log.debug(`Will select candidate ${util.pluralize('driver', driversToSync.length)} ` +\n `versioned as '${_.uniq(driversToSync.map((cdName) => this.mapping[cdName].version))}'`);\n }\n\n if (!_.isEmpty(osInfo)) {\n // Filter out drivers for unsupported system architectures\n let {name, arch} = osInfo;\n if (arch === X64 && !driversToSync.some((cdName) => cdName.includes(`_${name}${X64}`))) {\n // Fall back to x86 build if x64 one is not available for the given OS\n arch = X86;\n }\n // https://stackoverflow.com/questions/65146751/detecting-apple-silicon-mac-in-javascript\n if (name === OS.mac && _.includes(_.toLower(os.cpus()[0].model), 'apple')) {\n for (const armSuffix of APPLE_ARM_SUFFIXES) {\n if (driversToSync.some((cdName) => cdName.includes(armSuffix))) {\n // prefer executable for ARM arch if present\n arch = armSuffix;\n break;\n }\n }\n }\n log.debug(`Selecting chromedrivers whose platform matches to ${name}${arch}`);\n const platformRe = new RegExp(`(\\\\b|_)${name}${arch}\\\\b`);\n driversToSync = driversToSync.filter((cdName) => platformRe.test(cdName));\n log.debug(`Got ${util.pluralize('item', driversToSync.length, true)}`);\n }\n\n return driversToSync;\n }\n\n /**\n * Retrieves the given chromedriver from the storage\n * and unpacks it into `this.chromedriverDir` folder\n *\n * @param {number} index - The unique driver index\n * @param {string} driverKey - The driver key in `this.mapping`\n * @param {string} archivesRoot - The temporary folder path to extract\n * downloaded archives to\n * @param {boolean} isStrict [true] - Whether to throw an error (`true`)\n * or return a boolean result if the driver retrieval process fails\n * @throws {Error} if there was a failure while retrieving the driver\n * and `isStrict` is set to `true`\n * @returns {boolean} if `true` then the chromedriver is successfully\n * downloaded and extracted.\n */\n async retrieveDriver (index, driverKey, archivesRoot, isStrict = false) {\n const { url, etag, version } = this.mapping[driverKey];\n const archivePath = path.resolve(archivesRoot, `${index}.zip`);\n log.debug(`Retrieving '${url}' to '${archivePath}'`);\n try {\n await net.downloadFile(url, archivePath, {\n isMetered: false,\n timeout: TIMEOUT_MS\n });\n } catch (e) {\n const msg = `Cannot download chromedriver archive. Original error: ${e.message}`;\n if (isStrict) {\n throw new Error(msg);\n }\n log.error(msg);\n return false;\n }\n if (!await isCrcOk(archivePath, etag)) {\n const msg = `The checksum for the downloaded chromedriver '${driverKey}' did not match`;\n if (isStrict) {\n throw new Error(msg);\n }\n log.error(msg);\n return false;\n }\n const fileName = `${path.parse(url).name}_v${version}` +\n (system.isWindows() ? '.exe' : '');\n const targetPath = path.resolve(this.chromedriverDir, fileName);\n try {\n await this.unzipDriver(archivePath, targetPath);\n await fs.chmod(targetPath, 0o755);\n log.debug(`Permissions of the file '${targetPath}' have been changed to 755`);\n } catch (e) {\n if (isStrict) {\n throw e;\n }\n log.error(e.message);\n return false;\n }\n return true;\n }\n\n /**\n * @typedef {Object} SyncOptions\n * @property {Array<String>} versions - The list of chromedriver\n * versions to sync. If empty (the default value) then all available\n * chromedrivers are going to be downloaded and extracted\n * @property {string|number} minBrowserVersion - The minumum supported\n * Chrome version that downloaded chromedrivers should support. Can match\n * multiple drivers.\n * @property {?OSInfo} osInfo - System information used to filter out\n * the list of the retrieved drivers. If not provided then the script\n * will try to retrieve it.\n */\n\n /**\n * Retrieves chromedrivers from the remote storage\n * to the local file system\n *\n * @param {?SyncOptions} opts\n * @throws {Error} if there was a problem while retrieving\n * the drivers\n * @returns {Array<String} The list of successfully synchronized driver keys\n */\n async syncDrivers (opts = {}) {\n if (_.isEmpty(this.mapping)) {\n await this.retrieveMapping(!!opts.minBrowserVersion);\n }\n if (_.isEmpty(this.mapping)) {\n throw new Error('Cannot retrieve chromedrivers mapping from Google storage');\n }\n\n const driversToSync = this.selectMatchingDrivers(opts.osInfo ?? await getOsInfo(), opts);\n if (_.isEmpty(driversToSync)) {\n log.debug(`There are no drivers to sync. Exiting`);\n return [];\n }\n log.debug(`Got ${util.pluralize('driver', driversToSync.length, true)} to sync: ` +\n JSON.stringify(driversToSync, null, 2));\n\n const synchronizedDrivers = [];\n const promises = [];\n const archivesRoot = await tempDir.openDir();\n try {\n for (const [idx, driverKey] of driversToSync.entries()) {\n promises.push((async () => {\n if (await this.retrieveDriver(idx, driverKey, archivesRoot, !_.isEmpty(opts))) {\n synchronizedDrivers.push(driverKey);\n }\n })());\n\n if (promises.length % MAX_PARALLEL_DOWNLOADS === 0) {\n await B.all(promises);\n }\n }\n await B.all(promises);\n } finally {\n await fs.rimraf(archivesRoot);\n }\n if (!_.isEmpty(synchronizedDrivers)) {\n log.info(`Successfully synchronized ` +\n `${util.pluralize('chromedriver', synchronizedDrivers.length, true)}`);\n } else {\n log.info(`No chromedrivers were synchronized`);\n }\n return synchronizedDrivers;\n }\n}\n\n\nexport default ChromedriverStorageClient;\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.X86 = exports.X64 = exports.OS = exports.M1_ARCH_SUFFIX = exports.CHROMEDRIVER_CHROME_MAPPING = exports.CD_VER = exports.CD_CDN = exports.CD_BASE_DIR = void 0;
7
+ exports.X86 = exports.X64 = exports.OS = exports.CHROMEDRIVER_CHROME_MAPPING = exports.CD_VER = exports.CD_CDN = exports.CD_BASE_DIR = exports.APPLE_ARM_SUFFIXES = void 0;
8
8
  exports.generateLogPrefix = generateLogPrefix;
9
9
  exports.getChromeVersion = getChromeVersion;
10
10
  exports.getChromedriverBinaryPath = getChromedriverBinaryPath;
@@ -19,7 +19,6 @@ var _baseDriver = require("@appium/base-driver");
19
19
  var _path = _interopRequireDefault(require("path"));
20
20
  var _compareVersions = require("compare-versions");
21
21
  var _axios = _interopRequireDefault(require("axios"));
22
- var _teen_process = require("teen_process");
23
22
  const CD_CDN = process.env.npm_config_chromedriver_cdnurl || process.env.CHROMEDRIVER_CDNURL || 'https://chromedriver.storage.googleapis.com';
24
23
  exports.CD_CDN = CD_CDN;
25
24
  const OS = {
@@ -32,8 +31,8 @@ const X64 = '64';
32
31
  exports.X64 = X64;
33
32
  const X86 = '32';
34
33
  exports.X86 = X86;
35
- const M1_ARCH_SUFFIX = '_m1';
36
- exports.M1_ARCH_SUFFIX = M1_ARCH_SUFFIX;
34
+ const APPLE_ARM_SUFFIXES = ['64_m1', '_arm64'];
35
+ exports.APPLE_ARM_SUFFIXES = APPLE_ARM_SUFFIXES;
37
36
  const CD_EXECUTABLE_PREFIX = 'chromedriver';
38
37
  const MODULE_NAME = 'appium-chromedriver';
39
38
  const getModuleRoot = _lodash.default.memoize(function getModuleRoot() {
@@ -101,8 +100,7 @@ exports.getOsName = getOsName;
101
100
  const getOsInfo = _lodash.default.memoize(async function getOsInfo() {
102
101
  return {
103
102
  name: getOsName(),
104
- arch: await _support.system.arch(),
105
- hardwareName: _support.system.isWindows() ? null : _lodash.default.trim(await (0, _teen_process.exec)('uname', ['-m']))
103
+ arch: await _support.system.arch()
106
104
  };
107
105
  });
108
106
  exports.getOsInfo = getOsInfo;
@@ -110,4 +108,4 @@ const getBaseDriverInstance = _lodash.default.memoize(() => new _baseDriver.Base
110
108
  function generateLogPrefix(obj, sessionId = null) {
111
109
  return getBaseDriverInstance().helpers.generateDriverLogPrefix(obj, sessionId);
112
110
  }
113
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDRF9DRE4iLCJwcm9jZXNzIiwiZW52IiwibnBtX2NvbmZpZ19jaHJvbWVkcml2ZXJfY2RudXJsIiwiQ0hST01FRFJJVkVSX0NETlVSTCIsIk9TIiwibGludXgiLCJ3aW5kb3dzIiwibWFjIiwiWDY0IiwiWDg2IiwiTTFfQVJDSF9TVUZGSVgiLCJDRF9FWEVDVVRBQkxFX1BSRUZJWCIsIk1PRFVMRV9OQU1FIiwiZ2V0TW9kdWxlUm9vdCIsIl8iLCJtZW1vaXplIiwicm9vdCIsIm5vZGUiLCJnZXRNb2R1bGVSb290U3luYyIsIl9fZmlsZW5hbWUiLCJFcnJvciIsIkNIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORyIsInJlcXVpcmUiLCJwYXRoIiwiam9pbiIsIkNEX0JBU0VfRElSIiwiZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlciIsIm1hcHBpbmciLCJpc0VtcHR5IiwibGFzdCIsImtleXMiLCJzb3J0IiwiY29tcGFyZVZlcnNpb25zIiwiQ0RfVkVSIiwibnBtX2NvbmZpZ19jaHJvbWVkcml2ZXJfdmVyc2lvbiIsIkNIUk9NRURSSVZFUl9WRVJTSU9OIiwiZ2V0Q2hyb21lVmVyc2lvbiIsImFkYiIsImJ1bmRsZUlkIiwidmVyc2lvbk5hbWUiLCJnZXRQYWNrYWdlSW5mbyIsImdldENocm9tZWRyaXZlckRpciIsIm9zTmFtZSIsImdldE9zTmFtZSIsInJlc29sdmUiLCJnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIiwicm9vdERpciIsInBhdGhTdWZmaXgiLCJwYXRocyIsImZzIiwiZ2xvYiIsImN3ZCIsImFic29sdXRlIiwibm9jYXNlIiwibm9kaXIiLCJzdHJpY3QiLCJmaXJzdCIsInJldHJpZXZlRGF0YSIsInVybCIsImhlYWRlcnMiLCJvcHRzIiwidGltZW91dCIsInJlc3BvbnNlVHlwZSIsImF4aW9zIiwiZGF0YSIsInN5c3RlbSIsImlzV2luZG93cyIsImlzTWFjIiwiZ2V0T3NJbmZvIiwibmFtZSIsImFyY2giLCJoYXJkd2FyZU5hbWUiLCJ0cmltIiwiZXhlYyIsImdldEJhc2VEcml2ZXJJbnN0YW5jZSIsIkJhc2VEcml2ZXIiLCJnZW5lcmF0ZUxvZ1ByZWZpeCIsIm9iaiIsInNlc3Npb25JZCIsImhlbHBlcnMiLCJnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcywgbm9kZSB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGNvbXBhcmVWZXJzaW9ucyB9IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuXG5jb25zdCBDRF9DRE4gPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2Nocm9tZWRyaXZlcl9jZG51cmxcbiAgfHwgcHJvY2Vzcy5lbnYuQ0hST01FRFJJVkVSX0NETlVSTFxuICB8fCAnaHR0cHM6Ly9jaHJvbWVkcml2ZXIuc3RvcmFnZS5nb29nbGVhcGlzLmNvbSc7XG5jb25zdCBPUyA9IHtcbiAgbGludXg6ICdsaW51eCcsXG4gIHdpbmRvd3M6ICd3aW4nLFxuICBtYWM6ICdtYWMnXG59O1xuY29uc3QgWDY0ID0gJzY0JztcbmNvbnN0IFg4NiA9ICczMic7XG5jb25zdCBNMV9BUkNIX1NVRkZJWCA9ICdfbTEnO1xuY29uc3QgQ0RfRVhFQ1VUQUJMRV9QUkVGSVggPSAnY2hyb21lZHJpdmVyJztcbmNvbnN0IE1PRFVMRV9OQU1FID0gJ2FwcGl1bS1jaHJvbWVkcml2ZXInO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHBhdGggdG8gdGhlIGN1cnJlbnQgbW9kdWxlJ3Mgcm9vdCBmb2xkZXJcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIG1vZHVsZSByb290XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGN1cnJlbnQgbW9kdWxlIHJvb3QgZm9sZGVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmNvbnN0IGdldE1vZHVsZVJvb3QgPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0TW9kdWxlUm9vdCAoKSB7XG4gIGNvbnN0IHJvb3QgPSBub2RlLmdldE1vZHVsZVJvb3RTeW5jKE1PRFVMRV9OQU1FLCBfX2ZpbGVuYW1lKTtcbiAgaWYgKCFyb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlICR7TU9EVUxFX05BTUV9IE5vZGUuanMgbW9kdWxlYCk7XG4gIH1cbiAgcmV0dXJuIHJvb3Q7XG59KTtcblxuLy8gQ2hyb21lZHJpdmVyIHZlcnNpb246IG1pbmltdW0gQ2hyb21lIHZlcnNpb25cbmNvbnN0IENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORyA9IHJlcXVpcmUocGF0aC5qb2luKGdldE1vZHVsZVJvb3QoKSwgJ2NvbmZpZycsICdtYXBwaW5nLmpzb24nKSk7XG5jb25zdCBDRF9CQVNFX0RJUiA9IHBhdGguam9pbihnZXRNb2R1bGVSb290KCksICdjaHJvbWVkcml2ZXInKTtcblxuZnVuY3Rpb24gZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlciAobWFwcGluZyA9IENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORykge1xuICBpZiAoXy5pc0VtcHR5KG1hcHBpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IG1vc3QgcmVjZW50IENocm9tZWRyaXZlciB2ZXJzaW9uIGZyb20gZW1wdHkgbWFwcGluZycpO1xuICB9XG4gIHJldHVybiBfLmxhc3QoXy5rZXlzKG1hcHBpbmcpLnNvcnQoY29tcGFyZVZlcnNpb25zKSk7XG59XG5cbmNvbnN0IENEX1ZFUiA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb25cbiAgfHwgcHJvY2Vzcy5lbnYuQ0hST01FRFJJVkVSX1ZFUlNJT05cbiAgfHwgZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlcigpO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRDaHJvbWVWZXJzaW9uIChhZGIsIGJ1bmRsZUlkKSB7XG4gIGNvbnN0IHt2ZXJzaW9uTmFtZX0gPSBhd2FpdCBhZGIuZ2V0UGFja2FnZUluZm8oYnVuZGxlSWQpO1xuICByZXR1cm4gdmVyc2lvbk5hbWU7XG59XG5cbmZ1bmN0aW9uIGdldENocm9tZWRyaXZlckRpciAob3NOYW1lID0gZ2V0T3NOYW1lKCkpIHtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShDRF9CQVNFX0RJUiwgb3NOYW1lKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCAob3NOYW1lID0gZ2V0T3NOYW1lKCkpIHtcbiAgY29uc3Qgcm9vdERpciA9IGdldENocm9tZWRyaXZlckRpcihvc05hbWUpO1xuICBjb25zdCBwYXRoU3VmZml4ID0gb3NOYW1lID09PSBPUy53aW5kb3dzID8gJy5leGUnIDogJyc7XG4gIGNvbnN0IHBhdGhzID0gYXdhaXQgZnMuZ2xvYihgJHtDRF9FWEVDVVRBQkxFX1BSRUZJWH0qJHtwYXRoU3VmZml4fWAsIHtcbiAgICBjd2Q6IHJvb3REaXIsXG4gICAgYWJzb2x1dGU6IHRydWUsXG4gICAgbm9jYXNlOiB0cnVlLFxuICAgIG5vZGlyOiB0cnVlLFxuICAgIHN0cmljdDogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gXy5pc0VtcHR5KHBhdGhzKVxuICAgID8gcGF0aC5yZXNvbHZlKHJvb3REaXIsIGAke0NEX0VYRUNVVEFCTEVfUFJFRklYfSR7cGF0aFN1ZmZpeH1gKVxuICAgIDogXy5maXJzdChwYXRocyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlRGF0YSAodXJsLCBoZWFkZXJzLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSA1MDAwLFxuICAgIHJlc3BvbnNlVHlwZSA9ICd0ZXh0JyxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybCxcbiAgICBoZWFkZXJzLFxuICAgIHRpbWVvdXQsXG4gICAgcmVzcG9uc2VUeXBlLFxuICB9KSkuZGF0YTtcbn1cblxuY29uc3QgZ2V0T3NOYW1lID0gXy5tZW1vaXplKGZ1bmN0aW9uIGdldE9zTmFtZSAoKSB7XG4gIGlmIChzeXN0ZW0uaXNXaW5kb3dzKCkpIHtcbiAgICByZXR1cm4gT1Mud2luZG93cztcbiAgfVxuICBpZiAoc3lzdGVtLmlzTWFjKCkpIHtcbiAgICByZXR1cm4gT1MubWFjO1xuICB9XG4gIHJldHVybiBPUy5saW51eDtcbn0pO1xuXG5jb25zdCBnZXRPc0luZm8gPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0T3NJbmZvICgpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBnZXRPc05hbWUoKSxcbiAgICBhcmNoOiBhd2FpdCBzeXN0ZW0uYXJjaCgpLFxuICAgIGhhcmR3YXJlTmFtZTogc3lzdGVtLmlzV2luZG93cygpID8gbnVsbCA6IF8udHJpbShhd2FpdCBleGVjKCd1bmFtZScsIFsnLW0nXSkpLFxuICB9O1xufSk7XG5cbmNvbnN0IGdldEJhc2VEcml2ZXJJbnN0YW5jZSA9IF8ubWVtb2l6ZSgoKSA9PiBuZXcgQmFzZURyaXZlcih7fSwgZmFsc2UpKTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgbG9nIHByZWZpeCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqIGxvZyBvd25lciBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmc/fSBzZXNzaW9uSWQgT3B0aW9uYWwgc2Vzc2lvbiBpZGVudGlmaWVyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUxvZ1ByZWZpeCAob2JqLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIHJldHVybiBnZXRCYXNlRHJpdmVySW5zdGFuY2UoKS5oZWxwZXJzLmdlbmVyYXRlRHJpdmVyTG9nUHJlZml4KG9iaiwgc2Vzc2lvbklkKTtcbn1cblxuXG5leHBvcnQge1xuICBnZXRDaHJvbWVWZXJzaW9uLCBnZXRDaHJvbWVkcml2ZXJEaXIsIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgsIGdldE9zTmFtZSxcbiAgQ0RfQkFTRV9ESVIsIENEX0NETiwgQ0RfVkVSLCBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsIGdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIsXG4gIHJldHJpZXZlRGF0YSwgZ2V0T3NJbmZvLCBPUywgWDY0LCBYODYsIE0xX0FSQ0hfU1VGRklYLCBnZW5lcmF0ZUxvZ1ByZWZpeCxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsTUFBTSxHQUFHQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0MsOEJBQThCLElBQ3BERixPQUFPLENBQUNDLEdBQUcsQ0FBQ0UsbUJBQW1CLElBQy9CLDZDQUE2QztBQUFDO0FBQ25ELE1BQU1DLEVBQUUsR0FBRztFQUNUQyxLQUFLLEVBQUUsT0FBTztFQUNkQyxPQUFPLEVBQUUsS0FBSztFQUNkQyxHQUFHLEVBQUU7QUFDUCxDQUFDO0FBQUM7QUFDRixNQUFNQyxHQUFHLEdBQUcsSUFBSTtBQUFDO0FBQ2pCLE1BQU1DLEdBQUcsR0FBRyxJQUFJO0FBQUM7QUFDakIsTUFBTUMsY0FBYyxHQUFHLEtBQUs7QUFBQztBQUM3QixNQUFNQyxvQkFBb0IsR0FBRyxjQUFjO0FBQzNDLE1BQU1DLFdBQVcsR0FBRyxxQkFBcUI7QUFRekMsTUFBTUMsYUFBYSxHQUFHQyxlQUFDLENBQUNDLE9BQU8sQ0FBQyxTQUFTRixhQUFhLEdBQUk7RUFDeEQsTUFBTUcsSUFBSSxHQUFHQyxhQUFJLENBQUNDLGlCQUFpQixDQUFDTixXQUFXLEVBQUVPLFVBQVUsQ0FBQztFQUM1RCxJQUFJLENBQUNILElBQUksRUFBRTtJQUNULE1BQU0sSUFB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
111
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDRF9DRE4iLCJwcm9jZXNzIiwiZW52IiwibnBtX2NvbmZpZ19jaHJvbWVkcml2ZXJfY2RudXJsIiwiQ0hST01FRFJJVkVSX0NETlVSTCIsIk9TIiwibGludXgiLCJ3aW5kb3dzIiwibWFjIiwiWDY0IiwiWDg2IiwiQVBQTEVfQVJNX1NVRkZJWEVTIiwiQ0RfRVhFQ1VUQUJMRV9QUkVGSVgiLCJNT0RVTEVfTkFNRSIsImdldE1vZHVsZVJvb3QiLCJfIiwibWVtb2l6ZSIsInJvb3QiLCJub2RlIiwiZ2V0TW9kdWxlUm9vdFN5bmMiLCJfX2ZpbGVuYW1lIiwiRXJyb3IiLCJDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkciLCJyZXF1aXJlIiwicGF0aCIsImpvaW4iLCJDRF9CQVNFX0RJUiIsImdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIiLCJtYXBwaW5nIiwiaXNFbXB0eSIsImxhc3QiLCJrZXlzIiwic29ydCIsImNvbXBhcmVWZXJzaW9ucyIsIkNEX1ZFUiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb24iLCJDSFJPTUVEUklWRVJfVkVSU0lPTiIsImdldENocm9tZVZlcnNpb24iLCJhZGIiLCJidW5kbGVJZCIsInZlcnNpb25OYW1lIiwiZ2V0UGFja2FnZUluZm8iLCJnZXRDaHJvbWVkcml2ZXJEaXIiLCJvc05hbWUiLCJnZXRPc05hbWUiLCJyZXNvbHZlIiwiZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCIsInJvb3REaXIiLCJwYXRoU3VmZml4IiwicGF0aHMiLCJmcyIsImdsb2IiLCJjd2QiLCJhYnNvbHV0ZSIsIm5vY2FzZSIsIm5vZGlyIiwic3RyaWN0IiwiZmlyc3QiLCJyZXRyaWV2ZURhdGEiLCJ1cmwiLCJoZWFkZXJzIiwib3B0cyIsInRpbWVvdXQiLCJyZXNwb25zZVR5cGUiLCJheGlvcyIsImRhdGEiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJpc01hYyIsImdldE9zSW5mbyIsIm5hbWUiLCJhcmNoIiwiZ2V0QmFzZURyaXZlckluc3RhbmNlIiwiQmFzZURyaXZlciIsImdlbmVyYXRlTG9nUHJlZml4Iiwib2JqIiwic2Vzc2lvbklkIiwiaGVscGVycyIsImdlbmVyYXRlRHJpdmVyTG9nUHJlZml4Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCBub2RlIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IEJhc2VEcml2ZXIgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnY29tcGFyZS12ZXJzaW9ucyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuXG5jb25zdCBDRF9DRE4gPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2Nocm9tZWRyaXZlcl9jZG51cmxcbiAgfHwgcHJvY2Vzcy5lbnYuQ0hST01FRFJJVkVSX0NETlVSTFxuICB8fCAnaHR0cHM6Ly9jaHJvbWVkcml2ZXIuc3RvcmFnZS5nb29nbGVhcGlzLmNvbSc7XG5jb25zdCBPUyA9IHtcbiAgbGludXg6ICdsaW51eCcsXG4gIHdpbmRvd3M6ICd3aW4nLFxuICBtYWM6ICdtYWMnXG59O1xuY29uc3QgWDY0ID0gJzY0JztcbmNvbnN0IFg4NiA9ICczMic7XG5jb25zdCBBUFBMRV9BUk1fU1VGRklYRVMgPSBbJzY0X20xJywgJ19hcm02NCddO1xuY29uc3QgQ0RfRVhFQ1VUQUJMRV9QUkVGSVggPSAnY2hyb21lZHJpdmVyJztcbmNvbnN0IE1PRFVMRV9OQU1FID0gJ2FwcGl1bS1jaHJvbWVkcml2ZXInO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHBhdGggdG8gdGhlIGN1cnJlbnQgbW9kdWxlJ3Mgcm9vdCBmb2xkZXJcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIG1vZHVsZSByb290XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGN1cnJlbnQgbW9kdWxlIHJvb3QgZm9sZGVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmNvbnN0IGdldE1vZHVsZVJvb3QgPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0TW9kdWxlUm9vdCAoKSB7XG4gIGNvbnN0IHJvb3QgPSBub2RlLmdldE1vZHVsZVJvb3RTeW5jKE1PRFVMRV9OQU1FLCBfX2ZpbGVuYW1lKTtcbiAgaWYgKCFyb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlICR7TU9EVUxFX05BTUV9IE5vZGUuanMgbW9kdWxlYCk7XG4gIH1cbiAgcmV0dXJuIHJvb3Q7XG59KTtcblxuLy8gQ2hyb21lZHJpdmVyIHZlcnNpb246IG1pbmltdW0gQ2hyb21lIHZlcnNpb25cbmNvbnN0IENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORyA9IHJlcXVpcmUocGF0aC5qb2luKGdldE1vZHVsZVJvb3QoKSwgJ2NvbmZpZycsICdtYXBwaW5nLmpzb24nKSk7XG5jb25zdCBDRF9CQVNFX0RJUiA9IHBhdGguam9pbihnZXRNb2R1bGVSb290KCksICdjaHJvbWVkcml2ZXInKTtcblxuZnVuY3Rpb24gZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlciAobWFwcGluZyA9IENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORykge1xuICBpZiAoXy5pc0VtcHR5KG1hcHBpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IG1vc3QgcmVjZW50IENocm9tZWRyaXZlciB2ZXJzaW9uIGZyb20gZW1wdHkgbWFwcGluZycpO1xuICB9XG4gIHJldHVybiBfLmxhc3QoXy5rZXlzKG1hcHBpbmcpLnNvcnQoY29tcGFyZVZlcnNpb25zKSk7XG59XG5cbmNvbnN0IENEX1ZFUiA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb25cbiAgfHwgcHJvY2Vzcy5lbnYuQ0hST01FRFJJVkVSX1ZFUlNJT05cbiAgfHwgZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlcigpO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRDaHJvbWVWZXJzaW9uIChhZGIsIGJ1bmRsZUlkKSB7XG4gIGNvbnN0IHt2ZXJzaW9uTmFtZX0gPSBhd2FpdCBhZGIuZ2V0UGFja2FnZUluZm8oYnVuZGxlSWQpO1xuICByZXR1cm4gdmVyc2lvbk5hbWU7XG59XG5cbmZ1bmN0aW9uIGdldENocm9tZWRyaXZlckRpciAob3NOYW1lID0gZ2V0T3NOYW1lKCkpIHtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShDRF9CQVNFX0RJUiwgb3NOYW1lKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCAob3NOYW1lID0gZ2V0T3NOYW1lKCkpIHtcbiAgY29uc3Qgcm9vdERpciA9IGdldENocm9tZWRyaXZlckRpcihvc05hbWUpO1xuICBjb25zdCBwYXRoU3VmZml4ID0gb3NOYW1lID09PSBPUy53aW5kb3dzID8gJy5leGUnIDogJyc7XG4gIGNvbnN0IHBhdGhzID0gYXdhaXQgZnMuZ2xvYihgJHtDRF9FWEVDVVRBQkxFX1BSRUZJWH0qJHtwYXRoU3VmZml4fWAsIHtcbiAgICBjd2Q6IHJvb3REaXIsXG4gICAgYWJzb2x1dGU6IHRydWUsXG4gICAgbm9jYXNlOiB0cnVlLFxuICAgIG5vZGlyOiB0cnVlLFxuICAgIHN0cmljdDogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gXy5pc0VtcHR5KHBhdGhzKVxuICAgID8gcGF0aC5yZXNvbHZlKHJvb3REaXIsIGAke0NEX0VYRUNVVEFCTEVfUFJFRklYfSR7cGF0aFN1ZmZpeH1gKVxuICAgIDogXy5maXJzdChwYXRocyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlRGF0YSAodXJsLCBoZWFkZXJzLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSA1MDAwLFxuICAgIHJlc3BvbnNlVHlwZSA9ICd0ZXh0JyxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybCxcbiAgICBoZWFkZXJzLFxuICAgIHRpbWVvdXQsXG4gICAgcmVzcG9uc2VUeXBlLFxuICB9KSkuZGF0YTtcbn1cblxuY29uc3QgZ2V0T3NOYW1lID0gXy5tZW1vaXplKGZ1bmN0aW9uIGdldE9zTmFtZSAoKSB7XG4gIGlmIChzeXN0ZW0uaXNXaW5kb3dzKCkpIHtcbiAgICByZXR1cm4gT1Mud2luZG93cztcbiAgfVxuICBpZiAoc3lzdGVtLmlzTWFjKCkpIHtcbiAgICByZXR1cm4gT1MubWFjO1xuICB9XG4gIHJldHVybiBPUy5saW51eDtcbn0pO1xuXG5jb25zdCBnZXRPc0luZm8gPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0T3NJbmZvICgpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBnZXRPc05hbWUoKSxcbiAgICBhcmNoOiBhd2FpdCBzeXN0ZW0uYXJjaCgpLFxuICB9O1xufSk7XG5cbmNvbnN0IGdldEJhc2VEcml2ZXJJbnN0YW5jZSA9IF8ubWVtb2l6ZSgoKSA9PiBuZXcgQmFzZURyaXZlcih7fSwgZmFsc2UpKTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgbG9nIHByZWZpeCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqIGxvZyBvd25lciBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmc/fSBzZXNzaW9uSWQgT3B0aW9uYWwgc2Vzc2lvbiBpZGVudGlmaWVyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUxvZ1ByZWZpeCAob2JqLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIHJldHVybiBnZXRCYXNlRHJpdmVySW5zdGFuY2UoKS5oZWxwZXJzLmdlbmVyYXRlRHJpdmVyTG9nUHJlZml4KG9iaiwgc2Vzc2lvbklkKTtcbn1cblxuXG5leHBvcnQge1xuICBnZXRDaHJvbWVWZXJzaW9uLCBnZXRDaHJvbWVkcml2ZXJEaXIsIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgsIGdldE9zTmFtZSxcbiAgQ0RfQkFTRV9ESVIsIENEX0NETiwgQ0RfVkVSLCBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsIGdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIsXG4gIHJldHJpZXZlRGF0YSwgZ2V0T3NJbmZvLCBPUywgWDY0LCBYODYsIEFQUExFX0FSTV9TVUZGSVhFUywgZ2VuZXJhdGVMb2dQcmVmaXgsXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxNQUFNLEdBQUdDLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDQyw4QkFBOEIsSUFDcERGLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDRSxtQkFBbUIsSUFDL0IsNkNBQTZDO0FBQUM7QUFDbkQsTUFBTUMsRUFBRSxHQUFHO0VBQ1RDLEtBQUssRUFBRSxPQUFPO0VBQ2RDLE9BQU8sRUFBRSxLQUFLO0VBQ2RDLEdBQUcsRUFBRTtBQUNQLENBQUM7QUFBQztBQUNGLE1BQU1DLEdBQUcsR0FBRyxJQUFJO0FBQUM7QUFDakIsTUFBTUMsR0FBRyxHQUFHLElBQUk7QUFBQztBQUNqQixNQUFNQyxrQkFBa0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7QUFBQztBQUMvQyxNQUFNQyxvQkFBb0IsR0FBRyxjQUFjO0FBQzNDLE1BQU1DLFdBQVcsR0FBRyxxQkFBcUI7QUFRekMsTUFBTUMsYUFBYSxHQUFHQyxlQUFDLENBQUNDLE9BQU8sQ0FBQyxTQUFTRixhQUFhLEdBQUk7RUFDeEQsTUFBTUcsSUFBSSxHQUFHQyxhQUFJLENBQUNDLGlCQUFpQixDQUFDTixXQUFXLEVBQUVPLFVBQVUsQ0FBQztFQUM1RCxJQUFJLENBQUNILElBQUksRUFBRTtJQUNULE1BQU0sSUFBSUksS0FBSyxDQUFFLHNDQUFxQ1IsV0FBWSxpQkFBZ0IsQ0FBQztFQUNyRjtFQUNBLE9BQU9JLElBQUk7QUFDYixDQUFDLENBQUM7QUFHRixNQUFNSywyQkFBMkIsR0FBR0MsT0FBTyxDQUFD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
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["CD_CDN","process","env","npm_config_chromedriver_cdnurl","CHROMEDRIVER_CDNURL","OS","linux","windows","mac","X64","X86","M1_ARCH_SUFFIX","CD_EXECUTABLE_PREFIX","MODULE_NAME","getModuleRoot","_","memoize","root","node","getModuleRootSync","__filename","Error","CHROMEDRIVER_CHROME_MAPPING","require","path","join","CD_BASE_DIR","getMostRecentChromedriver","mapping","isEmpty","last","keys","sort","compareVersions","CD_VER","npm_config_chromedriver_version","CHROMEDRIVER_VERSION","getChromeVersion","adb","bundleId","versionName","getPackageInfo","getChromedriverDir","osName","getOsName","resolve","getChromedriverBinaryPath","rootDir","pathSuffix","paths","fs","glob","cwd","absolute","nocase","nodir","strict","first","retrieveData","url","headers","opts","timeout","responseType","axios","data","system","isWindows","isMac","getOsInfo","name","arch","hardwareName","trim","exec","getBaseDriverInstance","BaseDriver","generateLogPrefix","obj","sessionId","helpers","generateDriverLogPrefix"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { system, fs, node } from '@appium/support';\nimport { BaseDriver } from '@appium/base-driver';\nimport path from 'path';\nimport { compareVersions } from 'compare-versions';\nimport axios from 'axios';\nimport { exec } from 'teen_process';\n\nconst CD_CDN = process.env.npm_config_chromedriver_cdnurl\n || process.env.CHROMEDRIVER_CDNURL\n || 'https://chromedriver.storage.googleapis.com';\nconst OS = {\n linux: 'linux',\n windows: 'win',\n mac: 'mac'\n};\nconst X64 = '64';\nconst X86 = '32';\nconst M1_ARCH_SUFFIX = '_m1';\nconst CD_EXECUTABLE_PREFIX = 'chromedriver';\nconst MODULE_NAME = 'appium-chromedriver';\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(function getModuleRoot () {\n const root = node.getModuleRootSync(MODULE_NAME, __filename);\n if (!root) {\n throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);\n }\n return root;\n});\n\n// Chromedriver version: minimum Chrome version\nconst CHROMEDRIVER_CHROME_MAPPING = require(path.join(getModuleRoot(), 'config', 'mapping.json'));\nconst CD_BASE_DIR = path.join(getModuleRoot(), 'chromedriver');\n\nfunction getMostRecentChromedriver (mapping = CHROMEDRIVER_CHROME_MAPPING) {\n if (_.isEmpty(mapping)) {\n throw new Error('Unable to get most recent Chromedriver version from empty mapping');\n }\n return _.last(_.keys(mapping).sort(compareVersions));\n}\n\nconst CD_VER = process.env.npm_config_chromedriver_version\n || process.env.CHROMEDRIVER_VERSION\n || getMostRecentChromedriver();\n\nasync function getChromeVersion (adb, bundleId) {\n const {versionName} = await adb.getPackageInfo(bundleId);\n return versionName;\n}\n\nfunction getChromedriverDir (osName = getOsName()) {\n return path.resolve(CD_BASE_DIR, osName);\n}\n\nasync function getChromedriverBinaryPath (osName = getOsName()) {\n const rootDir = getChromedriverDir(osName);\n const pathSuffix = osName === OS.windows ? '.exe' : '';\n const paths = await fs.glob(`${CD_EXECUTABLE_PREFIX}*${pathSuffix}`, {\n cwd: rootDir,\n absolute: true,\n nocase: true,\n nodir: true,\n strict: false,\n });\n return _.isEmpty(paths)\n ? path.resolve(rootDir, `${CD_EXECUTABLE_PREFIX}${pathSuffix}`)\n : _.first(paths);\n}\n\nasync function retrieveData (url, headers, opts = {}) {\n const {\n timeout = 5000,\n responseType = 'text',\n } = opts;\n return (await axios({\n url,\n headers,\n timeout,\n responseType,\n })).data;\n}\n\nconst getOsName = _.memoize(function getOsName () {\n if (system.isWindows()) {\n return OS.windows;\n }\n if (system.isMac()) {\n return OS.mac;\n }\n return OS.linux;\n});\n\nconst getOsInfo = _.memoize(async function getOsInfo () {\n return {\n name: getOsName(),\n arch: await system.arch(),\n hardwareName: system.isWindows() ? null : _.trim(await exec('uname', ['-m'])),\n };\n});\n\nconst getBaseDriverInstance = _.memoize(() => new BaseDriver({}, false));\n\n/**\n * Generates log prefix string\n *\n * @param {object} obj log owner instance\n * @param {string?} sessionId Optional session identifier\n * @returns {string}\n */\nfunction generateLogPrefix (obj, sessionId = null) {\n return getBaseDriverInstance().helpers.generateDriverLogPrefix(obj, sessionId);\n}\n\n\nexport {\n getChromeVersion, getChromedriverDir, getChromedriverBinaryPath, getOsName,\n CD_BASE_DIR, CD_CDN, CD_VER, CHROMEDRIVER_CHROME_MAPPING, getMostRecentChromedriver,\n retrieveData, getOsInfo, OS, X64, X86, M1_ARCH_SUFFIX, generateLogPrefix,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":["CD_CDN","process","env","npm_config_chromedriver_cdnurl","CHROMEDRIVER_CDNURL","OS","linux","windows","mac","X64","X86","APPLE_ARM_SUFFIXES","CD_EXECUTABLE_PREFIX","MODULE_NAME","getModuleRoot","_","memoize","root","node","getModuleRootSync","__filename","Error","CHROMEDRIVER_CHROME_MAPPING","require","path","join","CD_BASE_DIR","getMostRecentChromedriver","mapping","isEmpty","last","keys","sort","compareVersions","CD_VER","npm_config_chromedriver_version","CHROMEDRIVER_VERSION","getChromeVersion","adb","bundleId","versionName","getPackageInfo","getChromedriverDir","osName","getOsName","resolve","getChromedriverBinaryPath","rootDir","pathSuffix","paths","fs","glob","cwd","absolute","nocase","nodir","strict","first","retrieveData","url","headers","opts","timeout","responseType","axios","data","system","isWindows","isMac","getOsInfo","name","arch","getBaseDriverInstance","BaseDriver","generateLogPrefix","obj","sessionId","helpers","generateDriverLogPrefix"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { system, fs, node } from '@appium/support';\nimport { BaseDriver } from '@appium/base-driver';\nimport path from 'path';\nimport { compareVersions } from 'compare-versions';\nimport axios from 'axios';\n\nconst CD_CDN = process.env.npm_config_chromedriver_cdnurl\n || process.env.CHROMEDRIVER_CDNURL\n || 'https://chromedriver.storage.googleapis.com';\nconst OS = {\n linux: 'linux',\n windows: 'win',\n mac: 'mac'\n};\nconst X64 = '64';\nconst X86 = '32';\nconst APPLE_ARM_SUFFIXES = ['64_m1', '_arm64'];\nconst CD_EXECUTABLE_PREFIX = 'chromedriver';\nconst MODULE_NAME = 'appium-chromedriver';\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(function getModuleRoot () {\n const root = node.getModuleRootSync(MODULE_NAME, __filename);\n if (!root) {\n throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);\n }\n return root;\n});\n\n// Chromedriver version: minimum Chrome version\nconst CHROMEDRIVER_CHROME_MAPPING = require(path.join(getModuleRoot(), 'config', 'mapping.json'));\nconst CD_BASE_DIR = path.join(getModuleRoot(), 'chromedriver');\n\nfunction getMostRecentChromedriver (mapping = CHROMEDRIVER_CHROME_MAPPING) {\n if (_.isEmpty(mapping)) {\n throw new Error('Unable to get most recent Chromedriver version from empty mapping');\n }\n return _.last(_.keys(mapping).sort(compareVersions));\n}\n\nconst CD_VER = process.env.npm_config_chromedriver_version\n || process.env.CHROMEDRIVER_VERSION\n || getMostRecentChromedriver();\n\nasync function getChromeVersion (adb, bundleId) {\n const {versionName} = await adb.getPackageInfo(bundleId);\n return versionName;\n}\n\nfunction getChromedriverDir (osName = getOsName()) {\n return path.resolve(CD_BASE_DIR, osName);\n}\n\nasync function getChromedriverBinaryPath (osName = getOsName()) {\n const rootDir = getChromedriverDir(osName);\n const pathSuffix = osName === OS.windows ? '.exe' : '';\n const paths = await fs.glob(`${CD_EXECUTABLE_PREFIX}*${pathSuffix}`, {\n cwd: rootDir,\n absolute: true,\n nocase: true,\n nodir: true,\n strict: false,\n });\n return _.isEmpty(paths)\n ? path.resolve(rootDir, `${CD_EXECUTABLE_PREFIX}${pathSuffix}`)\n : _.first(paths);\n}\n\nasync function retrieveData (url, headers, opts = {}) {\n const {\n timeout = 5000,\n responseType = 'text',\n } = opts;\n return (await axios({\n url,\n headers,\n timeout,\n responseType,\n })).data;\n}\n\nconst getOsName = _.memoize(function getOsName () {\n if (system.isWindows()) {\n return OS.windows;\n }\n if (system.isMac()) {\n return OS.mac;\n }\n return OS.linux;\n});\n\nconst getOsInfo = _.memoize(async function getOsInfo () {\n return {\n name: getOsName(),\n arch: await system.arch(),\n };\n});\n\nconst getBaseDriverInstance = _.memoize(() => new BaseDriver({}, false));\n\n/**\n * Generates log prefix string\n *\n * @param {object} obj log owner instance\n * @param {string?} sessionId Optional session identifier\n * @returns {string}\n */\nfunction generateLogPrefix (obj, sessionId = null) {\n return getBaseDriverInstance().helpers.generateDriverLogPrefix(obj, sessionId);\n}\n\n\nexport {\n getChromeVersion, getChromedriverDir, getChromedriverBinaryPath, getOsName,\n CD_BASE_DIR, CD_CDN, CD_VER, CHROMEDRIVER_CHROME_MAPPING, getMostRecentChromedriver,\n retrieveData, getOsInfo, OS, X64, X86, APPLE_ARM_SUFFIXES, generateLogPrefix,\n};\n"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  getChromedriverDir, CD_CDN, retrieveData, getOsInfo,
3
- OS, X64, X86, M1_ARCH_SUFFIX,
3
+ OS, X64, X86, APPLE_ARM_SUFFIXES,
4
4
  } from './utils';
5
5
  import _ from 'lodash';
6
6
  import xpath from 'xpath';
7
7
  import { DOMParser } from '@xmldom/xmldom';
8
8
  import B from 'bluebird';
9
9
  import path from 'path';
10
+ import os from 'os';
10
11
  import { system, fs, logger, tempDir, zip, util, net } from '@appium/support';
11
12
 
12
13
 
@@ -241,10 +242,8 @@ class ChromedriverStorageClient {
241
242
  * @typedef {Object} OSInfo
242
243
  * @property {string} name - The name of the host OS
243
244
  * Can be either `mac`, `windows` or `linux`
244
- * @property {string} arch - The architecture of the host OD.
245
+ * @property {string} arch - The architecture of the host OS.
245
246
  * Can be either `32` or `64`
246
- * @property {?string} hardwareName - The output of `uname -m` command
247
- * on linux and mac systems. `null` on Windows
248
247
  */
249
248
 
250
249
  /**
@@ -303,15 +302,20 @@ class ChromedriverStorageClient {
303
302
 
304
303
  if (!_.isEmpty(osInfo)) {
305
304
  // Filter out drivers for unsupported system architectures
306
- let {name, arch, hardwareName} = osInfo;
305
+ let {name, arch} = osInfo;
307
306
  if (arch === X64 && !driversToSync.some((cdName) => cdName.includes(`_${name}${X64}`))) {
308
307
  // Fall back to x86 build if x64 one is not available for the given OS
309
308
  arch = X86;
310
309
  }
311
- if (name === OS.mac && _.includes(hardwareName, 'arm')
312
- && driversToSync.some((cdName) => cdName.includes(M1_ARCH_SUFFIX))) {
313
- // prefer executable for M1 arch if present
314
- arch += M1_ARCH_SUFFIX;
310
+ // https://stackoverflow.com/questions/65146751/detecting-apple-silicon-mac-in-javascript
311
+ if (name === OS.mac && _.includes(_.toLower(os.cpus()[0].model), 'apple')) {
312
+ for (const armSuffix of APPLE_ARM_SUFFIXES) {
313
+ if (driversToSync.some((cdName) => cdName.includes(armSuffix))) {
314
+ // prefer executable for ARM arch if present
315
+ arch = armSuffix;
316
+ break;
317
+ }
318
+ }
315
319
  }
316
320
  log.debug(`Selecting chromedrivers whose platform matches to ${name}${arch}`);
317
321
  const platformRe = new RegExp(`(\\b|_)${name}${arch}\\b`);
package/lib/utils.js CHANGED
@@ -4,7 +4,6 @@ import { BaseDriver } from '@appium/base-driver';
4
4
  import path from 'path';
5
5
  import { compareVersions } from 'compare-versions';
6
6
  import axios from 'axios';
7
- import { exec } from 'teen_process';
8
7
 
9
8
  const CD_CDN = process.env.npm_config_chromedriver_cdnurl
10
9
  || process.env.CHROMEDRIVER_CDNURL
@@ -16,7 +15,7 @@ const OS = {
16
15
  };
17
16
  const X64 = '64';
18
17
  const X86 = '32';
19
- const M1_ARCH_SUFFIX = '_m1';
18
+ const APPLE_ARM_SUFFIXES = ['64_m1', '_arm64'];
20
19
  const CD_EXECUTABLE_PREFIX = 'chromedriver';
21
20
  const MODULE_NAME = 'appium-chromedriver';
22
21
 
@@ -100,7 +99,6 @@ const getOsInfo = _.memoize(async function getOsInfo () {
100
99
  return {
101
100
  name: getOsName(),
102
101
  arch: await system.arch(),
103
- hardwareName: system.isWindows() ? null : _.trim(await exec('uname', ['-m'])),
104
102
  };
105
103
  });
106
104
 
@@ -121,5 +119,5 @@ function generateLogPrefix (obj, sessionId = null) {
121
119
  export {
122
120
  getChromeVersion, getChromedriverDir, getChromedriverBinaryPath, getOsName,
123
121
  CD_BASE_DIR, CD_CDN, CD_VER, CHROMEDRIVER_CHROME_MAPPING, getMostRecentChromedriver,
124
- retrieveData, getOsInfo, OS, X64, X86, M1_ARCH_SUFFIX, generateLogPrefix,
122
+ retrieveData, getOsInfo, OS, X64, X86, APPLE_ARM_SUFFIXES, generateLogPrefix,
125
123
  };
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "chrome",
7
7
  "android"
8
8
  ],
9
- "version": "5.2.15",
9
+ "version": "5.2.16",
10
10
  "author": "Appium Contributors",
11
11
  "license": "Apache-2.0",
12
12
  "repository": {