appium-espresso-driver 1.48.0 → 2.0.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 +114 -8
- package/build/index.js +1 -1
- package/build/lib/commands/execute.js +7 -5
- package/build/lib/commands/general.js +21 -20
- package/build/lib/driver.js +11 -10
- package/build/lib/espresso-runner.js +18 -17
- package/build/lib/logger.js +3 -3
- package/build/lib/server-builder.js +11 -10
- package/build/lib/server.js +5 -5
- package/build/lib/utils.js +6 -6
- package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
- package/espresso-server/app/build.gradle.kts +13 -3
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/EspressoServerRunnerTest.kt +1 -2
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/DriverContext.kt +0 -8
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElement.kt +35 -4
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElements.kt +25 -5
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAttribute.kt +75 -10
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileBackdoor.kt +6 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RequestHandler.kt +14 -14
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ComposeNodeFinder.kt +12 -2
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AttributesEnum.kt +111 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ComposeNodeElement.kt +18 -24
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SourceDocument.kt +78 -51
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/DriverSetting.kt +1 -1
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithXPath.kt +4 -3
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/XpathQueryParserTests.kt +2 -2
- package/lib/commands/execute.js +6 -2
- package/lib/commands/general.js +3 -2
- package/lib/driver.js +24 -4
- package/lib/espresso-runner.js +3 -2
- package/lib/logger.js +1 -1
- package/lib/server-builder.js +5 -2
- package/lib/server.js +1 -1
- package/lib/utils.js +1 -1
- package/package.json +17 -14
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/AppDriver.kt +0 -26
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/ComposeDriver.kt +0 -61
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/EspressoDriver.kt +0 -122
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewAttributesEnum.kt +0 -51
package/README.md
CHANGED
|
@@ -61,7 +61,7 @@ appium:showGradleLog | Whether to include Gradle log to the regular server logs
|
|
|
61
61
|
|
|
62
62
|
Capability Name | Description
|
|
63
63
|
--- | ---
|
|
64
|
-
appium:app | Full path to the application to be tested (the app must be located on the same machine where the server is running).
|
|
64
|
+
appium:app | Full path to the application to be tested (the app must be located on the same machine where the server is running). Only `.apk` application extension is supported. `.aab` files need to be [converted](https://stackoverflow.com/questions/53040047/generate-apk-file-from-aab-file-android-app-bundle) to `.apk` format using [bundletool](https://developer.android.com/studio/command-line/bundletool) first in order to be used with this driver. Could also be an URL to a remote location. If neither of the `app` or `appPackage` capabilities are provided then the driver will fail to start a session. Also, if `app` capability is not provided it is expected that the app under test is already installed on the device under test and `noReset` is equal to `true`.
|
|
65
65
|
appium:appPackage | Application package identifier to be started. If not provided then Espresso will try to detect it automatically from the package provided by the `app` capability. Read [How To Troubleshoot Activities Startup](https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md) for more details
|
|
66
66
|
appium:appActivity | Main application activity identifier. If not provided then Espresso will try to detect it automatically from the package provided by the `app` capability. Read [How To Troubleshoot Activities Startup](https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md) for more details
|
|
67
67
|
appium:appWaitActivity | Identifier of the first activity that the application invokes. If not provided then equals to `appium:appActivity`. Read [How To Troubleshoot Activities Startup](https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md) for more details
|
|
@@ -134,6 +134,7 @@ Capability Name | Description
|
|
|
134
134
|
appium:skipUnlock | Whether to skip the check for lock screen presence (`true`). By default Espresso 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 `false` and disable screen locking on devices under test.
|
|
135
135
|
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.
|
|
136
136
|
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.
|
|
137
|
+
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.
|
|
137
138
|
appium:unlockSuccessTimeout | Maximum number of milliseconds to wait until the device is unlocked. `2000` ms by default
|
|
138
139
|
|
|
139
140
|
### Web Context
|
|
@@ -167,6 +168,42 @@ Capability Name | Description
|
|
|
167
168
|
appium:disableSuppressAccessibilityService | Being set to `true` tells the instrumentation process to not suppress accessibility services during the automated test. This might be useful if your automated test needs these services. `false` by default
|
|
168
169
|
|
|
169
170
|
|
|
171
|
+
## Settings API
|
|
172
|
+
|
|
173
|
+
Espresso driver supports Appium [Settings API](https://appium.io/docs/en/advanced-concepts/settings/).
|
|
174
|
+
Along with the common settings the following driver-specific settings are currently available:
|
|
175
|
+
|
|
176
|
+
Name | Type | Description
|
|
177
|
+
--- | --- | ---
|
|
178
|
+
driver | 'compose' or 'espresso' | The name of the subdriver to use for elements interactions. The default value is `espresso`. Switching the value to `compose` enables interactions with [Jetpack Compose](https://developer.android.com/jetpack/compose)-based application user interfaces. Read [Jetpack Compose Support](#jetpack-compose-support) for more details.
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
## Jetpack Compose Support
|
|
182
|
+
|
|
183
|
+
[Jetpack Compose](https://developer.android.com/jetpack/compose) is Android’s modern toolkit for building native UI. Espresso driver supports basic interactions with Compose-based applications since version *1.46.0*.
|
|
184
|
+
|
|
185
|
+
### Interaction With Compose Elements
|
|
186
|
+
|
|
187
|
+
Espresso driver has the concept of subdrivers. This works quite similarly to the concept of contexts, while contexts are used to switch between native and web, and subdrivers are still
|
|
188
|
+
under the native one. Each subdriver operates its own elements cache, so it is not be possible
|
|
189
|
+
to mix Espresso and Compose elements.
|
|
190
|
+
|
|
191
|
+
In order to change between subdrivers use the [driver](#settings-api) setting. Setting its value to `compose` modifies driver behavior in the way it interacts with Compose elements rather that with classic Android views. It is possible to switch between `espresso` and `compose` modes at any point of time. When `compose` mode is active the the following webdriver commands behave differently (as of driver version *1.50.0*):
|
|
192
|
+
- findElement(s): Element finding commands only support Compose-based locators. Read [Compose Elements Location](#compose-elements-location) for more details.
|
|
193
|
+
- getPageSource: The returned page source is retrieved from Compose and all elements there contain [Compose-specific](#compose-element-attributes) attributes.
|
|
194
|
+
- click, isDisplayed, isEnabled, clear, getText, sendKeys, getElementRect, getValue: These commands should properly support compose elements.
|
|
195
|
+
- getAttribute: Accepts and returns Compose-specific element attributes. See [Compose Element Attributes](#compose-element-attributes) for the full list of supported Compose element attributes.
|
|
196
|
+
|
|
197
|
+
Calling other driver element-specific APIs not listed above would most likely throw an exception as Compose and Espresso elements are being stored in completely separated internal caches and must not be mixed.
|
|
198
|
+
|
|
199
|
+
You could also check end-to-end tests for more examples on how to setup test capabilities and
|
|
200
|
+
on the Compose usage in general:
|
|
201
|
+
- https://github.com/appium/appium-espresso-driver/blob/master/test/functional/commands/jetpack-componse-element-values-e2e-specs.js
|
|
202
|
+
- https://github.com/appium/appium-espresso-driver/blob/master/test/functional/commands/jetpack-compose-attributes-e2e-specs.js
|
|
203
|
+
- https://github.com/appium/appium-espresso-driver/blob/master/test/functional/commands/jetpack-compose-e2e-specs.js
|
|
204
|
+
- https://github.com/appium/appium-espresso-driver/blob/master/test/functional/commands/jetpack-compose-e2e-specs.js
|
|
205
|
+
|
|
206
|
+
|
|
170
207
|
## Espresso Build Config
|
|
171
208
|
|
|
172
209
|
Espresso server is in tight connection with the application under test. That is why it is important that the server uses the same versions of common dependencies and there are no conflicts. Espresso driver allows to configure several build options via `espressoBuildConfig` capability. The configuration JSON supports the following entries:
|
|
@@ -184,6 +221,9 @@ buildTools | Target Android build tools version to compile the server with. By d
|
|
|
184
221
|
minSdk | Minimum Android SDK version to compile the server for. By default the version from the app [build.gradle.kts](https://github.com/appium/appium-espresso-driver/blob/master/espresso-server/app/build.gradle.kts) is used | 18
|
|
185
222
|
targetSdk | Target Android SDK version to compile the server for. By default the version from the app [build.gradle.kts](https://github.com/appium/appium-espresso-driver/blob/master/espresso-server/app/build.gradle.kts) is used | 28
|
|
186
223
|
kotlin | Kotlin version to compile the server for. By default the version from the [build.gradle.kts](https://github.com/appium/appium-espresso-driver/blob/master/espresso-server/build.gradle.kts) is used | '1.3.72'
|
|
224
|
+
sourceCompatibility | The minimum version of JVM the project sources are compatible with. The default value is `VERSION_1_8` | VERSION_12
|
|
225
|
+
sourceCompatibility | The target version of JVM the project sources are compatible with. The default value is `VERSION_1_8` | VERSION_12
|
|
226
|
+
jvmTarget | Target version of the generated JVM bytecode as a string. The default value is `1.8` | `1_10`
|
|
187
227
|
|
|
188
228
|
### additionalAppDependencies
|
|
189
229
|
|
|
@@ -251,9 +291,9 @@ Name | Type | Description | Example
|
|
|
251
291
|
launchDisplayId | string or int | Display id which you want to assign to launch the main app activity on. This might be useful if the device under test supports multiple displays | 1
|
|
252
292
|
|
|
253
293
|
|
|
254
|
-
## Element Attributes
|
|
294
|
+
## Espresso Element Attributes
|
|
255
295
|
|
|
256
|
-
Espresso driver supports the following element attributes:
|
|
296
|
+
Espresso driver supports the following element attributes in `espresso` subdriver:
|
|
257
297
|
|
|
258
298
|
Name | Description | Example
|
|
259
299
|
--- | --- | ---
|
|
@@ -281,9 +321,31 @@ visible | Whether the element is visible to the user | 'true'
|
|
|
281
321
|
view-tag | The tag value assigned to the element. Could be `null` | 'my tag'
|
|
282
322
|
|
|
283
323
|
|
|
284
|
-
## Element
|
|
324
|
+
## Compose Element Attributes
|
|
285
325
|
|
|
286
|
-
Espresso driver supports the following
|
|
326
|
+
Espresso driver supports the following element attributes in `compose` subdriver:
|
|
327
|
+
|
|
328
|
+
Name | Description | Example
|
|
329
|
+
--- | --- | ---
|
|
330
|
+
bounds | The element's visible frame (`[left, top][right, bottom]`) | `[0,0][100,100]`
|
|
331
|
+
checked | Whether the element is checked. Always `false` if the element is not checkable | 'false'
|
|
332
|
+
class | The full name of the element's class. Could be `ComposeNode` for some elements | 'ComposeNode'
|
|
333
|
+
clickable | Whether the element could be clicked | 'false'
|
|
334
|
+
content-desc | The content-description attribute of the accessible element | 'foo'
|
|
335
|
+
enabled | Whether the element could be clicked | 'true'
|
|
336
|
+
focused | Whether the element could is focused. Always `false` if the element is not focusable | 'false'
|
|
337
|
+
index | Element's index in the tree hierarchy | `0`
|
|
338
|
+
password | Whether the element is a password input field | 'true'
|
|
339
|
+
resource-id | Element's resource identifier. Could be `null` | 'com.mycompany:id/resId'
|
|
340
|
+
scrollable | Whether the element is scrollable | 'true'
|
|
341
|
+
selected | Whether the element is selected | 'false'
|
|
342
|
+
text | The element's text | 'my text'
|
|
343
|
+
view-tag | The [testTag](https://developer.android.com/reference/kotlin/androidx/compose/ui/platform/package-summary#(androidx.compose.ui.Modifier).testTag(kotlin.String)) element's value. Could be `null` | 'my tag'
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
## Espresso Elements Location
|
|
347
|
+
|
|
348
|
+
Espresso driver supports the following location strategies in `espresso` subdriver:
|
|
287
349
|
|
|
288
350
|
Name | Description | Example
|
|
289
351
|
--- | --- | ---
|
|
@@ -297,6 +359,18 @@ text | This strategy is mapped to the native Espresso `withText` [matcher](https
|
|
|
297
359
|
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\"]")`
|
|
298
360
|
|
|
299
361
|
|
|
362
|
+
## Compose Elements Location
|
|
363
|
+
|
|
364
|
+
Espresso driver supports the following location strategies in `compose` subdriver:
|
|
365
|
+
|
|
366
|
+
Name | Description | Example
|
|
367
|
+
--- | --- | ---
|
|
368
|
+
accessibility id | This strategy is mapped to the native Espresso `hasContentDescription` [matcher](https://developer.android.com/reference/kotlin/androidx/compose/ui/test/package-summary#hasContentDescription(kotlin.String,kotlin.Boolean,kotlin.Boolean)) (exact match of element's content description). | 'my description'
|
|
369
|
+
`-android viewtag` or `tag name` | This strategy is mapped to the native Compose `hasTestTag` [matcher](https://developer.android.com/reference/kotlin/androidx/compose/ui/test/package-summary#hasTestTag(kotlin.String)) (exact match of element's tag value). | 'my tag'
|
|
370
|
+
`text` or `link text` | This strategy is mapped to the native Compose `hasText` [matcher](https://developer.android.com/reference/kotlin/androidx/compose/ui/test/package-summary#hasText(kotlin.String,kotlin.Boolean,kotlin.Boolean)) (exact match of element's text). | 'my text'
|
|
371
|
+
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("//ComposeNode[@text=\"Regular\" and @selected=\"true\"]")`
|
|
372
|
+
|
|
373
|
+
|
|
300
374
|
## Platform-Specific Extensions
|
|
301
375
|
|
|
302
376
|
Beside of standard W3C APIs the driver provides the following custom command extensions to execute platform specific scenarios:
|
|
@@ -612,14 +686,33 @@ The example output is:
|
|
|
612
686
|
|
|
613
687
|
### mobile: sensorSet
|
|
614
688
|
|
|
615
|
-
Emulate
|
|
689
|
+
Emulate changing of sensor values on the connected emulator.
|
|
690
|
+
This extension does not work on real devices.
|
|
691
|
+
|
|
692
|
+
#### Arguments
|
|
693
|
+
|
|
694
|
+
Name | Type | Required | Description | Example
|
|
695
|
+
--- | --- | --- | --- | ---
|
|
696
|
+
sensorType | string | yes | The set of all supported sensor types could be found in [adb-emu-commands.js](https://github.com/appium/appium-adb/blob/master/lib/tools/adb-emu-commands.js) (look for *SENSORS* object values). Check the output of `sensor status` command in the [emulator console](https://developer.android.com/studio/run/emulator-console) to see more details on the available sensor types | light
|
|
697
|
+
value | string | yes | Check the output of `sensor get <sensorType>` command in the [emulator console](https://developer.android.com/studio/run/emulator-console) to see the acceptable value format for the given sensor type | 50
|
|
698
|
+
|
|
699
|
+
### mobile: refreshGpsCache
|
|
700
|
+
|
|
701
|
+
Sends a request to refresh the GPS cache on the device under test.
|
|
702
|
+
By default the location tracking is configured for
|
|
703
|
+
[low battery consumption](https://github.com/appium/io.appium.settings/blob/master/app/src/main/java/io/appium/settings/LocationTracker.java),
|
|
704
|
+
so you might need to call this extension periodically to get the updated geo
|
|
705
|
+
location if the actual (or mocked) device location is changed too frequently.
|
|
706
|
+
The feature only works if the device under test has Google Play Services installed.
|
|
707
|
+
In case the vanilla
|
|
708
|
+
[LocationManager](https://developer.android.com/reference/android/location/LocationManager)
|
|
709
|
+
is used the device API level must be at version 30 (Android R) or higher.
|
|
616
710
|
|
|
617
711
|
#### Arguments
|
|
618
712
|
|
|
619
713
|
Name | Type | Required | Description | Example
|
|
620
714
|
--- | --- | --- | --- | ---
|
|
621
|
-
|
|
622
|
-
value | string | yes | value to set to the sensor | 50
|
|
715
|
+
timeoutMs | number | no | The maximum number of milliseconds to block until GPS cache is refreshed. If the API call does not receive a confirmation about successful cache refresh within this timeout then an error is thrown. Providing zero or a negative value to it skips waiting completely and does not check for any errors. 20000 ms by default. | 60000
|
|
623
716
|
|
|
624
717
|
### mobile: deleteFile
|
|
625
718
|
|
|
@@ -792,6 +885,19 @@ Lists all the previously registered [idling resources](https://developer.android
|
|
|
792
885
|
|
|
793
886
|
List of fully qualified class names of currently registered idling resources or an empty list if no resources have been registered yet.
|
|
794
887
|
|
|
888
|
+
### mobile: unlock
|
|
889
|
+
|
|
890
|
+
Unlocks the device if it is locked. Noop if the device's screen is not locked.
|
|
891
|
+
|
|
892
|
+
#### Arguments
|
|
893
|
+
|
|
894
|
+
Name | Type | Required | Description | Example
|
|
895
|
+
--- | --- | --- | --- | ---
|
|
896
|
+
key | string | yes | The unlock key. See the documentation on [appium:unlockKey](#device-locking) capability for more details | 12345
|
|
897
|
+
type | string | yes | The unlock type. See the documentation on [appium:unlockType](#device-locking) capability for more details | password
|
|
898
|
+
strategy | string | no | Unlock strategy. See the documentation on [appium:unlockStrategy](#device-locking) capability for more details | uiautomator
|
|
899
|
+
timeoutMs | number | no | Unlock timeout. See the documentation on [appium:unlockSuccessTimeout](#device-locking) capability for more details | 5000
|
|
900
|
+
|
|
795
901
|
|
|
796
902
|
## Backdoor Extension Usage
|
|
797
903
|
|
package/build/index.js
CHANGED
|
@@ -5,7 +5,7 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.
|
|
8
|
+
exports.startServer = exports.default = exports.EspressoDriver = void 0;
|
|
9
9
|
|
|
10
10
|
require("source-map-support/register");
|
|
11
11
|
|
|
@@ -11,9 +11,9 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _baseDriver = require("@appium/base-driver");
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
const extensions = {};
|
|
17
17
|
|
|
18
18
|
extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}) {
|
|
19
19
|
const mobileCommandsMapping = {
|
|
@@ -50,11 +50,13 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
|
|
|
50
50
|
stopService: 'mobileStopService',
|
|
51
51
|
registerIdlingResources: 'mobileRegisterIdlingResources',
|
|
52
52
|
unregisterIdlingResources: 'mobileUnregisterIdlingResources',
|
|
53
|
-
listIdlingResources: 'mobileListIdlingResources'
|
|
53
|
+
listIdlingResources: 'mobileListIdlingResources',
|
|
54
|
+
unlock: 'mobileUnlock',
|
|
55
|
+
refreshGpsCache: 'mobileRefreshGpsCache'
|
|
54
56
|
};
|
|
55
57
|
|
|
56
58
|
if (!_lodash.default.has(mobileCommandsMapping, mobileCommand)) {
|
|
57
|
-
throw new
|
|
59
|
+
throw new _baseDriver.errors.UnknownCommandError(`Unknown mobile command "${mobileCommand}". ` + `Only ${_lodash.default.keys(mobileCommandsMapping)} commands are supported.`);
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
return await this[mobileCommandsMapping[mobileCommand]](opts);
|
|
@@ -64,4 +66,4 @@ var _default = extensions;
|
|
|
64
66
|
exports.default = _default;require('source-map-support').install();
|
|
65
67
|
|
|
66
68
|
|
|
67
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9leGVjdXRlLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJleGVjdXRlTW9iaWxlIiwibW9iaWxlQ29tbWFuZCIsIm9wdHMiLCJtb2JpbGVDb21tYW5kc01hcHBpbmciLCJzaGVsbCIsImV4ZWNFbXVDb25zb2xlQ29tbWFuZCIsInBlcmZvcm1FZGl0b3JBY3Rpb24iLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwic3RhcnRTY3JlZW5TdHJlYW1pbmciLCJzdG9wU2NyZWVuU3RyZWFtaW5nIiwic3dpcGUiLCJzY3JvbGxUb1BhZ2UiLCJuYXZpZ2F0ZVRvIiwiY2xpY2tBY3Rpb24iLCJkZXZpY2VJbmZvIiwiaXNUb2FzdFZpc2libGUiLCJvcGVuRHJhd2VyIiwiY2xvc2VEcmF3ZXIiLCJzZXREYXRlIiwic2V0VGltZSIsImdldERldmljZVRpbWUiLCJiYWNrZG9vciIsImZsYXNoRWxlbWVudCIsInVpYXV0b21hdG9yIiwidWlhdXRvbWF0b3JQYWdlU291cmNlIiwid2ViQXRvbXMiLCJnZXRDb250ZXh0cyIsImRpc21pc3NBdXRvZmlsbCIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwic2Vuc29yU2V0IiwiZGVsZXRlRmlsZSIsInN0YXJ0U2VydmljZSIsInN0b3BTZXJ2aWNlIiwicmVnaXN0ZXJJZGxpbmdSZXNvdXJjZXMiLCJ1bnJlZ2lzdGVySWRsaW5nUmVzb3VyY2VzIiwibGlzdElkbGluZ1Jlc291cmNlcyIsInVubG9jayIsInJlZnJlc2hHcHNDYWNoZSIsIl8iLCJoYXMiLCJlcnJvcnMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsRUFBbkI7O0FBRUFBLFVBQVUsQ0FBQ0MsYUFBWCxHQUEyQixlQUFlQSxhQUFmLENBQThCQyxhQUE5QixFQUE2Q0MsSUFBSSxHQUFHLEVBQXBELEVBQXdEO0FBQ2pGLFFBQU1DLHFCQUFxQixHQUFHO0FBQzVCQyxJQUFBQSxLQUFLLEVBQUUsYUFEcUI7QUFHNUJDLElBQUFBLHFCQUFxQixFQUFFLDZCQUhLO0FBSzVCQyxJQUFBQSxtQkFBbUIsRUFBRSwyQkFMTztBQU81QkMsSUFBQUEsaUJBQWlCLEVBQUUseUJBUFM7QUFRNUJDLElBQUFBLGNBQWMsRUFBRSxzQkFSWTtBQVU1QkMsSUFBQUEsb0JBQW9CLEVBQUUsNEJBVk07QUFXNUJDLElBQUFBLG1CQUFtQixFQUFFLDJCQVhPO0FBYTVCQyxJQUFBQSxLQUFLLEVBQUUsYUFicUI7QUFjNUJDLElBQUFBLFlBQVksRUFBRSxvQkFkYztBQWU1QkMsSUFBQUEsVUFBVSxFQUFFLGtCQWZnQjtBQWdCNUJDLElBQUFBLFdBQVcsRUFBRSxtQkFoQmU7QUFrQjVCQyxJQUFBQSxVQUFVLEVBQUUscUJBbEJnQjtBQW9CNUJDLElBQUFBLGNBQWMsRUFBRSxzQkFwQlk7QUFzQjVCQyxJQUFBQSxVQUFVLEVBQUUsa0JBdEJnQjtBQXVCNUJDLElBQUFBLFdBQVcsRUFBRSxtQkF2QmU7QUF5QjVCQyxJQUFBQSxPQUFPLEVBQUUsZUF6Qm1CO0FBMEI1QkMsSUFBQUEsT0FBTyxFQUFFLGVBMUJtQjtBQTRCNUJDLElBQUFBLGFBQWEsRUFBRSxxQkE1QmE7QUE4QjVCQyxJQUFBQSxRQUFRLEVBQUUsZ0JBOUJrQjtBQWdDNUJDLElBQUFBLFlBQVksRUFBRSxvQkFoQ2M7QUFrQzVCQyxJQUFBQSxXQUFXLEVBQUUsbUJBbENlO0FBbUM1QkMsSUFBQUEscUJBQXFCLEVBQUUsNkJBbkNLO0FBcUM1QkMsSUFBQUEsUUFBUSxFQUFFLGdCQXJDa0I7QUFzQzVCQyxJQUFBQSxXQUFXLEVBQUUsbUJBdENlO0FBd0M1QkMsSUFBQUEsZUFBZSxFQUFFLHVCQXhDVztBQTBDNUJDLElBQUFBLGdCQUFnQixFQUFFLHdCQTFDVTtBQTRDNUJDLElBQUFBLE9BQU8sRUFBRSxlQTVDbUI7QUE4QzVCQyxJQUFBQSxTQUFTLEVBQUUsV0E5Q2lCO0FBZ0Q1QkMsSUFBQUEsVUFBVSxFQUFFLGtCQWhEZ0I7QUFrRDVCQyxJQUFBQSxZQUFZLEVBQUUsb0JBbERjO0FBbUQ1QkMsSUFBQUEsV0FBVyxFQUFFLG1CQW5EZTtBQXFENUJDLElBQUFBLHVCQUF1QixFQUFFLCtCQXJERztBQXNENUJDLElBQUFBLHlCQUF5QixFQUFFLGlDQXREQztBQXVENUJDLElBQUFBLG1CQUFtQixFQUFFLDJCQXZETztBQXlENUJDLElBQUFBLE1BQU0sRUFBRSxjQXpEb0I7QUEyRDVCQyxJQUFBQSxlQUFlLEVBQUU7QUEzRFcsR0FBOUI7O0FBOERBLE1BQUksQ0FBQ0MsZ0JBQUVDLEdBQUYsQ0FBTXRDLHFCQUFOLEVBQTZCRixhQUE3QixDQUFMLEVBQWtEO0FBQ2hELFVBQU0sSUFBSXlDLG1CQUFPQyxtQkFBWCxDQUFnQywyQkFBMEIxQyxhQUFjLEtBQXpDLEdBQ2xDLFFBQU91QyxnQkFBRUksSUFBRixDQUFPekMscUJBQVAsQ0FBOEIsMEJBRGxDLENBQU47QUFFRDs7QUFDRCxTQUFPLE1BQU0sS0FBS0EscUJBQXFCLENBQUNGLGFBQUQsQ0FBMUIsRUFBMkNDLElBQTNDLENBQWI7QUFDRCxDQXBFRDs7ZUFzRWVILFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlTW9iaWxlID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZU1vYmlsZSAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG1vYmlsZUNvbW1hbmRzTWFwcGluZyA9IHtcbiAgICBzaGVsbDogJ21vYmlsZVNoZWxsJyxcblxuICAgIGV4ZWNFbXVDb25zb2xlQ29tbWFuZDogJ21vYmlsZUV4ZWNFbXVDb25zb2xlQ29tbWFuZCcsXG5cbiAgICBwZXJmb3JtRWRpdG9yQWN0aW9uOiAnbW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbicsXG5cbiAgICBjaGFuZ2VQZXJtaXNzaW9uczogJ21vYmlsZUNoYW5nZVBlcm1pc3Npb25zJyxcbiAgICBnZXRQZXJtaXNzaW9uczogJ21vYmlsZUdldFBlcm1pc3Npb25zJyxcblxuICAgIHN0YXJ0U2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcnLFxuICAgIHN0b3BTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nJyxcblxuICAgIHN3aXBlOiAnbW9iaWxlU3dpcGUnLFxuICAgIHNjcm9sbFRvUGFnZTogJ21vYmlsZVNjcm9sbFRvUGFnZScsXG4gICAgbmF2aWdhdGVUbzogJ21vYmlsZU5hdmlnYXRlVG8nLFxuICAgIGNsaWNrQWN0aW9uOiAnbW9iaWxlQ2xpY2tBY3Rpb24nLFxuXG4gICAgZGV2aWNlSW5mbzogJ21vYmlsZUdldERldmljZUluZm8nLFxuXG4gICAgaXNUb2FzdFZpc2libGU6ICdtb2JpbGVJc1RvYXN0VmlzaWJsZScsXG5cbiAgICBvcGVuRHJhd2VyOiAnbW9iaWxlT3BlbkRyYXdlcicsXG4gICAgY2xvc2VEcmF3ZXI6ICdtb2JpbGVDbG9zZURyYXdlcicsXG5cbiAgICBzZXREYXRlOiAnbW9iaWxlU2V0RGF0ZScsXG4gICAgc2V0VGltZTogJ21vYmlsZVNldFRpbWUnLFxuXG4gICAgZ2V0RGV2aWNlVGltZTogJ21vYmlsZUdldERldmljZVRpbWUnLFxuXG4gICAgYmFja2Rvb3I6ICdtb2JpbGVCYWNrZG9vcicsXG5cbiAgICBmbGFzaEVsZW1lbnQ6ICdtb2JpbGVGbGFzaEVsZW1lbnQnLFxuXG4gICAgdWlhdXRvbWF0b3I6ICdtb2JpbGVVaWF1dG9tYXRvcicsXG4gICAgdWlhdXRvbWF0b3JQYWdlU291cmNlOiAnbW9iaWxlVWlhdXRvbWF0b3JQYWdlU291cmNlJyxcblxuICAgIHdlYkF0b21zOiAnbW9iaWxlV2ViQXRvbXMnLFxuICAgIGdldENvbnRleHRzOiAnbW9iaWxlR2V0Q29udGV4dHMnLFxuXG4gICAgZGlzbWlzc0F1dG9maWxsOiAnbW9iaWxlRGlzbWlzc0F1dG9maWxsJyxcblxuICAgIGdldE5vdGlmaWNhdGlvbnM6ICdtb2JpbGVHZXROb3RpZmljYXRpb25zJyxcblxuICAgIGxpc3RTbXM6ICdtb2JpbGVMaXN0U21zJyxcblxuICAgIHNlbnNvclNldDogJ3NlbnNvclNldCcsXG5cbiAgICBkZWxldGVGaWxlOiAnbW9iaWxlRGVsZXRlRmlsZScsXG5cbiAgICBzdGFydFNlcnZpY2U6ICdtb2JpbGVTdGFydFNlcnZpY2UnLFxuICAgIHN0b3BTZXJ2aWNlOiAnbW9iaWxlU3RvcFNlcnZpY2UnLFxuXG4gICAgcmVnaXN0ZXJJZGxpbmdSZXNvdXJjZXM6ICdtb2JpbGVSZWdpc3RlcklkbGluZ1Jlc291cmNlcycsXG4gICAgdW5yZWdpc3RlcklkbGluZ1Jlc291cmNlczogJ21vYmlsZVVucmVnaXN0ZXJJZGxpbmdSZXNvdXJjZXMnLFxuICAgIGxpc3RJZGxpbmdSZXNvdXJjZXM6ICdtb2JpbGVMaXN0SWRsaW5nUmVzb3VyY2VzJyxcblxuICAgIHVubG9jazogJ21vYmlsZVVubG9jaycsXG5cbiAgICByZWZyZXNoR3BzQ2FjaGU6ICdtb2JpbGVSZWZyZXNoR3BzQ2FjaGUnLFxuICB9O1xuXG4gIGlmICghXy5oYXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nLCBtb2JpbGVDb21tYW5kKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkNvbW1hbmRFcnJvcihgVW5rbm93biBtb2JpbGUgY29tbWFuZCBcIiR7bW9iaWxlQ29tbWFuZH1cIi4gYCArXG4gICAgICBgT25seSAke18ua2V5cyhtb2JpbGVDb21tYW5kc01hcHBpbmcpfSBjb21tYW5kcyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzW21vYmlsZUNvbW1hbmRzTWFwcGluZ1ttb2JpbGVDb21tYW5kXV0ob3B0cyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZXhlY3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
@@ -5,19 +5,19 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.
|
|
8
|
+
exports.helpers = exports.default = exports.commands = void 0;
|
|
9
9
|
|
|
10
10
|
require("source-map-support/register");
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _support = require("@appium/support");
|
|
15
15
|
|
|
16
16
|
var _logger = _interopRequireDefault(require("../logger"));
|
|
17
17
|
|
|
18
18
|
var _validate = _interopRequireDefault(require("validate.js"));
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var _baseDriver = require("@appium/base-driver");
|
|
21
21
|
|
|
22
22
|
var _utils = require("../utils");
|
|
23
23
|
|
|
@@ -44,15 +44,15 @@ function assertRequiredOptions(options, requiredOptionNames) {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
commands.launchApp = async function launchApp() {
|
|
47
|
-
throw new
|
|
47
|
+
throw new _baseDriver.errors.UnsupportedOperationError('Please create a new session in order to launch the application under test');
|
|
48
48
|
};
|
|
49
49
|
|
|
50
50
|
commands.closeApp = async function closeApp() {
|
|
51
|
-
throw new
|
|
51
|
+
throw new _baseDriver.errors.UnsupportedOperationError('Please quit the session in order to close the application under test');
|
|
52
52
|
};
|
|
53
53
|
|
|
54
54
|
commands.reset = async function reset() {
|
|
55
|
-
throw new
|
|
55
|
+
throw new _baseDriver.errors.UnsupportedOperationError('Please quit the session and create a new one ' + 'in order to close and launch the application under test');
|
|
56
56
|
};
|
|
57
57
|
|
|
58
58
|
commands.getClipboard = async function getClipboard() {
|
|
@@ -77,7 +77,7 @@ commands.mobileSwipe = async function mobileSwipe(opts = {}) {
|
|
|
77
77
|
endCoordinates,
|
|
78
78
|
precisionDescriber
|
|
79
79
|
} = assertRequiredOptions(opts, ['element']);
|
|
80
|
-
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${
|
|
80
|
+
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/swipe`, 'POST', {
|
|
81
81
|
direction,
|
|
82
82
|
element,
|
|
83
83
|
swiper,
|
|
@@ -97,7 +97,7 @@ commands.mobileIsToastVisible = async function mobileIsToastVisible(opts = {}) {
|
|
|
97
97
|
isRegexp
|
|
98
98
|
} = opts;
|
|
99
99
|
|
|
100
|
-
if (!
|
|
100
|
+
if (!_support.util.hasValue(text)) {
|
|
101
101
|
_logger.default.errorAndThrow(`'text' argument is mandatory`);
|
|
102
102
|
}
|
|
103
103
|
|
|
@@ -112,7 +112,7 @@ commands.mobileOpenDrawer = async function mobileOpenDrawer(opts = {}) {
|
|
|
112
112
|
element,
|
|
113
113
|
gravity
|
|
114
114
|
} = assertRequiredOptions(opts, ['element']);
|
|
115
|
-
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${
|
|
115
|
+
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/open_drawer`, 'POST', {
|
|
116
116
|
gravity
|
|
117
117
|
});
|
|
118
118
|
};
|
|
@@ -122,7 +122,7 @@ commands.mobileCloseDrawer = async function mobileCloseDrawer(opts = {}) {
|
|
|
122
122
|
element,
|
|
123
123
|
gravity
|
|
124
124
|
} = assertRequiredOptions(opts, ['element']);
|
|
125
|
-
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${
|
|
125
|
+
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/close_drawer`, 'POST', {
|
|
126
126
|
gravity
|
|
127
127
|
});
|
|
128
128
|
};
|
|
@@ -134,7 +134,7 @@ commands.mobileSetDate = async function mobileSetDate(opts = {}) {
|
|
|
134
134
|
monthOfYear,
|
|
135
135
|
dayOfMonth
|
|
136
136
|
} = assertRequiredOptions(opts, ['element', 'year', 'monthOfYear', 'dayOfMonth']);
|
|
137
|
-
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${
|
|
137
|
+
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/set_date`, 'POST', {
|
|
138
138
|
year,
|
|
139
139
|
monthOfYear,
|
|
140
140
|
dayOfMonth
|
|
@@ -147,7 +147,7 @@ commands.mobileSetTime = async function mobileSetTime(opts = {}) {
|
|
|
147
147
|
hours,
|
|
148
148
|
minutes
|
|
149
149
|
} = assertRequiredOptions(opts, ['element', 'hours', 'minutes']);
|
|
150
|
-
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${
|
|
150
|
+
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/set_time`, 'POST', {
|
|
151
151
|
hours,
|
|
152
152
|
minutes
|
|
153
153
|
});
|
|
@@ -166,7 +166,7 @@ commands.mobileNavigateTo = async function mobileNavigateTo(opts = {}) {
|
|
|
166
166
|
menuItemId = menuItemIdAsNumber;
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
-
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${
|
|
169
|
+
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/navigate_to`, 'POST', {
|
|
170
170
|
menuItemId
|
|
171
171
|
});
|
|
172
172
|
};
|
|
@@ -201,7 +201,7 @@ commands.mobileScrollToPage = async function mobileScrollToPage(opts = {}) {
|
|
|
201
201
|
}
|
|
202
202
|
});
|
|
203
203
|
|
|
204
|
-
if (
|
|
204
|
+
if (_support.util.hasValue(res)) {
|
|
205
205
|
_logger.default.errorAndThrow(`Invalid scrollTo parameters: ${JSON.stringify(res)}`);
|
|
206
206
|
}
|
|
207
207
|
|
|
@@ -212,11 +212,11 @@ commands.mobileScrollToPage = async function mobileScrollToPage(opts = {}) {
|
|
|
212
212
|
smoothScroll
|
|
213
213
|
} = opts;
|
|
214
214
|
|
|
215
|
-
if (
|
|
215
|
+
if (_support.util.hasValue(scrollTo) && _support.util.hasValue(scrollToPage)) {
|
|
216
216
|
_logger.default.warn(`'scrollTo' and 'scrollToPage' where both provided. Defaulting to 'scrollTo'`);
|
|
217
217
|
}
|
|
218
218
|
|
|
219
|
-
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${
|
|
219
|
+
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/scroll_to_page`, 'POST', {
|
|
220
220
|
scrollTo,
|
|
221
221
|
scrollToPage,
|
|
222
222
|
smoothScroll
|
|
@@ -271,7 +271,7 @@ commands.mobileFlashElement = async function mobileFlashElement(opts = {}) {
|
|
|
271
271
|
durationMillis,
|
|
272
272
|
repeatCount
|
|
273
273
|
} = opts;
|
|
274
|
-
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${
|
|
274
|
+
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/flash`, 'POST', {
|
|
275
275
|
durationMillis,
|
|
276
276
|
repeatCount
|
|
277
277
|
});
|
|
@@ -286,7 +286,7 @@ commands.mobileClickAction = async function mobileClickAction(opts = {}) {
|
|
|
286
286
|
inputDevice,
|
|
287
287
|
buttonState
|
|
288
288
|
} = assertRequiredOptions(opts, ['element']);
|
|
289
|
-
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${
|
|
289
|
+
return await this.espresso.jwproxy.command(`/appium/execute_mobile/${_support.util.unwrapElement(element)}/click_action`, 'POST', {
|
|
290
290
|
tapper,
|
|
291
291
|
coordinatesProvider,
|
|
292
292
|
precisionDescriber,
|
|
@@ -308,6 +308,7 @@ commands.getSettings = async function getSettings() {
|
|
|
308
308
|
helpers.suspendChromedriverProxy = function suspendChromedriverProxy() {
|
|
309
309
|
this.chromedriver = null;
|
|
310
310
|
this.proxyReqRes = this.espresso.proxyReqRes.bind(this.espresso);
|
|
311
|
+
this.proxyCommand = this.espresso.proxyCommand.bind(this.espresso);
|
|
311
312
|
this.jwpProxyActive = true;
|
|
312
313
|
};
|
|
313
314
|
|
|
@@ -330,7 +331,7 @@ commands.mobileDismissAutofill = async function mobileDismissAutofill(opts = {})
|
|
|
330
331
|
const {
|
|
331
332
|
element
|
|
332
333
|
} = assertRequiredOptions(opts, ['element']);
|
|
333
|
-
await this.espresso.jwproxy.command(`/session/:sessionId/appium/execute_mobile/${
|
|
334
|
+
await this.espresso.jwproxy.command(`/session/:sessionId/appium/execute_mobile/${_support.util.unwrapElement(element)}/dismiss_autofill`, 'POST', {});
|
|
334
335
|
};
|
|
335
336
|
|
|
336
337
|
Object.assign(extensions, commands, helpers);
|
|
@@ -338,4 +339,4 @@ var _default = extensions;
|
|
|
338
339
|
exports.default = _default;require('source-map-support').install();
|
|
339
340
|
|
|
340
341
|
|
|
341
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJhc3NlcnRSZXF1aXJlZE9wdGlvbnMiLCJvcHRpb25zIiwicmVxdWlyZWRPcHRpb25OYW1lcyIsIl8iLCJpc0FycmF5IiwicHJlc2VudE9wdGlvbk5hbWVzIiwia2V5cyIsIm1pc3NpbmdPcHRpb25OYW1lcyIsImRpZmZlcmVuY2UiLCJpc0VtcHR5IiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwibGF1bmNoQXBwIiwiZXJyb3JzIiwiVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvciIsImNsb3NlQXBwIiwicmVzZXQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImVzcHJlc3NvIiwiandwcm94eSIsImNvbW1hbmQiLCJtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIiwib3B0cyIsImFjdGlvbiIsIm1vYmlsZVN3aXBlIiwiZGlyZWN0aW9uIiwiZWxlbWVudCIsInN3aXBlciIsInN0YXJ0Q29vcmRpbmF0ZXMiLCJlbmRDb29yZGluYXRlcyIsInByZWNpc2lvbkRlc2NyaWJlciIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsIm1vYmlsZUlzVG9hc3RWaXNpYmxlIiwidGV4dCIsImlzUmVnZXhwIiwiaGFzVmFsdWUiLCJsb2dnZXIiLCJlcnJvckFuZFRocm93IiwibW9iaWxlT3BlbkRyYXdlciIsImdyYXZpdHkiLCJtb2JpbGVDbG9zZURyYXdlciIsIm1vYmlsZVNldERhdGUiLCJ5ZWFyIiwibW9udGhPZlllYXIiLCJkYXlPZk1vbnRoIiwibW9iaWxlU2V0VGltZSIsImhvdXJzIiwibWludXRlcyIsIm1vYmlsZU5hdmlnYXRlVG8iLCJtZW51SXRlbUlkIiwibWVudUl0ZW1JZEFzTnVtYmVyIiwicGFyc2VJbnQiLCJpc05hTiIsIm1vYmlsZVdlYkF0b21zIiwiZ2V0RGlzcGxheURlbnNpdHkiLCJtb2JpbGVTY3JvbGxUb1BhZ2UiLCJzY3JvbGxUb1R5cGVzIiwicmVzIiwicHJlc2VuY2UiLCJzY3JvbGxUbyIsImluY2x1c2lvbiIsIndpdGhpbiIsIm1lc3NhZ2UiLCJqb2luIiwic2Nyb2xsVG9QYWdlIiwibnVtZXJpY2FsaXR5Iiwib25seUludGVnZXIiLCJncmVhdGVyVGhhbk9yRXF1YWxUbyIsInNtb290aFNjcm9sbCIsIndhcm4iLCJtb2JpbGVCYWNrZG9vciIsInRhcmdldCIsIm1ldGhvZHMiLCJlbGVtZW50SWQiLCJ0YXJnZXRFbGVtZW50IiwibW9iaWxlVWlhdXRvbWF0b3IiLCJzdHJhdGVneSIsImxvY2F0b3IiLCJpbmRleCIsIm1vYmlsZVVpYXV0b21hdG9yUGFnZVNvdXJjZSIsIm1vYmlsZUZsYXNoRWxlbWVudCIsImR1cmF0aW9uTWlsbGlzIiwicmVwZWF0Q291bnQiLCJtb2JpbGVDbGlja0FjdGlvbiIsInRhcHBlciIsImNvb3JkaW5hdGVzUHJvdmlkZXIiLCJpbnB1dERldmljZSIsImJ1dHRvblN0YXRlIiwidXBkYXRlU2V0dGluZ3MiLCJzZXR0aW5ncyIsImdldFNldHRpbmdzIiwic3VzcGVuZENocm9tZWRyaXZlclByb3h5IiwiY2hyb21lZHJpdmVyIiwicHJveHlSZXFSZXMiLCJiaW5kIiwiandwUHJveHlBY3RpdmUiLCJzdGFydEFjdGl2aXR5IiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJjYXBzIiwiZGVidWciLCJ3YWl0Rm9yQWN0aXZpdHkiLCJtb2JpbGVEaXNtaXNzQXV0b2ZpbGwiLCJPYmplY3QiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsSUFBSUEsUUFBUSxHQUFHLEVBQWY7QUFBQSxJQUFtQkMsT0FBTyxHQUFHLEVBQTdCO0FBQUEsSUFBaUNDLFVBQVUsR0FBRyxFQUE5Qzs7OztBQUVBLFNB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QXFCLENBQUN5QixJQUFELEVBQU8sQ0FBQyxTQUFELENBQVAsQ0FBdkM7QUFDQSxRQUFNLEtBQUtKLFFBQUwsQ0FBY0MsT0FBZCxDQUFzQkMsT0FBdEIsQ0FDSCw2Q0FBNENXLG9CQUFLQyxhQUFMLENBQW1CTixPQUFuQixDQUE0QixtQkFEckUsRUFDeUYsTUFEekYsRUFDaUcsRUFEakcsQ0FBTjtBQUVELENBSkQ7O0FBTUFpRixNQUFNLENBQUNDLE1BQVAsQ0FBY2hILFVBQWQsRUFBMEJGLFFBQTFCLEVBQW9DQyxPQUFwQztlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAndmFsaWRhdGUuanMnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IHF1YWxpZnlBY3Rpdml0eU5hbWUgfSBmcm9tICcuLi91dGlscyc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gYXNzZXJ0UmVxdWlyZWRPcHRpb25zIChvcHRpb25zLCByZXF1aXJlZE9wdGlvbk5hbWVzKSB7XG4gIGlmICghXy5pc0FycmF5KHJlcXVpcmVkT3B0aW9uTmFtZXMpKSB7XG4gICAgcmVxdWlyZWRPcHRpb25OYW1lcyA9IFtyZXF1aXJlZE9wdGlvbk5hbWVzXTtcbiAgfVxuICBjb25zdCBwcmVzZW50T3B0aW9uTmFtZXMgPSBfLmtleXMob3B0aW9ucyk7XG4gIGNvbnN0IG1pc3NpbmdPcHRpb25OYW1lcyA9IF8uZGlmZmVyZW5jZShyZXF1aXJlZE9wdGlvbk5hbWVzLCBwcmVzZW50T3B0aW9uTmFtZXMpO1xuICBpZiAoXy5pc0VtcHR5KG1pc3NpbmdPcHRpb25OYW1lcykpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcmVxdWlyZWQ6ICR7SlNPTi5zdHJpbmdpZnkobWlzc2luZ09wdGlvbk5hbWVzKX0uIGAgK1xuICAgIGBZb3UgaGF2ZSBvbmx5IHByb3ZpZGVkOiAke0pTT04uc3RyaW5naWZ5KHByZXNlbnRPcHRpb25OYW1lcyl9YCk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF3YWl0XG5jb21tYW5kcy5sYXVuY2hBcHAgPSBhc3luYyBmdW5jdGlvbiBsYXVuY2hBcHAgKCkge1xuICB0aHJvdyBuZXcgZXJyb3JzLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoJ1BsZWFzZSBjcmVhdGUgYSBuZXcgc2Vzc2lvbiBpbiBvcmRlciB0byBsYXVuY2ggdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QnKTtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF3YWl0XG5jb21tYW5kcy5jbG9zZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQXBwICgpIHtcbiAgdGhyb3cgbmV3IGVycm9ycy5VbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKCdQbGVhc2UgcXVpdCB0aGUgc2Vzc2lvbiBpbiBvcmRlciB0byBjbG9zZSB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCcpO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXdhaXRcbmNvbW1hbmRzLnJlc2V0ID0gYXN5bmMgZnVuY3Rpb24gcmVzZXQgKCkge1xuICB0aHJvdyBuZXcgZXJyb3JzLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXG4gICAgJ1BsZWFzZSBxdWl0IHRoZSBzZXNzaW9uIGFuZCBjcmVhdGUgYSBuZXcgb25lICcgK1xuICAgICdpbiBvcmRlciB0byBjbG9zZSBhbmQgbGF1bmNoIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0Jyk7XG59O1xuXG5jb21tYW5kcy5nZXRDbGlwYm9hcmQgPSBhc3luYyBmdW5jdGlvbiBnZXRDbGlwYm9hcmQgKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyOSlcbiAgICA/IChhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvZ2V0X2NsaXBib2FyZCcsICdQT1NUJywge30pKVxuICAgIDogKGF3YWl0IHRoaXMuYWRiLmdldENsaXBib2FyZCgpKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2FjdGlvbn0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydhY3Rpb24nXSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvcGVyZm9ybV9lZGl0b3JfYWN0aW9uJywgJ1BPU1QnLCB7YWN0aW9ufSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVTd2lwZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN3aXBlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2RpcmVjdGlvbiwgZWxlbWVudCwgc3dpcGVyLCBzdGFydENvb3JkaW5hdGVzLCBlbmRDb29yZGluYXRlcywgcHJlY2lzaW9uRGVzY3JpYmVyfSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnQnXSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vc3dpcGVgLCAnUE9TVCcsIHtcbiAgICBkaXJlY3Rpb24sIGVsZW1lbnQsIHN3aXBlciwgc3RhcnRDb29yZGluYXRlcywgZW5kQ29vcmRpbmF0ZXMsIHByZWNpc2lvbkRlc2NyaWJlclxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZUluZm8gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXREZXZpY2VJbmZvICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9pbmZvJywgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMubW9iaWxlSXNUb2FzdFZpc2libGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVJc1RvYXN0VmlzaWJsZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHt0ZXh0LCBpc1JlZ2V4cH0gPSBvcHRzO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUodGV4dCkpIHtcbiAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgJ3RleHQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9leGVjdXRlX21vYmlsZS9pc190b2FzdF9kaXNwbGF5ZWQnLCAnUE9TVCcsIHtcbiAgICB0ZXh0LFxuICAgIGlzUmVnZXhwLFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZU9wZW5EcmF3ZXIgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVPcGVuRHJhd2VyIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnQsIGdyYXZpdHl9ID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnZWxlbWVudCddKTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L29wZW5fZHJhd2VyYCwgJ1BPU1QnLCB7XG4gICAgZ3Jhdml0eVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZUNsb3NlRHJhd2VyID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2xvc2VEcmF3ZXIgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudCwgZ3Jhdml0eX0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vY2xvc2VfZHJhd2VyYCwgJ1BPU1QnLCB7XG4gICAgZ3Jhdml0eVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVNldERhdGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTZXREYXRlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnQsIHllYXIsIG1vbnRoT2ZZZWFyLCBkYXlPZk1vbnRofSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnQnLCAneWVhcicsICdtb250aE9mWWVhcicsICdkYXlPZk1vbnRoJ10pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vc2V0X2RhdGVgLCAnUE9TVCcsIHtcbiAgICB5ZWFyLFxuICAgIG1vbnRoT2ZZZWFyLFxuICAgIGRheU9mTW9udGgsXG4gIH0pO1xufTtcblxuY29tbWFuZHMubW9iaWxlU2V0VGltZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNldFRpbWUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudCwgaG91cnMsIG1pbnV0ZXN9ID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnZWxlbWVudCcsICdob3VycycsICdtaW51dGVzJ10pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vc2V0X3RpbWVgLCAnUE9TVCcsIHtcbiAgICBob3VycyxcbiAgICBtaW51dGVzLFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZU5hdmlnYXRlVG8gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVOYXZpZ2F0ZVRvIChvcHRzID0ge30pIHtcbiAgbGV0IHtlbGVtZW50LCBtZW51SXRlbUlkfSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ21lbnVJdGVtSWQnLCAnZWxlbWVudCddKTtcblxuICBsZXQgbWVudUl0ZW1JZEFzTnVtYmVyID0gcGFyc2VJbnQobWVudUl0ZW1JZCwgMTApO1xuICBpZiAoXy5pc05hTihtZW51SXRlbUlkQXNOdW1iZXIpIHx8IG1lbnVJdGVtSWRBc051bWJlciA8IDApIHtcbiAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgJ21lbnVJdGVtSWQnIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBGb3VuZCAke21lbnVJdGVtSWR9YCk7XG4gICAgbWVudUl0ZW1JZCA9IG1lbnVJdGVtSWRBc051bWJlcjtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vbmF2aWdhdGVfdG9gLCAnUE9TVCcsIHtcbiAgICBtZW51SXRlbUlkXG4gIH0pO1xufTtcblxuLyoqXG4gKiBSdW5zIGEgY2hhaW4gb2YgRXNwcmVzc28gd2ViIGF0b21zIChzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vdHJhaW5pbmcvdGVzdGluZy9lc3ByZXNzby93ZWIgZm9yIHJlZmVyZW5jZSlcbiAqXG4gKiBUYWtlcyBKU09OIG9mIHRoZSBmb3JtXG4gKlxuICoge1xuICogICBcIndlYnZpZXdFbFwiOiBcIjxFTEVNRU5UX0lEPlwiLCAvLyBvcHRpb25hbCB3ZWJ2aWV3IGVsZW1lbnQgdG8gb3BlcmF0ZSBvblxuICogICBcImZvcmNlSmF2YXNjcmlwdEVuYWJsZWRcIjogdHJ1ZXxmYWxzZSwgLy8gaWYgd2VidmlldyBkaXNhYmxlcyBqYXZhc2NyaXB0LCB3ZWJhdG9tcyB3b24ndCB3b3JrLCB0aGlzIGZvcmNlcyBpdFxuICogICBcIm1ldGhvZENoYWluXCI6IFtcbiAqICAgICB7XCJuYW1lXCI6IFwibWV0aG9kTmFtZVwiLCBcImF0b21cIjoge1wibmFtZVwiOiBcImF0b21OYW1lXCIsIFwiYXJnc1wiOiBbXCJhcmcxXCIsIFwiYXJnMlwiLCAuLi5dfX0sXG4gKiAgICAgLi4uXG4gKiAgIF1cbiAqIH1cbiAqXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVdlYkF0b21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlV2ViQXRvbXMgKG9wdHMgPSB7fSkge1xuICBvcHRzID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnbWV0aG9kQ2hhaW4nXSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS93ZWJfYXRvbXNgLCAnUE9TVCcsIG9wdHMpO1xufTtcblxuY29tbWFuZHMuZ2V0RGlzcGxheURlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXREaXNwbGF5RGVuc2l0eSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvZGlzcGxheV9kZW5zaXR5JywgJ0dFVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVNjcm9sbFRvUGFnZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNjcm9sbFRvUGFnZSAob3B0cyA9IHt9KSB7XG5cbiAgLy8gVmFsaWRhdGUgdGhlIHBhcmFtZXRlcnNcbiAgY29uc3Qgc2Nyb2xsVG9UeXBlcyA9IFsnZmlyc3QnLCAnbGFzdCcsICdsZWZ0JywgJ3JpZ2h0J107XG4gIGNvbnN0IHJlcyA9IHZhbGlkYXRlKG9wdHMsIHtcbiAgICBlbGVtZW50OiB7cHJlc2VuY2U6IHRydWV9LFxuICAgIHNjcm9sbFRvOiB7XG4gICAgICBpbmNsdXNpb246IHtcbiAgICAgICAgd2l0aGluOiBzY3JvbGxUb1R5cGVzLFxuICAgICAgICBtZXNzYWdlOiBgXCJzY3JvbGxUb1wiIG11c3QgYmUgb25lIG9mIFwiJHtzY3JvbGxUb1R5cGVzLmpvaW4oJywgJyl9XCIgZm91bmQgJyV7dmFsdWV9J2AsXG4gICAgICB9XG4gICAgfSxcbiAgICBzY3JvbGxUb1BhZ2U6IHtcbiAgICAgIG51bWVyaWNhbGl0eToge1xuICAgICAgICBvbmx5SW50ZWdlcjogdHJ1ZSxcbiAgICAgICAgZ3JlYXRlclRoYW5PckVxdWFsVG86IDAsXG4gICAgICAgIG1lc3NhZ2U6IGBcInNjcm9sbFRvUGFnZVwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4gRm91bmQgJyV7dmFsdWV9J2BcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKHV0aWwuaGFzVmFsdWUocmVzKSkge1xuICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBJbnZhbGlkIHNjcm9sbFRvIHBhcmFtZXRlcnM6ICR7SlNPTi5zdHJpbmdpZnkocmVzKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHtlbGVtZW50LCBzY3JvbGxUbywgc2Nyb2xsVG9QYWdlLCBzbW9vdGhTY3JvbGx9ID0gb3B0cztcblxuICBpZiAodXRpbC5oYXNWYWx1ZShzY3JvbGxUbykgJiYgdXRpbC5oYXNWYWx1ZShzY3JvbGxUb1BhZ2UpKSB7XG4gICAgbG9nZ2VyLndhcm4oYCdzY3JvbGxUbycgYW5kICdzY3JvbGxUb1BhZ2UnIHdoZXJlIGJvdGggcHJvdmlkZWQuIERlZmF1bHRpbmcgdG8gJ3Njcm9sbFRvJ2ApO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2V4ZWN1dGVfbW9iaWxlLyR7dXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnQpfS9zY3JvbGxfdG9fcGFnZWAsICdQT1NUJywge1xuICAgIHNjcm9sbFRvLFxuICAgIHNjcm9sbFRvUGFnZSxcbiAgICBzbW9vdGhTY3JvbGwsXG4gIH0pO1xufTtcblxuXG4vKipcbiAqICBBUEkgdG8gaW52b2tlIG1ldGhvZHMgZGVmaW5lZCBpbiBBbmRyb2lkIGFwcC5cbiAqXG4gKiAgRXhhbXBsZSBkYXRhXG4gKiAge1xuICogICB0YXJnZXQ6ICdhY3Rpdml0eScsXG4gKiAgIG1ldGhvZHM6XG4gKiAgICAgICAgIFtcbiAqICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgIG5hbWU6IFwic29tZU1ldGhvZFwiLFxuICogICAgICAgICAgIH0sXG4gKiAgICAgICAgICAge1xuICogICAgICAgICAgICAgICBuYW1lOiBcImFub3RoZXJNZXRob2RcIixcbiAqICAgICAgICAgICAgICAgYXJnczpcbiAqICAgICAgICAgICAgICAgICAgIFtcbiAqICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWU6IFwiTG9sXCIsIHR5cGU6ICdqYXZhLmxhbmcuQ2hhclNlcXVlbmNlJ30sXG4gKiAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlOiAxLCB0eXBlOiAnaW50J31cbiAqICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICB9XG4gKiAgICAgICAgIF1cbiAqIH1cbiAqXG4gKiBJbiBhYm92ZSBleGFtcGxlLCBtZXRob2QgXCJzb21lTWV0aG9kXCIgd2lsbCBiZSBpbnZva2VkIG9uICdhY3Rpdml0eScuIE9uIHRoZSByZXN1bHQsIFwiYW5vdGhlck1ldGhvZFwiIHdpbGwgYmUgaW52b2tlZFxuICogIFwidGFyZ2V0XCIgY2FuIGJlIGVpdGhlciAnYWN0aXZpdHknLCAnYXBwbGljYXRpb24nIG9yICdlbGVtZW50J1xuICogIElmIHRhcmdldCBpcyBzZXQgdG8gJ2FwcGxpY2F0aW9uJywgbWV0aG9kcyB3aWxsIGJlIGludm9rZWQgb24gYXBwbGljYXRpb24gY2xhc3NcbiAqICBJZiB0YXJnZXQgaXMgc2V0IHRvICdhY3Rpdml0eScsIG1ldGhvZHMgd2lsbCBiZSBpbnZva2VkIG9uIGN1cnJlbnQgYWN0aXZpdHlcbiAqICBJZiB0YXJnZXQgaXMgc2V0IHRvICdlbGVtZW50JywgJ2VsZW1lbnRJZCcgbXVzdCBiZSBzcGVjaWZpZWRcbiAqXG4gKiAtIE9ubHkgJ1B1YmxpYycgbWV0aG9kcyBjYW4gYmUgaW52b2tlZC4gKCdvcGVuJyBtb2RpZmlyZSBpcyBuZWNlc3NhcnkgaW4gS290bGluKVxuICogLSBmb2xsb3dpbmcgcHJpbWl0aXZlIHR5cGVzIGFyZSBzdXBwb3J0ZWQ6IFwiaW50XCIsIFwiYm9vbGVhblwiLCBcImJ5dGVcIiwgXCJzaG9ydFwiLCBcImxvbmdcIiwgXCJmbG9hdFwiLCBcImNoYXJcIlxuICogLSAgTm9uLXByaW1pdGl2ZSB0eXBlcyB3aXRoIGZ1bGx5IHF1YWxpZmllZCBuYW1lIFwiamF2YS5sYW5nLipcIiBpcyBhbHNvIHN1cHBvcnRlZDpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWcuIFwiamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVwiLCBcImphdmEubGFuZy5TdHJpbmdcIiwgXCJqYXZhLmxhbmcuSW50ZWdlclwiLCBcImphdmEubGFuZy5GbG9hdFwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImphdmEubGFuZy5Eb3VibGVcIiwgXCJqYXZhLmxhbmcuQm9vbGVhblwiLCBcImphdmEubGFuZy5Mb25nXCIsIFwiamF2YS5sYW5nLlNob3J0XCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiamF2YS5sYW5nLkNoYXJhY3RlclwiIGV0Yy4uLlxuICpcbiAqXG4gKiBAdGhyb3dzICB7RXJyb3J9IGlmIHRhcmdldCBpcyBub3QgJ2FjdGl2aXR5JyBvciAnYXBwbGljYXRpb24nXG4gKiBAdGhyb3dzICB7RXJyb3J9IGlmIGEgbWV0aG9kIGlzIG5vdCBmb3VuZCB3aXRoIGdpdmVuIGFyZ3VtZW50IHR5cGVzXG4gKlxuICogQHJldHVybiB7Kn0gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBtZXRob2QgaW4gdGhlIGludm9jYXRpb24gY2hhaW4uIElmIG1ldGhvZCByZXR1cm4gdHlwZSBpcyB2b2lkLCB0aGVuIFwiPFZPSUQ+XCIgd2lsbCBiZSByZXR1cm5lZFxuICpcbiAqL1xuY29tbWFuZHMubW9iaWxlQmFja2Rvb3IgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVCYWNrZG9vciAob3B0cyA9IHt9KSB7XG4gIGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ3RhcmdldCcsICdtZXRob2RzJ10pO1xuICBjb25zdCB7dGFyZ2V0LCBtZXRob2RzfSA9IG9wdHM7XG4gIGlmICh0YXJnZXQgPT09ICdlbGVtZW50Jykge1xuICAgIGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnRJZCddKTtcbiAgfVxuICBjb25zdCB7ZWxlbWVudElkOiB0YXJnZXRFbGVtZW50fSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS9iYWNrZG9vcmAsICdQT1NUJywge3RhcmdldCwgbWV0aG9kcywgdGFyZ2V0RWxlbWVudH0pO1xufTtcblxuLyoqXG4gKiAgRXhlY3V0ZSBVaUF1dG9tYXRvcjIgY29tbWFuZHMgdG8gZHJpdmUgb3V0IG9mIGFwcCBhcmVhcy5cbiAqICBzdHJhdGVneSBjYW4gYmUgb25lIG9mOiBcImNsYXp6XCIsIFwicmVzXCIsIFwidGV4dFwiLCBcInRleHRDb250YWluc1wiLCBcInRleHRFbmRzV2l0aFwiLCBcInRleHRTdGFydHNXaXRoXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjXCIsIFwiZGVzY0NvbnRhaW5zXCIsIFwiZGVzY0VuZHNXaXRoXCIsIFwiZGVzY1N0YXJ0c1dpdGhcIiwgXCJwa2dcIlxuICpcbiAqICBhY3Rpb24gY2FuIGJlIG9uZSBvZjogXCJjbGlja1wiLCBcImxvbmdDbGlja1wiLCBcImdldFRleHRcIiwgXCJnZXRDb250ZW50RGVzY3JpcHRpb25cIiwgXCJnZXRDbGFzc05hbWVcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJnZXRSZXNvdXJjZU5hbWVcIiwgXCJnZXRWaXNpYmxlQm91bmRzXCIsIFwiZ2V0VmlzaWJsZUNlbnRlclwiLCBcImdldEFwcGxpY2F0aW9uUGFja2FnZVwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICBcImdldENoaWxkQ291bnRcIiwgXCJjbGVhclwiLCBcImlzQ2hlY2thYmxlXCIsIFwiaXNDaGVja2VkXCIsIFwiaXNDbGlja2FibGVcIiwgXCJpc0VuYWJsZWRcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJpc0ZvY3VzYWJsZVwiLCBcImlzRm9jdXNlZFwiLCBcImlzTG9uZ0NsaWNrYWJsZVwiLCBcImlzU2Nyb2xsYWJsZVwiLCBcImlzU2VsZWN0ZWRcIlxuICovXG5jb21tYW5kcy5tb2JpbGVVaWF1dG9tYXRvciA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVVpYXV0b21hdG9yIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3N0cmF0ZWd5LCBsb2NhdG9yLCBhY3Rpb24sIGluZGV4fSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ3N0cmF0ZWd5JywgJ2xvY2F0b3InLCAnYWN0aW9uJ10pO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvdWlhdXRvbWF0b3JgLCAnUE9TVCcsIHtzdHJhdGVneSwgbG9jYXRvciwgaW5kZXgsIGFjdGlvbn0pO1xufTtcblxuLyoqXG4gKiAgRXhlY3V0ZSBVaUF1dG9tYXRvcjIgY29tbWFuZCB0byByZXR1cm4gdGhlIFVJIGR1bXAgd2hlbiBBVVQgaXMgaW4gYmFja2dyb3VuZC5cbiAqIEB0aHJvd3MgIHtFcnJvcn0gaWYgdWlhdXRvbWF0b3IgdmlldyBkdW1wIGlzIHVuc3VjY2Vzc2Z1bFxuICogQHJldHVybnMge3N0cmluZ30gdWlhdXRvbWF0b3IgRE9NIHhtbCBhcyBzdHJpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlVWlhdXRvbWF0b3JQYWdlU291cmNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVWlhdXRvbWF0b3JQYWdlU291cmNlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2V4ZWN1dGVfbW9iaWxlL3VpYXV0b21hdG9yX3BhZ2Vfc291cmNlYCwgJ0dFVCcpO1xufTtcblxuLyoqXG4gKiAgRmxhc2ggdGhlIGVsZW1lbnQgd2l0aCBnaXZlbiBpZC5cbiAqICBkdXJhdGlvbk1pbGxpcyBhbmQgcmVwZWF0Q291bnQgYXJlIG9wdGlvbmFsXG4gKlxuICovXG5jb21tYW5kcy5tb2JpbGVGbGFzaEVsZW1lbnQgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVGbGFzaEVsZW1lbnQgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuICBjb25zdCB7ZHVyYXRpb25NaWxsaXMsIHJlcGVhdENvdW50fSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vZmxhc2hgLCAnUE9TVCcsIHtcbiAgICBkdXJhdGlvbk1pbGxpcyxcbiAgICByZXBlYXRDb3VudFxuICB9KTtcbn07XG5cbi8qKlxuICogUGVyZm9ybSBhICdHZW5lcmFsQ2xpY2tBY3Rpb24nIChodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZHgvdGVzdC9lc3ByZXNzby9hY3Rpb24vR2VuZXJhbENsaWNrQWN0aW9uKVxuICovXG5jb21tYW5kcy5tb2JpbGVDbGlja0FjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUNsaWNrQWN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnQsIHRhcHBlciwgY29vcmRpbmF0ZXNQcm92aWRlciwgcHJlY2lzaW9uRGVzY3JpYmVyLFxuICAgICAgICAgaW5wdXREZXZpY2UsIGJ1dHRvblN0YXRlfSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnQnXSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vY2xpY2tfYWN0aW9uYCwgJ1BPU1QnLCB7XG4gICAgdGFwcGVyLCBjb29yZGluYXRlc1Byb3ZpZGVyLCBwcmVjaXNpb25EZXNjcmliZXIsIGlucHV0RGV2aWNlLCBidXR0b25TdGF0ZVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2V0dGluZ3MgKHNldHRpbmdzKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9zZXR0aW5nc2AsICdQT1NUJywgeyBzZXR0aW5ncyB9KTtcbn07XG5cbmNvbW1hbmRzLmdldFNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2V0dGluZ3MgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vc2V0dGluZ3NgLCAnR0VUJyk7XG59O1xuXG4vLyBTdG9wIHByb3h5aW5nIHRvIGFueSBDaHJvbWVkcml2ZXIgYW5kIHJlZGlyZWN0IHRvIEVzcHJlc3NvXG5oZWxwZXJzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSA9IGZ1bmN0aW9uIHN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSAoKSB7XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuZXNwcmVzc28ucHJveHlSZXFSZXMuYmluZCh0aGlzLmVzcHJlc3NvKTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG5jb21tYW5kcy5zdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBY3Rpdml0eSAoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksXG4gIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHkpIHtcbiAgLy8gaW50ZW50QWN0aW9uLCBpbnRlbnRDYXRlZ29yeSwgaW50ZW50RmxhZ3MsIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLCBkb250U3RvcEFwcE9uUmVzZXRcbiAgLy8gcGFyYW1ldGVycyBhcmUgbm90IHN1cHBvcnRlZCBieSBFc3ByZXNzb1xuICBhcHBQYWNrYWdlID0gYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgYXBwV2FpdFBhY2thZ2UgPSBhcHBXYWl0UGFja2FnZSB8fCBhcHBQYWNrYWdlO1xuICBhcHBBY3Rpdml0eSA9IHF1YWxpZnlBY3Rpdml0eU5hbWUoYXBwQWN0aXZpdHksIGFwcFBhY2thZ2UpO1xuICBhcHBXYWl0QWN0aXZpdHkgPSBxdWFsaWZ5QWN0aXZpdHlOYW1lKGFwcFdhaXRBY3Rpdml0eSB8fCBhcHBBY3Rpdml0eSwgYXBwV2FpdFBhY2thZ2UpO1xuICBsb2dnZXIuZGVidWcoYFN0YXJ0aW5nIGFjdGl2aXR5ICcke2FwcEFjdGl2aXR5fScgZm9yIHBhY2thZ2UgJyR7YXBwUGFja2FnZX0nYCk7XG4gIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2RldmljZS9zdGFydF9hY3Rpdml0eWAsICdQT1NUJywge1xuICAgIGFwcFBhY2thZ2UsXG4gICAgYXBwQWN0aXZpdHksXG4gIH0pO1xuICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yQWN0aXZpdHkoYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVEaXNtaXNzQXV0b2ZpbGwgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEaXNtaXNzQXV0b2ZpbGwgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuICBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChcbiAgICBgL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L2Rpc21pc3NfYXV0b2ZpbGxgLCAnUE9TVCcsIHt9KTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
342
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJhc3NlcnRSZXF1aXJlZE9wdGlvbnMiLCJvcHRpb25zIiwicmVxdWlyZWRPcHRpb25OYW1lcyIsIl8iLCJpc0FycmF5IiwicHJlc2VudE9wdGlvbk5hbWVzIiwia2V5cyIsIm1pc3NpbmdPcHRpb25OYW1lcyIsImRpZmZlcmVuY2UiLCJpc0VtcHR5IiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwibGF1bmNoQXBwIiwiZXJyb3JzIiwiVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvciIsImNsb3NlQXBwIiwicmVzZXQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImVzcHJlc3NvIiwiandwcm94eSIsImNvbW1hbmQiLCJtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIiwib3B0cyIsImFjdGlvbiIsIm1vYmlsZVN3aXBlIiwiZGlyZWN0aW9uIiwiZWxlbWVudCIsInN3aXBlciIsInN0YXJ0Q29vcmRpbmF0ZXMiLCJlbmRDb29yZGluYXRlcyIsInByZWNpc2lvbkRlc2NyaWJlciIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsIm1vYmlsZUlzVG9hc3RWaXNpYmxlIiwidGV4dCIsImlzUmVnZXhwIiwiaGFzVmFsdWUiLCJsb2dnZXIiLCJlcnJvckFuZFRocm93IiwibW9iaWxlT3BlbkRyYXdlciIsImdyYXZpdHkiLCJtb2JpbGVDbG9zZURyYXdlciIsIm1vYmlsZVNldERhdGUiLCJ5ZWFyIiwibW9udGhPZlllYXIiLCJkYXlPZk1vbnRoIiwibW9iaWxlU2V0VGltZSIsImhvdXJzIiwibWludXRlcyIsIm1vYmlsZU5hdmlnYXRlVG8iLCJtZW51SXRlbUlkIiwibWVudUl0ZW1JZEFzTnVtYmVyIiwicGFyc2VJbnQiLCJpc05hTiIsIm1vYmlsZVdlYkF0b21zIiwiZ2V0RGlzcGxheURlbnNpdHkiLCJtb2JpbGVTY3JvbGxUb1BhZ2UiLCJzY3JvbGxUb1R5cGVzIiwicmVzIiwicHJlc2VuY2UiLCJzY3JvbGxUbyIsImluY2x1c2lvbiIsIndpdGhpbiIsIm1lc3NhZ2UiLCJqb2luIiwic2Nyb2xsVG9QYWdlIiwibnVtZXJpY2FsaXR5Iiwib25seUludGVnZXIiLCJncmVhdGVyVGhhbk9yRXF1YWxUbyIsInNtb290aFNjcm9sbCIsIndhcm4iLCJtb2JpbGVCYWNrZG9vciIsInRhcmdldCIsIm1ldGhvZHMiLCJlbGVtZW50SWQiLCJ0YXJnZXRFbGVtZW50IiwibW9iaWxlVWlhdXRvbWF0b3IiLCJzdHJhdGVneSIsImxvY2F0b3IiLCJpbmRleCIsIm1vYmlsZVVpYXV0b21hdG9yUGFnZVNvdXJjZSIsIm1vYmlsZUZsYXNoRWxlbWVudCIsImR1cmF0aW9uTWlsbGlzIiwicmVwZWF0Q291bnQiLCJtb2JpbGVDbGlja0FjdGlvbiIsInRhcHBlciIsImNvb3JkaW5hdGVzUHJvdmlkZXIiLCJpbnB1dERldmljZSIsImJ1dHRvblN0YXRlIiwidXBkYXRlU2V0dGluZ3MiLCJzZXR0aW5ncyIsImdldFNldHRpbmdzIiwic3VzcGVuZENocm9tZWRyaXZlclByb3h5IiwiY2hyb21lZHJpdmVyIiwicHJveHlSZXFSZXMiLCJiaW5kIiwicHJveHlDb21tYW5kIiwiandwUHJveHlBY3RpdmUiLCJzdGFydEFjdGl2aXR5IiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJjYXBzIiwiZGVidWciLCJ3YWl0Rm9yQWN0aXZpdHkiLCJtb2JpbGVEaXNtaXNzQXV0b2ZpbGwiLCJPYmplY3QiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsSUFBSUEsUUFBUSxHQUFHLEVBQWY7QUFBQSxJQUFtQkMsT0FBTyxHQUFHLEVBQTdCO0FBQUEsSUFBaUNDLFVBQVUsR0FBRyxF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LEdBQWlDLGVBQWVBLHFCQUFmLENBQXNDckYsSUFBSSxHQUFHLEVBQTdDLEVBQWlEO0FBQ2hGLFFBQU07QUFBQ0ksSUFBQUE7QUFBRCxNQUFZN0IscUJBQXFCLENBQUN5QixJQUFELEVBQU8sQ0FBQyxTQUFELENBQVAsQ0FBdkM7QUFDQSxRQUFNLEtBQUtKLFFBQUwsQ0FBY0MsT0FBZCxDQUFzQkMsT0FBdEIsQ0FDSCw2Q0FBNENXLGNBQUtDLGFBQUwsQ0FBbUJOLE9BQW5CLENBQTRCLG1CQURyRSxFQUN5RixNQUR6RixFQUNpRyxFQURqRyxDQUFOO0FBRUQsQ0FKRDs7QUFNQWtGLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjakgsVUFBZCxFQUEwQkYsUUFBMUIsRUFBb0NDLE9BQXBDO2VBRWVDLFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAndmFsaWRhdGUuanMnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBxdWFsaWZ5QWN0aXZpdHlOYW1lIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmZ1bmN0aW9uIGFzc2VydFJlcXVpcmVkT3B0aW9ucyAob3B0aW9ucywgcmVxdWlyZWRPcHRpb25OYW1lcykge1xuICBpZiAoIV8uaXNBcnJheShyZXF1aXJlZE9wdGlvbk5hbWVzKSkge1xuICAgIHJlcXVpcmVkT3B0aW9uTmFtZXMgPSBbcmVxdWlyZWRPcHRpb25OYW1lc107XG4gIH1cbiAgY29uc3QgcHJlc2VudE9wdGlvbk5hbWVzID0gXy5rZXlzKG9wdGlvbnMpO1xuICBjb25zdCBtaXNzaW5nT3B0aW9uTmFtZXMgPSBfLmRpZmZlcmVuY2UocmVxdWlyZWRPcHRpb25OYW1lcywgcHJlc2VudE9wdGlvbk5hbWVzKTtcbiAgaWYgKF8uaXNFbXB0eShtaXNzaW5nT3B0aW9uTmFtZXMpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlcXVpcmVkOiAke0pTT04uc3RyaW5naWZ5KG1pc3NpbmdPcHRpb25OYW1lcyl9LiBgICtcbiAgICBgWW91IGhhdmUgb25seSBwcm92aWRlZDogJHtKU09OLnN0cmluZ2lmeShwcmVzZW50T3B0aW9uTmFtZXMpfWApO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuY29tbWFuZHMubGF1bmNoQXBwID0gYXN5bmMgZnVuY3Rpb24gbGF1bmNoQXBwICgpIHtcbiAgdGhyb3cgbmV3IGVycm9ycy5VbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKCdQbGVhc2UgY3JlYXRlIGEgbmV3IHNlc3Npb24gaW4gb3JkZXIgdG8gbGF1bmNoIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0Jyk7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuY29tbWFuZHMuY2xvc2VBcHAgPSBhc3luYyBmdW5jdGlvbiBjbG9zZUFwcCAoKSB7XG4gIHRocm93IG5ldyBlcnJvcnMuVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcignUGxlYXNlIHF1aXQgdGhlIHNlc3Npb24gaW4gb3JkZXIgdG8gY2xvc2UgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QnKTtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF3YWl0XG5jb21tYW5kcy5yZXNldCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0ICgpIHtcbiAgdGhyb3cgbmV3IGVycm9ycy5VbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKFxuICAgICdQbGVhc2UgcXVpdCB0aGUgc2Vzc2lvbiBhbmQgY3JlYXRlIGEgbmV3IG9uZSAnICtcbiAgICAnaW4gb3JkZXIgdG8gY2xvc2UgYW5kIGxhdW5jaCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCcpO1xufTtcblxuY29tbWFuZHMuZ2V0Q2xpcGJvYXJkID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q2xpcGJvYXJkICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMjkpXG4gICAgPyAoYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnLCAnUE9TVCcsIHt9KSlcbiAgICA6IChhd2FpdCB0aGlzLmFkYi5nZXRDbGlwYm9hcmQoKSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHthY3Rpb259ID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnYWN0aW9uJ10pO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL3BlcmZvcm1fZWRpdG9yX2FjdGlvbicsICdQT1NUJywge2FjdGlvbn0pO1xufTtcblxuY29tbWFuZHMubW9iaWxlU3dpcGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTd2lwZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtkaXJlY3Rpb24sIGVsZW1lbnQsIHN3aXBlciwgc3RhcnRDb29yZGluYXRlcywgZW5kQ29vcmRpbmF0ZXMsIHByZWNpc2lvbkRlc2NyaWJlcn0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L3N3aXBlYCwgJ1BPU1QnLCB7XG4gICAgZGlyZWN0aW9uLCBlbGVtZW50LCBzd2lwZXIsIHN0YXJ0Q29vcmRpbmF0ZXMsIGVuZENvb3JkaW5hdGVzLCBwcmVjaXNpb25EZXNjcmliZXJcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVHZXREZXZpY2VJbmZvID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0RGV2aWNlSW5mbyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvaW5mbycsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZUlzVG9hc3RWaXNpYmxlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSXNUb2FzdFZpc2libGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7dGV4dCwgaXNSZWdleHB9ID0gb3B0cztcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKHRleHQpKSB7XG4gICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYCd0ZXh0JyBhcmd1bWVudCBpcyBtYW5kYXRvcnlgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvaXNfdG9hc3RfZGlzcGxheWVkJywgJ1BPU1QnLCB7XG4gICAgdGV4dCxcbiAgICBpc1JlZ2V4cCxcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVPcGVuRHJhd2VyID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlT3BlbkRyYXdlciAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtlbGVtZW50LCBncmF2aXR5fSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnQnXSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2V4ZWN1dGVfbW9iaWxlLyR7dXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnQpfS9vcGVuX2RyYXdlcmAsICdQT1NUJywge1xuICAgIGdyYXZpdHlcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVDbG9zZURyYXdlciA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUNsb3NlRHJhd2VyIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnQsIGdyYXZpdHl9ID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnZWxlbWVudCddKTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L2Nsb3NlX2RyYXdlcmAsICdQT1NUJywge1xuICAgIGdyYXZpdHlcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVTZXREYXRlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2V0RGF0ZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtlbGVtZW50LCB5ZWFyLCBtb250aE9mWWVhciwgZGF5T2ZNb250aH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50JywgJ3llYXInLCAnbW9udGhPZlllYXInLCAnZGF5T2ZNb250aCddKTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L3NldF9kYXRlYCwgJ1BPU1QnLCB7XG4gICAgeWVhcixcbiAgICBtb250aE9mWWVhcixcbiAgICBkYXlPZk1vbnRoLFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVNldFRpbWUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTZXRUaW1lIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnQsIGhvdXJzLCBtaW51dGVzfSA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ2VsZW1lbnQnLCAnaG91cnMnLCAnbWludXRlcyddKTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L3NldF90aW1lYCwgJ1BPU1QnLCB7XG4gICAgaG91cnMsXG4gICAgbWludXRlcyxcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVOYXZpZ2F0ZVRvID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTmF2aWdhdGVUbyAob3B0cyA9IHt9KSB7XG4gIGxldCB7ZWxlbWVudCwgbWVudUl0ZW1JZH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydtZW51SXRlbUlkJywgJ2VsZW1lbnQnXSk7XG5cbiAgbGV0IG1lbnVJdGVtSWRBc051bWJlciA9IHBhcnNlSW50KG1lbnVJdGVtSWQsIDEwKTtcbiAgaWYgKF8uaXNOYU4obWVudUl0ZW1JZEFzTnVtYmVyKSB8fCBtZW51SXRlbUlkQXNOdW1iZXIgPCAwKSB7XG4gICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYCdtZW51SXRlbUlkJyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gRm91bmQgJHttZW51SXRlbUlkfWApO1xuICAgIG1lbnVJdGVtSWQgPSBtZW51SXRlbUlkQXNOdW1iZXI7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L25hdmlnYXRlX3RvYCwgJ1BPU1QnLCB7XG4gICAgbWVudUl0ZW1JZFxuICB9KTtcbn07XG5cbi8qKlxuICogUnVucyBhIGNoYWluIG9mIEVzcHJlc3NvIHdlYiBhdG9tcyAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3RyYWluaW5nL3Rlc3RpbmcvZXNwcmVzc28vd2ViIGZvciByZWZlcmVuY2UpXG4gKlxuICogVGFrZXMgSlNPTiBvZiB0aGUgZm9ybVxuICpcbiAqIHtcbiAqICAgXCJ3ZWJ2aWV3RWxcIjogXCI8RUxFTUVOVF9JRD5cIiwgLy8gb3B0aW9uYWwgd2VidmlldyBlbGVtZW50IHRvIG9wZXJhdGUgb25cbiAqICAgXCJmb3JjZUphdmFzY3JpcHRFbmFibGVkXCI6IHRydWV8ZmFsc2UsIC8vIGlmIHdlYnZpZXcgZGlzYWJsZXMgamF2YXNjcmlwdCwgd2ViYXRvbXMgd29uJ3Qgd29yaywgdGhpcyBmb3JjZXMgaXRcbiAqICAgXCJtZXRob2RDaGFpblwiOiBbXG4gKiAgICAge1wibmFtZVwiOiBcIm1ldGhvZE5hbWVcIiwgXCJhdG9tXCI6IHtcIm5hbWVcIjogXCJhdG9tTmFtZVwiLCBcImFyZ3NcIjogW1wiYXJnMVwiLCBcImFyZzJcIiwgLi4uXX19LFxuICogICAgIC4uLlxuICogICBdXG4gKiB9XG4gKlxuICovXG5jb21tYW5kcy5tb2JpbGVXZWJBdG9tcyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVdlYkF0b21zIChvcHRzID0ge30pIHtcbiAgb3B0cyA9IGFzc2VydFJlcXVpcmVkT3B0aW9ucyhvcHRzLCBbJ21ldGhvZENoYWluJ10pO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvd2ViX2F0b21zYCwgJ1BPU1QnLCBvcHRzKTtcbn07XG5cbmNvbW1hbmRzLmdldERpc3BsYXlEZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcGxheURlbnNpdHkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2Rpc3BsYXlfZGVuc2l0eScsICdHRVQnLCB7fSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVTY3JvbGxUb1BhZ2UgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTY3JvbGxUb1BhZ2UgKG9wdHMgPSB7fSkge1xuXG4gIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzXG4gIGNvbnN0IHNjcm9sbFRvVHlwZXMgPSBbJ2ZpcnN0JywgJ2xhc3QnLCAnbGVmdCcsICdyaWdodCddO1xuICBjb25zdCByZXMgPSB2YWxpZGF0ZShvcHRzLCB7XG4gICAgZWxlbWVudDoge3ByZXNlbmNlOiB0cnVlfSxcbiAgICBzY3JvbGxUbzoge1xuICAgICAgaW5jbHVzaW9uOiB7XG4gICAgICAgIHdpdGhpbjogc2Nyb2xsVG9UeXBlcyxcbiAgICAgICAgbWVzc2FnZTogYFwic2Nyb2xsVG9cIiBtdXN0IGJlIG9uZSBvZiBcIiR7c2Nyb2xsVG9UeXBlcy5qb2luKCcsICcpfVwiIGZvdW5kICcle3ZhbHVlfSdgLFxuICAgICAgfVxuICAgIH0sXG4gICAgc2Nyb2xsVG9QYWdlOiB7XG4gICAgICBudW1lcmljYWxpdHk6IHtcbiAgICAgICAgb25seUludGVnZXI6IHRydWUsXG4gICAgICAgIGdyZWF0ZXJUaGFuT3JFcXVhbFRvOiAwLFxuICAgICAgICBtZXNzYWdlOiBgXCJzY3JvbGxUb1BhZ2VcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIEZvdW5kICcle3ZhbHVlfSdgXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmICh1dGlsLmhhc1ZhbHVlKHJlcykpIHtcbiAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgSW52YWxpZCBzY3JvbGxUbyBwYXJhbWV0ZXJzOiAke0pTT04uc3RyaW5naWZ5KHJlcyl9YCk7XG4gIH1cblxuICBjb25zdCB7ZWxlbWVudCwgc2Nyb2xsVG8sIHNjcm9sbFRvUGFnZSwgc21vb3RoU2Nyb2xsfSA9IG9wdHM7XG5cbiAgaWYgKHV0aWwuaGFzVmFsdWUoc2Nyb2xsVG8pICYmIHV0aWwuaGFzVmFsdWUoc2Nyb2xsVG9QYWdlKSkge1xuICAgIGxvZ2dlci53YXJuKGAnc2Nyb2xsVG8nIGFuZCAnc2Nyb2xsVG9QYWdlJyB3aGVyZSBib3RoIHByb3ZpZGVkLiBEZWZhdWx0aW5nIHRvICdzY3JvbGxUbydgKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50KX0vc2Nyb2xsX3RvX3BhZ2VgLCAnUE9TVCcsIHtcbiAgICBzY3JvbGxUbyxcbiAgICBzY3JvbGxUb1BhZ2UsXG4gICAgc21vb3RoU2Nyb2xsLFxuICB9KTtcbn07XG5cblxuLyoqXG4gKiAgQVBJIHRvIGludm9rZSBtZXRob2RzIGRlZmluZWQgaW4gQW5kcm9pZCBhcHAuXG4gKlxuICogIEV4YW1wbGUgZGF0YVxuICogIHtcbiAqICAgdGFyZ2V0OiAnYWN0aXZpdHknLFxuICogICBtZXRob2RzOlxuICogICAgICAgICBbXG4gKiAgICAgICAgICAge1xuICogICAgICAgICAgICAgICBuYW1lOiBcInNvbWVNZXRob2RcIixcbiAqICAgICAgICAgICB9LFxuICogICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgbmFtZTogXCJhbm90aGVyTWV0aG9kXCIsXG4gKiAgICAgICAgICAgICAgIGFyZ3M6XG4gKiAgICAgICAgICAgICAgICAgICBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlOiBcIkxvbFwiLCB0eXBlOiAnamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSd9LFxuICogICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZTogMSwgdHlwZTogJ2ludCd9XG4gKiAgICAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgfVxuICogICAgICAgICBdXG4gKiB9XG4gKlxuICogSW4gYWJvdmUgZXhhbXBsZSwgbWV0aG9kIFwic29tZU1ldGhvZFwiIHdpbGwgYmUgaW52b2tlZCBvbiAnYWN0aXZpdHknLiBPbiB0aGUgcmVzdWx0LCBcImFub3RoZXJNZXRob2RcIiB3aWxsIGJlIGludm9rZWRcbiAqICBcInRhcmdldFwiIGNhbiBiZSBlaXRoZXIgJ2FjdGl2aXR5JywgJ2FwcGxpY2F0aW9uJyBvciAnZWxlbWVudCdcbiAqICBJZiB0YXJnZXQgaXMgc2V0IHRvICdhcHBsaWNhdGlvbicsIG1ldGhvZHMgd2lsbCBiZSBpbnZva2VkIG9uIGFwcGxpY2F0aW9uIGNsYXNzXG4gKiAgSWYgdGFyZ2V0IGlzIHNldCB0byAnYWN0aXZpdHknLCBtZXRob2RzIHdpbGwgYmUgaW52b2tlZCBvbiBjdXJyZW50IGFjdGl2aXR5XG4gKiAgSWYgdGFyZ2V0IGlzIHNldCB0byAnZWxlbWVudCcsICdlbGVtZW50SWQnIG11c3QgYmUgc3BlY2lmaWVkXG4gKlxuICogLSBPbmx5ICdQdWJsaWMnIG1ldGhvZHMgY2FuIGJlIGludm9rZWQuICgnb3BlbicgbW9kaWZpcmUgaXMgbmVjZXNzYXJ5IGluIEtvdGxpbilcbiAqIC0gZm9sbG93aW5nIHByaW1pdGl2ZSB0eXBlcyBhcmUgc3VwcG9ydGVkOiBcImludFwiLCBcImJvb2xlYW5cIiwgXCJieXRlXCIsIFwic2hvcnRcIiwgXCJsb25nXCIsIFwiZmxvYXRcIiwgXCJjaGFyXCJcbiAqIC0gIE5vbi1wcmltaXRpdmUgdHlwZXMgd2l0aCBmdWxseSBxdWFsaWZpZWQgbmFtZSBcImphdmEubGFuZy4qXCIgaXMgYWxzbyBzdXBwb3J0ZWQ6XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVnLiBcImphdmEubGFuZy5DaGFyU2VxdWVuY2VcIiwgXCJqYXZhLmxhbmcuU3RyaW5nXCIsIFwiamF2YS5sYW5nLkludGVnZXJcIiwgXCJqYXZhLmxhbmcuRmxvYXRcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJqYXZhLmxhbmcuRG91YmxlXCIsIFwiamF2YS5sYW5nLkJvb2xlYW5cIiwgXCJqYXZhLmxhbmcuTG9uZ1wiLCBcImphdmEubGFuZy5TaG9ydFwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImphdmEubGFuZy5DaGFyYWN0ZXJcIiBldGMuLi5cbiAqXG4gKlxuICogQHRocm93cyAge0Vycm9yfSBpZiB0YXJnZXQgaXMgbm90ICdhY3Rpdml0eScgb3IgJ2FwcGxpY2F0aW9uJ1xuICogQHRocm93cyAge0Vycm9yfSBpZiBhIG1ldGhvZCBpcyBub3QgZm91bmQgd2l0aCBnaXZlbiBhcmd1bWVudCB0eXBlc1xuICpcbiAqIEByZXR1cm4geyp9IHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgbWV0aG9kIGluIHRoZSBpbnZvY2F0aW9uIGNoYWluLiBJZiBtZXRob2QgcmV0dXJuIHR5cGUgaXMgdm9pZCwgdGhlbiBcIjxWT0lEPlwiIHdpbGwgYmUgcmV0dXJuZWRcbiAqXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUJhY2tkb29yID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQmFja2Rvb3IgKG9wdHMgPSB7fSkge1xuICBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWyd0YXJnZXQnLCAnbWV0aG9kcyddKTtcbiAgY29uc3Qge3RhcmdldCwgbWV0aG9kc30gPSBvcHRzO1xuICBpZiAodGFyZ2V0ID09PSAnZWxlbWVudCcpIHtcbiAgICBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50SWQnXSk7XG4gIH1cbiAgY29uc3Qge2VsZW1lbnRJZDogdGFyZ2V0RWxlbWVudH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvYmFja2Rvb3JgLCAnUE9TVCcsIHt0YXJnZXQsIG1ldGhvZHMsIHRhcmdldEVsZW1lbnR9KTtcbn07XG5cbi8qKlxuICogIEV4ZWN1dGUgVWlBdXRvbWF0b3IyIGNvbW1hbmRzIHRvIGRyaXZlIG91dCBvZiBhcHAgYXJlYXMuXG4gKiAgc3RyYXRlZ3kgY2FuIGJlIG9uZSBvZjogXCJjbGF6elwiLCBcInJlc1wiLCBcInRleHRcIiwgXCJ0ZXh0Q29udGFpbnNcIiwgXCJ0ZXh0RW5kc1dpdGhcIiwgXCJ0ZXh0U3RhcnRzV2l0aFwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY1wiLCBcImRlc2NDb250YWluc1wiLCBcImRlc2NFbmRzV2l0aFwiLCBcImRlc2NTdGFydHNXaXRoXCIsIFwicGtnXCJcbiAqXG4gKiAgYWN0aW9uIGNhbiBiZSBvbmUgb2Y6IFwiY2xpY2tcIiwgXCJsb25nQ2xpY2tcIiwgXCJnZXRUZXh0XCIsIFwiZ2V0Q29udGVudERlc2NyaXB0aW9uXCIsIFwiZ2V0Q2xhc3NOYW1lXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2V0UmVzb3VyY2VOYW1lXCIsIFwiZ2V0VmlzaWJsZUJvdW5kc1wiLCBcImdldFZpc2libGVDZW50ZXJcIiwgXCJnZXRBcHBsaWNhdGlvblBhY2thZ2VcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJnZXRDaGlsZENvdW50XCIsIFwiY2xlYXJcIiwgXCJpc0NoZWNrYWJsZVwiLCBcImlzQ2hlY2tlZFwiLCBcImlzQ2xpY2thYmxlXCIsIFwiaXNFbmFibGVkXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwiaXNGb2N1c2FibGVcIiwgXCJpc0ZvY3VzZWRcIiwgXCJpc0xvbmdDbGlja2FibGVcIiwgXCJpc1Njcm9sbGFibGVcIiwgXCJpc1NlbGVjdGVkXCJcbiAqL1xuY29tbWFuZHMubW9iaWxlVWlhdXRvbWF0b3IgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVVaWF1dG9tYXRvciAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtzdHJhdGVneSwgbG9jYXRvciwgYWN0aW9uLCBpbmRleH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydzdHJhdGVneScsICdsb2NhdG9yJywgJ2FjdGlvbiddKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2V4ZWN1dGVfbW9iaWxlL3VpYXV0b21hdG9yYCwgJ1BPU1QnLCB7c3RyYXRlZ3ksIGxvY2F0b3IsIGluZGV4LCBhY3Rpb259KTtcbn07XG5cbi8qKlxuICogIEV4ZWN1dGUgVWlBdXRvbWF0b3IyIGNvbW1hbmQgdG8gcmV0dXJuIHRoZSBVSSBkdW1wIHdoZW4gQVVUIGlzIGluIGJhY2tncm91bmQuXG4gKiBAdGhyb3dzICB7RXJyb3J9IGlmIHVpYXV0b21hdG9yIHZpZXcgZHVtcCBpcyB1bnN1Y2Nlc3NmdWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHVpYXV0b21hdG9yIERPTSB4bWwgYXMgc3RyaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVVpYXV0b21hdG9yUGFnZVNvdXJjZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVVpYXV0b21hdG9yUGFnZVNvdXJjZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChgL2FwcGl1bS9leGVjdXRlX21vYmlsZS91aWF1dG9tYXRvcl9wYWdlX3NvdXJjZWAsICdHRVQnKTtcbn07XG5cbi8qKlxuICogIEZsYXNoIHRoZSBlbGVtZW50IHdpdGggZ2l2ZW4gaWQuXG4gKiAgZHVyYXRpb25NaWxsaXMgYW5kIHJlcGVhdENvdW50IGFyZSBvcHRpb25hbFxuICpcbiAqL1xuY29tbWFuZHMubW9iaWxlRmxhc2hFbGVtZW50ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRmxhc2hFbGVtZW50IChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnR9ID0gYXNzZXJ0UmVxdWlyZWRPcHRpb25zKG9wdHMsIFsnZWxlbWVudCddKTtcbiAgY29uc3Qge2R1cmF0aW9uTWlsbGlzLCByZXBlYXRDb3VudH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L2ZsYXNoYCwgJ1BPU1QnLCB7XG4gICAgZHVyYXRpb25NaWxsaXMsXG4gICAgcmVwZWF0Q291bnRcbiAgfSk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gYSAnR2VuZXJhbENsaWNrQWN0aW9uJyAoaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWR4L3Rlc3QvZXNwcmVzc28vYWN0aW9uL0dlbmVyYWxDbGlja0FjdGlvbilcbiAqL1xuY29tbWFuZHMubW9iaWxlQ2xpY2tBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVDbGlja0FjdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtlbGVtZW50LCB0YXBwZXIsIGNvb3JkaW5hdGVzUHJvdmlkZXIsIHByZWNpc2lvbkRlc2NyaWJlcixcbiAgICAgICAgIGlucHV0RGV2aWNlLCBidXR0b25TdGF0ZX0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L2NsaWNrX2FjdGlvbmAsICdQT1NUJywge1xuICAgIHRhcHBlciwgY29vcmRpbmF0ZXNQcm92aWRlciwgcHJlY2lzaW9uRGVzY3JpYmVyLCBpbnB1dERldmljZSwgYnV0dG9uU3RhdGVcbiAgfSk7XG59O1xuXG5jb21tYW5kcy51cGRhdGVTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNldHRpbmdzIChzZXR0aW5ncykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5lc3ByZXNzby5qd3Byb3h5LmNvbW1hbmQoYC9hcHBpdW0vc2V0dGluZ3NgLCAnUE9TVCcsIHsgc2V0dGluZ3MgfSk7XG59O1xuXG5jb21tYW5kcy5nZXRTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uIGdldFNldHRpbmdzICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL3NldHRpbmdzYCwgJ0dFVCcpO1xufTtcblxuLy8gU3RvcCBwcm94eWluZyB0byBhbnkgQ2hyb21lZHJpdmVyIGFuZCByZWRpcmVjdCB0byBFc3ByZXNzb1xuaGVscGVycy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgPSBmdW5jdGlvbiBzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmVzcHJlc3NvLnByb3h5UmVxUmVzLmJpbmQodGhpcy5lc3ByZXNzbyk7XG4gIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5lc3ByZXNzby5wcm94eUNvbW1hbmQuYmluZCh0aGlzLmVzcHJlc3NvKTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG5jb21tYW5kcy5zdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBY3Rpdml0eSAoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksXG4gIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHkpIHtcbiAgLy8gaW50ZW50QWN0aW9uLCBpbnRlbnRDYXRlZ29yeSwgaW50ZW50RmxhZ3MsIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLCBkb250U3RvcEFwcE9uUmVzZXRcbiAgLy8gcGFyYW1ldGVycyBhcmUgbm90IHN1cHBvcnRlZCBieSBFc3ByZXNzb1xuICBhcHBQYWNrYWdlID0gYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgYXBwV2FpdFBhY2thZ2UgPSBhcHBXYWl0UGFja2FnZSB8fCBhcHBQYWNrYWdlO1xuICBhcHBBY3Rpdml0eSA9IHF1YWxpZnlBY3Rpdml0eU5hbWUoYXBwQWN0aXZpdHksIGFwcFBhY2thZ2UpO1xuICBhcHBXYWl0QWN0aXZpdHkgPSBxdWFsaWZ5QWN0aXZpdHlOYW1lKGFwcFdhaXRBY3Rpdml0eSB8fCBhcHBBY3Rpdml0eSwgYXBwV2FpdFBhY2thZ2UpO1xuICBsb2dnZXIuZGVidWcoYFN0YXJ0aW5nIGFjdGl2aXR5ICcke2FwcEFjdGl2aXR5fScgZm9yIHBhY2thZ2UgJyR7YXBwUGFja2FnZX0nYCk7XG4gIGF3YWl0IHRoaXMuZXNwcmVzc28uandwcm94eS5jb21tYW5kKGAvYXBwaXVtL2RldmljZS9zdGFydF9hY3Rpdml0eWAsICdQT1NUJywge1xuICAgIGFwcFBhY2thZ2UsXG4gICAgYXBwQWN0aXZpdHksXG4gIH0pO1xuICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yQWN0aXZpdHkoYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVEaXNtaXNzQXV0b2ZpbGwgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEaXNtaXNzQXV0b2ZpbGwgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudH0gPSBhc3NlcnRSZXF1aXJlZE9wdGlvbnMob3B0cywgWydlbGVtZW50J10pO1xuICBhd2FpdCB0aGlzLmVzcHJlc3NvLmp3cHJveHkuY29tbWFuZChcbiAgICBgL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZXhlY3V0ZV9tb2JpbGUvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCl9L2Rpc21pc3NfYXV0b2ZpbGxgLCAnUE9TVCcsIHt9KTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|