appium-uiautomator2-driver 1.67.0 → 1.70.1
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 +83 -16
- package/build/lib/commands/general.js +9 -2
- package/lib/commands/general.js +9 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -92,7 +92,7 @@ appium:buildToolsVersion | The version of Android build tools to use. By default
|
|
|
92
92
|
appium:skipLogcatCapture | Being set to `true` disables automatic logcat output collection during the test run. `false` by default
|
|
93
93
|
appium:suppressKillServer | Being set to `true` prevents the driver from ever killing the ADB server explicitly. Could be useful if ADB is connected wirelessly. `false` by default
|
|
94
94
|
appium:ignoreHiddenApiPolicyError | Being set to `true` ignores a failure while changing hidden API access policies. Could be useful on some devices, where access to these policies has been locked by its vendor. `false` by default.
|
|
95
|
-
appium:mockLocationApp |
|
|
95
|
+
appium:mockLocationApp | Sets the package identifier of the app, which is used as a system mock location provider since Appium 1.18.0+. This capability has no effect on emulators. If the value is set to `null` or an empty string, then Appium will skip the mocked location provider setup procedure. Defaults to Appium Setting package identifier (`io.appium.settings`).
|
|
96
96
|
appium:logcatFormat | The log print format, where `format` is one of: `brief` `process` `tag` `thread` `raw` `time` `threadtime` `long`. `threadtime` is the default value.
|
|
97
97
|
appium:logcatFilterSpecs | Series of `tag[:priority]` where `tag` is a log component tag (or * for all) and priority is: `V Verbose`, `D Debug`, `I Info`, `W Warn`, `E Error`, `F Fatal`, `S Silent (supress all output)`. '*' means '*:d' and `tag` by itself means `tag:v`. If not specified on the commandline, filterspec is set from ANDROID_LOG_TAGS. If no filterspec is found, filter defaults to '*:I'.
|
|
98
98
|
appium:allowDelayAdb | Being set to `false` prevents emulator to use `-delay-adb` feature to detect its startup. See https://github.com/appium/appium/issues/14773 for more details.
|
|
@@ -128,6 +128,7 @@ Capability Name | Description
|
|
|
128
128
|
appium:skipUnlock | Whether to skip the check for lock screen presence (`true`). By default UiAutomator2 driver tries to detect if the device's screen is locked before starting the test and to unlock that (which sometimes might be unstable). Note, that this operation takes some time, so it is highly recommended to set this capability to `true` and disable screen locking on devices under test.
|
|
129
129
|
appium:unlockType | Set one of the possible types of Android lock screens to unlock. Read the [Unlock tutorial](https://github.com/appium/appium-android-driver/blob/master/docs/UNLOCK.md) for more details.
|
|
130
130
|
appium:unlockKey | Allows to set an unlock key. Read the [Unlock tutorial](https://github.com/appium/appium-android-driver/blob/master/docs/UNLOCK.md) for more details.
|
|
131
|
+
appium:unlockStrategy | Either 'locksettings' (default) or 'uiautomator'. Setting it to 'uiautomator' will enforce the driver to avoid using special ADB shortcuts in order to speed up the unlock procedure.
|
|
131
132
|
appium:unlockSuccessTimeout | Maximum number of milliseconds to wait until the device is unlocked. `2000` ms by default
|
|
132
133
|
|
|
133
134
|
### MJPEG
|
|
@@ -209,7 +210,7 @@ id | This strategy is mapped to the native UiAutomator's `By.res` [locator](http
|
|
|
209
210
|
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'
|
|
210
211
|
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'
|
|
211
212
|
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 | `new UiScrollable(new UiSelector().resourceId(\"android:id/list\")).scrollIntoView(new UiSelector().text(\"Radio Group\"))`
|
|
212
|
-
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. | `By.xpath("//android.view.View[@text=\"Regular\" and @checkable=\"true\"]")`
|
|
213
|
+
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\"]")`
|
|
213
214
|
|
|
214
215
|
|
|
215
216
|
## Parallel Tests
|
|
@@ -580,6 +581,22 @@ Name | Type | Required | Description | Example
|
|
|
580
581
|
--- | --- | --- | --- | ---
|
|
581
582
|
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
583
|
|
|
584
|
+
### mobile: clearApp
|
|
585
|
+
|
|
586
|
+
Deletes all data associated with a package. Calls `adb shell pm clear` under the hood.
|
|
587
|
+
The app should be accessible, should not be running,
|
|
588
|
+
and should exist on the device under test for this extension to work properly.
|
|
589
|
+
|
|
590
|
+
#### Arguments
|
|
591
|
+
|
|
592
|
+
Name | Type | Required | Description | Example
|
|
593
|
+
--- | --- | --- | --- | ---
|
|
594
|
+
appId | string | yes | The identifier of the application package to be cleared | `my.app.id`
|
|
595
|
+
|
|
596
|
+
#### Returned Result
|
|
597
|
+
|
|
598
|
+
Stdout of the corresponding adb command.
|
|
599
|
+
|
|
583
600
|
### mobile: startActivity
|
|
584
601
|
|
|
585
602
|
Starts the given activity intent. Invokes `am start`/`am start-activity` command under the hood.
|
|
@@ -589,19 +606,20 @@ This method extends the functionality of the [Start Activity](#applications-mana
|
|
|
589
606
|
|
|
590
607
|
Name | Type | Required | Description | Example
|
|
591
608
|
--- | --- | --- | --- | ---
|
|
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
|
|
609
|
+
intent | string | yes | The full name of the activity intent to start | `com.some.package.name/.YourActivityClassName`
|
|
610
|
+
user | number or string | no | The user ID for which the service is started. The `current` user is used by default | 1006
|
|
594
611
|
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
612
|
stop | boolean | no | Set it to `true` to force stop the target app before starting the activity. | false
|
|
596
613
|
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
614
|
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. |
|
|
599
|
-
uri | string | no | Unified resource identifier. The actual value for the Activity Manager's `-d` argument. |
|
|
615
|
+
action | string | no | Action name. The actual value for the Activity Manager's `-a` argument. | android.intent.action.MAIN
|
|
616
|
+
uri | string | no | Unified resource identifier. The actual value for the Activity Manager's `-d` argument. | https://appium.io
|
|
600
617
|
mimeType | string | no | Mime type. The actual value for the Activity Manager's `-t` argument. | application/json
|
|
601
618
|
identifier | string | no | Optional identifier. The actual value for the Activity Manager's `-i` argument. | my_identifier
|
|
602
|
-
categories | string or Array<string> | no | One or more category names. The actual value(s) for the Activity Manager's `-c` argument. |
|
|
603
|
-
component | string | no | Component name. The actual value for the Activity Manager's `-n` argument. | com.
|
|
604
|
-
|
|
619
|
+
categories | string or Array<string> | no | One or more category names. The actual value(s) for the Activity Manager's `-c` argument. | android.intent.category.LAUNCHER
|
|
620
|
+
component | string | no | Component name. The actual value for the Activity Manager's `-n` argument. | com.myapp/com.myapp.SplashActivity
|
|
621
|
+
package | string | no | Package name. The actual value for the Activity Manager's `-p` argument. | com.myapp
|
|
622
|
+
extras | Array<Array<string>> | no | Optional intent arguments. Must be represented as an array of arrays, where each subarray item contains two (only in case it no value is required for the given type) or three string items: value type, key (variable name) 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<Integer>. Value must be a string of comma-separated integers; `la`: Long[]. Value must be a string of comma-separated long numbers; `lal`: List<Long>. Value must be a string of comma-separated long numbers; `fa`: Float[]. Value must be a string of comma-separated float numbers; `fal`: List<Float>. 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<String>. Value must be comma-separated strings. To embed a comma into a string, escape it using "\," | [['s', 'varName1', 'My String1'], ['s', 'varName2', 'My String2'], ['ia', 'arrName', '1,2,3,4']]
|
|
605
623
|
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
624
|
|
|
607
625
|
#### Returned Result
|
|
@@ -616,16 +634,17 @@ Starts the given service intent. Invokes `am startservice` or `am start-service`
|
|
|
616
634
|
|
|
617
635
|
Name | Type | Required | Description | Example
|
|
618
636
|
--- | --- | --- | --- | ---
|
|
619
|
-
intent | string |
|
|
637
|
+
intent | string | no | The full name of the service intent to start | `com.some.package.name/.YourServiceSubClassName`
|
|
620
638
|
user | number or string | no | The user ID for which the service is started. The `current` user id is used by default | 1006
|
|
621
639
|
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) |
|
|
623
|
-
uri | string | no | See the documentation for [startActivity extension](#mobile-startactivity) |
|
|
640
|
+
action | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | android.intent.action.MAIN
|
|
641
|
+
uri | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | https://appium.io
|
|
624
642
|
mimeType | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | application/json
|
|
625
643
|
identifier | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | my_identifier
|
|
626
|
-
categories | string or Array<string> | no | See the documentation for [startActivity extension](#mobile-startactivity) |
|
|
627
|
-
component | string | no | See the documentation for [startActivity extension](#mobile-startactivity) |
|
|
628
|
-
|
|
644
|
+
categories | string or Array<string> | no | See the documentation for [startActivity extension](#mobile-startactivity) | com.myapp/com.myapp.SplashActivity
|
|
645
|
+
component | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | android.intent.category.LAUNCHER
|
|
646
|
+
package | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | com.myapp
|
|
647
|
+
extras | Array<Array<string>> | no | See the documentation for [startActivity extension](#mobile-startactivity) | [['s', 'varName1', 'My String1'], ['s', 'varName2', 'My String2'], ['ia', 'arrName', '1,2,3,4']]
|
|
629
648
|
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
649
|
|
|
631
650
|
#### Returned Result
|
|
@@ -640,8 +659,43 @@ Stops the given service intent. Invokes `am stopservice` or `am stop-service` co
|
|
|
640
659
|
|
|
641
660
|
Name | Type | Required | Description | Example
|
|
642
661
|
--- | --- | --- | --- | ---
|
|
643
|
-
intent | string |
|
|
662
|
+
intent | string | no | The full name of the service intent to stop | `com.some.package.name/.YourServiceSubClassName`
|
|
644
663
|
user | number or string | no | The user ID for which the service is started. The `current` user id is used by default | 1006
|
|
664
|
+
action | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | android.intent.action.MAIN
|
|
665
|
+
uri | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | https://appium.io
|
|
666
|
+
mimeType | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | application/json
|
|
667
|
+
identifier | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | my_identifier
|
|
668
|
+
categories | string or Array<string> | no | See the documentation for [startActivity extension](#mobile-startactivity) | com.myapp/com.myapp.SplashActivity
|
|
669
|
+
component | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | android.intent.category.LAUNCHER
|
|
670
|
+
package | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | com.myapp
|
|
671
|
+
extras | Array<Array<string>> | no | See the documentation for [startActivity extension](#mobile-startactivity) | [['s', 'varName1', 'My String1'], ['s', 'varName2', 'My String2'], ['ia', 'arrName', '1,2,3,4']]
|
|
672
|
+
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`
|
|
673
|
+
|
|
674
|
+
### mobile: broadcast
|
|
675
|
+
|
|
676
|
+
Send a broadcast Intent. Invokes `am broadcast` command under the hood.
|
|
677
|
+
|
|
678
|
+
#### Arguments
|
|
679
|
+
|
|
680
|
+
Name | Type | Required | Description | Example
|
|
681
|
+
--- | --- | --- | --- | ---
|
|
682
|
+
intent | string | no | The full name of the intent to broadcast | `com.some.package.name/.YourIntentClassName`
|
|
683
|
+
user | number or string | no | Specify which user to send to; if not specified then send to all users. Possible values are `all`/`current`/`<numeric user id>` | current
|
|
684
|
+
receiverPermission | string | no | Require receiver to hold the given permission | android.permission.READ_PROFILE
|
|
685
|
+
allowBackgroundActivityStarts | boolean | no | The receiver may start activities even if in the background if set to `true` | false
|
|
686
|
+
action | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | android.intent.action.MAIN
|
|
687
|
+
uri | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | https://appium.io
|
|
688
|
+
mimeType | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | application/json
|
|
689
|
+
identifier | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | my_identifier
|
|
690
|
+
categories | string or Array<string> | no | See the documentation for [startActivity extension](#mobile-startactivity) | com.myapp/com.myapp.SplashActivity
|
|
691
|
+
component | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | android.intent.category.LAUNCHER
|
|
692
|
+
package | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | com.myapp
|
|
693
|
+
extras | Array<Array<string>> | no | See the documentation for [startActivity extension](#mobile-startactivity) | [['s', 'varName1', 'My String1'], ['s', 'varName2', 'My String2'], ['ia', 'arrName', '1,2,3,4']]
|
|
694
|
+
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`
|
|
695
|
+
|
|
696
|
+
#### Returned Result
|
|
697
|
+
|
|
698
|
+
The actual stdout of the downstream `am` command.
|
|
645
699
|
|
|
646
700
|
### mobile: getContexts
|
|
647
701
|
|
|
@@ -692,6 +746,19 @@ Name | Type | Required | Description | Example
|
|
|
692
746
|
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']`
|
|
693
747
|
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}`
|
|
694
748
|
|
|
749
|
+
### mobile: unlock
|
|
750
|
+
|
|
751
|
+
Unlocks the device if it is locked. Noop if the device's screen is not locked.
|
|
752
|
+
|
|
753
|
+
#### Arguments
|
|
754
|
+
|
|
755
|
+
Name | Type | Required | Description | Example
|
|
756
|
+
--- | --- | --- | --- | ---
|
|
757
|
+
key | string | yes | The unlock key. See the documentation on [appium:unlockKey](#device-locking) capability for more details | 12345
|
|
758
|
+
type | string | yes | The unlock type. See the documentation on [appium:unlockType](#device-locking) capability for more details | password
|
|
759
|
+
strategy | string | no | Unlock strategy. See the documentation on [appium:unlockStrategy](#device-locking) capability for more details | uiautomator
|
|
760
|
+
timeoutMs | number | no | Unlock timeout. See the documentation on [appium:unlockSuccessTimeout](#device-locking) capability for more details | 5000
|
|
761
|
+
|
|
695
762
|
## Applications Management
|
|
696
763
|
|
|
697
764
|
UiAutomator2 driver supports Appium endpoints for applications management:
|
|
@@ -102,6 +102,10 @@ commands.getStrings = async function (language) {
|
|
|
102
102
|
}
|
|
103
103
|
};
|
|
104
104
|
|
|
105
|
+
commands.getDisplayDensity = async function getDisplayDensity() {
|
|
106
|
+
return await this.uiautomator2.jwproxy.command('/appium/device/display_density', 'GET', {});
|
|
107
|
+
};
|
|
108
|
+
|
|
105
109
|
commands.getWindowSize = async function () {
|
|
106
110
|
return await this.uiautomator2.jwproxy.command('/window/current/size', 'GET', {});
|
|
107
111
|
};
|
|
@@ -153,11 +157,14 @@ extensions.executeMobile = async function (mobileCommand, opts = {}) {
|
|
|
153
157
|
type: 'mobileType',
|
|
154
158
|
sensorSet: 'sensorSet',
|
|
155
159
|
deleteFile: 'mobileDeleteFile',
|
|
160
|
+
clearApp: 'mobileClearApp',
|
|
156
161
|
startActivity: 'mobileStartActivity',
|
|
157
162
|
startService: 'mobileStartService',
|
|
158
163
|
stopService: 'mobileStopService',
|
|
164
|
+
broadcast: 'mobileBroadcast',
|
|
159
165
|
getContexts: 'mobileGetContexts',
|
|
160
|
-
installMultipleApks: 'mobileInstallMultipleApks'
|
|
166
|
+
installMultipleApks: 'mobileInstallMultipleApks',
|
|
167
|
+
unlock: 'mobileUnlock'
|
|
161
168
|
};
|
|
162
169
|
|
|
163
170
|
if (!_lodash.default.has(mobileCommandsMapping, mobileCommand)) {
|
|
@@ -269,4 +276,4 @@ var _default = extensions;
|
|
|
269
276
|
exports.default = _default;require('source-map-support').install();
|
|
270
277
|
|
|
271
278
|
|
|
272
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJnZXRQYWdlU291cmNlIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImRvU2VuZEtleXMiLCJwYXJhbXMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJkZWJ1ZyIsImJhY2siLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYXBrU3RyaW5ncyIsIm9wdHMiLCJhcHAiLCJhcHBQYWNrYWdlIiwiZXJyb3JBbmRUaHJvdyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiZnMiLCJleGlzdHMiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJyaW1yYWYiLCJnZXRXaW5kb3dTaXplIiwiZ2V0V2luZG93UmVjdCIsIndpZHRoIiwiaGVpZ2h0IiwieCIsInkiLCJleGVjdXRlTW9iaWxlIiwibW9iaWxlQ29tbWFuZCIsIm1vYmlsZUNvbW1hbmRzTWFwcGluZyIsInNoZWxsIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwiZHJhZ0dlc3R1cmUiLCJmbGluZ0dlc3R1cmUiLCJkb3VibGVDbGlja0dlc3R1cmUiLCJsb25nQ2xpY2tHZXN0dXJlIiwicGluY2hDbG9zZUdlc3R1cmUiLCJwaW5jaE9wZW5HZXN0dXJlIiwic3dpcGVHZXN0dXJlIiwic2Nyb2xsR2VzdHVyZSIsInNjcm9sbEJhY2tUbyIsInNjcm9sbCIsInZpZXdwb3J0U2NyZWVuc2hvdCIsInZpZXdwb3J0UmVjdCIsImRlZXBMaW5rIiwic3RhcnRMb2dzQnJvYWRjYXN0Iiwic3RvcExvZ3NCcm9hZGNhc3QiLCJhY2NlcHRBbGVydCIsImRpc21pc3NBbGVydCIsImJhdHRlcnlJbmZvIiwiZGV2aWNlSW5mbyIsImdldERldmljZVRpbWUiLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwic3RvcFNjcmVlblN0cmVhbWluZyIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwidHlwZSIsInNlbnNvclNldCIsImRlbGV0ZUZpbGUiLCJzdGFydEFjdGl2aXR5Iiwic3RhcnRTZXJ2aWNlIiwic3RvcFNlcnZpY2UiLCJnZXRDb250ZXh0cyIsImluc3RhbGxNdWx0aXBsZUFwa3MiLCJoYXMiLCJlcnJvcnMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyIsIm1vYmlsZVZpZXdwb3J0U2NyZWVuc2hvdCIsImdldFZpZXdwb3J0U2NyZWVuc2hvdCIsIm1vYmlsZVZpZXdQb3J0UmVjdCIsImdldFZpZXdQb3J0UmVjdCIsInNldFVybCIsInVybCIsInN0YXJ0VXJpIiwibW9iaWxlRGVlcExpbmsiLCJwYWNrYWdlIiwicGtnIiwid2FpdEZvckxhdW5jaCIsIm9wZW5Ob3RpZmljYXRpb25zIiwidXBkYXRlU2V0dGluZ3MiLCJzZXR0aW5ncyIsImRyaXZlck9ubHlTZXR0aW5ncyIsInNlcnZlclNldHRpbmdzIiwic2V0dGluZyIsIkJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUyIsImluY2x1ZGVzIiwiaXNFbXB0eSIsInVwZGF0ZSIsImdldFNldHRpbmdzIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJ3cmFwcGVkIiwic3VzcGVuZENocm9tZWRyaXZlclByb3h5IiwiY2hyb21lZHJpdmVyIiwicHJveHlSZXFSZXMiLCJiaW5kIiwiandwUHJveHlBY3RpdmUiLCJtb2JpbGVHZXREZXZpY2VJbmZvIiwibW9iaWxlVHlwZSIsInRleHQiLCJpc1VuZGVmaW5lZCIsInR5cGVVbmljb2RlIiwibW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcyIsImlzQXJyYXkiLCJhcGtzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJCIiwiYWxsIiwibWFwIiwiY29uZmlndXJlQXBwIiwiQVBLX0VYVEVOU0lPTiIsIm9wdGlvbnMiLCJPYmplY3QiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsSUFBSUEsVUFBVSxHQUFHLEVBQWpCO0FBQUEsSUFDSUMsUUFBUSxHQUFHLEVBRGY7QUFBQSxJQUVJQyxPQUFPLEdBQUcsRUFGZDs7QUFJQUQsUUFBUSxDQUFDRSxhQUFULEdBQXlCLGtCQUFrQjtBQUN6QyxTQUFPLE1BQU0sS0FBS0MsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQWtDLFNBQWxDLEVBQTZDLEtBQTdDLEVBQW9ELEVBQXBELENBQWI7QUFDRCxDQUZEOztBQUlBTCxRQUFRLENBQUNNLFlBQVQsR0FBd0Isa0JBQWtCO0FBQ3hDLFNBQVEsT0FBTSxLQUFLQyxHQUFMLENBQVNDLFdBQVQsRUFBTixJQUErQixFQUFoQyxHQUNGLE1BQU0sS0FBS0wsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQWtDLDhCQUFsQyxFQUFrRSxNQUFsRSxFQUEwRSxFQUExRSxDQURKLEdBRUYsTUFBTSxLQUFLRSxHQUFMLENBQVNELFlBQVQsRUFGWDtBQUdELENBSkQ7O0FBT0FOLFFBQVEsQ0FBQ1MsVUFBVCxHQUFzQixnQkFBZ0JDLE1BQWhCLEVBQXdCO0FBQzVDLFFBQU0sS0FBS1AsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQWtDLE9BQWxDLEVBQTJDLE1BQTNDLEVBQW1ESyxNQUFuRCxDQUFOO0FBQ0QsQ0FGRDs7QUFLQVYsUUFBUSxDQUFDVyxRQUFULEdBQW9CLGdCQUFnQkMsT0FBaEIsRUFBeUJDLFNBQXpCLEVB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QXlCMUcsZ0JBQUV5RixPQUFGLENBQVVuRixJQUFJLENBQUNvRyxJQUFmLENBQTdCLEVBQW1EO0FBQ2pELFVBQU0sSUFBSXZDLHlCQUFPd0Msb0JBQVgsQ0FBZ0MsOEJBQWhDLENBQU47QUFDRDs7QUFDRCxRQUFNRCxJQUFJLEdBQUcsTUFBTUUsa0JBQUVDLEdBQUYsQ0FBTXZHLElBQUksQ0FBQ29HLElBQUwsQ0FDdEJJLEdBRHNCLENBQ2pCdkcsR0FBRCxJQUFTLEtBQUtoQyxPQUFMLENBQWF3SSxZQUFiLENBQTBCeEcsR0FBMUIsRUFBK0IsQ0FBQ3lHLHlCQUFELENBQS9CLENBRFMsQ0FBTixDQUFuQjtBQUVBLFFBQU0sS0FBS25JLEdBQUwsQ0FBU29GLG1CQUFULENBQTZCeUMsSUFBN0IsRUFBbUNwRyxJQUFJLENBQUMyRyxPQUF4QyxDQUFOO0FBQ0QsQ0FQRDs7QUFTQUMsTUFBTSxDQUFDQyxNQUFQLENBQWM5SSxVQUFkLEVBQTBCQyxRQUExQixFQUFvQ0MsT0FBcEM7ZUFFZUYsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBlcnJvcnMsIEJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBmcywgdGVtcERpciB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IEFQS19FWFRFTlNJT04gfSBmcm9tICcuLi9leHRlbnNpb25zJztcblxubGV0IGV4dGVuc2lvbnMgPSB7fSxcbiAgICBjb21tYW5kcyA9IHt9LFxuICAgIGhlbHBlcnMgPSB7fTtcblxuY29tbWFuZHMuZ2V0UGFnZVNvdXJjZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL3NvdXJjZScsICdHRVQnLCB7fSk7XG59O1xuXG5jb21tYW5kcy5nZXRDbGlwYm9hcmQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDI5KVxuICAgID8gKGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvZ2V0X2NsaXBib2FyZCcsICdQT1NUJywge30pKVxuICAgIDogKGF3YWl0IHRoaXMuYWRiLmdldENsaXBib2FyZCgpKTtcbn07XG5cbi8vIE5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBmb3IgY29ycmVjdCB1bmljb2RlIHN1cHBvcnRcbmNvbW1hbmRzLmRvU2VuZEtleXMgPSBhc3luYyBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2tleXMnLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG4vLyB1aWF1dG9tYXRvcjIgZG9lc24ndCBzdXBwb3J0IG1ldGFzdGF0ZSBmb3Iga2V5ZXZlbnRzXG5jb21tYW5kcy5rZXlldmVudCA9IGFzeW5jIGZ1bmN0aW9uIChrZXljb2RlLCBtZXRhc3RhdGUpIHtcbiAgbG9nLmRlYnVnKGBJZ25vcmluZyBtZXRhc3RhdGUgJHttZXRhc3RhdGV9YCk7XG4gIGF3YWl0IHRoaXMuYWRiLmtleWV2ZW50KGtleWNvZGUpO1xufTtcblxuLy8gVXNlIEFEQiBzaW5jZSB3ZSBkb24ndCBoYXZlIFVpQXV0b21hdG9yXG5jb21tYW5kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudCg0KTtcbn07XG5cbmNvbW1hbmRzLmdldFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiAobGFuZ3VhZ2UpIHtcbiAgaWYgKCFsYW5ndWFnZSkge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5hZGIuZ2V0RGV2aWNlTGFuZ3VhZ2UoKTtcbiAgICBsb2cuaW5mbyhgTm8gbGFuZ3VhZ2Ugc3BlY2lmaWVkLCByZXR1cm5pbmcgc3RyaW5ncyBmb3I6ICR7bGFuZ3VhZ2V9YCk7XG4gIH1cblxuICAvLyBDbGllbnRzIHJlcXVpcmUgdGhlIHJlc3VsdGluZyBtYXBwaW5nIHRvIGhhdmUgYm90aCBrZXlzXG4gIC8vIGFuZCB2YWx1ZXMgb2YgdHlwZSBzdHJpbmdcbiAgY29uc3QgcHJlcHJvY2Vzc1N0cmluZ3NNYXAgPSBmdW5jdGlvbiAobWFwcGluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhtYXBwaW5nKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBfLmlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGlmICh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBzdHJpbmdzXG4gICAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pO1xuICB9XG5cbiAgaWYgKCF0aGlzLm9wdHMuYXBwICYmICF0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KFwiT25lIG9mICdhcHAnIG9yICdhcHBQYWNrYWdlJyBjYXBhYmlsaXRpZXMgc2hvdWxkIG11c3QgYmUgc3BlY2lmaWVkXCIpO1xuICB9XG5cbiAgbGV0IGFwcCA9IHRoaXMub3B0cy5hcHA7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBpZiAoIWFwcCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwID0gYXdhaXQgdGhpcy5hZGIucHVsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdG1wUm9vdCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYEZhaWxlZCB0byBwdWxsIGFuIGFwayBmcm9tICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGFwcCkpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgYXBwIGF0ICcke2FwcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHthcGtTdHJpbmdzfSA9IGF3YWl0IHRoaXMuYWRiLmV4dHJhY3RTdHJpbmdzRnJvbUFwayhhcHAsIGxhbmd1YWdlLCB0bXBSb290KTtcbiAgICAgIHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0gPSBhcGtTdHJpbmdzO1xuICAgICAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKGFwa1N0cmluZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBleHRyYWN0IHN0cmluZ3MgZnJvbSAnJHthcHB9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufTtcblxuLy8gbWVtb2l6ZWQgaW4gY29uc3RydWN0b3JcbmNvbW1hbmRzLmdldFdpbmRvd1NpemUgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy93aW5kb3cvY3VycmVudC9zaXplJywgJ0dFVCcsIHt9KTtcbn07XG5cbi8vIEZvciBXM0NcbmNvbW1hbmRzLmdldFdpbmRvd1JlY3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0V2luZG93U2l6ZSgpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gIH07XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGVNb2JpbGUgPSBhc3luYyBmdW5jdGlvbiAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG1vYmlsZUNvbW1hbmRzTWFwcGluZyA9IHtcbiAgICBzaGVsbDogJ21vYmlsZVNoZWxsJyxcblxuICAgIGV4ZWNFbXVDb25zb2xlQ29tbWFuZDogJ21vYmlsZUV4ZWNFbXVDb25zb2xlQ29tbWFuZCcsXG5cbiAgICBkcmFnR2VzdHVyZTogJ21vYmlsZURyYWdHZXN0dXJlJyxcbiAgICBmbGluZ0dlc3R1cmU6ICdtb2JpbGVGbGluZ0dlc3R1cmUnLFxuICAgIGRvdWJsZUNsaWNrR2VzdHVyZTogJ21vYmlsZURvdWJsZUNsaWNrR2VzdHVyZScsXG4gICAgbG9uZ0NsaWNrR2VzdHVyZTogJ21vYmlsZUxvbmdDbGlja0dlc3R1cmUnLFxuICAgIHBpbmNoQ2xvc2VHZXN0dXJlOiAnbW9iaWxlUGluY2hDbG9zZUdlc3R1cmUnLFxuICAgIHBpbmNoT3Blbkdlc3R1cmU6ICdtb2JpbGVQaW5jaE9wZW5HZXN0dXJlJyxcbiAgICBzd2lwZUdlc3R1cmU6ICdtb2JpbGVTd2lwZUdlc3R1cmUnLFxuICAgIHNjcm9sbEdlc3R1cmU6ICdtb2JpbGVTY3JvbGxHZXN0dXJlJyxcbiAgICBzY3JvbGxCYWNrVG86ICdtb2JpbGVTY3JvbGxCYWNrVG8nLFxuICAgIHNjcm9sbDogJ21vYmlsZVNjcm9sbCcsXG4gICAgdmlld3BvcnRTY3JlZW5zaG90OiAnbW9iaWxlVmlld3BvcnRTY3JlZW5zaG90JyxcbiAgICB2aWV3cG9ydFJlY3Q6ICdtb2JpbGVWaWV3UG9ydFJlY3QnLFxuXG4gICAgZGVlcExpbms6ICdtb2JpbGVEZWVwTGluaycsXG5cbiAgICBzdGFydExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QnLFxuICAgIHN0b3BMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QnLFxuXG4gICAgYWNjZXB0QWxlcnQ6ICdtb2JpbGVBY2NlcHRBbGVydCcsXG4gICAgZGlzbWlzc0FsZXJ0OiAnbW9iaWxlRGlzbWlzc0FsZXJ0JyxcblxuICAgIGJhdHRlcnlJbmZvOiAnbW9iaWxlR2V0QmF0dGVyeUluZm8nLFxuXG4gICAgZGV2aWNlSW5mbzogJ21vYmlsZUdldERldmljZUluZm8nLFxuXG4gICAgZ2V0RGV2aWNlVGltZTogJ21vYmlsZUdldERldmljZVRpbWUnLFxuXG4gICAgY2hhbmdlUGVybWlzc2lvbnM6ICdtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucycsXG4gICAgZ2V0UGVybWlzc2lvbnM6ICdtb2JpbGVHZXRQZXJtaXNzaW9ucycsXG5cbiAgICBwZXJmb3JtRWRpdG9yQWN0aW9uOiAnbW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbicsXG5cbiAgICBzdGFydFNjcmVlblN0cmVhbWluZzogJ21vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nJyxcbiAgICBzdG9wU2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZycsXG5cbiAgICBnZXROb3RpZmljYXRpb25zOiAnbW9iaWxlR2V0Tm90aWZpY2F0aW9ucycsXG5cbiAgICBsaXN0U21zOiAnbW9iaWxlTGlzdFNtcycsXG5cbiAgICB0eXBlOiAnbW9iaWxlVHlwZScsXG4gICAgc2Vuc29yU2V0OiAnc2Vuc29yU2V0JyxcblxuICAgIGRlbGV0ZUZpbGU6ICdtb2JpbGVEZWxldGVGaWxlJyxcblxuICAgIHN0YXJ0QWN0aXZpdHk6ICdtb2JpbGVTdGFydEFjdGl2aXR5JyxcbiAgICBzdGFydFNlcnZpY2U6ICdtb2JpbGVTdGFydFNlcnZpY2UnLFxuICAgIHN0b3BTZXJ2aWNlOiAnbW9iaWxlU3RvcFNlcnZpY2UnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICBpbnN0YWxsTXVsdGlwbGVBcGtzOiAnbW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcycsXG4gIH07XG5cbiAgaWYgKCFfLmhhcyhtb2JpbGVDb21tYW5kc01hcHBpbmcsIG1vYmlsZUNvbW1hbmQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duQ29tbWFuZEVycm9yKGBVbmtub3duIG1vYmlsZSBjb21tYW5kIFwiJHttb2JpbGVDb21tYW5kfVwiLiBgICtcbiAgICAgIGBPbmx5ICR7Xy5rZXlzKG1vYmlsZUNvbW1hbmRzTWFwcGluZyl9IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXNbbW9iaWxlQ29tbWFuZHNNYXBwaW5nW21vYmlsZUNvbW1hbmRdXShvcHRzKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVZpZXdwb3J0U2NyZWVuc2hvdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Vmlld3BvcnRTY3JlZW5zaG90KCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlY3RhbmdsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBSZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBSZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgUmVjdGFuZ2xlLlxuICovXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKiBAcmV0dXJucyB7UmVjdGFuZ2xlfSBUaGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVZpZXdQb3J0UmVjdCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVZpZXdQb3J0UmVjdCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldFZpZXdQb3J0UmVjdCgpO1xufTtcblxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gKHVybCkge1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydFVyaSh1cmwsIHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVlcExpbmtPcHRzXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHVybCAtIFRoZSBuYW1lIG9mIFVSTCB0byBzdGFydC5cbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gcGFja2FnZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHN0YXJ0IHRoZSBVUkkgd2l0aC5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHdhaXRGb3JMYXVuY2ggW3RydWVdIC0gaWYgYGZhbHNlYCB0aGVuIGFkYiB3b24ndCB3YWl0XG4gKiBmb3IgdGhlIHN0YXJ0ZWQgYWN0aXZpdHkgdG8gcmV0dXJuIHRoZSBjb250cm9sXG4gKi9cblxuLyoqXG4gKiBTdGFydCBVUkwgdGhhdCB0YWtlIHVzZXJzIGRpcmVjdGx5IHRvIHNwZWNpZmljIGNvbnRlbnQgaW4gdGhlIGFwcFxuICogQHBhcmFtIHtEZWVwTGlua09wdHN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlRGVlcExpbmsgPSBhc3luYyBmdW5jdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB1cmwsXG4gICAgcGFja2FnZTogcGtnLFxuICAgIHdhaXRGb3JMYXVuY2gsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJsLCBwa2csIHsgd2FpdEZvckxhdW5jaCB9KTtcbn07XG5cbmNvbW1hbmRzLm9wZW5Ob3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9vcGVuX25vdGlmaWNhdGlvbnMnLCAnUE9TVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gKHNldHRpbmdzKSB7XG4gIC8vIHdlIGhhdmUgc29tZSBzZXR0aW5ncyB0aGF0IGFyZSBzZXQgb24gdGhlIHNldHRpbmdzIG9iamVjdCBpbiB0aGUgZHJpdmVyXG4gIC8vIG9ubHksIGZvciBleGFtcGxlIGltYWdlIGZpbmRpbmcgc2V0dGluZ3MuIFRoZSB1aWF1dG8yIHNlcnZlciBkb2VzIG5vdCBrbm93XG4gIC8vIHdoYXQgdG8gZG8gd2l0aCB0aGVtLCBzbyBqdXN0IHNldCB0aGVtIG9uIHRoaXMgZHJpdmVyJ3Mgc2V0dGluZ3MgaW5zdGFuY2UsXG4gIC8vIGFuZCBkb24ndCBmb3J3YXJkIHRoZW0gdG8gdGhlIHNlcnZlclxuICBsZXQgZHJpdmVyT25seVNldHRpbmdzID0ge307XG4gIGxldCBzZXJ2ZXJTZXR0aW5ncyA9IHt9O1xuICBmb3IgKGxldCBbc2V0dGluZywgdmFsdWVdIG9mIF8udG9QYWlycyhzZXR0aW5ncykpIHtcbiAgICBpZiAoQkFTRURSSVZFUl9IQU5ETEVEX1NFVFRJTkdTLmluY2x1ZGVzKHNldHRpbmcpKSB7XG4gICAgICBkcml2ZXJPbmx5U2V0dGluZ3Nbc2V0dGluZ10gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VydmVyU2V0dGluZ3Nbc2V0dGluZ10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoZHJpdmVyT25seVNldHRpbmdzKSkge1xuICAgIGxvZy5pbmZvKGBGb3VuZCBzb21lIHNldHRpbmdzIGRlc2lnbmVkIHRvIGJlIGhhbmRsZWQgYnkgQmFzZURyaXZlcjogYCArXG4gICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoXy5rZXlzKGRyaXZlck9ubHlTZXR0aW5ncykpfS4gTm90IGAgK1xuICAgICAgICAgICAgIGBzZW5kaW5nIHRoZXNlIG9uIHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyIGFuZCBpbnN0ZWFkIGAgK1xuICAgICAgICAgICAgIGBzZXR0aW5nIGRpcmVjdGx5IG9uIHRoZSBkcml2ZXJgKTtcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnVwZGF0ZShkcml2ZXJPbmx5U2V0dGluZ3MpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KHNlcnZlclNldHRpbmdzKSkge1xuICAgIGxvZy5pbmZvKCdGb3J3YXJkaW5nIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgdG8gdGhlIFVpQXV0b21hdG9yMiBzZXJ2ZXI6ICcgK1xuICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KF8ua2V5cyhzZXJ2ZXJTZXR0aW5ncykpKTtcbiAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnUE9TVCcsXG4gICAgICB7c2V0dGluZ3M6IHNlcnZlclNldHRpbmdzfSk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldFNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAvLyBhcyBhYm92ZSwgd2UgbWlnaHQgaGF2ZSBzb21lIGRyaXZlci1vbmx5IHNldHRpbmdzIHRvIHJldHVybiBhcyB3ZWxsXG4gIGNvbnN0IGRyaXZlck9ubHlTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKTtcbiAgY29uc3Qgc2VydmVyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnR0VUJyk7XG4gIHJldHVybiB7Li4uZHJpdmVyT25seVNldHRpbmdzLCAuLi5zZXJ2ZXJTZXR0aW5nc307XG59O1xuXG4vKipcbiAqIE92ZXJyaWRpbmcgYXBwaXVtLWFuZHJvaWQtZHJpdmVyJ3Mgd3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QsXG4gKiB1bmxpa2UgaW4gYXBwaXVtLWFuZHJvaWQtZHJpdmVyIGF2b2lkaW5nIGFkYiByZXN0YXJ0aW5nIGFzIGl0IGludGVyblxuICoga2lsbHMgVWlBdXRvbWF0b3IyIHNlcnZlciBydW5uaW5nIGluIHRoZSBkZXZpY2UuXG4gKiovXG5oZWxwZXJzLndyYXBCb290c3RyYXBEaXNjb25uZWN0ID0gYXN5bmMgZnVuY3Rpb24gKHdyYXBwZWQpIHtcbiAgYXdhaXQgd3JhcHBlZCgpO1xufTtcblxuLy8gU3RvcCBwcm94eWluZyB0byBhbnkgQ2hyb21lZHJpdmVyIGFuZCByZWRpcmVjdCB0byB1aWF1dG9tYXRvcjJcbmhlbHBlcnMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eVJlcVJlcy5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbmZvIGVudHJpZXMgY2FuIGJlIGZvdW5kIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS11aWF1dG9tYXRvcjItc2VydmVyL2Jsb2IvbWFzdGVyL2FwcC9zcmMvbWFpbi9qYXZhL2lvL2FwcGl1bS91aWF1dG9tYXRvcjIvaGFuZGxlci9HZXREZXZpY2VJbmZvLmphdmFcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0RGV2aWNlSW5mbyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvaW5mbycsICdHRVQnKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHlwaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfG51bWJlcnxib29sZWFufSB0ZXh0IC0gVGhlIHRleHQgdG8gdHlwZVxuICovXG5cbi8qKlxuICogVHlwZXMgdGhlIGdpdmVuIFVuaWNvZGUgc3RyaW5nLlxuICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgZm9jdXMgaXMgYWxyZWFkeSBwdXRcbiAqIHRvIHRoZSBkZXN0aW5hdGlvbiBpbnB1dCBmaWVsZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSB7VHlwaW5nT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW5wdXQgdGV4dCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCB0byBhZGJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBgdGV4dGAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHByb3ZpZGVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVR5cGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUeXBlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRleHQsXG4gIH0gPSBvcHRzO1xuICBpZiAoXy5pc1VuZGVmaW5lZCh0ZXh0KSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgJ3RleHQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi50eXBlVW5pY29kZSh0ZXh0KTtcbn07XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vYW5kcm9pZC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTExMDY0L3doYXQtaXMtYS1wYXJ0aWFsLWFwcGxpY2F0aW9uLWluc3RhbGwtdmlhLWFkYlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE11bHRpcGxlQXBrc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gYXBrcyAtIFRoZSBsaXN0IG9mIEFQS3MgdG8gaW5zdGFsbC4gRWFjaCBBUEsgc2hvdWxkIGJlIGEgcGF0aCB0byBhIGFwa1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG93bmxvYWRhYmxlIFVSTCBhcyBIVFRQL0hUVFBTLlxuICogQHByb3BlcnR5IHtJbnN0YWxsT3B0aW9uc30gb3B0aW9uc1xuICovXG5cbi8qKlxuICogSW5zdGFsbCBtdWx0aXBsZSBBUEtzIHdpdGggYGluc3RhbGwtbXVsdGlwbGVgIG9wdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0luc3RhbGxNdWx0aXBsZUFwa3NPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBpbnN0YWxsaW5nIHRoZSBnaXZlbiBBUEtzLlxuICovXG5jb21tYW5kcy5tb2JpbGVJbnN0YWxsTXVsdGlwbGVBcGtzID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBpZiAoIV8uaXNBcnJheShvcHRzLmFwa3MpIHx8IF8uaXNFbXB0eShvcHRzLmFwa3MpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignTm8gYXBrcyBhcmUgZ2l2ZW4gdG8gaW5zdGFsbCcpO1xuICB9XG4gIGNvbnN0IGFwa3MgPSBhd2FpdCBCLmFsbChvcHRzLmFwa3NcbiAgICAubWFwKChhcHApID0+IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAoYXBwLCBbQVBLX0VYVEVOU0lPTl0pKSk7XG4gIGF3YWl0IHRoaXMuYWRiLmluc3RhbGxNdWx0aXBsZUFwa3MoYXBrcywgb3B0cy5vcHRpb25zKTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VuZXJhbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
279
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJnZXRQYWdlU291cmNlIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImRvU2VuZEtleXMiLCJwYXJhbXMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJkZWJ1ZyIsImJhY2siLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYXBrU3RyaW5ncyIsIm9wdHMiLCJhcHAiLCJhcHBQYWNrYWdlIiwiZXJyb3JBbmRUaHJvdyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiZnMiLCJleGlzdHMiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJyaW1yYWYiLCJnZXREaXNwbGF5RGVuc2l0eSIsImdldFdpbmRvd1NpemUiLCJnZXRXaW5kb3dSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsImV4ZWN1dGVNb2JpbGUiLCJtb2JpbGVDb21tYW5kIiwibW9iaWxlQ29tbWFuZHNNYXBwaW5nIiwic2hlbGwiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJkcmFnR2VzdHVyZSIsImZsaW5nR2VzdHVyZSIsImRvdWJsZUNsaWNrR2VzdHVyZSIsImxvbmdDbGlja0dlc3R1cmUiLCJwaW5jaENsb3NlR2VzdHVyZSIsInBpbmNoT3Blbkdlc3R1cmUiLCJzd2lwZUdlc3R1cmUiLCJzY3JvbGxHZXN0dXJlIiwic2Nyb2xsQmFja1RvIiwic2Nyb2xsIiwidmlld3BvcnRTY3JlZW5zaG90Iiwidmlld3BvcnRSZWN0IiwiZGVlcExpbmsiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImFjY2VwdEFsZXJ0IiwiZGlzbWlzc0FsZXJ0IiwiYmF0dGVyeUluZm8iLCJkZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVGltZSIsImNoYW5nZVBlcm1pc3Npb25zIiwiZ2V0UGVybWlzc2lvbnMiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwic3RhcnRTY3JlZW5TdHJlYW1pbmciLCJzdG9wU2NyZWVuU3RyZWFtaW5nIiwiZ2V0Tm90aWZpY2F0aW9ucyIsImxpc3RTbXMiLCJ0eXBlIiwic2Vuc29yU2V0IiwiZGVsZXRlRmlsZSIsImNsZWFyQXBwIiwic3RhcnRBY3Rpdml0eSIsInN0YXJ0U2VydmljZSIsInN0b3BTZXJ2aWNlIiwiYnJvYWRjYXN0IiwiZ2V0Q29udGV4dHMiLCJpbnN0YWxsTXVsdGlwbGVBcGtzIiwidW5sb2NrIiwiaGFzIiwiZXJyb3JzIiwiVW5rbm93bkNvbW1hbmRFcnJvciIsImtleXMiLCJtb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QiLCJnZXRWaWV3cG9ydFNjcmVlbnNob3QiLCJtb2JpbGVWaWV3UG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJzZXRVcmwiLCJ1cmwiLCJzdGFydFVyaSIsIm1vYmlsZURlZXBMaW5rIiwicGFja2FnZSIsInBrZyIsIndhaXRGb3JMYXVuY2giLCJvcGVuTm90aWZpY2F0aW9ucyIsInVwZGF0ZVNldHRpbmdzIiwic2V0dGluZ3MiLCJkcml2ZXJPbmx5U2V0dGluZ3MiLCJzZXJ2ZXJTZXR0aW5ncyIsInNldHRpbmciLCJCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MiLCJpbmNsdWRlcyIsImlzRW1wdHkiLCJ1cGRhdGUiLCJnZXRTZXR0aW5ncyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSIsImNocm9tZWRyaXZlciIsInByb3h5UmVxUmVzIiwiYmluZCIsImp3cFByb3h5QWN0aXZlIiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsIm1vYmlsZVR5cGUiLCJ0ZXh0IiwiaXNVbmRlZmluZWQiLCJ0eXBlVW5pY29kZSIsIm1vYmlsZUluc3RhbGxNdWx0aXBsZUFwa3MiLCJpc0FycmF5IiwiYXBrcyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiQiIsImFsbCIsIm1hcCIsImNvbmZpZ3VyZUFwcCIsIkFQS19FWFRFTlNJT04iLCJvcHRpb25zIiwiT2JqZWN0IiwiYXNzaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLElBQUlBLFVBQVUsR0FBRyxFQUFqQjtBQUFBLElBQ0lDLFFBQVEsR0FBRyxFQURmO0FBQUEsSUFFSUMsT0FBTyxHQUFHLEVBRmQ7O0FBSUFELFFBQVEsQ0FBQ0UsYUFBVCxHQUF5QixrQkFBa0I7QUFDekMsU0FBTyxNQUFNLEtBQUtDLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyxTQUFsQyxFQUE2QyxLQUE3QyxFQUFvRCxFQUFwRCxDQUFiO0FBQ0QsQ0FGRDs7QUFJQUwsUUFBUSxDQUFDTSxZQUFULEdBQXdCLGtCQUFrQjtBQUN4QyxTQUFRLE9BQU0sS0FBS0MsR0FBTCxDQUFTQyxXQUFULEVBQU4sSUFBK0IsRUFBaEMsR0FDRixNQUFNLEtBQUtMLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyw4QkFBbEMsRUFBa0UsTUFBbEUsRUFBMEUsRUFBMUUsQ0FESixHQUVGLE1BQU0sS0FBS0UsR0FBTCxDQUFTRCxZQUFULEVBRlg7QUFHRCxDQUpEOztBQU9BTixRQUFRLENBQUNTLFVBQVQsR0FBc0IsZ0JBQWdCQyxNQUFoQixFQUF3QjtBQUM1QyxRQUFNLEtBQUtQLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyxPQUFsQyxFQUEyQyxNQUEzQyxFQUFtREssTUFBbkQsQ0FBTjtBQUNELENBRkQ7O0FBS0FW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LElBQUFBO0FBREksTUFFRm5HLElBRko7O0FBR0EsTUFBSU4sZ0JBQUUwRyxXQUFGLENBQWNELElBQWQsQ0FBSixFQUF5QjtBQUN2QnJILG9CQUFJcUIsYUFBSixDQUFtQixrQ0FBbkI7QUFDRDs7QUFDRCxTQUFPLE1BQU0sS0FBSzVCLEdBQUwsQ0FBUzhILFdBQVQsQ0FBcUJGLElBQXJCLENBQWI7QUFDRCxDQVJEOztBQXlDQW5JLFFBQVEsQ0FBQ3NJLHlCQUFULEdBQXFDLGdCQUFnQnRHLElBQUksR0FBRyxFQUF2QixFQUEyQjtBQUM5RCxNQUFJLENBQUNOLGdCQUFFNkcsT0FBRixDQUFVdkcsSUFBSSxDQUFDd0csSUFBZixDQUFELElBQXlCOUcsZ0JBQUU2RixPQUFGLENBQVV2RixJQUFJLENBQUN3RyxJQUFmLENBQTdCLEVBQW1EO0FBQ2pELFVBQU0sSUFBSXZDLHlCQUFPd0Msb0JBQVgsQ0FBZ0MsOEJBQWhDLENBQU47QUFDRDs7QUFDRCxRQUFNRCxJQUFJLEdBQUcsTUFBTUUsa0JBQUVDLEdBQUYsQ0FBTTNHLElBQUksQ0FBQ3dHLElBQUwsQ0FDdEJJLEdBRHNCLENBQ2pCM0csR0FBRCxJQUFTLEtBQUtoQyxPQUFMLENBQWE0SSxZQUFiLENBQTBCNUcsR0FBMUIsRUFBK0IsQ0FBQzZHLHlCQUFELENBQS9CLENBRFMsQ0FBTixDQUFuQjtBQUVBLFFBQU0sS0FBS3ZJLEdBQUwsQ0FBU3VGLG1CQUFULENBQTZCMEMsSUFBN0IsRUFBbUN4RyxJQUFJLENBQUMrRyxPQUF4QyxDQUFOO0FBQ0QsQ0FQRDs7QUFTQUMsTUFBTSxDQUFDQyxNQUFQLENBQWNsSixVQUFkLEVBQTBCQyxRQUExQixFQUFvQ0MsT0FBcEM7ZUFFZUYsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBlcnJvcnMsIEJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBmcywgdGVtcERpciB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IEFQS19FWFRFTlNJT04gfSBmcm9tICcuLi9leHRlbnNpb25zJztcblxubGV0IGV4dGVuc2lvbnMgPSB7fSxcbiAgICBjb21tYW5kcyA9IHt9LFxuICAgIGhlbHBlcnMgPSB7fTtcblxuY29tbWFuZHMuZ2V0UGFnZVNvdXJjZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL3NvdXJjZScsICdHRVQnLCB7fSk7XG59O1xuXG5jb21tYW5kcy5nZXRDbGlwYm9hcmQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDI5KVxuICAgID8gKGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvZ2V0X2NsaXBib2FyZCcsICdQT1NUJywge30pKVxuICAgIDogKGF3YWl0IHRoaXMuYWRiLmdldENsaXBib2FyZCgpKTtcbn07XG5cbi8vIE5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBmb3IgY29ycmVjdCB1bmljb2RlIHN1cHBvcnRcbmNvbW1hbmRzLmRvU2VuZEtleXMgPSBhc3luYyBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2tleXMnLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG4vLyB1aWF1dG9tYXRvcjIgZG9lc24ndCBzdXBwb3J0IG1ldGFzdGF0ZSBmb3Iga2V5ZXZlbnRzXG5jb21tYW5kcy5rZXlldmVudCA9IGFzeW5jIGZ1bmN0aW9uIChrZXljb2RlLCBtZXRhc3RhdGUpIHtcbiAgbG9nLmRlYnVnKGBJZ25vcmluZyBtZXRhc3RhdGUgJHttZXRhc3RhdGV9YCk7XG4gIGF3YWl0IHRoaXMuYWRiLmtleWV2ZW50KGtleWNvZGUpO1xufTtcblxuLy8gVXNlIEFEQiBzaW5jZSB3ZSBkb24ndCBoYXZlIFVpQXV0b21hdG9yXG5jb21tYW5kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudCg0KTtcbn07XG5cbmNvbW1hbmRzLmdldFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiAobGFuZ3VhZ2UpIHtcbiAgaWYgKCFsYW5ndWFnZSkge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5hZGIuZ2V0RGV2aWNlTGFuZ3VhZ2UoKTtcbiAgICBsb2cuaW5mbyhgTm8gbGFuZ3VhZ2Ugc3BlY2lmaWVkLCByZXR1cm5pbmcgc3RyaW5ncyBmb3I6ICR7bGFuZ3VhZ2V9YCk7XG4gIH1cblxuICAvLyBDbGllbnRzIHJlcXVpcmUgdGhlIHJlc3VsdGluZyBtYXBwaW5nIHRvIGhhdmUgYm90aCBrZXlzXG4gIC8vIGFuZCB2YWx1ZXMgb2YgdHlwZSBzdHJpbmdcbiAgY29uc3QgcHJlcHJvY2Vzc1N0cmluZ3NNYXAgPSBmdW5jdGlvbiAobWFwcGluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhtYXBwaW5nKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBfLmlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGlmICh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBzdHJpbmdzXG4gICAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pO1xuICB9XG5cbiAgaWYgKCF0aGlzLm9wdHMuYXBwICYmICF0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KFwiT25lIG9mICdhcHAnIG9yICdhcHBQYWNrYWdlJyBjYXBhYmlsaXRpZXMgc2hvdWxkIG11c3QgYmUgc3BlY2lmaWVkXCIpO1xuICB9XG5cbiAgbGV0IGFwcCA9IHRoaXMub3B0cy5hcHA7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBpZiAoIWFwcCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwID0gYXdhaXQgdGhpcy5hZGIucHVsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdG1wUm9vdCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYEZhaWxlZCB0byBwdWxsIGFuIGFwayBmcm9tICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGFwcCkpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgYXBwIGF0ICcke2FwcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHthcGtTdHJpbmdzfSA9IGF3YWl0IHRoaXMuYWRiLmV4dHJhY3RTdHJpbmdzRnJvbUFwayhhcHAsIGxhbmd1YWdlLCB0bXBSb290KTtcbiAgICAgIHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0gPSBhcGtTdHJpbmdzO1xuICAgICAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKGFwa1N0cmluZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBleHRyYWN0IHN0cmluZ3MgZnJvbSAnJHthcHB9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufTtcblxuY29tbWFuZHMuZ2V0RGlzcGxheURlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXREaXNwbGF5RGVuc2l0eSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2Rpc3BsYXlfZGVuc2l0eScsICdHRVQnLCB7fSk7XG59O1xuXG4vLyBtZW1vaXplZCBpbiBjb25zdHJ1Y3RvclxuY29tbWFuZHMuZ2V0V2luZG93U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL3dpbmRvdy9jdXJyZW50L3NpemUnLCAnR0VUJywge30pO1xufTtcblxuLy8gRm9yIFczQ1xuY29tbWFuZHMuZ2V0V2luZG93UmVjdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5nZXRXaW5kb3dTaXplKCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgfTtcbn07XG5cbmV4dGVuc2lvbnMuZXhlY3V0ZU1vYmlsZSA9IGFzeW5jIGZ1bmN0aW9uIChtb2JpbGVDb21tYW5kLCBvcHRzID0ge30pIHtcbiAgY29uc3QgbW9iaWxlQ29tbWFuZHNNYXBwaW5nID0ge1xuICAgIHNoZWxsOiAnbW9iaWxlU2hlbGwnLFxuXG4gICAgZXhlY0VtdUNvbnNvbGVDb21tYW5kOiAnbW9iaWxlRXhlY0VtdUNvbnNvbGVDb21tYW5kJyxcblxuICAgIGRyYWdHZXN0dXJlOiAnbW9iaWxlRHJhZ0dlc3R1cmUnLFxuICAgIGZsaW5nR2VzdHVyZTogJ21vYmlsZUZsaW5nR2VzdHVyZScsXG4gICAgZG91YmxlQ2xpY2tHZXN0dXJlOiAnbW9iaWxlRG91YmxlQ2xpY2tHZXN0dXJlJyxcbiAgICBsb25nQ2xpY2tHZXN0dXJlOiAnbW9iaWxlTG9uZ0NsaWNrR2VzdHVyZScsXG4gICAgcGluY2hDbG9zZUdlc3R1cmU6ICdtb2JpbGVQaW5jaENsb3NlR2VzdHVyZScsXG4gICAgcGluY2hPcGVuR2VzdHVyZTogJ21vYmlsZVBpbmNoT3Blbkdlc3R1cmUnLFxuICAgIHN3aXBlR2VzdHVyZTogJ21vYmlsZVN3aXBlR2VzdHVyZScsXG4gICAgc2Nyb2xsR2VzdHVyZTogJ21vYmlsZVNjcm9sbEdlc3R1cmUnLFxuICAgIHNjcm9sbEJhY2tUbzogJ21vYmlsZVNjcm9sbEJhY2tUbycsXG4gICAgc2Nyb2xsOiAnbW9iaWxlU2Nyb2xsJyxcbiAgICB2aWV3cG9ydFNjcmVlbnNob3Q6ICdtb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QnLFxuICAgIHZpZXdwb3J0UmVjdDogJ21vYmlsZVZpZXdQb3J0UmVjdCcsXG5cbiAgICBkZWVwTGluazogJ21vYmlsZURlZXBMaW5rJyxcblxuICAgIHN0YXJ0TG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCcsXG4gICAgc3RvcExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCcsXG5cbiAgICBhY2NlcHRBbGVydDogJ21vYmlsZUFjY2VwdEFsZXJ0JyxcbiAgICBkaXNtaXNzQWxlcnQ6ICdtb2JpbGVEaXNtaXNzQWxlcnQnLFxuXG4gICAgYmF0dGVyeUluZm86ICdtb2JpbGVHZXRCYXR0ZXJ5SW5mbycsXG5cbiAgICBkZXZpY2VJbmZvOiAnbW9iaWxlR2V0RGV2aWNlSW5mbycsXG5cbiAgICBnZXREZXZpY2VUaW1lOiAnbW9iaWxlR2V0RGV2aWNlVGltZScsXG5cbiAgICBjaGFuZ2VQZXJtaXNzaW9uczogJ21vYmlsZUNoYW5nZVBlcm1pc3Npb25zJyxcbiAgICBnZXRQZXJtaXNzaW9uczogJ21vYmlsZUdldFBlcm1pc3Npb25zJyxcblxuICAgIHBlcmZvcm1FZGl0b3JBY3Rpb246ICdtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uJyxcblxuICAgIHN0YXJ0U2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcnLFxuICAgIHN0b3BTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nJyxcblxuICAgIGdldE5vdGlmaWNhdGlvbnM6ICdtb2JpbGVHZXROb3RpZmljYXRpb25zJyxcblxuICAgIGxpc3RTbXM6ICdtb2JpbGVMaXN0U21zJyxcblxuICAgIHR5cGU6ICdtb2JpbGVUeXBlJyxcbiAgICBzZW5zb3JTZXQ6ICdzZW5zb3JTZXQnLFxuXG4gICAgZGVsZXRlRmlsZTogJ21vYmlsZURlbGV0ZUZpbGUnLFxuXG4gICAgY2xlYXJBcHA6ICdtb2JpbGVDbGVhckFwcCcsXG5cbiAgICBzdGFydEFjdGl2aXR5OiAnbW9iaWxlU3RhcnRBY3Rpdml0eScsXG4gICAgc3RhcnRTZXJ2aWNlOiAnbW9iaWxlU3RhcnRTZXJ2aWNlJyxcbiAgICBzdG9wU2VydmljZTogJ21vYmlsZVN0b3BTZXJ2aWNlJyxcbiAgICBicm9hZGNhc3Q6ICdtb2JpbGVCcm9hZGNhc3QnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICBpbnN0YWxsTXVsdGlwbGVBcGtzOiAnbW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcycsXG5cbiAgICB1bmxvY2s6ICdtb2JpbGVVbmxvY2snLFxuICB9O1xuXG4gIGlmICghXy5oYXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nLCBtb2JpbGVDb21tYW5kKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkNvbW1hbmRFcnJvcihgVW5rbm93biBtb2JpbGUgY29tbWFuZCBcIiR7bW9iaWxlQ29tbWFuZH1cIi4gYCArXG4gICAgICBgT25seSAke18ua2V5cyhtb2JpbGVDb21tYW5kc01hcHBpbmcpfSBjb21tYW5kcyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzW21vYmlsZUNvbW1hbmRzTWFwcGluZ1ttb2JpbGVDb21tYW5kXV0ob3B0cyk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldFZpZXdwb3J0U2NyZWVuc2hvdCgpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZWN0YW5nbGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIFJlY3RhbmdsZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIFJlY3RhbmdsZS5cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICogQHJldHVybnMge1JlY3RhbmdsZX0gVGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICovXG5jb21tYW5kcy5tb2JpbGVWaWV3UG9ydFJlY3QgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVWaWV3UG9ydFJlY3QgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRWaWV3UG9ydFJlY3QoKTtcbn07XG5cbmNvbW1hbmRzLnNldFVybCA9IGFzeW5jIGZ1bmN0aW9uICh1cmwpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJsLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZXBMaW5rT3B0c1xuICogQHByb3BlcnR5IHshc3RyaW5nfSB1cmwgLSBUaGUgbmFtZSBvZiBVUkwgdG8gc3RhcnQuXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHBhY2thZ2UgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBzdGFydCB0aGUgVVJJIHdpdGguXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB3YWl0Rm9yTGF1bmNoIFt0cnVlXSAtIGlmIGBmYWxzZWAgdGhlbiBhZGIgd29uJ3Qgd2FpdFxuICogZm9yIHRoZSBzdGFydGVkIGFjdGl2aXR5IHRvIHJldHVybiB0aGUgY29udHJvbFxuICovXG5cbi8qKlxuICogU3RhcnQgVVJMIHRoYXQgdGFrZSB1c2VycyBkaXJlY3RseSB0byBzcGVjaWZpYyBjb250ZW50IGluIHRoZSBhcHBcbiAqIEBwYXJhbSB7RGVlcExpbmtPcHRzfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURlZXBMaW5rID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdXJsLFxuICAgIHBhY2thZ2U6IHBrZyxcbiAgICB3YWl0Rm9yTGF1bmNoLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnN0YXJ0VXJpKHVybCwgcGtnLCB7IHdhaXRGb3JMYXVuY2ggfSk7XG59O1xuXG5jb21tYW5kcy5vcGVuTm90aWZpY2F0aW9ucyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2Uvb3Blbl9ub3RpZmljYXRpb25zJywgJ1BPU1QnLCB7fSk7XG59O1xuXG5jb21tYW5kcy51cGRhdGVTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uIChzZXR0aW5ncykge1xuICAvLyB3ZSBoYXZlIHNvbWUgc2V0dGluZ3MgdGhhdCBhcmUgc2V0IG9uIHRoZSBzZXR0aW5ncyBvYmplY3QgaW4gdGhlIGRyaXZlclxuICAvLyBvbmx5LCBmb3IgZXhhbXBsZSBpbWFnZSBmaW5kaW5nIHNldHRpbmdzLiBUaGUgdWlhdXRvMiBzZXJ2ZXIgZG9lcyBub3Qga25vd1xuICAvLyB3aGF0IHRvIGRvIHdpdGggdGhlbSwgc28ganVzdCBzZXQgdGhlbSBvbiB0aGlzIGRyaXZlcidzIHNldHRpbmdzIGluc3RhbmNlLFxuICAvLyBhbmQgZG9uJ3QgZm9yd2FyZCB0aGVtIHRvIHRoZSBzZXJ2ZXJcbiAgbGV0IGRyaXZlck9ubHlTZXR0aW5ncyA9IHt9O1xuICBsZXQgc2VydmVyU2V0dGluZ3MgPSB7fTtcbiAgZm9yIChsZXQgW3NldHRpbmcsIHZhbHVlXSBvZiBfLnRvUGFpcnMoc2V0dGluZ3MpKSB7XG4gICAgaWYgKEJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUy5pbmNsdWRlcyhzZXR0aW5nKSkge1xuICAgICAgZHJpdmVyT25seVNldHRpbmdzW3NldHRpbmddID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlcnZlclNldHRpbmdzW3NldHRpbmddID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIGlmICghXy5pc0VtcHR5KGRyaXZlck9ubHlTZXR0aW5ncykpIHtcbiAgICBsb2cuaW5mbyhgRm91bmQgc29tZSBzZXR0aW5ncyBkZXNpZ25lZCB0byBiZSBoYW5kbGVkIGJ5IEJhc2VEcml2ZXI6IGAgK1xuICAgICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhkcml2ZXJPbmx5U2V0dGluZ3MpKX0uIE5vdCBgICtcbiAgICAgICAgICAgICBgc2VuZGluZyB0aGVzZSBvbiB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlciBhbmQgaW5zdGVhZCBgICtcbiAgICAgICAgICAgICBgc2V0dGluZyBkaXJlY3RseSBvbiB0aGUgZHJpdmVyYCk7XG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy51cGRhdGUoZHJpdmVyT25seVNldHRpbmdzKTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShzZXJ2ZXJTZXR0aW5ncykpIHtcbiAgICBsb2cuaW5mbygnRm9yd2FyZGluZyB0aGUgZm9sbG93aW5nIHNldHRpbmdzIHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyOiAnICtcbiAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShfLmtleXMoc2VydmVyU2V0dGluZ3MpKSk7XG4gICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL3NldHRpbmdzJywgJ1BPU1QnLFxuICAgICAge3NldHRpbmdzOiBzZXJ2ZXJTZXR0aW5nc30pO1xuICB9XG59O1xuXG5jb21tYW5kcy5nZXRTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgLy8gYXMgYWJvdmUsIHdlIG1pZ2h0IGhhdmUgc29tZSBkcml2ZXItb25seSBzZXR0aW5ncyB0byByZXR1cm4gYXMgd2VsbFxuICBjb25zdCBkcml2ZXJPbmx5U2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzLmdldFNldHRpbmdzKCk7XG4gIGNvbnN0IHNlcnZlclNldHRpbmdzID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL3NldHRpbmdzJywgJ0dFVCcpO1xuICByZXR1cm4gey4uLmRyaXZlck9ubHlTZXR0aW5ncywgLi4uc2VydmVyU2V0dGluZ3N9O1xufTtcblxuLyoqXG4gKiBPdmVycmlkaW5nIGFwcGl1bS1hbmRyb2lkLWRyaXZlcidzIHdyYXBCb290c3RyYXBEaXNjb25uZWN0LFxuICogdW5saWtlIGluIGFwcGl1bS1hbmRyb2lkLWRyaXZlciBhdm9pZGluZyBhZGIgcmVzdGFydGluZyBhcyBpdCBpbnRlcm5cbiAqIGtpbGxzIFVpQXV0b21hdG9yMiBzZXJ2ZXIgcnVubmluZyBpbiB0aGUgZGV2aWNlLlxuICoqL1xuaGVscGVycy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdCA9IGFzeW5jIGZ1bmN0aW9uICh3cmFwcGVkKSB7XG4gIGF3YWl0IHdyYXBwZWQoKTtcbn07XG5cbi8vIFN0b3AgcHJveHlpbmcgdG8gYW55IENocm9tZWRyaXZlciBhbmQgcmVkaXJlY3QgdG8gdWlhdXRvbWF0b3IyXG5oZWxwZXJzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlSZXFSZXMuYmluZCh0aGlzLnVpYXV0b21hdG9yMik7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgaW5mbyBlbnRyaWVzIGNhbiBiZSBmb3VuZCBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tdWlhdXRvbWF0b3IyLXNlcnZlci9ibG9iL21hc3Rlci9hcHAvc3JjL21haW4vamF2YS9pby9hcHBpdW0vdWlhdXRvbWF0b3IyL2hhbmRsZXIvR2V0RGV2aWNlSW5mby5qYXZhXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZUluZm8gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2luZm8nLCAnR0VUJyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFR5cGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ3xudW1iZXJ8Ym9vbGVhbn0gdGV4dCAtIFRoZSB0ZXh0IHRvIHR5cGVcbiAqL1xuXG4vKipcbiAqIFR5cGVzIHRoZSBnaXZlbiBVbmljb2RlIHN0cmluZy5cbiAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGZvY3VzIGlzIGFscmVhZHkgcHV0XG4gKiB0byB0aGUgZGVzdGluYXRpb24gaW5wdXQgZmllbGQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0ge1R5cGluZ09wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGlucHV0IHRleHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gYWRiXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYHRleHRgIHByb3BlcnR5IGhhcyBub3QgYmVlbiBwcm92aWRlZFxuICovXG5jb21tYW5kcy5tb2JpbGVUeXBlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVHlwZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0ZXh0LFxuICB9ID0gb3B0cztcbiAgaWYgKF8uaXNVbmRlZmluZWQodGV4dCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlICd0ZXh0JyBhcmd1bWVudCBpcyBtYW5kYXRvcnlgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIudHlwZVVuaWNvZGUodGV4dCk7XG59O1xuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gc2RjYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZXBsYWNlIFt0cnVlXSAtIFNldCBpdCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0byBiZSB1cGdyYWRlZC9yZWluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgZGV2aWNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBwYXJ0aWFsSW5zdGFsbCBbZmFsc2VdIC0gSW5zdGFsbCBhcGtzIHBhcnRpYWxseS4gSXQgaXMgdXNlZCBmb3IgJ2luc3RhbGwtbXVsdGlwbGUnLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2FuZHJvaWQuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzExMTA2NC93aGF0LWlzLWEtcGFydGlhbC1hcHBsaWNhdGlvbi1pbnN0YWxsLXZpYS1hZGJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxNdWx0aXBsZUFwa3NPcHRpb25zXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IGFwa3MgLSBUaGUgbGlzdCBvZiBBUEtzIHRvIGluc3RhbGwuIEVhY2ggQVBLIHNob3VsZCBiZSBhIHBhdGggdG8gYSBhcGtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRvd25sb2FkYWJsZSBVUkwgYXMgSFRUUC9IVFRQUy5cbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuXG4vKipcbiAqIEluc3RhbGwgbXVsdGlwbGUgQVBLcyB3aXRoIGBpbnN0YWxsLW11bHRpcGxlYCBvcHRpb24uXG4gKlxuICogQHBhcmFtIHtJbnN0YWxsTXVsdGlwbGVBcGtzT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgaW5zdGFsbGluZyB0aGUgZ2l2ZW4gQVBLcy5cbiAqL1xuY29tbWFuZHMubW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIChvcHRzID0ge30pIHtcbiAgaWYgKCFfLmlzQXJyYXkob3B0cy5hcGtzKSB8fCBfLmlzRW1wdHkob3B0cy5hcGtzKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ05vIGFwa3MgYXJlIGdpdmVuIHRvIGluc3RhbGwnKTtcbiAgfVxuICBjb25zdCBhcGtzID0gYXdhaXQgQi5hbGwob3B0cy5hcGtzXG4gICAgLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgW0FQS19FWFRFTlNJT05dKSkpO1xuICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsTXVsdGlwbGVBcGtzKGFwa3MsIG9wdHMub3B0aW9ucyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcblxuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL2dlbmVyYWwuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
package/lib/commands/general.js
CHANGED
|
@@ -87,6 +87,10 @@ commands.getStrings = async function (language) {
|
|
|
87
87
|
}
|
|
88
88
|
};
|
|
89
89
|
|
|
90
|
+
commands.getDisplayDensity = async function getDisplayDensity () {
|
|
91
|
+
return await this.uiautomator2.jwproxy.command('/appium/device/display_density', 'GET', {});
|
|
92
|
+
};
|
|
93
|
+
|
|
90
94
|
// memoized in constructor
|
|
91
95
|
commands.getWindowSize = async function () {
|
|
92
96
|
return await this.uiautomator2.jwproxy.command('/window/current/size', 'GET', {});
|
|
@@ -153,13 +157,18 @@ extensions.executeMobile = async function (mobileCommand, opts = {}) {
|
|
|
153
157
|
|
|
154
158
|
deleteFile: 'mobileDeleteFile',
|
|
155
159
|
|
|
160
|
+
clearApp: 'mobileClearApp',
|
|
161
|
+
|
|
156
162
|
startActivity: 'mobileStartActivity',
|
|
157
163
|
startService: 'mobileStartService',
|
|
158
164
|
stopService: 'mobileStopService',
|
|
165
|
+
broadcast: 'mobileBroadcast',
|
|
159
166
|
|
|
160
167
|
getContexts: 'mobileGetContexts',
|
|
161
168
|
|
|
162
169
|
installMultipleApks: 'mobileInstallMultipleApks',
|
|
170
|
+
|
|
171
|
+
unlock: 'mobileUnlock',
|
|
163
172
|
};
|
|
164
173
|
|
|
165
174
|
if (!_.has(mobileCommandsMapping, mobileCommand)) {
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"automated testing",
|
|
8
8
|
"android"
|
|
9
9
|
],
|
|
10
|
-
"version": "1.
|
|
10
|
+
"version": "1.70.1",
|
|
11
11
|
"author": "appium",
|
|
12
12
|
"license": "Apache-2.0",
|
|
13
13
|
"repository": {
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@babel/runtime": "^7.0.0",
|
|
44
44
|
"appium-adb": "^8.10.0",
|
|
45
|
-
"appium-android-driver": "^4.
|
|
45
|
+
"appium-android-driver": "^4.50.0",
|
|
46
46
|
"appium-base-driver": "^7.0.0",
|
|
47
47
|
"appium-chromedriver": "^4.23.1",
|
|
48
48
|
"appium-support": "^2.49.0",
|
|
49
|
-
"appium-uiautomator2-server": "^4.
|
|
49
|
+
"appium-uiautomator2-server": "^4.26.0",
|
|
50
50
|
"asyncbox": "^2.3.1",
|
|
51
51
|
"axios": "^0.x",
|
|
52
52
|
"bluebird": "^3.5.1",
|