appium-uiautomator2-driver 2.12.1 → 2.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [2.12.2](https://github.com/appium/appium-uiautomator2-driver/compare/v2.12.1...v2.12.2) (2023-01-12)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * specify supported non-standard commands in newMethodMap ([8a51004](https://github.com/appium/appium-uiautomator2-driver/commit/8a5100486cc3d39c0a8f0e77b2eb574ce1a01e04))
7
+
1
8
  ## [2.12.1](https://github.com/appium/appium-uiautomator2-driver/compare/v2.12.0...v2.12.1) (2022-12-24)
2
9
 
3
10
 
package/README.md CHANGED
@@ -218,13 +218,13 @@ extras | The result of [getExtras](https://developer.android.com/reference/andro
218
218
 
219
219
  UiAutomator2 driver supports the following location strategies:
220
220
 
221
- Name | Description | Example
222
- --- | --- | ---
223
- id | This strategy is mapped to the native UiAutomator's `By.res` [locator](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#res(java.lang.String)) (exact match of element's resource name). Package identifier prefix is added automatically if unset and is equal to the identifier of the current application under test. | 'com.mycompany:id/resourceId'
224
- accessibilityId | This strategy is mapped to the native UiAutomator's `By.desc` [locator](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#desc(java.lang.String)) (exact match of element's content description). | 'my description'
225
- className | This strategy is mapped to the native UiAutomator's `By.clazz` [locator](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#clazz(java.lang.String)) (exact match of element's class). | 'android.view.View'
226
- `-android uiautomator` | This strategy is mapped to the native UiAutomator's `UiSelector` [locator](https://developer.android.com/reference/androidx/test/uiautomator/UiSelector)). It is even possible to perform some advanced operations, like scrolling, with this locator type. Check [Guide on UiAutomator Locator Types](docs/uiautomator-uiselector.md) | `new UiScrollable(new UiSelector().resourceId(\"android:id/list\")).scrollIntoView(new UiSelector().text(\"Radio Group\"))`
227
- xpath | For elements lookup Xpath strategy the driver uses the same XML tree that is generated by page source API. Only Xpath 1.0 is supported for appium-uiatomator2-server versions below 4.25.0. All server versions starting from 4.25.0 support both Xpath 1.0 and 2.0 | `By.xpath("//android.view.View[@text=\"Regular\" and @checkable=\"true\"]")`
221
+ Name | Description | Speed Ranking | Example
222
+ --- | --- | --- | ---
223
+ id | This strategy is mapped to the native UiAutomator's `By.res` [locator](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#res(java.lang.String)) (exact match of element's resource name). Package identifier prefix is added automatically if unset and is equal to the identifier of the current application under test. | `⭐⭐⭐⭐⭐` | 'com.mycompany:id/resourceId'
224
+ accessibilityId | This strategy is mapped to the native UiAutomator's `By.desc` [locator](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#desc(java.lang.String)) (exact match of element's content description). | `⭐⭐⭐⭐⭐` | 'my description'
225
+ className | This strategy is mapped to the native UiAutomator's `By.clazz` [locator](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#clazz(java.lang.String)) (exact match of element's class). | `⭐⭐⭐⭐⭐` | 'android.view.View'
226
+ -android uiautomator | This strategy is mapped to the native UiAutomator's `UiSelector` [locator](https://developer.android.com/reference/androidx/test/uiautomator/UiSelector)). It is even possible to perform some advanced operations, like scrolling, with this locator type. Check [Guide on UiAutomator Locator Types](docs/uiautomator-uiselector.md) | `⭐⭐⭐⭐` | new UiScrollable(new UiSelector().resourceId(\"android:id/list\")).scrollIntoView(new UiSelector().text(\"Radio Group\"))
227
+ xpath | For elements lookup Xpath strategy the driver uses the same XML tree that is generated by page source API. Only Xpath 1.0 is supported for appium-uiatomator2-server versions below 4.25.0. All server versions starting from 4.25.0 support both Xpath 1.0 and 2.0 | `⭐⭐⭐` | By.xpath("//android.view.View[@text=\"Regular\" and @checkable=\"true\"]")
228
228
 
229
229
 
230
230
  ## Parallel Tests
@@ -9,6 +9,7 @@ require("source-map-support/register");
9
9
  var _lodash = _interopRequireDefault(require("lodash"));
10
10
  var _driver = require("appium/driver");
11
11
  var _uiautomator = require("./uiautomator2");
12
+ var _methodMap = require("./method-map");
12
13
  var _support = require("appium/support");
13
14
  var _asyncbox = require("asyncbox");
14
15
  var _bluebird = _interopRequireDefault(require("bluebird"));
@@ -34,6 +35,7 @@ const NO_PROXY = [['GET', new RegExp('^/session/(?!.*/)')], ['GET', new RegExp('
34
35
  const CHROME_NO_PROXY = [['GET', new RegExp('^/session/[^/]+/appium')], ['GET', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')], ['GET', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')], ['POST', new RegExp('^/session/[^/]+/touch/perform')], ['POST', new RegExp('^/session/[^/]+/execute$')], ['POST', new RegExp('^/session/[^/]+/execute/sync')], ['GET', new RegExp('^/session/[^/]+/log/types$')], ['POST', new RegExp('^/session/[^/]+/log$')], ['GET', new RegExp('^/session/[^/]+/se/log/types$')], ['POST', new RegExp('^/session/[^/]+/se/log$')]];
35
36
  const MEMOIZED_FUNCTIONS = ['getStatusBarHeight', 'getDevicePixelRatio'];
36
37
  class AndroidUiautomator2Driver extends _driver.BaseDriver {
38
+ static newMethodMap = _methodMap.newMethodMap;
37
39
  constructor(opts = {}, shouldValidateCaps = true) {
38
40
  delete opts.shell;
39
41
  super(opts, shouldValidateCaps);
@@ -524,4 +526,4 @@ for (let [cmd, fn] of _lodash.default.toPairs(_index.default)) {
524
526
  }
525
527
  var _default = AndroidUiautomator2Driver;
526
528
  exports.default = _default;
527
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJoZWxwZXJzIiwiT2JqZWN0IiwiYXNzaWduIiwidWlhdXRvbWF0b3IySGVscGVycyIsImFuZHJvaWRIZWxwZXJzIiwiREVWSUNFX1BPUlRfUkFOR0UiLCJERVZJQ0VfUE9SVF9BTExPQ0FUSU9OX0dVQVJEIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwidG1wZGlyIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwiREVWSUNFX1BPUlQiLCJNSlBFR19TRVJWRVJfREVWSUNFX1BPUlQiLCJMT0NBTEhPU1RfSVA0IiwiTk9fUFJPWFkiLCJSZWdFeHAiLCJDSFJPTUVfTk9fUFJPWFkiLCJNRU1PSVpFRF9GVU5DVElPTlMiLCJBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIiwiQmFzZURyaXZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInNoZWxsIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJ1aWF1dG9tYXRvcjIiLCJqd3BQcm94eUFjdGl2ZSIsImRlZmF1bHRJTUUiLCJqd3BQcm94eUF2b2lkIiwiYXBrU3RyaW5ncyIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwiYWxsb3dJbnZpc2libGVFbGVtZW50cyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJmbiIsIl8iLCJtZW1vaXplIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGVmYXVsdHMiLCJpc0Nocm9tZVNlc3Npb24iLCJsb2ciLCJpbmZvIiwicGtnIiwiYWN0aXZpdHkiLCJnZXRDaHJvbWVQa2ciLCJicm93c2VyTmFtZSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsInJlYm9vdCIsInNldEF2ZEZyb21DYXBhYmlsaXRpZXMiLCJhcHAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwiQVBLU19FWFRFTlNJT04iLCJjaGVja0FwcFByZXNlbnQiLCJzdGFydFVpQXV0b21hdG9yMlNlc3Npb24iLCJmaWxsRGV2aWNlRGV0YWlscyIsIm1qcGVnU2NyZWVuc2hvdFVybCIsIm1qcGVnU3RyZWFtIiwibWpwZWciLCJNSnBlZ1N0cmVhbSIsInN0YXJ0IiwiZSIsImRlbGV0ZVNlc3Npb24iLCJwaXhlbFJhdGlvIiwiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsInN0YXRCYXJIZWlnaHQiLCJnZXRTdGF0dXNCYXJIZWlnaHQiLCJ2aWV3cG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJkcml2ZXJEYXRhIiwiZ2V0U2Vzc2lvbiIsInNlc3Npb25EYXRhIiwiZGVidWciLCJ1aWEyRGF0YSIsImp3cHJveHkiLCJjb21tYW5kIiwiaXNFbXVsYXRvciIsImFkYiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImFsbG9jYXRlU3lzdGVtUG9ydCIsImZvcndhcmRQb3J0IiwibG9jYWxQb3J0IiwiY2hlY2tQb3J0U3RhdHVzIiwic3lzdGVtUG9ydCIsIl9oYXNTeXN0ZW1Qb3J0SW5DYXBzIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwicmVsZWFzZVN5c3RlbVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0IiwibWpwZWdTZXJ2ZXJQb3J0IiwicmVsZWFzZU1qcGVnU2VydmVyUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJjcmVhdGVBREIiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJoYXNWYWx1ZSIsImdwc0VuYWJsZWQiLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwid2FybiIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiaW5pdERldmljZSIsImluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEFuaW1hdGlvblN0YXRlIiwiX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkIiwiaW5pdEFVVCIsInN0YXJ0U2Vzc2lvbiIsImFkZERldmljZUluZm9Ub0NhcHMiLCJza2lwVW5sb2NrIiwidW5sb2NrIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwiZW5zdXJlQXBwU3RhcnRzIiwib3JpZW50YXRpb24iLCJzZXRPcmllbnRhdGlvbiIsImF1dG9XZWJ2aWV3Iiwidmlld05hbWUiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJhdXRvV2Vidmlld1RpbWVvdXQiLCJyZXRyeUludGVydmFsIiwic2V0Q29udGV4dCIsImFwaVZlcnNpb24iLCJtYW51ZmFjdHVyZXIiLCJtb2RlbCIsInJlYWxEaXNwbGF5U2l6ZSIsImRpc3BsYXlEZW5zaXR5IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsImRldmljZUFwaUxldmVsIiwicGFyc2VJbnQiLCJkZXZpY2VTY3JlZW5TaXplIiwiZGV2aWNlU2NyZWVuRGVuc2l0eSIsImRldmljZU1vZGVsIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwidWlhdXRvbWF0b3IyT3B0cyIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicmVhZFRpbWVvdXQiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCIsIlVpQXV0b21hdG9yMlNlcnZlciIsInByb3h5UmVxUmVzIiwicHJveHlDb21tYW5kIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsImluc3RhbGxTZXJ2ZXJBcGsiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJzdGRlcnIiLCJtZXNzYWdlIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwibWFwIiwiaW5zdGFsbE90aGVyQXBrcyIsIm5vUmVzZXQiLCJpc0FwcEluc3RhbGxlZCIsIm5vU2lnbiIsImNoZWNrQXBrQ2VydCIsInJlcXVpcmVEZWZhdWx0Q2VydCIsInNpZ25BcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImZhc3RSZXNldCIsInJlc2V0QXBwIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJmb3JjZUFwcExhdW5jaCIsInByb2Nlc3NFeGlzdHMiLCJzdGFydEFwcCIsImFjdGlvbiIsImludGVudEFjdGlvbiIsImNhdGVnb3J5IiwiaW50ZW50Q2F0ZWdvcnkiLCJmbGFncyIsImludGVudEZsYWdzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsIndhaXRGb3JMYXVuY2giLCJhcHBXYWl0Rm9yTGF1bmNoIiwid2FpdER1cmF0aW9uIiwiYXBwV2FpdER1cmF0aW9uIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJzdG9wQXBwIiwiZG9udFN0b3BBcHBPblJlc2V0IiwicmV0cnkiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInRhc2siLCJpZ24iLCJ1bmljb2RlS2V5Ym9hcmQiLCJyZXNldEtleWJvYXJkIiwic2V0SU1FIiwiZW5kQW5kcm9pZENvdmVyYWdlIiwiYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50IiwiYnJvYWRjYXN0IiwiZm9yY2VTdG9wIiwic3RvcExvZ2NhdCIsImVycm9yIiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsImF2ZE5hbWUiLCJraWxsRW11bGF0b3IiLCJzdG9wIiwiZnMiLCJleGlzdHMiLCJ3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCIsIndyYXBwZWQiLCJyZXN0YXJ0IiwicHJveHlBY3RpdmUiLCJjYW5Qcm94eSIsImdldFByb3h5QXZvaWRMaXN0IiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsImlzQ2hyb21lQnJvd3NlciIsImNtZCIsInRvUGFpcnMiLCJhbmRyb2lkQ29tbWFuZHMiLCJwcm90b3R5cGUiLCJjb21tYW5kcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIERldmljZVNldHRpbmdzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQge1xuICBVaUF1dG9tYXRvcjJTZXJ2ZXIsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEXG59IGZyb20gJy4vdWlhdXRvbWF0b3IyJztcbmltcG9ydCB7IGZzLCB1dGlsLCBtanBlZyB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgY29tbWFuZHMgZnJvbSAnLi9jb21tYW5kcy9pbmRleCc7XG5pbXBvcnQgeyBERUZBVUxUX0FEQl9QT1JUIH0gZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQgdWlhdXRvbWF0b3IySGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgYW5kcm9pZEhlbHBlcnMsIGFuZHJvaWRDb21tYW5kcywgU0VUVElOR1NfSEVMUEVSX1BLR19JRFxufSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDYXBDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSwgY2hlY2tQb3J0U3RhdHVzIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT04gfSBmcm9tICcuL2V4dGVuc2lvbnMnO1xuXG5cbmNvbnN0IGhlbHBlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB1aWF1dG9tYXRvcjJIZWxwZXJzLCBhbmRyb2lkSGVscGVycyk7XG5cbi8vIFRoZSByYW5nZSBvZiBwb3J0cyB3ZSBjYW4gdXNlIG9uIHRoZSBzeXN0ZW0gZm9yIGNvbW11bmljYXRpbmcgdG8gdGhlXG4vLyBVaUF1dG9tYXRvcjIgSFRUUCBzZXJ2ZXIgb24gdGhlIGRldmljZVxuY29uc3QgREVWSUNFX1BPUlRfUkFOR0UgPSBbODIwMCwgODI5OV07XG5cbi8vIFRoZSBndWFyZCBpcyBuZWVkZWQgdG8gYXZvaWQgZHluYW1pYyBzeXN0ZW0gcG9ydCBhbGxvY2F0aW9uIGNvbmZsaWN0cyBmb3Jcbi8vIHBhcmFsbGVsIGRyaXZlciBzZXNzaW9uc1xuY29uc3QgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChcbiAgcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCAndWlhMl9kZXZpY2VfcG9ydF9ndWFyZCcpLFxuICB7dGltZW91dDogMjUsIHRyeVJlY292ZXJ5OiB0cnVlfVxuKTtcblxuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IFVpQXV0b21hdG9yMiBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuIFdlIHdpbGwgZm9yd2FyZFxuLy8gb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGUgZGV2aWNlLlxuY29uc3QgREVWSUNFX1BPUlQgPSA2NzkwO1xuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IHRoZSBVaUF1dG9tYXRvcjIgTUpQRUcgc2VydmVyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS5cbi8vIFdlIHdpbGwgZm9yd2FyZCBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZVxuLy8gZGV2aWNlLlxuY29uc3QgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUID0gNzgxMDtcblxuY29uc3QgTE9DQUxIT1NUX0lQNCA9ICcxMjcuMC4wLjEnO1xuXG4vLyBOT19QUk9YWSBjb250YWlucyB0aGUgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIFVpQXV0b21hdG9yMiBzZXJ2ZXIuXG4vLyBUT0RPOiAgQWRkIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogTmVlZCB0byBzZWdyZWdhdGUgdGhlIHBhdGhzIGJldHRlciB3YXkgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aGVyZXZlciBhcHBsaWNhYmxlLlxuLy8gKE5vdCBzZWdyZWdhdGluZyByaWdodCBhd2F5IGJlY2F1c2UgbW9yZSBwYXRocyB0byBiZSBhZGRlZCBpbiB0aGUgTk9fUFJPWFkgbGlzdClcbmNvbnN0IE5PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi8oPyEuKi8pJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydF9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnQvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9bXi9dKy9jdXJyZW50X2FjdGl2aXR5JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9wYWNrYWdlJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2F0dHJpYnV0ZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9kaXNwbGF5ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZW5hYmxlZCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9sb2NhdGlvbl9pbl92aWV3JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL25hbWUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9zZWxlY3RlZCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90aW1lb3V0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvW14vXStfYWxlcnQkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWN0aW9ucycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwL1teL10nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvc3RhcnRfYWN0aXZpdHknKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2NvbXBhcmVfaW1hZ2VzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS8oPyFzZXRfY2xpcGJvYXJkKVteL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2VsZW1lbnQvW14vXSsvcmVwbGFjZV92YWx1ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9lbGVtZW50L1teL10rL3ZhbHVlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2dldFBlcmZvcm1hbmNlRGF0YScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9wZXJmb3JtYW5jZURhdGEvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZXhlY3V0ZV9kcml2ZXInKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RhcnRfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdG9wX3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vLipldmVudCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsva2V5cycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvY2F0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlX2FzeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3dpbmRvdy9yZWN0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gQ2hyb21lZHJpdmVyLlxuY29uc3QgQ0hST01FX05PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvcmVjdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcblxuICAvLyB0aGlzIGlzIG5lZWRlZCB0byBtYWtlIHRoZSBtb2JpbGU6IGNvbW1hbmRzIHdvcmtpbmcgaW4gd2ViIGNvbnRleHRcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZyQnKV0sXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcyQnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZyQnKV0sXG5dO1xuXG5jb25zdCBNRU1PSVpFRF9GVU5DVElPTlMgPSBbXG4gICdnZXRTdGF0dXNCYXJIZWlnaHQnLFxuICAnZ2V0RGV2aWNlUGl4ZWxSYXRpbycsXG5dO1xuXG5jbGFzcyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30sIHNob3VsZFZhbGlkYXRlQ2FwcyA9IHRydWUpIHtcbiAgICAvLyBgc2hlbGxgIG92ZXJ3cml0ZXMgYWRiLnNoZWxsLCBzbyByZW1vdmVcbiAgICBkZWxldGUgb3B0cy5zaGVsbDtcblxuICAgIHN1cGVyKG9wdHMsIHNob3VsZFZhbGlkYXRlQ2Fwcyk7XG4gICAgdGhpcy5sb2NhdG9yU3RyYXRlZ2llcyA9IFtcbiAgICAgICd4cGF0aCcsXG4gICAgICAnaWQnLFxuICAgICAgJ2NsYXNzIG5hbWUnLFxuICAgICAgJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgICAgJ2NzcyBzZWxlY3RvcicsXG4gICAgICAnLWFuZHJvaWQgdWlhdXRvbWF0b3InXG4gICAgXTtcbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBDb25zdHJhaW50cztcbiAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307IC8vIG1hcCBvZiBsYW5ndWFnZSAtPiBzdHJpbmdzIG9ialxuXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2UsIGFsbG93SW52aXNpYmxlRWxlbWVudHM6IGZhbHNlfSxcbiAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIC8vIGhhbmRsZSB3ZWJ2aWV3IG1lY2hhbmljcyBmcm9tIEFuZHJvaWREcml2ZXJcbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycyA9IHt9O1xuXG4gICAgLy8gbWVtb2l6ZSBmdW5jdGlvbnMgaGVyZSwgc28gdGhhdCB0aGV5IGFyZSBkb25lIG9uIGEgcGVyLWluc3RhbmNlIGJhc2lzXG4gICAgZm9yIChjb25zdCBmbiBvZiBNRU1PSVpFRF9GVU5DVElPTlMpIHtcbiAgICAgIHRoaXNbZm5dID0gXy5tZW1vaXplKHRoaXNbZm5dKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlRGVzaXJlZENhcHMoY2FwcykgJiYgYW5kcm9pZEhlbHBlcnMudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IHRoaXMuY2FwcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oXCJXZSdyZSBnb2luZyB0byBydW4gYSBDaHJvbWUtYmFzZWQgc2Vzc2lvblwiKTtcbiAgICAgICAgbGV0IHtwa2csIGFjdGl2aXR5fSA9IGhlbHBlcnMuZ2V0Q2hyb21lUGtnKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gICAgICAgIHRoaXMub3B0cy5hcHBQYWNrYWdlID0gdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBwa2c7XG4gICAgICAgIHRoaXMub3B0cy5hcHBBY3Rpdml0eSA9IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBDaHJvbWUtdHlwZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSBhcmUgJHtwa2d9IGFuZCAke2FjdGl2aXR5fWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgIC8vIGZpbmQgYW5kIGNvcHksIG9yIGRvd25sb2FkIGFuZCB1bnppcCBhbiBhcHAgdXJsIG9yIHBhdGhcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAodGhpcy5vcHRzLmFwcCwgW0FQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBQcmVzZW50KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdGFydGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYE5laXRoZXIgJ2FwcCcgbm9yICdhcHBQYWNrYWdlJyB3YXMgc2V0LiBTdGFydGluZyBVaUF1dG9tYXRvcjIgYCArXG4gICAgICAgICAgJ3dpdGhvdXQgdGhlIHRhcmdldCBhcHBsaWNhdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbigpO1xuICAgICAgYXdhaXQgdGhpcy5maWxsRGV2aWNlRGV0YWlscygpO1xuICAgICAgaWYgKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgTUpQRUcgc3RyZWFtIHJlYWRpbmcgVVJMOiAnJHt0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsfSdgKTtcbiAgICAgICAgdGhpcy5tanBlZ1N0cmVhbSA9IG5ldyBtanBlZy5NSnBlZ1N0cmVhbSh0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tanBlZ1N0cmVhbS5zdGFydCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtzZXNzaW9uSWQsIHRoaXMuY2Fwc107XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZpbGxEZXZpY2VEZXRhaWxzICgpIHtcbiAgICB0aGlzLmNhcHMucGl4ZWxSYXRpbyA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgIHRoaXMuY2Fwcy5zdGF0QmFySGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRTdGF0dXNCYXJIZWlnaHQoKTtcbiAgICB0aGlzLmNhcHMudmlld3BvcnRSZWN0ID0gYXdhaXQgdGhpcy5nZXRWaWV3UG9ydFJlY3QoKTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGwgb3V0IHJlc291cmNlIGluZm8gaGVyZVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGFzeW5jIGdldFNlc3Npb24gKCkge1xuICAgIGxldCBzZXNzaW9uRGF0YSA9IGF3YWl0IHN1cGVyLmdldFNlc3Npb24oKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnR2V0dGluZyBzZXNzaW9uIGRldGFpbHMgZnJvbSBzZXJ2ZXIgdG8gbWl4IGluJyk7XG4gICAgbGV0IHVpYTJEYXRhID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvJywgJ0dFVCcsIHt9KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc2Vzc2lvbkRhdGEsIHVpYTJEYXRhKTtcbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlU3lzdGVtUG9ydCAoKSB7XG4gICAgY29uc3QgZm9yd2FyZFBvcnQgPSBhc3luYyAobG9jYWxQb3J0KSA9PiB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBVaUF1dG9tYXRvcjIgU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gbG9jYWwgcG9ydCAke2xvY2FsUG9ydH1gKTtcbiAgICAgIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKGxvY2FsUG9ydCwgTE9DQUxIT1NUX0lQNCkpID09PSAnb3BlbicpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVWlBdXRvbWF0b3IyIFNlcnZlciBjYW5ub3Qgc3RhcnQgYmVjYXVzZSB0aGUgbG9jYWwgcG9ydCAjJHtsb2NhbFBvcnR9IGlzIGJ1c3kuIGAgK1xuICAgICAgICAgIGBNYWtlIHN1cmUgdGhlIHBvcnQgeW91IHByb3ZpZGUgdmlhICdzeXN0ZW1Qb3J0JyBjYXBhYmlsaXR5IGlzIG5vdCBvY2N1cGllZC4gYCArXG4gICAgICAgICAgYFRoaXMgc2l0dWF0aW9uIG1pZ2h0IG9mdGVuIGJlIGEgcmVzdWx0IG9mIGFuIGluYWNjdXJhdGUgc2Vzc2lvbnMgbWFuYWdlbWVudCwgZS5nLiBgICtcbiAgICAgICAgICBgb2xkIGF1dG9tYXRpb24gc2Vzc2lvbnMgb24gdGhlIHNhbWUgZGV2aWNlIG11c3QgYWx3YXlzIGJlIGNsb3NlZCBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZXMuYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydChsb2NhbFBvcnQsIERFVklDRV9QT1JUKTtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KSB7XG4gICAgICB0aGlzLl9oYXNTeXN0ZW1Qb3J0SW5DYXBzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBhd2FpdCBmb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfVxuXG4gICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVklDRV9QT1JUX1JBTkdFO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fX0uIGAgK1xuICAgICAgICAgIGBQbGVhc2Ugc2V0IHRoZSBhdmFpbGFibGUgcG9ydCBudW1iZXIgYnkgcHJvdmlkaW5nIHRoZSBzeXN0ZW1Qb3J0IGNhcGFiaWxpdHkgb3IgYCArXG4gICAgICAgICAgYGRvdWJsZSBjaGVjayB0aGUgcHJvY2Vzc2VzIHRoYXQgYXJlIGxvY2tpbmcgcG9ydHMgd2l0aGluIHRoaXMgcmFuZ2UgYW5kIHRlcm1pbmF0ZSBgICtcbiAgICAgICAgICBgdGhlc2Ugd2hpY2ggYXJlIG5vdCBuZWVkZWQgYW55bW9yZWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVsZWFzZVN5c3RlbVBvcnQgKCkge1xuICAgIGlmICghdGhpcy5vcHRzLnN5c3RlbVBvcnQgfHwgIXRoaXMuYWRiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hhc1N5c3RlbVBvcnRJbkNhcHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCwgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uICgpIHtcbiAgICAvLyBnZXQgZGV2aWNlIHVkaWQgZm9yIHRoaXMgc2Vzc2lvblxuICAgIGxldCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgdGhpcy5vcHRzLnVkaWQgPSB1ZGlkO1xuICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG5cbiAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgIC8vIEFEQiBpbnN0YW5jZVxuICAgIHRoaXMuYWRiID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMuY3JlYXRlQURCKHRoaXMub3B0cyk7XG5cbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG5cbiAgICBpZiAoYXBpTGV2ZWwgPCAyMSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVUlBdXRvbWF0b3IyIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFuZHJvaWQgNS4wIChMb2xsaXBvcCkuICcgK1xuICAgICAgICAnWW91IGNvdWxkIHN0aWxsIHVzZSBvdGhlciBzdXBwb3J0ZWQgYmFja2VuZHMgaW4gb3JkZXIgdG8gYXV0b21hdGUgb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAoYXBpTGV2ZWwgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICB0aGlzLmxvZy5pbmZvKCdSZWxheGluZyBoaWRkZW4gYXBpIHBvbGljeScpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SGlkZGVuQXBpUG9saWN5KCcxJywgISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgdG8gZW5hYmxlL2Rpc2FibGUgZ3BzIGJlZm9yZSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5ncHNFbmFibGVkKSkge1xuICAgICAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFRyeWluZyB0byAke3RoaXMub3B0cy5ncHNFbmFibGVkID8gJ2VuYWJsZScgOiAnZGlzYWJsZSd9IGdwcyBsb2NhdGlvbiBwcm92aWRlcmApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyKHRoaXMub3B0cy5ncHNFbmFibGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFNvcnJ5ISAnZ3BzRW5hYmxlZCcgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBjb25zdCBhcHBJbmZvID0gYXdhaXQgaGVscGVycy5nZXRMYXVuY2hJbmZvKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIC8vIGFuZCBnZXQgaXQgb250byBvdXIgJ29wdHMnIG9iamVjdCBzbyB3ZSB1c2UgaXQgZnJvbSBub3cgb25cbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0cywgYXBwSW5mbyB8fCB7fSk7XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkLCBwbGF0Zm9ybSB2ZXJzaW9uLCBzY3JlZW4gc2l6ZSwgc2NyZWVuIGRlbnNpdHksIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlsc1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICB0aGlzLmRlZmF1bHRJTUUgPSBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgVWlBdXRvbWF0b3IyIHBvcnRcbiAgICAvLyBUaGlzIGNhbGwgbXV0YXRlcyB0aGlzLm9wdHMuc3lzdGVtUG9ydCBpZiBpdCBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIFVpQXV0b21hdG9yMiBNSlBFRyBzZXJ2ZXIgcG9ydCAoaWZcbiAgICAvLyBhcHBsaWNhYmxlKVxuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgVWlBdXRvbWF0b3IyIHNlcnZlciBldGNcbiAgICBhd2FpdCB0aGlzLmluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIoKTtcblxuICAgIC8vIFNob3VsZCBiZSBhZnRlciBpbnN0YWxsaW5nIGlvLmFwcGl1bS5zZXR0aW5ncyBpbiBoZWxwZXJzLmluaXREZXZpY2VcbiAgICBpZiAodGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24gJiYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyNikpIHsgLy8gQVBJIGxldmVsIDI2IGlzIEFuZHJvaWQgOC4wLlxuICAgICAgLy8gR3JhbnRpbmcgYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9BTklNQVRJT05fU0NBTEUgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBhbmltYXRpb25zIHVuZGVyIEFQSSBsZXZlbCAyNlxuICAgICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9wdWxsLzExNjQwI2lzc3VlY29tbWVudC00MzgyNjA0NzdcbiAgICAgIC8vIGAtLW5vLXdpbmRvdy1hbmltYXRpb25gIHdvcmtzIG92ZXIgQW5kcm9pZCA4IHRvIGRpc2FibGUgYWxsIG9mIGFuaW1hdGlvbnNcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRGlzYWJsaW5nIGFuaW1hdGlvbiB2aWEgaW8uYXBwaXVtLnNldHRpbmdzJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5IGRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGFwcCB1bmRlciB0ZXN0XG4gICAgLy8gcHJlcGFyZSBvdXIgYWN0dWFsIEFVVCwgZ2V0IGl0IG9uIHRoZSBkZXZpY2UsIGV0Yy4uLlxuICAgIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuXG4gICAgLy8gQWRkaW5nIEFVVCBwYWNrYWdlIG5hbWUgaW4gdGhlIGNhcGFiaWxpdGllcyBpZiBwYWNrYWdlIG5hbWUgbm90IGV4aXN0IGluIGNhcHNcbiAgICBpZiAoIXRoaXMuY2Fwcy5hcHBQYWNrYWdlICYmIGFwcEluZm8pIHtcbiAgICAgIHRoaXMuY2Fwcy5hcHBQYWNrYWdlID0gYXBwSW5mby5hcHBQYWNrYWdlO1xuICAgIH1cblxuICAgIC8vIGxhdW5jaCBVaUF1dG9tYXRvcjIgYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLnN0YXJ0U2Vzc2lvbih0aGlzLmNhcHMpO1xuXG4gICAgYXdhaXQgdGhpcy5hZGREZXZpY2VJbmZvVG9DYXBzKCk7XG5cbiAgICAvLyBVbmxvY2sgdGhlIGRldmljZSBhZnRlciB0aGUgc2Vzc2lvbiBpcyBzdGFydGVkLlxuICAgIGlmICghdGhpcy5vcHRzLnNraXBVbmxvY2spIHtcbiAgICAgIC8vIHVubG9jayB0aGUgZGV2aWNlIHRvIHByZXBhcmUgaXQgZm9yIHRlc3RpbmdcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgJ3NraXBVbmxvY2snIGNhcGFiaWxpdHkgc2V0LCBzbyBza2lwcGluZyBkZXZpY2UgdW5sb2NrYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7IC8vIHN0YXJ0IGEgY2hyb21lZHJpdmVyIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmF1dG9MYXVuY2ggJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwU3RhcnRzKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGluaXRpYWwgb3JpZW50YXRpb24gaXMgcmVxdWVzdGVkLCBzZXQgaXRcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMub3JpZW50YXRpb24pKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBpbml0aWFsIG9yaWVudGF0aW9uIHRvICcke3RoaXMub3B0cy5vcmllbnRhdGlvbn0nYCk7XG4gICAgICBhd2FpdCB0aGlzLnNldE9yaWVudGF0aW9uKHRoaXMub3B0cy5vcmllbnRhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gaWYgd2Ugd2FudCB0byBpbW1lZGlhdGVseSBnZXQgaW50byBhIHdlYnZpZXcsIHNldCBvdXIgY29udGV4dFxuICAgIC8vIGFwcHJvcHJpYXRlbHlcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBjb25zdCB2aWV3TmFtZSA9IHRoaXMuZGVmYXVsdFdlYnZpZXdOYW1lKCk7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCB8fCAyMDAwO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwodGltZW91dCAvIDUwMCwgNTAwLCB0aGlzLnNldENvbnRleHQuYmluZCh0aGlzKSwgdmlld05hbWUpO1xuICAgIH1cblxuICAgIC8vIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0dXJuIG9uIHByb3h5aW5nIHNvIGFsbFxuICAgIC8vIHN1YnNlcXVlbnQgc2Vzc2lvbiByZXF1ZXN0cyBnbyBzdHJhaWdodCB0by9mcm9tIHVpYXV0b21hdG9yMlxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgYWRkRGV2aWNlSW5mb1RvQ2FwcyAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXBpVmVyc2lvbixcbiAgICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICAgIG1hbnVmYWN0dXJlcixcbiAgICAgIG1vZGVsLFxuICAgICAgcmVhbERpc3BsYXlTaXplLFxuICAgICAgZGlzcGxheURlbnNpdHksXG4gICAgfSA9IGF3YWl0IHRoaXMubW9iaWxlR2V0RGV2aWNlSW5mbygpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VBcGlMZXZlbCA9IHBhcnNlSW50KGFwaVZlcnNpb24sIDEwKTtcbiAgICB0aGlzLmNhcHMucGxhdGZvcm1WZXJzaW9uID0gcGxhdGZvcm1WZXJzaW9uO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5TaXplID0gcmVhbERpc3BsYXlTaXplO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5EZW5zaXR5ID0gZGlzcGxheURlbnNpdHk7XG4gICAgdGhpcy5jYXBzLmRldmljZU1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5jYXBzLmRldmljZU1hbnVmYWN0dXJlciA9IG1hbnVmYWN0dXJlcjtcbiAgfVxuXG4gIGFzeW5jIGluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIgKCkge1xuICAgIC8vIGJyb2tlbiBvdXQgZm9yIHJlYWRhYmlsaXR5XG4gICAgY29uc3QgdWlhdXRvbWF0b3IyT3B0cyA9IHtcbiAgICAgIGhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0IHx8IHRoaXMub3B0cy5ob3N0IHx8IExPQ0FMSE9TVF9JUDQsXG4gICAgICBzeXN0ZW1Qb3J0OiB0aGlzLm9wdHMuc3lzdGVtUG9ydCxcbiAgICAgIGRldmljZVBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgYWRiOiB0aGlzLmFkYixcbiAgICAgIGFwazogdGhpcy5vcHRzLmFwcCxcbiAgICAgIHRtcERpcjogdGhpcy5vcHRzLnRtcERpcixcbiAgICAgIGFwcFBhY2thZ2U6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYXBwQWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGRpc2FibGVXaW5kb3dBbmltYXRpb246ICEhdGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24sXG4gICAgICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTogdGhpcy5vcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlLFxuICAgICAgcmVhZFRpbWVvdXQ6IHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCxcbiAgICB9O1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgcGFja2FnZSBhbmQgYWN0aXZpdHksIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAvLyB1aWF1dG9tYXRvcjIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9uc1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbmV3IFVpQXV0b21hdG9yMlNlcnZlcih0aGlzLmxvZywgdWlhdXRvbWF0b3IyT3B0cyk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMudWlhdXRvbWF0b3IyLnByb3h5UmVxUmVzLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuICAgIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlDb21tYW5kLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuXG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnc2tpcFNlcnZlckluc3RhbGxhdGlvbicgaXMgc2V0LiBTa2lwcGluZyBVSUF1dG9tYXRvcjIgc2VydmVyIGluc3RhbGxhdGlvbi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuaW5zdGFsbFNlcnZlckFwayh0aGlzLm9wdHMudWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0KFxuICAgICAgICAgIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFVVCAoKSB7XG4gICAgLy8gVW5pbnN0YWxsIGFueSB1bmluc3RhbGxPdGhlclBhY2thZ2VzIHdoaWNoIHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCBhbnkgXCJvdGhlckFwcHNcIiB0aGF0IHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLm90aGVyQXBwcykge1xuICAgICAgbGV0IG90aGVyQXBwcztcbiAgICAgIHRyeSB7XG4gICAgICAgIG90aGVyQXBwcyA9IGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMub3RoZXJBcHBzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IHBhcnNlIFwib3RoZXJBcHBzXCIgY2FwYWJpbGl0eTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBvdGhlckFwcHMgPSBhd2FpdCBCLmFsbChvdGhlckFwcHNcbiAgICAgICAgLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgW0FQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OXSkpKTtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyhvdGhlckFwcHMsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgJiYgIShhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZCh0aGlzLm9wdHMuYXBwUGFja2FnZSkpXG4gICAgICAgICAgfHwgIXRoaXMub3B0cy5ub1Jlc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLm5vU2lnbiAmJiAhYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KHRoaXMub3B0cy5hcHAsIHRoaXMub3B0cy5hcHBQYWNrYWdlLCB7XG4gICAgICAgICAgcmVxdWlyZURlZmF1bHRDZXJ0OiBmYWxzZSxcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIHRoaXMub3B0cy5hcHApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5vcHRzLnNraXBVbmluc3RhbGwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdub1Jlc2V0IGhhcyBiZWVuIHJlcXVlc3RlZCBhbmQgdGhlIGFwcCBpcyBhbHJlYWR5IGluc3RhbGxlZC4gRG9pbmcgbm90aGluZycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGdWxsIHJlc2V0IHJlcXVpcmVzIGFuIGFwcCBjYXBhYmlsaXR5LCB1c2UgZmFzdFJlc2V0IGlmIGFwcCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBhcHAgY2FwYWJpbGl0eS4gQXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlJyk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZhc3RSZXNldCAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGVuc3VyZUFwcFN0YXJ0cyAoKSB7XG4gICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gYWN0aXZpdHkgYW5kIHBhY2thZ2UgdG8gd2FpdCBmb3JcbiAgICBjb25zdCBhcHBXYWl0UGFja2FnZSA9IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSB8fCB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbiAgICBjb25zdCBhcHBXYWl0QWN0aXZpdHkgPSB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5IHx8IHRoaXMub3B0cy5hcHBBY3Rpdml0eTtcblxuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfS8ke3RoaXMub3B0cy5hcHBBY3Rpdml0eX0gYCArXG4gICAgICBgYW5kIHdhaXRpbmcgZm9yICcke2FwcFdhaXRQYWNrYWdlfS8ke2FwcFdhaXRBY3Rpdml0eX0nYCk7XG5cbiAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgYW5kcm9pZENvdmVyYWdlIGlzIGNvbmZpZ3VyZWQuIGAgK1xuICAgICAgICBgIFN0YXJ0aW5nIGluc3RydW1lbnRhdGlvbiBvZiAnJHt0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlfScuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmFuZHJvaWRDb3ZlcmFnZSh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlLCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmICF0aGlzLm9wdHMuZm9yY2VBcHBMYXVuY2hcbiAgICAgICAgJiYgYXdhaXQgdGhpcy5hZGIucHJvY2Vzc0V4aXN0cyh0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYCcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBub1Jlc2V0IGlzIGVuYWJsZWQuIGAgK1xuICAgICAgICBgU2V0IGZvcmNlQXBwTGF1bmNoIGNhcGFiaWxpdHkgdG8gdHJ1ZSBpZiB0aGUgYXBwIG11c3QgYmUgZm9yY2VmdWxseSByZXN0YXJ0ZWQgb24gc2Vzc2lvbiBzdGFydHVwLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcCh7XG4gICAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbiB8fCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMub3B0cy5pbnRlbnRDYXRlZ29yeSB8fCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyB8fCAnMHgxMDIwMDAwMCcsIC8vIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEXG4gICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICB3YWl0QWN0aXZpdHk6IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHksXG4gICAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB0aGlzLm9wdHMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgICBzdG9wQXBwOiB0aGlzLm9wdHMuZm9yY2VBcHBMYXVuY2ggfHwgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgICByZXRyeTogdHJ1ZSxcbiAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2Vzc2lvbicpO1xuXG4gICAgY29uc3Qgc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzID0gW2FzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJlY29yZGluZ1NjcmVlbigpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLm1vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZygpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZygpO1xuICAgICAgfVxuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcoKTtcbiAgICAgIH1cbiAgICB9XTtcblxuICAgIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyh0aGlzLnNlcnZlciwgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgaWYgKHRoaXMudWlhdXRvbWF0b3IyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHN0b3AgQ2hyb21lRHJpdmVyIHByb3hpZXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5qd3BQcm94eUFjdGl2ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHByb3h5IGRlbGV0ZVNlc3Npb24gdG8gVWlBdXRvbWF0b3IyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgYXdhaXQgQi5hbGwoc2NyZWVuUmVjb3JkaW5nU3RvcFRhc2tzLm1hcCgodGFzaykgPT4ge1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICB9KSgpO1xuICAgICAgfSkpO1xuXG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJyR7dGhpcy5kZWZhdWx0SU1FfSdgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHJlc2V0IElNRTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2UpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnU2h1dHRpbmcgZG93biB0aGUgYWRiIHByb2Nlc3Mgb2YgaW5zdHJ1bWVudGF0aW9uLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmVuZEFuZHJvaWRDb3ZlcmFnZSgpO1xuICAgICAgICAvLyBVc2UgdGhpcyBicm9hZGNhc3QgaW50ZW50IHRvIG5vdGlmeSBpdCdzIHRpbWUgdG8gZHVtcCBjb3ZlcmFnZSB0byBmaWxlXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KSB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgU2VuZGluZyBpbnRlbnQgYnJvYWRjYXN0ICcke3RoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnR9JyBhdCB0aGUgZW5kIG9mIGluc3RydW1lbnRpbmcuYCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0KHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oJ05vIGFuZHJvaWRDb3ZlcmFnZUVuZEludGVudCBpcyBjb25maWd1cmVkIGluIGNhcHMuIFBvc3NpYmx5IHlvdSBjYW5ub3QgZ2V0IGNvdmVyYWdlIGZpbGUuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNDaHJvbWVTZXNzaW9uXG4gICAgICAgICAgICAmJiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldFxuICAgICAgICAgICAgJiYgIXRoaXMub3B0cy5ub1Jlc2V0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gZm9yY2Ugc3RvcCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBDYXBhYmlsaXR5ICdmdWxsUmVzZXQnIHNldCB0byAndHJ1ZScsIFVuaW5zdGFsbGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdW5pbnN0YWxsIGFwcDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgdmFsdWUgY2FuIGJlIHRydWUgaWYgdGVzdCB0YXJnZXQgZGV2aWNlIGlzIDw9IDI2XG4gICAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VTeXN0ZW1Qb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIHN5c3RlbSBwb3J0IGZvcndhcmQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgLy8gSWdub3JlLCB0aGlzIGJsb2NrIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2hlbiB3ZSBmYWxsIGluIGNhdGNoIGJsb2NrXG4gICAgICAgIC8vIGFuZCBiZWZvcmUgZXZlbiBwb3J0IGZvcndhcmQuXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VNanBlZ1NlcnZlclBvcnQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byByZW1vdmUgTUpQRUcgc2VydmVyIHBvcnQgZm9yd2FyZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAvLyBJZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIGNsb3NlIGVtdWxhdG9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm1qcGVnU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdDbG9zaW5nIE1KUEVHIHN0cmVhbScpO1xuICAgICAgdGhpcy5tanBlZ1N0cmVhbS5zdG9wKCk7XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICcke3RoaXMub3B0cy5hcHB9J2ApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIHVpYXV0bzIgc2VydmVyIGFscmVhZHlcbiAgfVxuXG4gIC8vIE5lZWQgdG8gb3ZlcnJpZGUgYW5kcm9pZC1kcml2ZXIncyB2ZXJzaW9uIG9mIHRoaXMgc2luY2Ugd2UgZG9uJ3QgYWN0dWFsbHlcbiAgLy8gaGF2ZSBhIGJvb3RzdHJhcDsgaW5zdGVhZCB3ZSBqdXN0IHJlc3RhcnQgYWRiIGFuZCByZS1mb3J3YXJkIHRoZSBVaUF1dG9tYXRvcjJcbiAgLy8gcG9ydFxuICBhc3luYyB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICAgIGF3YWl0IHdyYXBwZWQoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5yZXN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZVN5c3RlbVBvcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0KCk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBjYW4gYWx3YXlzIHByb3h5IHRvIHRoZSB1aWF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuZ2V0UHJveHlBdm9pZExpc3Qoc2Vzc2lvbklkKTtcbiAgICAvLyB3ZSBhcmUgbWFpbnRhaW5pbmcgdHdvIHNldHMgb2YgTk9fUFJPWFkgbGlzdHMsIG9uZSBmb3IgY2hyb21lZHJpdmVyKENIUk9NRV9OT19QUk9YWSlcbiAgICAvLyBhbmQgb25lIGZvciB1aWF1dG9tYXRvcjIoTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5jaHJvbWVkcml2ZXIpKSB7XG4gICAgICAvLyBpZiB0aGUgY3VycmVudCBjb250ZXh0IGlzIHdlYnZpZXcoY2hyb21lZHJpdmVyKSwgdGhlbiByZXR1cm4gQ0hST01FX05PX1BST1hZIGxpc3RcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IENIUk9NRV9OT19QUk9YWTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMubmF0aXZlV2ViU2NyZWVuc2hvdCkge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gWy4uLnRoaXMuandwUHJveHlBdm9pZCwgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuandwUHJveHlBdm9pZDtcbiAgfVxuXG4gIGdldCBpc0Nocm9tZVNlc3Npb24gKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzQ2hyb21lQnJvd3Nlcih0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICB9XG59XG5cbi8vIGZpcnN0IGFkZCB0aGUgYW5kcm9pZC1kcml2ZXIgY29tbWFuZHMgd2hpY2ggd2Ugd2lsbCBmYWxsIGJhY2sgdG9cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoYW5kcm9pZENvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbi8vIHRoZW4gb3ZlcndyaXRlIHdpdGggYW55IHVpYXV0b21hdG9yMi1zcGVjaWZpYyBjb21tYW5kc1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhjb21tYW5kcykpIHtcbiAgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xufVxuXG5leHBvcnQgeyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLE9BQU8sR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVDLGdCQUFtQixFQUFFQyxtQ0FBYyxDQUFDO0FBSXRFLE1BQU1DLGlCQUFpQixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztBQUl0QyxNQUFNQyw0QkFBNEIsR0FBR0MsYUFBSSxDQUFDQyxnQkFBZ0IsQ0FDeERDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDQyxXQUFFLENBQUNDLE1BQU0sRUFBRSxFQUFFLHdCQUF3QixDQUFDLEVBQ25EO0VBQUNDLE9BQU8sRUFBRSxFQUFFO0VBQUVDLFdBQVcsRUFBRTtBQUFJLENBQUMsQ0FDakM7QUFJRCxNQUFNQyxXQUFXLEdBQUcsSUFBSTtBQUl4QixNQUFNQyx3QkFBd0IsR0FBRyxJQUFJO0FBRXJDLE1BQU1DLGFBQWEsR0FBRyxXQUFXO0FBTWpDLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsS0FBSyxFQUFFLElBQUlDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQ3hDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ2xELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ2xELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLEVBQ3BFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLEVBQ3ZELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLEVBQzFELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLEVBQ3RELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQzlDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQzlELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQzlELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLEVBQzVELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDLEVBQ3JFLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQ3pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLEVBQy9ELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLEVBQzdELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQ3pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLEVBQ2pELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQzFDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLEVBQ3BELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ25ELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEVBQ2hELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsTUFBTSxFQUFFLElB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
529
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJoZWxwZXJzIiwiT2JqZWN0IiwiYXNzaWduIiwidWlhdXRvbWF0b3IySGVscGVycyIsImFuZHJvaWRIZWxwZXJzIiwiREVWSUNFX1BPUlRfUkFOR0UiLCJERVZJQ0VfUE9SVF9BTExPQ0FUSU9OX0dVQVJEIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwidG1wZGlyIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwiREVWSUNFX1BPUlQiLCJNSlBFR19TRVJWRVJfREVWSUNFX1BPUlQiLCJMT0NBTEhPU1RfSVA0IiwiTk9fUFJPWFkiLCJSZWdFeHAiLCJDSFJPTUVfTk9fUFJPWFkiLCJNRU1PSVpFRF9GVU5DVElPTlMiLCJBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIiwiQmFzZURyaXZlciIsIm5ld01ldGhvZE1hcCIsImNvbnN0cnVjdG9yIiwib3B0cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInNoZWxsIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJ1aWF1dG9tYXRvcjIiLCJqd3BQcm94eUFjdGl2ZSIsImRlZmF1bHRJTUUiLCJqd3BQcm94eUF2b2lkIiwiYXBrU3RyaW5ncyIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwiYWxsb3dJbnZpc2libGVFbGVtZW50cyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJmbiIsIl8iLCJtZW1vaXplIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGVmYXVsdHMiLCJpc0Nocm9tZVNlc3Npb24iLCJsb2ciLCJpbmZvIiwicGtnIiwiYWN0aXZpdHkiLCJnZXRDaHJvbWVQa2ciLCJicm93c2VyTmFtZSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsInJlYm9vdCIsInNldEF2ZEZyb21DYXBhYmlsaXRpZXMiLCJhcHAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwiQVBLU19FWFRFTlNJT04iLCJjaGVja0FwcFByZXNlbnQiLCJzdGFydFVpQXV0b21hdG9yMlNlc3Npb24iLCJmaWxsRGV2aWNlRGV0YWlscyIsIm1qcGVnU2NyZWVuc2hvdFVybCIsIm1qcGVnU3RyZWFtIiwibWpwZWciLCJNSnBlZ1N0cmVhbSIsInN0YXJ0IiwiZSIsImRlbGV0ZVNlc3Npb24iLCJwaXhlbFJhdGlvIiwiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsInN0YXRCYXJIZWlnaHQiLCJnZXRTdGF0dXNCYXJIZWlnaHQiLCJ2aWV3cG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJkcml2ZXJEYXRhIiwiZ2V0U2Vzc2lvbiIsInNlc3Npb25EYXRhIiwiZGVidWciLCJ1aWEyRGF0YSIsImp3cHJveHkiLCJjb21tYW5kIiwiaXNFbXVsYXRvciIsImFkYiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImFsbG9jYXRlU3lzdGVtUG9ydCIsImZvcndhcmRQb3J0IiwibG9jYWxQb3J0IiwiY2hlY2tQb3J0U3RhdHVzIiwic3lzdGVtUG9ydCIsIl9oYXNTeXN0ZW1Qb3J0SW5DYXBzIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwicmVsZWFzZVN5c3RlbVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0IiwibWpwZWdTZXJ2ZXJQb3J0IiwicmVsZWFzZU1qcGVnU2VydmVyUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJjcmVhdGVBREIiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJoYXNWYWx1ZSIsImdwc0VuYWJsZWQiLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwid2FybiIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiaW5pdERldmljZSIsImluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEFuaW1hdGlvblN0YXRlIiwiX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkIiwiaW5pdEFVVCIsInN0YXJ0U2Vzc2lvbiIsImFkZERldmljZUluZm9Ub0NhcHMiLCJza2lwVW5sb2NrIiwidW5sb2NrIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwiZW5zdXJlQXBwU3RhcnRzIiwib3JpZW50YXRpb24iLCJzZXRPcmllbnRhdGlvbiIsImF1dG9XZWJ2aWV3Iiwidmlld05hbWUiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJhdXRvV2Vidmlld1RpbWVvdXQiLCJyZXRyeUludGVydmFsIiwic2V0Q29udGV4dCIsImFwaVZlcnNpb24iLCJtYW51ZmFjdHVyZXIiLCJtb2RlbCIsInJlYWxEaXNwbGF5U2l6ZSIsImRpc3BsYXlEZW5zaXR5IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsImRldmljZUFwaUxldmVsIiwicGFyc2VJbnQiLCJkZXZpY2VTY3JlZW5TaXplIiwiZGV2aWNlU2NyZWVuRGVuc2l0eSIsImRldmljZU1vZGVsIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwidWlhdXRvbWF0b3IyT3B0cyIsImhvc3QiLCJyZW1vdGVBZGJIb3N0IiwiZGV2aWNlUG9ydCIsImFwayIsInRtcERpciIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicmVhZFRpbWVvdXQiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCIsIlVpQXV0b21hdG9yMlNlcnZlciIsInByb3h5UmVxUmVzIiwicHJveHlDb21tYW5kIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsImluc3RhbGxTZXJ2ZXJBcGsiLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJzdGRlcnIiLCJtZXNzYWdlIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsInBhcnNlQXJyYXkiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwibWFwIiwiaW5zdGFsbE90aGVyQXBrcyIsIm5vUmVzZXQiLCJpc0FwcEluc3RhbGxlZCIsIm5vU2lnbiIsImNoZWNrQXBrQ2VydCIsInJlcXVpcmVEZWZhdWx0Q2VydCIsInNpZ25BcHAiLCJza2lwVW5pbnN0YWxsIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbEFwayIsImZhc3RSZXNldCIsInJlc2V0QXBwIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJmb3JjZUFwcExhdW5jaCIsInByb2Nlc3NFeGlzdHMiLCJzdGFydEFwcCIsImFjdGlvbiIsImludGVudEFjdGlvbiIsImNhdGVnb3J5IiwiaW50ZW50Q2F0ZWdvcnkiLCJmbGFncyIsImludGVudEZsYWdzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsIndhaXRGb3JMYXVuY2giLCJhcHBXYWl0Rm9yTGF1bmNoIiwid2FpdER1cmF0aW9uIiwiYXBwV2FpdER1cmF0aW9uIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJzdG9wQXBwIiwiZG9udFN0b3BBcHBPblJlc2V0IiwicmV0cnkiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwibW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwibW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInRhc2siLCJpZ24iLCJ1bmljb2RlS2V5Ym9hcmQiLCJyZXNldEtleWJvYXJkIiwic2V0SU1FIiwiZW5kQW5kcm9pZENvdmVyYWdlIiwiYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50IiwiYnJvYWRjYXN0IiwiZm9yY2VTdG9wIiwic3RvcExvZ2NhdCIsImVycm9yIiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsImF2ZE5hbWUiLCJraWxsRW11bGF0b3IiLCJzdG9wIiwiZnMiLCJleGlzdHMiLCJ3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCIsIndyYXBwZWQiLCJyZXN0YXJ0IiwicHJveHlBY3RpdmUiLCJjYW5Qcm94eSIsImdldFByb3h5QXZvaWRMaXN0IiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsImlzQ2hyb21lQnJvd3NlciIsImNtZCIsInRvUGFpcnMiLCJhbmRyb2lkQ29tbWFuZHMiLCJwcm90b3R5cGUiLCJjb21tYW5kcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIERldmljZVNldHRpbmdzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQge1xuICBVaUF1dG9tYXRvcjJTZXJ2ZXIsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEXG59IGZyb20gJy4vdWlhdXRvbWF0b3IyJztcbmltcG9ydCB7IG5ld01ldGhvZE1hcCB9IGZyb20gJy4vbWV0aG9kLW1hcCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgbWpwZWcgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHVpYXV0b21hdG9yMkhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIH0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UsIGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OIH0gZnJvbSAnLi9leHRlbnNpb25zJztcblxuXG5jb25zdCBoZWxwZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdWlhdXRvbWF0b3IySGVscGVycywgYW5kcm9pZEhlbHBlcnMpO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gVWlBdXRvbWF0b3IyIEhUVFAgc2VydmVyIG9uIHRoZSBkZXZpY2VcbmNvbnN0IERFVklDRV9QT1JUX1JBTkdFID0gWzgyMDAsIDgyOTldO1xuXG4vLyBUaGUgZ3VhcmQgaXMgbmVlZGVkIHRvIGF2b2lkIGR5bmFtaWMgc3lzdGVtIHBvcnQgYWxsb2NhdGlvbiBjb25mbGljdHMgZm9yXG4vLyBwYXJhbGxlbCBkcml2ZXIgc2Vzc2lvbnNcbmNvbnN0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ3VpYTJfZGV2aWNlX3BvcnRfZ3VhcmQnKSxcbiAge3RpbWVvdXQ6IDI1LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCBVaUF1dG9tYXRvcjIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLiBXZSB3aWxsIGZvcndhcmRcbi8vIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlIGRldmljZS5cbmNvbnN0IERFVklDRV9QT1JUID0gNjc5MDtcbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgVWlBdXRvbWF0b3IyIE1KUEVHIHNlcnZlciBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuXG4vLyBXZSB3aWxsIGZvcndhcmQgb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGVcbi8vIGRldmljZS5cbmNvbnN0IE1KUEVHX1NFUlZFUl9ERVZJQ0VfUE9SVCA9IDc4MTA7XG5cbmNvbnN0IExPQ0FMSE9TVF9JUDQgPSAnMTI3LjAuMC4xJztcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gVWlBdXRvbWF0b3IyIHNlcnZlci5cbi8vIFRPRE86IE5lZWQgdG8gc2VncmVnYXRlIHRoZSBwYXRocyBiZXR0ZXIgd2F5IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hlcmV2ZXIgYXBwbGljYWJsZS5cbi8vIChOb3Qgc2VncmVnYXRpbmcgcmlnaHQgYXdheSBiZWNhdXNlIG1vcmUgcGF0aHMgdG8gYmUgYWRkZWQgaW4gdGhlIE5PX1BST1hZIGxpc3QpXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vKD8hLiovKScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnRfW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL2N1cnJlbnRfcGFja2FnZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9hdHRyaWJ1dGUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZGlzcGxheWVkJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2VuYWJsZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvbG9jYXRpb25faW5fdmlldycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9uYW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3NjcmVlbnNob3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2VsZWN0ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL1teL10rX2FsZXJ0JCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FjdGlvbnMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcC9bXi9dJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9jb21wYXJlX2ltYWdlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvKD8hc2V0X2NsaXBib2FyZClbXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9lbGVtZW50L1teL10rL3JlcGxhY2VfdmFsdWUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZWxlbWVudC9bXi9dKy92YWx1ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vcGVyZm9ybWFuY2VEYXRhL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RvcF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtLy4qZXZlbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2tleXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZycpXSxcbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy93aW5kb3cvcmVjdCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZycpXSxcbl07XG5cbi8vIFRoaXMgaXMgYSBzZXQgb2YgbWV0aG9kcyBhbmQgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIENocm9tZWRyaXZlci5cbmNvbnN0IENIUk9NRV9OT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3JlY3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG5cbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgbW9iaWxlOiBjb21tYW5kcyB3b3JraW5nIGluIHdlYiBjb250ZXh0XG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcyQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2ckJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMkJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2ckJyldLFxuXTtcblxuY29uc3QgTUVNT0laRURfRlVOQ1RJT05TID0gW1xuICAnZ2V0U3RhdHVzQmFySGVpZ2h0JyxcbiAgJ2dldERldmljZVBpeGVsUmF0aW8nLFxuXTtcblxuY2xhc3MgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuXG4gIHN0YXRpYyBuZXdNZXRob2RNYXAgPSBuZXdNZXRob2RNYXA7XG5cbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIC8vIGBzaGVsbGAgb3ZlcndyaXRlcyBhZGIuc2hlbGwsIHNvIHJlbW92ZVxuICAgIGRlbGV0ZSBvcHRzLnNoZWxsO1xuXG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgICAnY3NzIHNlbGVjdG9yJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5kZWZhdWx0SU1FID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTsgLy8gbWFwIG9mIGxhbmd1YWdlIC0+IHN0cmluZ3Mgb2JqXG5cbiAgICB0aGlzLnNldHRpbmdzID0gbmV3IERldmljZVNldHRpbmdzKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiBmYWxzZSwgYWxsb3dJbnZpc2libGVFbGVtZW50czogZmFsc2V9LFxuICAgICAgICB0aGlzLm9uU2V0dGluZ3NVcGRhdGUuYmluZCh0aGlzKSk7XG4gICAgLy8gaGFuZGxlIHdlYnZpZXcgbWVjaGFuaWNzIGZyb20gQW5kcm9pZERyaXZlclxuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzID0ge307XG5cbiAgICAvLyBtZW1vaXplIGZ1bmN0aW9ucyBoZXJlLCBzbyB0aGF0IHRoZXkgYXJlIGRvbmUgb24gYSBwZXItaW5zdGFuY2UgYmFzaXNcbiAgICBmb3IgKGNvbnN0IGZuIG9mIE1FTU9JWkVEX0ZVTkNUSU9OUykge1xuICAgICAgdGhpc1tmbl0gPSBfLm1lbW9pemUodGhpc1tmbl0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlRGVzaXJlZENhcHMgKGNhcHMpIHtcbiAgICByZXR1cm4gc3VwZXIudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKSAmJiBhbmRyb2lkSGVscGVycy52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbiAoLi4uYXJncykge1xuICAgIHRyeSB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBvdGhlclNlc3Npb25EYXRhIGZvciBtdWx0aXBsZSBzZXNzaW9uc1xuICAgICAgbGV0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgc3VwZXIuY3JlYXRlU2Vzc2lvbiguLi5hcmdzKTtcblxuICAgICAgbGV0IHNlcnZlckRldGFpbHMgPSB7XG4gICAgICAgIHBsYXRmb3JtOiAnTElOVVgnLFxuICAgICAgICB3ZWJTdG9yYWdlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRha2VzU2NyZWVuc2hvdDogdHJ1ZSxcbiAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGRhdGFiYXNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbG9jYXRpb25Db250ZXh0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHdhcm5pbmdzOiB7fSxcbiAgICAgICAgZGVzaXJlZDogdGhpcy5jYXBzLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5jYXBzID0gT2JqZWN0LmFzc2lnbihzZXJ2ZXJEZXRhaWxzLCB0aGlzLmNhcHMpO1xuXG4gICAgICB0aGlzLmN1ckNvbnRleHQgPSB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xuXG4gICAgICBsZXQgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgIGZ1bGxSZXNldDogZmFsc2UsXG4gICAgICAgIGF1dG9MYXVuY2g6IHRydWUsXG4gICAgICAgIGFkYlBvcnQ6IERFRkFVTFRfQURCX1BPUlQsXG4gICAgICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dDogOTAwMDBcbiAgICAgIH07XG4gICAgICBfLmRlZmF1bHRzKHRoaXMub3B0cywgZGVmYXVsdE9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhcIldlJ3JlIGdvaW5nIHRvIHJ1biBhIENocm9tZS1iYXNlZCBzZXNzaW9uXCIpO1xuICAgICAgICBsZXQge3BrZywgYWN0aXZpdHl9ID0gaGVscGVycy5nZXRDaHJvbWVQa2codGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgICAgICAgdGhpcy5vcHRzLmFwcFBhY2thZ2UgPSB0aGlzLmNhcHMuYXBwUGFja2FnZSA9IHBrZztcbiAgICAgICAgdGhpcy5vcHRzLmFwcEFjdGl2aXR5ID0gdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gYWN0aXZpdHk7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYENocm9tZS10eXBlIHBhY2thZ2UgYW5kIGFjdGl2aXR5IGFyZSAke3BrZ30gYW5kICR7YWN0aXZpdHl9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIHRoaXMuc2V0QXZkRnJvbUNhcGFiaWxpdGllcyhjYXBzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgICAgLy8gZmluZCBhbmQgY29weSwgb3IgZG93bmxvYWQgYW5kIHVuemlwIGFuIGFwcCB1cmwgb3IgcGF0aFxuICAgICAgICB0aGlzLm9wdHMuYXBwID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcCh0aGlzLm9wdHMuYXBwLCBbQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT05dKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcFByZXNlbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgICAgLy8gdGhlIGFwcCBpc24ndCBhbiBhY3R1YWwgYXBwIGZpbGUgYnV0IHJhdGhlciBzb21ldGhpbmcgd2Ugd2FudCB0b1xuICAgICAgICAvLyBhc3N1bWUgaXMgb24gdGhlIGRldmljZSBhbmQganVzdCBsYXVuY2ggdmlhIHRoZSBhcHBQYWNrYWdlXG4gICAgICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgZGlyZWN0bHkgb24gdGhlIGRldmljZWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgTmVpdGhlciAnYXBwJyBub3IgJ2FwcFBhY2thZ2UnIHdhcyBzZXQuIFN0YXJ0aW5nIFVpQXV0b21hdG9yMiBgICtcbiAgICAgICAgICAnd2l0aG91dCB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uJyk7XG4gICAgICB9XG4gICAgICB0aGlzLm9wdHMuYWRiUG9ydCA9IHRoaXMub3B0cy5hZGJQb3J0IHx8IERFRkFVTFRfQURCX1BPUlQ7XG5cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uKCk7XG4gICAgICBhd2FpdCB0aGlzLmZpbGxEZXZpY2VEZXRhaWxzKCk7XG4gICAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2NyZWVuc2hvdFVybCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdGFydGluZyBNSlBFRyBzdHJlYW0gcmVhZGluZyBVUkw6ICcke3RoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmx9J2ApO1xuICAgICAgICB0aGlzLm1qcGVnU3RyZWFtID0gbmV3IG1qcGVnLk1KcGVnU3RyZWFtKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpO1xuICAgICAgICBhd2FpdCB0aGlzLm1qcGVnU3RyZWFtLnN0YXJ0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW3Nlc3Npb25JZCwgdGhpcy5jYXBzXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZmlsbERldmljZURldGFpbHMgKCkge1xuICAgIHRoaXMuY2Fwcy5waXhlbFJhdGlvID0gYXdhaXQgdGhpcy5nZXREZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgdGhpcy5jYXBzLnN0YXRCYXJIZWlnaHQgPSBhd2FpdCB0aGlzLmdldFN0YXR1c0JhckhlaWdodCgpO1xuICAgIHRoaXMuY2Fwcy52aWV3cG9ydFJlY3QgPSBhd2FpdCB0aGlzLmdldFZpZXdQb3J0UmVjdCgpO1xuICB9XG5cbiAgZ2V0IGRyaXZlckRhdGEgKCkge1xuICAgIC8vIFRPRE8gZmlsbCBvdXQgcmVzb3VyY2UgaW5mbyBoZXJlXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbiAoKSB7XG4gICAgbGV0IHNlc3Npb25EYXRhID0gYXdhaXQgc3VwZXIuZ2V0U2Vzc2lvbigpO1xuICAgIHRoaXMubG9nLmRlYnVnKCdHZXR0aW5nIHNlc3Npb24gZGV0YWlscyBmcm9tIHNlcnZlciB0byBtaXggaW4nKTtcbiAgICBsZXQgdWlhMkRhdGEgPSBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy8nLCAnR0VUJywge30pO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzZXNzaW9uRGF0YSwgdWlhMkRhdGEpO1xuICB9XG5cbiAgaXNFbXVsYXRvciAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNFbXVsYXRvcih0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgfVxuXG4gIHNldEF2ZEZyb21DYXBhYmlsaXRpZXMgKGNhcHMpIHtcbiAgICBpZiAodGhpcy5vcHRzLmF2ZCkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnYXZkIG5hbWUgZGVmaW5lZCwgaWdub3JpbmcgZGV2aWNlIG5hbWUgYW5kIHBsYXRmb3JtIHZlcnNpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjYXBzLmRldmljZU5hbWUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIGRldmljZU5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlcycpO1xuICAgICAgfVxuICAgICAgaWYgKCFjYXBzLnBsYXRmb3JtVmVyc2lvbikge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdhdmQgb3IgcGxhdGZvcm1WZXJzaW9uIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZWQnKTtcbiAgICAgIH1cbiAgICAgIGxldCBhdmREZXZpY2UgPSBjYXBzLmRldmljZU5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfLl0vZywgJy0nKTtcbiAgICAgIHRoaXMub3B0cy5hdmQgPSBgJHthdmREZXZpY2V9X18ke2NhcHMucGxhdGZvcm1WZXJzaW9ufWA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWxsb2NhdGVTeXN0ZW1Qb3J0ICgpIHtcbiAgICBjb25zdCBmb3J3YXJkUG9ydCA9IGFzeW5jIChsb2NhbFBvcnQpID0+IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBGb3J3YXJkaW5nIFVpQXV0b21hdG9yMiBTZXJ2ZXIgcG9ydCAke0RFVklDRV9QT1JUfSB0byBsb2NhbCBwb3J0ICR7bG9jYWxQb3J0fWApO1xuICAgICAgaWYgKChhd2FpdCBjaGVja1BvcnRTdGF0dXMobG9jYWxQb3J0LCBMT0NBTEhPU1RfSVA0KSkgPT09ICdvcGVuJykge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBVaUF1dG9tYXRvcjIgU2VydmVyIGNhbm5vdCBzdGFydCBiZWNhdXNlIHRoZSBsb2NhbCBwb3J0ICMke2xvY2FsUG9ydH0gaXMgYnVzeS4gYCArXG4gICAgICAgICAgYE1ha2Ugc3VyZSB0aGUgcG9ydCB5b3UgcHJvdmlkZSB2aWEgJ3N5c3RlbVBvcnQnIGNhcGFiaWxpdHkgaXMgbm90IG9jY3VwaWVkLiBgICtcbiAgICAgICAgICBgVGhpcyBzaXR1YXRpb24gbWlnaHQgb2Z0ZW4gYmUgYSByZXN1bHQgb2YgYW4gaW5hY2N1cmF0ZSBzZXNzaW9ucyBtYW5hZ2VtZW50LCBlLmcuIGAgK1xuICAgICAgICAgIGBvbGQgYXV0b21hdGlvbiBzZXNzaW9ucyBvbiB0aGUgc2FtZSBkZXZpY2UgbXVzdCBhbHdheXMgYmUgY2xvc2VkIGJlZm9yZSBzdGFydGluZyBuZXcgb25lcy5gKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KGxvY2FsUG9ydCwgREVWSUNFX1BPUlQpO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRzLnN5c3RlbVBvcnQpIHtcbiAgICAgIHRoaXMuX2hhc1N5c3RlbVBvcnRJbkNhcHMgPSB0cnVlO1xuICAgICAgcmV0dXJuIGF3YWl0IGZvcndhcmRQb3J0KHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9XG5cbiAgICBhd2FpdCBERVZJQ0VfUE9SVF9BTExPQ0FUSU9OX0dVQVJEKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IFtzdGFydFBvcnQsIGVuZFBvcnRdID0gREVWSUNFX1BPUlRfUkFOR0U7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm9wdHMuc3lzdGVtUG9ydCA9IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKHN0YXJ0UG9ydCwgZW5kUG9ydCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coXG4gICAgICAgICAgYENhbm5vdCBmaW5kIGFueSBmcmVlIHBvcnQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9fS4gYCArXG4gICAgICAgICAgYFBsZWFzZSBzZXQgdGhlIGF2YWlsYWJsZSBwb3J0IG51bWJlciBieSBwcm92aWRpbmcgdGhlIHN5c3RlbVBvcnQgY2FwYWJpbGl0eSBvciBgICtcbiAgICAgICAgICBgZG91YmxlIGNoZWNrIHRoZSBwcm9jZXNzZXMgdGhhdCBhcmUgbG9ja2luZyBwb3J0cyB3aXRoaW4gdGhpcyByYW5nZSBhbmQgdGVybWluYXRlIGAgK1xuICAgICAgICAgIGB0aGVzZSB3aGljaCBhcmUgbm90IG5lZWRlZCBhbnltb3JlYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBmb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWxlYXNlU3lzdGVtUG9ydCAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuc3lzdGVtUG9ydCB8fCAhdGhpcy5hZGIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faGFzU3lzdGVtUG9ydEluQ2Fwcykge1xuICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBERVZJQ0VfUE9SVF9BTExPQ0FUSU9OX0dVQVJEKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQgKCkge1xuICAgIGlmICh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydCh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0LCBNSlBFR19TRVJWRVJfREVWSUNFX1BPUlQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VNanBlZ1NlcnZlclBvcnQgKCkge1xuICAgIGlmICh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFVpQXV0b21hdG9yMlNlc3Npb24gKCkge1xuICAgIC8vIGdldCBkZXZpY2UgdWRpZCBmb3IgdGhpcyBzZXNzaW9uXG4gICAgbGV0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICB0aGlzLm9wdHMudWRpZCA9IHVkaWQ7XG4gICAgdGhpcy5vcHRzLmVtUG9ydCA9IGVtUG9ydDtcblxuICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgb3VyIGphdmEgdmVyc2lvbiBhbmQgZGV2aWNlIGluZm8sIHdlIGNhbiBjcmVhdGUgb3VyXG4gICAgLy8gQURCIGluc3RhbmNlXG4gICAgdGhpcy5hZGIgPSBhd2FpdCBhbmRyb2lkSGVscGVycy5jcmVhdGVBREIodGhpcy5vcHRzKTtcblxuICAgIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcblxuICAgIGlmIChhcGlMZXZlbCA8IDIxKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdVSUF1dG9tYXRvcjIgaXMgb25seSBzdXBwb3J0ZWQgc2luY2UgQW5kcm9pZCA1LjAgKExvbGxpcG9wKS4gJyArXG4gICAgICAgICdZb3UgY291bGQgc3RpbGwgdXNlIG90aGVyIHN1cHBvcnRlZCBiYWNrZW5kcyBpbiBvcmRlciB0byBhdXRvbWF0ZSBvbGRlciBBbmRyb2lkIHZlcnNpb25zLicpO1xuICAgIH1cblxuICAgIGlmIChhcGlMZXZlbCA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgIHRoaXMubG9nLmluZm8oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSB0byBlbmFibGUvZGlzYWJsZSBncHMgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5vcHRzLmdwc0VuYWJsZWQpKSB7XG4gICAgICBpZiAodGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgVHJ5aW5nIHRvICR7dGhpcy5vcHRzLmdwc0VuYWJsZWQgPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ30gZ3BzIGxvY2F0aW9uIHByb3ZpZGVyYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIodGhpcy5vcHRzLmdwc0VuYWJsZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgU29ycnkhICdncHNFbmFibGVkJyBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgYXBwUGFja2FnZSBldCBhbCBmcm9tIG1hbmlmZXN0IGlmIG5lY2Vzc2FyeVxuICAgIGNvbnN0IGFwcEluZm8gPSBhd2FpdCBoZWxwZXJzLmdldExhdW5jaEluZm8odGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRzLCBhcHBJbmZvIHx8IHt9KTtcblxuICAgIC8vIHNldCBhY3R1YWwgZGV2aWNlIG5hbWUsIHVkaWQsIHBsYXRmb3JtIHZlcnNpb24sIHNjcmVlbiBzaXplLCBzY3JlZW4gZGVuc2l0eSwgbW9kZWwgYW5kIG1hbnVmYWN0dXJlciBkZXRhaWxzXG4gICAgdGhpcy5jYXBzLmRldmljZU5hbWUgPSB0aGlzLmFkYi5jdXJEZXZpY2VJZDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlVURJRCA9IHRoaXMub3B0cy51ZGlkO1xuXG4gICAgLy8gc3RhcnQgYW4gYXZkLCBzZXQgdGhlIGxhbmd1YWdlL2xvY2FsZSwgcGljayBhbiBlbXVsYXRvciwgZXRjLi4uXG4gICAgLy8gVE9ETyB3aXRoIG11bHRpcGxlIGRldmljZXMgd2UnbGwgbmVlZCB0byBwYXJhbWV0ZXJpemUgdGhpc1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IGF3YWl0IGhlbHBlcnMuaW5pdERldmljZSh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcblxuICAgIC8vIFByZXBhcmUgdGhlIGRldmljZSBieSBmb3J3YXJkaW5nIHRoZSBVaUF1dG9tYXRvcjIgcG9ydFxuICAgIC8vIFRoaXMgY2FsbCBtdXRhdGVzIHRoaXMub3B0cy5zeXN0ZW1Qb3J0IGlmIGl0IGlzIG5vdCBzZXQgZXhwbGljaXRseVxuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVTeXN0ZW1Qb3J0KCk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgVWlBdXRvbWF0b3IyIE1KUEVHIHNlcnZlciBwb3J0IChpZlxuICAgIC8vIGFwcGxpY2FibGUpXG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZU1qcGVnU2VydmVyUG9ydCgpO1xuXG4gICAgLy8gc2V0IHVwIHRoZSBtb2RpZmllZCBVaUF1dG9tYXRvcjIgc2VydmVyIGV0Y1xuICAgIGF3YWl0IHRoaXMuaW5pdFVpQXV0b21hdG9yMlNlcnZlcigpO1xuXG4gICAgLy8gU2hvdWxkIGJlIGFmdGVyIGluc3RhbGxpbmcgaW8uYXBwaXVtLnNldHRpbmdzIGluIGhlbHBlcnMuaW5pdERldmljZVxuICAgIGlmICh0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiAmJiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDI2KSkgeyAvLyBBUEkgbGV2ZWwgMjYgaXMgQW5kcm9pZCA4LjAuXG4gICAgICAvLyBHcmFudGluZyBhbmRyb2lkLnBlcm1pc3Npb24uU0VUX0FOSU1BVElPTl9TQ0FMRSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIGFuaW1hdGlvbnMgdW5kZXIgQVBJIGxldmVsIDI2XG4gICAgICAvLyBSZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL3B1bGwvMTE2NDAjaXNzdWVjb21tZW50LTQzODI2MDQ3N1xuICAgICAgLy8gYC0tbm8td2luZG93LWFuaW1hdGlvbmAgd29ya3Mgb3ZlciBBbmRyb2lkIDggdG8gZGlzYWJsZSBhbGwgb2YgYW5pbWF0aW9uc1xuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQW5pbWF0aW9uT24oKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdEaXNhYmxpbmcgYW5pbWF0aW9uIHZpYSBpby5hcHBpdW0uc2V0dGluZ3MnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUoZmFsc2UpO1xuICAgICAgICB0aGlzLl93YXNXaW5kb3dBbmltYXRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdXaW5kb3cgYW5pbWF0aW9uIGlzIGFscmVhZHkgZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvLyBBZGRpbmcgQVVUIHBhY2thZ2UgbmFtZSBpbiB0aGUgY2FwYWJpbGl0aWVzIGlmIHBhY2thZ2UgbmFtZSBub3QgZXhpc3QgaW4gY2Fwc1xuICAgIGlmICghdGhpcy5jYXBzLmFwcFBhY2thZ2UgJiYgYXBwSW5mbykge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuXG4gICAgLy8gbGF1bmNoIFVpQXV0b21hdG9yMiBhbmQgd2FpdCB0aWxsIGl0cyBvbmxpbmUgYW5kIHdlIGhhdmUgYSBzZXNzaW9uXG4gICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG5cbiAgICBhd2FpdCB0aGlzLmFkZERldmljZUluZm9Ub0NhcHMoKTtcblxuICAgIC8vIFVubG9jayB0aGUgZGV2aWNlIGFmdGVyIHRoZSBzZXNzaW9uIGlzIHN0YXJ0ZWQuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gdW5sb2NrIHRoZSBkZXZpY2UgdG8gcHJlcGFyZSBpdCBmb3IgdGVzdGluZ1xuICAgICAgYXdhaXQgaGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHRoaXMuY2Fwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHsgLy8gc3RhcnQgYSBjaHJvbWVkcml2ZXIgc2Vzc2lvblxuICAgICAgYXdhaXQgdGhpcy5zdGFydENocm9tZVNlc3Npb24odGhpcyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdHMuYXV0b0xhdW5jaCAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVBcHBTdGFydHMoKTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgaW5pdGlhbCBvcmllbnRhdGlvbiBpcyByZXF1ZXN0ZWQsIHNldCBpdFxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5vcmllbnRhdGlvbikpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGluaXRpYWwgb3JpZW50YXRpb24gdG8gJyR7dGhpcy5vcHRzLm9yaWVudGF0aW9ufSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0T3JpZW50YXRpb24odGhpcy5vcHRzLm9yaWVudGF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSB3YW50IHRvIGltbWVkaWF0ZWx5IGdldCBpbnRvIGEgd2Vidmlldywgc2V0IG91ciBjb250ZXh0XG4gICAgLy8gYXBwcm9wcmlhdGVseVxuICAgIGlmICh0aGlzLm9wdHMuYXV0b1dlYnZpZXcpIHtcbiAgICAgIGNvbnN0IHZpZXdOYW1lID0gdGhpcy5kZWZhdWx0V2Vidmlld05hbWUoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLm9wdHMuYXV0b1dlYnZpZXdUaW1lb3V0IHx8IDIwMDA7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBTZXR0aW5nIGF1dG8gd2VidmlldyB0byBjb250ZXh0ICcke3ZpZXdOYW1lfScgd2l0aCB0aW1lb3V0ICR7dGltZW91dH1tc2ApO1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIHRoaXMuc2V0Q29udGV4dC5iaW5kKHRoaXMpLCB2aWV3TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gbm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHR1cm4gb24gcHJveHlpbmcgc28gYWxsXG4gICAgLy8gc3Vic2VxdWVudCBzZXNzaW9uIHJlcXVlc3RzIGdvIHN0cmFpZ2h0IHRvL2Zyb20gdWlhdXRvbWF0b3IyXG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG4gIH1cblxuICBhc3luYyBhZGREZXZpY2VJbmZvVG9DYXBzICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgICAgbWFudWZhY3R1cmVyLFxuICAgICAgbW9kZWwsXG4gICAgICByZWFsRGlzcGxheVNpemUsXG4gICAgICBkaXNwbGF5RGVuc2l0eSxcbiAgICB9ID0gYXdhaXQgdGhpcy5tb2JpbGVHZXREZXZpY2VJbmZvKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZUFwaUxldmVsID0gcGFyc2VJbnQoYXBpVmVyc2lvbiwgMTApO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBwbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlblNpemUgPSByZWFsRGlzcGxheVNpemU7XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlbkRlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyO1xuICB9XG5cbiAgYXN5bmMgaW5pdFVpQXV0b21hdG9yMlNlcnZlciAoKSB7XG4gICAgLy8gYnJva2VuIG91dCBmb3IgcmVhZGFiaWxpdHlcbiAgICBjb25zdCB1aWF1dG9tYXRvcjJPcHRzID0ge1xuICAgICAgaG9zdDogdGhpcy5vcHRzLnJlbW90ZUFkYkhvc3QgfHwgdGhpcy5vcHRzLmhvc3QgfHwgTE9DQUxIT1NUX0lQNCxcbiAgICAgIHN5c3RlbVBvcnQ6IHRoaXMub3B0cy5zeXN0ZW1Qb3J0LFxuICAgICAgZGV2aWNlUG9ydDogREVWSUNFX1BPUlQsXG4gICAgICBhZGI6IHRoaXMuYWRiLFxuICAgICAgYXBrOiB0aGlzLm9wdHMuYXBwLFxuICAgICAgdG1wRGlyOiB0aGlzLm9wdHMudG1wRGlyLFxuICAgICAgYXBwUGFja2FnZTogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhcHBBY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbjogISF0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICAgIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB0aGlzLm9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UsXG4gICAgICByZWFkVGltZW91dDogdGhpcy5vcHRzLnVpYXV0b21hdG9yMlNlcnZlclJlYWRUaW1lb3V0LFxuICAgIH07XG4gICAgLy8gbm93IHRoYXQgd2UgaGF2ZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSwgd2UgY2FuIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZlxuICAgIC8vIHVpYXV0b21hdG9yMiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBvcHRpb25zXG4gICAgdGhpcy51aWF1dG9tYXRvcjIgPSBuZXcgVWlBdXRvbWF0b3IyU2VydmVyKHRoaXMubG9nLCB1aWF1dG9tYXRvcjJPcHRzKTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlSZXFSZXMuYmluZCh0aGlzLnVpYXV0b21hdG9yMik7XG4gICAgdGhpcy5wcm94eUNvbW1hbmQgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eUNvbW1hbmQuYmluZCh0aGlzLnVpYXV0b21hdG9yMik7XG5cbiAgICBpZiAodGhpcy5vcHRzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24pIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYCdza2lwU2VydmVySW5zdGFsbGF0aW9uJyBpcyBzZXQuIFNraXBwaW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgaW5zdGFsbGF0aW9uLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5pbnN0YWxsU2VydmVyQXBrKHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QoXG4gICAgICAgICAgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBhZGQgc2VydmVyIHBhY2thZ2VzIHRvIHRoZSBEb3plIHdoaXRlbGlzdC4gT3JpZ2luYWwgZXJyb3I6IGAgK1xuICAgICAgICAgIChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBpbml0QVVUICgpIHtcbiAgICAvLyBVbmluc3RhbGwgYW55IHVuaW5zdGFsbE90aGVyUGFja2FnZXMgd2hpY2ggd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcykge1xuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIGFueSBcIm90aGVyQXBwc1wiIHRoYXQgd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMub3RoZXJBcHBzKSB7XG4gICAgICBsZXQgb3RoZXJBcHBzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3RoZXJBcHBzID0gaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy5vdGhlckFwcHMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgcGFyc2UgXCJvdGhlckFwcHNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIG90aGVyQXBwcyA9IGF3YWl0IEIuYWxsKG90aGVyQXBwc1xuICAgICAgICAubWFwKChhcHApID0+IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAoYXBwLCBbQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT05dKSkpO1xuICAgICAgYXdhaXQgaGVscGVycy5pbnN0YWxsT3RoZXJBcGtzKG90aGVyQXBwcywgdGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGlmICh0aGlzLm9wdHMubm9SZXNldCAmJiAhKGF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKHRoaXMub3B0cy5hcHBQYWNrYWdlKSlcbiAgICAgICAgICB8fCAhdGhpcy5vcHRzLm5vUmVzZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMubm9TaWduICYmICFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQodGhpcy5vcHRzLmFwcCwgdGhpcy5vcHRzLmFwcFBhY2thZ2UsIHtcbiAgICAgICAgICByZXF1aXJlRGVmYXVsdENlcnQ6IGZhbHNlLFxuICAgICAgICB9KSkge1xuICAgICAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgdGhpcy5vcHRzLmFwcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgaGVscGVycy5pbnN0YWxsQXBrKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ25vUmVzZXQgaGFzIGJlZW4gcmVxdWVzdGVkIGFuZCB0aGUgYXBwIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBEb2luZyBub3RoaW5nJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0KSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0Z1bGwgcmVzZXQgcmVxdWlyZXMgYW4gYXBwIGNhcGFiaWxpdHksIHVzZSBmYXN0UmVzZXQgaWYgYXBwIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0ICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZW5zdXJlQXBwU3RhcnRzICgpIHtcbiAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBhY3Rpdml0eSBhbmQgcGFja2FnZSB0byB3YWl0IGZvclxuICAgIGNvbnN0IGFwcFdhaXRQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlIHx8IHRoaXMub3B0cy5hcHBQYWNrYWdlO1xuICAgIGNvbnN0IGFwcFdhaXRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHkgfHwgdGhpcy5vcHRzLmFwcEFjdGl2aXR5O1xuXG4gICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9LyR7dGhpcy5vcHRzLmFwcEFjdGl2aXR5fSBgICtcbiAgICAgIGBhbmQgd2FpdGluZyBmb3IgJyR7YXBwV2FpdFBhY2thZ2V9LyR7YXBwV2FpdEFjdGl2aXR5fSdgKTtcblxuICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBhbmRyb2lkQ292ZXJhZ2UgaXMgY29uZmlndXJlZC4gYCArXG4gICAgICAgIGAgU3RhcnRpbmcgaW5zdHJ1bWVudGF0aW9uIG9mICcke3RoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2V9Jy4uLmApO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuYW5kcm9pZENvdmVyYWdlKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2UsIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgJiYgIXRoaXMub3B0cy5mb3JjZUFwcExhdW5jaFxuICAgICAgICAmJiBhd2FpdCB0aGlzLmFkYi5wcm9jZXNzRXhpc3RzKHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9JyBpcyBhbHJlYWR5IHJ1bm5pbmcgYW5kIG5vUmVzZXQgaXMgZW5hYmxlZC4gYCArXG4gICAgICAgIGBTZXQgZm9yY2VBcHBMYXVuY2ggY2FwYWJpbGl0eSB0byB0cnVlIGlmIHRoZSBhcHAgbXVzdCBiZSBmb3JjZWZ1bGx5IHJlc3RhcnRlZCBvbiBzZXNzaW9uIHN0YXJ0dXAuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICAgIHBrZzogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uIHx8ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTicsXG4gICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5IHx8ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzIHx8ICcweDEwMjAwMDAwJywgLy8gRkxBR19BQ1RJVklUWV9ORVdfVEFTSyB8IEZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERURcbiAgICAgIHdhaXRQa2c6IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSxcbiAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgICAgd2FpdER1cmF0aW9uOiB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uLFxuICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgIHN0b3BBcHA6IHRoaXMub3B0cy5mb3JjZUFwcExhdW5jaCB8fCAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCxcbiAgICAgIHJldHJ5OiB0cnVlLFxuICAgICAgdXNlcjogdGhpcy5vcHRzLnVzZXJQcm9maWxlLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0RlbGV0aW5nIFVpQXV0b21hdG9yMiBzZXNzaW9uJyk7XG5cbiAgICBjb25zdCBzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MgPSBbYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9wUmVjb3JkaW5nU2NyZWVuKCk7XG4gICAgICB9XG4gICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGF3YWl0IHRoaXMubW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb2JpbGVTdG9wTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nKCk7XG4gICAgICB9XG4gICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuICAgICAgfVxuICAgIH1dO1xuXG4gICAgYXdhaXQgYW5kcm9pZEhlbHBlcnMucmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzKHRoaXMuc2VydmVyLCB0aGlzLnNlc3Npb25JZCk7XG5cbiAgICBpZiAodGhpcy51aWF1dG9tYXRvcjIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcENocm9tZWRyaXZlclByb3hpZXMoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gc3RvcCBDaHJvbWVEcml2ZXIgcHJveGllczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmp3cFByb3h5QWN0aXZlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcHJveHkgZGVsZXRlU2Vzc2lvbiB0byBVaUF1dG9tYXRvcjI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBhd2FpdCBCLmFsbChzY3JlZW5SZWNvcmRpbmdTdG9wVGFza3MubWFwKCh0YXNrKSA9PiB7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRhc2soKTtcbiAgICAgICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICAgIH0pKCk7XG4gICAgICB9KSk7XG5cbiAgICAgIGlmICh0aGlzLm9wdHMudW5pY29kZUtleWJvYXJkICYmIHRoaXMub3B0cy5yZXNldEtleWJvYXJkICYmIHRoaXMuZGVmYXVsdElNRSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgUmVzZXR0aW5nIElNRSB0byAnJHt0aGlzLmRlZmF1bHRJTUV9J2ApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldElNRSh0aGlzLmRlZmF1bHRJTUUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVzZXQgSU1FOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdTaHV0dGluZyBkb3duIHRoZSBhZGIgcHJvY2VzcyBvZiBpbnN0cnVtZW50YXRpb24uLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuZW5kQW5kcm9pZENvdmVyYWdlKCk7XG4gICAgICAgIC8vIFVzZSB0aGlzIGJyb2FkY2FzdCBpbnRlbnQgdG8gbm90aWZ5IGl0J3MgdGltZSB0byBkdW1wIGNvdmVyYWdlIHRvIGZpbGVcbiAgICAgICAgaWYgKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBTZW5kaW5nIGludGVudCBicm9hZGNhc3QgJyR7dGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZUVuZEludGVudH0nIGF0IHRoZSBlbmQgb2YgaW5zdHJ1bWVudGluZy5gKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3QodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZUVuZEludGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybignTm8gYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50IGlzIGNvbmZpZ3VyZWQgaW4gY2Fwcy4gUG9zc2libHkgeW91IGNhbm5vdCBnZXQgY292ZXJhZ2UgZmlsZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb25cbiAgICAgICAgICAgICYmICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0XG4gICAgICAgICAgICAmJiAhdGhpcy5vcHRzLm5vUmVzZXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byBmb3JjZSBzdG9wIGFwcDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYENhcGFiaWxpdHkgJ2Z1bGxSZXNldCcgc2V0IHRvICd0cnVlJywgVW5pbnN0YWxsaW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfSdgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byB1bmluc3RhbGwgYXBwOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhpcyB2YWx1ZSBjYW4gYmUgdHJ1ZSBpZiB0ZXN0IHRhcmdldCBkZXZpY2UgaXMgPD0gMjZcbiAgICAgIGlmICh0aGlzLl93YXNXaW5kb3dBbmltYXRpb25EaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZXN0b3Jpbmcgd2luZG93IGFuaW1hdGlvbiBzdGF0ZScpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZSh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYWRiLnN0b3BMb2djYXQoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVsZWFzZVN5c3RlbVBvcnQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byByZW1vdmUgc3lzdGVtIHBvcnQgZm9yd2FyZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAvLyBJZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVsZWFzZU1qcGVnU2VydmVyUG9ydCgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHJlbW92ZSBNSlBFRyBzZXJ2ZXIgcG9ydCBmb3J3YXJkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIC8vIElnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIGhpZGRlbiBhcGkgcG9saWN5IHRvIHRoZSBkZXZpY2UgZGVmYXVsdCBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3koISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICBsZXQgYXZkTmFtZSA9IHRoaXMub3B0cy5hdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYENsb3NpbmcgZW11bGF0b3IgJyR7YXZkTmFtZX0nYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gY2xvc2UgZW11bGF0b3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMubWpwZWdTdHJlYW0pIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ0Nsb3NpbmcgTUpQRUcgc3RyZWFtJyk7XG4gICAgICB0aGlzLm1qcGVnU3RyZWFtLnN0b3AoKTtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuICB9XG5cbiAgYXN5bmMgY2hlY2tBcHBQcmVzZW50ICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnQ2hlY2tpbmcgd2hldGhlciBhcHAgaXMgYWN0dWFsbHkgcHJlc2VudCcpO1xuICAgIGlmICghKGF3YWl0IGZzLmV4aXN0cyh0aGlzLm9wdHMuYXBwKSkpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBmaW5kIGFwcCBhcGsgYXQgJyR7dGhpcy5vcHRzLmFwcH0nYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25TZXR0aW5nc1VwZGF0ZSAoKSB7XG4gICAgLy8gaW50ZW50aW9uYWxseSBkbyBub3RoaW5nIGhlcmUsIHNpbmNlIGNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzIHByb3hpZXNcbiAgICAvLyBzZXR0aW5ncyB0byB0aGUgdWlhdXRvMiBzZXJ2ZXIgYWxyZWFkeVxuICB9XG5cbiAgLy8gTmVlZCB0byBvdmVycmlkZSBhbmRyb2lkLWRyaXZlcidzIHZlcnNpb24gb2YgdGhpcyBzaW5jZSB3ZSBkb24ndCBhY3R1YWxseVxuICAvLyBoYXZlIGEgYm9vdHN0cmFwOyBpbnN0ZWFkIHdlIGp1c3QgcmVzdGFydCBhZGIgYW5kIHJlLWZvcndhcmQgdGhlIFVpQXV0b21hdG9yMlxuICAvLyBwb3J0XG4gIGFzeW5jIHdyYXBCb290c3RyYXBEaXNjb25uZWN0ICh3cmFwcGVkKSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcbiAgfVxuXG4gIHByb3h5QWN0aXZlIChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5wcm94eUFjdGl2ZShzZXNzaW9uSWQpO1xuXG4gICAgLy8gd2UgYWx3YXlzIGhhdmUgYW4gYWN0aXZlIHByb3h5IHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIHVpYXV0b21hdG9yMiBzZXJ2ZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5nZXRQcm94eUF2b2lkTGlzdChzZXNzaW9uSWQpO1xuICAgIC8vIHdlIGFyZSBtYWludGFpbmluZyB0d28gc2V0cyBvZiBOT19QUk9YWSBsaXN0cywgb25lIGZvciBjaHJvbWVkcml2ZXIoQ0hST01FX05PX1BST1hZKVxuICAgIC8vIGFuZCBvbmUgZm9yIHVpYXV0b21hdG9yMihOT19QUk9YWSksIGJhc2VkIG9uIGN1cnJlbnQgY29udGV4dCB3aWxsIHJldHVybiByZWxhdGVkIE5PX1BST1hZIGxpc3RcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLmNocm9tZWRyaXZlcikpIHtcbiAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgd2VidmlldyhjaHJvbWVkcml2ZXIpLCB0aGVuIHJldHVybiBDSFJPTUVfTk9fUFJPWFkgbGlzdFxuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gQ0hST01FX05PX1BST1hZO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBbLi4udGhpcy5qd3BQcm94eUF2b2lkLCBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgZ2V0IGlzQ2hyb21lU2Vzc2lvbiAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIucHJvdG90eXBlW2NtZF0gPSBmbjtcbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgdWlhdXRvbWF0b3IyLXNwZWNpZmljIGNvbW1hbmRzXG5mb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQSxNQUFNQSxPQUFPLEdBQUdDLE1BQU0sQ0FBQ0Ms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
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","names":["helpers","Object","assign","uiautomator2Helpers","androidHelpers","DEVICE_PORT_RANGE","DEVICE_PORT_ALLOCATION_GUARD","util","getLockFileGuard","path","resolve","os","tmpdir","timeout","tryRecovery","DEVICE_PORT","MJPEG_SERVER_DEVICE_PORT","LOCALHOST_IP4","NO_PROXY","RegExp","CHROME_NO_PROXY","MEMOIZED_FUNCTIONS","AndroidUiautomator2Driver","BaseDriver","constructor","opts","shouldValidateCaps","shell","locatorStrategies","desiredCapConstraints","uiautomator2","jwpProxyActive","defaultIME","jwpProxyAvoid","apkStrings","settings","DeviceSettings","ignoreUnimportantViews","allowInvisibleElements","onSettingsUpdate","bind","chromedriver","sessionChromedrivers","fn","_","memoize","validateDesiredCaps","caps","createSession","args","sessionId","serverDetails","platform","webStorageEnabled","takesScreenshot","javascriptEnabled","databaseEnabled","networkConnectionEnabled","locationContextEnabled","warnings","desired","curContext","defaultContextName","defaultOpts","fullReset","autoLaunch","adbPort","DEFAULT_ADB_PORT","androidInstallTimeout","defaults","isChromeSession","log","info","pkg","activity","getChromePkg","browserName","appPackage","appActivity","reboot","setAvdFromCapabilities","app","configureApp","APK_EXTENSION","APKS_EXTENSION","checkAppPresent","startUiAutomator2Session","fillDeviceDetails","mjpegScreenshotUrl","mjpegStream","mjpeg","MJpegStream","start","e","deleteSession","pixelRatio","getDevicePixelRatio","statBarHeight","getStatusBarHeight","viewportRect","getViewPortRect","driverData","getSession","sessionData","debug","uia2Data","jwproxy","command","isEmulator","adb","avd","deviceName","errorAndThrow","platformVersion","avdDevice","replace","allocateSystemPort","forwardPort","localPort","checkPortStatus","systemPort","_hasSystemPortInCaps","startPort","endPort","findAPortNotInUse","releaseSystemPort","removePortForward","allocateMjpegServerPort","mjpegServerPort","releaseMjpegServerPort","udid","emPort","getDeviceInfoFromCaps","createADB","apiLevel","getApiLevel","setHiddenApiPolicy","ignoreHiddenApiPolicyError","hasValue","gpsEnabled","toggleGPSLocationProvider","warn","appInfo","getLaunchInfo","curDeviceId","deviceUDID","initDevice","initUiAutomator2Server","disableWindowAnimation","isAnimationOn","setAnimationState","_wasWindowAnimationDisabled","initAUT","startSession","addDeviceInfoToCaps","skipUnlock","unlock","startChromeSession","ensureAppStarts","orientation","setOrientation","autoWebview","viewName","defaultWebviewName","autoWebviewTimeout","retryInterval","setContext","apiVersion","manufacturer","model","realDisplaySize","displayDensity","mobileGetDeviceInfo","deviceApiLevel","parseInt","deviceScreenSize","deviceScreenDensity","deviceModel","deviceManufacturer","uiautomator2Opts","host","remoteAdbHost","devicePort","apk","tmpDir","disableSuppressAccessibilityService","readTimeout","uiautomator2ServerReadTimeout","UiAutomator2Server","proxyReqRes","proxyCommand","skipServerInstallation","installServerApk","uiautomator2ServerInstallTimeout","addToDeviceIdleWhitelist","SETTINGS_HELPER_PKG_ID","SERVER_PACKAGE_ID","SERVER_TEST_PACKAGE_ID","stderr","message","uninstallOtherPackages","parseArray","otherApps","B","all","map","installOtherApks","noReset","isAppInstalled","noSign","checkApkCert","requireDefaultCert","signApp","skipUninstall","uninstallApk","installApk","fastReset","resetApp","appWaitPackage","appWaitActivity","androidCoverage","forceAppLaunch","processExists","startApp","action","intentAction","category","intentCategory","flags","intentFlags","waitPkg","waitActivity","waitForLaunch","appWaitForLaunch","waitDuration","appWaitDuration","optionalIntentArguments","stopApp","dontStopAppOnReset","retry","user","userProfile","screenRecordingStopTasks","isEmpty","_screenRecordingProperties","stopRecordingScreen","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","_screenStreamingProps","mobileStopScreenStreaming","removeAllSessionWebSocketHandlers","server","stopChromedriverProxies","err","task","ign","unicodeKeyboard","resetKeyboard","setIME","endAndroidCoverage","androidCoverageEndIntent","broadcast","forceStop","stopLogcat","error","setDefaultHiddenApiPolicy","avdName","killEmulator","stop","fs","exists","wrapBootstrapDisconnect","wrapped","restart","proxyActive","canProxy","getProxyAvoidList","nativeWebScreenshot","isChromeBrowser","cmd","toPairs","androidCommands","prototype","commands"],"sources":["../../lib/driver.js"],"sourcesContent":["import _ from 'lodash';\nimport { BaseDriver, DeviceSettings } from 'appium/driver';\nimport {\n UiAutomator2Server, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID\n} from './uiautomator2';\nimport { fs, util, mjpeg } from 'appium/support';\nimport { retryInterval } from 'asyncbox';\nimport B from 'bluebird';\nimport commands from './commands/index';\nimport { DEFAULT_ADB_PORT } from 'appium-adb';\nimport uiautomator2Helpers from './helpers';\nimport {\n androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID\n} from 'appium-android-driver';\nimport desiredCapConstraints from './desired-caps';\nimport { findAPortNotInUse, checkPortStatus } from 'portscanner';\nimport os from 'os';\nimport path from 'path';\nimport { APK_EXTENSION, APKS_EXTENSION } from './extensions';\n\n\nconst helpers = Object.assign({}, uiautomator2Helpers, androidHelpers);\n\n// The range of ports we can use on the system for communicating to the\n// UiAutomator2 HTTP server on the device\nconst DEVICE_PORT_RANGE = [8200, 8299];\n\n// The guard is needed to avoid dynamic system port allocation conflicts for\n// parallel driver sessions\nconst DEVICE_PORT_ALLOCATION_GUARD = util.getLockFileGuard(\n path.resolve(os.tmpdir(), 'uia2_device_port_guard'),\n {timeout: 25, tryRecovery: true}\n);\n\n// This is the port that UiAutomator2 listens to on the device. We will forward\n// one of the ports above on the system to this port on the device.\nconst DEVICE_PORT = 6790;\n// This is the port that the UiAutomator2 MJPEG server listens to on the device.\n// We will forward one of the ports above on the system to this port on the\n// device.\nconst MJPEG_SERVER_DEVICE_PORT = 7810;\n\nconst LOCALHOST_IP4 = '127.0.0.1';\n\n// NO_PROXY contains the paths that we never want to proxy to UiAutomator2 server.\n// TODO: Add the list of paths that we never want to proxy to UiAutomator2 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/[^/]+/alert_[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/alert/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_activity')],\n ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_package')],\n ['GET', new RegExp('^/session/[^/]+/appium/app/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/settings')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/contexts')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/attribute')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/displayed')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/enabled')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/location_in_view')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/name')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/screenshot')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/selected')],\n ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/location')],\n ['GET', new RegExp('^/session/[^/]+/network_connection')],\n ['GET', new RegExp('^/session/[^/]+/screenshot')],\n ['GET', new RegExp('^/session/[^/]+/timeouts')],\n ['GET', new RegExp('^/session/[^/]+/url')],\n ['POST', new RegExp('^/session/[^/]+/[^/]+_alert$')],\n ['POST', new RegExp('^/session/[^/]+/actions')],\n ['POST', new RegExp('^/session/[^/]+/alert/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/app/[^/]')],\n ['POST', new RegExp('^/session/[^/]+/appium/[^/]+/start_activity')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/appium/compare_images')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/(?!set_clipboard)[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/replace_value')],\n ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/value')],\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/[^/]+/appium/.*event')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/element')],\n ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/keys')],\n ['POST', new RegExp('^/session/[^/]+/location')],\n ['POST', new RegExp('^/session/[^/]+/network_connection')],\n ['POST', new RegExp('^/session/[^/]+/timeouts')],\n ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],\n ['POST', new RegExp('^/session/[^/]+/touch/perform')],\n ['POST', new RegExp('^/session/[^/]+/url')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/execute')],\n ['POST', new RegExp('^/session/[^/]+/execute_async')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n ['GET', new RegExp('^/session/[^/]+/window/rect')],\n ['POST', new RegExp('^/session/[^/]+/execute/async')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\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 // 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\nconst MEMOIZED_FUNCTIONS = [\n 'getStatusBarHeight',\n 'getDevicePixelRatio',\n];\n\nclass AndroidUiautomator2Driver extends BaseDriver {\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 'xpath',\n 'id',\n 'class name',\n 'accessibility id',\n 'css selector',\n '-android uiautomator'\n ];\n this.desiredCapConstraints = desiredCapConstraints;\n this.uiautomator2 = null;\n this.jwpProxyActive = false;\n this.defaultIME = null;\n this.jwpProxyAvoid = NO_PROXY;\n this.apkStrings = {}; // map of language -> strings obj\n\n this.settings = new DeviceSettings({ignoreUnimportantViews: false, allowInvisibleElements: false},\n this.onSettingsUpdate.bind(this));\n // handle webview mechanics from AndroidDriver\n this.chromedriver = null;\n this.sessionChromedrivers = {};\n\n // memoize functions here, so that they are done on a per-instance basis\n for (const fn of MEMOIZED_FUNCTIONS) {\n this[fn] = _.memoize(this[fn]);\n }\n }\n\n validateDesiredCaps (caps) {\n return super.validateDesiredCaps(caps) && androidHelpers.validateDesiredCaps(caps);\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: 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 this.log.info(\"We're going to run a Chrome-based session\");\n let {pkg, activity} = helpers.getChromePkg(this.opts.browserName);\n this.opts.appPackage = this.caps.appPackage = pkg;\n this.opts.appActivity = this.caps.appActivity = activity;\n this.log.info(`Chrome-type package and activity are ${pkg} and ${activity}`);\n }\n\n if (this.opts.reboot) {\n this.setAvdFromCapabilities(caps);\n }\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, [APK_EXTENSION, APKS_EXTENSION]);\n await this.checkAppPresent();\n } else if (this.opts.appPackage) {\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(`Starting '${this.opts.appPackage}' directly on the device`);\n } else {\n this.log.info(`Neither 'app' nor 'appPackage' was set. Starting UiAutomator2 ` +\n 'without the target application');\n }\n this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;\n\n await this.startUiAutomator2Session();\n await this.fillDeviceDetails();\n if (this.opts.mjpegScreenshotUrl) {\n this.log.info(`Starting MJPEG stream reading URL: '${this.opts.mjpegScreenshotUrl}'`);\n this.mjpegStream = new mjpeg.MJpegStream(this.opts.mjpegScreenshotUrl);\n await this.mjpegStream.start();\n }\n return [sessionId, this.caps];\n } catch (e) {\n await this.deleteSession();\n throw e;\n }\n }\n\n async fillDeviceDetails () {\n this.caps.pixelRatio = await this.getDevicePixelRatio();\n this.caps.statBarHeight = await this.getStatusBarHeight();\n this.caps.viewportRect = await this.getViewPortRect();\n }\n\n get driverData () {\n // TODO fill out resource info here\n return {};\n }\n\n async getSession () {\n let sessionData = await super.getSession();\n this.log.debug('Getting session details from server to mix in');\n let uia2Data = await this.uiautomator2.jwproxy.command('/', 'GET', {});\n return Object.assign({}, sessionData, uia2Data);\n }\n\n isEmulator () {\n return helpers.isEmulator(this.adb, this.opts);\n }\n\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 async allocateSystemPort () {\n const forwardPort = async (localPort) => {\n this.log.debug(`Forwarding UiAutomator2 Server port ${DEVICE_PORT} to local port ${localPort}`);\n if ((await checkPortStatus(localPort, LOCALHOST_IP4)) === 'open') {\n this.log.errorAndThrow(`UiAutomator2 Server cannot start because the local port #${localPort} is busy. ` +\n `Make sure the port you provide via 'systemPort' capability is not occupied. ` +\n `This situation might often be a result of an inaccurate sessions management, e.g. ` +\n `old automation sessions on the same device must always be closed before starting new ones.`);\n }\n await this.adb.forwardPort(localPort, DEVICE_PORT);\n };\n\n if (this.opts.systemPort) {\n this._hasSystemPortInCaps = true;\n return await forwardPort(this.opts.systemPort);\n }\n\n await DEVICE_PORT_ALLOCATION_GUARD(async () => {\n const [startPort, endPort] = DEVICE_PORT_RANGE;\n try {\n this.opts.systemPort = await findAPortNotInUse(startPort, endPort);\n } catch (e) {\n this.log.errorAndThrow(\n `Cannot find any free port in range ${startPort}..${endPort}}. ` +\n `Please set the available port number by providing the systemPort capability or ` +\n `double check the processes that are locking ports within this range and terminate ` +\n `these which are not needed anymore`);\n }\n await forwardPort(this.opts.systemPort);\n });\n }\n\n async releaseSystemPort () {\n if (!this.opts.systemPort || !this.adb) {\n return;\n }\n\n if (this._hasSystemPortInCaps) {\n await this.adb.removePortForward(this.opts.systemPort);\n } else {\n await DEVICE_PORT_ALLOCATION_GUARD(async () => await this.adb.removePortForward(this.opts.systemPort));\n }\n }\n\n async allocateMjpegServerPort () {\n if (this.opts.mjpegServerPort) {\n await this.adb.forwardPort(this.opts.mjpegServerPort, MJPEG_SERVER_DEVICE_PORT);\n }\n }\n\n async releaseMjpegServerPort () {\n if (this.opts.mjpegServerPort) {\n await this.adb.removePortForward(this.opts.mjpegServerPort);\n }\n }\n\n async startUiAutomator2Session () {\n // get device udid for this session\n let {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);\n this.opts.udid = udid;\n this.opts.emPort = emPort;\n\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 const apiLevel = await this.adb.getApiLevel();\n\n if (apiLevel < 21) {\n this.log.errorAndThrow('UIAutomator2 is only supported since Android 5.0 (Lollipop). ' +\n 'You could still use other supported backends in order to automate older Android versions.');\n }\n\n if (apiLevel >= 28) { // Android P\n this.log.info('Relaxing hidden api policy');\n await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);\n }\n\n // check if we have to enable/disable gps before running the application\n if (util.hasValue(this.opts.gpsEnabled)) {\n if (this.isEmulator()) {\n this.log.info(`Trying to ${this.opts.gpsEnabled ? 'enable' : 'disable'} gps location provider`);\n await this.adb.toggleGPSLocationProvider(this.opts.gpsEnabled);\n } else {\n this.log.warn(`Sorry! 'gpsEnabled' capability is only available for emulators`);\n }\n }\n\n // get appPackage et al from manifest if necessary\n const appInfo = await helpers.getLaunchInfo(this.adb, this.opts);\n // and get it onto our 'opts' object so we use it from now on\n Object.assign(this.opts, appInfo || {});\n\n // set actual device name, udid, platform version, screen size, screen density, model and manufacturer details\n this.caps.deviceName = this.adb.curDeviceId;\n this.caps.deviceUDID = this.opts.udid;\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 this.defaultIME = await helpers.initDevice(this.adb, this.opts);\n\n // Prepare the device by forwarding the UiAutomator2 port\n // This call mutates this.opts.systemPort if it is not set explicitly\n await this.allocateSystemPort();\n\n // Prepare the device by forwarding the UiAutomator2 MJPEG server port (if\n // applicable)\n await this.allocateMjpegServerPort();\n\n // set up the modified UiAutomator2 server etc\n await this.initUiAutomator2Server();\n\n // Should be after installing io.appium.settings in helpers.initDevice\n if (this.opts.disableWindowAnimation && (await this.adb.getApiLevel() < 26)) { // API level 26 is Android 8.0.\n // Granting android.permission.SET_ANIMATION_SCALE is necessary to handle animations under API level 26\n // Read https://github.com/appium/appium/pull/11640#issuecomment-438260477\n // `--no-window-animation` works over Android 8 to disable all of animations\n if (await this.adb.isAnimationOn()) {\n this.log.info('Disabling animation via io.appium.settings');\n await this.adb.setAnimationState(false);\n this._wasWindowAnimationDisabled = true;\n } else {\n this.log.info('Window animation is already disabled');\n }\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 && appInfo) {\n this.caps.appPackage = appInfo.appPackage;\n }\n\n // launch UiAutomator2 and wait till its online and we have a session\n await this.uiautomator2.startSession(this.caps);\n\n await this.addDeviceInfoToCaps();\n\n // Unlock the device after the session is started.\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 if (this.isChromeSession) { // start a chromedriver session\n await this.startChromeSession(this);\n } else if (this.opts.autoLaunch && this.opts.appPackage) {\n await this.ensureAppStarts();\n }\n\n // if the initial orientation is requested, set it\n if (util.hasValue(this.opts.orientation)) {\n this.log.debug(`Setting initial orientation to '${this.opts.orientation}'`);\n await this.setOrientation(this.opts.orientation);\n }\n\n // if we want to immediately get into a webview, set our context\n // appropriately\n if (this.opts.autoWebview) {\n const viewName = this.defaultWebviewName();\n const timeout = this.opts.autoWebviewTimeout || 2000;\n this.log.info(`Setting auto webview to context '${viewName}' with timeout ${timeout}ms`);\n await retryInterval(timeout / 500, 500, this.setContext.bind(this), viewName);\n }\n\n // now that everything has started successfully, turn on proxying so all\n // subsequent session requests go straight to/from uiautomator2\n this.jwpProxyActive = true;\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 async initUiAutomator2Server () {\n // broken out for readability\n const uiautomator2Opts = {\n host: this.opts.remoteAdbHost || this.opts.host || LOCALHOST_IP4,\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 disableWindowAnimation: !!this.opts.disableWindowAnimation,\n disableSuppressAccessibilityService: this.opts.disableSuppressAccessibilityService,\n readTimeout: this.opts.uiautomator2ServerReadTimeout,\n };\n // now that we have package and activity, we can create an instance of\n // uiautomator2 with the appropriate options\n this.uiautomator2 = new UiAutomator2Server(this.log, uiautomator2Opts);\n this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);\n this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);\n\n if (this.opts.skipServerInstallation) {\n this.log.info(`'skipServerInstallation' is set. Skipping UIAutomator2 server installation.`);\n } else {\n await this.uiautomator2.installServerApk(this.opts.uiautomator2ServerInstallTimeout);\n try {\n await this.adb.addToDeviceIdleWhitelist(\n SETTINGS_HELPER_PKG_ID, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID,\n );\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 initAUT () {\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, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID]\n );\n }\n\n // Install any \"otherApps\" that were specified in caps\n if (this.opts.otherApps) {\n let otherApps;\n try {\n otherApps = helpers.parseArray(this.opts.otherApps);\n } catch (e) {\n this.log.errorAndThrow(`Could not parse \"otherApps\" capability: ${e.message}`);\n }\n otherApps = await B.all(otherApps\n .map((app) => this.helpers.configureApp(app, [APK_EXTENSION, APKS_EXTENSION])));\n await helpers.installOtherApks(otherApps, this.adb, this.opts);\n }\n\n if (this.opts.app) {\n if (this.opts.noReset && !(await this.adb.isAppInstalled(this.opts.appPackage))\n || !this.opts.noReset) {\n if (!this.opts.noSign && !await this.adb.checkApkCert(this.opts.app, this.opts.appPackage, {\n requireDefaultCert: false,\n })) {\n await helpers.signApp(this.adb, this.opts.app);\n }\n if (!this.opts.skipUninstall) {\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n await helpers.installApk(this.adb, this.opts);\n } else {\n this.log.debug('noReset has been requested and the app is already installed. Doing nothing');\n }\n } else {\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 && this.opts.appPackage) {\n await helpers.resetApp(this.adb, this.opts);\n }\n }\n }\n\n async ensureAppStarts () {\n // make sure we have an activity and package to wait for\n const appWaitPackage = this.opts.appWaitPackage || this.opts.appPackage;\n const appWaitActivity = this.opts.appWaitActivity || this.opts.appActivity;\n\n this.log.info(`Starting '${this.opts.appPackage}/${this.opts.appActivity} ` +\n `and waiting for '${appWaitPackage}/${appWaitActivity}'`);\n\n if (this.caps.androidCoverage) {\n this.log.info(`androidCoverage is configured. ` +\n ` Starting instrumentation of '${this.caps.androidCoverage}'...`);\n await this.adb.androidCoverage(this.caps.androidCoverage, appWaitPackage, appWaitActivity);\n return;\n }\n if (this.opts.noReset && !this.opts.forceAppLaunch\n && await this.adb.processExists(this.opts.appPackage)) {\n this.log.info(`'${this.opts.appPackage}' is already running and noReset is enabled. ` +\n `Set forceAppLaunch capability to true if the app must be forcefully restarted on session startup.`);\n return;\n }\n await this.adb.startApp({\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction || 'android.intent.action.MAIN',\n category: this.opts.intentCategory || 'android.intent.category.LAUNCHER',\n flags: this.opts.intentFlags || '0x10200000', // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: this.opts.forceAppLaunch || !this.opts.dontStopAppOnReset,\n retry: true,\n user: this.opts.userProfile,\n });\n }\n\n async deleteSession () {\n this.log.debug('Deleting UiAutomator2 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.uiautomator2) {\n try {\n await this.stopChromedriverProxies();\n } catch (err) {\n this.log.warn(`Unable to stop ChromeDriver proxies: ${err.message}`);\n }\n if (this.jwpProxyActive) {\n try {\n await this.uiautomator2.deleteSession();\n } catch (err) {\n this.log.warn(`Unable to proxy deleteSession to UiAutomator2: ${err.message}`);\n }\n }\n this.uiautomator2 = 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\n if (this.opts.unicodeKeyboard && this.opts.resetKeyboard && this.defaultIME) {\n this.log.debug(`Resetting IME to '${this.defaultIME}'`);\n try {\n await this.adb.setIME(this.defaultIME);\n } catch (err) {\n this.log.warn(`Unable to reset IME: ${err.message}`);\n }\n }\n if (this.caps.androidCoverage) {\n this.log.info('Shutting down the adb process of instrumentation...');\n await this.adb.endAndroidCoverage();\n // Use this broadcast intent to notify it's time to dump coverage to file\n if (this.caps.androidCoverageEndIntent) {\n this.log.info(`Sending intent broadcast '${this.caps.androidCoverageEndIntent}' at the end of instrumenting.`);\n await this.adb.broadcast(this.caps.androidCoverageEndIntent);\n } else {\n this.log.warn('No androidCoverageEndIntent is configured in caps. Possibly you cannot get coverage file.');\n }\n }\n if (this.opts.appPackage) {\n if (!this.isChromeSession\n && !this.opts.dontStopAppOnReset\n && !this.opts.noReset) {\n try {\n await this.adb.forceStop(this.opts.appPackage);\n } catch (err) {\n this.log.warn(`Unable to force stop app: ${err.message}`);\n }\n }\n if (this.opts.fullReset && !this.opts.skipUninstall) {\n this.log.debug(`Capability 'fullReset' set to 'true', Uninstalling '${this.opts.appPackage}'`);\n try {\n await this.adb.uninstallApk(this.opts.appPackage);\n } catch (err) {\n this.log.warn(`Unable to uninstall app: ${err.message}`);\n }\n }\n }\n // This value can be true if test target device is <= 26\n if (this._wasWindowAnimationDisabled) {\n this.log.info('Restoring window animation state');\n await this.adb.setAnimationState(true);\n }\n await this.adb.stopLogcat();\n try {\n await this.releaseSystemPort();\n } catch (error) {\n this.log.warn(`Unable to remove system 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 try {\n await this.releaseMjpegServerPort();\n } catch (error) {\n this.log.warn(`Unable to remove MJPEG server 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 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 if (this.opts.reboot) {\n let avdName = this.opts.avd.replace('@', '');\n this.log.debug(`Closing emulator '${avdName}'`);\n try {\n await this.adb.killEmulator(avdName);\n } catch (err) {\n this.log.warn(`Unable to close emulator: ${err.message}`);\n }\n }\n }\n if (this.mjpegStream) {\n this.log.info('Closing MJPEG stream');\n this.mjpegStream.stop();\n }\n await super.deleteSession();\n }\n\n async checkAppPresent () {\n this.log.debug('Checking whether app is actually present');\n if (!(await fs.exists(this.opts.app))) {\n this.log.errorAndThrow(`Could not find app apk at '${this.opts.app}'`);\n }\n }\n\n async onSettingsUpdate () {\n // intentionally do nothing here, since commands.updateSettings proxies\n // settings to the uiauto2 server already\n }\n\n // Need to override android-driver's version of this since we don't actually\n // have a bootstrap; instead we just restart adb and re-forward the UiAutomator2\n // port\n async wrapBootstrapDisconnect (wrapped) {\n await wrapped();\n await this.adb.restart();\n await this.allocateSystemPort();\n await this.allocateMjpegServerPort();\n }\n\n proxyActive (sessionId) {\n super.proxyActive(sessionId);\n\n // we always have an active proxy to the UiAutomator2 server\n return true;\n }\n\n canProxy (sessionId) {\n super.canProxy(sessionId);\n\n // we can always proxy to the uiautomator2 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 uiautomator2(NO_PROXY), based on current context will return related NO_PROXY list\n if (util.hasValue(this.chromedriver)) {\n // if the current context is webview(chromedriver), then return CHROME_NO_PROXY list\n this.jwpProxyAvoid = CHROME_NO_PROXY;\n } else {\n this.jwpProxyAvoid = NO_PROXY;\n }\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\n// first add the android-driver commands which we will fall back to\nfor (let [cmd, fn] of _.toPairs(androidCommands)) {\n AndroidUiautomator2Driver.prototype[cmd] = fn;\n}\n\n// then overwrite with any uiautomator2-specific commands\nfor (let [cmd, fn] of _.toPairs(commands)) {\n AndroidUiautomator2Driver.prototype[cmd] = fn;\n}\n\nexport { AndroidUiautomator2Driver };\nexport default AndroidUiautomator2Driver;\n"],"mappings":"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"}
1
+ {"version":3,"file":"driver.js","names":["helpers","Object","assign","uiautomator2Helpers","androidHelpers","DEVICE_PORT_RANGE","DEVICE_PORT_ALLOCATION_GUARD","util","getLockFileGuard","path","resolve","os","tmpdir","timeout","tryRecovery","DEVICE_PORT","MJPEG_SERVER_DEVICE_PORT","LOCALHOST_IP4","NO_PROXY","RegExp","CHROME_NO_PROXY","MEMOIZED_FUNCTIONS","AndroidUiautomator2Driver","BaseDriver","newMethodMap","constructor","opts","shouldValidateCaps","shell","locatorStrategies","desiredCapConstraints","uiautomator2","jwpProxyActive","defaultIME","jwpProxyAvoid","apkStrings","settings","DeviceSettings","ignoreUnimportantViews","allowInvisibleElements","onSettingsUpdate","bind","chromedriver","sessionChromedrivers","fn","_","memoize","validateDesiredCaps","caps","createSession","args","sessionId","serverDetails","platform","webStorageEnabled","takesScreenshot","javascriptEnabled","databaseEnabled","networkConnectionEnabled","locationContextEnabled","warnings","desired","curContext","defaultContextName","defaultOpts","fullReset","autoLaunch","adbPort","DEFAULT_ADB_PORT","androidInstallTimeout","defaults","isChromeSession","log","info","pkg","activity","getChromePkg","browserName","appPackage","appActivity","reboot","setAvdFromCapabilities","app","configureApp","APK_EXTENSION","APKS_EXTENSION","checkAppPresent","startUiAutomator2Session","fillDeviceDetails","mjpegScreenshotUrl","mjpegStream","mjpeg","MJpegStream","start","e","deleteSession","pixelRatio","getDevicePixelRatio","statBarHeight","getStatusBarHeight","viewportRect","getViewPortRect","driverData","getSession","sessionData","debug","uia2Data","jwproxy","command","isEmulator","adb","avd","deviceName","errorAndThrow","platformVersion","avdDevice","replace","allocateSystemPort","forwardPort","localPort","checkPortStatus","systemPort","_hasSystemPortInCaps","startPort","endPort","findAPortNotInUse","releaseSystemPort","removePortForward","allocateMjpegServerPort","mjpegServerPort","releaseMjpegServerPort","udid","emPort","getDeviceInfoFromCaps","createADB","apiLevel","getApiLevel","setHiddenApiPolicy","ignoreHiddenApiPolicyError","hasValue","gpsEnabled","toggleGPSLocationProvider","warn","appInfo","getLaunchInfo","curDeviceId","deviceUDID","initDevice","initUiAutomator2Server","disableWindowAnimation","isAnimationOn","setAnimationState","_wasWindowAnimationDisabled","initAUT","startSession","addDeviceInfoToCaps","skipUnlock","unlock","startChromeSession","ensureAppStarts","orientation","setOrientation","autoWebview","viewName","defaultWebviewName","autoWebviewTimeout","retryInterval","setContext","apiVersion","manufacturer","model","realDisplaySize","displayDensity","mobileGetDeviceInfo","deviceApiLevel","parseInt","deviceScreenSize","deviceScreenDensity","deviceModel","deviceManufacturer","uiautomator2Opts","host","remoteAdbHost","devicePort","apk","tmpDir","disableSuppressAccessibilityService","readTimeout","uiautomator2ServerReadTimeout","UiAutomator2Server","proxyReqRes","proxyCommand","skipServerInstallation","installServerApk","uiautomator2ServerInstallTimeout","addToDeviceIdleWhitelist","SETTINGS_HELPER_PKG_ID","SERVER_PACKAGE_ID","SERVER_TEST_PACKAGE_ID","stderr","message","uninstallOtherPackages","parseArray","otherApps","B","all","map","installOtherApks","noReset","isAppInstalled","noSign","checkApkCert","requireDefaultCert","signApp","skipUninstall","uninstallApk","installApk","fastReset","resetApp","appWaitPackage","appWaitActivity","androidCoverage","forceAppLaunch","processExists","startApp","action","intentAction","category","intentCategory","flags","intentFlags","waitPkg","waitActivity","waitForLaunch","appWaitForLaunch","waitDuration","appWaitDuration","optionalIntentArguments","stopApp","dontStopAppOnReset","retry","user","userProfile","screenRecordingStopTasks","isEmpty","_screenRecordingProperties","stopRecordingScreen","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","_screenStreamingProps","mobileStopScreenStreaming","removeAllSessionWebSocketHandlers","server","stopChromedriverProxies","err","task","ign","unicodeKeyboard","resetKeyboard","setIME","endAndroidCoverage","androidCoverageEndIntent","broadcast","forceStop","stopLogcat","error","setDefaultHiddenApiPolicy","avdName","killEmulator","stop","fs","exists","wrapBootstrapDisconnect","wrapped","restart","proxyActive","canProxy","getProxyAvoidList","nativeWebScreenshot","isChromeBrowser","cmd","toPairs","androidCommands","prototype","commands"],"sources":["../../lib/driver.js"],"sourcesContent":["import _ from 'lodash';\nimport { BaseDriver, DeviceSettings } from 'appium/driver';\nimport {\n UiAutomator2Server, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID\n} from './uiautomator2';\nimport { newMethodMap } from './method-map';\nimport { fs, util, mjpeg } from 'appium/support';\nimport { retryInterval } from 'asyncbox';\nimport B from 'bluebird';\nimport commands from './commands/index';\nimport { DEFAULT_ADB_PORT } from 'appium-adb';\nimport uiautomator2Helpers from './helpers';\nimport { androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID, } from 'appium-android-driver';\nimport desiredCapConstraints from './desired-caps';\nimport { findAPortNotInUse, checkPortStatus } from 'portscanner';\nimport os from 'os';\nimport path from 'path';\nimport { APK_EXTENSION, APKS_EXTENSION } from './extensions';\n\n\nconst helpers = Object.assign({}, uiautomator2Helpers, androidHelpers);\n\n// The range of ports we can use on the system for communicating to the\n// UiAutomator2 HTTP server on the device\nconst DEVICE_PORT_RANGE = [8200, 8299];\n\n// The guard is needed to avoid dynamic system port allocation conflicts for\n// parallel driver sessions\nconst DEVICE_PORT_ALLOCATION_GUARD = util.getLockFileGuard(\n path.resolve(os.tmpdir(), 'uia2_device_port_guard'),\n {timeout: 25, tryRecovery: true}\n);\n\n// This is the port that UiAutomator2 listens to on the device. We will forward\n// one of the ports above on the system to this port on the device.\nconst DEVICE_PORT = 6790;\n// This is the port that the UiAutomator2 MJPEG server listens to on the device.\n// We will forward one of the ports above on the system to this port on the\n// device.\nconst MJPEG_SERVER_DEVICE_PORT = 7810;\n\nconst LOCALHOST_IP4 = '127.0.0.1';\n\n// NO_PROXY contains the paths that we never want to proxy to UiAutomator2 server.\n// TODO: Add the list of paths that we never want to proxy to UiAutomator2 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/[^/]+/alert_[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/alert/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_activity')],\n ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_package')],\n ['GET', new RegExp('^/session/[^/]+/appium/app/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/device/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/appium/settings')],\n ['GET', new RegExp('^/session/[^/]+/context')],\n ['GET', new RegExp('^/session/[^/]+/contexts')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/attribute')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/displayed')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/enabled')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/location_in_view')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/name')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/screenshot')],\n ['GET', new RegExp('^/session/[^/]+/element/[^/]+/selected')],\n ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['GET', new RegExp('^/session/[^/]+/location')],\n ['GET', new RegExp('^/session/[^/]+/network_connection')],\n ['GET', new RegExp('^/session/[^/]+/screenshot')],\n ['GET', new RegExp('^/session/[^/]+/timeouts')],\n ['GET', new RegExp('^/session/[^/]+/url')],\n ['POST', new RegExp('^/session/[^/]+/[^/]+_alert$')],\n ['POST', new RegExp('^/session/[^/]+/actions')],\n ['POST', new RegExp('^/session/[^/]+/alert/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/app/[^/]')],\n ['POST', new RegExp('^/session/[^/]+/appium/[^/]+/start_activity')],\n ['POST', new RegExp('^/session/[^/]+/appium/app/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/appium/compare_images')],\n ['POST', new RegExp('^/session/[^/]+/appium/device/(?!set_clipboard)[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/replace_value')],\n ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/value')],\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/[^/]+/appium/.*event')],\n ['POST', new RegExp('^/session/[^/]+/context')],\n ['POST', new RegExp('^/session/[^/]+/element')],\n ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')],\n ['POST', new RegExp('^/session/[^/]+/keys')],\n ['POST', new RegExp('^/session/[^/]+/location')],\n ['POST', new RegExp('^/session/[^/]+/network_connection')],\n ['POST', new RegExp('^/session/[^/]+/timeouts')],\n ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],\n ['POST', new RegExp('^/session/[^/]+/touch/perform')],\n ['POST', new RegExp('^/session/[^/]+/url')],\n\n // MJSONWP commands\n ['GET', new RegExp('^/session/[^/]+/log/types')],\n ['POST', new RegExp('^/session/[^/]+/execute')],\n ['POST', new RegExp('^/session/[^/]+/execute_async')],\n ['POST', new RegExp('^/session/[^/]+/log')],\n // W3C commands\n // For Selenium v4 (W3C does not have this route)\n ['GET', new RegExp('^/session/[^/]+/se/log/types')],\n ['GET', new RegExp('^/session/[^/]+/window/rect')],\n ['POST', new RegExp('^/session/[^/]+/execute/async')],\n ['POST', new RegExp('^/session/[^/]+/execute/sync')],\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 // 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\nconst MEMOIZED_FUNCTIONS = [\n 'getStatusBarHeight',\n 'getDevicePixelRatio',\n];\n\nclass AndroidUiautomator2Driver 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 'xpath',\n 'id',\n 'class name',\n 'accessibility id',\n 'css selector',\n '-android uiautomator'\n ];\n this.desiredCapConstraints = desiredCapConstraints;\n this.uiautomator2 = null;\n this.jwpProxyActive = false;\n this.defaultIME = null;\n this.jwpProxyAvoid = NO_PROXY;\n this.apkStrings = {}; // map of language -> strings obj\n\n this.settings = new DeviceSettings({ignoreUnimportantViews: false, allowInvisibleElements: false},\n this.onSettingsUpdate.bind(this));\n // handle webview mechanics from AndroidDriver\n this.chromedriver = null;\n this.sessionChromedrivers = {};\n\n // memoize functions here, so that they are done on a per-instance basis\n for (const fn of MEMOIZED_FUNCTIONS) {\n this[fn] = _.memoize(this[fn]);\n }\n }\n\n validateDesiredCaps (caps) {\n return super.validateDesiredCaps(caps) && androidHelpers.validateDesiredCaps(caps);\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: 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 this.log.info(\"We're going to run a Chrome-based session\");\n let {pkg, activity} = helpers.getChromePkg(this.opts.browserName);\n this.opts.appPackage = this.caps.appPackage = pkg;\n this.opts.appActivity = this.caps.appActivity = activity;\n this.log.info(`Chrome-type package and activity are ${pkg} and ${activity}`);\n }\n\n if (this.opts.reboot) {\n this.setAvdFromCapabilities(caps);\n }\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, [APK_EXTENSION, APKS_EXTENSION]);\n await this.checkAppPresent();\n } else if (this.opts.appPackage) {\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(`Starting '${this.opts.appPackage}' directly on the device`);\n } else {\n this.log.info(`Neither 'app' nor 'appPackage' was set. Starting UiAutomator2 ` +\n 'without the target application');\n }\n this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;\n\n await this.startUiAutomator2Session();\n await this.fillDeviceDetails();\n if (this.opts.mjpegScreenshotUrl) {\n this.log.info(`Starting MJPEG stream reading URL: '${this.opts.mjpegScreenshotUrl}'`);\n this.mjpegStream = new mjpeg.MJpegStream(this.opts.mjpegScreenshotUrl);\n await this.mjpegStream.start();\n }\n return [sessionId, this.caps];\n } catch (e) {\n await this.deleteSession();\n throw e;\n }\n }\n\n async fillDeviceDetails () {\n this.caps.pixelRatio = await this.getDevicePixelRatio();\n this.caps.statBarHeight = await this.getStatusBarHeight();\n this.caps.viewportRect = await this.getViewPortRect();\n }\n\n get driverData () {\n // TODO fill out resource info here\n return {};\n }\n\n async getSession () {\n let sessionData = await super.getSession();\n this.log.debug('Getting session details from server to mix in');\n let uia2Data = await this.uiautomator2.jwproxy.command('/', 'GET', {});\n return Object.assign({}, sessionData, uia2Data);\n }\n\n isEmulator () {\n return helpers.isEmulator(this.adb, this.opts);\n }\n\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 async allocateSystemPort () {\n const forwardPort = async (localPort) => {\n this.log.debug(`Forwarding UiAutomator2 Server port ${DEVICE_PORT} to local port ${localPort}`);\n if ((await checkPortStatus(localPort, LOCALHOST_IP4)) === 'open') {\n this.log.errorAndThrow(`UiAutomator2 Server cannot start because the local port #${localPort} is busy. ` +\n `Make sure the port you provide via 'systemPort' capability is not occupied. ` +\n `This situation might often be a result of an inaccurate sessions management, e.g. ` +\n `old automation sessions on the same device must always be closed before starting new ones.`);\n }\n await this.adb.forwardPort(localPort, DEVICE_PORT);\n };\n\n if (this.opts.systemPort) {\n this._hasSystemPortInCaps = true;\n return await forwardPort(this.opts.systemPort);\n }\n\n await DEVICE_PORT_ALLOCATION_GUARD(async () => {\n const [startPort, endPort] = DEVICE_PORT_RANGE;\n try {\n this.opts.systemPort = await findAPortNotInUse(startPort, endPort);\n } catch (e) {\n this.log.errorAndThrow(\n `Cannot find any free port in range ${startPort}..${endPort}}. ` +\n `Please set the available port number by providing the systemPort capability or ` +\n `double check the processes that are locking ports within this range and terminate ` +\n `these which are not needed anymore`);\n }\n await forwardPort(this.opts.systemPort);\n });\n }\n\n async releaseSystemPort () {\n if (!this.opts.systemPort || !this.adb) {\n return;\n }\n\n if (this._hasSystemPortInCaps) {\n await this.adb.removePortForward(this.opts.systemPort);\n } else {\n await DEVICE_PORT_ALLOCATION_GUARD(async () => await this.adb.removePortForward(this.opts.systemPort));\n }\n }\n\n async allocateMjpegServerPort () {\n if (this.opts.mjpegServerPort) {\n await this.adb.forwardPort(this.opts.mjpegServerPort, MJPEG_SERVER_DEVICE_PORT);\n }\n }\n\n async releaseMjpegServerPort () {\n if (this.opts.mjpegServerPort) {\n await this.adb.removePortForward(this.opts.mjpegServerPort);\n }\n }\n\n async startUiAutomator2Session () {\n // get device udid for this session\n let {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);\n this.opts.udid = udid;\n this.opts.emPort = emPort;\n\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 const apiLevel = await this.adb.getApiLevel();\n\n if (apiLevel < 21) {\n this.log.errorAndThrow('UIAutomator2 is only supported since Android 5.0 (Lollipop). ' +\n 'You could still use other supported backends in order to automate older Android versions.');\n }\n\n if (apiLevel >= 28) { // Android P\n this.log.info('Relaxing hidden api policy');\n await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);\n }\n\n // check if we have to enable/disable gps before running the application\n if (util.hasValue(this.opts.gpsEnabled)) {\n if (this.isEmulator()) {\n this.log.info(`Trying to ${this.opts.gpsEnabled ? 'enable' : 'disable'} gps location provider`);\n await this.adb.toggleGPSLocationProvider(this.opts.gpsEnabled);\n } else {\n this.log.warn(`Sorry! 'gpsEnabled' capability is only available for emulators`);\n }\n }\n\n // get appPackage et al from manifest if necessary\n const appInfo = await helpers.getLaunchInfo(this.adb, this.opts);\n // and get it onto our 'opts' object so we use it from now on\n Object.assign(this.opts, appInfo || {});\n\n // set actual device name, udid, platform version, screen size, screen density, model and manufacturer details\n this.caps.deviceName = this.adb.curDeviceId;\n this.caps.deviceUDID = this.opts.udid;\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 this.defaultIME = await helpers.initDevice(this.adb, this.opts);\n\n // Prepare the device by forwarding the UiAutomator2 port\n // This call mutates this.opts.systemPort if it is not set explicitly\n await this.allocateSystemPort();\n\n // Prepare the device by forwarding the UiAutomator2 MJPEG server port (if\n // applicable)\n await this.allocateMjpegServerPort();\n\n // set up the modified UiAutomator2 server etc\n await this.initUiAutomator2Server();\n\n // Should be after installing io.appium.settings in helpers.initDevice\n if (this.opts.disableWindowAnimation && (await this.adb.getApiLevel() < 26)) { // API level 26 is Android 8.0.\n // Granting android.permission.SET_ANIMATION_SCALE is necessary to handle animations under API level 26\n // Read https://github.com/appium/appium/pull/11640#issuecomment-438260477\n // `--no-window-animation` works over Android 8 to disable all of animations\n if (await this.adb.isAnimationOn()) {\n this.log.info('Disabling animation via io.appium.settings');\n await this.adb.setAnimationState(false);\n this._wasWindowAnimationDisabled = true;\n } else {\n this.log.info('Window animation is already disabled');\n }\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 && appInfo) {\n this.caps.appPackage = appInfo.appPackage;\n }\n\n // launch UiAutomator2 and wait till its online and we have a session\n await this.uiautomator2.startSession(this.caps);\n\n await this.addDeviceInfoToCaps();\n\n // Unlock the device after the session is started.\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 if (this.isChromeSession) { // start a chromedriver session\n await this.startChromeSession(this);\n } else if (this.opts.autoLaunch && this.opts.appPackage) {\n await this.ensureAppStarts();\n }\n\n // if the initial orientation is requested, set it\n if (util.hasValue(this.opts.orientation)) {\n this.log.debug(`Setting initial orientation to '${this.opts.orientation}'`);\n await this.setOrientation(this.opts.orientation);\n }\n\n // if we want to immediately get into a webview, set our context\n // appropriately\n if (this.opts.autoWebview) {\n const viewName = this.defaultWebviewName();\n const timeout = this.opts.autoWebviewTimeout || 2000;\n this.log.info(`Setting auto webview to context '${viewName}' with timeout ${timeout}ms`);\n await retryInterval(timeout / 500, 500, this.setContext.bind(this), viewName);\n }\n\n // now that everything has started successfully, turn on proxying so all\n // subsequent session requests go straight to/from uiautomator2\n this.jwpProxyActive = true;\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 async initUiAutomator2Server () {\n // broken out for readability\n const uiautomator2Opts = {\n host: this.opts.remoteAdbHost || this.opts.host || LOCALHOST_IP4,\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 disableWindowAnimation: !!this.opts.disableWindowAnimation,\n disableSuppressAccessibilityService: this.opts.disableSuppressAccessibilityService,\n readTimeout: this.opts.uiautomator2ServerReadTimeout,\n };\n // now that we have package and activity, we can create an instance of\n // uiautomator2 with the appropriate options\n this.uiautomator2 = new UiAutomator2Server(this.log, uiautomator2Opts);\n this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);\n this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);\n\n if (this.opts.skipServerInstallation) {\n this.log.info(`'skipServerInstallation' is set. Skipping UIAutomator2 server installation.`);\n } else {\n await this.uiautomator2.installServerApk(this.opts.uiautomator2ServerInstallTimeout);\n try {\n await this.adb.addToDeviceIdleWhitelist(\n SETTINGS_HELPER_PKG_ID, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID,\n );\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 initAUT () {\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, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID]\n );\n }\n\n // Install any \"otherApps\" that were specified in caps\n if (this.opts.otherApps) {\n let otherApps;\n try {\n otherApps = helpers.parseArray(this.opts.otherApps);\n } catch (e) {\n this.log.errorAndThrow(`Could not parse \"otherApps\" capability: ${e.message}`);\n }\n otherApps = await B.all(otherApps\n .map((app) => this.helpers.configureApp(app, [APK_EXTENSION, APKS_EXTENSION])));\n await helpers.installOtherApks(otherApps, this.adb, this.opts);\n }\n\n if (this.opts.app) {\n if (this.opts.noReset && !(await this.adb.isAppInstalled(this.opts.appPackage))\n || !this.opts.noReset) {\n if (!this.opts.noSign && !await this.adb.checkApkCert(this.opts.app, this.opts.appPackage, {\n requireDefaultCert: false,\n })) {\n await helpers.signApp(this.adb, this.opts.app);\n }\n if (!this.opts.skipUninstall) {\n await this.adb.uninstallApk(this.opts.appPackage);\n }\n await helpers.installApk(this.adb, this.opts);\n } else {\n this.log.debug('noReset has been requested and the app is already installed. Doing nothing');\n }\n } else {\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 && this.opts.appPackage) {\n await helpers.resetApp(this.adb, this.opts);\n }\n }\n }\n\n async ensureAppStarts () {\n // make sure we have an activity and package to wait for\n const appWaitPackage = this.opts.appWaitPackage || this.opts.appPackage;\n const appWaitActivity = this.opts.appWaitActivity || this.opts.appActivity;\n\n this.log.info(`Starting '${this.opts.appPackage}/${this.opts.appActivity} ` +\n `and waiting for '${appWaitPackage}/${appWaitActivity}'`);\n\n if (this.caps.androidCoverage) {\n this.log.info(`androidCoverage is configured. ` +\n ` Starting instrumentation of '${this.caps.androidCoverage}'...`);\n await this.adb.androidCoverage(this.caps.androidCoverage, appWaitPackage, appWaitActivity);\n return;\n }\n if (this.opts.noReset && !this.opts.forceAppLaunch\n && await this.adb.processExists(this.opts.appPackage)) {\n this.log.info(`'${this.opts.appPackage}' is already running and noReset is enabled. ` +\n `Set forceAppLaunch capability to true if the app must be forcefully restarted on session startup.`);\n return;\n }\n await this.adb.startApp({\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction || 'android.intent.action.MAIN',\n category: this.opts.intentCategory || 'android.intent.category.LAUNCHER',\n flags: this.opts.intentFlags || '0x10200000', // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: this.opts.forceAppLaunch || !this.opts.dontStopAppOnReset,\n retry: true,\n user: this.opts.userProfile,\n });\n }\n\n async deleteSession () {\n this.log.debug('Deleting UiAutomator2 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.uiautomator2) {\n try {\n await this.stopChromedriverProxies();\n } catch (err) {\n this.log.warn(`Unable to stop ChromeDriver proxies: ${err.message}`);\n }\n if (this.jwpProxyActive) {\n try {\n await this.uiautomator2.deleteSession();\n } catch (err) {\n this.log.warn(`Unable to proxy deleteSession to UiAutomator2: ${err.message}`);\n }\n }\n this.uiautomator2 = 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\n if (this.opts.unicodeKeyboard && this.opts.resetKeyboard && this.defaultIME) {\n this.log.debug(`Resetting IME to '${this.defaultIME}'`);\n try {\n await this.adb.setIME(this.defaultIME);\n } catch (err) {\n this.log.warn(`Unable to reset IME: ${err.message}`);\n }\n }\n if (this.caps.androidCoverage) {\n this.log.info('Shutting down the adb process of instrumentation...');\n await this.adb.endAndroidCoverage();\n // Use this broadcast intent to notify it's time to dump coverage to file\n if (this.caps.androidCoverageEndIntent) {\n this.log.info(`Sending intent broadcast '${this.caps.androidCoverageEndIntent}' at the end of instrumenting.`);\n await this.adb.broadcast(this.caps.androidCoverageEndIntent);\n } else {\n this.log.warn('No androidCoverageEndIntent is configured in caps. Possibly you cannot get coverage file.');\n }\n }\n if (this.opts.appPackage) {\n if (!this.isChromeSession\n && !this.opts.dontStopAppOnReset\n && !this.opts.noReset) {\n try {\n await this.adb.forceStop(this.opts.appPackage);\n } catch (err) {\n this.log.warn(`Unable to force stop app: ${err.message}`);\n }\n }\n if (this.opts.fullReset && !this.opts.skipUninstall) {\n this.log.debug(`Capability 'fullReset' set to 'true', Uninstalling '${this.opts.appPackage}'`);\n try {\n await this.adb.uninstallApk(this.opts.appPackage);\n } catch (err) {\n this.log.warn(`Unable to uninstall app: ${err.message}`);\n }\n }\n }\n // This value can be true if test target device is <= 26\n if (this._wasWindowAnimationDisabled) {\n this.log.info('Restoring window animation state');\n await this.adb.setAnimationState(true);\n }\n await this.adb.stopLogcat();\n try {\n await this.releaseSystemPort();\n } catch (error) {\n this.log.warn(`Unable to remove system 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 try {\n await this.releaseMjpegServerPort();\n } catch (error) {\n this.log.warn(`Unable to remove MJPEG server 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 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 if (this.opts.reboot) {\n let avdName = this.opts.avd.replace('@', '');\n this.log.debug(`Closing emulator '${avdName}'`);\n try {\n await this.adb.killEmulator(avdName);\n } catch (err) {\n this.log.warn(`Unable to close emulator: ${err.message}`);\n }\n }\n }\n if (this.mjpegStream) {\n this.log.info('Closing MJPEG stream');\n this.mjpegStream.stop();\n }\n await super.deleteSession();\n }\n\n async checkAppPresent () {\n this.log.debug('Checking whether app is actually present');\n if (!(await fs.exists(this.opts.app))) {\n this.log.errorAndThrow(`Could not find app apk at '${this.opts.app}'`);\n }\n }\n\n async onSettingsUpdate () {\n // intentionally do nothing here, since commands.updateSettings proxies\n // settings to the uiauto2 server already\n }\n\n // Need to override android-driver's version of this since we don't actually\n // have a bootstrap; instead we just restart adb and re-forward the UiAutomator2\n // port\n async wrapBootstrapDisconnect (wrapped) {\n await wrapped();\n await this.adb.restart();\n await this.allocateSystemPort();\n await this.allocateMjpegServerPort();\n }\n\n proxyActive (sessionId) {\n super.proxyActive(sessionId);\n\n // we always have an active proxy to the UiAutomator2 server\n return true;\n }\n\n canProxy (sessionId) {\n super.canProxy(sessionId);\n\n // we can always proxy to the uiautomator2 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 uiautomator2(NO_PROXY), based on current context will return related NO_PROXY list\n if (util.hasValue(this.chromedriver)) {\n // if the current context is webview(chromedriver), then return CHROME_NO_PROXY list\n this.jwpProxyAvoid = CHROME_NO_PROXY;\n } else {\n this.jwpProxyAvoid = NO_PROXY;\n }\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\n// first add the android-driver commands which we will fall back to\nfor (let [cmd, fn] of _.toPairs(androidCommands)) {\n AndroidUiautomator2Driver.prototype[cmd] = fn;\n}\n\n// then overwrite with any uiautomator2-specific commands\nfor (let [cmd, fn] of _.toPairs(commands)) {\n AndroidUiautomator2Driver.prototype[cmd] = fn;\n}\n\nexport { AndroidUiautomator2Driver };\nexport default AndroidUiautomator2Driver;\n"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.newMethodMap = void 0;
7
+ require("source-map-support/register");
8
+ var _appiumAndroidDriver = require("appium-android-driver");
9
+ const newMethodMap = {
10
+ ..._appiumAndroidDriver.AndroidDriver.newMethodMap,
11
+ '/session/:sessionId/appium/device/get_clipboard': {
12
+ POST: {
13
+ command: 'getClipboard',
14
+ payloadParams: {
15
+ optional: ['contentType']
16
+ }
17
+ }
18
+ }
19
+ };
20
+ exports.newMethodMap = newMethodMap;
21
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJuZXdNZXRob2RNYXAiLCJBbmRyb2lkRHJpdmVyIiwiUE9TVCIsImNvbW1hbmQiLCJwYXlsb2FkUGFyYW1zIiwib3B0aW9uYWwiXSwic291cmNlcyI6WyIuLi8uLi9saWIvbWV0aG9kLW1hcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbmRyb2lkRHJpdmVyIH0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcblxuZXhwb3J0IGNvbnN0IG5ld01ldGhvZE1hcCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIC4uLkFuZHJvaWREcml2ZXIubmV3TWV0aG9kTWFwLFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2dldENsaXBib2FyZCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7IG9wdGlvbmFsOiBbJ2NvbnRlbnRUeXBlJ10gfVxuICAgIH1cbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUVPLE1BQU1BLFlBQVksR0FBeUI7RUFDaEQsR0FBR0Msa0NBQWEsQ0FBQ0QsWUFBWTtFQUM3QixpREFBaUQsRUFBRTtJQUNqREUsSUFBSSxFQUFFO01BQ0pDLE9BQU8sRUFBRSxjQUFjO01BQ3ZCQyxhQUFhLEVBQUU7UUFBRUMsUUFBUSxFQUFFLENBQUMsYUFBYTtNQUFFO0lBQzdDO0VBQ0Y7QUFDRixDQUFFO0FBQUMifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"method-map.js","names":["newMethodMap","AndroidDriver","POST","command","payloadParams","optional"],"sources":["../../lib/method-map.js"],"sourcesContent":["import { AndroidDriver } from 'appium-android-driver';\n\nexport const newMethodMap = /** @type {const} */ ({\n ...AndroidDriver.newMethodMap,\n '/session/:sessionId/appium/device/get_clipboard': {\n POST: {\n command: 'getClipboard',\n payloadParams: { optional: ['contentType'] }\n }\n }\n});\n"],"mappings":";;;;;;;AAAA;AAEO,MAAMA,YAAY,GAAyB;EAChD,GAAGC,kCAAa,CAACD,YAAY;EAC7B,iDAAiD,EAAE;IACjDE,IAAI,EAAE;MACJC,OAAO,EAAE,cAAc;MACvBC,aAAa,EAAE;QAAEC,QAAQ,EAAE,CAAC,aAAa;MAAE;IAC7C;EACF;AACF,CAAE;AAAC"}
package/lib/driver.js CHANGED
@@ -3,15 +3,14 @@ import { BaseDriver, DeviceSettings } from 'appium/driver';
3
3
  import {
4
4
  UiAutomator2Server, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID
5
5
  } from './uiautomator2';
6
+ import { newMethodMap } from './method-map';
6
7
  import { fs, util, mjpeg } from 'appium/support';
7
8
  import { retryInterval } from 'asyncbox';
8
9
  import B from 'bluebird';
9
10
  import commands from './commands/index';
10
11
  import { DEFAULT_ADB_PORT } from 'appium-adb';
11
12
  import uiautomator2Helpers from './helpers';
12
- import {
13
- androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID
14
- } from 'appium-android-driver';
13
+ import { androidHelpers, androidCommands, SETTINGS_HELPER_PKG_ID, } from 'appium-android-driver';
15
14
  import desiredCapConstraints from './desired-caps';
16
15
  import { findAPortNotInUse, checkPortStatus } from 'portscanner';
17
16
  import os from 'os';
@@ -145,6 +144,9 @@ const MEMOIZED_FUNCTIONS = [
145
144
  ];
146
145
 
147
146
  class AndroidUiautomator2Driver extends BaseDriver {
147
+
148
+ static newMethodMap = newMethodMap;
149
+
148
150
  constructor (opts = {}, shouldValidateCaps = true) {
149
151
  // `shell` overwrites adb.shell, so remove
150
152
  delete opts.shell;
@@ -0,0 +1,11 @@
1
+ import { AndroidDriver } from 'appium-android-driver';
2
+
3
+ export const newMethodMap = /** @type {const} */ ({
4
+ ...AndroidDriver.newMethodMap,
5
+ '/session/:sessionId/appium/device/get_clipboard': {
6
+ POST: {
7
+ command: 'getClipboard',
8
+ payloadParams: { optional: ['contentType'] }
9
+ }
10
+ }
11
+ });
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "appium-uiautomator2-driver",
3
- "version": "2.12.1",
3
+ "version": "2.12.2",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appium-uiautomator2-driver",
9
- "version": "2.12.1",
9
+ "version": "2.12.2",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@babel/runtime": "^7.0.0",
13
13
  "appium-adb": "^9.10.14",
14
- "appium-android-driver": "^5.8.5",
14
+ "appium-android-driver": "^5.8.7",
15
15
  "appium-chromedriver": "^5.2.1",
16
16
  "appium-uiautomator2-server": "^5.7.2",
17
17
  "asyncbox": "^2.3.1",
@@ -94,6 +94,15 @@
94
94
  "npm": ">=8"
95
95
  }
96
96
  },
97
+ "node_modules/@appium/base-driver/node_modules/axios": {
98
+ "version": "1.2.1",
99
+ "license": "MIT",
100
+ "dependencies": {
101
+ "follow-redirects": "^1.15.0",
102
+ "form-data": "^4.0.0",
103
+ "proxy-from-env": "^1.1.0"
104
+ }
105
+ },
97
106
  "node_modules/@appium/base-driver/node_modules/lru-cache": {
98
107
  "version": "7.14.1",
99
108
  "license": "ISC",
@@ -207,6 +216,15 @@
207
216
  "npm": ">=8"
208
217
  }
209
218
  },
219
+ "node_modules/@appium/support/node_modules/axios": {
220
+ "version": "1.2.1",
221
+ "license": "MIT",
222
+ "dependencies": {
223
+ "follow-redirects": "^1.15.0",
224
+ "form-data": "^4.0.0",
225
+ "proxy-from-env": "^1.1.0"
226
+ }
227
+ },
210
228
  "node_modules/@appium/types": {
211
229
  "version": "0.7.0",
212
230
  "license": "Apache-2.0",
@@ -830,7 +848,7 @@
830
848
  }
831
849
  },
832
850
  "node_modules/@types/express-serve-static-core": {
833
- "version": "4.17.31",
851
+ "version": "4.17.32",
834
852
  "license": "MIT",
835
853
  "dependencies": {
836
854
  "@types/node": "*",
@@ -915,7 +933,7 @@
915
933
  }
916
934
  },
917
935
  "node_modules/@types/node": {
918
- "version": "18.11.17",
936
+ "version": "18.11.18",
919
937
  "license": "MIT"
920
938
  },
921
939
  "node_modules/@types/normalize-package-data": {
@@ -1159,7 +1177,7 @@
1159
1177
  }
1160
1178
  },
1161
1179
  "node_modules/appium-android-driver": {
1162
- "version": "5.8.5",
1180
+ "version": "5.8.7",
1163
1181
  "license": "Apache-2.0",
1164
1182
  "dependencies": {
1165
1183
  "@babel/runtime": "^7.0.0",
@@ -1198,7 +1216,7 @@
1198
1216
  }
1199
1217
  },
1200
1218
  "node_modules/appium-chromedriver": {
1201
- "version": "5.2.12",
1219
+ "version": "5.2.13",
1202
1220
  "hasInstallScript": true,
1203
1221
  "license": "Apache-2.0",
1204
1222
  "dependencies": {
@@ -1349,7 +1367,7 @@
1349
1367
  }
1350
1368
  },
1351
1369
  "node_modules/are-we-there-yet/node_modules/readable-stream": {
1352
- "version": "4.2.0",
1370
+ "version": "4.3.0",
1353
1371
  "license": "MIT",
1354
1372
  "dependencies": {
1355
1373
  "abort-controller": "^3.0.0",
@@ -1397,7 +1415,7 @@
1397
1415
  "license": "MIT"
1398
1416
  },
1399
1417
  "node_modules/axios": {
1400
- "version": "1.2.1",
1418
+ "version": "1.2.2",
1401
1419
  "license": "MIT",
1402
1420
  "dependencies": {
1403
1421
  "follow-redirects": "^1.15.0",
@@ -2494,7 +2512,7 @@
2494
2512
  }
2495
2513
  },
2496
2514
  "node_modules/io.appium.settings": {
2497
- "version": "5.0.0",
2515
+ "version": "5.0.2",
2498
2516
  "license": "Apache-2.0",
2499
2517
  "engines": {
2500
2518
  "node": ">=14",
@@ -3121,7 +3139,7 @@
3121
3139
  }
3122
3140
  },
3123
3141
  "node_modules/object-inspect": {
3124
- "version": "1.12.2",
3142
+ "version": "1.12.3",
3125
3143
  "license": "MIT",
3126
3144
  "funding": {
3127
3145
  "url": "https://github.com/sponsors/ljharb"
@@ -3534,7 +3552,7 @@
3534
3552
  }
3535
3553
  },
3536
3554
  "node_modules/punycode": {
3537
- "version": "2.1.1",
3555
+ "version": "2.2.0",
3538
3556
  "extraneous": true,
3539
3557
  "license": "MIT",
3540
3558
  "engines": {
@@ -3750,7 +3768,7 @@
3750
3768
  "license": "MIT"
3751
3769
  },
3752
3770
  "node_modules/safe-stable-stringify": {
3753
- "version": "2.4.1",
3771
+ "version": "2.4.2",
3754
3772
  "extraneous": true,
3755
3773
  "license": "MIT",
3756
3774
  "engines": {
@@ -4129,11 +4147,8 @@
4129
4147
  "license": "MIT"
4130
4148
  },
4131
4149
  "node_modules/tinycolor2": {
4132
- "version": "1.5.1",
4133
- "license": "MIT",
4134
- "engines": {
4135
- "node": "*"
4136
- }
4150
+ "version": "1.5.2",
4151
+ "license": "MIT"
4137
4152
  },
4138
4153
  "node_modules/toidentifier": {
4139
4154
  "version": "1.0.1",
@@ -4420,14 +4435,14 @@
4420
4435
  "license": "ISC"
4421
4436
  },
4422
4437
  "node_modules/ws": {
4423
- "version": "8.11.0",
4438
+ "version": "8.12.0",
4424
4439
  "license": "MIT",
4425
4440
  "engines": {
4426
4441
  "node": ">=10.0.0"
4427
4442
  },
4428
4443
  "peerDependencies": {
4429
4444
  "bufferutil": "^4.0.1",
4430
- "utf-8-validate": "^5.0.2"
4445
+ "utf-8-validate": ">=5.0.2"
4431
4446
  },
4432
4447
  "peerDependenciesMeta": {
4433
4448
  "bufferutil": {
@@ -4559,6 +4574,14 @@
4559
4574
  "validate.js": "0.13.1"
4560
4575
  },
4561
4576
  "dependencies": {
4577
+ "axios": {
4578
+ "version": "1.2.1",
4579
+ "requires": {
4580
+ "follow-redirects": "^1.15.0",
4581
+ "form-data": "^4.0.0",
4582
+ "proxy-from-env": "^1.1.0"
4583
+ }
4584
+ },
4562
4585
  "lru-cache": {
4563
4586
  "version": "7.14.1"
4564
4587
  }
@@ -4648,6 +4671,16 @@
4648
4671
  "uuid": "9.0.0",
4649
4672
  "which": "3.0.0",
4650
4673
  "yauzl": "2.10.0"
4674
+ },
4675
+ "dependencies": {
4676
+ "axios": {
4677
+ "version": "1.2.1",
4678
+ "requires": {
4679
+ "follow-redirects": "^1.15.0",
4680
+ "form-data": "^4.0.0",
4681
+ "proxy-from-env": "^1.1.0"
4682
+ }
4683
+ }
4651
4684
  }
4652
4685
  },
4653
4686
  "@appium/types": {
@@ -5066,7 +5099,7 @@
5066
5099
  }
5067
5100
  },
5068
5101
  "@types/express-serve-static-core": {
5069
- "version": "4.17.31",
5102
+ "version": "4.17.32",
5070
5103
  "requires": {
5071
5104
  "@types/node": "*",
5072
5105
  "@types/qs": "*",
@@ -5136,7 +5169,7 @@
5136
5169
  }
5137
5170
  },
5138
5171
  "@types/node": {
5139
- "version": "18.11.17"
5172
+ "version": "18.11.18"
5140
5173
  },
5141
5174
  "@types/normalize-package-data": {
5142
5175
  "version": "2.4.1"
@@ -5305,7 +5338,7 @@
5305
5338
  }
5306
5339
  },
5307
5340
  "appium-android-driver": {
5308
- "version": "5.8.5",
5341
+ "version": "5.8.7",
5309
5342
  "requires": {
5310
5343
  "@babel/runtime": "^7.0.0",
5311
5344
  "appium-adb": "^9.10.9",
@@ -5334,7 +5367,7 @@
5334
5367
  }
5335
5368
  },
5336
5369
  "appium-chromedriver": {
5337
- "version": "5.2.12",
5370
+ "version": "5.2.13",
5338
5371
  "requires": {
5339
5372
  "@appium/base-driver": "^9.1.0",
5340
5373
  "@appium/support": "^3.0.0",
@@ -5437,7 +5470,7 @@
5437
5470
  }
5438
5471
  },
5439
5472
  "readable-stream": {
5440
- "version": "4.2.0",
5473
+ "version": "4.3.0",
5441
5474
  "requires": {
5442
5475
  "abort-controller": "^3.0.0",
5443
5476
  "buffer": "^6.0.3",
@@ -5474,7 +5507,7 @@
5474
5507
  "version": "0.4.0"
5475
5508
  },
5476
5509
  "axios": {
5477
- "version": "1.2.1",
5510
+ "version": "1.2.2",
5478
5511
  "requires": {
5479
5512
  "follow-redirects": "^1.15.0",
5480
5513
  "form-data": "^4.0.0",
@@ -6177,7 +6210,7 @@
6177
6210
  "version": "3.0.1"
6178
6211
  },
6179
6212
  "io.appium.settings": {
6180
- "version": "5.0.0"
6213
+ "version": "5.0.2"
6181
6214
  },
6182
6215
  "ipaddr.js": {
6183
6216
  "version": "1.9.1"
@@ -6588,7 +6621,7 @@
6588
6621
  }
6589
6622
  },
6590
6623
  "object-inspect": {
6591
- "version": "1.12.2"
6624
+ "version": "1.12.3"
6592
6625
  },
6593
6626
  "omggif": {
6594
6627
  "version": "1.0.10"
@@ -6850,7 +6883,7 @@
6850
6883
  }
6851
6884
  },
6852
6885
  "punycode": {
6853
- "version": "2.1.1",
6886
+ "version": "2.2.0",
6854
6887
  "extraneous": true
6855
6888
  },
6856
6889
  "qs": {
@@ -6974,7 +7007,7 @@
6974
7007
  "version": "5.2.1"
6975
7008
  },
6976
7009
  "safe-stable-stringify": {
6977
- "version": "2.4.1",
7010
+ "version": "2.4.2",
6978
7011
  "extraneous": true
6979
7012
  },
6980
7013
  "safer-buffer": {
@@ -7240,7 +7273,7 @@
7240
7273
  "version": "1.7.1"
7241
7274
  },
7242
7275
  "tinycolor2": {
7243
- "version": "1.5.1"
7276
+ "version": "1.5.2"
7244
7277
  },
7245
7278
  "toidentifier": {
7246
7279
  "version": "1.0.1"
@@ -7431,7 +7464,7 @@
7431
7464
  "version": "1.0.2"
7432
7465
  },
7433
7466
  "ws": {
7434
- "version": "8.11.0",
7467
+ "version": "8.12.0",
7435
7468
  "requires": {}
7436
7469
  },
7437
7470
  "xhr": {
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "automated testing",
8
8
  "android"
9
9
  ],
10
- "version": "2.12.1",
10
+ "version": "2.12.2",
11
11
  "author": "Appium Contributors",
12
12
  "license": "Apache-2.0",
13
13
  "repository": {
@@ -57,7 +57,7 @@
57
57
  "dependencies": {
58
58
  "@babel/runtime": "^7.0.0",
59
59
  "appium-adb": "^9.10.14",
60
- "appium-android-driver": "^5.8.5",
60
+ "appium-android-driver": "^5.8.7",
61
61
  "appium-chromedriver": "^5.2.1",
62
62
  "appium-uiautomator2-server": "^5.7.2",
63
63
  "asyncbox": "^2.3.1",