appium-uiautomator2-driver 1.66.2 → 1.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -143,8 +143,8 @@ Capability Name | Description
143
143
  --- | ---
144
144
  appium:autoWebview | If set to `true` then UiAutomator2 driver will try to switch to the first available web view after the session is started. `false` by default.
145
145
  appium:webviewDevtoolsPort | The local port number to use for devtools communication. By default the first free port from 10900..11000 range is selected. Consider setting the custom value if you are running parallel tests.
146
- appium:ensureWebviewsHavePages | Whether to skip web views that have no pages from being shown in `getContexts` output. The driver uses devtools connection to retrieve the information about existing pages. `true` by default.
147
- appium:enableWebviewDetailsCollection | Whether to retrieve extended web views information using devtools protocol. Enabling this capability helps to detect the necessary chromedriver version more precisely. `false` by default.
146
+ appium:ensureWebviewsHavePages | Whether to skip web views that have no pages from being shown in `getContexts` output. The driver uses devtools connection to retrieve the information about existing pages. `true` by default since Appium 1.19.0, `false` if lower than 1.19.0.
147
+ appium:enableWebviewDetailsCollection | Whether to retrieve extended web views information using devtools protocol. Enabling this capability helps to detect the necessary chromedriver version more precisely. `true` by default since Appium 1.22.0, `false` if lower than 1.22.0.
148
148
  appium:chromedriverPort | The port number to use for Chromedriver communication. Any free port number is selected by default if unset.
149
149
  appium:chromedriverPorts | Array of possible port numbers to assign for Chromedriver communication. If none of the port in this array is free then an error is thrown.
150
150
  appium:chromedriverArgs | Array of chromedriver [command line arguments](http://www.assertselenium.com/java/list-of-chrome-driver-command-line-arguments/). Note, that not all command line arguments that are available for the desktop browser are also available for the mobile one.
@@ -282,7 +282,7 @@ Executes the given shell command on the device under test via ADB connection. Th
282
282
  Name | Type | Required | Description | Example
283
283
  --- | --- | --- | --- | ---
284
284
  command | string | yes | Shell command name to execute, for example `echo` or `rm` | echo
285
- args | `Array<string>` | no | Array of command arguments | `['-f', '/sdcard/myfile.txt']`
285
+ args | Array&lt;string&gt; | no | Array of command arguments | `['-f', '/sdcard/myfile.txt']`
286
286
  timeout | number | no | Command timeout in milliseconds. If the command blocks for longer than this timeout then an exception is going to be thrown. The default timeout is `20000` ms | 100000
287
287
  includeStderr | boolean | no | Whether to include stderr stream into the returned result. `false` by default | true
288
288
 
@@ -419,7 +419,7 @@ Changes package permissions in runtime.
419
419
 
420
420
  Name | Type | Required | Description | Example
421
421
  --- | --- | --- | --- | ---
422
- permissions | string or `Array<string>` | yes | The full name of the permission to be changed or a list of permissions. Mandatory argument. | `['android.permission.ACCESS_FINE_LOCATION', 'android.permission.BROADCAST_SMS']`
422
+ permissions | string or Array&lt;string&gt; | yes | The full name of the permission to be changed or a list of permissions. Mandatory argument. | `['android.permission.ACCESS_FINE_LOCATION', 'android.permission.BROADCAST_SMS']`
423
423
  appPackage | string | no | The application package to set change permissions on. Defaults to the package name under test | com.mycompany.myapp
424
424
  action | string | no | Either `grant` (the default action) or `revoke` | grant
425
425
 
@@ -580,21 +580,61 @@ Name | Type | Required | Description | Example
580
580
  --- | --- | --- | --- | ---
581
581
  remotePath | string | yes | The full path to the remote file or a file inside an application bundle | `/sdcard/myfile.txt` or `@my.app.id/path/in/bundle`
582
582
 
583
+ ### mobile: startActivity
584
+
585
+ Starts the given activity intent. Invokes `am start`/`am start-activity` command under the hood.
586
+ This method extends the functionality of the [Start Activity](#applications-management) app management API.
587
+
588
+ #### Arguments
589
+
590
+ Name | Type | Required | Description | Example
591
+ --- | --- | --- | --- | ---
592
+ intent | string | yes | The name of the activity intent to start | com.some.package.name/.YourActivityClassName
593
+ user | number or string | no | The user ID for which the service is started. The `current` user id is used by default | 1006
594
+ wait | boolean | no | Set it to `true` if you want to block the method call until the Activity Manager's process returns the control to the system. | false
595
+ stop | boolean | no | Set it to `true` to force stop the target app before starting the activity. | false
596
+ windowingMode | integer | no | The windowing mode to launch the activity into. Check [WindowConfiguration.java](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java) for more details on possible windowing modes (constants starting with `WINDOWING_MODE_`). | 1
597
+ activityType | integer | no | The activity type to launch the activity as. Check [WindowConfiguration.java](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java) for more details on possible activity types (constants starting with `ACTIVITY_TYPE_`). | 1
598
+ action | string | no | Action name. The actual value for the Activity Manager's `-a` argument. | my_action
599
+ uri | string | no | Unified resource identifier. The actual value for the Activity Manager's `-d` argument. | http://appium.io
600
+ mimeType | string | no | Mime type. The actual value for the Activity Manager's `-t` argument. | application/json
601
+ identifier | string | no | Optional identifier. The actual value for the Activity Manager's `-i` argument. | my_identifier
602
+ categories | string or Array&lt;string&gt; | no | One or more category names. The actual value(s) for the Activity Manager's `-c` argument. | ['com.my.category.name1', 'com.my.category.name2']
603
+ component | string | no | Component name. The actual value for the Activity Manager's `-n` argument. | com.my.component.name
604
+ extras | Array&lt;Array&lt;string&gt;&gt; | no | Optional intent arguments. Must be represented as an array of arrays, where each subarray item contains two items: value type and the value itself. Supported value types are: `s`: string. Value must be a valid string; `sn`: null. Value is ignored for this type; `z`: boolean. Value must be either `true` or `false`; `i`: integer. Value must be a valid 4-byte integer number; `l`: long. Value must be a valid 8-byte long number; `f`: float: Value must be a valid float number; `u`: uri. Value must be a valid uniform resource identifier string; `cn`: component name. Value must be a valid component name string; `ia`: Integer[]. Value must be a string of comma-separated integers; `ial`: List&lt;Integer&gt;. Value must be a string of comma-separated integers; `la`: Long[]. Value must be a string of comma-separated long numbers; `lal`: List&lt;Long&gt;. Value must be a string of comma-separated long numbers; `fa`: Float[]. Value must be a string of comma-separated float numbers; `fal`: List&lt;Float&gt;. Value must be a string of comma-separated float numbers; `sa`: String[]. Value must be comma-separated strings. To embed a comma into a string escape it using "\,"; `sal`: List&lt;String&gt;. Value must be comma-separated strings. To embed a comma into a string, escape it using "\," | [['s', 'My String1'], ['s', 'My String2'], ['ia', '1,2,3,4']]
605
+ flags | string | no | Intent startup-specific flags as a hexadecimal string. Check [Intent documentation](https://developer.android.com/reference/android/content/Intent.html) for the list of available flag values (constants starting with `FLAG_ACTIVITY_`). Flag values could be merged using the logical 'or' operation. | 0x10200000 is the combination of two flags: 0x10000000 `FLAG_ACTIVITY_NEW_TASK` `|` 0x00200000 `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`
606
+
607
+ #### Returned Result
608
+
609
+ The actual stdout of the downstream `am` command.
610
+
583
611
  ### mobile: startService
584
612
 
585
- Starts the given service intent.
613
+ Starts the given service intent. Invokes `am startservice` or `am start-service` command under the hood.
586
614
 
587
615
  #### Arguments
588
616
 
589
617
  Name | Type | Required | Description | Example
590
618
  --- | --- | --- | --- | ---
591
- intent | string | yes | The name of the service intent to start | `com.some.package.name/.YourServiceSubClassName`
619
+ intent | string | yes | The name of the service intent to start | com.some.package.name/.YourServiceSubClassName
592
620
  user | number or string | no | The user ID for which the service is started. The `current` user id is used by default | 1006
593
- foreground | boolean | no | Set it to `true` if your service must be started as foreground service. | false
621
+ foreground | boolean | no | Set it to `true` if your service must be started as a foreground service. The argument only works for Android 8 and above. | false
622
+ action | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | my_action
623
+ uri | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | http://appium.io
624
+ mimeType | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | application/json
625
+ identifier | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | my_identifier
626
+ categories | string or Array&lt;string&gt; | no | See the documentation for [startActivity extension](#mobile-startactivity) | ['com.my.category.name1', 'com.my.category.name2']
627
+ component | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | com.my.component.name
628
+ extras | Array&lt;Array&lt;string&gt;&gt; | no | See the documentation for [startActivity extension](#mobile-startactivity) | [['s', 'My String1'], ['s', 'My String2'], ['ia', '1,2,3,4']]
629
+ flags | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | 0x10200000 is the combination of two flags: 0x10000000 `FLAG_ACTIVITY_NEW_TASK` `|` 0x00200000 `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`
630
+
631
+ #### Returned Result
632
+
633
+ The actual stdout of the downstream `am` command.
594
634
 
595
635
  ### mobile: stopService
596
636
 
597
- Stops the given service intent.
637
+ Stops the given service intent. Invokes `am stopservice` or `am stop-service` command under the hood.
598
638
 
599
639
  #### Arguments
600
640
 
@@ -649,7 +689,7 @@ Please read more details in the corresponding section of the `adb --help` comman
649
689
 
650
690
  Name | Type | Required | Description | Example
651
691
  --- | --- | --- | --- | ---
652
- apks | array<string> | yes | The path to APKs. Each path should be the full path to the apk to be installed, or an URL to a remote location. | `['/path/to/local.apk', 'https://github.com/appium/ruby_lib_core/blob/master/test/functional/app/api.apk.zip?raw=true']`
692
+ apks | Array&lt;string&gt; | yes | The path to APKs. Each path should be the full path to the apk to be installed, or an URL to a remote location. | `['/path/to/local.apk', 'https://github.com/appium/ruby_lib_core/blob/master/test/functional/app/api.apk.zip?raw=true']`
653
693
  options | object | no | Installation options. If you want enable `-g` option, you could specify that `{grantPermissions: true}`. `allowTestPackages` corresponds `-t`, `useSdcard` corresponds `-s`, `replace` corresponds `-r` (`-r` is enabled by default), `partialInstall` corresponds `-p`. | `{grantPermissions: true, partialInstall: true}`
654
694
 
655
695
  ## Applications Management
@@ -153,6 +153,7 @@ extensions.executeMobile = async function (mobileCommand, opts = {}) {
153
153
  type: 'mobileType',
154
154
  sensorSet: 'sensorSet',
155
155
  deleteFile: 'mobileDeleteFile',
156
+ startActivity: 'mobileStartActivity',
156
157
  startService: 'mobileStartService',
157
158
  stopService: 'mobileStopService',
158
159
  getContexts: 'mobileGetContexts',
@@ -268,4 +269,4 @@ var _default = extensions;
268
269
  exports.default = _default;require('source-map-support').install();
269
270
 
270
271
 
271
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJnZXRQYWdlU291cmNlIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImRvU2VuZEtleXMiLCJwYXJhbXMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJkZWJ1ZyIsImJhY2siLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYXBrU3RyaW5ncyIsIm9wdHMiLCJhcHAiLCJhcHBQYWNrYWdlIiwiZXJyb3JBbmRUaHJvdyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiZnMiLCJleGlzdHMiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJyaW1yYWYiLCJnZXRXaW5kb3dTaXplIiwiZ2V0V2luZG93UmVjdCIsIndpZHRoIiwiaGVpZ2h0IiwieCIsInkiLCJleGVjdXRlTW9iaWxlIiwibW9iaWxlQ29tbWFuZCIsIm1vYmlsZUNvbW1hbmRzTWFwcGluZyIsInNoZWxsIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwiZHJhZ0dlc3R1cmUiLCJmbGluZ0dlc3R1cmUiLCJkb3VibGVDbGlja0dlc3R1cmUiLCJsb25nQ2xpY2tHZXN0dXJlIiwicGluY2hDbG9zZUdlc3R1cmUiLCJwaW5jaE9wZW5HZXN0dXJlIiwic3dpcGVHZXN0dXJlIiwic2Nyb2xsR2VzdHVyZSIsInNjcm9sbEJhY2tUbyIsInNjcm9sbCIsInZpZXdwb3J0U2NyZWVuc2hvdCIsInZpZXdwb3J0UmVjdCIsImRlZXBMaW5rIiwic3RhcnRMb2dzQnJvYWRjYXN0Iiwic3RvcExvZ3NCcm9hZGNhc3QiLCJhY2NlcHRBbGVydCIsImRpc21pc3NBbGVydCIsImJhdHRlcnlJbmZvIiwiZGV2aWNlSW5mbyIsImdldERldmljZVRpbWUiLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwic3RvcFNjcmVlblN0cmVhbWluZyIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwidHlwZSIsInNlbnNvclNldCIsImRlbGV0ZUZpbGUiLCJzdGFydFNlcnZpY2UiLCJzdG9wU2VydmljZSIsImdldENvbnRleHRzIiwiaW5zdGFsbE11bHRpcGxlQXBrcyIsImhhcyIsImVycm9ycyIsIlVua25vd25Db21tYW5kRXJyb3IiLCJrZXlzIiwibW9iaWxlVmlld3BvcnRTY3JlZW5zaG90IiwiZ2V0Vmlld3BvcnRTY3JlZW5zaG90IiwibW9iaWxlVmlld1BvcnRSZWN0IiwiZ2V0Vmlld1BvcnRSZWN0Iiwic2V0VXJsIiwidXJsIiwic3RhcnRVcmkiLCJtb2JpbGVEZWVwTGluayIsInBhY2thZ2UiLCJwa2ciLCJ3YWl0Rm9yTGF1bmNoIiwib3Blbk5vdGlmaWNhdGlvbnMiLCJ1cGRhdGVTZXR0aW5ncyIsInNldHRpbmdzIiwiZHJpdmVyT25seVNldHRpbmdzIiwic2VydmVyU2V0dGluZ3MiLCJzZXR0aW5nIiwiQkFTRURSSVZFUl9IQU5ETEVEX1NFVFRJTkdTIiwiaW5jbHVkZXMiLCJpc0VtcHR5IiwidXBkYXRlIiwiZ2V0U2V0dGluZ3MiLCJ3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCIsIndyYXBwZWQiLCJzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkiLCJjaHJvbWVkcml2ZXIiLCJwcm94eVJlcVJlcyIsImJpbmQiLCJqd3BQcm94eUFjdGl2ZSIsIm1vYmlsZUdldERldmljZUluZm8iLCJtb2JpbGVUeXBlIiwidGV4dCIsImlzVW5kZWZpbmVkIiwidHlwZVVuaWNvZGUiLCJtb2JpbGVJbnN0YWxsTXVsdGlwbGVBcGtzIiwiaXNBcnJheSIsImFwa3MiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIkIiLCJhbGwiLCJtYXAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwib3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxJQUFJQSxVQUFVLEdBQUcsRUFBakI7QUFBQSxJQUNJQyxRQUFRLEdBQUcsRUFEZjtBQUFBLElBRUlDLE9BQU8sR0FBRyxFQUZkOztBQUlBRCxRQUFRLENBQUNFLGFBQVQsR0FBeUIsa0JBQWtCO0FBQ3pDLFNBQU8sTUFBTSxLQUFLQyxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsU0FBbEMsRUFBNkMsS0FBN0MsRUFBb0QsRUFBcEQsQ0FBYjtBQUNELENBRkQ7O0FBSUFMLFFBQVEsQ0FBQ00sWUFBVCxHQUF3QixrQkFBa0I7QUFDeEMsU0FBUSxPQUFNLEtBQUtDLEdBQUwsQ0FBU0MsV0FBVCxFQUFOLElBQStCLEVBQWhDLEdBQ0YsTUFBTSxLQUFLTCxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsOEJBQWxDLEVBQWtFLE1BQWxFLEVBQTBFLEVBQTFFLENBREosR0FFRixNQUFNLEtBQUtFLEdBQUwsQ0FBU0QsWUFBVCxFQUZYO0FBR0QsQ0FKRDs7QUFPQU4sUUFBUSxDQUFDUyxVQUFULEdBQXNCLGdCQUFnQkMsTUFBaEIsRUFBd0I7QUFDNUMsUUFBTSxLQUFLUCxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsT0FBbEMsRUFBMkMsTUFBM0MsRUFBbURLLE1BQW5ELENBQU47QUFDRCxDQUZEOztBQUtBVixRQUFRLENBQUNXLFFBQVQsR0FBb0IsZ0JBQWdCQyxPQUFoQixFQUF5QkMsU0FBekIsRUFBb0M7QUFDdERDLGtCQUFJ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QixFQUFtRDtBQUNqRCxVQUFNLElBQUl2Qyx5QkFBT3dDLG9CQUFYLENBQWdDLDhCQUFoQyxDQUFOO0FBQ0Q7O0FBQ0QsUUFBTUQsSUFBSSxHQUFHLE1BQU1FLGtCQUFFQyxHQUFGLENBQU10RyxJQUFJLENBQUNtRyxJQUFMLENBQ3RCSSxHQURzQixDQUNqQnRHLEdBQUQsSUFBUyxLQUFLaEMsT0FBTCxDQUFhdUksWUFBYixDQUEwQnZHLEdBQTFCLEVBQStCLENBQUN3Ryx5QkFBRCxDQUEvQixDQURTLENBQU4sQ0FBbkI7QUFFQSxRQUFNLEtBQUtsSSxHQUFMLENBQVNtRixtQkFBVCxDQUE2QnlDLElBQTdCLEVBQW1DbkcsSUFBSSxDQUFDMEcsT0FBeEMsQ0FBTjtBQUNELENBUEQ7O0FBU0FDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjN0ksVUFBZCxFQUEwQkMsUUFBMUIsRUFBb0NDLE9BQXBDO2VBRWVGLFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZXJyb3JzLCBCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBBUEtfRVhURU5TSU9OIH0gZnJvbSAnLi4vZXh0ZW5zaW9ucyc7XG5cbmxldCBleHRlbnNpb25zID0ge30sXG4gICAgY29tbWFuZHMgPSB7fSxcbiAgICBoZWxwZXJzID0ge307XG5cbmNvbW1hbmRzLmdldFBhZ2VTb3VyY2UgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9zb3VyY2UnLCAnR0VUJywge30pO1xufTtcblxuY29tbWFuZHMuZ2V0Q2xpcGJvYXJkID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyOSlcbiAgICA/IChhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnLCAnUE9TVCcsIHt9KSlcbiAgICA6IChhd2FpdCB0aGlzLmFkYi5nZXRDbGlwYm9hcmQoKSk7XG59O1xuXG4vLyBOZWVkIHRvIG92ZXJyaWRlIHRoaXMgZm9yIGNvcnJlY3QgdW5pY29kZSBzdXBwb3J0XG5jb21tYW5kcy5kb1NlbmRLZXlzID0gYXN5bmMgZnVuY3Rpb24gKHBhcmFtcykge1xuICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9rZXlzJywgJ1BPU1QnLCBwYXJhbXMpO1xufTtcblxuLy8gdWlhdXRvbWF0b3IyIGRvZXNuJ3Qgc3VwcG9ydCBtZXRhc3RhdGUgZm9yIGtleWV2ZW50c1xuY29tbWFuZHMua2V5ZXZlbnQgPSBhc3luYyBmdW5jdGlvbiAoa2V5Y29kZSwgbWV0YXN0YXRlKSB7XG4gIGxvZy5kZWJ1ZyhgSWdub3JpbmcgbWV0YXN0YXRlICR7bWV0YXN0YXRlfWApO1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChrZXljb2RlKTtcbn07XG5cbi8vIFVzZSBBREIgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBVaUF1dG9tYXRvclxuY29tbWFuZHMuYmFjayA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoNCk7XG59O1xuXG5jb21tYW5kcy5nZXRTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gKGxhbmd1YWdlKSB7XG4gIGlmICghbGFuZ3VhZ2UpIHtcbiAgICBsYW5ndWFnZSA9IGF3YWl0IHRoaXMuYWRiLmdldERldmljZUxhbmd1YWdlKCk7XG4gICAgbG9nLmluZm8oYE5vIGxhbmd1YWdlIHNwZWNpZmllZCwgcmV0dXJuaW5nIHN0cmluZ3MgZm9yOiAke2xhbmd1YWdlfWApO1xuICB9XG5cbiAgLy8gQ2xpZW50cyByZXF1aXJlIHRoZSByZXN1bHRpbmcgbWFwcGluZyB0byBoYXZlIGJvdGgga2V5c1xuICAvLyBhbmQgdmFsdWVzIG9mIHR5cGUgc3RyaW5nXG4gIGNvbnN0IHByZXByb2Nlc3NTdHJpbmdzTWFwID0gZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBpZiAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RyaW5nc1xuICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbiAgfVxuXG4gIGlmICghdGhpcy5vcHRzLmFwcCAmJiAhdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhcIk9uZSBvZiAnYXBwJyBvciAnYXBwUGFja2FnZScgY2FwYWJpbGl0aWVzIHNob3VsZCBtdXN0IGJlIHNwZWNpZmllZFwiKTtcbiAgfVxuXG4gIGxldCBhcHAgPSB0aGlzLm9wdHMuYXBwO1xuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIHRyeSB7XG4gICAgaWYgKCFhcHApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcCA9IGF3YWl0IHRoaXMuYWRiLnB1bGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRtcFJvb3QpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBGYWlsZWQgdG8gcHVsbCBhbiBhcGsgZnJvbSAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhhcHApKSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGFwcCBhdCAnJHthcHB9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7YXBrU3RyaW5nc30gPSBhd2FpdCB0aGlzLmFkYi5leHRyYWN0U3RyaW5nc0Zyb21BcGsoYXBwLCBsYW5ndWFnZSwgdG1wUm9vdCk7XG4gICAgICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXBrU3RyaW5ncztcbiAgICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcChhcGtTdHJpbmdzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgZXh0cmFjdCBzdHJpbmdzIGZyb20gJyR7YXBwfScuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gIH1cbn07XG5cbi8vIG1lbW9pemVkIGluIGNvbnN0cnVjdG9yXG5jb21tYW5kcy5nZXRXaW5kb3dTaXplID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvd2luZG93L2N1cnJlbnQvc2l6ZScsICdHRVQnLCB7fSk7XG59O1xuXG4vLyBGb3IgVzNDXG5jb21tYW5kcy5nZXRXaW5kb3dSZWN0ID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCB0aGlzLmdldFdpbmRvd1NpemUoKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeDogMCxcbiAgICB5OiAwLFxuICB9O1xufTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlTW9iaWxlID0gYXN5bmMgZnVuY3Rpb24gKG1vYmlsZUNvbW1hbmQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBtb2JpbGVDb21tYW5kc01hcHBpbmcgPSB7XG4gICAgc2hlbGw6ICdtb2JpbGVTaGVsbCcsXG5cbiAgICBleGVjRW11Q29uc29sZUNvbW1hbmQ6ICdtb2JpbGVFeGVjRW11Q29uc29sZUNvbW1hbmQnLFxuXG4gICAgZHJhZ0dlc3R1cmU6ICdtb2JpbGVEcmFnR2VzdHVyZScsXG4gICAgZmxpbmdHZXN0dXJlOiAnbW9iaWxlRmxpbmdHZXN0dXJlJyxcbiAgICBkb3VibGVDbGlja0dlc3R1cmU6ICdtb2JpbGVEb3VibGVDbGlja0dlc3R1cmUnLFxuICAgIGxvbmdDbGlja0dlc3R1cmU6ICdtb2JpbGVMb25nQ2xpY2tHZXN0dXJlJyxcbiAgICBwaW5jaENsb3NlR2VzdHVyZTogJ21vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlJyxcbiAgICBwaW5jaE9wZW5HZXN0dXJlOiAnbW9iaWxlUGluY2hPcGVuR2VzdHVyZScsXG4gICAgc3dpcGVHZXN0dXJlOiAnbW9iaWxlU3dpcGVHZXN0dXJlJyxcbiAgICBzY3JvbGxHZXN0dXJlOiAnbW9iaWxlU2Nyb2xsR2VzdHVyZScsXG4gICAgc2Nyb2xsQmFja1RvOiAnbW9iaWxlU2Nyb2xsQmFja1RvJyxcbiAgICBzY3JvbGw6ICdtb2JpbGVTY3JvbGwnLFxuICAgIHZpZXdwb3J0U2NyZWVuc2hvdDogJ21vYmlsZVZpZXdwb3J0U2NyZWVuc2hvdCcsXG4gICAgdmlld3BvcnRSZWN0OiAnbW9iaWxlVmlld1BvcnRSZWN0JyxcblxuICAgIGRlZXBMaW5rOiAnbW9iaWxlRGVlcExpbmsnLFxuXG4gICAgc3RhcnRMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0JyxcbiAgICBzdG9wTG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0b3BMb2dzQnJvYWRjYXN0JyxcblxuICAgIGFjY2VwdEFsZXJ0OiAnbW9iaWxlQWNjZXB0QWxlcnQnLFxuICAgIGRpc21pc3NBbGVydDogJ21vYmlsZURpc21pc3NBbGVydCcsXG5cbiAgICBiYXR0ZXJ5SW5mbzogJ21vYmlsZUdldEJhdHRlcnlJbmZvJyxcblxuICAgIGRldmljZUluZm86ICdtb2JpbGVHZXREZXZpY2VJbmZvJyxcblxuICAgIGdldERldmljZVRpbWU6ICdtb2JpbGVHZXREZXZpY2VUaW1lJyxcblxuICAgIGNoYW5nZVBlcm1pc3Npb25zOiAnbW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMnLFxuICAgIGdldFBlcm1pc3Npb25zOiAnbW9iaWxlR2V0UGVybWlzc2lvbnMnLFxuXG4gICAgcGVyZm9ybUVkaXRvckFjdGlvbjogJ21vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24nLFxuXG4gICAgc3RhcnRTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZycsXG4gICAgc3RvcFNjcmVlblN0cmVhbWluZzogJ21vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcnLFxuXG4gICAgZ2V0Tm90aWZpY2F0aW9uczogJ21vYmlsZUdldE5vdGlmaWNhdGlvbnMnLFxuXG4gICAgbGlzdFNtczogJ21vYmlsZUxpc3RTbXMnLFxuXG4gICAgdHlwZTogJ21vYmlsZVR5cGUnLFxuICAgIHNlbnNvclNldDogJ3NlbnNvclNldCcsXG5cbiAgICBkZWxldGVGaWxlOiAnbW9iaWxlRGVsZXRlRmlsZScsXG5cbiAgICBzdGFydFNlcnZpY2U6ICdtb2JpbGVTdGFydFNlcnZpY2UnLFxuICAgIHN0b3BTZXJ2aWNlOiAnbW9iaWxlU3RvcFNlcnZpY2UnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICBpbnN0YWxsTXVsdGlwbGVBcGtzOiAnbW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcycsXG4gIH07XG5cbiAgaWYgKCFfLmhhcyhtb2JpbGVDb21tYW5kc01hcHBpbmcsIG1vYmlsZUNvbW1hbmQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duQ29tbWFuZEVycm9yKGBVbmtub3duIG1vYmlsZSBjb21tYW5kIFwiJHttb2JpbGVDb21tYW5kfVwiLiBgICtcbiAgICAgIGBPbmx5ICR7Xy5rZXlzKG1vYmlsZUNvbW1hbmRzTWFwcGluZyl9IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXNbbW9iaWxlQ29tbWFuZHNNYXBwaW5nW21vYmlsZUNvbW1hbmRdXShvcHRzKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVZpZXdwb3J0U2NyZWVuc2hvdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Vmlld3BvcnRTY3JlZW5zaG90KCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlY3RhbmdsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBSZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBSZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgUmVjdGFuZ2xlLlxuICovXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKiBAcmV0dXJucyB7UmVjdGFuZ2xlfSBUaGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVZpZXdQb3J0UmVjdCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVZpZXdQb3J0UmVjdCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldFZpZXdQb3J0UmVjdCgpO1xufTtcblxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gKHVybCkge1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydFVyaSh1cmwsIHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVlcExpbmtPcHRzXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHVybCAtIFRoZSBuYW1lIG9mIFVSTCB0byBzdGFydC5cbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gcGFja2FnZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHN0YXJ0IHRoZSBVUkkgd2l0aC5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHdhaXRGb3JMYXVuY2ggW3RydWVdIC0gaWYgYGZhbHNlYCB0aGVuIGFkYiB3b24ndCB3YWl0XG4gKiBmb3IgdGhlIHN0YXJ0ZWQgYWN0aXZpdHkgdG8gcmV0dXJuIHRoZSBjb250cm9sXG4gKi9cblxuLyoqXG4gKiBTdGFydCBVUkwgdGhhdCB0YWtlIHVzZXJzIGRpcmVjdGx5IHRvIHNwZWNpZmljIGNvbnRlbnQgaW4gdGhlIGFwcFxuICogQHBhcmFtIHtEZWVwTGlua09wdHN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlRGVlcExpbmsgPSBhc3luYyBmdW5jdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB1cmwsXG4gICAgcGFja2FnZTogcGtnLFxuICAgIHdhaXRGb3JMYXVuY2gsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJsLCBwa2csIHsgd2FpdEZvckxhdW5jaCB9KTtcbn07XG5cbmNvbW1hbmRzLm9wZW5Ob3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9vcGVuX25vdGlmaWNhdGlvbnMnLCAnUE9TVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gKHNldHRpbmdzKSB7XG4gIC8vIHdlIGhhdmUgc29tZSBzZXR0aW5ncyB0aGF0IGFyZSBzZXQgb24gdGhlIHNldHRpbmdzIG9iamVjdCBpbiB0aGUgZHJpdmVyXG4gIC8vIG9ubHksIGZvciBleGFtcGxlIGltYWdlIGZpbmRpbmcgc2V0dGluZ3MuIFRoZSB1aWF1dG8yIHNlcnZlciBkb2VzIG5vdCBrbm93XG4gIC8vIHdoYXQgdG8gZG8gd2l0aCB0aGVtLCBzbyBqdXN0IHNldCB0aGVtIG9uIHRoaXMgZHJpdmVyJ3Mgc2V0dGluZ3MgaW5zdGFuY2UsXG4gIC8vIGFuZCBkb24ndCBmb3J3YXJkIHRoZW0gdG8gdGhlIHNlcnZlclxuICBsZXQgZHJpdmVyT25seVNldHRpbmdzID0ge307XG4gIGxldCBzZXJ2ZXJTZXR0aW5ncyA9IHt9O1xuICBmb3IgKGxldCBbc2V0dGluZywgdmFsdWVdIG9mIF8udG9QYWlycyhzZXR0aW5ncykpIHtcbiAgICBpZiAoQkFTRURSSVZFUl9IQU5ETEVEX1NFVFRJTkdTLmluY2x1ZGVzKHNldHRpbmcpKSB7XG4gICAgICBkcml2ZXJPbmx5U2V0dGluZ3Nbc2V0dGluZ10gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VydmVyU2V0dGluZ3Nbc2V0dGluZ10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoZHJpdmVyT25seVNldHRpbmdzKSkge1xuICAgIGxvZy5pbmZvKGBGb3VuZCBzb21lIHNldHRpbmdzIGRlc2lnbmVkIHRvIGJlIGhhbmRsZWQgYnkgQmFzZURyaXZlcjogYCArXG4gICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoXy5rZXlzKGRyaXZlck9ubHlTZXR0aW5ncykpfS4gTm90IGAgK1xuICAgICAgICAgICAgIGBzZW5kaW5nIHRoZXNlIG9uIHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyIGFuZCBpbnN0ZWFkIGAgK1xuICAgICAgICAgICAgIGBzZXR0aW5nIGRpcmVjdGx5IG9uIHRoZSBkcml2ZXJgKTtcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnVwZGF0ZShkcml2ZXJPbmx5U2V0dGluZ3MpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KHNlcnZlclNldHRpbmdzKSkge1xuICAgIGxvZy5pbmZvKCdGb3J3YXJkaW5nIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgdG8gdGhlIFVpQXV0b21hdG9yMiBzZXJ2ZXI6ICcgK1xuICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KF8ua2V5cyhzZXJ2ZXJTZXR0aW5ncykpKTtcbiAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnUE9TVCcsXG4gICAgICB7c2V0dGluZ3M6IHNlcnZlclNldHRpbmdzfSk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldFNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAvLyBhcyBhYm92ZSwgd2UgbWlnaHQgaGF2ZSBzb21lIGRyaXZlci1vbmx5IHNldHRpbmdzIHRvIHJldHVybiBhcyB3ZWxsXG4gIGNvbnN0IGRyaXZlck9ubHlTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKTtcbiAgY29uc3Qgc2VydmVyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnR0VUJyk7XG4gIHJldHVybiB7Li4uZHJpdmVyT25seVNldHRpbmdzLCAuLi5zZXJ2ZXJTZXR0aW5nc307XG59O1xuXG4vKipcbiAqIE92ZXJyaWRpbmcgYXBwaXVtLWFuZHJvaWQtZHJpdmVyJ3Mgd3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QsXG4gKiB1bmxpa2UgaW4gYXBwaXVtLWFuZHJvaWQtZHJpdmVyIGF2b2lkaW5nIGFkYiByZXN0YXJ0aW5nIGFzIGl0IGludGVyblxuICoga2lsbHMgVWlBdXRvbWF0b3IyIHNlcnZlciBydW5uaW5nIGluIHRoZSBkZXZpY2UuXG4gKiovXG5oZWxwZXJzLndyYXBCb290c3RyYXBEaXNjb25uZWN0ID0gYXN5bmMgZnVuY3Rpb24gKHdyYXBwZWQpIHtcbiAgYXdhaXQgd3JhcHBlZCgpO1xufTtcblxuLy8gU3RvcCBwcm94eWluZyB0byBhbnkgQ2hyb21lZHJpdmVyIGFuZCByZWRpcmVjdCB0byB1aWF1dG9tYXRvcjJcbmhlbHBlcnMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eVJlcVJlcy5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbmZvIGVudHJpZXMgY2FuIGJlIGZvdW5kIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS11aWF1dG9tYXRvcjItc2VydmVyL2Jsb2IvbWFzdGVyL2FwcC9zcmMvbWFpbi9qYXZhL2lvL2FwcGl1bS91aWF1dG9tYXRvcjIvaGFuZGxlci9HZXREZXZpY2VJbmZvLmphdmFcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0RGV2aWNlSW5mbyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvaW5mbycsICdHRVQnKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHlwaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfG51bWJlcnxib29sZWFufSB0ZXh0IC0gVGhlIHRleHQgdG8gdHlwZVxuICovXG5cbi8qKlxuICogVHlwZXMgdGhlIGdpdmVuIFVuaWNvZGUgc3RyaW5nLlxuICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgZm9jdXMgaXMgYWxyZWFkeSBwdXRcbiAqIHRvIHRoZSBkZXN0aW5hdGlvbiBpbnB1dCBmaWVsZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSB7VHlwaW5nT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW5wdXQgdGV4dCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCB0byBhZGJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBgdGV4dGAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHByb3ZpZGVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVR5cGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUeXBlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRleHQsXG4gIH0gPSBvcHRzO1xuICBpZiAoXy5pc1VuZGVmaW5lZCh0ZXh0KSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgJ3RleHQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi50eXBlVW5pY29kZSh0ZXh0KTtcbn07XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vYW5kcm9pZC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTExMDY0L3doYXQtaXMtYS1wYXJ0aWFsLWFwcGxpY2F0aW9uLWluc3RhbGwtdmlhLWFkYlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE11bHRpcGxlQXBrc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gYXBrcyAtIFRoZSBsaXN0IG9mIEFQS3MgdG8gaW5zdGFsbC4gRWFjaCBBUEsgc2hvdWxkIGJlIGEgcGF0aCB0byBhIGFwa1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG93bmxvYWRhYmxlIFVSTCBhcyBIVFRQL0hUVFBTLlxuICogQHByb3BlcnR5IHtJbnN0YWxsT3B0aW9uc30gb3B0aW9uc1xuICovXG5cbi8qKlxuICogSW5zdGFsbCBtdWx0aXBsZSBBUEtzIHdpdGggYGluc3RhbGwtbXVsdGlwbGVgIG9wdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0luc3RhbGxNdWx0aXBsZUFwa3NPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBpbnN0YWxsaW5nIHRoZSBnaXZlbiBBUEtzLlxuICovXG5jb21tYW5kcy5tb2JpbGVJbnN0YWxsTXVsdGlwbGVBcGtzID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBpZiAoIV8uaXNBcnJheShvcHRzLmFwa3MpIHx8IF8uaXNFbXB0eShvcHRzLmFwa3MpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignTm8gYXBrcyBhcmUgZ2l2ZW4gdG8gaW5zdGFsbCcpO1xuICB9XG4gIGNvbnN0IGFwa3MgPSBhd2FpdCBCLmFsbChvcHRzLmFwa3NcbiAgICAubWFwKChhcHApID0+IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAoYXBwLCBbQVBLX0VYVEVOU0lPTl0pKSk7XG4gIGF3YWl0IHRoaXMuYWRiLmluc3RhbGxNdWx0aXBsZUFwa3MoYXBrcywgb3B0cy5vcHRpb25zKTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VuZXJhbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
272
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJnZXRQYWdlU291cmNlIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImRvU2VuZEtleXMiLCJwYXJhbXMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJkZWJ1ZyIsImJhY2siLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYXBrU3RyaW5ncyIsIm9wdHMiLCJhcHAiLCJhcHBQYWNrYWdlIiwiZXJyb3JBbmRUaHJvdyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiZnMiLCJleGlzdHMiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJyaW1yYWYiLCJnZXRXaW5kb3dTaXplIiwiZ2V0V2luZG93UmVjdCIsIndpZHRoIiwiaGVpZ2h0IiwieCIsInkiLCJleGVjdXRlTW9iaWxlIiwibW9iaWxlQ29tbWFuZCIsIm1vYmlsZUNvbW1hbmRzTWFwcGluZyIsInNoZWxsIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwiZHJhZ0dlc3R1cmUiLCJmbGluZ0dlc3R1cmUiLCJkb3VibGVDbGlja0dlc3R1cmUiLCJsb25nQ2xpY2tHZXN0dXJlIiwicGluY2hDbG9zZUdlc3R1cmUiLCJwaW5jaE9wZW5HZXN0dXJlIiwic3dpcGVHZXN0dXJlIiwic2Nyb2xsR2VzdHVyZSIsInNjcm9sbEJhY2tUbyIsInNjcm9sbCIsInZpZXdwb3J0U2NyZWVuc2hvdCIsInZpZXdwb3J0UmVjdCIsImRlZXBMaW5rIiwic3RhcnRMb2dzQnJvYWRjYXN0Iiwic3RvcExvZ3NCcm9hZGNhc3QiLCJhY2NlcHRBbGVydCIsImRpc21pc3NBbGVydCIsImJhdHRlcnlJbmZvIiwiZGV2aWNlSW5mbyIsImdldERldmljZVRpbWUiLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwic3RvcFNjcmVlblN0cmVhbWluZyIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwidHlwZSIsInNlbnNvclNldCIsImRlbGV0ZUZpbGUiLCJzdGFydEFjdGl2aXR5Iiwic3RhcnRTZXJ2aWNlIiwic3RvcFNlcnZpY2UiLCJnZXRDb250ZXh0cyIsImluc3RhbGxNdWx0aXBsZUFwa3MiLCJoYXMiLCJlcnJvcnMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyIsIm1vYmlsZVZpZXdwb3J0U2NyZWVuc2hvdCIsImdldFZpZXdwb3J0U2NyZWVuc2hvdCIsIm1vYmlsZVZpZXdQb3J0UmVjdCIsImdldFZpZXdQb3J0UmVjdCIsInNldFVybCIsInVybCIsInN0YXJ0VXJpIiwibW9iaWxlRGVlcExpbmsiLCJwYWNrYWdlIiwicGtnIiwid2FpdEZvckxhdW5jaCIsIm9wZW5Ob3RpZmljYXRpb25zIiwidXBkYXRlU2V0dGluZ3MiLCJzZXR0aW5ncyIsImRyaXZlck9ubHlTZXR0aW5ncyIsInNlcnZlclNldHRpbmdzIiwic2V0dGluZyIsIkJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUyIsImluY2x1ZGVzIiwiaXNFbXB0eSIsInVwZGF0ZSIsImdldFNldHRpbmdzIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJ3cmFwcGVkIiwic3VzcGVuZENocm9tZWRyaXZlclByb3h5IiwiY2hyb21lZHJpdmVyIiwicHJveHlSZXFSZXMiLCJiaW5kIiwiandwUHJveHlBY3RpdmUiLCJtb2JpbGVHZXREZXZpY2VJbmZvIiwibW9iaWxlVHlwZSIsInRleHQiLCJpc1VuZGVmaW5lZCIsInR5cGVVbmljb2RlIiwibW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcyIsImlzQXJyYXkiLCJhcGtzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJCIiwiYWxsIiwibWFwIiwiY29uZmlndXJlQXBwIiwiQVBLX0VYVEVOU0lPTiIsIm9wdGlvbnMiLCJPYmplY3QiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsSUFBSUEsVUFBVSxHQUFHLEVBQWpCO0FBQUEsSUFDSUMsUUFBUSxHQUFHLEVBRGY7QUFBQSxJQUVJQyxPQUFPLEdBQUcsRUFGZDs7QUFJQUQsUUFBUSxDQUFDRSxhQUFULEdBQXlCLGtCQUFrQjtBQUN6QyxTQUFPLE1BQU0sS0FBS0MsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQWtDLFNBQWxDLEVBQTZDLEtBQTdDLEVBQW9ELEVBQXBELENBQWI7QUFDRCxDQUZEOztBQUlBTCxRQUFRLENBQUNNLFlBQVQsR0FBd0Isa0JBQWtCO0FBQ3hDLFNBQVEsT0FBTSxLQUFLQyxHQUFMLENBQVNDLFdBQVQsRUFBTixJQUErQixFQUFoQyxHQUNGLE1BQU0sS0FBS0wsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQWtDLDhCQUFsQyxFQUFrRSxNQUFsRSxFQUEwRSxFQUExRSxDQURKLEdBRUYsTUFBTSxLQUFLRSxHQUFMLENBQVNELFlBQVQsRUFGWDtBQUdELENBSkQ7O0FBT0FOLFFBQVEsQ0FBQ1MsVUFBVCxHQUFzQixnQkFBZ0JDLE1BQWhCLEVBQXdCO0FBQzVDLFFBQU0sS0FBS1AsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQWtDLE9BQWxDLEVBQTJDLE1BQTNDLEVBQW1ESyxNQUFuRCxDQUFOO0FBQ0QsQ0FGRDs7QUFLQVYsUUFBUSxDQUFDVyxRQUFULEdBQW9CLGdCQUFnQkMsT0FBaEIsRUFBeUJDLFNBQXpCLEVB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QXlCMUcsZ0JBQUV5RixPQUFGLENBQVVuRixJQUFJLENBQUNvRyxJQUFmLENBQTdCLEVBQW1EO0FBQ2pELFVBQU0sSUFBSXZDLHlCQUFPd0Msb0JBQVgsQ0FBZ0MsOEJBQWhDLENBQU47QUFDRDs7QUFDRCxRQUFNRCxJQUFJLEdBQUcsTUFBTUUsa0JBQUVDLEdBQUYsQ0FBTXZHLElBQUksQ0FBQ29HLElBQUwsQ0FDdEJJLEdBRHNCLENBQ2pCdkcsR0FBRCxJQUFTLEtBQUtoQyxPQUFMLENBQWF3SSxZQUFiLENBQTBCeEcsR0FBMUIsRUFBK0IsQ0FBQ3lHLHlCQUFELENBQS9CLENBRFMsQ0FBTixDQUFuQjtBQUVBLFFBQU0sS0FBS25JLEdBQUwsQ0FBU29GLG1CQUFULENBQTZCeUMsSUFBN0IsRUFBbUNwRyxJQUFJLENBQUMyRyxPQUF4QyxDQUFOO0FBQ0QsQ0FQRDs7QUFTQUMsTUFBTSxDQUFDQyxNQUFQLENBQWM5SSxVQUFkLEVBQTBCQyxRQUExQixFQUFvQ0MsT0FBcEM7ZUFFZUYsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBlcnJvcnMsIEJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBmcywgdGVtcERpciB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IEFQS19FWFRFTlNJT04gfSBmcm9tICcuLi9leHRlbnNpb25zJztcblxubGV0IGV4dGVuc2lvbnMgPSB7fSxcbiAgICBjb21tYW5kcyA9IHt9LFxuICAgIGhlbHBlcnMgPSB7fTtcblxuY29tbWFuZHMuZ2V0UGFnZVNvdXJjZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL3NvdXJjZScsICdHRVQnLCB7fSk7XG59O1xuXG5jb21tYW5kcy5nZXRDbGlwYm9hcmQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDI5KVxuICAgID8gKGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvZ2V0X2NsaXBib2FyZCcsICdQT1NUJywge30pKVxuICAgIDogKGF3YWl0IHRoaXMuYWRiLmdldENsaXBib2FyZCgpKTtcbn07XG5cbi8vIE5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBmb3IgY29ycmVjdCB1bmljb2RlIHN1cHBvcnRcbmNvbW1hbmRzLmRvU2VuZEtleXMgPSBhc3luYyBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2tleXMnLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG4vLyB1aWF1dG9tYXRvcjIgZG9lc24ndCBzdXBwb3J0IG1ldGFzdGF0ZSBmb3Iga2V5ZXZlbnRzXG5jb21tYW5kcy5rZXlldmVudCA9IGFzeW5jIGZ1bmN0aW9uIChrZXljb2RlLCBtZXRhc3RhdGUpIHtcbiAgbG9nLmRlYnVnKGBJZ25vcmluZyBtZXRhc3RhdGUgJHttZXRhc3RhdGV9YCk7XG4gIGF3YWl0IHRoaXMuYWRiLmtleWV2ZW50KGtleWNvZGUpO1xufTtcblxuLy8gVXNlIEFEQiBzaW5jZSB3ZSBkb24ndCBoYXZlIFVpQXV0b21hdG9yXG5jb21tYW5kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudCg0KTtcbn07XG5cbmNvbW1hbmRzLmdldFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiAobGFuZ3VhZ2UpIHtcbiAgaWYgKCFsYW5ndWFnZSkge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5hZGIuZ2V0RGV2aWNlTGFuZ3VhZ2UoKTtcbiAgICBsb2cuaW5mbyhgTm8gbGFuZ3VhZ2Ugc3BlY2lmaWVkLCByZXR1cm5pbmcgc3RyaW5ncyBmb3I6ICR7bGFuZ3VhZ2V9YCk7XG4gIH1cblxuICAvLyBDbGllbnRzIHJlcXVpcmUgdGhlIHJlc3VsdGluZyBtYXBwaW5nIHRvIGhhdmUgYm90aCBrZXlzXG4gIC8vIGFuZCB2YWx1ZXMgb2YgdHlwZSBzdHJpbmdcbiAgY29uc3QgcHJlcHJvY2Vzc1N0cmluZ3NNYXAgPSBmdW5jdGlvbiAobWFwcGluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhtYXBwaW5nKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBfLmlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGlmICh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBzdHJpbmdzXG4gICAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pO1xuICB9XG5cbiAgaWYgKCF0aGlzLm9wdHMuYXBwICYmICF0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KFwiT25lIG9mICdhcHAnIG9yICdhcHBQYWNrYWdlJyBjYXBhYmlsaXRpZXMgc2hvdWxkIG11c3QgYmUgc3BlY2lmaWVkXCIpO1xuICB9XG5cbiAgbGV0IGFwcCA9IHRoaXMub3B0cy5hcHA7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBpZiAoIWFwcCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwID0gYXdhaXQgdGhpcy5hZGIucHVsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdG1wUm9vdCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYEZhaWxlZCB0byBwdWxsIGFuIGFwayBmcm9tICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGFwcCkpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgYXBwIGF0ICcke2FwcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHthcGtTdHJpbmdzfSA9IGF3YWl0IHRoaXMuYWRiLmV4dHJhY3RTdHJpbmdzRnJvbUFwayhhcHAsIGxhbmd1YWdlLCB0bXBSb290KTtcbiAgICAgIHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0gPSBhcGtTdHJpbmdzO1xuICAgICAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKGFwa1N0cmluZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBleHRyYWN0IHN0cmluZ3MgZnJvbSAnJHthcHB9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufTtcblxuLy8gbWVtb2l6ZWQgaW4gY29uc3RydWN0b3JcbmNvbW1hbmRzLmdldFdpbmRvd1NpemUgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy93aW5kb3cvY3VycmVudC9zaXplJywgJ0dFVCcsIHt9KTtcbn07XG5cbi8vIEZvciBXM0NcbmNvbW1hbmRzLmdldFdpbmRvd1JlY3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0V2luZG93U2l6ZSgpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gIH07XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGVNb2JpbGUgPSBhc3luYyBmdW5jdGlvbiAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG1vYmlsZUNvbW1hbmRzTWFwcGluZyA9IHtcbiAgICBzaGVsbDogJ21vYmlsZVNoZWxsJyxcblxuICAgIGV4ZWNFbXVDb25zb2xlQ29tbWFuZDogJ21vYmlsZUV4ZWNFbXVDb25zb2xlQ29tbWFuZCcsXG5cbiAgICBkcmFnR2VzdHVyZTogJ21vYmlsZURyYWdHZXN0dXJlJyxcbiAgICBmbGluZ0dlc3R1cmU6ICdtb2JpbGVGbGluZ0dlc3R1cmUnLFxuICAgIGRvdWJsZUNsaWNrR2VzdHVyZTogJ21vYmlsZURvdWJsZUNsaWNrR2VzdHVyZScsXG4gICAgbG9uZ0NsaWNrR2VzdHVyZTogJ21vYmlsZUxvbmdDbGlja0dlc3R1cmUnLFxuICAgIHBpbmNoQ2xvc2VHZXN0dXJlOiAnbW9iaWxlUGluY2hDbG9zZUdlc3R1cmUnLFxuICAgIHBpbmNoT3Blbkdlc3R1cmU6ICdtb2JpbGVQaW5jaE9wZW5HZXN0dXJlJyxcbiAgICBzd2lwZUdlc3R1cmU6ICdtb2JpbGVTd2lwZUdlc3R1cmUnLFxuICAgIHNjcm9sbEdlc3R1cmU6ICdtb2JpbGVTY3JvbGxHZXN0dXJlJyxcbiAgICBzY3JvbGxCYWNrVG86ICdtb2JpbGVTY3JvbGxCYWNrVG8nLFxuICAgIHNjcm9sbDogJ21vYmlsZVNjcm9sbCcsXG4gICAgdmlld3BvcnRTY3JlZW5zaG90OiAnbW9iaWxlVmlld3BvcnRTY3JlZW5zaG90JyxcbiAgICB2aWV3cG9ydFJlY3Q6ICdtb2JpbGVWaWV3UG9ydFJlY3QnLFxuXG4gICAgZGVlcExpbms6ICdtb2JpbGVEZWVwTGluaycsXG5cbiAgICBzdGFydExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QnLFxuICAgIHN0b3BMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QnLFxuXG4gICAgYWNjZXB0QWxlcnQ6ICdtb2JpbGVBY2NlcHRBbGVydCcsXG4gICAgZGlzbWlzc0FsZXJ0OiAnbW9iaWxlRGlzbWlzc0FsZXJ0JyxcblxuICAgIGJhdHRlcnlJbmZvOiAnbW9iaWxlR2V0QmF0dGVyeUluZm8nLFxuXG4gICAgZGV2aWNlSW5mbzogJ21vYmlsZUdldERldmljZUluZm8nLFxuXG4gICAgZ2V0RGV2aWNlVGltZTogJ21vYmlsZUdldERldmljZVRpbWUnLFxuXG4gICAgY2hhbmdlUGVybWlzc2lvbnM6ICdtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucycsXG4gICAgZ2V0UGVybWlzc2lvbnM6ICdtb2JpbGVHZXRQZXJtaXNzaW9ucycsXG5cbiAgICBwZXJmb3JtRWRpdG9yQWN0aW9uOiAnbW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbicsXG5cbiAgICBzdGFydFNjcmVlblN0cmVhbWluZzogJ21vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nJyxcbiAgICBzdG9wU2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZycsXG5cbiAgICBnZXROb3RpZmljYXRpb25zOiAnbW9iaWxlR2V0Tm90aWZpY2F0aW9ucycsXG5cbiAgICBsaXN0U21zOiAnbW9iaWxlTGlzdFNtcycsXG5cbiAgICB0eXBlOiAnbW9iaWxlVHlwZScsXG4gICAgc2Vuc29yU2V0OiAnc2Vuc29yU2V0JyxcblxuICAgIGRlbGV0ZUZpbGU6ICdtb2JpbGVEZWxldGVGaWxlJyxcblxuICAgIHN0YXJ0QWN0aXZpdHk6ICdtb2JpbGVTdGFydEFjdGl2aXR5JyxcbiAgICBzdGFydFNlcnZpY2U6ICdtb2JpbGVTdGFydFNlcnZpY2UnLFxuICAgIHN0b3BTZXJ2aWNlOiAnbW9iaWxlU3RvcFNlcnZpY2UnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICBpbnN0YWxsTXVsdGlwbGVBcGtzOiAnbW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcycsXG4gIH07XG5cbiAgaWYgKCFfLmhhcyhtb2JpbGVDb21tYW5kc01hcHBpbmcsIG1vYmlsZUNvbW1hbmQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duQ29tbWFuZEVycm9yKGBVbmtub3duIG1vYmlsZSBjb21tYW5kIFwiJHttb2JpbGVDb21tYW5kfVwiLiBgICtcbiAgICAgIGBPbmx5ICR7Xy5rZXlzKG1vYmlsZUNvbW1hbmRzTWFwcGluZyl9IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXNbbW9iaWxlQ29tbWFuZHNNYXBwaW5nW21vYmlsZUNvbW1hbmRdXShvcHRzKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVZpZXdwb3J0U2NyZWVuc2hvdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Vmlld3BvcnRTY3JlZW5zaG90KCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlY3RhbmdsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBSZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBSZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgUmVjdGFuZ2xlLlxuICovXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKiBAcmV0dXJucyB7UmVjdGFuZ2xlfSBUaGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVZpZXdQb3J0UmVjdCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVZpZXdQb3J0UmVjdCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldFZpZXdQb3J0UmVjdCgpO1xufTtcblxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gKHVybCkge1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydFVyaSh1cmwsIHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVlcExpbmtPcHRzXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHVybCAtIFRoZSBuYW1lIG9mIFVSTCB0byBzdGFydC5cbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gcGFja2FnZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHN0YXJ0IHRoZSBVUkkgd2l0aC5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHdhaXRGb3JMYXVuY2ggW3RydWVdIC0gaWYgYGZhbHNlYCB0aGVuIGFkYiB3b24ndCB3YWl0XG4gKiBmb3IgdGhlIHN0YXJ0ZWQgYWN0aXZpdHkgdG8gcmV0dXJuIHRoZSBjb250cm9sXG4gKi9cblxuLyoqXG4gKiBTdGFydCBVUkwgdGhhdCB0YWtlIHVzZXJzIGRpcmVjdGx5IHRvIHNwZWNpZmljIGNvbnRlbnQgaW4gdGhlIGFwcFxuICogQHBhcmFtIHtEZWVwTGlua09wdHN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlRGVlcExpbmsgPSBhc3luYyBmdW5jdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB1cmwsXG4gICAgcGFja2FnZTogcGtnLFxuICAgIHdhaXRGb3JMYXVuY2gsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJsLCBwa2csIHsgd2FpdEZvckxhdW5jaCB9KTtcbn07XG5cbmNvbW1hbmRzLm9wZW5Ob3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9vcGVuX25vdGlmaWNhdGlvbnMnLCAnUE9TVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gKHNldHRpbmdzKSB7XG4gIC8vIHdlIGhhdmUgc29tZSBzZXR0aW5ncyB0aGF0IGFyZSBzZXQgb24gdGhlIHNldHRpbmdzIG9iamVjdCBpbiB0aGUgZHJpdmVyXG4gIC8vIG9ubHksIGZvciBleGFtcGxlIGltYWdlIGZpbmRpbmcgc2V0dGluZ3MuIFRoZSB1aWF1dG8yIHNlcnZlciBkb2VzIG5vdCBrbm93XG4gIC8vIHdoYXQgdG8gZG8gd2l0aCB0aGVtLCBzbyBqdXN0IHNldCB0aGVtIG9uIHRoaXMgZHJpdmVyJ3Mgc2V0dGluZ3MgaW5zdGFuY2UsXG4gIC8vIGFuZCBkb24ndCBmb3J3YXJkIHRoZW0gdG8gdGhlIHNlcnZlclxuICBsZXQgZHJpdmVyT25seVNldHRpbmdzID0ge307XG4gIGxldCBzZXJ2ZXJTZXR0aW5ncyA9IHt9O1xuICBmb3IgKGxldCBbc2V0dGluZywgdmFsdWVdIG9mIF8udG9QYWlycyhzZXR0aW5ncykpIHtcbiAgICBpZiAoQkFTRURSSVZFUl9IQU5ETEVEX1NFVFRJTkdTLmluY2x1ZGVzKHNldHRpbmcpKSB7XG4gICAgICBkcml2ZXJPbmx5U2V0dGluZ3Nbc2V0dGluZ10gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VydmVyU2V0dGluZ3Nbc2V0dGluZ10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoZHJpdmVyT25seVNldHRpbmdzKSkge1xuICAgIGxvZy5pbmZvKGBGb3VuZCBzb21lIHNldHRpbmdzIGRlc2lnbmVkIHRvIGJlIGhhbmRsZWQgYnkgQmFzZURyaXZlcjogYCArXG4gICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoXy5rZXlzKGRyaXZlck9ubHlTZXR0aW5ncykpfS4gTm90IGAgK1xuICAgICAgICAgICAgIGBzZW5kaW5nIHRoZXNlIG9uIHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyIGFuZCBpbnN0ZWFkIGAgK1xuICAgICAgICAgICAgIGBzZXR0aW5nIGRpcmVjdGx5IG9uIHRoZSBkcml2ZXJgKTtcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnVwZGF0ZShkcml2ZXJPbmx5U2V0dGluZ3MpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KHNlcnZlclNldHRpbmdzKSkge1xuICAgIGxvZy5pbmZvKCdGb3J3YXJkaW5nIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgdG8gdGhlIFVpQXV0b21hdG9yMiBzZXJ2ZXI6ICcgK1xuICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KF8ua2V5cyhzZXJ2ZXJTZXR0aW5ncykpKTtcbiAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnUE9TVCcsXG4gICAgICB7c2V0dGluZ3M6IHNlcnZlclNldHRpbmdzfSk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldFNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAvLyBhcyBhYm92ZSwgd2UgbWlnaHQgaGF2ZSBzb21lIGRyaXZlci1vbmx5IHNldHRpbmdzIHRvIHJldHVybiBhcyB3ZWxsXG4gIGNvbnN0IGRyaXZlck9ubHlTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKTtcbiAgY29uc3Qgc2VydmVyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnR0VUJyk7XG4gIHJldHVybiB7Li4uZHJpdmVyT25seVNldHRpbmdzLCAuLi5zZXJ2ZXJTZXR0aW5nc307XG59O1xuXG4vKipcbiAqIE92ZXJyaWRpbmcgYXBwaXVtLWFuZHJvaWQtZHJpdmVyJ3Mgd3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QsXG4gKiB1bmxpa2UgaW4gYXBwaXVtLWFuZHJvaWQtZHJpdmVyIGF2b2lkaW5nIGFkYiByZXN0YXJ0aW5nIGFzIGl0IGludGVyblxuICoga2lsbHMgVWlBdXRvbWF0b3IyIHNlcnZlciBydW5uaW5nIGluIHRoZSBkZXZpY2UuXG4gKiovXG5oZWxwZXJzLndyYXBCb290c3RyYXBEaXNjb25uZWN0ID0gYXN5bmMgZnVuY3Rpb24gKHdyYXBwZWQpIHtcbiAgYXdhaXQgd3JhcHBlZCgpO1xufTtcblxuLy8gU3RvcCBwcm94eWluZyB0byBhbnkgQ2hyb21lZHJpdmVyIGFuZCByZWRpcmVjdCB0byB1aWF1dG9tYXRvcjJcbmhlbHBlcnMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eVJlcVJlcy5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbmZvIGVudHJpZXMgY2FuIGJlIGZvdW5kIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS11aWF1dG9tYXRvcjItc2VydmVyL2Jsb2IvbWFzdGVyL2FwcC9zcmMvbWFpbi9qYXZhL2lvL2FwcGl1bS91aWF1dG9tYXRvcjIvaGFuZGxlci9HZXREZXZpY2VJbmZvLmphdmFcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0RGV2aWNlSW5mbyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvaW5mbycsICdHRVQnKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHlwaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfG51bWJlcnxib29sZWFufSB0ZXh0IC0gVGhlIHRleHQgdG8gdHlwZVxuICovXG5cbi8qKlxuICogVHlwZXMgdGhlIGdpdmVuIFVuaWNvZGUgc3RyaW5nLlxuICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgZm9jdXMgaXMgYWxyZWFkeSBwdXRcbiAqIHRvIHRoZSBkZXN0aW5hdGlvbiBpbnB1dCBmaWVsZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSB7VHlwaW5nT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW5wdXQgdGV4dCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCB0byBhZGJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBgdGV4dGAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHByb3ZpZGVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVR5cGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUeXBlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRleHQsXG4gIH0gPSBvcHRzO1xuICBpZiAoXy5pc1VuZGVmaW5lZCh0ZXh0KSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgJ3RleHQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi50eXBlVW5pY29kZSh0ZXh0KTtcbn07XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vYW5kcm9pZC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTExMDY0L3doYXQtaXMtYS1wYXJ0aWFsLWFwcGxpY2F0aW9uLWluc3RhbGwtdmlhLWFkYlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE11bHRpcGxlQXBrc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gYXBrcyAtIFRoZSBsaXN0IG9mIEFQS3MgdG8gaW5zdGFsbC4gRWFjaCBBUEsgc2hvdWxkIGJlIGEgcGF0aCB0byBhIGFwa1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG93bmxvYWRhYmxlIFVSTCBhcyBIVFRQL0hUVFBTLlxuICogQHByb3BlcnR5IHtJbnN0YWxsT3B0aW9uc30gb3B0aW9uc1xuICovXG5cbi8qKlxuICogSW5zdGFsbCBtdWx0aXBsZSBBUEtzIHdpdGggYGluc3RhbGwtbXVsdGlwbGVgIG9wdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0luc3RhbGxNdWx0aXBsZUFwa3NPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBpbnN0YWxsaW5nIHRoZSBnaXZlbiBBUEtzLlxuICovXG5jb21tYW5kcy5tb2JpbGVJbnN0YWxsTXVsdGlwbGVBcGtzID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBpZiAoIV8uaXNBcnJheShvcHRzLmFwa3MpIHx8IF8uaXNFbXB0eShvcHRzLmFwa3MpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignTm8gYXBrcyBhcmUgZ2l2ZW4gdG8gaW5zdGFsbCcpO1xuICB9XG4gIGNvbnN0IGFwa3MgPSBhd2FpdCBCLmFsbChvcHRzLmFwa3NcbiAgICAubWFwKChhcHApID0+IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAoYXBwLCBbQVBLX0VYVEVOU0lPTl0pKSk7XG4gIGF3YWl0IHRoaXMuYWRiLmluc3RhbGxNdWx0aXBsZUFwa3MoYXBrcywgb3B0cy5vcHRpb25zKTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VuZXJhbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -153,6 +153,7 @@ extensions.executeMobile = async function (mobileCommand, opts = {}) {
153
153
 
154
154
  deleteFile: 'mobileDeleteFile',
155
155
 
156
+ startActivity: 'mobileStartActivity',
156
157
  startService: 'mobileStartService',
157
158
  stopService: 'mobileStopService',
158
159
 
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "automated testing",
8
8
  "android"
9
9
  ],
10
- "version": "1.66.2",
10
+ "version": "1.67.0",
11
11
  "author": "appium",
12
12
  "license": "Apache-2.0",
13
13
  "repository": {
@@ -42,7 +42,7 @@
42
42
  "dependencies": {
43
43
  "@babel/runtime": "^7.0.0",
44
44
  "appium-adb": "^8.10.0",
45
- "appium-android-driver": "^4.40.0",
45
+ "appium-android-driver": "^4.47.0",
46
46
  "appium-base-driver": "^7.0.0",
47
47
  "appium-chromedriver": "^4.23.1",
48
48
  "appium-support": "^2.49.0",