appium-espresso-driver 2.16.1 → 2.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [2.18.0](https://github.com/appium/appium-espresso-driver/compare/v2.17.0...v2.18.0) (2023-03-22)
2
+
3
+
4
+ ### Features
5
+
6
+ * add building espresso server command via appium command ([#858](https://github.com/appium/appium-espresso-driver/issues/858)) ([cfaad9a](https://github.com/appium/appium-espresso-driver/commit/cfaad9a9cf82679df11cc4cbf57206d4f6d55b9c))
7
+
8
+ ## [2.17.0](https://github.com/appium/appium-espresso-driver/compare/v2.16.1...v2.17.0) (2023-03-13)
9
+
10
+
11
+ ### Features
12
+
13
+ * add disableWindowAnimation caps ([#857](https://github.com/appium/appium-espresso-driver/issues/857)) ([eb4f60e](https://github.com/appium/appium-espresso-driver/commit/eb4f60ef65a39437c78066b388c4f7470087419f))
14
+
1
15
  ## [2.16.1](https://github.com/appium/appium-espresso-driver/compare/v2.16.0...v2.16.1) (2023-03-10)
2
16
 
3
17
 
package/README.md CHANGED
@@ -42,7 +42,12 @@ On top of standard Appium requirements Espresso driver also expects the followin
42
42
 
43
43
  ## Scripts
44
44
 
45
- - `appium driver run print-espresso-path` prints the path to the Appium Espresso server root. You can modify the gradle file directly if [Espresso Build Config](#espresso-build-config) was not sufficient.
45
+ - `appium driver run espresso print-espresso-path` prints the path to the Appium Espresso server root. You can modify the gradle file directly if [Espresso Build Config](#espresso-build-config) was not sufficient.
46
+ - `appium driver run espresso build-espresso` builds the espresso server since driver version 2.18.0. It helps building the espresso server outside of the Appium process. Available environment variables are below:
47
+ - `SHOW_GRADLE_LOG` configures if the command shows the gradle task logs. `true` or `1` sets it as enabled, but others set it as disabled. Defaults to disabled.
48
+ - `TEST_APP_PACKAGE` configures the target application to build the espresso server for.
49
+ - `ESPRESSO_BUILD_CONFIG` is an absolute path to the [Espresso Build Config](#espresso-build-config) as JSON format file.
50
+ - e.g. `SHOW_GRADLE_LOG=true TEST_APP_PACKAGE=your.test.pkg ESPRESSO_BUILD_CONFIG=/path/to/the/config.json appium driver run build-espresso`
46
51
 
47
52
  ## Capabilities
48
53
 
@@ -179,6 +184,7 @@ appium:chromeOptions | A mapping, that allows to customize chromedriver options.
179
184
  Capability Name | Description
180
185
  --- | ---
181
186
  appium:disableSuppressAccessibilityService | Being set to `true` tells the instrumentation process to not suppress accessibility services during the automated test. This might be useful if your automated test needs these services. `false` by default
187
+ appium:disableWindowAnimation | To avoid flakiness google [recommends](https://developer.android.com/training/testing/espresso/setup#set-up-environment) to disable the window animation of the Android device under test when running espresso test. `true` by default
182
188
 
183
189
 
184
190
  ## Settings API
@@ -1258,4 +1264,3 @@ more details.
1258
1264
  * Espresso server unit tests are located at `io.appium.espressoserver.test` and can be run in Android Studio
1259
1265
  * NodeJS unit tests are run with `npm run test`
1260
1266
  * End-to-end tests are run with `npm run e2e-test` (remember to run `npm run build` before running this command so that it has up-to-date Espresso Server and NodeJS code)
1261
-
@@ -51,10 +51,13 @@ let espressoCapConstraints = {
51
51
  },
52
52
  appLocale: {
53
53
  isObject: true
54
+ },
55
+ disableWindowAnimation: {
56
+ isBoolean: true
54
57
  }
55
58
  };
56
59
  let desiredCapConstraints = {};
57
60
  Object.assign(desiredCapConstraints, espressoCapConstraints, _appiumAndroidDriver.commonCapConstraints);
58
61
  var _default = desiredCapConstraints;
59
62
  exports.default = _default;
60
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXBwaXVtQW5kcm9pZERyaXZlciIsInJlcXVpcmUiLCJlc3ByZXNzb0NhcENvbnN0cmFpbnRzIiwiYXBwIiwiaXNTdHJpbmciLCJhdXRvbWF0aW9uTmFtZSIsInN5c3RlbVBvcnQiLCJpc051bWJlciIsImJyb3dzZXJOYW1lIiwibGF1bmNoVGltZW91dCIsInNraXBVbmxvY2siLCJpc0Jvb2xlYW4iLCJmb3JjZUVzcHJlc3NvUmVidWlsZCIsImVzcHJlc3NvU2VydmVyTGF1bmNoVGltZW91dCIsImVzcHJlc3NvQnVpbGRDb25maWciLCJzaG93R3JhZGxlTG9nIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsImludGVudE9wdGlvbnMiLCJpc09iamVjdCIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwiYWN0aXZpdHlPcHRpb25zIiwiYXBwTG9jYWxlIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwiT2JqZWN0IiwiYXNzaWduIiwiY29tbW9uQ2FwQ29uc3RyYWludHMiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Rlc2lyZWQtY2Fwcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21tb25DYXBDb25zdHJhaW50cyB9IGZyb20gJ2FwcGl1bS1hbmRyb2lkLWRyaXZlcic7XG5cbmxldCBlc3ByZXNzb0NhcENvbnN0cmFpbnRzID0ge1xuICBhcHA6IHtcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbiAgYXV0b21hdGlvbk5hbWU6IHtcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbiAgc3lzdGVtUG9ydDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGJyb3dzZXJOYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgbGF1bmNoVGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIHNraXBVbmxvY2s6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgZm9yY2VFc3ByZXNzb1JlYnVpbGQ6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgZXNwcmVzc29TZXJ2ZXJMYXVuY2hUaW1lb3V0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgZXNwcmVzc29CdWlsZENvbmZpZzoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHNob3dHcmFkbGVMb2c6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgc2tpcFNlcnZlckluc3RhbGxhdGlvbjoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBpbnRlbnRPcHRpb25zOiB7XG4gICAgaXNPYmplY3Q6IHRydWVcbiAgfSxcbiAgZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2U6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgYWN0aXZpdHlPcHRpb25zOiB7XG4gICAgaXNPYmplY3Q6IHRydWVcbiAgfSxcbiAgYXBwTG9jYWxlOiB7XG4gICAgaXNPYmplY3Q6IHRydWUsXG4gIH1cbn07XG5cbmxldCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgPSB7fTtcbk9iamVjdC5hc3NpZ24oZGVzaXJlZENhcENvbnN0cmFpbnRzLCBlc3ByZXNzb0NhcENvbnN0cmFpbnRzLFxuICAgICAgICAgICAgICBjb21tb25DYXBDb25zdHJhaW50cyk7XG5cbmV4cG9ydCBkZWZhdWx0IGRlc2lyZWRDYXBDb25zdHJhaW50cztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLG9CQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFJQyxzQkFBc0IsR0FBRztFQUMzQkMsR0FBRyxFQUFFO0lBQ0hDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREMsY0FBYyxFQUFFO0lBQ2RELFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREUsVUFBVSxFQUFFO0lBQ1ZDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREMsV0FBVyxFQUFFO0lBQ1hKLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREssYUFBYSxFQUFFO0lBQ2JGLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREcsVUFBVSxFQUFFO0lBQ1ZDLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDREMsb0JBQW9CLEVBQUU7SUFDcEJELFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDREUsMkJBQTJCLEVBQUU7SUFDM0JOLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRE8sbUJBQW1CLEVBQUU7SUFDbkJWLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRFcsYUFBYSxFQUFFO0lBQ2JKLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDREssc0JBQXNCLEVBQUU7SUFDdEJMLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRE0sYUFBYSxFQUFFO0lBQ2JDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREMsbUNBQW1DLEVBQUU7SUFDbkNSLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRFMsZUFBZSxFQUFFO0lBQ2ZGLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREcsU0FBUyxFQUFFO0lBQ1RILFFBQVEsRUFBRTtFQUNaO0FBQ0YsQ0FBQztBQUVELElBQUlJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUM5QkMsTUFBTSxDQUFDQyxNQUFNLENBQUNGLHFCQUFxQixFQUFFcEIsc0JBQXNCLEVBQzdDdUIseUNBQW9CLENBQUM7QUFBQyxJQUFBQyxRQUFBLEdBRXJCSixxQkFBcUI7QUFBQUssT0FBQSxDQUFBQyxPQUFBLEdBQUFGLFFBQUEifQ==
63
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXBwaXVtQW5kcm9pZERyaXZlciIsInJlcXVpcmUiLCJlc3ByZXNzb0NhcENvbnN0cmFpbnRzIiwiYXBwIiwiaXNTdHJpbmciLCJhdXRvbWF0aW9uTmFtZSIsInN5c3RlbVBvcnQiLCJpc051bWJlciIsImJyb3dzZXJOYW1lIiwibGF1bmNoVGltZW91dCIsInNraXBVbmxvY2siLCJpc0Jvb2xlYW4iLCJmb3JjZUVzcHJlc3NvUmVidWlsZCIsImVzcHJlc3NvU2VydmVyTGF1bmNoVGltZW91dCIsImVzcHJlc3NvQnVpbGRDb25maWciLCJzaG93R3JhZGxlTG9nIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsImludGVudE9wdGlvbnMiLCJpc09iamVjdCIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwiYWN0aXZpdHlPcHRpb25zIiwiYXBwTG9jYWxlIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsIk9iamVjdCIsImFzc2lnbiIsImNvbW1vbkNhcENvbnN0cmFpbnRzIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kZXNpcmVkLWNhcHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tbW9uQ2FwQ29uc3RyYWludHMgfSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuXG5sZXQgZXNwcmVzc29DYXBDb25zdHJhaW50cyA9IHtcbiAgYXBwOiB7XG4gICAgaXNTdHJpbmc6IHRydWUsXG4gIH0sXG4gIGF1dG9tYXRpb25OYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWUsXG4gIH0sXG4gIHN5c3RlbVBvcnQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBicm93c2VyTmFtZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGxhdW5jaFRpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBza2lwVW5sb2NrOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGZvcmNlRXNwcmVzc29SZWJ1aWxkOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGVzcHJlc3NvU2VydmVyTGF1bmNoVGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGVzcHJlc3NvQnVpbGRDb25maWc6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBzaG93R3JhZGxlTG9nOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIHNraXBTZXJ2ZXJJbnN0YWxsYXRpb246IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgaW50ZW50T3B0aW9uczoge1xuICAgIGlzT2JqZWN0OiB0cnVlXG4gIH0sXG4gIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGFjdGl2aXR5T3B0aW9uczoge1xuICAgIGlzT2JqZWN0OiB0cnVlXG4gIH0sXG4gIGFwcExvY2FsZToge1xuICAgIGlzT2JqZWN0OiB0cnVlLFxuICB9LFxuICBkaXNhYmxlV2luZG93QW5pbWF0aW9uOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlLFxuICB9XG59O1xuXG5sZXQgZGVzaXJlZENhcENvbnN0cmFpbnRzID0ge307XG5PYmplY3QuYXNzaWduKGRlc2lyZWRDYXBDb25zdHJhaW50cywgZXNwcmVzc29DYXBDb25zdHJhaW50cyxcbiAgICAgICAgICAgICAgY29tbW9uQ2FwQ29uc3RyYWludHMpO1xuXG5leHBvcnQgZGVmYXVsdCBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSxvQkFBQSxHQUFBQyxPQUFBO0FBRUEsSUFBSUMsc0JBQXNCLEdBQUc7RUFDM0JDLEdBQUcsRUFBRTtJQUNIQyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RDLGNBQWMsRUFBRTtJQUNkRCxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RFLFVBQVUsRUFBRTtJQUNWQyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RDLFdBQVcsRUFBRTtJQUNYSixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RLLGFBQWEsRUFBRTtJQUNiRixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RHLFVBQVUsRUFBRTtJQUNWQyxTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0RDLG9CQUFvQixFQUFFO0lBQ3BCRCxTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0RFLDJCQUEyQixFQUFFO0lBQzNCTixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RPLG1CQUFtQixFQUFFO0lBQ25CVixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RXLGFBQWEsRUFBRTtJQUNiSixTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0RLLHNCQUFzQixFQUFFO0lBQ3RCTCxTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0RNLGFBQWEsRUFBRTtJQUNiQyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RDLG1DQUFtQyxFQUFFO0lBQ25DUixTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0RTLGVBQWUsRUFBRTtJQUNmRixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RHLFNBQVMsRUFBRTtJQUNUSCxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RJLHNCQUFzQixFQUFFO0lBQ3RCWCxTQUFTLEVBQUU7RUFDYjtBQUNGLENBQUM7QUFFRCxJQUFJWSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDOUJDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDRixxQkFBcUIsRUFBRXJCLHNCQUFzQixFQUM3Q3dCLHlDQUFvQixDQUFDO0FBQUMsSUFBQUMsUUFBQSxHQUVyQkoscUJBQXFCO0FBQUFLLE9BQUEsQ0FBQUMsT0FBQSxHQUFBRixRQUFBIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"desired-caps.js","names":["_appiumAndroidDriver","require","espressoCapConstraints","app","isString","automationName","systemPort","isNumber","browserName","launchTimeout","skipUnlock","isBoolean","forceEspressoRebuild","espressoServerLaunchTimeout","espressoBuildConfig","showGradleLog","skipServerInstallation","intentOptions","isObject","disableSuppressAccessibilityService","activityOptions","appLocale","desiredCapConstraints","Object","assign","commonCapConstraints","_default","exports","default"],"sources":["../../lib/desired-caps.js"],"sourcesContent":["import { commonCapConstraints } from 'appium-android-driver';\n\nlet espressoCapConstraints = {\n app: {\n isString: true,\n },\n automationName: {\n isString: true,\n },\n systemPort: {\n isNumber: true\n },\n browserName: {\n isString: true\n },\n launchTimeout: {\n isNumber: true\n },\n skipUnlock: {\n isBoolean: true\n },\n forceEspressoRebuild: {\n isBoolean: true\n },\n espressoServerLaunchTimeout: {\n isNumber: true\n },\n espressoBuildConfig: {\n isString: true\n },\n showGradleLog: {\n isBoolean: true\n },\n skipServerInstallation: {\n isBoolean: true\n },\n intentOptions: {\n isObject: true\n },\n disableSuppressAccessibilityService: {\n isBoolean: true\n },\n activityOptions: {\n isObject: true\n },\n appLocale: {\n isObject: true,\n }\n};\n\nlet desiredCapConstraints = {};\nObject.assign(desiredCapConstraints, espressoCapConstraints,\n commonCapConstraints);\n\nexport default desiredCapConstraints;\n"],"mappings":";;;;;;;AAAA,IAAAA,oBAAA,GAAAC,OAAA;AAEA,IAAIC,sBAAsB,GAAG;EAC3BC,GAAG,EAAE;IACHC,QAAQ,EAAE;EACZ,CAAC;EACDC,cAAc,EAAE;IACdD,QAAQ,EAAE;EACZ,CAAC;EACDE,UAAU,EAAE;IACVC,QAAQ,EAAE;EACZ,CAAC;EACDC,WAAW,EAAE;IACXJ,QAAQ,EAAE;EACZ,CAAC;EACDK,aAAa,EAAE;IACbF,QAAQ,EAAE;EACZ,CAAC;EACDG,UAAU,EAAE;IACVC,SAAS,EAAE;EACb,CAAC;EACDC,oBAAoB,EAAE;IACpBD,SAAS,EAAE;EACb,CAAC;EACDE,2BAA2B,EAAE;IAC3BN,QAAQ,EAAE;EACZ,CAAC;EACDO,mBAAmB,EAAE;IACnBV,QAAQ,EAAE;EACZ,CAAC;EACDW,aAAa,EAAE;IACbJ,SAAS,EAAE;EACb,CAAC;EACDK,sBAAsB,EAAE;IACtBL,SAAS,EAAE;EACb,CAAC;EACDM,aAAa,EAAE;IACbC,QAAQ,EAAE;EACZ,CAAC;EACDC,mCAAmC,EAAE;IACnCR,SAAS,EAAE;EACb,CAAC;EACDS,eAAe,EAAE;IACfF,QAAQ,EAAE;EACZ,CAAC;EACDG,SAAS,EAAE;IACTH,QAAQ,EAAE;EACZ;AACF,CAAC;AAED,IAAII,qBAAqB,GAAG,CAAC,CAAC;AAC9BC,MAAM,CAACC,MAAM,CAACF,qBAAqB,EAAEpB,sBAAsB,EAC7CuB,yCAAoB,CAAC;AAAC,IAAAC,QAAA,GAErBJ,qBAAqB;AAAAK,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
1
+ {"version":3,"file":"desired-caps.js","names":["_appiumAndroidDriver","require","espressoCapConstraints","app","isString","automationName","systemPort","isNumber","browserName","launchTimeout","skipUnlock","isBoolean","forceEspressoRebuild","espressoServerLaunchTimeout","espressoBuildConfig","showGradleLog","skipServerInstallation","intentOptions","isObject","disableSuppressAccessibilityService","activityOptions","appLocale","disableWindowAnimation","desiredCapConstraints","Object","assign","commonCapConstraints","_default","exports","default"],"sources":["../../lib/desired-caps.js"],"sourcesContent":["import { commonCapConstraints } from 'appium-android-driver';\n\nlet espressoCapConstraints = {\n app: {\n isString: true,\n },\n automationName: {\n isString: true,\n },\n systemPort: {\n isNumber: true\n },\n browserName: {\n isString: true\n },\n launchTimeout: {\n isNumber: true\n },\n skipUnlock: {\n isBoolean: true\n },\n forceEspressoRebuild: {\n isBoolean: true\n },\n espressoServerLaunchTimeout: {\n isNumber: true\n },\n espressoBuildConfig: {\n isString: true\n },\n showGradleLog: {\n isBoolean: true\n },\n skipServerInstallation: {\n isBoolean: true\n },\n intentOptions: {\n isObject: true\n },\n disableSuppressAccessibilityService: {\n isBoolean: true\n },\n activityOptions: {\n isObject: true\n },\n appLocale: {\n isObject: true,\n },\n disableWindowAnimation: {\n isBoolean: true,\n }\n};\n\nlet desiredCapConstraints = {};\nObject.assign(desiredCapConstraints, espressoCapConstraints,\n commonCapConstraints);\n\nexport default desiredCapConstraints;\n"],"mappings":";;;;;;;AAAA,IAAAA,oBAAA,GAAAC,OAAA;AAEA,IAAIC,sBAAsB,GAAG;EAC3BC,GAAG,EAAE;IACHC,QAAQ,EAAE;EACZ,CAAC;EACDC,cAAc,EAAE;IACdD,QAAQ,EAAE;EACZ,CAAC;EACDE,UAAU,EAAE;IACVC,QAAQ,EAAE;EACZ,CAAC;EACDC,WAAW,EAAE;IACXJ,QAAQ,EAAE;EACZ,CAAC;EACDK,aAAa,EAAE;IACbF,QAAQ,EAAE;EACZ,CAAC;EACDG,UAAU,EAAE;IACVC,SAAS,EAAE;EACb,CAAC;EACDC,oBAAoB,EAAE;IACpBD,SAAS,EAAE;EACb,CAAC;EACDE,2BAA2B,EAAE;IAC3BN,QAAQ,EAAE;EACZ,CAAC;EACDO,mBAAmB,EAAE;IACnBV,QAAQ,EAAE;EACZ,CAAC;EACDW,aAAa,EAAE;IACbJ,SAAS,EAAE;EACb,CAAC;EACDK,sBAAsB,EAAE;IACtBL,SAAS,EAAE;EACb,CAAC;EACDM,aAAa,EAAE;IACbC,QAAQ,EAAE;EACZ,CAAC;EACDC,mCAAmC,EAAE;IACnCR,SAAS,EAAE;EACb,CAAC;EACDS,eAAe,EAAE;IACfF,QAAQ,EAAE;EACZ,CAAC;EACDG,SAAS,EAAE;IACTH,QAAQ,EAAE;EACZ,CAAC;EACDI,sBAAsB,EAAE;IACtBX,SAAS,EAAE;EACb;AACF,CAAC;AAED,IAAIY,qBAAqB,GAAG,CAAC,CAAC;AAC9BC,MAAM,CAACC,MAAM,CAACF,qBAAqB,EAAErB,sBAAsB,EAC7CwB,yCAAoB,CAAC;AAAC,IAAAC,QAAA,GAErBJ,qBAAqB;AAAAK,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
@@ -224,14 +224,7 @@ class EspressoDriver extends _driver.BaseDriver {
224
224
  appInfo = this.opts;
225
225
  }
226
226
  await helpers.initDevice(this.adb, this.opts);
227
- if (await this.adb.isAnimationOn()) {
228
- try {
229
- await this.adb.setAnimationState(false);
230
- this.wasAnimationEnabled = true;
231
- } catch (err) {
232
- this.log.warn(`Unable to turn off animations: ${err.message}`);
233
- }
234
- }
227
+ await this.setWindowAnimationState(this.caps.disableWindowAnimation === false);
235
228
  this.caps.deviceName = this.adb.curDeviceId;
236
229
  this.caps.deviceUDID = this.opts.udid;
237
230
  this.initEspressoServer();
@@ -271,6 +264,22 @@ class EspressoDriver extends _driver.BaseDriver {
271
264
  this.jwpProxyActive = true;
272
265
  await this.addDeviceInfoToCaps();
273
266
  }
267
+ async setWindowAnimationState(isEnabled) {
268
+ const isAnimationOn = await this.adb.isAnimationOn();
269
+ const shouldDisableAnimation = !isEnabled && isAnimationOn;
270
+ const shouldEnableAnimation = isEnabled && !isAnimationOn;
271
+ if (shouldDisableAnimation) {
272
+ this.log.debug('Disabling window animation as "disableWindowAnimation" capability is set to true/fallback to default value "true"');
273
+ await this.adb.setAnimationState(false);
274
+ this.wasAnimationEnabled = true;
275
+ } else if (shouldEnableAnimation) {
276
+ this.log.debug('Enabling window animation as "disableWindowAnimation" capability is set to false');
277
+ await this.adb.setAnimationState(true);
278
+ this.wasAnimationEnabled = false;
279
+ } else {
280
+ this.log.debug(`Window animation is already ${isEnabled ? 'enabled' : 'disabled'}`);
281
+ }
282
+ }
274
283
  async initWebview() {
275
284
  const viewName = _appiumAndroidDriver.androidCommands.defaultWebviewName.call(this);
276
285
  const timeout = this.opts.autoWebviewTimeout || 2000;
@@ -449,4 +458,4 @@ for (let [cmd, fn] of _lodash.default.toPairs(_commands.default)) {
449
458
  }
450
459
  var _default = EspressoDriver;
451
460
  exports.default = _default;
452
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGF0aCIsIl9ibHVlYmlyZCIsIl9kcml2ZXIiLCJfZXNwcmVzc29SdW5uZXIiLCJfc3VwcG9ydCIsIl9jb21tYW5kcyIsIl9hcHBpdW1BZGIiLCJfYXBwaXVtQW5kcm9pZERyaXZlciIsIl9kZXNpcmVkQ2FwcyIsIl9wb3J0c2Nhbm5lciIsIl9hc3luY2JveCIsIl91dGlscyIsIl9tZXRob2RNYXAiLCJoZWxwZXJzIiwiYW5kcm9pZEhlbHBlcnMiLCJTWVNURU1fUE9SVF9SQU5HRSIsIkRFVklDRV9QT1JUIiwiTk9fUFJPWFkiLCJSZWdFeHAiLCJDSFJPTUVfTk9fUFJPWFkiLCJBUEtfRVhUIiwiQUFCX0VYVCIsIlNVUFBPUlRFRF9FWFRFTlNJT05TIiwiRXNwcmVzc29Ecml2ZXIiLCJCYXNlRHJpdmVyIiwibmV3TWV0aG9kTWFwIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwic2hlbGwiLCJsb2NhdG9yU3RyYXRlZ2llcyIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsImVzcHJlc3NvIiwiandwUHJveHlBY3RpdmUiLCJqd3BQcm94eUF2b2lkIiwiYXBrU3RyaW5ncyIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJvblNldHRpbmdzVXBkYXRlIiwiYmluZCIsImNocm9tZWRyaXZlciIsInNlc3Npb25DaHJvbWVkcml2ZXJzIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJjYXBzIiwic2VydmVyRGV0YWlscyIsInBsYXRmb3JtIiwid2ViU3RvcmFnZUVuYWJsZWQiLCJ0YWtlc1NjcmVlbnNob3QiLCJqYXZhc2NyaXB0RW5hYmxlZCIsImRhdGFiYXNlRW5hYmxlZCIsIm5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZCIsImxvY2F0aW9uQ29udGV4dEVuYWJsZWQiLCJ3YXJuaW5ncyIsImRlc2lyZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiZGVmYXVsdE9wdHMiLCJmdWxsUmVzZXQiLCJhdXRvTGF1bmNoIiwiYWRiUG9ydCIsIkRFRkFVTFRfQURCX1BPUlQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJfIiwiZGVmYXVsdHMiLCJpc0Nocm9tZVNlc3Npb24iLCJhcHAiLCJsb2ciLCJ3YXJuIiwiZXJyb3JBbmRUaHJvdyIsInJlYm9vdCIsInNldEF2ZEZyb21DYXBhYmlsaXRpZXMiLCJhZGRXaXBlRGF0YVRvQXZkQXJncyIsInN5c3RlbVBvcnQiLCJmaW5kQVBvcnROb3RJblVzZSIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJhZGIiLCJjcmVhdGVBREIiLCJjb25maWd1cmVBcHAiLCJvblBvc3RQcm9jZXNzIiwib25Qb3N0Q29uZmlndXJlQXBwIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImFwcE9uRGV2aWNlIiwiaW5mbyIsImFwcFBhY2thZ2UiLCJpc0FwcEluc3RhbGxlZCIsInN0YXJ0RXNwcmVzc29TZXNzaW9uIiwiZSIsImRlbGV0ZVNlc3Npb24iLCJtZXNzYWdlIiwiZW5kc1dpdGgiLCJpc0Vycm9yVHlwZSIsImVycm9ycyIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJlcnIiLCJzdGFjayIsInVuemlwQXBwIiwiYXBwUGF0aCIsInVzZVN5c3RlbVVuemlwRW52IiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9QUkVGRVJfU1lTVEVNX1VOWklQIiwidXNlU3lzdGVtVW56aXAiLCJpc0VtcHR5IiwiaW5jbHVkZXMiLCJ0b0xvd2VyIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwiemlwIiwiZXh0cmFjdEFsbFRvIiwiZ2xvYlBhdHRlcm4iLCJtYXAiLCJleHQiLCJyZXBsYWNlIiwiam9pbiIsInNvcnRlZEJ1bmRsZUl0ZW1zIiwiZnMiLCJnbG9iIiwiY3dkIiwic3RyaWN0Iiwic29ydCIsImEiLCJiIiwic3BsaXQiLCJwYXRoIiwic2VwIiwibGVuZ3RoIiwidW56aXBwZWRBcHBQYXRoIiwiZmlyc3QiLCJkZWJ1ZyIsImNhY2hlZEFwcEluZm8iLCJpc1VybCIsInByZXNpZ25BcHAiLCJhcHBMb2NhdGlvbiIsIm5vU2lnbiIsImNoZWNrQXBrQ2VydCIsInNpZ24iLCJoYXNBcGtFeHQiLCJoYXNBYWJFeHQiLCJleHRyYWN0VW5pdmVyc2FsQXBrIiwic2hvdWxkRXh0cmFjdCIsInBhdGhJbkNhY2hlIiwiaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCIsImlzUGxhaW5PYmplY3QiLCJwYWNrYWdlSGFzaCIsImhhc2giLCJleGlzdHMiLCJmdWxsUGF0aCIsImlzQXBrIiwic2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkIiwiaXNVbnppcHBlZEFwayIsInJpbXJhZiIsImRyaXZlckRhdGEiLCJpc0VtdWxhdG9yIiwiYXZkIiwiZGV2aWNlTmFtZSIsInBsYXRmb3JtVmVyc2lvbiIsImF2ZERldmljZSIsImF2ZEFyZ3MiLCJ0b0xvd2VyQ2FzZSIsIm1hbmlmZXN0UGF5bG9hZCIsImdldFBhY2thZ2VJbmZvIiwidmVyc2lvbiIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJhcHBJbmZvIiwiZ2V0TGF1bmNoSW5mbyIsImluaXREZXZpY2UiLCJpc0FuaW1hdGlvbk9uIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJ3YXNBbmltYXRpb25FbmFibGVkIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiaW5pdEVzcHJlc3NvU2VydmVyIiwiZm9yd2FyZFBvcnQiLCJza2lwVW5sb2NrIiwidW5sb2NrIiwiaW5pdEFVVCIsImFwcFdhaXRQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJxdWFsaWZ5QWN0aXZpdHlOYW1lIiwiYXBwV2FpdEFjdGl2aXR5Iiwic3RhcnRTZXNzaW9uIiwid2FpdEZvckFjdGl2aXR5IiwiYXBwV2FpdER1cmF0aW9uIiwiYXV0b1dlYnZpZXciLCJpbml0V2VidmlldyIsImFkZERldmljZUluZm9Ub0NhcHMiLCJ2aWV3TmFtZSIsImFuZHJvaWRDb21tYW5kcyIsImRlZmF1bHRXZWJ2aWV3TmFtZSIsImNhbGwiLCJ0aW1lb3V0IiwiYXV0b1dlYnZpZXdUaW1lb3V0IiwicmV0cnlJbnRlcnZhbCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsIkVzcHJlc3NvUnVubmVyIiwiaG9zdCIsInJlbW90ZUFkYkhvc3QiLCJkZXZpY2VQb3J0IiwiYXBrIiwidG1wRGlyIiwiZm9yY2VFc3ByZXNzb1JlYnVpbGQiLCJlc3ByZXNzb0J1aWxkQ29uZmlnIiwic2hvd0dyYWRsZUxvZyIsInNlcnZlckxhdW5jaFRpbWVvdXQiLCJlc3ByZXNzb1NlcnZlckxhdW5jaFRpbWVvdXQiLCJza2lwU2VydmVySW5zdGFsbGF0aW9uIiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicHJveHlSZXFSZXMiLCJwcm94eUNvbW1hbmQiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwicGFyc2VBcnJheSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJURVNUX0FQS19QS0ciLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsInNraXBVbmluc3RhbGwiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiaW5zdGFsbFRlc3RBcGsiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJzdGRlcnIiLCJzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MiLCJfc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcyIsInN0b3BSZWNvcmRpbmdTY3JlZW4iLCJtb2JpbGVJc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmciLCJtb2JpbGVTdG9wTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIiwiX3NjcmVlblN0cmVhbWluZ1Byb3BzIiwibW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyIsInJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyIsInNlcnZlciIsIkIiLCJhbGwiLCJ0YXNrIiwiaWduIiwiZG9udFN0b3BBcHBPblJlc2V0IiwiZm9yY2VTdG9wIiwic3RvcExvZ2NhdCIsImF2ZE5hbWUiLCJraWxsRW11bGF0b3IiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IiwidW5kZWZpbmVkIiwicmVtb3ZlUG9ydEZvcndhcmQiLCJlcnJvciIsInByb3h5QWN0aXZlIiwiY2FuUHJveHkiLCJnZXRQcm94eUF2b2lkTGlzdCIsImlzTmlsIiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsImlzQ2hyb21lQnJvd3NlciIsImJyb3dzZXJOYW1lIiwiaXNQYWNrYWdlT3JCdW5kbGUiLCJleHBvcnRzIiwiY21kIiwiZm4iLCJ0b1BhaXJzIiwicHJvdG90eXBlIiwiY29tbWFuZHMiLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9saWIvZHJpdmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIGVycm9ycywgaXNFcnJvclR5cGUsIERldmljZVNldHRpbmdzfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7IEVzcHJlc3NvUnVubmVyLCBURVNUX0FQS19QS0cgfSBmcm9tICcuL2VzcHJlc3NvLXJ1bm5lcic7XG5pbXBvcnQgeyBmcywgdGVtcERpciwgemlwIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHsgYW5kcm9pZEhlbHBlcnMsIGFuZHJvaWRDb21tYW5kcywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgfSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDYXBDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBxdWFsaWZ5QWN0aXZpdHlOYW1lLCBnZXRQYWNrYWdlSW5mbyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgbmV3TWV0aG9kTWFwIH0gZnJvbSAnLi9tZXRob2QtbWFwJztcblxuXG4vLyBUT0RPIG1lcmdlIG91ciBvd24gaGVscGVycyBvbnRvIHRoaXMgbGF0ZXJcbmNvbnN0IGhlbHBlcnMgPSBhbmRyb2lkSGVscGVycztcblxuLy8gVGhlIHJhbmdlIG9mIHBvcnRzIHdlIGNhbiB1c2Ugb24gdGhlIHN5c3RlbSBmb3IgY29tbXVuaWNhdGluZyB0byB0aGVcbi8vIEVzcHJlc3NvIEhUVFAgc2VydmVyIG9uIHRoZSBkZXZpY2VcbmNvbnN0IFNZU1RFTV9QT1JUX1JBTkdFID0gWzgzMDAsIDgzOTldO1xuXG4vLyBUaGlzIGlzIHRoZSBwb3J0IHRoYXQgdGhlIGVzcHJlc3NvIHNlcnZlciBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuIFdlIHdpbGxcbi8vIGZvcndhcmQgb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGUgZGV2aWNlLlxuY29uc3QgREVWSUNFX1BPUlQgPSA2NzkxO1xuXG4vLyBOT19QUk9YWSBjb250YWlucyB0aGUgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIGVzcHJlc3NvIHNlcnZlci5cbi8vIFRPRE86ICBBZGQgdGhlIGxpc3Qgb2YgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIGVzcHJlc3NvIHNlcnZlci5cbi8vIFRPRE86IE5lZWQgdG8gc2VncmVnYXRlIHRoZSBwYXRocyBiZXR0ZXIgd2F5IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hlcmV2ZXIgYXBwbGljYWJsZS5cbi8vIChOb3Qgc2VncmVnYXRpbmcgcmlnaHQgYXdheSBiZWNhdXNlIG1vcmUgcGF0aHMgdG8gYmUgYWRkZWQgaW4gdGhlIE5PX1BST1hZIGxpc3QpXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vKD8hLiovKScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9jdXJyZW50X2FjdGl2aXR5JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2N1cnJlbnRfcGFja2FnZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9kaXNwbGF5X2RlbnNpdHknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvaXNfa2V5Ym9hcmRfc2hvd24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2Uvc3lzdGVtX2JhcnMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2Uvc3lzdGVtX3RpbWUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zZXR0aW5ncycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90aW1lb3V0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9iYWNrZ3JvdW5kJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9jbG9zZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvbGF1bmNoJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9yZXNldCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvc3RyaW5ncycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9jb21wYXJlX2ltYWdlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvYWN0aXZhdGVfYXBwJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9hcHBfaW5zdGFsbGVkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9hcHBfc3RhdGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2Zpbmdlcl9wcmludCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvZ2V0X2NsaXBib2FyZCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvaW5zdGFsbF9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2lzX2xvY2tlZCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvbG9jaycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvcHVsbF9maWxlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9wdWxsX2ZvbGRlcicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvcHVzaF9maWxlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9yZW1vdmVfYXBwJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9zdGFydF9hY3Rpdml0eScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvdGVybWluYXRlX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvdW5sb2NrJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2dldFBlcmZvcm1hbmNlRGF0YScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9wZXJmb3JtYW5jZURhdGEvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZXhlY3V0ZV9kcml2ZXInKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RhcnRfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdG9wX3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlX2FzeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90aW1lb3V0cycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZycpXSxcblxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZycpXSxcbl07XG5cbi8vIFRoaXMgaXMgYSBzZXQgb2YgbWV0aG9kcyBhbmQgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIENocm9tZWRyaXZlci5cbmNvbnN0IENIUk9NRV9OT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3JlY3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG5cbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgbW9iaWxlOiBjb21tYW5kcyB3b3JraW5nIGluIHdlYiBjb250ZXh0XG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZycpXSxcblxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZycpXSxcbl07XG5cblxuY29uc3QgQVBLX0VYVCA9ICcuYXBrJztcbmNvbnN0IEFBQl9FWFQgPSAnLmFhYic7XG5jb25zdCBTVVBQT1JURURfRVhURU5TSU9OUyA9IFtBUEtfRVhULCBBQUJfRVhUXTtcblxuY2xhc3MgRXNwcmVzc29Ecml2ZXIgZXh0ZW5kcyBCYXNlRHJpdmVyIHtcblxuICBzdGF0aWMgbmV3TWV0aG9kTWFwID0gbmV3TWV0aG9kTWFwO1xuXG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30sIHNob3VsZFZhbGlkYXRlQ2FwcyA9IHRydWUpIHtcbiAgICAvLyBgc2hlbGxgIG92ZXJ3cml0ZXMgYWRiLnNoZWxsLCBzbyByZW1vdmVcbiAgICBkZWxldGUgb3B0cy5zaGVsbDtcblxuICAgIHN1cGVyKG9wdHMsIHNob3VsZFZhbGlkYXRlQ2Fwcyk7XG4gICAgdGhpcy5sb2NhdG9yU3RyYXRlZ2llcyA9IFtcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgXTtcbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBDb25zdHJhaW50cztcbiAgICB0aGlzLmVzcHJlc3NvID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG5cbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTsgLy8gbWFwIG9mIGxhbmd1YWdlIC0+IHN0cmluZ3Mgb2JqXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7fSwgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2FwcylcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgJ2Jyb3dzZXJOYW1lJyBjYXBhYmlsaXR5IHdpbGwgYmUgaWdub3JlZGApO1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oYENocm9tZSBicm93c2VyIGNhbm5vdCBiZSBydW4gaW4gRXNwcmVzc28gc2Vzc2lvbnMgYmVjYXVzZSBFc3ByZXNzbyBhdXRvbWF0aW9uIGRvZXNuJ3QgYCArXG4gICAgICAgICAgICAgIGBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIENocm9tZWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENocm9tZSBicm93c2VyIHNlc3Npb25zIGNhbm5vdCBiZSBydW4gaW4gRXNwcmVzc28gYmVjYXVzZSBFc3ByZXNzbyBgICtcbiAgICAgICAgICAgIGBhdXRvbWF0aW9uIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyBDaHJvbWVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICAgIHRoaXMuYWRkV2lwZURhdGFUb0F2ZEFyZ3MoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSB0aGlzLm9wdHMuc3lzdGVtUG9ydFxuICAgICAgICB8fCBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShTWVNURU1fUE9SVF9SQU5HRVswXSwgU1lTVEVNX1BPUlRfUkFOR0VbMV0pO1xuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGNvbnN0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICAgIHRoaXMub3B0cy51ZGlkID0gdWRpZDtcbiAgICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG4gICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgICAgLy8gQURCIGluc3RhbmNlXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLmNyZWF0ZUFEQih0aGlzLm9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIHtcbiAgICAgICAgICBvblBvc3RQcm9jZXNzOiB0aGlzLm9uUG9zdENvbmZpZ3VyZUFwcC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHN1cHBvcnRlZEV4dGVuc2lvbnM6IFNVUFBPUlRFRF9FWFRFTlNJT05TXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcE9uRGV2aWNlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICB0aGlzLmxvZy5pbmZvKGBBcHAgZmlsZSB3YXMgbm90IGxpc3RlZCwgaW5zdGVhZCB3ZSdyZSBnb2luZyB0byBydW4gYCArXG4gICAgICAgICAgICBgJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0gZGlyZWN0bHkgb24gdGhlIGRldmljZWApO1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBmaW5kIHRoZSBwYWNrYWdlICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgYCArXG4gICAgICAgICAgICBgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0RXNwcmVzc29TZXNzaW9uKCk7XG4gICAgICByZXR1cm4gW3Nlc3Npb25JZCwgY2Fwc107XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICBlLm1lc3NhZ2UgKz0gYCR7Xy5lbmRzV2l0aChlLm1lc3NhZ2UsICcuJykgPyAnJyA6ICcuJ30gQ2hlY2sgYCArXG4gICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS1lc3ByZXNzby1kcml2ZXIjdHJvdWJsZXNob290aW5nICcgK1xuICAgICAgICAncmVnYXJkaW5nIGFkdmFuY2VkIHNlc3Npb24gc3RhcnR1cCB0cm91Ymxlc2hvb3RpbmcuJztcbiAgICAgIGlmIChpc0Vycm9yVHlwZShlLCBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVyciA9IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgZXJyLnN0YWNrID0gZS5zdGFjaztcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW56aXAgdGhlIGdpdmVuIGFwcCBwYXRoIGFuZCByZXR1cm4gdGhlIGZpcnN0IHBhY2thZ2UgdGhhdCBoYXMgU1VQUE9SVEVEX0VYVEVOU0lPTlNcbiAgICogaW4gdGhlIGFyY2hpdmVkIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIFRoZSBwYXRoIHRvIGFwcCBmaWxlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1bnMgdGhlIHBhdGggdG8gYW4gdW56aXBwZWQgYXBwIGZpbGUgcGF0aC5cbiAgICogQHRocm93cyBSYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIHppcCBkaWQgbm90IGhhdmUgYW55IFNVUFBPUlRFRF9FWFRFTlNJT05TIHBhY2thZ2VzLlxuICAgKi9cbiAgYXN5bmMgdW56aXBBcHAgKGFwcFBhdGgpIHtcbiAgICBjb25zdCB1c2VTeXN0ZW1VbnppcEVudiA9IHByb2Nlc3MuZW52LkFQUElVTV9QUkVGRVJfU1lTVEVNX1VOWklQO1xuICAgIGNvbnN0IHVzZVN5c3RlbVVuemlwID0gXy5pc0VtcHR5KHVzZVN5c3RlbVVuemlwRW52KVxuICAgICAgfHwgIVsnMCcsICdmYWxzZSddLmluY2x1ZGVzKF8udG9Mb3dlcih1c2VTeXN0ZW1VbnppcEVudikpO1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKGFwcFBhdGgsIHRtcFJvb3QsIHt1c2VTeXN0ZW1VbnppcH0pO1xuXG4gICAgY29uc3QgZ2xvYlBhdHRlcm4gPSBgKiovKi4rKCR7U1VQUE9SVEVEX0VYVEVOU0lPTlMubWFwKChleHQpID0+IGV4dC5yZXBsYWNlKC9eXFwuLywgJycpKS5qb2luKCd8Jyl9KWA7XG4gICAgY29uc3Qgc29ydGVkQnVuZGxlSXRlbXMgPSAoYXdhaXQgZnMuZ2xvYihnbG9iUGF0dGVybiwge1xuICAgICAgY3dkOiB0bXBSb290LFxuICAgICAgc3RyaWN0OiBmYWxzZSxcbiAgICB9KSkuc29ydCgoYSwgYikgPT4gYS5zcGxpdChwYXRoLnNlcCkubGVuZ3RoIC0gYi5zcGxpdChwYXRoLnNlcCkubGVuZ3RoKTtcbiAgICBpZiAoc29ydGVkQnVuZGxlSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBubyBleHBlY3RlZCBwYWNrYWdlcyBpbiB0aGUgemlwXG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGAke3RoaXMub3B0cy5hcHB9IGRpZCBub3QgaGF2ZSBhbnkgb2YgJyR7U1VQUE9SVEVEX0VYVEVOU0lPTlMuam9pbignLCAnKX0nIGAgK1xuICAgICAgICBgZXh0ZW5zaW9uIHBhY2thZ2VzLiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBwcm92aWRlZCAuemlwIGFyY2hpdmUgY29udGFpbnMgYXQgbGVhc3Qgb25lIHZhbGlkIGFwcGxpY2F0aW9uIHBhY2thZ2UuYCk7XG4gICAgfVxuICAgIGNvbnN0IHVuemlwcGVkQXBwUGF0aCA9IHBhdGguam9pbih0bXBSb290LCBfLmZpcnN0KHNvcnRlZEJ1bmRsZUl0ZW1zKSk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCcke3VuemlwcGVkQXBwUGF0aH0nIGlzIHRoZSB1bnppcHBlZCBmaWxlIGZyb20gJyR7YXBwUGF0aH0nYCk7XG4gICAgcmV0dXJuIHVuemlwcGVkQXBwUGF0aDtcbiAgfVxuXG4gIGFzeW5jIG9uUG9zdENvbmZpZ3VyZUFwcCAoe2NhY2hlZEFwcEluZm8sIGlzVXJsLCBhcHBQYXRofSkge1xuICAgIGNvbnN0IHByZXNpZ25BcHAgPSBhc3luYyAoYXBwTG9jYXRpb24pID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdHMubm9TaWduKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1NraXBwaW5nIGFwcGxpY2F0aW9uIHNpZ25pbmcgYmVjYXVzZSBub1NpZ24gY2FwYWJpbGl0eSBpcyBzZXQgdG8gdHJ1ZS4gJyArXG4gICAgICAgICAgJ0hhdmluZyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB3aXRoIGltcHJvcGVyIHNpZ25hdHVyZS9ub24tc2lnbmVkIHdpbGwgY2F1c2UgJyArXG4gICAgICAgICAgJ0VzcHJlc3NvIGF1dG9tYXRpb24gc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfSBlbHNlIGlmICghYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcExvY2F0aW9uLCB0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2lnbihhcHBMb2NhdGlvbiwgdGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYXNBcGtFeHQgPSAoYXBwUGF0aCkgPT4gXy5lbmRzV2l0aChfLnRvTG93ZXIoYXBwUGF0aCksIEFQS19FWFQpO1xuICAgIGNvbnN0IGhhc0FhYkV4dCA9IChhcHBQYXRoKSA9PiBfLmVuZHNXaXRoKF8udG9Mb3dlcihhcHBQYXRoKSwgQUFCX0VYVCk7XG4gICAgY29uc3QgZXh0cmFjdFVuaXZlcnNhbEFwayA9IGFzeW5jIChzaG91bGRFeHRyYWN0LCBhcHBQYXRoKSA9PlxuICAgICAgc2hvdWxkRXh0cmFjdCA/IGFwcFBhdGggOiBhd2FpdCB0aGlzLmFkYi5leHRyYWN0VW5pdmVyc2FsQXBrKGFwcFBhdGgpO1xuXG4gICAgbGV0IHBhdGhJbkNhY2hlID0gbnVsbDtcbiAgICBsZXQgaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCA9IGZhbHNlO1xuICAgIGlmIChfLmlzUGxhaW5PYmplY3QoY2FjaGVkQXBwSW5mbykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VIYXNoID0gYXdhaXQgZnMuaGFzaChhcHBQYXRoKTtcbiAgICAgIGlmIChwYWNrYWdlSGFzaCA9PT0gY2FjaGVkQXBwSW5mby5wYWNrYWdlSGFzaCAmJiBhd2FpdCBmcy5leGlzdHMoY2FjaGVkQXBwSW5mby5mdWxsUGF0aCkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgJyR7Y2FjaGVkQXBwSW5mby5mdWxsUGF0aH0nIHdoaWNoIGlzIGNhY2hlZCBmcm9tICcke2FwcFBhdGh9J2ApO1xuICAgICAgICBpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkID0gdHJ1ZTtcbiAgICAgICAgcGF0aEluQ2FjaGUgPSBjYWNoZWRBcHBJbmZvLmZ1bGxQYXRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFwcFBhdGggY2FuIGJlIC56aXAsIC5hcGsgb3IgLmFhYlxuICAgIGNvbnN0IGlzQXBrID0gaGFzQXBrRXh0KGFwcFBhdGgpO1xuICAgIC8vIE9ubHkgbG9jYWwgLmFwayBmaWxlcyB0aGF0IGFyZSBhdmFpbGFibGUgaW4tcGxhY2Ugc2hvdWxkIG5vdCBiZSBjYWNoZWRcbiAgICBjb25zdCBzaG91bGRSZXN1bHRBcHBQYXRoQmVDYWNoZWQgPSAhaXNBcGsgfHwgKGlzQXBrICYmIGlzVXJsKTtcblxuICAgIGlmICghaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCkge1xuICAgICAgaWYgKHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCkge1xuICAgICAgICAvLyAuemlwLCAuYWFiIG9yIGRvd25sb2FkZWQgLmFwa1xuXG4gICAgICAgIGxldCB1bnppcHBlZEFwcFBhdGg7XG4gICAgICAgIGxldCBpc1VuemlwcGVkQXBrID0gZmFsc2U7XG4gICAgICAgIGlmICghKGhhc0Fwa0V4dChhcHBQYXRoKSB8fCBoYXNBYWJFeHQoYXBwUGF0aCkpKSB7XG4gICAgICAgICAgdW56aXBwZWRBcHBQYXRoID0gYXdhaXQgdGhpcy51bnppcEFwcChhcHBQYXRoKTtcbiAgICAgICAgICBpc1VuemlwcGVkQXBrID0gaGFzQXBrRXh0KHVuemlwcGVkQXBwUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1bnppcHBlZEFwcFBhdGggb3IgYXBwUGF0aCBoYXMgU1VQUE9SVEVEX0VYVEVOU0lPTlMuXG4gICAgICAgIHBhdGhJbkNhY2hlID0gdW56aXBwZWRBcHBQYXRoXG4gICAgICAgICAgPyBhd2FpdCBleHRyYWN0VW5pdmVyc2FsQXBrKGlzVW56aXBwZWRBcGssIHVuemlwcGVkQXBwUGF0aClcbiAgICAgICAgICA6IGF3YWl0IGV4dHJhY3RVbml2ZXJzYWxBcGsoaXNBcGssIGFwcFBhdGgpO1xuXG4gICAgICAgIGlmICghaXNBcGsgJiYgaXNVcmwpIHtcbiAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgdGVtcG9yYXJpbHkgZG93bmxvYWRlZCAuYWFiIG9yIC56aXAgcGFja2FnZVxuICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZihhcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzQWFiRXh0KHVuemlwcGVkQXBwUGF0aCkpIHtcbiAgICAgICAgICAvLyBDbGVhbnVwIHRoZSBsb2NhbCB1bnppcHBlZCAuYWFiIGZpbGVcbiAgICAgICAgICBhd2FpdCBmcy5yaW1yYWYodW56aXBwZWRBcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBwcmVzaWduQXBwKHBhdGhJbkNhY2hlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcGspIHtcbiAgICAgICAgLy8gSXQgaXMgcHJvYmFibHkgbm90IHRoZSBiZXN0IGlkZWEgdG8gbW9kaWZ5IHRoZSBwcm92aWRlZCBhcHAgaW4tcGxhY2UsXG4gICAgICAgIC8vIGJ1dCB0aGlzIGlzIGhvdyBpdCB3YXMgYWx3YXlzIHdvcmtpbmdcbiAgICAgICAgYXdhaXQgcHJlc2lnbkFwcChhcHBQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCA/IHthcHBQYXRoOiBwYXRoSW5DYWNoZX0gOiBmYWxzZTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGxlIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBpc0VtdWxhdG9yICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0VtdWxhdG9yKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyLWRyaXZlcjsgY29uc29saWRhdGVcbiAgc2V0QXZkRnJvbUNhcGFiaWxpdGllcyAoY2Fwcykge1xuICAgIGlmICh0aGlzLm9wdHMuYXZkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdhdmQgbmFtZSBkZWZpbmVkLCBpZ25vcmluZyBkZXZpY2UgbmFtZSBhbmQgcGxhdGZvcm0gdmVyc2lvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNhcHMuZGV2aWNlTmFtZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdhdmQgb3IgZGV2aWNlTmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNhcHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBwbGF0Zm9ybVZlcnNpb24gc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGF2ZERldmljZSA9IGNhcHMuZGV2aWNlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8uXS9nLCAnLScpO1xuICAgICAgdGhpcy5vcHRzLmF2ZCA9IGAke2F2ZERldmljZX1fXyR7Y2Fwcy5wbGF0Zm9ybVZlcnNpb259YDtcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjItZHJpdmVyOyBjb25zb2xpZGF0ZVxuICBhZGRXaXBlRGF0YVRvQXZkQXJncyAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuYXZkQXJncykge1xuICAgICAgdGhpcy5vcHRzLmF2ZEFyZ3MgPSAnLXdpcGUtZGF0YSc7XG4gICAgfSBlbHNlIGlmICghdGhpcy5vcHRzLmF2ZEFyZ3MudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnLXdpcGUtZGF0YScpKSB7XG4gICAgICB0aGlzLm9wdHMuYXZkQXJncyArPSAnIC13aXBlLWRhdGEnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gbXVjaCBvZiB0aGlzIGxvZ2ljIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjJcbiAgYXN5bmMgc3RhcnRFc3ByZXNzb1Nlc3Npb24gKCkge1xuICAgIGNvbnN0IHttYW5pZmVzdFBheWxvYWR9ID0gYXdhaXQgZ2V0UGFja2FnZUluZm8oKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBFc3ByZXNzb0RyaXZlciB2ZXJzaW9uOiAke21hbmlmZXN0UGF5bG9hZC52ZXJzaW9ufWApO1xuXG4gICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS1hbmRyb2lkLWRyaXZlci9wdWxsLzQ2MSB3aGF0IGhhcHBlbnMgaWYgdGhlciBpcyBubyBzZXRIaWRkZW5BcGlQb2xpY3kgZm9yIEFuZHJvaWQgUCtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgIHRoaXMubG9nLndhcm4oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBsZXQgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICBpZiAoYXBwSW5mbykge1xuICAgICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBJbmZvID0gdGhpcy5vcHRzO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyL2lzc3Vlcy83MlxuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy53YXNBbmltYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdHVybiBvZmYgYW5pbWF0aW9uczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkXG4gICAgdGhpcy5jYXBzLmRldmljZU5hbWUgPSB0aGlzLmFkYi5jdXJEZXZpY2VJZDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlVURJRCA9IHRoaXMub3B0cy51ZGlkO1xuXG4gICAgLy8gc2V0IHVwIHRoZSBtb2RpZmllZCBlc3ByZXNzbyBzZXJ2ZXIgZXRjXG4gICAgdGhpcy5pbml0RXNwcmVzc29TZXJ2ZXIoKTtcbiAgICAvLyBGdXJ0aGVyIHByZXBhcmUgdGhlIGRldmljZSBieSBmb3J3YXJkaW5nIHRoZSBlc3ByZXNzbyBwb3J0XG4gICAgdGhpcy5sb2cuZGVidWcoYEZvcndhcmRpbmcgRXNwcmVzc28gU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gJHt0aGlzLm9wdHMuc3lzdGVtUG9ydH1gKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCwgREVWSUNFX1BPUlQpO1xuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gdW5sb2NrIHRoZSBkZXZpY2UgdG8gcHJlcGFyZSBpdCBmb3IgdGVzdGluZ1xuICAgICAgYXdhaXQgaGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHRoaXMuY2Fwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvL0FkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UgPSBhcHBJbmZvLmFwcFdhaXRQYWNrYWdlIHx8IGFwcEluZm8uYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwQWN0aXZpdHksIHRoaXMuY2Fwcy5hcHBQYWNrYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwUGFja2FnZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcFdhaXRBY3Rpdml0eSB8fCBhcHBJbmZvLmFwcEFjdGl2aXR5IHx8IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSxcbiAgICAgICAgdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggZXNwcmVzc28gYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG4gICAgaWYgKHRoaXMuY2Fwcy5hdXRvTGF1bmNoID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IHdhaXRpbmcgZm9yIHRoZSBhcHBsaWNhdGlvbiBhY3Rpdml0eSB0byBzdGFydCBiZWNhdXNlICdhdXRvTGF1bmNoJyBpcyBkaXNhYmxlZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yQWN0aXZpdHkodGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlLCB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uKTtcbiAgICB9XG4gICAgLy8gaWYgd2Ugd2FudCB0byBpbW1lZGlhdGVseSBnZXQgaW50byBhIHdlYnZpZXcsIHNldCBvdXIgY29udGV4dFxuICAgIC8vIGFwcHJvcHJpYXRlbHlcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRXZWJ2aWV3KCk7XG4gICAgfVxuXG4gICAgLy8gbm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHR1cm4gb24gcHJveHlpbmcgc28gYWxsXG4gICAgLy8gc3Vic2VxdWVudCBzZXNzaW9uIHJlcXVlc3RzIGdvIHN0cmFpZ2h0IHRvL2Zyb20gZXNwcmVzc29cbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcblxuICAgIGF3YWl0IHRoaXMuYWRkRGV2aWNlSW5mb1RvQ2FwcygpO1xuICB9XG5cbiAgYXN5bmMgaW5pdFdlYnZpZXcgKCkge1xuICAgIGNvbnN0IHZpZXdOYW1lID0gYW5kcm9pZENvbW1hbmRzLmRlZmF1bHRXZWJ2aWV3TmFtZS5jYWxsKHRoaXMpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLm9wdHMuYXV0b1dlYnZpZXdUaW1lb3V0IHx8IDIwMDA7XG4gICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyB3ZWJ2aWV3IHRvIGNvbnRleHQgJyR7dmlld05hbWV9JyB3aXRoIHRpbWVvdXQgJHt0aW1lb3V0fW1zYCk7XG4gICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIHRoaXMuc2V0Q29udGV4dC5iaW5kKHRoaXMpLCB2aWV3TmFtZSk7XG4gIH1cblxuICBhc3luYyBhZGREZXZpY2VJbmZvVG9DYXBzICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgICAgbWFudWZhY3R1cmVyLFxuICAgICAgbW9kZWwsXG4gICAgICByZWFsRGlzcGxheVNpemUsXG4gICAgICBkaXNwbGF5RGVuc2l0eSxcbiAgICB9ID0gYXdhaXQgdGhpcy5tb2JpbGVHZXREZXZpY2VJbmZvKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZUFwaUxldmVsID0gcGFyc2VJbnQoYXBpVmVyc2lvbiwgMTApO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBwbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlblNpemUgPSByZWFsRGlzcGxheVNpemU7XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlbkRlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyO1xuICB9XG5cbiAgaW5pdEVzcHJlc3NvU2VydmVyICgpIHtcbiAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHBhY2thZ2UgYW5kIGFjdGl2aXR5LCB3ZSBjYW4gY3JlYXRlIGFuIGluc3RhbmNlIG9mXG4gICAgLy8gZXNwcmVzc28gd2l0aCB0aGUgYXBwcm9wcmlhdGUgZGF0YVxuICAgIHRoaXMuZXNwcmVzc28gPSBuZXcgRXNwcmVzc29SdW5uZXIodGhpcy5sb2csIHtcbiAgICAgIGhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0IHx8IHRoaXMub3B0cy5ob3N0IHx8ICcxMjcuMC4wLjEnLFxuICAgICAgc3lzdGVtUG9ydDogdGhpcy5vcHRzLnN5c3RlbVBvcnQsXG4gICAgICBkZXZpY2VQb3J0OiBERVZJQ0VfUE9SVCxcbiAgICAgIGFkYjogdGhpcy5hZGIsXG4gICAgICBhcGs6IHRoaXMub3B0cy5hcHAsXG4gICAgICB0bXBEaXI6IHRoaXMub3B0cy50bXBEaXIsXG4gICAgICBhcHBQYWNrYWdlOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgIGFwcEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgICBmb3JjZUVzcHJlc3NvUmVidWlsZDogISF0aGlzLm9wdHMuZm9yY2VFc3ByZXNzb1JlYnVpbGQsXG4gICAgICBlc3ByZXNzb0J1aWxkQ29uZmlnOiB0aGlzLm9wdHMuZXNwcmVzc29CdWlsZENvbmZpZyxcbiAgICAgIHNob3dHcmFkbGVMb2c6ICEhdGhpcy5vcHRzLnNob3dHcmFkbGVMb2csXG4gICAgICBzZXJ2ZXJMYXVuY2hUaW1lb3V0OiB0aGlzLm9wdHMuZXNwcmVzc29TZXJ2ZXJMYXVuY2hUaW1lb3V0LFxuICAgICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiB0aGlzLm9wdHMuYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgICAgc2tpcFNlcnZlckluc3RhbGxhdGlvbjogdGhpcy5vcHRzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24sXG4gICAgICB1c2VLZXlzdG9yZTogdGhpcy5vcHRzLnVzZUtleXN0b3JlLFxuICAgICAga2V5c3RvcmVQYXRoOiB0aGlzLm9wdHMua2V5c3RvcmVQYXRoLFxuICAgICAga2V5c3RvcmVQYXNzd29yZDogdGhpcy5vcHRzLmtleXN0b3JlUGFzc3dvcmQsXG4gICAgICBrZXlBbGlhczogdGhpcy5vcHRzLmtleUFsaWFzLFxuICAgICAga2V5UGFzc3dvcmQ6IHRoaXMub3B0cy5rZXlQYXNzd29yZCxcbiAgICAgIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB0aGlzLm9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UsXG4gICAgfSk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuZXNwcmVzc28ucHJveHlSZXFSZXMuYmluZCh0aGlzLmVzcHJlc3NvKTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuZXNwcmVzc28ucHJveHlDb21tYW5kLmJpbmQodGhpcy5lc3ByZXNzbyk7XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIG1vc3RseSBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIHNldCB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlIGZyb20gdGhlIGFwa1xuICAgIC8vIFRPRE86IGluY29ycG9yYXRlIGNoYW5nZXMgZnJvbSBhcHBpdW0jNTMwOCB3aGljaCBmaXggYSByYWNlIGNvbmQtXG4gICAgLy8gaXRpb24gYnVnIGluIG9sZCBhcHBpdW0gYW5kIG5lZWQgdG8gYmUgcmVwbGljYXRlZCBoZXJlXG4gICAgLy8gdGhpcy5hcGtTdHJpbmdzW3RoaXMub3B0cy5sYW5ndWFnZV0gPSBhd2FpdCBhbmRyb2lkSGVscGVycy5wdXNoU3RyaW5ncyhcbiAgICAvLyAgICAgdGhpcy5vcHRzLmxhbmd1YWdlLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcblxuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMoXG4gICAgICAgIHRoaXMuYWRiLFxuICAgICAgICBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpLFxuICAgICAgICBbU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgVEVTVF9BUEtfUEtHXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0cy5hcHApIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0KSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0Z1bGwgcmVzZXQgcmVxdWlyZXMgYW4gYXBwIGNhcGFiaWxpdHksIHVzZSBmYXN0UmVzZXQgaWYgYXBwIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0KSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1Zygnc2tpcFNlcnZlckluc3RhbGxhdGlvbiBjYXBhYmlsaXR5IGlzIHNldC4gTm90IGluc3RhbGxpZyBlc3ByZXNzby1zZXJ2ZXIgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uaW5zdGFsbFRlc3RBcGsoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdChTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBURVNUX0FQS19QS0cpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0RlbGV0aW5nIGVzcHJlc3NvIHNlc3Npb24nKTtcblxuICAgIGNvbnN0IHNjcmVlblJlY29yZGluZ1N0b3BUYXNrcyA9IFthc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5tb2JpbGVJc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmcoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcoKTtcbiAgICAgIH1cbiAgICB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nKCk7XG4gICAgICB9XG4gICAgfV07XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGlmICh0aGlzLmVzcHJlc3NvKSB7XG4gICAgICBpZiAodGhpcy5qd3BQcm94eUFjdGl2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVzcHJlc3NvLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXNwcmVzc28gPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5hZGIpIHtcbiAgICAgIGF3YWl0IEIuYWxsKHNjcmVlblJlY29yZGluZ1N0b3BUYXNrcy5tYXAoKHRhc2spID0+IHtcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGFzaygpO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAgICAgfSkoKTtcbiAgICAgIH0pKTtcbiAgICAgIGlmICh0aGlzLndhc0FuaW1hdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZSh0cnVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHJlc2V0IGFuaW1hdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzQ2hyb21lU2Vzc2lvbiAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsICYmICF0aGlzLmFwcE9uRGV2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBGVUxMX1JFU0VUIHNldCB0byAndHJ1ZScsIFVuaW5zdGFsbGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICBsZXQgYXZkTmFtZSA9IHRoaXMub3B0cy5hdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYGNsb3NpbmcgZW11bGF0b3IgJyR7YXZkTmFtZX0nYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7IC8vIEFuZHJvaWQgUFxuICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZXN0b3JpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gdGhlIGRldmljZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSghIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICBpZiAodGhpcy5vcHRzLnN5c3RlbVBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHJlbW92ZSBwb3J0IGZvcndhcmQgJyR7ZXJyb3IubWVzc2FnZX0nYCk7XG4gICAgICAgIC8vSWdub3JlLCB0aGlzIGJsb2NrIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2hlbiB3ZSBmYWxsIGluIGNhdGNoIGJsb2NrXG4gICAgICAgIC8vIGFuZCBiZWZvcmUgZXZlbiBwb3J0IGZvcndhcmQuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25TZXR0aW5nc1VwZGF0ZSAoKSB7XG4gICAgLy8gaW50ZW50aW9uYWxseSBkbyBub3RoaW5nIGhlcmUsIHNpbmNlIGNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzIHByb3hpZXNcbiAgICAvLyBzZXR0aW5ncyB0byB0aGUgZXNwcmVzc28gc2VydmVyIGFscmVhZHlcbiAgfVxuXG4gIHByb3h5QWN0aXZlIChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5wcm94eUFjdGl2ZShzZXNzaW9uSWQpO1xuXG4gICAgLy8gd2UgYWx3YXlzIGhhdmUgYW4gYWN0aXZlIHByb3h5IHRvIHRoZSBlc3ByZXNzbyBzZXJ2ZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNhblByb3h5IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5jYW5Qcm94eShzZXNzaW9uSWQpO1xuXG4gICAgLy8gd2UgY2FuIGFsd2F5cyBwcm94eSB0byB0aGUgZXNwcmVzc28gc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuZ2V0UHJveHlBdm9pZExpc3Qoc2Vzc2lvbklkKTtcbiAgICAvLyB3ZSBhcmUgbWFpbnRhaW5pbmcgdHdvIHNldHMgb2YgTk9fUFJPWFkgbGlzdHMsIG9uZSBmb3IgY2hyb21lZHJpdmVyKENIUk9NRV9OT19QUk9YWSlcbiAgICAvLyBhbmQgb25lIGZvciBFc3ByZXNzbyhOT19QUk9YWSksIGJhc2VkIG9uIGN1cnJlbnQgY29udGV4dCB3aWxsIHJldHVybiByZWxhdGVkIE5PX1BST1hZIGxpc3RcbiAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBfLmlzTmlsKHRoaXMuY2hyb21lZHJpdmVyKSA/IE5PX1BST1hZIDogQ0hST01FX05PX1BST1hZO1xuICAgIGlmICh0aGlzLm9wdHMubmF0aXZlV2ViU2NyZWVuc2hvdCkge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gWy4uLnRoaXMuandwUHJveHlBdm9pZCwgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuandwUHJveHlBdm9pZDtcbiAgfVxuXG4gIGdldCBpc0Nocm9tZVNlc3Npb24gKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzQ2hyb21lQnJvd3Nlcih0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICB9XG5cbiAgZ2V0IGFwcE9uRGV2aWNlICgpIHtcbiAgICByZXR1cm4gIXRoaXMub3B0cy5hcHAgJiYgdGhpcy5oZWxwZXJzLmlzUGFja2FnZU9yQnVuZGxlKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgfVxufVxuXG4vLyBmaXJzdCBhZGQgdGhlIGFuZHJvaWQtZHJpdmVyIGNvbW1hbmRzIHdoaWNoIHdlIHdpbGwgZmFsbCBiYWNrIHRvXG5mb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGFuZHJvaWRDb21tYW5kcykpIHtcbiAgLy8gd2UgZG8gc29tZSBkaWZmZXJlbnQvc3BlY2lhbCB0aGluZ3Mgd2l0aCB0aGVzZSBtZXRob2RzXG4gIGlmICghXy5pbmNsdWRlcyhbJ2RlZmF1bHRXZWJ2aWV3TmFtZSddLCBjbWQpKSB7XG4gICAgRXNwcmVzc29Ecml2ZXIucHJvdG90eXBlW2NtZF0gPSBmbjtcbiAgfVxufVxuXG4vLyB0aGVuIG92ZXJ3cml0ZSB3aXRoIGFueSBlc3ByZXNzby1zcGVjaWZpYyBjb21tYW5kc1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhjb21tYW5kcykpIHtcbiAgRXNwcmVzc29Ecml2ZXIucHJvdG90eXBlW2NtZF0gPSBmbjtcbn1cblxuZXhwb3J0IHsgRXNwcmVzc29Ecml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEVzcHJlc3NvRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGVBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLFVBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLG9CQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxZQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxZQUFBLEdBQUFWLE9BQUE7QUFDQSxJQUFBVyxTQUFBLEdBQUFYLE9BQUE7QUFDQSxJQUFBWSxNQUFBLEdBQUFaLE9BQUE7QUFDQSxJQUFBYSxVQUFBLEdBQUFiLE9BQUE7QUFJQSxNQUFNYyxPQUFPLEdBQUdDLG1DQUFjO0FBSTlCLE1BQU1DLGlCQUFpQixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUl0QyxNQUFNQyxXQUFXLEdBQUcsSUFBSTtBQU14QixNQUFNQyxRQUFRLEdBQUcsQ0FDZixDQUFDLEtBQUssRUFBRSxJQUFJQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUN4QyxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsZ0RBQWdELENBQUMsQ0FBQyxFQUNyRSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQyxFQUNwRSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQyxFQUNwRSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsaURBQWlELENBQUMsQ0FBQyxFQUN0RSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUNoRSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUNoRSxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxFQUN0RCxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxFQUM5QyxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxFQUMvQyxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUNoRCxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxFQUN6RCxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxFQUMvQyxDQUFDLEtBQUssRUFBRSxJQUFJQSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUMxQyxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxFQUM3RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxFQUN4RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxFQUN6RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxFQUN4RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxFQUMxRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxFQUM3RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQyxFQUNsRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxFQUNuRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQyxFQUMvRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQyxFQUNsRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxFQUNuRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUNqRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQyxFQUMvRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxFQUMxRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQyxFQUMvRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUNqRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQyxFQUMvRCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsMENBQTBDLENBQUMsQ0FBQyxFQUNoRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsOENBQThDLENBQUMsQ0FBQyxFQUNwRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxFQUNuRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxFQUM1RCxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUNqRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsOENBQThDLENBQUMsQ0FBQyxFQUNwRSxDQUFDLE1BQU0sRUFBRSxJQUFJQSxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxFQUN2RCxDQUFDLE1BQU0sRUFB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
461
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGF0aCIsIl9ibHVlYmlyZCIsIl9kcml2ZXIiLCJfZXNwcmVzc29SdW5uZXIiLCJfc3VwcG9ydCIsIl9jb21tYW5kcyIsIl9hcHBpdW1BZGIiLCJfYXBwaXVtQW5kcm9pZERyaXZlciIsIl9kZXNpcmVkQ2FwcyIsIl9wb3J0c2Nhbm5lciIsIl9hc3luY2JveCIsIl91dGlscyIsIl9tZXRob2RNYXAiLCJoZWxwZXJzIiwiYW5kcm9pZEhlbHBlcnMiLCJTWVNURU1fUE9SVF9SQU5HRSIsIkRFVklDRV9QT1JUIiwiTk9fUFJPWFkiLCJSZWdFeHAiLCJDSFJPTUVfTk9fUFJPWFkiLCJBUEtfRVhUIiwiQUFCX0VYVCIsIlNVUFBPUlRFRF9FWFRFTlNJT05TIiwiRXNwcmVzc29Ecml2ZXIiLCJCYXNlRHJpdmVyIiwibmV3TWV0aG9kTWFwIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwic2hlbGwiLCJsb2NhdG9yU3RyYXRlZ2llcyIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsImVzcHJlc3NvIiwiandwUHJveHlBY3RpdmUiLCJqd3BQcm94eUF2b2lkIiwiYXBrU3RyaW5ncyIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJvblNldHRpbmdzVXBkYXRlIiwiYmluZCIsImNocm9tZWRyaXZlciIsInNlc3Npb25DaHJvbWVkcml2ZXJzIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJjYXBzIiwic2VydmVyRGV0YWlscyIsInBsYXRmb3JtIiwid2ViU3RvcmFnZUVuYWJsZWQiLCJ0YWtlc1NjcmVlbnNob3QiLCJqYXZhc2NyaXB0RW5hYmxlZCIsImRhdGFiYXNlRW5hYmxlZCIsIm5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZCIsImxvY2F0aW9uQ29udGV4dEVuYWJsZWQiLCJ3YXJuaW5ncyIsImRlc2lyZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiZGVmYXVsdE9wdHMiLCJmdWxsUmVzZXQiLCJhdXRvTGF1bmNoIiwiYWRiUG9ydCIsIkRFRkFVTFRfQURCX1BPUlQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJfIiwiZGVmYXVsdHMiLCJpc0Nocm9tZVNlc3Npb24iLCJhcHAiLCJsb2ciLCJ3YXJuIiwiZXJyb3JBbmRUaHJvdyIsInJlYm9vdCIsInNldEF2ZEZyb21DYXBhYmlsaXRpZXMiLCJhZGRXaXBlRGF0YVRvQXZkQXJncyIsInN5c3RlbVBvcnQiLCJmaW5kQVBvcnROb3RJblVzZSIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJhZGIiLCJjcmVhdGVBREIiLCJjb25maWd1cmVBcHAiLCJvblBvc3RQcm9jZXNzIiwib25Qb3N0Q29uZmlndXJlQXBwIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImFwcE9uRGV2aWNlIiwiaW5mbyIsImFwcFBhY2thZ2UiLCJpc0FwcEluc3RhbGxlZCIsInN0YXJ0RXNwcmVzc29TZXNzaW9uIiwiZSIsImRlbGV0ZVNlc3Npb24iLCJtZXNzYWdlIiwiZW5kc1dpdGgiLCJpc0Vycm9yVHlwZSIsImVycm9ycyIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJlcnIiLCJzdGFjayIsInVuemlwQXBwIiwiYXBwUGF0aCIsInVzZVN5c3RlbVVuemlwRW52IiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9QUkVGRVJfU1lTVEVNX1VOWklQIiwidXNlU3lzdGVtVW56aXAiLCJpc0VtcHR5IiwiaW5jbHVkZXMiLCJ0b0xvd2VyIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwiemlwIiwiZXh0cmFjdEFsbFRvIiwiZ2xvYlBhdHRlcm4iLCJtYXAiLCJleHQiLCJyZXBsYWNlIiwiam9pbiIsInNvcnRlZEJ1bmRsZUl0ZW1zIiwiZnMiLCJnbG9iIiwiY3dkIiwic3RyaWN0Iiwic29ydCIsImEiLCJiIiwic3BsaXQiLCJwYXRoIiwic2VwIiwibGVuZ3RoIiwidW56aXBwZWRBcHBQYXRoIiwiZmlyc3QiLCJkZWJ1ZyIsImNhY2hlZEFwcEluZm8iLCJpc1VybCIsInByZXNpZ25BcHAiLCJhcHBMb2NhdGlvbiIsIm5vU2lnbiIsImNoZWNrQXBrQ2VydCIsInNpZ24iLCJoYXNBcGtFeHQiLCJoYXNBYWJFeHQiLCJleHRyYWN0VW5pdmVyc2FsQXBrIiwic2hvdWxkRXh0cmFjdCIsInBhdGhJbkNhY2hlIiwiaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCIsImlzUGxhaW5PYmplY3QiLCJwYWNrYWdlSGFzaCIsImhhc2giLCJleGlzdHMiLCJmdWxsUGF0aCIsImlzQXBrIiwic2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkIiwiaXNVbnppcHBlZEFwayIsInJpbXJhZiIsImRyaXZlckRhdGEiLCJpc0VtdWxhdG9yIiwiYXZkIiwiZGV2aWNlTmFtZSIsInBsYXRmb3JtVmVyc2lvbiIsImF2ZERldmljZSIsImF2ZEFyZ3MiLCJ0b0xvd2VyQ2FzZSIsIm1hbmlmZXN0UGF5bG9hZCIsImdldFBhY2thZ2VJbmZvIiwidmVyc2lvbiIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJhcHBJbmZvIiwiZ2V0TGF1bmNoSW5mbyIsImluaXREZXZpY2UiLCJzZXRXaW5kb3dBbmltYXRpb25TdGF0ZSIsImRpc2FibGVXaW5kb3dBbmltYXRpb24iLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJpbml0RXNwcmVzc29TZXJ2ZXIiLCJmb3J3YXJkUG9ydCIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJpbml0QVVUIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsInF1YWxpZnlBY3Rpdml0eU5hbWUiLCJhcHBXYWl0QWN0aXZpdHkiLCJzdGFydFNlc3Npb24iLCJ3YWl0Rm9yQWN0aXZpdHkiLCJhcHBXYWl0RHVyYXRpb24iLCJhdXRvV2VidmlldyIsImluaXRXZWJ2aWV3IiwiYWRkRGV2aWNlSW5mb1RvQ2FwcyIsImlzRW5hYmxlZCIsImlzQW5pbWF0aW9uT24iLCJzaG91bGREaXNhYmxlQW5pbWF0aW9uIiwic2hvdWxkRW5hYmxlQW5pbWF0aW9uIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJ3YXNBbmltYXRpb25FbmFibGVkIiwidmlld05hbWUiLCJhbmRyb2lkQ29tbWFuZHMiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjYWxsIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInJldHJ5SW50ZXJ2YWwiLCJzZXRDb250ZXh0IiwiYXBpVmVyc2lvbiIsIm1hbnVmYWN0dXJlciIsIm1vZGVsIiwicmVhbERpc3BsYXlTaXplIiwiZGlzcGxheURlbnNpdHkiLCJtb2JpbGVHZXREZXZpY2VJbmZvIiwiZGV2aWNlQXBpTGV2ZWwiLCJwYXJzZUludCIsImRldmljZVNjcmVlblNpemUiLCJkZXZpY2VTY3JlZW5EZW5zaXR5IiwiZGV2aWNlTW9kZWwiLCJkZXZpY2VNYW51ZmFjdHVyZXIiLCJFc3ByZXNzb1J1bm5lciIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImZvcmNlRXNwcmVzc29SZWJ1aWxkIiwiZXNwcmVzc29CdWlsZENvbmZpZyIsInNob3dHcmFkbGVMb2ciLCJzZXJ2ZXJMYXVuY2hUaW1lb3V0IiwiZXNwcmVzc29TZXJ2ZXJMYXVuY2hUaW1lb3V0Iiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsInVzZUtleXN0b3JlIiwia2V5c3RvcmVQYXRoIiwia2V5c3RvcmVQYXNzd29yZCIsImtleUFsaWFzIiwia2V5UGFzc3dvcmQiLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsInByb3h5UmVxUmVzIiwicHJveHlDb21tYW5kIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiVEVTVF9BUEtfUEtHIiwiZmFzdFJlc2V0IiwicmVzZXRBcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImluc3RhbGxUZXN0QXBrIiwiYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0Iiwic3RkZXJyIiwic2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzIiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJCIiwiYWxsIiwidGFzayIsImlnbiIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsInN0b3BMb2djYXQiLCJhdmROYW1lIiwia2lsbEVtdWxhdG9yIiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsInVuZGVmaW5lZCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZXJyb3IiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJpc05pbCIsIm5hdGl2ZVdlYlNjcmVlbnNob3QiLCJpc0Nocm9tZUJyb3dzZXIiLCJicm93c2VyTmFtZSIsImlzUGFja2FnZU9yQnVuZGxlIiwiZXhwb3J0cyIsImNtZCIsImZuIiwidG9QYWlycyIsInByb3RvdHlwZSIsImNvbW1hbmRzIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2RyaXZlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBlcnJvcnMsIGlzRXJyb3JUeXBlLCBEZXZpY2VTZXR0aW5nc30gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyBFc3ByZXNzb1J1bm5lciwgVEVTVF9BUEtfUEtHIH0gZnJvbSAnLi9lc3ByZXNzby1ydW5uZXInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHppcCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzJztcbmltcG9ydCB7IERFRkFVTFRfQURCX1BPUlQgfSBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIH0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgcXVhbGlmeUFjdGl2aXR5TmFtZSwgZ2V0UGFja2FnZUluZm8gfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IG5ld01ldGhvZE1hcCB9IGZyb20gJy4vbWV0aG9kLW1hcCc7XG5cblxuLy8gVE9ETyBtZXJnZSBvdXIgb3duIGhlbHBlcnMgb250byB0aGlzIGxhdGVyXG5jb25zdCBoZWxwZXJzID0gYW5kcm9pZEhlbHBlcnM7XG5cbi8vIFRoZSByYW5nZSBvZiBwb3J0cyB3ZSBjYW4gdXNlIG9uIHRoZSBzeXN0ZW0gZm9yIGNvbW11bmljYXRpbmcgdG8gdGhlXG4vLyBFc3ByZXNzbyBIVFRQIHNlcnZlciBvbiB0aGUgZGV2aWNlXG5jb25zdCBTWVNURU1fUE9SVF9SQU5HRSA9IFs4MzAwLCA4Mzk5XTtcblxuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IHRoZSBlc3ByZXNzbyBzZXJ2ZXIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLiBXZSB3aWxsXG4vLyBmb3J3YXJkIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlIGRldmljZS5cbmNvbnN0IERFVklDRV9QT1JUID0gNjc5MTtcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBlc3ByZXNzbyBzZXJ2ZXIuXG4vLyBUT0RPOiAgQWRkIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBlc3ByZXNzbyBzZXJ2ZXIuXG4vLyBUT0RPOiBOZWVkIHRvIHNlZ3JlZ2F0ZSB0aGUgcGF0aHMgYmV0dGVyIHdheSB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zIHdoZXJldmVyIGFwcGxpY2FibGUuXG4vLyAoTm90IHNlZ3JlZ2F0aW5nIHJpZ2h0IGF3YXkgYmVjYXVzZSBtb3JlIHBhdGhzIHRvIGJlIGFkZGVkIGluIHRoZSBOT19QUk9YWSBsaXN0KVxuY29uc3QgTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uLyg/IS4qLyknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9jdXJyZW50X3BhY2thZ2UnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvZGlzcGxheV9kZW5zaXR5JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2lzX2tleWJvYXJkX3Nob3duJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N5c3RlbV9iYXJzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N5c3RlbV90aW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvYmFja2dyb3VuZCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvY2xvc2UnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2xhdW5jaCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvcmVzZXQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL3N0cmluZ3MnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vY29tcGFyZV9pbWFnZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FjdGl2YXRlX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvYXBwX2luc3RhbGxlZCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvYXBwX3N0YXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9maW5nZXJfcHJpbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2luc3RhbGxfYXBwJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pc19sb2NrZWQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2xvY2snKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1bGxfZmlsZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvcHVsbF9mb2xkZXInKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1c2hfZmlsZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvcmVtb3ZlX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2Uvc3RhcnRfYWN0aXZpdHknKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3Rlcm1pbmF0ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3VubG9jaycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vcGVyZm9ybWFuY2VEYXRhL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RvcF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL2FzeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvY2F0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cnKV0sXG5cbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cnKV0sXG5dO1xuXG4vLyBUaGlzIGlzIGEgc2V0IG9mIG1ldGhvZHMgYW5kIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBDaHJvbWVkcml2ZXIuXG5jb25zdCBDSFJPTUVfTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9yZWN0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL211bHRpL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIG1vYmlsZTogY29tbWFuZHMgd29ya2luZyBpbiB3ZWIgY29udGV4dFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZSQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cnKV0sXG5cbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cnKV0sXG5dO1xuXG5cbmNvbnN0IEFQS19FWFQgPSAnLmFwayc7XG5jb25zdCBBQUJfRVhUID0gJy5hYWInO1xuY29uc3QgU1VQUE9SVEVEX0VYVEVOU0lPTlMgPSBbQVBLX0VYVCwgQUFCX0VYVF07XG5cbmNsYXNzIEVzcHJlc3NvRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG5cbiAgc3RhdGljIG5ld01ldGhvZE1hcCA9IG5ld01ldGhvZE1hcDtcblxuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgLy8gYHNoZWxsYCBvdmVyd3JpdGVzIGFkYi5zaGVsbCwgc28gcmVtb3ZlXG4gICAgZGVsZXRlIG9wdHMuc2hlbGw7XG5cbiAgICBzdXBlcihvcHRzLCBzaG91bGRWYWxpZGF0ZUNhcHMpO1xuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAnaWQnLFxuICAgICAgJ2NsYXNzIG5hbWUnLFxuICAgICAgJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIF07XG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4gICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuandwUHJveHlBdm9pZCA9IE5PX1BST1hZO1xuXG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307IC8vIG1hcCBvZiBsYW5ndWFnZSAtPiBzdHJpbmdzIG9ialxuICAgIHRoaXMuc2V0dGluZ3MgPSBuZXcgRGV2aWNlU2V0dGluZ3Moe30sIHRoaXMub25TZXR0aW5nc1VwZGF0ZS5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzID0ge307XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXNzaW9uICguLi5hcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRPRE8gaGFuZGxlIG90aGVyU2Vzc2lvbkRhdGEgZm9yIG11bHRpcGxlIHNlc3Npb25zXG4gICAgICBsZXQgW3Nlc3Npb25JZCwgY2Fwc10gPSBhd2FpdCBzdXBlci5jcmVhdGVTZXNzaW9uKC4uLmFyZ3MpO1xuXG4gICAgICBsZXQgc2VydmVyRGV0YWlscyA9IHtcbiAgICAgICAgcGxhdGZvcm06ICdMSU5VWCcsXG4gICAgICAgIHdlYlN0b3JhZ2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGFrZXNTY3JlZW5zaG90OiB0cnVlLFxuICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZGF0YWJhc2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkOiB0cnVlLFxuICAgICAgICBsb2NhdGlvbkNvbnRleHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgd2FybmluZ3M6IHt9LFxuICAgICAgICBkZXNpcmVkOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNhcHMpXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhcHMgPSBPYmplY3QuYXNzaWduKHNlcnZlckRldGFpbHMsIHRoaXMuY2Fwcyk7XG5cbiAgICAgIHRoaXMuY3VyQ29udGV4dCA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG5cbiAgICAgIGxldCBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgZnVsbFJlc2V0OiBmYWxzZSxcbiAgICAgICAgYXV0b0xhdW5jaDogdHJ1ZSxcbiAgICAgICAgYWRiUG9ydDogREVGQVVMVF9BREJfUE9SVCxcbiAgICAgICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiA5MDAwMFxuICAgICAgfTtcbiAgICAgIF8uZGVmYXVsdHModGhpcy5vcHRzLCBkZWZhdWx0T3B0cyk7XG5cbiAgICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oYCdicm93c2VyTmFtZScgY2FwYWJpbGl0eSB3aWxsIGJlIGlnbm9yZWRgKTtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGBDaHJvbWUgYnJvd3NlciBjYW5ub3QgYmUgcnVuIGluIEVzcHJlc3NvIHNlc3Npb25zIGJlY2F1c2UgRXNwcmVzc28gYXV0b21hdGlvbiBkb2Vzbid0IGAgK1xuICAgICAgICAgICAgICBgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyBDaHJvbWVgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDaHJvbWUgYnJvd3NlciBzZXNzaW9ucyBjYW5ub3QgYmUgcnVuIGluIEVzcHJlc3NvIGJlY2F1c2UgRXNwcmVzc28gYCArXG4gICAgICAgICAgICBgYXV0b21hdGlvbiBkb2Vzbid0IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgQ2hyb21lYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgdGhpcy5zZXRBdmRGcm9tQ2FwYWJpbGl0aWVzKGNhcHMpO1xuICAgICAgICB0aGlzLmFkZFdpcGVEYXRhVG9BdmRBcmdzKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMub3B0cy5zeXN0ZW1Qb3J0ID0gdGhpcy5vcHRzLnN5c3RlbVBvcnRcbiAgICAgICAgfHwgYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2UoU1lTVEVNX1BPUlRfUkFOR0VbMF0sIFNZU1RFTV9QT1JUX1JBTkdFWzFdKTtcbiAgICAgIHRoaXMub3B0cy5hZGJQb3J0ID0gdGhpcy5vcHRzLmFkYlBvcnQgfHwgREVGQVVMVF9BREJfUE9SVDtcbiAgICAgIC8vIGdldCBkZXZpY2UgdWRpZCBmb3IgdGhpcyBzZXNzaW9uXG4gICAgICBjb25zdCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgICB0aGlzLm9wdHMudWRpZCA9IHVkaWQ7XG4gICAgICB0aGlzLm9wdHMuZW1Qb3J0ID0gZW1Qb3J0O1xuICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyBvdXIgamF2YSB2ZXJzaW9uIGFuZCBkZXZpY2UgaW5mbywgd2UgY2FuIGNyZWF0ZSBvdXJcbiAgICAgIC8vIEFEQiBpbnN0YW5jZVxuICAgICAgdGhpcy5hZGIgPSBhd2FpdCBhbmRyb2lkSGVscGVycy5jcmVhdGVBREIodGhpcy5vcHRzKTtcblxuICAgICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgICAgLy8gZmluZCBhbmQgY29weSwgb3IgZG93bmxvYWQgYW5kIHVuemlwIGFuIGFwcCB1cmwgb3IgcGF0aFxuICAgICAgICB0aGlzLm9wdHMuYXBwID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcCh0aGlzLm9wdHMuYXBwLCB7XG4gICAgICAgICAgb25Qb3N0UHJvY2VzczogdGhpcy5vblBvc3RDb25maWd1cmVBcHAuYmluZCh0aGlzKSxcbiAgICAgICAgICBzdXBwb3J0ZWRFeHRlbnNpb25zOiBTVVBQT1JURURfRVhURU5TSU9OU1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICAvLyB0aGUgYXBwIGlzbid0IGFuIGFjdHVhbCBhcHAgZmlsZSBidXQgcmF0aGVyIHNvbWV0aGluZyB3ZSB3YW50IHRvXG4gICAgICAgIC8vIGFzc3VtZSBpcyBvbiB0aGUgZGV2aWNlIGFuZCBqdXN0IGxhdW5jaCB2aWEgdGhlIGFwcFBhY2thZ2VcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQXBwIGZpbGUgd2FzIG5vdCBsaXN0ZWQsIGluc3RlYWQgd2UncmUgZ29pbmcgdG8gcnVuIGAgK1xuICAgICAgICAgICAgYCR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9IGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZCh0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCB0aGUgcGFja2FnZSAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgYGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5zdGFydEVzcHJlc3NvU2Vzc2lvbigpO1xuICAgICAgcmV0dXJuIFtzZXNzaW9uSWQsIGNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgZS5tZXNzYWdlICs9IGAke18uZW5kc1dpdGgoZS5tZXNzYWdlLCAnLicpID8gJycgOiAnLid9IENoZWNrIGAgK1xuICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyI3Ryb3VibGVzaG9vdGluZyAnICtcbiAgICAgICAgJ3JlZ2FyZGluZyBhZHZhbmNlZCBzZXNzaW9uIHN0YXJ0dXAgdHJvdWJsZXNob290aW5nLic7XG4gICAgICBpZiAoaXNFcnJvclR5cGUoZSwgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IpKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnIgPSBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIGVyci5zdGFjayA9IGUuc3RhY2s7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuemlwIHRoZSBnaXZlbiBhcHAgcGF0aCBhbmQgcmV0dXJuIHRoZSBmaXJzdCBwYWNrYWdlIHRoYXQgaGFzIFNVUFBPUlRFRF9FWFRFTlNJT05TXG4gICAqIGluIHRoZSBhcmNoaXZlZCBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCBUaGUgcGF0aCB0byBhcHAgZmlsZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dW5zIHRoZSBwYXRoIHRvIGFuIHVuemlwcGVkIGFwcCBmaWxlIHBhdGguXG4gICAqIEB0aHJvd3MgUmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSB6aXAgZGlkIG5vdCBoYXZlIGFueSBTVVBQT1JURURfRVhURU5TSU9OUyBwYWNrYWdlcy5cbiAgICovXG4gIGFzeW5jIHVuemlwQXBwIChhcHBQYXRoKSB7XG4gICAgY29uc3QgdXNlU3lzdGVtVW56aXBFbnYgPSBwcm9jZXNzLmVudi5BUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUDtcbiAgICBjb25zdCB1c2VTeXN0ZW1VbnppcCA9IF8uaXNFbXB0eSh1c2VTeXN0ZW1VbnppcEVudilcbiAgICAgIHx8ICFbJzAnLCAnZmFsc2UnXS5pbmNsdWRlcyhfLnRvTG93ZXIodXNlU3lzdGVtVW56aXBFbnYpKTtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyhhcHBQYXRoLCB0bXBSb290LCB7dXNlU3lzdGVtVW56aXB9KTtcblxuICAgIGNvbnN0IGdsb2JQYXR0ZXJuID0gYCoqLyouKygke1NVUFBPUlRFRF9FWFRFTlNJT05TLm1hcCgoZXh0KSA9PiBleHQucmVwbGFjZSgvXlxcLi8sICcnKSkuam9pbignfCcpfSlgO1xuICAgIGNvbnN0IHNvcnRlZEJ1bmRsZUl0ZW1zID0gKGF3YWl0IGZzLmdsb2IoZ2xvYlBhdHRlcm4sIHtcbiAgICAgIGN3ZDogdG1wUm9vdCxcbiAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgfSkpLnNvcnQoKGEsIGIpID0+IGEuc3BsaXQocGF0aC5zZXApLmxlbmd0aCAtIGIuc3BsaXQocGF0aC5zZXApLmxlbmd0aCk7XG4gICAgaWYgKHNvcnRlZEJ1bmRsZUl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gbm8gZXhwZWN0ZWQgcGFja2FnZXMgaW4gdGhlIHppcFxuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJHt0aGlzLm9wdHMuYXBwfSBkaWQgbm90IGhhdmUgYW55IG9mICcke1NVUFBPUlRFRF9FWFRFTlNJT05TLmpvaW4oJywgJyl9JyBgICtcbiAgICAgICAgYGV4dGVuc2lvbiBwYWNrYWdlcy4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgcHJvdmlkZWQgLnppcCBhcmNoaXZlIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB2YWxpZCBhcHBsaWNhdGlvbiBwYWNrYWdlLmApO1xuICAgIH1cbiAgICBjb25zdCB1bnppcHBlZEFwcFBhdGggPSBwYXRoLmpvaW4odG1wUm9vdCwgXy5maXJzdChzb3J0ZWRCdW5kbGVJdGVtcykpO1xuICAgIHRoaXMubG9nLmRlYnVnKGAnJHt1bnppcHBlZEFwcFBhdGh9JyBpcyB0aGUgdW56aXBwZWQgZmlsZSBmcm9tICcke2FwcFBhdGh9J2ApO1xuICAgIHJldHVybiB1bnppcHBlZEFwcFBhdGg7XG4gIH1cblxuICBhc3luYyBvblBvc3RDb25maWd1cmVBcHAgKHtjYWNoZWRBcHBJbmZvLCBpc1VybCwgYXBwUGF0aH0pIHtcbiAgICBjb25zdCBwcmVzaWduQXBwID0gYXN5bmMgKGFwcExvY2F0aW9uKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRzLm5vU2lnbikge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdTa2lwcGluZyBhcHBsaWNhdGlvbiBzaWduaW5nIGJlY2F1c2Ugbm9TaWduIGNhcGFiaWxpdHkgaXMgc2V0IHRvIHRydWUuICcgK1xuICAgICAgICAgICdIYXZpbmcgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3Qgd2l0aCBpbXByb3BlciBzaWduYXR1cmUvbm9uLXNpZ25lZCB3aWxsIGNhdXNlICcgK1xuICAgICAgICAgICdFc3ByZXNzbyBhdXRvbWF0aW9uIHN0YXJ0dXAgZmFpbHVyZS4nKTtcbiAgICAgIH0gZWxzZSBpZiAoIWF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydChhcHBMb2NhdGlvbiwgdGhpcy5vcHRzLmFwcFBhY2thZ2UpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNpZ24oYXBwTG9jYXRpb24sIHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFzQXBrRXh0ID0gKGFwcFBhdGgpID0+IF8uZW5kc1dpdGgoXy50b0xvd2VyKGFwcFBhdGgpLCBBUEtfRVhUKTtcbiAgICBjb25zdCBoYXNBYWJFeHQgPSAoYXBwUGF0aCkgPT4gXy5lbmRzV2l0aChfLnRvTG93ZXIoYXBwUGF0aCksIEFBQl9FWFQpO1xuICAgIGNvbnN0IGV4dHJhY3RVbml2ZXJzYWxBcGsgPSBhc3luYyAoc2hvdWxkRXh0cmFjdCwgYXBwUGF0aCkgPT5cbiAgICAgIHNob3VsZEV4dHJhY3QgPyBhcHBQYXRoIDogYXdhaXQgdGhpcy5hZGIuZXh0cmFjdFVuaXZlcnNhbEFwayhhcHBQYXRoKTtcblxuICAgIGxldCBwYXRoSW5DYWNoZSA9IG51bGw7XG4gICAgbGV0IGlzUmVzdWx0QXBwUGF0aEFscmVhZHlDYWNoZWQgPSBmYWxzZTtcbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGNhY2hlZEFwcEluZm8pKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSGFzaCA9IGF3YWl0IGZzLmhhc2goYXBwUGF0aCk7XG4gICAgICBpZiAocGFja2FnZUhhc2ggPT09IGNhY2hlZEFwcEluZm8ucGFja2FnZUhhc2ggJiYgYXdhaXQgZnMuZXhpc3RzKGNhY2hlZEFwcEluZm8uZnVsbFBhdGgpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFVzaW5nICcke2NhY2hlZEFwcEluZm8uZnVsbFBhdGh9JyB3aGljaCBpcyBjYWNoZWQgZnJvbSAnJHthcHBQYXRofSdgKTtcbiAgICAgICAgaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCA9IHRydWU7XG4gICAgICAgIHBhdGhJbkNhY2hlID0gY2FjaGVkQXBwSW5mby5mdWxsUGF0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhcHBQYXRoIGNhbiBiZSAuemlwLCAuYXBrIG9yIC5hYWJcbiAgICBjb25zdCBpc0FwayA9IGhhc0Fwa0V4dChhcHBQYXRoKTtcbiAgICAvLyBPbmx5IGxvY2FsIC5hcGsgZmlsZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGluLXBsYWNlIHNob3VsZCBub3QgYmUgY2FjaGVkXG4gICAgY29uc3Qgc2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkID0gIWlzQXBrIHx8IChpc0FwayAmJiBpc1VybCk7XG5cbiAgICBpZiAoIWlzUmVzdWx0QXBwUGF0aEFscmVhZHlDYWNoZWQpIHtcbiAgICAgIGlmIChzaG91bGRSZXN1bHRBcHBQYXRoQmVDYWNoZWQpIHtcbiAgICAgICAgLy8gLnppcCwgLmFhYiBvciBkb3dubG9hZGVkIC5hcGtcblxuICAgICAgICBsZXQgdW56aXBwZWRBcHBQYXRoO1xuICAgICAgICBsZXQgaXNVbnppcHBlZEFwayA9IGZhbHNlO1xuICAgICAgICBpZiAoIShoYXNBcGtFeHQoYXBwUGF0aCkgfHwgaGFzQWFiRXh0KGFwcFBhdGgpKSkge1xuICAgICAgICAgIHVuemlwcGVkQXBwUGF0aCA9IGF3YWl0IHRoaXMudW56aXBBcHAoYXBwUGF0aCk7XG4gICAgICAgICAgaXNVbnppcHBlZEFwayA9IGhhc0Fwa0V4dCh1bnppcHBlZEFwcFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdW56aXBwZWRBcHBQYXRoIG9yIGFwcFBhdGggaGFzIFNVUFBPUlRFRF9FWFRFTlNJT05TLlxuICAgICAgICBwYXRoSW5DYWNoZSA9IHVuemlwcGVkQXBwUGF0aFxuICAgICAgICAgID8gYXdhaXQgZXh0cmFjdFVuaXZlcnNhbEFwayhpc1VuemlwcGVkQXBrLCB1bnppcHBlZEFwcFBhdGgpXG4gICAgICAgICAgOiBhd2FpdCBleHRyYWN0VW5pdmVyc2FsQXBrKGlzQXBrLCBhcHBQYXRoKTtcblxuICAgICAgICBpZiAoIWlzQXBrICYmIGlzVXJsKSB7XG4gICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIHRlbXBvcmFyaWx5IGRvd25sb2FkZWQgLmFhYiBvciAuemlwIHBhY2thZ2VcbiAgICAgICAgICBhd2FpdCBmcy5yaW1yYWYoYXBwUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0FhYkV4dCh1bnppcHBlZEFwcFBhdGgpKSB7XG4gICAgICAgICAgLy8gQ2xlYW51cCB0aGUgbG9jYWwgdW56aXBwZWQgLmFhYiBmaWxlXG4gICAgICAgICAgYXdhaXQgZnMucmltcmFmKHVuemlwcGVkQXBwUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgcHJlc2lnbkFwcChwYXRoSW5DYWNoZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzQXBrKSB7XG4gICAgICAgIC8vIEl0IGlzIHByb2JhYmx5IG5vdCB0aGUgYmVzdCBpZGVhIHRvIG1vZGlmeSB0aGUgcHJvdmlkZWQgYXBwIGluLXBsYWNlLFxuICAgICAgICAvLyBidXQgdGhpcyBpcyBob3cgaXQgd2FzIGFsd2F5cyB3b3JraW5nXG4gICAgICAgIGF3YWl0IHByZXNpZ25BcHAoYXBwUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaG91bGRSZXN1bHRBcHBQYXRoQmVDYWNoZWQgPyB7YXBwUGF0aDogcGF0aEluQ2FjaGV9IDogZmFsc2U7XG4gIH1cblxuICBnZXQgZHJpdmVyRGF0YSAoKSB7XG4gICAgLy8gVE9ETyBmaWxsZSBvdXQgcmVzb3VyY2UgaW5mbyBoZXJlXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgaXNFbXVsYXRvciAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNFbXVsYXRvcih0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgfVxuXG4gIC8vIFRPRE8gdGhpcyBtZXRob2QgaXMgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMi1kcml2ZXI7IGNvbnNvbGlkYXRlXG4gIHNldEF2ZEZyb21DYXBhYmlsaXRpZXMgKGNhcHMpIHtcbiAgICBpZiAodGhpcy5vcHRzLmF2ZCkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnYXZkIG5hbWUgZGVmaW5lZCwgaWdub3JpbmcgZGV2aWNlIG5hbWUgYW5kIHBsYXRmb3JtIHZlcnNpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjYXBzLmRldmljZU5hbWUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIGRldmljZU5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlcycpO1xuICAgICAgfVxuICAgICAgaWYgKCFjYXBzLnBsYXRmb3JtVmVyc2lvbikge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdhdmQgb3IgcGxhdGZvcm1WZXJzaW9uIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZWQnKTtcbiAgICAgIH1cbiAgICAgIGxldCBhdmREZXZpY2UgPSBjYXBzLmRldmljZU5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfLl0vZywgJy0nKTtcbiAgICAgIHRoaXMub3B0cy5hdmQgPSBgJHthdmREZXZpY2V9X18ke2NhcHMucGxhdGZvcm1WZXJzaW9ufWA7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyLWRyaXZlcjsgY29uc29saWRhdGVcbiAgYWRkV2lwZURhdGFUb0F2ZEFyZ3MgKCkge1xuICAgIGlmICghdGhpcy5vcHRzLmF2ZEFyZ3MpIHtcbiAgICAgIHRoaXMub3B0cy5hdmRBcmdzID0gJy13aXBlLWRhdGEnO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0cy5hdmRBcmdzLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJy13aXBlLWRhdGEnKSkge1xuICAgICAgdGhpcy5vcHRzLmF2ZEFyZ3MgKz0gJyAtd2lwZS1kYXRhJztcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIG11Y2ggb2YgdGhpcyBsb2dpYyBpcyBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyXG4gIGFzeW5jIHN0YXJ0RXNwcmVzc29TZXNzaW9uICgpIHtcbiAgICBjb25zdCB7bWFuaWZlc3RQYXlsb2FkfSA9IGF3YWl0IGdldFBhY2thZ2VJbmZvKCk7XG4gICAgdGhpcy5sb2cuaW5mbyhgRXNwcmVzc29Ecml2ZXIgdmVyc2lvbjogJHttYW5pZmVzdFBheWxvYWQudmVyc2lvbn1gKTtcblxuICAgIC8vIFJlYWQgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tYW5kcm9pZC1kcml2ZXIvcHVsbC80NjEgd2hhdCBoYXBwZW5zIGlmIHRoZXIgaXMgbm8gc2V0SGlkZGVuQXBpUG9saWN5IGZvciBBbmRyb2lkIFArXG4gICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICB0aGlzLmxvZy53YXJuKCdSZWxheGluZyBoaWRkZW4gYXBpIHBvbGljeScpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SGlkZGVuQXBpUG9saWN5KCcxJywgISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgIH1cblxuICAgIC8vIGdldCBhcHBQYWNrYWdlIGV0IGFsIGZyb20gbWFuaWZlc3QgaWYgbmVjZXNzYXJ5XG4gICAgbGV0IGFwcEluZm8gPSBhd2FpdCBoZWxwZXJzLmdldExhdW5jaEluZm8odGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgaWYgKGFwcEluZm8pIHtcbiAgICAgIC8vIGFuZCBnZXQgaXQgb250byBvdXIgJ29wdHMnIG9iamVjdCBzbyB3ZSB1c2UgaXQgZnJvbSBub3cgb25cbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRzLCBhcHBJbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwSW5mbyA9IHRoaXMub3B0cztcbiAgICB9XG5cbiAgICAvLyBzdGFydCBhbiBhdmQsIHNldCB0aGUgbGFuZ3VhZ2UvbG9jYWxlLCBwaWNrIGFuIGVtdWxhdG9yLCBldGMuLi5cbiAgICAvLyBUT0RPIHdpdGggbXVsdGlwbGUgZGV2aWNlcyB3ZSdsbCBuZWVkIHRvIHBhcmFtZXRlcml6ZSB0aGlzXG4gICAgYXdhaXQgaGVscGVycy5pbml0RGV2aWNlKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyL2lzc3Vlcy83MlxuICAgIC8vIGRlZmF1bHQgc3RhdGUgaXMgd2luZG93IGFuaW1hdGlvbiBkaXNhYmxlZFxuICAgIGF3YWl0IHRoaXMuc2V0V2luZG93QW5pbWF0aW9uU3RhdGUodGhpcy5jYXBzLmRpc2FibGVXaW5kb3dBbmltYXRpb24gPT09IGZhbHNlKTtcblxuICAgIC8vIHNldCBhY3R1YWwgZGV2aWNlIG5hbWUsIHVkaWRcbiAgICB0aGlzLmNhcHMuZGV2aWNlTmFtZSA9IHRoaXMuYWRiLmN1ckRldmljZUlkO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VVRElEID0gdGhpcy5vcHRzLnVkaWQ7XG5cbiAgICAvLyBzZXQgdXAgdGhlIG1vZGlmaWVkIGVzcHJlc3NvIHNlcnZlciBldGNcbiAgICB0aGlzLmluaXRFc3ByZXNzb1NlcnZlcigpO1xuICAgIC8vIEZ1cnRoZXIgcHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIGVzcHJlc3NvIHBvcnRcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBFc3ByZXNzbyBTZXJ2ZXIgcG9ydCAke0RFVklDRV9QT1JUfSB0byAke3RoaXMub3B0cy5zeXN0ZW1Qb3J0fWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMub3B0cy5zeXN0ZW1Qb3J0LCBERVZJQ0VfUE9SVCk7XG5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyB1bmxvY2sgdGhlIGRldmljZSB0byBwcmVwYXJlIGl0IGZvciB0ZXN0aW5nXG4gICAgICBhd2FpdCBoZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYCdza2lwVW5sb2NrJyBjYXBhYmlsaXR5IHNldCwgc28gc2tpcHBpbmcgZGV2aWNlIHVubG9ja2ApO1xuICAgIH1cblxuICAgIC8vIHNldCB1cCBhcHAgdW5kZXIgdGVzdFxuICAgIC8vIHByZXBhcmUgb3VyIGFjdHVhbCBBVVQsIGdldCBpdCBvbiB0aGUgZGV2aWNlLCBldGMuLi5cbiAgICBhd2FpdCB0aGlzLmluaXRBVVQoKTtcblxuICAgIC8vQWRkaW5nIEFVVCBwYWNrYWdlIG5hbWUgaW4gdGhlIGNhcGFiaWxpdGllcyBpZiBwYWNrYWdlIG5hbWUgbm90IGV4aXN0IGluIGNhcHNcbiAgICBpZiAoIXRoaXMuY2Fwcy5hcHBQYWNrYWdlKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwUGFja2FnZSA9IGFwcEluZm8uYXBwUGFja2FnZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UpIHtcbiAgICAgIHRoaXMuY2Fwcy5hcHBXYWl0UGFja2FnZSA9IGFwcEluZm8uYXBwV2FpdFBhY2thZ2UgfHwgYXBwSW5mby5hcHBQYWNrYWdlIHx8IHRoaXMuY2Fwcy5hcHBQYWNrYWdlO1xuICAgIH1cbiAgICBpZiAodGhpcy5jYXBzLmFwcEFjdGl2aXR5KSB7XG4gICAgICB0aGlzLmNhcHMuYXBwQWN0aXZpdHkgPSBxdWFsaWZ5QWN0aXZpdHlOYW1lKHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSwgdGhpcy5jYXBzLmFwcFBhY2thZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcHMuYXBwQWN0aXZpdHkgPSBxdWFsaWZ5QWN0aXZpdHlOYW1lKGFwcEluZm8uYXBwQWN0aXZpdHksIHRoaXMuY2Fwcy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2Fwcy5hcHBXYWl0QWN0aXZpdHkpIHtcbiAgICAgIHRoaXMuY2Fwcy5hcHBXYWl0QWN0aXZpdHkgPSBxdWFsaWZ5QWN0aXZpdHlOYW1lKHRoaXMuY2Fwcy5hcHBXYWl0QWN0aXZpdHksIHRoaXMuY2Fwcy5hcHBXYWl0UGFja2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2Fwcy5hcHBXYWl0QWN0aXZpdHkgPSBxdWFsaWZ5QWN0aXZpdHlOYW1lKGFwcEluZm8uYXBwV2FpdEFjdGl2aXR5IHx8IGFwcEluZm8uYXBwQWN0aXZpdHkgfHwgdGhpcy5jYXBzLmFwcEFjdGl2aXR5LFxuICAgICAgICB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UpO1xuICAgIH1cblxuICAgIC8vIGxhdW5jaCBlc3ByZXNzbyBhbmQgd2FpdCB0aWxsIGl0cyBvbmxpbmUgYW5kIHdlIGhhdmUgYSBzZXNzaW9uXG4gICAgYXdhaXQgdGhpcy5lc3ByZXNzby5zdGFydFNlc3Npb24odGhpcy5jYXBzKTtcbiAgICBpZiAodGhpcy5jYXBzLmF1dG9MYXVuY2ggPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3Qgd2FpdGluZyBmb3IgdGhlIGFwcGxpY2F0aW9uIGFjdGl2aXR5IHRvIHN0YXJ0IGJlY2F1c2UgJ2F1dG9MYXVuY2gnIGlzIGRpc2FibGVkYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JBY3Rpdml0eSh0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UsIHRoaXMuY2Fwcy5hcHBXYWl0QWN0aXZpdHksIHRoaXMub3B0cy5hcHBXYWl0RHVyYXRpb24pO1xuICAgIH1cbiAgICAvLyBpZiB3ZSB3YW50IHRvIGltbWVkaWF0ZWx5IGdldCBpbnRvIGEgd2Vidmlldywgc2V0IG91ciBjb250ZXh0XG4gICAgLy8gYXBwcm9wcmlhdGVseVxuICAgIGlmICh0aGlzLm9wdHMuYXV0b1dlYnZpZXcpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdFdlYnZpZXcoKTtcbiAgICB9XG5cbiAgICAvLyBub3cgdGhhdCBldmVyeXRoaW5nIGhhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSwgdHVybiBvbiBwcm94eWluZyBzbyBhbGxcbiAgICAvLyBzdWJzZXF1ZW50IHNlc3Npb24gcmVxdWVzdHMgZ28gc3RyYWlnaHQgdG8vZnJvbSBlc3ByZXNzb1xuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5hZGREZXZpY2VJbmZvVG9DYXBzKCk7XG4gIH1cblxuICBhc3luYyBzZXRXaW5kb3dBbmltYXRpb25TdGF0ZShpc0VuYWJsZWQpIHtcbiAgICBjb25zdCBpc0FuaW1hdGlvbk9uID0gYXdhaXQgdGhpcy5hZGIuaXNBbmltYXRpb25PbigpO1xuICAgIGNvbnN0IHNob3VsZERpc2FibGVBbmltYXRpb24gPSAhaXNFbmFibGVkICYmIGlzQW5pbWF0aW9uT247XG4gICAgY29uc3Qgc2hvdWxkRW5hYmxlQW5pbWF0aW9uID0gaXNFbmFibGVkICYmICFpc0FuaW1hdGlvbk9uO1xuXG4gICAgaWYgKHNob3VsZERpc2FibGVBbmltYXRpb24pIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdEaXNhYmxpbmcgd2luZG93IGFuaW1hdGlvbiBhcyBcImRpc2FibGVXaW5kb3dBbmltYXRpb25cIiBjYXBhYmlsaXR5IGlzIHNldCB0byB0cnVlL2ZhbGxiYWNrIHRvIGRlZmF1bHQgdmFsdWUgXCJ0cnVlXCInKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgIHRoaXMud2FzQW5pbWF0aW9uRW5hYmxlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzaG91bGRFbmFibGVBbmltYXRpb24pIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdFbmFibGluZyB3aW5kb3cgYW5pbWF0aW9uIGFzIFwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvblwiIGNhcGFiaWxpdHkgaXMgc2V0IHRvIGZhbHNlJyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZSh0cnVlKTtcbiAgICAgIHRoaXMud2FzQW5pbWF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5ICR7aXNFbmFibGVkID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbml0V2VidmlldyAoKSB7XG4gICAgY29uc3Qgdmlld05hbWUgPSBhbmRyb2lkQ29tbWFuZHMuZGVmYXVsdFdlYnZpZXdOYW1lLmNhbGwodGhpcyk7XG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMub3B0cy5hdXRvV2Vidmlld1RpbWVvdXQgfHwgMjAwMDtcbiAgICB0aGlzLmxvZy5pbmZvKGBTZXR0aW5nIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcbiAgICBhd2FpdCByZXRyeUludGVydmFsKHRpbWVvdXQgLyA1MDAsIDUwMCwgdGhpcy5zZXRDb250ZXh0LmJpbmQodGhpcyksIHZpZXdOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIGFkZERldmljZUluZm9Ub0NhcHMgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFwaVZlcnNpb24sXG4gICAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgICBtYW51ZmFjdHVyZXIsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlYWxEaXNwbGF5U2l6ZSxcbiAgICAgIGRpc3BsYXlEZW5zaXR5LFxuICAgIH0gPSBhd2FpdCB0aGlzLm1vYmlsZUdldERldmljZUluZm8oKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlQXBpTGV2ZWwgPSBwYXJzZUludChhcGlWZXJzaW9uLCAxMCk7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IHBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuU2l6ZSA9IHJlYWxEaXNwbGF5U2l6ZTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuRGVuc2l0eSA9IGRpc3BsYXlEZW5zaXR5O1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNYW51ZmFjdHVyZXIgPSBtYW51ZmFjdHVyZXI7XG4gIH1cblxuICBpbml0RXNwcmVzc29TZXJ2ZXIgKCkge1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgcGFja2FnZSBhbmQgYWN0aXZpdHksIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAvLyBlc3ByZXNzbyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkYXRhXG4gICAgdGhpcy5lc3ByZXNzbyA9IG5ldyBFc3ByZXNzb1J1bm5lcih0aGlzLmxvZywge1xuICAgICAgaG9zdDogdGhpcy5vcHRzLnJlbW90ZUFkYkhvc3QgfHwgdGhpcy5vcHRzLmhvc3QgfHwgJzEyNy4wLjAuMScsXG4gICAgICBzeXN0ZW1Qb3J0OiB0aGlzLm9wdHMuc3lzdGVtUG9ydCxcbiAgICAgIGRldmljZVBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgYWRiOiB0aGlzLmFkYixcbiAgICAgIGFwazogdGhpcy5vcHRzLmFwcCxcbiAgICAgIHRtcERpcjogdGhpcy5vcHRzLnRtcERpcixcbiAgICAgIGFwcFBhY2thZ2U6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYXBwQWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGZvcmNlRXNwcmVzc29SZWJ1aWxkOiAhIXRoaXMub3B0cy5mb3JjZUVzcHJlc3NvUmVidWlsZCxcbiAgICAgIGVzcHJlc3NvQnVpbGRDb25maWc6IHRoaXMub3B0cy5lc3ByZXNzb0J1aWxkQ29uZmlnLFxuICAgICAgc2hvd0dyYWRsZUxvZzogISF0aGlzLm9wdHMuc2hvd0dyYWRsZUxvZyxcbiAgICAgIHNlcnZlckxhdW5jaFRpbWVvdXQ6IHRoaXMub3B0cy5lc3ByZXNzb1NlcnZlckxhdW5jaFRpbWVvdXQsXG4gICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IHRoaXMub3B0cy5hbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgICBza2lwU2VydmVySW5zdGFsbGF0aW9uOiB0aGlzLm9wdHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbixcbiAgICAgIHVzZUtleXN0b3JlOiB0aGlzLm9wdHMudXNlS2V5c3RvcmUsXG4gICAgICBrZXlzdG9yZVBhdGg6IHRoaXMub3B0cy5rZXlzdG9yZVBhdGgsXG4gICAgICBrZXlzdG9yZVBhc3N3b3JkOiB0aGlzLm9wdHMua2V5c3RvcmVQYXNzd29yZCxcbiAgICAgIGtleUFsaWFzOiB0aGlzLm9wdHMua2V5QWxpYXMsXG4gICAgICBrZXlQYXNzd29yZDogdGhpcy5vcHRzLmtleVBhc3N3b3JkLFxuICAgICAgZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2U6IHRoaXMub3B0cy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSxcbiAgICB9KTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5lc3ByZXNzby5wcm94eVJlcVJlcy5iaW5kKHRoaXMuZXNwcmVzc28pO1xuICAgIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5lc3ByZXNzby5wcm94eUNvbW1hbmQuYmluZCh0aGlzLmVzcHJlc3NvKTtcbiAgfVxuXG4gIC8vIFRPRE8gdGhpcyBtZXRob2QgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjJcbiAgYXN5bmMgaW5pdEFVVCAoKSB7XG4gICAgLy8gc2V0IHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgZnJvbSB0aGUgYXBrXG4gICAgLy8gVE9ETzogaW5jb3Jwb3JhdGUgY2hhbmdlcyBmcm9tIGFwcGl1bSM1MzA4IHdoaWNoIGZpeCBhIHJhY2UgY29uZC1cbiAgICAvLyBpdGlvbiBidWcgaW4gb2xkIGFwcGl1bSBhbmQgbmVlZCB0byBiZSByZXBsaWNhdGVkIGhlcmVcbiAgICAvLyB0aGlzLmFwa1N0cmluZ3NbdGhpcy5vcHRzLmxhbmd1YWdlXSA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLnB1c2hTdHJpbmdzKFxuICAgIC8vICAgICB0aGlzLm9wdHMubGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuXG4gICAgLy8gVW5pbnN0YWxsIGFueSB1bmluc3RhbGxPdGhlclBhY2thZ2VzIHdoaWNoIHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBURVNUX0FQS19QS0ddXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5vcHRzLmFwcCkge1xuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnTm8gYXBwIGNhcGFiaWxpdHkuIEFzc3VtaW5nIGl0IGlzIGFscmVhZHkgb24gdGhlIGRldmljZScpO1xuICAgICAgaWYgKHRoaXMub3B0cy5mYXN0UmVzZXQpIHtcbiAgICAgICAgYXdhaXQgaGVscGVycy5yZXNldEFwcCh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgYXdhaXQgaGVscGVycy5pbnN0YWxsQXBrKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24pIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdza2lwU2VydmVySW5zdGFsbGF0aW9uIGNhcGFiaWxpdHkgaXMgc2V0LiBOb3QgaW5zdGFsbGlnIGVzcHJlc3NvLXNlcnZlciAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5lc3ByZXNzby5pbnN0YWxsVGVzdEFwaygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0KFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFRFU1RfQVBLX1BLRyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBhZGQgc2VydmVyIHBhY2thZ2VzIHRvIHRoZSBEb3plIHdoaXRlbGlzdC4gT3JpZ2luYWwgZXJyb3I6IGAgK1xuICAgICAgICAgIChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnRGVsZXRpbmcgZXNwcmVzc28gc2Vzc2lvbicpO1xuXG4gICAgY29uc3Qgc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzID0gW2FzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJlY29yZGluZ1NjcmVlbigpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLm1vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZygpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZygpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcoKTtcbiAgICAgIH1cbiAgICB9XTtcblxuICAgIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyh0aGlzLnNlcnZlciwgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgaWYgKHRoaXMuZXNwcmVzc28pIHtcbiAgICAgIGlmICh0aGlzLmp3cFByb3h5QWN0aXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgYXdhaXQgQi5hbGwoc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzLm1hcCgodGFzaykgPT4ge1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICB9KSgpO1xuICAgICAgfSkpO1xuICAgICAgaWYgKHRoaXMud2FzQW5pbWF0aW9uRW5hYmxlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVzZXQgYW5pbWF0aW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNDaHJvbWVTZXNzaW9uICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlICYmICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLnNraXBVbmluc3RhbGwgJiYgIXRoaXMuYXBwT25EZXZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYEZVTExfUkVTRVQgc2V0IHRvICd0cnVlJywgVW5pbnN0YWxsaW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYWRiLnN0b3BMb2djYXQoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIGxldCBhdmROYW1lID0gdGhpcy5vcHRzLmF2ZC5yZXBsYWNlKCdAJywgJycpO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgY2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuICAgIGlmICh0aGlzLm9wdHMuc3lzdGVtUG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIHBvcnQgZm9yd2FyZCAnJHtlcnJvci5tZXNzYWdlfSdgKTtcbiAgICAgICAgLy9JZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBvblNldHRpbmdzVXBkYXRlICgpIHtcbiAgICAvLyBpbnRlbnRpb25hbGx5IGRvIG5vdGhpbmcgaGVyZSwgc2luY2UgY29tbWFuZHMudXBkYXRlU2V0dGluZ3MgcHJveGllc1xuICAgIC8vIHNldHRpbmdzIHRvIHRoZSBlc3ByZXNzbyBzZXJ2ZXIgYWxyZWFkeVxuICB9XG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLnByb3h5QWN0aXZlKHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBhbHdheXMgaGF2ZSBhbiBhY3RpdmUgcHJveHkgdG8gdGhlIGVzcHJlc3NvIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBjYW4gYWx3YXlzIHByb3h5IHRvIHRoZSBlc3ByZXNzbyBzZXJ2ZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5nZXRQcm94eUF2b2lkTGlzdChzZXNzaW9uSWQpO1xuICAgIC8vIHdlIGFyZSBtYWludGFpbmluZyB0d28gc2V0cyBvZiBOT19QUk9YWSBsaXN0cywgb25lIGZvciBjaHJvbWVkcml2ZXIoQ0hST01FX05PX1BST1hZKVxuICAgIC8vIGFuZCBvbmUgZm9yIEVzcHJlc3NvKE5PX1BST1hZKSwgYmFzZWQgb24gY3VycmVudCBjb250ZXh0IHdpbGwgcmV0dXJuIHJlbGF0ZWQgTk9fUFJPWFkgbGlzdFxuICAgIHRoaXMuandwUHJveHlBdm9pZCA9IF8uaXNOaWwodGhpcy5jaHJvbWVkcml2ZXIpID8gTk9fUFJPWFkgOiBDSFJPTUVfTk9fUFJPWFk7XG4gICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBbLi4udGhpcy5qd3BQcm94eUF2b2lkLCBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgZ2V0IGlzQ2hyb21lU2Vzc2lvbiAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gIH1cblxuICBnZXQgYXBwT25EZXZpY2UgKCkge1xuICAgIHJldHVybiAhdGhpcy5vcHRzLmFwcCAmJiB0aGlzLmhlbHBlcnMuaXNQYWNrYWdlT3JCdW5kbGUodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICB9XG59XG5cbi8vIGZpcnN0IGFkZCB0aGUgYW5kcm9pZC1kcml2ZXIgY29tbWFuZHMgd2hpY2ggd2Ugd2lsbCBmYWxsIGJhY2sgdG9cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoYW5kcm9pZENvbW1hbmRzKSkge1xuICAvLyB3ZSBkbyBzb21lIGRpZmZlcmVudC9zcGVjaWFsIHRoaW5ncyB3aXRoIHRoZXNlIG1ldGhvZHNcbiAgaWYgKCFfLmluY2x1ZGVzKFsnZGVmYXVsdFdlYnZpZXdOYW1lJ10sIGNtZCkpIHtcbiAgICBFc3ByZXNzb0RyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xuICB9XG59XG5cbi8vIHRoZW4gb3ZlcndyaXRlIHdpdGggYW55IGVzcHJlc3NvLXNwZWNpZmljIGNvbW1hbmRzXG5mb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICBFc3ByZXNzb0RyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xufVxuXG5leHBvcnQgeyBFc3ByZXNzb0RyaXZlciB9O1xuZXhwb3J0IGRlZmF1bHQgRXNwcmVzc29Ecml2ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksZUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssUUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sU0FBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU8sVUFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsb0JBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLFlBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLFlBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLFNBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLE1BQUEsR0FBQVosT0FBQTtBQUNBLElBQUFhLFVBQUEsR0FBQWIsT0FBQTtBQUlBLE1BQU1jLE9BQU8sR0FBR0MsbUNBQWM7QUFJOUIsTUFBTUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBSXRDLE1BQU1DLFdBQVcsR0FBRyxJQUFJO0FBTXhCLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsS0FBSyxFQUFFLElBQUlDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQ3hDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDLEVBQ3JFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLEVBQ3BFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLEVBQ3BFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLEVBQ3RFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQ2hFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQ2hFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLEVBQ3RELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQzlDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQ3pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQzFDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzdELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLEVBQ3hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLEVBQ3pELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLEVBQ3hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQzFELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzdELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLEVBQ2xFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQy9ELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLEVBQ2xFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQ2pFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQy9ELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQzFELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQy9ELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQ2pFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQy9ELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLEVBQ2hFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQ3BFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLEVBQzVELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQ2pFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQ3BFLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLEVBQ3ZELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzdELENBQUMsTUFB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
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","names":["_lodash","_interopRequireDefault","require","_path","_bluebird","_driver","_espressoRunner","_support","_commands","_appiumAdb","_appiumAndroidDriver","_desiredCaps","_portscanner","_asyncbox","_utils","_methodMap","helpers","androidHelpers","SYSTEM_PORT_RANGE","DEVICE_PORT","NO_PROXY","RegExp","CHROME_NO_PROXY","APK_EXT","AAB_EXT","SUPPORTED_EXTENSIONS","EspressoDriver","BaseDriver","newMethodMap","constructor","opts","shouldValidateCaps","shell","locatorStrategies","desiredCapConstraints","espresso","jwpProxyActive","jwpProxyAvoid","apkStrings","settings","DeviceSettings","onSettingsUpdate","bind","chromedriver","sessionChromedrivers","createSession","args","sessionId","caps","serverDetails","platform","webStorageEnabled","takesScreenshot","javascriptEnabled","databaseEnabled","networkConnectionEnabled","locationContextEnabled","warnings","desired","Object","assign","curContext","defaultContextName","defaultOpts","fullReset","autoLaunch","adbPort","DEFAULT_ADB_PORT","androidInstallTimeout","_","defaults","isChromeSession","app","log","warn","errorAndThrow","reboot","setAvdFromCapabilities","addWipeDataToAvdArgs","systemPort","findAPortNotInUse","udid","emPort","getDeviceInfoFromCaps","adb","createADB","configureApp","onPostProcess","onPostConfigureApp","supportedExtensions","appOnDevice","info","appPackage","isAppInstalled","startEspressoSession","e","deleteSession","message","endsWith","isErrorType","errors","SessionNotCreatedError","err","stack","unzipApp","appPath","useSystemUnzipEnv","process","env","APPIUM_PREFER_SYSTEM_UNZIP","useSystemUnzip","isEmpty","includes","toLower","tmpRoot","tempDir","openDir","zip","extractAllTo","globPattern","map","ext","replace","join","sortedBundleItems","fs","glob","cwd","strict","sort","a","b","split","path","sep","length","unzippedAppPath","first","debug","cachedAppInfo","isUrl","presignApp","appLocation","noSign","checkApkCert","sign","hasApkExt","hasAabExt","extractUniversalApk","shouldExtract","pathInCache","isResultAppPathAlreadyCached","isPlainObject","packageHash","hash","exists","fullPath","isApk","shouldResultAppPathBeCached","isUnzippedApk","rimraf","driverData","isEmulator","avd","deviceName","platformVersion","avdDevice","avdArgs","toLowerCase","manifestPayload","getPackageInfo","version","getApiLevel","setHiddenApiPolicy","ignoreHiddenApiPolicyError","appInfo","getLaunchInfo","initDevice","isAnimationOn","setAnimationState","wasAnimationEnabled","curDeviceId","deviceUDID","initEspressoServer","forwardPort","skipUnlock","unlock","initAUT","appWaitPackage","appActivity","qualifyActivityName","appWaitActivity","startSession","waitForActivity","appWaitDuration","autoWebview","initWebview","addDeviceInfoToCaps","viewName","androidCommands","defaultWebviewName","call","timeout","autoWebviewTimeout","retryInterval","setContext","apiVersion","manufacturer","model","realDisplaySize","displayDensity","mobileGetDeviceInfo","deviceApiLevel","parseInt","deviceScreenSize","deviceScreenDensity","deviceModel","deviceManufacturer","EspressoRunner","host","remoteAdbHost","devicePort","apk","tmpDir","forceEspressoRebuild","espressoBuildConfig","showGradleLog","serverLaunchTimeout","espressoServerLaunchTimeout","skipServerInstallation","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","disableSuppressAccessibilityService","proxyReqRes","proxyCommand","uninstallOtherPackages","parseArray","SETTINGS_HELPER_PKG_ID","TEST_APK_PKG","fastReset","resetApp","skipUninstall","uninstallApk","installApk","installTestApk","addToDeviceIdleWhitelist","stderr","screenRecordingStopTasks","_screenRecordingProperties","stopRecordingScreen","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","_screenStreamingProps","mobileStopScreenStreaming","removeAllSessionWebSocketHandlers","server","B","all","task","ign","dontStopAppOnReset","forceStop","stopLogcat","avdName","killEmulator","setDefaultHiddenApiPolicy","undefined","removePortForward","error","proxyActive","canProxy","getProxyAvoidList","isNil","nativeWebScreenshot","isChromeBrowser","browserName","isPackageOrBundle","exports","cmd","fn","toPairs","prototype","commands","_default","default"],"sources":["../../lib/driver.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport B from 'bluebird';\nimport { BaseDriver, errors, isErrorType, DeviceSettings} from 'appium/driver';\nimport { EspressoRunner, TEST_APK_PKG } from './espresso-runner';\nimport { fs, tempDir, zip } from 'appium/support';\nimport commands from './commands';\nimport { DEFAULT_ADB_PORT } from 'appium-adb';\nimport { androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID, } from 'appium-android-driver';\nimport desiredCapConstraints from './desired-caps';\nimport { findAPortNotInUse } from 'portscanner';\nimport { retryInterval } from 'asyncbox';\nimport { qualifyActivityName, getPackageInfo } from './utils';\nimport { newMethodMap } from './method-map';\n\n\n// TODO merge our own helpers onto this later\nconst helpers = androidHelpers;\n\n// The range of ports we can use on the system for communicating to the\n// Espresso HTTP server on the device\nconst SYSTEM_PORT_RANGE = [8300, 8399];\n\n// This is the port that the espresso server listens to on the device. We will\n// forward one of the ports above on the system to this port on the device.\nconst DEVICE_PORT = 6791;\n\n// NO_PROXY contains the paths that we never want to proxy to espresso server.\n// TODO: Add the list of paths that we never want to proxy to espresso server.\n// TODO: Need to segregate the paths better way using regular expressions wherever applicable.\n// (Not segregating right away because more paths to be added in the NO_PROXY list)\nconst NO_PROXY = [\n ['GET', new RegExp('^/session/(?!.*/)')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/current_activity')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/current_package')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/display_density')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/is_keyboard_shown')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/system_bars')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/system_time')],\n ['GET', new RegExp('^/session/[^/]+/appium/settings')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/contexts')],\n ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/network_connection')],\n ['GET', new RegExp('^/session/[^/]+/timeouts')],\n ['GET', new RegExp('^/session/[^/]+/url')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/background')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/close')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/launch')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/reset')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/strings')],\n ['POST', new RegExp('^/session/[^/]+/appium/compare_images')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/activate_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/app_installed')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/app_state')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/finger_print')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/get_clipboard')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/install_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/is_locked')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/lock')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/pull_file')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/pull_folder')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/push_file')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/remove_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/start_activity')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/terminate_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/unlock')],\n ['POST', new RegExp('^/session/[^/]+/appium/getPerformanceData')],\n ['POST', new RegExp('^/session/[^/]+/appium/performanceData/types')],\n ['POST', new RegExp('^/session/[^/]+/appium/settings')],\n ['POST', new RegExp('^/session/[^/]+/appium/execute_driver')],\n ['POST', new RegExp('^/session/[^/]+/appium/start_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/appium/stop_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/execute')],\n ['POST', new RegExp('^/session/[^/]+/execute/async')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n ['POST', new RegExp('^/session/[^/]+/execute_async')],\n ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/location')],\n ['POST', new RegExp('^/session/[^/]+/network_connection')],\n ['POST', new RegExp('^/session/[^/]+/timeouts')],\n ['POST', new RegExp('^/session/[^/]+/url')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log')],\n];\n\n// This is a set of methods and paths that we never want to proxy to Chromedriver.\nconst CHROME_NO_PROXY = [\n ['GET', new RegExp('^/session/[^/]+/appium')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')],\n ['GET', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/appium')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],\n ['POST', new RegExp('^/session/[^/]+/touch/perform')],\n\n // this is needed to make the mobile: commands working in web context\n ['POST', new RegExp('^/session/[^/]+/execute$')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log')],\n];\n\n\nconst APK_EXT = '.apk';\nconst AAB_EXT = '.aab';\nconst SUPPORTED_EXTENSIONS = [APK_EXT, AAB_EXT];\n\nclass EspressoDriver extends BaseDriver {\n\n static newMethodMap = newMethodMap;\n\n constructor (opts = {}, shouldValidateCaps = true) {\n // `shell` overwrites adb.shell, so remove\n delete opts.shell;\n\n super(opts, shouldValidateCaps);\n this.locatorStrategies = [\n 'id',\n 'class name',\n 'accessibility id',\n ];\n this.desiredCapConstraints = desiredCapConstraints;\n this.espresso = null;\n this.jwpProxyActive = false;\n this.jwpProxyAvoid = NO_PROXY;\n\n this.apkStrings = {}; // map of language -> strings obj\n this.settings = new DeviceSettings({}, this.onSettingsUpdate.bind(this));\n\n this.chromedriver = null;\n this.sessionChromedrivers = {};\n }\n\n async createSession (...args) {\n try {\n // TODO handle otherSessionData for multiple sessions\n let [sessionId, caps] = await super.createSession(...args);\n\n let serverDetails = {\n platform: 'LINUX',\n webStorageEnabled: false,\n takesScreenshot: true,\n javascriptEnabled: true,\n databaseEnabled: false,\n networkConnectionEnabled: true,\n locationContextEnabled: false,\n warnings: {},\n desired: Object.assign({}, this.caps)\n };\n\n this.caps = Object.assign(serverDetails, this.caps);\n\n this.curContext = this.defaultContextName();\n\n let defaultOpts = {\n fullReset: false,\n autoLaunch: true,\n adbPort: DEFAULT_ADB_PORT,\n androidInstallTimeout: 90000\n };\n _.defaults(this.opts, defaultOpts);\n\n if (this.isChromeSession) {\n if (this.opts.app) {\n this.log.warn(`'browserName' capability will be ignored`);\n this.log.warn(`Chrome browser cannot be run in Espresso sessions because Espresso automation doesn't ` +\n `have permission to access Chrome`);\n } else {\n this.log.errorAndThrow(`Chrome browser sessions cannot be run in Espresso because Espresso ` +\n `automation doesn't have permission to access Chrome`);\n }\n }\n\n if (this.opts.reboot) {\n this.setAvdFromCapabilities(caps);\n this.addWipeDataToAvdArgs();\n }\n\n this.opts.systemPort = this.opts.systemPort\n || await findAPortNotInUse(SYSTEM_PORT_RANGE[0], SYSTEM_PORT_RANGE[1]);\n this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;\n // get device udid for this session\n const {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);\n this.opts.udid = udid;\n this.opts.emPort = emPort;\n // now that we know our java version and device info, we can create our\n // ADB instance\n this.adb = await androidHelpers.createADB(this.opts);\n\n if (this.opts.app) {\n // find and copy, or download and unzip an app url or path\n this.opts.app = await this.helpers.configureApp(this.opts.app, {\n onPostProcess: this.onPostConfigureApp.bind(this),\n supportedExtensions: SUPPORTED_EXTENSIONS\n });\n } else if (this.appOnDevice) {\n // the app isn't an actual app file but rather something we want to\n // assume is on the device and just launch via the appPackage\n this.log.info(`App file was not listed, instead we're going to run ` +\n `${this.opts.appPackage} directly on the device`);\n if (!await this.adb.isAppInstalled(this.opts.appPackage)) {\n this.log.errorAndThrow(`Could not find the package '${this.opts.appPackage}' ` +\n `installed on the device`);\n }\n }\n\n await this.startEspressoSession();\n return [sessionId, caps];\n } catch (e) {\n await this.deleteSession();\n e.message += `${_.endsWith(e.message, '.') ? '' : '.'} Check ` +\n 'https://github.com/appium/appium-espresso-driver#troubleshooting ' +\n 'regarding advanced session startup troubleshooting.';\n if (isErrorType(e, errors.SessionNotCreatedError)) {\n throw e;\n }\n const err = new errors.SessionNotCreatedError(e.message);\n err.stack = e.stack;\n throw err;\n }\n }\n\n /**\n * Unzip the given app path and return the first package that has SUPPORTED_EXTENSIONS\n * in the archived file.\n *\n * @param {string} appPath The path to app file.\n * @returns {string} Retuns the path to an unzipped app file path.\n * @throws Raise an exception if the zip did not have any SUPPORTED_EXTENSIONS packages.\n */\n async unzipApp (appPath) {\n const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;\n const useSystemUnzip = _.isEmpty(useSystemUnzipEnv)\n || !['0', 'false'].includes(_.toLower(useSystemUnzipEnv));\n const tmpRoot = await tempDir.openDir();\n await zip.extractAllTo(appPath, tmpRoot, {useSystemUnzip});\n\n const globPattern = `**/*.+(${SUPPORTED_EXTENSIONS.map((ext) => ext.replace(/^\\./, '')).join('|')})`;\n const sortedBundleItems = (await fs.glob(globPattern, {\n cwd: tmpRoot,\n strict: false,\n })).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);\n if (sortedBundleItems.length === 0) {\n // no expected packages in the zip\n this.log.errorAndThrow(`${this.opts.app} did not have any of '${SUPPORTED_EXTENSIONS.join(', ')}' ` +\n `extension packages. Please make sure the provided .zip archive contains at least one valid application package.`);\n }\n const unzippedAppPath = path.join(tmpRoot, _.first(sortedBundleItems));\n this.log.debug(`'${unzippedAppPath}' is the unzipped file from '${appPath}'`);\n return unzippedAppPath;\n }\n\n async onPostConfigureApp ({cachedAppInfo, isUrl, appPath}) {\n const presignApp = async (appLocation) => {\n if (this.opts.noSign) {\n this.log.info('Skipping application signing because noSign capability is set to true. ' +\n 'Having the application under test with improper signature/non-signed will cause ' +\n 'Espresso automation startup failure.');\n } else if (!await this.adb.checkApkCert(appLocation, this.opts.appPackage)) {\n await this.adb.sign(appLocation, this.opts.appPackage);\n }\n };\n\n const hasApkExt = (appPath) => _.endsWith(_.toLower(appPath), APK_EXT);\n const hasAabExt = (appPath) => _.endsWith(_.toLower(appPath), AAB_EXT);\n const extractUniversalApk = async (shouldExtract, appPath) =>\n shouldExtract ? appPath : await this.adb.extractUniversalApk(appPath);\n\n let pathInCache = null;\n let isResultAppPathAlreadyCached = false;\n if (_.isPlainObject(cachedAppInfo)) {\n const packageHash = await fs.hash(appPath);\n if (packageHash === cachedAppInfo.packageHash && await fs.exists(cachedAppInfo.fullPath)) {\n this.log.info(`Using '${cachedAppInfo.fullPath}' which is cached from '${appPath}'`);\n isResultAppPathAlreadyCached = true;\n pathInCache = cachedAppInfo.fullPath;\n }\n }\n\n // appPath can be .zip, .apk or .aab\n const isApk = hasApkExt(appPath);\n // Only local .apk files that are available in-place should not be cached\n const shouldResultAppPathBeCached = !isApk || (isApk && isUrl);\n\n if (!isResultAppPathAlreadyCached) {\n if (shouldResultAppPathBeCached) {\n // .zip, .aab or downloaded .apk\n\n let unzippedAppPath;\n let isUnzippedApk = false;\n if (!(hasApkExt(appPath) || hasAabExt(appPath))) {\n unzippedAppPath = await this.unzipApp(appPath);\n isUnzippedApk = hasApkExt(unzippedAppPath);\n }\n\n // unzippedAppPath or appPath has SUPPORTED_EXTENSIONS.\n pathInCache = unzippedAppPath\n ? await extractUniversalApk(isUnzippedApk, unzippedAppPath)\n : await extractUniversalApk(isApk, appPath);\n\n if (!isApk && isUrl) {\n // Clean up the temporarily downloaded .aab or .zip package\n await fs.rimraf(appPath);\n }\n if (hasAabExt(unzippedAppPath)) {\n // Cleanup the local unzipped .aab file\n await fs.rimraf(unzippedAppPath);\n }\n await presignApp(pathInCache);\n } else if (isApk) {\n // It is probably not the best idea to modify the provided app in-place,\n // but this is how it was always working\n await presignApp(appPath);\n }\n }\n return shouldResultAppPathBeCached ? {appPath: pathInCache} : false;\n }\n\n get driverData () {\n // TODO fille out resource info here\n return {};\n }\n\n isEmulator () {\n return helpers.isEmulator(this.adb, this.opts);\n }\n\n // TODO this method is duplicated from uiautomator2-driver; consolidate\n setAvdFromCapabilities (caps) {\n if (this.opts.avd) {\n this.log.info('avd name defined, ignoring device name and platform version');\n } else {\n if (!caps.deviceName) {\n this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');\n }\n if (!caps.platformVersion) {\n this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');\n }\n let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');\n this.opts.avd = `${avdDevice}__${caps.platformVersion}`;\n }\n }\n\n // TODO this method is duplicated from uiautomator2-driver; consolidate\n addWipeDataToAvdArgs () {\n if (!this.opts.avdArgs) {\n this.opts.avdArgs = '-wipe-data';\n } else if (!this.opts.avdArgs.toLowerCase().includes('-wipe-data')) {\n this.opts.avdArgs += ' -wipe-data';\n }\n }\n\n // TODO much of this logic is duplicated from uiautomator2\n async startEspressoSession () {\n const {manifestPayload} = await getPackageInfo();\n this.log.info(`EspressoDriver version: ${manifestPayload.version}`);\n\n // Read https://github.com/appium/appium-android-driver/pull/461 what happens if ther is no setHiddenApiPolicy for Android P+\n if (await this.adb.getApiLevel() >= 28) { // Android P\n this.log.warn('Relaxing hidden api policy');\n await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);\n }\n\n // get appPackage et al from manifest if necessary\n let appInfo = await helpers.getLaunchInfo(this.adb, this.opts);\n if (appInfo) {\n // and get it onto our 'opts' object so we use it from now on\n Object.assign(this.opts, appInfo);\n } else {\n appInfo = this.opts;\n }\n\n // start an avd, set the language/locale, pick an emulator, etc...\n // TODO with multiple devices we'll need to parameterize this\n await helpers.initDevice(this.adb, this.opts);\n // https://github.com/appium/appium-espresso-driver/issues/72\n if (await this.adb.isAnimationOn()) {\n try {\n await this.adb.setAnimationState(false);\n this.wasAnimationEnabled = true;\n } catch (err) {\n this.log.warn(`Unable to turn off animations: ${err.message}`);\n }\n }\n\n // set actual device name, udid\n this.caps.deviceName = this.adb.curDeviceId;\n this.caps.deviceUDID = this.opts.udid;\n\n // set up the modified espresso server etc\n this.initEspressoServer();\n // Further prepare the device by forwarding the espresso port\n this.log.debug(`Forwarding Espresso Server port ${DEVICE_PORT} to ${this.opts.systemPort}`);\n await this.adb.forwardPort(this.opts.systemPort, DEVICE_PORT);\n\n if (!this.opts.skipUnlock) {\n // unlock the device to prepare it for testing\n await helpers.unlock(this, this.adb, this.caps);\n } else {\n this.log.debug(`'skipUnlock' capability set, so skipping device unlock`);\n }\n\n // set up app under test\n // prepare our actual AUT, get it on the device, etc...\n await this.initAUT();\n\n //Adding AUT package name in the capabilities if package name not exist in caps\n if (!this.caps.appPackage) {\n this.caps.appPackage = appInfo.appPackage;\n }\n if (!this.caps.appWaitPackage) {\n this.caps.appWaitPackage = appInfo.appWaitPackage || appInfo.appPackage || this.caps.appPackage;\n }\n if (this.caps.appActivity) {\n this.caps.appActivity = qualifyActivityName(this.caps.appActivity, this.caps.appPackage);\n } else {\n this.caps.appActivity = qualifyActivityName(appInfo.appActivity, this.caps.appPackage);\n }\n if (this.caps.appWaitActivity) {\n this.caps.appWaitActivity = qualifyActivityName(this.caps.appWaitActivity, this.caps.appWaitPackage);\n } else {\n this.caps.appWaitActivity = qualifyActivityName(appInfo.appWaitActivity || appInfo.appActivity || this.caps.appActivity,\n this.caps.appWaitPackage);\n }\n\n // launch espresso and wait till its online and we have a session\n await this.espresso.startSession(this.caps);\n if (this.caps.autoLaunch === false) {\n this.log.info(`Not waiting for the application activity to start because 'autoLaunch' is disabled`);\n } else {\n await this.adb.waitForActivity(this.caps.appWaitPackage, this.caps.appWaitActivity, this.opts.appWaitDuration);\n }\n // if we want to immediately get into a webview, set our context\n // appropriately\n if (this.opts.autoWebview) {\n await this.initWebview();\n }\n\n // now that everything has started successfully, turn on proxying so all\n // subsequent session requests go straight to/from espresso\n this.jwpProxyActive = true;\n\n await this.addDeviceInfoToCaps();\n }\n\n async initWebview () {\n const viewName = androidCommands.defaultWebviewName.call(this);\n const timeout = this.opts.autoWebviewTimeout || 2000;\n this.log.info(`Setting webview to context '${viewName}' with timeout ${timeout}ms`);\n await retryInterval(timeout / 500, 500, this.setContext.bind(this), viewName);\n }\n\n async addDeviceInfoToCaps () {\n const {\n apiVersion,\n platformVersion,\n manufacturer,\n model,\n realDisplaySize,\n displayDensity,\n } = await this.mobileGetDeviceInfo();\n this.caps.deviceApiLevel = parseInt(apiVersion, 10);\n this.caps.platformVersion = platformVersion;\n this.caps.deviceScreenSize = realDisplaySize;\n this.caps.deviceScreenDensity = displayDensity;\n this.caps.deviceModel = model;\n this.caps.deviceManufacturer = manufacturer;\n }\n\n initEspressoServer () {\n // now that we have package and activity, we can create an instance of\n // espresso with the appropriate data\n this.espresso = new EspressoRunner(this.log, {\n host: this.opts.remoteAdbHost || this.opts.host || '127.0.0.1',\n systemPort: this.opts.systemPort,\n devicePort: DEVICE_PORT,\n adb: this.adb,\n apk: this.opts.app,\n tmpDir: this.opts.tmpDir,\n appPackage: this.opts.appPackage,\n appActivity: this.opts.appActivity,\n forceEspressoRebuild: !!this.opts.forceEspressoRebuild,\n espressoBuildConfig: this.opts.espressoBuildConfig,\n showGradleLog: !!this.opts.showGradleLog,\n serverLaunchTimeout: this.opts.espressoServerLaunchTimeout,\n androidInstallTimeout: this.opts.androidInstallTimeout,\n skipServerInstallation: this.opts.skipServerInstallation,\n useKeystore: this.opts.useKeystore,\n keystorePath: this.opts.keystorePath,\n keystorePassword: this.opts.keystorePassword,\n keyAlias: this.opts.keyAlias,\n keyPassword: this.opts.keyPassword,\n disableSuppressAccessibilityService: this.opts.disableSuppressAccessibilityService,\n });\n this.proxyReqRes = this.espresso.proxyReqRes.bind(this.espresso);\n this.proxyCommand = this.espresso.proxyCommand.bind(this.espresso);\n }\n\n // TODO this method is mostly duplicated from uiautomator2\n async initAUT () {\n // set the localized strings for the current language from the apk\n // TODO: incorporate changes from appium#5308 which fix a race cond-\n // ition bug in old appium and need to be replicated here\n // this.apkStrings[this.opts.language] = await androidHelpers.pushStrings(\n // this.opts.language, this.adb, this.opts);\n\n // Uninstall any uninstallOtherPackages which were specified in caps\n if (this.opts.uninstallOtherPackages) {\n await helpers.uninstallOtherPackages(\n this.adb,\n helpers.parseArray(this.opts.uninstallOtherPackages),\n [SETTINGS_HELPER_PKG_ID, TEST_APK_PKG]\n );\n }\n\n if (!this.opts.app) {\n if (this.opts.fullReset) {\n this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');\n }\n this.log.debug('No app capability. Assuming it is already on the device');\n if (this.opts.fastReset) {\n await helpers.resetApp(this.adb, this.opts);\n }\n }\n\n if (!this.opts.skipUninstall) {\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n if (this.opts.app) {\n await helpers.installApk(this.adb, this.opts);\n }\n if (this.opts.skipServerInstallation) {\n this.log.debug('skipServerInstallation capability is set. Not installig espresso-server ');\n } else {\n await this.espresso.installTestApk();\n try {\n await this.adb.addToDeviceIdleWhitelist(SETTINGS_HELPER_PKG_ID, TEST_APK_PKG);\n } catch (e) {\n this.log.warn(`Cannot add server packages to the Doze whitelist. Original error: ` +\n (e.stderr || e.message));\n }\n }\n }\n\n async deleteSession () {\n this.log.debug('Deleting espresso session');\n\n const screenRecordingStopTasks = [async () => {\n if (!_.isEmpty(this._screenRecordingProperties)) {\n await this.stopRecordingScreen();\n }\n }, async () => {\n if (await this.mobileIsMediaProjectionRecordingRunning()) {\n await this.mobileStopMediaProjectionRecording();\n }\n }, async () => {\n if (!_.isEmpty(this._screenStreamingProps)) {\n await this.mobileStopScreenStreaming();\n }\n }];\n\n await androidHelpers.removeAllSessionWebSocketHandlers(this.server, this.sessionId);\n\n if (this.espresso) {\n if (this.jwpProxyActive) {\n await this.espresso.deleteSession();\n }\n this.espresso = null;\n }\n this.jwpProxyActive = false;\n\n if (this.adb) {\n await B.all(screenRecordingStopTasks.map((task) => {\n (async () => {\n try {\n await task();\n } catch (ign) {}\n })();\n }));\n if (this.wasAnimationEnabled) {\n try {\n await this.adb.setAnimationState(true);\n } catch (err) {\n this.log.warn(`Unable to reset animation: ${err.message}`);\n }\n }\n if (!this.isChromeSession && this.opts.appPackage && !this.opts.dontStopAppOnReset) {\n await this.adb.forceStop(this.opts.appPackage);\n }\n if (this.opts.fullReset && !this.opts.skipUninstall && !this.appOnDevice) {\n this.log.debug(`FULL_RESET set to 'true', Uninstalling '${this.opts.appPackage}'`);\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n await this.adb.stopLogcat();\n if (this.opts.reboot) {\n let avdName = this.opts.avd.replace('@', '');\n this.log.debug(`closing emulator '${avdName}'`);\n await this.adb.killEmulator(avdName);\n }\n if (await this.adb.getApiLevel() >= 28) { // Android P\n this.log.info('Restoring hidden api policy to the device default configuration');\n await this.adb.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError);\n }\n }\n await super.deleteSession();\n if (this.opts.systemPort !== undefined) {\n try {\n await this.adb.removePortForward(this.opts.systemPort);\n } catch (error) {\n this.log.warn(`Unable to remove port forward '${error.message}'`);\n //Ignore, this block will also be called when we fall in catch block\n // and before even port forward.\n }\n }\n }\n\n async onSettingsUpdate () {\n // intentionally do nothing here, since commands.updateSettings proxies\n // settings to the espresso server already\n }\n\n proxyActive (sessionId) {\n super.proxyActive(sessionId);\n\n // we always have an active proxy to the espresso server\n return true;\n }\n\n canProxy (sessionId) {\n super.canProxy(sessionId);\n\n // we can always proxy to the espresso server\n return true;\n }\n\n getProxyAvoidList (sessionId) {\n super.getProxyAvoidList(sessionId);\n // we are maintaining two sets of NO_PROXY lists, one for chromedriver(CHROME_NO_PROXY)\n // and one for Espresso(NO_PROXY), based on current context will return related NO_PROXY list\n this.jwpProxyAvoid = _.isNil(this.chromedriver) ? NO_PROXY : CHROME_NO_PROXY;\n if (this.opts.nativeWebScreenshot) {\n this.jwpProxyAvoid = [...this.jwpProxyAvoid, ['GET', new RegExp('^/session/[^/]+/screenshot')]];\n }\n\n return this.jwpProxyAvoid;\n }\n\n get isChromeSession () {\n return helpers.isChromeBrowser(this.opts.browserName);\n }\n\n get appOnDevice () {\n return !this.opts.app && this.helpers.isPackageOrBundle(this.opts.appPackage);\n }\n}\n\n// first add the android-driver commands which we will fall back to\nfor (let [cmd, fn] of _.toPairs(androidCommands)) {\n // we do some different/special things with these methods\n if (!_.includes(['defaultWebviewName'], cmd)) {\n EspressoDriver.prototype[cmd] = fn;\n }\n}\n\n// then overwrite with any espresso-specific commands\nfor (let [cmd, fn] of _.toPairs(commands)) {\n EspressoDriver.prototype[cmd] = fn;\n}\n\nexport { EspressoDriver };\nexport default EspressoDriver;\n"],"mappings":"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"}
1
+ {"version":3,"file":"driver.js","names":["_lodash","_interopRequireDefault","require","_path","_bluebird","_driver","_espressoRunner","_support","_commands","_appiumAdb","_appiumAndroidDriver","_desiredCaps","_portscanner","_asyncbox","_utils","_methodMap","helpers","androidHelpers","SYSTEM_PORT_RANGE","DEVICE_PORT","NO_PROXY","RegExp","CHROME_NO_PROXY","APK_EXT","AAB_EXT","SUPPORTED_EXTENSIONS","EspressoDriver","BaseDriver","newMethodMap","constructor","opts","shouldValidateCaps","shell","locatorStrategies","desiredCapConstraints","espresso","jwpProxyActive","jwpProxyAvoid","apkStrings","settings","DeviceSettings","onSettingsUpdate","bind","chromedriver","sessionChromedrivers","createSession","args","sessionId","caps","serverDetails","platform","webStorageEnabled","takesScreenshot","javascriptEnabled","databaseEnabled","networkConnectionEnabled","locationContextEnabled","warnings","desired","Object","assign","curContext","defaultContextName","defaultOpts","fullReset","autoLaunch","adbPort","DEFAULT_ADB_PORT","androidInstallTimeout","_","defaults","isChromeSession","app","log","warn","errorAndThrow","reboot","setAvdFromCapabilities","addWipeDataToAvdArgs","systemPort","findAPortNotInUse","udid","emPort","getDeviceInfoFromCaps","adb","createADB","configureApp","onPostProcess","onPostConfigureApp","supportedExtensions","appOnDevice","info","appPackage","isAppInstalled","startEspressoSession","e","deleteSession","message","endsWith","isErrorType","errors","SessionNotCreatedError","err","stack","unzipApp","appPath","useSystemUnzipEnv","process","env","APPIUM_PREFER_SYSTEM_UNZIP","useSystemUnzip","isEmpty","includes","toLower","tmpRoot","tempDir","openDir","zip","extractAllTo","globPattern","map","ext","replace","join","sortedBundleItems","fs","glob","cwd","strict","sort","a","b","split","path","sep","length","unzippedAppPath","first","debug","cachedAppInfo","isUrl","presignApp","appLocation","noSign","checkApkCert","sign","hasApkExt","hasAabExt","extractUniversalApk","shouldExtract","pathInCache","isResultAppPathAlreadyCached","isPlainObject","packageHash","hash","exists","fullPath","isApk","shouldResultAppPathBeCached","isUnzippedApk","rimraf","driverData","isEmulator","avd","deviceName","platformVersion","avdDevice","avdArgs","toLowerCase","manifestPayload","getPackageInfo","version","getApiLevel","setHiddenApiPolicy","ignoreHiddenApiPolicyError","appInfo","getLaunchInfo","initDevice","setWindowAnimationState","disableWindowAnimation","curDeviceId","deviceUDID","initEspressoServer","forwardPort","skipUnlock","unlock","initAUT","appWaitPackage","appActivity","qualifyActivityName","appWaitActivity","startSession","waitForActivity","appWaitDuration","autoWebview","initWebview","addDeviceInfoToCaps","isEnabled","isAnimationOn","shouldDisableAnimation","shouldEnableAnimation","setAnimationState","wasAnimationEnabled","viewName","androidCommands","defaultWebviewName","call","timeout","autoWebviewTimeout","retryInterval","setContext","apiVersion","manufacturer","model","realDisplaySize","displayDensity","mobileGetDeviceInfo","deviceApiLevel","parseInt","deviceScreenSize","deviceScreenDensity","deviceModel","deviceManufacturer","EspressoRunner","host","remoteAdbHost","devicePort","apk","tmpDir","forceEspressoRebuild","espressoBuildConfig","showGradleLog","serverLaunchTimeout","espressoServerLaunchTimeout","skipServerInstallation","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","disableSuppressAccessibilityService","proxyReqRes","proxyCommand","uninstallOtherPackages","parseArray","SETTINGS_HELPER_PKG_ID","TEST_APK_PKG","fastReset","resetApp","skipUninstall","uninstallApk","installApk","installTestApk","addToDeviceIdleWhitelist","stderr","screenRecordingStopTasks","_screenRecordingProperties","stopRecordingScreen","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","_screenStreamingProps","mobileStopScreenStreaming","removeAllSessionWebSocketHandlers","server","B","all","task","ign","dontStopAppOnReset","forceStop","stopLogcat","avdName","killEmulator","setDefaultHiddenApiPolicy","undefined","removePortForward","error","proxyActive","canProxy","getProxyAvoidList","isNil","nativeWebScreenshot","isChromeBrowser","browserName","isPackageOrBundle","exports","cmd","fn","toPairs","prototype","commands","_default","default"],"sources":["../../lib/driver.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport B from 'bluebird';\nimport { BaseDriver, errors, isErrorType, DeviceSettings} from 'appium/driver';\nimport { EspressoRunner, TEST_APK_PKG } from './espresso-runner';\nimport { fs, tempDir, zip } from 'appium/support';\nimport commands from './commands';\nimport { DEFAULT_ADB_PORT } from 'appium-adb';\nimport { androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID, } from 'appium-android-driver';\nimport desiredCapConstraints from './desired-caps';\nimport { findAPortNotInUse } from 'portscanner';\nimport { retryInterval } from 'asyncbox';\nimport { qualifyActivityName, getPackageInfo } from './utils';\nimport { newMethodMap } from './method-map';\n\n\n// TODO merge our own helpers onto this later\nconst helpers = androidHelpers;\n\n// The range of ports we can use on the system for communicating to the\n// Espresso HTTP server on the device\nconst SYSTEM_PORT_RANGE = [8300, 8399];\n\n// This is the port that the espresso server listens to on the device. We will\n// forward one of the ports above on the system to this port on the device.\nconst DEVICE_PORT = 6791;\n\n// NO_PROXY contains the paths that we never want to proxy to espresso server.\n// TODO: Add the list of paths that we never want to proxy to espresso server.\n// TODO: Need to segregate the paths better way using regular expressions wherever applicable.\n// (Not segregating right away because more paths to be added in the NO_PROXY list)\nconst NO_PROXY = [\n ['GET', new RegExp('^/session/(?!.*/)')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/current_activity')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/current_package')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/display_density')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/is_keyboard_shown')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/system_bars')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/system_time')],\n ['GET', new RegExp('^/session/[^/]+/appium/settings')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/contexts')],\n ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/network_connection')],\n ['GET', new RegExp('^/session/[^/]+/timeouts')],\n ['GET', new RegExp('^/session/[^/]+/url')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/background')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/close')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/launch')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/reset')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/strings')],\n ['POST', new RegExp('^/session/[^/]+/appium/compare_images')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/activate_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/app_installed')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/app_state')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/finger_print')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/get_clipboard')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/install_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/is_locked')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/lock')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/pull_file')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/pull_folder')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/push_file')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/remove_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/start_activity')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/terminate_app')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/unlock')],\n ['POST', new RegExp('^/session/[^/]+/appium/getPerformanceData')],\n ['POST', new RegExp('^/session/[^/]+/appium/performanceData/types')],\n ['POST', new RegExp('^/session/[^/]+/appium/settings')],\n ['POST', new RegExp('^/session/[^/]+/appium/execute_driver')],\n ['POST', new RegExp('^/session/[^/]+/appium/start_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/appium/stop_recording_screen')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/execute')],\n ['POST', new RegExp('^/session/[^/]+/execute/async')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n ['POST', new RegExp('^/session/[^/]+/execute_async')],\n ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/location')],\n ['POST', new RegExp('^/session/[^/]+/network_connection')],\n ['POST', new RegExp('^/session/[^/]+/timeouts')],\n ['POST', new RegExp('^/session/[^/]+/url')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log')],\n];\n\n// This is a set of methods and paths that we never want to proxy to Chromedriver.\nconst CHROME_NO_PROXY = [\n ['GET', new RegExp('^/session/[^/]+/appium')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')],\n ['GET', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/appium')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/orientation')],\n ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],\n ['POST', new RegExp('^/session/[^/]+/touch/perform')],\n\n // this is needed to make the mobile: commands working in web context\n ['POST', new RegExp('^/session/[^/]+/execute$')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n // For Selenium v4 (W3C does not have this route)\n ['POST', new RegExp('^/session/[^/]+/se/log')],\n];\n\n\nconst APK_EXT = '.apk';\nconst AAB_EXT = '.aab';\nconst SUPPORTED_EXTENSIONS = [APK_EXT, AAB_EXT];\n\nclass EspressoDriver extends BaseDriver {\n\n static newMethodMap = newMethodMap;\n\n constructor (opts = {}, shouldValidateCaps = true) {\n // `shell` overwrites adb.shell, so remove\n delete opts.shell;\n\n super(opts, shouldValidateCaps);\n this.locatorStrategies = [\n 'id',\n 'class name',\n 'accessibility id',\n ];\n this.desiredCapConstraints = desiredCapConstraints;\n this.espresso = null;\n this.jwpProxyActive = false;\n this.jwpProxyAvoid = NO_PROXY;\n\n this.apkStrings = {}; // map of language -> strings obj\n this.settings = new DeviceSettings({}, this.onSettingsUpdate.bind(this));\n\n this.chromedriver = null;\n this.sessionChromedrivers = {};\n }\n\n async createSession (...args) {\n try {\n // TODO handle otherSessionData for multiple sessions\n let [sessionId, caps] = await super.createSession(...args);\n\n let serverDetails = {\n platform: 'LINUX',\n webStorageEnabled: false,\n takesScreenshot: true,\n javascriptEnabled: true,\n databaseEnabled: false,\n networkConnectionEnabled: true,\n locationContextEnabled: false,\n warnings: {},\n desired: Object.assign({}, this.caps)\n };\n\n this.caps = Object.assign(serverDetails, this.caps);\n\n this.curContext = this.defaultContextName();\n\n let defaultOpts = {\n fullReset: false,\n autoLaunch: true,\n adbPort: DEFAULT_ADB_PORT,\n androidInstallTimeout: 90000\n };\n _.defaults(this.opts, defaultOpts);\n\n if (this.isChromeSession) {\n if (this.opts.app) {\n this.log.warn(`'browserName' capability will be ignored`);\n this.log.warn(`Chrome browser cannot be run in Espresso sessions because Espresso automation doesn't ` +\n `have permission to access Chrome`);\n } else {\n this.log.errorAndThrow(`Chrome browser sessions cannot be run in Espresso because Espresso ` +\n `automation doesn't have permission to access Chrome`);\n }\n }\n\n if (this.opts.reboot) {\n this.setAvdFromCapabilities(caps);\n this.addWipeDataToAvdArgs();\n }\n\n this.opts.systemPort = this.opts.systemPort\n || await findAPortNotInUse(SYSTEM_PORT_RANGE[0], SYSTEM_PORT_RANGE[1]);\n this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;\n // get device udid for this session\n const {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);\n this.opts.udid = udid;\n this.opts.emPort = emPort;\n // now that we know our java version and device info, we can create our\n // ADB instance\n this.adb = await androidHelpers.createADB(this.opts);\n\n if (this.opts.app) {\n // find and copy, or download and unzip an app url or path\n this.opts.app = await this.helpers.configureApp(this.opts.app, {\n onPostProcess: this.onPostConfigureApp.bind(this),\n supportedExtensions: SUPPORTED_EXTENSIONS\n });\n } else if (this.appOnDevice) {\n // the app isn't an actual app file but rather something we want to\n // assume is on the device and just launch via the appPackage\n this.log.info(`App file was not listed, instead we're going to run ` +\n `${this.opts.appPackage} directly on the device`);\n if (!await this.adb.isAppInstalled(this.opts.appPackage)) {\n this.log.errorAndThrow(`Could not find the package '${this.opts.appPackage}' ` +\n `installed on the device`);\n }\n }\n\n await this.startEspressoSession();\n return [sessionId, caps];\n } catch (e) {\n await this.deleteSession();\n e.message += `${_.endsWith(e.message, '.') ? '' : '.'} Check ` +\n 'https://github.com/appium/appium-espresso-driver#troubleshooting ' +\n 'regarding advanced session startup troubleshooting.';\n if (isErrorType(e, errors.SessionNotCreatedError)) {\n throw e;\n }\n const err = new errors.SessionNotCreatedError(e.message);\n err.stack = e.stack;\n throw err;\n }\n }\n\n /**\n * Unzip the given app path and return the first package that has SUPPORTED_EXTENSIONS\n * in the archived file.\n *\n * @param {string} appPath The path to app file.\n * @returns {string} Retuns the path to an unzipped app file path.\n * @throws Raise an exception if the zip did not have any SUPPORTED_EXTENSIONS packages.\n */\n async unzipApp (appPath) {\n const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;\n const useSystemUnzip = _.isEmpty(useSystemUnzipEnv)\n || !['0', 'false'].includes(_.toLower(useSystemUnzipEnv));\n const tmpRoot = await tempDir.openDir();\n await zip.extractAllTo(appPath, tmpRoot, {useSystemUnzip});\n\n const globPattern = `**/*.+(${SUPPORTED_EXTENSIONS.map((ext) => ext.replace(/^\\./, '')).join('|')})`;\n const sortedBundleItems = (await fs.glob(globPattern, {\n cwd: tmpRoot,\n strict: false,\n })).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);\n if (sortedBundleItems.length === 0) {\n // no expected packages in the zip\n this.log.errorAndThrow(`${this.opts.app} did not have any of '${SUPPORTED_EXTENSIONS.join(', ')}' ` +\n `extension packages. Please make sure the provided .zip archive contains at least one valid application package.`);\n }\n const unzippedAppPath = path.join(tmpRoot, _.first(sortedBundleItems));\n this.log.debug(`'${unzippedAppPath}' is the unzipped file from '${appPath}'`);\n return unzippedAppPath;\n }\n\n async onPostConfigureApp ({cachedAppInfo, isUrl, appPath}) {\n const presignApp = async (appLocation) => {\n if (this.opts.noSign) {\n this.log.info('Skipping application signing because noSign capability is set to true. ' +\n 'Having the application under test with improper signature/non-signed will cause ' +\n 'Espresso automation startup failure.');\n } else if (!await this.adb.checkApkCert(appLocation, this.opts.appPackage)) {\n await this.adb.sign(appLocation, this.opts.appPackage);\n }\n };\n\n const hasApkExt = (appPath) => _.endsWith(_.toLower(appPath), APK_EXT);\n const hasAabExt = (appPath) => _.endsWith(_.toLower(appPath), AAB_EXT);\n const extractUniversalApk = async (shouldExtract, appPath) =>\n shouldExtract ? appPath : await this.adb.extractUniversalApk(appPath);\n\n let pathInCache = null;\n let isResultAppPathAlreadyCached = false;\n if (_.isPlainObject(cachedAppInfo)) {\n const packageHash = await fs.hash(appPath);\n if (packageHash === cachedAppInfo.packageHash && await fs.exists(cachedAppInfo.fullPath)) {\n this.log.info(`Using '${cachedAppInfo.fullPath}' which is cached from '${appPath}'`);\n isResultAppPathAlreadyCached = true;\n pathInCache = cachedAppInfo.fullPath;\n }\n }\n\n // appPath can be .zip, .apk or .aab\n const isApk = hasApkExt(appPath);\n // Only local .apk files that are available in-place should not be cached\n const shouldResultAppPathBeCached = !isApk || (isApk && isUrl);\n\n if (!isResultAppPathAlreadyCached) {\n if (shouldResultAppPathBeCached) {\n // .zip, .aab or downloaded .apk\n\n let unzippedAppPath;\n let isUnzippedApk = false;\n if (!(hasApkExt(appPath) || hasAabExt(appPath))) {\n unzippedAppPath = await this.unzipApp(appPath);\n isUnzippedApk = hasApkExt(unzippedAppPath);\n }\n\n // unzippedAppPath or appPath has SUPPORTED_EXTENSIONS.\n pathInCache = unzippedAppPath\n ? await extractUniversalApk(isUnzippedApk, unzippedAppPath)\n : await extractUniversalApk(isApk, appPath);\n\n if (!isApk && isUrl) {\n // Clean up the temporarily downloaded .aab or .zip package\n await fs.rimraf(appPath);\n }\n if (hasAabExt(unzippedAppPath)) {\n // Cleanup the local unzipped .aab file\n await fs.rimraf(unzippedAppPath);\n }\n await presignApp(pathInCache);\n } else if (isApk) {\n // It is probably not the best idea to modify the provided app in-place,\n // but this is how it was always working\n await presignApp(appPath);\n }\n }\n return shouldResultAppPathBeCached ? {appPath: pathInCache} : false;\n }\n\n get driverData () {\n // TODO fille out resource info here\n return {};\n }\n\n isEmulator () {\n return helpers.isEmulator(this.adb, this.opts);\n }\n\n // TODO this method is duplicated from uiautomator2-driver; consolidate\n setAvdFromCapabilities (caps) {\n if (this.opts.avd) {\n this.log.info('avd name defined, ignoring device name and platform version');\n } else {\n if (!caps.deviceName) {\n this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');\n }\n if (!caps.platformVersion) {\n this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');\n }\n let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');\n this.opts.avd = `${avdDevice}__${caps.platformVersion}`;\n }\n }\n\n // TODO this method is duplicated from uiautomator2-driver; consolidate\n addWipeDataToAvdArgs () {\n if (!this.opts.avdArgs) {\n this.opts.avdArgs = '-wipe-data';\n } else if (!this.opts.avdArgs.toLowerCase().includes('-wipe-data')) {\n this.opts.avdArgs += ' -wipe-data';\n }\n }\n\n // TODO much of this logic is duplicated from uiautomator2\n async startEspressoSession () {\n const {manifestPayload} = await getPackageInfo();\n this.log.info(`EspressoDriver version: ${manifestPayload.version}`);\n\n // Read https://github.com/appium/appium-android-driver/pull/461 what happens if ther is no setHiddenApiPolicy for Android P+\n if (await this.adb.getApiLevel() >= 28) { // Android P\n this.log.warn('Relaxing hidden api policy');\n await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);\n }\n\n // get appPackage et al from manifest if necessary\n let appInfo = await helpers.getLaunchInfo(this.adb, this.opts);\n if (appInfo) {\n // and get it onto our 'opts' object so we use it from now on\n Object.assign(this.opts, appInfo);\n } else {\n appInfo = this.opts;\n }\n\n // start an avd, set the language/locale, pick an emulator, etc...\n // TODO with multiple devices we'll need to parameterize this\n await helpers.initDevice(this.adb, this.opts);\n\n // https://github.com/appium/appium-espresso-driver/issues/72\n // default state is window animation disabled\n await this.setWindowAnimationState(this.caps.disableWindowAnimation === false);\n\n // set actual device name, udid\n this.caps.deviceName = this.adb.curDeviceId;\n this.caps.deviceUDID = this.opts.udid;\n\n // set up the modified espresso server etc\n this.initEspressoServer();\n // Further prepare the device by forwarding the espresso port\n this.log.debug(`Forwarding Espresso Server port ${DEVICE_PORT} to ${this.opts.systemPort}`);\n await this.adb.forwardPort(this.opts.systemPort, DEVICE_PORT);\n\n if (!this.opts.skipUnlock) {\n // unlock the device to prepare it for testing\n await helpers.unlock(this, this.adb, this.caps);\n } else {\n this.log.debug(`'skipUnlock' capability set, so skipping device unlock`);\n }\n\n // set up app under test\n // prepare our actual AUT, get it on the device, etc...\n await this.initAUT();\n\n //Adding AUT package name in the capabilities if package name not exist in caps\n if (!this.caps.appPackage) {\n this.caps.appPackage = appInfo.appPackage;\n }\n if (!this.caps.appWaitPackage) {\n this.caps.appWaitPackage = appInfo.appWaitPackage || appInfo.appPackage || this.caps.appPackage;\n }\n if (this.caps.appActivity) {\n this.caps.appActivity = qualifyActivityName(this.caps.appActivity, this.caps.appPackage);\n } else {\n this.caps.appActivity = qualifyActivityName(appInfo.appActivity, this.caps.appPackage);\n }\n if (this.caps.appWaitActivity) {\n this.caps.appWaitActivity = qualifyActivityName(this.caps.appWaitActivity, this.caps.appWaitPackage);\n } else {\n this.caps.appWaitActivity = qualifyActivityName(appInfo.appWaitActivity || appInfo.appActivity || this.caps.appActivity,\n this.caps.appWaitPackage);\n }\n\n // launch espresso and wait till its online and we have a session\n await this.espresso.startSession(this.caps);\n if (this.caps.autoLaunch === false) {\n this.log.info(`Not waiting for the application activity to start because 'autoLaunch' is disabled`);\n } else {\n await this.adb.waitForActivity(this.caps.appWaitPackage, this.caps.appWaitActivity, this.opts.appWaitDuration);\n }\n // if we want to immediately get into a webview, set our context\n // appropriately\n if (this.opts.autoWebview) {\n await this.initWebview();\n }\n\n // now that everything has started successfully, turn on proxying so all\n // subsequent session requests go straight to/from espresso\n this.jwpProxyActive = true;\n\n await this.addDeviceInfoToCaps();\n }\n\n async setWindowAnimationState(isEnabled) {\n const isAnimationOn = await this.adb.isAnimationOn();\n const shouldDisableAnimation = !isEnabled && isAnimationOn;\n const shouldEnableAnimation = isEnabled && !isAnimationOn;\n\n if (shouldDisableAnimation) {\n this.log.debug('Disabling window animation as \"disableWindowAnimation\" capability is set to true/fallback to default value \"true\"');\n await this.adb.setAnimationState(false);\n this.wasAnimationEnabled = true;\n } else if (shouldEnableAnimation) {\n this.log.debug('Enabling window animation as \"disableWindowAnimation\" capability is set to false');\n await this.adb.setAnimationState(true);\n this.wasAnimationEnabled = false;\n } else {\n this.log.debug(`Window animation is already ${isEnabled ? 'enabled' : 'disabled'}`);\n }\n }\n\n async initWebview () {\n const viewName = androidCommands.defaultWebviewName.call(this);\n const timeout = this.opts.autoWebviewTimeout || 2000;\n this.log.info(`Setting webview to context '${viewName}' with timeout ${timeout}ms`);\n await retryInterval(timeout / 500, 500, this.setContext.bind(this), viewName);\n }\n\n async addDeviceInfoToCaps () {\n const {\n apiVersion,\n platformVersion,\n manufacturer,\n model,\n realDisplaySize,\n displayDensity,\n } = await this.mobileGetDeviceInfo();\n this.caps.deviceApiLevel = parseInt(apiVersion, 10);\n this.caps.platformVersion = platformVersion;\n this.caps.deviceScreenSize = realDisplaySize;\n this.caps.deviceScreenDensity = displayDensity;\n this.caps.deviceModel = model;\n this.caps.deviceManufacturer = manufacturer;\n }\n\n initEspressoServer () {\n // now that we have package and activity, we can create an instance of\n // espresso with the appropriate data\n this.espresso = new EspressoRunner(this.log, {\n host: this.opts.remoteAdbHost || this.opts.host || '127.0.0.1',\n systemPort: this.opts.systemPort,\n devicePort: DEVICE_PORT,\n adb: this.adb,\n apk: this.opts.app,\n tmpDir: this.opts.tmpDir,\n appPackage: this.opts.appPackage,\n appActivity: this.opts.appActivity,\n forceEspressoRebuild: !!this.opts.forceEspressoRebuild,\n espressoBuildConfig: this.opts.espressoBuildConfig,\n showGradleLog: !!this.opts.showGradleLog,\n serverLaunchTimeout: this.opts.espressoServerLaunchTimeout,\n androidInstallTimeout: this.opts.androidInstallTimeout,\n skipServerInstallation: this.opts.skipServerInstallation,\n useKeystore: this.opts.useKeystore,\n keystorePath: this.opts.keystorePath,\n keystorePassword: this.opts.keystorePassword,\n keyAlias: this.opts.keyAlias,\n keyPassword: this.opts.keyPassword,\n disableSuppressAccessibilityService: this.opts.disableSuppressAccessibilityService,\n });\n this.proxyReqRes = this.espresso.proxyReqRes.bind(this.espresso);\n this.proxyCommand = this.espresso.proxyCommand.bind(this.espresso);\n }\n\n // TODO this method is mostly duplicated from uiautomator2\n async initAUT () {\n // set the localized strings for the current language from the apk\n // TODO: incorporate changes from appium#5308 which fix a race cond-\n // ition bug in old appium and need to be replicated here\n // this.apkStrings[this.opts.language] = await androidHelpers.pushStrings(\n // this.opts.language, this.adb, this.opts);\n\n // Uninstall any uninstallOtherPackages which were specified in caps\n if (this.opts.uninstallOtherPackages) {\n await helpers.uninstallOtherPackages(\n this.adb,\n helpers.parseArray(this.opts.uninstallOtherPackages),\n [SETTINGS_HELPER_PKG_ID, TEST_APK_PKG]\n );\n }\n\n if (!this.opts.app) {\n if (this.opts.fullReset) {\n this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');\n }\n this.log.debug('No app capability. Assuming it is already on the device');\n if (this.opts.fastReset) {\n await helpers.resetApp(this.adb, this.opts);\n }\n }\n\n if (!this.opts.skipUninstall) {\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n if (this.opts.app) {\n await helpers.installApk(this.adb, this.opts);\n }\n if (this.opts.skipServerInstallation) {\n this.log.debug('skipServerInstallation capability is set. Not installig espresso-server ');\n } else {\n await this.espresso.installTestApk();\n try {\n await this.adb.addToDeviceIdleWhitelist(SETTINGS_HELPER_PKG_ID, TEST_APK_PKG);\n } catch (e) {\n this.log.warn(`Cannot add server packages to the Doze whitelist. Original error: ` +\n (e.stderr || e.message));\n }\n }\n }\n\n async deleteSession () {\n this.log.debug('Deleting espresso session');\n\n const screenRecordingStopTasks = [async () => {\n if (!_.isEmpty(this._screenRecordingProperties)) {\n await this.stopRecordingScreen();\n }\n }, async () => {\n if (await this.mobileIsMediaProjectionRecordingRunning()) {\n await this.mobileStopMediaProjectionRecording();\n }\n }, async () => {\n if (!_.isEmpty(this._screenStreamingProps)) {\n await this.mobileStopScreenStreaming();\n }\n }];\n\n await androidHelpers.removeAllSessionWebSocketHandlers(this.server, this.sessionId);\n\n if (this.espresso) {\n if (this.jwpProxyActive) {\n await this.espresso.deleteSession();\n }\n this.espresso = null;\n }\n this.jwpProxyActive = false;\n\n if (this.adb) {\n await B.all(screenRecordingStopTasks.map((task) => {\n (async () => {\n try {\n await task();\n } catch (ign) {}\n })();\n }));\n if (this.wasAnimationEnabled) {\n try {\n await this.adb.setAnimationState(true);\n } catch (err) {\n this.log.warn(`Unable to reset animation: ${err.message}`);\n }\n }\n if (!this.isChromeSession && this.opts.appPackage && !this.opts.dontStopAppOnReset) {\n await this.adb.forceStop(this.opts.appPackage);\n }\n if (this.opts.fullReset && !this.opts.skipUninstall && !this.appOnDevice) {\n this.log.debug(`FULL_RESET set to 'true', Uninstalling '${this.opts.appPackage}'`);\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n await this.adb.stopLogcat();\n if (this.opts.reboot) {\n let avdName = this.opts.avd.replace('@', '');\n this.log.debug(`closing emulator '${avdName}'`);\n await this.adb.killEmulator(avdName);\n }\n if (await this.adb.getApiLevel() >= 28) { // Android P\n this.log.info('Restoring hidden api policy to the device default configuration');\n await this.adb.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError);\n }\n }\n await super.deleteSession();\n if (this.opts.systemPort !== undefined) {\n try {\n await this.adb.removePortForward(this.opts.systemPort);\n } catch (error) {\n this.log.warn(`Unable to remove port forward '${error.message}'`);\n //Ignore, this block will also be called when we fall in catch block\n // and before even port forward.\n }\n }\n }\n\n async onSettingsUpdate () {\n // intentionally do nothing here, since commands.updateSettings proxies\n // settings to the espresso server already\n }\n\n proxyActive (sessionId) {\n super.proxyActive(sessionId);\n\n // we always have an active proxy to the espresso server\n return true;\n }\n\n canProxy (sessionId) {\n super.canProxy(sessionId);\n\n // we can always proxy to the espresso server\n return true;\n }\n\n getProxyAvoidList (sessionId) {\n super.getProxyAvoidList(sessionId);\n // we are maintaining two sets of NO_PROXY lists, one for chromedriver(CHROME_NO_PROXY)\n // and one for Espresso(NO_PROXY), based on current context will return related NO_PROXY list\n this.jwpProxyAvoid = _.isNil(this.chromedriver) ? NO_PROXY : CHROME_NO_PROXY;\n if (this.opts.nativeWebScreenshot) {\n this.jwpProxyAvoid = [...this.jwpProxyAvoid, ['GET', new RegExp('^/session/[^/]+/screenshot')]];\n }\n\n return this.jwpProxyAvoid;\n }\n\n get isChromeSession () {\n return helpers.isChromeBrowser(this.opts.browserName);\n }\n\n get appOnDevice () {\n return !this.opts.app && this.helpers.isPackageOrBundle(this.opts.appPackage);\n }\n}\n\n// first add the android-driver commands which we will fall back to\nfor (let [cmd, fn] of _.toPairs(androidCommands)) {\n // we do some different/special things with these methods\n if (!_.includes(['defaultWebviewName'], cmd)) {\n EspressoDriver.prototype[cmd] = fn;\n }\n}\n\n// then overwrite with any espresso-specific commands\nfor (let [cmd, fn] of _.toPairs(commands)) {\n EspressoDriver.prototype[cmd] = fn;\n}\n\nexport { EspressoDriver };\nexport default EspressoDriver;\n"],"mappings":"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"}
@@ -45,6 +45,9 @@ let espressoCapConstraints = {
45
45
  },
46
46
  appLocale: {
47
47
  isObject: true,
48
+ },
49
+ disableWindowAnimation: {
50
+ isBoolean: true,
48
51
  }
49
52
  };
50
53
 
package/lib/driver.js CHANGED
@@ -393,15 +393,10 @@ class EspressoDriver extends BaseDriver {
393
393
  // start an avd, set the language/locale, pick an emulator, etc...
394
394
  // TODO with multiple devices we'll need to parameterize this
395
395
  await helpers.initDevice(this.adb, this.opts);
396
+
396
397
  // https://github.com/appium/appium-espresso-driver/issues/72
397
- if (await this.adb.isAnimationOn()) {
398
- try {
399
- await this.adb.setAnimationState(false);
400
- this.wasAnimationEnabled = true;
401
- } catch (err) {
402
- this.log.warn(`Unable to turn off animations: ${err.message}`);
403
- }
404
- }
398
+ // default state is window animation disabled
399
+ await this.setWindowAnimationState(this.caps.disableWindowAnimation === false);
405
400
 
406
401
  // set actual device name, udid
407
402
  this.caps.deviceName = this.adb.curDeviceId;
@@ -463,6 +458,24 @@ class EspressoDriver extends BaseDriver {
463
458
  await this.addDeviceInfoToCaps();
464
459
  }
465
460
 
461
+ async setWindowAnimationState(isEnabled) {
462
+ const isAnimationOn = await this.adb.isAnimationOn();
463
+ const shouldDisableAnimation = !isEnabled && isAnimationOn;
464
+ const shouldEnableAnimation = isEnabled && !isAnimationOn;
465
+
466
+ if (shouldDisableAnimation) {
467
+ this.log.debug('Disabling window animation as "disableWindowAnimation" capability is set to true/fallback to default value "true"');
468
+ await this.adb.setAnimationState(false);
469
+ this.wasAnimationEnabled = true;
470
+ } else if (shouldEnableAnimation) {
471
+ this.log.debug('Enabling window animation as "disableWindowAnimation" capability is set to false');
472
+ await this.adb.setAnimationState(true);
473
+ this.wasAnimationEnabled = false;
474
+ } else {
475
+ this.log.debug(`Window animation is already ${isEnabled ? 'enabled' : 'disabled'}`);
476
+ }
477
+ }
478
+
466
479
  async initWebview () {
467
480
  const viewName = androidCommands.defaultWebviewName.call(this);
468
481
  const timeout = this.opts.autoWebviewTimeout || 2000;
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appium-espresso-driver",
3
- "version": "2.16.1",
3
+ "version": "2.18.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appium-espresso-driver",
9
- "version": "2.16.1",
9
+ "version": "2.18.0",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@babel/runtime": "^7.4.3",
@@ -1124,7 +1124,7 @@
1124
1124
  }
1125
1125
  },
1126
1126
  "node_modules/@types/node": {
1127
- "version": "18.15.0",
1127
+ "version": "18.15.5",
1128
1128
  "license": "MIT"
1129
1129
  },
1130
1130
  "node_modules/@types/normalize-package-data": {
@@ -1445,7 +1445,7 @@
1445
1445
  "license": "ISC"
1446
1446
  },
1447
1447
  "node_modules/appium-chromedriver": {
1448
- "version": "5.3.0",
1448
+ "version": "5.3.1",
1449
1449
  "hasInstallScript": true,
1450
1450
  "license": "Apache-2.0",
1451
1451
  "dependencies": {
@@ -2628,7 +2628,7 @@
2628
2628
  }
2629
2629
  },
2630
2630
  "node_modules/graceful-fs": {
2631
- "version": "4.2.10",
2631
+ "version": "4.2.11",
2632
2632
  "license": "ISC"
2633
2633
  },
2634
2634
  "node_modules/handlebars": {
@@ -3141,7 +3141,7 @@
3141
3141
  "license": "ISC"
3142
3142
  },
3143
3143
  "node_modules/marked": {
3144
- "version": "4.2.12",
3144
+ "version": "4.3.0",
3145
3145
  "extraneous": true,
3146
3146
  "license": "MIT",
3147
3147
  "bin": {
@@ -4043,7 +4043,7 @@
4043
4043
  "license": "MIT"
4044
4044
  },
4045
4045
  "node_modules/safe-stable-stringify": {
4046
- "version": "2.4.2",
4046
+ "version": "2.4.3",
4047
4047
  "extraneous": true,
4048
4048
  "license": "MIT",
4049
4049
  "engines": {
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "automated testing",
8
8
  "android"
9
9
  ],
10
- "version": "2.16.1",
10
+ "version": "2.18.0",
11
11
  "author": "Appium Contributors",
12
12
  "license": "Apache-2.0",
13
13
  "repository": {
@@ -39,7 +39,8 @@
39
39
  ],
40
40
  "mainClass": "EspressoDriver",
41
41
  "scripts": {
42
- "print-espresso-path": "./scripts/print-espresso-path.js"
42
+ "print-espresso-path": "./scripts/print-espresso-path.js",
43
+ "build-espresso.js": "./scripts/build-espresso.js"
43
44
  }
44
45
  },
45
46
  "main": "./build/index.js",
@@ -0,0 +1,56 @@
1
+ const _ = require('lodash');
2
+ const path = require('path');
3
+ const { logger, fs } = require('@appium/support');
4
+ const { ServerBuilder } = require('../build/lib/server-builder.js');
5
+
6
+ const LOG = new logger.getLogger('EspressoBuild');
7
+
8
+ const ROOT_DIR = path.resolve(__dirname, '..');
9
+ const ESPRESSO_SERVER_ROOT = path.join(ROOT_DIR, 'espresso-server');
10
+
11
+ const ESPRESSO_SERVER_BUILD = path.join(ESPRESSO_SERVER_ROOT, 'app', 'build');
12
+
13
+ async function buildEspressoServer () {
14
+
15
+ LOG.info(`Deleting the build directory ${ESPRESSO_SERVER_BUILD}`);
16
+
17
+ const opts = {
18
+ serverPath: ESPRESSO_SERVER_ROOT,
19
+ showGradleLog: !_.isEmpty(process.env.SHOW_GRADLE_LOG) && ['1', 'true'].includes(_.toLower(process.env.SHOW_GRADLE_LOG))
20
+ };
21
+
22
+ if (process.env.TEST_APP_PACKAGE) {
23
+ opts.testAppPackage = process.env.TEST_APP_PACKAGE;
24
+ }
25
+
26
+ if (process.env.ESPRESSO_BUILD_CONFIG) {
27
+ if (!(await fs.exists(process.env.ESPRESSO_BUILD_CONFIG))) {
28
+ throw new Error(`'${process.env.ESPRESSO_BUILD_CONFIG}' did not exist. Please set the path as an absolute path.`);
29
+ }
30
+ try {
31
+ const buildConfigurationStr = await fs.readFile(process.env.ESPRESSO_BUILD_CONFIG, 'utf8');
32
+ opts.buildConfiguration = JSON.parse(buildConfigurationStr);
33
+ LOG.info(`The espresso build config is ${JSON.stringify(opts.buildConfiguration)}`);
34
+ } catch (e) {
35
+ throw new Error(`Failed to parse the ${process.env.ESPRESSO_BUILD_CONFIG}. `
36
+ `Please make sure that the JSON is valid format. Error: ${e}`);
37
+ }
38
+ }
39
+
40
+ const builder = new ServerBuilder(LOG, opts);
41
+ try {
42
+ await builder.build();
43
+ } catch (e) {
44
+ throw new Error(`Failed to build the espresso server. `
45
+ `SHOW_GRADLE_LOG=true environment variable helps to check the gradle log. Error: ${e}`);
46
+ }
47
+
48
+ const dstPath = path.resolve(ESPRESSO_SERVER_ROOT, 'app', 'build', 'outputs', 'apk', 'androidTest', 'debug', 'app-debug-androidTest.apk');
49
+ if (await fs.exists(dstPath)) {
50
+ LOG.info(`Full path to the server APK: ${dstPath}`);
51
+ } else {
52
+ LOG.info(`Full path to the server build folder: ${ESPRESSO_SERVER_BUILD}`);
53
+ }
54
+ }
55
+
56
+ (async () => await buildEspressoServer())();