appium-chromedriver 5.2.1 → 5.2.3
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/README.md +62 -44
- package/build/lib/chromedriver.js +4 -5
- package/build/lib/chromedriver.js.map +1 -0
- package/build/lib/install.js.map +1 -0
- package/build/lib/protocol-helpers.js.map +1 -0
- package/build/lib/storage-client.js.map +1 -0
- package/build/lib/utils.js +29 -15
- package/build/lib/utils.js.map +1 -0
- package/config/mapping.json +1 -0
- package/lib/chromedriver.js +5 -6
- package/lib/utils.js +26 -15
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,18 +1,70 @@
|
|
|
1
1
|
appium-chromedriver
|
|
2
2
|
===================
|
|
3
3
|
|
|
4
|
-
[](https://github.com/appium/appium-chromedriver/actions/workflows/node.js.yml)
|
|
5
|
-
|
|
6
4
|
[](https://github.com/appium/appium-chromedriver/actions/workflows/publish.js.yml)
|
|
7
5
|
|
|
8
|
-
Node.js wrapper around [Chromedriver](https://sites.google.com/a/chromium.org/chromedriver/)
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
Node.js wrapper around [Chromedriver](https://sites.google.com/a/chromium.org/chromedriver/).
|
|
7
|
+
This wrapper is not used directly in Appium, but rather by various Android drivers to automate
|
|
8
|
+
Chrome/Chromium-based browsers
|
|
9
|
+
and web views using Hybrid Mode approach. Check the corresponding driver tutorials to get
|
|
10
|
+
more details on it.
|
|
11
11
|
|
|
12
12
|
## Skipping binary installation
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
By default, upon installation the package downloads the most recent known Chromedriver version from
|
|
15
|
+
Chromedriver CDN server: http://chromedriver.storage.googleapis.com.
|
|
16
|
+
If, for some reason, you want to install the package without downloading the Chromedriver
|
|
17
|
+
binary set the `APPIUM_SKIP_CHROMEDRIVER_INSTALL` environment variable:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
APPIUM_SKIP_CHROMEDRIVER_INSTALL=1 npm install appium-chromedriver
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Custom Chromedriver version
|
|
24
|
+
|
|
25
|
+
By default, the package uses the most recent known Chromedriver version.
|
|
26
|
+
The full list of known Chromedriver versions and their corresponding supported
|
|
27
|
+
Chrome version could be found in
|
|
28
|
+
[mapping.json](https://github.com/appium/appium-chromedriver/blob/master/config/mapping.json)
|
|
29
|
+
|
|
30
|
+
To download a custom version of Chromedriver, use either npm config property `chromedriver_version`.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install appium-chromedriver --chromedriver_version="2.16"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The property could also be added into your [`.npmrc`](https://docs.npmjs.com/files/npmrc) file.
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
chromedriver_version=2.16
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Another possibility is to set the `CHROMEDRIVER_VERSION` environment variable:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
CHROMEDRIVER_VERSION=2.20 npm install appium-chromedriver
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Custom binaries url
|
|
49
|
+
|
|
50
|
+
If you want Chromedriver to be downloaded from another CDN, which differs from the
|
|
51
|
+
default one http://chromedriver.storage.googleapis.com, then either set the npm config property `chromedriver_cdnurl`:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npm install appium-chromedriver --chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The property could also be added into your [`.npmrc`](https://docs.npmjs.com/files/npmrc) file.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Or set the new URL to `CHROMEDRIVER_CDNURL` environment variable:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
CHROMEDRIVER_CDNURL=http://npm.taobao.org/mirrors/chromedriver npm install appium-chromedriver
|
|
67
|
+
```
|
|
16
68
|
|
|
17
69
|
## Usage
|
|
18
70
|
|
|
@@ -62,53 +114,19 @@ Here are the events you can listen for:
|
|
|
62
114
|
* `Chromedriver.STATE_STOPPING`
|
|
63
115
|
* `Chromedriver.STATE_RESTARTING`
|
|
64
116
|
|
|
65
|
-
## Custom Chromedriver version
|
|
66
|
-
|
|
67
|
-
To use a version of Chromedriver not set in the code, use npm config property `chromedriver_version`.
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
npm install appium-chromedriver --chromedriver_version="2.16"
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
Or add the property into your [`.npmrc`](https://docs.npmjs.com/files/npmrc) file.
|
|
74
117
|
|
|
75
|
-
|
|
76
|
-
chromedriver_version=2.16
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## Custom binaries url
|
|
80
|
-
|
|
81
|
-
To use a mirror of the ChromeDriver binaries use npm config property `chromedriver_cdnurl`.
|
|
82
|
-
Default is `http://chromedriver.storage.googleapis.com`.
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
npm install appium-chromedriver --chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
Or add the property into your [`.npmrc`](https://docs.npmjs.com/files/npmrc) file.
|
|
89
|
-
|
|
90
|
-
```bash
|
|
91
|
-
chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
Another option is to use PATH variable `CHROMEDRIVER_CDNURL`.
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
CHROMEDRIVER_CDNURL=http://npm.taobao.org/mirrors/chromedriver npm install appium-chromedriver
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## Dev
|
|
118
|
+
## Development
|
|
101
119
|
|
|
102
120
|
### Build & Lint
|
|
103
121
|
|
|
104
|
-
```
|
|
122
|
+
```bash
|
|
105
123
|
npm run build
|
|
106
124
|
npm run lint
|
|
107
125
|
```
|
|
108
126
|
|
|
109
127
|
### Run Tests
|
|
110
128
|
|
|
111
|
-
```
|
|
129
|
+
```bash
|
|
112
130
|
npm test
|
|
113
131
|
npm e2e-test
|
|
114
132
|
```
|
|
@@ -44,7 +44,6 @@ const DEFAULT_PORT = 9515;
|
|
|
44
44
|
const CHROME_BUNDLE_ID = 'com.android.chrome';
|
|
45
45
|
const WEBVIEW_SHELL_BUNDLE_ID = 'org.chromium.webview_shell';
|
|
46
46
|
const WEBVIEW_BUNDLE_IDS = ['com.google.android.webview', 'com.android.webview'];
|
|
47
|
-
const CHROMEDRIVER_TUTORIAL = 'https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md';
|
|
48
47
|
const VERSION_PATTERN = /([\d.]+)/;
|
|
49
48
|
const CD_VERSION_TIMEOUT = 5000;
|
|
50
49
|
|
|
@@ -424,8 +423,8 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
424
423
|
}
|
|
425
424
|
}
|
|
426
425
|
|
|
427
|
-
const autodownloadSuggestion = 'You could also try to enable automated chromedrivers download
|
|
428
|
-
throw new Error(`No Chromedriver found that can automate Chrome '${chromeVersion}'
|
|
426
|
+
const autodownloadSuggestion = 'You could also try to enable automated chromedrivers download as ' + 'a possible workaround.';
|
|
427
|
+
throw new Error(`No Chromedriver found that can automate Chrome '${chromeVersion}'.` + (this.storageClient ? '' : ` ${autodownloadSuggestion}`));
|
|
429
428
|
}
|
|
430
429
|
|
|
431
430
|
const binPath = matchingDrivers[0].executable;
|
|
@@ -577,7 +576,7 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
577
576
|
message += `Chromedriver supports Chrome version(s): ${versionsSupportedByDriver}\n`;
|
|
578
577
|
}
|
|
579
578
|
|
|
580
|
-
message +=
|
|
579
|
+
message += 'Check the driver tutorial for troubleshooting.\n';
|
|
581
580
|
}
|
|
582
581
|
|
|
583
582
|
message += e.message;
|
|
@@ -734,4 +733,4 @@ Chromedriver.STATE_STOPPING = 'stopping';
|
|
|
734
733
|
Chromedriver.STATE_RESTARTING = 'restarting';
|
|
735
734
|
var _default = Chromedriver;
|
|
736
735
|
exports.default = _default;
|
|
737
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTiIsIkRFRkFVTFRfSE9TVCIsIk1JTl9DRF9WRVJTSU9OX1dJVEhfVzNDX1NVUFBPUlQiLCJERUZBVUxUX1BPUlQiLCJDSFJPTUVfQlVORExFX0lEIiwiV0VCVklFV19TSEVMTF9CVU5ETEVfSUQiLCJXRUJWSUVXX0JVTkRMRV9JRFMiLCJDSFJPTUVEUklWRVJfVFVUT1JJQUwiLCJWRVJTSU9OX1BBVFRFUk4iLCJDRF9WRVJTSU9OX1RJTUVPVVQiLCJDaHJvbWVkcml2ZXIiLCJldmVudHMiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJob3N0IiwicG9ydCIsInVzZVN5c3RlbUV4ZWN1dGFibGUiLCJleGVjdXRhYmxlIiwiZXhlY3V0YWJsZURpciIsImdldENocm9tZWRyaXZlckRpciIsImJ1bmRsZUlkIiwibWFwcGluZ1BhdGgiLCJjbWRBcmdzIiwiYWRiIiwidmVyYm9zZSIsImxvZ1BhdGgiLCJkaXNhYmxlQnVpbGRDaGVjayIsImRldGFpbHMiLCJpc0F1dG9kb3dubG9hZEVuYWJsZWQiLCJfbG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiZ2VuZXJhdGVMb2dQcmVmaXgiLCJwcm94eUhvc3QiLCJwcm94eVBvcnQiLCJwcm9jIiwiY2hyb21lZHJpdmVyIiwiZXhlY3V0YWJsZVZlcmlmaWVkIiwic3RhdGUiLCJTVEFURV9TVE9QUEVEIiwiandwcm94eSIsIkpXUHJveHkiLCJzZXJ2ZXIiLCJsb2ciLCJzdG9yYWdlQ2xpZW50IiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNocm9tZWRyaXZlckRpciIsImNhcGFiaWxpdGllcyIsImRlc2lyZWRQcm90b2NvbCIsIlBST1RPQ09MUyIsIk1KU09OV1AiLCJnZXREcml2ZXJzTWFwcGluZyIsIm1hcHBpbmciLCJfIiwiY2xvbmVEZWVwIiwiQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HIiwiZGVidWciLCJmcyIsImV4aXN0cyIsIndhcm4iLCJpbmZvIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGUiLCJlcnIiLCJtZXNzYWdlIiwiY2RWZXJzaW9uIiwiY2hyb21lVmVyc2lvbiIsInRvUGFpcnMiLCJjb2VyY2VkVmVyc2lvbiIsInNlbXZlciIsImNvZXJjZSIsInZlcnNpb24iLCJnZXRDaHJvbWVkcml2ZXJzIiwiZXhlY3V0YWJsZXMiLCJnbG9iIiwiY3dkIiwic3RyaWN0Iiwibm9kaXIiLCJhYnNvbHV0ZSIsInV0aWwiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJjZHMiLCJhc3luY21hcCIsImxvZ0Vycm9yIiwic3Rkb3V0Iiwic3RkZXJyIiwiZXJyTXNnIiwicGF0aCIsImJhc2VuYW1lIiwiZXhlYyIsInRpbWVvdXQiLCJpbmNsdWRlcyIsIm1hdGNoIiwibWluQ2hyb21lVmVyc2lvbiIsIm1ham9yIiwibWlub3IiLCJmaWx0ZXIiLCJjZCIsInNvcnQiLCJhIiwiYiIsImNvbXBhcmVWZXJzaW9ucyIsImlzRW1wdHkiLCJnZXRDaHJvbWVWZXJzaW9uIiwiQnJvd3NlciIsInZlcnNpb25NYXRjaCIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJ1cGRhdGVEcml2ZXJzTWFwcGluZyIsIm5ld01hcHBpbmciLCJzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nIiwid3JpdGVGaWxlIiwic3RyaW5naWZ5IiwiZSIsIk9iamVjdCIsImFzc2lnbiIsImdldENvbXBhdGlibGVDaHJvbWVkcml2ZXIiLCJnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIiwidmFsdWVzIiwiZGlkU3RvcmFnZVN5bmMiLCJzeW5jQ2hyb21lZHJpdmVycyIsInJldHJpZXZlZE1hcHBpbmciLCJyZXRyaWV2ZU1hcHBpbmciLCJkcml2ZXJLZXlzIiwic3luY0RyaXZlcnMiLCJtaW5Ccm93c2VyVmVyc2lvbiIsInN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nIiwicmVkdWNlIiwiYWNjIiwieCIsIm1pc3NpbmdWZXJzaW9ucyIsImNvZXJjZWRWZXIiLCJzaXplIiwiZXJyb3JBbmRUaHJvdyIsIm1hdGNoaW5nRHJpdmVycyIsIm1pbkNocm9tZVZlcnNpb25TIiwiZ3RlIiwiQ0RfQ0ROIiwic3RhY2siLCJhdXRvZG93bmxvYWRTdWdnZXN0aW9uIiwiRXJyb3IiLCJiaW5QYXRoIiwiaW5pdENocm9tZWRyaXZlclBhdGgiLCJzeW5jUHJvdG9jb2wiLCJXM0MiLCJjaHJvbWVPcHRpb25zIiwiZ2V0Q2FwVmFsdWUiLCJ3M2MiLCJ0b1czY0NhcE5hbWVzIiwic3RhcnQiLCJjYXBzIiwiZW1pdFN0YXJ0aW5nU3RhdGUiLCJsb2dnaW5nUHJlZnMiLCJicm93c2VyIiwiY2hhbmdlU3RhdGUiLCJTVEFURV9TVEFSVElORyIsImFkYlBvcnQiLCJwdXNoIiwiaXNBcnJheSIsInN0YXJ0RGV0ZWN0b3IiLCJzdGFydHNXaXRoIiwicHJvY2Vzc0lzQWxpdmUiLCJ3ZWJ2aWV3VmVyc2lvbiIsImtpbGxBbGwiLCJTdWJQcm9jZXNzIiwib24iLCJvdXQiLCJsaW5lIiwidHJpbSIsInNwbGl0IiwiZXJyb3IiLCJjb2RlIiwic2lnbmFsIiwiU1RBVEVfU1RPUFBJTkciLCJTVEFURV9SRVNUQVJUSU5HIiwibXNnIiwiam9pbiIsIndhaXRGb3JPbmxpbmUiLCJzdGFydFNlc3Npb24iLCJlbWl0IiwiRVZFTlRfRVJST1IiLCJzdG9wIiwidmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlciIsInNlc3Npb25JZCIsIlNUQVRFX09OTElORSIsInJlc3RhcnQiLCJjaHJvbWVkcml2ZXJTdG9wcGVkIiwicmV0cnlJbnRlcnZhbCIsImdldFN0YXR1cyIsImNvbW1hbmQiLCJzZXNzaW9uQ2FwcyIsImFsd2F5c01hdGNoIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsInByZWZpeCIsImVtaXRTdGF0ZXMiLCJydW5TYWZlU3RlcCIsImYiLCJFVkVOVF9DSEFOR0VEIiwic2VuZENvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwicHJveHlSZXEiLCJyZXEiLCJyZXMiLCJwcm94eVJlcVJlcyIsImNtZCIsInN5c3RlbSIsImlzV2luZG93cyIsIkIiLCJwcm9taXNpZnkiLCJjcCIsInVkaWRJbmRleCIsImRlZmF1bHRBcmdzIiwiZmluZEluZGV4IiwiaXRlbSIsInVkaWQiLCJjb25uIiwiZ2V0Rm9yd2FyZExpc3QiLCJwYXJhbXMiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsInJlcGxhY2UiLCJoYXNXb3JraW5nV2VidmlldyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jaHJvbWVkcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IGV2ZW50cyBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgSldQcm94eSwgUFJPVE9DT0xTIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgY3AgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCBsb2dnZXIsIHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsLCBhc3luY21hcCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtcbiAgZ2V0Q2hyb21lVmVyc2lvbiwgZ2V0Q2hyb21lZHJpdmVyRGlyLCBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsXG4gIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgsIENEX0NETiwgZ2VuZXJhdGVMb2dQcmVmaXhcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IGZyb20gJy4vc3RvcmFnZS1jbGllbnQnO1xuaW1wb3J0IHsgdG9XM2NDYXBOYW1lcywgZ2V0Q2FwVmFsdWUgfSBmcm9tICcuL3Byb3RvY29sLWhlbHBlcnMnO1xuXG5jb25zdCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTiA9IDczO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUID0gNzU7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA5NTE1O1xuY29uc3QgQ0hST01FX0JVTkRMRV9JRCA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgV0VCVklFV19TSEVMTF9CVU5ETEVfSUQgPSAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnO1xuY29uc3QgV0VCVklFV19CVU5ETEVfSURTID0gW1xuICAnY29tLmdvb2dsZS5hbmRyb2lkLndlYnZpZXcnLFxuICAnY29tLmFuZHJvaWQud2VidmlldycsXG5dO1xuY29uc3QgQ0hST01FRFJJVkVSX1RVVE9SSUFMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2Jsb2IvbWFzdGVyL2RvY3MvZW4vd3JpdGluZy1ydW5uaW5nLWFwcGl1bS93ZWIvY2hyb21lZHJpdmVyLm1kJztcbmNvbnN0IFZFUlNJT05fUEFUVEVSTiA9IC8oW1xcZC5dKykvO1xuXG5jb25zdCBDRF9WRVJTSU9OX1RJTUVPVVQgPSA1MDAwO1xuXG5jbGFzcyBDaHJvbWVkcml2ZXIgZXh0ZW5kcyBldmVudHMuRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKGFyZ3MgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBob3N0ID0gREVGQVVMVF9IT1NULFxuICAgICAgcG9ydCA9IERFRkFVTFRfUE9SVCxcbiAgICAgIHVzZVN5c3RlbUV4ZWN1dGFibGUgPSBmYWxzZSxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBleGVjdXRhYmxlRGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKCksXG4gICAgICBidW5kbGVJZCxcbiAgICAgIG1hcHBpbmdQYXRoLFxuICAgICAgY21kQXJncyxcbiAgICAgIGFkYixcbiAgICAgIHZlcmJvc2UsXG4gICAgICBsb2dQYXRoLFxuICAgICAgZGlzYWJsZUJ1aWxkQ2hlY2ssXG4gICAgICBkZXRhaWxzLFxuICAgICAgaXNBdXRvZG93bmxvYWRFbmFibGVkID0gZmFsc2UsXG4gICAgfSA9IGFyZ3M7XG4gICAgdGhpcy5fbG9nID0gbG9nZ2VyLmdldExvZ2dlcihnZW5lcmF0ZUxvZ1ByZWZpeCh0aGlzKSk7XG5cbiAgICB0aGlzLnByb3h5SG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5wcm94eVBvcnQgPSBwb3J0O1xuICAgIHRoaXMuYWRiID0gYWRiO1xuICAgIHRoaXMuY21kQXJncyA9IGNtZEFyZ3M7XG4gICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgICB0aGlzLnVzZVN5c3RlbUV4ZWN1dGFibGUgPSB1c2VTeXN0ZW1FeGVjdXRhYmxlO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gZXhlY3V0YWJsZTtcbiAgICB0aGlzLmV4ZWN1dGFibGVEaXIgPSBleGVjdXRhYmxlRGlyO1xuICAgIHRoaXMubWFwcGluZ1BhdGggPSBtYXBwaW5nUGF0aDtcbiAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgdGhpcy5leGVjdXRhYmxlVmVyaWZpZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXRlID0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQ7XG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IEpXUHJveHkoe1xuICAgICAgc2VydmVyOiB0aGlzLnByb3h5SG9zdCxcbiAgICAgIHBvcnQ6IHRoaXMucHJveHlQb3J0LFxuICAgICAgbG9nOiB0aGlzLl9sb2csXG4gICAgfSk7XG4gICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTtcbiAgICB0aGlzLmxvZ1BhdGggPSBsb2dQYXRoO1xuICAgIHRoaXMuZGlzYWJsZUJ1aWxkQ2hlY2sgPSAhIWRpc2FibGVCdWlsZENoZWNrO1xuICAgIHRoaXMuc3RvcmFnZUNsaWVudCA9IGlzQXV0b2Rvd25sb2FkRW5hYmxlZFxuICAgICAgPyBuZXcgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCh7IGNocm9tZWRyaXZlckRpcjogdGhpcy5leGVjdXRhYmxlRGlyIH0pXG4gICAgICA6IG51bGw7XG4gICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB0aGlzLmNhcGFiaWxpdGllcyA9IHt9O1xuICAgIHRoaXMuZGVzaXJlZFByb3RvY29sID0gUFJPVE9DT0xTLk1KU09OV1A7XG4gIH1cblxuICBnZXQgbG9nICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbG9nO1xuICB9XG5cbiAgYXN5bmMgZ2V0RHJpdmVyc01hcHBpbmcgKCkge1xuICAgIGxldCBtYXBwaW5nID0gXy5jbG9uZURlZXAoQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HKTtcbiAgICBpZiAodGhpcy5tYXBwaW5nUGF0aCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8gdXNlIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcgZnJvbSAnJHt0aGlzLm1hcHBpbmdQYXRofSdgKTtcbiAgICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHRoaXMubWFwcGluZ1BhdGgpKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYE5vIGZpbGUgZm91bmQgYXQgJyR7dGhpcy5tYXBwaW5nUGF0aH0nYCk7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0RlZmF1bHRpbmcgdG8gdGhlIHN0YXRpYyBDaHJvbWVkcml2ZXItPkNocm9tZSBtYXBwaW5nJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1hcHBpbmcgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHRoaXMubWFwcGluZ1BhdGgsICd1dGY4JykpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciBwYXJzaW5nIG1hcHBpbmcgZnJvbSAnJHt0aGlzLm1hcHBpbmdQYXRofSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbygnRGVmYXVsdGluZyB0byB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnVXNpbmcgdGhlIHN0YXRpYyBDaHJvbWVkcml2ZXItPkNocm9tZSBtYXBwaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlcyBmb3IgbWluaW11bSBjaHJvbWUgdmVyc2lvbiBhcmUgc2VtdmVyIGNvbXBsaWFudFxuICAgIGZvciAoY29uc3QgW2NkVmVyc2lvbiwgY2hyb21lVmVyc2lvbl0gb2YgXy50b1BhaXJzKG1hcHBpbmcpKSB7XG4gICAgICBjb25zdCBjb2VyY2VkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UoY2hyb21lVmVyc2lvbik7XG4gICAgICBpZiAoY29lcmNlZFZlcnNpb24pIHtcbiAgICAgICAgbWFwcGluZ1tjZFZlcnNpb25dID0gY29lcmNlZFZlcnNpb24udmVyc2lvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYCcke2Nocm9tZVZlcnNpb259JyBpcyBub3QgYSB2YWxpZCB2ZXJzaW9uIG51bWJlci4gU2tpcHBpbmcgaXRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcHBpbmc7XG4gIH1cblxuICBhc3luYyBnZXRDaHJvbWVkcml2ZXJzIChtYXBwaW5nKSB7XG4gICAgLy8gZ28gdGhyb3VnaCB0aGUgdmVyc2lvbnMgYXZhaWxhYmxlXG4gICAgY29uc3QgZXhlY3V0YWJsZXMgPSBhd2FpdCBmcy5nbG9iKCcqJywge1xuICAgICAgY3dkOiB0aGlzLmV4ZWN1dGFibGVEaXIsXG4gICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgbm9kaXI6IHRydWUsXG4gICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgRm91bmQgJHt1dGlsLnBsdXJhbGl6ZSgnZXhlY3V0YWJsZScsIGV4ZWN1dGFibGVzLmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgICAgYGluICcke3RoaXMuZXhlY3V0YWJsZURpcn0nYCk7XG4gICAgY29uc3QgY2RzID0gKGF3YWl0IGFzeW5jbWFwKGV4ZWN1dGFibGVzLCBhc3luYyAoZXhlY3V0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgbG9nRXJyb3IgPSAoe21lc3NhZ2UsIHN0ZG91dCA9IG51bGwsIHN0ZGVyciA9IG51bGx9KSA9PiB7XG4gICAgICAgIGxldCBlcnJNc2cgPSBgQ2Fubm90IHJldHJpZXZlIHZlcnNpb24gbnVtYmVyIGZyb20gJyR7cGF0aC5iYXNlbmFtZShleGVjdXRhYmxlKX0nIENocm9tZWRyaXZlciBiaW5hcnkuIGAgK1xuICAgICAgICAgIGBNYWtlIHN1cmUgaXQgcmV0dXJucyBhIHZhbGlkIHZlcnNpb24gc3RyaW5nIGluIHJlc3BvbnNlIHRvICctLXZlcnNpb24nIGNvbW1hbmQgbGluZSBhcmd1bWVudC4gJHttZXNzYWdlfWA7XG4gICAgICAgIGlmIChzdGRvdXQpIHtcbiAgICAgICAgICBlcnJNc2cgKz0gYFxcblN0ZG91dDogJHtzdGRvdXR9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgZXJyTXNnICs9IGBcXG5TdGRlcnI6ICR7c3RkZXJyfWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2cud2FybihlcnJNc2cpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIGxldCBzdGRvdXQ7XG4gICAgICBsZXQgc3RkZXJyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHtzdGRvdXQsIHN0ZGVycn0gPSBhd2FpdCBleGVjKGV4ZWN1dGFibGUsIFsnLS12ZXJzaW9uJ10sIHtcbiAgICAgICAgICB0aW1lb3V0OiBDRF9WRVJTSU9OX1RJTUVPVVQsXG4gICAgICAgIH0pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIShlcnIubWVzc2FnZSB8fCAnJykuaW5jbHVkZXMoJ3RpbWVkIG91dCcpICYmICEoZXJyLnN0ZG91dCB8fCAnJykuaW5jbHVkZXMoJ1N0YXJ0aW5nIENocm9tZURyaXZlcicpKSB7XG4gICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGlzIGhhcyB0aW1lZCBvdXQsIGl0IGhhcyBhY3R1YWxseSBzdGFydGVkIENocm9tZWRyaXZlcixcbiAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB0aGVyZSB3aWxsIGFsc28gYmUgdGhlIHZlcnNpb24gc3RyaW5nIGluIHRoZSBvdXRwdXRcbiAgICAgICAgc3Rkb3V0ID0gZXJyLnN0ZG91dDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF0Y2ggPSAvQ2hyb21lRHJpdmVyXFxzK1xcKD92PyhbXFxkLl0rKVxcKT8vaS5leGVjKHN0ZG91dCk7IC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvenBqNXdBLzFcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKHttZXNzYWdlOiAnQ2Fubm90IHBhcnNlIHRoZSB2ZXJzaW9uIHN0cmluZycsIHN0ZG91dCwgc3RkZXJyfSk7XG4gICAgICB9XG4gICAgICBsZXQgdmVyc2lvbiA9IG1hdGNoWzFdO1xuICAgICAgbGV0IG1pbkNocm9tZVZlcnNpb24gPSBtYXBwaW5nW3ZlcnNpb25dO1xuICAgICAgY29uc3QgY29lcmNlZFZlcnNpb24gPSBzZW12ZXIuY29lcmNlKHZlcnNpb24pO1xuICAgICAgaWYgKGNvZXJjZWRWZXJzaW9uKSB7XG4gICAgICAgIC8vIGJlZm9yZSAyMDE5LTAzLTA2IHZlcnNpb25zIHdlcmUgb2YgdGhlIGZvcm0gbWFqb3IubWlub3JcbiAgICAgICAgaWYgKGNvZXJjZWRWZXJzaW9uLm1ham9yIDwgTkVXX0NEX1ZFUlNJT05fRk9STUFUX01BSk9SX1ZFUlNJT04pIHtcbiAgICAgICAgICB2ZXJzaW9uID0gYCR7Y29lcmNlZFZlcnNpb24ubWFqb3J9LiR7Y29lcmNlZFZlcnNpb24ubWlub3J9YDtcbiAgICAgICAgICBtaW5DaHJvbWVWZXJzaW9uID0gbWFwcGluZ1t2ZXJzaW9uXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1pbkNocm9tZVZlcnNpb24gJiYgY29lcmNlZFZlcnNpb24ubWFqb3IgPj0gTkVXX0NEX1ZFUlNJT05fRk9STUFUX01BSk9SX1ZFUlNJT04pIHtcbiAgICAgICAgICAvLyBBc3N1bWUgdGhlIG1ham9yIENocm9tZSB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGRyaXZlciBtYWpvciB2ZXJzaW9uXG4gICAgICAgICAgbWluQ2hyb21lVmVyc2lvbiA9IGAke2NvZXJjZWRWZXJzaW9uLm1ham9yfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4ZWN1dGFibGUsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIG1pbkNocm9tZVZlcnNpb24sXG4gICAgICB9O1xuICAgIH0pKVxuICAgICAgLmZpbHRlcigoY2QpID0+ICEhY2QpXG4gICAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZVZlcnNpb25zKGIudmVyc2lvbiwgYS52ZXJzaW9uKSk7XG4gICAgaWYgKF8uaXNFbXB0eShjZHMpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBObyBDaHJvbWVkcml2ZXJzIHdlcmUgZm91bmQgaW4gJyR7dGhpcy5leGVjdXRhYmxlRGlyfSdgKTtcbiAgICAgIHJldHVybiBjZHM7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBUaGUgZm9sbG93aW5nIENocm9tZWRyaXZlciBleGVjdXRhYmxlcyB3ZXJlIGZvdW5kOmApO1xuICAgIGZvciAoY29uc3QgY2Qgb2YgY2RzKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgICAgICcke2NkLmV4ZWN1dGFibGV9JyAodmVyc2lvbiAnJHtjZC52ZXJzaW9ufScsIG1pbmltdW0gQ2hyb21lIHZlcnNpb24gJyR7Y2QubWluQ2hyb21lVmVyc2lvbiA/IGNkLm1pbkNocm9tZVZlcnNpb24gOiAnVW5rbm93bid9JylgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNkcztcbiAgfVxuXG4gIGFzeW5jIGdldENocm9tZVZlcnNpb24gKCkge1xuICAgIC8vIFRyeSB0byByZXRyaWV2ZSB0aGUgdmVyc2lvbiBmcm9tIGBkZXRhaWxzYCBwcm9wZXJ0eSBpZiBpdCBpcyBzZXRcbiAgICAvLyBUaGUgYGluZm9gIGl0ZW0gbXVzdCBjb250YWluIHRoZSBvdXRwdXQgb2YgL2pzb24vdmVyc2lvbiBDRFAgY29tbWFuZFxuICAgIC8vIHdoZXJlIGBCcm93c2VyYCBmaWVsZCBsb29rcyBsaWtlIGBDaHJvbWUvNzIuMC4zNjAxLjBgYFxuICAgIGlmICh0aGlzLmRldGFpbHM/LmluZm8pIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBCcm93c2VyIHZlcnNpb24gaW4gdGhlIHN1cHBsaWVkIGRldGFpbHM6ICR7dGhpcy5kZXRhaWxzPy5pbmZvPy5Ccm93c2VyfWApO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBWRVJTSU9OX1BBVFRFUk4uZXhlYyh0aGlzLmRldGFpbHM/LmluZm8/LkJyb3dzZXIpO1xuICAgIGlmICh2ZXJzaW9uTWF0Y2gpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZSh2ZXJzaW9uTWF0Y2hbMV0pO1xuICAgICAgaWYgKGNvZXJjZWRWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBjb2VyY2VkVmVyc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY2hyb21lVmVyc2lvbjtcblxuICAgIC8vIGluIGNhc2Ugb2YgV2ViVmlldyBCcm93c2VyIFRlc3Rlciwgc2ltcGx5IHRyeSB0byBmaW5kIHRoZSB1bmRlcmx5aW5nIHdlYnZpZXdcbiAgICBpZiAodGhpcy5idW5kbGVJZCA9PT0gV0VCVklFV19TSEVMTF9CVU5ETEVfSUQpIHtcbiAgICAgIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgV0VCVklFV19CVU5ETEVfSURTKSB7XG4gICAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCBidW5kbGVJZCk7XG4gICAgICAgIGlmIChjaHJvbWVWZXJzaW9uKSB7XG4gICAgICAgICAgdGhpcy5idW5kbGVJZCA9IGJ1bmRsZUlkO1xuICAgICAgICAgIHJldHVybiBzZW12ZXIuY29lcmNlKGNocm9tZVZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBvbiBBbmRyb2lkIDctOSB3ZWJ2aWV3cyBhcmUgYmFja2VkIGJ5IHRoZSBtYWluIENocm9tZSwgbm90IHRoZSBzeXN0ZW0gd2Vidmlld1xuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICAgICAgaWYgKGFwaUxldmVsID49IDI0ICYmIGFwaUxldmVsIDw9IDI4ICYmXG4gICAgICAgICAgW1dFQlZJRVdfU0hFTExfQlVORExFX0lELCAuLi5XRUJWSUVXX0JVTkRMRV9JRFNdLmluY2x1ZGVzKHRoaXMuYnVuZGxlSWQpKSB7XG4gICAgICAgIHRoaXMuYnVuZGxlSWQgPSBDSFJPTUVfQlVORExFX0lEO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRyeSBvdXQgd2Vidmlld3Mgd2hlbiBubyBidW5kbGUgaWQgaXMgc2VudCBpblxuICAgIGlmICghdGhpcy5idW5kbGVJZCkge1xuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZ2VuZXJpYyBDaHJvbWUgYnVuZGxlXG4gICAgICB0aGlzLmJ1bmRsZUlkID0gQ0hST01FX0JVTkRMRV9JRDtcblxuICAgICAgLy8gd2UgaGF2ZSBhIHdlYnZpZXcgb2Ygc29tZSBzb3J0LCBzbyB0cnkgdG8gZmluZCB0aGUgYnVuZGxlIHZlcnNpb25cbiAgICAgIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgV0VCVklFV19CVU5ETEVfSURTKSB7XG4gICAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCBidW5kbGVJZCk7XG4gICAgICAgIGlmIChjaHJvbWVWZXJzaW9uKSB7XG4gICAgICAgICAgdGhpcy5idW5kbGVJZCA9IGJ1bmRsZUlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgZG8gbm90IGhhdmUgYSBjaHJvbWUgdmVyc2lvbiwgaXQgbXVzdCBub3QgYmUgYSB3ZWJ2aWV3XG4gICAgaWYgKCFjaHJvbWVWZXJzaW9uKSB7XG4gICAgICBjaHJvbWVWZXJzaW9uID0gYXdhaXQgZ2V0Q2hyb21lVmVyc2lvbih0aGlzLmFkYiwgdGhpcy5idW5kbGVJZCk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIGl0IGlzIHNlbXZlciwgc28gbGF0ZXIgY2hlY2tzIHdvbid0IGZhaWxcbiAgICByZXR1cm4gY2hyb21lVmVyc2lvbiA/IHNlbXZlci5jb2VyY2UoY2hyb21lVmVyc2lvbikgOiBudWxsO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRHJpdmVyc01hcHBpbmcgKG5ld01hcHBpbmcpIHtcbiAgICBsZXQgc2hvdWxkVXBkYXRlU3RhdGljTWFwcGluZyA9IHRydWU7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyh0aGlzLm1hcHBpbmdQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRoaXMubWFwcGluZ1BhdGgsIEpTT04uc3RyaW5naWZ5KG5ld01hcHBpbmcsIG51bGwsIDIpLCAndXRmOCcpO1xuICAgICAgICBzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBzdG9yZSB0aGUgdXBkYXRlZCBjaHJvbWVkcml2ZXJzIG1hcHBpbmcgaW50byAnJHt0aGlzLm1hcHBpbmdQYXRofScuIGAgK1xuICAgICAgICAgIGBUaGlzIG1heSByZWR1Y2UgdGhlIHBlcmZvcm1hbmNlIG9mIGZ1cnRoZXIgZXhlY3V0aW9ucy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkVXBkYXRlU3RhdGljTWFwcGluZykge1xuICAgICAgT2JqZWN0LmFzc2lnbihDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsIG5ld01hcHBpbmcpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENvbXBhdGlibGVDaHJvbWVkcml2ZXIgKCkge1xuICAgIGlmICghdGhpcy5hZGIpIHtcbiAgICAgIHJldHVybiBhd2FpdCBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWFwcGluZyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyc01hcHBpbmcoKTtcbiAgICBpZiAoIV8uaXNFbXB0eShtYXBwaW5nKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFRoZSBtb3N0IHJlY2VudCBrbm93biBDaHJvbWUgdmVyc2lvbjogJHtfLnZhbHVlcyhtYXBwaW5nKVswXX1gKTtcbiAgICB9XG5cbiAgICBsZXQgZGlkU3RvcmFnZVN5bmMgPSBmYWxzZTtcbiAgICBjb25zdCBzeW5jQ2hyb21lZHJpdmVycyA9IGFzeW5jIChjaHJvbWVWZXJzaW9uKSA9PiB7XG4gICAgICBkaWRTdG9yYWdlU3luYyA9IHRydWU7XG4gICAgICBjb25zdCByZXRyaWV2ZWRNYXBwaW5nID0gYXdhaXQgdGhpcy5zdG9yYWdlQ2xpZW50LnJldHJpZXZlTWFwcGluZygpO1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ0dvdCBjaHJvbWVkcml2ZXJzIG1hcHBpbmcgZnJvbSB0aGUgc3RvcmFnZTogJyArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHJldHJpZXZlZE1hcHBpbmcsIG51bGwsIDIpKTtcbiAgICAgIGNvbnN0IGRyaXZlcktleXMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VDbGllbnQuc3luY0RyaXZlcnMoe1xuICAgICAgICBtaW5Ccm93c2VyVmVyc2lvbjogY2hyb21lVmVyc2lvbi5tYWpvcixcbiAgICAgIH0pO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJLZXlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzeW5jaHJvbml6ZWREcml2ZXJzTWFwcGluZyA9IGRyaXZlcktleXMucmVkdWNlKChhY2MsIHgpID0+IHtcbiAgICAgICAgY29uc3Qge3ZlcnNpb24sIG1pbkJyb3dzZXJWZXJzaW9ufSA9IHJldHJpZXZlZE1hcHBpbmdbeF07XG4gICAgICAgIGFjY1t2ZXJzaW9uXSA9IG1pbkJyb3dzZXJWZXJzaW9uO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pO1xuICAgICAgT2JqZWN0LmFzc2lnbihtYXBwaW5nLCBzeW5jaHJvbml6ZWREcml2ZXJzTWFwcGluZyk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZURyaXZlcnNNYXBwaW5nKG1hcHBpbmcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGNkcyA9IGF3YWl0IHRoaXMuZ2V0Q2hyb21lZHJpdmVycyhtYXBwaW5nKTtcblxuICAgICAgY29uc3QgbWlzc2luZ1ZlcnNpb25zID0ge307XG4gICAgICBmb3IgKGNvbnN0IHt2ZXJzaW9uLCBtaW5DaHJvbWVWZXJzaW9ufSBvZiBjZHMpIHtcbiAgICAgICAgaWYgKCFtaW5DaHJvbWVWZXJzaW9uIHx8IG1hcHBpbmdbdmVyc2lvbl0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2VyY2VkVmVyID0gc2VtdmVyLmNvZXJjZSh2ZXJzaW9uKTtcbiAgICAgICAgaWYgKCFjb2VyY2VkVmVyIHx8IGNvZXJjZWRWZXIubWFqb3IgPCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWlzc2luZ1ZlcnNpb25zW3ZlcnNpb25dID0gbWluQ2hyb21lVmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmICghXy5pc0VtcHR5KG1pc3NpbmdWZXJzaW9ucykpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgRm91bmQgJHt1dGlsLnBsdXJhbGl6ZSgnQ2hyb21lZHJpdmVyJywgXy5zaXplKG1pc3NpbmdWZXJzaW9ucyksIHRydWUpfSwgYCArXG4gICAgICAgICAgYHdoaWNoICR7Xy5zaXplKG1pc3NpbmdWZXJzaW9ucykgPT09IDEgPyAnaXMnIDogJ2FyZSd9IG1pc3NpbmcgaW4gdGhlIGxpc3Qgb2Yga25vd24gdmVyc2lvbnM6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG1pc3NpbmdWZXJzaW9ucykpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZURyaXZlcnNNYXBwaW5nKE9iamVjdC5hc3NpZ24obWFwcGluZywgbWlzc2luZ1ZlcnNpb25zKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRpc2FibGVCdWlsZENoZWNrKSB7XG4gICAgICAgIGlmIChfLmlzRW1wdHkoY2RzKSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIENocm9tZWRyaXZlciBleGVjdXRhYmxlIGF2YWlsYWJsZSBmb3IgdXNlIGlmIGAgK1xuICAgICAgICAgICAgYCdjaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjaycgY2FwYWJpbGl0eSBpcyBzZXQgdG8gJ3RydWUnYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qge3ZlcnNpb24sIGV4ZWN1dGFibGV9ID0gY2RzWzBdO1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDaHJvbWUgYnVpbGQgY2hlY2sgZGlzYWJsZWQuIFVzaW5nIG1vc3QgcmVjZW50IENocm9tZWRyaXZlciB2ZXJzaW9uICgke3ZlcnNpb259LCBhdCAnJHtleGVjdXRhYmxlfScpYCk7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYElmIHRoaXMgaXMgd3JvbmcsIHNldCAnY2hyb21lZHJpdmVyRGlzYWJsZUJ1aWxkQ2hlY2snIGNhcGFiaWxpdHkgdG8gJ2ZhbHNlJ2ApO1xuICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hyb21lVmVyc2lvbiA9IGF3YWl0IHRoaXMuZ2V0Q2hyb21lVmVyc2lvbigpO1xuICAgICAgaWYgKCFjaHJvbWVWZXJzaW9uKSB7XG4gICAgICAgIC8vIHVuYWJsZSB0byBnZXQgdGhlIGNocm9tZSB2ZXJzaW9uXG4gICAgICAgIGlmIChfLmlzRW1wdHkoY2RzKSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIENocm9tZWRyaXZlciBleGVjdXRhYmxlIGF2YWlsYWJsZSBmb3IgdXNlIGlmIGAgK1xuICAgICAgICAgICAgYHRoZSBjdXJyZW50IENocm9tZSB2ZXJzaW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qge3ZlcnNpb24sIGV4ZWN1dGFibGV9ID0gY2RzWzBdO1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gZGlzY292ZXIgQ2hyb21lIHZlcnNpb24uIFVzaW5nIENocm9tZWRyaXZlciAke3ZlcnNpb259IGF0ICcke2V4ZWN1dGFibGV9J2ApO1xuICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCBDaHJvbWUgYnVuZGxlICcke3RoaXMuYnVuZGxlSWR9JyB2ZXJzaW9uICcke2Nocm9tZVZlcnNpb259J2ApO1xuXG4gICAgICBjb25zdCBtYXRjaGluZ0RyaXZlcnMgPSBjZHMuZmlsdGVyKCh7bWluQ2hyb21lVmVyc2lvbn0pID0+IHtcbiAgICAgICAgY29uc3QgbWluQ2hyb21lVmVyc2lvblMgPSBtaW5DaHJvbWVWZXJzaW9uICYmIHNlbXZlci5jb2VyY2UobWluQ2hyb21lVmVyc2lvbik7XG4gICAgICAgIGlmICghbWluQ2hyb21lVmVyc2lvblMpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hyb21lVmVyc2lvbi5tYWpvciA+IE5FV19DRF9WRVJTSU9OX0ZPUk1BVF9NQUpPUl9WRVJTSU9OXG4gICAgICAgICAgPyBtaW5DaHJvbWVWZXJzaW9uUy5tYWpvciA9PT0gY2hyb21lVmVyc2lvbi5tYWpvclxuICAgICAgICAgIDogc2VtdmVyLmd0ZShjaHJvbWVWZXJzaW9uLCBtaW5DaHJvbWVWZXJzaW9uUyk7XG4gICAgICB9KTtcbiAgICAgIGlmIChfLmlzRW1wdHkobWF0Y2hpbmdEcml2ZXJzKSkge1xuICAgICAgICBpZiAodGhpcy5zdG9yYWdlQ2xpZW50ICYmICFkaWRTdG9yYWdlU3luYykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoYXdhaXQgc3luY0Nocm9tZWRyaXZlcnMoY2hyb21lVmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHN5bmNocm9uaXplIGxvY2FsIGNocm9tZWRyaXZlcnMgd2l0aCB0aGUgcmVtb3RlIHN0b3JhZ2UgYXQgJHtDRF9DRE59OiBgICtcbiAgICAgICAgICAgICAgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdXRvZG93bmxvYWRTdWdnZXN0aW9uID1cbiAgICAgICAgICAnWW91IGNvdWxkIGFsc28gdHJ5IHRvIGVuYWJsZSBhdXRvbWF0ZWQgY2hyb21lZHJpdmVycyBkb3dubG9hZCBzZXJ2ZXIgZmVhdHVyZSc7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAnJHtjaHJvbWVWZXJzaW9ufScuIGAgK1xuICAgICAgICAgICghdGhpcy5zdG9yYWdlQ2xpZW50ID8gYCR7YXV0b2Rvd25sb2FkU3VnZ2VzdGlvbn0uIGAgOiAnJykgK1xuICAgICAgICAgIGBTZWUgJHtDSFJPTUVEUklWRVJfVFVUT1JJQUx9IGZvciBtb3JlIGRldGFpbHNgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmluUGF0aCA9IG1hdGNoaW5nRHJpdmVyc1swXS5leGVjdXRhYmxlO1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEZvdW5kICR7dXRpbC5wbHVyYWxpemUoJ2V4ZWN1dGFibGUnLCBtYXRjaGluZ0RyaXZlcnMubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICAgIGBjYXBhYmxlIG9mIGF1dG9tYXRpbmcgQ2hyb21lICcke2Nocm9tZVZlcnNpb259Jy5cXG5DaG9vc2luZyB0aGUgbW9zdCByZWNlbnQsICcke2JpblBhdGh9Jy5gKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdJZiBhIHNwZWNpZmljIHZlcnNpb24gaXMgcmVxdWlyZWQsIHNwZWNpZnkgaXQgd2l0aCB0aGUgYGNocm9tZWRyaXZlckV4ZWN1dGFibGVgJyArXG4gICAgICAgICdkZXNpcmVkIGNhcGFiaWxpdHkuJyk7XG4gICAgICByZXR1cm4gYmluUGF0aDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgfSB3aGlsZSAodHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0Q2hyb21lZHJpdmVyUGF0aCAoKSB7XG4gICAgaWYgKHRoaXMuZXhlY3V0YWJsZVZlcmlmaWVkKSByZXR1cm47IC8vZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuXG4gICAgLy8gdGhlIGV4ZWN1dGFibGUgbWlnaHQgYmUgc2V0IChpZiBwYXNzZWQgaW4pXG4gICAgLy8gb3Igd2UgbWlnaHQgd2FudCB0byB1c2UgdGhlIGJhc2ljIG9uZSBpbnN0YWxsZWQgd2l0aCB0aGlzIGRyaXZlclxuICAgIC8vIG9yIHdlIHdhbnQgdG8gZmlndXJlIG91dCB0aGUgYmVzdCBvbmVcbiAgICBpZiAoIXRoaXMuY2hyb21lZHJpdmVyKSB7XG4gICAgICB0aGlzLmNocm9tZWRyaXZlciA9IHRoaXMudXNlU3lzdGVtRXhlY3V0YWJsZVxuICAgICAgICA/IGF3YWl0IGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgoKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q29tcGF0aWJsZUNocm9tZWRyaXZlcigpO1xuICAgIH1cblxuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHRoaXMuY2hyb21lZHJpdmVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcnlpbmcgdG8gdXNlIGEgY2hyb21lZHJpdmVyIGJpbmFyeSBhdCB0aGUgcGF0aCBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLmNocm9tZWRyaXZlcn0sIGJ1dCBpdCBkb2Vzbid0IGV4aXN0IWApO1xuICAgIH1cbiAgICB0aGlzLmV4ZWN1dGFibGVWZXJpZmllZCA9IHRydWU7XG4gICAgdGhpcy5sb2cuaW5mbyhgU2V0IGNocm9tZWRyaXZlciBiaW5hcnkgYXM6ICR7dGhpcy5jaHJvbWVkcml2ZXJ9YCk7XG4gIH1cblxuICBzeW5jUHJvdG9jb2wgKGNkVmVyc2lvbiA9IG51bGwpIHtcbiAgICBjb25zdCBjb2VyY2VkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UoY2RWZXJzaW9uKTtcbiAgICBpZiAoIWNvZXJjZWRWZXJzaW9uIHx8IGNvZXJjZWRWZXJzaW9uLm1ham9yIDwgTUlOX0NEX1ZFUlNJT05fV0lUSF9XM0NfU1VQUE9SVCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENocm9tZWRyaXZlciB2LiAke2NkVmVyc2lvbn0gZG9lcyBub3QgZnVsbHkgc3VwcG9ydCAke1BST1RPQ09MUy5XM0N9IHByb3RvY29sLiBgICtcbiAgICAgICAgYERlZmF1bHRpbmcgdG8gJHtQUk9UT0NPTFMuTUpTT05XUH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2hyb21lT3B0aW9ucyA9IGdldENhcFZhbHVlKHRoaXMuY2FwYWJpbGl0aWVzLCAnY2hyb21lT3B0aW9ucycsIHt9KTtcbiAgICBpZiAoY2hyb21lT3B0aW9ucy53M2MgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBDaHJvbWVkcml2ZXIgdi4gJHtjZFZlcnNpb259IHN1cHBvcnRzICR7UFJPVE9DT0xTLlczQ30gcHJvdG9jb2wsIGAgK1xuICAgICAgICBgYnV0ICR7UFJPVE9DT0xTLk1KU09OV1B9IG9uZSBoYXMgYmVlbiBleHBsaWNpdGx5IHJlcXVlc3RlZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRlc2lyZWRQcm90b2NvbCA9IFBST1RPQ09MUy5XM0M7XG4gICAgLy8gZ2l2ZW4gY2FwcyBtaWdodCBub3QgYmUgcHJvcGVybHkgcHJlZml4ZWRcbiAgICAvLyBzbyB3ZSB0cnkgdG8gZml4IHRoZW0gaW4gb3JkZXIgdG8gcHJvcGVybHkgaW5pdFxuICAgIC8vIHRoZSBuZXcgVzNDIHNlc3Npb25cbiAgICB0aGlzLmNhcGFiaWxpdGllcyA9IHRvVzNjQ2FwTmFtZXModGhpcy5jYXBhYmlsaXRpZXMpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQgKGNhcHMsIGVtaXRTdGFydGluZ1N0YXRlID0gdHJ1ZSkge1xuICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAoY2Fwcyk7XG5cbiAgICAvLyBzZXQgdGhlIGxvZ2dpbmcgcHJlZmVyZW5jZXMgdG8gQUxMIHRoZSBjb25zb2xlIGxvZ3NcbiAgICB0aGlzLmNhcGFiaWxpdGllcy5sb2dnaW5nUHJlZnMgPSBfLmNsb25lRGVlcChnZXRDYXBWYWx1ZShjYXBzLCAnbG9nZ2luZ1ByZWZzJywge30pKTtcbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMuY2FwYWJpbGl0aWVzLmxvZ2dpbmdQcmVmcy5icm93c2VyKSkge1xuICAgICAgdGhpcy5jYXBhYmlsaXRpZXMubG9nZ2luZ1ByZWZzLmJyb3dzZXIgPSAnQUxMJztcbiAgICB9XG5cbiAgICBpZiAoZW1pdFN0YXJ0aW5nU3RhdGUpIHtcbiAgICAgIHRoaXMuY2hhbmdlU3RhdGUoQ2hyb21lZHJpdmVyLlNUQVRFX1NUQVJUSU5HKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcmdzID0gW2AtLXBvcnQ9JHt0aGlzLnByb3h5UG9ydH1gXTtcbiAgICBpZiAodGhpcy5hZGIgJiYgdGhpcy5hZGIuYWRiUG9ydCkge1xuICAgICAgYXJncy5wdXNoKGAtLWFkYi1wb3J0PSR7dGhpcy5hZGIuYWRiUG9ydH1gKTtcbiAgICB9XG4gICAgaWYgKF8uaXNBcnJheSh0aGlzLmNtZEFyZ3MpKSB7XG4gICAgICBhcmdzLnB1c2goLi4udGhpcy5jbWRBcmdzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9nUGF0aCkge1xuICAgICAgYXJncy5wdXNoKGAtLWxvZy1wYXRoPSR7dGhpcy5sb2dQYXRofWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXNhYmxlQnVpbGRDaGVjaykge1xuICAgICAgYXJncy5wdXNoKCctLWRpc2FibGUtYnVpbGQtY2hlY2snKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCctLXZlcmJvc2UnKTtcbiAgICAvLyB3aGF0IGFyZSB0aGUgcHJvY2VzcyBzdGRvdXQvc3RkZXJyIGNvbmRpdGlvbnMgd2hlcmVpbiB3ZSBrbm93IHRoYXRcbiAgICAvLyB0aGUgcHJvY2VzcyBoYXMgc3RhcnRlZCB0byBvdXIgc2F0aXNmYWN0aW9uP1xuICAgIGNvbnN0IHN0YXJ0RGV0ZWN0b3IgPSAoc3Rkb3V0KSA9PiBzdGRvdXQuc3RhcnRzV2l0aCgnU3RhcnRpbmcgJyk7XG5cbiAgICBsZXQgcHJvY2Vzc0lzQWxpdmUgPSBmYWxzZTtcbiAgICBsZXQgd2Vidmlld1ZlcnNpb247XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdENocm9tZWRyaXZlclBhdGgoKTtcbiAgICAgIGF3YWl0IHRoaXMua2lsbEFsbCgpO1xuXG4gICAgICAvLyBzZXQgdXAgb3VyIHN1YnByb2Nlc3Mgb2JqZWN0XG4gICAgICB0aGlzLnByb2MgPSBuZXcgU3ViUHJvY2Vzcyh0aGlzLmNocm9tZWRyaXZlciwgYXJncyk7XG4gICAgICBwcm9jZXNzSXNBbGl2ZSA9IHRydWU7XG5cbiAgICAgIC8vIGhhbmRsZSBsb2cgb3V0cHV0XG4gICAgICB0aGlzLnByb2Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICAvLyBpZiB0aGUgY2Qgb3V0cHV0IGlzIG5vdCBwcmludGVkLCBmaW5kIHRoZSBjaHJvbWUgdmVyc2lvbiBhbmQgcHJpbnRcbiAgICAgICAgLy8gd2lsbCBnZXQgYSByZXNwb25zZSBsaWtlXG4gICAgICAgIC8vICAgRGV2VG9vbHMgcmVzcG9uc2U6IHtcbiAgICAgICAgLy8gICAgICBcIkFuZHJvaWQtUGFja2FnZVwiOiBcImlvLmFwcGl1bS5zYW1wbGVhcHBcIixcbiAgICAgICAgLy8gICAgICBcIkJyb3dzZXJcIjogXCJDaHJvbWUvNTUuMC4yODgzLjkxXCIsXG4gICAgICAgIC8vICAgICAgXCJQcm90b2NvbC1WZXJzaW9uXCI6IFwiMS4yXCIsXG4gICAgICAgIC8vICAgICAgXCJVc2VyLUFnZW50XCI6IFwiLi4uXCIsXG4gICAgICAgIC8vICAgICAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNlwiXG4gICAgICAgIC8vICAgfVxuICAgICAgICBjb25zdCBvdXQgPSBzdGRvdXQgKyBzdGRlcnI7XG4gICAgICAgIGxldCBtYXRjaCA9IC9cIkJyb3dzZXJcIjogXCIoLiopXCIvLmV4ZWMob3V0KTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgd2Vidmlld1ZlcnNpb24gPSBtYXRjaFsxXTtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgV2VidmlldyB2ZXJzaW9uOiAnJHt3ZWJ2aWV3VmVyc2lvbn0nYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbHNvIHByaW50IGNocm9tZWRyaXZlciB2ZXJzaW9uIHRvIGxvZ3NcbiAgICAgICAgLy8gd2lsbCBvdXRwdXQgc29tZXRoaW5nIGxpa2VcbiAgICAgICAgLy8gIFN0YXJ0aW5nIENocm9tZURyaXZlciAyLjMzLjUwNjEwNiAoOGEwNmMzOWM0NTgyZmJmYmFiNjk2NmRiYjFjMzhhOTE3M2JmYjFhMikgb24gcG9ydCA5NTE1XG4gICAgICAgIG1hdGNoID0gL1N0YXJ0aW5nIENocm9tZURyaXZlciAoWy5cXGRdKykvLmV4ZWMob3V0KTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYENocm9tZWRyaXZlciB2ZXJzaW9uOiAnJHttYXRjaFsxXX0nYCk7XG4gICAgICAgICAgdGhpcy5zeW5jUHJvdG9jb2wobWF0Y2hbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2l2ZSB0aGUgb3V0cHV0IGlmIGl0IGlzIHJlcXVlc3RlZFxuICAgICAgICBpZiAodGhpcy52ZXJib3NlKSB7XG4gICAgICAgICAgZm9yIChsZXQgbGluZSBvZiAoc3Rkb3V0IHx8ICcnKS50cmltKCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmUudHJpbSgpLmxlbmd0aCkgY29udGludWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBbU1RET1VUXSAke2xpbmV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IGxpbmUgb2YgKHN0ZGVyciB8fCAnJykudHJpbSgpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgICAgaWYgKCFsaW5lLnRyaW0oKS5sZW5ndGgpIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgW1NUREVSUl0gJHtsaW5lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGhhbmRsZSBvdXQtb2YtYm91bmQgZXhpdCBieSBzaW1wbHkgZW1pdHRpbmcgYSBzdG9wcGVkIHN0YXRlXG4gICAgICB0aGlzLnByb2Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHByb2Nlc3NJc0FsaXZlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZSAhPT0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfUkVTVEFSVElORykge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGBDaHJvbWVkcml2ZXIgZXhpdGVkIHVuZXhwZWN0ZWRseSB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWA7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3IobXNnKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBTcGF3bmluZyBjaHJvbWVkcml2ZXIgd2l0aDogJHt0aGlzLmNocm9tZWRyaXZlcn0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIC8vIHN0YXJ0IHN1YnByb2MgYW5kIHdhaXQgZm9yIHN0YXJ0RGV0ZWN0b3JcbiAgICAgIGF3YWl0IHRoaXMucHJvYy5zdGFydChzdGFydERldGVjdG9yKTtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvck9ubGluZSgpO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFNlc3Npb24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhlKTtcbiAgICAgIHRoaXMuZW1pdChDaHJvbWVkcml2ZXIuRVZFTlRfRVJST1IsIGUpO1xuICAgICAgLy8ganVzdCBiZWNhdXNlIHdlIGhhZCBhbiBlcnJvciBkb2Vzbid0IG1lYW4gdGhlIGNocm9tZWRyaXZlciBwcm9jZXNzXG4gICAgICAvLyBmaW5pc2hlZDsgd2Ugc2hvdWxkIGNsZWFuIHVwIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHByb2Nlc3NJc0FsaXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvYy5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXNzYWdlID0gJyc7XG4gICAgICAvLyBvZnRlbiB0aGUgdXNlcidzIENocm9tZSB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgQ2hyb21lZHJpdmVyXG4gICAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKCdDaHJvbWUgdmVyc2lvbiBtdXN0IGJlJykpIHtcbiAgICAgICAgbWVzc2FnZSArPSAnVW5hYmxlIHRvIGF1dG9tYXRlIENocm9tZSB2ZXJzaW9uIGJlY2F1c2UgaXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gb2YgQ2hyb21lZHJpdmVyLlxcbic7XG4gICAgICAgIGlmICh3ZWJ2aWV3VmVyc2lvbikge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYENocm9tZSB2ZXJzaW9uIG9uIHRoZSBkZXZpY2U6ICR7d2Vidmlld1ZlcnNpb259XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2ZXJzaW9uc1N1cHBvcnRlZEJ5RHJpdmVyID0gL0Nocm9tZSB2ZXJzaW9uIG11c3QgYmUgKC4rKS8uZXhlYyhlLm1lc3NhZ2UpPy5bMV0gfHwgJyc7XG4gICAgICAgIGlmICh2ZXJzaW9uc1N1cHBvcnRlZEJ5RHJpdmVyKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgQ2hyb21lZHJpdmVyIHN1cHBvcnRzIENocm9tZSB2ZXJzaW9uKHMpOiAke3ZlcnNpb25zU3VwcG9ydGVkQnlEcml2ZXJ9XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlICs9IGBWaXNpdCAnJHtDSFJPTUVEUklWRVJfVFVUT1JJQUx9JyB0byB0cm91Ymxlc2hvb3QgdGhlIHByb2JsZW0uXFxuYDtcbiAgICAgIH1cblxuICAgICAgbWVzc2FnZSArPSBlLm1lc3NhZ2U7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHNlc3Npb25JZCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9PTkxJTkUgPyB0aGlzLmp3cHJveHkuc2Vzc2lvbklkIDogbnVsbDtcbiAgfVxuXG4gIGFzeW5jIHJlc3RhcnQgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RhcnRpbmcgY2hyb21lZHJpdmVyJyk7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IENocm9tZWRyaXZlci5TVEFURV9PTkxJTkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHJlc3RhcnQgd2hlbiB3ZSdyZSBub3Qgb25saW5lXCIpO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9SRVNUQVJUSU5HKTtcbiAgICBhd2FpdCB0aGlzLnN0b3AoZmFsc2UpO1xuICAgIGF3YWl0IHRoaXMuc3RhcnQodGhpcy5jYXBhYmlsaXRpZXMsIGZhbHNlKTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JPbmxpbmUgKCkge1xuICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgQ0QgaGFzbid0IGNyYXNoZWRcbiAgICBsZXQgY2hyb21lZHJpdmVyU3RvcHBlZCA9IGZhbHNlO1xuICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwoMjAsIDIwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICAgIC8vIHdlIGFyZSBlaXRoZXIgc3RvcHBlZCBvciBzdG9wcGluZywgc28gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgICAgY2hyb21lZHJpdmVyU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgfSk7XG4gICAgaWYgKGNocm9tZWRyaXZlclN0b3BwZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hyb21lRHJpdmVyIGNyYXNoZWQgZHVyaW5nIHN0YXJ0dXAuJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gIH1cblxuICBhc3luYyBzdGFydFNlc3Npb24gKCkge1xuICAgIGNvbnN0IHNlc3Npb25DYXBzID0gdGhpcy5kZXNpcmVkUHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0NcbiAgICAgID8ge2NhcGFiaWxpdGllczoge2Fsd2F5c01hdGNoOiB0aGlzLmNhcGFiaWxpdGllc319XG4gICAgICA6IHtkZXNpcmVkQ2FwYWJpbGl0aWVzOiB0aGlzLmNhcGFiaWxpdGllc307XG4gICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgJHt0aGlzLmRlc2lyZWRQcm90b2NvbH0gQ2hyb21lZHJpdmVyIHNlc3Npb24gd2l0aCBjYXBhYmlsaXRpZXM6IGAgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbkNhcHMsIG51bGwsIDIpKTtcbiAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3Nlc3Npb24nLCAnUE9TVCcsIHNlc3Npb25DYXBzKTtcbiAgICB0aGlzLmxvZy5wcmVmaXggPSBnZW5lcmF0ZUxvZ1ByZWZpeCh0aGlzLCB0aGlzLmp3cHJveHkuc2Vzc2lvbklkKTtcbiAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9PTkxJTkUpO1xuICB9XG5cbiAgYXN5bmMgc3RvcCAoZW1pdFN0YXRlcyA9IHRydWUpIHtcbiAgICBpZiAoZW1pdFN0YXRlcykge1xuICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBJTkcpO1xuICAgIH1cbiAgICBjb25zdCBydW5TYWZlU3RlcCA9IGFzeW5jIChmKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGUubWVzc2FnZSk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgcnVuU2FmZVN0ZXAoKCkgPT4gdGhpcy5qd3Byb3h5LmNvbW1hbmQoJycsICdERUxFVEUnKSk7XG4gICAgYXdhaXQgcnVuU2FmZVN0ZXAoKCkgPT4gdGhpcy5wcm9jLnN0b3AoJ1NJR1RFUk0nLCAyMDAwMCkpO1xuICAgIHRoaXMubG9nLnByZWZpeCA9IGdlbmVyYXRlTG9nUHJlZml4KHRoaXMpO1xuICAgIGlmIChlbWl0U3RhdGVzKSB7XG4gICAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VTdGF0ZSAoc3RhdGUpIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2cuZGVidWcoYENoYW5nZWQgc3RhdGUgdG8gJyR7c3RhdGV9J2ApO1xuICAgIHRoaXMuZW1pdChDaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCwge3N0YXRlfSk7XG4gIH1cblxuICBhc3luYyBzZW5kQ29tbWFuZCAodXJsLCBtZXRob2QsIGJvZHkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQodXJsLCBtZXRob2QsIGJvZHkpO1xuICB9XG5cbiAgYXN5bmMgcHJveHlSZXEgKHJlcSwgcmVzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5wcm94eVJlcVJlcyhyZXEsIHJlcyk7XG4gIH1cblxuICBhc3luYyBraWxsQWxsICgpIHtcbiAgICBsZXQgY21kID0gc3lzdGVtLmlzV2luZG93cygpXG4gICAgICA/IGB3bWljIHByb2Nlc3Mgd2hlcmUgXCJjb21tYW5kbGluZSBsaWtlICclY2hyb21lZHJpdmVyLmV4ZSUtLXBvcnQ9JHt0aGlzLnByb3h5UG9ydH0lJ1wiIGRlbGV0ZWBcbiAgICAgIDogYHBraWxsIC0xNSAtZiBcIiR7dGhpcy5jaHJvbWVkcml2ZXJ9LiotLXBvcnQ9JHt0aGlzLnByb3h5UG9ydH1cImA7XG4gICAgdGhpcy5sb2cuZGVidWcoYEtpbGxpbmcgYW55IG9sZCBjaHJvbWVkcml2ZXJzLCBydW5uaW5nOiAke2NtZH1gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgKEIucHJvbWlzaWZ5KGNwLmV4ZWMpKShjbWQpO1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ1N1Y2Nlc3NmdWxseSBjbGVhbmVkIHVwIG9sZCBjaHJvbWVkcml2ZXJzJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKCdObyBvbGQgY2hyb21lZHJpdmVycyBzZWVtIHRvIGV4aXN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBjb25zdCB1ZGlkSW5kZXggPSB0aGlzLmFkYi5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbSA9PT0gJy1zJyk7XG4gICAgICBjb25zdCB1ZGlkID0gdWRpZEluZGV4ID4gLTEgPyB0aGlzLmFkYi5leGVjdXRhYmxlLmRlZmF1bHRBcmdzW3VkaWRJbmRleCArIDFdIDogbnVsbDtcblxuICAgICAgaWYgKHVkaWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHRoaXMgZGV2aWNlJ3MgYWRiIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uczogJHt1ZGlkfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIGFueSBvbGQgYWRiIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uc2ApO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKGxldCBjb25uIG9mIGF3YWl0IHRoaXMuYWRiLmdldEZvcndhcmRMaXN0KCkpIHtcbiAgICAgICAgICAvLyBjaHJvbWVkcml2ZXIgd2lsbCBhc2sgQURCIHRvIGZvcndhcmQgYSBwb3J0IGxpa2UgXCJkZXZpY2VJZCB0Y3A6cG9ydCBsb2NhbGFic3RyYWN0OndlYnZpZXdfZGV2dG9vbHNfcmVtb3RlX3BvcnRcIlxuICAgICAgICAgIGlmICghKGNvbm4uaW5jbHVkZXMoJ3dlYnZpZXdfZGV2dG9vbHMnKSAmJiAoIXVkaWQgfHwgY29ubi5pbmNsdWRlcyh1ZGlkKSkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgcGFyYW1zID0gY29ubi5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQocGFyYW1zWzFdLnJlcGxhY2UoL1tcXERdKi8sICcnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIGNsZWFuIGZvcndhcmRlZCBwb3J0cy4gRXJyb3I6ICcke2Vyci5tZXNzYWdlfScuIENvbnRpbnVpbmcuYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaGFzV29ya2luZ1dlYnZpZXcgKCkge1xuICAgIC8vIHNvbWV0aW1lcyBjaHJvbWVkcml2ZXIgc3RvcHMgYXV0b21hdGluZyB3ZWJ2aWV3cy4gdGhpcyBtZXRob2QgcnVucyBhXG4gICAgLy8gc2ltcGxlIGNvbW1hbmQgdG8gZGV0ZXJtaW5lIG91ciBzdGF0ZSwgYW5kIHJlc3BvbmRzIGFjY29yZGluZ2x5XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvdXJsJywgJ0dFVCcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5DaHJvbWVkcml2ZXIuRVZFTlRfRVJST1IgPSAnY2hyb21lZHJpdmVyX2Vycm9yJztcbkNocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VEID0gJ3N0YXRlQ2hhbmdlZCc7XG5DaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCA9ICdzdG9wcGVkJztcbkNocm9tZWRyaXZlci5TVEFURV9TVEFSVElORyA9ICdzdGFydGluZyc7XG5DaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FID0gJ29ubGluZSc7XG5DaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBJTkcgPSAnc3RvcHBpbmcnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1JFU1RBUlRJTkcgPSAncmVzdGFydGluZyc7XG5cbmV4cG9ydCB7IENocm9tZWRyaXZlciB9O1xuZXhwb3J0IGRlZmF1bHQgQ2hyb21lZHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLG1DQUFtQyxHQUFHLEVBQTVDO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLFdBQXJCO0FBQ0EsTUFBTUMsK0JBQStCLEdBQUcsRUFBeEM7QUFDQSxNQUFNQyxZQUFZLEdBQUcsSUFBckI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxvQkFBekI7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyw0QkFBaEM7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxDQUN6Qiw0QkFEeUIsRUFFekIscUJBRnlCLENBQTNCO0FBSUEsTUFBTUMscUJB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
|
|
736
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTiIsIkRFRkFVTFRfSE9TVCIsIk1JTl9DRF9WRVJTSU9OX1dJVEhfVzNDX1NVUFBPUlQiLCJERUZBVUxUX1BPUlQiLCJDSFJPTUVfQlVORExFX0lEIiwiV0VCVklFV19TSEVMTF9CVU5ETEVfSUQiLCJXRUJWSUVXX0JVTkRMRV9JRFMiLCJWRVJTSU9OX1BBVFRFUk4iLCJDRF9WRVJTSU9OX1RJTUVPVVQiLCJDaHJvbWVkcml2ZXIiLCJldmVudHMiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJob3N0IiwicG9ydCIsInVzZVN5c3RlbUV4ZWN1dGFibGUiLCJleGVjdXRhYmxlIiwiZXhlY3V0YWJsZURpciIsImdldENocm9tZWRyaXZlckRpciIsImJ1bmRsZUlkIiwibWFwcGluZ1BhdGgiLCJjbWRBcmdzIiwiYWRiIiwidmVyYm9zZSIsImxvZ1BhdGgiLCJkaXNhYmxlQnVpbGRDaGVjayIsImRldGFpbHMiLCJpc0F1dG9kb3dubG9hZEVuYWJsZWQiLCJfbG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiZ2VuZXJhdGVMb2dQcmVmaXgiLCJwcm94eUhvc3QiLCJwcm94eVBvcnQiLCJwcm9jIiwiY2hyb21lZHJpdmVyIiwiZXhlY3V0YWJsZVZlcmlmaWVkIiwic3RhdGUiLCJTVEFURV9TVE9QUEVEIiwiandwcm94eSIsIkpXUHJveHkiLCJzZXJ2ZXIiLCJsb2ciLCJzdG9yYWdlQ2xpZW50IiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNocm9tZWRyaXZlckRpciIsImNhcGFiaWxpdGllcyIsImRlc2lyZWRQcm90b2NvbCIsIlBST1RPQ09MUyIsIk1KU09OV1AiLCJnZXREcml2ZXJzTWFwcGluZyIsIm1hcHBpbmciLCJfIiwiY2xvbmVEZWVwIiwiQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HIiwiZGVidWciLCJmcyIsImV4aXN0cyIsIndhcm4iLCJpbmZvIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGUiLCJlcnIiLCJtZXNzYWdlIiwiY2RWZXJzaW9uIiwiY2hyb21lVmVyc2lvbiIsInRvUGFpcnMiLCJjb2VyY2VkVmVyc2lvbiIsInNlbXZlciIsImNvZXJjZSIsInZlcnNpb24iLCJnZXRDaHJvbWVkcml2ZXJzIiwiZXhlY3V0YWJsZXMiLCJnbG9iIiwiY3dkIiwic3RyaWN0Iiwibm9kaXIiLCJhYnNvbHV0ZSIsInV0aWwiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJjZHMiLCJhc3luY21hcCIsImxvZ0Vycm9yIiwic3Rkb3V0Iiwic3RkZXJyIiwiZXJyTXNnIiwicGF0aCIsImJhc2VuYW1lIiwiZXhlYyIsInRpbWVvdXQiLCJpbmNsdWRlcyIsIm1hdGNoIiwibWluQ2hyb21lVmVyc2lvbiIsIm1ham9yIiwibWlub3IiLCJmaWx0ZXIiLCJjZCIsInNvcnQiLCJhIiwiYiIsImNvbXBhcmVWZXJzaW9ucyIsImlzRW1wdHkiLCJnZXRDaHJvbWVWZXJzaW9uIiwiQnJvd3NlciIsInZlcnNpb25NYXRjaCIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJ1cGRhdGVEcml2ZXJzTWFwcGluZyIsIm5ld01hcHBpbmciLCJzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nIiwid3JpdGVGaWxlIiwic3RyaW5naWZ5IiwiZSIsIk9iamVjdCIsImFzc2lnbiIsImdldENvbXBhdGlibGVDaHJvbWVkcml2ZXIiLCJnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIiwidmFsdWVzIiwiZGlkU3RvcmFnZVN5bmMiLCJzeW5jQ2hyb21lZHJpdmVycyIsInJldHJpZXZlZE1hcHBpbmciLCJyZXRyaWV2ZU1hcHBpbmciLCJkcml2ZXJLZXlzIiwic3luY0RyaXZlcnMiLCJtaW5Ccm93c2VyVmVyc2lvbiIsInN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nIiwicmVkdWNlIiwiYWNjIiwieCIsIm1pc3NpbmdWZXJzaW9ucyIsImNvZXJjZWRWZXIiLCJzaXplIiwiZXJyb3JBbmRUaHJvdyIsIm1hdGNoaW5nRHJpdmVycyIsIm1pbkNocm9tZVZlcnNpb25TIiwiZ3RlIiwiQ0RfQ0ROIiwic3RhY2siLCJhdXRvZG93bmxvYWRTdWdnZXN0aW9uIiwiRXJyb3IiLCJiaW5QYXRoIiwiaW5pdENocm9tZWRyaXZlclBhdGgiLCJzeW5jUHJvdG9jb2wiLCJXM0MiLCJjaHJvbWVPcHRpb25zIiwiZ2V0Q2FwVmFsdWUiLCJ3M2MiLCJ0b1czY0NhcE5hbWVzIiwic3RhcnQiLCJjYXBzIiwiZW1pdFN0YXJ0aW5nU3RhdGUiLCJsb2dnaW5nUHJlZnMiLCJicm93c2VyIiwiY2hhbmdlU3RhdGUiLCJTVEFURV9TVEFSVElORyIsImFkYlBvcnQiLCJwdXNoIiwiaXNBcnJheSIsInN0YXJ0RGV0ZWN0b3IiLCJzdGFydHNXaXRoIiwicHJvY2Vzc0lzQWxpdmUiLCJ3ZWJ2aWV3VmVyc2lvbiIsImtpbGxBbGwiLCJTdWJQcm9jZXNzIiwib24iLCJvdXQiLCJsaW5lIiwidHJpbSIsInNwbGl0IiwiZXJyb3IiLCJjb2RlIiwic2lnbmFsIiwiU1RBVEVfU1RPUFBJTkciLCJTVEFURV9SRVNUQVJUSU5HIiwibXNnIiwiam9pbiIsIndhaXRGb3JPbmxpbmUiLCJzdGFydFNlc3Npb24iLCJlbWl0IiwiRVZFTlRfRVJST1IiLCJzdG9wIiwidmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlciIsInNlc3Npb25JZCIsIlNUQVRFX09OTElORSIsInJlc3RhcnQiLCJjaHJvbWVkcml2ZXJTdG9wcGVkIiwicmV0cnlJbnRlcnZhbCIsImdldFN0YXR1cyIsImNvbW1hbmQiLCJzZXNzaW9uQ2FwcyIsImFsd2F5c01hdGNoIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsInByZWZpeCIsImVtaXRTdGF0ZXMiLCJydW5TYWZlU3RlcCIsImYiLCJFVkVOVF9DSEFOR0VEIiwic2VuZENvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwicHJveHlSZXEiLCJyZXEiLCJyZXMiLCJwcm94eVJlcVJlcyIsImNtZCIsInN5c3RlbSIsImlzV2luZG93cyIsIkIiLCJwcm9taXNpZnkiLCJjcCIsInVkaWRJbmRleCIsImRlZmF1bHRBcmdzIiwiZmluZEluZGV4IiwiaXRlbSIsInVkaWQiLCJjb25uIiwiZ2V0Rm9yd2FyZExpc3QiLCJwYXJhbXMiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsInJlcGxhY2UiLCJoYXNXb3JraW5nV2VidmlldyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jaHJvbWVkcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IGV2ZW50cyBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgSldQcm94eSwgUFJPVE9DT0xTIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgY3AgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCBsb2dnZXIsIHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsLCBhc3luY21hcCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtcbiAgZ2V0Q2hyb21lVmVyc2lvbiwgZ2V0Q2hyb21lZHJpdmVyRGlyLCBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsXG4gIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgsIENEX0NETiwgZ2VuZXJhdGVMb2dQcmVmaXhcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IGZyb20gJy4vc3RvcmFnZS1jbGllbnQnO1xuaW1wb3J0IHsgdG9XM2NDYXBOYW1lcywgZ2V0Q2FwVmFsdWUgfSBmcm9tICcuL3Byb3RvY29sLWhlbHBlcnMnO1xuXG5jb25zdCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTiA9IDczO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUID0gNzU7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA5NTE1O1xuY29uc3QgQ0hST01FX0JVTkRMRV9JRCA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgV0VCVklFV19TSEVMTF9CVU5ETEVfSUQgPSAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnO1xuY29uc3QgV0VCVklFV19CVU5ETEVfSURTID0gW1xuICAnY29tLmdvb2dsZS5hbmRyb2lkLndlYnZpZXcnLFxuICAnY29tLmFuZHJvaWQud2VidmlldycsXG5dO1xuY29uc3QgVkVSU0lPTl9QQVRURVJOID0gLyhbXFxkLl0rKS87XG5cbmNvbnN0IENEX1ZFUlNJT05fVElNRU9VVCA9IDUwMDA7XG5cbmNsYXNzIENocm9tZWRyaXZlciBleHRlbmRzIGV2ZW50cy5FdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGhvc3QgPSBERUZBVUxUX0hPU1QsXG4gICAgICBwb3J0ID0gREVGQVVMVF9QT1JULFxuICAgICAgdXNlU3lzdGVtRXhlY3V0YWJsZSA9IGZhbHNlLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGV4ZWN1dGFibGVEaXIgPSBnZXRDaHJvbWVkcml2ZXJEaXIoKSxcbiAgICAgIGJ1bmRsZUlkLFxuICAgICAgbWFwcGluZ1BhdGgsXG4gICAgICBjbWRBcmdzLFxuICAgICAgYWRiLFxuICAgICAgdmVyYm9zZSxcbiAgICAgIGxvZ1BhdGgsXG4gICAgICBkaXNhYmxlQnVpbGRDaGVjayxcbiAgICAgIGRldGFpbHMsXG4gICAgICBpc0F1dG9kb3dubG9hZEVuYWJsZWQgPSBmYWxzZSxcbiAgICB9ID0gYXJncztcbiAgICB0aGlzLl9sb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKGdlbmVyYXRlTG9nUHJlZml4KHRoaXMpKTtcblxuICAgIHRoaXMucHJveHlIb3N0ID0gaG9zdDtcbiAgICB0aGlzLnByb3h5UG9ydCA9IHBvcnQ7XG4gICAgdGhpcy5hZGIgPSBhZGI7XG4gICAgdGhpcy5jbWRBcmdzID0gY21kQXJncztcbiAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgIHRoaXMudXNlU3lzdGVtRXhlY3V0YWJsZSA9IHVzZVN5c3RlbUV4ZWN1dGFibGU7XG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBleGVjdXRhYmxlO1xuICAgIHRoaXMuZXhlY3V0YWJsZURpciA9IGV4ZWN1dGFibGVEaXI7XG4gICAgdGhpcy5tYXBwaW5nUGF0aCA9IG1hcHBpbmdQYXRoO1xuICAgIHRoaXMuYnVuZGxlSWQgPSBidW5kbGVJZDtcbiAgICB0aGlzLmV4ZWN1dGFibGVWZXJpZmllZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUgPSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRDtcbiAgICB0aGlzLmp3cHJveHkgPSBuZXcgSldQcm94eSh7XG4gICAgICBzZXJ2ZXI6IHRoaXMucHJveHlIb3N0LFxuICAgICAgcG9ydDogdGhpcy5wcm94eVBvcnQsXG4gICAgICBsb2c6IHRoaXMuX2xvZyxcbiAgICB9KTtcbiAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlO1xuICAgIHRoaXMubG9nUGF0aCA9IGxvZ1BhdGg7XG4gICAgdGhpcy5kaXNhYmxlQnVpbGRDaGVjayA9ICEhZGlzYWJsZUJ1aWxkQ2hlY2s7XG4gICAgdGhpcy5zdG9yYWdlQ2xpZW50ID0gaXNBdXRvZG93bmxvYWRFbmFibGVkXG4gICAgICA/IG5ldyBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50KHsgY2hyb21lZHJpdmVyRGlyOiB0aGlzLmV4ZWN1dGFibGVEaXIgfSlcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICAgIHRoaXMuY2FwYWJpbGl0aWVzID0ge307XG4gICAgdGhpcy5kZXNpcmVkUHJvdG9jb2wgPSBQUk9UT0NPTFMuTUpTT05XUDtcbiAgfVxuXG4gIGdldCBsb2cgKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2c7XG4gIH1cblxuICBhc3luYyBnZXREcml2ZXJzTWFwcGluZyAoKSB7XG4gICAgbGV0IG1hcHBpbmcgPSBfLmNsb25lRGVlcChDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcpO1xuICAgIGlmICh0aGlzLm1hcHBpbmdQYXRoKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byB1c2UgQ2hyb21lZHJpdmVyLT5DaHJvbWUgbWFwcGluZyBmcm9tICcke3RoaXMubWFwcGluZ1BhdGh9J2ApO1xuICAgICAgaWYgKCFhd2FpdCBmcy5leGlzdHModGhpcy5tYXBwaW5nUGF0aCkpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgTm8gZmlsZSBmb3VuZCBhdCAnJHt0aGlzLm1hcHBpbmdQYXRofSdgKTtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRGVmYXVsdGluZyB0byB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWFwcGluZyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUodGhpcy5tYXBwaW5nUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oYEVycm9yIHBhcnNpbmcgbWFwcGluZyBmcm9tICcke3RoaXMubWFwcGluZ1BhdGh9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdEZWZhdWx0aW5nIHRvIHRoZSBzdGF0aWMgQ2hyb21lZHJpdmVyLT5DaHJvbWUgbWFwcGluZycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdVc2luZyB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGZvciBtaW5pbXVtIGNocm9tZSB2ZXJzaW9uIGFyZSBzZW12ZXIgY29tcGxpYW50XG4gICAgZm9yIChjb25zdCBbY2RWZXJzaW9uLCBjaHJvbWVWZXJzaW9uXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShjaHJvbWVWZXJzaW9uKTtcbiAgICAgIGlmIChjb2VyY2VkVmVyc2lvbikge1xuICAgICAgICBtYXBwaW5nW2NkVmVyc2lvbl0gPSBjb2VyY2VkVmVyc2lvbi52ZXJzaW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgJyR7Y2hyb21lVmVyc2lvbn0nIGlzIG5vdCBhIHZhbGlkIHZlcnNpb24gbnVtYmVyLiBTa2lwcGluZyBpdGApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwcGluZztcbiAgfVxuXG4gIGFzeW5jIGdldENocm9tZWRyaXZlcnMgKG1hcHBpbmcpIHtcbiAgICAvLyBnbyB0aHJvdWdoIHRoZSB2ZXJzaW9ucyBhdmFpbGFibGVcbiAgICBjb25zdCBleGVjdXRhYmxlcyA9IGF3YWl0IGZzLmdsb2IoJyonLCB7XG4gICAgICBjd2Q6IHRoaXMuZXhlY3V0YWJsZURpcixcbiAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICBub2RpcjogdHJ1ZSxcbiAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdleGVjdXRhYmxlJywgZXhlY3V0YWJsZXMubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICBgaW4gJyR7dGhpcy5leGVjdXRhYmxlRGlyfSdgKTtcbiAgICBjb25zdCBjZHMgPSAoYXdhaXQgYXN5bmNtYXAoZXhlY3V0YWJsZXMsIGFzeW5jIChleGVjdXRhYmxlKSA9PiB7XG4gICAgICBjb25zdCBsb2dFcnJvciA9ICh7bWVzc2FnZSwgc3Rkb3V0ID0gbnVsbCwgc3RkZXJyID0gbnVsbH0pID0+IHtcbiAgICAgICAgbGV0IGVyck1zZyA9IGBDYW5ub3QgcmV0cmlldmUgdmVyc2lvbiBudW1iZXIgZnJvbSAnJHtwYXRoLmJhc2VuYW1lKGV4ZWN1dGFibGUpfScgQ2hyb21lZHJpdmVyIGJpbmFyeS4gYCArXG4gICAgICAgICAgYE1ha2Ugc3VyZSBpdCByZXR1cm5zIGEgdmFsaWQgdmVyc2lvbiBzdHJpbmcgaW4gcmVzcG9uc2UgdG8gJy0tdmVyc2lvbicgY29tbWFuZCBsaW5lIGFyZ3VtZW50LiAke21lc3NhZ2V9YDtcbiAgICAgICAgaWYgKHN0ZG91dCkge1xuICAgICAgICAgIGVyck1zZyArPSBgXFxuU3Rkb3V0OiAke3N0ZG91dH1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICBlcnJNc2cgKz0gYFxcblN0ZGVycjogJHtzdGRlcnJ9YDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZy53YXJuKGVyck1zZyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcblxuICAgICAgbGV0IHN0ZG91dDtcbiAgICAgIGxldCBzdGRlcnI7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IGV4ZWMoZXhlY3V0YWJsZSwgWyctLXZlcnNpb24nXSwge1xuICAgICAgICAgIHRpbWVvdXQ6IENEX1ZFUlNJT05fVElNRU9VVCxcbiAgICAgICAgfSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghKGVyci5tZXNzYWdlIHx8ICcnKS5pbmNsdWRlcygndGltZWQgb3V0JykgJiYgIShlcnIuc3Rkb3V0IHx8ICcnKS5pbmNsdWRlcygnU3RhcnRpbmcgQ2hyb21lRHJpdmVyJykpIHtcbiAgICAgICAgICByZXR1cm4gbG9nRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoaXMgaGFzIHRpbWVkIG91dCwgaXQgaGFzIGFjdHVhbGx5IHN0YXJ0ZWQgQ2hyb21lZHJpdmVyLFxuICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHRoZXJlIHdpbGwgYWxzbyBiZSB0aGUgdmVyc2lvbiBzdHJpbmcgaW4gdGhlIG91dHB1dFxuICAgICAgICBzdGRvdXQgPSBlcnIuc3Rkb3V0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaCA9IC9DaHJvbWVEcml2ZXJcXHMrXFwoP3Y/KFtcXGQuXSspXFwpPy9pLmV4ZWMoc3Rkb3V0KTsgLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci96cGo1d0EvMVxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe21lc3NhZ2U6ICdDYW5ub3QgcGFyc2UgdGhlIHZlcnNpb24gc3RyaW5nJywgc3Rkb3V0LCBzdGRlcnJ9KTtcbiAgICAgIH1cbiAgICAgIGxldCB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICBsZXQgbWluQ2hyb21lVmVyc2lvbiA9IG1hcHBpbmdbdmVyc2lvbl07XG4gICAgICBjb25zdCBjb2VyY2VkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UodmVyc2lvbik7XG4gICAgICBpZiAoY29lcmNlZFZlcnNpb24pIHtcbiAgICAgICAgLy8gYmVmb3JlIDIwMTktMDMtMDYgdmVyc2lvbnMgd2VyZSBvZiB0aGUgZm9ybSBtYWpvci5taW5vclxuICAgICAgICBpZiAoY29lcmNlZFZlcnNpb24ubWFqb3IgPCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIHZlcnNpb24gPSBgJHtjb2VyY2VkVmVyc2lvbi5tYWpvcn0uJHtjb2VyY2VkVmVyc2lvbi5taW5vcn1gO1xuICAgICAgICAgIG1pbkNocm9tZVZlcnNpb24gPSBtYXBwaW5nW3ZlcnNpb25dO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWluQ2hyb21lVmVyc2lvbiAmJiBjb2VyY2VkVmVyc2lvbi5tYWpvciA+PSBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIC8vIEFzc3VtZSB0aGUgbWFqb3IgQ2hyb21lIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIG1ham9yIHZlcnNpb25cbiAgICAgICAgICBtaW5DaHJvbWVWZXJzaW9uID0gYCR7Y29lcmNlZFZlcnNpb24ubWFqb3J9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0YWJsZSxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgbWluQ2hyb21lVmVyc2lvbixcbiAgICAgIH07XG4gICAgfSkpXG4gICAgICAuZmlsdGVyKChjZCkgPT4gISFjZClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBjb21wYXJlVmVyc2lvbnMoYi52ZXJzaW9uLCBhLnZlcnNpb24pKTtcbiAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vIENocm9tZWRyaXZlcnMgd2VyZSBmb3VuZCBpbiAnJHt0aGlzLmV4ZWN1dGFibGVEaXJ9J2ApO1xuICAgICAgcmV0dXJuIGNkcztcbiAgICB9XG4gICAgdGhpcy5sb2cuZGVidWcoYFRoZSBmb2xsb3dpbmcgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGVzIHdlcmUgZm91bmQ6YCk7XG4gICAgZm9yIChjb25zdCBjZCBvZiBjZHMpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAgICAgJyR7Y2QuZXhlY3V0YWJsZX0nICh2ZXJzaW9uICcke2NkLnZlcnNpb259JywgbWluaW11bSBDaHJvbWUgdmVyc2lvbiAnJHtjZC5taW5DaHJvbWVWZXJzaW9uID8gY2QubWluQ2hyb21lVmVyc2lvbiA6ICdVbmtub3duJ30nKWApO1xuICAgIH1cbiAgICByZXR1cm4gY2RzO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2hyb21lVmVyc2lvbiAoKSB7XG4gICAgLy8gVHJ5IHRvIHJldHJpZXZlIHRoZSB2ZXJzaW9uIGZyb20gYGRldGFpbHNgIHByb3BlcnR5IGlmIGl0IGlzIHNldFxuICAgIC8vIFRoZSBgaW5mb2AgaXRlbSBtdXN0IGNvbnRhaW4gdGhlIG91dHB1dCBvZiAvanNvbi92ZXJzaW9uIENEUCBjb21tYW5kXG4gICAgLy8gd2hlcmUgYEJyb3dzZXJgIGZpZWxkIGxvb2tzIGxpa2UgYENocm9tZS83Mi4wLjM2MDEuMGBgXG4gICAgaWYgKHRoaXMuZGV0YWlscz8uaW5mbykge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEJyb3dzZXIgdmVyc2lvbiBpbiB0aGUgc3VwcGxpZWQgZGV0YWlsczogJHt0aGlzLmRldGFpbHM/LmluZm8/LkJyb3dzZXJ9YCk7XG4gICAgfVxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IFZFUlNJT05fUEFUVEVSTi5leGVjKHRoaXMuZGV0YWlscz8uaW5mbz8uQnJvd3Nlcik7XG4gICAgaWYgKHZlcnNpb25NYXRjaCkge1xuICAgICAgY29uc3QgY29lcmNlZFZlcnNpb24gPSBzZW12ZXIuY29lcmNlKHZlcnNpb25NYXRjaFsxXSk7XG4gICAgICBpZiAoY29lcmNlZFZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIGNvZXJjZWRWZXJzaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjaHJvbWVWZXJzaW9uO1xuXG4gICAgLy8gaW4gY2FzZSBvZiBXZWJWaWV3IEJyb3dzZXIgVGVzdGVyLCBzaW1wbHkgdHJ5IHRvIGZpbmQgdGhlIHVuZGVybHlpbmcgd2Vidmlld1xuICAgIGlmICh0aGlzLmJ1bmRsZUlkID09PSBXRUJWSUVXX1NIRUxMX0JVTkRMRV9JRCkge1xuICAgICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBXRUJWSUVXX0JVTkRMRV9JRFMpIHtcbiAgICAgICAgY2hyb21lVmVyc2lvbiA9IGF3YWl0IGdldENocm9tZVZlcnNpb24odGhpcy5hZGIsIGJ1bmRsZUlkKTtcbiAgICAgICAgaWYgKGNocm9tZVZlcnNpb24pIHtcbiAgICAgICAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgICAgICAgcmV0dXJuIHNlbXZlci5jb2VyY2UoY2hyb21lVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIG9uIEFuZHJvaWQgNy05IHdlYnZpZXdzIGFyZSBiYWNrZWQgYnkgdGhlIG1haW4gQ2hyb21lLCBub3QgdGhlIHN5c3RlbSB3ZWJ2aWV3XG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMjQgJiYgYXBpTGV2ZWwgPD0gMjggJiZcbiAgICAgICAgICBbV0VCVklFV19TSEVMTF9CVU5ETEVfSUQsIC4uLldFQlZJRVdfQlVORExFX0lEU10uaW5jbHVkZXModGhpcy5idW5kbGVJZCkpIHtcbiAgICAgICAgdGhpcy5idW5kbGVJZCA9IENIUk9NRV9CVU5ETEVfSUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdHJ5IG91dCB3ZWJ2aWV3cyB3aGVuIG5vIGJ1bmRsZSBpZCBpcyBzZW50IGluXG4gICAgaWYgKCF0aGlzLmJ1bmRsZUlkKSB7XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBnZW5lcmljIENocm9tZSBidW5kbGVcbiAgICAgIHRoaXMuYnVuZGxlSWQgPSBDSFJPTUVfQlVORExFX0lEO1xuXG4gICAgICAvLyB3ZSBoYXZlIGEgd2VidmlldyBvZiBzb21lIHNvcnQsIHNvIHRyeSB0byBmaW5kIHRoZSBidW5kbGUgdmVyc2lvblxuICAgICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBXRUJWSUVXX0JVTkRMRV9JRFMpIHtcbiAgICAgICAgY2hyb21lVmVyc2lvbiA9IGF3YWl0IGdldENocm9tZVZlcnNpb24odGhpcy5hZGIsIGJ1bmRsZUlkKTtcbiAgICAgICAgaWYgKGNocm9tZVZlcnNpb24pIHtcbiAgICAgICAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGNocm9tZSB2ZXJzaW9uLCBpdCBtdXN0IG5vdCBiZSBhIHdlYnZpZXdcbiAgICBpZiAoIWNocm9tZVZlcnNpb24pIHtcbiAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCB0aGlzLmJ1bmRsZUlkKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgaXQgaXMgc2VtdmVyLCBzbyBsYXRlciBjaGVja3Mgd29uJ3QgZmFpbFxuICAgIHJldHVybiBjaHJvbWVWZXJzaW9uID8gc2VtdmVyLmNvZXJjZShjaHJvbWVWZXJzaW9uKSA6IG51bGw7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEcml2ZXJzTWFwcGluZyAobmV3TWFwcGluZykge1xuICAgIGxldCBzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nID0gdHJ1ZTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHRoaXMubWFwcGluZ1BhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGhpcy5tYXBwaW5nUGF0aCwgSlNPTi5zdHJpbmdpZnkobmV3TWFwcGluZywgbnVsbCwgMiksICd1dGY4Jyk7XG4gICAgICAgIHNob3VsZFVwZGF0ZVN0YXRpY01hcHBpbmcgPSBmYWxzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHN0b3JlIHRoZSB1cGRhdGVkIGNocm9tZWRyaXZlcnMgbWFwcGluZyBpbnRvICcke3RoaXMubWFwcGluZ1BhdGh9Jy4gYCArXG4gICAgICAgICAgYFRoaXMgbWF5IHJlZHVjZSB0aGUgcGVyZm9ybWFuY2Ugb2YgZnVydGhlciBleGVjdXRpb25zLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nKSB7XG4gICAgICBPYmplY3QuYXNzaWduKENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORywgbmV3TWFwcGluZyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q29tcGF0aWJsZUNocm9tZWRyaXZlciAoKSB7XG4gICAgaWYgKCF0aGlzLmFkYikge1xuICAgICAgcmV0dXJuIGF3YWl0IGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgoKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXBwaW5nID0gYXdhaXQgdGhpcy5nZXREcml2ZXJzTWFwcGluZygpO1xuICAgIGlmICghXy5pc0VtcHR5KG1hcHBpbmcpKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVGhlIG1vc3QgcmVjZW50IGtub3duIENocm9tZSB2ZXJzaW9uOiAke18udmFsdWVzKG1hcHBpbmcpWzBdfWApO1xuICAgIH1cblxuICAgIGxldCBkaWRTdG9yYWdlU3luYyA9IGZhbHNlO1xuICAgIGNvbnN0IHN5bmNDaHJvbWVkcml2ZXJzID0gYXN5bmMgKGNocm9tZVZlcnNpb24pID0+IHtcbiAgICAgIGRpZFN0b3JhZ2VTeW5jID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJldHJpZXZlZE1hcHBpbmcgPSBhd2FpdCB0aGlzLnN0b3JhZ2VDbGllbnQucmV0cmlldmVNYXBwaW5nKCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnR290IGNocm9tZWRyaXZlcnMgbWFwcGluZyBmcm9tIHRoZSBzdG9yYWdlOiAnICtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocmV0cmlldmVkTWFwcGluZywgbnVsbCwgMikpO1xuICAgICAgY29uc3QgZHJpdmVyS2V5cyA9IGF3YWl0IHRoaXMuc3RvcmFnZUNsaWVudC5zeW5jRHJpdmVycyh7XG4gICAgICAgIG1pbkJyb3dzZXJWZXJzaW9uOiBjaHJvbWVWZXJzaW9uLm1ham9yLFxuICAgICAgfSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcktleXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nID0gZHJpdmVyS2V5cy5yZWR1Y2UoKGFjYywgeCkgPT4ge1xuICAgICAgICBjb25zdCB7dmVyc2lvbiwgbWluQnJvd3NlclZlcnNpb259ID0gcmV0cmlldmVkTWFwcGluZ1t4XTtcbiAgICAgICAgYWNjW3ZlcnNpb25dID0gbWluQnJvd3NlclZlcnNpb247XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gICAgICBPYmplY3QuYXNzaWduKG1hcHBpbmcsIHN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlRHJpdmVyc01hcHBpbmcobWFwcGluZyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgY2RzID0gYXdhaXQgdGhpcy5nZXRDaHJvbWVkcml2ZXJzKG1hcHBpbmcpO1xuXG4gICAgICBjb25zdCBtaXNzaW5nVmVyc2lvbnMgPSB7fTtcbiAgICAgIGZvciAoY29uc3Qge3ZlcnNpb24sIG1pbkNocm9tZVZlcnNpb259IG9mIGNkcykge1xuICAgICAgICBpZiAoIW1pbkNocm9tZVZlcnNpb24gfHwgbWFwcGluZ1t2ZXJzaW9uXSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZXJjZWRWZXIgPSBzZW12ZXIuY29lcmNlKHZlcnNpb24pO1xuICAgICAgICBpZiAoIWNvZXJjZWRWZXIgfHwgY29lcmNlZFZlci5tYWpvciA8IE5FV19DRF9WRVJTSU9OX0ZPUk1BVF9NQUpPUl9WRVJTSU9OKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBtaXNzaW5nVmVyc2lvbnNbdmVyc2lvbl0gPSBtaW5DaHJvbWVWZXJzaW9uO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkobWlzc2luZ1ZlcnNpb25zKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdDaHJvbWVkcml2ZXInLCBfLnNpemUobWlzc2luZ1ZlcnNpb25zKSwgdHJ1ZSl9LCBgICtcbiAgICAgICAgICBgd2hpY2ggJHtfLnNpemUobWlzc2luZ1ZlcnNpb25zKSA9PT0gMSA/ICdpcycgOiAnYXJlJ30gbWlzc2luZyBpbiB0aGUgbGlzdCBvZiBrbm93biB2ZXJzaW9uczogYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkobWlzc2luZ1ZlcnNpb25zKSk7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRHJpdmVyc01hcHBpbmcoT2JqZWN0LmFzc2lnbihtYXBwaW5nLCBtaXNzaW5nVmVyc2lvbnMpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZUJ1aWxkQ2hlY2spIHtcbiAgICAgICAgaWYgKF8uaXNFbXB0eShjZHMpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgJ2Nocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrJyBjYXBhYmlsaXR5IGlzIHNldCB0byAndHJ1ZSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIHRoaXMubG9nLndhcm4oYENocm9tZSBidWlsZCBjaGVjayBkaXNhYmxlZC4gVXNpbmcgbW9zdCByZWNlbnQgQ2hyb21lZHJpdmVyIHZlcnNpb24gKCR7dmVyc2lvbn0sIGF0ICcke2V4ZWN1dGFibGV9JylgKTtcbiAgICAgICAgdGhpcy5sb2cud2FybihgSWYgdGhpcyBpcyB3cm9uZywgc2V0ICdjaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjaycgY2FwYWJpbGl0eSB0byAnZmFsc2UnYCk7XG4gICAgICAgIHJldHVybiBleGVjdXRhYmxlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaHJvbWVWZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRDaHJvbWVWZXJzaW9uKCk7XG4gICAgICBpZiAoIWNocm9tZVZlcnNpb24pIHtcbiAgICAgICAgLy8gdW5hYmxlIHRvIGdldCB0aGUgY2hyb21lIHZlcnNpb25cbiAgICAgICAgaWYgKF8uaXNFbXB0eShjZHMpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgdGhlIGN1cnJlbnQgQ2hyb21lIHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byBkaXNjb3ZlciBDaHJvbWUgdmVyc2lvbi4gVXNpbmcgQ2hyb21lZHJpdmVyICR7dmVyc2lvbn0gYXQgJyR7ZXhlY3V0YWJsZX0nYCk7XG4gICAgICAgIHJldHVybiBleGVjdXRhYmxlO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoYEZvdW5kIENocm9tZSBidW5kbGUgJyR7dGhpcy5idW5kbGVJZH0nIHZlcnNpb24gJyR7Y2hyb21lVmVyc2lvbn0nYCk7XG5cbiAgICAgIGNvbnN0IG1hdGNoaW5nRHJpdmVycyA9IGNkcy5maWx0ZXIoKHttaW5DaHJvbWVWZXJzaW9ufSkgPT4ge1xuICAgICAgICBjb25zdCBtaW5DaHJvbWVWZXJzaW9uUyA9IG1pbkNocm9tZVZlcnNpb24gJiYgc2VtdmVyLmNvZXJjZShtaW5DaHJvbWVWZXJzaW9uKTtcbiAgICAgICAgaWYgKCFtaW5DaHJvbWVWZXJzaW9uUykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaHJvbWVWZXJzaW9uLm1ham9yID4gTkVXX0NEX1ZFUlNJT05fRk9STUFUX01BSk9SX1ZFUlNJT05cbiAgICAgICAgICA/IG1pbkNocm9tZVZlcnNpb25TLm1ham9yID09PSBjaHJvbWVWZXJzaW9uLm1ham9yXG4gICAgICAgICAgOiBzZW12ZXIuZ3RlKGNocm9tZVZlcnNpb24sIG1pbkNocm9tZVZlcnNpb25TKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKF8uaXNFbXB0eShtYXRjaGluZ0RyaXZlcnMpKSB7XG4gICAgICAgIGlmICh0aGlzLnN0b3JhZ2VDbGllbnQgJiYgIWRpZFN0b3JhZ2VTeW5jKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBzeW5jQ2hyb21lZHJpdmVycyhjaHJvbWVWZXJzaW9uKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3Qgc3luY2hyb25pemUgbG9jYWwgY2hyb21lZHJpdmVycyB3aXRoIHRoZSByZW1vdGUgc3RvcmFnZSBhdCAke0NEX0NETn06IGAgK1xuICAgICAgICAgICAgICBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF1dG9kb3dubG9hZFN1Z2dlc3Rpb24gPVxuICAgICAgICAgICdZb3UgY291bGQgYWxzbyB0cnkgdG8gZW5hYmxlIGF1dG9tYXRlZCBjaHJvbWVkcml2ZXJzIGRvd25sb2FkIGFzICcgK1xuICAgICAgICAgICdhIHBvc3NpYmxlIHdvcmthcm91bmQuJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBDaHJvbWVkcml2ZXIgZm91bmQgdGhhdCBjYW4gYXV0b21hdGUgQ2hyb21lICcke2Nocm9tZVZlcnNpb259Jy5gICtcbiAgICAgICAgICAodGhpcy5zdG9yYWdlQ2xpZW50ID8gJycgOiBgICR7YXV0b2Rvd25sb2FkU3VnZ2VzdGlvbn1gKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJpblBhdGggPSBtYXRjaGluZ0RyaXZlcnNbMF0uZXhlY3V0YWJsZTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdleGVjdXRhYmxlJywgbWF0Y2hpbmdEcml2ZXJzLmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgICAgICBgY2FwYWJsZSBvZiBhdXRvbWF0aW5nIENocm9tZSAnJHtjaHJvbWVWZXJzaW9ufScuXFxuQ2hvb3NpbmcgdGhlIG1vc3QgcmVjZW50LCAnJHtiaW5QYXRofScuYCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnSWYgYSBzcGVjaWZpYyB2ZXJzaW9uIGlzIHJlcXVpcmVkLCBzcGVjaWZ5IGl0IHdpdGggdGhlIGBjaHJvbWVkcml2ZXJFeGVjdXRhYmxlYCcgK1xuICAgICAgICAnZGVzaXJlZCBjYXBhYmlsaXR5LicpO1xuICAgICAgcmV0dXJuIGJpblBhdGg7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgIH0gd2hpbGUgKHRydWUpO1xuICB9XG5cbiAgYXN5bmMgaW5pdENocm9tZWRyaXZlclBhdGggKCkge1xuICAgIGlmICh0aGlzLmV4ZWN1dGFibGVWZXJpZmllZCkgcmV0dXJuOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgIC8vIHRoZSBleGVjdXRhYmxlIG1pZ2h0IGJlIHNldCAoaWYgcGFzc2VkIGluKVxuICAgIC8vIG9yIHdlIG1pZ2h0IHdhbnQgdG8gdXNlIHRoZSBiYXNpYyBvbmUgaW5zdGFsbGVkIHdpdGggdGhpcyBkcml2ZXJcbiAgICAvLyBvciB3ZSB3YW50IHRvIGZpZ3VyZSBvdXQgdGhlIGJlc3Qgb25lXG4gICAgaWYgKCF0aGlzLmNocm9tZWRyaXZlcikge1xuICAgICAgdGhpcy5jaHJvbWVkcml2ZXIgPSB0aGlzLnVzZVN5c3RlbUV4ZWN1dGFibGVcbiAgICAgICAgPyBhd2FpdCBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoKClcbiAgICAgICAgOiBhd2FpdCB0aGlzLmdldENvbXBhdGlibGVDaHJvbWVkcml2ZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyh0aGlzLmNocm9tZWRyaXZlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHVzZSBhIGNocm9tZWRyaXZlciBiaW5hcnkgYXQgdGhlIHBhdGggYCArXG4gICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jaHJvbWVkcml2ZXJ9LCBidXQgaXQgZG9lc24ndCBleGlzdCFgKTtcbiAgICB9XG4gICAgdGhpcy5leGVjdXRhYmxlVmVyaWZpZWQgPSB0cnVlO1xuICAgIHRoaXMubG9nLmluZm8oYFNldCBjaHJvbWVkcml2ZXIgYmluYXJ5IGFzOiAke3RoaXMuY2hyb21lZHJpdmVyfWApO1xuICB9XG5cbiAgc3luY1Byb3RvY29sIChjZFZlcnNpb24gPSBudWxsKSB7XG4gICAgY29uc3QgY29lcmNlZFZlcnNpb24gPSBzZW12ZXIuY29lcmNlKGNkVmVyc2lvbik7XG4gICAgaWYgKCFjb2VyY2VkVmVyc2lvbiB8fCBjb2VyY2VkVmVyc2lvbi5tYWpvciA8IE1JTl9DRF9WRVJTSU9OX1dJVEhfVzNDX1NVUFBPUlQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdi4gJHtjZFZlcnNpb259IGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgJHtQUk9UT0NPTFMuVzNDfSBwcm90b2NvbC4gYCArXG4gICAgICAgIGBEZWZhdWx0aW5nIHRvICR7UFJPVE9DT0xTLk1KU09OV1B9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBnZXRDYXBWYWx1ZSh0aGlzLmNhcGFiaWxpdGllcywgJ2Nocm9tZU9wdGlvbnMnLCB7fSk7XG4gICAgaWYgKGNocm9tZU9wdGlvbnMudzNjID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgQ2hyb21lZHJpdmVyIHYuICR7Y2RWZXJzaW9ufSBzdXBwb3J0cyAke1BST1RPQ09MUy5XM0N9IHByb3RvY29sLCBgICtcbiAgICAgICAgYGJ1dCAke1BST1RPQ09MUy5NSlNPTldQfSBvbmUgaGFzIGJlZW4gZXhwbGljaXRseSByZXF1ZXN0ZWRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kZXNpcmVkUHJvdG9jb2wgPSBQUk9UT0NPTFMuVzNDO1xuICAgIC8vIGdpdmVuIGNhcHMgbWlnaHQgbm90IGJlIHByb3Blcmx5IHByZWZpeGVkXG4gICAgLy8gc28gd2UgdHJ5IHRvIGZpeCB0aGVtIGluIG9yZGVyIHRvIHByb3Blcmx5IGluaXRcbiAgICAvLyB0aGUgbmV3IFczQyBzZXNzaW9uXG4gICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB0b1czY0NhcE5hbWVzKHRoaXMuY2FwYWJpbGl0aWVzKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChjYXBzLCBlbWl0U3RhcnRpbmdTdGF0ZSA9IHRydWUpIHtcbiAgICB0aGlzLmNhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKGNhcHMpO1xuXG4gICAgLy8gc2V0IHRoZSBsb2dnaW5nIHByZWZlcmVuY2VzIHRvIEFMTCB0aGUgY29uc29sZSBsb2dzXG4gICAgdGhpcy5jYXBhYmlsaXRpZXMubG9nZ2luZ1ByZWZzID0gXy5jbG9uZURlZXAoZ2V0Q2FwVmFsdWUoY2FwcywgJ2xvZ2dpbmdQcmVmcycsIHt9KSk7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLmNhcGFiaWxpdGllcy5sb2dnaW5nUHJlZnMuYnJvd3NlcikpIHtcbiAgICAgIHRoaXMuY2FwYWJpbGl0aWVzLmxvZ2dpbmdQcmVmcy5icm93c2VyID0gJ0FMTCc7XG4gICAgfVxuXG4gICAgaWYgKGVtaXRTdGFydGluZ1N0YXRlKSB7XG4gICAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9TVEFSVElORyk7XG4gICAgfVxuXG4gICAgY29uc3QgYXJncyA9IFtgLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9YF07XG4gICAgaWYgKHRoaXMuYWRiICYmIHRoaXMuYWRiLmFkYlBvcnQpIHtcbiAgICAgIGFyZ3MucHVzaChgLS1hZGItcG9ydD0ke3RoaXMuYWRiLmFkYlBvcnR9YCk7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkodGhpcy5jbWRBcmdzKSkge1xuICAgICAgYXJncy5wdXNoKC4uLnRoaXMuY21kQXJncyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvZ1BhdGgpIHtcbiAgICAgIGFyZ3MucHVzaChgLS1sb2ctcGF0aD0ke3RoaXMubG9nUGF0aH1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZUJ1aWxkQ2hlY2spIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1kaXNhYmxlLWJ1aWxkLWNoZWNrJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLS12ZXJib3NlJyk7XG4gICAgLy8gd2hhdCBhcmUgdGhlIHByb2Nlc3Mgc3Rkb3V0L3N0ZGVyciBjb25kaXRpb25zIHdoZXJlaW4gd2Uga25vdyB0aGF0XG4gICAgLy8gdGhlIHByb2Nlc3MgaGFzIHN0YXJ0ZWQgdG8gb3VyIHNhdGlzZmFjdGlvbj9cbiAgICBjb25zdCBzdGFydERldGVjdG9yID0gKHN0ZG91dCkgPT4gc3Rkb3V0LnN0YXJ0c1dpdGgoJ1N0YXJ0aW5nICcpO1xuXG4gICAgbGV0IHByb2Nlc3NJc0FsaXZlID0gZmFsc2U7XG4gICAgbGV0IHdlYnZpZXdWZXJzaW9uO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRDaHJvbWVkcml2ZXJQYXRoKCk7XG4gICAgICBhd2FpdCB0aGlzLmtpbGxBbGwoKTtcblxuICAgICAgLy8gc2V0IHVwIG91ciBzdWJwcm9jZXNzIG9iamVjdFxuICAgICAgdGhpcy5wcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5jaHJvbWVkcml2ZXIsIGFyZ3MpO1xuICAgICAgcHJvY2Vzc0lzQWxpdmUgPSB0cnVlO1xuXG4gICAgICAvLyBoYW5kbGUgbG9nIG91dHB1dFxuICAgICAgdGhpcy5wcm9jLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgLy8gaWYgdGhlIGNkIG91dHB1dCBpcyBub3QgcHJpbnRlZCwgZmluZCB0aGUgY2hyb21lIHZlcnNpb24gYW5kIHByaW50XG4gICAgICAgIC8vIHdpbGwgZ2V0IGEgcmVzcG9uc2UgbGlrZVxuICAgICAgICAvLyAgIERldlRvb2xzIHJlc3BvbnNlOiB7XG4gICAgICAgIC8vICAgICAgXCJBbmRyb2lkLVBhY2thZ2VcIjogXCJpby5hcHBpdW0uc2FtcGxlYXBwXCIsXG4gICAgICAgIC8vICAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzU1LjAuMjg4My45MVwiLFxuICAgICAgICAvLyAgICAgIFwiUHJvdG9jb2wtVmVyc2lvblwiOiBcIjEuMlwiLFxuICAgICAgICAvLyAgICAgIFwiVXNlci1BZ2VudFwiOiBcIi4uLlwiLFxuICAgICAgICAvLyAgICAgIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzZcIlxuICAgICAgICAvLyAgIH1cbiAgICAgICAgY29uc3Qgb3V0ID0gc3Rkb3V0ICsgc3RkZXJyO1xuICAgICAgICBsZXQgbWF0Y2ggPSAvXCJCcm93c2VyXCI6IFwiKC4qKVwiLy5leGVjKG91dCk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHdlYnZpZXdWZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFdlYnZpZXcgdmVyc2lvbjogJyR7d2Vidmlld1ZlcnNpb259J2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWxzbyBwcmludCBjaHJvbWVkcml2ZXIgdmVyc2lvbiB0byBsb2dzXG4gICAgICAgIC8vIHdpbGwgb3V0cHV0IHNvbWV0aGluZyBsaWtlXG4gICAgICAgIC8vICBTdGFydGluZyBDaHJvbWVEcml2ZXIgMi4zMy41MDYxMDYgKDhhMDZjMzljNDU4MmZiZmJhYjY5NjZkYmIxYzM4YTkxNzNiZmIxYTIpIG9uIHBvcnQgOTUxNVxuICAgICAgICBtYXRjaCA9IC9TdGFydGluZyBDaHJvbWVEcml2ZXIgKFsuXFxkXSspLy5leGVjKG91dCk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdmVyc2lvbjogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgICAgIHRoaXMuc3luY1Byb3RvY29sKG1hdGNoWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdpdmUgdGhlIG91dHB1dCBpZiBpdCBpcyByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgICAgIGZvciAobGV0IGxpbmUgb2YgKHN0ZG91dCB8fCAnJykudHJpbSgpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgICAgaWYgKCFsaW5lLnRyaW0oKS5sZW5ndGgpIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgW1NURE9VVF0gJHtsaW5lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIChzdGRlcnIgfHwgJycpLnRyaW0oKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgICAgIGlmICghbGluZS50cmltKCkubGVuZ3RoKSBjb250aW51ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYFtTVERFUlJdICR7bGluZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBoYW5kbGUgb3V0LW9mLWJvdW5kIGV4aXQgYnkgc2ltcGx5IGVtaXR0aW5nIGEgc3RvcHBlZCBzdGF0ZVxuICAgICAgdGhpcy5wcm9jLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBwcm9jZXNzSXNBbGl2ZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgIT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUElORyAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZSAhPT0gQ2hyb21lZHJpdmVyLlNUQVRFX1JFU1RBUlRJTkcpIHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBgQ2hyb21lZHJpdmVyIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2l0aCBjb2RlICR7Y29kZX0sIHNpZ25hbCAke3NpZ25hbH1gO1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKG1zZyk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU3Bhd25pbmcgY2hyb21lZHJpdmVyIHdpdGg6ICR7dGhpcy5jaHJvbWVkcml2ZXJ9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICAvLyBzdGFydCBzdWJwcm9jIGFuZCB3YWl0IGZvciBzdGFydERldGVjdG9yXG4gICAgICBhd2FpdCB0aGlzLnByb2Muc3RhcnQoc3RhcnREZXRlY3Rvcik7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JPbmxpbmUoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRTZXNzaW9uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoZSk7XG4gICAgICB0aGlzLmVtaXQoQ2hyb21lZHJpdmVyLkVWRU5UX0VSUk9SLCBlKTtcbiAgICAgIC8vIGp1c3QgYmVjYXVzZSB3ZSBoYWQgYW4gZXJyb3IgZG9lc24ndCBtZWFuIHRoZSBjaHJvbWVkcml2ZXIgcHJvY2Vzc1xuICAgICAgLy8gZmluaXNoZWQ7IHdlIHNob3VsZCBjbGVhbiB1cCBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChwcm9jZXNzSXNBbGl2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Muc3RvcCgpO1xuICAgICAgfVxuXG4gICAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgICAgLy8gb2Z0ZW4gdGhlIHVzZXIncyBDaHJvbWUgdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB2ZXJzaW9uIG9mIENocm9tZWRyaXZlclxuICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcygnQ2hyb21lIHZlcnNpb24gbXVzdCBiZScpKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gJ1VuYWJsZSB0byBhdXRvbWF0ZSBDaHJvbWUgdmVyc2lvbiBiZWNhdXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIENocm9tZWRyaXZlci5cXG4nO1xuICAgICAgICBpZiAod2Vidmlld1ZlcnNpb24pIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGBDaHJvbWUgdmVyc2lvbiBvbiB0aGUgZGV2aWNlOiAke3dlYnZpZXdWZXJzaW9ufVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlciA9IC9DaHJvbWUgdmVyc2lvbiBtdXN0IGJlICguKykvLmV4ZWMoZS5tZXNzYWdlKT8uWzFdIHx8ICcnO1xuICAgICAgICBpZiAodmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlcikge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYENocm9tZWRyaXZlciBzdXBwb3J0cyBDaHJvbWUgdmVyc2lvbihzKTogJHt2ZXJzaW9uc1N1cHBvcnRlZEJ5RHJpdmVyfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZSArPSAnQ2hlY2sgdGhlIGRyaXZlciB0dXRvcmlhbCBmb3IgdHJvdWJsZXNob290aW5nLlxcbic7XG4gICAgICB9XG5cbiAgICAgIG1lc3NhZ2UgKz0gZS5tZXNzYWdlO1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBzZXNzaW9uSWQgKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FID8gdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA6IG51bGw7XG4gIH1cblxuICBhc3luYyByZXN0YXJ0ICgpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdSZXN0YXJ0aW5nIGNocm9tZWRyaXZlcicpO1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCByZXN0YXJ0IHdoZW4gd2UncmUgbm90IG9ubGluZVwiKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfUkVTVEFSVElORyk7XG4gICAgYXdhaXQgdGhpcy5zdG9wKGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0KHRoaXMuY2FwYWJpbGl0aWVzLCBmYWxzZSk7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yT25saW5lICgpIHtcbiAgICAvLyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IENEIGhhc24ndCBjcmFzaGVkXG4gICAgbGV0IGNocm9tZWRyaXZlclN0b3BwZWQgPSBmYWxzZTtcbiAgICBhd2FpdCByZXRyeUludGVydmFsKDIwLCAyMDAsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICAvLyB3ZSBhcmUgZWl0aGVyIHN0b3BwZWQgb3Igc3RvcHBpbmcsIHNvIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICAgIGNocm9tZWRyaXZlclN0b3BwZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIH0pO1xuICAgIGlmIChjaHJvbWVkcml2ZXJTdG9wcGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nocm9tZURyaXZlciBjcmFzaGVkIGR1cmluZyBzdGFydHVwLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXNzaW9uICgpIHtcbiAgICBjb25zdCBzZXNzaW9uQ2FwcyA9IHRoaXMuZGVzaXJlZFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDXG4gICAgICA/IHtjYXBhYmlsaXRpZXM6IHthbHdheXNNYXRjaDogdGhpcy5jYXBhYmlsaXRpZXN9fVxuICAgICAgOiB7ZGVzaXJlZENhcGFiaWxpdGllczogdGhpcy5jYXBhYmlsaXRpZXN9O1xuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nICR7dGhpcy5kZXNpcmVkUHJvdG9jb2x9IENocm9tZWRyaXZlciBzZXNzaW9uIHdpdGggY2FwYWJpbGl0aWVzOiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHNlc3Npb25DYXBzLCBudWxsLCAyKSk7XG4gICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCBzZXNzaW9uQ2Fwcyk7XG4gICAgdGhpcy5sb2cucHJlZml4ID0gZ2VuZXJhdGVMb2dQcmVmaXgodGhpcywgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCk7XG4gICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKGVtaXRTdGF0ZXMgPSB0cnVlKSB7XG4gICAgaWYgKGVtaXRTdGF0ZXMpIHtcbiAgICAgIHRoaXMuY2hhbmdlU3RhdGUoQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HKTtcbiAgICB9XG4gICAgY29uc3QgcnVuU2FmZVN0ZXAgPSBhc3luYyAoZikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGYoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGF3YWl0IHJ1blNhZmVTdGVwKCgpID0+IHRoaXMuandwcm94eS5jb21tYW5kKCcnLCAnREVMRVRFJykpO1xuICAgIGF3YWl0IHJ1blNhZmVTdGVwKCgpID0+IHRoaXMucHJvYy5zdG9wKCdTSUdURVJNJywgMjAwMDApKTtcbiAgICB0aGlzLmxvZy5wcmVmaXggPSBnZW5lcmF0ZUxvZ1ByZWZpeCh0aGlzKTtcbiAgICBpZiAoZW1pdFN0YXRlcykge1xuICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlU3RhdGUgKHN0YXRlKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMubG9nLmRlYnVnKGBDaGFuZ2VkIHN0YXRlIHRvICcke3N0YXRlfSdgKTtcbiAgICB0aGlzLmVtaXQoQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIHtzdGF0ZX0pO1xuICB9XG5cbiAgYXN5bmMgc2VuZENvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxuXG4gIGFzeW5jIHByb3h5UmVxIChyZXEsIHJlcykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMocmVxLCByZXMpO1xuICB9XG5cbiAgYXN5bmMga2lsbEFsbCAoKSB7XG4gICAgbGV0IGNtZCA9IHN5c3RlbS5pc1dpbmRvd3MoKVxuICAgICAgPyBgd21pYyBwcm9jZXNzIHdoZXJlIFwiY29tbWFuZGxpbmUgbGlrZSAnJWNocm9tZWRyaXZlci5leGUlLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9JSdcIiBkZWxldGVgXG4gICAgICA6IGBwa2lsbCAtMTUgLWYgXCIke3RoaXMuY2hyb21lZHJpdmVyfS4qLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9XCJgO1xuICAgIHRoaXMubG9nLmRlYnVnKGBLaWxsaW5nIGFueSBvbGQgY2hyb21lZHJpdmVycywgcnVubmluZzogJHtjbWR9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IChCLnByb21pc2lmeShjcC5leGVjKSkoY21kKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdTdWNjZXNzZnVsbHkgY2xlYW5lZCB1cCBvbGQgY2hyb21lZHJpdmVycycpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybignTm8gb2xkIGNocm9tZWRyaXZlcnMgc2VlbSB0byBleGlzdCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgY29uc3QgdWRpZEluZGV4ID0gdGhpcy5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJncy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0gPT09ICctcycpO1xuICAgICAgY29uc3QgdWRpZCA9IHVkaWRJbmRleCA+IC0xID8gdGhpcy5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1t1ZGlkSW5kZXggKyAxXSA6IG51bGw7XG5cbiAgICAgIGlmICh1ZGlkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbGVhbmluZyB0aGlzIGRldmljZSdzIGFkYiBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbnM6ICR7dWRpZH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbGVhbmluZyBhbnkgb2xkIGFkYiBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbnNgKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChsZXQgY29ubiBvZiBhd2FpdCB0aGlzLmFkYi5nZXRGb3J3YXJkTGlzdCgpKSB7XG4gICAgICAgICAgLy8gY2hyb21lZHJpdmVyIHdpbGwgYXNrIEFEQiB0byBmb3J3YXJkIGEgcG9ydCBsaWtlIFwiZGV2aWNlSWQgdGNwOnBvcnQgbG9jYWxhYnN0cmFjdDp3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV9wb3J0XCJcbiAgICAgICAgICBpZiAoIShjb25uLmluY2x1ZGVzKCd3ZWJ2aWV3X2RldnRvb2xzJykgJiYgKCF1ZGlkIHx8IGNvbm4uaW5jbHVkZXModWRpZCkpKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHBhcmFtcyA9IGNvbm4uc3BsaXQoL1xccysvKTtcbiAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHBhcmFtc1sxXS5yZXBsYWNlKC9bXFxEXSovLCAnJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byBjbGVhbiBmb3J3YXJkZWQgcG9ydHMuIEVycm9yOiAnJHtlcnIubWVzc2FnZX0nLiBDb250aW51aW5nLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhc1dvcmtpbmdXZWJ2aWV3ICgpIHtcbiAgICAvLyBzb21ldGltZXMgY2hyb21lZHJpdmVyIHN0b3BzIGF1dG9tYXRpbmcgd2Vidmlld3MuIHRoaXMgbWV0aG9kIHJ1bnMgYVxuICAgIC8vIHNpbXBsZSBjb21tYW5kIHRvIGRldGVybWluZSBvdXIgc3RhdGUsIGFuZCByZXNwb25kcyBhY2NvcmRpbmdseVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3VybCcsICdHRVQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuQ2hyb21lZHJpdmVyLkVWRU5UX0VSUk9SID0gJ2Nocm9tZWRyaXZlcl9lcnJvcic7XG5DaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCA9ICdzdGF0ZUNoYW5nZWQnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQgPSAnc3RvcHBlZCc7XG5DaHJvbWVkcml2ZXIuU1RBVEVfU1RBUlRJTkcgPSAnc3RhcnRpbmcnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX09OTElORSA9ICdvbmxpbmUnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HID0gJ3N0b3BwaW5nJztcbkNocm9tZWRyaXZlci5TVEFURV9SRVNUQVJUSU5HID0gJ3Jlc3RhcnRpbmcnO1xuXG5leHBvcnQgeyBDaHJvbWVkcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IENocm9tZWRyaXZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxtQ0FBbUMsR0FBRyxFQUE1QztBQUNBLE1BQU1DLFlBQVksR0FBRyxXQUFyQjtBQUNBLE1BQU1DLCtCQUErQixHQUFHLEVBQXhDO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLElBQXJCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsb0JBQXpCO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsNEJBQWhDO0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsQ0FDekIsNEJBRHlCLEVBRXpCLHFCQUZ5QixDQUEzQjtBQUlBLE1BQU1DLGVBQWUsR0FBRyxVQUF4QjtBQUVBLE1BQU1DLGtCQUFrQixHQUFHLElBQTNCOztBQUVBLE1BQU1DLFlBQU4sU0FBMkJDLGVBQUEsQ0FBT0MsWUFBbEMsQ0FBK0M7RUFDN0NDLFdBQVcsQ0FBRUMsSUFBSSxHQUFHLEVBQVQsRUFBYTtJQUN0QjtJQUVBLE1BQU07TUFDSkMsSUFBSSxHQUFHYixZQURIO01BRUpjLElBQUksR0FBR1osWUFGSDtNQUdKYSxtQkFBbUIsR0FBRyxL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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chromedriver.js","names":["NEW_CD_VERSION_FORMAT_MAJOR_VERSION","DEFAULT_HOST","MIN_CD_VERSION_WITH_W3C_SUPPORT","DEFAULT_PORT","CHROME_BUNDLE_ID","WEBVIEW_SHELL_BUNDLE_ID","WEBVIEW_BUNDLE_IDS","VERSION_PATTERN","CD_VERSION_TIMEOUT","Chromedriver","events","EventEmitter","constructor","args","host","port","useSystemExecutable","executable","executableDir","getChromedriverDir","bundleId","mappingPath","cmdArgs","adb","verbose","logPath","disableBuildCheck","details","isAutodownloadEnabled","_log","logger","getLogger","generateLogPrefix","proxyHost","proxyPort","proc","chromedriver","executableVerified","state","STATE_STOPPED","jwproxy","JWProxy","server","log","storageClient","ChromedriverStorageClient","chromedriverDir","capabilities","desiredProtocol","PROTOCOLS","MJSONWP","getDriversMapping","mapping","_","cloneDeep","CHROMEDRIVER_CHROME_MAPPING","debug","fs","exists","warn","info","JSON","parse","readFile","err","message","cdVersion","chromeVersion","toPairs","coercedVersion","semver","coerce","version","getChromedrivers","executables","glob","cwd","strict","nodir","absolute","util","pluralize","length","cds","asyncmap","logError","stdout","stderr","errMsg","path","basename","exec","timeout","includes","match","minChromeVersion","major","minor","filter","cd","sort","a","b","compareVersions","isEmpty","getChromeVersion","Browser","versionMatch","apiLevel","getApiLevel","updateDriversMapping","newMapping","shouldUpdateStaticMapping","writeFile","stringify","e","Object","assign","getCompatibleChromedriver","getChromedriverBinaryPath","values","didStorageSync","syncChromedrivers","retrievedMapping","retrieveMapping","driverKeys","syncDrivers","minBrowserVersion","synchronizedDriversMapping","reduce","acc","x","missingVersions","coercedVer","size","errorAndThrow","matchingDrivers","minChromeVersionS","gte","CD_CDN","stack","autodownloadSuggestion","Error","binPath","initChromedriverPath","syncProtocol","W3C","chromeOptions","getCapValue","w3c","toW3cCapNames","start","caps","emitStartingState","loggingPrefs","browser","changeState","STATE_STARTING","adbPort","push","isArray","startDetector","startsWith","processIsAlive","webviewVersion","killAll","SubProcess","on","out","line","trim","split","error","code","signal","STATE_STOPPING","STATE_RESTARTING","msg","join","waitForOnline","startSession","emit","EVENT_ERROR","stop","versionsSupportedByDriver","sessionId","STATE_ONLINE","restart","chromedriverStopped","retryInterval","getStatus","command","sessionCaps","alwaysMatch","desiredCapabilities","prefix","emitStates","runSafeStep","f","EVENT_CHANGED","sendCommand","url","method","body","proxyReq","req","res","proxyReqRes","cmd","system","isWindows","B","promisify","cp","udidIndex","defaultArgs","findIndex","item","udid","conn","getForwardList","params","removePortForward","replace","hasWorkingWebview"],"sources":["../../lib/chromedriver.js"],"sourcesContent":["// transpile:main\n\nimport events from 'events';\nimport { JWProxy, PROTOCOLS } from 'appium/driver';\nimport cp from 'child_process';\nimport { system, fs, logger, util } from 'appium/support';\nimport { retryInterval, asyncmap } from 'asyncbox';\nimport { SubProcess, exec } from 'teen_process';\nimport B from 'bluebird';\nimport {\n getChromeVersion, getChromedriverDir, CHROMEDRIVER_CHROME_MAPPING,\n getChromedriverBinaryPath, CD_CDN, generateLogPrefix\n} from './utils';\nimport semver from 'semver';\nimport _ from 'lodash';\nimport path from 'path';\nimport { compareVersions } from 'compare-versions';\nimport ChromedriverStorageClient from './storage-client';\nimport { toW3cCapNames, getCapValue } from './protocol-helpers';\n\nconst NEW_CD_VERSION_FORMAT_MAJOR_VERSION = 73;\nconst DEFAULT_HOST = '127.0.0.1';\nconst MIN_CD_VERSION_WITH_W3C_SUPPORT = 75;\nconst DEFAULT_PORT = 9515;\nconst CHROME_BUNDLE_ID = 'com.android.chrome';\nconst WEBVIEW_SHELL_BUNDLE_ID = 'org.chromium.webview_shell';\nconst WEBVIEW_BUNDLE_IDS = [\n 'com.google.android.webview',\n 'com.android.webview',\n];\nconst VERSION_PATTERN = /([\\d.]+)/;\n\nconst CD_VERSION_TIMEOUT = 5000;\n\nclass Chromedriver extends events.EventEmitter {\n constructor (args = {}) {\n super();\n\n const {\n host = DEFAULT_HOST,\n port = DEFAULT_PORT,\n useSystemExecutable = false,\n executable,\n executableDir = getChromedriverDir(),\n bundleId,\n mappingPath,\n cmdArgs,\n adb,\n verbose,\n logPath,\n disableBuildCheck,\n details,\n isAutodownloadEnabled = false,\n } = args;\n this._log = logger.getLogger(generateLogPrefix(this));\n\n this.proxyHost = host;\n this.proxyPort = port;\n this.adb = adb;\n this.cmdArgs = cmdArgs;\n this.proc = null;\n this.useSystemExecutable = useSystemExecutable;\n this.chromedriver = executable;\n this.executableDir = executableDir;\n this.mappingPath = mappingPath;\n this.bundleId = bundleId;\n this.executableVerified = false;\n this.state = Chromedriver.STATE_STOPPED;\n this.jwproxy = new JWProxy({\n server: this.proxyHost,\n port: this.proxyPort,\n log: this._log,\n });\n this.verbose = verbose;\n this.logPath = logPath;\n this.disableBuildCheck = !!disableBuildCheck;\n this.storageClient = isAutodownloadEnabled\n ? new ChromedriverStorageClient({ chromedriverDir: this.executableDir })\n : null;\n this.details = details;\n this.capabilities = {};\n this.desiredProtocol = PROTOCOLS.MJSONWP;\n }\n\n get log () {\n return this._log;\n }\n\n async getDriversMapping () {\n let mapping = _.cloneDeep(CHROMEDRIVER_CHROME_MAPPING);\n if (this.mappingPath) {\n this.log.debug(`Attempting to use Chromedriver->Chrome mapping from '${this.mappingPath}'`);\n if (!await fs.exists(this.mappingPath)) {\n this.log.warn(`No file found at '${this.mappingPath}'`);\n this.log.info('Defaulting to the static Chromedriver->Chrome mapping');\n } else {\n try {\n mapping = JSON.parse(await fs.readFile(this.mappingPath, 'utf8'));\n } catch (err) {\n this.log.warn(`Error parsing mapping from '${this.mappingPath}': ${err.message}`);\n this.log.info('Defaulting to the static Chromedriver->Chrome mapping');\n }\n }\n } else {\n this.log.debug('Using the static Chromedriver->Chrome mapping');\n }\n\n // make sure that the values for minimum chrome version are semver compliant\n for (const [cdVersion, chromeVersion] of _.toPairs(mapping)) {\n const coercedVersion = semver.coerce(chromeVersion);\n if (coercedVersion) {\n mapping[cdVersion] = coercedVersion.version;\n } else {\n this.log.info(`'${chromeVersion}' is not a valid version number. Skipping it`);\n }\n }\n return mapping;\n }\n\n async getChromedrivers (mapping) {\n // go through the versions available\n const executables = await fs.glob('*', {\n cwd: this.executableDir,\n strict: false,\n nodir: true,\n absolute: true,\n });\n this.log.debug(`Found ${util.pluralize('executable', executables.length, true)} ` +\n `in '${this.executableDir}'`);\n const cds = (await asyncmap(executables, async (executable) => {\n const logError = ({message, stdout = null, stderr = null}) => {\n let errMsg = `Cannot retrieve version number from '${path.basename(executable)}' Chromedriver binary. ` +\n `Make sure it returns a valid version string in response to '--version' command line argument. ${message}`;\n if (stdout) {\n errMsg += `\\nStdout: ${stdout}`;\n }\n if (stderr) {\n errMsg += `\\nStderr: ${stderr}`;\n }\n this.log.warn(errMsg);\n return null;\n };\n\n let stdout;\n let stderr;\n try {\n ({stdout, stderr} = await exec(executable, ['--version'], {\n timeout: CD_VERSION_TIMEOUT,\n }));\n } catch (err) {\n if (!(err.message || '').includes('timed out') && !(err.stdout || '').includes('Starting ChromeDriver')) {\n return logError(err);\n }\n\n // if this has timed out, it has actually started Chromedriver,\n // in which case there will also be the version string in the output\n stdout = err.stdout;\n }\n\n const match = /ChromeDriver\\s+\\(?v?([\\d.]+)\\)?/i.exec(stdout); // https://regex101.com/r/zpj5wA/1\n if (!match) {\n return logError({message: 'Cannot parse the version string', stdout, stderr});\n }\n let version = match[1];\n let minChromeVersion = mapping[version];\n const coercedVersion = semver.coerce(version);\n if (coercedVersion) {\n // before 2019-03-06 versions were of the form major.minor\n if (coercedVersion.major < NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {\n version = `${coercedVersion.major}.${coercedVersion.minor}`;\n minChromeVersion = mapping[version];\n }\n if (!minChromeVersion && coercedVersion.major >= NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {\n // Assume the major Chrome version is the same as the corresponding driver major version\n minChromeVersion = `${coercedVersion.major}`;\n }\n }\n return {\n executable,\n version,\n minChromeVersion,\n };\n }))\n .filter((cd) => !!cd)\n .sort((a, b) => compareVersions(b.version, a.version));\n if (_.isEmpty(cds)) {\n this.log.info(`No Chromedrivers were found in '${this.executableDir}'`);\n return cds;\n }\n this.log.debug(`The following Chromedriver executables were found:`);\n for (const cd of cds) {\n this.log.debug(` '${cd.executable}' (version '${cd.version}', minimum Chrome version '${cd.minChromeVersion ? cd.minChromeVersion : 'Unknown'}')`);\n }\n return cds;\n }\n\n async getChromeVersion () {\n // Try to retrieve the version from `details` property if it is set\n // The `info` item must contain the output of /json/version CDP command\n // where `Browser` field looks like `Chrome/72.0.3601.0``\n if (this.details?.info) {\n this.log.debug(`Browser version in the supplied details: ${this.details?.info?.Browser}`);\n }\n const versionMatch = VERSION_PATTERN.exec(this.details?.info?.Browser);\n if (versionMatch) {\n const coercedVersion = semver.coerce(versionMatch[1]);\n if (coercedVersion) {\n return coercedVersion;\n }\n }\n\n let chromeVersion;\n\n // in case of WebView Browser Tester, simply try to find the underlying webview\n if (this.bundleId === WEBVIEW_SHELL_BUNDLE_ID) {\n for (const bundleId of WEBVIEW_BUNDLE_IDS) {\n chromeVersion = await getChromeVersion(this.adb, bundleId);\n if (chromeVersion) {\n this.bundleId = bundleId;\n return semver.coerce(chromeVersion);\n }\n }\n return null;\n }\n\n // on Android 7-9 webviews are backed by the main Chrome, not the system webview\n if (this.adb) {\n const apiLevel = await this.adb.getApiLevel();\n if (apiLevel >= 24 && apiLevel <= 28 &&\n [WEBVIEW_SHELL_BUNDLE_ID, ...WEBVIEW_BUNDLE_IDS].includes(this.bundleId)) {\n this.bundleId = CHROME_BUNDLE_ID;\n }\n }\n\n // try out webviews when no bundle id is sent in\n if (!this.bundleId) {\n // default to the generic Chrome bundle\n this.bundleId = CHROME_BUNDLE_ID;\n\n // we have a webview of some sort, so try to find the bundle version\n for (const bundleId of WEBVIEW_BUNDLE_IDS) {\n chromeVersion = await getChromeVersion(this.adb, bundleId);\n if (chromeVersion) {\n this.bundleId = bundleId;\n break;\n }\n }\n }\n\n // if we do not have a chrome version, it must not be a webview\n if (!chromeVersion) {\n chromeVersion = await getChromeVersion(this.adb, this.bundleId);\n }\n\n // make sure it is semver, so later checks won't fail\n return chromeVersion ? semver.coerce(chromeVersion) : null;\n }\n\n async updateDriversMapping (newMapping) {\n let shouldUpdateStaticMapping = true;\n if (await fs.exists(this.mappingPath)) {\n try {\n await fs.writeFile(this.mappingPath, JSON.stringify(newMapping, null, 2), 'utf8');\n shouldUpdateStaticMapping = false;\n } catch (e) {\n this.log.warn(`Cannot store the updated chromedrivers mapping into '${this.mappingPath}'. ` +\n `This may reduce the performance of further executions. Original error: ${e.message}`);\n }\n }\n if (shouldUpdateStaticMapping) {\n Object.assign(CHROMEDRIVER_CHROME_MAPPING, newMapping);\n }\n }\n\n async getCompatibleChromedriver () {\n if (!this.adb) {\n return await getChromedriverBinaryPath();\n }\n\n const mapping = await this.getDriversMapping();\n if (!_.isEmpty(mapping)) {\n this.log.debug(`The most recent known Chrome version: ${_.values(mapping)[0]}`);\n }\n\n let didStorageSync = false;\n const syncChromedrivers = async (chromeVersion) => {\n didStorageSync = true;\n const retrievedMapping = await this.storageClient.retrieveMapping();\n this.log.debug('Got chromedrivers mapping from the storage: ' +\n JSON.stringify(retrievedMapping, null, 2));\n const driverKeys = await this.storageClient.syncDrivers({\n minBrowserVersion: chromeVersion.major,\n });\n if (_.isEmpty(driverKeys)) {\n return false;\n }\n const synchronizedDriversMapping = driverKeys.reduce((acc, x) => {\n const {version, minBrowserVersion} = retrievedMapping[x];\n acc[version] = minBrowserVersion;\n return acc;\n }, {});\n Object.assign(mapping, synchronizedDriversMapping);\n await this.updateDriversMapping(mapping);\n return true;\n };\n\n do {\n const cds = await this.getChromedrivers(mapping);\n\n const missingVersions = {};\n for (const {version, minChromeVersion} of cds) {\n if (!minChromeVersion || mapping[version]) {\n continue;\n }\n const coercedVer = semver.coerce(version);\n if (!coercedVer || coercedVer.major < NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {\n continue;\n }\n\n missingVersions[version] = minChromeVersion;\n }\n if (!_.isEmpty(missingVersions)) {\n this.log.info(`Found ${util.pluralize('Chromedriver', _.size(missingVersions), true)}, ` +\n `which ${_.size(missingVersions) === 1 ? 'is' : 'are'} missing in the list of known versions: ` +\n JSON.stringify(missingVersions));\n await this.updateDriversMapping(Object.assign(mapping, missingVersions));\n }\n\n if (this.disableBuildCheck) {\n if (_.isEmpty(cds)) {\n this.log.errorAndThrow(`There must be at least one Chromedriver executable available for use if ` +\n `'chromedriverDisableBuildCheck' capability is set to 'true'`);\n }\n const {version, executable} = cds[0];\n this.log.warn(`Chrome build check disabled. Using most recent Chromedriver version (${version}, at '${executable}')`);\n this.log.warn(`If this is wrong, set 'chromedriverDisableBuildCheck' capability to 'false'`);\n return executable;\n }\n\n const chromeVersion = await this.getChromeVersion();\n if (!chromeVersion) {\n // unable to get the chrome version\n if (_.isEmpty(cds)) {\n this.log.errorAndThrow(`There must be at least one Chromedriver executable available for use if ` +\n `the current Chrome version cannot be determined`);\n }\n const {version, executable} = cds[0];\n this.log.warn(`Unable to discover Chrome version. Using Chromedriver ${version} at '${executable}'`);\n return executable;\n }\n this.log.debug(`Found Chrome bundle '${this.bundleId}' version '${chromeVersion}'`);\n\n const matchingDrivers = cds.filter(({minChromeVersion}) => {\n const minChromeVersionS = minChromeVersion && semver.coerce(minChromeVersion);\n if (!minChromeVersionS) {\n return false;\n }\n\n return chromeVersion.major > NEW_CD_VERSION_FORMAT_MAJOR_VERSION\n ? minChromeVersionS.major === chromeVersion.major\n : semver.gte(chromeVersion, minChromeVersionS);\n });\n if (_.isEmpty(matchingDrivers)) {\n if (this.storageClient && !didStorageSync) {\n try {\n if (await syncChromedrivers(chromeVersion)) {\n continue;\n }\n } catch (e) {\n this.log.warn(`Cannot synchronize local chromedrivers with the remote storage at ${CD_CDN}: ` +\n e.message);\n this.log.debug(e.stack);\n }\n }\n const autodownloadSuggestion =\n 'You could also try to enable automated chromedrivers download as ' +\n 'a possible workaround.';\n throw new Error(`No Chromedriver found that can automate Chrome '${chromeVersion}'.` +\n (this.storageClient ? '' : ` ${autodownloadSuggestion}`));\n }\n\n const binPath = matchingDrivers[0].executable;\n this.log.debug(`Found ${util.pluralize('executable', matchingDrivers.length, true)} ` +\n `capable of automating Chrome '${chromeVersion}'.\\nChoosing the most recent, '${binPath}'.`);\n this.log.debug('If a specific version is required, specify it with the `chromedriverExecutable`' +\n 'desired capability.');\n return binPath;\n // eslint-disable-next-line no-constant-condition\n } while (true);\n }\n\n async initChromedriverPath () {\n if (this.executableVerified) return; //eslint-disable-line curly\n\n // the executable might be set (if passed in)\n // or we might want to use the basic one installed with this driver\n // or we want to figure out the best one\n if (!this.chromedriver) {\n this.chromedriver = this.useSystemExecutable\n ? await getChromedriverBinaryPath()\n : await this.getCompatibleChromedriver();\n }\n\n if (!await fs.exists(this.chromedriver)) {\n throw new Error(`Trying to use a chromedriver binary at the path ` +\n `${this.chromedriver}, but it doesn't exist!`);\n }\n this.executableVerified = true;\n this.log.info(`Set chromedriver binary as: ${this.chromedriver}`);\n }\n\n syncProtocol (cdVersion = null) {\n const coercedVersion = semver.coerce(cdVersion);\n if (!coercedVersion || coercedVersion.major < MIN_CD_VERSION_WITH_W3C_SUPPORT) {\n this.log.debug(`Chromedriver v. ${cdVersion} does not fully support ${PROTOCOLS.W3C} protocol. ` +\n `Defaulting to ${PROTOCOLS.MJSONWP}`);\n return;\n }\n const chromeOptions = getCapValue(this.capabilities, 'chromeOptions', {});\n if (chromeOptions.w3c === false) {\n this.log.info(`Chromedriver v. ${cdVersion} supports ${PROTOCOLS.W3C} protocol, ` +\n `but ${PROTOCOLS.MJSONWP} one has been explicitly requested`);\n return;\n }\n this.desiredProtocol = PROTOCOLS.W3C;\n // given caps might not be properly prefixed\n // so we try to fix them in order to properly init\n // the new W3C session\n this.capabilities = toW3cCapNames(this.capabilities);\n }\n\n async start (caps, emitStartingState = true) {\n this.capabilities = _.cloneDeep(caps);\n\n // set the logging preferences to ALL the console logs\n this.capabilities.loggingPrefs = _.cloneDeep(getCapValue(caps, 'loggingPrefs', {}));\n if (_.isEmpty(this.capabilities.loggingPrefs.browser)) {\n this.capabilities.loggingPrefs.browser = 'ALL';\n }\n\n if (emitStartingState) {\n this.changeState(Chromedriver.STATE_STARTING);\n }\n\n const args = [`--port=${this.proxyPort}`];\n if (this.adb && this.adb.adbPort) {\n args.push(`--adb-port=${this.adb.adbPort}`);\n }\n if (_.isArray(this.cmdArgs)) {\n args.push(...this.cmdArgs);\n }\n if (this.logPath) {\n args.push(`--log-path=${this.logPath}`);\n }\n if (this.disableBuildCheck) {\n args.push('--disable-build-check');\n }\n args.push('--verbose');\n // what are the process stdout/stderr conditions wherein we know that\n // the process has started to our satisfaction?\n const startDetector = (stdout) => stdout.startsWith('Starting ');\n\n let processIsAlive = false;\n let webviewVersion;\n try {\n await this.initChromedriverPath();\n await this.killAll();\n\n // set up our subprocess object\n this.proc = new SubProcess(this.chromedriver, args);\n processIsAlive = true;\n\n // handle log output\n this.proc.on('output', (stdout, stderr) => {\n // if the cd output is not printed, find the chrome version and print\n // will get a response like\n // DevTools response: {\n // \"Android-Package\": \"io.appium.sampleapp\",\n // \"Browser\": \"Chrome/55.0.2883.91\",\n // \"Protocol-Version\": \"1.2\",\n // \"User-Agent\": \"...\",\n // \"WebKit-Version\": \"537.36\"\n // }\n const out = stdout + stderr;\n let match = /\"Browser\": \"(.*)\"/.exec(out);\n if (match) {\n webviewVersion = match[1];\n this.log.debug(`Webview version: '${webviewVersion}'`);\n }\n\n // also print chromedriver version to logs\n // will output something like\n // Starting ChromeDriver 2.33.506106 (8a06c39c4582fbfbab6966dbb1c38a9173bfb1a2) on port 9515\n match = /Starting ChromeDriver ([.\\d]+)/.exec(out);\n if (match) {\n this.log.debug(`Chromedriver version: '${match[1]}'`);\n this.syncProtocol(match[1]);\n }\n\n // give the output if it is requested\n if (this.verbose) {\n for (let line of (stdout || '').trim().split('\\n')) {\n if (!line.trim().length) continue; // eslint-disable-line curly\n this.log.debug(`[STDOUT] ${line}`);\n }\n for (let line of (stderr || '').trim().split('\\n')) {\n if (!line.trim().length) continue; // eslint-disable-line curly\n this.log.error(`[STDERR] ${line}`);\n }\n }\n });\n\n // handle out-of-bound exit by simply emitting a stopped state\n this.proc.on('exit', (code, signal) => {\n processIsAlive = false;\n if (this.state !== Chromedriver.STATE_STOPPED &&\n this.state !== Chromedriver.STATE_STOPPING &&\n this.state !== Chromedriver.STATE_RESTARTING) {\n const msg = `Chromedriver exited unexpectedly with code ${code}, signal ${signal}`;\n this.log.error(msg);\n this.changeState(Chromedriver.STATE_STOPPED);\n }\n });\n this.log.info(`Spawning chromedriver with: ${this.chromedriver} ${args.join(' ')}`);\n // start subproc and wait for startDetector\n await this.proc.start(startDetector);\n await this.waitForOnline();\n await this.startSession();\n } catch (e) {\n this.log.debug(e);\n this.emit(Chromedriver.EVENT_ERROR, e);\n // just because we had an error doesn't mean the chromedriver process\n // finished; we should clean up if necessary\n if (processIsAlive) {\n await this.proc.stop();\n }\n\n let message = '';\n // often the user's Chrome version is not supported by the version of Chromedriver\n if (e.message.includes('Chrome version must be')) {\n message += 'Unable to automate Chrome version because it is not supported by this version of Chromedriver.\\n';\n if (webviewVersion) {\n message += `Chrome version on the device: ${webviewVersion}\\n`;\n }\n const versionsSupportedByDriver = /Chrome version must be (.+)/.exec(e.message)?.[1] || '';\n if (versionsSupportedByDriver) {\n message += `Chromedriver supports Chrome version(s): ${versionsSupportedByDriver}\\n`;\n }\n message += 'Check the driver tutorial for troubleshooting.\\n';\n }\n\n message += e.message;\n this.log.errorAndThrow(message);\n }\n }\n\n sessionId () {\n return this.state === Chromedriver.STATE_ONLINE ? this.jwproxy.sessionId : null;\n }\n\n async restart () {\n this.log.info('Restarting chromedriver');\n if (this.state !== Chromedriver.STATE_ONLINE) {\n throw new Error(\"Can't restart when we're not online\");\n }\n this.changeState(Chromedriver.STATE_RESTARTING);\n await this.stop(false);\n await this.start(this.capabilities, false);\n }\n\n async waitForOnline () {\n // we need to make sure that CD hasn't crashed\n let chromedriverStopped = false;\n await retryInterval(20, 200, async () => {\n if (this.state === Chromedriver.STATE_STOPPED) {\n // we are either stopped or stopping, so something went wrong\n chromedriverStopped = true;\n return;\n }\n await this.getStatus();\n });\n if (chromedriverStopped) {\n throw new Error('ChromeDriver crashed during startup.');\n }\n }\n\n async getStatus () {\n return await this.jwproxy.command('/status', 'GET');\n }\n\n async startSession () {\n const sessionCaps = this.desiredProtocol === PROTOCOLS.W3C\n ? {capabilities: {alwaysMatch: this.capabilities}}\n : {desiredCapabilities: this.capabilities};\n this.log.info(`Starting ${this.desiredProtocol} Chromedriver session with capabilities: ` +\n JSON.stringify(sessionCaps, null, 2));\n await this.jwproxy.command('/session', 'POST', sessionCaps);\n this.log.prefix = generateLogPrefix(this, this.jwproxy.sessionId);\n this.changeState(Chromedriver.STATE_ONLINE);\n }\n\n async stop (emitStates = true) {\n if (emitStates) {\n this.changeState(Chromedriver.STATE_STOPPING);\n }\n const runSafeStep = async (f) => {\n try {\n return await f();\n } catch (e) {\n this.log.warn(e.message);\n this.log.debug(e.stack);\n }\n };\n await runSafeStep(() => this.jwproxy.command('', 'DELETE'));\n await runSafeStep(() => this.proc.stop('SIGTERM', 20000));\n this.log.prefix = generateLogPrefix(this);\n if (emitStates) {\n this.changeState(Chromedriver.STATE_STOPPED);\n }\n }\n\n changeState (state) {\n this.state = state;\n this.log.debug(`Changed state to '${state}'`);\n this.emit(Chromedriver.EVENT_CHANGED, {state});\n }\n\n async sendCommand (url, method, body) {\n return await this.jwproxy.command(url, method, body);\n }\n\n async proxyReq (req, res) {\n return await this.jwproxy.proxyReqRes(req, res);\n }\n\n async killAll () {\n let cmd = system.isWindows()\n ? `wmic process where \"commandline like '%chromedriver.exe%--port=${this.proxyPort}%'\" delete`\n : `pkill -15 -f \"${this.chromedriver}.*--port=${this.proxyPort}\"`;\n this.log.debug(`Killing any old chromedrivers, running: ${cmd}`);\n try {\n await (B.promisify(cp.exec))(cmd);\n this.log.debug('Successfully cleaned up old chromedrivers');\n } catch (err) {\n this.log.warn('No old chromedrivers seem to exist');\n }\n\n if (this.adb) {\n const udidIndex = this.adb.executable.defaultArgs.findIndex((item) => item === '-s');\n const udid = udidIndex > -1 ? this.adb.executable.defaultArgs[udidIndex + 1] : null;\n\n if (udid) {\n this.log.debug(`Cleaning this device's adb forwarded port socket connections: ${udid}`);\n } else {\n this.log.debug(`Cleaning any old adb forwarded port socket connections`);\n }\n\n try {\n for (let conn of await this.adb.getForwardList()) {\n // chromedriver will ask ADB to forward a port like \"deviceId tcp:port localabstract:webview_devtools_remote_port\"\n if (!(conn.includes('webview_devtools') && (!udid || conn.includes(udid)))) {\n continue;\n }\n\n let params = conn.split(/\\s+/);\n if (params.length > 1) {\n await this.adb.removePortForward(params[1].replace(/[\\D]*/, ''));\n }\n }\n } catch (err) {\n this.log.warn(`Unable to clean forwarded ports. Error: '${err.message}'. Continuing.`);\n }\n }\n }\n\n async hasWorkingWebview () {\n // sometimes chromedriver stops automating webviews. this method runs a\n // simple command to determine our state, and responds accordingly\n try {\n await this.jwproxy.command('/url', 'GET');\n return true;\n } catch (e) {\n return false;\n }\n }\n}\n\nChromedriver.EVENT_ERROR = 'chromedriver_error';\nChromedriver.EVENT_CHANGED = 'stateChanged';\nChromedriver.STATE_STOPPED = 'stopped';\nChromedriver.STATE_STARTING = 'starting';\nChromedriver.STATE_ONLINE = 'online';\nChromedriver.STATE_STOPPING = 'stopping';\nChromedriver.STATE_RESTARTING = 'restarting';\n\nexport { Chromedriver };\nexport default Chromedriver;\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","names":["DOWNLOAD_TIMEOUT_MS","LATEST_VERSION","formatCdVersion","ver","retrieveData","CD_CDN","accept","timeout","trim","prepareChromedriverDir","platformName","chromedriverDir","getChromedriverDir","fs","exists","mkdirp","install","osInfo","getOsInfo","client","ChromedriverStorageClient","name","syncDrivers","versions","CD_VER","doInstall"],"sources":["../../lib/install.js"],"sourcesContent":["import { fs, mkdirp } from 'appium/support';\nimport ChromedriverStorageClient from './storage-client';\nimport {\n CD_CDN, CD_VER, retrieveData, getOsInfo, getChromedriverDir,\n} from './utils';\n\n\nconst DOWNLOAD_TIMEOUT_MS = 15 * 1000;\nconst LATEST_VERSION = 'LATEST';\n\nasync function formatCdVersion (ver) {\n return ver === LATEST_VERSION\n ? (await retrieveData(`${CD_CDN}/LATEST_RELEASE`, {\n 'user-agent': 'appium',\n accept: '*/*',\n }, { timeout: DOWNLOAD_TIMEOUT_MS })).trim()\n : ver;\n}\n\nasync function prepareChromedriverDir (platformName) {\n const chromedriverDir = getChromedriverDir(platformName);\n if (!await fs.exists(chromedriverDir)) {\n await mkdirp(chromedriverDir);\n }\n return chromedriverDir;\n}\n\nasync function install () {\n const osInfo = await getOsInfo();\n const client = new ChromedriverStorageClient({\n chromedriverDir: await prepareChromedriverDir(osInfo.name),\n });\n await client.syncDrivers({\n osInfo,\n versions: [await formatCdVersion(CD_VER)],\n });\n}\n\nasync function doInstall () {\n await install();\n}\n\nexport { install, doInstall };\n"],"mappings":";;;;;;;;;;;;AAAA;;AACA;;AACA;;AAKA,MAAMA,mBAAmB,GAAG,KAAK,IAAjC;AACA,MAAMC,cAAc,GAAG,QAAvB;;AAEA,eAAeC,eAAf,CAAgCC,GAAhC,EAAqC;EACnC,OAAOA,GAAG,KAAKF,cAAR,GACH,CAAC,MAAM,IAAAG,mBAAA,EAAc,GAAEC,aAAO,iBAAvB,EAAyC;IAChD,cAAc,QADkC;IAEhDC,MAAM,EAAE;EAFwC,CAAzC,EAGN;IAAEC,OAAO,EAAEP;EAAX,CAHM,CAAP,EAGoCQ,IAHpC,EADG,GAKHL,GALJ;AAMD;;AAED,eAAeM,sBAAf,CAAuCC,YAAvC,EAAqD;EACnD,MAAMC,eAAe,GAAG,IAAAC,yBAAA,EAAmBF,YAAnB,CAAxB;;EACA,IAAI,EAAC,MAAMG,WAAA,CAAGC,MAAH,CAAUH,eAAV,CAAP,CAAJ,EAAuC;IACrC,MAAM,IAAAI,eAAA,EAAOJ,eAAP,CAAN;EACD;;EACD,OAAOA,eAAP;AACD;;AAED,eAAeK,OAAf,GAA0B;EACxB,MAAMC,MAAM,GAAG,MAAM,IAAAC,gBAAA,GAArB;EACA,MAAMC,MAAM,GAAG,IAAIC,sBAAJ,CAA8B;IAC3CT,eAAe,EAAE,MAAMF,sBAAsB,CAACQ,MAAM,CAACI,IAAR;EADF,CAA9B,CAAf;EAGA,MAAMF,MAAM,CAACG,WAAP,CAAmB;IACvBL,MADuB;IAEvBM,QAAQ,EAAE,CAAC,MAAMrB,eAAe,CAACsB,aAAD,CAAtB;EAFa,CAAnB,CAAN;AAID;;AAED,eAAeC,SAAf,GAA4B;EAC1B,MAAMT,OAAO,EAAb;AACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol-helpers.js","names":["W3C_PREFIX","toW3cCapName","capName","_","isString","includes","isStandardCap","getCapValue","allCaps","rawCapName","defaultValue","capValue","toPairs","toW3cCapNames","originalCaps","reduce","acc","value","key"],"sources":["../../lib/protocol-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport { isStandardCap } from 'appium/driver';\n\nconst W3C_PREFIX = 'goog:';\n\nfunction toW3cCapName (capName) {\n return (_.isString(capName) && !capName.includes(':') && !isStandardCap(capName))\n ? `${W3C_PREFIX}${capName}`\n : capName;\n}\n\nfunction getCapValue (allCaps = {}, rawCapName, defaultValue) {\n for (const [capName, capValue] of _.toPairs(allCaps)) {\n if (toW3cCapName(capName) === toW3cCapName(rawCapName)) {\n return capValue;\n }\n }\n return defaultValue;\n}\n\nfunction toW3cCapNames (originalCaps = {}) {\n return _.reduce(originalCaps, (acc, value, key) => {\n acc[toW3cCapName(key)] = value;\n return acc;\n }, {});\n}\n\nexport { toW3cCapNames, getCapValue };\n"],"mappings":";;;;;;;;;;;;AAAA;;AACA;;AAEA,MAAMA,UAAU,GAAG,OAAnB;;AAEA,SAASC,YAAT,CAAuBC,OAAvB,EAAgC;EAC9B,OAAQC,eAAA,CAAEC,QAAF,CAAWF,OAAX,KAAuB,CAACA,OAAO,CAACG,QAAR,CAAiB,GAAjB,CAAxB,IAAiD,CAAC,IAAAC,qBAAA,EAAcJ,OAAd,CAAnD,GACF,GAAEF,UAAW,GAAEE,OAAQ,EADrB,GAEHA,OAFJ;AAGD;;AAED,SAASK,WAAT,CAAsBC,OAAO,GAAG,EAAhC,EAAoCC,UAApC,EAAgDC,YAAhD,EAA8D;EAC5D,KAAK,MAAM,CAACR,OAAD,EAAUS,QAAV,CAAX,IAAkCR,eAAA,CAAES,OAAF,CAAUJ,OAAV,CAAlC,EAAsD;IACpD,IAAIP,YAAY,CAACC,OAAD,CAAZ,KAA0BD,YAAY,CAACQ,UAAD,CAA1C,EAAwD;MACtD,OAAOE,QAAP;IACD;EACF;;EACD,OAAOD,YAAP;AACD;;AAED,SAASG,aAAT,CAAwBC,YAAY,GAAG,EAAvC,EAA2C;EACzC,OAAOX,eAAA,CAAEY,MAAF,CAASD,YAAT,EAAuB,CAACE,GAAD,EAAMC,KAAN,EAAaC,GAAb,KAAqB;IACjDF,GAAG,CAACf,YAAY,CAACiB,GAAD,CAAb,CAAH,GAAyBD,KAAzB;IACA,OAAOD,GAAP;EACD,CAHM,EAGJ,EAHI,CAAP;AAID"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-client.js","names":["TIMEOUT_MS","MAX_PARALLEL_DOWNLOADS","log","logger","getLogger","isCrcOk","src","checksum","md5","fs","hash","_","toLower","findChildNode","parent","childName","text","hasChildNodes","childNodeIdx","childNodes","length","childNode","localName","childText","extractNodeText","node","firstChild","util","hasValue","nodeValue","ChromedriverStorageClient","constructor","args","chromedriverDir","getChromedriverDir","timeout","mapping","parseNotes","content","result","versionMatch","exec","version","minBrowserVersionMatch","minBrowserVersion","retrieveAdditionalDriverInfo","driverKey","notesUrl","infoDict","notes","retrieveData","accept","debug","parseStorageXml","doc","shouldParseNotes","driverNodes","xpath","select","isEmpty","promises","driverNode","key","includes","etag","cdInfo","url","CD_CDN","trim","first","split","notesPath","isNotesPresent","reduce","acc","info","push","B","all","size","retrieveMapping","xml","DOMParser","parseFromString","cloneDeep","unzipDriver","dst","tmpRoot","tempDir","openDir","zip","extractAllTo","chromedriverPath","walkDir","itemPath","isDirectory","path","parse","name","Error","basename","mv","mkdirp","rimraf","selectMatchingDrivers","osInfo","opts","versions","driversToSync","keys","filter","cdName","pluralize","isNaN","minBrowserVersionInt","parseInt","closestMatchedVersionNumber","currentMinBrowserVersion","uniq","map","arch","hardwareName","X64","some","X86","OS","mac","M1_ARCH_SUFFIX","platformRe","RegExp","test","retrieveDriver","index","archivesRoot","isStrict","archivePath","resolve","net","downloadFile","isMetered","e","msg","message","error","fileName","system","isWindows","targetPath","chmod","syncDrivers","getOsInfo","JSON","stringify","synchronizedDrivers","idx","entries"],"sources":["../../lib/storage-client.js"],"sourcesContent":["import {\n getChromedriverDir, CD_CDN, retrieveData, getOsInfo,\n OS, X64, X86, M1_ARCH_SUFFIX,\n} from './utils';\nimport _ from 'lodash';\nimport xpath from 'xpath';\nimport { DOMParser } from '@xmldom/xmldom';\nimport B from 'bluebird';\nimport path from 'path';\nimport { system, fs, logger, tempDir, zip, util, net } from 'appium/support';\n\n\nconst TIMEOUT_MS = 15000;\nconst MAX_PARALLEL_DOWNLOADS = 5;\n\nconst log = logger.getLogger('ChromedriverStorageClient');\n\n\nasync function isCrcOk (src, checksum) {\n const md5 = await fs.hash(src, 'md5');\n return _.toLower(md5) === _.toLower(checksum);\n}\n\nfunction findChildNode (parent, childName = null, text = null) {\n if (!childName && !text) {\n return null;\n }\n if (!parent.hasChildNodes()) {\n return null;\n }\n\n for (let childNodeIdx = 0; childNodeIdx < parent.childNodes.length; childNodeIdx++) {\n const childNode = parent.childNodes[childNodeIdx];\n if (childName && !text && childName === childNode.localName) {\n return childNode;\n }\n if (text) {\n const childText = extractNodeText(childNode);\n if (!childText) {\n continue;\n }\n if (childName && childName === childNode.localName && text === childText) {\n return childNode;\n }\n if (!childName && text === childText) {\n return childNode;\n }\n }\n }\n return null;\n}\n\nfunction extractNodeText (node) {\n return (!node || !node.firstChild || !util.hasValue(node.firstChild.nodeValue))\n ? null\n : node.firstChild.nodeValue;\n}\n\n\nclass ChromedriverStorageClient {\n constructor (args = {}) {\n const {\n chromedriverDir = getChromedriverDir(),\n timeout = TIMEOUT_MS,\n } = args;\n this.chromedriverDir = chromedriverDir;\n this.timeout = timeout;\n this.mapping = {};\n }\n\n /**\n * @typedef {Object} AdditionalDriverDetails\n * @property {?string} version - Chromedriver version\n * or `null` if it cannot be found\n * @property {?string} minBrowserVersion - The minimum browser version\n * supported by chromedriver or `null` if it cannot be found\n */\n\n /**\n * Gets additional chromedriver details from chromedriver\n * release notes\n *\n * @param {string} content - Release notes of the corresponding chromedriver\n * @returns {AdditionalDriverDetails}\n */\n parseNotes (content) {\n const result = {};\n const versionMatch = /^\\s*[-]+ChromeDriver[\\D]+([\\d.]+)/im.exec(content);\n if (versionMatch) {\n result.version = versionMatch[1];\n }\n const minBrowserVersionMatch = /^\\s*Supports Chrome[\\D]+(\\d+)/im.exec(content);\n if (minBrowserVersionMatch) {\n result.minBrowserVersion = minBrowserVersionMatch[1];\n }\n return result;\n }\n\n /**\n * Downloads chromedriver release notes and puts them\n * into the dictionary argument\n *\n * @param {string} driverKey - Driver version plus archive name\n * @param {string} notesUrl - The URL of chromedriver notes\n * @param {Object} infoDict - The dictionary containing driver info.\n * The method call mutates by merging `AdditionalDriverDetails`\n * @throws {Error} if the release notes cannot be downloaded\n */\n async retrieveAdditionalDriverInfo (driverKey, notesUrl, infoDict) {\n const notes = await retrieveData(notesUrl, {\n 'user-agent': 'appium',\n accept: '*/*',\n }, { timeout: this.timeout });\n const { minBrowserVersion } = this.parseNotes(notes);\n if (!minBrowserVersion) {\n log.debug(`The driver '${driverKey}' does not contain valid release notes at ${notesUrl}. ` +\n `Skipping it`);\n return;\n }\n infoDict.minBrowserVersion = minBrowserVersion;\n }\n\n /**\n * Parses chromedriver storage XML and stores\n * the parsed results into `this.mapping`\n *\n * @param {DOMDocument} doc - The DOM representation\n * of the chromedriver storage XML\n * @param {boolean} shouldParseNotes [true] - If set to `true`\n * then additional drivers information is going to be parsed\n * and assigned to `this.mapping`\n */\n async parseStorageXml (doc, shouldParseNotes = true) {\n const driverNodes = xpath.select(`//*[local-name(.)='Contents']`, doc);\n log.debug(`Parsed ${driverNodes.length} entries from storage XML`);\n if (_.isEmpty(driverNodes)) {\n return;\n }\n\n const promises = [];\n for (const driverNode of driverNodes) {\n const key = extractNodeText(findChildNode(driverNode, 'Key'));\n if (!_.includes(key, '/chromedriver_')) {\n continue;\n }\n\n const etag = extractNodeText(findChildNode(driverNode, 'ETag'));\n if (!etag) {\n log.debug(`The entry '${key}' does not contain the checksum. Skipping it`);\n continue;\n }\n\n const cdInfo = {\n url: `${CD_CDN}/${key}`,\n etag: _.trim(etag, '\"'),\n version: _.first(key.split('/')),\n };\n this.mapping[key] = cdInfo;\n\n const notesPath = `${cdInfo.version}/notes.txt`;\n const isNotesPresent = !!driverNodes\n .reduce((acc, node) => acc || findChildNode(node, 'Key', notesPath), false);\n if (!isNotesPresent) {\n cdInfo.minBrowserVersion = null;\n if (shouldParseNotes) {\n log.info(`The entry '${key}' does not contain any notes. Skipping it`);\n }\n continue;\n } else if (!shouldParseNotes) {\n continue;\n }\n\n promises.push(this.retrieveAdditionalDriverInfo(key, `${CD_CDN}/${notesPath}`, cdInfo));\n if (promises.length % MAX_PARALLEL_DOWNLOADS === 0) {\n await B.all(promises);\n }\n }\n await B.all(promises);\n log.info(`The total count of entries in the mapping: ${_.size(this.mapping)}`);\n }\n\n /**\n * @typedef {Object} DriverDetails\n * @property {string} url - The full url to the corresponding driver in\n * the remote storage\n * @property {string} etag - The CRC of the driver archive\n * @property {string} version - Chromedriver version\n */\n\n /**\n * @typedef {Object} ChromedriversMapping\n * @property {DriverDetails} - The keys are unique driver identifiers\n * (version/archive name). The corresponding values have `DriverDetails`\n * containing chromedriver details\n */\n\n /**\n * Retrieves chromedriver mapping from the storage\n *\n * @param {boolean} shouldParseNotes [true] - if set to `true`\n * then additional chromedrivers info is going to be retrieved and\n * parsed from release notes\n * @returns {ChromedriversMapping}\n */\n async retrieveMapping (shouldParseNotes = true) {\n const xml = await retrieveData(CD_CDN, {\n 'user-agent': 'appium',\n accept: 'application/xml, */*',\n }, { timeout: this.timeout });\n const doc = new DOMParser().parseFromString(xml);\n await this.parseStorageXml(doc, shouldParseNotes);\n return _.cloneDeep(this.mapping);\n }\n\n /**\n * Extracts downloaded chromedriver archive\n * into the given destination\n *\n * @param {string} src - The source archive path\n * @param {string} dst - The destination chromedriver path\n */\n async unzipDriver (src, dst) {\n const tmpRoot = await tempDir.openDir();\n try {\n await zip.extractAllTo(src, tmpRoot);\n const chromedriverPath = await fs.walkDir(tmpRoot, true, (itemPath, isDirectory) =>\n !isDirectory && _.toLower(path.parse(itemPath).name) === 'chromedriver');\n if (!chromedriverPath) {\n throw new Error('The archive was unzipped properly, but we could not find any chromedriver executable');\n }\n log.debug(`Moving the extracted '${path.basename(chromedriverPath)}' to '${dst}'`);\n await fs.mv(chromedriverPath, dst, {\n mkdirp: true\n });\n } finally {\n await fs.rimraf(tmpRoot);\n }\n }\n\n /**\n * @typedef {Object} OSInfo\n * @property {string} name - The name of the host OS\n * Can be either `mac`, `windows` or `linux`\n * @property {string} arch - The architecture of the host OD.\n * Can be either `32` or `64`\n * @property {?string} hardwareName - The output of `uname -m` command\n * on linux and mac systems. `null` on Windows\n */\n\n /**\n * Filters `this.mapping` to only select matching\n * chromedriver entries by operating system information\n * and/or additional synchronization options (if provided)\n *\n * @param {?OSInfo} osInfo\n * @param {?SyncOptions} opts\n * @returns {Array<String>} The list of filtered chromedriver\n * entry names (version/archive name)\n */\n selectMatchingDrivers (osInfo, opts = {}) {\n const {\n minBrowserVersion,\n versions = [],\n } = opts;\n let driversToSync = _.keys(this.mapping);\n\n if (!_.isEmpty(versions)) {\n // Handle only selected versions if requested\n log.debug(`Selecting chromedrivers whose versions match to ${versions}`);\n driversToSync = driversToSync\n .filter((cdName) => versions.includes(`${this.mapping[cdName].version}`));\n\n log.debug(`Got ${util.pluralize('item', driversToSync.length, true)}`);\n if (_.isEmpty(driversToSync)) {\n return [];\n }\n }\n\n if (!isNaN(minBrowserVersion)) {\n // Only select drivers that support the current browser whose major version number equals to `minBrowserVersion`\n const minBrowserVersionInt = parseInt(minBrowserVersion, 10);\n log.debug(`Selecting chromedrivers whose minimum supported browser version matches to ${minBrowserVersionInt}`);\n let closestMatchedVersionNumber = 0;\n // Select the newest available and compatible chromedriver\n for (const cdName of driversToSync) {\n const currentMinBrowserVersion = parseInt(this.mapping[cdName].minBrowserVersion, 10);\n if (!isNaN(currentMinBrowserVersion)\n && currentMinBrowserVersion <= minBrowserVersionInt\n && closestMatchedVersionNumber < currentMinBrowserVersion) {\n closestMatchedVersionNumber = currentMinBrowserVersion;\n }\n }\n driversToSync = driversToSync.filter((cdName) => `${this.mapping[cdName].minBrowserVersion}` ===\n `${closestMatchedVersionNumber > 0 ? closestMatchedVersionNumber : minBrowserVersionInt}`);\n\n log.debug(`Got ${util.pluralize('item', driversToSync.length, true)}`);\n if (_.isEmpty(driversToSync)) {\n return [];\n }\n log.debug(`Will select candidate ${util.pluralize('driver', driversToSync.length)} ` +\n `versioned as '${_.uniq(driversToSync.map((cdName) => this.mapping[cdName].version))}'`);\n }\n\n if (!_.isEmpty(osInfo)) {\n // Filter out drivers for unsupported system architectures\n let {name, arch, hardwareName} = osInfo;\n if (arch === X64 && !driversToSync.some((cdName) => cdName.includes(`_${name}${X64}`))) {\n // Fall back to x86 build if x64 one is not available for the given OS\n arch = X86;\n }\n if (name === OS.mac && _.includes(hardwareName, 'arm')\n && driversToSync.some((cdName) => cdName.includes(M1_ARCH_SUFFIX))) {\n // prefer executable for M1 arch if present\n arch += M1_ARCH_SUFFIX;\n }\n log.debug(`Selecting chromedrivers whose platform matches to ${name}${arch}`);\n const platformRe = new RegExp(`(\\\\b|_)${name}${arch}\\\\b`);\n driversToSync = driversToSync.filter((cdName) => platformRe.test(cdName));\n log.debug(`Got ${util.pluralize('item', driversToSync.length, true)}`);\n }\n\n return driversToSync;\n }\n\n /**\n * Retrieves the given chromedriver from the storage\n * and unpacks it into `this.chromedriverDir` folder\n *\n * @param {number} index - The unique driver index\n * @param {string} driverKey - The driver key in `this.mapping`\n * @param {string} archivesRoot - The temporary folder path to extract\n * downloaded archives to\n * @param {boolean} isStrict [true] - Whether to throw an error (`true`)\n * or return a boolean result if the driver retrieval process fails\n * @throws {Error} if there was a failure while retrieving the driver\n * and `isStrict` is set to `true`\n * @returns {boolean} if `true` then the chromedriver is successfully\n * downloaded and extracted.\n */\n async retrieveDriver (index, driverKey, archivesRoot, isStrict = false) {\n const { url, etag, version } = this.mapping[driverKey];\n const archivePath = path.resolve(archivesRoot, `${index}.zip`);\n log.debug(`Retrieving '${url}' to '${archivePath}'`);\n try {\n await net.downloadFile(url, archivePath, {\n isMetered: false,\n timeout: TIMEOUT_MS\n });\n } catch (e) {\n const msg = `Cannot download chromedriver archive. Original error: ${e.message}`;\n if (isStrict) {\n throw new Error(msg);\n }\n log.error(msg);\n return false;\n }\n if (!await isCrcOk(archivePath, etag)) {\n const msg = `The checksum for the downloaded chromedriver '${driverKey}' did not match`;\n if (isStrict) {\n throw new Error(msg);\n }\n log.error(msg);\n return false;\n }\n const fileName = `${path.parse(url).name}_v${version}` +\n (system.isWindows() ? '.exe' : '');\n const targetPath = path.resolve(this.chromedriverDir, fileName);\n try {\n await this.unzipDriver(archivePath, targetPath);\n await fs.chmod(targetPath, 0o755);\n log.debug(`Permissions of the file '${targetPath}' have been changed to 755`);\n } catch (e) {\n if (isStrict) {\n throw e;\n }\n log.error(e.message);\n return false;\n }\n return true;\n }\n\n /**\n * @typedef {Object} SyncOptions\n * @property {Array<String>} versions - The list of chromedriver\n * versions to sync. If empty (the default value) then all available\n * chromedrivers are going to be downloaded and extracted\n * @property {string|number} minBrowserVersion - The minumum supported\n * Chrome version that downloaded chromedrivers should support. Can match\n * multiple drivers.\n * @property {?OSInfo} osInfo - System information used to filter out\n * the list of the retrieved drivers. If not provided then the script\n * will try to retrieve it.\n */\n\n /**\n * Retrieves chromedrivers from the remote storage\n * to the local file system\n *\n * @param {?SyncOptions} opts\n * @throws {Error} if there was a problem while retrieving\n * the drivers\n * @returns {Array<String} The list of successfully synchronized driver keys\n */\n async syncDrivers (opts = {}) {\n if (_.isEmpty(this.mapping)) {\n await this.retrieveMapping(!!opts.minBrowserVersion);\n }\n if (_.isEmpty(this.mapping)) {\n throw new Error('Cannot retrieve chromedrivers mapping from Google storage');\n }\n\n const driversToSync = this.selectMatchingDrivers(opts.osInfo ?? await getOsInfo(), opts);\n if (_.isEmpty(driversToSync)) {\n log.debug(`There are no drivers to sync. Exiting`);\n return [];\n }\n log.debug(`Got ${util.pluralize('driver', driversToSync.length, true)} to sync: ` +\n JSON.stringify(driversToSync, null, 2));\n\n const synchronizedDrivers = [];\n const promises = [];\n const archivesRoot = await tempDir.openDir();\n try {\n for (const [idx, driverKey] of driversToSync.entries()) {\n promises.push((async () => {\n if (await this.retrieveDriver(idx, driverKey, archivesRoot, !_.isEmpty(opts))) {\n synchronizedDrivers.push(driverKey);\n }\n })());\n\n if (promises.length % MAX_PARALLEL_DOWNLOADS === 0) {\n await B.all(promises);\n }\n }\n await B.all(promises);\n } finally {\n await fs.rimraf(archivesRoot);\n }\n if (!_.isEmpty(synchronizedDrivers)) {\n log.info(`Successfully synchronized ` +\n `${util.pluralize('chromedriver', synchronizedDrivers.length, true)}`);\n } else {\n log.info(`No chromedrivers were synchronized`);\n }\n return synchronizedDrivers;\n }\n}\n\n\nexport default ChromedriverStorageClient;\n"],"mappings":"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"}
|
package/build/lib/utils.js
CHANGED
|
@@ -30,8 +30,6 @@ var _axios = _interopRequireDefault(require("axios"));
|
|
|
30
30
|
|
|
31
31
|
var _teen_process = require("teen_process");
|
|
32
32
|
|
|
33
|
-
var _fs2 = _interopRequireDefault(require("fs"));
|
|
34
|
-
|
|
35
33
|
const CD_CDN = process.env.npm_config_chromedriver_cdnurl || process.env.CHROMEDRIVER_CDNURL || 'https://chromedriver.storage.googleapis.com';
|
|
36
34
|
exports.CD_CDN = CD_CDN;
|
|
37
35
|
const OS = {
|
|
@@ -47,26 +45,42 @@ exports.X86 = X86;
|
|
|
47
45
|
const M1_ARCH_SUFFIX = '_m1';
|
|
48
46
|
exports.M1_ARCH_SUFFIX = M1_ARCH_SUFFIX;
|
|
49
47
|
const CD_EXECUTABLE_PREFIX = 'chromedriver';
|
|
48
|
+
const MODULE_NAME = 'appium-chromedriver';
|
|
50
49
|
|
|
51
50
|
const getModuleRoot = _lodash.default.memoize(function getModuleRoot() {
|
|
52
|
-
|
|
51
|
+
if (!_lodash.default.isFunction(_support.node.getModuleRootSync)) {
|
|
52
|
+
const {
|
|
53
|
+
existsSync,
|
|
54
|
+
readFileSync
|
|
55
|
+
} = require('fs');
|
|
56
|
+
|
|
57
|
+
let currentDir = _path.default.dirname(_path.default.resolve(__filename));
|
|
58
|
+
|
|
59
|
+
let isAtFsRoot = false;
|
|
53
60
|
|
|
54
|
-
|
|
61
|
+
while (!isAtFsRoot) {
|
|
62
|
+
const manifestPath = _path.default.join(currentDir, 'package.json');
|
|
55
63
|
|
|
56
|
-
|
|
57
|
-
|
|
64
|
+
try {
|
|
65
|
+
if (existsSync(manifestPath) && JSON.parse(readFileSync(manifestPath, 'utf8')).name === MODULE_NAME) {
|
|
66
|
+
return currentDir;
|
|
67
|
+
}
|
|
68
|
+
} catch (ign) {}
|
|
69
|
+
|
|
70
|
+
currentDir = _path.default.dirname(currentDir);
|
|
71
|
+
isAtFsRoot = currentDir.length <= _path.default.dirname(currentDir).length;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);
|
|
75
|
+
}
|
|
58
76
|
|
|
59
|
-
|
|
60
|
-
if (_fs2.default.existsSync(manifestPath) && JSON.parse(_fs2.default.readFileSync(manifestPath, 'utf8')).name === 'appium-chromedriver') {
|
|
61
|
-
return currentDir;
|
|
62
|
-
}
|
|
63
|
-
} catch (ign) {}
|
|
77
|
+
const root = _support.node.getModuleRootSync(MODULE_NAME, __filename);
|
|
64
78
|
|
|
65
|
-
|
|
66
|
-
|
|
79
|
+
if (!root) {
|
|
80
|
+
throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);
|
|
67
81
|
}
|
|
68
82
|
|
|
69
|
-
|
|
83
|
+
return root;
|
|
70
84
|
});
|
|
71
85
|
|
|
72
86
|
const CHROMEDRIVER_CHROME_MAPPING = require(_path.default.join(getModuleRoot(), 'config', 'mapping.json'));
|
|
@@ -154,4 +168,4 @@ const getBaseDriverInstance = _lodash.default.memoize(() => new _driver.BaseDriv
|
|
|
154
168
|
function generateLogPrefix(obj, sessionId = null) {
|
|
155
169
|
return getBaseDriverInstance().helpers.generateDriverLogPrefix(obj, sessionId);
|
|
156
170
|
}
|
|
157
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDRF9DRE4iLCJwcm9jZXNzIiwiZW52IiwibnBtX2NvbmZpZ19jaHJvbWVkcml2ZXJfY2RudXJsIiwiQ0hST01FRFJJVkVSX0NETlVSTCIsIk9TIiwibGludXgiLCJ3aW5kb3dzIiwibWFjIiwiWDY0IiwiWDg2IiwiTTFfQVJDSF9TVUZGSVgiLCJDRF9FWEVDVVRBQkxFX1BSRUZJWCIsImdldE1vZHVsZVJvb3QiLCJfIiwibWVtb2l6ZSIsImN1cnJlbnREaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlc29sdmUiLCJfX2ZpbGVuYW1lIiwiaXNBdEZzUm9vdCIsIm1hbmlmZXN0UGF0aCIsImpvaW4iLCJfZnMiLCJleGlzdHNTeW5jIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwibmFtZSIsImlnbiIsImxlbmd0aCIsIkVycm9yIiwiQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HIiwicmVxdWlyZSIsIkNEX0JBU0VfRElSIiwiZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlciIsIm1hcHBpbmciLCJpc0VtcHR5IiwibGFzdCIsImtleXMiLCJzb3J0IiwiY29tcGFyZVZlcnNpb25zIiwiQ0RfVkVSIiwibnBtX2NvbmZpZ19jaHJvbWVkcml2ZXJfdmVyc2lvbiIsIkNIUk9NRURSSVZFUl9WRVJTSU9OIiwiZ2V0Q2hyb21lVmVyc2lvbiIsImFkYiIsImJ1bmRsZUlkIiwidmVyc2lvbk5hbWUiLCJnZXRQYWNrYWdlSW5mbyIsImdldENocm9tZWRyaXZlckRpciIsIm9zTmFtZSIsImdldE9zTmFtZSIsImdldENocm9tZWRyaXZlckJpbmFyeVBhdGgiLCJyb290RGlyIiwicGF0aFN1ZmZpeCIsInBhdGhzIiwiZnMiLCJnbG9iIiwiY3dkIiwiYWJzb2x1dGUiLCJub2Nhc2UiLCJub2RpciIsInN0cmljdCIsImZpcnN0IiwicmV0cmlldmVEYXRhIiwidXJsIiwiaGVhZGVycyIsIm9wdHMiLCJ0aW1lb3V0IiwicmVzcG9uc2VUeXBlIiwiYXhpb3MiLCJkYXRhIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiaXNNYWMiLCJnZXRPc0luZm8iLCJhcmNoIiwiaGFyZHdhcmVOYW1lIiwidHJpbSIsImV4ZWMiLCJnZXRCYXNlRHJpdmVySW5zdGFuY2UiLCJCYXNlRHJpdmVyIiwiZ2VuZXJhdGVMb2dQcmVmaXgiLCJvYmoiLCJzZXNzaW9uSWQiLCJoZWxwZXJzIiwiZ2VuZXJhdGVEcml2ZXJMb2dQcmVmaXgiXSwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHN5c3RlbSwgZnMgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGNvbXBhcmVWZXJzaW9ucyB9IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IF9mcyBmcm9tICdmcyc7XG5cbmNvbnN0IENEX0NETiA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfY2hyb21lZHJpdmVyX2NkbnVybFxuICB8fCBwcm9jZXNzLmVudi5DSFJPTUVEUklWRVJfQ0ROVVJMXG4gIHx8ICdodHRwczovL2Nocm9tZWRyaXZlci5zdG9yYWdlLmdvb2dsZWFwaXMuY29tJztcbmNvbnN0IE9TID0ge1xuICBsaW51eDogJ2xpbnV4JyxcbiAgd2luZG93czogJ3dpbicsXG4gIG1hYzogJ21hYydcbn07XG5jb25zdCBYNjQgPSAnNjQnO1xuY29uc3QgWDg2ID0gJzMyJztcbmNvbnN0IE0xX0FSQ0hfU1VGRklYID0gJ19tMSc7XG5jb25zdCBDRF9FWEVDVVRBQkxFX1BSRUZJWCA9ICdjaHJvbWVkcml2ZXInO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHBhdGggdG8gdGhlIGN1cnJlbnQgbW9kdWxlJ3Mgcm9vdCBmb2xkZXJcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIG1vZHVsZSByb290XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGN1cnJlbnQgbW9kdWxlIHJvb3QgZm9sZGVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmNvbnN0IGdldE1vZHVsZVJvb3QgPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0TW9kdWxlUm9vdCAoKSB7XG4gIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKHBhdGgucmVzb2x2ZShfX2ZpbGVuYW1lKSk7XG4gIGxldCBpc0F0RnNSb290ID0gZmFsc2U7XG4gIHdoaWxlICghaXNBdEZzUm9vdCkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChfZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpICYmXG4gICAgICAgICAgSlNPTi5wYXJzZShfZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkubmFtZSA9PT0gJ2FwcGl1bS1jaHJvbWVkcml2ZXInKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RGlyO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpO1xuICAgIGlzQXRGc1Jvb3QgPSBjdXJyZW50RGlyLmxlbmd0aCA8PSBwYXRoLmRpcm5hbWUoY3VycmVudERpcikubGVuZ3RoO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgdGhlIHJvb3QgZm9sZGVyIG9mIHRoZSBhcHBpdW0tY2hyb21lZHJpdmVyIE5vZGUuanMgbW9kdWxlJyk7XG59KTtcblxuLy8gQ2hyb21lZHJpdmVyIHZlcnNpb246IG1pbmltdW0gQ2hyb21lIHZlcnNpb25cbmNvbnN0IENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORyA9IHJlcXVpcmUocGF0aC5qb2luKGdldE1vZHVsZVJvb3QoKSwgJ2NvbmZpZycsICdtYXBwaW5nLmpzb24nKSk7XG5jb25zdCBDRF9CQVNFX0RJUiA9IHBhdGguam9pbihnZXRNb2R1bGVSb290KCksICdjaHJvbWVkcml2ZXInKTtcblxuZnVuY3Rpb24gZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlciAobWFwcGluZyA9IENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORykge1xuICBpZiAoXy5pc0VtcHR5KG1hcHBpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IG1vc3QgcmVjZW50IENocm9tZWRyaXZlciB2ZXJzaW9uIGZyb20gZW1wdHkgbWFwcGluZycpO1xuICB9XG4gIHJldHVybiBfLmxhc3QoXy5rZXlzKG1hcHBpbmcpLnNvcnQoY29tcGFyZVZlcnNpb25zKSk7XG59XG5cbmNvbnN0IENEX1ZFUiA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb25cbiAgfHwgcHJvY2Vzcy5lbnYuQ0hST01FRFJJVkVSX1ZFUlNJT05cbiAgfHwgZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlcigpO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRDaHJvbWVWZXJzaW9uIChhZGIsIGJ1bmRsZUlkKSB7XG4gIGNvbnN0IHt2ZXJzaW9uTmFtZX0gPSBhd2FpdCBhZGIuZ2V0UGFja2FnZUluZm8oYnVuZGxlSWQpO1xuICByZXR1cm4gdmVyc2lvbk5hbWU7XG59XG5cbmZ1bmN0aW9uIGdldENocm9tZWRyaXZlckRpciAob3NOYW1lID0gZ2V0T3NOYW1lKCkpIHtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShDRF9CQVNFX0RJUiwgb3NOYW1lKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCAob3NOYW1lID0gZ2V0T3NOYW1lKCkpIHtcbiAgY29uc3Qgcm9vdERpciA9IGdldENocm9tZWRyaXZlckRpcihvc05hbWUpO1xuICBjb25zdCBwYXRoU3VmZml4ID0gb3NOYW1lID09PSBPUy53aW5kb3dzID8gJy5leGUnIDogJyc7XG4gIGNvbnN0IHBhdGhzID0gYXdhaXQgZnMuZ2xvYihgJHtDRF9FWEVDVVRBQkxFX1BSRUZJWH0qJHtwYXRoU3VmZml4fWAsIHtcbiAgICBjd2Q6IHJvb3REaXIsXG4gICAgYWJzb2x1dGU6IHRydWUsXG4gICAgbm9jYXNlOiB0cnVlLFxuICAgIG5vZGlyOiB0cnVlLFxuICAgIHN0cmljdDogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gXy5pc0VtcHR5KHBhdGhzKVxuICAgID8gcGF0aC5yZXNvbHZlKHJvb3REaXIsIGAke0NEX0VYRUNVVEFCTEVfUFJFRklYfSR7cGF0aFN1ZmZpeH1gKVxuICAgIDogXy5maXJzdChwYXRocyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlRGF0YSAodXJsLCBoZWFkZXJzLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSA1MDAwLFxuICAgIHJlc3BvbnNlVHlwZSA9ICd0ZXh0JyxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybCxcbiAgICBoZWFkZXJzLFxuICAgIHRpbWVvdXQsXG4gICAgcmVzcG9uc2VUeXBlLFxuICB9KSkuZGF0YTtcbn1cblxuY29uc3QgZ2V0T3NOYW1lID0gXy5tZW1vaXplKGZ1bmN0aW9uIGdldE9zTmFtZSAoKSB7XG4gIGlmIChzeXN0ZW0uaXNXaW5kb3dzKCkpIHtcbiAgICByZXR1cm4gT1Mud2luZG93cztcbiAgfVxuICBpZiAoc3lzdGVtLmlzTWFjKCkpIHtcbiAgICByZXR1cm4gT1MubWFjO1xuICB9XG4gIHJldHVybiBPUy5saW51eDtcbn0pO1xuXG5jb25zdCBnZXRPc0luZm8gPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0T3NJbmZvICgpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBnZXRPc05hbWUoKSxcbiAgICBhcmNoOiBhd2FpdCBzeXN0ZW0uYXJjaCgpLFxuICAgIGhhcmR3YXJlTmFtZTogc3lzdGVtLmlzV2luZG93cygpID8gbnVsbCA6IF8udHJpbShhd2FpdCBleGVjKCd1bmFtZScsIFsnLW0nXSkpLFxuICB9O1xufSk7XG5cbmNvbnN0IGdldEJhc2VEcml2ZXJJbnN0YW5jZSA9IF8ubWVtb2l6ZSgoKSA9PiBuZXcgQmFzZURyaXZlcih7fSwgZmFsc2UpKTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgbG9nIHByZWZpeCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqIGxvZyBvd25lciBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmc/fSBzZXNzaW9uSWQgT3B0aW9uYWwgc2Vzc2lvbiBpZGVudGlmaWVyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUxvZ1ByZWZpeCAob2JqLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIHJldHVybiBnZXRCYXNlRHJpdmVySW5zdGFuY2UoKS5oZWxwZXJzLmdlbmVyYXRlRHJpdmVyTG9nUHJlZml4KG9iaiwgc2Vzc2lvbklkKTtcbn1cblxuXG5leHBvcnQge1xuICBnZXRDaHJvbWVWZXJzaW9uLCBnZXRDaHJvbWVkcml2ZXJEaXIsIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgsIGdldE9zTmFtZSxcbiAgQ0RfQkFTRV9ESVIsIENEX0NETiwgQ0RfVkVSLCBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsIGdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIsXG4gIHJldHJpZXZlRGF0YSwgZ2V0T3NJbmZvLCBPUywgWDY0LCBYODYsIE0xX0FSQ0hfU1VGRklYLCBnZW5lcmF0ZUxvZ1ByZWZpeCxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLE1BQU0sR0FBR0MsT0FBTyxDQUFDQyxHQUFSLENBQVlDLDhCQUFaLElBQ1ZGLE9BQU8sQ0FB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
|
|
171
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDRF9DRE4iLCJwcm9jZXNzIiwiZW52IiwibnBtX2NvbmZpZ19jaHJvbWVkcml2ZXJfY2RudXJsIiwiQ0hST01FRFJJVkVSX0NETlVSTCIsIk9TIiwibGludXgiLCJ3aW5kb3dzIiwibWFjIiwiWDY0IiwiWDg2IiwiTTFfQVJDSF9TVUZGSVgiLCJDRF9FWEVDVVRBQkxFX1BSRUZJWCIsIk1PRFVMRV9OQU1FIiwiZ2V0TW9kdWxlUm9vdCIsIl8iLCJtZW1vaXplIiwiaXNGdW5jdGlvbiIsIm5vZGUiLCJnZXRNb2R1bGVSb290U3luYyIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJyZXF1aXJlIiwiY3VycmVudERpciIsInBhdGgiLCJkaXJuYW1lIiwicmVzb2x2ZSIsIl9fZmlsZW5hbWUiLCJpc0F0RnNSb290IiwibWFuaWZlc3RQYXRoIiwiam9pbiIsIkpTT04iLCJwYXJzZSIsIm5hbWUiLCJpZ24iLCJsZW5ndGgiLCJFcnJvciIsInJvb3QiLCJDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkciLCJDRF9CQVNFX0RJUiIsImdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIiLCJtYXBwaW5nIiwiaXNFbXB0eSIsImxhc3QiLCJrZXlzIiwic29ydCIsImNvbXBhcmVWZXJzaW9ucyIsIkNEX1ZFUiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb24iLCJDSFJPTUVEUklWRVJfVkVSU0lPTiIsImdldENocm9tZVZlcnNpb24iLCJhZGIiLCJidW5kbGVJZCIsInZlcnNpb25OYW1lIiwiZ2V0UGFja2FnZUluZm8iLCJnZXRDaHJvbWVkcml2ZXJEaXIiLCJvc05hbWUiLCJnZXRPc05hbWUiLCJnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIiwicm9vdERpciIsInBhdGhTdWZmaXgiLCJwYXRocyIsImZzIiwiZ2xvYiIsImN3ZCIsImFic29sdXRlIiwibm9jYXNlIiwibm9kaXIiLCJzdHJpY3QiLCJmaXJzdCIsInJldHJpZXZlRGF0YSIsInVybCIsImhlYWRlcnMiLCJvcHRzIiwidGltZW91dCIsInJlc3BvbnNlVHlwZSIsImF4aW9zIiwiZGF0YSIsInN5c3RlbSIsImlzV2luZG93cyIsImlzTWFjIiwiZ2V0T3NJbmZvIiwiYXJjaCIsImhhcmR3YXJlTmFtZSIsInRyaW0iLCJleGVjIiwiZ2V0QmFzZURyaXZlckluc3RhbmNlIiwiQmFzZURyaXZlciIsImdlbmVyYXRlTG9nUHJlZml4Iiwib2JqIiwic2Vzc2lvbklkIiwiaGVscGVycyIsImdlbmVyYXRlRHJpdmVyTG9nUHJlZml4Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCBub2RlIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgQmFzZURyaXZlciB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcblxuY29uc3QgQ0RfQ0ROID0gcHJvY2Vzcy5lbnYubnBtX2NvbmZpZ19jaHJvbWVkcml2ZXJfY2RudXJsXG4gIHx8IHByb2Nlc3MuZW52LkNIUk9NRURSSVZFUl9DRE5VUkxcbiAgfHwgJ2h0dHBzOi8vY2hyb21lZHJpdmVyLnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20nO1xuY29uc3QgT1MgPSB7XG4gIGxpbnV4OiAnbGludXgnLFxuICB3aW5kb3dzOiAnd2luJyxcbiAgbWFjOiAnbWFjJ1xufTtcbmNvbnN0IFg2NCA9ICc2NCc7XG5jb25zdCBYODYgPSAnMzInO1xuY29uc3QgTTFfQVJDSF9TVUZGSVggPSAnX20xJztcbmNvbnN0IENEX0VYRUNVVEFCTEVfUFJFRklYID0gJ2Nocm9tZWRyaXZlcic7XG5jb25zdCBNT0RVTEVfTkFNRSA9ICdhcHBpdW0tY2hyb21lZHJpdmVyJztcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byBtb2R1bGUgcm9vdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjdXJyZW50IG1vZHVsZSByb290IGZvbGRlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5jb25zdCBnZXRNb2R1bGVSb290ID0gXy5tZW1vaXplKGZ1bmN0aW9uIGdldE1vZHVsZVJvb3QgKCkge1xuICAvLyBUT0RPOiBHZXQgcmlkIG9mIHRoZSBjb25kaXRpb24gYWZ0ZXIgYSB3aGlsZSwgc28gY2xpZW50cyBoYXZlIGVub3VnaCB0aW1lIHRvIGJ1bXAgdGhlaXIgc2VydmVyIHRvIHY0NFxuICAvLyBUT0RPOiBDb21taXQgZGF0ZTogMDkuMDkuMjAyMlxuICBpZiAoIV8uaXNGdW5jdGlvbihub2RlLmdldE1vZHVsZVJvb3RTeW5jKSkge1xuICAgIGNvbnN0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gPSByZXF1aXJlKCdmcycpO1xuICAgIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKHBhdGgucmVzb2x2ZShfX2ZpbGVuYW1lKSk7XG4gICAgbGV0IGlzQXRGc1Jvb3QgPSBmYWxzZTtcbiAgICB3aGlsZSAoIWlzQXRGc1Jvb3QpIHtcbiAgICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpICYmXG4gICAgICAgICAgICBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpLm5hbWUgPT09IE1PRFVMRV9OQU1FKSB7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgICBpc0F0RnNSb290ID0gY3VycmVudERpci5sZW5ndGggPD0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpLmxlbmd0aDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlICR7TU9EVUxFX05BTUV9IE5vZGUuanMgbW9kdWxlYCk7XG4gIH1cblxuICBjb25zdCByb290ID0gbm9kZS5nZXRNb2R1bGVSb290U3luYyhNT0RVTEVfTkFNRSwgX19maWxlbmFtZSk7XG4gIGlmICghcm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgdGhlIHJvb3QgZm9sZGVyIG9mIHRoZSAke01PRFVMRV9OQU1FfSBOb2RlLmpzIG1vZHVsZWApO1xuICB9XG4gIHJldHVybiByb290O1xufSk7XG5cbi8vIENocm9tZWRyaXZlciB2ZXJzaW9uOiBtaW5pbXVtIENocm9tZSB2ZXJzaW9uXG5jb25zdCBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcgPSByZXF1aXJlKHBhdGguam9pbihnZXRNb2R1bGVSb290KCksICdjb25maWcnLCAnbWFwcGluZy5qc29uJykpO1xuY29uc3QgQ0RfQkFTRV9ESVIgPSBwYXRoLmpvaW4oZ2V0TW9kdWxlUm9vdCgpLCAnY2hyb21lZHJpdmVyJyk7XG5cbmZ1bmN0aW9uIGdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIgKG1hcHBpbmcgPSBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcpIHtcbiAgaWYgKF8uaXNFbXB0eShtYXBwaW5nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCBtb3N0IHJlY2VudCBDaHJvbWVkcml2ZXIgdmVyc2lvbiBmcm9tIGVtcHR5IG1hcHBpbmcnKTtcbiAgfVxuICByZXR1cm4gXy5sYXN0KF8ua2V5cyhtYXBwaW5nKS5zb3J0KGNvbXBhcmVWZXJzaW9ucykpO1xufVxuXG5jb25zdCBDRF9WRVIgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2Nocm9tZWRyaXZlcl92ZXJzaW9uXG4gIHx8IHByb2Nlc3MuZW52LkNIUk9NRURSSVZFUl9WRVJTSU9OXG4gIHx8IGdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIoKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hyb21lVmVyc2lvbiAoYWRiLCBidW5kbGVJZCkge1xuICBjb25zdCB7dmVyc2lvbk5hbWV9ID0gYXdhaXQgYWRiLmdldFBhY2thZ2VJbmZvKGJ1bmRsZUlkKTtcbiAgcmV0dXJuIHZlcnNpb25OYW1lO1xufVxuXG5mdW5jdGlvbiBnZXRDaHJvbWVkcml2ZXJEaXIgKG9zTmFtZSA9IGdldE9zTmFtZSgpKSB7XG4gIHJldHVybiBwYXRoLnJlc29sdmUoQ0RfQkFTRV9ESVIsIG9zTmFtZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGggKG9zTmFtZSA9IGdldE9zTmFtZSgpKSB7XG4gIGNvbnN0IHJvb3REaXIgPSBnZXRDaHJvbWVkcml2ZXJEaXIob3NOYW1lKTtcbiAgY29uc3QgcGF0aFN1ZmZpeCA9IG9zTmFtZSA9PT0gT1Mud2luZG93cyA/ICcuZXhlJyA6ICcnO1xuICBjb25zdCBwYXRocyA9IGF3YWl0IGZzLmdsb2IoYCR7Q0RfRVhFQ1VUQUJMRV9QUkVGSVh9KiR7cGF0aFN1ZmZpeH1gLCB7XG4gICAgY3dkOiByb290RGlyLFxuICAgIGFic29sdXRlOiB0cnVlLFxuICAgIG5vY2FzZTogdHJ1ZSxcbiAgICBub2RpcjogdHJ1ZSxcbiAgICBzdHJpY3Q6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIF8uaXNFbXB0eShwYXRocylcbiAgICA/IHBhdGgucmVzb2x2ZShyb290RGlyLCBgJHtDRF9FWEVDVVRBQkxFX1BSRUZJWH0ke3BhdGhTdWZmaXh9YClcbiAgICA6IF8uZmlyc3QocGF0aHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZURhdGEgKHVybCwgaGVhZGVycywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0aW1lb3V0ID0gNTAwMCxcbiAgICByZXNwb25zZVR5cGUgPSAndGV4dCcsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICB1cmwsXG4gICAgaGVhZGVycyxcbiAgICB0aW1lb3V0LFxuICAgIHJlc3BvbnNlVHlwZSxcbiAgfSkpLmRhdGE7XG59XG5cbmNvbnN0IGdldE9zTmFtZSA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRPc05hbWUgKCkge1xuICBpZiAoc3lzdGVtLmlzV2luZG93cygpKSB7XG4gICAgcmV0dXJuIE9TLndpbmRvd3M7XG4gIH1cbiAgaWYgKHN5c3RlbS5pc01hYygpKSB7XG4gICAgcmV0dXJuIE9TLm1hYztcbiAgfVxuICByZXR1cm4gT1MubGludXg7XG59KTtcblxuY29uc3QgZ2V0T3NJbmZvID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldE9zSW5mbyAoKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogZ2V0T3NOYW1lKCksXG4gICAgYXJjaDogYXdhaXQgc3lzdGVtLmFyY2goKSxcbiAgICBoYXJkd2FyZU5hbWU6IHN5c3RlbS5pc1dpbmRvd3MoKSA/IG51bGwgOiBfLnRyaW0oYXdhaXQgZXhlYygndW5hbWUnLCBbJy1tJ10pKSxcbiAgfTtcbn0pO1xuXG5jb25zdCBnZXRCYXNlRHJpdmVySW5zdGFuY2UgPSBfLm1lbW9pemUoKCkgPT4gbmV3IEJhc2VEcml2ZXIoe30sIGZhbHNlKSk7XG5cbi8qKlxuICogR2VuZXJhdGVzIGxvZyBwcmVmaXggc3RyaW5nXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiBsb2cgb3duZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nP30gc2Vzc2lvbklkIE9wdGlvbmFsIHNlc3Npb24gaWRlbnRpZmllclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVMb2dQcmVmaXggKG9iaiwgc2Vzc2lvbklkID0gbnVsbCkge1xuICByZXR1cm4gZ2V0QmFzZURyaXZlckluc3RhbmNlKCkuaGVscGVycy5nZW5lcmF0ZURyaXZlckxvZ1ByZWZpeChvYmosIHNlc3Npb25JZCk7XG59XG5cblxuZXhwb3J0IHtcbiAgZ2V0Q2hyb21lVmVyc2lvbiwgZ2V0Q2hyb21lZHJpdmVyRGlyLCBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoLCBnZXRPc05hbWUsXG4gIENEX0JBU0VfRElSLCBDRF9DRE4sIENEX1ZFUiwgQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HLCBnZXRNb3N0UmVjZW50Q2hyb21lZHJpdmVyLFxuICByZXRyaWV2ZURhdGEsIGdldE9zSW5mbywgT1MsIFg2NCwgWDg2LCBNMV9BUkNIX1NVRkZJWCwgZ2VuZXJhdGVMb2dQcmVmaXgsXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxNQUFNLEdBQUdDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyw4QkFBWixJQUNWRixPQUFPLENBQUNDLEdBQVIsQ0FBWUUsbUJBREYsSUFFViw2Q0FGTDs7QUFHQSxNQUFNQyxFQUFFLEdBQUc7RUFDVEMsS0FBSyxFQUFFLE9BREU7RUFFVEMsT0FBTyxFQUFFLEtBRkE7RUFHVEMsR0FBRyxFQUFFO0FBSEksQ0FBWDs7QUFLQSxNQUFNQyxHQUFHLEdBQUcsSUFBWjs7QUFDQSxNQUFNQyxHQUFHLEdBQUcsSUFBWjs7QUFDQSxNQUFNQyxjQUFjLEdBQUcsS0FBdkI7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsY0FBN0I7QUFDQSxNQUFNQyxXQUFXLEdBQUcscUJBQXBCOztBQVFBLE1BQU1DLGFBQWEsR0FBR0MsZUFBQSxDQUFFQyxPQUFGLENBQVUsU0FBU0YsYUFBVCxHQUEwQjtFQUd4RCxJQUFJLENBQUNDLGVBQUEsQ0FBRUUsVUFBRixDQUFhQyxhQUFBLENBQUtD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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":["CD_CDN","process","env","npm_config_chromedriver_cdnurl","CHROMEDRIVER_CDNURL","OS","linux","windows","mac","X64","X86","M1_ARCH_SUFFIX","CD_EXECUTABLE_PREFIX","MODULE_NAME","getModuleRoot","_","memoize","isFunction","node","getModuleRootSync","existsSync","readFileSync","require","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","JSON","parse","name","ign","length","Error","root","CHROMEDRIVER_CHROME_MAPPING","CD_BASE_DIR","getMostRecentChromedriver","mapping","isEmpty","last","keys","sort","compareVersions","CD_VER","npm_config_chromedriver_version","CHROMEDRIVER_VERSION","getChromeVersion","adb","bundleId","versionName","getPackageInfo","getChromedriverDir","osName","getOsName","getChromedriverBinaryPath","rootDir","pathSuffix","paths","fs","glob","cwd","absolute","nocase","nodir","strict","first","retrieveData","url","headers","opts","timeout","responseType","axios","data","system","isWindows","isMac","getOsInfo","arch","hardwareName","trim","exec","getBaseDriverInstance","BaseDriver","generateLogPrefix","obj","sessionId","helpers","generateDriverLogPrefix"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { system, fs, node } from 'appium/support';\nimport { BaseDriver } from 'appium/driver';\nimport path from 'path';\nimport { compareVersions } from 'compare-versions';\nimport axios from 'axios';\nimport { exec } from 'teen_process';\n\nconst CD_CDN = process.env.npm_config_chromedriver_cdnurl\n || process.env.CHROMEDRIVER_CDNURL\n || 'https://chromedriver.storage.googleapis.com';\nconst OS = {\n linux: 'linux',\n windows: 'win',\n mac: 'mac'\n};\nconst X64 = '64';\nconst X86 = '32';\nconst M1_ARCH_SUFFIX = '_m1';\nconst CD_EXECUTABLE_PREFIX = 'chromedriver';\nconst MODULE_NAME = 'appium-chromedriver';\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(function getModuleRoot () {\n // TODO: Get rid of the condition after a while, so clients have enough time to bump their server to v44\n // TODO: Commit date: 09.09.2022\n if (!_.isFunction(node.getModuleRootSync)) {\n const { existsSync, readFileSync } = require('fs');\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 (existsSync(manifestPath) &&\n JSON.parse(readFileSync(manifestPath, 'utf8')).name === MODULE_NAME) {\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 ${MODULE_NAME} Node.js module`);\n }\n\n const root = node.getModuleRootSync(MODULE_NAME, __filename);\n if (!root) {\n throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);\n }\n return root;\n});\n\n// Chromedriver version: minimum Chrome version\nconst CHROMEDRIVER_CHROME_MAPPING = require(path.join(getModuleRoot(), 'config', 'mapping.json'));\nconst CD_BASE_DIR = path.join(getModuleRoot(), 'chromedriver');\n\nfunction getMostRecentChromedriver (mapping = CHROMEDRIVER_CHROME_MAPPING) {\n if (_.isEmpty(mapping)) {\n throw new Error('Unable to get most recent Chromedriver version from empty mapping');\n }\n return _.last(_.keys(mapping).sort(compareVersions));\n}\n\nconst CD_VER = process.env.npm_config_chromedriver_version\n || process.env.CHROMEDRIVER_VERSION\n || getMostRecentChromedriver();\n\nasync function getChromeVersion (adb, bundleId) {\n const {versionName} = await adb.getPackageInfo(bundleId);\n return versionName;\n}\n\nfunction getChromedriverDir (osName = getOsName()) {\n return path.resolve(CD_BASE_DIR, osName);\n}\n\nasync function getChromedriverBinaryPath (osName = getOsName()) {\n const rootDir = getChromedriverDir(osName);\n const pathSuffix = osName === OS.windows ? '.exe' : '';\n const paths = await fs.glob(`${CD_EXECUTABLE_PREFIX}*${pathSuffix}`, {\n cwd: rootDir,\n absolute: true,\n nocase: true,\n nodir: true,\n strict: false,\n });\n return _.isEmpty(paths)\n ? path.resolve(rootDir, `${CD_EXECUTABLE_PREFIX}${pathSuffix}`)\n : _.first(paths);\n}\n\nasync function retrieveData (url, headers, opts = {}) {\n const {\n timeout = 5000,\n responseType = 'text',\n } = opts;\n return (await axios({\n url,\n headers,\n timeout,\n responseType,\n })).data;\n}\n\nconst getOsName = _.memoize(function getOsName () {\n if (system.isWindows()) {\n return OS.windows;\n }\n if (system.isMac()) {\n return OS.mac;\n }\n return OS.linux;\n});\n\nconst getOsInfo = _.memoize(async function getOsInfo () {\n return {\n name: getOsName(),\n arch: await system.arch(),\n hardwareName: system.isWindows() ? null : _.trim(await exec('uname', ['-m'])),\n };\n});\n\nconst getBaseDriverInstance = _.memoize(() => new BaseDriver({}, false));\n\n/**\n * Generates log prefix string\n *\n * @param {object} obj log owner instance\n * @param {string?} sessionId Optional session identifier\n * @returns {string}\n */\nfunction generateLogPrefix (obj, sessionId = null) {\n return getBaseDriverInstance().helpers.generateDriverLogPrefix(obj, sessionId);\n}\n\n\nexport {\n getChromeVersion, getChromedriverDir, getChromedriverBinaryPath, getOsName,\n CD_BASE_DIR, CD_CDN, CD_VER, CHROMEDRIVER_CHROME_MAPPING, getMostRecentChromedriver,\n retrieveData, getOsInfo, OS, X64, X86, M1_ARCH_SUFFIX, generateLogPrefix,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA,MAAMA,MAAM,GAAGC,OAAO,CAACC,GAAR,CAAYC,8BAAZ,IACVF,OAAO,CAACC,GAAR,CAAYE,mBADF,IAEV,6CAFL;;AAGA,MAAMC,EAAE,GAAG;EACTC,KAAK,EAAE,OADE;EAETC,OAAO,EAAE,KAFA;EAGTC,GAAG,EAAE;AAHI,CAAX;;AAKA,MAAMC,GAAG,GAAG,IAAZ;;AACA,MAAMC,GAAG,GAAG,IAAZ;;AACA,MAAMC,cAAc,GAAG,KAAvB;;AACA,MAAMC,oBAAoB,GAAG,cAA7B;AACA,MAAMC,WAAW,GAAG,qBAApB;;AAQA,MAAMC,aAAa,GAAGC,eAAA,CAAEC,OAAF,CAAU,SAASF,aAAT,GAA0B;EAGxD,IAAI,CAACC,eAAA,CAAEE,UAAF,CAAaC,aAAA,CAAKC,iBAAlB,CAAL,EAA2C;IACzC,MAAM;MAAEC,UAAF;MAAcC;IAAd,IAA+BC,OAAO,CAAC,IAAD,CAA5C;;IACA,IAAIC,UAAU,GAAGC,aAAA,CAAKC,OAAL,CAAaD,aAAA,CAAKE,OAAL,CAAaC,UAAb,CAAb,CAAjB;;IACA,IAAIC,UAAU,GAAG,KAAjB;;IACA,OAAO,CAACA,UAAR,EAAoB;MAClB,MAAMC,YAAY,GAAGL,aAAA,CAAKM,IAAL,CAAUP,UAAV,EAAsB,cAAtB,CAArB;;MACA,IAAI;QACF,IAAIH,UAAU,CAACS,YAAD,CAAV,IACAE,IAAI,CAACC,KAAL,CAAWX,YAAY,CAACQ,YAAD,EAAe,MAAf,CAAvB,EAA+CI,IAA/C,KAAwDpB,WAD5D,EACyE;UACvE,OAAOU,UAAP;QACD;MACF,CALD,CAKE,OAAOW,GAAP,EAAY,CAAE;;MAChBX,UAAU,GAAGC,aAAA,CAAKC,OAAL,CAAaF,UAAb,CAAb;MACAK,UAAU,GAAGL,UAAU,CAACY,MAAX,IAAqBX,aAAA,CAAKC,OAAL,CAAaF,UAAb,EAAyBY,MAA3D;IACD;;IACD,MAAM,IAAIC,KAAJ,CAAW,sCAAqCvB,WAAY,iBAA5D,CAAN;EACD;;EAED,MAAMwB,IAAI,GAAGnB,aAAA,CAAKC,iBAAL,CAAuBN,WAAvB,EAAoCc,UAApC,CAAb;;EACA,IAAI,CAACU,IAAL,EAAW;IACT,MAAM,IAAID,KAAJ,CAAW,sCAAqCvB,WAAY,iBAA5D,CAAN;EACD;;EACD,OAAOwB,IAAP;AACD,CA1BqB,CAAtB;;AA6BA,MAAMC,2BAA2B,GAAGhB,OAAO,CAACE,aAAA,CAAKM,IAAL,CAAUhB,aAAa,EAAvB,EAA2B,QAA3B,EAAqC,cAArC,CAAD,CAA3C;;;;AACA,MAAMyB,WAAW,GAAGf,aAAA,CAAKM,IAAL,CAAUhB,aAAa,EAAvB,EAA2B,cAA3B,CAApB;;;;AAEA,SAAS0B,yBAAT,CAAoCC,OAAO,GAAGH,2BAA9C,EAA2E;EACzE,IAAIvB,eAAA,CAAE2B,OAAF,CAAUD,OAAV,CAAJ,EAAwB;IACtB,MAAM,IAAIL,KAAJ,CAAU,mEAAV,CAAN;EACD;;EACD,OAAOrB,eAAA,CAAE4B,IAAF,CAAO5B,eAAA,CAAE6B,IAAF,CAAOH,OAAP,EAAgBI,IAAhB,CAAqBC,gCAArB,CAAP,CAAP;AACD;;AAED,MAAMC,MAAM,GAAG9C,OAAO,CAACC,GAAR,CAAY8C,+BAAZ,IACV/C,OAAO,CAACC,GAAR,CAAY+C,oBADF,IAEVT,yBAAyB,EAF9B;;;AAIA,eAAeU,gBAAf,CAAiCC,GAAjC,EAAsCC,QAAtC,EAAgD;EAC9C,MAAM;IAACC;EAAD,IAAgB,MAAMF,GAAG,CAACG,cAAJ,CAAmBF,QAAnB,CAA5B;EACA,OAAOC,WAAP;AACD;;AAED,SAASE,kBAAT,CAA6BC,MAAM,GAAGC,SAAS,EAA/C,EAAmD;EACjD,OAAOjC,aAAA,CAAKE,OAAL,CAAaa,WAAb,EAA0BiB,MAA1B,CAAP;AACD;;AAED,eAAeE,yBAAf,CAA0CF,MAAM,GAAGC,SAAS,EAA5D,EAAgE;EAC9D,MAAME,OAAO,GAAGJ,kBAAkB,CAACC,MAAD,CAAlC;EACA,MAAMI,UAAU,GAAGJ,MAAM,KAAKnD,EAAE,CAACE,OAAd,GAAwB,MAAxB,GAAiC,EAApD;EACA,MAAMsD,KAAK,GAAG,MAAMC,WAAA,CAAGC,IAAH,CAAS,GAAEnD,oBAAqB,IAAGgD,UAAW,EAA9C,EAAiD;IACnEI,GAAG,EAAEL,OAD8D;IAEnEM,QAAQ,EAAE,IAFyD;IAGnEC,MAAM,EAAE,IAH2D;IAInEC,KAAK,EAAE,IAJ4D;IAKnEC,MAAM,EAAE;EAL2D,CAAjD,CAApB;EAOA,OAAOrD,eAAA,CAAE2B,OAAF,CAAUmB,KAAV,IACHrC,aAAA,CAAKE,OAAL,CAAaiC,OAAb,EAAuB,GAAE/C,oBAAqB,GAAEgD,UAAW,EAA3D,CADG,GAEH7C,eAAA,CAAEsD,KAAF,CAAQR,KAAR,CAFJ;AAGD;;AAED,eAAeS,YAAf,CAA6BC,GAA7B,EAAkCC,OAAlC,EAA2CC,IAAI,GAAG,EAAlD,EAAsD;EACpD,MAAM;IACJC,OAAO,GAAG,IADN;IAEJC,YAAY,GAAG;EAFX,IAGFF,IAHJ;EAIA,OAAO,CAAC,MAAM,IAAAG,cAAA,EAAM;IAClBL,GADkB;IAElBC,OAFkB;IAGlBE,OAHkB;IAIlBC;EAJkB,CAAN,CAAP,EAKHE,IALJ;AAMD;;AAED,MAAMpB,SAAS,GAAG1C,eAAA,CAAEC,OAAF,CAAU,SAASyC,SAAT,GAAsB;EAChD,IAAIqB,eAAA,CAAOC,SAAP,EAAJ,EAAwB;IACtB,OAAO1E,EAAE,CAACE,OAAV;EACD;;EACD,IAAIuE,eAAA,CAAOE,KAAP,EAAJ,EAAoB;IAClB,OAAO3E,EAAE,CAACG,GAAV;EACD;;EACD,OAAOH,EAAE,CAACC,KAAV;AACD,CARiB,CAAlB;;;;AAUA,MAAM2E,SAAS,GAAGlE,eAAA,CAAEC,OAAF,CAAU,eAAeiE,SAAf,GAA4B;EACtD,OAAO;IACLhD,IAAI,EAAEwB,SAAS,EADV;IAELyB,IAAI,EAAE,MAAMJ,eAAA,CAAOI,IAAP,EAFP;IAGLC,YAAY,EAAEL,eAAA,CAAOC,SAAP,KAAqB,IAArB,GAA4BhE,eAAA,CAAEqE,IAAF,CAAO,MAAM,IAAAC,kBAAA,EAAK,OAAL,EAAc,CAAC,IAAD,CAAd,CAAb;EAHrC,CAAP;AAKD,CANiB,CAAlB;;;;AAQA,MAAMC,qBAAqB,GAAGvE,eAAA,CAAEC,OAAF,CAAU,MAAM,IAAIuE,kBAAJ,CAAe,EAAf,EAAmB,KAAnB,CAAhB,CAA9B;;AASA,SAASC,iBAAT,CAA4BC,GAA5B,EAAiCC,SAAS,GAAG,IAA7C,EAAmD;EACjD,OAAOJ,qBAAqB,GAAGK,OAAxB,CAAgCC,uBAAhC,CAAwDH,GAAxD,EAA6DC,SAA7D,CAAP;AACD"}
|
package/config/mapping.json
CHANGED
package/lib/chromedriver.js
CHANGED
|
@@ -28,7 +28,6 @@ const WEBVIEW_BUNDLE_IDS = [
|
|
|
28
28
|
'com.google.android.webview',
|
|
29
29
|
'com.android.webview',
|
|
30
30
|
];
|
|
31
|
-
const CHROMEDRIVER_TUTORIAL = 'https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md';
|
|
32
31
|
const VERSION_PATTERN = /([\d.]+)/;
|
|
33
32
|
|
|
34
33
|
const CD_VERSION_TIMEOUT = 5000;
|
|
@@ -374,10 +373,10 @@ class Chromedriver extends events.EventEmitter {
|
|
|
374
373
|
}
|
|
375
374
|
}
|
|
376
375
|
const autodownloadSuggestion =
|
|
377
|
-
'You could also try to enable automated chromedrivers download
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
`
|
|
376
|
+
'You could also try to enable automated chromedrivers download as ' +
|
|
377
|
+
'a possible workaround.';
|
|
378
|
+
throw new Error(`No Chromedriver found that can automate Chrome '${chromeVersion}'.` +
|
|
379
|
+
(this.storageClient ? '' : ` ${autodownloadSuggestion}`));
|
|
381
380
|
}
|
|
382
381
|
|
|
383
382
|
const binPath = matchingDrivers[0].executable;
|
|
@@ -547,7 +546,7 @@ class Chromedriver extends events.EventEmitter {
|
|
|
547
546
|
if (versionsSupportedByDriver) {
|
|
548
547
|
message += `Chromedriver supports Chrome version(s): ${versionsSupportedByDriver}\n`;
|
|
549
548
|
}
|
|
550
|
-
message +=
|
|
549
|
+
message += 'Check the driver tutorial for troubleshooting.\n';
|
|
551
550
|
}
|
|
552
551
|
|
|
553
552
|
message += e.message;
|
package/lib/utils.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
|
-
import { system, fs } from 'appium/support';
|
|
2
|
+
import { system, fs, node } from 'appium/support';
|
|
3
3
|
import { BaseDriver } from 'appium/driver';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import { compareVersions } from 'compare-versions';
|
|
6
6
|
import axios from 'axios';
|
|
7
7
|
import { exec } from 'teen_process';
|
|
8
|
-
import _fs from 'fs';
|
|
9
8
|
|
|
10
9
|
const CD_CDN = process.env.npm_config_chromedriver_cdnurl
|
|
11
10
|
|| process.env.CHROMEDRIVER_CDNURL
|
|
@@ -19,6 +18,7 @@ const X64 = '64';
|
|
|
19
18
|
const X86 = '32';
|
|
20
19
|
const M1_ARCH_SUFFIX = '_m1';
|
|
21
20
|
const CD_EXECUTABLE_PREFIX = 'chromedriver';
|
|
21
|
+
const MODULE_NAME = 'appium-chromedriver';
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Calculates the path to the current module's root folder
|
|
@@ -27,20 +27,31 @@ const CD_EXECUTABLE_PREFIX = 'chromedriver';
|
|
|
27
27
|
* @throws {Error} If the current module root folder cannot be determined
|
|
28
28
|
*/
|
|
29
29
|
const getModuleRoot = _.memoize(function getModuleRoot () {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
30
|
+
// TODO: Get rid of the condition after a while, so clients have enough time to bump their server to v44
|
|
31
|
+
// TODO: Commit date: 09.09.2022
|
|
32
|
+
if (!_.isFunction(node.getModuleRootSync)) {
|
|
33
|
+
const { existsSync, readFileSync } = require('fs');
|
|
34
|
+
let currentDir = path.dirname(path.resolve(__filename));
|
|
35
|
+
let isAtFsRoot = false;
|
|
36
|
+
while (!isAtFsRoot) {
|
|
37
|
+
const manifestPath = path.join(currentDir, 'package.json');
|
|
38
|
+
try {
|
|
39
|
+
if (existsSync(manifestPath) &&
|
|
40
|
+
JSON.parse(readFileSync(manifestPath, 'utf8')).name === MODULE_NAME) {
|
|
41
|
+
return currentDir;
|
|
42
|
+
}
|
|
43
|
+
} catch (ign) {}
|
|
44
|
+
currentDir = path.dirname(currentDir);
|
|
45
|
+
isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;
|
|
46
|
+
}
|
|
47
|
+
throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);
|
|
42
48
|
}
|
|
43
|
-
|
|
49
|
+
|
|
50
|
+
const root = node.getModuleRootSync(MODULE_NAME, __filename);
|
|
51
|
+
if (!root) {
|
|
52
|
+
throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);
|
|
53
|
+
}
|
|
54
|
+
return root;
|
|
44
55
|
});
|
|
45
56
|
|
|
46
57
|
// Chromedriver version: minimum Chrome version
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"chrome",
|
|
7
7
|
"android"
|
|
8
8
|
],
|
|
9
|
-
"version": "5.2.
|
|
9
|
+
"version": "5.2.3",
|
|
10
10
|
"author": "Appium Contributors",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"repository": {
|
|
@@ -74,11 +74,11 @@
|
|
|
74
74
|
"e2e-test": "mocha --exit --timeout 10m \"./test/functional/**/*-specs.js\""
|
|
75
75
|
},
|
|
76
76
|
"peerDependencies": {
|
|
77
|
-
"appium": "^2.0.0-beta.
|
|
77
|
+
"appium": "^2.0.0-beta.44"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
80
|
"@appium/eslint-config-appium": "^6.0.0",
|
|
81
|
-
"@appium/test-support": "^
|
|
81
|
+
"@appium/test-support": "^2.0.0",
|
|
82
82
|
"@babel/cli": "^7.18.10",
|
|
83
83
|
"@babel/core": "^7.18.10",
|
|
84
84
|
"@babel/eslint-parser": "^7.18.9",
|