appium-xcode 3.7.1 → 3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.js CHANGED
@@ -1,22 +1,46 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
4
 
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- Object.defineProperty(exports, "xcode", {
9
- enumerable: true,
10
- get: function get() {
11
- return _xcode.default;
12
- }
13
- });
14
- exports.default = void 0;
8
+ exports.default = exports.getClangVersion = exports.getMaxTVOSSDKWithoutRetry = exports.getMaxTVOSSDK = exports.getCommandLineToolsVersion = exports.getInstrumentsPath = exports.clearInternalCache = exports.getConnectedDevices = exports.getMaxIOSSDKWithoutRetry = exports.getAutomationTraceTemplatePathWithoutRetry = exports.getMaxIOSSDK = exports.getAutomationTraceTemplatePath = exports.getVersion = exports.getPath = void 0;
9
+
10
+ require("source-map-support/register");
15
11
 
16
- var _xcode = _interopRequireDefault(require("./lib/xcode"));
12
+ var xcode = _interopRequireWildcard(require("./lib/xcode"));
17
13
 
18
- var _default = _xcode.default;
14
+ const {
15
+ getPath,
16
+ getVersion,
17
+ getAutomationTraceTemplatePath,
18
+ getMaxIOSSDK,
19
+ getAutomationTraceTemplatePathWithoutRetry,
20
+ getMaxIOSSDKWithoutRetry,
21
+ getConnectedDevices,
22
+ clearInternalCache,
23
+ getInstrumentsPath,
24
+ getCommandLineToolsVersion,
25
+ getMaxTVOSSDK,
26
+ getMaxTVOSSDKWithoutRetry,
27
+ getClangVersion
28
+ } = xcode;
29
+ exports.getClangVersion = getClangVersion;
30
+ exports.getMaxTVOSSDKWithoutRetry = getMaxTVOSSDKWithoutRetry;
31
+ exports.getMaxTVOSSDK = getMaxTVOSSDK;
32
+ exports.getCommandLineToolsVersion = getCommandLineToolsVersion;
33
+ exports.getInstrumentsPath = getInstrumentsPath;
34
+ exports.clearInternalCache = clearInternalCache;
35
+ exports.getConnectedDevices = getConnectedDevices;
36
+ exports.getMaxIOSSDKWithoutRetry = getMaxIOSSDKWithoutRetry;
37
+ exports.getAutomationTraceTemplatePathWithoutRetry = getAutomationTraceTemplatePathWithoutRetry;
38
+ exports.getMaxIOSSDK = getMaxIOSSDK;
39
+ exports.getAutomationTraceTemplatePath = getAutomationTraceTemplatePath;
40
+ exports.getVersion = getVersion;
41
+ exports.getPath = getPath;
42
+ var _default = xcode;
19
43
  exports.default = _default;require('source-map-support').install();
20
44
 
21
45
 
22
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbInhjb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFFQTs7ZUFHZUEsYyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5cbmltcG9ydCB4Y29kZSBmcm9tICcuL2xpYi94Y29kZSc7XG5cbmV4cG9ydCB7IHhjb2RlIH07XG5leHBvcnQgZGVmYXVsdCB4Y29kZTtcbiJdLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi4ifQ==
46
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImdldFBhdGgiLCJnZXRWZXJzaW9uIiwiZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoIiwiZ2V0TWF4SU9TU0RLIiwiZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5IiwiZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5IiwiZ2V0Q29ubmVjdGVkRGV2aWNlcyIsImNsZWFySW50ZXJuYWxDYWNoZSIsImdldEluc3RydW1lbnRzUGF0aCIsImdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uIiwiZ2V0TWF4VFZPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJnZXRDbGFuZ1ZlcnNpb24iLCJ4Y29kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFHQSxNQUFNO0FBQ0pBLEVBQUFBLE9BREk7QUFDS0MsRUFBQUEsVUFETDtBQUNpQkMsRUFBQUEsOEJBRGpCO0FBQ2lEQyxFQUFBQSxZQURqRDtBQUVKQyxFQUFBQSwwQ0FGSTtBQUV3Q0MsRUFBQUEsd0JBRnhDO0FBR0pDLEVBQUFBLG1CQUhJO0FBR2lCQyxFQUFBQSxrQkFIakI7QUFHcUNDLEVBQUFBLGtCQUhyQztBQUlKQyxFQUFBQSwwQkFKSTtBQUl3QkMsRUFBQUEsYUFKeEI7QUFJdUNDLEVBQUFBLHlCQUp2QztBQUtKQyxFQUFBQTtBQUxJLElBTUZDLEtBTko7Ozs7Ozs7Ozs7Ozs7O2VBZWVBLEsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyB4Y29kZSBmcm9tICcuL2xpYi94Y29kZSc7XG5cblxuY29uc3Qge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufSA9IHhjb2RlO1xuXG5leHBvcnQge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufTtcbmV4cG9ydCBkZWZhdWx0IHhjb2RlO1xuIl0sImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZVJvb3QiOiIuLiJ9
@@ -5,9 +5,17 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = void 0;
9
-
10
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+ exports.getVersion = getVersion;
9
+ exports.getAutomationTraceTemplatePathWithoutRetry = getAutomationTraceTemplatePathWithoutRetry;
10
+ exports.getMaxIOSSDKWithoutRetry = getMaxIOSSDKWithoutRetry;
11
+ exports.getConnectedDevices = getConnectedDevices;
12
+ exports.clearInternalCache = clearInternalCache;
13
+ exports.getCommandLineToolsVersion = getCommandLineToolsVersion;
14
+ exports.getMaxTVOSSDKWithoutRetry = getMaxTVOSSDKWithoutRetry;
15
+ exports.getClangVersion = getClangVersion;
16
+ exports.getMaxTVOSSDK = exports.getInstrumentsPath = exports.getMaxIOSSDK = exports.getAutomationTraceTemplatePath = exports.getPath = void 0;
17
+
18
+ require("source-map-support/register");
11
19
 
12
20
  var _appiumSupport = require("appium-support");
13
21
 
@@ -25,7 +33,7 @@ var _semver = _interopRequireDefault(require("semver"));
25
33
 
26
34
  const env = process.env;
27
35
  const XCRUN_TIMEOUT = 15000;
28
- const XCODE_SUBDIR = "/Contents/Developer";
36
+ const XCODE_SUBDIR = '/Contents/Developer';
29
37
  const DEFAULT_NUMBER_OF_RETRIES = 3;
30
38
 
31
39
  const log = _appiumSupport.logger.getLogger('Xcode');
@@ -34,340 +42,307 @@ function hasExpectedSubDir(path) {
34
42
  return path.substring(path.length - XCODE_SUBDIR.length) === XCODE_SUBDIR;
35
43
  }
36
44
 
37
- function runXcrunCommand(_x) {
38
- return _runXcrunCommand.apply(this, arguments);
39
- }
40
-
41
- function _runXcrunCommand() {
42
- _runXcrunCommand = (0, _asyncToGenerator2.default)(function* (args, timeout = XCRUN_TIMEOUT) {
43
- try {
44
- return yield (0, _teen_process.exec)('xcrun', args, {
45
- timeout
46
- });
47
- } catch (err) {
48
- if (err.stderr) {
49
- err.message = `${err.message}: ${err.stderr}`;
50
- }
51
-
52
- throw err;
53
- }
54
- });
55
- return _runXcrunCommand.apply(this, arguments);
56
- }
57
-
58
- function getPathFromSymlink(_x2) {
59
- return _getPathFromSymlink.apply(this, arguments);
60
- }
45
+ async function runXcrunCommand(args, timeout = XCRUN_TIMEOUT) {
46
+ try {
47
+ const res = await (0, _teen_process.exec)('xcrun', args, {
48
+ timeout
49
+ });
61
50
 
62
- function _getPathFromSymlink() {
63
- _getPathFromSymlink = (0, _asyncToGenerator2.default)(function* (failMessage) {
64
- log.warn(`Finding XcodePath by symlink because ${failMessage}`);
65
- const symlinkPath = "/var/db/xcode_select_link";
66
- const legacySymlinkPath = "/usr/share/xcode-select/xcode_dir_link";
67
- let xcodePath = null;
68
-
69
- if (_appiumSupport.util.hasContent(env.DEVELOPER_DIR)) {
70
- const customPath = hasExpectedSubDir(env.DEVELOPER_DIR) ? env.DEVELOPER_DIR : env.DEVELOPER_DIR + XCODE_SUBDIR;
71
-
72
- if (yield _appiumSupport.fs.exists(customPath)) {
73
- xcodePath = customPath;
74
- } else {
75
- let mesg = `Could not find path to Xcode, environment variable ` + `DEVELOPER_DIR set to: ${env.DEVELOPER_DIR} ` + `but no Xcode found`;
76
- log.warn(mesg);
77
- throw new Error(mesg);
78
- }
79
- } else if (yield _appiumSupport.fs.exists(symlinkPath)) {
80
- xcodePath = yield _appiumSupport.fs.readlink(symlinkPath);
81
- } else if (yield _appiumSupport.fs.exists(legacySymlinkPath)) {
82
- xcodePath = yield _appiumSupport.fs.readlink(legacySymlinkPath);
51
+ if (_lodash.default.isUndefined(res)) {
52
+ throw new Error(`Nothing returned from trying to run 'xcrun ${args.join(' ')}'`);
83
53
  }
84
54
 
85
- if (xcodePath) {
86
- return xcodePath.replace(new RegExp("/$"), "").trim();
55
+ return res;
56
+ } catch (err) {
57
+ if (err.stderr) {
58
+ err.message = `${err.message}: ${err.stderr}`;
87
59
  }
88
60
 
89
- let msg = `Could not find path to Xcode by symlinks located in ${symlinkPath}, or ${legacySymlinkPath}`;
90
- log.warn(msg);
91
- throw new Error(msg);
92
- });
93
- return _getPathFromSymlink.apply(this, arguments);
61
+ throw err;
62
+ }
94
63
  }
95
64
 
96
- function getPathFromXcodeSelect() {
97
- return _getPathFromXcodeSelect.apply(this, arguments);
98
- }
99
-
100
- function _getPathFromXcodeSelect() {
101
- _getPathFromXcodeSelect = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
102
- let _ref = yield (0, _teen_process.exec)('xcode-select', ['--print-path'], {
103
- timeout
104
- }),
105
- stdout = _ref.stdout;
106
-
107
- const xcodeFolderPath = stdout.replace(/\/$/, '').trim();
65
+ async function getPathFromSymlink(failMessage) {
66
+ log.warn(`Finding XcodePath by symlink because ${failMessage}`);
67
+ const symlinkPath = '/var/db/xcode_select_link';
68
+ const legacySymlinkPath = '/usr/share/xcode-select/xcode_dir_link';
69
+ let xcodePath = null;
108
70
 
109
- if (!_appiumSupport.util.hasContent(xcodeFolderPath)) {
110
- log.errorAndThrow('xcode-select returned an empty string');
111
- }
71
+ if (_appiumSupport.util.hasContent(env.DEVELOPER_DIR)) {
72
+ const customPath = hasExpectedSubDir(env.DEVELOPER_DIR) ? env.DEVELOPER_DIR : env.DEVELOPER_DIR + XCODE_SUBDIR;
112
73
 
113
- if (yield _appiumSupport.fs.exists(xcodeFolderPath)) {
114
- return xcodeFolderPath;
74
+ if (await _appiumSupport.fs.exists(customPath)) {
75
+ xcodePath = customPath;
115
76
  } else {
116
- const msg = `xcode-select could not find xcode. Path '${xcodeFolderPath}' does not exist.`;
117
- log.errorAndThrow(msg);
77
+ let mesg = `Could not find path to Xcode, environment variable ` + `DEVELOPER_DIR set to: ${env.DEVELOPER_DIR} ` + `but no Xcode found`;
78
+ log.warn(mesg);
79
+ throw new Error(mesg);
118
80
  }
81
+ } else if (await _appiumSupport.fs.exists(symlinkPath)) {
82
+ xcodePath = await _appiumSupport.fs.readlink(symlinkPath);
83
+ } else if (await _appiumSupport.fs.exists(legacySymlinkPath)) {
84
+ xcodePath = await _appiumSupport.fs.readlink(legacySymlinkPath);
85
+ }
86
+
87
+ if (xcodePath) {
88
+ return xcodePath.replace(new RegExp('/$'), '').trim();
89
+ }
90
+
91
+ let msg = `Could not find path to Xcode by symlinks located in ${symlinkPath}, or ${legacySymlinkPath}`;
92
+ log.warn(msg);
93
+ throw new Error(msg);
94
+ }
95
+
96
+ async function getPathFromXcodeSelect(timeout = XCRUN_TIMEOUT) {
97
+ let {
98
+ stdout
99
+ } = await (0, _teen_process.exec)('xcode-select', ['--print-path'], {
100
+ timeout
119
101
  });
120
- return _getPathFromXcodeSelect.apply(this, arguments);
102
+ const xcodeFolderPath = stdout.replace(/\/$/, '').trim();
103
+
104
+ if (!_appiumSupport.util.hasContent(xcodeFolderPath)) {
105
+ log.errorAndThrow('xcode-select returned an empty string');
106
+ }
107
+
108
+ if (await _appiumSupport.fs.exists(xcodeFolderPath)) {
109
+ return xcodeFolderPath;
110
+ } else {
111
+ const msg = `xcode-select could not find xcode. Path '${xcodeFolderPath}' does not exist.`;
112
+ log.errorAndThrow(msg);
113
+ }
121
114
  }
122
115
 
123
- const getPath = _lodash.default.memoize(function (timeout = XCRUN_TIMEOUT) {
116
+ const getPath = _lodash.default.memoize(function getPath(timeout = XCRUN_TIMEOUT) {
124
117
  return getPathFromXcodeSelect(timeout).catch(getPathFromSymlink);
125
118
  });
126
119
 
127
- function getVersionWithoutRetry() {
128
- return _getVersionWithoutRetry.apply(this, arguments);
129
- }
120
+ exports.getPath = getPath;
130
121
 
131
- function _getVersionWithoutRetry() {
132
- _getVersionWithoutRetry = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
133
- const xcodePath = yield getPath(timeout);
122
+ async function getVersionWithoutRetry(timeout = XCRUN_TIMEOUT) {
123
+ const xcodePath = await getPath(timeout);
134
124
 
135
- const plistPath = _path.default.resolve(xcodePath, "..", "Info.plist");
125
+ const plistPath = _path.default.resolve(xcodePath, '..', 'Info.plist');
136
126
 
137
- if (!(yield _appiumSupport.fs.exists(plistPath))) {
138
- throw new Error(`Could not get Xcode version. ${plistPath} does not exist on disk.`);
139
- }
127
+ if (!(await _appiumSupport.fs.exists(plistPath))) {
128
+ throw new Error(`Could not get Xcode version. ${plistPath} does not exist on disk.`);
129
+ }
140
130
 
141
- const version = yield _appiumSupport.plist.parsePlistFile(plistPath);
142
- return _semver.default.coerce(version.CFBundleShortVersionString);
143
- });
144
- return _getVersionWithoutRetry.apply(this, arguments);
131
+ const version = await _appiumSupport.plist.parsePlistFile(plistPath);
132
+ return _semver.default.coerce(version.CFBundleShortVersionString);
145
133
  }
146
134
 
147
- const getVersionMemoized = _lodash.default.memoize(function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
135
+ const getVersionMemoized = _lodash.default.memoize(function getVersionMemoized(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
148
136
  return (0, _asyncbox.retry)(retries, getVersionWithoutRetry, timeout);
149
137
  });
150
138
 
151
- function getVersion() {
152
- return _getVersion.apply(this, arguments);
153
- }
139
+ async function getVersion(parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
140
+ const version = await getVersionMemoized(retries, timeout);
141
+ const versionString = version.patch > 0 ? version.version : `${version.major}.${version.minor}`;
142
+
143
+ if (!parse) {
144
+ return versionString;
145
+ }
154
146
 
155
- function _getVersion() {
156
- _getVersion = (0, _asyncToGenerator2.default)(function* (parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
157
- const version = yield getVersionMemoized(retries, timeout);
158
- const versionString = version.patch > 0 ? version.version : `${version.major}.${version.minor}`;
147
+ return {
148
+ versionString,
149
+ versionFloat: parseFloat(versionString),
150
+ major: version.major,
151
+ minor: version.minor,
152
+ patch: version.patch > 0 ? version.patch : undefined,
159
153
 
160
- if (!parse) {
154
+ toString() {
161
155
  return versionString;
162
156
  }
163
157
 
164
- return {
165
- versionString,
166
- versionFloat: parseFloat(versionString),
167
- major: version.major,
168
- minor: version.minor,
169
- patch: version.patch > 0 ? version.patch : undefined
170
- };
171
- });
172
- return _getVersion.apply(this, arguments);
158
+ };
173
159
  }
174
160
 
175
- function getCommandLineToolsVersion() {
176
- return _getCommandLineToolsVersion.apply(this, arguments);
177
- }
161
+ async function getCommandLineToolsVersion() {
162
+ const getVersionFunctions = [async () => {
163
+ let pkg = (await (0, _teen_process.exec)('pkgutil', ['--pkgs=com.apple.pkg.DevSDK_.*'])).stdout;
164
+ return (await (0, _teen_process.exec)('pkgutil', [`--pkg-info=${pkg.trim()}`])).stdout;
165
+ }, async () => (await (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.CLTools_Executables`])).stdout, async () => (await (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.DeveloperToolsCLI`])).stdout];
166
+ let stdout;
178
167
 
179
- function _getCommandLineToolsVersion() {
180
- _getCommandLineToolsVersion = (0, _asyncToGenerator2.default)(function* () {
181
- const getVersionFunctions = [(0, _asyncToGenerator2.default)(function* () {
182
- let pkg = (yield (0, _teen_process.exec)('pkgutil', ['--pkgs=com.apple.pkg.DevSDK_.*'])).stdout;
183
- return (yield (0, _teen_process.exec)('pkgutil', [`--pkg-info=${pkg.trim()}`])).stdout;
184
- }), (0, _asyncToGenerator2.default)(function* () {
185
- return (yield (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.CLTools_Executables`])).stdout;
186
- }), (0, _asyncToGenerator2.default)(function* () {
187
- return (yield (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.DeveloperToolsCLI`])).stdout;
188
- })];
189
- let stdout;
190
-
191
- for (var _i = 0; _i < getVersionFunctions.length; _i++) {
192
- let getVersion = getVersionFunctions[_i];
193
-
194
- try {
195
- stdout = yield getVersion();
196
- break;
197
- } catch (ign) {
198
- stdout = '';
199
- }
168
+ for (let getVersion of getVersionFunctions) {
169
+ try {
170
+ stdout = await getVersion();
171
+ break;
172
+ } catch (ign) {
173
+ stdout = '';
200
174
  }
175
+ }
201
176
 
202
- let match = /^version: (.+)$/m.exec(stdout);
203
- return match ? match[1] : undefined;
204
- });
205
- return _getCommandLineToolsVersion.apply(this, arguments);
177
+ let match = /^version: (.+)$/m.exec(stdout);
178
+ return match ? match[1] : undefined;
206
179
  }
207
180
 
208
- function getAutomationTraceTemplatePathWithoutRetry() {
209
- return _getAutomationTraceTemplatePathWithoutRetry.apply(this, arguments);
181
+ async function getClangVersion() {
182
+ try {
183
+ await _appiumSupport.fs.which('clang');
184
+ } catch (e) {
185
+ log.info('Cannot find clang executable on the local system. ' + 'Are Xcode Command Line Tools installed?');
186
+ return null;
187
+ }
188
+
189
+ const {
190
+ stdout
191
+ } = await (0, _teen_process.exec)('clang', ['--version']);
192
+ const match = /clang-([0-9.]+)/.exec(stdout);
193
+
194
+ if (!match) {
195
+ log.info(`Cannot parse clang version from ${stdout}`);
196
+ return null;
197
+ }
198
+
199
+ return match[1];
210
200
  }
211
201
 
212
- function _getAutomationTraceTemplatePathWithoutRetry() {
213
- _getAutomationTraceTemplatePathWithoutRetry = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
214
- const xcodePath = yield getPath(timeout);
215
- const extensions = ['xrplugin', 'bundle'];
202
+ async function getAutomationTraceTemplatePathWithoutRetry(timeout = XCRUN_TIMEOUT) {
203
+ const xcodePath = await getPath(timeout);
204
+ const extensions = ['xrplugin', 'bundle'];
216
205
 
217
- const pathPrefix = _path.default.resolve(xcodePath, "../Applications/Instruments.app/Contents/PlugIns");
206
+ const pathPrefix = _path.default.resolve(xcodePath, '../Applications/Instruments.app/Contents/PlugIns');
218
207
 
219
- const pathSuffix = "Contents/Resources/Automation.tracetemplate";
220
- let automationTraceTemplatePaths = [_path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[0]}`, pathSuffix), _path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[1]}`, pathSuffix)];
208
+ const pathSuffix = 'Contents/Resources/Automation.tracetemplate';
209
+ let automationTraceTemplatePaths = [_path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[0]}`, pathSuffix), _path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[1]}`, pathSuffix)];
221
210
 
222
- if (yield _appiumSupport.fs.exists(automationTraceTemplatePaths[0])) {
223
- return automationTraceTemplatePaths[0];
224
- }
211
+ if (await _appiumSupport.fs.exists(automationTraceTemplatePaths[0])) {
212
+ return automationTraceTemplatePaths[0];
213
+ }
225
214
 
226
- if (yield _appiumSupport.fs.exists(automationTraceTemplatePaths[1])) {
227
- return automationTraceTemplatePaths[1];
228
- }
215
+ if (await _appiumSupport.fs.exists(automationTraceTemplatePaths[1])) {
216
+ return automationTraceTemplatePaths[1];
217
+ }
229
218
 
230
- const msg = "Could not find Automation.tracetemplate in any of the following" + `locations ${automationTraceTemplatePaths.toString()}`;
231
- log.error(msg);
232
- throw new Error(msg);
233
- });
234
- return _getAutomationTraceTemplatePathWithoutRetry.apply(this, arguments);
219
+ const msg = 'Could not find Automation.tracetemplate in any of the following' + `locations ${automationTraceTemplatePaths.toString()}`;
220
+ log.error(msg);
221
+ throw new Error(msg);
235
222
  }
236
223
 
237
- const getAutomationTraceTemplatePath = _lodash.default.memoize(function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
224
+ const getAutomationTraceTemplatePath = _lodash.default.memoize(function getAutomationTraceTemplatePath(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
238
225
  return (0, _asyncbox.retry)(retries, getAutomationTraceTemplatePathWithoutRetry, timeout);
239
226
  });
240
227
 
241
- function getMaxIOSSDKWithoutRetry() {
242
- return _getMaxIOSSDKWithoutRetry.apply(this, arguments);
243
- }
228
+ exports.getAutomationTraceTemplatePath = getAutomationTraceTemplatePath;
244
229
 
245
- function _getMaxIOSSDKWithoutRetry() {
246
- _getMaxIOSSDKWithoutRetry = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
247
- const version = yield getVersion(false, DEFAULT_NUMBER_OF_RETRIES, timeout);
230
+ async function getMaxIOSSDKWithoutRetry(timeout = XCRUN_TIMEOUT) {
231
+ const version = await getVersion(false, DEFAULT_NUMBER_OF_RETRIES, timeout);
248
232
 
249
- if (version[0] === '4') {
250
- return '6.1';
251
- }
233
+ if (version[0] === '4') {
234
+ return '6.1';
235
+ }
252
236
 
253
- const args = ['--sdk', 'iphonesimulator', '--show-sdk-version'];
237
+ const args = ['--sdk', 'iphonesimulator', '--show-sdk-version'];
238
+ const {
239
+ stdout
240
+ } = await runXcrunCommand(args, timeout);
241
+ const sdkVersion = stdout.trim();
242
+ const match = /\d.\d/.exec(stdout);
254
243
 
255
- const _ref5 = yield runXcrunCommand(args, timeout),
256
- stdout = _ref5.stdout;
257
-
258
- const sdkVersion = stdout.trim();
259
- const match = /\d.\d/.exec(stdout);
260
-
261
- if (!match) {
262
- throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);
263
- }
244
+ if (!match) {
245
+ throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);
246
+ }
264
247
 
265
- return sdkVersion;
266
- });
267
- return _getMaxIOSSDKWithoutRetry.apply(this, arguments);
248
+ return sdkVersion;
268
249
  }
269
250
 
270
- const getMaxIOSSDK = _lodash.default.memoize(function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
271
- return (0, _asyncbox.retry)(retries, getMaxIOSSDKWithoutRetry, timeout);
272
- });
273
-
274
- function getMaxTVOSSDKWithoutRetry() {
275
- return _getMaxTVOSSDKWithoutRetry.apply(this, arguments);
251
+ async function getMaxIOSSDKFromXcodeVersion(timeout = XCRUN_TIMEOUT) {
252
+ const version = await getVersion(true, DEFAULT_NUMBER_OF_RETRIES, timeout);
253
+ return `${version.major + 2}.${version.minor}`;
276
254
  }
277
255
 
278
- function _getMaxTVOSSDKWithoutRetry() {
279
- _getMaxTVOSSDKWithoutRetry = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
280
- const args = ['--sdk', 'appletvsimulator', '--show-sdk-version'];
256
+ const getMaxIOSSDK = _lodash.default.memoize(function getMaxIOSSDK(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
257
+ try {
258
+ return (0, _asyncbox.retry)(retries, getMaxIOSSDKWithoutRetry, timeout);
259
+ } catch (err) {
260
+ log.warn(`Unable to retrieve maximum iOS version: ${err.message}`);
261
+ log.warn('Guessing from Xcode version');
262
+ return getMaxIOSSDKFromXcodeVersion(timeout);
263
+ }
264
+ });
281
265
 
282
- const _ref6 = yield runXcrunCommand(args, timeout),
283
- stdout = _ref6.stdout;
266
+ exports.getMaxIOSSDK = getMaxIOSSDK;
284
267
 
285
- const sdkVersion = stdout.trim();
268
+ async function getMaxTVOSSDKWithoutRetry(timeout = XCRUN_TIMEOUT) {
269
+ const args = ['--sdk', 'appletvsimulator', '--show-sdk-version'];
270
+ const {
271
+ stdout
272
+ } = await runXcrunCommand(args, timeout);
273
+ const sdkVersion = stdout.trim();
286
274
 
287
- if (isNaN(parseFloat(sdkVersion))) {
288
- throw new Error(`xcrun returned a non-numeric tvOS SDK version: '${sdkVersion}'`);
289
- }
275
+ if (isNaN(parseFloat(sdkVersion))) {
276
+ throw new Error(`xcrun returned a non-numeric tvOS SDK version: '${sdkVersion}'`);
277
+ }
290
278
 
291
- return sdkVersion;
292
- });
293
- return _getMaxTVOSSDKWithoutRetry.apply(this, arguments);
279
+ return sdkVersion;
294
280
  }
295
281
 
296
- const getMaxTVOSSDK = _lodash.default.memoize(function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
282
+ const getMaxTVOSSDK = _lodash.default.memoize(function getMaxTVOSSDK(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
297
283
  return (0, _asyncbox.retry)(retries, getMaxTVOSSDKWithoutRetry, timeout);
298
284
  });
299
285
 
300
- function getConnectedDevices() {
301
- return _getConnectedDevices.apply(this, arguments);
302
- }
286
+ exports.getMaxTVOSSDK = getMaxTVOSSDK;
303
287
 
304
- function _getConnectedDevices() {
305
- _getConnectedDevices = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
306
- const cmd = '/usr/sbin/system_profiler';
307
- const args = ['-xml', 'SPUSBDataType'];
308
-
309
- let _ref7 = yield (0, _teen_process.exec)(cmd, args, {
310
- timeout
311
- }),
312
- stdout = _ref7.stdout;
313
-
314
- let plistContent = (0, _plist.parse)(stdout);
315
- let devicesFound = [];
316
- let entriesToSearch = [plistContent[0]];
317
-
318
- while (entriesToSearch.length > 0) {
319
- let currentEntry = entriesToSearch.pop();
320
-
321
- if (currentEntry instanceof Array) {
322
- entriesToSearch = entriesToSearch.concat(currentEntry);
323
- } else if (currentEntry._name && currentEntry._name.substring(0, 4) === "iPad" || currentEntry._name && currentEntry._name.substring(0, 6) === "iPhone" || currentEntry._name && _lodash.default.includes(currentEntry._name, "Apple TV")) {
324
- let deviceInfo = {
325
- name: currentEntry._name,
326
- udid: currentEntry.serial_num,
327
- productId: currentEntry.product_id,
328
- deviceVersion: currentEntry.bcd_device
329
- };
330
- devicesFound.push(deviceInfo);
331
- } else if (currentEntry._items) {
332
- entriesToSearch = entriesToSearch.concat(currentEntry._items);
333
- }
334
- }
335
-
336
- return devicesFound;
288
+ async function getConnectedDevices(timeout = XCRUN_TIMEOUT) {
289
+ const cmd = '/usr/sbin/system_profiler';
290
+ const args = ['-xml', 'SPUSBDataType'];
291
+ let {
292
+ stdout
293
+ } = await (0, _teen_process.exec)(cmd, args, {
294
+ timeout
337
295
  });
338
- return _getConnectedDevices.apply(this, arguments);
339
- }
296
+ let plistContent = (0, _plist.parse)(stdout);
297
+ let devicesFound = [];
298
+ let entriesToSearch = [plistContent[0]];
299
+
300
+ while (entriesToSearch.length > 0) {
301
+ let currentEntry = entriesToSearch.pop();
302
+
303
+ if (currentEntry instanceof Array) {
304
+ entriesToSearch = entriesToSearch.concat(currentEntry);
305
+ } else if (currentEntry._name && currentEntry._name.substring(0, 4) === 'iPad' || currentEntry._name && currentEntry._name.substring(0, 6) === 'iPhone' || currentEntry._name && _lodash.default.includes(currentEntry._name, 'Apple TV')) {
306
+ let deviceInfo = {
307
+ name: currentEntry._name,
308
+ udid: currentEntry.serial_num,
309
+ productId: currentEntry.product_id,
310
+ deviceVersion: currentEntry.bcd_device
311
+ };
312
+ devicesFound.push(deviceInfo);
313
+ } else if (currentEntry._items) {
314
+ entriesToSearch = entriesToSearch.concat(currentEntry._items);
315
+ }
316
+ }
340
317
 
341
- function getInstrumentsPathWithoutRetry() {
342
- return _getInstrumentsPathWithoutRetry.apply(this, arguments);
318
+ return devicesFound;
343
319
  }
344
320
 
345
- function _getInstrumentsPathWithoutRetry() {
346
- _getInstrumentsPathWithoutRetry = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
347
- const args = ['-find', 'instruments'];
321
+ async function getInstrumentsPathWithoutRetry(timeout = XCRUN_TIMEOUT) {
322
+ const args = ['-find', 'instruments'];
323
+ let {
324
+ stdout
325
+ } = await runXcrunCommand(args, timeout);
348
326
 
349
- let _ref8 = yield runXcrunCommand(args, timeout),
350
- stdout = _ref8.stdout;
327
+ if (!stdout) {
328
+ stdout = '';
329
+ }
351
330
 
352
- if (!stdout) {
353
- stdout = "";
354
- }
331
+ let instrumentsPath = stdout.trim();
355
332
 
356
- let instrumentsPath = stdout.trim();
333
+ if (!instrumentsPath) {
334
+ throw new Error(`Could not find path to instruments binary using 'xcrun ${args.join(' ')}'`);
335
+ }
357
336
 
358
- if (!instrumentsPath) {
359
- throw new Error(`Could not find path to instruments binary using 'xcrun ${args.join(' ')}'`);
360
- }
361
-
362
- return instrumentsPath;
363
- });
364
- return _getInstrumentsPathWithoutRetry.apply(this, arguments);
337
+ return instrumentsPath;
365
338
  }
366
339
 
367
- const getInstrumentsPath = _lodash.default.memoize(function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
340
+ const getInstrumentsPath = _lodash.default.memoize(function getInstrumentsPath(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
368
341
  return (0, _asyncbox.retry)(retries, getInstrumentsPathWithoutRetry, timeout);
369
342
  });
370
343
 
344
+ exports.getInstrumentsPath = getInstrumentsPath;
345
+
371
346
  function clearInternalCache() {
372
347
  const memoized = [getPath, getVersionMemoized, getAutomationTraceTemplatePath, getMaxIOSSDK, getMaxTVOSSDK, getInstrumentsPath];
373
348
  memoized.forEach(f => {
@@ -375,23 +350,7 @@ function clearInternalCache() {
375
350
  f.cache = new _lodash.default.memoize.Cache();
376
351
  }
377
352
  });
378
- }
353
+ }require('source-map-support').install();
354
+
379
355
 
380
- var _default = {
381
- getPath,
382
- getVersion,
383
- getAutomationTraceTemplatePath,
384
- getMaxIOSSDK,
385
- getAutomationTraceTemplatePathWithoutRetry,
386
- getMaxIOSSDKWithoutRetry,
387
- getConnectedDevices,
388
- clearInternalCache,
389
- getInstrumentsPath,
390
- getCommandLineToolsVersion,
391
- getMaxTVOSSDK,
392
- getMaxTVOSSDKWithoutRetry
393
- };
394
- exports.default = _default;require('source-map-support').install();
395
-
396
-
397
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi94Y29kZS5qcyJdLCJuYW1lcyI6WyJlbnYiLCJwcm9jZXNzIiwiWENSVU5fVElNRU9VVCIsIlhDT0RFX1NVQkRJUiIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJoYXNFeHBlY3RlZFN1YkRpciIsInBhdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJydW5YY3J1bkNvbW1hbmQiLCJhcmdzIiwidGltZW91dCIsImVyciIsInN0ZGVyciIsIm1lc3NhZ2UiLCJnZXRQYXRoRnJvbVN5bWxpbmsiLCJmYWlsTWVzc2FnZSIsIndhcm4iLCJzeW1saW5rUGF0aCIsImxlZ2FjeVN5bWxpbmtQYXRoIiwieGNvZGVQYXRoIiwidXRpbCIsImhhc0NvbnRlbnQiLCJERVZFTE9QRVJfRElSIiwiY3VzdG9tUGF0aCIsImZzIiwiZXhpc3RzIiwibWVzZyIsIkVycm9yIiwicmVhZGxpbmsiLCJyZXBsYWNlIiwiUmVnRXhwIiwidHJpbSIsIm1zZyIsImdldFBhdGhGcm9tWGNvZGVTZWxlY3QiLCJzdGRvdXQiLCJ4Y29kZUZvbGRlclBhdGgiLCJlcnJvckFuZFRocm93IiwiZ2V0UGF0aCIsIl8iLCJtZW1vaXplIiwiY2F0Y2giLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwicGxpc3RQYXRoIiwicmVzb2x2ZSIsInZlcnNpb24iLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwic2VtdmVyIiwiY29lcmNlIiwiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciLCJnZXRWZXJzaW9uTWVtb2l6ZWQiLCJyZXRyaWVzIiwiZ2V0VmVyc2lvbiIsInBhcnNlIiwidmVyc2lvblN0cmluZyIsInBhdGNoIiwibWFqb3IiLCJtaW5vciIsInZlcnNpb25GbG9hdCIsInBhcnNlRmxvYXQiLCJ1bmRlZmluZWQiLCJnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiIsImdldFZlcnNpb25GdW5jdGlvbnMiLCJwa2ciLCJpZ24iLCJtYXRjaCIsImV4ZWMiLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnkiLCJleHRlbnNpb25zIiwicGF0aFByZWZpeCIsInBhdGhTdWZmaXgiLCJhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzIiwidG9TdHJpbmciLCJlcnJvciIsImdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCIsImdldE1heElPU1NES1dpdGhvdXRSZXRyeSIsInNka1ZlcnNpb24iLCJnZXRNYXhJT1NTREsiLCJnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5IiwiaXNOYU4iLCJnZXRNYXhUVk9TU0RLIiwiZ2V0Q29ubmVjdGVkRGV2aWNlcyIsImNtZCIsInBsaXN0Q29udGVudCIsImRldmljZXNGb3VuZCIsImVudHJpZXNUb1NlYXJjaCIsImN1cnJlbnRFbnRyeSIsInBvcCIsIkFycmF5IiwiY29uY2F0IiwiX25hbWUiLCJpbmNsdWRlcyIsImRldmljZUluZm8iLCJuYW1lIiwidWRpZCIsInNlcmlhbF9udW0iLCJwcm9kdWN0SWQiLCJwcm9kdWN0X2lkIiwiZGV2aWNlVmVyc2lvbiIsImJjZF9kZXZpY2UiLCJwdXNoIiwiX2l0ZW1zIiwiZ2V0SW5zdHJ1bWVudHNQYXRoV2l0aG91dFJldHJ5IiwiaW5zdHJ1bWVudHNQYXRoIiwiam9pbiIsImdldEluc3RydW1lbnRzUGF0aCIsImNsZWFySW50ZXJuYWxDYWNoZSIsIm1lbW9pemVkIiwiZm9yRWFjaCIsImYiLCJjYWNoZSIsIkNhY2hlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLEdBQUcsR0FBR0MsT0FBTyxDQUFDRCxHQUFwQjtBQUVBLE1BQU1FLGFBQWEsR0FBRyxLQUF0QjtBQUNBLE1BQU1DLFlBQVksR0FBRyxxQkFBckI7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxDQUFsQzs7QUFFQSxNQUFNQyxHQUFHLEdBQUdDLHNCQUFPQyxTQUFQLENBQWlCLE9BQWpC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LE9BQU8sR0FBR25ELHlCQUFwQixFQUErQ1UsT0FBTyxHQUFHWixhQUF6RCxFQUF3RTtBQUN0RSxTQUFPLHFCQUFNcUQsT0FBTixFQUFlbUQsOEJBQWYsRUFBK0M1RixPQUEvQyxDQUFQO0FBQ0QsQ0FId0IsQ0FBM0I7O0FBTUEsU0FBU2dHLGtCQUFULEdBQStCO0FBRzdCLFFBQU1DLFFBQVEsR0FBRyxDQUNmdEUsT0FEZSxFQUNOYSxrQkFETSxFQUNjd0IsOEJBRGQsRUFDOENHLFlBRDlDLEVBRWZHLGFBRmUsRUFFQXlCLGtCQUZBLENBQWpCO0FBS0FFLEVBQUFBLFFBQVEsQ0FBQ0MsT0FBVCxDQUFrQkMsQ0FBRCxJQUFPO0FBQ3RCLFFBQUlBLENBQUMsQ0FBQ0MsS0FBTixFQUFhO0FBQ1hELE1BQUFBLENBQUMsQ0FBQ0MsS0FBRixHQUFVLElBQUl4RSxnQkFBRUMsT0FBRixDQUFVd0UsS0FBZCxFQUFWO0FBQ0Q7QUFDRixHQUpEO0FBS0Q7O2VBRWM7QUFDYjFFLEVBQUFBLE9BRGE7QUFDSmUsRUFBQUEsVUFESTtBQUNRc0IsRUFBQUEsOEJBRFI7QUFDd0NHLEVBQUFBLFlBRHhDO0FBRWJWLEVBQUFBLDBDQUZhO0FBRStCUSxFQUFBQSx3QkFGL0I7QUFHYk0sRUFBQUEsbUJBSGE7QUFHUXlCLEVBQUFBLGtCQUhSO0FBRzRCRCxFQUFBQSxrQkFINUI7QUFJYjVDLEVBQUFBLDBCQUphO0FBSWVtQixFQUFBQSxhQUpmO0FBSThCRixFQUFBQTtBQUo5QixDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbCwgZnMsIHBsaXN0LCBsb2dnZXIgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJldHJ5IH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlUGxpc3REYXRhIH0gZnJvbSAncGxpc3QnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cblxuY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG5cbmNvbnN0IFhDUlVOX1RJTUVPVVQgPSAxNTAwMDtcbmNvbnN0IFhDT0RFX1NVQkRJUiA9IFwiL0NvbnRlbnRzL0RldmVsb3BlclwiO1xuY29uc3QgREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUyA9IDM7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1hjb2RlJyk7XG5cblxuZnVuY3Rpb24gaGFzRXhwZWN0ZWRTdWJEaXIgKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKHBhdGgubGVuZ3RoIC0gWENPREVfU1VCRElSLmxlbmd0aCkgPT09IFhDT0RFX1NVQkRJUjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuWGNydW5Db21tYW5kIChhcmdzLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBleGVjKCd4Y3J1bicsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIHRoZSB0cnVlIGVycm9yIGNhbiBiZSBoaWRkZW4gd2l0aGluIHRoZSBzdGRlcnJcbiAgICBpZiAoZXJyLnN0ZGVycikge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBgJHtlcnIubWVzc2FnZX06ICR7ZXJyLnN0ZGVycn1gO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQYXRoRnJvbVN5bWxpbmsgKGZhaWxNZXNzYWdlKSB7XG4gIC8vIE5vZGUncyBpbnZvY2F0aW9uIG9mIHhjb2RlLXNlbGVjdCBzb21ldGltZXMgZmxha2VzIGFuZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy5cbiAgLy8gTm90IGNsZWFyIHdoeS4gQXMgYSB3b3JrYXJvdW5kLCBBcHBpdW0gY2FuIHJlbGlhYmx5IGRlZHVjZSB0aGUgdmVyc2lvbiBpbiB1c2UgYnkgY2hlY2tpbmdcbiAgLy8gdGhlIGxvY2F0aW9ucyB4Y29kZS1zZWxlY3QgdXNlcyB0byBzdG9yZSB0aGUgc2VsZWN0ZWQgdmVyc2lvbidzIHBhdGguIFRoaXMgc2hvdWxkIGJlIDEwMCVcbiAgLy8gcmVsaWFibGUgc28gbG9uZyBhcyB0aGUgbGluayBsb2NhdGlvbnMgcmVtYWluIHRoZSBzYW1lLiBIb3dldmVyLCBzaW5jZSB3ZSdyZSByZWx5aW5nIG9uXG4gIC8vIGhhcmRjb2RlZCBwYXRocywgdGhpcyBhcHByb2FjaCB3aWxsIGJyZWFrIHRoZSBuZXh0IHRpbWUgQXBwbGUgY2hhbmdlcyB0aGUgc3ltbGluayBsb2NhdGlvbi5cbiAgbG9nLndhcm4oYEZpbmRpbmcgWGNvZGVQYXRoIGJ5IHN5bWxpbmsgYmVjYXVzZSAke2ZhaWxNZXNzYWdlfWApO1xuXG4gIGNvbnN0IHN5bWxpbmtQYXRoID0gXCIvdmFyL2RiL3hjb2RlX3NlbGVjdF9saW5rXCI7XG4gIGNvbnN0IGxlZ2FjeVN5bWxpbmtQYXRoID0gXCIvdXNyL3NoYXJlL3hjb2RlLXNlbGVjdC94Y29kZV9kaXJfbGlua1wiOyAvLyAgWGNvZGUgPCA1LnhcbiAgbGV0IHhjb2RlUGF0aCA9IG51bGw7XG5cbiAgLy8geGNvZGUtc2VsZWN0IGFsbG93cyB1c2VycyB0byBvdmVycmlkZSBpdHMgc2V0dGluZ3Mgd2l0aCB0aGUgREVWRUxPUEVSX0RJUiBlbnYgdmFyLFxuICAvLyBzbyBjaGVjayB0aGF0IGZpcnN0XG4gIGlmICh1dGlsLmhhc0NvbnRlbnQoZW52LkRFVkVMT1BFUl9ESVIpKSB7XG4gICAgY29uc3QgY3VzdG9tUGF0aCA9IGhhc0V4cGVjdGVkU3ViRGlyKGVudi5ERVZFTE9QRVJfRElSKVxuICAgICAgPyBlbnYuREVWRUxPUEVSX0RJUlxuICAgICAgOiBlbnYuREVWRUxPUEVSX0RJUiArIFhDT0RFX1NVQkRJUjtcblxuICAgIGlmIChhd2FpdCBmcy5leGlzdHMoY3VzdG9tUGF0aCkpIHtcbiAgICAgIHhjb2RlUGF0aCA9IGN1c3RvbVBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBtZXNnID0gYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gWGNvZGUsIGVudmlyb25tZW50IHZhcmlhYmxlIGAgK1xuICAgICAgICAgICAgICAgICBgREVWRUxPUEVSX0RJUiBzZXQgdG86ICR7ZW52LkRFVkVMT1BFUl9ESVJ9IGAgK1xuICAgICAgICAgICAgICAgICBgYnV0IG5vIFhjb2RlIGZvdW5kYDtcbiAgICAgIGxvZy53YXJuKG1lc2cpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc2cpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMoc3ltbGlua1BhdGgpKSB7XG4gICAgeGNvZGVQYXRoID0gYXdhaXQgZnMucmVhZGxpbmsoc3ltbGlua1BhdGgpO1xuICB9IGVsc2UgaWYgKGF3YWl0IGZzLmV4aXN0cyhsZWdhY3lTeW1saW5rUGF0aCkpIHtcbiAgICB4Y29kZVBhdGggPSBhd2FpdCBmcy5yZWFkbGluayhsZWdhY3lTeW1saW5rUGF0aCk7XG4gIH1cblxuICBpZiAoeGNvZGVQYXRoKSB7XG4gICAgcmV0dXJuIHhjb2RlUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoXCIvJFwiKSwgXCJcIikudHJpbSgpO1xuICB9XG5cbiAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGhlcmUgaXMgd2UgZmFpbGVkIHRvIGNhcHR1cmUgeGNvZGUtc2VsZWN0J3Mgc3Rkb3V0IGFuZCBvdXJcbiAgLy8gb3RoZXIgY2hlY2tzIGZhaWxlZC4gRWl0aGVyIEFwcGxlIGhhcyBtb3ZlZCB0aGUgc3ltbGluayB0byBhIG5ldyBsb2NhdGlvbiBvciB0aGUgdXNlclxuICAvLyBpcyBub3QgdXNpbmcgdGhlIGRlZmF1bHQgaW5zdGFsbC4gOTkuOTk5JSBjaGFuY2UgaXQncyB0aGUgbGF0dGVyLCBzbyBpc3N1ZSBhIHdhcm5pbmdcbiAgLy8gc2hvdWxkIHdlIGV2ZXIgaGl0IHRoZSBlZGdlIGNhc2UuXG4gIGxldCBtc2cgPSBgQ291bGQgbm90IGZpbmQgcGF0aCB0byBYY29kZSBieSBzeW1saW5rcyBsb2NhdGVkIGluICR7c3ltbGlua1BhdGh9LCBvciAke2xlZ2FjeVN5bWxpbmtQYXRofWA7XG4gIGxvZy53YXJuKG1zZyk7XG4gIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQYXRoRnJvbVhjb2RlU2VsZWN0ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBsZXQge3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZS1zZWxlY3QnLCBbJy0tcHJpbnQtcGF0aCddLCB7dGltZW91dH0pO1xuXG4gIC8vIHRyaW0gYW5kIHJlbW92ZSB0cmFpbGluZyBzbGFzaFxuICBjb25zdCB4Y29kZUZvbGRlclBhdGggPSBzdGRvdXQucmVwbGFjZSgvXFwvJC8sICcnKS50cmltKCk7XG5cbiAgaWYgKCF1dGlsLmhhc0NvbnRlbnQoeGNvZGVGb2xkZXJQYXRoKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KCd4Y29kZS1zZWxlY3QgcmV0dXJuZWQgYW4gZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoYXdhaXQgZnMuZXhpc3RzKHhjb2RlRm9sZGVyUGF0aCkpIHtcbiAgICByZXR1cm4geGNvZGVGb2xkZXJQYXRoO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1zZyA9IGB4Y29kZS1zZWxlY3QgY291bGQgbm90IGZpbmQgeGNvZGUuIFBhdGggJyR7eGNvZGVGb2xkZXJQYXRofScgZG9lcyBub3QgZXhpc3QuYDtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhtc2cpO1xuICB9XG59XG5cbmNvbnN0IGdldFBhdGggPSBfLm1lbW9pemUoZnVuY3Rpb24gKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIC8vIGZpcnN0IHdlIHRyeSB1c2luZyB4Y29kZS1zZWxlY3QgdG8gZmluZCB0aGUgcGF0aFxuICAvLyB0aGVuIHdlIHRyeSB1c2luZyB0aGUgc3ltbGlua3MgdGhhdCBBcHBsZSBoYXMgYnkgZGVmYXVsdFxuICByZXR1cm4gZ2V0UGF0aEZyb21YY29kZVNlbGVjdCh0aW1lb3V0KS5jYXRjaChnZXRQYXRoRnJvbVN5bWxpbmspO1xufSk7XG5cblxuXG5hc3luYyBmdW5jdGlvbiBnZXRWZXJzaW9uV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB4Y29kZVBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuXG4gIC8vIHdlIHdhbnQgdG8gcmVhZCB0aGUgQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmcgZnJvbSBYY29kZSdzIHBsaXN0LlxuICAvLyBJdCBzaG91bGQgYmUgaW4gL1tyb290XS9YQ29kZS5hcHAvQ29udGVudHMvXG4gIGNvbnN0IHBsaXN0UGF0aCA9IHBhdGgucmVzb2x2ZSh4Y29kZVBhdGgsIFwiLi5cIiwgXCJJbmZvLnBsaXN0XCIpO1xuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgWGNvZGUgdmVyc2lvbi4gJHtwbGlzdFBhdGh9IGRvZXMgbm90IGV4aXN0IG9uIGRpc2suYCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKTtcbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UodmVyc2lvbi5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyk7XG59XG5cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRWZXJzaW9uV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyc2lvbiAocGFyc2UgPSBmYWxzZSwgcmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IHZlcnNpb24gPSBhd2FpdCBnZXRWZXJzaW9uTWVtb2l6ZWQocmV0cmllcywgdGltZW91dCk7XG4gIC8vIHhjb2RlIHZlcnNpb24gc3RyaW5ncyBhcmUgbm90IGV4YWN0bHkgc2VtdmVyIHN0cmluZzogcGF0Y2ggdmVyc2lvbnMgb2YgMFxuICAvLyBhcmUgcmVtb3ZlZCAoZS5nLiwgJzEwLjAuMCcgPT4gJzEwLjAnKVxuICBjb25zdCB2ZXJzaW9uU3RyaW5nID0gdmVyc2lvbi5wYXRjaCA+IDAgPyB2ZXJzaW9uLnZlcnNpb24gOiBgJHt2ZXJzaW9uLm1ham9yfS4ke3ZlcnNpb24ubWlub3J9YDtcbiAgaWYgKCFwYXJzZSkge1xuICAgIHJldHVybiB2ZXJzaW9uU3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uU3RyaW5nLFxuICAgIHZlcnNpb25GbG9hdDogcGFyc2VGbG9hdCh2ZXJzaW9uU3RyaW5nKSxcbiAgICBtYWpvcjogdmVyc2lvbi5tYWpvcixcbiAgICBtaW5vcjogdmVyc2lvbi5taW5vcixcbiAgICBwYXRjaDogdmVyc2lvbi5wYXRjaCA+IDAgPyB2ZXJzaW9uLnBhdGNoIDogdW5kZWZpbmVkXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uICgpIHtcbiAgLy8gdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGRpZmZlcmVudCB3YXlzIHRoYXQgdGhlIENMSSB0b29scyB2ZXJzaW9uIGhhcyBiZWVuXG4gIC8vIHJlcHJlc2VudGVkLiBUcnkgdGhlbSBmcm9tIG1vc3QgcmVsaWFibGUgdG8gbGVhc3QsIGZhbGxpbmcgZG93biB0aGUgY2hhaW5cbiAgY29uc3QgZ2V0VmVyc2lvbkZ1bmN0aW9ucyA9IFtcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgcGtnID0gKGF3YWl0IGV4ZWMoJ3BrZ3V0aWwnLCBbJy0tcGtncz1jb20uYXBwbGUucGtnLkRldlNES18uKiddKSkuc3Rkb3V0O1xuICAgICAgcmV0dXJuIChhd2FpdCBleGVjKCdwa2d1dGlsJywgW2AtLXBrZy1pbmZvPSR7cGtnLnRyaW0oKX1gXSkpLnN0ZG91dDtcbiAgICB9LFxuICAgIGFzeW5jICgpID0+IChhd2FpdCBleGVjKCdwa2d1dGlsJywgW2AtLXBrZy1pbmZvPWNvbS5hcHBsZS5wa2cuQ0xUb29sc19FeGVjdXRhYmxlc2BdKSkuc3Rkb3V0LFxuICAgIGFzeW5jICgpID0+IChhd2FpdCBleGVjKCdwa2d1dGlsJywgW2AtLXBrZy1pbmZvPWNvbS5hcHBsZS5wa2cuRGV2ZWxvcGVyVG9vbHNDTElgXSkpLnN0ZG91dCxcbiAgXTtcbiAgbGV0IHN0ZG91dDtcbiAgZm9yIChsZXQgZ2V0VmVyc2lvbiBvZiBnZXRWZXJzaW9uRnVuY3Rpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0ZG91dCA9IGF3YWl0IGdldFZlcnNpb24oKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgc3Rkb3V0ID0gJyc7XG4gICAgfVxuICB9XG5cbiAgLy8gc3Rkb3V0IHNob3VsZCBoYXZlIGEgbGluZSBsaWtlIGB2ZXJzaW9uOiA4LjAuMC4wLjEuMTQ3MjQzNTg4MWBcbiAgbGV0IG1hdGNoID0gL152ZXJzaW9uOiAoLispJC9tLmV4ZWMoc3Rkb3V0KTsgLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci9IVjN4NGQvMVxuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB4Y29kZVBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuXG4gIC8vIGZvciBpb3MgOCBhbmQgdXAsIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgQXV0aW9tYXRpb25JbnN0cnVtZW50IGNoYW5nZWQuXG4gIC8vIHJhdGhlciB0aGFuIHdhc3RlIHRpbWUgZ2V0dGluZyB0aGUgaU9TU0RLVmVyc2lvbiwganVzdCBnZXQgYm90aCBwYXRocyBhbmQgc2VlIHdoaWNoIG9uZSBleGlzdHNcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsneHJwbHVnaW4nLCAnYnVuZGxlJ107XG4gIGNvbnN0IHBhdGhQcmVmaXggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCBcIi4uL0FwcGxpY2F0aW9ucy9JbnN0cnVtZW50cy5hcHAvQ29udGVudHMvUGx1Z0luc1wiKTtcbiAgY29uc3QgcGF0aFN1ZmZpeCA9IFwiQ29udGVudHMvUmVzb3VyY2VzL0F1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZVwiO1xuICBsZXQgYXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRocyA9IFtcbiAgICBwYXRoLnJlc29sdmUocGF0aFByZWZpeCwgYEF1dG9tYXRpb25JbnN0cnVtZW50LiR7ZXh0ZW5zaW9uc1swXX1gLCBwYXRoU3VmZml4KSxcbiAgICBwYXRoLnJlc29sdmUocGF0aFByZWZpeCwgYEF1dG9tYXRpb25JbnN0cnVtZW50LiR7ZXh0ZW5zaW9uc1sxXX1gLCBwYXRoU3VmZml4KVxuICBdO1xuXG4gIGlmIChhd2FpdCBmcy5leGlzdHMoYXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoc1swXSkpIHtcbiAgICByZXR1cm4gYXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoc1swXTtcbiAgfVxuXG4gIGlmIChhd2FpdCBmcy5leGlzdHMoYXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoc1sxXSkpIHtcbiAgICByZXR1cm4gYXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoc1sxXTtcbiAgfVxuXG4gIGNvbnN0IG1zZyA9IFwiQ291bGQgbm90IGZpbmQgQXV0b21hdGlvbi50cmFjZXRlbXBsYXRlIGluIGFueSBvZiB0aGUgZm9sbG93aW5nXCIgK1xuICAgICAgICAgICAgICBgbG9jYXRpb25zICR7YXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRocy50b1N0cmluZygpfWA7XG4gIGxvZy5lcnJvcihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcblxufVxuXG5jb25zdCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGggPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbihmYWxzZSwgREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCk7XG4gIGlmICh2ZXJzaW9uWzBdID09PSAnNCcpIHtcbiAgICByZXR1cm4gJzYuMSc7XG4gIH1cblxuICBjb25zdCBhcmdzID0gWyctLXNkaycsICdpcGhvbmVzaW11bGF0b3InLCAnLS1zaG93LXNkay12ZXJzaW9uJ107XG4gIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgcnVuWGNydW5Db21tYW5kKGFyZ3MsIHRpbWVvdXQpO1xuXG4gIGNvbnN0IHNka1ZlcnNpb24gPSBzdGRvdXQudHJpbSgpO1xuICBjb25zdCBtYXRjaCA9IC9cXGQuXFxkLy5leGVjKHN0ZG91dCk7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgeGNydW4gcmV0dXJuZWQgYSBub24tbnVtZXJpYyBpT1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG5cbiAgcmV0dXJuIHNka1ZlcnNpb247XG59XG5cbmNvbnN0IGdldE1heElPU1NESyA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksIHRpbWVvdXQpO1xuICB9XG4pO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCBhcmdzID0gWyctLXNkaycsICdhcHBsZXR2c2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBjb25zdCBzZGtWZXJzaW9uID0gc3Rkb3V0LnRyaW0oKTtcblxuICBpZiAoaXNOYU4ocGFyc2VGbG9hdChzZGtWZXJzaW9uKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHhjcnVuIHJldHVybmVkIGEgbm9uLW51bWVyaWMgdHZPUyBTREsgdmVyc2lvbjogJyR7c2RrVmVyc2lvbn0nYCk7XG4gIH1cblxuICByZXR1cm4gc2RrVmVyc2lvbjtcbn1cblxuY29uc3QgZ2V0TWF4VFZPU1NESyA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ubmVjdGVkRGV2aWNlcyAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgY21kID0gJy91c3Ivc2Jpbi9zeXN0ZW1fcHJvZmlsZXInO1xuICBjb25zdCBhcmdzID0gWycteG1sJywgJ1NQVVNCRGF0YVR5cGUnXTtcbiAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyhjbWQsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIGxldCBwbGlzdENvbnRlbnQgPSBwYXJzZVBsaXN0RGF0YShzdGRvdXQpO1xuXG4gIGxldCBkZXZpY2VzRm91bmQgPSBbXTtcbiAgbGV0IGVudHJpZXNUb1NlYXJjaCA9IFtwbGlzdENvbnRlbnRbMF1dO1xuICB3aGlsZSAoZW50cmllc1RvU2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgY3VycmVudEVudHJ5ID0gZW50cmllc1RvU2VhcmNoLnBvcCgpO1xuICAgIGlmIChjdXJyZW50RW50cnkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZW50cmllc1RvU2VhcmNoID0gZW50cmllc1RvU2VhcmNoLmNvbmNhdChjdXJyZW50RW50cnkpO1xuICAgIH0gZWxzZSBpZiAoKGN1cnJlbnRFbnRyeS5fbmFtZSAmJlxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5fbmFtZS5zdWJzdHJpbmcoMCwgNCkgPT09IFwiaVBhZFwiKSB8fFxuICAgICAgICAgICAgICAgKGN1cnJlbnRFbnRyeS5fbmFtZSAmJlxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5fbmFtZS5zdWJzdHJpbmcoMCwgNikgPT09IFwiaVBob25lXCIpIHx8XG4gICAgICAgICAgICAgICAoY3VycmVudEVudHJ5Ll9uYW1lICYmIF8uaW5jbHVkZXMoY3VycmVudEVudHJ5Ll9uYW1lLCBcIkFwcGxlIFRWXCIpKSkge1xuICAgICAgbGV0IGRldmljZUluZm8gPSB7XG4gICAgICAgIG5hbWU6IGN1cnJlbnRFbnRyeS5fbmFtZSxcbiAgICAgICAgdWRpZDogY3VycmVudEVudHJ5LnNlcmlhbF9udW0sXG4gICAgICAgIHByb2R1Y3RJZDogY3VycmVudEVudHJ5LnByb2R1Y3RfaWQsXG4gICAgICAgIGRldmljZVZlcnNpb246IGN1cnJlbnRFbnRyeS5iY2RfZGV2aWNlXG4gICAgICB9O1xuICAgICAgZGV2aWNlc0ZvdW5kLnB1c2goZGV2aWNlSW5mbyk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50RW50cnkuX2l0ZW1zKSB7XG4gICAgICBlbnRyaWVzVG9TZWFyY2ggPSBlbnRyaWVzVG9TZWFyY2guY29uY2F0KGN1cnJlbnRFbnRyeS5faXRlbXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGV2aWNlc0ZvdW5kO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IGFyZ3MgPSBbJy1maW5kJywgJ2luc3RydW1lbnRzJ107XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBpZiAoIXN0ZG91dCkge1xuICAgIHN0ZG91dCA9IFwiXCI7XG4gIH1cblxuICBsZXQgaW5zdHJ1bWVudHNQYXRoID0gc3Rkb3V0LnRyaW0oKTtcblxuICBpZiAoIWluc3RydW1lbnRzUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgcGF0aCB0byBpbnN0cnVtZW50cyBiaW5hcnkgdXNpbmcgJ3hjcnVuICR7YXJncy5qb2luKCcgJyl9J2ApO1xuICB9XG5cbiAgcmV0dXJuIGluc3RydW1lbnRzUGF0aDtcbn1cblxuY29uc3QgZ2V0SW5zdHJ1bWVudHNQYXRoID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiAocmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHJldHJ5KHJldHJpZXMsIGdldEluc3RydW1lbnRzUGF0aFdpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmZ1bmN0aW9uIGNsZWFySW50ZXJuYWxDYWNoZSAoKSB7XG5cbiAgLy8gbWVtb2l6ZWQgZnVuY3Rpb25zXG4gIGNvbnN0IG1lbW9pemVkID0gW1xuICAgIGdldFBhdGgsIGdldFZlcnNpb25NZW1vaXplZCwgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoLCBnZXRNYXhJT1NTREssXG4gICAgZ2V0TWF4VFZPU1NESywgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBdO1xuXG4gIG1lbW9pemVkLmZvckVhY2goKGYpID0+IHtcbiAgICBpZiAoZi5jYWNoZSkge1xuICAgICAgZi5jYWNoZSA9IG5ldyBfLm1lbW9pemUuQ2FjaGUoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldFBhdGgsIGdldFZlcnNpb24sIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCwgZ2V0TWF4SU9TU0RLLFxuICBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnksIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q29ubmVjdGVkRGV2aWNlcywgY2xlYXJJbnRlcm5hbENhY2hlLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIGdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uLCBnZXRNYXhUVk9TU0RLLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LFxufTtcbiJdLCJmaWxlIjoibGliL3hjb2RlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
356
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi94Y29kZS5qcyJdLCJuYW1lcyI6WyJlbnYiLCJwcm9jZXNzIiwiWENSVU5fVElNRU9VVCIsIlhDT0RFX1NVQkRJUiIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJoYXNFeHBlY3RlZFN1YkRpciIsInBhdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJydW5YY3J1bkNvbW1hbmQiLCJhcmdzIiwidGltZW91dCIsInJlcyIsIl8iLCJpc1VuZGVmaW5lZCIsIkVycm9yIiwiam9pbiIsImVyciIsInN0ZGVyciIsIm1lc3NhZ2UiLCJnZXRQYXRoRnJvbVN5bWxpbmsiLCJmYWlsTWVzc2FnZSIsIndhcm4iLCJzeW1saW5rUGF0aCIsImxlZ2FjeVN5bWxpbmtQYXRoIiwieGNvZGVQYXRoIiwidXRpbCIsImhhc0NvbnRlbnQiLCJERVZFTE9QRVJfRElSIiwiY3VzdG9tUGF0aCIsImZzIiwiZXhpc3RzIiwibWVzZyIsInJlYWRsaW5rIiwicmVwbGFjZSIsIlJlZ0V4cCIsInRyaW0iLCJtc2ciLCJnZXRQYXRoRnJvbVhjb2RlU2VsZWN0Iiwic3Rkb3V0IiwieGNvZGVGb2xkZXJQYXRoIiwiZXJyb3JBbmRUaHJvdyIsImdldFBhdGgiLCJtZW1vaXplIiwiY2F0Y2giLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwicGxpc3RQYXRoIiwicmVzb2x2ZSIsInZlcnNpb24iLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwic2VtdmVyIiwiY29lcmNlIiwiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciLCJnZXRWZXJzaW9uTWVtb2l6ZWQiLCJyZXRyaWVzIiwiZ2V0VmVyc2lvbiIsInBhcnNlIiwidmVyc2lvblN0cmluZyIsInBhdGNoIiwibWFqb3IiLCJtaW5vciIsInZlcnNpb25GbG9hdCIsInBhcnNlRmxvYXQiLCJ1bmRlZmluZWQiLCJ0b1N0cmluZyIsImdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uIiwiZ2V0VmVyc2lvbkZ1bmN0aW9ucyIsInBrZyIsImlnbiIsIm1hdGNoIiwiZXhlYyIsImdldENsYW5nVmVyc2lvbiIsIndoaWNoIiwiZSIsImluZm8iLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnkiLCJleHRlbnNpb25zIiwicGF0aFByZWZpeCIsInBhdGhTdWZmaXgiLCJhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzIiwiZXJyb3IiLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgiLCJnZXRNYXhJT1NTREtXaXRob3V0UmV0cnkiLCJzZGtWZXJzaW9uIiwiZ2V0TWF4SU9TU0RLRnJvbVhjb2RlVmVyc2lvbiIsImdldE1heElPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJpc05hTiIsImdldE1heFRWT1NTREsiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwiY21kIiwicGxpc3RDb250ZW50IiwiZGV2aWNlc0ZvdW5kIiwiZW50cmllc1RvU2VhcmNoIiwiY3VycmVudEVudHJ5IiwicG9wIiwiQXJyYXkiLCJjb25jYXQiLCJfbmFtZSIsImluY2x1ZGVzIiwiZGV2aWNlSW5mbyIsIm5hbWUiLCJ1ZGlkIiwic2VyaWFsX251bSIsInByb2R1Y3RJZCIsInByb2R1Y3RfaWQiLCJkZXZpY2VWZXJzaW9uIiwiYmNkX2RldmljZSIsInB1c2giLCJfaXRlbXMiLCJnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkiLCJpbnN0cnVtZW50c1BhdGgiLCJnZXRJbnN0cnVtZW50c1BhdGgiLCJjbGVhckludGVybmFsQ2FjaGUiLCJtZW1vaXplZCIsImZvckVhY2giLCJmIiwiY2FjaGUiLCJDYWNoZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLEdBQUcsR0FBR0MsT0FBTyxDQUFDRCxHQUFwQjtBQUVBLE1BQU1FLGFBQWEsR0FBRyxLQUF0QjtBQUNBLE1B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RUFBYTtBQUNYQSxJQUFBQSxNQUFNLEdBQUcsRUFBVDtBQUNEOztBQUVELE1BQUl5RSxlQUFlLEdBQUd6RSxNQUFNLENBQUNILElBQVAsRUFBdEI7O0FBRUEsTUFBSSxDQUFDNEUsZUFBTCxFQUFzQjtBQUNwQixVQUFNLElBQUlqRyxLQUFKLENBQVcsMERBQXlETCxJQUFJLENBQUNNLElBQUwsQ0FBVSxHQUFWLENBQWUsR0FBbkYsQ0FBTjtBQUNEOztBQUVELFNBQU9nRyxlQUFQO0FBQ0Q7O0FBRUQsTUFBTUMsa0JBQWtCLEdBQUdwRyxnQkFBRThCLE9BQUYsQ0FDekIsU0FBU3NFLGtCQUFULENBQTZCMUQsT0FBTyxHQUFHdEQseUJBQXZDLEVBQWtFVSxPQUFPLEdBQUdaLGFBQTVFLEVBQTJGO0FBQ3pGLFNBQU8scUJBQU13RCxPQUFOLEVBQWV3RCw4QkFBZixFQUErQ3BHLE9BQS9DLENBQVA7QUFDRCxDQUh3QixDQUEzQjs7OztBQU1BLFNBQVN1RyxrQkFBVCxHQUErQjtBQUc3QixRQUFNQyxRQUFRLEdBQUcsQ0FDZnpFLE9BRGUsRUFDTlksa0JBRE0sRUFDYzRCLDhCQURkLEVBQzhDSSxZQUQ5QyxFQUVmRyxhQUZlLEVBRUF3QixrQkFGQSxDQUFqQjtBQUtBRSxFQUFBQSxRQUFRLENBQUNDLE9BQVQsQ0FBa0JDLENBQUQsSUFBTztBQUN0QixRQUFJQSxDQUFDLENBQUNDLEtBQU4sRUFBYTtBQUNYRCxNQUFBQSxDQUFDLENBQUNDLEtBQUYsR0FBVSxJQUFJekcsZ0JBQUU4QixPQUFGLENBQVU0RSxLQUFkLEVBQVY7QUFDRDtBQUNGLEdBSkQ7QUFLRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0aWwsIGZzLCBwbGlzdCwgbG9nZ2VyIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZXRyeSB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVBsaXN0RGF0YSB9IGZyb20gJ3BsaXN0JztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5cbmNvbnN0IGVudiA9IHByb2Nlc3MuZW52O1xuXG5jb25zdCBYQ1JVTl9USU1FT1VUID0gMTUwMDA7XG5jb25zdCBYQ09ERV9TVUJESVIgPSAnL0NvbnRlbnRzL0RldmVsb3Blcic7XG5jb25zdCBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTID0gMztcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignWGNvZGUnKTtcblxuXG5mdW5jdGlvbiBoYXNFeHBlY3RlZFN1YkRpciAocGF0aCkge1xuICByZXR1cm4gcGF0aC5zdWJzdHJpbmcocGF0aC5sZW5ndGggLSBYQ09ERV9TVUJESVIubGVuZ3RoKSA9PT0gWENPREVfU1VCRElSO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5YY3J1bkNvbW1hbmQgKGFyZ3MsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZXhlYygneGNydW4nLCBhcmdzLCB7dGltZW91dH0pO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHJlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90aGluZyByZXR1cm5lZCBmcm9tIHRyeWluZyB0byBydW4gJ3hjcnVuICR7YXJncy5qb2luKCcgJyl9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyB0aGUgdHJ1ZSBlcnJvciBjYW4gYmUgaGlkZGVuIHdpdGhpbiB0aGUgc3RkZXJyXG4gICAgaWYgKGVyci5zdGRlcnIpIHtcbiAgICAgIGVyci5tZXNzYWdlID0gYCR7ZXJyLm1lc3NhZ2V9OiAke2Vyci5zdGRlcnJ9YDtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UGF0aEZyb21TeW1saW5rIChmYWlsTWVzc2FnZSkge1xuICAvLyBOb2RlJ3MgaW52b2NhdGlvbiBvZiB4Y29kZS1zZWxlY3Qgc29tZXRpbWVzIGZsYWtlcyBhbmQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gIC8vIE5vdCBjbGVhciB3aHkuIEFzIGEgd29ya2Fyb3VuZCwgQXBwaXVtIGNhbiByZWxpYWJseSBkZWR1Y2UgdGhlIHZlcnNpb24gaW4gdXNlIGJ5IGNoZWNraW5nXG4gIC8vIHRoZSBsb2NhdGlvbnMgeGNvZGUtc2VsZWN0IHVzZXMgdG8gc3RvcmUgdGhlIHNlbGVjdGVkIHZlcnNpb24ncyBwYXRoLiBUaGlzIHNob3VsZCBiZSAxMDAlXG4gIC8vIHJlbGlhYmxlIHNvIGxvbmcgYXMgdGhlIGxpbmsgbG9jYXRpb25zIHJlbWFpbiB0aGUgc2FtZS4gSG93ZXZlciwgc2luY2Ugd2UncmUgcmVseWluZyBvblxuICAvLyBoYXJkY29kZWQgcGF0aHMsIHRoaXMgYXBwcm9hY2ggd2lsbCBicmVhayB0aGUgbmV4dCB0aW1lIEFwcGxlIGNoYW5nZXMgdGhlIHN5bWxpbmsgbG9jYXRpb24uXG4gIGxvZy53YXJuKGBGaW5kaW5nIFhjb2RlUGF0aCBieSBzeW1saW5rIGJlY2F1c2UgJHtmYWlsTWVzc2FnZX1gKTtcblxuICBjb25zdCBzeW1saW5rUGF0aCA9ICcvdmFyL2RiL3hjb2RlX3NlbGVjdF9saW5rJztcbiAgY29uc3QgbGVnYWN5U3ltbGlua1BhdGggPSAnL3Vzci9zaGFyZS94Y29kZS1zZWxlY3QveGNvZGVfZGlyX2xpbmsnOyAvLyAgWGNvZGUgPCA1LnhcbiAgbGV0IHhjb2RlUGF0aCA9IG51bGw7XG5cbiAgLy8geGNvZGUtc2VsZWN0IGFsbG93cyB1c2VycyB0byBvdmVycmlkZSBpdHMgc2V0dGluZ3Mgd2l0aCB0aGUgREVWRUxPUEVSX0RJUiBlbnYgdmFyLFxuICAvLyBzbyBjaGVjayB0aGF0IGZpcnN0XG4gIGlmICh1dGlsLmhhc0NvbnRlbnQoZW52LkRFVkVMT1BFUl9ESVIpKSB7XG4gICAgY29uc3QgY3VzdG9tUGF0aCA9IGhhc0V4cGVjdGVkU3ViRGlyKGVudi5ERVZFTE9QRVJfRElSKVxuICAgICAgPyBlbnYuREVWRUxPUEVSX0RJUlxuICAgICAgOiBlbnYuREVWRUxPUEVSX0RJUiArIFhDT0RFX1NVQkRJUjtcblxuICAgIGlmIChhd2FpdCBmcy5leGlzdHMoY3VzdG9tUGF0aCkpIHtcbiAgICAgIHhjb2RlUGF0aCA9IGN1c3RvbVBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBtZXNnID0gYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gWGNvZGUsIGVudmlyb25tZW50IHZhcmlhYmxlIGAgK1xuICAgICAgICAgICAgICAgICBgREVWRUxPUEVSX0RJUiBzZXQgdG86ICR7ZW52LkRFVkVMT1BFUl9ESVJ9IGAgK1xuICAgICAgICAgICAgICAgICBgYnV0IG5vIFhjb2RlIGZvdW5kYDtcbiAgICAgIGxvZy53YXJuKG1lc2cpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc2cpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMoc3ltbGlua1BhdGgpKSB7XG4gICAgeGNvZGVQYXRoID0gYXdhaXQgZnMucmVhZGxpbmsoc3ltbGlua1BhdGgpO1xuICB9IGVsc2UgaWYgKGF3YWl0IGZzLmV4aXN0cyhsZWdhY3lTeW1saW5rUGF0aCkpIHtcbiAgICB4Y29kZVBhdGggPSBhd2FpdCBmcy5yZWFkbGluayhsZWdhY3lTeW1saW5rUGF0aCk7XG4gIH1cblxuICBpZiAoeGNvZGVQYXRoKSB7XG4gICAgcmV0dXJuIHhjb2RlUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoJy8kJyksICcnKS50cmltKCk7XG4gIH1cblxuICAvLyBXZSBzaG91bGQgb25seSBnZXQgaGVyZSBpcyB3ZSBmYWlsZWQgdG8gY2FwdHVyZSB4Y29kZS1zZWxlY3QncyBzdGRvdXQgYW5kIG91clxuICAvLyBvdGhlciBjaGVja3MgZmFpbGVkLiBFaXRoZXIgQXBwbGUgaGFzIG1vdmVkIHRoZSBzeW1saW5rIHRvIGEgbmV3IGxvY2F0aW9uIG9yIHRoZSB1c2VyXG4gIC8vIGlzIG5vdCB1c2luZyB0aGUgZGVmYXVsdCBpbnN0YWxsLiA5OS45OTklIGNoYW5jZSBpdCdzIHRoZSBsYXR0ZXIsIHNvIGlzc3VlIGEgd2FybmluZ1xuICAvLyBzaG91bGQgd2UgZXZlciBoaXQgdGhlIGVkZ2UgY2FzZS5cbiAgbGV0IG1zZyA9IGBDb3VsZCBub3QgZmluZCBwYXRoIHRvIFhjb2RlIGJ5IHN5bWxpbmtzIGxvY2F0ZWQgaW4gJHtzeW1saW5rUGF0aH0sIG9yICR7bGVnYWN5U3ltbGlua1BhdGh9YDtcbiAgbG9nLndhcm4obXNnKTtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBhdGhGcm9tWGNvZGVTZWxlY3QgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ3hjb2RlLXNlbGVjdCcsIFsnLS1wcmludC1wYXRoJ10sIHt0aW1lb3V0fSk7XG5cbiAgLy8gdHJpbSBhbmQgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoXG4gIGNvbnN0IHhjb2RlRm9sZGVyUGF0aCA9IHN0ZG91dC5yZXBsYWNlKC9cXC8kLywgJycpLnRyaW0oKTtcblxuICBpZiAoIXV0aWwuaGFzQ29udGVudCh4Y29kZUZvbGRlclBhdGgpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coJ3hjb2RlLXNlbGVjdCByZXR1cm5lZCBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChhd2FpdCBmcy5leGlzdHMoeGNvZGVGb2xkZXJQYXRoKSkge1xuICAgIHJldHVybiB4Y29kZUZvbGRlclBhdGg7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbXNnID0gYHhjb2RlLXNlbGVjdCBjb3VsZCBub3QgZmluZCB4Y29kZS4gUGF0aCAnJHt4Y29kZUZvbGRlclBhdGh9JyBkb2VzIG5vdCBleGlzdC5gO1xuICAgIGxvZy5lcnJvckFuZFRocm93KG1zZyk7XG4gIH1cbn1cblxuY29uc3QgZ2V0UGF0aCA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRQYXRoICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAvLyBmaXJzdCB3ZSB0cnkgdXNpbmcgeGNvZGUtc2VsZWN0IHRvIGZpbmQgdGhlIHBhdGhcbiAgLy8gdGhlbiB3ZSB0cnkgdXNpbmcgdGhlIHN5bWxpbmtzIHRoYXQgQXBwbGUgaGFzIGJ5IGRlZmF1bHRcbiAgcmV0dXJuIGdldFBhdGhGcm9tWGNvZGVTZWxlY3QodGltZW91dCkuY2F0Y2goZ2V0UGF0aEZyb21TeW1saW5rKTtcbn0pO1xuXG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgeGNvZGVQYXRoID0gYXdhaXQgZ2V0UGF0aCh0aW1lb3V0KTtcblxuICAvLyB3ZSB3YW50IHRvIHJlYWQgdGhlIENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIGZyb20gWGNvZGUncyBwbGlzdC5cbiAgLy8gSXQgc2hvdWxkIGJlIGluIC9bcm9vdF0vWENvZGUuYXBwL0NvbnRlbnRzL1xuICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4nLCAnSW5mby5wbGlzdCcpO1xuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgWGNvZGUgdmVyc2lvbi4gJHtwbGlzdFBhdGh9IGRvZXMgbm90IGV4aXN0IG9uIGRpc2suYCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKTtcbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UodmVyc2lvbi5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyk7XG59XG5cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0VmVyc2lvbk1lbW9pemVkIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFZlcnNpb24gKHBhcnNlID0gZmFsc2UsIHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbk1lbW9pemVkKHJldHJpZXMsIHRpbWVvdXQpO1xuICAvLyB4Y29kZSB2ZXJzaW9uIHN0cmluZ3MgYXJlIG5vdCBleGFjdGx5IHNlbXZlciBzdHJpbmc6IHBhdGNoIHZlcnNpb25zIG9mIDBcbiAgLy8gYXJlIHJlbW92ZWQgKGUuZy4sICcxMC4wLjAnID0+ICcxMC4wJylcbiAgY29uc3QgdmVyc2lvblN0cmluZyA9IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi52ZXJzaW9uIDogYCR7dmVyc2lvbi5tYWpvcn0uJHt2ZXJzaW9uLm1pbm9yfWA7XG4gIGlmICghcGFyc2UpIHtcbiAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvblN0cmluZyxcbiAgICB2ZXJzaW9uRmxvYXQ6IHBhcnNlRmxvYXQodmVyc2lvblN0cmluZyksXG4gICAgbWFqb3I6IHZlcnNpb24ubWFqb3IsXG4gICAgbWlub3I6IHZlcnNpb24ubWlub3IsXG4gICAgcGF0Y2g6IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi5wYXRjaCA6IHVuZGVmaW5lZCxcbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiAoKSB7XG4gIC8vIHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyB0aGF0IHRoZSBDTEkgdG9vbHMgdmVyc2lvbiBoYXMgYmVlblxuICAvLyByZXByZXNlbnRlZC4gVHJ5IHRoZW0gZnJvbSBtb3N0IHJlbGlhYmxlIHRvIGxlYXN0LCBmYWxsaW5nIGRvd24gdGhlIGNoYWluXG4gIGNvbnN0IGdldFZlcnNpb25GdW5jdGlvbnMgPSBbXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHBrZyA9IChhd2FpdCBleGVjKCdwa2d1dGlsJywgWyctLXBrZ3M9Y29tLmFwcGxlLnBrZy5EZXZTREtfLionXSkpLnN0ZG91dDtcbiAgICAgIHJldHVybiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz0ke3BrZy50cmltKCl9YF0pKS5zdGRvdXQ7XG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkNMVG9vbHNfRXhlY3V0YWJsZXNgXSkpLnN0ZG91dCxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkRldmVsb3BlclRvb2xzQ0xJYF0pKS5zdGRvdXQsXG4gIF07XG4gIGxldCBzdGRvdXQ7XG4gIGZvciAobGV0IGdldFZlcnNpb24gb2YgZ2V0VmVyc2lvbkZ1bmN0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBzdGRvdXQgPSBhd2FpdCBnZXRWZXJzaW9uKCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIHN0ZG91dCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN0ZG91dCBzaG91bGQgaGF2ZSBhIGxpbmUgbGlrZSBgdmVyc2lvbjogOC4wLjAuMC4xLjE0NzI0MzU4ODFgXG4gIGxldCBtYXRjaCA9IC9edmVyc2lvbjogKC4rKSQvbS5leGVjKHN0ZG91dCk7IC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvSFYzeDRkLzFcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaHR0cHM6Ly90cmFjLm1hY3BvcnRzLm9yZy93aWtpL1hjb2RlVmVyc2lvbkluZm9cbiAqIHRvIHNlZSB0aGUgYWN0dWFsIG1hcHBpbmcgYmV0d2VlbiBjbGFuZyBhbmQgb3RoZXIgY29tcG9uZW50cy5cbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGFjdHVhbCBDbGFuZyB2ZXJzaW9uIGluIHgueC54Lnggb3IgeC54LnggZm9ybWF0LFxuICogd2hpY2ggaXMgc3VwcGxpZWQgd2l0aCBDb21tYW5kIExpbmUgVG9vbHMuIGBudWxsYCBpcyByZXR1cm5lZFxuICogaWYgQ0xUIGFyZSBub3QgaW5zdGFsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDbGFuZ1ZlcnNpb24gKCkge1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndoaWNoKCdjbGFuZycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmluZm8oJ0Nhbm5vdCBmaW5kIGNsYW5nIGV4ZWN1dGFibGUgb24gdGhlIGxvY2FsIHN5c3RlbS4gJyArXG4gICAgICAnQXJlIFhjb2RlIENvbW1hbmQgTGluZSBUb29scyBpbnN0YWxsZWQ/Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdjbGFuZycsIFsnLS12ZXJzaW9uJ10pO1xuICBjb25zdCBtYXRjaCA9IC9jbGFuZy0oWzAtOS5dKykvLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIGxvZy5pbmZvKGBDYW5ub3QgcGFyc2UgY2xhbmcgdmVyc2lvbiBmcm9tICR7c3Rkb3V0fWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBtYXRjaFsxXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB4Y29kZVBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuXG4gIC8vIGZvciBpb3MgOCBhbmQgdXAsIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgQXV0aW9tYXRpb25JbnN0cnVtZW50IGNoYW5nZWQuXG4gIC8vIHJhdGhlciB0aGFuIHdhc3RlIHRpbWUgZ2V0dGluZyB0aGUgaU9TU0RLVmVyc2lvbiwganVzdCBnZXQgYm90aCBwYXRocyBhbmQgc2VlIHdoaWNoIG9uZSBleGlzdHNcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsneHJwbHVnaW4nLCAnYnVuZGxlJ107XG4gIGNvbnN0IHBhdGhQcmVmaXggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4vQXBwbGljYXRpb25zL0luc3RydW1lbnRzLmFwcC9Db250ZW50cy9QbHVnSW5zJyk7XG4gIGNvbnN0IHBhdGhTdWZmaXggPSAnQ29udGVudHMvUmVzb3VyY2VzL0F1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSc7XG4gIGxldCBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzID0gW1xuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzBdfWAsIHBhdGhTdWZmaXgpLFxuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzFdfWAsIHBhdGhTdWZmaXgpXG4gIF07XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdO1xuICB9XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdO1xuICB9XG5cbiAgY29uc3QgbXNnID0gJ0NvdWxkIG5vdCBmaW5kIEF1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZycgK1xuICAgICAgICAgICAgICBgbG9jYXRpb25zICR7YXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRocy50b1N0cmluZygpfWA7XG4gIGxvZy5lcnJvcihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcblxufVxuXG5jb25zdCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGggPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCAocmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHJldHJ5KHJldHJpZXMsIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldFZlcnNpb24oZmFsc2UsIERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQpO1xuICBpZiAodmVyc2lvblswXSA9PT0gJzQnKSB7XG4gICAgcmV0dXJuICc2LjEnO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBjb25zdCBzZGtWZXJzaW9uID0gc3Rkb3V0LnRyaW0oKTtcbiAgY29uc3QgbWF0Y2ggPSAvXFxkLlxcZC8uZXhlYyhzdGRvdXQpO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHhjcnVuIHJldHVybmVkIGEgbm9uLW51bWVyaWMgaU9TIFNESyB2ZXJzaW9uOiAnJHtzZGtWZXJzaW9ufSdgKTtcbiAgfVxuXG4gIHJldHVybiBzZGtWZXJzaW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbih0cnVlLCBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0KTtcbiAgLy8gYXMgb2Ygbm93LCB0aGUgaU9TIHZlcnNpb24gYXNzb2NpYXRlZCB3aXRoIGFuIFhjb2RlIHZlcnNpb24gaXNcbiAgLy8ganVzdCB0aGUgWGNvZGUgdmVyc2lvbiArIDJcbiAgcmV0dXJuIGAke3ZlcnNpb24ubWFqb3IgKyAyfS4ke3ZlcnNpb24ubWlub3J9YDtcbn1cblxuY29uc3QgZ2V0TWF4SU9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhJT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gcmV0cmlldmUgbWF4aW11bSBpT1MgdmVyc2lvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGxvZy53YXJuKCdHdWVzc2luZyBmcm9tIFhjb2RlIHZlcnNpb24nKTtcbiAgICAgIHJldHVybiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uKHRpbWVvdXQpO1xuICAgIH1cbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnYXBwbGV0dnNpbXVsYXRvcicsICctLXNob3ctc2RrLXZlcnNpb24nXTtcbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBydW5YY3J1bkNvbW1hbmQoYXJncywgdGltZW91dCk7XG5cbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKGlzTmFOKHBhcnNlRmxvYXQoc2RrVmVyc2lvbikpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB4Y3J1biByZXR1cm5lZCBhIG5vbi1udW1lcmljIHR2T1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG5cbiAgcmV0dXJuIHNka1ZlcnNpb247XG59XG5cbmNvbnN0IGdldE1heFRWT1NTREsgPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldE1heFRWT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ubmVjdGVkRGV2aWNlcyAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgY21kID0gJy91c3Ivc2Jpbi9zeXN0ZW1fcHJvZmlsZXInO1xuICBjb25zdCBhcmdzID0gWycteG1sJywgJ1NQVVNCRGF0YVR5cGUnXTtcbiAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyhjbWQsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIGxldCBwbGlzdENvbnRlbnQgPSBwYXJzZVBsaXN0RGF0YShzdGRvdXQpO1xuXG4gIGxldCBkZXZpY2VzRm91bmQgPSBbXTtcbiAgbGV0IGVudHJpZXNUb1NlYXJjaCA9IFtwbGlzdENvbnRlbnRbMF1dO1xuICB3aGlsZSAoZW50cmllc1RvU2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgY3VycmVudEVudHJ5ID0gZW50cmllc1RvU2VhcmNoLnBvcCgpO1xuICAgIGlmIChjdXJyZW50RW50cnkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZW50cmllc1RvU2VhcmNoID0gZW50cmllc1RvU2VhcmNoLmNvbmNhdChjdXJyZW50RW50cnkpO1xuICAgIH0gZWxzZSBpZiAoKGN1cnJlbnRFbnRyeS5fbmFtZSAmJlxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5fbmFtZS5zdWJzdHJpbmcoMCwgNCkgPT09ICdpUGFkJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkuX25hbWUuc3Vic3RyaW5nKDAsIDYpID09PSAnaVBob25lJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiYgXy5pbmNsdWRlcyhjdXJyZW50RW50cnkuX25hbWUsICdBcHBsZSBUVicpKSkge1xuICAgICAgbGV0IGRldmljZUluZm8gPSB7XG4gICAgICAgIG5hbWU6IGN1cnJlbnRFbnRyeS5fbmFtZSxcbiAgICAgICAgdWRpZDogY3VycmVudEVudHJ5LnNlcmlhbF9udW0sXG4gICAgICAgIHByb2R1Y3RJZDogY3VycmVudEVudHJ5LnByb2R1Y3RfaWQsXG4gICAgICAgIGRldmljZVZlcnNpb246IGN1cnJlbnRFbnRyeS5iY2RfZGV2aWNlXG4gICAgICB9O1xuICAgICAgZGV2aWNlc0ZvdW5kLnB1c2goZGV2aWNlSW5mbyk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50RW50cnkuX2l0ZW1zKSB7XG4gICAgICBlbnRyaWVzVG9TZWFyY2ggPSBlbnRyaWVzVG9TZWFyY2guY29uY2F0KGN1cnJlbnRFbnRyeS5faXRlbXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGV2aWNlc0ZvdW5kO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IGFyZ3MgPSBbJy1maW5kJywgJ2luc3RydW1lbnRzJ107XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBpZiAoIXN0ZG91dCkge1xuICAgIHN0ZG91dCA9ICcnO1xuICB9XG5cbiAgbGV0IGluc3RydW1lbnRzUGF0aCA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKCFpbnN0cnVtZW50c1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gaW5zdHJ1bWVudHMgYmluYXJ5IHVzaW5nICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVtZW50c1BhdGg7XG59XG5cbmNvbnN0IGdldEluc3RydW1lbnRzUGF0aCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0SW5zdHJ1bWVudHNQYXRoIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0SW5zdHJ1bWVudHNQYXRoV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuZnVuY3Rpb24gY2xlYXJJbnRlcm5hbENhY2hlICgpIHtcblxuICAvLyBtZW1vaXplZCBmdW5jdGlvbnNcbiAgY29uc3QgbWVtb2l6ZWQgPSBbXG4gICAgZ2V0UGF0aCwgZ2V0VmVyc2lvbk1lbW9pemVkLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgICBnZXRNYXhUVk9TU0RLLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIF07XG5cbiAgbWVtb2l6ZWQuZm9yRWFjaCgoZikgPT4ge1xuICAgIGlmIChmLmNhY2hlKSB7XG4gICAgICBmLmNhY2hlID0gbmV3IF8ubWVtb2l6ZS5DYWNoZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsIGdldFZlcnNpb24sIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCwgZ2V0TWF4SU9TU0RLLFxuICBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnksIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q29ubmVjdGVkRGV2aWNlcywgY2xlYXJJbnRlcm5hbENhY2hlLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIGdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uLCBnZXRNYXhUVk9TU0RLLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LFxuICBnZXRDbGFuZ1ZlcnNpb24sXG59O1xuIl0sImZpbGUiOiJsaWIveGNvZGUuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
package/index.js CHANGED
@@ -1,6 +1,21 @@
1
1
  // transpile:main
2
2
 
3
- import xcode from './lib/xcode';
3
+ import * as xcode from './lib/xcode';
4
4
 
5
- export { xcode };
5
+
6
+ const {
7
+ getPath, getVersion, getAutomationTraceTemplatePath, getMaxIOSSDK,
8
+ getAutomationTraceTemplatePathWithoutRetry, getMaxIOSSDKWithoutRetry,
9
+ getConnectedDevices, clearInternalCache, getInstrumentsPath,
10
+ getCommandLineToolsVersion, getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry,
11
+ getClangVersion,
12
+ } = xcode;
13
+
14
+ export {
15
+ getPath, getVersion, getAutomationTraceTemplatePath, getMaxIOSSDK,
16
+ getAutomationTraceTemplatePathWithoutRetry, getMaxIOSSDKWithoutRetry,
17
+ getConnectedDevices, clearInternalCache, getInstrumentsPath,
18
+ getCommandLineToolsVersion, getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry,
19
+ getClangVersion,
20
+ };
6
21
  export default xcode;
package/lib/xcode.js CHANGED
@@ -10,7 +10,7 @@ import semver from 'semver';
10
10
  const env = process.env;
11
11
 
12
12
  const XCRUN_TIMEOUT = 15000;
13
- const XCODE_SUBDIR = "/Contents/Developer";
13
+ const XCODE_SUBDIR = '/Contents/Developer';
14
14
  const DEFAULT_NUMBER_OF_RETRIES = 3;
15
15
 
16
16
  const log = logger.getLogger('Xcode');
@@ -22,7 +22,11 @@ function hasExpectedSubDir (path) {
22
22
 
23
23
  async function runXcrunCommand (args, timeout = XCRUN_TIMEOUT) {
24
24
  try {
25
- return await exec('xcrun', args, {timeout});
25
+ const res = await exec('xcrun', args, {timeout});
26
+ if (_.isUndefined(res)) {
27
+ throw new Error(`Nothing returned from trying to run 'xcrun ${args.join(' ')}'`);
28
+ }
29
+ return res;
26
30
  } catch (err) {
27
31
  // the true error can be hidden within the stderr
28
32
  if (err.stderr) {
@@ -41,8 +45,8 @@ async function getPathFromSymlink (failMessage) {
41
45
  // hardcoded paths, this approach will break the next time Apple changes the symlink location.
42
46
  log.warn(`Finding XcodePath by symlink because ${failMessage}`);
43
47
 
44
- const symlinkPath = "/var/db/xcode_select_link";
45
- const legacySymlinkPath = "/usr/share/xcode-select/xcode_dir_link"; // Xcode < 5.x
48
+ const symlinkPath = '/var/db/xcode_select_link';
49
+ const legacySymlinkPath = '/usr/share/xcode-select/xcode_dir_link'; // Xcode < 5.x
46
50
  let xcodePath = null;
47
51
 
48
52
  // xcode-select allows users to override its settings with the DEVELOPER_DIR env var,
@@ -68,7 +72,7 @@ async function getPathFromSymlink (failMessage) {
68
72
  }
69
73
 
70
74
  if (xcodePath) {
71
- return xcodePath.replace(new RegExp("/$"), "").trim();
75
+ return xcodePath.replace(new RegExp('/$'), '').trim();
72
76
  }
73
77
 
74
78
  // We should only get here is we failed to capture xcode-select's stdout and our
@@ -98,7 +102,7 @@ async function getPathFromXcodeSelect (timeout = XCRUN_TIMEOUT) {
98
102
  }
99
103
  }
100
104
 
101
- const getPath = _.memoize(function (timeout = XCRUN_TIMEOUT) {
105
+ const getPath = _.memoize(function getPath (timeout = XCRUN_TIMEOUT) {
102
106
  // first we try using xcode-select to find the path
103
107
  // then we try using the symlinks that Apple has by default
104
108
  return getPathFromXcodeSelect(timeout).catch(getPathFromSymlink);
@@ -111,7 +115,7 @@ async function getVersionWithoutRetry (timeout = XCRUN_TIMEOUT) {
111
115
 
112
116
  // we want to read the CFBundleShortVersionString from Xcode's plist.
113
117
  // It should be in /[root]/XCode.app/Contents/
114
- const plistPath = path.resolve(xcodePath, "..", "Info.plist");
118
+ const plistPath = path.resolve(xcodePath, '..', 'Info.plist');
115
119
 
116
120
  if (!await fs.exists(plistPath)) {
117
121
  throw new Error(`Could not get Xcode version. ${plistPath} does not exist on disk.`);
@@ -122,7 +126,7 @@ async function getVersionWithoutRetry (timeout = XCRUN_TIMEOUT) {
122
126
  }
123
127
 
124
128
  const getVersionMemoized = _.memoize(
125
- function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
129
+ function getVersionMemoized (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
126
130
  return retry(retries, getVersionWithoutRetry, timeout);
127
131
  }
128
132
  );
@@ -141,7 +145,10 @@ async function getVersion (parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, t
141
145
  versionFloat: parseFloat(versionString),
142
146
  major: version.major,
143
147
  minor: version.minor,
144
- patch: version.patch > 0 ? version.patch : undefined
148
+ patch: version.patch > 0 ? version.patch : undefined,
149
+ toString () {
150
+ return versionString;
151
+ },
145
152
  };
146
153
  }
147
154
 
@@ -171,14 +178,39 @@ async function getCommandLineToolsVersion () {
171
178
  return match ? match[1] : undefined;
172
179
  }
173
180
 
181
+ /**
182
+ * Check https://trac.macports.org/wiki/XcodeVersionInfo
183
+ * to see the actual mapping between clang and other components.
184
+ *
185
+ * @returns {?string} The actual Clang version in x.x.x.x or x.x.x format,
186
+ * which is supplied with Command Line Tools. `null` is returned
187
+ * if CLT are not installed.
188
+ */
189
+ async function getClangVersion () {
190
+ try {
191
+ await fs.which('clang');
192
+ } catch (e) {
193
+ log.info('Cannot find clang executable on the local system. ' +
194
+ 'Are Xcode Command Line Tools installed?');
195
+ return null;
196
+ }
197
+ const {stdout} = await exec('clang', ['--version']);
198
+ const match = /clang-([0-9.]+)/.exec(stdout);
199
+ if (!match) {
200
+ log.info(`Cannot parse clang version from ${stdout}`);
201
+ return null;
202
+ }
203
+ return match[1];
204
+ }
205
+
174
206
  async function getAutomationTraceTemplatePathWithoutRetry (timeout = XCRUN_TIMEOUT) {
175
207
  const xcodePath = await getPath(timeout);
176
208
 
177
209
  // for ios 8 and up, the file extension for AutiomationInstrument changed.
178
210
  // rather than waste time getting the iOSSDKVersion, just get both paths and see which one exists
179
211
  const extensions = ['xrplugin', 'bundle'];
180
- const pathPrefix = path.resolve(xcodePath, "../Applications/Instruments.app/Contents/PlugIns");
181
- const pathSuffix = "Contents/Resources/Automation.tracetemplate";
212
+ const pathPrefix = path.resolve(xcodePath, '../Applications/Instruments.app/Contents/PlugIns');
213
+ const pathSuffix = 'Contents/Resources/Automation.tracetemplate';
182
214
  let automationTraceTemplatePaths = [
183
215
  path.resolve(pathPrefix, `AutomationInstrument.${extensions[0]}`, pathSuffix),
184
216
  path.resolve(pathPrefix, `AutomationInstrument.${extensions[1]}`, pathSuffix)
@@ -192,7 +224,7 @@ async function getAutomationTraceTemplatePathWithoutRetry (timeout = XCRUN_TIMEO
192
224
  return automationTraceTemplatePaths[1];
193
225
  }
194
226
 
195
- const msg = "Could not find Automation.tracetemplate in any of the following" +
227
+ const msg = 'Could not find Automation.tracetemplate in any of the following' +
196
228
  `locations ${automationTraceTemplatePaths.toString()}`;
197
229
  log.error(msg);
198
230
  throw new Error(msg);
@@ -200,7 +232,7 @@ async function getAutomationTraceTemplatePathWithoutRetry (timeout = XCRUN_TIMEO
200
232
  }
201
233
 
202
234
  const getAutomationTraceTemplatePath = _.memoize(
203
- function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
235
+ function getAutomationTraceTemplatePath (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
204
236
  return retry(retries, getAutomationTraceTemplatePathWithoutRetry, timeout);
205
237
  }
206
238
  );
@@ -224,9 +256,22 @@ async function getMaxIOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {
224
256
  return sdkVersion;
225
257
  }
226
258
 
259
+ async function getMaxIOSSDKFromXcodeVersion (timeout = XCRUN_TIMEOUT) {
260
+ const version = await getVersion(true, DEFAULT_NUMBER_OF_RETRIES, timeout);
261
+ // as of now, the iOS version associated with an Xcode version is
262
+ // just the Xcode version + 2
263
+ return `${version.major + 2}.${version.minor}`;
264
+ }
265
+
227
266
  const getMaxIOSSDK = _.memoize(
228
- function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
229
- return retry(retries, getMaxIOSSDKWithoutRetry, timeout);
267
+ function getMaxIOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
268
+ try {
269
+ return retry(retries, getMaxIOSSDKWithoutRetry, timeout);
270
+ } catch (err) {
271
+ log.warn(`Unable to retrieve maximum iOS version: ${err.message}`);
272
+ log.warn('Guessing from Xcode version');
273
+ return getMaxIOSSDKFromXcodeVersion(timeout);
274
+ }
230
275
  }
231
276
  );
232
277
 
@@ -244,7 +289,7 @@ async function getMaxTVOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {
244
289
  }
245
290
 
246
291
  const getMaxTVOSSDK = _.memoize(
247
- function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
292
+ function getMaxTVOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
248
293
  return retry(retries, getMaxTVOSSDKWithoutRetry, timeout);
249
294
  }
250
295
  );
@@ -262,10 +307,10 @@ async function getConnectedDevices (timeout = XCRUN_TIMEOUT) {
262
307
  if (currentEntry instanceof Array) {
263
308
  entriesToSearch = entriesToSearch.concat(currentEntry);
264
309
  } else if ((currentEntry._name &&
265
- currentEntry._name.substring(0, 4) === "iPad") ||
310
+ currentEntry._name.substring(0, 4) === 'iPad') ||
266
311
  (currentEntry._name &&
267
- currentEntry._name.substring(0, 6) === "iPhone") ||
268
- (currentEntry._name && _.includes(currentEntry._name, "Apple TV"))) {
312
+ currentEntry._name.substring(0, 6) === 'iPhone') ||
313
+ (currentEntry._name && _.includes(currentEntry._name, 'Apple TV'))) {
269
314
  let deviceInfo = {
270
315
  name: currentEntry._name,
271
316
  udid: currentEntry.serial_num,
@@ -285,7 +330,7 @@ async function getInstrumentsPathWithoutRetry (timeout = XCRUN_TIMEOUT) {
285
330
  let {stdout} = await runXcrunCommand(args, timeout);
286
331
 
287
332
  if (!stdout) {
288
- stdout = "";
333
+ stdout = '';
289
334
  }
290
335
 
291
336
  let instrumentsPath = stdout.trim();
@@ -298,7 +343,7 @@ async function getInstrumentsPathWithoutRetry (timeout = XCRUN_TIMEOUT) {
298
343
  }
299
344
 
300
345
  const getInstrumentsPath = _.memoize(
301
- function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
346
+ function getInstrumentsPath (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
302
347
  return retry(retries, getInstrumentsPathWithoutRetry, timeout);
303
348
  }
304
349
  );
@@ -318,9 +363,10 @@ function clearInternalCache () {
318
363
  });
319
364
  }
320
365
 
321
- export default {
366
+ export {
322
367
  getPath, getVersion, getAutomationTraceTemplatePath, getMaxIOSSDK,
323
368
  getAutomationTraceTemplatePathWithoutRetry, getMaxIOSSDKWithoutRetry,
324
369
  getConnectedDevices, clearInternalCache, getInstrumentsPath,
325
370
  getCommandLineToolsVersion, getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry,
371
+ getClangVersion,
326
372
  };
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "ios",
7
7
  "xcode"
8
8
  ],
9
- "version": "3.7.1",
9
+ "version": "3.10.0",
10
10
  "author": "appium",
11
11
  "license": "Apache-2.0",
12
12
  "repository": {
@@ -36,7 +36,7 @@
36
36
  "asyncbox": "^2.3.0",
37
37
  "lodash": "^4.17.4",
38
38
  "plist": "^3.0.1",
39
- "semver": "^5.5.0",
39
+ "semver": "^7.0.0",
40
40
  "source-map-support": "^0.5.5",
41
41
  "teen_process": "^1.3.0"
42
42
  },
@@ -59,17 +59,12 @@
59
59
  ],
60
60
  "devDependencies": {
61
61
  "ajv": "^6.5.3",
62
- "appium-gulp-plugins": "^3.1.0",
63
- "babel-eslint": "^10.0.0",
62
+ "appium-gulp-plugins": "^5.0.0",
64
63
  "chai": "^4.1.2",
65
64
  "chai-as-promised": "^7.1.1",
66
- "eslint": "^5.2.0",
67
- "eslint-config-appium": "^3.1.0",
68
- "eslint-plugin-import": "^2.2.0",
69
- "eslint-plugin-mocha": "^5.0.0",
70
- "eslint-plugin-promise": "^4.0.0",
65
+ "eslint-config-appium": "^4.2.0",
71
66
  "gulp": "^4.0.0",
72
- "mocha": "^5.1.1",
67
+ "mocha": "^7.0.1",
73
68
  "pre-commit": "^1.1.3"
74
69
  },
75
70
  "greenkeeper": {