appium-uiautomator2-driver 2.7.0 → 2.8.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 +241 -25
- package/build/index.js +1 -4
- package/build/lib/commands/actions.js +3 -12
- package/build/lib/commands/actions.js.map +1 -0
- package/build/lib/commands/alert.js +3 -9
- package/build/lib/commands/alert.js.map +1 -0
- package/build/lib/commands/battery.js +3 -5
- package/build/lib/commands/battery.js.map +1 -0
- package/build/lib/commands/element.js +3 -36
- package/build/lib/commands/element.js.map +1 -0
- package/build/lib/commands/find.js +2 -9
- package/build/lib/commands/find.js.map +1 -0
- package/build/lib/commands/general.js +5 -36
- package/build/lib/commands/general.js.map +1 -0
- package/build/lib/commands/gestures.js +1 -15
- package/build/lib/commands/gestures.js.map +1 -0
- package/build/lib/commands/index.js +3 -15
- package/build/lib/commands/index.js.map +1 -0
- package/build/lib/commands/screenshot.js +1 -8
- package/build/lib/commands/screenshot.js.map +1 -0
- package/build/lib/commands/touch.js +2 -8
- package/build/lib/commands/touch.js.map +1 -0
- package/build/lib/commands/viewport.js +3 -9
- package/build/lib/commands/viewport.js.map +1 -0
- package/build/lib/css-converter.js +1 -42
- package/build/lib/css-converter.js.map +1 -0
- package/build/lib/desired-caps.js +1 -4
- package/build/lib/desired-caps.js.map +1 -0
- package/build/lib/driver.js +24 -102
- package/build/lib/driver.js.map +1 -0
- package/build/lib/extensions.js +1 -3
- package/build/lib/extensions.js.map +1 -0
- package/build/lib/helpers.js +1 -15
- package/build/lib/helpers.js.map +1 -0
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -0
- package/build/lib/uiautomator2.js +1 -70
- package/build/lib/uiautomator2.js.map +1 -0
- package/npm-shrinkwrap.json +402 -309
- package/package.json +3 -3
|
@@ -4,15 +4,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
require("source-map-support/register");
|
|
9
|
-
|
|
10
8
|
var _cssSelectorParser = require("css-selector-parser");
|
|
11
|
-
|
|
12
9
|
var _lodash = require("lodash");
|
|
13
|
-
|
|
14
10
|
var _driver = require("appium/driver");
|
|
15
|
-
|
|
16
11
|
const parser = new _cssSelectorParser.CssSelectorParser();
|
|
17
12
|
parser.registerSelectorPseudos('has');
|
|
18
13
|
parser.registerNestingOperators('>', '+', '~');
|
|
@@ -30,7 +25,6 @@ function toSnakeCase(str) {
|
|
|
30
25
|
if (!str) {
|
|
31
26
|
return '';
|
|
32
27
|
}
|
|
33
|
-
|
|
34
28
|
const tokens = str.split('-').map(str => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase());
|
|
35
29
|
const out = tokens.join('');
|
|
36
30
|
return out.charAt(0).toLowerCase() + out.slice(1);
|
|
@@ -38,13 +32,10 @@ function toSnakeCase(str) {
|
|
|
38
32
|
|
|
39
33
|
function assertGetBool(css) {
|
|
40
34
|
var _css$value;
|
|
41
|
-
|
|
42
35
|
const val = ((_css$value = css.value) === null || _css$value === void 0 ? void 0 : _css$value.toLowerCase()) || 'true';
|
|
43
|
-
|
|
44
36
|
if (['true', 'false'].includes(val)) {
|
|
45
37
|
return val;
|
|
46
38
|
}
|
|
47
|
-
|
|
48
39
|
throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);
|
|
49
40
|
}
|
|
50
41
|
|
|
@@ -60,7 +51,6 @@ function assertGetAttrName(css) {
|
|
|
60
51
|
return officialAttr;
|
|
61
52
|
}
|
|
62
53
|
}
|
|
63
|
-
|
|
64
54
|
throw new Error(`'${attrName}' is not a valid attribute. ` + `Supported attributes are '${ALL_ATTRS.join(', ')}'`);
|
|
65
55
|
}
|
|
66
56
|
|
|
@@ -82,7 +72,6 @@ class CssConverter {
|
|
|
82
72
|
if (cssAttr.valueType && cssAttr.valueType !== 'string') {
|
|
83
73
|
throw new Error(`'${cssAttr.name}=${cssAttr.value}' is an invalid attribute. ` + `Only 'string' and empty attribute types are supported. Found '${cssAttr.valueType}'`);
|
|
84
74
|
}
|
|
85
|
-
|
|
86
75
|
const attrName = assertGetAttrName(cssAttr);
|
|
87
76
|
const methodName = toSnakeCase(attrName);
|
|
88
77
|
|
|
@@ -95,39 +84,29 @@ class CssConverter {
|
|
|
95
84
|
}
|
|
96
85
|
|
|
97
86
|
let value = cssAttr.value || '';
|
|
98
|
-
|
|
99
87
|
if (attrName === RESOURCE_ID) {
|
|
100
88
|
value = this.formatIdLocator(value);
|
|
101
89
|
}
|
|
102
|
-
|
|
103
90
|
if (value === '') {
|
|
104
91
|
return `.${methodName}Matches("")`;
|
|
105
92
|
}
|
|
106
|
-
|
|
107
93
|
switch (cssAttr.operator) {
|
|
108
94
|
case '=':
|
|
109
95
|
return `.${methodName}("${value}")`;
|
|
110
|
-
|
|
111
96
|
case '*=':
|
|
112
97
|
if (['description', 'text'].includes(attrName)) {
|
|
113
98
|
return `.${methodName}Contains("${value}")`;
|
|
114
99
|
}
|
|
115
|
-
|
|
116
100
|
return `.${methodName}Matches("${(0, _lodash.escapeRegExp)(value)}")`;
|
|
117
|
-
|
|
118
101
|
case '^=':
|
|
119
102
|
if (['description', 'text'].includes(attrName)) {
|
|
120
103
|
return `.${methodName}StartsWith("${value}")`;
|
|
121
104
|
}
|
|
122
|
-
|
|
123
105
|
return `.${methodName}Matches("^${(0, _lodash.escapeRegExp)(value)}")`;
|
|
124
|
-
|
|
125
106
|
case '$=':
|
|
126
107
|
return `.${methodName}Matches("${(0, _lodash.escapeRegExp)(value)}$")`;
|
|
127
|
-
|
|
128
108
|
case '~=':
|
|
129
109
|
return `.${methodName}Matches("${getWordMatcherRegex(value)}")`;
|
|
130
|
-
|
|
131
110
|
default:
|
|
132
111
|
throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` + ` '=', '*=', '^=', '$=' and '~=' are supported.`);
|
|
133
112
|
}
|
|
@@ -137,13 +116,10 @@ class CssConverter {
|
|
|
137
116
|
if (cssPseudo.valueType && cssPseudo.valueType !== 'string') {
|
|
138
117
|
throw new Error(`'${cssPseudo.name}=${cssPseudo.value}'. ` + `Unsupported css pseudo class value type: '${cssPseudo.valueType}'. Only 'string' type or empty is supported.`);
|
|
139
118
|
}
|
|
140
|
-
|
|
141
119
|
const pseudoName = assertGetAttrName(cssPseudo);
|
|
142
|
-
|
|
143
120
|
if (BOOLEAN_ATTRS.includes(pseudoName)) {
|
|
144
121
|
return `.${toSnakeCase(pseudoName)}(${assertGetBool(cssPseudo)})`;
|
|
145
122
|
}
|
|
146
|
-
|
|
147
123
|
if (NUMERIC_ATTRS.includes(pseudoName)) {
|
|
148
124
|
return `.${pseudoName}(${cssPseudo.value})`;
|
|
149
125
|
}
|
|
@@ -153,21 +129,16 @@ class CssConverter {
|
|
|
153
129
|
const {
|
|
154
130
|
nestingOperator
|
|
155
131
|
} = cssRule;
|
|
156
|
-
|
|
157
132
|
if (nestingOperator && nestingOperator !== ' ') {
|
|
158
133
|
throw new Error(`'${nestingOperator}' is not a supported combinator. ` + `Only child combinator (>) and descendant combinator are supported.`);
|
|
159
134
|
}
|
|
160
|
-
|
|
161
135
|
let uiAutomatorSelector = 'new UiSelector()';
|
|
162
|
-
|
|
163
136
|
if (cssRule.tagName && cssRule.tagName !== '*') {
|
|
164
137
|
let androidClass = [cssRule.tagName];
|
|
165
|
-
|
|
166
138
|
if (cssRule.classNames) {
|
|
167
139
|
for (const cssClassNames of cssRule.classNames) {
|
|
168
140
|
androidClass.push(cssClassNames);
|
|
169
141
|
}
|
|
170
|
-
|
|
171
142
|
uiAutomatorSelector += `.className("${androidClass.join('.')}")`;
|
|
172
143
|
} else {
|
|
173
144
|
uiAutomatorSelector += `.classNameMatches("${cssRule.tagName}")`;
|
|
@@ -175,27 +146,22 @@ class CssConverter {
|
|
|
175
146
|
} else if (cssRule.classNames) {
|
|
176
147
|
uiAutomatorSelector += `.classNameMatches("${cssRule.classNames.join('\\.')}")`;
|
|
177
148
|
}
|
|
178
|
-
|
|
179
149
|
if (cssRule.id) {
|
|
180
150
|
uiAutomatorSelector += `.resourceId("${this.formatIdLocator(cssRule.id)}")`;
|
|
181
151
|
}
|
|
182
|
-
|
|
183
152
|
if (cssRule.attrs) {
|
|
184
153
|
for (const attr of cssRule.attrs) {
|
|
185
154
|
uiAutomatorSelector += this.parseAttr(attr);
|
|
186
155
|
}
|
|
187
156
|
}
|
|
188
|
-
|
|
189
157
|
if (cssRule.pseudos) {
|
|
190
158
|
for (const pseudo of cssRule.pseudos) {
|
|
191
159
|
uiAutomatorSelector += this.parsePseudo(pseudo);
|
|
192
160
|
}
|
|
193
161
|
}
|
|
194
|
-
|
|
195
162
|
if (cssRule.rule) {
|
|
196
163
|
uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.rule)})`;
|
|
197
164
|
}
|
|
198
|
-
|
|
199
165
|
return uiAutomatorSelector;
|
|
200
166
|
}
|
|
201
167
|
|
|
@@ -203,13 +169,10 @@ class CssConverter {
|
|
|
203
169
|
switch (css.type) {
|
|
204
170
|
case 'rule':
|
|
205
171
|
return this.parseCssRule(css);
|
|
206
|
-
|
|
207
172
|
case 'ruleSet':
|
|
208
173
|
return this.parseCssObject(css.rule);
|
|
209
|
-
|
|
210
174
|
case 'selectors':
|
|
211
175
|
return css.selectors.map(selector => this.parseCssObject(selector)).join('; ');
|
|
212
|
-
|
|
213
176
|
default:
|
|
214
177
|
throw new Error(`UiAutomator does not support '${css.type}' css. Only supports 'rule', 'ruleSet', 'selectors' `);
|
|
215
178
|
}
|
|
@@ -217,22 +180,18 @@ class CssConverter {
|
|
|
217
180
|
|
|
218
181
|
toUiAutomatorSelector() {
|
|
219
182
|
let cssObj;
|
|
220
|
-
|
|
221
183
|
try {
|
|
222
184
|
cssObj = parser.parse(this.selector);
|
|
223
185
|
} catch (e) {
|
|
224
186
|
throw new _driver.errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e}'`);
|
|
225
187
|
}
|
|
226
|
-
|
|
227
188
|
try {
|
|
228
189
|
return this.parseCssObject(cssObj);
|
|
229
190
|
} catch (e) {
|
|
230
191
|
throw new _driver.errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e}'`);
|
|
231
192
|
}
|
|
232
193
|
}
|
|
233
|
-
|
|
234
194
|
}
|
|
235
|
-
|
|
236
195
|
var _default = CssConverter;
|
|
237
196
|
exports.default = _default;
|
|
238
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZXIiLCJDc3NTZWxlY3RvclBhcnNlciIsInJlZ2lzdGVyU2VsZWN0b3JQc2V1ZG9zIiwicmVnaXN0ZXJOZXN0aW5nT3BlcmF0b3JzIiwicmVnaXN0ZXJBdHRyRXF1YWxpdHlNb2RzIiwiZW5hYmxlU3Vic3RpdHV0ZXMiLCJSRVNPVVJDRV9JRCIsIklEX0xPQ0FUT1JfUEFUVEVSTiIsIkJPT0xFQU5fQVRUUlMiLCJOVU1FUklDX0FUVFJTIiwiU1RSX0FUVFJTIiwiQUxMX0FUVFJTIiwiQVRUUklCVVRFX0FMSUFTRVMiLCJ0b1NuYWtlQ2FzZSIsInN0ciIsInRva2VucyIsInNwbGl0IiwibWFwIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsInRvTG93ZXJDYXNlIiwib3V0Iiwiam9pbiIsImFzc2VydEdldEJvb2wiLCJjc3MiLCJ2YWwiLCJ2YWx1ZSIsImluY2x1ZGVzIiwiRXJyb3IiLCJuYW1lIiwiYXNzZXJ0R2V0QXR0ck5hbWUiLCJhdHRyTmFtZSIsIm9mZmljaWFsQXR0ciIsImFsaWFzQXR0cnMiLCJnZXRXb3JkTWF0Y2hlclJlZ2V4Iiwid29yZCIsImVzY2FwZVJlZ0V4cCIsIkNzc0NvbnZlcnRlciIsImNvbnN0cnVjdG9yIiwic2VsZWN0b3IiLCJwa2ciLCJmb3JtYXRJZExvY2F0b3IiLCJsb2NhdG9yIiwidGVzdCIsInBhcnNlQXR0ciIsImNzc0F0dHIiLCJ2YWx1ZVR5cGUiLCJtZXRob2ROYW1lIiwib3BlcmF0b3IiLCJwYXJzZVBzZXVkbyIsImNzc1BzZXVkbyIsInBzZXVkb05hbWUiLCJwYXJzZUNzc1J1bGUiLCJjc3NSdWxlIiwibmVzdGluZ09wZXJhdG9yIiwidWlBdXRvbWF0b3JTZWxlY3RvciIsInRhZ05hbWUiLCJhbmRyb2lkQ2xhc3MiLCJjbGFzc05hbWVzIiwiY3NzQ2xhc3NOYW1lcyIsInB1c2giLCJpZCIsImF0dHJzIiwiYXR0ciIsInBzZXVkb3MiLCJwc2V1ZG8iLCJydWxlIiwicGFyc2VDc3NPYmplY3QiLCJ0eXBlIiwic2VsZWN0b3JzIiwidG9VaUF1dG9tYXRvclNlbGVjdG9yIiwiY3NzT2JqIiwicGFyc2UiLCJlIiwiZXJyb3JzIiwiSW52YWxpZFNlbGVjdG9yRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9saWIvY3NzLWNvbnZlcnRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDc3NTZWxlY3RvclBhcnNlciB9IGZyb20gJ2Nzcy1zZWxlY3Rvci1wYXJzZXInO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBwYXJzZXIgPSBuZXcgQ3NzU2VsZWN0b3JQYXJzZXIoKTtcbnBhcnNlci5yZWdpc3RlclNlbGVjdG9yUHNldWRvcygnaGFzJyk7XG5wYXJzZXIucmVnaXN0ZXJOZXN0aW5nT3BlcmF0b3JzKCc+JywgJysnLCAnficpO1xucGFyc2VyLnJlZ2lzdGVyQXR0ckVxdWFsaXR5TW9kcygnXicsICckJywgJyonLCAnficpO1xucGFyc2VyLmVuYWJsZVN1YnN0aXR1dGVzKCk7XG5cbmNvbnN0IFJFU09VUkNFX0lEID0gJ3Jlc291cmNlLWlkJztcbmNvbnN0IElEX0xPQ0FUT1JfUEFUVEVSTiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOS5fXSo6aWRcXC9bXFxTXSskLztcblxuY29uc3QgQk9PTEVBTl9BVFRSUyA9IFtcbiAgJ2NoZWNrYWJsZScsICdjaGVja2VkJywgJ2NsaWNrYWJsZScsICdlbmFibGVkJywgJ2ZvY3VzYWJsZScsXG4gICdmb2N1c2VkJywgJ2xvbmctY2xpY2thYmxlJywgJ3Njcm9sbGFibGUnLCAnc2VsZWN0ZWQnLFxuXTtcblxuY29uc3QgTlVNRVJJQ19BVFRSUyA9IFtcbiAgJ2luZGV4JywgJ2luc3RhbmNlJyxcbl07XG5cbmNvbnN0IFNUUl9BVFRSUyA9IFtcbiAgJ2Rlc2NyaXB0aW9uJywgUkVTT1VSQ0VfSUQsICd0ZXh0JywgJ2NsYXNzLW5hbWUnLCAncGFja2FnZS1uYW1lJ1xuXTtcblxuY29uc3QgQUxMX0FUVFJTID0gW1xuICAuLi5CT09MRUFOX0FUVFJTLFxuICAuLi5OVU1FUklDX0FUVFJTLFxuICAuLi5TVFJfQVRUUlMsXG5dO1xuXG5jb25zdCBBVFRSSUJVVEVfQUxJQVNFUyA9IFtcbiAgW1JFU09VUkNFX0lELCBbJ2lkJ11dLFxuICBbJ2Rlc2NyaXB0aW9uJywgW1xuICAgICdjb250ZW50LWRlc2NyaXB0aW9uJywgJ2NvbnRlbnQtZGVzYycsXG4gICAgJ2Rlc2MnLCAnYWNjZXNzaWJpbGl0eS1pZCcsXG4gIF1dLFxuICBbJ2luZGV4JywgWydudGgtY2hpbGQnXV0sXG5dO1xuXG4vKipcbiAqIENvbnZlcnQgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRvIHNuYWtlIGNhc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRyYW5zbGF0ZWQgdG8gc25ha2UgY2FzZVxuICovXG5mdW5jdGlvbiB0b1NuYWtlQ2FzZSAoc3RyKSB7XG4gIGlmICghc3RyKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IHRva2VucyA9IHN0ci5zcGxpdCgnLScpLm1hcCgoc3RyKSA9PiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSk7XG4gIGNvbnN0IG91dCA9IHRva2Vucy5qb2luKCcnKTtcbiAgcmV0dXJuIG91dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIG91dC5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NOYW1lVmFsdWVPYmplY3RcbiAqIEBwcm9wZXJ0eSB7P25hbWV9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIENTUyBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBDU1Mgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIGJvb2xlYW4gZnJvbSBhIENTUyBvYmplY3QuIElmIGVtcHR5LCByZXR1cm4gdHJ1ZS4gSWYgbm90IHRydWUvZmFsc2UvZW1wdHksIHRocm93IGV4Y2VwdGlvblxuICpcbiAqIEBwYXJhbSB7Q3NzTmFtZVZhbHVlT2JqZWN0fSBjc3MgQSBDU1Mgb2JqZWN0IHRoYXQgaGFzICduYW1lJyBhbmQgJ3ZhbHVlJ1xuICogQHJldHVybnMge3N0cmluZ30gRWl0aGVyICd0cnVlJyBvciAnZmFsc2UnLiBJZiB2YWx1ZSBpcyBlbXB0eSwgcmV0dXJuICd0cnVlJ1xuICovXG5mdW5jdGlvbiBhc3NlcnRHZXRCb29sIChjc3MpIHtcbiAgY29uc3QgdmFsID0gY3NzLnZhbHVlPy50b0xvd2VyQ2FzZSgpIHx8ICd0cnVlJzsgLy8gYW4gb21pdHRlZCBib29sZWFuIGF0dHJpYnV0ZSBtZWFucyAndHJ1ZScgKGUuZy46IGlucHV0W2NoZWNrZWRdIG1lYW5zIGNoZWNrZWQgaXMgdHJ1ZSlcbiAgaWYgKFsndHJ1ZScsICdmYWxzZSddLmluY2x1ZGVzKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzLm5hbWV9JyBtdXN0IGJlIHRydWUsIGZhbHNlIG9yIGVtcHR5LiBGb3VuZCAnJHtjc3MudmFsdWV9J2ApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY2Fub25pY2FsIGZvcm0gb2YgYSBDU1MgYXR0cmlidXRlIG5hbWVcbiAqXG4gKiBDb252ZXJ0cyB0byBsb3dlcmNhc2UgYW5kIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuXG4gKiB3aGF0IGl0IGlzIGFuIGFsaWFzIGZvclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjc3MgQ1NTIG9iamVjdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNhbm9uaWNhbCBhdHRyaWJ1dGUgbmFtZVxuICovXG5mdW5jdGlvbiBhc3NlcnRHZXRBdHRyTmFtZSAoY3NzKSB7XG4gIGNvbnN0IGF0dHJOYW1lID0gY3NzLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDaGVjayBpZiBpdCdzIHN1cHBvcnRlZCBhbmQgaWYgaXQgaXMsIHJldHVybiBpdFxuICBpZiAoQUxMX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgIHJldHVybiBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gSWYgYXR0ck5hbWUgaXMgYW4gYWxpYXMgZm9yIHNvbWV0aGluZyBlbHNlLCByZXR1cm4gdGhhdFxuICBmb3IgKGNvbnN0IFtvZmZpY2lhbEF0dHIsIGFsaWFzQXR0cnNdIG9mIEFUVFJJQlVURV9BTElBU0VTKSB7XG4gICAgaWYgKGFsaWFzQXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gb2ZmaWNpYWxBdHRyO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICBgU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlICcke0FMTF9BVFRSUy5qb2luKCcsICcpfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgYSByZWdleCB0aGF0IG1hdGNoZXMgYSB3aG9sZSB3b3JkLiBGb3IgdGhlIH49IENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgcmVnZXggXCJ3b3JkXCIgbWF0Y2hlclxuICovXG5mdW5jdGlvbiBnZXRXb3JkTWF0Y2hlclJlZ2V4ICh3b3JkKSB7XG4gIHJldHVybiBgXFxcXGIoXFxcXHcqJHtlc2NhcGVSZWdFeHAod29yZCl9XFxcXHcqKVxcXFxiYDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NBdHRyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUeXBlIG9mIGF0dHJpYnV0ZSAobXVzdCBiZSBzdHJpbmcgb3IgZW1wdHkpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIGJldHdlZW4gdmFsdWUgYW5kIHZhbHVlIHR5cGUgKD0sICo9LCAsIF49LCAkPSlcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1J1bGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbmVzdGluZ09wZXJhdG9yIFRoZSBuZXN0aW5nIG9wZXJhdG9yIChha2E6IGNvbWJpbmF0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHRhZ05hbWUgVGhlIHRhZyBuYW1lIChha2E6IHR5cGUgc2VsZWN0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL1R5cGVfc2VsZWN0b3JzKVxuICogQHByb3BlcnR5IHs/c3RyaW5nW119IGNsYXNzTmFtZXMgQW4gYXJyYXkgb2YgQ1NTIGNsYXNzIG5hbWVzXG4gKiBAcHJvcGVydHkgez9Dc3NBdHRyW119IGF0dHJzIEFuIGFycmF5IG9mIENTUyBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkgez9Dc3NQc2V1ZG9bXX0gYXR0cnMgQW4gYXJyYXkgb2YgQ1NTIHBzZXVkb3NcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWQgQ1NTIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P0Nzc1J1bGV9IHJ1bGUgQSBkZXNjZW5kYW50IG9mIHRoaXMgQ1NTIHJ1bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc09iamVjdFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB0eXBlIFR5cGUgb2YgQ1NTIG9iamVjdC4gJ3J1bGUnLCAncnVsZXNldCcgb3IgJ3NlbGVjdG9ycydcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1BzZXVkb1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgQ1NTIHBzZXVkbyBzZWxlY3RvciAoaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY3NzLXNlbGVjdG9yLXBhcnNlciBmb3IgcmVmZXJlbmNlKVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwc2V1ZG8gc2VsZWN0b3JcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBwc2V1ZG8gc2VsZWN0b3JcbiAqL1xuXG5jbGFzcyBDc3NDb252ZXJ0ZXIge1xuXG4gIGNvbnN0cnVjdG9yIChzZWxlY3RvciwgcGtnKSB7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHRoaXMucGtnID0gcGtnO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBgPHBrZ05hbWU+OmlkL2AgcHJlZml4IHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgaWYgaXQncyBub3QgdGhlcmUgYWxyZWFkeVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRvciBUaGUgaW5pdGlhbCBsb2NhdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyB3aXRoIGA8cGtnTmFtZT46aWQvYCBwcmVwZW5kZWQgKGlmIGl0IHdhc24ndCBhbHJlYWR5KVxuICAgKi9cbiAgZm9ybWF0SWRMb2NhdG9yIChsb2NhdG9yKSB7XG4gICAgcmV0dXJuIElEX0xPQ0FUT1JfUEFUVEVSTi50ZXN0KGxvY2F0b3IpXG4gICAgICA/IGxvY2F0b3JcbiAgICAgIDogYCR7dGhpcy5wa2cgfHwgJ2FuZHJvaWQnfTppZC8ke2xvY2F0b3J9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIGF0dHJpYnV0ZSBpbnRvIGEgVWlTZWxlY3RvciBtZXRob2QgY2FsbFxuICAgKlxuICAgKiBAcGFyYW0ge0Nzc0F0dHJ9IGNzc0F0dHIgQ1NTIGF0dHJpYnV0ZSBvYmplY3RcbiAgICogQHJldHVybnMge3N0cmluZ30gQ1NTIGF0dHJpYnV0ZSBwYXJzZWQgYXMgVWlTZWxlY3RvclxuICAgKi9cbiAgcGFyc2VBdHRyIChjc3NBdHRyKSB7XG4gICAgaWYgKGNzc0F0dHIudmFsdWVUeXBlICYmIGNzc0F0dHIudmFsdWVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NBdHRyLm5hbWV9PSR7Y3NzQXR0ci52YWx1ZX0nIGlzIGFuIGludmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICAgICAgYE9ubHkgJ3N0cmluZycgYW5kIGVtcHR5IGF0dHJpYnV0ZSB0eXBlcyBhcmUgc3VwcG9ydGVkLiBGb3VuZCAnJHtjc3NBdHRyLnZhbHVlVHlwZX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJOYW1lID0gYXNzZXJ0R2V0QXR0ck5hbWUoY3NzQXR0cik7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHRvU25ha2VDYXNlKGF0dHJOYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgaXQncyBhIHN1cHBvcnRlZCBhdHRyaWJ1dGVcbiAgICBpZiAoIVNUUl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIUJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IHN1cHBvcnRlZC4gU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlIGAgK1xuICAgICAgICBgJyR7Wy4uLlNUUl9BVFRSUywgLi4uQk9PTEVBTl9BVFRSU10uam9pbignLCAnKX0nYCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgYm9vbGVhbiwgaWYgaXQncyBhIGJvb2xlYW4gYXR0cmlidXRlXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KCR7YXNzZXJ0R2V0Qm9vbChjc3NBdHRyKX0pYDtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcGFyc2UgYXMgc3RyaW5nXG4gICAgbGV0IHZhbHVlID0gY3NzQXR0ci52YWx1ZSB8fCAnJztcbiAgICBpZiAoYXR0ck5hbWUgPT09IFJFU09VUkNFX0lEKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0SWRMb2NhdG9yKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJcIilgO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY3NzQXR0ci5vcGVyYXRvcikge1xuICAgICAgY2FzZSAnPSc6XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX0oXCIke3ZhbHVlfVwiKWA7XG4gICAgICBjYXNlICcqPSc6XG4gICAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9Q29udGFpbnMoXCIke3ZhbHVlfVwiKWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICAgIGNhc2UgJ149JzpcbiAgICAgICAgaWYgKFsnZGVzY3JpcHRpb24nLCAndGV4dCddLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1TdGFydHNXaXRoKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiXiR7ZXNjYXBlUmVnRXhwKHZhbHVlKX1cIilgO1xuICAgICAgY2FzZSAnJD0nOlxuICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9TWF0Y2hlcyhcIiR7ZXNjYXBlUmVnRXhwKHZhbHVlKX0kXCIpYDtcbiAgICAgIGNhc2UgJ349JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2dldFdvcmRNYXRjaGVyUmVnZXgodmFsdWUpfVwiKWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBVbnJlYWNoYWJsZSwgYnV0IGFkZGluZyBlcnJvciBpbiBjYXNlIGEgbmV3IENTUyBhdHRyaWJ1dGUgaXMgYWRkZWQuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIGF0dHJpYnV0ZSBvcGVyYXRvciAnJHtjc3NBdHRyLm9wZXJhdG9yfScuIGAgK1xuICAgICAgICAgIGAgJz0nLCAnKj0nLCAnXj0nLCAnJD0nIGFuZCAnfj0nIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgcHNldWRvIGNsYXNzIHRvIGEgVWlTZWxlY3RvclxuICAgKlxuICAgKiBAcGFyYW0ge0Nzc1BzZXVkb30gY3NzUHNldWRvIENTUyBQc2V1ZG8gY2xhc3NcbiAgICogQHJldHVybnMge3N0cmluZ30gUHNldWRvIHNlbGVjdG9yIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gICAqL1xuICBwYXJzZVBzZXVkbyAoY3NzUHNldWRvKSB7XG4gICAgaWYgKGNzc1BzZXVkby52YWx1ZVR5cGUgJiYgY3NzUHNldWRvLnZhbHVlVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUHNldWRvLm5hbWV9PSR7Y3NzUHNldWRvLnZhbHVlfScuIGAgK1xuICAgICAgICBgVW5zdXBwb3J0ZWQgY3NzIHBzZXVkbyBjbGFzcyB2YWx1ZSB0eXBlOiAnJHtjc3NQc2V1ZG8udmFsdWVUeXBlfScuIE9ubHkgJ3N0cmluZycgdHlwZSBvciBlbXB0eSBpcyBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHNldWRvTmFtZSA9IGFzc2VydEdldEF0dHJOYW1lKGNzc1BzZXVkbyk7XG5cbiAgICBpZiAoQk9PTEVBTl9BVFRSUy5pbmNsdWRlcyhwc2V1ZG9OYW1lKSkge1xuICAgICAgcmV0dXJuIGAuJHt0b1NuYWtlQ2FzZShwc2V1ZG9OYW1lKX0oJHthc3NlcnRHZXRCb29sKGNzc1BzZXVkbyl9KWA7XG4gICAgfVxuXG4gICAgaWYgKE5VTUVSSUNfQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICAgIHJldHVybiBgLiR7cHNldWRvTmFtZX0oJHtjc3NQc2V1ZG8udmFsdWV9KWA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgcnVsZSB0byBhIFVpU2VsZWN0b3JcbiAgICogQHBhcmFtIHtDc3NSdWxlfSBjc3NSdWxlIENTUyBydWxlIGRlZmluaXRpb25cbiAgICovXG4gIHBhcnNlQ3NzUnVsZSAoY3NzUnVsZSkge1xuICAgIGNvbnN0IHsgbmVzdGluZ09wZXJhdG9yIH0gPSBjc3NSdWxlO1xuICAgIGlmIChuZXN0aW5nT3BlcmF0b3IgJiYgbmVzdGluZ09wZXJhdG9yICE9PSAnICcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmVzdGluZ09wZXJhdG9yfScgaXMgbm90IGEgc3VwcG9ydGVkIGNvbWJpbmF0b3IuIGAgK1xuICAgICAgICBgT25seSBjaGlsZCBjb21iaW5hdG9yICg+KSBhbmQgZGVzY2VuZGFudCBjb21iaW5hdG9yIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgbGV0IHVpQXV0b21hdG9yU2VsZWN0b3IgPSAnbmV3IFVpU2VsZWN0b3IoKSc7XG4gICAgaWYgKGNzc1J1bGUudGFnTmFtZSAmJiBjc3NSdWxlLnRhZ05hbWUgIT09ICcqJykge1xuICAgICAgbGV0IGFuZHJvaWRDbGFzcyA9IFtjc3NSdWxlLnRhZ05hbWVdO1xuICAgICAgaWYgKGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICBmb3IgKGNvbnN0IGNzc0NsYXNzTmFtZXMgb2YgY3NzUnVsZS5jbGFzc05hbWVzKSB7XG4gICAgICAgICAgYW5kcm9pZENsYXNzLnB1c2goY3NzQ2xhc3NOYW1lcyk7XG4gICAgICAgIH1cbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZShcIiR7YW5kcm9pZENsYXNzLmpvaW4oJy4nKX1cIilgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZU1hdGNoZXMoXCIke2Nzc1J1bGUudGFnTmFtZX1cIilgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY3NzUnVsZS5jbGFzc05hbWVzKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2xhc3NOYW1lTWF0Y2hlcyhcIiR7Y3NzUnVsZS5jbGFzc05hbWVzLmpvaW4oJ1xcXFwuJyl9XCIpYDtcbiAgICB9XG4gICAgaWYgKGNzc1J1bGUuaWQpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5yZXNvdXJjZUlkKFwiJHt0aGlzLmZvcm1hdElkTG9jYXRvcihjc3NSdWxlLmlkKX1cIilgO1xuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5hdHRycykge1xuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGNzc1J1bGUuYXR0cnMpIHtcbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSB0aGlzLnBhcnNlQXR0cihhdHRyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNzc1J1bGUucHNldWRvcykge1xuICAgICAgZm9yIChjb25zdCBwc2V1ZG8gb2YgY3NzUnVsZS5wc2V1ZG9zKSB7XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gdGhpcy5wYXJzZVBzZXVkbyhwc2V1ZG8pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5ydWxlKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2hpbGRTZWxlY3Rvcigke3RoaXMucGFyc2VDc3NSdWxlKGNzc1J1bGUucnVsZSl9KWA7XG4gICAgfVxuICAgIHJldHVybiB1aUF1dG9tYXRvclNlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgQ1NTIG9iamVjdCB0byBVaUF1dG9tYXRvcjIgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtDc3NPYmplY3R9IGNzcyBDU1Mgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgb2JqZWN0IHBhcnNlZCBhcyBhIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQ3NzT2JqZWN0IChjc3MpIHtcbiAgICBzd2l0Y2ggKGNzcy50eXBlKSB7XG4gICAgICBjYXNlICdydWxlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NSdWxlKGNzcyk7XG4gICAgICBjYXNlICdydWxlU2V0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NPYmplY3QoY3NzLnJ1bGUpO1xuICAgICAgY2FzZSAnc2VsZWN0b3JzJzpcbiAgICAgICAgcmV0dXJuIGNzcy5zZWxlY3RvcnMubWFwKChzZWxlY3RvcikgPT4gdGhpcy5wYXJzZUNzc09iamVjdChzZWxlY3RvcikpLmpvaW4oJzsgJyk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFRoaXMgaXMgbmV2ZXIgcmVhY2hhYmxlLCBidXQgaWYgaXQgZXZlciBpcyBkbyB0aGlzLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVpQXV0b21hdG9yIGRvZXMgbm90IHN1cHBvcnQgJyR7Y3NzLnR5cGV9JyBjc3MuIE9ubHkgc3VwcG9ydHMgJ3J1bGUnLCAncnVsZVNldCcsICdzZWxlY3RvcnMnIGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHNlbGVjdG9yIHRvIGEgVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgc2VsZWN0b3IgY29udmVydGVkIHRvIGEgVWlTZWxlY3RvclxuICAgKi9cbiAgdG9VaUF1dG9tYXRvclNlbGVjdG9yICgpIHtcbiAgICBsZXQgY3NzT2JqO1xuICAgIHRyeSB7XG4gICAgICBjc3NPYmogPSBwYXJzZXIucGFyc2UodGhpcy5zZWxlY3Rvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkU2VsZWN0b3JFcnJvcihgSW52YWxpZCBDU1Mgc2VsZWN0b3IgJyR7dGhpcy5zZWxlY3Rvcn0nLiBSZWFzb246ICcke2V9J2ApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NPYmplY3QoY3NzT2JqKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRTZWxlY3RvckVycm9yKGBVbnN1cHBvcnRlZCBDU1Mgc2VsZWN0b3IgJyR7dGhpcy5zZWxlY3Rvcn0nLiBSZWFzb246ICcke2V9J2ApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDc3NDb252ZXJ0ZXI7Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxNQUFNLEdBQUcsSUFBSUMsb0NBQUosRUFBZjtBQUNBRCxNQUFNLENBQUNFLHVCQUFQLENBQStCLEtBQS9CO0FBQ0FGLE1BQU0sQ0FBQ0csd0JBQVAsQ0FBZ0MsR0FBaEMsRUFBcUMsR0FBckMsRUFBMEMsR0FBMUM7QUFDQUgsTUFBTSxDQUFDSSx3QkFBUCxDQUFnQyxHQUFoQyxFQUFxQyxHQUFyQyxFQUEwQyxHQUExQyxFQUErQyxHQUEvQztBQUNBSixNQUFNLENBQUNLLGlCQUFQO0FBRUEsTUFBTUMsV0FBVyxHQUFHLGFBQXBCO0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcscUNBQTNCO0FBRUEsTUFBTUMsYUFBYSxHQUFHLENBQ3BCLFdBRG9CLEVBQ1AsU0FETyxFQUNJLFdBREosRUFDaUIsU0FEakIsRUFDNEIsV0FENUIsRUFFcEIsU0FGb0IsRUFFVCxnQkFGUyxFQUVTLFlBRlQsRUFFdUIsVUFGdkIsQ0FBdEI7QUFLQSxNQUFNQyxhQUFhLEdBQUcsQ0FDcEIsT0FEb0IsRUFDWCxVQURXLENBQXRCO0FBSUEsTUFBTUMsU0FBUyxHQUFHLENBQ2hCLGFBRGdCLEVBQ0RKLFdBREMsRUFD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
|
|
197
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZXIiLCJDc3NTZWxlY3RvclBhcnNlciIsInJlZ2lzdGVyU2VsZWN0b3JQc2V1ZG9zIiwicmVnaXN0ZXJOZXN0aW5nT3BlcmF0b3JzIiwicmVnaXN0ZXJBdHRyRXF1YWxpdHlNb2RzIiwiZW5hYmxlU3Vic3RpdHV0ZXMiLCJSRVNPVVJDRV9JRCIsIklEX0xPQ0FUT1JfUEFUVEVSTiIsIkJPT0xFQU5fQVRUUlMiLCJOVU1FUklDX0FUVFJTIiwiU1RSX0FUVFJTIiwiQUxMX0FUVFJTIiwiQVRUUklCVVRFX0FMSUFTRVMiLCJ0b1NuYWtlQ2FzZSIsInN0ciIsInRva2VucyIsInNwbGl0IiwibWFwIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsInRvTG93ZXJDYXNlIiwib3V0Iiwiam9pbiIsImFzc2VydEdldEJvb2wiLCJjc3MiLCJ2YWwiLCJ2YWx1ZSIsImluY2x1ZGVzIiwiRXJyb3IiLCJuYW1lIiwiYXNzZXJ0R2V0QXR0ck5hbWUiLCJhdHRyTmFtZSIsIm9mZmljaWFsQXR0ciIsImFsaWFzQXR0cnMiLCJnZXRXb3JkTWF0Y2hlclJlZ2V4Iiwid29yZCIsImVzY2FwZVJlZ0V4cCIsIkNzc0NvbnZlcnRlciIsImNvbnN0cnVjdG9yIiwic2VsZWN0b3IiLCJwa2ciLCJmb3JtYXRJZExvY2F0b3IiLCJsb2NhdG9yIiwidGVzdCIsInBhcnNlQXR0ciIsImNzc0F0dHIiLCJ2YWx1ZVR5cGUiLCJtZXRob2ROYW1lIiwib3BlcmF0b3IiLCJwYXJzZVBzZXVkbyIsImNzc1BzZXVkbyIsInBzZXVkb05hbWUiLCJwYXJzZUNzc1J1bGUiLCJjc3NSdWxlIiwibmVzdGluZ09wZXJhdG9yIiwidWlBdXRvbWF0b3JTZWxlY3RvciIsInRhZ05hbWUiLCJhbmRyb2lkQ2xhc3MiLCJjbGFzc05hbWVzIiwiY3NzQ2xhc3NOYW1lcyIsInB1c2giLCJpZCIsImF0dHJzIiwiYXR0ciIsInBzZXVkb3MiLCJwc2V1ZG8iLCJydWxlIiwicGFyc2VDc3NPYmplY3QiLCJ0eXBlIiwic2VsZWN0b3JzIiwidG9VaUF1dG9tYXRvclNlbGVjdG9yIiwiY3NzT2JqIiwicGFyc2UiLCJlIiwiZXJyb3JzIiwiSW52YWxpZFNlbGVjdG9yRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9saWIvY3NzLWNvbnZlcnRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDc3NTZWxlY3RvclBhcnNlciB9IGZyb20gJ2Nzcy1zZWxlY3Rvci1wYXJzZXInO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBwYXJzZXIgPSBuZXcgQ3NzU2VsZWN0b3JQYXJzZXIoKTtcbnBhcnNlci5yZWdpc3RlclNlbGVjdG9yUHNldWRvcygnaGFzJyk7XG5wYXJzZXIucmVnaXN0ZXJOZXN0aW5nT3BlcmF0b3JzKCc+JywgJysnLCAnficpO1xucGFyc2VyLnJlZ2lzdGVyQXR0ckVxdWFsaXR5TW9kcygnXicsICckJywgJyonLCAnficpO1xucGFyc2VyLmVuYWJsZVN1YnN0aXR1dGVzKCk7XG5cbmNvbnN0IFJFU09VUkNFX0lEID0gJ3Jlc291cmNlLWlkJztcbmNvbnN0IElEX0xPQ0FUT1JfUEFUVEVSTiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOS5fXSo6aWRcXC9bXFxTXSskLztcblxuY29uc3QgQk9PTEVBTl9BVFRSUyA9IFtcbiAgJ2NoZWNrYWJsZScsICdjaGVja2VkJywgJ2NsaWNrYWJsZScsICdlbmFibGVkJywgJ2ZvY3VzYWJsZScsXG4gICdmb2N1c2VkJywgJ2xvbmctY2xpY2thYmxlJywgJ3Njcm9sbGFibGUnLCAnc2VsZWN0ZWQnLFxuXTtcblxuY29uc3QgTlVNRVJJQ19BVFRSUyA9IFtcbiAgJ2luZGV4JywgJ2luc3RhbmNlJyxcbl07XG5cbmNvbnN0IFNUUl9BVFRSUyA9IFtcbiAgJ2Rlc2NyaXB0aW9uJywgUkVTT1VSQ0VfSUQsICd0ZXh0JywgJ2NsYXNzLW5hbWUnLCAncGFja2FnZS1uYW1lJ1xuXTtcblxuY29uc3QgQUxMX0FUVFJTID0gW1xuICAuLi5CT09MRUFOX0FUVFJTLFxuICAuLi5OVU1FUklDX0FUVFJTLFxuICAuLi5TVFJfQVRUUlMsXG5dO1xuXG5jb25zdCBBVFRSSUJVVEVfQUxJQVNFUyA9IFtcbiAgW1JFU09VUkNFX0lELCBbJ2lkJ11dLFxuICBbJ2Rlc2NyaXB0aW9uJywgW1xuICAgICdjb250ZW50LWRlc2NyaXB0aW9uJywgJ2NvbnRlbnQtZGVzYycsXG4gICAgJ2Rlc2MnLCAnYWNjZXNzaWJpbGl0eS1pZCcsXG4gIF1dLFxuICBbJ2luZGV4JywgWydudGgtY2hpbGQnXV0sXG5dO1xuXG4vKipcbiAqIENvbnZlcnQgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRvIHNuYWtlIGNhc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRyYW5zbGF0ZWQgdG8gc25ha2UgY2FzZVxuICovXG5mdW5jdGlvbiB0b1NuYWtlQ2FzZSAoc3RyKSB7XG4gIGlmICghc3RyKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IHRva2VucyA9IHN0ci5zcGxpdCgnLScpLm1hcCgoc3RyKSA9PiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSk7XG4gIGNvbnN0IG91dCA9IHRva2Vucy5qb2luKCcnKTtcbiAgcmV0dXJuIG91dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIG91dC5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NOYW1lVmFsdWVPYmplY3RcbiAqIEBwcm9wZXJ0eSB7P25hbWV9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIENTUyBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBDU1Mgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIGJvb2xlYW4gZnJvbSBhIENTUyBvYmplY3QuIElmIGVtcHR5LCByZXR1cm4gdHJ1ZS4gSWYgbm90IHRydWUvZmFsc2UvZW1wdHksIHRocm93IGV4Y2VwdGlvblxuICpcbiAqIEBwYXJhbSB7Q3NzTmFtZVZhbHVlT2JqZWN0fSBjc3MgQSBDU1Mgb2JqZWN0IHRoYXQgaGFzICduYW1lJyBhbmQgJ3ZhbHVlJ1xuICogQHJldHVybnMge3N0cmluZ30gRWl0aGVyICd0cnVlJyBvciAnZmFsc2UnLiBJZiB2YWx1ZSBpcyBlbXB0eSwgcmV0dXJuICd0cnVlJ1xuICovXG5mdW5jdGlvbiBhc3NlcnRHZXRCb29sIChjc3MpIHtcbiAgY29uc3QgdmFsID0gY3NzLnZhbHVlPy50b0xvd2VyQ2FzZSgpIHx8ICd0cnVlJzsgLy8gYW4gb21pdHRlZCBib29sZWFuIGF0dHJpYnV0ZSBtZWFucyAndHJ1ZScgKGUuZy46IGlucHV0W2NoZWNrZWRdIG1lYW5zIGNoZWNrZWQgaXMgdHJ1ZSlcbiAgaWYgKFsndHJ1ZScsICdmYWxzZSddLmluY2x1ZGVzKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzLm5hbWV9JyBtdXN0IGJlIHRydWUsIGZhbHNlIG9yIGVtcHR5LiBGb3VuZCAnJHtjc3MudmFsdWV9J2ApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY2Fub25pY2FsIGZvcm0gb2YgYSBDU1MgYXR0cmlidXRlIG5hbWVcbiAqXG4gKiBDb252ZXJ0cyB0byBsb3dlcmNhc2UgYW5kIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuXG4gKiB3aGF0IGl0IGlzIGFuIGFsaWFzIGZvclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjc3MgQ1NTIG9iamVjdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNhbm9uaWNhbCBhdHRyaWJ1dGUgbmFtZVxuICovXG5mdW5jdGlvbiBhc3NlcnRHZXRBdHRyTmFtZSAoY3NzKSB7XG4gIGNvbnN0IGF0dHJOYW1lID0gY3NzLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDaGVjayBpZiBpdCdzIHN1cHBvcnRlZCBhbmQgaWYgaXQgaXMsIHJldHVybiBpdFxuICBpZiAoQUxMX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgIHJldHVybiBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gSWYgYXR0ck5hbWUgaXMgYW4gYWxpYXMgZm9yIHNvbWV0aGluZyBlbHNlLCByZXR1cm4gdGhhdFxuICBmb3IgKGNvbnN0IFtvZmZpY2lhbEF0dHIsIGFsaWFzQXR0cnNdIG9mIEFUVFJJQlVURV9BTElBU0VTKSB7XG4gICAgaWYgKGFsaWFzQXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gb2ZmaWNpYWxBdHRyO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICBgU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlICcke0FMTF9BVFRSUy5qb2luKCcsICcpfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgYSByZWdleCB0aGF0IG1hdGNoZXMgYSB3aG9sZSB3b3JkLiBGb3IgdGhlIH49IENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgcmVnZXggXCJ3b3JkXCIgbWF0Y2hlclxuICovXG5mdW5jdGlvbiBnZXRXb3JkTWF0Y2hlclJlZ2V4ICh3b3JkKSB7XG4gIHJldHVybiBgXFxcXGIoXFxcXHcqJHtlc2NhcGVSZWdFeHAod29yZCl9XFxcXHcqKVxcXFxiYDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NBdHRyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUeXBlIG9mIGF0dHJpYnV0ZSAobXVzdCBiZSBzdHJpbmcgb3IgZW1wdHkpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIGJldHdlZW4gdmFsdWUgYW5kIHZhbHVlIHR5cGUgKD0sICo9LCAsIF49LCAkPSlcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1J1bGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbmVzdGluZ09wZXJhdG9yIFRoZSBuZXN0aW5nIG9wZXJhdG9yIChha2E6IGNvbWJpbmF0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHRhZ05hbWUgVGhlIHRhZyBuYW1lIChha2E6IHR5cGUgc2VsZWN0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL1R5cGVfc2VsZWN0b3JzKVxuICogQHByb3BlcnR5IHs/c3RyaW5nW119IGNsYXNzTmFtZXMgQW4gYXJyYXkgb2YgQ1NTIGNsYXNzIG5hbWVzXG4gKiBAcHJvcGVydHkgez9Dc3NBdHRyW119IGF0dHJzIEFuIGFycmF5IG9mIENTUyBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkgez9Dc3NQc2V1ZG9bXX0gYXR0cnMgQW4gYXJyYXkgb2YgQ1NTIHBzZXVkb3NcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWQgQ1NTIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P0Nzc1J1bGV9IHJ1bGUgQSBkZXNjZW5kYW50IG9mIHRoaXMgQ1NTIHJ1bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc09iamVjdFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB0eXBlIFR5cGUgb2YgQ1NTIG9iamVjdC4gJ3J1bGUnLCAncnVsZXNldCcgb3IgJ3NlbGVjdG9ycydcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1BzZXVkb1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgQ1NTIHBzZXVkbyBzZWxlY3RvciAoaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY3NzLXNlbGVjdG9yLXBhcnNlciBmb3IgcmVmZXJlbmNlKVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwc2V1ZG8gc2VsZWN0b3JcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBwc2V1ZG8gc2VsZWN0b3JcbiAqL1xuXG5jbGFzcyBDc3NDb252ZXJ0ZXIge1xuXG4gIGNvbnN0cnVjdG9yIChzZWxlY3RvciwgcGtnKSB7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHRoaXMucGtnID0gcGtnO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBgPHBrZ05hbWU+OmlkL2AgcHJlZml4IHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgaWYgaXQncyBub3QgdGhlcmUgYWxyZWFkeVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRvciBUaGUgaW5pdGlhbCBsb2NhdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyB3aXRoIGA8cGtnTmFtZT46aWQvYCBwcmVwZW5kZWQgKGlmIGl0IHdhc24ndCBhbHJlYWR5KVxuICAgKi9cbiAgZm9ybWF0SWRMb2NhdG9yIChsb2NhdG9yKSB7XG4gICAgcmV0dXJuIElEX0xPQ0FUT1JfUEFUVEVSTi50ZXN0KGxvY2F0b3IpXG4gICAgICA/IGxvY2F0b3JcbiAgICAgIDogYCR7dGhpcy5wa2cgfHwgJ2FuZHJvaWQnfTppZC8ke2xvY2F0b3J9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIGF0dHJpYnV0ZSBpbnRvIGEgVWlTZWxlY3RvciBtZXRob2QgY2FsbFxuICAgKlxuICAgKiBAcGFyYW0ge0Nzc0F0dHJ9IGNzc0F0dHIgQ1NTIGF0dHJpYnV0ZSBvYmplY3RcbiAgICogQHJldHVybnMge3N0cmluZ30gQ1NTIGF0dHJpYnV0ZSBwYXJzZWQgYXMgVWlTZWxlY3RvclxuICAgKi9cbiAgcGFyc2VBdHRyIChjc3NBdHRyKSB7XG4gICAgaWYgKGNzc0F0dHIudmFsdWVUeXBlICYmIGNzc0F0dHIudmFsdWVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NBdHRyLm5hbWV9PSR7Y3NzQXR0ci52YWx1ZX0nIGlzIGFuIGludmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICAgICAgYE9ubHkgJ3N0cmluZycgYW5kIGVtcHR5IGF0dHJpYnV0ZSB0eXBlcyBhcmUgc3VwcG9ydGVkLiBGb3VuZCAnJHtjc3NBdHRyLnZhbHVlVHlwZX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJOYW1lID0gYXNzZXJ0R2V0QXR0ck5hbWUoY3NzQXR0cik7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHRvU25ha2VDYXNlKGF0dHJOYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgaXQncyBhIHN1cHBvcnRlZCBhdHRyaWJ1dGVcbiAgICBpZiAoIVNUUl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIUJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IHN1cHBvcnRlZC4gU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlIGAgK1xuICAgICAgICBgJyR7Wy4uLlNUUl9BVFRSUywgLi4uQk9PTEVBTl9BVFRSU10uam9pbignLCAnKX0nYCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgYm9vbGVhbiwgaWYgaXQncyBhIGJvb2xlYW4gYXR0cmlidXRlXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KCR7YXNzZXJ0R2V0Qm9vbChjc3NBdHRyKX0pYDtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcGFyc2UgYXMgc3RyaW5nXG4gICAgbGV0IHZhbHVlID0gY3NzQXR0ci52YWx1ZSB8fCAnJztcbiAgICBpZiAoYXR0ck5hbWUgPT09IFJFU09VUkNFX0lEKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0SWRMb2NhdG9yKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJcIilgO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY3NzQXR0ci5vcGVyYXRvcikge1xuICAgICAgY2FzZSAnPSc6XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX0oXCIke3ZhbHVlfVwiKWA7XG4gICAgICBjYXNlICcqPSc6XG4gICAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9Q29udGFpbnMoXCIke3ZhbHVlfVwiKWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICAgIGNhc2UgJ149JzpcbiAgICAgICAgaWYgKFsnZGVzY3JpcHRpb24nLCAndGV4dCddLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1TdGFydHNXaXRoKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiXiR7ZXNjYXBlUmVnRXhwKHZhbHVlKX1cIilgO1xuICAgICAgY2FzZSAnJD0nOlxuICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9TWF0Y2hlcyhcIiR7ZXNjYXBlUmVnRXhwKHZhbHVlKX0kXCIpYDtcbiAgICAgIGNhc2UgJ349JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2dldFdvcmRNYXRjaGVyUmVnZXgodmFsdWUpfVwiKWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBVbnJlYWNoYWJsZSwgYnV0IGFkZGluZyBlcnJvciBpbiBjYXNlIGEgbmV3IENTUyBhdHRyaWJ1dGUgaXMgYWRkZWQuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIGF0dHJpYnV0ZSBvcGVyYXRvciAnJHtjc3NBdHRyLm9wZXJhdG9yfScuIGAgK1xuICAgICAgICAgIGAgJz0nLCAnKj0nLCAnXj0nLCAnJD0nIGFuZCAnfj0nIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgcHNldWRvIGNsYXNzIHRvIGEgVWlTZWxlY3RvclxuICAgKlxuICAgKiBAcGFyYW0ge0Nzc1BzZXVkb30gY3NzUHNldWRvIENTUyBQc2V1ZG8gY2xhc3NcbiAgICogQHJldHVybnMge3N0cmluZ30gUHNldWRvIHNlbGVjdG9yIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gICAqL1xuICBwYXJzZVBzZXVkbyAoY3NzUHNldWRvKSB7XG4gICAgaWYgKGNzc1BzZXVkby52YWx1ZVR5cGUgJiYgY3NzUHNldWRvLnZhbHVlVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUHNldWRvLm5hbWV9PSR7Y3NzUHNldWRvLnZhbHVlfScuIGAgK1xuICAgICAgICBgVW5zdXBwb3J0ZWQgY3NzIHBzZXVkbyBjbGFzcyB2YWx1ZSB0eXBlOiAnJHtjc3NQc2V1ZG8udmFsdWVUeXBlfScuIE9ubHkgJ3N0cmluZycgdHlwZSBvciBlbXB0eSBpcyBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHNldWRvTmFtZSA9IGFzc2VydEdldEF0dHJOYW1lKGNzc1BzZXVkbyk7XG5cbiAgICBpZiAoQk9PTEVBTl9BVFRSUy5pbmNsdWRlcyhwc2V1ZG9OYW1lKSkge1xuICAgICAgcmV0dXJuIGAuJHt0b1NuYWtlQ2FzZShwc2V1ZG9OYW1lKX0oJHthc3NlcnRHZXRCb29sKGNzc1BzZXVkbyl9KWA7XG4gICAgfVxuXG4gICAgaWYgKE5VTUVSSUNfQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICAgIHJldHVybiBgLiR7cHNldWRvTmFtZX0oJHtjc3NQc2V1ZG8udmFsdWV9KWA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgcnVsZSB0byBhIFVpU2VsZWN0b3JcbiAgICogQHBhcmFtIHtDc3NSdWxlfSBjc3NSdWxlIENTUyBydWxlIGRlZmluaXRpb25cbiAgICovXG4gIHBhcnNlQ3NzUnVsZSAoY3NzUnVsZSkge1xuICAgIGNvbnN0IHsgbmVzdGluZ09wZXJhdG9yIH0gPSBjc3NSdWxlO1xuICAgIGlmIChuZXN0aW5nT3BlcmF0b3IgJiYgbmVzdGluZ09wZXJhdG9yICE9PSAnICcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmVzdGluZ09wZXJhdG9yfScgaXMgbm90IGEgc3VwcG9ydGVkIGNvbWJpbmF0b3IuIGAgK1xuICAgICAgICBgT25seSBjaGlsZCBjb21iaW5hdG9yICg+KSBhbmQgZGVzY2VuZGFudCBjb21iaW5hdG9yIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgbGV0IHVpQXV0b21hdG9yU2VsZWN0b3IgPSAnbmV3IFVpU2VsZWN0b3IoKSc7XG4gICAgaWYgKGNzc1J1bGUudGFnTmFtZSAmJiBjc3NSdWxlLnRhZ05hbWUgIT09ICcqJykge1xuICAgICAgbGV0IGFuZHJvaWRDbGFzcyA9IFtjc3NSdWxlLnRhZ05hbWVdO1xuICAgICAgaWYgKGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICBmb3IgKGNvbnN0IGNzc0NsYXNzTmFtZXMgb2YgY3NzUnVsZS5jbGFzc05hbWVzKSB7XG4gICAgICAgICAgYW5kcm9pZENsYXNzLnB1c2goY3NzQ2xhc3NOYW1lcyk7XG4gICAgICAgIH1cbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZShcIiR7YW5kcm9pZENsYXNzLmpvaW4oJy4nKX1cIilgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZU1hdGNoZXMoXCIke2Nzc1J1bGUudGFnTmFtZX1cIilgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY3NzUnVsZS5jbGFzc05hbWVzKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2xhc3NOYW1lTWF0Y2hlcyhcIiR7Y3NzUnVsZS5jbGFzc05hbWVzLmpvaW4oJ1xcXFwuJyl9XCIpYDtcbiAgICB9XG4gICAgaWYgKGNzc1J1bGUuaWQpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5yZXNvdXJjZUlkKFwiJHt0aGlzLmZvcm1hdElkTG9jYXRvcihjc3NSdWxlLmlkKX1cIilgO1xuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5hdHRycykge1xuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGNzc1J1bGUuYXR0cnMpIHtcbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSB0aGlzLnBhcnNlQXR0cihhdHRyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNzc1J1bGUucHNldWRvcykge1xuICAgICAgZm9yIChjb25zdCBwc2V1ZG8gb2YgY3NzUnVsZS5wc2V1ZG9zKSB7XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gdGhpcy5wYXJzZVBzZXVkbyhwc2V1ZG8pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5ydWxlKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2hpbGRTZWxlY3Rvcigke3RoaXMucGFyc2VDc3NSdWxlKGNzc1J1bGUucnVsZSl9KWA7XG4gICAgfVxuICAgIHJldHVybiB1aUF1dG9tYXRvclNlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgQ1NTIG9iamVjdCB0byBVaUF1dG9tYXRvcjIgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtDc3NPYmplY3R9IGNzcyBDU1Mgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgb2JqZWN0IHBhcnNlZCBhcyBhIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQ3NzT2JqZWN0IChjc3MpIHtcbiAgICBzd2l0Y2ggKGNzcy50eXBlKSB7XG4gICAgICBjYXNlICdydWxlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NSdWxlKGNzcyk7XG4gICAgICBjYXNlICdydWxlU2V0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NPYmplY3QoY3NzLnJ1bGUpO1xuICAgICAgY2FzZSAnc2VsZWN0b3JzJzpcbiAgICAgICAgcmV0dXJuIGNzcy5zZWxlY3RvcnMubWFwKChzZWxlY3RvcikgPT4gdGhpcy5wYXJzZUNzc09iamVjdChzZWxlY3RvcikpLmpvaW4oJzsgJyk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFRoaXMgaXMgbmV2ZXIgcmVhY2hhYmxlLCBidXQgaWYgaXQgZXZlciBpcyBkbyB0aGlzLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVpQXV0b21hdG9yIGRvZXMgbm90IHN1cHBvcnQgJyR7Y3NzLnR5cGV9JyBjc3MuIE9ubHkgc3VwcG9ydHMgJ3J1bGUnLCAncnVsZVNldCcsICdzZWxlY3RvcnMnIGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHNlbGVjdG9yIHRvIGEgVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgc2VsZWN0b3IgY29udmVydGVkIHRvIGEgVWlTZWxlY3RvclxuICAgKi9cbiAgdG9VaUF1dG9tYXRvclNlbGVjdG9yICgpIHtcbiAgICBsZXQgY3NzT2JqO1xuICAgIHRyeSB7XG4gICAgICBjc3NPYmogPSBwYXJzZXIucGFyc2UodGhpcy5zZWxlY3Rvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkU2VsZWN0b3JFcnJvcihgSW52YWxpZCBDU1Mgc2VsZWN0b3IgJyR7dGhpcy5zZWxlY3Rvcn0nLiBSZWFzb246ICcke2V9J2ApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NPYmplY3QoY3NzT2JqKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRTZWxlY3RvckVycm9yKGBVbnN1cHBvcnRlZCBDU1Mgc2VsZWN0b3IgJyR7dGhpcy5zZWxlY3Rvcn0nLiBSZWFzb246ICcke2V9J2ApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDc3NDb252ZXJ0ZXI7Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUEsTUFBTUEsTUFBTSxHQUFHLElBQUlDLG9DQUFpQixFQUFFO0FBQ3RDRCxNQUFNLENBQUNFLHVCQUF1QixDQUFDLEtBQUssQ0FBQztBQUNyQ0YsTUFBTSxDQUFDRyx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUM5Q0gsTUFBTSxDQUFDSSx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDbkRKLE1BQU0sQ0FBQ0ssaUJBQWlCLEVBQUU7QUFFMUIsTUFBTUMsV0FBVyxHQUFHLGFBQWE7QUFDakMsTUFBTUMsa0JBQWtCLEdBQUcscUNBQXFDO0FBRWhFLE1BQU1DLGFBQWEsR0FBRyxDQUNwQixXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUMzRCxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FDdEQ7QUFFRCxNQUFNQyxhQUFhLEdBQUcsQ0FDcEIsT0FBTyxFQUFFLFVBQVUsQ0FDcEI7QUFFRCxNQUFNQyxTQUFTLEdBQUcsQ0FDaEIsYUFBYSxFQUFFSixXQUFXLEVB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-converter.js","names":["parser","CssSelectorParser","registerSelectorPseudos","registerNestingOperators","registerAttrEqualityMods","enableSubstitutes","RESOURCE_ID","ID_LOCATOR_PATTERN","BOOLEAN_ATTRS","NUMERIC_ATTRS","STR_ATTRS","ALL_ATTRS","ATTRIBUTE_ALIASES","toSnakeCase","str","tokens","split","map","charAt","toUpperCase","slice","toLowerCase","out","join","assertGetBool","css","val","value","includes","Error","name","assertGetAttrName","attrName","officialAttr","aliasAttrs","getWordMatcherRegex","word","escapeRegExp","CssConverter","constructor","selector","pkg","formatIdLocator","locator","test","parseAttr","cssAttr","valueType","methodName","operator","parsePseudo","cssPseudo","pseudoName","parseCssRule","cssRule","nestingOperator","uiAutomatorSelector","tagName","androidClass","classNames","cssClassNames","push","id","attrs","attr","pseudos","pseudo","rule","parseCssObject","type","selectors","toUiAutomatorSelector","cssObj","parse","e","errors","InvalidSelectorError"],"sources":["../../lib/css-converter.js"],"sourcesContent":["import { CssSelectorParser } from 'css-selector-parser';\nimport { escapeRegExp } from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst parser = new CssSelectorParser();\nparser.registerSelectorPseudos('has');\nparser.registerNestingOperators('>', '+', '~');\nparser.registerAttrEqualityMods('^', '$', '*', '~');\nparser.enableSubstitutes();\n\nconst RESOURCE_ID = 'resource-id';\nconst ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\\/[\\S]+$/;\n\nconst BOOLEAN_ATTRS = [\n 'checkable', 'checked', 'clickable', 'enabled', 'focusable',\n 'focused', 'long-clickable', 'scrollable', 'selected',\n];\n\nconst NUMERIC_ATTRS = [\n 'index', 'instance',\n];\n\nconst STR_ATTRS = [\n 'description', RESOURCE_ID, 'text', 'class-name', 'package-name'\n];\n\nconst ALL_ATTRS = [\n ...BOOLEAN_ATTRS,\n ...NUMERIC_ATTRS,\n ...STR_ATTRS,\n];\n\nconst ATTRIBUTE_ALIASES = [\n [RESOURCE_ID, ['id']],\n ['description', [\n 'content-description', 'content-desc',\n 'desc', 'accessibility-id',\n ]],\n ['index', ['nth-child']],\n];\n\n/**\n * Convert hyphen separated word to snake case\n *\n * @param {string} str\n * @returns {string} The hyphen separated word translated to snake case\n */\nfunction toSnakeCase (str) {\n if (!str) {\n return '';\n }\n const tokens = str.split('-').map((str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase());\n const out = tokens.join('');\n return out.charAt(0).toLowerCase() + out.slice(1);\n}\n\n/**\n * @typedef {Object} CssNameValueObject\n * @property {?name} name The name of the CSS object\n * @property {?string} value The value of the CSS object\n */\n\n/**\n * Get the boolean from a CSS object. If empty, return true. If not true/false/empty, throw exception\n *\n * @param {CssNameValueObject} css A CSS object that has 'name' and 'value'\n * @returns {string} Either 'true' or 'false'. If value is empty, return 'true'\n */\nfunction assertGetBool (css) {\n const val = css.value?.toLowerCase() || 'true'; // an omitted boolean attribute means 'true' (e.g.: input[checked] means checked is true)\n if (['true', 'false'].includes(val)) {\n return val;\n }\n throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);\n}\n\n/**\n * Get the canonical form of a CSS attribute name\n *\n * Converts to lowercase and if an attribute name is an alias for something else, return\n * what it is an alias for\n *\n * @param {Object} css CSS object\n * @returns {string} The canonical attribute name\n */\nfunction assertGetAttrName (css) {\n const attrName = css.name.toLowerCase();\n\n // Check if it's supported and if it is, return it\n if (ALL_ATTRS.includes(attrName)) {\n return attrName.toLowerCase();\n }\n\n // If attrName is an alias for something else, return that\n for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {\n if (aliasAttrs.includes(attrName)) {\n return officialAttr;\n }\n }\n throw new Error(`'${attrName}' is not a valid attribute. ` +\n `Supported attributes are '${ALL_ATTRS.join(', ')}'`);\n}\n\n/**\n * Get a regex that matches a whole word. For the ~= CSS attribute selector.\n *\n * @param {string} word\n * @returns {string} A regex \"word\" matcher\n */\nfunction getWordMatcherRegex (word) {\n return `\\\\b(\\\\w*${escapeRegExp(word)}\\\\w*)\\\\b`;\n}\n\n/**\n * @typedef {Object} CssAttr\n * @property {?string} valueType Type of attribute (must be string or empty)\n * @property {?string} value Value of the attribute\n * @property {?string} operator The operator between value and value type (=, *=, , ^=, $=)\n */\n\n/**\n * @typedef {Object} CssRule\n * @property {?string} nestingOperator The nesting operator (aka: combinator https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors)\n * @property {?string} tagName The tag name (aka: type selector https://developer.mozilla.org/en-US/docs/Web/CSS/Type_selectors)\n * @property {?string[]} classNames An array of CSS class names\n * @property {?CssAttr[]} attrs An array of CSS attributes\n * @property {?CssPseudo[]} attrs An array of CSS pseudos\n * @property {?string} id CSS identifier\n * @property {?CssRule} rule A descendant of this CSS rule\n */\n\n/**\n * @typedef {Object} CssObject\n * @property {?string} type Type of CSS object. 'rule', 'ruleset' or 'selectors'\n */\n\n/**\n * @typedef {Object} CssPseudo\n * @property {?string} valueType The type of CSS pseudo selector (https://www.npmjs.com/package/css-selector-parser for reference)\n * @property {?string} name The name of the pseudo selector\n * @property {?string} value The value of the pseudo selector\n */\n\nclass CssConverter {\n\n constructor (selector, pkg) {\n this.selector = selector;\n this.pkg = pkg;\n }\n\n /**\n * Add `<pkgName>:id/` prefix to beginning of string if it's not there already\n *\n * @param {string} locator The initial locator\n * @returns {string} String with `<pkgName>:id/` prepended (if it wasn't already)\n */\n formatIdLocator (locator) {\n return ID_LOCATOR_PATTERN.test(locator)\n ? locator\n : `${this.pkg || 'android'}:id/${locator}`;\n }\n\n /**\n * Convert a CSS attribute into a UiSelector method call\n *\n * @param {CssAttr} cssAttr CSS attribute object\n * @returns {string} CSS attribute parsed as UiSelector\n */\n parseAttr (cssAttr) {\n if (cssAttr.valueType && cssAttr.valueType !== 'string') {\n throw new Error(`'${cssAttr.name}=${cssAttr.value}' is an invalid attribute. ` +\n `Only 'string' and empty attribute types are supported. Found '${cssAttr.valueType}'`);\n }\n const attrName = assertGetAttrName(cssAttr);\n const methodName = toSnakeCase(attrName);\n\n // Validate that it's a supported attribute\n if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {\n throw new Error(`'${attrName}' is not supported. Supported attributes are ` +\n `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);\n }\n\n // Parse boolean, if it's a boolean attribute\n if (BOOLEAN_ATTRS.includes(attrName)) {\n return `.${methodName}(${assertGetBool(cssAttr)})`;\n }\n\n // Otherwise parse as string\n let value = cssAttr.value || '';\n if (attrName === RESOURCE_ID) {\n value = this.formatIdLocator(value);\n }\n if (value === '') {\n return `.${methodName}Matches(\"\")`;\n }\n\n switch (cssAttr.operator) {\n case '=':\n return `.${methodName}(\"${value}\")`;\n case '*=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}Contains(\"${value}\")`;\n }\n return `.${methodName}Matches(\"${escapeRegExp(value)}\")`;\n case '^=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}StartsWith(\"${value}\")`;\n }\n return `.${methodName}Matches(\"^${escapeRegExp(value)}\")`;\n case '$=':\n return `.${methodName}Matches(\"${escapeRegExp(value)}$\")`;\n case '~=':\n return `.${methodName}Matches(\"${getWordMatcherRegex(value)}\")`;\n default:\n // Unreachable, but adding error in case a new CSS attribute is added.\n throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` +\n ` '=', '*=', '^=', '$=' and '~=' are supported.`);\n }\n }\n\n /**\n * Convert a CSS pseudo class to a UiSelector\n *\n * @param {CssPseudo} cssPseudo CSS Pseudo class\n * @returns {string} Pseudo selector parsed as UiSelector\n */\n parsePseudo (cssPseudo) {\n if (cssPseudo.valueType && cssPseudo.valueType !== 'string') {\n throw new Error(`'${cssPseudo.name}=${cssPseudo.value}'. ` +\n `Unsupported css pseudo class value type: '${cssPseudo.valueType}'. Only 'string' type or empty is supported.`);\n }\n\n const pseudoName = assertGetAttrName(cssPseudo);\n\n if (BOOLEAN_ATTRS.includes(pseudoName)) {\n return `.${toSnakeCase(pseudoName)}(${assertGetBool(cssPseudo)})`;\n }\n\n if (NUMERIC_ATTRS.includes(pseudoName)) {\n return `.${pseudoName}(${cssPseudo.value})`;\n }\n }\n\n /**\n * Convert a CSS rule to a UiSelector\n * @param {CssRule} cssRule CSS rule definition\n */\n parseCssRule (cssRule) {\n const { nestingOperator } = cssRule;\n if (nestingOperator && nestingOperator !== ' ') {\n throw new Error(`'${nestingOperator}' is not a supported combinator. ` +\n `Only child combinator (>) and descendant combinator are supported.`);\n }\n\n let uiAutomatorSelector = 'new UiSelector()';\n if (cssRule.tagName && cssRule.tagName !== '*') {\n let androidClass = [cssRule.tagName];\n if (cssRule.classNames) {\n for (const cssClassNames of cssRule.classNames) {\n androidClass.push(cssClassNames);\n }\n uiAutomatorSelector += `.className(\"${androidClass.join('.')}\")`;\n } else {\n uiAutomatorSelector += `.classNameMatches(\"${cssRule.tagName}\")`;\n }\n } else if (cssRule.classNames) {\n uiAutomatorSelector += `.classNameMatches(\"${cssRule.classNames.join('\\\\.')}\")`;\n }\n if (cssRule.id) {\n uiAutomatorSelector += `.resourceId(\"${this.formatIdLocator(cssRule.id)}\")`;\n }\n if (cssRule.attrs) {\n for (const attr of cssRule.attrs) {\n uiAutomatorSelector += this.parseAttr(attr);\n }\n }\n if (cssRule.pseudos) {\n for (const pseudo of cssRule.pseudos) {\n uiAutomatorSelector += this.parsePseudo(pseudo);\n }\n }\n if (cssRule.rule) {\n uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.rule)})`;\n }\n return uiAutomatorSelector;\n }\n\n /**\n * Convert CSS object to UiAutomator2 selector\n * @param {CssObject} css CSS object\n * @returns {string} The CSS object parsed as a UiSelector\n */\n parseCssObject (css) {\n switch (css.type) {\n case 'rule':\n return this.parseCssRule(css);\n case 'ruleSet':\n return this.parseCssObject(css.rule);\n case 'selectors':\n return css.selectors.map((selector) => this.parseCssObject(selector)).join('; ');\n\n default:\n // This is never reachable, but if it ever is do this.\n throw new Error(`UiAutomator does not support '${css.type}' css. Only supports 'rule', 'ruleSet', 'selectors' `);\n }\n }\n\n /**\n * Convert a CSS selector to a UiAutomator2 selector\n *\n * @returns {string} The CSS selector converted to a UiSelector\n */\n toUiAutomatorSelector () {\n let cssObj;\n try {\n cssObj = parser.parse(this.selector);\n } catch (e) {\n throw new errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e}'`);\n }\n try {\n return this.parseCssObject(cssObj);\n } catch (e) {\n throw new errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e}'`);\n }\n }\n}\n\nexport default CssConverter;"],"mappings":"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"}
|
|
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
require("source-map-support/register");
|
|
9
|
-
|
|
10
8
|
var _appiumAndroidDriver = require("appium-android-driver");
|
|
11
|
-
|
|
12
9
|
let uiautomatorCapConstraints = {
|
|
13
10
|
app: {
|
|
14
11
|
presence: true,
|
|
@@ -67,4 +64,4 @@ let desiredCapConstraints = {};
|
|
|
67
64
|
Object.assign(desiredCapConstraints, uiautomatorCapConstraints, _appiumAndroidDriver.commonCapConstraints);
|
|
68
65
|
var _default = desiredCapConstraints;
|
|
69
66
|
exports.default = _default;
|
|
70
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1aWF1dG9tYXRvckNhcENvbnN0cmFpbnRzIiwiYXBwIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsImF1dG9tYXRpb25OYW1lIiwiYnJvd3Nlck5hbWUiLCJsYXVuY2hUaW1lb3V0IiwiaXNOdW1iZXIiLCJza2lwVW5sb2NrIiwiaXNCb29sZWFuIiwidWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCIsInVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0IiwidWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwic3lzdGVtUG9ydCIsIm1qcGVnU2VydmVyUG9ydCIsIm1qcGVnU2NyZWVuc2hvdFVybCIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJ1c2VyUHJvZmlsZSIsImFwcFdhaXRGb3JMYXVuY2giLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsIk9iamVjdCIsImFzc2lnbiIsImNvbW1vbkNhcENvbnN0cmFpbnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Rlc2lyZWQtY2Fwcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21tb25DYXBDb25zdHJhaW50cyB9IGZyb20gJ2FwcGl1bS1hbmRyb2lkLWRyaXZlcic7XG5cbmxldCB1aWF1dG9tYXRvckNhcENvbnN0cmFpbnRzID0ge1xuICBhcHA6IHtcbiAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBhdXRvbWF0aW9uTmFtZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGJyb3dzZXJOYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgbGF1bmNoVGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIHNraXBVbmxvY2s6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgdWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIHVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgdWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBkaXNhYmxlV2luZG93QW5pbWF0aW9uOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIHN5c3RlbVBvcnQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBtanBlZ1NlcnZlclBvcnQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBtanBlZ1NjcmVlbnNob3RVcmw6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBza2lwU2VydmVySW5zdGFsbGF0aW9uOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGFuZHJvaWRDb3ZlcmFnZUVuZEludGVudDoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHVzZXJQcm9maWxlOiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgYXBwV2FpdEZvckxhdW5jaDoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZToge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9XG59O1xuXG5sZXQgZGVzaXJlZENhcENvbnN0cmFpbnRzID0ge307XG5PYmplY3QuYXNzaWduKFxuICBkZXNpcmVkQ2FwQ29uc3RyYWludHMsXG4gIHVpYXV0b21hdG9yQ2FwQ29uc3RyYWludHMsXG4gIGNvbW1vbkNhcENvbnN0cmFpbnRzXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUVBLElBQUlBLHlCQUF5QixHQUFHO0VBQzlCQyxHQUFHLEVBQUU7SUFDSEMsUUFBUSxFQUFFLElBQUk7SUFDZEMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEQyxjQUFjLEVBQUU7SUFDZEQsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNERSxXQUFXLEVBQUU7SUFDWEYsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNERyxhQUFhLEVBQUU7SUFDYkMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEQyxVQUFVLEVBQUU7SUFDVkMsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEQywrQkFBK0IsRUFBRTtJQUMvQkgsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNESSxnQ0FBZ0MsRUFBRTtJQUNoQ0osUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNESyw2QkFBNkIsRUFBRTtJQUM3QkwsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNETSxzQkFBc0IsRUFBRTtJQUN0QkosU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNESyxVQUFVLEVBQUU7SUFDVlAsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEUSxlQUFlLEVBQUU7SUFDZlIsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEUyxrQkFBa0IsRUFBRTtJQUNsQmIsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEYyxzQkFBc0IsRUFBRTtJQUN0QlIsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEUyx3QkFBd0IsRUFBRTtJQUN4QmYsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEZ0IsV0FBVyxFQUFFO0lBQ1haLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRGEsZ0JBQWdCLEVBQUU7SUFDaEJYLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRFksbUNBQW1DLEVBQUU7SUFDbkNaLFNBQVMsRUFBRTtFQUNiO0FBQ0YsQ0FBQztBQUVELElBQUlhLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUM5QkMsTUFBTSxDQUFDQyxNQUFNLENBQ1hGLHFCQUFxQixFQUNyQnRCLHlCQUF5QixFQUN6QnlCLHlDQUFvQixDQUNyQjtBQUFDLGVBRWFILHFCQUFxQjtBQUFBIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desired-caps.js","names":["uiautomatorCapConstraints","app","presence","isString","automationName","browserName","launchTimeout","isNumber","skipUnlock","isBoolean","uiautomator2ServerLaunchTimeout","uiautomator2ServerInstallTimeout","uiautomator2ServerReadTimeout","disableWindowAnimation","systemPort","mjpegServerPort","mjpegScreenshotUrl","skipServerInstallation","androidCoverageEndIntent","userProfile","appWaitForLaunch","disableSuppressAccessibilityService","desiredCapConstraints","Object","assign","commonCapConstraints"],"sources":["../../lib/desired-caps.js"],"sourcesContent":["import { commonCapConstraints } from 'appium-android-driver';\n\nlet uiautomatorCapConstraints = {\n app: {\n presence: true,\n isString: true\n },\n automationName: {\n isString: true\n },\n browserName: {\n isString: true\n },\n launchTimeout: {\n isNumber: true\n },\n skipUnlock: {\n isBoolean: true\n },\n uiautomator2ServerLaunchTimeout: {\n isNumber: true\n },\n uiautomator2ServerInstallTimeout: {\n isNumber: true\n },\n uiautomator2ServerReadTimeout: {\n isNumber: true\n },\n disableWindowAnimation: {\n isBoolean: true\n },\n systemPort: {\n isNumber: true\n },\n mjpegServerPort: {\n isNumber: true\n },\n mjpegScreenshotUrl: {\n isString: true\n },\n skipServerInstallation: {\n isBoolean: true\n },\n androidCoverageEndIntent: {\n isString: true\n },\n userProfile: {\n isNumber: true\n },\n appWaitForLaunch: {\n isBoolean: true\n },\n disableSuppressAccessibilityService: {\n isBoolean: true\n }\n};\n\nlet desiredCapConstraints = {};\nObject.assign(\n desiredCapConstraints,\n uiautomatorCapConstraints,\n commonCapConstraints\n);\n\nexport default desiredCapConstraints;\n"],"mappings":";;;;;;;AAAA;AAEA,IAAIA,yBAAyB,GAAG;EAC9BC,GAAG,EAAE;IACHC,QAAQ,EAAE,IAAI;IACdC,QAAQ,EAAE;EACZ,CAAC;EACDC,cAAc,EAAE;IACdD,QAAQ,EAAE;EACZ,CAAC;EACDE,WAAW,EAAE;IACXF,QAAQ,EAAE;EACZ,CAAC;EACDG,aAAa,EAAE;IACbC,QAAQ,EAAE;EACZ,CAAC;EACDC,UAAU,EAAE;IACVC,SAAS,EAAE;EACb,CAAC;EACDC,+BAA+B,EAAE;IAC/BH,QAAQ,EAAE;EACZ,CAAC;EACDI,gCAAgC,EAAE;IAChCJ,QAAQ,EAAE;EACZ,CAAC;EACDK,6BAA6B,EAAE;IAC7BL,QAAQ,EAAE;EACZ,CAAC;EACDM,sBAAsB,EAAE;IACtBJ,SAAS,EAAE;EACb,CAAC;EACDK,UAAU,EAAE;IACVP,QAAQ,EAAE;EACZ,CAAC;EACDQ,eAAe,EAAE;IACfR,QAAQ,EAAE;EACZ,CAAC;EACDS,kBAAkB,EAAE;IAClBb,QAAQ,EAAE;EACZ,CAAC;EACDc,sBAAsB,EAAE;IACtBR,SAAS,EAAE;EACb,CAAC;EACDS,wBAAwB,EAAE;IACxBf,QAAQ,EAAE;EACZ,CAAC;EACDgB,WAAW,EAAE;IACXZ,QAAQ,EAAE;EACZ,CAAC;EACDa,gBAAgB,EAAE;IAChBX,SAAS,EAAE;EACb,CAAC;EACDY,mCAAmC,EAAE;IACnCZ,SAAS,EAAE;EACb;AACF,CAAC;AAED,IAAIa,qBAAqB,GAAG,CAAC,CAAC;AAC9BC,MAAM,CAACC,MAAM,CACXF,qBAAqB,EACrBtB,yBAAyB,EACzByB,yCAAoB,CACrB;AAAC,eAEaH,qBAAqB;AAAA"}
|