appium-ios-simulator 4.1.8 → 4.2.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/CHANGELOG.md +21 -0
- package/README.md +38 -79
- package/build/lib/settings.js +102 -90
- package/build/lib/settings.js.map +1 -1
- package/build/lib/simulator-xcode-6.js +7 -7
- package/build/lib/simulator-xcode-6.js.map +1 -1
- package/build/lib/simulator-xcode-9.js +34 -1
- package/build/lib/simulator-xcode-9.js.map +1 -1
- package/lib/settings.js +155 -108
- package/lib/simulator-xcode-6.js +15 -7
- package/lib/simulator-xcode-9.js +81 -1
- package/package.json +1 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
## [4.2.1](https://github.com/appium/appium-ios-simulator/compare/v4.2.0...v4.2.1) (2022-12-12)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* Update Simulator preferences configuration ([#347](https://github.com/appium/appium-ios-simulator/issues/347)) ([355c5da](https://github.com/appium/appium-ios-simulator/commit/355c5dabea80330952705570cd0e48ef1633a3fc))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Code Refactoring
|
|
10
|
+
|
|
11
|
+
* do not launch in setReduceMotion ([#343](https://github.com/appium/appium-ios-simulator/issues/343)) ([cc35e3e](https://github.com/appium/appium-ios-simulator/commit/cc35e3e7b10585fd127630c1ca01b6de14a2cf63))
|
|
12
|
+
* Drop usage of fs-extra module ([#344](https://github.com/appium/appium-ios-simulator/issues/344)) ([4c1a63e](https://github.com/appium/appium-ios-simulator/commit/4c1a63e0672534b2f401e416b3face095fec639f))
|
|
13
|
+
* Streamline settings helpers for the simulator ([#346](https://github.com/appium/appium-ios-simulator/issues/346)) ([bcf4753](https://github.com/appium/appium-ios-simulator/commit/bcf475318d707b3ac8531b72dbc0d1db9bff4578))
|
|
14
|
+
|
|
15
|
+
## [4.2.0](https://github.com/appium/appium-ios-simulator/compare/v4.1.8...v4.2.0) (2022-12-09)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Features
|
|
19
|
+
|
|
20
|
+
* add setReduceTransparency ([#342](https://github.com/appium/appium-ios-simulator/issues/342)) ([ef57f51](https://github.com/appium/appium-ios-simulator/commit/ef57f51570a756b999bf1b0739b8d7149e1a1b0d))
|
|
21
|
+
|
|
1
22
|
## [4.1.8](https://github.com/appium/appium-ios-simulator/compare/v4.1.7...v4.1.8) (2022-12-09)
|
|
2
23
|
|
|
3
24
|
|
package/README.md
CHANGED
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
[](https://npmjs.org/package/appium-ios-simulator)
|
|
4
4
|
[](https://npmjs.org/package/appium-ios-simulator)
|
|
5
5
|
|
|
6
|
-
[](https://travis-ci.org/appium/appium-ios-simulator)
|
|
7
6
|
|
|
8
|
-
Appium API for dealing with iOS simulators.
|
|
7
|
+
Appium API for dealing with iOS simulators. The API enables you to use the following features:
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
- query locations of Simulator-specific directories and applications
|
|
10
|
+
- read/write access to Simulator settings
|
|
11
|
+
- full control over starting and stopping simulators
|
|
12
|
+
- deal with biometric auth, geolocation settings, application permissions, and others
|
|
11
13
|
|
|
12
14
|
### Usage
|
|
13
15
|
|
|
@@ -20,84 +22,41 @@ If you want to create a new simulator, you can use the `createDevice()` method o
|
|
|
20
22
|
|
|
21
23
|
```js
|
|
22
24
|
import { getSimulator } from 'appium-ios-simulator';
|
|
25
|
+
import assert from 'node:assert/strict';
|
|
23
26
|
|
|
24
|
-
|
|
27
|
+
const sim = await getSimulator('DAE95172-0788-4A85-8D0D-5C85509109E1');
|
|
28
|
+
await sim.run();
|
|
29
|
+
assert.equal('Booted', (await sim.stat()).state);
|
|
30
|
+
await sim.shutdown();
|
|
31
|
+
assert.equal('Shutdown', (await sim.stat()).state);
|
|
25
32
|
```
|
|
26
33
|
|
|
34
|
+
### Third-party tools
|
|
35
|
+
|
|
36
|
+
The following tools and utilities are not mandatory, but could be used by the appium-ios-simulator, if installed locally, to extend its functionality:
|
|
37
|
+
|
|
38
|
+
- [Lyft](https://github.com/lyft)
|
|
39
|
+
- [IDB](https://github.com/facebook/idb)
|
|
40
|
+
- [AppleSimulatorUtils](https://github.com/wix/AppleSimulatorUtils)
|
|
41
|
+
|
|
27
42
|
### Xcode and iOS versions
|
|
28
43
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
- safari plists
|
|
49
|
-
- [base]/Containers/Containers/Data/Application/[identifier]/<.com.apple.mobile_container_manager.metadata.plist, com.apple.mobilesafari>
|
|
50
|
-
- locationd cache plists
|
|
51
|
-
- [base]/Library/Caches/locationd/cache.plist
|
|
52
|
-
- [base]/Library/Preferences/com.apple.locationd.plist
|
|
53
|
-
- locationd clients plists
|
|
54
|
-
- [base]/Library/Caches/locationd/clients.plist
|
|
55
|
-
- user settings plists
|
|
56
|
-
- [base]/Library/UserConfigurationProfiles/UserSettings.plist
|
|
57
|
-
- [base]/Library/UserConfigurationProfiles/EffectiveUserSettings.plist
|
|
58
|
-
- [base]/Library/UserConfigurationProfiles/PublicInfo/PublicEffectiveUserSettings.plist
|
|
59
|
-
- other plists
|
|
60
|
-
- [base]/Library/Preferences
|
|
61
|
-
- logs
|
|
62
|
-
- ~/Library/Logs/CoreSimulator/[identifier]/
|
|
63
|
-
- sym linked to [base]/Library/Logs
|
|
64
|
-
|
|
65
|
-
iOS 9.2, 9.1, 9.0, 8.4, 8.3
|
|
66
|
-
- base
|
|
67
|
-
- ~/Library/Developer/CoreSimulator/Devices/[identifier]/data/
|
|
68
|
-
- safari plists
|
|
69
|
-
- [base]/Containers/Data/Application/[identifier]/<.com.apple.mobile_container_manager.metadata.plist, com.apple.mobilesafari>
|
|
70
|
-
- locationd cache plists
|
|
71
|
-
- [base]/Library/Caches/locationd/cache.plist
|
|
72
|
-
- [base]/Library/Preferences/com.apple.locationd.plist
|
|
73
|
-
- locationd clients plists
|
|
74
|
-
- [base]/Library/Caches/locationd/clients.plist
|
|
75
|
-
- user settings plists
|
|
76
|
-
- [base]/Library/ConfigurationProfiles/UserSettings.plist
|
|
77
|
-
- [base]/Library/ConfigurationProfiles/EffectiveUserSettings.plist
|
|
78
|
-
- [base]/Library/ConfigurationProfiles/PublicInfo/PublicEffectiveUserSettings.plist
|
|
79
|
-
- other plists
|
|
80
|
-
- [base]/Library/Preferences
|
|
81
|
-
- logs
|
|
82
|
-
- ~/Library/Logs/CoreSimulator/[identifier]/
|
|
83
|
-
- sym linked to [base]/Library/Logs
|
|
84
|
-
|
|
85
|
-
iOS 7.1
|
|
86
|
-
- base
|
|
87
|
-
- ~/Library/Developer/CoreSimulator/Devices/[identifier]/data/
|
|
88
|
-
- safari
|
|
89
|
-
- [base]/Applications/[identifier]/Library/Preferences/com.apple.mobilesafari.plist
|
|
90
|
-
- locationCache
|
|
91
|
-
- [base]/Library/Caches/locationd/cache.plist
|
|
92
|
-
- [base]/Library/Preferences/com.apple.locationd.plist
|
|
93
|
-
- locationClients
|
|
94
|
-
- [base]/Library/Caches/locationd/clients.plist
|
|
95
|
-
- userSettings
|
|
96
|
-
- [base]/Library/ConfigurationProfiles/UserSettings.plist
|
|
97
|
-
- [base]/Library/ConfigurationProfiles/EffectiveUserSettings.plist
|
|
98
|
-
- [base]/Library/ConfigurationProfiles/PublicInfo/PublicEffectiveUserSettings.plist
|
|
99
|
-
- other plists
|
|
100
|
-
- [base]/Library/Preferences
|
|
101
|
-
- logs
|
|
102
|
-
- ~/Library/Logs/CoreSimulator/[identifier]/
|
|
103
|
-
- sym linked to [base]/Library/Logs
|
|
44
|
+
Check [Xcode wikipedia](https://en.wikipedia.org/wiki/Xcode) for more details about Xcode version to iOS version mapping.
|
|
45
|
+
|
|
46
|
+
### Development
|
|
47
|
+
|
|
48
|
+
Checkout the repository and run
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npm install
|
|
52
|
+
npm run dev
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Use the following commands to run tests:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# unit tests
|
|
59
|
+
npm run test
|
|
60
|
+
# integration tests
|
|
61
|
+
npm run e2e-test
|
|
62
|
+
```
|
package/build/lib/settings.js
CHANGED
|
@@ -4,10 +4,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
+
exports.PLIST_IDENTIFIER = void 0;
|
|
7
8
|
exports.read = read;
|
|
8
9
|
exports.readSettings = readSettings;
|
|
9
10
|
exports.setReduceMotion = setReduceMotion;
|
|
10
|
-
exports.
|
|
11
|
+
exports.setReduceTransparency = setReduceTransparency;
|
|
11
12
|
exports.update = update;
|
|
12
13
|
exports.updateLocale = updateLocale;
|
|
13
14
|
exports.updateLocationSettings = updateLocationSettings;
|
|
@@ -21,66 +22,68 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
21
22
|
var _logger = _interopRequireDefault(require("./logger"));
|
|
22
23
|
var _semver = _interopRequireDefault(require("semver"));
|
|
23
24
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
25
|
+
const PLIST_IDENTIFIER = Object.freeze({
|
|
26
|
+
WEB_INSPECTOR: 'webInspector',
|
|
27
|
+
MOBILE_SAFARI: 'mobileSafari',
|
|
28
|
+
GLOBAL_MOBILE_SAFARI: 'globalMobileSafari',
|
|
29
|
+
WEB_UI: 'webUI',
|
|
30
|
+
WEB_FOUNDATION: 'webFoundation',
|
|
31
|
+
PREFERENCES: 'preferences',
|
|
32
|
+
GLOBAL_PREFERENCES: 'globalPreferences',
|
|
33
|
+
LOCATION_SERVICES: 'locationServices',
|
|
34
|
+
LOCATION_CLIENTS: 'locationClients',
|
|
35
|
+
LOCATION_CACHE: 'locationCache',
|
|
36
|
+
USER_SETTINGS: 'userSettings',
|
|
37
|
+
EFFECTIVE_USER_SETTINGS: 'effectiveUserSettings',
|
|
38
|
+
ACCESSIBLITY_SETTINGS: 'accessibilitySettings',
|
|
39
|
+
UI_STYLE_SETTINGS: 'uiStyleSettings'
|
|
40
|
+
});
|
|
41
|
+
exports.PLIST_IDENTIFIER = PLIST_IDENTIFIER;
|
|
24
42
|
async function plistPaths(sim, identifier) {
|
|
25
|
-
|
|
26
|
-
let simDirectory = sim.getDir();
|
|
43
|
+
const simDirectory = sim.getDir();
|
|
27
44
|
switch (identifier) {
|
|
28
|
-
case
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
case
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
case
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
case
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
case 'locationCache':
|
|
53
|
-
paths.push(_path.default.resolve(simDirectory, 'Library', 'Caches', 'locationd', 'cache.plist'));
|
|
54
|
-
paths.push(_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.locationd.plist'));
|
|
55
|
-
break;
|
|
56
|
-
case 'userSettings':
|
|
57
|
-
if (_semver.default.lt(_semver.default.coerce(sim.xcodeVersion.versionString), _semver.default.coerce('7.3'))) {
|
|
58
|
-
paths.push(_path.default.resolve(simDirectory, 'Library', 'ConfigurationProfiles', 'UserSettings.plist'));
|
|
59
|
-
paths.push(_path.default.resolve(simDirectory, 'Library', 'ConfigurationProfiles', 'EffectiveUserSettings.plist'));
|
|
60
|
-
paths.push(_path.default.resolve(simDirectory, 'Library', 'ConfigurationProfiles', 'PublicInfo', 'PublicEffectiveUserSettings.plist'));
|
|
61
|
-
} else {
|
|
62
|
-
paths.push(_path.default.resolve(simDirectory, 'Library', 'UserConfigurationProfiles', 'UserSettings.plist'));
|
|
63
|
-
paths.push(_path.default.resolve(simDirectory, 'Library', 'UserConfigurationProfiles', 'EffectiveUserSettings.plist'));
|
|
64
|
-
paths.push(_path.default.resolve(simDirectory, 'Library', 'UserConfigurationProfiles', 'PublicInfo', 'PublicEffectiveUserSettings.plist'));
|
|
45
|
+
case PLIST_IDENTIFIER.WEB_INSPECTOR:
|
|
46
|
+
return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.webInspector.plist')];
|
|
47
|
+
case PLIST_IDENTIFIER.MOBILE_SAFARI:
|
|
48
|
+
return [_path.default.resolve(await sim.getAppDir('com.apple.mobilesafari'), 'Library', 'Preferences', 'com.apple.mobilesafari.plist')];
|
|
49
|
+
case PLIST_IDENTIFIER.GLOBAL_MOBILE_SAFARI:
|
|
50
|
+
return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.mobilesafari.plist')];
|
|
51
|
+
case PLIST_IDENTIFIER.WEB_UI:
|
|
52
|
+
return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.WebUI.plist')];
|
|
53
|
+
case PLIST_IDENTIFIER.WEB_FOUNDATION:
|
|
54
|
+
return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.WebFoundation.plist')];
|
|
55
|
+
case PLIST_IDENTIFIER.PREFERENCES:
|
|
56
|
+
return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.Preferences.plist')];
|
|
57
|
+
case PLIST_IDENTIFIER.GLOBAL_PREFERENCES:
|
|
58
|
+
return [_path.default.resolve(simDirectory, 'Library', 'Preferences', '.GlobalPreferences.plist')];
|
|
59
|
+
case PLIST_IDENTIFIER.LOCATION_SERVICES:
|
|
60
|
+
return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.locationd.plist')];
|
|
61
|
+
case PLIST_IDENTIFIER.LOCATION_CLIENTS:
|
|
62
|
+
return [_path.default.resolve(simDirectory, 'Library', 'Caches', 'locationd', 'clients.plist')];
|
|
63
|
+
case PLIST_IDENTIFIER.LOCATION_CACHE:
|
|
64
|
+
return [['Caches', 'locationd', 'cache.plist'], ['Preferences', 'com.apple.locationd.plist']].map(x => _path.default.resolve(simDirectory, 'Library', ...x));
|
|
65
|
+
case PLIST_IDENTIFIER.USER_SETTINGS:
|
|
66
|
+
{
|
|
67
|
+
const profilesDirName = _semver.default.lt(_semver.default.coerce(sim.xcodeVersion.versionString), _semver.default.coerce('7.3')) ? 'ConfigurationProfiles' : 'UserConfigurationProfiles';
|
|
68
|
+
return [['UserSettings.plist'], ['EffectiveUserSettings.plist'], ['PublicInfo', 'PublicEffectiveUserSettings.plist']].map(x => _path.default.resolve(simDirectory, 'Library', profilesDirName, ...x));
|
|
65
69
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
paths.push(_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.uikitservices.userInterfaceStyleMode.plist'));
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
return paths;
|
|
70
|
+
case PLIST_IDENTIFIER.EFFECTIVE_USER_SETTINGS:
|
|
71
|
+
return [['EffectiveUserSettings.plist'], ['PublicInfo', 'PublicEffectiveUserSettings.plist']].map(x => _path.default.resolve(simDirectory, 'Library', 'ConfigurationProfiles', ...x));
|
|
72
|
+
case PLIST_IDENTIFIER.ACCESSIBLITY_SETTINGS:
|
|
73
|
+
return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.Accessibility.plist')];
|
|
74
|
+
case PLIST_IDENTIFIER.UI_STYLE_SETTINGS:
|
|
75
|
+
return [_path.default.resolve(simDirectory, 'Library', 'Preferences', 'com.apple.uikitservices.userInterfaceStyleMode.plist')];
|
|
76
|
+
default:
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
79
|
}
|
|
80
80
|
async function updateSettings(sim, plist, updates) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
const paths = await plistPaths(sim, plist);
|
|
82
|
+
if (_lodash.default.isEmpty(paths)) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const results = await _bluebird.default.all(paths.map(p => update(p, updates)));
|
|
86
|
+
return _lodash.default.some(results, Boolean);
|
|
84
87
|
}
|
|
85
88
|
async function update(pathToPlist, updates) {
|
|
86
89
|
const currentSettings = await read(pathToPlist);
|
|
@@ -92,11 +95,12 @@ async function update(pathToPlist, updates) {
|
|
|
92
95
|
return true;
|
|
93
96
|
}
|
|
94
97
|
async function readSettings(sim, plist) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
+
const paths = await plistPaths(sim, plist);
|
|
99
|
+
if (_lodash.default.isEmpty(paths)) {
|
|
100
|
+
return {};
|
|
98
101
|
}
|
|
99
|
-
|
|
102
|
+
const settings = await _bluebird.default.all(paths.map(read));
|
|
103
|
+
return _lodash.default.fromPairs(_lodash.default.zip(paths, settings));
|
|
100
104
|
}
|
|
101
105
|
async function read(pathToPlist) {
|
|
102
106
|
return await _support.plist.parsePlistFile(pathToPlist, false);
|
|
@@ -106,7 +110,7 @@ async function updateLocationSettings(sim, bundleId, authorized) {
|
|
|
106
110
|
LastFenceActivityTimestamp: 412122103.232983,
|
|
107
111
|
CleanShutdown: true
|
|
108
112
|
};
|
|
109
|
-
|
|
113
|
+
const updated = await updateSettings(sim, PLIST_IDENTIFIER.LOCATION_CACHE, {
|
|
110
114
|
[bundleId]: newCachePrefs
|
|
111
115
|
});
|
|
112
116
|
const newClientPrefs = {
|
|
@@ -114,12 +118,17 @@ async function updateLocationSettings(sim, bundleId, authorized) {
|
|
|
114
118
|
Authorized: !!authorized,
|
|
115
119
|
Whitelisted: false
|
|
116
120
|
};
|
|
117
|
-
|
|
121
|
+
const paths = await plistPaths(sim, PLIST_IDENTIFIER.LOCATION_CLIENTS);
|
|
122
|
+
if (_lodash.default.isEmpty(paths)) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
const contents = await _bluebird.default.all(paths.map(read));
|
|
126
|
+
const promises = [];
|
|
127
|
+
for (const [file, content] of _lodash.default.zip(paths, contents)) {
|
|
118
128
|
_logger.default.debug(`Updating location client file: ${file}`);
|
|
119
|
-
|
|
120
|
-
const plist = await read(file);
|
|
129
|
+
const updates = {};
|
|
121
130
|
const weirdLocKey = 'com.apple.locationd.bundle-/System/Library/' + 'PrivateFrameworks/AOSNotification.framework';
|
|
122
|
-
if (!_lodash.default.has(
|
|
131
|
+
if (!_lodash.default.has(content, weirdLocKey)) {
|
|
123
132
|
updates[weirdLocKey] = {
|
|
124
133
|
BundlePath: '/System/Library/PrivateFrameworks/AOSNotification.framework',
|
|
125
134
|
Whitelisted: false,
|
|
@@ -127,28 +136,31 @@ async function updateLocationSettings(sim, bundleId, authorized) {
|
|
|
127
136
|
Registered: ''
|
|
128
137
|
};
|
|
129
138
|
}
|
|
130
|
-
const baseSetting = _lodash.default.has(
|
|
139
|
+
const baseSetting = _lodash.default.has(content, bundleId) ? content[bundleId] : {};
|
|
131
140
|
updates[bundleId] = _lodash.default.defaults(newClientPrefs, baseSetting);
|
|
132
141
|
updates[bundleId].Executable = updates[bundleId].Executable || '';
|
|
133
142
|
updates[bundleId].Registered = updates[bundleId].Registered || '';
|
|
134
|
-
|
|
143
|
+
promises.push(update(file, updates));
|
|
135
144
|
}
|
|
136
|
-
return updated;
|
|
145
|
+
return (_lodash.default.isEmpty(promises) ? false : _lodash.default.some(await _bluebird.default.all(promises), Boolean)) || updated;
|
|
137
146
|
}
|
|
138
147
|
async function setReduceMotion(sim, reduceMotion = true) {
|
|
139
148
|
_logger.default.debug(`Updating reduce motion. Setting to ${reduceMotion}.`);
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
149
|
+
await updateSettings(sim, PLIST_IDENTIFIER.ACCESSIBLITY_SETTINGS, {
|
|
150
|
+
ReduceMotionEnabled: reduceMotion ? 1 : 0
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
async function setReduceTransparency(sim, reduceTransparency) {
|
|
154
|
+
_logger.default.debug(`Updating reduce tranceparency. Setting to ${reduceTransparency}.`);
|
|
155
|
+
await updateSettings(sim, PLIST_IDENTIFIER.ACCESSIBLITY_SETTINGS, {
|
|
156
|
+
EnhancedBackgroundContrastEnabled: reduceTransparency ? 1 : 0
|
|
157
|
+
});
|
|
146
158
|
}
|
|
147
159
|
async function updateSafariGlobalSettings(sim, settingSet) {
|
|
148
160
|
_logger.default.debug('Updating Safari global settings');
|
|
149
|
-
|
|
150
|
-
for (const [file, safariSettingSet] of _lodash.default.toPairs(await readSettings(sim,
|
|
151
|
-
|
|
161
|
+
const promises = [];
|
|
162
|
+
for (const [file, safariSettingSet] of _lodash.default.toPairs(await readSettings(sim, PLIST_IDENTIFIER.GLOBAL_MOBILE_SAFARI))) {
|
|
163
|
+
const newSettings = {};
|
|
152
164
|
for (const [key, value] of _lodash.default.toPairs(settingSet)) {
|
|
153
165
|
if (safariSettingSet[key] !== value) {
|
|
154
166
|
newSettings[key] = value;
|
|
@@ -157,13 +169,13 @@ async function updateSafariGlobalSettings(sim, settingSet) {
|
|
|
157
169
|
if (_lodash.default.isEmpty(newSettings)) {
|
|
158
170
|
continue;
|
|
159
171
|
}
|
|
160
|
-
|
|
172
|
+
promises.push(update(file, newSettings));
|
|
161
173
|
}
|
|
162
|
-
return
|
|
174
|
+
return _lodash.default.isEmpty(promises) ? false : _lodash.default.some(await _bluebird.default.all(promises), Boolean);
|
|
163
175
|
}
|
|
164
176
|
async function updateSafariUserSettings(sim, settingSet) {
|
|
165
177
|
_logger.default.debug('Updating Safari user settings');
|
|
166
|
-
|
|
178
|
+
const newUserSettings = {};
|
|
167
179
|
if (_lodash.default.has(settingSet, 'WebKitJavaScriptEnabled')) {
|
|
168
180
|
newUserSettings.safariAllowJavaScript = settingSet.WebKitJavaScriptEnabled;
|
|
169
181
|
}
|
|
@@ -176,22 +188,25 @@ async function updateSafariUserSettings(sim, settingSet) {
|
|
|
176
188
|
if (_lodash.default.isEmpty(newUserSettings)) {
|
|
177
189
|
return false;
|
|
178
190
|
}
|
|
179
|
-
|
|
180
|
-
for (const [file, userSettingSet] of _lodash.default.toPairs(await readSettings(sim,
|
|
191
|
+
const promises = [];
|
|
192
|
+
for (const [file, userSettingSet] of _lodash.default.toPairs(await readSettings(sim, PLIST_IDENTIFIER.USER_SETTINGS))) {
|
|
181
193
|
if (!_lodash.default.has(userSettingSet, 'restrictedBool')) {
|
|
182
194
|
userSettingSet.restrictedBool = {};
|
|
183
195
|
}
|
|
184
|
-
for (
|
|
196
|
+
for (const [key, value] of _lodash.default.toPairs(newUserSettings)) {
|
|
185
197
|
userSettingSet.restrictedBool[key] = {
|
|
186
198
|
value
|
|
187
199
|
};
|
|
188
200
|
}
|
|
189
|
-
|
|
201
|
+
promises.push(update(file, userSettingSet));
|
|
190
202
|
}
|
|
191
|
-
return
|
|
203
|
+
return _lodash.default.isEmpty(promises) ? false : _lodash.default.some(await _bluebird.default.all(promises), Boolean);
|
|
192
204
|
}
|
|
193
205
|
async function updateLocale(sim, language, locale, calendarFormat) {
|
|
194
|
-
|
|
206
|
+
const globalPrefs = (await plistPaths(sim, PLIST_IDENTIFIER.GLOBAL_PREFERENCES))[0];
|
|
207
|
+
if (!globalPrefs) {
|
|
208
|
+
throw new Error('Global preferences folder path cannot be retrieved');
|
|
209
|
+
}
|
|
195
210
|
let data = await read(globalPrefs);
|
|
196
211
|
let updates = {};
|
|
197
212
|
if (language) {
|
|
@@ -227,7 +242,4 @@ async function updateLocale(sim, language, locale, calendarFormat) {
|
|
|
227
242
|
await update(globalPrefs, updates);
|
|
228
243
|
return true;
|
|
229
244
|
}
|
|
230
|
-
async function stub() {
|
|
231
|
-
return await plistPaths;
|
|
232
|
-
}
|
|
233
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwbGlzdFBhdGhzIiwic2ltIiwiaWRlbnRpZmllciIsInBhdGhzIiwic2ltRGlyZWN0b3J5IiwiZ2V0RGlyIiwicHVzaCIsInBhdGgiLCJyZXNvbHZlIiwiZ2V0QXBwRGlyIiwic2VtdmVyIiwibHQiLCJjb2VyY2UiLCJ4Y29kZVZlcnNpb24iLCJ2ZXJzaW9uU3RyaW5nIiwidXBkYXRlU2V0dGluZ3MiLCJwbGlzdCIsInVwZGF0ZXMiLCJCIiwicmVkdWNlIiwicmVkdWNlciIsInVwZGF0ZWQiLCJ1cGRhdGUiLCJwYXRoVG9QbGlzdCIsImN1cnJlbnRTZXR0aW5ncyIsInJlYWQiLCJuZXdTZXR0aW5ncyIsIk9iamVjdCIsImFzc2lnbiIsIl8iLCJpc0VxdWFsIiwidXBkYXRlUGxpc3RGaWxlIiwicmVhZFNldHRpbmdzIiwic2V0dGluZ3MiLCJwYXJzZVBsaXN0RmlsZSIsInVwZGF0ZUxvY2F0aW9uU2V0dGluZ3MiLCJidW5kbGVJZCIsImF1dGhvcml6ZWQiLCJuZXdDYWNoZVByZWZzIiwiTGFzdEZlbmNlQWN0aXZpdHlUaW1lc3RhbXAiLCJDbGVhblNodXRkb3duIiwibmV3Q2xpZW50UHJlZnMiLCJCdW5kbGVJZCIsIkF1dGhvcml6ZWQiLCJXaGl0ZWxpc3RlZCIsImZpbGUiLCJsb2ciLCJkZWJ1ZyIsIndlaXJkTG9jS2V5IiwiaGFzIiwiQnVuZGxlUGF0aCIsIkV4ZWN1dGFibGUiLCJSZWdpc3RlcmVkIiwiYmFzZVNldHRpbmciLCJkZWZhdWx0cyIsInNldFJlZHVjZU1vdGlvbiIsInJlZHVjZU1vdGlvbiIsIlJlZHVjZU1vdGlvbkVuYWJsZWQiLCJ1cGRhdGVTYWZhcmlHbG9iYWxTZXR0aW5ncyIsInNldHRpbmdTZXQiLCJzYWZhcmlTZXR0aW5nU2V0IiwidG9QYWlycyIsImtleSIsInZhbHVlIiwiaXNFbXB0eSIsInVwZGF0ZVNhZmFyaVVzZXJTZXR0aW5ncyIsIm5ld1VzZXJTZXR0aW5ncyIsInNhZmFyaUFsbG93SmF2YVNjcmlwdCIsIldlYktpdEphdmFTY3JpcHRFbmFibGVkIiwic2FmYXJpQWxsb3dQb3B1cHMiLCJXZWJLaXRKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5Iiwic2FmYXJpRm9yY2VGcmF1ZFdhcm5pbmciLCJXYXJuQWJvdXRGcmF1ZHVsZW50V2Vic2l0ZXMiLCJ1c2VyU2V0dGluZ1NldCIsInJlc3RyaWN0ZWRCb29sIiwidXBkYXRlTG9jYWxlIiwibGFuZ3VhZ2UiLCJsb2NhbGUiLCJjYWxlbmRhckZvcm1hdCIsImdsb2JhbFByZWZzIiwiZGF0YSIsInN1cHBvcnRlZExhbmdzIiwiQXBwbGVMYW5ndWFnZXMiLCJpbmRleE9mIiwiY29uY2F0Iiwid2l0aG91dCIsImNhbFNwbGl0IiwiY3VyTG9jYWxlQW5kQ2FsIiwiQXBwbGVMb2NhbGUiLCJzcGxpdCIsImN1ckxvYyIsIm5ld0xvY2FsZUFuZENhbCIsInNpemUiLCJzdHViIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3NldHRpbmdzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBwbGlzdCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5cbi8vIHJldHVybnMgcGF0aCB0byBwbGlzdCBiYXNlZCBvbiBpZCBmb3IgcGxpc3QuXG4vLyB0aGVzZSBpZHMgYXJlIGFwcGl1bSB0ZXJtc1xuYXN5bmMgZnVuY3Rpb24gcGxpc3RQYXRocyAoc2ltLCBpZGVudGlmaWVyKSB7XG4gIGxldCBwYXRocyA9IFtdO1xuICBsZXQgc2ltRGlyZWN0b3J5ID0gc2ltLmdldERpcigpO1xuXG4gIHN3aXRjaCAoaWRlbnRpZmllcikge1xuICAgIGNhc2UgJ3dlYkluc3BlY3Rvcic6XG4gICAgICBwYXRocy5wdXNoKHBhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS53ZWJJbnNwZWN0b3IucGxpc3QnKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtb2JpbGVTYWZhcmknOlxuICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoYXdhaXQgc2ltLmdldEFwcERpcignY29tLmFwcGxlLm1vYmlsZXNhZmFyaScpLCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUubW9iaWxlc2FmYXJpLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ2xvYmFsTW9iaWxlU2FmYXJpJzpcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLm1vYmlsZXNhZmFyaS5wbGlzdCcpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3dlYlVJJzpcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLldlYlVJLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnd2ViRm91bmRhdGlvbic6XG4gICAgICBwYXRocy5wdXNoKHBhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5XZWJGb3VuZGF0aW9uLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHJlZmVyZW5jZXMnOlxuICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUuUHJlZmVyZW5jZXMucGxpc3QnKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsb2NhdGlvblNlcnZpY2VzJzpcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLmxvY2F0aW9uZC5wbGlzdCcpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xvY2F0aW9uQ2xpZW50cyc6XG4gICAgICBwYXRocy5wdXNoKHBhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ0NhY2hlcycsICdsb2NhdGlvbmQnLCAnY2xpZW50cy5wbGlzdCcpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xvY2F0aW9uQ2FjaGUnOlxuICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdDYWNoZXMnLCAnbG9jYXRpb25kJywgJ2NhY2hlLnBsaXN0JykpO1xuICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUubG9jYXRpb25kLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndXNlclNldHRpbmdzJzpcbiAgICAgIGlmIChzZW12ZXIubHQoc2VtdmVyLmNvZXJjZShzaW0ueGNvZGVWZXJzaW9uLnZlcnNpb25TdHJpbmcpLCBzZW12ZXIuY29lcmNlKCc3LjMnKSkpIHtcbiAgICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdDb25maWd1cmF0aW9uUHJvZmlsZXMnLCAnVXNlclNldHRpbmdzLnBsaXN0JykpO1xuICAgICAgICBwYXRocy5wdXNoKHBhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ0NvbmZpZ3VyYXRpb25Qcm9maWxlcycsICdFZmZlY3RpdmVVc2VyU2V0dGluZ3MucGxpc3QnKSk7XG4gICAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ1B1YmxpY0luZm8nLCAnUHVibGljRWZmZWN0aXZlVXNlclNldHRpbmdzLnBsaXN0JykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdVc2VyQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ1VzZXJTZXR0aW5ncy5wbGlzdCcpKTtcbiAgICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdVc2VyQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ0VmZmVjdGl2ZVVzZXJTZXR0aW5ncy5wbGlzdCcpKTtcbiAgICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdVc2VyQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ1B1YmxpY0luZm8nLCAnUHVibGljRWZmZWN0aXZlVXNlclNldHRpbmdzLnBsaXN0JykpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZWZmZWN0aXZlVXNlclNldHRpbmdzJzpcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ0VmZmVjdGl2ZVVzZXJTZXR0aW5ncy5wbGlzdCcpKTtcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnQ29uZmlndXJhdGlvblByb2ZpbGVzJywgJ1B1YmxpY0luZm8nLCAnUHVibGljRWZmZWN0aXZlVXNlclNldHRpbmdzLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWNjZXNzaWJpbGl0eVNldHRpbmdzJzpcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLkFjY2Vzc2liaWxpdHkucGxpc3QnKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1aVN0eWxlU2V0dGluZ3MnOlxuICAgICAgcGF0aHMucHVzaChwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUudWlraXRzZXJ2aWNlcy51c2VySW50ZXJmYWNlU3R5bGVNb2RlLnBsaXN0JykpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gcGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNldHRpbmdzIChzaW0sIHBsaXN0LCB1cGRhdGVzKSB7XG4gIHJldHVybiBhd2FpdCBCLnJlZHVjZShhd2FpdCBwbGlzdFBhdGhzKHNpbSwgcGxpc3QpLCBhc3luYyBmdW5jdGlvbiByZWR1Y2VyICh1cGRhdGVkLCBwYXRoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHVwZGF0ZShwYXRoLCB1cGRhdGVzKSB8fCB1cGRhdGVkO1xuICB9LCBmYWxzZSk7XG59XG5cbi8vIHVwZGF0ZSBhIHBsaXN0IGZpbGUsIGxvY2F0ZWQgYXQgcGF0aFRvUGxpc3Rcbi8vIHBhc3MgaW4gYW4gb2JqZWN0LCBhbGwgc2V0dGluZ3Mgc3BlY2lmaWVkIGluIHRoZSBvYmplY3Qgd2lsbCBiZVxuLy8gdXBkYXRlZCBvbiB0aGUgcGxpc3QsIGFsbCBvdGhlcnMgbGVmdCBhcy1pc1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlIChwYXRoVG9QbGlzdCwgdXBkYXRlcykge1xuICBjb25zdCBjdXJyZW50U2V0dGluZ3MgPSBhd2FpdCByZWFkKHBhdGhUb1BsaXN0KTtcbiAgY29uc3QgbmV3U2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBjdXJyZW50U2V0dGluZ3MsIHVwZGF0ZXMpO1xuXG4gIGlmIChfLmlzRXF1YWwoY3VycmVudFNldHRpbmdzLCBuZXdTZXR0aW5ncykpIHtcbiAgICAvLyBubyBzZXR0aW5nIGNoYW5nZXMsIHNvIGRvIG5vdGhpbmdcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhd2FpdCBwbGlzdC51cGRhdGVQbGlzdEZpbGUocGF0aFRvUGxpc3QsIG5ld1NldHRpbmdzLCB0cnVlLCBmYWxzZSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkU2V0dGluZ3MgKHNpbSwgcGxpc3QpIHtcbiAgbGV0IHNldHRpbmdzID0ge307XG4gIGZvciAobGV0IHBhdGggb2YgYXdhaXQgcGxpc3RQYXRocyhzaW0sIHBsaXN0KSkge1xuICAgIHNldHRpbmdzW3BhdGhdID0gYXdhaXQgcmVhZChwYXRoKTtcbiAgfVxuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWQgKHBhdGhUb1BsaXN0KSB7XG4gIHJldHVybiBhd2FpdCBwbGlzdC5wYXJzZVBsaXN0RmlsZShwYXRoVG9QbGlzdCwgZmFsc2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVMb2NhdGlvblNldHRpbmdzIChzaW0sIGJ1bmRsZUlkLCBhdXRob3JpemVkKSB7XG4gIC8vIHVwZGF0ZSBsb2NhdGlvbiBjYWNoZVxuICBjb25zdCBuZXdDYWNoZVByZWZzID0ge1xuICAgIExhc3RGZW5jZUFjdGl2aXR5VGltZXN0YW1wOiA0MTIxMjIxMDMuMjMyOTgzLFxuICAgIENsZWFuU2h1dGRvd246IHRydWVcbiAgfTtcbiAgbGV0IHVwZGF0ZWQgPSBhd2FpdCB1cGRhdGVTZXR0aW5ncyhzaW0sICdsb2NhdGlvbkNhY2hlJywge1tidW5kbGVJZF06IG5ld0NhY2hlUHJlZnN9KTtcblxuICAvLyB1cGRhdGUgbG9jYXRpb24gY2xpZW50c1xuICBjb25zdCBuZXdDbGllbnRQcmVmcyA9IHtcbiAgICBCdW5kbGVJZDogYnVuZGxlSWQsXG4gICAgQXV0aG9yaXplZDogISFhdXRob3JpemVkLFxuICAgIFdoaXRlbGlzdGVkOiBmYWxzZSxcbiAgfTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHBsaXN0UGF0aHMoc2ltLCAnbG9jYXRpb25DbGllbnRzJykpIHtcbiAgICBsb2cuZGVidWcoYFVwZGF0aW5nIGxvY2F0aW9uIGNsaWVudCBmaWxlOiAke2ZpbGV9YCk7XG5cbiAgICBsZXQgdXBkYXRlcyA9IHt9O1xuXG4gICAgLy8gc2VlIGlmIHRoZSBidW5kbGUgaXMgYWxyZWFkeSB0aGVyZVxuICAgIGNvbnN0IHBsaXN0ID0gYXdhaXQgcmVhZChmaWxlKTtcblxuICAgIC8vIHJhbmRvbSBkYXRhIHRoYXQgYWx3YXlzIHNlZW1zIHRvIGJlIGluIHRoZSBjbGllbnRzLnBsaXN0XG4gICAgY29uc3Qgd2VpcmRMb2NLZXkgPSAnY29tLmFwcGxlLmxvY2F0aW9uZC5idW5kbGUtL1N5c3RlbS9MaWJyYXJ5LycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1ByaXZhdGVGcmFtZXdvcmtzL0FPU05vdGlmaWNhdGlvbi5mcmFtZXdvcmsnO1xuICAgIGlmICghXy5oYXMocGxpc3QsIHdlaXJkTG9jS2V5KSkge1xuICAgICAgdXBkYXRlc1t3ZWlyZExvY0tleV0gPSB7XG4gICAgICAgIEJ1bmRsZVBhdGg6ICcvU3lzdGVtL0xpYnJhcnkvUHJpdmF0ZUZyYW1ld29ya3MvQU9TTm90aWZpY2F0aW9uLmZyYW1ld29yaycsXG4gICAgICAgIFdoaXRlbGlzdGVkOiBmYWxzZSxcbiAgICAgICAgRXhlY3V0YWJsZTogJycsXG4gICAgICAgIFJlZ2lzdGVyZWQ6ICcnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSB0aGUgdXBkYXRlLCBhbmQgbWFrZSBzdXJlIGl0IGhhcyBzZW5zaWJsZSB2YWx1ZXNcbiAgICBjb25zdCBiYXNlU2V0dGluZyA9IF8uaGFzKHBsaXN0LCBidW5kbGVJZCkgPyBwbGlzdFtidW5kbGVJZF0gOiB7fTtcbiAgICB1cGRhdGVzW2J1bmRsZUlkXSA9IF8uZGVmYXVsdHMobmV3Q2xpZW50UHJlZnMsIGJhc2VTZXR0aW5nKTtcbiAgICB1cGRhdGVzW2J1bmRsZUlkXS5FeGVjdXRhYmxlID0gdXBkYXRlc1tidW5kbGVJZF0uRXhlY3V0YWJsZSB8fCAnJztcbiAgICB1cGRhdGVzW2J1bmRsZUlkXS5SZWdpc3RlcmVkID0gdXBkYXRlc1tidW5kbGVJZF0uUmVnaXN0ZXJlZCB8fCAnJztcblxuICAgIHVwZGF0ZWQgPSBhd2FpdCB1cGRhdGUoZmlsZSwgdXBkYXRlcykgfHwgdXBkYXRlZDtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRSZWR1Y2VNb3Rpb24gKHNpbSwgcmVkdWNlTW90aW9uID0gdHJ1ZSkge1xuICBsb2cuZGVidWcoYFVwZGF0aW5nIHJlZHVjZSBtb3Rpb24uIFNldHRpbmcgdG8gJHtyZWR1Y2VNb3Rpb259LmApO1xuICBjb25zdCBwYXRocyA9IGF3YWl0IHBsaXN0UGF0aHMoc2ltLCAnYWNjZXNzaWJpbGl0eVNldHRpbmdzJyk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBwYXRocykge1xuICAgIGF3YWl0IHVwZGF0ZShmaWxlLCB7XG4gICAgICBSZWR1Y2VNb3Rpb25FbmFibGVkOiByZWR1Y2VNb3Rpb24gPyAxIDogMFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNhZmFyaUdsb2JhbFNldHRpbmdzIChzaW0sIHNldHRpbmdTZXQpIHtcbiAgbG9nLmRlYnVnKCdVcGRhdGluZyBTYWZhcmkgZ2xvYmFsIHNldHRpbmdzJyk7XG5cbiAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbZmlsZSwgc2FmYXJpU2V0dGluZ1NldF0gb2YgXy50b1BhaXJzKGF3YWl0IHJlYWRTZXR0aW5ncyhzaW0sICdnbG9iYWxNb2JpbGVTYWZhcmknKSkpIHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoc2V0dGluZ1NldCkpIHtcbiAgICAgIGlmIChzYWZhcmlTZXR0aW5nU2V0W2tleV0gIT09IHZhbHVlKSB7XG4gICAgICAgIG5ld1NldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShuZXdTZXR0aW5ncykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHVwZGF0ZWQgPSBhd2FpdCB1cGRhdGUoZmlsZSwgbmV3U2V0dGluZ3MpIHx8IHVwZGF0ZWQ7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNhZmFyaVVzZXJTZXR0aW5ncyAoc2ltLCBzZXR0aW5nU2V0KSB7XG4gIGxvZy5kZWJ1ZygnVXBkYXRpbmcgU2FmYXJpIHVzZXIgc2V0dGluZ3MnKTtcblxuICAvLyBhZGQgZXh0cmEgc3R1ZmYgdG8gVXNlclNldHRpbmdzLnBsaXN0IGFuZCBFZmZlY3RpdmVVc2VyU2V0dGluZ3MucGxpc3RcbiAgbGV0IG5ld1VzZXJTZXR0aW5ncyA9IHt9O1xuICBpZiAoXy5oYXMoc2V0dGluZ1NldCwgJ1dlYktpdEphdmFTY3JpcHRFbmFibGVkJykpIHtcbiAgICBuZXdVc2VyU2V0dGluZ3Muc2FmYXJpQWxsb3dKYXZhU2NyaXB0ID0gc2V0dGluZ1NldC5XZWJLaXRKYXZhU2NyaXB0RW5hYmxlZDtcbiAgfVxuICBpZiAoXy5oYXMoc2V0dGluZ1NldCwgJ1dlYktpdEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHknKSkge1xuICAgIG5ld1VzZXJTZXR0aW5ncy5zYWZhcmlBbGxvd1BvcHVwcyA9IHNldHRpbmdTZXQuV2ViS2l0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseTtcbiAgfVxuICBpZiAoXy5oYXMoc2V0dGluZ1NldCwgJ1dhcm5BYm91dEZyYXVkdWxlbnRXZWJzaXRlcycpKSB7XG4gICAgbmV3VXNlclNldHRpbmdzLnNhZmFyaUZvcmNlRnJhdWRXYXJuaW5nID0gIXNldHRpbmdTZXQuV2FybkFib3V0RnJhdWR1bGVudFdlYnNpdGVzO1xuICB9XG5cbiAgaWYgKF8uaXNFbXB0eShuZXdVc2VyU2V0dGluZ3MpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbZmlsZSwgdXNlclNldHRpbmdTZXRdIG9mIF8udG9QYWlycyhhd2FpdCByZWFkU2V0dGluZ3Moc2ltLCAndXNlclNldHRpbmdzJykpKSB7XG4gICAgLy8gdGhlIHVzZXIgc2V0dGluZ3MgcGxpc3QgaGFzIHR3byBidWNrZXRzLCBvbmUgZm9yXG4gICAgLy8gYm9vbGVhbiBzZXR0aW5ncyAoYHJlc3RyaWN0ZWRCb29sYCkgYW5kIG9uZSBmb3JcbiAgICAvLyBvdGhlciB2YWx1ZSBzZXR0aW5ncyAoYHJlc3RyaWN0ZWRWYWx1ZWApLiBJbiBlYWNoLCB0aGUgdmFsdWVcbiAgICAvLyBpcyBpbiBhIGB2YWx1ZWAgc3ViLWZpZWxkLlxuICAgIGlmICghXy5oYXModXNlclNldHRpbmdTZXQsICdyZXN0cmljdGVkQm9vbCcpKSB7XG4gICAgICB1c2VyU2V0dGluZ1NldC5yZXN0cmljdGVkQm9vbCA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKG5ld1VzZXJTZXR0aW5ncykpIHtcbiAgICAgIHVzZXJTZXR0aW5nU2V0LnJlc3RyaWN0ZWRCb29sW2tleV0gPSB7dmFsdWV9O1xuICAgIH1cblxuICAgIC8vIGFjdHVhbGx5IGRvIHRoZSB1cGRhdGVcbiAgICB1cGRhdGVkID0gYXdhaXQgdXBkYXRlKGZpbGUsIHVzZXJTZXR0aW5nU2V0KSB8fCB1cGRhdGVkO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZSAoc2ltLCBsYW5ndWFnZSwgbG9jYWxlLCBjYWxlbmRhckZvcm1hdCkge1xuICBsZXQgZ2xvYmFsUHJlZnMgPSBwYXRoLnJlc29sdmUoc2ltLmdldERpcigpLCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLkdsb2JhbFByZWZlcmVuY2VzLnBsaXN0Jyk7XG5cbiAgLy8gZ2V0IHRoZSBjdXJyZW50IGRhdGFcbiAgbGV0IGRhdGEgPSBhd2FpdCByZWFkKGdsb2JhbFByZWZzKTtcbiAgbGV0IHVwZGF0ZXMgPSB7fTtcblxuICAvLyBpZiB3ZSBhcmUgc2V0dGluZyB0aGUgbGFuZ3VhZ2UsIGFkZCBpdCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IG9mIGxhbmd1YWdlc1xuICBpZiAobGFuZ3VhZ2UpIHtcbiAgICBsb2cuZGVidWcoYE5ldyBsYW5ndWFnZTogJHtsYW5ndWFnZX1gKTtcbiAgICBsZXQgc3VwcG9ydGVkTGFuZ3MgPSBkYXRhLkFwcGxlTGFuZ3VhZ2VzIHx8IFtdO1xuICAgIC8vIGlmIHRoZSBsYW5ndWFnZSBpcyBmaXJzdCwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgIGlmIChzdXBwb3J0ZWRMYW5ncy5pbmRleE9mKGxhbmd1YWdlKSAhPT0gMCkge1xuICAgICAgdXBkYXRlcy5BcHBsZUxhbmd1YWdlcyA9IFtsYW5ndWFnZV0uY29uY2F0KF8ud2l0aG91dChzdXBwb3J0ZWRMYW5ncywgbGFuZ3VhZ2UpKTtcbiAgICB9XG4gIH1cbiAgLy8gaWYgd2UgYXJlIHNldHRpbmcgdGhlIGxvY2FsZSBvciBjYWxlbmRhciBmb3JtYXQsIHNldCB0aGVtIGFzIGFwcHJvcHJpYXRlXG4gIGlmIChsb2NhbGUgfHwgY2FsZW5kYXJGb3JtYXQpIHtcbiAgICBsZXQgY2FsU3BsaXQgPSAnQGNhbGVuZGFyPSc7XG4gICAgbGV0IGN1ckxvY2FsZUFuZENhbCA9IGRhdGEuQXBwbGVMb2NhbGUgfHwgbGFuZ3VhZ2UgfHwgJ2VuJztcblxuICAgIGxldCBzcGxpdCA9IGN1ckxvY2FsZUFuZENhbC5zcGxpdChjYWxTcGxpdCk7XG4gICAgbGV0IGN1ckxvYyA9IHNwbGl0WzBdO1xuICAgIGlmIChjYWxlbmRhckZvcm1hdCB8fCBzcGxpdFsxXSkge1xuICAgICAgY2FsZW5kYXJGb3JtYXQgPSBgJHtjYWxTcGxpdH0ke2NhbGVuZGFyRm9ybWF0IHx8IHNwbGl0WzFdIHx8ICcnfWA7XG4gICAgfVxuICAgIGNhbGVuZGFyRm9ybWF0ID0gY2FsZW5kYXJGb3JtYXQgfHwgJyc7XG4gICAgbGV0IG5ld0xvY2FsZUFuZENhbCA9IGxvY2FsZSA/IGxvY2FsZSA6IGN1ckxvYztcbiAgICBpZiAoY2FsZW5kYXJGb3JtYXQpIHtcbiAgICAgIG5ld0xvY2FsZUFuZENhbCA9IGAke25ld0xvY2FsZUFuZENhbH0ke2NhbGVuZGFyRm9ybWF0fWA7XG4gICAgfVxuICAgIC8vIG9ubHkgbmVlZCB0byB1cGRhdGUgaWYgaXQgaGFzIGNoYW5nZWRcbiAgICBpZiAobmV3TG9jYWxlQW5kQ2FsICE9PSBjdXJMb2NhbGVBbmRDYWwpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgTmV3IGxvY2FsZTogJHtuZXdMb2NhbGVBbmRDYWx9YCk7XG4gICAgICB1cGRhdGVzLkFwcGxlTG9jYWxlID0gbmV3TG9jYWxlQW5kQ2FsO1xuICAgIH1cbiAgfVxuXG4gIGlmIChfLnNpemUodXBkYXRlcykgPT09IDApIHtcbiAgICBsb2cuZGVidWcoJ05vIGxvY2FsZSB1cGRhdGVzIG5lY2Vzc2FyeS4nKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsb2cuZGVidWcoJ1dyaXRpbmcgbmV3IGxvY2FsZSBwbGlzdCBkYXRhJyk7XG4gIGF3YWl0IHVwZGF0ZShnbG9iYWxQcmVmcywgdXBkYXRlcyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdHViICgpIHtcbiAgcmV0dXJuIGF3YWl0IHBsaXN0UGF0aHM7XG59XG5cbmV4cG9ydCB7XG4gIHVwZGF0ZSwgdXBkYXRlU2V0dGluZ3MsIHVwZGF0ZUxvY2F0aW9uU2V0dGluZ3MsIHNldFJlZHVjZU1vdGlvbixcbiAgdXBkYXRlU2FmYXJpVXNlclNldHRpbmdzLCB1cGRhdGVTYWZhcmlHbG9iYWxTZXR0aW5ncywgdXBkYXRlTG9jYWxlLCByZWFkLFxuICByZWFkU2V0dGluZ3MsIHN0dWIsXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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
|
|
245
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQTElTVF9JREVOVElGSUVSIiwiT2JqZWN0IiwiZnJlZXplIiwiV0VCX0lOU1BFQ1RPUiIsIk1PQklMRV9TQUZBUkkiLCJHTE9CQUxfTU9CSUxFX1NBRkFSSSIsIldFQl9VSSIsIldFQl9GT1VOREFUSU9OIiwiUFJFRkVSRU5DRVMiLCJHTE9CQUxfUFJFRkVSRU5DRVMiLCJMT0NBVElPTl9TRVJWSUNFUyIsIkxPQ0FUSU9OX0NMSUVOVFMiLCJMT0NBVElPTl9DQUNIRSIsIlVTRVJfU0VUVElOR1MiLCJFRkZFQ1RJVkVfVVNFUl9TRVRUSU5HUyIsIkFDQ0VTU0lCTElUWV9TRVRUSU5HUyIsIlVJX1NUWUxFX1NFVFRJTkdTIiwicGxpc3RQYXRocyIsInNpbSIsImlkZW50aWZpZXIiLCJzaW1EaXJlY3RvcnkiLCJnZXREaXIiLCJwYXRoIiwicmVzb2x2ZSIsImdldEFwcERpciIsIm1hcCIsIngiLCJwcm9maWxlc0Rpck5hbWUiLCJzZW12ZXIiLCJsdCIsImNvZXJjZSIsInhjb2RlVmVyc2lvbiIsInZlcnNpb25TdHJpbmciLCJ1cGRhdGVTZXR0aW5ncyIsInBsaXN0IiwidXBkYXRlcyIsInBhdGhzIiwiXyIsImlzRW1wdHkiLCJyZXN1bHRzIiwiQiIsImFsbCIsInAiLCJ1cGRhdGUiLCJzb21lIiwiQm9vbGVhbiIsInBhdGhUb1BsaXN0IiwiY3VycmVudFNldHRpbmdzIiwicmVhZCIsIm5ld1NldHRpbmdzIiwiYXNzaWduIiwiaXNFcXVhbCIsInVwZGF0ZVBsaXN0RmlsZSIsInJlYWRTZXR0aW5ncyIsInNldHRpbmdzIiwiZnJvbVBhaXJzIiwiemlwIiwicGFyc2VQbGlzdEZpbGUiLCJ1cGRhdGVMb2NhdGlvblNldHRpbmdzIiwiYnVuZGxlSWQiLCJhdXRob3JpemVkIiwibmV3Q2FjaGVQcmVmcyIsIkxhc3RGZW5jZUFjdGl2aXR5VGltZXN0YW1wIiwiQ2xlYW5TaHV0ZG93biIsInVwZGF0ZWQiLCJuZXdDbGllbnRQcmVmcyIsIkJ1bmRsZUlkIiwiQXV0aG9yaXplZCIsIldoaXRlbGlzdGVkIiwiY29udGVudHMiLCJwcm9taXNlcyIsImZpbGUiLCJjb250ZW50IiwibG9nIiwiZGVidWciLCJ3ZWlyZExvY0tleSIsImhhcyIsIkJ1bmRsZVBhdGgiLCJFeGVjdXRhYmxlIiwiUmVnaXN0ZXJlZCIsImJhc2VTZXR0aW5nIiwiZGVmYXVsdHMiLCJwdXNoIiwic2V0UmVkdWNlTW90aW9uIiwicmVkdWNlTW90aW9uIiwiUmVkdWNlTW90aW9uRW5hYmxlZCIsInNldFJlZHVjZVRyYW5zcGFyZW5jeSIsInJlZHVjZVRyYW5zcGFyZW5jeSIsIkVuaGFuY2VkQmFja2dyb3VuZENvbnRyYXN0RW5hYmxlZCIsInVwZGF0ZVNhZmFyaUdsb2JhbFNldHRpbmdzIiwic2V0dGluZ1NldCIsInNhZmFyaVNldHRpbmdTZXQiLCJ0b1BhaXJzIiwia2V5IiwidmFsdWUiLCJ1cGRhdGVTYWZhcmlVc2VyU2V0dGluZ3MiLCJuZXdVc2VyU2V0dGluZ3MiLCJzYWZhcmlBbGxvd0phdmFTY3JpcHQiLCJXZWJLaXRKYXZhU2NyaXB0RW5hYmxlZCIsInNhZmFyaUFsbG93UG9wdXBzIiwiV2ViS2l0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSIsInNhZmFyaUZvcmNlRnJhdWRXYXJuaW5nIiwiV2FybkFib3V0RnJhdWR1bGVudFdlYnNpdGVzIiwidXNlclNldHRpbmdTZXQiLCJyZXN0cmljdGVkQm9vbCIsInVwZGF0ZUxvY2FsZSIsImxhbmd1YWdlIiwibG9jYWxlIiwiY2FsZW5kYXJGb3JtYXQiLCJnbG9iYWxQcmVmcyIsIkVycm9yIiwiZGF0YSIsInN1cHBvcnRlZExhbmdzIiwiQXBwbGVMYW5ndWFnZXMiLCJpbmRleE9mIiwiY29uY2F0Iiwid2l0aG91dCIsImNhbFNwbGl0IiwiY3VyTG9jYWxlQW5kQ2FsIiwiQXBwbGVMb2NhbGUiLCJzcGxpdCIsImN1ckxvYyIsIm5ld0xvY2FsZUFuZENhbCIsInNpemUiXSwic291cmNlcyI6WyIuLi8uLi9saWIvc2V0dGluZ3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHBsaXN0IH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5cbmNvbnN0IFBMSVNUX0lERU5USUZJRVIgPSBPYmplY3QuZnJlZXplKHtcbiAgV0VCX0lOU1BFQ1RPUjogJ3dlYkluc3BlY3RvcicsXG4gIE1PQklMRV9TQUZBUkk6ICdtb2JpbGVTYWZhcmknLFxuICBHTE9CQUxfTU9CSUxFX1NBRkFSSTogJ2dsb2JhbE1vYmlsZVNhZmFyaScsXG4gIFdFQl9VSTogJ3dlYlVJJyxcbiAgV0VCX0ZPVU5EQVRJT046ICd3ZWJGb3VuZGF0aW9uJyxcbiAgUFJFRkVSRU5DRVM6ICdwcmVmZXJlbmNlcycsXG4gIEdMT0JBTF9QUkVGRVJFTkNFUzogJ2dsb2JhbFByZWZlcmVuY2VzJyxcbiAgTE9DQVRJT05fU0VSVklDRVM6ICdsb2NhdGlvblNlcnZpY2VzJyxcbiAgTE9DQVRJT05fQ0xJRU5UUzogJ2xvY2F0aW9uQ2xpZW50cycsXG4gIExPQ0FUSU9OX0NBQ0hFOiAnbG9jYXRpb25DYWNoZScsXG4gIFVTRVJfU0VUVElOR1M6ICd1c2VyU2V0dGluZ3MnLFxuICBFRkZFQ1RJVkVfVVNFUl9TRVRUSU5HUzogJ2VmZmVjdGl2ZVVzZXJTZXR0aW5ncycsXG4gIEFDQ0VTU0lCTElUWV9TRVRUSU5HUzogJ2FjY2Vzc2liaWxpdHlTZXR0aW5ncycsXG4gIFVJX1NUWUxFX1NFVFRJTkdTOiAndWlTdHlsZVNldHRpbmdzJyxcbn0pO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBtYXRjaGluZyBkaXJlY3RvcnkgcGF0aHMgZm9yIHRoZSBnaXZlbiBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHNpbSBTaW11bGF0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZGVudGlmaWVyIE9uZSBvZiBzdXBwb3J0ZWQgcGF0aCBpZGVudGlmaWVyc1xuICogQHJldHVybnMge3N0cmluZ1tdfSBUaGUgbGlzdCBvZiBtYXRjaGVkIHBhdGhzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBsaXN0UGF0aHMgKHNpbSwgaWRlbnRpZmllcikge1xuICBjb25zdCBzaW1EaXJlY3RvcnkgPSBzaW0uZ2V0RGlyKCk7XG5cbiAgc3dpdGNoIChpZGVudGlmaWVyKSB7XG4gICAgY2FzZSBQTElTVF9JREVOVElGSUVSLldFQl9JTlNQRUNUT1I6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS53ZWJJbnNwZWN0b3IucGxpc3QnKV07XG4gICAgY2FzZSBQTElTVF9JREVOVElGSUVSLk1PQklMRV9TQUZBUkk6XG4gICAgICByZXR1cm4gW1xuICAgICAgICBwYXRoLnJlc29sdmUoYXdhaXQgc2ltLmdldEFwcERpcignY29tLmFwcGxlLm1vYmlsZXNhZmFyaScpLCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUubW9iaWxlc2FmYXJpLnBsaXN0JylcbiAgICAgIF07XG4gICAgY2FzZSBQTElTVF9JREVOVElGSUVSLkdMT0JBTF9NT0JJTEVfU0FGQVJJOlxuICAgICAgcmV0dXJuIFtwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsICdQcmVmZXJlbmNlcycsICdjb20uYXBwbGUubW9iaWxlc2FmYXJpLnBsaXN0JyldO1xuICAgIGNhc2UgUExJU1RfSURFTlRJRklFUi5XRUJfVUk6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5XZWJVSS5wbGlzdCcpXTtcbiAgICBjYXNlIFBMSVNUX0lERU5USUZJRVIuV0VCX0ZPVU5EQVRJT046XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5XZWJGb3VuZGF0aW9uLnBsaXN0JyldO1xuICAgIGNhc2UgUExJU1RfSURFTlRJRklFUi5QUkVGRVJFTkNFUzpcbiAgICAgIHJldHVybiBbcGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLlByZWZlcmVuY2VzLnBsaXN0JyldO1xuICAgIGNhc2UgUExJU1RfSURFTlRJRklFUi5HTE9CQUxfUFJFRkVSRU5DRVM6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJy5HbG9iYWxQcmVmZXJlbmNlcy5wbGlzdCcpXTtcbiAgICBjYXNlIFBMSVNUX0lERU5USUZJRVIuTE9DQVRJT05fU0VSVklDRVM6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5sb2NhdGlvbmQucGxpc3QnKV07XG4gICAgY2FzZSBQTElTVF9JREVOVElGSUVSLkxPQ0FUSU9OX0NMSUVOVFM6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ0NhY2hlcycsICdsb2NhdGlvbmQnLCAnY2xpZW50cy5wbGlzdCcpXTtcbiAgICBjYXNlIFBMSVNUX0lERU5USUZJRVIuTE9DQVRJT05fQ0FDSEU6XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbJ0NhY2hlcycsICdsb2NhdGlvbmQnLCAnY2FjaGUucGxpc3QnXSxcbiAgICAgICAgWydQcmVmZXJlbmNlcycsICdjb20uYXBwbGUubG9jYXRpb25kLnBsaXN0J11cbiAgICAgIF0ubWFwKCh4KSA9PiBwYXRoLnJlc29sdmUoc2ltRGlyZWN0b3J5LCAnTGlicmFyeScsIC4uLngpKTtcbiAgICBjYXNlIFBMSVNUX0lERU5USUZJRVIuVVNFUl9TRVRUSU5HUzoge1xuICAgICAgY29uc3QgcHJvZmlsZXNEaXJOYW1lID0gc2VtdmVyLmx0KHNlbXZlci5jb2VyY2Uoc2ltLnhjb2RlVmVyc2lvbi52ZXJzaW9uU3RyaW5nKSwgc2VtdmVyLmNvZXJjZSgnNy4zJykpXG4gICAgICAgID8gJ0NvbmZpZ3VyYXRpb25Qcm9maWxlcydcbiAgICAgICAgOiAnVXNlckNvbmZpZ3VyYXRpb25Qcm9maWxlcyc7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbJ1VzZXJTZXR0aW5ncy5wbGlzdCddLFxuICAgICAgICBbJ0VmZmVjdGl2ZVVzZXJTZXR0aW5ncy5wbGlzdCddLFxuICAgICAgICBbJ1B1YmxpY0luZm8nLCAnUHVibGljRWZmZWN0aXZlVXNlclNldHRpbmdzLnBsaXN0J10sXG4gICAgICBdLm1hcCgoeCkgPT4gcGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCBwcm9maWxlc0Rpck5hbWUsIC4uLngpKTtcbiAgICB9XG4gICAgY2FzZSBQTElTVF9JREVOVElGSUVSLkVGRkVDVElWRV9VU0VSX1NFVFRJTkdTOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgWydFZmZlY3RpdmVVc2VyU2V0dGluZ3MucGxpc3QnXSxcbiAgICAgICAgWydQdWJsaWNJbmZvJywgJ1B1YmxpY0VmZmVjdGl2ZVVzZXJTZXR0aW5ncy5wbGlzdCddXG4gICAgICBdLm1hcCgoeCkgPT4gcGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnQ29uZmlndXJhdGlvblByb2ZpbGVzJywgLi4ueCkpO1xuICAgIGNhc2UgUExJU1RfSURFTlRJRklFUi5BQ0NFU1NJQkxJVFlfU0VUVElOR1M6XG4gICAgICByZXR1cm4gW3BhdGgucmVzb2x2ZShzaW1EaXJlY3RvcnksICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5BY2Nlc3NpYmlsaXR5LnBsaXN0JyldO1xuICAgIGNhc2UgUExJU1RfSURFTlRJRklFUi5VSV9TVFlMRV9TRVRUSU5HUzpcbiAgICAgIHJldHVybiBbcGF0aC5yZXNvbHZlKHNpbURpcmVjdG9yeSwgJ0xpYnJhcnknLCAnUHJlZmVyZW5jZXMnLCAnY29tLmFwcGxlLnVpa2l0c2VydmljZXMudXNlckludGVyZmFjZVN0eWxlTW9kZS5wbGlzdCcpXTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8qKlxuICogVXBkYXRlcyBwbGlzdCBmaWxlcyB3aXRoIHRoZSBnaXZlbiBQTElTVF9JREVOVElGSUVSXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHNpbSBTaW11bGF0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGlzdCBPbmUgb2YgUExJU1RfSURFTlRJRklFUiBjb25zdGFudHNcbiAqIEBwYXJhbSB7b2JqZWN0fSB1cGRhdGVzIFBsaXN0IHVwZGF0ZXMgdG8gYXBwbHlcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSAucGxpc3QgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNldHRpbmdzIChzaW0sIHBsaXN0LCB1cGRhdGVzKSB7XG4gIGNvbnN0IHBhdGhzID0gYXdhaXQgcGxpc3RQYXRocyhzaW0sIHBsaXN0KTtcbiAgaWYgKF8uaXNFbXB0eShwYXRocykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IEIuYWxsKHBhdGhzLm1hcCgocCkgPT4gdXBkYXRlKHAsIHVwZGF0ZXMpKSk7XG4gIHJldHVybiBfLnNvbWUocmVzdWx0cywgQm9vbGVhbik7XG59XG5cbi8qKlxuICogVXBkYXRlIGEgcGxpc3QgZmlsZSwgbG9jYXRlZCBhdCBwYXRoVG9QbGlzdFxuICogcGFzcyBpbiBhbiBvYmplY3QsIGFsbCBzZXR0aW5ncyBzcGVjaWZpZWQgaW4gdGhlIG9iamVjdCB3aWxsIGJlXG4gKiB1cGRhdGVkIG9uIHRoZSBwbGlzdCwgYWxsIG90aGVycyBsZWZ0IGFzLWlzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhUb1BsaXN0IFRoZSBmdWxsIHBhdGggdG8gLnBsaXN0IGZpbGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB1cGRhdGVzIEFjdHVhbCB1cGRhdGVzIG9iamVjdCB0byBhcHBseVxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdXBkYXRlcyB3ZXJlIGFwcGxpZWQgYW5kIGNoYW5nZWQgdGhlIGFjdHVhbCBwbGlzdFxuICovXG5hc3luYyBmdW5jdGlvbiB1cGRhdGUgKHBhdGhUb1BsaXN0LCB1cGRhdGVzKSB7XG4gIGNvbnN0IGN1cnJlbnRTZXR0aW5ncyA9IGF3YWl0IHJlYWQocGF0aFRvUGxpc3QpO1xuICBjb25zdCBuZXdTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnRTZXR0aW5ncywgdXBkYXRlcyk7XG5cbiAgaWYgKF8uaXNFcXVhbChjdXJyZW50U2V0dGluZ3MsIG5ld1NldHRpbmdzKSkge1xuICAgIC8vIG5vIHNldHRpbmcgY2hhbmdlcywgc28gZG8gbm90aGluZ1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGF3YWl0IHBsaXN0LnVwZGF0ZVBsaXN0RmlsZShwYXRoVG9QbGlzdCwgbmV3U2V0dGluZ3MsIHRydWUsIGZhbHNlKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gLnBsaXN0IGZpbGVzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHNpbSBTaW11bGF0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGlzdCBPbmUgb2YgUExJU1RfSURFTlRJRklFUiBjb25zdGFudHNcbiAqIEByZXR1cm5zIHtvYmplY3R9IE1hcHBpbmcgd2hlcmUga2V5cyBhcmUgZmlsZSBwYXRocyBhbmQgdmFsdWVzIGFyZSB0aGVpciBjb250ZW50c1xuICovXG5hc3luYyBmdW5jdGlvbiByZWFkU2V0dGluZ3MgKHNpbSwgcGxpc3QpIHtcbiAgY29uc3QgcGF0aHMgPSBhd2FpdCBwbGlzdFBhdGhzKHNpbSwgcGxpc3QpO1xuICBpZiAoXy5pc0VtcHR5KHBhdGhzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBjb25zdCBzZXR0aW5ncyA9IGF3YWl0IEIuYWxsKHBhdGhzLm1hcChyZWFkKSk7XG4gIHJldHVybiBfLmZyb21QYWlycyhfLnppcChwYXRocywgc2V0dGluZ3MpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgZGF0YSBmcm9tIHRoZSBnaXZlbiAucGxpc3QgZmlsZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoVG9QbGlzdCBGdWxsIHBhdGggdG8gYSAuc3BsaXN0IGZpbGVcbiAqIEByZXR1cm5zIHsqfSBQbGlzdCBjb250ZW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWQgKHBhdGhUb1BsaXN0KSB7XG4gIHJldHVybiBhd2FpdCBwbGlzdC5wYXJzZVBsaXN0RmlsZShwYXRoVG9QbGlzdCwgZmFsc2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVMb2NhdGlvblNldHRpbmdzIChzaW0sIGJ1bmRsZUlkLCBhdXRob3JpemVkKSB7XG4gIC8vIHVwZGF0ZSBsb2NhdGlvbiBjYWNoZVxuICBjb25zdCBuZXdDYWNoZVByZWZzID0ge1xuICAgIExhc3RGZW5jZUFjdGl2aXR5VGltZXN0YW1wOiA0MTIxMjIxMDMuMjMyOTgzLFxuICAgIENsZWFuU2h1dGRvd246IHRydWVcbiAgfTtcbiAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHVwZGF0ZVNldHRpbmdzKHNpbSwgUExJU1RfSURFTlRJRklFUi5MT0NBVElPTl9DQUNIRSwge1xuICAgIFtidW5kbGVJZF06IG5ld0NhY2hlUHJlZnNcbiAgfSk7XG5cbiAgLy8gdXBkYXRlIGxvY2F0aW9uIGNsaWVudHNcbiAgY29uc3QgbmV3Q2xpZW50UHJlZnMgPSB7XG4gICAgQnVuZGxlSWQ6IGJ1bmRsZUlkLFxuICAgIEF1dGhvcml6ZWQ6ICEhYXV0aG9yaXplZCxcbiAgICBXaGl0ZWxpc3RlZDogZmFsc2UsXG4gIH07XG5cbiAgY29uc3QgcGF0aHMgPSBhd2FpdCBwbGlzdFBhdGhzKHNpbSwgUExJU1RfSURFTlRJRklFUi5MT0NBVElPTl9DTElFTlRTKTtcbiAgaWYgKF8uaXNFbXB0eShwYXRocykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY29udGVudHMgPSBhd2FpdCBCLmFsbChwYXRocy5tYXAocmVhZCkpO1xuICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlLCBjb250ZW50XSBvZiBfLnppcChwYXRocywgY29udGVudHMpKSB7XG4gICAgbG9nLmRlYnVnKGBVcGRhdGluZyBsb2NhdGlvbiBjbGllbnQgZmlsZTogJHtmaWxlfWApO1xuXG4gICAgY29uc3QgdXBkYXRlcyA9IHt9O1xuICAgIC8vIHJhbmRvbSBkYXRhIHRoYXQgYWx3YXlzIHNlZW1zIHRvIGJlIGluIHRoZSBjbGllbnRzLnBsaXN0XG4gICAgY29uc3Qgd2VpcmRMb2NLZXkgPSAnY29tLmFwcGxlLmxvY2F0aW9uZC5idW5kbGUtL1N5c3RlbS9MaWJyYXJ5LycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1ByaXZhdGVGcmFtZXdvcmtzL0FPU05vdGlmaWNhdGlvbi5mcmFtZXdvcmsnO1xuICAgIGlmICghXy5oYXMoY29udGVudCwgd2VpcmRMb2NLZXkpKSB7XG4gICAgICB1cGRhdGVzW3dlaXJkTG9jS2V5XSA9IHtcbiAgICAgICAgQnVuZGxlUGF0aDogJy9TeXN0ZW0vTGlicmFyeS9Qcml2YXRlRnJhbWV3b3Jrcy9BT1NOb3RpZmljYXRpb24uZnJhbWV3b3JrJyxcbiAgICAgICAgV2hpdGVsaXN0ZWQ6IGZhbHNlLFxuICAgICAgICBFeGVjdXRhYmxlOiAnJyxcbiAgICAgICAgUmVnaXN0ZXJlZDogJydcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIGNyZWF0ZSB0aGUgdXBkYXRlLCBhbmQgbWFrZSBzdXJlIGl0IGhhcyBzZW5zaWJsZSB2YWx1ZXNcbiAgICBjb25zdCBiYXNlU2V0dGluZyA9IF8uaGFzKGNvbnRlbnQsIGJ1bmRsZUlkKSA/IGNvbnRlbnRbYnVuZGxlSWRdIDoge307XG4gICAgdXBkYXRlc1tidW5kbGVJZF0gPSBfLmRlZmF1bHRzKG5ld0NsaWVudFByZWZzLCBiYXNlU2V0dGluZyk7XG4gICAgdXBkYXRlc1tidW5kbGVJZF0uRXhlY3V0YWJsZSA9IHVwZGF0ZXNbYnVuZGxlSWRdLkV4ZWN1dGFibGUgfHwgJyc7XG4gICAgdXBkYXRlc1tidW5kbGVJZF0uUmVnaXN0ZXJlZCA9IHVwZGF0ZXNbYnVuZGxlSWRdLlJlZ2lzdGVyZWQgfHwgJyc7XG5cbiAgICBwcm9taXNlcy5wdXNoKHVwZGF0ZShmaWxlLCB1cGRhdGVzKSk7XG4gIH1cbiAgcmV0dXJuIChfLmlzRW1wdHkocHJvbWlzZXMpID8gZmFsc2UgOiBfLnNvbWUoYXdhaXQgQi5hbGwocHJvbWlzZXMpLCBCb29sZWFuKSkgfHwgdXBkYXRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0UmVkdWNlTW90aW9uIChzaW0sIHJlZHVjZU1vdGlvbiA9IHRydWUpIHtcbiAgbG9nLmRlYnVnKGBVcGRhdGluZyByZWR1Y2UgbW90aW9uLiBTZXR0aW5nIHRvICR7cmVkdWNlTW90aW9ufS5gKTtcbiAgYXdhaXQgdXBkYXRlU2V0dGluZ3Moc2ltLCBQTElTVF9JREVOVElGSUVSLkFDQ0VTU0lCTElUWV9TRVRUSU5HUywge1xuICAgIFJlZHVjZU1vdGlvbkVuYWJsZWQ6IHJlZHVjZU1vdGlvbiA/IDEgOiAwXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRSZWR1Y2VUcmFuc3BhcmVuY3kgKHNpbSwgcmVkdWNlVHJhbnNwYXJlbmN5KSB7XG4gIGxvZy5kZWJ1ZyhgVXBkYXRpbmcgcmVkdWNlIHRyYW5jZXBhcmVuY3kuIFNldHRpbmcgdG8gJHtyZWR1Y2VUcmFuc3BhcmVuY3l9LmApO1xuICBhd2FpdCB1cGRhdGVTZXR0aW5ncyhzaW0sIFBMSVNUX0lERU5USUZJRVIuQUNDRVNTSUJMSVRZX1NFVFRJTkdTLCB7XG4gICAgRW5oYW5jZWRCYWNrZ3JvdW5kQ29udHJhc3RFbmFibGVkOiByZWR1Y2VUcmFuc3BhcmVuY3kgPyAxIDogMFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2FmYXJpR2xvYmFsU2V0dGluZ3MgKHNpbSwgc2V0dGluZ1NldCkge1xuICBsb2cuZGVidWcoJ1VwZGF0aW5nIFNhZmFyaSBnbG9iYWwgc2V0dGluZ3MnKTtcblxuICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlLCBzYWZhcmlTZXR0aW5nU2V0XSBvZiBfLnRvUGFpcnMoYXdhaXQgcmVhZFNldHRpbmdzKHNpbSwgUExJU1RfSURFTlRJRklFUi5HTE9CQUxfTU9CSUxFX1NBRkFSSSkpKSB7XG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoc2V0dGluZ1NldCkpIHtcbiAgICAgIGlmIChzYWZhcmlTZXR0aW5nU2V0W2tleV0gIT09IHZhbHVlKSB7XG4gICAgICAgIG5ld1NldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShuZXdTZXR0aW5ncykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwcm9taXNlcy5wdXNoKHVwZGF0ZShmaWxlLCBuZXdTZXR0aW5ncykpO1xuICB9XG4gIHJldHVybiBfLmlzRW1wdHkocHJvbWlzZXMpID8gZmFsc2UgOiBfLnNvbWUoYXdhaXQgQi5hbGwocHJvbWlzZXMpLCBCb29sZWFuKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2FmYXJpVXNlclNldHRpbmdzIChzaW0sIHNldHRpbmdTZXQpIHtcbiAgbG9nLmRlYnVnKCdVcGRhdGluZyBTYWZhcmkgdXNlciBzZXR0aW5ncycpO1xuXG4gIC8vIGFkZCBleHRyYSBzdHVmZiB0byBVc2VyU2V0dGluZ3MucGxpc3QgYW5kIEVmZmVjdGl2ZVVzZXJTZXR0aW5ncy5wbGlzdFxuICBjb25zdCBuZXdVc2VyU2V0dGluZ3MgPSB7fTtcbiAgaWYgKF8uaGFzKHNldHRpbmdTZXQsICdXZWJLaXRKYXZhU2NyaXB0RW5hYmxlZCcpKSB7XG4gICAgbmV3VXNlclNldHRpbmdzLnNhZmFyaUFsbG93SmF2YVNjcmlwdCA9IHNldHRpbmdTZXQuV2ViS2l0SmF2YVNjcmlwdEVuYWJsZWQ7XG4gIH1cbiAgaWYgKF8uaGFzKHNldHRpbmdTZXQsICdXZWJLaXRKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5JykpIHtcbiAgICBuZXdVc2VyU2V0dGluZ3Muc2FmYXJpQWxsb3dQb3B1cHMgPSBzZXR0aW5nU2V0LldlYktpdEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHk7XG4gIH1cbiAgaWYgKF8uaGFzKHNldHRpbmdTZXQsICdXYXJuQWJvdXRGcmF1ZHVsZW50V2Vic2l0ZXMnKSkge1xuICAgIG5ld1VzZXJTZXR0aW5ncy5zYWZhcmlGb3JjZUZyYXVkV2FybmluZyA9ICFzZXR0aW5nU2V0Lldhcm5BYm91dEZyYXVkdWxlbnRXZWJzaXRlcztcbiAgfVxuICBpZiAoXy5pc0VtcHR5KG5ld1VzZXJTZXR0aW5ncykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlLCB1c2VyU2V0dGluZ1NldF0gb2YgXy50b1BhaXJzKGF3YWl0IHJlYWRTZXR0aW5ncyhzaW0sIFBMSVNUX0lERU5USUZJRVIuVVNFUl9TRVRUSU5HUykpKSB7XG4gICAgLy8gdGhlIHVzZXIgc2V0dGluZ3MgcGxpc3QgaGFzIHR3byBidWNrZXRzLCBvbmUgZm9yXG4gICAgLy8gYm9vbGVhbiBzZXR0aW5ncyAoYHJlc3RyaWN0ZWRCb29sYCkgYW5kIG9uZSBmb3JcbiAgICAvLyBvdGhlciB2YWx1ZSBzZXR0aW5ncyAoYHJlc3RyaWN0ZWRWYWx1ZWApLiBJbiBlYWNoLCB0aGUgdmFsdWVcbiAgICAvLyBpcyBpbiBhIGB2YWx1ZWAgc3ViLWZpZWxkLlxuICAgIGlmICghXy5oYXModXNlclNldHRpbmdTZXQsICdyZXN0cmljdGVkQm9vbCcpKSB7XG4gICAgICB1c2VyU2V0dGluZ1NldC5yZXN0cmljdGVkQm9vbCA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMobmV3VXNlclNldHRpbmdzKSkge1xuICAgICAgdXNlclNldHRpbmdTZXQucmVzdHJpY3RlZEJvb2xba2V5XSA9IHt2YWx1ZX07XG4gICAgfVxuXG4gICAgcHJvbWlzZXMucHVzaCh1cGRhdGUoZmlsZSwgdXNlclNldHRpbmdTZXQpKTtcbiAgfVxuICByZXR1cm4gXy5pc0VtcHR5KHByb21pc2VzKSA/IGZhbHNlIDogXy5zb21lKGF3YWl0IEIuYWxsKHByb21pc2VzKSwgQm9vbGVhbik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZSAoc2ltLCBsYW5ndWFnZSwgbG9jYWxlLCBjYWxlbmRhckZvcm1hdCkge1xuICBjb25zdCBnbG9iYWxQcmVmcyA9IChhd2FpdCBwbGlzdFBhdGhzKHNpbSwgUExJU1RfSURFTlRJRklFUi5HTE9CQUxfUFJFRkVSRU5DRVMpKVswXTtcbiAgaWYgKCFnbG9iYWxQcmVmcykge1xuICAgIHRocm93IG5ldyBFcnJvcignR2xvYmFsIHByZWZlcmVuY2VzIGZvbGRlciBwYXRoIGNhbm5vdCBiZSByZXRyaWV2ZWQnKTtcbiAgfVxuXG4gIC8vIGdldCB0aGUgY3VycmVudCBkYXRhXG4gIGxldCBkYXRhID0gYXdhaXQgcmVhZChnbG9iYWxQcmVmcyk7XG4gIGxldCB1cGRhdGVzID0ge307XG5cbiAgLy8gaWYgd2UgYXJlIHNldHRpbmcgdGhlIGxhbmd1YWdlLCBhZGQgaXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCBvZiBsYW5ndWFnZXNcbiAgaWYgKGxhbmd1YWdlKSB7XG4gICAgbG9nLmRlYnVnKGBOZXcgbGFuZ3VhZ2U6ICR7bGFuZ3VhZ2V9YCk7XG4gICAgbGV0IHN1cHBvcnRlZExhbmdzID0gZGF0YS5BcHBsZUxhbmd1YWdlcyB8fCBbXTtcbiAgICAvLyBpZiB0aGUgbGFuZ3VhZ2UgaXMgZmlyc3QsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmdcbiAgICBpZiAoc3VwcG9ydGVkTGFuZ3MuaW5kZXhPZihsYW5ndWFnZSkgIT09IDApIHtcbiAgICAgIHVwZGF0ZXMuQXBwbGVMYW5ndWFnZXMgPSBbbGFuZ3VhZ2VdLmNvbmNhdChfLndpdGhvdXQoc3VwcG9ydGVkTGFuZ3MsIGxhbmd1YWdlKSk7XG4gICAgfVxuICB9XG4gIC8vIGlmIHdlIGFyZSBzZXR0aW5nIHRoZSBsb2NhbGUgb3IgY2FsZW5kYXIgZm9ybWF0LCBzZXQgdGhlbSBhcyBhcHByb3ByaWF0ZVxuICBpZiAobG9jYWxlIHx8IGNhbGVuZGFyRm9ybWF0KSB7XG4gICAgbGV0IGNhbFNwbGl0ID0gJ0BjYWxlbmRhcj0nO1xuICAgIGxldCBjdXJMb2NhbGVBbmRDYWwgPSBkYXRhLkFwcGxlTG9jYWxlIHx8IGxhbmd1YWdlIHx8ICdlbic7XG5cbiAgICBsZXQgc3BsaXQgPSBjdXJMb2NhbGVBbmRDYWwuc3BsaXQoY2FsU3BsaXQpO1xuICAgIGxldCBjdXJMb2MgPSBzcGxpdFswXTtcbiAgICBpZiAoY2FsZW5kYXJGb3JtYXQgfHwgc3BsaXRbMV0pIHtcbiAgICAgIGNhbGVuZGFyRm9ybWF0ID0gYCR7Y2FsU3BsaXR9JHtjYWxlbmRhckZvcm1hdCB8fCBzcGxpdFsxXSB8fCAnJ31gO1xuICAgIH1cbiAgICBjYWxlbmRhckZvcm1hdCA9IGNhbGVuZGFyRm9ybWF0IHx8ICcnO1xuICAgIGxldCBuZXdMb2NhbGVBbmRDYWwgPSBsb2NhbGUgPyBsb2NhbGUgOiBjdXJMb2M7XG4gICAgaWYgKGNhbGVuZGFyRm9ybWF0KSB7XG4gICAgICBuZXdMb2NhbGVBbmRDYWwgPSBgJHtuZXdMb2NhbGVBbmRDYWx9JHtjYWxlbmRhckZvcm1hdH1gO1xuICAgIH1cbiAgICAvLyBvbmx5IG5lZWQgdG8gdXBkYXRlIGlmIGl0IGhhcyBjaGFuZ2VkXG4gICAgaWYgKG5ld0xvY2FsZUFuZENhbCAhPT0gY3VyTG9jYWxlQW5kQ2FsKSB7XG4gICAgICBsb2cuZGVidWcoYE5ldyBsb2NhbGU6ICR7bmV3TG9jYWxlQW5kQ2FsfWApO1xuICAgICAgdXBkYXRlcy5BcHBsZUxvY2FsZSA9IG5ld0xvY2FsZUFuZENhbDtcbiAgICB9XG4gIH1cblxuICBpZiAoXy5zaXplKHVwZGF0ZXMpID09PSAwKSB7XG4gICAgbG9nLmRlYnVnKCdObyBsb2NhbGUgdXBkYXRlcyBuZWNlc3NhcnkuJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbG9nLmRlYnVnKCdXcml0aW5nIG5ldyBsb2NhbGUgcGxpc3QgZGF0YScpO1xuICBhd2FpdCB1cGRhdGUoZ2xvYmFsUHJlZnMsIHVwZGF0ZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IHtcbiAgdXBkYXRlLCB1cGRhdGVTZXR0aW5ncywgdXBkYXRlTG9jYXRpb25TZXR0aW5ncywgc2V0UmVkdWNlTW90aW9uLCBzZXRSZWR1Y2VUcmFuc3BhcmVuY3ksXG4gIHVwZGF0ZVNhZmFyaVVzZXJTZXR0aW5ncywgdXBkYXRlU2FmYXJpR2xvYmFsU2V0dGluZ3MsIHVwZGF0ZUxvY2FsZSwgcmVhZCxcbiAgcmVhZFNldHRpbmdzLCBQTElTVF9JREVOVElGSUVSXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxnQkFBZ0IsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUM7RUFDckNDLGFBQWEsRUFBRSxjQUFjO0VBQzdCQyxhQUFhLEVBQUUsY0FBYztFQUM3QkMsb0JBQW9CLEVBQUUsb0JBQW9CO0VBQzFDQyxNQUFNLEVBQUUsT0FBTztFQUNmQyxjQUFjLEVBQUUsZUFBZTtFQUMvQkMsV0FBVyxFQUFFLGFBQWE7RUFDMUJDLGtCQUFrQixFQUFFLG1CQUFtQjtFQUN2Q0MsaUJBQWlCLEVBQUUsa0JBQWtCO0VBQ3JDQyxnQkFBZ0IsRUFBRSxpQkFBaUI7RUFDbkNDLGNBQWMsRUFBRSxlQUFlO0VBQy9CQyxhQUFhLEVBQUUsY0FBYztFQUM3QkMsdUJBQXVCLEVBQUUsdUJBQXVCO0VBQ2hEQyxxQkFBcUIsRUFBRSx1QkFBdUI7RUFDOUNDLGlCQUFpQixFQUFFO0FBQ3JCLENBQUMsQ0FBQztBQUFDO0FBU0gsZUFBZUMsVUFBVSxDQUFFQyxHQUFHLEVBQUVDLFVBQVUsRUFBRTtFQUMxQyxNQUFNQyxZQUFZLEdBQUdGLEdBQUcsQ0FBQ0csTUFBTSxFQUFFO0VBRWpDLFFBQVFGLFVBQVU7SUFDaEIsS0FBS25CLGdCQUFnQixDQUFDRyxhQUFhO01BQ2pDLE9BQU8sQ0FBQ21CLGFBQUksQ0FBQ0MsT0FBTyxDQUFDSCxZQUFZLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO0lBQy9GLEtBQUtwQixnQkFBZ0IsQ0FBQ0ksYUFBYTtNQUNqQyxPQUFPLENBQ0xrQixhQUFJLENBQUNDLE9BQU8sQ0FBQyxNQUFNTCxHQUFHLENBQUNNLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsOEJBQThCLENBQUMsQ0FDdEg7SUFDSCxLQUFLeEIsZ0JBQWdCLENBQUNLLG9CQUFvQjtNQUN4QyxPQUFPLENBQUNpQixhQUFJLENBQUNDLE9BQU8sQ0FBQ0gsWUFBWSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUMvRixLQUFLcEIsZ0JBQWdCLENBQUNNLE1BQU07TUFDMUIsT0FBTyxDQUFDZ0IsYUFBSSxDQUFDQyxPQUFPLENBQUNILFlBQVksRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDeEYsS0FBS3BCLGdCQUFnQixDQUFDTyxjQUFjO01BQ2xDLE9BQU8sQ0FBQ2UsYUFBSSxDQUFDQyxPQUFPLENBQUNILFlBQVksRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLCtCQUErQixDQUFDLENBQUM7SUFDaEcsS0FBS3BCLGdCQUFnQixDQUFDUSxXQUFXO01BQy9CLE9BQU8sQ0FBQ2MsYUFBSSxDQUFDQyxPQUFPLENBQUNILFlBQVksRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLDZCQUE2QixDQUFDLENBQUM7SUFDOUYsS0FBS3BCLGdCQUFnQixDQUFDUyxrQkFBa0I7TUFDdEMsT0FBTyxDQUFDYSxhQUFJLENBQUNDLE9BQU8sQ0FBQ0gsWUFBWSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUMzRixLQUFLcEIsZ0JBQWdCLENBQUNVLGlCQUFpQjtNQUNyQyxPQUFPLENBQUNZLGFBQUksQ0FBQ0MsT0FBTyxDQUFDSCxZQUFZLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQzVGLEtBQUtwQixnQkFBZ0IsQ0FBQ1csZ0JBQWdCO01BQ3BDLE9BQU8sQ0FBQ1csYUFBSSxDQUFDQyxPQUFPLENBQUNILFlBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN4RixLQUFLcEIsZ0JBQWdCLENBQUNZLGNBQWM7TUFDbEMsT0FBTyxDQUNMLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsRUFDdEMsQ0FBQyxhQUFhLEVBQUUsMkJBQTJCLENBQUMsQ0FDN0MsQ0FBQ2EsR0FBRyxDQUFFQyxDQUFDLElBQUtKLGFBQUksQ0FBQ0MsT0FBTyxDQUFDSCxZQUFZLEVBQUUsU0FBUyxFQUFFLEdBQUdNLENBQUMsQ0FBQyxDQUFDO0lBQzNELEtBQUsxQixnQkFBZ0IsQ0FBQ2EsYUFBYTtNQUFFO1FBQ25DLE1BQU1jLGVBQWUsR0FBR0MsZUFBTSxDQUFDQyxFQUFFLENBQUNELGVBQU0sQ0FBQ0UsTUFBTSxDQUFDWixHQUFHLENBQUNhLFlBQVksQ0FBQ0MsYUFBYSxDQUFDLEVBQUVKLGVBQU0sQ0FBQ0UsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQ2xHLHVCQUF1QixHQUN2QiwyQkFBMkI7UUFDL0IsT0FBTyxDQUNMLENBQUMsb0JBQW9CLENBQUMsRUFDdEIsQ0FBQyw2QkFBNkIsQ0FBQyxFQUMvQixDQUFDLFlBQVksRUFBRSxtQ0FBbUMsQ0FBQyxDQUNwRCxDQUFDTCxHQUFHLENBQUVDLENBQUMsSUFBS0osYUFBSSxDQUFDQyxPQUFPLENBQUNILFlBQVksRUFBRSxTQUFTLEVBQUVPLGVBQWUsRUFBRSxHQUFHRCxDQUFDLENBQUMsQ0FBQztNQUM1RTtJQUNBLEtBQUsxQixnQkFBZ0IsQ0FBQ2MsdUJBQXVCO01BQzNDLE9BQU8sQ0FDTCxDQUFDLDZCQUE2QixDQUFDLEVBQy9CLENBQUMsWUFBWSxFQUFFLG1DQUFtQyxDQUFDLENBQ3BELENBQUNXLEdBQUcsQ0FBRUMsQ0FBQyxJQUFLSixhQUFJLENBQUNDLE9BQU8sQ0FBQ0gsWUFBWSxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxHQUFHTSxDQUFDLENBQUMsQ0FBQztJQUNwRixLQUFLMUIsZ0JBQWdCLENBQUNlLHFCQUFxQjtNQUN6QyxPQUFPLENBQUNPLGFBQUksQ0FBQ0MsT0FBTyxDQUFDSCxZQUFZLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQ2hHLEtBQUtwQixnQkFBZ0IsQ0FBQ2dCLGlCQUFpQjtNQUNyQyxPQUFPLENBQUNNLGFBQUksQ0FBQ0MsT0FBTyxDQUFDSCxZQUFZLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxzREFBc0QsQ0FBQyxDQUFDO0lBQ3ZIO01BQ0UsT0FBTyxFQUFFO0VBQUM7QUFFaEI7QUFVQSxlQUFlYSxjQUFjLENBQUVmLEdBQUcsRUFBRWdCLEtBQUssRUFBRUMsT0FBTyxFQUFFO0VBQ2xELE1BQU1DLEtBQUssR0FBRyxNQUFNbkIsVUFBVSxDQUFDQyxHQUFHLEVBQUVnQixLQUFLLENBQUM7RUFDMUMsSUFBSUcsZUFBQyxDQUFDQyxPQUFPLENBQUNGLEtBQUssQ0FBQyxFQUFFO0lBQ3BCLE9BQU8sS0FBSztFQUNkO0VBQ0EsTUFBTUcsT0FBTyxHQUFHLE1BQU1DLGlCQUFDLENBQUNDLEdBQUcsQ0FBQ0wsS0FBSyxDQUFDWCxHQUFHLENBQUVpQixDQUFDLElBQUtDLE1BQU0sQ0FBQ0QsQ0FBQyxFQUFFUCxPQUFPLENBQUMsQ0FBQyxDQUFDO0VBQ2pFLE9BQU9FLGVBQUMsQ0FBQ08sSUFBSSxDQUFDTCxPQUFPLEVBQUVNLE9BQU8sQ0FBQztBQUNqQztBQVdBLGVBQWVGLE1BQU0sQ0FBRUcsV0FBVyxFQUFFWCxPQUFPLEVBQUU7RUFDM0MsTUFBTVksZUFBZSxHQUFHLE1BQU1DLElBQUksQ0FBQ0YsV0FBVyxDQUFDO0VBQy9DLE1BQU1HLFdBQVcsR0FBR2hELE1BQU0sQ0FBQ2lELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRUgsZUFBZSxFQUFFWixPQUFPLENBQUM7RUFFL0QsSUFBSUUsZUFBQyxDQUFDYyxPQUFPLENBQUNKLGVBQWUsRUFBRUUsV0FBVyxDQUFDLEVBQUU7SUFFM0MsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxNQUFNZixjQUFLLENBQUNrQixlQUFlLENBQUNOLFdBQVcsRUFBRUcsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7RUFDbEUsT0FBTyxJQUFJO0FBQ2I7QUFTQSxlQUFlSSxZQUFZLENBQUVuQyxHQUFHLEVBQUVnQixLQUFLLEVBQUU7RUFDdkMsTUFBTUUsS0FBSyxHQUFHLE1BQU1uQixVQUFVLENBQUNDLEdBQUcsRUFBRWdCLEtBQUssQ0FBQztFQUMxQyxJQUFJRyxlQUFDLENBQUNDLE9BQU8sQ0FBQ0YsS0FBSyxDQUFDLEVBQUU7SUFDcEIsT0FBTyxDQUFDLENBQUM7RUFDWDtFQUNBLE1BQU1rQixRQUFRLEdBQUcsTUFBTWQsaUJBQUMsQ0FBQ0MsR0FBRyxDQUFDTCxLQUFLLENBQUNYLEdBQUcsQ0FBQ3VCLElBQUksQ0FBQyxDQUFDO0VBQzdDLE9BQU9YLGVBQUMsQ0FBQ2tCLFNBQVMsQ0FBQ2xCLGVBQUMsQ0FBQ21CLEdBQUcsQ0FBQ3BCLEtBQUssRUFBRWtCLFFBQVEsQ0FBQyxDQUFDO0FBQzVDO0FBUUEsZUFBZU4sSUFBSSxDQUFFRixXQUFXLEVBQUU7RUFDaEMsT0FBTyxNQUFNWixjQUFLLENBQUN1QixjQUFjLENBQUNYLFdBQVcsRUFBRSxLQUFLLENBQUM7QUFDdkQ7QUFFQSxlQUFlWSxzQkFBc0IsQ0FBRXhDLEdBQUcsRUFBRXlDLFFBQVEsRUFBRUMsVUFBVSxFQUFFO0VBRWhFLE1BQU1DLGFBQWEsR0FBRztJQUNwQkMsMEJBQTBCLEVBQUUsZ0JBQWdCO0lBQzVDQyxhQUFhLEVBQUU7RUFDakIsQ0FBQztFQUNELE1BQU1DLE9BQU8sR0FBRyxNQUFNL0IsY0FBYyxDQUFDZixHQUFHLEVBQUVsQixnQkFBZ0IsQ0FBQ1ksY0FBYyxFQUFFO0lBQ3pFLENBQUMrQyxRQUFRLEdBQUdFO0VBQ2QsQ0FBQyxDQUFDO0VBR0YsTUFBTUksY0FBYyxHQUFHO0lBQ3JCQyxRQUFRLEVBQUVQLFFBQVE7SUFDbEJRLFVBQVUsRUFBRSxDQUFDLENBQUNQLFVBQVU7SUFDeEJRLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFFRCxNQUFNaEMsS0FBSyxHQUFHLE1BQU1uQixVQUFVLENBQUNDLEdBQUcsRUFBRWxCLGdCQUFnQixDQUFDVyxnQkFBZ0IsQ0FBQztFQUN0RSxJQUFJMEIsZUFBQyxDQUFDQyxPQUFPLENBQUNGLEtBQUssQ0FBQyxFQUFFO0lBQ3BCLE9BQU8sS0FBSztFQUNkO0VBQ0EsTUFBTWlDLFFBQVEsR0FBRyxNQUFNN0IsaUJBQUMsQ0FBQ0MsR0FBRyxDQUFDTCxLQUFLLENBQUNYLEdBQUcsQ0FBQ3VCLElBQUksQ0FBQyxDQUFDO0VBQzdDLE1BQU1zQixRQUFRLEdBQUcsRUFBRTtFQUNuQixLQUFLLE1BQU0sQ0FBQ0MsSUFBSSxFQUFFQyxPQUFPLENBQUMsSUFBSW5DLGVBQUMsQ0FBQ21CLEdBQUcsQ0FBQ3BCLEtBQUssRUFBRWlDLFFBQVEsQ0FBQyxFQUFFO0lBQ3BESSxlQUFHLENBQUNDLEtBQUssQ0FBRSxrQ0FBaUNILElBQUssRUFBQyxDQUFDO0lBRW5ELE1BQU1wQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBRWxCLE1BQU13QyxXQUFXLEdBQUcsNkNBQTZDLEdBQzdDLDZDQUE2QztJQUNqRSxJQUFJLENBQUN0QyxlQUFDLENBQUN1QyxHQUFHLENBQUNKLE9BQU8sRUFBRUcsV0FBVyxDQUFDLEVBQUU7TUFDaEN4QyxPQUFPLENBQUN3QyxXQUFXLENBQUMsR0FBRztRQUNyQkUsVUFBVSxFQUFFLDZEQUE2RDtRQUN6RVQsV0FBVyxFQUFFLEtBQUs7UUFDbEJVLFVBQVUsRUFBRSxFQUFFO1FBQ2RDLFVBQVUsRUFBRTtNQUNkLENBQUM7SUFDSDtJQUVBLE1BQU1DLFdBQVcsR0FBRzNDLGVBQUMsQ0FBQ3VDLEdBQUcsQ0FBQ0osT0FBTyxFQUFFYixRQUFRLENBQUMsR0FBR2EsT0FBTyxDQUFDYixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckV4QixPQUFPLENBQUN3QixRQUFRLENBQUMsR0FBR3RCLGVBQUMsQ0FBQzRDLFFBQVEsQ0FBQ2hCLGNBQWMsRUFBRWUsV0FBVyxDQUFDO0lBQzNEN0MsT0FBTyxDQUFDd0IsUUFBUSxDQUFDLENBQUNtQixVQUFVLEdBQUczQyxPQUFPLENBQUN3QixRQUFRLENBQUMsQ0FBQ21CLFVBQVUsSUFBSSxFQUFFO0lBQ2pFM0MsT0FBTyxDQUFDd0IsUUFBUSxDQUFDLENBQUNvQixVQUFVLEdBQUc1QyxPQUFPLENBQUN3QixRQUFRLENBQUMsQ0FBQ29CLFVBQVUsSUFBSSxFQUFFO0lBRWpFVCxRQUFRLENBQUNZLElBQUksQ0FBQ3ZDLE1BQU0sQ0FBQzRCLElBQUksRUFBRXBDLE9BQU8sQ0FBQyxDQUFDO0VBQ3RDO0VBQ0EsT0FBTyxDQUFDRSxlQUFDLENBQUNDLE9BQU8sQ0FBQ2dDLFFBQVEsQ0FBQyxHQUFHLEtBQUssR0FBR2pDLGVBQUMsQ0FBQ08sSUFBSSxDQUFDLE1BQU1KLGlCQUFDLENBQUNDLEdBQUcsQ0FBQzZCLFFBQVEsQ0FBQyxFQUFFekIsT0FBTyxDQUFDLEtBQUttQixPQUFPO0FBQzFGO0FBRUEsZUFBZW1CLGVBQWUsQ0FBRWpFLEdBQUcsRUFBRWtFLFlBQVksR0FBRyxJQUFJLEVBQUU7RUFDeERYLGVBQUcsQ0FBQ0MsS0FBSyxDQUFFLHNDQUFxQ1UsWUFBYSxHQUFFLENBQUM7RUFDaEUsTUFBTW5ELGNBQWMsQ0FBQ2YsR0FBRyxFQUFFbEIsZ0JBQWdCLENBQUNlLHFCQUFxQixFQUFFO0lBQ2hFc0UsbUJBQW1CLEVBQUVELFlBQVksR0FBRyxDQUFDLEdBQUc7RUFDMUMsQ0FBQyxDQUFDO0FBQ0o7QUFFQSxlQUFlRSxxQkFBcUIsQ0FBRXBFLEdBQUcsRUFBRXFFLGtCQUFrQixFQUFFO0VBQzdEZCxlQUFHLENBQUNDLEtBQUssQ0FBRSw2Q0FBNENhLGtCQUFtQixHQUFFLENBQUM7RUFDN0UsTUFBTXRELGNBQWMsQ0FBQ2YsR0FBRyxFQUFFbEIsZ0JBQWdCLENBQUNlLHFCQUFxQixFQUFFO0lBQ2hFeUUsaUNBQWlDLEVBQUVELGtCQUFrQixHQUFHLENBQUMsR0FBRztFQUM5RCxDQUFDLENBQUM7QUFDSjtBQUVBLGVBQWVFLDBCQUEwQixDQUFFdkUsR0FBRyxFQUFFd0UsVUFBVSxFQUFFO0VBQzFEakIsZUFBRyxDQUFDQyxLQUFLLENBQUMsaUNBQWlDLENBQUM7RUFFNUMsTUFBTUosUUFBUSxHQUFHLEVBQUU7RUFDbkIsS0FBSyxNQUFNLENBQUNDLElBQUksRUFBRW9CLGdCQUFnQixDQUFDLElBQUl0RCxlQUFDLENBQUN1RCxPQUFPLENBQUMsTUFBTXZDLFlBQVksQ0FBQ25DLEdBQUcsRUFBRWxCLGdCQUFnQixDQUFDSyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUU7SUFDaEgsTUFBTTRDLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDdEIsS0FBSyxNQUFNLENBQUM0QyxHQUFHLEVBQUVDLEtBQUssQ0FBQyxJQUFJekQsZUFBQyxDQUFDdUQsT0FBTyxDQUFDRixVQUFVLENBQUMsRUFBRTtNQUNoRCxJQUFJQyxnQkFBZ0IsQ0FBQ0UsR0FBRyxDQUFDLEtBQUtDLEtBQUssRUFBRTtRQUNuQzdDLFdBQVcsQ0FBQzRDLEdBQUcsQ0FBQyxHQUFHQyxLQUFLO01BQzFCO0lBQ0Y7SUFDQSxJQUFJekQsZUFBQyxDQUFDQyxPQUFPLENBQUNXLFdBQVcsQ0FBQyxFQUFFO01BQzFCO0lBQ0Y7SUFDQXFCLFFBQVEsQ0FBQ1ksSUFBSSxDQUFDdkMsTUFBTSxDQUFDNEIsSUFBSSxFQUFFdEIsV0FBVyxDQUFDLENBQUM7RUFDMUM7RUFDQSxPQUFPWixlQUFDLENBQUNDLE9BQU8sQ0FBQ2dDLFFBQVEsQ0FBQyxHQUFHLEtBQUssR0FBR2pDLGVBQUMsQ0FBQ08sSUFBSSxDQUFDLE1BQU1KLGlCQUFDLENBQUNDLEdBQUcsQ0FBQzZCLFFBQVEsQ0FBQyxFQUFFekIsT0FBTyxDQUFDO0FBQzdFO0FBRUEsZUFBZWtELHdCQUF3QixDQUFFN0UsR0FBRyxFQUFFd0UsVUFBVSxFQUFFO0VBQ3hEakIsZUFBRyxDQUFDQyxLQUFLLENBQUMsK0JBQStCLENBQUM7RUFHMUMsTUFBTXNCLGVBQWUsR0FBRyxDQUFDLENBQUM7RUFDMUIsSUFBSTNELGVBQUMsQ0FBQ3VDLEdBQUcsQ0FBQ2MsVUFBVSxFQUFFLHlCQUF5QixDQUFDLEVBQUU7SUFDaERNLGVBQWUsQ0FBQ0MscUJBQXFCLEdBQUdQLFVBQVUsQ0FBQ1EsdUJBQXVCO0VBQzVFO0VBQ0EsSUFBSTdELGVBQUMsQ0FBQ3VDLEdBQUcsQ0FBQ2MsVUFBVSxFQUFFLDZDQUE2QyxDQUFDLEVBQUU7SUFDcEVNLGVBQWUsQ0FBQ0csaUJBQWlCLEdBQUdULFVBQVUsQ0FBQ1UsMkNBQTJDO0VBQzVGO0VBQ0EsSUFBSS9ELGVBQUMsQ0FBQ3VDLEdBQUcsQ0FBQ2MsVUFBVSxFQUFFLDZCQUE2QixDQUFDLEVBQUU7SUFDcERNLGVBQWUsQ0FBQ0ssdUJBQXVCLEdBQUcsQ0FBQ1gsVUFBVSxDQUFDWSwyQkFBMkI7RUFDbkY7RUFDQSxJQUFJakUsZUFBQyxDQUFDQyxPQUFPLENBQUMwRCxlQUFlLENBQUMsRUFBRTtJQUM5QixPQUFPLEtBQUs7RUFDZDtFQUVBLE1BQU0xQixRQUFRLEdBQUcsRUFBRTtFQUNuQixLQUFLLE1BQU0sQ0FBQ0MsSUFBSSxFQUFFZ0MsY0FBYyxDQUFDLElBQUlsRSxlQUFDLENBQUN1RCxPQUFPLENBQUMsTUFBTXZDLFlBQVksQ0FBQ25DLEdBQUcsRUFBRWxCLGdCQUFnQixDQUFDYSxhQUFhLENBQUMsQ0FBQyxFQUFFO0lBS3ZHLElBQUksQ0FBQ3dCLGVBQUMsQ0FBQ3VDLEdBQUcsQ0FBQzJCLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFO01BQzVDQSxjQUFjLENBQUNDLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDcEM7SUFDQSxLQUFLLE1BQU0sQ0FBQ1gsR0FBRyxFQUFFQyxLQUFLLENBQUMsSUFBSXpELGVBQUMsQ0FBQ3VELE9BQU8sQ0FBQ0ksZUFBZSxDQUFDLEVBQUU7TUFDckRPLGNBQWMsQ0FBQ0MsY0FBYyxDQUFDWCxHQUFHLENBQUMsR0FBRztRQUFDQztNQUFLLENBQUM7SUFDOUM7SUFFQXhCLFFBQVEsQ0FBQ1ksSUFBSSxDQUFDdkMsTUFBTSxDQUFDNEIsSUFBSSxFQUFFZ0MsY0FBYyxDQUFDLENBQUM7RUFDN0M7RUFDQSxPQUFPbEUsZUFBQyxDQUFDQyxPQUFPLENBQUNnQyxRQUFRLENBQUMsR0FBRyxLQUFLLEdBQUdqQyxlQUFDLENBQUNPLElBQUksQ0FBQyxNQUFNSixpQkFBQyxDQUFDQyxHQUFHLENBQUM2QixRQUFRLENBQUMsRUFBRXpCLE9BQU8sQ0FBQztBQUM3RTtBQUVBLGVBQWU0RCxZQUFZLENBQUV2RixHQUFHLEVBQUV3RixRQUFRLEVBQUVDLE1BQU0sRUFBRUMsY0FBYyxFQUFFO0VBQ2xFLE1BQU1DLFdBQVcsR0FBRyxDQUFDLE1BQU01RixVQUFVLENBQUNDLEdBQUcsRUFBRWxCLGdCQUFnQixDQUFDUyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNuRixJQUFJLENBQUNvRyxXQUFXLEVBQUU7SUFDaEIsTUFBTSxJQUFJQyxLQUFLLENBQUMsb0RBQW9ELENBQUM7RUFDdkU7RUFHQSxJQUFJQyxJQUFJLEdBQUcsTUFBTS9ELElBQUksQ0FBQzZELFdBQVcsQ0FBQztFQUNsQyxJQUFJMUUsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUdoQixJQUFJdUUsUUFBUSxFQUFFO0lBQ1pqQyxlQUFHLENBQUNDLEtBQUssQ0FBRSxpQkFBZ0JnQyxRQUFTLEVBQUMsQ0FBQztJQUN0QyxJQUFJTSxjQUFjLEdBQUdELElBQUksQ0FBQ0UsY0FBYyxJQUFJLEVBQUU7SUFFOUMsSUFBSUQsY0FBYyxDQUFDRSxPQUFPLENBQUNSLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtNQUMxQ3ZFLE9BQU8sQ0FBQzhFLGNBQWMsR0FBRyxDQUFDUCxRQUFRLENBQUMsQ0FBQ1MsTUFBTSxDQUFDOUUsZUFBQyxDQUFDK0UsT0FBTyxDQUFDSixjQUFjLEVBQUVOLFFBQVEsQ0FBQyxDQUFDO0lBQ2pGO0VBQ0Y7RUFFQSxJQUFJQyxNQUFNLElBQUlDLGNBQWMsRUFBRTtJQUM1QixJQUFJUyxRQUFRLEdBQUcsWUFBWTtJQUMzQixJQUFJQyxlQUFlLEdBQUdQLElBQUksQ0FBQ1EsV0FBVyxJQUFJYixRQUFRLElBQUksSUFBSTtJQUUxRCxJQUFJYyxLQUFLLEdBQUdGLGVBQWUsQ0FBQ0UsS0FBSyxDQUFDSCxRQUFRLENBQUM7SUFDM0MsSUFBSUksTUFBTSxHQUFHRCxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLElBQUlaLGNBQWMsSUFBSVksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO01BQzlCWixjQUFjLEdBQUksR0FBRVMsUUFBUyxHQUFFVCxjQUFjLElBQUlZLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFHLEVBQUM7SUFDbkU7SUFDQVosY0FBYyxHQUFHQSxjQUFjLElBQUksRUFBRTtJQUNyQyxJQUFJYyxlQUFlLEdBQUdmLE1BQU0sR0FBR0EsTUFBTSxHQUFHYyxNQUFNO0lBQzlDLElBQUliLGNBQWMsRUFBRTtNQUNsQmMsZUFBZSxHQUFJLEdBQUVBLGVBQWdCLEdBQUVkLGNBQWUsRUFBQztJQUN6RDtJQUVBLElBQUljLGVBQWUsS0FBS0osZUFBZSxFQUFFO01BQ3ZDN0MsZUFBRyxDQUFDQyxLQUFLLENBQUUsZUFBY2dELGVBQWdCLEVBQUMsQ0FBQztNQUMzQ3ZGLE9BQU8sQ0FBQ29GLFdBQVcsR0FBR0csZUFBZTtJQUN2QztFQUNGO0VBRUEsSUFBSXJGLGVBQUMsQ0FBQ3NGLElBQUksQ0FBQ3hGLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtJQUN6QnNDLGVBQUcsQ0FBQ0MsS0FBSyxDQUFDLDhCQUE4QixDQUFDO0lBQ3pDLE9BQU8sS0FBSztFQUNkO0VBRUFELGVBQUcsQ0FBQ0MsS0FBSyxDQUFDLCtCQUErQixDQUFDO0VBQzFDLE1BQU0vQixNQUFNLENBQUNrRSxXQUFXLEVBQUUxRSxPQUFPLENBQUM7RUFDbEMsT0FBTyxJQUFJO0FBQ2IifQ==
|