appium-webdriveragent 4.10.3 → 4.10.4

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,5 @@
1
+ ## [4.10.4](https://github.com/appium/WebDriverAgent/compare/v4.10.3...v4.10.4) (2022-11-22)
2
+
1
3
  ## [4.10.3](https://github.com/appium/WebDriverAgent/compare/v4.10.2...v4.10.3) (2022-11-22)
2
4
 
3
5
  ## [4.10.2](https://github.com/appium/WebDriverAgent/compare/v4.10.1...v4.10.2) (2022-11-06)
@@ -1,7 +1,7 @@
1
1
  const path = require('path');
2
2
  const os = require('os');
3
3
  const { asyncify } = require('asyncbox');
4
- const { logger, fs, mkdirp, zip } = require('appium/support');
4
+ const { logger, fs, mkdirp, zip } = require('@appium/support');
5
5
  const { exec } = require('teen_process');
6
6
  const xcode = require('appium-xcode');
7
7
 
@@ -1,7 +1,7 @@
1
1
  const path = require('path');
2
2
  const axios = require('axios');
3
3
  const { asyncify } = require('asyncbox');
4
- const { logger, fs, mkdirp, net } = require('appium/support');
4
+ const { logger, fs, mkdirp, net } = require('@appium/support');
5
5
  const _ = require('lodash');
6
6
  const B = require('bluebird');
7
7
 
@@ -65,7 +65,7 @@ extern NSString *const FBUnknownAttributeException;
65
65
  + (unsigned long long)idWithAccessibilityElement:(id<FBXCAccessibilityElement>)element;
66
66
 
67
67
  /**
68
- Retrieves the list of required insatnce methods of the given protocol
68
+ Retrieves the list of required instance methods of the given protocol
69
69
 
70
70
  @param protocol target protocol reference
71
71
  @return set of selector names
@@ -33,17 +33,74 @@
33
33
  : [[FBXCElementSnapshotWrapper alloc] initWithSnapshot:snapshot];
34
34
  }
35
35
 
36
+ // Attributes are queried most often,
37
+ // so we prefer them to have direct accessors defined here
38
+ // rather than to use message forwarding via forwardingTargetForSelector,
39
+ // which is slow
40
+
41
+ - (NSString *)identifier
42
+ {
43
+ return self.snapshot.identifier;
44
+ }
45
+
46
+ - (CGRect)frame
47
+ {
48
+ return self.snapshot.frame;
49
+ }
50
+
51
+ - (id)value
52
+ {
53
+ return self.snapshot.value;
54
+ }
55
+
56
+ - (NSString *)title
57
+ {
58
+ return self.snapshot.title;
59
+ }
60
+
61
+ - (NSString *)label
62
+ {
63
+ return self.snapshot.label;
64
+ }
65
+
66
+ - (XCUIElementType)elementType
67
+ {
68
+ return self.snapshot.elementType;
69
+ }
70
+
71
+ - (BOOL)isEnabled
72
+ {
73
+ return self.snapshot.enabled;
74
+ }
75
+
76
+ - (XCUIUserInterfaceSizeClass)horizontalSizeClass
77
+ {
78
+ return self.snapshot.horizontalSizeClass;
79
+ }
80
+
81
+ - (XCUIUserInterfaceSizeClass)verticalSizeClass
82
+ {
83
+ return self.snapshot.verticalSizeClass;
84
+ }
85
+
86
+ - (NSString *)placeholderValue
87
+ {
88
+ return self.snapshot.placeholderValue;
89
+ }
90
+
91
+ - (BOOL)isSelected
92
+ {
93
+ return self.snapshot.selected;
94
+ }
95
+
36
96
  - (id)forwardingTargetForSelector:(SEL)aSelector
37
97
  {
38
98
  static dispatch_once_t onceToken;
39
- static NSSet<NSString *> *allNames;
99
+ static NSSet<NSString *> *names;
40
100
  dispatch_once(&onceToken, ^{
41
- NSMutableSet<NSString *> *names = [NSMutableSet set];
42
- [names unionSet:[FBElementUtils selectorNamesWithProtocol:@protocol(FBXCElementSnapshot)]];
43
- [names unionSet:[FBElementUtils selectorNamesWithProtocol:@protocol(XCUIElementAttributes)]];
44
- allNames = [names copy];
101
+ names = [FBElementUtils selectorNamesWithProtocol:@protocol(FBXCElementSnapshot)];
45
102
  });
46
- return [allNames containsObject:NSStringFromSelector(aSelector)] ? self.snapshot : nil;
103
+ return [names containsObject:NSStringFromSelector(aSelector)] ? self.snapshot : nil;
47
104
  }
48
105
 
49
106
  @end
Binary file
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.bundleWDASim = bundleWDASim;
8
8
  exports.checkForDependencies = checkForDependencies;
9
9
  require("source-map-support/register");
10
- var _support = require("appium/support");
10
+ var _support = require("@appium/support");
11
11
  var _lodash = _interopRequireDefault(require("lodash"));
12
12
  var _teen_process = require("teen_process");
13
13
  var _path = _interopRequireDefault(require("path"));
@@ -37,4 +37,4 @@ async function bundleWDASim(xcodebuild, opts = {}) {
37
37
  await buildWDASim(xcodebuild, opts);
38
38
  return wdaBundlePath;
39
39
  }
40
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJidWlsZFdEQVNpbSIsImFyZ3MiLCJwYXRoIiwiam9pbiIsIkJPT1RTVFJBUF9QQVRIIiwiV0RBX1NDSEVNRSIsIlNES19TSU1VTEFUT1IiLCJleGVjIiwiY2hlY2tGb3JEZXBlbmRlbmNpZXMiLCJsb2ciLCJkZWJ1ZyIsImJ1bmRsZVdEQVNpbSIsInhjb2RlYnVpbGQiLCJvcHRzIiwiXyIsImlzRnVuY3Rpb24iLCJyZXRyaWV2ZURlcml2ZWREYXRhUGF0aCIsIlhjb2RlQnVpbGQiLCJkZXJpdmVkRGF0YVBhdGgiLCJ3ZGFCdW5kbGVQYXRoIiwiV0RBX1JVTk5FUl9BUFAiLCJmcyIsImV4aXN0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jaGVjay1kZXBlbmRlbmNpZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBYY29kZUJ1aWxkIGZyb20gJy4veGNvZGVidWlsZCc7XG5pbXBvcnQge1xuICBXREFfU0NIRU1FLCBTREtfU0lNVUxBVE9SLCBXREFfUlVOTkVSX0FQUFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBCT09UU1RSQVBfUEFUSCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkV0RBU2ltICgpIHtcbiAgY29uc3QgYXJncyA9IFtcbiAgICAnLXByb2plY3QnLCBwYXRoLmpvaW4oQk9PVFNUUkFQX1BBVEgsICdXZWJEcml2ZXJBZ2VudC54Y29kZXByb2onKSxcbiAgICAnLXNjaGVtZScsIFdEQV9TQ0hFTUUsXG4gICAgJy1zZGsnLCBTREtfU0lNVUxBVE9SLFxuICAgICdDT0RFX1NJR05fSURFTlRJVFk9XCJcIicsXG4gICAgJ0NPREVfU0lHTklOR19SRVFVSVJFRD1cIk5PXCInLFxuICAgICdHQ0NfVFJFQVRfV0FSTklOR1NfQVNfRVJST1JTPTAnLFxuICBdO1xuICBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgYXJncyk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF3YWl0XG5hc3luYyBmdW5jdGlvbiBjaGVja0ZvckRlcGVuZGVuY2llcyAoKSB7XG4gIGxvZy5kZWJ1ZygnRGVwZW5kZW5jaWVzIGFyZSB1cCB0byBkYXRlJyk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVuZGxlV0RBU2ltICh4Y29kZWJ1aWxkLCBvcHRzID0ge30pIHtcbiAgaWYgKHhjb2RlYnVpbGQgJiYgIV8uaXNGdW5jdGlvbih4Y29kZWJ1aWxkLnJldHJpZXZlRGVyaXZlZERhdGFQYXRoKSkge1xuICAgIHhjb2RlYnVpbGQgPSBuZXcgWGNvZGVCdWlsZCgpO1xuICAgIG9wdHMgPSB4Y29kZWJ1aWxkO1xuICB9XG5cbiAgY29uc3QgZGVyaXZlZERhdGFQYXRoID0gYXdhaXQgeGNvZGVidWlsZC5yZXRyaWV2ZURlcml2ZWREYXRhUGF0aCgpO1xuICBjb25zdCB3ZGFCdW5kbGVQYXRoID0gcGF0aC5qb2luKGRlcml2ZWREYXRhUGF0aCwgJ0J1aWxkJywgJ1Byb2R1Y3RzJywgJ0RlYnVnLWlwaG9uZXNpbXVsYXRvcicsIFdEQV9SVU5ORVJfQVBQKTtcbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyh3ZGFCdW5kbGVQYXRoKSkge1xuICAgIHJldHVybiB3ZGFCdW5kbGVQYXRoO1xuICB9XG4gIGF3YWl0IGJ1aWxkV0RBU2ltKHhjb2RlYnVpbGQsIG9wdHMpO1xuICByZXR1cm4gd2RhQnVuZGxlUGF0aDtcbn1cblxuZXhwb3J0IHsgY2hlY2tGb3JEZXBlbmRlbmNpZXMsIGJ1bmRsZVdEQVNpbSB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUEsZUFBZUEsV0FBVyxHQUFJO0VBQzVCLE1BQU1DLElBQUksR0FBRyxDQUNYLFVBQVUsRUFBRUMsYUFBSSxDQUFDQyxJQUFJLENBQUNDLHFCQUFjLEVBQUUsMEJBQTBCLENBQUMsRUFDakUsU0FBUyxFQUFFQyxxQkFBVSxFQUNyQixNQUFNLEVBQUVDLHdCQUFhLEVBQ3JCLHVCQUF1QixFQUN2Qiw0QkFBNEIsRUFDNUIsZ0NBQWdDLENBQ2pDO0VBQ0QsTUFBTSxJQUFBQyxrQkFBSSxFQUFDLFlBQVksRUFBRU4sSUFBSSxDQUFDO0FBQ2hDOztBQUdBLGVBQWVPLG9CQUFvQixHQUFJO0VBQ3JDQyxlQUFHLENBQUNDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQztFQUN4QyxPQUFPLEtBQUs7QUFDZDtBQUVBLGVBQWVDLFlBQVksQ0FBRUMsVUFBVSxFQUFFQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDbEQsSUFBSUQsVUFBVSxJQUFJLENBQUNFLGVBQUMsQ0FBQ0MsVUFBVSxDQUFDSCxVQUFVLENBQUNJLHVCQUF1QixDQUFDLEVBQUU7SUFDbkVKLFVBQVUsR0FBRyxJQUFJSyxtQkFBVSxFQUFFO0lBQzdCSixJQUFJLEdBQUdELFVBQVU7RUFDbkI7RUFFQSxNQUFNTSxlQUFlLEdBQUcsTUFBTU4sVUFBVSxDQUFDSSx1QkFBdUIsRUFBRTtFQUNsRSxNQUFNRyxhQUFhLEdBQUdqQixhQUFJLENBQUNDLElBQUksQ0FBQ2UsZUFBZSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUVFLHlCQUFjLENBQUM7RUFDOUcsSUFBSSxNQUFNQyxXQUFFLENBQUNDLE1BQU0sQ0FBQ0gsYUFBYSxDQUFDLEVBQUU7SUFDbEMsT0FBT0EsYUFBYTtFQUN0QjtFQUNBLE1BQU1uQixXQUFXLENBQUNZLFVBQVUsRUFBRUMsSUFBSSxDQUFDO0VBQ25DLE9BQU9NLGFBQWE7QUFDdEIifQ==
40
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJidWlsZFdEQVNpbSIsImFyZ3MiLCJwYXRoIiwiam9pbiIsIkJPT1RTVFJBUF9QQVRIIiwiV0RBX1NDSEVNRSIsIlNES19TSU1VTEFUT1IiLCJleGVjIiwiY2hlY2tGb3JEZXBlbmRlbmNpZXMiLCJsb2ciLCJkZWJ1ZyIsImJ1bmRsZVdEQVNpbSIsInhjb2RlYnVpbGQiLCJvcHRzIiwiXyIsImlzRnVuY3Rpb24iLCJyZXRyaWV2ZURlcml2ZWREYXRhUGF0aCIsIlhjb2RlQnVpbGQiLCJkZXJpdmVkRGF0YVBhdGgiLCJ3ZGFCdW5kbGVQYXRoIiwiV0RBX1JVTk5FUl9BUFAiLCJmcyIsImV4aXN0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jaGVjay1kZXBlbmRlbmNpZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgWGNvZGVCdWlsZCBmcm9tICcuL3hjb2RlYnVpbGQnO1xuaW1wb3J0IHtcbiAgV0RBX1NDSEVNRSwgU0RLX1NJTVVMQVRPUiwgV0RBX1JVTk5FUl9BUFBcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQk9PVFNUUkFQX1BBVEggfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuXG5hc3luYyBmdW5jdGlvbiBidWlsZFdEQVNpbSAoKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJy1wcm9qZWN0JywgcGF0aC5qb2luKEJPT1RTVFJBUF9QQVRILCAnV2ViRHJpdmVyQWdlbnQueGNvZGVwcm9qJyksXG4gICAgJy1zY2hlbWUnLCBXREFfU0NIRU1FLFxuICAgICctc2RrJywgU0RLX1NJTVVMQVRPUixcbiAgICAnQ09ERV9TSUdOX0lERU5USVRZPVwiXCInLFxuICAgICdDT0RFX1NJR05JTkdfUkVRVUlSRUQ9XCJOT1wiJyxcbiAgICAnR0NDX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUz0wJyxcbiAgXTtcbiAgYXdhaXQgZXhlYygneGNvZGVidWlsZCcsIGFyZ3MpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuYXN5bmMgZnVuY3Rpb24gY2hlY2tGb3JEZXBlbmRlbmNpZXMgKCkge1xuICBsb2cuZGVidWcoJ0RlcGVuZGVuY2llcyBhcmUgdXAgdG8gZGF0ZScpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1bmRsZVdEQVNpbSAoeGNvZGVidWlsZCwgb3B0cyA9IHt9KSB7XG4gIGlmICh4Y29kZWJ1aWxkICYmICFfLmlzRnVuY3Rpb24oeGNvZGVidWlsZC5yZXRyaWV2ZURlcml2ZWREYXRhUGF0aCkpIHtcbiAgICB4Y29kZWJ1aWxkID0gbmV3IFhjb2RlQnVpbGQoKTtcbiAgICBvcHRzID0geGNvZGVidWlsZDtcbiAgfVxuXG4gIGNvbnN0IGRlcml2ZWREYXRhUGF0aCA9IGF3YWl0IHhjb2RlYnVpbGQucmV0cmlldmVEZXJpdmVkRGF0YVBhdGgoKTtcbiAgY29uc3Qgd2RhQnVuZGxlUGF0aCA9IHBhdGguam9pbihkZXJpdmVkRGF0YVBhdGgsICdCdWlsZCcsICdQcm9kdWN0cycsICdEZWJ1Zy1pcGhvbmVzaW11bGF0b3InLCBXREFfUlVOTkVSX0FQUCk7XG4gIGlmIChhd2FpdCBmcy5leGlzdHMod2RhQnVuZGxlUGF0aCkpIHtcbiAgICByZXR1cm4gd2RhQnVuZGxlUGF0aDtcbiAgfVxuICBhd2FpdCBidWlsZFdEQVNpbSh4Y29kZWJ1aWxkLCBvcHRzKTtcbiAgcmV0dXJuIHdkYUJ1bmRsZVBhdGg7XG59XG5cbmV4cG9ydCB7IGNoZWNrRm9yRGVwZW5kZW5jaWVzLCBidW5kbGVXREFTaW0gfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBLGVBQWVBLFdBQVcsR0FBSTtFQUM1QixNQUFNQyxJQUFJLEdBQUcsQ0FDWCxVQUFVLEVBQUVDLGFBQUksQ0FBQ0MsSUFBSSxDQUFDQyxxQkFBYyxFQUFFLDBCQUEwQixDQUFDLEVBQ2pFLFNBQVMsRUFBRUMscUJBQVUsRUFDckIsTUFBTSxFQUFFQyx3QkFBYSxFQUNyQix1QkFBdUIsRUFDdkIsNEJBQTRCLEVBQzVCLGdDQUFnQyxDQUNqQztFQUNELE1BQU0sSUFBQUMsa0JBQUksRUFBQyxZQUFZLEVBQUVOLElBQUksQ0FBQztBQUNoQzs7QUFHQSxlQUFlTyxvQkFBb0IsR0FBSTtFQUNyQ0MsZUFBRyxDQUFDQyxLQUFLLENBQUMsNkJBQTZCLENBQUM7RUFDeEMsT0FBTyxLQUFLO0FBQ2Q7QUFFQSxlQUFlQyxZQUFZLENBQUVDLFVBQVUsRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ2xELElBQUlELFVBQVUsSUFBSSxDQUFDRSxlQUFDLENBQUNDLFVBQVUsQ0FBQ0gsVUFBVSxDQUFDSSx1QkFBdUIsQ0FBQyxFQUFFO0lBQ25FSixVQUFVLEdBQUcsSUFBSUssbUJBQVUsRUFBRTtJQUM3QkosSUFBSSxHQUFHRCxVQUFVO0VBQ25CO0VBRUEsTUFBTU0sZUFBZSxHQUFHLE1BQU1OLFVBQVUsQ0FBQ0ksdUJBQXVCLEVBQUU7RUFDbEUsTUFBTUcsYUFBYSxHQUFHakIsYUFBSSxDQUFDQyxJQUFJLENBQUNlLGVBQWUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFRSx5QkFBYyxDQUFDO0VBQzlHLElBQUksTUFBTUMsV0FBRSxDQUFDQyxNQUFNLENBQUNILGFBQWEsQ0FBQyxFQUFFO0lBQ2xDLE9BQU9BLGFBQWE7RUFDdEI7RUFDQSxNQUFNbkIsV0FBVyxDQUFDWSxVQUFVLEVBQUVDLElBQUksQ0FBQztFQUNuQyxPQUFPTSxhQUFhO0FBQ3RCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"check-dependencies.js","names":["buildWDASim","args","path","join","BOOTSTRAP_PATH","WDA_SCHEME","SDK_SIMULATOR","exec","checkForDependencies","log","debug","bundleWDASim","xcodebuild","opts","_","isFunction","retrieveDerivedDataPath","XcodeBuild","derivedDataPath","wdaBundlePath","WDA_RUNNER_APP","fs","exists"],"sources":["../../lib/check-dependencies.js"],"sourcesContent":["import { fs } from 'appium/support';\nimport _ from 'lodash';\nimport { exec } from 'teen_process';\nimport path from 'path';\nimport XcodeBuild from './xcodebuild';\nimport {\n WDA_SCHEME, SDK_SIMULATOR, WDA_RUNNER_APP\n} from './constants';\nimport { BOOTSTRAP_PATH } from './utils';\nimport log from './logger';\n\nasync function buildWDASim () {\n const args = [\n '-project', path.join(BOOTSTRAP_PATH, 'WebDriverAgent.xcodeproj'),\n '-scheme', WDA_SCHEME,\n '-sdk', SDK_SIMULATOR,\n 'CODE_SIGN_IDENTITY=\"\"',\n 'CODE_SIGNING_REQUIRED=\"NO\"',\n 'GCC_TREAT_WARNINGS_AS_ERRORS=0',\n ];\n await exec('xcodebuild', args);\n}\n\n// eslint-disable-next-line require-await\nasync function checkForDependencies () {\n log.debug('Dependencies are up to date');\n return false;\n}\n\nasync function bundleWDASim (xcodebuild, opts = {}) {\n if (xcodebuild && !_.isFunction(xcodebuild.retrieveDerivedDataPath)) {\n xcodebuild = new XcodeBuild();\n opts = xcodebuild;\n }\n\n const derivedDataPath = await xcodebuild.retrieveDerivedDataPath();\n const wdaBundlePath = path.join(derivedDataPath, 'Build', 'Products', 'Debug-iphonesimulator', WDA_RUNNER_APP);\n if (await fs.exists(wdaBundlePath)) {\n return wdaBundlePath;\n }\n await buildWDASim(xcodebuild, opts);\n return wdaBundlePath;\n}\n\nexport { checkForDependencies, bundleWDASim };\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AAEA,eAAeA,WAAW,GAAI;EAC5B,MAAMC,IAAI,GAAG,CACX,UAAU,EAAEC,aAAI,CAACC,IAAI,CAACC,qBAAc,EAAE,0BAA0B,CAAC,EACjE,SAAS,EAAEC,qBAAU,EACrB,MAAM,EAAEC,wBAAa,EACrB,uBAAuB,EACvB,4BAA4B,EAC5B,gCAAgC,CACjC;EACD,MAAM,IAAAC,kBAAI,EAAC,YAAY,EAAEN,IAAI,CAAC;AAChC;;AAGA,eAAeO,oBAAoB,GAAI;EACrCC,eAAG,CAACC,KAAK,CAAC,6BAA6B,CAAC;EACxC,OAAO,KAAK;AACd;AAEA,eAAeC,YAAY,CAAEC,UAAU,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAClD,IAAID,UAAU,IAAI,CAACE,eAAC,CAACC,UAAU,CAACH,UAAU,CAACI,uBAAuB,CAAC,EAAE;IACnEJ,UAAU,GAAG,IAAIK,mBAAU,EAAE;IAC7BJ,IAAI,GAAGD,UAAU;EACnB;EAEA,MAAMM,eAAe,GAAG,MAAMN,UAAU,CAACI,uBAAuB,EAAE;EAClE,MAAMG,aAAa,GAAGjB,aAAI,CAACC,IAAI,CAACe,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAEE,yBAAc,CAAC;EAC9G,IAAI,MAAMC,WAAE,CAACC,MAAM,CAACH,aAAa,CAAC,EAAE;IAClC,OAAOA,aAAa;EACtB;EACA,MAAMnB,WAAW,CAACY,UAAU,EAAEC,IAAI,CAAC;EACnC,OAAOM,aAAa;AACtB"}
1
+ {"version":3,"file":"check-dependencies.js","names":["buildWDASim","args","path","join","BOOTSTRAP_PATH","WDA_SCHEME","SDK_SIMULATOR","exec","checkForDependencies","log","debug","bundleWDASim","xcodebuild","opts","_","isFunction","retrieveDerivedDataPath","XcodeBuild","derivedDataPath","wdaBundlePath","WDA_RUNNER_APP","fs","exists"],"sources":["../../lib/check-dependencies.js"],"sourcesContent":["import { fs } from '@appium/support';\nimport _ from 'lodash';\nimport { exec } from 'teen_process';\nimport path from 'path';\nimport XcodeBuild from './xcodebuild';\nimport {\n WDA_SCHEME, SDK_SIMULATOR, WDA_RUNNER_APP\n} from './constants';\nimport { BOOTSTRAP_PATH } from './utils';\nimport log from './logger';\n\nasync function buildWDASim () {\n const args = [\n '-project', path.join(BOOTSTRAP_PATH, 'WebDriverAgent.xcodeproj'),\n '-scheme', WDA_SCHEME,\n '-sdk', SDK_SIMULATOR,\n 'CODE_SIGN_IDENTITY=\"\"',\n 'CODE_SIGNING_REQUIRED=\"NO\"',\n 'GCC_TREAT_WARNINGS_AS_ERRORS=0',\n ];\n await exec('xcodebuild', args);\n}\n\n// eslint-disable-next-line require-await\nasync function checkForDependencies () {\n log.debug('Dependencies are up to date');\n return false;\n}\n\nasync function bundleWDASim (xcodebuild, opts = {}) {\n if (xcodebuild && !_.isFunction(xcodebuild.retrieveDerivedDataPath)) {\n xcodebuild = new XcodeBuild();\n opts = xcodebuild;\n }\n\n const derivedDataPath = await xcodebuild.retrieveDerivedDataPath();\n const wdaBundlePath = path.join(derivedDataPath, 'Build', 'Products', 'Debug-iphonesimulator', WDA_RUNNER_APP);\n if (await fs.exists(wdaBundlePath)) {\n return wdaBundlePath;\n }\n await buildWDASim(xcodebuild, opts);\n return wdaBundlePath;\n}\n\nexport { checkForDependencies, bundleWDASim };\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AAEA,eAAeA,WAAW,GAAI;EAC5B,MAAMC,IAAI,GAAG,CACX,UAAU,EAAEC,aAAI,CAACC,IAAI,CAACC,qBAAc,EAAE,0BAA0B,CAAC,EACjE,SAAS,EAAEC,qBAAU,EACrB,MAAM,EAAEC,wBAAa,EACrB,uBAAuB,EACvB,4BAA4B,EAC5B,gCAAgC,CACjC;EACD,MAAM,IAAAC,kBAAI,EAAC,YAAY,EAAEN,IAAI,CAAC;AAChC;;AAGA,eAAeO,oBAAoB,GAAI;EACrCC,eAAG,CAACC,KAAK,CAAC,6BAA6B,CAAC;EACxC,OAAO,KAAK;AACd;AAEA,eAAeC,YAAY,CAAEC,UAAU,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAClD,IAAID,UAAU,IAAI,CAACE,eAAC,CAACC,UAAU,CAACH,UAAU,CAACI,uBAAuB,CAAC,EAAE;IACnEJ,UAAU,GAAG,IAAIK,mBAAU,EAAE;IAC7BJ,IAAI,GAAGD,UAAU;EACnB;EAEA,MAAMM,eAAe,GAAG,MAAMN,UAAU,CAACI,uBAAuB,EAAE;EAClE,MAAMG,aAAa,GAAGjB,aAAI,CAACC,IAAI,CAACe,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAEE,yBAAc,CAAC;EAC9G,IAAI,MAAMC,WAAE,CAACC,MAAM,CAACH,aAAa,CAAC,EAAE;IAClC,OAAOA,aAAa;EACtB;EACA,MAAMnB,WAAW,CAACY,UAAU,EAAEC,IAAI,CAAC;EACnC,OAAOM,aAAa;AACtB"}
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  require("source-map-support/register");
8
- var _support = require("appium/support");
8
+ var _support = require("@appium/support");
9
9
  const log = _support.logger.getLogger('WebDriverAgent');
10
10
  var _default = log;
11
11
  exports.default = _default;
12
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiXSwic291cmNlcyI6WyIuLi8uLi9saWIvbG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignV2ViRHJpdmVyQWdlbnQnKTtcblxuZXhwb3J0IGRlZmF1bHQgbG9nO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFFQSxNQUFNQSxHQUFHLEdBQUdDLGVBQU0sQ0FBQ0MsU0FBUyxDQUFDLGdCQUFnQixDQUFDO0FBQUMsZUFFaENGLEdBQUc7QUFBQSJ9
12
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiXSwic291cmNlcyI6WyIuLi8uLi9saWIvbG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1dlYkRyaXZlckFnZW50Jyk7XG5cbmV4cG9ydCBkZWZhdWx0IGxvZztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUEsTUFBTUEsR0FBRyxHQUFHQyxlQUFNLENBQUNDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztBQUFDLGVBRWhDRixHQUFHO0FBQUEifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","names":["log","logger","getLogger"],"sources":["../../lib/logger.js"],"sourcesContent":["import { logger } from 'appium/support';\n\nconst log = logger.getLogger('WebDriverAgent');\n\nexport default log;\n"],"mappings":";;;;;;;AAAA;AAEA,MAAMA,GAAG,GAAGC,eAAM,CAACC,SAAS,CAAC,gBAAgB,CAAC;AAAC,eAEhCF,GAAG;AAAA"}
1
+ {"version":3,"file":"logger.js","names":["log","logger","getLogger"],"sources":["../../lib/logger.js"],"sourcesContent":["import { logger } from '@appium/support';\n\nconst log = logger.getLogger('WebDriverAgent');\n\nexport default log;\n"],"mappings":";;;;;;;AAAA;AAEA,MAAMA,GAAG,GAAGC,eAAM,CAACC,SAAS,CAAC,gBAAgB,CAAC;AAAC,eAEhCF,GAAG;AAAA"}
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = exports.NoSessionProxy = void 0;
7
7
  require("source-map-support/register");
8
- var _driver = require("appium/driver");
9
- class NoSessionProxy extends _driver.JWProxy {
8
+ var _baseDriver = require("@appium/base-driver");
9
+ class NoSessionProxy extends _baseDriver.JWProxy {
10
10
  constructor(opts = {}) {
11
11
  super(opts);
12
12
  }
@@ -28,4 +28,4 @@ class NoSessionProxy extends _driver.JWProxy {
28
28
  exports.NoSessionProxy = NoSessionProxy;
29
29
  var _default = NoSessionProxy;
30
30
  exports.default = _default;
31
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOb1Nlc3Npb25Qcm94eSIsIkpXUHJveHkiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJnZXRVcmxGb3JQcm94eSIsInVybCIsInByb3h5QmFzZSIsInNjaGVtZSIsInNlcnZlciIsInBvcnQiLCJiYXNlIiwicmVtYWluaW5nVXJsIiwiUmVnRXhwIiwidGVzdCIsIkVycm9yIiwicmVwbGFjZSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9uby1zZXNzaW9uLXByb3h5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEpXUHJveHkgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuXG5jbGFzcyBOb1Nlc3Npb25Qcm94eSBleHRlbmRzIEpXUHJveHkge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgc3VwZXIob3B0cyk7XG4gIH1cblxuICBnZXRVcmxGb3JQcm94eSAodXJsKSB7XG4gICAgaWYgKHVybCA9PT0gJycpIHtcbiAgICAgIHVybCA9ICcvJztcbiAgICB9XG4gICAgY29uc3QgcHJveHlCYXNlID0gYCR7dGhpcy5zY2hlbWV9Oi8vJHt0aGlzLnNlcnZlcn06JHt0aGlzLnBvcnR9JHt0aGlzLmJhc2V9YDtcbiAgICBsZXQgcmVtYWluaW5nVXJsID0gJyc7XG4gICAgaWYgKChuZXcgUmVnRXhwKCdeLycpKS50ZXN0KHVybCkpIHtcbiAgICAgIHJlbWFpbmluZ1VybCA9IHVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGtub3cgd2hhdCB0byBkbyB3aXRoIHVybCAnJHt1cmx9J2ApO1xuICAgIH1cbiAgICByZW1haW5pbmdVcmwgPSByZW1haW5pbmdVcmwucmVwbGFjZSgvXFwvJC8sICcnKTsgLy8gY2FuJ3QgaGF2ZSB0cmFpbGluZyBzbGFzaGVzXG4gICAgcmV0dXJuIHByb3h5QmFzZSArIHJlbWFpbmluZ1VybDtcbiAgfVxufVxuXG5leHBvcnQgeyBOb1Nlc3Npb25Qcm94eSB9O1xuZXhwb3J0IGRlZmF1bHQgTm9TZXNzaW9uUHJveHk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUdBLE1BQU1BLGNBQWMsU0FBU0MsZUFBTyxDQUFDO0VBQ25DQyxXQUFXLENBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtJQUN0QixLQUFLLENBQUNBLElBQUksQ0FBQztFQUNiO0VBRUFDLGNBQWMsQ0FBRUMsR0FBRyxFQUFFO0lBQ25CLElBQUlBLEdBQUcsS0FBSyxFQUFFLEVBQUU7TUFDZEEsR0FBRyxHQUFHLEdBQUc7SUFDWDtJQUNBLE1BQU1DLFNBQVMsR0FBSSxHQUFFLElBQUksQ0FBQ0MsTUFBTyxNQUFLLElBQUksQ0FBQ0MsTUFBTyxJQUFHLElBQUksQ0FBQ0MsSUFBSyxHQUFFLElBQUksQ0FBQ0MsSUFBSyxFQUFDO0lBQzVFLElBQUlDLFlBQVksR0FBRyxFQUFFO0lBQ3JCLElBQUssSUFBSUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFFQyxJQUFJLENBQUNSLEdBQUcsQ0FBQyxFQUFFO01BQ2hDTSxZQUFZLEdBQUdOLEdBQUc7SUFDcEIsQ0FBQyxNQUFNO01BQ0wsTUFBTSxJQUFJUyxLQUFLLENBQUUscUNBQW9DVCxHQUFJLEdBQUUsQ0FBQztJQUM5RDtJQUNBTSxZQUFZLEdBQUdBLFlBQVksQ0FBQ0ksT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7SUFDOUMsT0FBT1QsU0FBUyxHQUFHSyxZQUFZO0VBQ2pDO0FBQ0Y7QUFBQztBQUFBLGVBR2NYLGNBQWM7QUFBQSJ9
31
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOb1Nlc3Npb25Qcm94eSIsIkpXUHJveHkiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJnZXRVcmxGb3JQcm94eSIsInVybCIsInByb3h5QmFzZSIsInNjaGVtZSIsInNlcnZlciIsInBvcnQiLCJiYXNlIiwicmVtYWluaW5nVXJsIiwiUmVnRXhwIiwidGVzdCIsIkVycm9yIiwicmVwbGFjZSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9uby1zZXNzaW9uLXByb3h5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEpXUHJveHkgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcblxuXG5jbGFzcyBOb1Nlc3Npb25Qcm94eSBleHRlbmRzIEpXUHJveHkge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgc3VwZXIob3B0cyk7XG4gIH1cblxuICBnZXRVcmxGb3JQcm94eSAodXJsKSB7XG4gICAgaWYgKHVybCA9PT0gJycpIHtcbiAgICAgIHVybCA9ICcvJztcbiAgICB9XG4gICAgY29uc3QgcHJveHlCYXNlID0gYCR7dGhpcy5zY2hlbWV9Oi8vJHt0aGlzLnNlcnZlcn06JHt0aGlzLnBvcnR9JHt0aGlzLmJhc2V9YDtcbiAgICBsZXQgcmVtYWluaW5nVXJsID0gJyc7XG4gICAgaWYgKChuZXcgUmVnRXhwKCdeLycpKS50ZXN0KHVybCkpIHtcbiAgICAgIHJlbWFpbmluZ1VybCA9IHVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGtub3cgd2hhdCB0byBkbyB3aXRoIHVybCAnJHt1cmx9J2ApO1xuICAgIH1cbiAgICByZW1haW5pbmdVcmwgPSByZW1haW5pbmdVcmwucmVwbGFjZSgvXFwvJC8sICcnKTsgLy8gY2FuJ3QgaGF2ZSB0cmFpbGluZyBzbGFzaGVzXG4gICAgcmV0dXJuIHByb3h5QmFzZSArIHJlbWFpbmluZ1VybDtcbiAgfVxufVxuXG5leHBvcnQgeyBOb1Nlc3Npb25Qcm94eSB9O1xuZXhwb3J0IGRlZmF1bHQgTm9TZXNzaW9uUHJveHk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUdBLE1BQU1BLGNBQWMsU0FBU0MsbUJBQU8sQ0FBQztFQUNuQ0MsV0FBVyxDQUFFQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7SUFDdEIsS0FBSyxDQUFDQSxJQUFJLENBQUM7RUFDYjtFQUVBQyxjQUFjLENBQUVDLEdBQUcsRUFBRTtJQUNuQixJQUFJQSxHQUFHLEtBQUssRUFBRSxFQUFFO01BQ2RBLEdBQUcsR0FBRyxHQUFHO0lBQ1g7SUFDQSxNQUFNQyxTQUFTLEdBQUksR0FBRSxJQUFJLENBQUNDLE1BQU8sTUFBSyxJQUFJLENBQUNDLE1BQU8sSUFBRyxJQUFJLENBQUNDLElBQUssR0FBRSxJQUFJLENBQUNDLElBQUssRUFBQztJQUM1RSxJQUFJQyxZQUFZLEdBQUcsRUFBRTtJQUNyQixJQUFLLElBQUlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBRUMsSUFBSSxDQUFDUixHQUFHLENBQUMsRUFBRTtNQUNoQ00sWUFBWSxHQUFHTixHQUFHO0lBQ3BCLENBQUMsTUFBTTtNQUNMLE1BQU0sSUFBSVMsS0FBSyxDQUFFLHFDQUFvQ1QsR0FBSSxHQUFFLENBQUM7SUFDOUQ7SUFDQU0sWUFBWSxHQUFHQSxZQUFZLENBQUNJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQzlDLE9BQU9ULFNBQVMsR0FBR0ssWUFBWTtFQUNqQztBQUNGO0FBQUM7QUFBQSxlQUdjWCxjQUFjO0FBQUEifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"no-session-proxy.js","names":["NoSessionProxy","JWProxy","constructor","opts","getUrlForProxy","url","proxyBase","scheme","server","port","base","remainingUrl","RegExp","test","Error","replace"],"sources":["../../lib/no-session-proxy.js"],"sourcesContent":["import { JWProxy } from 'appium/driver';\n\n\nclass NoSessionProxy extends JWProxy {\n constructor (opts = {}) {\n super(opts);\n }\n\n getUrlForProxy (url) {\n if (url === '') {\n url = '/';\n }\n const proxyBase = `${this.scheme}://${this.server}:${this.port}${this.base}`;\n let remainingUrl = '';\n if ((new RegExp('^/')).test(url)) {\n remainingUrl = url;\n } else {\n throw new Error(`Did not know what to do with url '${url}'`);\n }\n remainingUrl = remainingUrl.replace(/\\/$/, ''); // can't have trailing slashes\n return proxyBase + remainingUrl;\n }\n}\n\nexport { NoSessionProxy };\nexport default NoSessionProxy;\n"],"mappings":";;;;;;;AAAA;AAGA,MAAMA,cAAc,SAASC,eAAO,CAAC;EACnCC,WAAW,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;IACtB,KAAK,CAACA,IAAI,CAAC;EACb;EAEAC,cAAc,CAAEC,GAAG,EAAE;IACnB,IAAIA,GAAG,KAAK,EAAE,EAAE;MACdA,GAAG,GAAG,GAAG;IACX;IACA,MAAMC,SAAS,GAAI,GAAE,IAAI,CAACC,MAAO,MAAK,IAAI,CAACC,MAAO,IAAG,IAAI,CAACC,IAAK,GAAE,IAAI,CAACC,IAAK,EAAC;IAC5E,IAAIC,YAAY,GAAG,EAAE;IACrB,IAAK,IAAIC,MAAM,CAAC,IAAI,CAAC,CAAEC,IAAI,CAACR,GAAG,CAAC,EAAE;MAChCM,YAAY,GAAGN,GAAG;IACpB,CAAC,MAAM;MACL,MAAM,IAAIS,KAAK,CAAE,qCAAoCT,GAAI,GAAE,CAAC;IAC9D;IACAM,YAAY,GAAGA,YAAY,CAACI,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAC9C,OAAOT,SAAS,GAAGK,YAAY;EACjC;AACF;AAAC;AAAA,eAGcX,cAAc;AAAA"}
1
+ {"version":3,"file":"no-session-proxy.js","names":["NoSessionProxy","JWProxy","constructor","opts","getUrlForProxy","url","proxyBase","scheme","server","port","base","remainingUrl","RegExp","test","Error","replace"],"sources":["../../lib/no-session-proxy.js"],"sourcesContent":["import { JWProxy } from '@appium/base-driver';\n\n\nclass NoSessionProxy extends JWProxy {\n constructor (opts = {}) {\n super(opts);\n }\n\n getUrlForProxy (url) {\n if (url === '') {\n url = '/';\n }\n const proxyBase = `${this.scheme}://${this.server}:${this.port}${this.base}`;\n let remainingUrl = '';\n if ((new RegExp('^/')).test(url)) {\n remainingUrl = url;\n } else {\n throw new Error(`Did not know what to do with url '${url}'`);\n }\n remainingUrl = remainingUrl.replace(/\\/$/, ''); // can't have trailing slashes\n return proxyBase + remainingUrl;\n }\n}\n\nexport { NoSessionProxy };\nexport default NoSessionProxy;\n"],"mappings":";;;;;;;AAAA;AAGA,MAAMA,cAAc,SAASC,mBAAO,CAAC;EACnCC,WAAW,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;IACtB,KAAK,CAACA,IAAI,CAAC;EACb;EAEAC,cAAc,CAAEC,GAAG,EAAE;IACnB,IAAIA,GAAG,KAAK,EAAE,EAAE;MACdA,GAAG,GAAG,GAAG;IACX;IACA,MAAMC,SAAS,GAAI,GAAE,IAAI,CAACC,MAAO,MAAK,IAAI,CAACC,MAAO,IAAG,IAAI,CAACC,IAAK,GAAE,IAAI,CAACC,IAAK,EAAC;IAC5E,IAAIC,YAAY,GAAG,EAAE;IACrB,IAAK,IAAIC,MAAM,CAAC,IAAI,CAAC,CAAEC,IAAI,CAACR,GAAG,CAAC,EAAE;MAChCM,YAAY,GAAGN,GAAG;IACpB,CAAC,MAAM;MACL,MAAM,IAAIS,KAAK,CAAE,qCAAoCT,GAAI,GAAE,CAAC;IAC9D;IACAM,YAAY,GAAGA,YAAY,CAACI,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAC9C,OAAOT,SAAS,GAAGK,YAAY;EACjC;AACF;AAAC;AAAA,eAGcX,cAAc;AAAA"}
@@ -21,7 +21,7 @@ exports.setRealDeviceSecurity = setRealDeviceSecurity;
21
21
  exports.setXctestrunFile = setXctestrunFile;
22
22
  exports.updateProjectFile = updateProjectFile;
23
23
  require("source-map-support/register");
24
- var _support = require("appium/support");
24
+ var _support = require("@appium/support");
25
25
  var _teen_process = require("teen_process");
26
26
  var _path = _interopRequireDefault(require("path"));
27
27
  var _logger = _interopRequireDefault(require("./logger"));
@@ -271,4 +271,4 @@ async function getPIDsListeningOnPort(port, filteringFunc = null) {
271
271
  return await filteringFunc(stdout);
272
272
  });
273
273
  }
274
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQUk9KRUNUX0ZJTEUiLCJnZXRNb2R1bGVSb290IiwiXyIsIm1lbW9pemUiLCJjdXJyZW50RGlyIiwicGF0aCIsImRpcm5hbWUiLCJyZXNvbHZlIiwiX19maWxlbmFtZSIsImlzQXRGc1Jvb3QiLCJtYW5pZmVzdFBhdGgiLCJqb2luIiwiX2ZzIiwiZXhpc3RzU3luYyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsIm5hbWUiLCJpZ24iLCJsZW5ndGgiLCJFcnJvciIsIkJPT1RTVFJBUF9QQVRIIiwiZ2V0UElEc1VzaW5nUGF0dGVybiIsInBhdHRlcm4iLCJhcmdzIiwic3Rkb3V0IiwiZXhlYyIsInNwbGl0IiwibWFwIiwieCIsInBhcnNlSW50IiwiZmlsdGVyIiwiaXNJbnRlZ2VyIiwiZXJyIiwibG9nIiwiZGVidWciLCJjb2RlIiwia2lsbEFwcFVzaW5nUGF0dGVybiIsInBncmVwUGF0dGVybiIsInNpZ25hbHMiLCJzaWduYWwiLCJtYXRjaGVkUGlkcyIsImlzRW1wdHkiLCJtZXNzYWdlIiwibGFzdCIsIndhaXRGb3JDb25kaXRpb24iLCJwaWRDaGVja1Byb21pc2VzIiwicGlkIiwidGhlbiIsImNhdGNoIiwiQiIsImFsbCIsImV2ZXJ5Iiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImlzVHZPUyIsInBsYXRmb3JtTmFtZSIsInRvTG93ZXIiLCJQTEFURk9STV9OQU1FX1RWT1MiLCJyZXBsYWNlSW5GaWxlIiwiZmlsZSIsImZpbmQiLCJyZXBsYWNlIiwiY29udGVudHMiLCJmcyIsInJlYWRGaWxlIiwibmV3Q29udGVudHMiLCJ3cml0ZUZpbGUiLCJ1cGRhdGVQcm9qZWN0RmlsZSIsImFnZW50UGF0aCIsIm5ld0J1bmRsZUlkIiwicHJvamVjdEZpbGVQYXRoIiwiY29weUZpbGUiLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJXREFfUlVOTkVSX0JVTkRMRV9JRCIsIndhcm4iLCJyZXNldFByb2plY3RGaWxlIiwiZXhpc3RzIiwibXYiLCJzZXRSZWFsRGV2aWNlU2VjdXJpdHkiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwiZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUiLCJvcmdJZCIsInNpZ25pbmdJZCIsInhjY29uZmlnUGF0aCIsInRlbXBEaXIiLCJzZXRYY3Rlc3RydW5GaWxlIiwiZGV2aWNlSW5mbyIsInNka1ZlcnNpb24iLCJib290c3RyYXBQYXRoIiwid2RhUmVtb3RlUG9ydCIsInhjdGVzdHJ1bkZpbGVQYXRoIiwiZ2V0WGN0ZXN0cnVuRmlsZVBhdGgiLCJ4Y3Rlc3RSdW5Db250ZW50IiwicGxpc3QiLCJwYXJzZVBsaXN0RmlsZSIsInVwZGF0ZVdEQVBvcnQiLCJnZXRBZGRpdGlvbmFsUnVuQ29udGVudCIsIm5ld1hjdGVzdFJ1bkNvbnRlbnQiLCJtZXJnZSIsInVwZGF0ZVBsaXN0RmlsZSIsInJ1bm5lciIsIkVudmlyb25tZW50VmFyaWFibGVzIiwiVVNFX1BPUlQiLCJzZGtCYXNlZCIsInVkaWQiLCJwbGF0Zm9ybUJhc2VkIiwicGxhdGZvcm1WZXJzaW9uIiwiZmlsZVBhdGgiLCJ2ZXJzaW9uIiwiaW5mbyIsIm9yaWdpbmFsWGN0ZXN0cnVuRmlsZSIsImdldFhjdGVzdHJ1bkZpbGVOYW1lIiwiZXJyb3JBbmRUaHJvdyIsImlzUmVhbERldmljZSIsImtpbGxQcm9jZXNzIiwicHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbmNsdWRlcyIsInJhbmRvbUludCIsImxvdyIsImhpZ2giLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwicGFja2FnZU1hbmlmZXN0IiwibXRpbWUiLCJzdGF0IiwiZ2V0VGltZSIsInJlc2V0VGVzdFByb2Nlc3NlcyIsImlzU2ltdWxhdG9yIiwicHJvY2Vzc1BhdHRlcm5zIiwicHVzaCIsImdldFBJRHNMaXN0ZW5pbmdPblBvcnQiLCJwb3J0IiwiZmlsdGVyaW5nRnVuYyIsInJlc3VsdCIsInRyaW0iLCJlIiwic3RkZXJyIiwiaXNGdW5jdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgdGVtcERpciwgcGxpc3QgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgV0RBX1JVTk5FUl9CVU5ETEVfSUQsIFBMQVRGT1JNX05BTUVfVFZPUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBfZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcblxuY29uc3QgUFJPSkVDVF9GSUxFID0gJ3Byb2plY3QucGJ4cHJvaic7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcGF0aCB0byB0aGUgY3VycmVudCBtb2R1bGUncyByb290IGZvbGRlclxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gbW9kdWxlIHJvb3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY3VycmVudCBtb2R1bGUgcm9vdCBmb2xkZXIgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xuY29uc3QgZ2V0TW9kdWxlUm9vdCA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRNb2R1bGVSb290ICgpIHtcbiAgbGV0IGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUocGF0aC5yZXNvbHZlKF9fZmlsZW5hbWUpKTtcbiAgbGV0IGlzQXRGc1Jvb3QgPSBmYWxzZTtcbiAgd2hpbGUgKCFpc0F0RnNSb290KSB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgaWYgKF9mcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkgJiZcbiAgICAgICAgICBKU09OLnBhcnNlKF9mcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKS5uYW1lID09PSAnYXBwaXVtLXdlYmRyaXZlcmFnZW50Jykge1xuICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgY3VycmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICBpc0F0RnNSb290ID0gY3VycmVudERpci5sZW5ndGggPD0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpLmxlbmd0aDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHRoZSByb290IGZvbGRlciBvZiB0aGUgYXBwaXVtLXdlYmRyaXZlcmFnZW50IE5vZGUuanMgbW9kdWxlJyk7XG59KTtcblxuZXhwb3J0IGNvbnN0IEJPT1RTVFJBUF9QQVRIID0gZ2V0TW9kdWxlUm9vdCgpO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRQSURzVXNpbmdQYXR0ZXJuIChwYXR0ZXJuKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJy1pZicsIC8vIGNhc2UgaW5zZW5zaXRpdmUsIGZ1bGwgY21kbGluZSBtYXRjaFxuICAgIHBhdHRlcm4sXG4gIF07XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdwZ3JlcCcsIGFyZ3MpO1xuICAgIHJldHVybiBzdGRvdXQuc3BsaXQoL1xccysvKVxuICAgICAgLm1hcCgoeCkgPT4gcGFyc2VJbnQoeCwgMTApKVxuICAgICAgLmZpbHRlcihfLmlzSW50ZWdlcilcbiAgICAgIC5tYXAoKHgpID0+IGAke3h9YCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5kZWJ1ZyhgJ3BncmVwICR7YXJncy5qb2luKCcgJyl9JyBkaWRuJ3QgZGV0ZWN0IGFueSBtYXRjaGluZyBwcm9jZXNzZXMuIFJldHVybiBjb2RlOiAke2Vyci5jb2RlfWApO1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsQXBwVXNpbmdQYXR0ZXJuIChwZ3JlcFBhdHRlcm4pIHtcbiAgY29uc3Qgc2lnbmFscyA9IFsyLCAxNSwgOV07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIHtcbiAgICBjb25zdCBtYXRjaGVkUGlkcyA9IGF3YWl0IGdldFBJRHNVc2luZ1BhdHRlcm4ocGdyZXBQYXR0ZXJuKTtcbiAgICBpZiAoXy5pc0VtcHR5KG1hdGNoZWRQaWRzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhcmdzID0gW2AtJHtzaWduYWx9YCwgLi4ubWF0Y2hlZFBpZHNdO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdraWxsJywgYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cuZGVidWcoYGtpbGwgJHthcmdzLmpvaW4oJyAnKX0gLT4gJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKHNpZ25hbCA9PT0gXy5sYXN0KHNpZ25hbHMpKSB7XG4gICAgICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIHdhaXQgYWZ0ZXIgU0lHS0lMTFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBpZENoZWNrUHJvbWlzZXMgPSBtYXRjaGVkUGlkc1xuICAgICAgICAgIC5tYXAoKHBpZCkgPT4gZXhlYygna2lsbCcsIFsnLTAnLCBwaWRdKVxuICAgICAgICAgICAgLy8gdGhlIHByb2Nlc3MgaXMgc3RpbGwgYWxpdmVcbiAgICAgICAgICAgIC50aGVuKCgpID0+IGZhbHNlKVxuICAgICAgICAgICAgLy8gdGhlIHByb2Nlc3MgaXMgZGVhZFxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHRydWUpXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBCLmFsbChwaWRDaGVja1Byb21pc2VzKSlcbiAgICAgICAgICAuZXZlcnkoKHgpID0+IHggPT09IHRydWUpO1xuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IDEwMDAsXG4gICAgICAgIGludGVydmFsTXM6IDEwMCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgLy8gdHJ5IHRoZSBuZXh0IHNpZ25hbFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybU5hbWUgaXMgdHZPU1xuICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtTmFtZSBUaGUgbmFtZSBvZiB0aGUgcGxhdG9ybVxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybU5hbWUgaXMgdHZPU1xuICovXG5mdW5jdGlvbiBpc1R2T1MgKHBsYXRmb3JtTmFtZSkge1xuICByZXR1cm4gXy50b0xvd2VyKHBsYXRmb3JtTmFtZSkgPT09IF8udG9Mb3dlcihQTEFURk9STV9OQU1FX1RWT1MpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXBsYWNlSW5GaWxlIChmaWxlLCBmaW5kLCByZXBsYWNlKSB7XG4gIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGUsICd1dGY4Jyk7XG5cbiAgbGV0IG5ld0NvbnRlbnRzID0gY29udGVudHMucmVwbGFjZShmaW5kLCByZXBsYWNlKTtcbiAgaWYgKG5ld0NvbnRlbnRzICE9PSBjb250ZW50cykge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlLCBuZXdDb250ZW50cywgJ3V0ZjgnKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZSBXZWJEcml2ZXJBZ2VudFJ1bm5lciBwcm9qZWN0IGJ1bmRsZSBJRCB3aXRoIG5ld0J1bmRsZUlkLlxuICogVGhpcyBtZXRob2QgYXNzdW1lcyBwcm9qZWN0IGZpbGUgaXMgaW4gdGhlIGNvcnJlY3Qgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWdlbnRQYXRoIC0gUGF0aCB0byB0aGUgLnhjb2RlcHJvaiBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmV3QnVuZGxlSWQgdGhlIG5ldyBidW5kbGUgSUQgdXNlZCB0byB1cGRhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByb2plY3RGaWxlIChhZ2VudFBhdGgsIG5ld0J1bmRsZUlkKSB7XG4gIGxldCBwcm9qZWN0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoYWdlbnRQYXRoLCBQUk9KRUNUX0ZJTEUpO1xuICB0cnkge1xuICAgIC8vIEFzc3VtaW5nIHByb2plY3RGaWxlUGF0aCBpcyBpbiB0aGUgY29ycmVjdCBzdGF0ZSwgY3JlYXRlIC5vbGQgZnJvbSBwcm9qZWN0RmlsZVBhdGhcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShwcm9qZWN0RmlsZVBhdGgsIGAke3Byb2plY3RGaWxlUGF0aH0ub2xkYCk7XG4gICAgYXdhaXQgcmVwbGFjZUluRmlsZShwcm9qZWN0RmlsZVBhdGgsIG5ldyBSZWdFeHAoXy5lc2NhcGVSZWdFeHAoV0RBX1JVTk5FUl9CVU5ETEVfSUQpLCAnZycpLCBuZXdCdW5kbGVJZCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgICBsb2cuZGVidWcoYFN1Y2Nlc3NmdWxseSB1cGRhdGVkICcke3Byb2plY3RGaWxlUGF0aH0nIHdpdGggYnVuZGxlIGlkICcke25ld0J1bmRsZUlkfSdgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmRlYnVnKGBFcnJvciB1cGRhdGluZyBwcm9qZWN0IGZpbGU6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgbG9nLndhcm4oYFVuYWJsZSB0byB1cGRhdGUgcHJvamVjdCBmaWxlICcke3Byb2plY3RGaWxlUGF0aH0nIHdpdGggYCArXG4gICAgICBgYnVuZGxlIGlkICcke25ld0J1bmRsZUlkfScuIFdlYkRyaXZlckFnZW50IG1heSBub3Qgc3RhcnRgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc2V0IFdlYkRyaXZlckFnZW50UnVubmVyIHByb2plY3QgYnVuZGxlIElEIHRvIGNvcnJlY3Qgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWdlbnRQYXRoIC0gUGF0aCB0byB0aGUgLnhjb2RlcHJvaiBkaXJlY3RvcnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc2V0UHJvamVjdEZpbGUgKGFnZW50UGF0aCkge1xuICBjb25zdCBwcm9qZWN0RmlsZVBhdGggPSBwYXRoLmpvaW4oYWdlbnRQYXRoLCBQUk9KRUNUX0ZJTEUpO1xuICB0cnkge1xuICAgIC8vIHJlc3RvcmUgcHJvamVjdEZpbGVQYXRoIGZyb20gLm9sZCBmaWxlXG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoYCR7cHJvamVjdEZpbGVQYXRofS5vbGRgKSkge1xuICAgICAgcmV0dXJuOyAvLyBubyBuZWVkIHRvIHJlc2V0XG4gICAgfVxuICAgIGF3YWl0IGZzLm12KGAke3Byb2plY3RGaWxlUGF0aH0ub2xkYCwgcHJvamVjdEZpbGVQYXRoKTtcbiAgICBsb2cuZGVidWcoYFN1Y2Nlc3NmdWxseSByZXNldCAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGJ1bmRsZSBpZCAnJHtXREFfUlVOTkVSX0JVTkRMRV9JRH0nYCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5kZWJ1ZyhgRXJyb3IgcmVzZXR0aW5nIHByb2plY3QgZmlsZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBsb2cud2FybihgVW5hYmxlIHRvIHJlc2V0IHByb2plY3QgZmlsZSAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGAgK1xuICAgICAgYGJ1bmRsZSBpZCAnJHtXREFfUlVOTkVSX0JVTkRMRV9JRH0nLiBXZWJEcml2ZXJBZ2VudCBoYXMgYmVlbiBgICtcbiAgICAgIGBtb2RpZmllZCBhbmQgbm90IHJldHVybmVkIHRvIHRoZSBvcmlnaW5hbCBzdGF0ZS5gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRSZWFsRGV2aWNlU2VjdXJpdHkgKGtleWNoYWluUGF0aCwga2V5Y2hhaW5QYXNzd29yZCkge1xuICBsb2cuZGVidWcoJ1NldHRpbmcgc2VjdXJpdHkgZm9yIGlPUyBkZXZpY2UnKTtcbiAgYXdhaXQgZXhlYygnc2VjdXJpdHknLCBbJy12JywgJ2xpc3Qta2V5Y2hhaW5zJywgJy1zJywga2V5Y2hhaW5QYXRoXSk7XG4gIGF3YWl0IGV4ZWMoJ3NlY3VyaXR5JywgWyctdicsICd1bmxvY2sta2V5Y2hhaW4nLCAnLXAnLCBrZXljaGFpblBhc3N3b3JkLCBrZXljaGFpblBhdGhdKTtcbiAgYXdhaXQgZXhlYygnc2VjdXJpdHknLCBbJ3NldC1rZXljaGFpbi1zZXR0aW5ncycsICctdCcsICczNjAwJywgJy1sJywga2V5Y2hhaW5QYXRoXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWGNvZGVDb25maWdGaWxlIChvcmdJZCwgc2lnbmluZ0lkKSB7XG4gIGxvZy5kZWJ1ZyhgR2VuZXJhdGluZyB4Y29kZSBjb25maWcgZmlsZSBmb3Igb3JnSWQgJyR7b3JnSWR9JyBhbmQgc2lnbmluZ0lkIGAgK1xuICAgICAgICAgICAgYCcke3NpZ25pbmdJZH0nYCk7XG4gIGNvbnN0IGNvbnRlbnRzID0gYERFVkVMT1BNRU5UX1RFQU0gPSAke29yZ0lkfVxuQ09ERV9TSUdOX0lERU5USVRZID0gJHtzaWduaW5nSWR9XG5gO1xuICBjb25zdCB4Y2NvbmZpZ1BhdGggPSBhd2FpdCB0ZW1wRGlyLnBhdGgoJ2FwcGl1bS10ZW1wLnhjY29uZmlnJyk7XG4gIGxvZy5kZWJ1ZyhgV3JpdGluZyB4Y29kZSBjb25maWcgZmlsZSB0byAke3hjY29uZmlnUGF0aH1gKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHhjY29uZmlnUGF0aCwgY29udGVudHMsICd1dGY4Jyk7XG4gIHJldHVybiB4Y2NvbmZpZ1BhdGg7XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VJbmZvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaXNSZWFsRGV2aWNlIC0gRXF1YWxzIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIGEgcmVhbCBkZXZpY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1ZGlkIC0gVGhlIGRldmljZSBVRElELlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsYXRmb3JtVmVyc2lvbiAtIFRoZSBwbGF0Zm9ybSB2ZXJzaW9uIG9mIE9TLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsYXRmb3JtTmFtZSAtIFRoZSBwbGF0Zm9ybSBuYW1lIG9mIGlPUywgdHZPU1xuKi9cbi8qKlxuICogQ3JlYXRlcyB4Y3Rlc3RydW4gZmlsZSBwZXIgZGV2aWNlICYgcGxhdGZvcm0gdmVyc2lvbi5cbiAqIFdlIGV4cGVjdHMgdG8gaGF2ZSBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVvcyR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LWFybTY0LnhjdGVzdHJ1biBmb3IgcmVhbCBkZXZpY2VcbiAqIGFuZCBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVzaW11bGF0b3Ike3Nka1ZlcnNpb258cGxhdGZvcm1WZXJzaW9ufS14ODZfNjQueGN0ZXN0cnVuIGZvciBzaW11bGF0b3IgbG9jYXRlZCBAYm9vdHN0cmFwUGF0aFxuICogTmV3ZXIgWGNvZGUgKFhjb2RlIDEwLjAgYXQgbGVhc3QpIGdlbmVyYXRlIHhjdGVzdHJ1biBmaWxlIGZvbGxvd2luZyBzZGtWZXJzaW9uLlxuICogZS5nLiBYY29kZSB3aGljaCBoYXMgaU9TIFNESyBWZXJzaW9uIDEyLjIgZ2VuZXJhdGUgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lc2ltdWxhdG9yLjIteDg2XzY0LnhjdGVzdHJ1blxuICogICAgICBldmVuIGlmIHRoZSBjYXAgaGFzIHBsYXRmb3JtIHZlcnNpb24gMTEuNFxuICpcbiAqIEBwYXJhbSB7RGV2aWNlSW5mb30gZGV2aWNlSW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IHNka1ZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9vdHN0cmFwUGF0aCAtIFRoZSBmb2xkZXIgcGF0aCBjb250YWluaW5nIHhjdGVzdHJ1biBmaWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHdkYVJlbW90ZVBvcnQgLSBUaGUgcmVtb3RlIHBvcnQgV0RBIGlzIGxpc3RlbmluZyBvbi5cbiAqIEByZXR1cm4ge3N0cmluZ30gcmV0dXJucyB4Y3Rlc3RydW5GaWxlUGF0aCBmb3IgZ2l2ZW4gZGV2aWNlXG4gKiBAdGhyb3dzIGlmIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZW9zJHtzZGtWZXJzaW9ufHBsYXRmb3JtVmVyc2lvbn0tYXJtNjQueGN0ZXN0cnVuIGZvciByZWFsIGRldmljZVxuICogb3IgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lc2ltdWxhdG9yJHtzZGtWZXJzaW9ufHBsYXRmb3JtVmVyc2lvbn0teDg2XzY0LnhjdGVzdHJ1biBmb3Igc2ltdWxhdG9yIGlzIG5vdCBmb3VuZCBAYm9vdHN0cmFwUGF0aCxcbiAqIHRoZW4gaXQgd2lsbCB0aHJvdyBmaWxlIG5vdCBmb3VuZCBleGNlcHRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2V0WGN0ZXN0cnVuRmlsZSAoZGV2aWNlSW5mbywgc2RrVmVyc2lvbiwgYm9vdHN0cmFwUGF0aCwgd2RhUmVtb3RlUG9ydCkge1xuICBjb25zdCB4Y3Rlc3RydW5GaWxlUGF0aCA9IGF3YWl0IGdldFhjdGVzdHJ1bkZpbGVQYXRoKGRldmljZUluZm8sIHNka1ZlcnNpb24sIGJvb3RzdHJhcFBhdGgpO1xuICBjb25zdCB4Y3Rlc3RSdW5Db250ZW50ID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUoeGN0ZXN0cnVuRmlsZVBhdGgpO1xuICBjb25zdCB1cGRhdGVXREFQb3J0ID0gZ2V0QWRkaXRpb25hbFJ1bkNvbnRlbnQoZGV2aWNlSW5mby5wbGF0Zm9ybU5hbWUsIHdkYVJlbW90ZVBvcnQpO1xuICBjb25zdCBuZXdYY3Rlc3RSdW5Db250ZW50ID0gXy5tZXJnZSh4Y3Rlc3RSdW5Db250ZW50LCB1cGRhdGVXREFQb3J0KTtcbiAgYXdhaXQgcGxpc3QudXBkYXRlUGxpc3RGaWxlKHhjdGVzdHJ1bkZpbGVQYXRoLCBuZXdYY3Rlc3RSdW5Db250ZW50LCB0cnVlKTtcblxuICByZXR1cm4geGN0ZXN0cnVuRmlsZVBhdGg7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBXREEgb2JqZWN0IHdoaWNoIGFwcGVuZHMgZXhpc3RpbmcgeGN0ZXN0IHJ1bm5lciBjb250ZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gcGxhdGZvcm1OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIFRoZSBYY29kZSBTREsgdmVyc2lvbiBvZiBPUy5cbiAqIEByZXR1cm4ge29iamVjdH0gcmV0dXJucyBhIHJ1bm5lciBvYmplY3Qgd2hpY2ggaGFzIFVTRV9QT1JUXG4gKi9cbmZ1bmN0aW9uIGdldEFkZGl0aW9uYWxSdW5Db250ZW50IChwbGF0Zm9ybU5hbWUsIHdkYVJlbW90ZVBvcnQpIHtcbiAgY29uc3QgcnVubmVyID0gYFdlYkRyaXZlckFnZW50UnVubmVyJHtpc1R2T1MocGxhdGZvcm1OYW1lKSA/ICdfdHZPUycgOiAnJ31gO1xuXG4gIHJldHVybiB7XG4gICAgW3J1bm5lcl06IHtcbiAgICAgIEVudmlyb25tZW50VmFyaWFibGVzOiB7XG4gICAgICAgIC8vIFVTRV9QT1JUIG11c3QgYmUgJ3N0cmluZydcbiAgICAgICAgVVNFX1BPUlQ6IGAke3dkYVJlbW90ZVBvcnR9YFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHBhdGggb2YgeGN0ZXN0cnVuIGlmIGl0IGV4aXN0c1xuICogQHBhcmFtIHtEZXZpY2VJbmZvfSBkZXZpY2VJbmZvXG4gKiBAcGFyYW0ge3N0cmluZ30gc2RrVmVyc2lvbiAtIFRoZSBYY29kZSBTREsgdmVyc2lvbiBvZiBPUy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBib290c3RyYXBQYXRoIC0gVGhlIGZvbGRlciBwYXRoIGNvbnRhaW5pbmcgeGN0ZXN0cnVuIGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFhjdGVzdHJ1bkZpbGVQYXRoIChkZXZpY2VJbmZvLCBzZGtWZXJzaW9uLCBib290c3RyYXBQYXRoKSB7XG4gIC8vIEZpcnN0IHRyeSB0aGUgU0RLIHBhdGgsIGZvciBYY29kZSAxMCAoYXQgbGVhc3QpXG4gIGNvbnN0IHNka0Jhc2VkID0gW1xuICAgIHBhdGgucmVzb2x2ZShib290c3RyYXBQYXRoLCBgJHtkZXZpY2VJbmZvLnVkaWR9XyR7c2RrVmVyc2lvbn0ueGN0ZXN0cnVuYCksXG4gICAgc2RrVmVyc2lvbixcbiAgXTtcbiAgLy8gTmV4dCB0cnkgUGxhdGZvcm0gcGF0aCwgZm9yIGVhcmxpZXIgWGNvZGUgdmVyc2lvbnNcbiAgY29uc3QgcGxhdGZvcm1CYXNlZCA9IFtcbiAgICBwYXRoLnJlc29sdmUoYm9vdHN0cmFwUGF0aCwgYCR7ZGV2aWNlSW5mby51ZGlkfV8ke2RldmljZUluZm8ucGxhdGZvcm1WZXJzaW9ufS54Y3Rlc3RydW5gKSxcbiAgICBkZXZpY2VJbmZvLnBsYXRmb3JtVmVyc2lvbixcbiAgXTtcblxuICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgdmVyc2lvbl0gb2YgW3Nka0Jhc2VkLCBwbGF0Zm9ybUJhc2VkXSkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICBsb2cuaW5mbyhgVXNpbmcgJyR7ZmlsZVBhdGh9JyBhcyB4Y3Rlc3RydW4gZmlsZWApO1xuICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFhjdGVzdHJ1bkZpbGUgPSBwYXRoLnJlc29sdmUoYm9vdHN0cmFwUGF0aCwgZ2V0WGN0ZXN0cnVuRmlsZU5hbWUoZGV2aWNlSW5mbywgdmVyc2lvbikpO1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMob3JpZ2luYWxYY3Rlc3RydW5GaWxlKSkge1xuICAgICAgLy8gSWYgdGhpcyBpcyBmaXJzdCB0aW1lIHJ1biBmb3IgZ2l2ZW4gZGV2aWNlLCB0aGVuIGZpcnN0IGdlbmVyYXRlIHhjdGVzdHJ1biBmaWxlIGZvciBkZXZpY2UuXG4gICAgICAvLyBXZSBuZWVkIHRvIGhhdmUgYSB4Y3Rlc3RydW4gZmlsZSAqKnBlciBkZXZpY2UqKiBiZWNhdXNlIHdlIGNhbnQgbm90IGhhdmUgc2FtZSB3ZGEgcG9ydCBmb3IgYWxsIGRldmljZXMuXG4gICAgICBhd2FpdCBmcy5jb3B5RmlsZShvcmlnaW5hbFhjdGVzdHJ1bkZpbGUsIGZpbGVQYXRoKTtcbiAgICAgIGxvZy5pbmZvKGBVc2luZyAnJHtmaWxlUGF0aH0nIGFzIHhjdGVzdHJ1biBmaWxlIGNvcGllZCBieSAnJHtvcmlnaW5hbFhjdGVzdHJ1bkZpbGV9J2ApO1xuICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgIH1cbiAgfVxuXG4gIGxvZy5lcnJvckFuZFRocm93KGBJZiB5b3UgYXJlIHVzaW5nICd1c2VYY3Rlc3RydW5GaWxlJyBjYXBhYmlsaXR5IHRoZW4geW91IGAgK1xuICAgIGBuZWVkIHRvIGhhdmUgYSB4Y3Rlc3RydW4gZmlsZSAoZXhwZWN0ZWQ6IGAgK1xuICAgIGAnJHtwYXRoLnJlc29sdmUoYm9vdHN0cmFwUGF0aCwgZ2V0WGN0ZXN0cnVuRmlsZU5hbWUoZGV2aWNlSW5mbywgc2RrVmVyc2lvbikpfScpYCk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5hbWUgb2YgeGN0ZXN0cnVuIGZpbGVcbiAqIEBwYXJhbSB7RGV2aWNlSW5mb30gZGV2aWNlSW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHJldHVybnMgeGN0ZXN0cnVuRmlsZVBhdGggZm9yIGdpdmVuIGRldmljZVxuICovXG5mdW5jdGlvbiBnZXRYY3Rlc3RydW5GaWxlTmFtZSAoZGV2aWNlSW5mbywgdmVyc2lvbikge1xuICByZXR1cm4gaXNUdk9TKGRldmljZUluZm8ucGxhdGZvcm1OYW1lKVxuICAgID8gYFdlYkRyaXZlckFnZW50UnVubmVyX3R2T1NfYXBwbGV0diR7ZGV2aWNlSW5mby5pc1JlYWxEZXZpY2UgPyBgb3Mke3ZlcnNpb259LWFybTY0YCA6IGBzaW11bGF0b3Ike3ZlcnNpb259LXg4Nl82NGB9LnhjdGVzdHJ1bmBcbiAgICA6IGBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmUke2RldmljZUluZm8uaXNSZWFsRGV2aWNlID8gYG9zJHt2ZXJzaW9ufS1hcm02NGAgOiBgc2ltdWxhdG9yJHt2ZXJzaW9ufS14ODZfNjRgfS54Y3Rlc3RydW5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUHJvY2VzcyAobmFtZSwgcHJvYykge1xuICBpZiAoIXByb2MgfHwgIXByb2MuaXNSdW5uaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nLmluZm8oYFNodXR0aW5nIGRvd24gJyR7bmFtZX0nIHByb2Nlc3MgKHBpZCAnJHtwcm9jLnByb2MucGlkfScpYCk7XG5cbiAgbG9nLmluZm8oYFNlbmRpbmcgJ1NJR1RFUk0nLi4uYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcHJvYy5zdG9wKCdTSUdURVJNJywgMTAwMCk7XG4gICAgcmV0dXJuO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoIWVyci5tZXNzYWdlLmluY2x1ZGVzKGBQcm9jZXNzIGRpZG4ndCBlbmQgYWZ0ZXJgKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYCR7bmFtZX0gcHJvY2VzcyBkaWQgbm90IGVuZCBpbiBhIHRpbWVseSBmYXNoaW9uOiAnJHtlcnIubWVzc2FnZX0nLmApO1xuICB9XG5cbiAgbG9nLmluZm8oYFNlbmRpbmcgJ1NJR0tJTEwnLi4uYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcHJvYy5zdG9wKCdTSUdLSUxMJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIubWVzc2FnZS5pbmNsdWRlcygnbm90IGN1cnJlbnRseSBydW5uaW5nJykpIHtcbiAgICAgIC8vIHRoZSBwcm9jZXNzIGVuZGVkIGJ1dCBmb3Igc29tZSByZWFzb24gd2Ugd2VyZSBub3QgaW5mb3JtZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gaW50ZWdlci5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGludGVnZXIgbnVtYmVyIGluIHJhbmdlIFtsb3csIGhpZ2h0KS4gYGxvd2BgIGlzIGluY2x1c2l2ZSBhbmQgYGhpZ2hgIGlzIGV4Y2x1c2l2ZS5cbiAqL1xuZnVuY3Rpb24gcmFuZG9tSW50IChsb3csIGhpZ2gpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSArIGxvdyk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIFdEQSB1cGdyYWRlIHRpbWVzdGFtcFxuICpcbiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSBVTklYIHRpbWVzdGFtcCBvZiB0aGUgcGFja2FnZSBtYW5pZmVzdC4gVGhlIG1hbmlmZXN0IG9ubHkgZ2V0cyBtb2RpZmllZCBvblxuICogcGFja2FnZSB1cGdyYWRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRXREFVcGdyYWRlVGltZXN0YW1wICgpIHtcbiAgY29uc3QgcGFja2FnZU1hbmlmZXN0ID0gcGF0aC5yZXNvbHZlKGdldE1vZHVsZVJvb3QoKSwgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhwYWNrYWdlTWFuaWZlc3QpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qge210aW1lfSA9IGF3YWl0IGZzLnN0YXQocGFja2FnZU1hbmlmZXN0KTtcbiAgcmV0dXJuIG10aW1lLmdldFRpbWUoKTtcbn1cblxuLyoqXG4gKiBLaWxscyBydW5uaW5nIFhDVGVzdCBwcm9jZXNzZXMgZm9yIHRoZSBwYXJ0aWN1bGFyIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdWRpZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTaW11bGF0b3IgLSBFcXVhbHMgdG8gdHJ1ZSBpZiB0aGUgY3VycmVudCBkZXZpY2UgaXMgYSBTaW11bGF0b3JcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzZXRUZXN0UHJvY2Vzc2VzICh1ZGlkLCBpc1NpbXVsYXRvcikge1xuICBjb25zdCBwcm9jZXNzUGF0dGVybnMgPSBbYHhjb2RlYnVpbGQuKiR7dWRpZH1gXTtcbiAgaWYgKGlzU2ltdWxhdG9yKSB7XG4gICAgcHJvY2Vzc1BhdHRlcm5zLnB1c2goYCR7dWRpZH0uKlhDVFJ1bm5lcmApO1xuICAgIC8vIFRoZSBwYXR0ZXJuIHRvIGZpbmQgaW4gY2FzZSBpZGIgd2FzIHVzZWRcbiAgICBwcm9jZXNzUGF0dGVybnMucHVzaChgeGN0ZXN0Lioke3VkaWR9YCk7XG4gIH1cbiAgbG9nLmRlYnVnKGBLaWxsaW5nIHJ1bm5pbmcgcHJvY2Vzc2VzICcke3Byb2Nlc3NQYXR0ZXJucy5qb2luKCcsICcpfScgZm9yIHRoZSBkZXZpY2UgJHt1ZGlkfS4uLmApO1xuICBhd2FpdCBCLmFsbChwcm9jZXNzUGF0dGVybnMubWFwKGtpbGxBcHBVc2luZ1BhdHRlcm4pKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIElEcyBvZiBwcm9jZXNzZXMgbGlzdGVuaW5nIG9uIHRoZSBwYXJ0aWN1bGFyIHN5c3RlbSBwb3J0LlxuICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhcHBseSBhZGRpdGlvbmFsIGZpbHRlcmluZyBiYXNlZCBvbiB0aGVcbiAqIHByb2Nlc3MgY29tbWFuZCBsaW5lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcG9ydCAtIFRoZSBwb3J0IG51bWJlci5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBmaWx0ZXJpbmdGdW5jIC0gT3B0aW9uYWwgbGFtYmRhIGZ1bmN0aW9uLCB3aGljaFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcyBjb21tYW5kIGxpbmUgc3RyaW5nIG9mIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3NcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuaW5nIG9uIGdpdmVuIHBvcnQsIGFuZCBpcyBleHBlY3RlZCB0byByZXR1cm5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIHRydWUgb3IgZmFsc2UgdG8gaW5jbHVkZS9leGNsdWRlIHRoZSBjb3JyZXNwb25kaW5nIFBJRFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSByZXN1bHRpbmcgYXJyYXkuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gLSB0aGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgaWRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQSURzTGlzdGVuaW5nT25Qb3J0IChwb3J0LCBmaWx0ZXJpbmdGdW5jID0gbnVsbCkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgdHJ5IHtcbiAgICAvLyBUaGlzIG9ubHkgd29ya3Mgc2luY2UgTWFjIE9TIFggRWwgQ2FwaXRhblxuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnbHNvZicsIFsnLXRpJywgYHRjcDoke3BvcnR9YF0pO1xuICAgIHJlc3VsdC5wdXNoKC4uLihzdGRvdXQudHJpbSgpLnNwbGl0KC9cXG4rLykpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlLmNvZGUgIT09IDEpIHtcbiAgICAgIC8vIGNvZGUgMSBtZWFucyBubyBwcm9jZXNzZXMuIE90aGVyIGVycm9ycyBuZWVkIHJlcG9ydGluZ1xuICAgICAgbG9nLmRlYnVnKGBFcnJvciBnZXR0aW5nIHByb2Nlc3NlcyBsaXN0ZW5pbmcgb24gcG9ydCAnJHtwb3J0fSc6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKCFfLmlzRnVuY3Rpb24oZmlsdGVyaW5nRnVuYykpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiBhd2FpdCBCLmZpbHRlcihyZXN1bHQsIGFzeW5jIChwaWQpID0+IHtcbiAgICBsZXQgc3Rkb3V0O1xuICAgIHRyeSB7XG4gICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCdwcycsIFsnLXAnLCBwaWQsICctbycsICdjb21tYW5kJ10pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlID09PSAxKSB7XG4gICAgICAgIC8vIFRoZSBwcm9jZXNzIGRvZXMgbm90IGV4aXN0IGFueW1vcmUsIHRoZXJlJ3Mgbm90aGluZyB0byBmaWx0ZXJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZpbHRlcmluZ0Z1bmMoc3Rkb3V0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCB7IHVwZGF0ZVByb2plY3RGaWxlLCByZXNldFByb2plY3RGaWxlLCBzZXRSZWFsRGV2aWNlU2VjdXJpdHksXG4gIGdldEFkZGl0aW9uYWxSdW5Db250ZW50LCBnZXRYY3Rlc3RydW5GaWxlTmFtZSwgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUsXG4gIHNldFhjdGVzdHJ1bkZpbGUsIGdldFhjdGVzdHJ1bkZpbGVQYXRoLCBraWxsUHJvY2VzcywgcmFuZG9tSW50LFxuICBnZXRXREFVcGdyYWRlVGltZXN0YW1wLCByZXNldFRlc3RQcm9jZXNzZXMsXG4gIGdldFBJRHNMaXN0ZW5pbmdPblBvcnQsIGtpbGxBcHBVc2luZ1BhdHRlcm4sIGlzVHZPU1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxZQUFZLEdBQUcsaUJBQWlCOztB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
274
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQUk9KRUNUX0ZJTEUiLCJnZXRNb2R1bGVSb290IiwiXyIsIm1lbW9pemUiLCJjdXJyZW50RGlyIiwicGF0aCIsImRpcm5hbWUiLCJyZXNvbHZlIiwiX19maWxlbmFtZSIsImlzQXRGc1Jvb3QiLCJtYW5pZmVzdFBhdGgiLCJqb2luIiwiX2ZzIiwiZXhpc3RzU3luYyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsIm5hbWUiLCJpZ24iLCJsZW5ndGgiLCJFcnJvciIsIkJPT1RTVFJBUF9QQVRIIiwiZ2V0UElEc1VzaW5nUGF0dGVybiIsInBhdHRlcm4iLCJhcmdzIiwic3Rkb3V0IiwiZXhlYyIsInNwbGl0IiwibWFwIiwieCIsInBhcnNlSW50IiwiZmlsdGVyIiwiaXNJbnRlZ2VyIiwiZXJyIiwibG9nIiwiZGVidWciLCJjb2RlIiwia2lsbEFwcFVzaW5nUGF0dGVybiIsInBncmVwUGF0dGVybiIsInNpZ25hbHMiLCJzaWduYWwiLCJtYXRjaGVkUGlkcyIsImlzRW1wdHkiLCJtZXNzYWdlIiwibGFzdCIsIndhaXRGb3JDb25kaXRpb24iLCJwaWRDaGVja1Byb21pc2VzIiwicGlkIiwidGhlbiIsImNhdGNoIiwiQiIsImFsbCIsImV2ZXJ5Iiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImlzVHZPUyIsInBsYXRmb3JtTmFtZSIsInRvTG93ZXIiLCJQTEFURk9STV9OQU1FX1RWT1MiLCJyZXBsYWNlSW5GaWxlIiwiZmlsZSIsImZpbmQiLCJyZXBsYWNlIiwiY29udGVudHMiLCJmcyIsInJlYWRGaWxlIiwibmV3Q29udGVudHMiLCJ3cml0ZUZpbGUiLCJ1cGRhdGVQcm9qZWN0RmlsZSIsImFnZW50UGF0aCIsIm5ld0J1bmRsZUlkIiwicHJvamVjdEZpbGVQYXRoIiwiY29weUZpbGUiLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJXREFfUlVOTkVSX0JVTkRMRV9JRCIsIndhcm4iLCJyZXNldFByb2plY3RGaWxlIiwiZXhpc3RzIiwibXYiLCJzZXRSZWFsRGV2aWNlU2VjdXJpdHkiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwiZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUiLCJvcmdJZCIsInNpZ25pbmdJZCIsInhjY29uZmlnUGF0aCIsInRlbXBEaXIiLCJzZXRYY3Rlc3RydW5GaWxlIiwiZGV2aWNlSW5mbyIsInNka1ZlcnNpb24iLCJib290c3RyYXBQYXRoIiwid2RhUmVtb3RlUG9ydCIsInhjdGVzdHJ1bkZpbGVQYXRoIiwiZ2V0WGN0ZXN0cnVuRmlsZVBhdGgiLCJ4Y3Rlc3RSdW5Db250ZW50IiwicGxpc3QiLCJwYXJzZVBsaXN0RmlsZSIsInVwZGF0ZVdEQVBvcnQiLCJnZXRBZGRpdGlvbmFsUnVuQ29udGVudCIsIm5ld1hjdGVzdFJ1bkNvbnRlbnQiLCJtZXJnZSIsInVwZGF0ZVBsaXN0RmlsZSIsInJ1bm5lciIsIkVudmlyb25tZW50VmFyaWFibGVzIiwiVVNFX1BPUlQiLCJzZGtCYXNlZCIsInVkaWQiLCJwbGF0Zm9ybUJhc2VkIiwicGxhdGZvcm1WZXJzaW9uIiwiZmlsZVBhdGgiLCJ2ZXJzaW9uIiwiaW5mbyIsIm9yaWdpbmFsWGN0ZXN0cnVuRmlsZSIsImdldFhjdGVzdHJ1bkZpbGVOYW1lIiwiZXJyb3JBbmRUaHJvdyIsImlzUmVhbERldmljZSIsImtpbGxQcm9jZXNzIiwicHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbmNsdWRlcyIsInJhbmRvbUludCIsImxvdyIsImhpZ2giLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwicGFja2FnZU1hbmlmZXN0IiwibXRpbWUiLCJzdGF0IiwiZ2V0VGltZSIsInJlc2V0VGVzdFByb2Nlc3NlcyIsImlzU2ltdWxhdG9yIiwicHJvY2Vzc1BhdHRlcm5zIiwicHVzaCIsImdldFBJRHNMaXN0ZW5pbmdPblBvcnQiLCJwb3J0IiwiZmlsdGVyaW5nRnVuYyIsInJlc3VsdCIsInRyaW0iLCJlIiwic3RkZXJyIiwiaXNGdW5jdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgdGVtcERpciwgcGxpc3QgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFdEQV9SVU5ORVJfQlVORExFX0lELCBQTEFURk9STV9OQU1FX1RWT1MgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgX2ZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5cbmNvbnN0IFBST0pFQ1RfRklMRSA9ICdwcm9qZWN0LnBieHByb2onO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHBhdGggdG8gdGhlIGN1cnJlbnQgbW9kdWxlJ3Mgcm9vdCBmb2xkZXJcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIG1vZHVsZSByb290XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGN1cnJlbnQgbW9kdWxlIHJvb3QgZm9sZGVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmNvbnN0IGdldE1vZHVsZVJvb3QgPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0TW9kdWxlUm9vdCAoKSB7XG4gIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKHBhdGgucmVzb2x2ZShfX2ZpbGVuYW1lKSk7XG4gIGxldCBpc0F0RnNSb290ID0gZmFsc2U7XG4gIHdoaWxlICghaXNBdEZzUm9vdCkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChfZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpICYmXG4gICAgICAgICAgSlNPTi5wYXJzZShfZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkubmFtZSA9PT0gJ2FwcGl1bS13ZWJkcml2ZXJhZ2VudCcpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgaXNBdEZzUm9vdCA9IGN1cnJlbnREaXIubGVuZ3RoIDw9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKS5sZW5ndGg7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIGFwcGl1bS13ZWJkcml2ZXJhZ2VudCBOb2RlLmpzIG1vZHVsZScpO1xufSk7XG5cbmV4cG9ydCBjb25zdCBCT09UU1RSQVBfUEFUSCA9IGdldE1vZHVsZVJvb3QoKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0UElEc1VzaW5nUGF0dGVybiAocGF0dGVybikge1xuICBjb25zdCBhcmdzID0gW1xuICAgICctaWYnLCAvLyBjYXNlIGluc2Vuc2l0aXZlLCBmdWxsIGNtZGxpbmUgbWF0Y2hcbiAgICBwYXR0ZXJuLFxuICBdO1xuICB0cnkge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygncGdyZXAnLCBhcmdzKTtcbiAgICByZXR1cm4gc3Rkb3V0LnNwbGl0KC9cXHMrLylcbiAgICAgIC5tYXAoKHgpID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgIC5maWx0ZXIoXy5pc0ludGVnZXIpXG4gICAgICAubWFwKCh4KSA9PiBgJHt4fWApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZGVidWcoYCdwZ3JlcCAke2FyZ3Muam9pbignICcpfScgZGlkbid0IGRldGVjdCBhbnkgbWF0Y2hpbmcgcHJvY2Vzc2VzLiBSZXR1cm4gY29kZTogJHtlcnIuY29kZX1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbEFwcFVzaW5nUGF0dGVybiAocGdyZXBQYXR0ZXJuKSB7XG4gIGNvbnN0IHNpZ25hbHMgPSBbMiwgMTUsIDldO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaWduYWxzKSB7XG4gICAgY29uc3QgbWF0Y2hlZFBpZHMgPSBhd2FpdCBnZXRQSURzVXNpbmdQYXR0ZXJuKHBncmVwUGF0dGVybik7XG4gICAgaWYgKF8uaXNFbXB0eShtYXRjaGVkUGlkcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IFtgLSR7c2lnbmFsfWAsIC4uLm1hdGNoZWRQaWRzXTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYygna2lsbCcsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmRlYnVnKGBraWxsICR7YXJncy5qb2luKCcgJyl9IC0+ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGlmIChzaWduYWwgPT09IF8ubGFzdChzaWduYWxzKSkge1xuICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byB3YWl0IGFmdGVyIFNJR0tJTExcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwaWRDaGVja1Byb21pc2VzID0gbWF0Y2hlZFBpZHNcbiAgICAgICAgICAubWFwKChwaWQpID0+IGV4ZWMoJ2tpbGwnLCBbJy0wJywgcGlkXSlcbiAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlXG4gICAgICAgICAgICAudGhlbigoKSA9PiBmYWxzZSlcbiAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzIGlzIGRlYWRcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB0cnVlKVxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgQi5hbGwocGlkQ2hlY2tQcm9taXNlcykpXG4gICAgICAgICAgLmV2ZXJ5KCh4KSA9PiB4ID09PSB0cnVlKTtcbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiAxMDAwLFxuICAgICAgICBpbnRlcnZhbE1zOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIC8vIHRyeSB0aGUgbmV4dCBzaWduYWxcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm1OYW1lIGlzIHR2T1NcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGF0Zm9ybU5hbWUgVGhlIG5hbWUgb2YgdGhlIHBsYXRvcm1cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm1OYW1lIGlzIHR2T1NcbiAqL1xuZnVuY3Rpb24gaXNUdk9TIChwbGF0Zm9ybU5hbWUpIHtcbiAgcmV0dXJuIF8udG9Mb3dlcihwbGF0Zm9ybU5hbWUpID09PSBfLnRvTG93ZXIoUExBVEZPUk1fTkFNRV9UVk9TKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUluRmlsZSAoZmlsZSwgZmluZCwgcmVwbGFjZSkge1xuICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlLCAndXRmOCcpO1xuXG4gIGxldCBuZXdDb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2UoZmluZCwgcmVwbGFjZSk7XG4gIGlmIChuZXdDb250ZW50cyAhPT0gY29udGVudHMpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZSwgbmV3Q29udGVudHMsICd1dGY4Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGUgV2ViRHJpdmVyQWdlbnRSdW5uZXIgcHJvamVjdCBidW5kbGUgSUQgd2l0aCBuZXdCdW5kbGVJZC5cbiAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgcHJvamVjdCBmaWxlIGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFnZW50UGF0aCAtIFBhdGggdG8gdGhlIC54Y29kZXByb2ogZGlyZWN0b3J5LlxuICogQHBhcmFtIHtzdHJpbmd9IG5ld0J1bmRsZUlkIHRoZSBuZXcgYnVuZGxlIElEIHVzZWQgdG8gdXBkYXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9qZWN0RmlsZSAoYWdlbnRQYXRoLCBuZXdCdW5kbGVJZCkge1xuICBsZXQgcHJvamVjdEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGFnZW50UGF0aCwgUFJPSkVDVF9GSUxFKTtcbiAgdHJ5IHtcbiAgICAvLyBBc3N1bWluZyBwcm9qZWN0RmlsZVBhdGggaXMgaW4gdGhlIGNvcnJlY3Qgc3RhdGUsIGNyZWF0ZSAub2xkIGZyb20gcHJvamVjdEZpbGVQYXRoXG4gICAgYXdhaXQgZnMuY29weUZpbGUocHJvamVjdEZpbGVQYXRoLCBgJHtwcm9qZWN0RmlsZVBhdGh9Lm9sZGApO1xuICAgIGF3YWl0IHJlcGxhY2VJbkZpbGUocHJvamVjdEZpbGVQYXRoLCBuZXcgUmVnRXhwKF8uZXNjYXBlUmVnRXhwKFdEQV9SVU5ORVJfQlVORExFX0lEKSwgJ2cnKSwgbmV3QnVuZGxlSWQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgdXBkYXRlZCAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGJ1bmRsZSBpZCAnJHtuZXdCdW5kbGVJZH0nYCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5kZWJ1ZyhgRXJyb3IgdXBkYXRpbmcgcHJvamVjdCBmaWxlOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGxvZy53YXJuKGBVbmFibGUgdG8gdXBkYXRlIHByb2plY3QgZmlsZSAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGAgK1xuICAgICAgYGJ1bmRsZSBpZCAnJHtuZXdCdW5kbGVJZH0nLiBXZWJEcml2ZXJBZ2VudCBtYXkgbm90IHN0YXJ0YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldCBXZWJEcml2ZXJBZ2VudFJ1bm5lciBwcm9qZWN0IGJ1bmRsZSBJRCB0byBjb3JyZWN0IHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFnZW50UGF0aCAtIFBhdGggdG8gdGhlIC54Y29kZXByb2ogZGlyZWN0b3J5LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNldFByb2plY3RGaWxlIChhZ2VudFBhdGgpIHtcbiAgY29uc3QgcHJvamVjdEZpbGVQYXRoID0gcGF0aC5qb2luKGFnZW50UGF0aCwgUFJPSkVDVF9GSUxFKTtcbiAgdHJ5IHtcbiAgICAvLyByZXN0b3JlIHByb2plY3RGaWxlUGF0aCBmcm9tIC5vbGQgZmlsZVxuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGAke3Byb2plY3RGaWxlUGF0aH0ub2xkYCkpIHtcbiAgICAgIHJldHVybjsgLy8gbm8gbmVlZCB0byByZXNldFxuICAgIH1cbiAgICBhd2FpdCBmcy5tdihgJHtwcm9qZWN0RmlsZVBhdGh9Lm9sZGAsIHByb2plY3RGaWxlUGF0aCk7XG4gICAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgcmVzZXQgJyR7cHJvamVjdEZpbGVQYXRofScgd2l0aCBidW5kbGUgaWQgJyR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9J2ApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZGVidWcoYEVycm9yIHJlc2V0dGluZyBwcm9qZWN0IGZpbGU6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgbG9nLndhcm4oYFVuYWJsZSB0byByZXNldCBwcm9qZWN0IGZpbGUgJyR7cHJvamVjdEZpbGVQYXRofScgd2l0aCBgICtcbiAgICAgIGBidW5kbGUgaWQgJyR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9Jy4gV2ViRHJpdmVyQWdlbnQgaGFzIGJlZW4gYCArXG4gICAgICBgbW9kaWZpZWQgYW5kIG5vdCByZXR1cm5lZCB0byB0aGUgb3JpZ2luYWwgc3RhdGUuYCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0UmVhbERldmljZVNlY3VyaXR5IChrZXljaGFpblBhdGgsIGtleWNoYWluUGFzc3dvcmQpIHtcbiAgbG9nLmRlYnVnKCdTZXR0aW5nIHNlY3VyaXR5IGZvciBpT1MgZGV2aWNlJyk7XG4gIGF3YWl0IGV4ZWMoJ3NlY3VyaXR5JywgWyctdicsICdsaXN0LWtleWNoYWlucycsICctcycsIGtleWNoYWluUGF0aF0pO1xuICBhd2FpdCBleGVjKCdzZWN1cml0eScsIFsnLXYnLCAndW5sb2NrLWtleWNoYWluJywgJy1wJywga2V5Y2hhaW5QYXNzd29yZCwga2V5Y2hhaW5QYXRoXSk7XG4gIGF3YWl0IGV4ZWMoJ3NlY3VyaXR5JywgWydzZXQta2V5Y2hhaW4tc2V0dGluZ3MnLCAnLXQnLCAnMzYwMCcsICctbCcsIGtleWNoYWluUGF0aF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSAob3JnSWQsIHNpZ25pbmdJZCkge1xuICBsb2cuZGVidWcoYEdlbmVyYXRpbmcgeGNvZGUgY29uZmlnIGZpbGUgZm9yIG9yZ0lkICcke29yZ0lkfScgYW5kIHNpZ25pbmdJZCBgICtcbiAgICAgICAgICAgIGAnJHtzaWduaW5nSWR9J2ApO1xuICBjb25zdCBjb250ZW50cyA9IGBERVZFTE9QTUVOVF9URUFNID0gJHtvcmdJZH1cbkNPREVfU0lHTl9JREVOVElUWSA9ICR7c2lnbmluZ0lkfVxuYDtcbiAgY29uc3QgeGNjb25maWdQYXRoID0gYXdhaXQgdGVtcERpci5wYXRoKCdhcHBpdW0tdGVtcC54Y2NvbmZpZycpO1xuICBsb2cuZGVidWcoYFdyaXRpbmcgeGNvZGUgY29uZmlnIGZpbGUgdG8gJHt4Y2NvbmZpZ1BhdGh9YCk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZSh4Y2NvbmZpZ1BhdGgsIGNvbnRlbnRzLCAndXRmOCcpO1xuICByZXR1cm4geGNjb25maWdQYXRoO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogQHR5cGVkZWYge09iamVjdH0gRGV2aWNlSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGlzUmVhbERldmljZSAtIEVxdWFscyB0byB0cnVlIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyBhIHJlYWwgZGV2aWNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdWRpZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbGF0Zm9ybVZlcnNpb24gLSBUaGUgcGxhdGZvcm0gdmVyc2lvbiBvZiBPUy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbGF0Zm9ybU5hbWUgLSBUaGUgcGxhdGZvcm0gbmFtZSBvZiBpT1MsIHR2T1NcbiovXG4vKipcbiAqIENyZWF0ZXMgeGN0ZXN0cnVuIGZpbGUgcGVyIGRldmljZSAmIHBsYXRmb3JtIHZlcnNpb24uXG4gKiBXZSBleHBlY3RzIHRvIGhhdmUgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lb3Mke3Nka1ZlcnNpb258cGxhdGZvcm1WZXJzaW9ufS1hcm02NC54Y3Rlc3RydW4gZm9yIHJlYWwgZGV2aWNlXG4gKiBhbmQgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lc2ltdWxhdG9yJHtzZGtWZXJzaW9ufHBsYXRmb3JtVmVyc2lvbn0teDg2XzY0LnhjdGVzdHJ1biBmb3Igc2ltdWxhdG9yIGxvY2F0ZWQgQGJvb3RzdHJhcFBhdGhcbiAqIE5ld2VyIFhjb2RlIChYY29kZSAxMC4wIGF0IGxlYXN0KSBnZW5lcmF0ZSB4Y3Rlc3RydW4gZmlsZSBmb2xsb3dpbmcgc2RrVmVyc2lvbi5cbiAqIGUuZy4gWGNvZGUgd2hpY2ggaGFzIGlPUyBTREsgVmVyc2lvbiAxMi4yIGdlbmVyYXRlIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZXNpbXVsYXRvci4yLXg4Nl82NC54Y3Rlc3RydW5cbiAqICAgICAgZXZlbiBpZiB0aGUgY2FwIGhhcyBwbGF0Zm9ybSB2ZXJzaW9uIDExLjRcbiAqXG4gKiBAcGFyYW0ge0RldmljZUluZm99IGRldmljZUluZm9cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZGtWZXJzaW9uIC0gVGhlIFhjb2RlIFNESyB2ZXJzaW9uIG9mIE9TLlxuICogQHBhcmFtIHtzdHJpbmd9IGJvb3RzdHJhcFBhdGggLSBUaGUgZm9sZGVyIHBhdGggY29udGFpbmluZyB4Y3Rlc3RydW4gZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZGFSZW1vdGVQb3J0IC0gVGhlIHJlbW90ZSBwb3J0IFdEQSBpcyBsaXN0ZW5pbmcgb24uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHJldHVybnMgeGN0ZXN0cnVuRmlsZVBhdGggZm9yIGdpdmVuIGRldmljZVxuICogQHRocm93cyBpZiBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVvcyR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LWFybTY0LnhjdGVzdHJ1biBmb3IgcmVhbCBkZXZpY2VcbiAqIG9yIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZXNpbXVsYXRvciR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LXg4Nl82NC54Y3Rlc3RydW4gZm9yIHNpbXVsYXRvciBpcyBub3QgZm91bmQgQGJvb3RzdHJhcFBhdGgsXG4gKiB0aGVuIGl0IHdpbGwgdGhyb3cgZmlsZSBub3QgZm91bmQgZXhjZXB0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldFhjdGVzdHJ1bkZpbGUgKGRldmljZUluZm8sIHNka1ZlcnNpb24sIGJvb3RzdHJhcFBhdGgsIHdkYVJlbW90ZVBvcnQpIHtcbiAgY29uc3QgeGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBnZXRYY3Rlc3RydW5GaWxlUGF0aChkZXZpY2VJbmZvLCBzZGtWZXJzaW9uLCBib290c3RyYXBQYXRoKTtcbiAgY29uc3QgeGN0ZXN0UnVuQ29udGVudCA9IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3RGaWxlKHhjdGVzdHJ1bkZpbGVQYXRoKTtcbiAgY29uc3QgdXBkYXRlV0RBUG9ydCA9IGdldEFkZGl0aW9uYWxSdW5Db250ZW50KGRldmljZUluZm8ucGxhdGZvcm1OYW1lLCB3ZGFSZW1vdGVQb3J0KTtcbiAgY29uc3QgbmV3WGN0ZXN0UnVuQ29udGVudCA9IF8ubWVyZ2UoeGN0ZXN0UnVuQ29udGVudCwgdXBkYXRlV0RBUG9ydCk7XG4gIGF3YWl0IHBsaXN0LnVwZGF0ZVBsaXN0RmlsZSh4Y3Rlc3RydW5GaWxlUGF0aCwgbmV3WGN0ZXN0UnVuQ29udGVudCwgdHJ1ZSk7XG5cbiAgcmV0dXJuIHhjdGVzdHJ1bkZpbGVQYXRoO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgV0RBIG9iamVjdCB3aGljaCBhcHBlbmRzIGV4aXN0aW5nIHhjdGVzdCBydW5uZXIgY29udGVudFxuICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwbGF0Zm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcmV0dXJuIHtvYmplY3R9IHJldHVybnMgYSBydW5uZXIgb2JqZWN0IHdoaWNoIGhhcyBVU0VfUE9SVFxuICovXG5mdW5jdGlvbiBnZXRBZGRpdGlvbmFsUnVuQ29udGVudCAocGxhdGZvcm1OYW1lLCB3ZGFSZW1vdGVQb3J0KSB7XG4gIGNvbnN0IHJ1bm5lciA9IGBXZWJEcml2ZXJBZ2VudFJ1bm5lciR7aXNUdk9TKHBsYXRmb3JtTmFtZSkgPyAnX3R2T1MnIDogJyd9YDtcblxuICByZXR1cm4ge1xuICAgIFtydW5uZXJdOiB7XG4gICAgICBFbnZpcm9ubWVudFZhcmlhYmxlczoge1xuICAgICAgICAvLyBVU0VfUE9SVCBtdXN0IGJlICdzdHJpbmcnXG4gICAgICAgIFVTRV9QT1JUOiBgJHt3ZGFSZW1vdGVQb3J0fWBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwYXRoIG9mIHhjdGVzdHJ1biBpZiBpdCBleGlzdHNcbiAqIEBwYXJhbSB7RGV2aWNlSW5mb30gZGV2aWNlSW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IHNka1ZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9vdHN0cmFwUGF0aCAtIFRoZSBmb2xkZXIgcGF0aCBjb250YWluaW5nIHhjdGVzdHJ1biBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRYY3Rlc3RydW5GaWxlUGF0aCAoZGV2aWNlSW5mbywgc2RrVmVyc2lvbiwgYm9vdHN0cmFwUGF0aCkge1xuICAvLyBGaXJzdCB0cnkgdGhlIFNESyBwYXRoLCBmb3IgWGNvZGUgMTAgKGF0IGxlYXN0KVxuICBjb25zdCBzZGtCYXNlZCA9IFtcbiAgICBwYXRoLnJlc29sdmUoYm9vdHN0cmFwUGF0aCwgYCR7ZGV2aWNlSW5mby51ZGlkfV8ke3Nka1ZlcnNpb259LnhjdGVzdHJ1bmApLFxuICAgIHNka1ZlcnNpb24sXG4gIF07XG4gIC8vIE5leHQgdHJ5IFBsYXRmb3JtIHBhdGgsIGZvciBlYXJsaWVyIFhjb2RlIHZlcnNpb25zXG4gIGNvbnN0IHBsYXRmb3JtQmFzZWQgPSBbXG4gICAgcGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGAke2RldmljZUluZm8udWRpZH1fJHtkZXZpY2VJbmZvLnBsYXRmb3JtVmVyc2lvbn0ueGN0ZXN0cnVuYCksXG4gICAgZGV2aWNlSW5mby5wbGF0Zm9ybVZlcnNpb24sXG4gIF07XG5cbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIHZlcnNpb25dIG9mIFtzZGtCYXNlZCwgcGxhdGZvcm1CYXNlZF0pIHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgbG9nLmluZm8oYFVzaW5nICcke2ZpbGVQYXRofScgYXMgeGN0ZXN0cnVuIGZpbGVgKTtcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxYY3Rlc3RydW5GaWxlID0gcGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGdldFhjdGVzdHJ1bkZpbGVOYW1lKGRldmljZUluZm8sIHZlcnNpb24pKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKG9yaWdpbmFsWGN0ZXN0cnVuRmlsZSkpIHtcbiAgICAgIC8vIElmIHRoaXMgaXMgZmlyc3QgdGltZSBydW4gZm9yIGdpdmVuIGRldmljZSwgdGhlbiBmaXJzdCBnZW5lcmF0ZSB4Y3Rlc3RydW4gZmlsZSBmb3IgZGV2aWNlLlxuICAgICAgLy8gV2UgbmVlZCB0byBoYXZlIGEgeGN0ZXN0cnVuIGZpbGUgKipwZXIgZGV2aWNlKiogYmVjYXVzZSB3ZSBjYW50IG5vdCBoYXZlIHNhbWUgd2RhIHBvcnQgZm9yIGFsbCBkZXZpY2VzLlxuICAgICAgYXdhaXQgZnMuY29weUZpbGUob3JpZ2luYWxYY3Rlc3RydW5GaWxlLCBmaWxlUGF0aCk7XG4gICAgICBsb2cuaW5mbyhgVXNpbmcgJyR7ZmlsZVBhdGh9JyBhcyB4Y3Rlc3RydW4gZmlsZSBjb3BpZWQgYnkgJyR7b3JpZ2luYWxYY3Rlc3RydW5GaWxlfSdgKTtcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG4gIH1cblxuICBsb2cuZXJyb3JBbmRUaHJvdyhgSWYgeW91IGFyZSB1c2luZyAndXNlWGN0ZXN0cnVuRmlsZScgY2FwYWJpbGl0eSB0aGVuIHlvdSBgICtcbiAgICBgbmVlZCB0byBoYXZlIGEgeGN0ZXN0cnVuIGZpbGUgKGV4cGVjdGVkOiBgICtcbiAgICBgJyR7cGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGdldFhjdGVzdHJ1bkZpbGVOYW1lKGRldmljZUluZm8sIHNka1ZlcnNpb24pKX0nKWApO1xufVxuXG5cbi8qKlxuICogUmV0dXJuIHRoZSBuYW1lIG9mIHhjdGVzdHJ1biBmaWxlXG4gKiBAcGFyYW0ge0RldmljZUluZm99IGRldmljZUluZm9cbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gVGhlIFhjb2RlIFNESyB2ZXJzaW9uIG9mIE9TLlxuICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIHhjdGVzdHJ1bkZpbGVQYXRoIGZvciBnaXZlbiBkZXZpY2VcbiAqL1xuZnVuY3Rpb24gZ2V0WGN0ZXN0cnVuRmlsZU5hbWUgKGRldmljZUluZm8sIHZlcnNpb24pIHtcbiAgcmV0dXJuIGlzVHZPUyhkZXZpY2VJbmZvLnBsYXRmb3JtTmFtZSlcbiAgICA/IGBXZWJEcml2ZXJBZ2VudFJ1bm5lcl90dk9TX2FwcGxldHYke2RldmljZUluZm8uaXNSZWFsRGV2aWNlID8gYG9zJHt2ZXJzaW9ufS1hcm02NGAgOiBgc2ltdWxhdG9yJHt2ZXJzaW9ufS14ODZfNjRgfS54Y3Rlc3RydW5gXG4gICAgOiBgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lJHtkZXZpY2VJbmZvLmlzUmVhbERldmljZSA/IGBvcyR7dmVyc2lvbn0tYXJtNjRgIDogYHNpbXVsYXRvciR7dmVyc2lvbn0teDg2XzY0YH0ueGN0ZXN0cnVuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3MgKG5hbWUsIHByb2MpIHtcbiAgaWYgKCFwcm9jIHx8ICFwcm9jLmlzUnVubmluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTaHV0dGluZyBkb3duICcke25hbWV9JyBwcm9jZXNzIChwaWQgJyR7cHJvYy5wcm9jLnBpZH0nKWApO1xuXG4gIGxvZy5pbmZvKGBTZW5kaW5nICdTSUdURVJNJy4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IHByb2Muc3RvcCgnU0lHVEVSTScsIDEwMDApO1xuICAgIHJldHVybjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcyhgUHJvY2VzcyBkaWRuJ3QgZW5kIGFmdGVyYCkpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGAke25hbWV9IHByb2Nlc3MgZGlkIG5vdCBlbmQgaW4gYSB0aW1lbHkgZmFzaGlvbjogJyR7ZXJyLm1lc3NhZ2V9Jy5gKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTZW5kaW5nICdTSUdLSUxMJy4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IHByb2Muc3RvcCgnU0lHS0lMTCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBjdXJyZW50bHkgcnVubmluZycpKSB7XG4gICAgICAvLyB0aGUgcHJvY2VzcyBlbmRlZCBidXQgZm9yIHNvbWUgcmVhc29uIHdlIHdlcmUgbm90IGluZm9ybWVkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIGludGVnZXIuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIG51bWJlciBpbiByYW5nZSBbbG93LCBoaWdodCkuIGBsb3dgYCBpcyBpbmNsdXNpdmUgYW5kIGBoaWdoYCBpcyBleGNsdXNpdmUuXG4gKi9cbmZ1bmN0aW9uIHJhbmRvbUludCAobG93LCBoaWdoKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdykgKyBsb3cpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBXREEgdXBncmFkZSB0aW1lc3RhbXBcbiAqXG4gKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgVU5JWCB0aW1lc3RhbXAgb2YgdGhlIHBhY2thZ2UgbWFuaWZlc3QuIFRoZSBtYW5pZmVzdCBvbmx5IGdldHMgbW9kaWZpZWQgb25cbiAqIHBhY2thZ2UgdXBncmFkZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCAoKSB7XG4gIGNvbnN0IHBhY2thZ2VNYW5pZmVzdCA9IHBhdGgucmVzb2x2ZShnZXRNb2R1bGVSb290KCksICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGFja2FnZU1hbmlmZXN0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHttdGltZX0gPSBhd2FpdCBmcy5zdGF0KHBhY2thZ2VNYW5pZmVzdCk7XG4gIHJldHVybiBtdGltZS5nZXRUaW1lKCk7XG59XG5cbi8qKlxuICogS2lsbHMgcnVubmluZyBYQ1Rlc3QgcHJvY2Vzc2VzIGZvciB0aGUgcGFydGljdWxhciBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVkaWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU2ltdWxhdG9yIC0gRXF1YWxzIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIGEgU2ltdWxhdG9yXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc2V0VGVzdFByb2Nlc3NlcyAodWRpZCwgaXNTaW11bGF0b3IpIHtcbiAgY29uc3QgcHJvY2Vzc1BhdHRlcm5zID0gW2B4Y29kZWJ1aWxkLioke3VkaWR9YF07XG4gIGlmIChpc1NpbXVsYXRvcikge1xuICAgIHByb2Nlc3NQYXR0ZXJucy5wdXNoKGAke3VkaWR9LipYQ1RSdW5uZXJgKTtcbiAgICAvLyBUaGUgcGF0dGVybiB0byBmaW5kIGluIGNhc2UgaWRiIHdhcyB1c2VkXG4gICAgcHJvY2Vzc1BhdHRlcm5zLnB1c2goYHhjdGVzdC4qJHt1ZGlkfWApO1xuICB9XG4gIGxvZy5kZWJ1ZyhgS2lsbGluZyBydW5uaW5nIHByb2Nlc3NlcyAnJHtwcm9jZXNzUGF0dGVybnMuam9pbignLCAnKX0nIGZvciB0aGUgZGV2aWNlICR7dWRpZH0uLi5gKTtcbiAgYXdhaXQgQi5hbGwocHJvY2Vzc1BhdHRlcm5zLm1hcChraWxsQXBwVXNpbmdQYXR0ZXJuKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBJRHMgb2YgcHJvY2Vzc2VzIGxpc3RlbmluZyBvbiB0aGUgcGFydGljdWxhciBzeXN0ZW0gcG9ydC5cbiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYXBwbHkgYWRkaXRpb25hbCBmaWx0ZXJpbmcgYmFzZWQgb24gdGhlXG4gKiBwcm9jZXNzIGNvbW1hbmQgbGluZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBvcnQgLSBUaGUgcG9ydCBudW1iZXIuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZmlsdGVyaW5nRnVuYyAtIE9wdGlvbmFsIGxhbWJkYSBmdW5jdGlvbiwgd2hpY2hcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXMgY29tbWFuZCBsaW5lIHN0cmluZyBvZiB0aGUgcGFydGljdWxhciBwcm9jZXNzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmluZyBvbiBnaXZlbiBwb3J0LCBhbmQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciB0cnVlIG9yIGZhbHNlIHRvIGluY2x1ZGUvZXhjbHVkZSB0aGUgY29ycmVzcG9uZGluZyBQSURcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcmVzdWx0aW5nIGFycmF5LlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IC0gdGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIGlkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UElEc0xpc3RlbmluZ09uUG9ydCAocG9ydCwgZmlsdGVyaW5nRnVuYyA9IG51bGwpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBvbmx5IHdvcmtzIHNpbmNlIE1hYyBPUyBYIEVsIENhcGl0YW5cbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ2xzb2YnLCBbJy10aScsIGB0Y3A6JHtwb3J0fWBdKTtcbiAgICByZXN1bHQucHVzaCguLi4oc3Rkb3V0LnRyaW0oKS5zcGxpdCgvXFxuKy8pKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5jb2RlICE9PSAxKSB7XG4gICAgICAvLyBjb2RlIDEgbWVhbnMgbm8gcHJvY2Vzc2VzLiBPdGhlciBlcnJvcnMgbmVlZCByZXBvcnRpbmdcbiAgICAgIGxvZy5kZWJ1ZyhgRXJyb3IgZ2V0dGluZyBwcm9jZXNzZXMgbGlzdGVuaW5nIG9uIHBvcnQgJyR7cG9ydH0nOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghXy5pc0Z1bmN0aW9uKGZpbHRlcmluZ0Z1bmMpKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gYXdhaXQgQi5maWx0ZXIocmVzdWx0LCBhc3luYyAocGlkKSA9PiB7XG4gICAgbGV0IHN0ZG91dDtcbiAgICB0cnkge1xuICAgICAgKHtzdGRvdXR9ID0gYXdhaXQgZXhlYygncHMnLCBbJy1wJywgcGlkLCAnLW8nLCAnY29tbWFuZCddKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gMSkge1xuICAgICAgICAvLyBUaGUgcHJvY2VzcyBkb2VzIG5vdCBleGlzdCBhbnltb3JlLCB0aGVyZSdzIG5vdGhpbmcgdG8gZmlsdGVyXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmaWx0ZXJpbmdGdW5jKHN0ZG91dCk7XG4gIH0pO1xufVxuXG5leHBvcnQgeyB1cGRhdGVQcm9qZWN0RmlsZSwgcmVzZXRQcm9qZWN0RmlsZSwgc2V0UmVhbERldmljZVNlY3VyaXR5LFxuICBnZXRBZGRpdGlvbmFsUnVuQ29udGVudCwgZ2V0WGN0ZXN0cnVuRmlsZU5hbWUsIGdlbmVyYXRlWGNvZGVDb25maWdGaWxlLFxuICBzZXRYY3Rlc3RydW5GaWxlLCBnZXRYY3Rlc3RydW5GaWxlUGF0aCwga2lsbFByb2Nlc3MsIHJhbmRvbUludCxcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgcmVzZXRUZXN0UHJvY2Vzc2VzLFxuICBnZXRQSURzTGlzdGVuaW5nT25Qb3J0LCBraWxsQXBwVXNpbmdQYXR0ZXJuLCBpc1R2T1Ncbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsWUFBWSxHQUFHLGlCQUFpQjs7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
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["PROJECT_FILE","getModuleRoot","_","memoize","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","_fs","existsSync","JSON","parse","readFileSync","name","ign","length","Error","BOOTSTRAP_PATH","getPIDsUsingPattern","pattern","args","stdout","exec","split","map","x","parseInt","filter","isInteger","err","log","debug","code","killAppUsingPattern","pgrepPattern","signals","signal","matchedPids","isEmpty","message","last","waitForCondition","pidCheckPromises","pid","then","catch","B","all","every","waitMs","intervalMs","isTvOS","platformName","toLower","PLATFORM_NAME_TVOS","replaceInFile","file","find","replace","contents","fs","readFile","newContents","writeFile","updateProjectFile","agentPath","newBundleId","projectFilePath","copyFile","RegExp","escapeRegExp","WDA_RUNNER_BUNDLE_ID","warn","resetProjectFile","exists","mv","setRealDeviceSecurity","keychainPath","keychainPassword","generateXcodeConfigFile","orgId","signingId","xcconfigPath","tempDir","setXctestrunFile","deviceInfo","sdkVersion","bootstrapPath","wdaRemotePort","xctestrunFilePath","getXctestrunFilePath","xctestRunContent","plist","parsePlistFile","updateWDAPort","getAdditionalRunContent","newXctestRunContent","merge","updatePlistFile","runner","EnvironmentVariables","USE_PORT","sdkBased","udid","platformBased","platformVersion","filePath","version","info","originalXctestrunFile","getXctestrunFileName","errorAndThrow","isRealDevice","killProcess","proc","isRunning","stop","includes","randomInt","low","high","Math","floor","random","getWDAUpgradeTimestamp","packageManifest","mtime","stat","getTime","resetTestProcesses","isSimulator","processPatterns","push","getPIDsListeningOnPort","port","filteringFunc","result","trim","e","stderr","isFunction"],"sources":["../../lib/utils.js"],"sourcesContent":["import { fs, tempDir, plist } from 'appium/support';\nimport { exec } from 'teen_process';\nimport path from 'path';\nimport log from './logger';\nimport _ from 'lodash';\nimport { WDA_RUNNER_BUNDLE_ID, PLATFORM_NAME_TVOS } from './constants';\nimport B from 'bluebird';\nimport _fs from 'fs';\nimport { waitForCondition } from 'asyncbox';\n\nconst PROJECT_FILE = 'project.pbxproj';\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 let currentDir = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(currentDir, 'package.json');\n try {\n if (_fs.existsSync(manifestPath) &&\n JSON.parse(_fs.readFileSync(manifestPath, 'utf8')).name === 'appium-webdriveragent') {\n return currentDir;\n }\n } catch (ign) {}\n currentDir = path.dirname(currentDir);\n isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;\n }\n throw new Error('Cannot find the root folder of the appium-webdriveragent Node.js module');\n});\n\nexport const BOOTSTRAP_PATH = getModuleRoot();\n\nasync function getPIDsUsingPattern (pattern) {\n const args = [\n '-if', // case insensitive, full cmdline match\n pattern,\n ];\n try {\n const {stdout} = await exec('pgrep', args);\n return stdout.split(/\\s+/)\n .map((x) => parseInt(x, 10))\n .filter(_.isInteger)\n .map((x) => `${x}`);\n } catch (err) {\n log.debug(`'pgrep ${args.join(' ')}' didn't detect any matching processes. Return code: ${err.code}`);\n return [];\n }\n}\n\nasync function killAppUsingPattern (pgrepPattern) {\n const signals = [2, 15, 9];\n for (const signal of signals) {\n const matchedPids = await getPIDsUsingPattern(pgrepPattern);\n if (_.isEmpty(matchedPids)) {\n return;\n }\n const args = [`-${signal}`, ...matchedPids];\n try {\n await exec('kill', args);\n } catch (err) {\n log.debug(`kill ${args.join(' ')} -> ${err.message}`);\n }\n if (signal === _.last(signals)) {\n // there is no need to wait after SIGKILL\n return;\n }\n try {\n await waitForCondition(async () => {\n const pidCheckPromises = matchedPids\n .map((pid) => exec('kill', ['-0', pid])\n // the process is still alive\n .then(() => false)\n // the process is dead\n .catch(() => true)\n );\n return (await B.all(pidCheckPromises))\n .every((x) => x === true);\n }, {\n waitMs: 1000,\n intervalMs: 100,\n });\n return;\n } catch (ign) {\n // try the next signal\n }\n }\n}\n\n/**\n * Return true if the platformName is tvOS\n * @param {string} platformName The name of the platorm\n * @returns {boolean} Return true if the platformName is tvOS\n */\nfunction isTvOS (platformName) {\n return _.toLower(platformName) === _.toLower(PLATFORM_NAME_TVOS);\n}\n\nasync function replaceInFile (file, find, replace) {\n let contents = await fs.readFile(file, 'utf8');\n\n let newContents = contents.replace(find, replace);\n if (newContents !== contents) {\n await fs.writeFile(file, newContents, 'utf8');\n }\n}\n\n/**\n * Update WebDriverAgentRunner project bundle ID with newBundleId.\n * This method assumes project file is in the correct state.\n * @param {string} agentPath - Path to the .xcodeproj directory.\n * @param {string} newBundleId the new bundle ID used to update.\n */\nasync function updateProjectFile (agentPath, newBundleId) {\n let projectFilePath = path.resolve(agentPath, PROJECT_FILE);\n try {\n // Assuming projectFilePath is in the correct state, create .old from projectFilePath\n await fs.copyFile(projectFilePath, `${projectFilePath}.old`);\n await replaceInFile(projectFilePath, new RegExp(_.escapeRegExp(WDA_RUNNER_BUNDLE_ID), 'g'), newBundleId); // eslint-disable-line no-useless-escape\n log.debug(`Successfully updated '${projectFilePath}' with bundle id '${newBundleId}'`);\n } catch (err) {\n log.debug(`Error updating project file: ${err.message}`);\n log.warn(`Unable to update project file '${projectFilePath}' with ` +\n `bundle id '${newBundleId}'. WebDriverAgent may not start`);\n }\n}\n\n/**\n * Reset WebDriverAgentRunner project bundle ID to correct state.\n * @param {string} agentPath - Path to the .xcodeproj directory.\n */\nasync function resetProjectFile (agentPath) {\n const projectFilePath = path.join(agentPath, PROJECT_FILE);\n try {\n // restore projectFilePath from .old file\n if (!await fs.exists(`${projectFilePath}.old`)) {\n return; // no need to reset\n }\n await fs.mv(`${projectFilePath}.old`, projectFilePath);\n log.debug(`Successfully reset '${projectFilePath}' with bundle id '${WDA_RUNNER_BUNDLE_ID}'`);\n } catch (err) {\n log.debug(`Error resetting project file: ${err.message}`);\n log.warn(`Unable to reset project file '${projectFilePath}' with ` +\n `bundle id '${WDA_RUNNER_BUNDLE_ID}'. WebDriverAgent has been ` +\n `modified and not returned to the original state.`);\n }\n}\n\nasync function setRealDeviceSecurity (keychainPath, keychainPassword) {\n log.debug('Setting security for iOS device');\n await exec('security', ['-v', 'list-keychains', '-s', keychainPath]);\n await exec('security', ['-v', 'unlock-keychain', '-p', keychainPassword, keychainPath]);\n await exec('security', ['set-keychain-settings', '-t', '3600', '-l', keychainPath]);\n}\n\nasync function generateXcodeConfigFile (orgId, signingId) {\n log.debug(`Generating xcode config file for orgId '${orgId}' and signingId ` +\n `'${signingId}'`);\n const contents = `DEVELOPMENT_TEAM = ${orgId}\nCODE_SIGN_IDENTITY = ${signingId}\n`;\n const xcconfigPath = await tempDir.path('appium-temp.xcconfig');\n log.debug(`Writing xcode config file to ${xcconfigPath}`);\n await fs.writeFile(xcconfigPath, contents, 'utf8');\n return xcconfigPath;\n}\n\n/**\n * Information of the device under test\n * @typedef {Object} DeviceInfo\n * @property {string} isRealDevice - Equals to true if the current device is a real device\n * @property {string} udid - The device UDID.\n * @property {string} platformVersion - The platform version of OS.\n * @property {string} platformName - The platform name of iOS, tvOS\n*/\n/**\n * Creates xctestrun file per device & platform version.\n * We expects to have WebDriverAgentRunner_iphoneos${sdkVersion|platformVersion}-arm64.xctestrun for real device\n * and WebDriverAgentRunner_iphonesimulator${sdkVersion|platformVersion}-x86_64.xctestrun for simulator located @bootstrapPath\n * Newer Xcode (Xcode 10.0 at least) generate xctestrun file following sdkVersion.\n * e.g. Xcode which has iOS SDK Version 12.2 generate WebDriverAgentRunner_iphonesimulator.2-x86_64.xctestrun\n * even if the cap has platform version 11.4\n *\n * @param {DeviceInfo} deviceInfo\n * @param {string} sdkVersion - The Xcode SDK version of OS.\n * @param {string} bootstrapPath - The folder path containing xctestrun file.\n * @param {string} wdaRemotePort - The remote port WDA is listening on.\n * @return {string} returns xctestrunFilePath for given device\n * @throws if WebDriverAgentRunner_iphoneos${sdkVersion|platformVersion}-arm64.xctestrun for real device\n * or WebDriverAgentRunner_iphonesimulator${sdkVersion|platformVersion}-x86_64.xctestrun for simulator is not found @bootstrapPath,\n * then it will throw file not found exception\n */\nasync function setXctestrunFile (deviceInfo, sdkVersion, bootstrapPath, wdaRemotePort) {\n const xctestrunFilePath = await getXctestrunFilePath(deviceInfo, sdkVersion, bootstrapPath);\n const xctestRunContent = await plist.parsePlistFile(xctestrunFilePath);\n const updateWDAPort = getAdditionalRunContent(deviceInfo.platformName, wdaRemotePort);\n const newXctestRunContent = _.merge(xctestRunContent, updateWDAPort);\n await plist.updatePlistFile(xctestrunFilePath, newXctestRunContent, true);\n\n return xctestrunFilePath;\n}\n\n/**\n * Return the WDA object which appends existing xctest runner content\n * @param {string} platformName - The name of the platform\n * @param {string} version - The Xcode SDK version of OS.\n * @return {object} returns a runner object which has USE_PORT\n */\nfunction getAdditionalRunContent (platformName, wdaRemotePort) {\n const runner = `WebDriverAgentRunner${isTvOS(platformName) ? '_tvOS' : ''}`;\n\n return {\n [runner]: {\n EnvironmentVariables: {\n // USE_PORT must be 'string'\n USE_PORT: `${wdaRemotePort}`\n }\n }\n };\n}\n\n/**\n * Return the path of xctestrun if it exists\n * @param {DeviceInfo} deviceInfo\n * @param {string} sdkVersion - The Xcode SDK version of OS.\n * @param {string} bootstrapPath - The folder path containing xctestrun file.\n */\nasync function getXctestrunFilePath (deviceInfo, sdkVersion, bootstrapPath) {\n // First try the SDK path, for Xcode 10 (at least)\n const sdkBased = [\n path.resolve(bootstrapPath, `${deviceInfo.udid}_${sdkVersion}.xctestrun`),\n sdkVersion,\n ];\n // Next try Platform path, for earlier Xcode versions\n const platformBased = [\n path.resolve(bootstrapPath, `${deviceInfo.udid}_${deviceInfo.platformVersion}.xctestrun`),\n deviceInfo.platformVersion,\n ];\n\n for (const [filePath, version] of [sdkBased, platformBased]) {\n if (await fs.exists(filePath)) {\n log.info(`Using '${filePath}' as xctestrun file`);\n return filePath;\n }\n const originalXctestrunFile = path.resolve(bootstrapPath, getXctestrunFileName(deviceInfo, version));\n if (await fs.exists(originalXctestrunFile)) {\n // If this is first time run for given device, then first generate xctestrun file for device.\n // We need to have a xctestrun file **per device** because we cant not have same wda port for all devices.\n await fs.copyFile(originalXctestrunFile, filePath);\n log.info(`Using '${filePath}' as xctestrun file copied by '${originalXctestrunFile}'`);\n return filePath;\n }\n }\n\n log.errorAndThrow(`If you are using 'useXctestrunFile' capability then you ` +\n `need to have a xctestrun file (expected: ` +\n `'${path.resolve(bootstrapPath, getXctestrunFileName(deviceInfo, sdkVersion))}')`);\n}\n\n\n/**\n * Return the name of xctestrun file\n * @param {DeviceInfo} deviceInfo\n * @param {string} version - The Xcode SDK version of OS.\n * @return {string} returns xctestrunFilePath for given device\n */\nfunction getXctestrunFileName (deviceInfo, version) {\n return isTvOS(deviceInfo.platformName)\n ? `WebDriverAgentRunner_tvOS_appletv${deviceInfo.isRealDevice ? `os${version}-arm64` : `simulator${version}-x86_64`}.xctestrun`\n : `WebDriverAgentRunner_iphone${deviceInfo.isRealDevice ? `os${version}-arm64` : `simulator${version}-x86_64`}.xctestrun`;\n}\n\nasync function killProcess (name, proc) {\n if (!proc || !proc.isRunning) {\n return;\n }\n\n log.info(`Shutting down '${name}' process (pid '${proc.proc.pid}')`);\n\n log.info(`Sending 'SIGTERM'...`);\n try {\n await proc.stop('SIGTERM', 1000);\n return;\n } catch (err) {\n if (!err.message.includes(`Process didn't end after`)) {\n throw err;\n }\n log.debug(`${name} process did not end in a timely fashion: '${err.message}'.`);\n }\n\n log.info(`Sending 'SIGKILL'...`);\n try {\n await proc.stop('SIGKILL');\n } catch (err) {\n if (err.message.includes('not currently running')) {\n // the process ended but for some reason we were not informed\n return;\n }\n throw err;\n }\n}\n\n/**\n * Generate a random integer.\n *\n * @return {number} A random integer number in range [low, hight). `low`` is inclusive and `high` is exclusive.\n */\nfunction randomInt (low, high) {\n return Math.floor(Math.random() * (high - low) + low);\n}\n\n/**\n * Retrieves WDA upgrade timestamp\n *\n * @return {?number} The UNIX timestamp of the package manifest. The manifest only gets modified on\n * package upgrade.\n */\nasync function getWDAUpgradeTimestamp () {\n const packageManifest = path.resolve(getModuleRoot(), 'package.json');\n if (!await fs.exists(packageManifest)) {\n return null;\n }\n const {mtime} = await fs.stat(packageManifest);\n return mtime.getTime();\n}\n\n/**\n * Kills running XCTest processes for the particular device.\n *\n * @param {string} udid - The device UDID.\n * @param {boolean} isSimulator - Equals to true if the current device is a Simulator\n */\nasync function resetTestProcesses (udid, isSimulator) {\n const processPatterns = [`xcodebuild.*${udid}`];\n if (isSimulator) {\n processPatterns.push(`${udid}.*XCTRunner`);\n // The pattern to find in case idb was used\n processPatterns.push(`xctest.*${udid}`);\n }\n log.debug(`Killing running processes '${processPatterns.join(', ')}' for the device ${udid}...`);\n await B.all(processPatterns.map(killAppUsingPattern));\n}\n\n/**\n * Get the IDs of processes listening on the particular system port.\n * It is also possible to apply additional filtering based on the\n * process command line.\n *\n * @param {string|number} port - The port number.\n * @param {?Function} filteringFunc - Optional lambda function, which\n * receives command line string of the particular process\n * listening on given port, and is expected to return\n * either true or false to include/exclude the corresponding PID\n * from the resulting array.\n * @returns {Array<string>} - the list of matched process ids.\n */\nasync function getPIDsListeningOnPort (port, filteringFunc = null) {\n const result = [];\n try {\n // This only works since Mac OS X El Capitan\n const {stdout} = await exec('lsof', ['-ti', `tcp:${port}`]);\n result.push(...(stdout.trim().split(/\\n+/)));\n } catch (e) {\n if (e.code !== 1) {\n // code 1 means no processes. Other errors need reporting\n log.debug(`Error getting processes listening on port '${port}': ${e.stderr || e.message}`);\n }\n return result;\n }\n\n if (!_.isFunction(filteringFunc)) {\n return result;\n }\n return await B.filter(result, async (pid) => {\n let stdout;\n try {\n ({stdout} = await exec('ps', ['-p', pid, '-o', 'command']));\n } catch (e) {\n if (e.code === 1) {\n // The process does not exist anymore, there's nothing to filter\n return false;\n }\n throw e;\n }\n return await filteringFunc(stdout);\n });\n}\n\nexport { updateProjectFile, resetProjectFile, setRealDeviceSecurity,\n getAdditionalRunContent, getXctestrunFileName, generateXcodeConfigFile,\n setXctestrunFile, getXctestrunFilePath, killProcess, randomInt,\n getWDAUpgradeTimestamp, resetTestProcesses,\n getPIDsListeningOnPort, killAppUsingPattern, isTvOS\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":["PROJECT_FILE","getModuleRoot","_","memoize","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","_fs","existsSync","JSON","parse","readFileSync","name","ign","length","Error","BOOTSTRAP_PATH","getPIDsUsingPattern","pattern","args","stdout","exec","split","map","x","parseInt","filter","isInteger","err","log","debug","code","killAppUsingPattern","pgrepPattern","signals","signal","matchedPids","isEmpty","message","last","waitForCondition","pidCheckPromises","pid","then","catch","B","all","every","waitMs","intervalMs","isTvOS","platformName","toLower","PLATFORM_NAME_TVOS","replaceInFile","file","find","replace","contents","fs","readFile","newContents","writeFile","updateProjectFile","agentPath","newBundleId","projectFilePath","copyFile","RegExp","escapeRegExp","WDA_RUNNER_BUNDLE_ID","warn","resetProjectFile","exists","mv","setRealDeviceSecurity","keychainPath","keychainPassword","generateXcodeConfigFile","orgId","signingId","xcconfigPath","tempDir","setXctestrunFile","deviceInfo","sdkVersion","bootstrapPath","wdaRemotePort","xctestrunFilePath","getXctestrunFilePath","xctestRunContent","plist","parsePlistFile","updateWDAPort","getAdditionalRunContent","newXctestRunContent","merge","updatePlistFile","runner","EnvironmentVariables","USE_PORT","sdkBased","udid","platformBased","platformVersion","filePath","version","info","originalXctestrunFile","getXctestrunFileName","errorAndThrow","isRealDevice","killProcess","proc","isRunning","stop","includes","randomInt","low","high","Math","floor","random","getWDAUpgradeTimestamp","packageManifest","mtime","stat","getTime","resetTestProcesses","isSimulator","processPatterns","push","getPIDsListeningOnPort","port","filteringFunc","result","trim","e","stderr","isFunction"],"sources":["../../lib/utils.js"],"sourcesContent":["import { fs, tempDir, plist } from '@appium/support';\nimport { exec } from 'teen_process';\nimport path from 'path';\nimport log from './logger';\nimport _ from 'lodash';\nimport { WDA_RUNNER_BUNDLE_ID, PLATFORM_NAME_TVOS } from './constants';\nimport B from 'bluebird';\nimport _fs from 'fs';\nimport { waitForCondition } from 'asyncbox';\n\nconst PROJECT_FILE = 'project.pbxproj';\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 let currentDir = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(currentDir, 'package.json');\n try {\n if (_fs.existsSync(manifestPath) &&\n JSON.parse(_fs.readFileSync(manifestPath, 'utf8')).name === 'appium-webdriveragent') {\n return currentDir;\n }\n } catch (ign) {}\n currentDir = path.dirname(currentDir);\n isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;\n }\n throw new Error('Cannot find the root folder of the appium-webdriveragent Node.js module');\n});\n\nexport const BOOTSTRAP_PATH = getModuleRoot();\n\nasync function getPIDsUsingPattern (pattern) {\n const args = [\n '-if', // case insensitive, full cmdline match\n pattern,\n ];\n try {\n const {stdout} = await exec('pgrep', args);\n return stdout.split(/\\s+/)\n .map((x) => parseInt(x, 10))\n .filter(_.isInteger)\n .map((x) => `${x}`);\n } catch (err) {\n log.debug(`'pgrep ${args.join(' ')}' didn't detect any matching processes. Return code: ${err.code}`);\n return [];\n }\n}\n\nasync function killAppUsingPattern (pgrepPattern) {\n const signals = [2, 15, 9];\n for (const signal of signals) {\n const matchedPids = await getPIDsUsingPattern(pgrepPattern);\n if (_.isEmpty(matchedPids)) {\n return;\n }\n const args = [`-${signal}`, ...matchedPids];\n try {\n await exec('kill', args);\n } catch (err) {\n log.debug(`kill ${args.join(' ')} -> ${err.message}`);\n }\n if (signal === _.last(signals)) {\n // there is no need to wait after SIGKILL\n return;\n }\n try {\n await waitForCondition(async () => {\n const pidCheckPromises = matchedPids\n .map((pid) => exec('kill', ['-0', pid])\n // the process is still alive\n .then(() => false)\n // the process is dead\n .catch(() => true)\n );\n return (await B.all(pidCheckPromises))\n .every((x) => x === true);\n }, {\n waitMs: 1000,\n intervalMs: 100,\n });\n return;\n } catch (ign) {\n // try the next signal\n }\n }\n}\n\n/**\n * Return true if the platformName is tvOS\n * @param {string} platformName The name of the platorm\n * @returns {boolean} Return true if the platformName is tvOS\n */\nfunction isTvOS (platformName) {\n return _.toLower(platformName) === _.toLower(PLATFORM_NAME_TVOS);\n}\n\nasync function replaceInFile (file, find, replace) {\n let contents = await fs.readFile(file, 'utf8');\n\n let newContents = contents.replace(find, replace);\n if (newContents !== contents) {\n await fs.writeFile(file, newContents, 'utf8');\n }\n}\n\n/**\n * Update WebDriverAgentRunner project bundle ID with newBundleId.\n * This method assumes project file is in the correct state.\n * @param {string} agentPath - Path to the .xcodeproj directory.\n * @param {string} newBundleId the new bundle ID used to update.\n */\nasync function updateProjectFile (agentPath, newBundleId) {\n let projectFilePath = path.resolve(agentPath, PROJECT_FILE);\n try {\n // Assuming projectFilePath is in the correct state, create .old from projectFilePath\n await fs.copyFile(projectFilePath, `${projectFilePath}.old`);\n await replaceInFile(projectFilePath, new RegExp(_.escapeRegExp(WDA_RUNNER_BUNDLE_ID), 'g'), newBundleId); // eslint-disable-line no-useless-escape\n log.debug(`Successfully updated '${projectFilePath}' with bundle id '${newBundleId}'`);\n } catch (err) {\n log.debug(`Error updating project file: ${err.message}`);\n log.warn(`Unable to update project file '${projectFilePath}' with ` +\n `bundle id '${newBundleId}'. WebDriverAgent may not start`);\n }\n}\n\n/**\n * Reset WebDriverAgentRunner project bundle ID to correct state.\n * @param {string} agentPath - Path to the .xcodeproj directory.\n */\nasync function resetProjectFile (agentPath) {\n const projectFilePath = path.join(agentPath, PROJECT_FILE);\n try {\n // restore projectFilePath from .old file\n if (!await fs.exists(`${projectFilePath}.old`)) {\n return; // no need to reset\n }\n await fs.mv(`${projectFilePath}.old`, projectFilePath);\n log.debug(`Successfully reset '${projectFilePath}' with bundle id '${WDA_RUNNER_BUNDLE_ID}'`);\n } catch (err) {\n log.debug(`Error resetting project file: ${err.message}`);\n log.warn(`Unable to reset project file '${projectFilePath}' with ` +\n `bundle id '${WDA_RUNNER_BUNDLE_ID}'. WebDriverAgent has been ` +\n `modified and not returned to the original state.`);\n }\n}\n\nasync function setRealDeviceSecurity (keychainPath, keychainPassword) {\n log.debug('Setting security for iOS device');\n await exec('security', ['-v', 'list-keychains', '-s', keychainPath]);\n await exec('security', ['-v', 'unlock-keychain', '-p', keychainPassword, keychainPath]);\n await exec('security', ['set-keychain-settings', '-t', '3600', '-l', keychainPath]);\n}\n\nasync function generateXcodeConfigFile (orgId, signingId) {\n log.debug(`Generating xcode config file for orgId '${orgId}' and signingId ` +\n `'${signingId}'`);\n const contents = `DEVELOPMENT_TEAM = ${orgId}\nCODE_SIGN_IDENTITY = ${signingId}\n`;\n const xcconfigPath = await tempDir.path('appium-temp.xcconfig');\n log.debug(`Writing xcode config file to ${xcconfigPath}`);\n await fs.writeFile(xcconfigPath, contents, 'utf8');\n return xcconfigPath;\n}\n\n/**\n * Information of the device under test\n * @typedef {Object} DeviceInfo\n * @property {string} isRealDevice - Equals to true if the current device is a real device\n * @property {string} udid - The device UDID.\n * @property {string} platformVersion - The platform version of OS.\n * @property {string} platformName - The platform name of iOS, tvOS\n*/\n/**\n * Creates xctestrun file per device & platform version.\n * We expects to have WebDriverAgentRunner_iphoneos${sdkVersion|platformVersion}-arm64.xctestrun for real device\n * and WebDriverAgentRunner_iphonesimulator${sdkVersion|platformVersion}-x86_64.xctestrun for simulator located @bootstrapPath\n * Newer Xcode (Xcode 10.0 at least) generate xctestrun file following sdkVersion.\n * e.g. Xcode which has iOS SDK Version 12.2 generate WebDriverAgentRunner_iphonesimulator.2-x86_64.xctestrun\n * even if the cap has platform version 11.4\n *\n * @param {DeviceInfo} deviceInfo\n * @param {string} sdkVersion - The Xcode SDK version of OS.\n * @param {string} bootstrapPath - The folder path containing xctestrun file.\n * @param {string} wdaRemotePort - The remote port WDA is listening on.\n * @return {string} returns xctestrunFilePath for given device\n * @throws if WebDriverAgentRunner_iphoneos${sdkVersion|platformVersion}-arm64.xctestrun for real device\n * or WebDriverAgentRunner_iphonesimulator${sdkVersion|platformVersion}-x86_64.xctestrun for simulator is not found @bootstrapPath,\n * then it will throw file not found exception\n */\nasync function setXctestrunFile (deviceInfo, sdkVersion, bootstrapPath, wdaRemotePort) {\n const xctestrunFilePath = await getXctestrunFilePath(deviceInfo, sdkVersion, bootstrapPath);\n const xctestRunContent = await plist.parsePlistFile(xctestrunFilePath);\n const updateWDAPort = getAdditionalRunContent(deviceInfo.platformName, wdaRemotePort);\n const newXctestRunContent = _.merge(xctestRunContent, updateWDAPort);\n await plist.updatePlistFile(xctestrunFilePath, newXctestRunContent, true);\n\n return xctestrunFilePath;\n}\n\n/**\n * Return the WDA object which appends existing xctest runner content\n * @param {string} platformName - The name of the platform\n * @param {string} version - The Xcode SDK version of OS.\n * @return {object} returns a runner object which has USE_PORT\n */\nfunction getAdditionalRunContent (platformName, wdaRemotePort) {\n const runner = `WebDriverAgentRunner${isTvOS(platformName) ? '_tvOS' : ''}`;\n\n return {\n [runner]: {\n EnvironmentVariables: {\n // USE_PORT must be 'string'\n USE_PORT: `${wdaRemotePort}`\n }\n }\n };\n}\n\n/**\n * Return the path of xctestrun if it exists\n * @param {DeviceInfo} deviceInfo\n * @param {string} sdkVersion - The Xcode SDK version of OS.\n * @param {string} bootstrapPath - The folder path containing xctestrun file.\n */\nasync function getXctestrunFilePath (deviceInfo, sdkVersion, bootstrapPath) {\n // First try the SDK path, for Xcode 10 (at least)\n const sdkBased = [\n path.resolve(bootstrapPath, `${deviceInfo.udid}_${sdkVersion}.xctestrun`),\n sdkVersion,\n ];\n // Next try Platform path, for earlier Xcode versions\n const platformBased = [\n path.resolve(bootstrapPath, `${deviceInfo.udid}_${deviceInfo.platformVersion}.xctestrun`),\n deviceInfo.platformVersion,\n ];\n\n for (const [filePath, version] of [sdkBased, platformBased]) {\n if (await fs.exists(filePath)) {\n log.info(`Using '${filePath}' as xctestrun file`);\n return filePath;\n }\n const originalXctestrunFile = path.resolve(bootstrapPath, getXctestrunFileName(deviceInfo, version));\n if (await fs.exists(originalXctestrunFile)) {\n // If this is first time run for given device, then first generate xctestrun file for device.\n // We need to have a xctestrun file **per device** because we cant not have same wda port for all devices.\n await fs.copyFile(originalXctestrunFile, filePath);\n log.info(`Using '${filePath}' as xctestrun file copied by '${originalXctestrunFile}'`);\n return filePath;\n }\n }\n\n log.errorAndThrow(`If you are using 'useXctestrunFile' capability then you ` +\n `need to have a xctestrun file (expected: ` +\n `'${path.resolve(bootstrapPath, getXctestrunFileName(deviceInfo, sdkVersion))}')`);\n}\n\n\n/**\n * Return the name of xctestrun file\n * @param {DeviceInfo} deviceInfo\n * @param {string} version - The Xcode SDK version of OS.\n * @return {string} returns xctestrunFilePath for given device\n */\nfunction getXctestrunFileName (deviceInfo, version) {\n return isTvOS(deviceInfo.platformName)\n ? `WebDriverAgentRunner_tvOS_appletv${deviceInfo.isRealDevice ? `os${version}-arm64` : `simulator${version}-x86_64`}.xctestrun`\n : `WebDriverAgentRunner_iphone${deviceInfo.isRealDevice ? `os${version}-arm64` : `simulator${version}-x86_64`}.xctestrun`;\n}\n\nasync function killProcess (name, proc) {\n if (!proc || !proc.isRunning) {\n return;\n }\n\n log.info(`Shutting down '${name}' process (pid '${proc.proc.pid}')`);\n\n log.info(`Sending 'SIGTERM'...`);\n try {\n await proc.stop('SIGTERM', 1000);\n return;\n } catch (err) {\n if (!err.message.includes(`Process didn't end after`)) {\n throw err;\n }\n log.debug(`${name} process did not end in a timely fashion: '${err.message}'.`);\n }\n\n log.info(`Sending 'SIGKILL'...`);\n try {\n await proc.stop('SIGKILL');\n } catch (err) {\n if (err.message.includes('not currently running')) {\n // the process ended but for some reason we were not informed\n return;\n }\n throw err;\n }\n}\n\n/**\n * Generate a random integer.\n *\n * @return {number} A random integer number in range [low, hight). `low`` is inclusive and `high` is exclusive.\n */\nfunction randomInt (low, high) {\n return Math.floor(Math.random() * (high - low) + low);\n}\n\n/**\n * Retrieves WDA upgrade timestamp\n *\n * @return {?number} The UNIX timestamp of the package manifest. The manifest only gets modified on\n * package upgrade.\n */\nasync function getWDAUpgradeTimestamp () {\n const packageManifest = path.resolve(getModuleRoot(), 'package.json');\n if (!await fs.exists(packageManifest)) {\n return null;\n }\n const {mtime} = await fs.stat(packageManifest);\n return mtime.getTime();\n}\n\n/**\n * Kills running XCTest processes for the particular device.\n *\n * @param {string} udid - The device UDID.\n * @param {boolean} isSimulator - Equals to true if the current device is a Simulator\n */\nasync function resetTestProcesses (udid, isSimulator) {\n const processPatterns = [`xcodebuild.*${udid}`];\n if (isSimulator) {\n processPatterns.push(`${udid}.*XCTRunner`);\n // The pattern to find in case idb was used\n processPatterns.push(`xctest.*${udid}`);\n }\n log.debug(`Killing running processes '${processPatterns.join(', ')}' for the device ${udid}...`);\n await B.all(processPatterns.map(killAppUsingPattern));\n}\n\n/**\n * Get the IDs of processes listening on the particular system port.\n * It is also possible to apply additional filtering based on the\n * process command line.\n *\n * @param {string|number} port - The port number.\n * @param {?Function} filteringFunc - Optional lambda function, which\n * receives command line string of the particular process\n * listening on given port, and is expected to return\n * either true or false to include/exclude the corresponding PID\n * from the resulting array.\n * @returns {Array<string>} - the list of matched process ids.\n */\nasync function getPIDsListeningOnPort (port, filteringFunc = null) {\n const result = [];\n try {\n // This only works since Mac OS X El Capitan\n const {stdout} = await exec('lsof', ['-ti', `tcp:${port}`]);\n result.push(...(stdout.trim().split(/\\n+/)));\n } catch (e) {\n if (e.code !== 1) {\n // code 1 means no processes. Other errors need reporting\n log.debug(`Error getting processes listening on port '${port}': ${e.stderr || e.message}`);\n }\n return result;\n }\n\n if (!_.isFunction(filteringFunc)) {\n return result;\n }\n return await B.filter(result, async (pid) => {\n let stdout;\n try {\n ({stdout} = await exec('ps', ['-p', pid, '-o', 'command']));\n } catch (e) {\n if (e.code === 1) {\n // The process does not exist anymore, there's nothing to filter\n return false;\n }\n throw e;\n }\n return await filteringFunc(stdout);\n });\n}\n\nexport { updateProjectFile, resetProjectFile, setRealDeviceSecurity,\n getAdditionalRunContent, getXctestrunFileName, generateXcodeConfigFile,\n setXctestrunFile, getXctestrunFilePath, killProcess, randomInt,\n getWDAUpgradeTimestamp, resetTestProcesses,\n getPIDsListeningOnPort, killAppUsingPattern, isTvOS\n};\n"],"mappings":"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"}