appium-uiautomator2-driver 2.10.2 → 2.11.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 +14 -0
- package/README.md +10 -2
- package/build/lib/commands/alert.js +1 -3
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/battery.js +1 -3
- package/build/lib/commands/battery.js.map +1 -1
- package/build/lib/commands/find.js +1 -3
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +1 -14
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/gestures.js +1 -12
- package/build/lib/commands/gestures.js.map +1 -1
- package/build/lib/commands/index.js +2 -3
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/viewport.js +1 -3
- package/build/lib/commands/viewport.js.map +1 -1
- package/build/lib/css-converter.js +1 -17
- package/build/lib/css-converter.js.map +1 -1
- package/build/lib/driver.js +4 -43
- package/build/lib/driver.js.map +1 -1
- package/build/lib/uiautomator2.js +1 -3
- package/build/lib/uiautomator2.js.map +1 -1
- package/npm-shrinkwrap.json +148 -279
- package/package.json +4 -3
|
@@ -20,7 +20,6 @@ const NUMERIC_ATTRS = ['index', 'instance'];
|
|
|
20
20
|
const STR_ATTRS = ['description', RESOURCE_ID, 'text', 'class-name', 'package-name'];
|
|
21
21
|
const ALL_ATTRS = [...BOOLEAN_ATTRS, ...NUMERIC_ATTRS, ...STR_ATTRS];
|
|
22
22
|
const ATTRIBUTE_ALIASES = [[RESOURCE_ID, ['id']], ['description', ['content-description', 'content-desc', 'desc', 'accessibility-id']], ['index', ['nth-child']]];
|
|
23
|
-
|
|
24
23
|
function toSnakeCase(str) {
|
|
25
24
|
if (!str) {
|
|
26
25
|
return '';
|
|
@@ -29,7 +28,6 @@ function toSnakeCase(str) {
|
|
|
29
28
|
const out = tokens.join('');
|
|
30
29
|
return out.charAt(0).toLowerCase() + out.slice(1);
|
|
31
30
|
}
|
|
32
|
-
|
|
33
31
|
function assertGetBool(css) {
|
|
34
32
|
var _css$value;
|
|
35
33
|
const val = ((_css$value = css.value) === null || _css$value === void 0 ? void 0 : _css$value.toLowerCase()) || 'true';
|
|
@@ -38,14 +36,11 @@ function assertGetBool(css) {
|
|
|
38
36
|
}
|
|
39
37
|
throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);
|
|
40
38
|
}
|
|
41
|
-
|
|
42
39
|
function assertGetAttrName(css) {
|
|
43
40
|
const attrName = css.name.toLowerCase();
|
|
44
|
-
|
|
45
41
|
if (ALL_ATTRS.includes(attrName)) {
|
|
46
42
|
return attrName.toLowerCase();
|
|
47
43
|
}
|
|
48
|
-
|
|
49
44
|
for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {
|
|
50
45
|
if (aliasAttrs.includes(attrName)) {
|
|
51
46
|
return officialAttr;
|
|
@@ -53,36 +48,29 @@ function assertGetAttrName(css) {
|
|
|
53
48
|
}
|
|
54
49
|
throw new Error(`'${attrName}' is not a valid attribute. ` + `Supported attributes are '${ALL_ATTRS.join(', ')}'`);
|
|
55
50
|
}
|
|
56
|
-
|
|
57
51
|
function getWordMatcherRegex(word) {
|
|
58
52
|
return `\\b(\\w*${(0, _lodash.escapeRegExp)(word)}\\w*)\\b`;
|
|
59
53
|
}
|
|
60
|
-
|
|
61
54
|
class CssConverter {
|
|
62
55
|
constructor(selector, pkg) {
|
|
63
56
|
this.selector = selector;
|
|
64
57
|
this.pkg = pkg;
|
|
65
58
|
}
|
|
66
|
-
|
|
67
59
|
formatIdLocator(locator) {
|
|
68
60
|
return ID_LOCATOR_PATTERN.test(locator) ? locator : `${this.pkg || 'android'}:id/${locator}`;
|
|
69
61
|
}
|
|
70
|
-
|
|
71
62
|
parseAttr(cssAttr) {
|
|
72
63
|
if (cssAttr.valueType && cssAttr.valueType !== 'string') {
|
|
73
64
|
throw new Error(`'${cssAttr.name}=${cssAttr.value}' is an invalid attribute. ` + `Only 'string' and empty attribute types are supported. Found '${cssAttr.valueType}'`);
|
|
74
65
|
}
|
|
75
66
|
const attrName = assertGetAttrName(cssAttr);
|
|
76
67
|
const methodName = toSnakeCase(attrName);
|
|
77
|
-
|
|
78
68
|
if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {
|
|
79
69
|
throw new Error(`'${attrName}' is not supported. Supported attributes are ` + `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);
|
|
80
70
|
}
|
|
81
|
-
|
|
82
71
|
if (BOOLEAN_ATTRS.includes(attrName)) {
|
|
83
72
|
return `.${methodName}(${assertGetBool(cssAttr)})`;
|
|
84
73
|
}
|
|
85
|
-
|
|
86
74
|
let value = cssAttr.value || '';
|
|
87
75
|
if (attrName === RESOURCE_ID) {
|
|
88
76
|
value = this.formatIdLocator(value);
|
|
@@ -111,7 +99,6 @@ class CssConverter {
|
|
|
111
99
|
throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` + ` '=', '*=', '^=', '$=' and '~=' are supported.`);
|
|
112
100
|
}
|
|
113
101
|
}
|
|
114
|
-
|
|
115
102
|
parsePseudo(cssPseudo) {
|
|
116
103
|
if (cssPseudo.valueType && cssPseudo.valueType !== 'string') {
|
|
117
104
|
throw new Error(`'${cssPseudo.name}=${cssPseudo.value}'. ` + `Unsupported css pseudo class value type: '${cssPseudo.valueType}'. Only 'string' type or empty is supported.`);
|
|
@@ -124,7 +111,6 @@ class CssConverter {
|
|
|
124
111
|
return `.${pseudoName}(${cssPseudo.value})`;
|
|
125
112
|
}
|
|
126
113
|
}
|
|
127
|
-
|
|
128
114
|
parseCssRule(cssRule) {
|
|
129
115
|
const {
|
|
130
116
|
nestingOperator
|
|
@@ -164,7 +150,6 @@ class CssConverter {
|
|
|
164
150
|
}
|
|
165
151
|
return uiAutomatorSelector;
|
|
166
152
|
}
|
|
167
|
-
|
|
168
153
|
parseCssObject(css) {
|
|
169
154
|
switch (css.type) {
|
|
170
155
|
case 'rule':
|
|
@@ -177,7 +162,6 @@ class CssConverter {
|
|
|
177
162
|
throw new Error(`UiAutomator does not support '${css.type}' css. Only supports 'rule', 'ruleSet', 'selectors' `);
|
|
178
163
|
}
|
|
179
164
|
}
|
|
180
|
-
|
|
181
165
|
toUiAutomatorSelector() {
|
|
182
166
|
let cssObj;
|
|
183
167
|
try {
|
|
@@ -194,4 +178,4 @@ class CssConverter {
|
|
|
194
178
|
}
|
|
195
179
|
var _default = CssConverter;
|
|
196
180
|
exports.default = _default;
|
|
197
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZXIiLCJDc3NTZWxlY3RvclBhcnNlciIsInJlZ2lzdGVyU2VsZWN0b3JQc2V1ZG9zIiwicmVnaXN0ZXJOZXN0aW5nT3BlcmF0b3JzIiwicmVnaXN0ZXJBdHRyRXF1YWxpdHlNb2RzIiwiZW5hYmxlU3Vic3RpdHV0ZXMiLCJSRVNPVVJDRV9JRCIsIklEX0xPQ0FUT1JfUEFUVEVSTiIsIkJPT0xFQU5fQVRUUlMiLCJOVU1FUklDX0FUVFJTIiwiU1RSX0FUVFJTIiwiQUxMX0FUVFJTIiwiQVRUUklCVVRFX0FMSUFTRVMiLCJ0b1NuYWtlQ2FzZSIsInN0ciIsInRva2VucyIsInNwbGl0IiwibWFwIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsInRvTG93ZXJDYXNlIiwib3V0Iiwiam9pbiIsImFzc2VydEdldEJvb2wiLCJjc3MiLCJ2YWwiLCJ2YWx1ZSIsImluY2x1ZGVzIiwiRXJyb3IiLCJuYW1lIiwiYXNzZXJ0R2V0QXR0ck5hbWUiLCJhdHRyTmFtZSIsIm9mZmljaWFsQXR0ciIsImFsaWFzQXR0cnMiLCJnZXRXb3JkTWF0Y2hlclJlZ2V4Iiwid29yZCIsImVzY2FwZVJlZ0V4cCIsIkNzc0NvbnZlcnRlciIsImNvbnN0cnVjdG9yIiwic2VsZWN0b3IiLCJwa2ciLCJmb3JtYXRJZExvY2F0b3IiLCJsb2NhdG9yIiwidGVzdCIsInBhcnNlQXR0ciIsImNzc0F0dHIiLCJ2YWx1ZVR5cGUiLCJtZXRob2ROYW1lIiwib3BlcmF0b3IiLCJwYXJzZVBzZXVkbyIsImNzc1BzZXVkbyIsInBzZXVkb05hbWUiLCJwYXJzZUNzc1J1bGUiLCJjc3NSdWxlIiwibmVzdGluZ09wZXJhdG9yIiwidWlBdXRvbWF0b3JTZWxlY3RvciIsInRhZ05hbWUiLCJhbmRyb2lkQ2xhc3MiLCJjbGFzc05hbWVzIiwiY3NzQ2xhc3NOYW1lcyIsInB1c2giLCJpZCIsImF0dHJzIiwiYXR0ciIsInBzZXVkb3MiLCJwc2V1ZG8iLCJydWxlIiwicGFyc2VDc3NPYmplY3QiLCJ0eXBlIiwic2VsZWN0b3JzIiwidG9VaUF1dG9tYXRvclNlbGVjdG9yIiwiY3NzT2JqIiwicGFyc2UiLCJlIiwiZXJyb3JzIiwiSW52YWxpZFNlbGVjdG9yRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9saWIvY3NzLWNvbnZlcnRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDc3NTZWxlY3RvclBhcnNlciB9IGZyb20gJ2Nzcy1zZWxlY3Rvci1wYXJzZXInO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBwYXJzZXIgPSBuZXcgQ3NzU2VsZWN0b3JQYXJzZXIoKTtcbnBhcnNlci5yZWdpc3RlclNlbGVjdG9yUHNldWRvcygnaGFzJyk7XG5wYXJzZXIucmVnaXN0ZXJOZXN0aW5nT3BlcmF0b3JzKCc+JywgJysnLCAnficpO1xucGFyc2VyLnJlZ2lzdGVyQXR0ckVxdWFsaXR5TW9kcygnXicsICckJywgJyonLCAnficpO1xucGFyc2VyLmVuYWJsZVN1YnN0aXR1dGVzKCk7XG5cbmNvbnN0IFJFU09VUkNFX0lEID0gJ3Jlc291cmNlLWlkJztcbmNvbnN0IElEX0xPQ0FUT1JfUEFUVEVSTiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOS5fXSo6aWRcXC9bXFxTXSskLztcblxuY29uc3QgQk9PTEVBTl9BVFRSUyA9IFtcbiAgJ2NoZWNrYWJsZScsICdjaGVja2VkJywgJ2NsaWNrYWJsZScsICdlbmFibGVkJywgJ2ZvY3VzYWJsZScsXG4gICdmb2N1c2VkJywgJ2xvbmctY2xpY2thYmxlJywgJ3Njcm9sbGFibGUnLCAnc2VsZWN0ZWQnLFxuXTtcblxuY29uc3QgTlVNRVJJQ19BVFRSUyA9IFtcbiAgJ2luZGV4JywgJ2luc3RhbmNlJyxcbl07XG5cbmNvbnN0IFNUUl9BVFRSUyA9IFtcbiAgJ2Rlc2NyaXB0aW9uJywgUkVTT1VSQ0VfSUQsICd0ZXh0JywgJ2NsYXNzLW5hbWUnLCAncGFja2FnZS1uYW1lJ1xuXTtcblxuY29uc3QgQUxMX0FUVFJTID0gW1xuICAuLi5CT09MRUFOX0FUVFJTLFxuICAuLi5OVU1FUklDX0FUVFJTLFxuICAuLi5TVFJfQVRUUlMsXG5dO1xuXG5jb25zdCBBVFRSSUJVVEVfQUxJQVNFUyA9IFtcbiAgW1JFU09VUkNFX0lELCBbJ2lkJ11dLFxuICBbJ2Rlc2NyaXB0aW9uJywgW1xuICAgICdjb250ZW50LWRlc2NyaXB0aW9uJywgJ2NvbnRlbnQtZGVzYycsXG4gICAgJ2Rlc2MnLCAnYWNjZXNzaWJpbGl0eS1pZCcsXG4gIF1dLFxuICBbJ2luZGV4JywgWydudGgtY2hpbGQnXV0sXG5dO1xuXG4vKipcbiAqIENvbnZlcnQgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRvIHNuYWtlIGNhc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRyYW5zbGF0ZWQgdG8gc25ha2UgY2FzZVxuICovXG5mdW5jdGlvbiB0b1NuYWtlQ2FzZSAoc3RyKSB7XG4gIGlmICghc3RyKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IHRva2VucyA9IHN0ci5zcGxpdCgnLScpLm1hcCgoc3RyKSA9PiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSk7XG4gIGNvbnN0IG91dCA9IHRva2Vucy5qb2luKCcnKTtcbiAgcmV0dXJuIG91dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIG91dC5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NOYW1lVmFsdWVPYmplY3RcbiAqIEBwcm9wZXJ0eSB7P25hbWV9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIENTUyBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBDU1Mgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIGJvb2xlYW4gZnJvbSBhIENTUyBvYmplY3QuIElmIGVtcHR5LCByZXR1cm4gdHJ1ZS4gSWYgbm90IHRydWUvZmFsc2UvZW1wdHksIHRocm93IGV4Y2VwdGlvblxuICpcbiAqIEBwYXJhbSB7Q3NzTmFtZVZhbHVlT2JqZWN0fSBjc3MgQSBDU1Mgb2JqZWN0IHRoYXQgaGFzICduYW1lJyBhbmQgJ3ZhbHVlJ1xuICogQHJldHVybnMge3N0cmluZ30gRWl0aGVyICd0cnVlJyBvciAnZmFsc2UnLiBJZiB2YWx1ZSBpcyBlbXB0eSwgcmV0dXJuICd0cnVlJ1xuICovXG5mdW5jdGlvbiBhc3NlcnRHZXRCb29sIChjc3MpIHtcbiAgY29uc3QgdmFsID0gY3NzLnZhbHVlPy50b0xvd2VyQ2FzZSgpIHx8ICd0cnVlJzsgLy8gYW4gb21pdHRlZCBib29sZWFuIGF0dHJpYnV0ZSBtZWFucyAndHJ1ZScgKGUuZy46IGlucHV0W2NoZWNrZWRdIG1lYW5zIGNoZWNrZWQgaXMgdHJ1ZSlcbiAgaWYgKFsndHJ1ZScsICdmYWxzZSddLmluY2x1ZGVzKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzLm5hbWV9JyBtdXN0IGJlIHRydWUsIGZhbHNlIG9yIGVtcHR5LiBGb3VuZCAnJHtjc3MudmFsdWV9J2ApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY2Fub25pY2FsIGZvcm0gb2YgYSBDU1MgYXR0cmlidXRlIG5hbWVcbiAqXG4gKiBDb252ZXJ0cyB0byBsb3dlcmNhc2UgYW5kIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuXG4gKiB3aGF0IGl0IGlzIGFuIGFsaWFzIGZvclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjc3MgQ1NTIG9iamVjdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNhbm9uaWNhbCBhdHRyaWJ1dGUgbmFtZVxuICovXG5mdW5jdGlvbiBhc3NlcnRHZXRBdHRyTmFtZSAoY3NzKSB7XG4gIGNvbnN0IGF0dHJOYW1lID0gY3NzLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDaGVjayBpZiBpdCdzIHN1cHBvcnRlZCBhbmQgaWYgaXQgaXMsIHJldHVybiBpdFxuICBpZiAoQUxMX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgIHJldHVybiBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gSWYgYXR0ck5hbWUgaXMgYW4gYWxpYXMgZm9yIHNvbWV0aGluZyBlbHNlLCByZXR1cm4gdGhhdFxuICBmb3IgKGNvbnN0IFtvZmZpY2lhbEF0dHIsIGFsaWFzQXR0cnNdIG9mIEFUVFJJQlVURV9BTElBU0VTKSB7XG4gICAgaWYgKGFsaWFzQXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gb2ZmaWNpYWxBdHRyO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICBgU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlICcke0FMTF9BVFRSUy5qb2luKCcsICcpfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgYSByZWdleCB0aGF0IG1hdGNoZXMgYSB3aG9sZSB3b3JkLiBGb3IgdGhlIH49IENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgcmVnZXggXCJ3b3JkXCIgbWF0Y2hlclxuICovXG5mdW5jdGlvbiBnZXRXb3JkTWF0Y2hlclJlZ2V4ICh3b3JkKSB7XG4gIHJldHVybiBgXFxcXGIoXFxcXHcqJHtlc2NhcGVSZWdFeHAod29yZCl9XFxcXHcqKVxcXFxiYDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NBdHRyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUeXBlIG9mIGF0dHJpYnV0ZSAobXVzdCBiZSBzdHJpbmcgb3IgZW1wdHkpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIGJldHdlZW4gdmFsdWUgYW5kIHZhbHVlIHR5cGUgKD0sICo9LCAsIF49LCAkPSlcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1J1bGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbmVzdGluZ09wZXJhdG9yIFRoZSBuZXN0aW5nIG9wZXJhdG9yIChha2E6IGNvbWJpbmF0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHRhZ05hbWUgVGhlIHRhZyBuYW1lIChha2E6IHR5cGUgc2VsZWN0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL1R5cGVfc2VsZWN0b3JzKVxuICogQHByb3BlcnR5IHs/c3RyaW5nW119IGNsYXNzTmFtZXMgQW4gYXJyYXkgb2YgQ1NTIGNsYXNzIG5hbWVzXG4gKiBAcHJvcGVydHkgez9Dc3NBdHRyW119IGF0dHJzIEFuIGFycmF5IG9mIENTUyBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkgez9Dc3NQc2V1ZG9bXX0gYXR0cnMgQW4gYXJyYXkgb2YgQ1NTIHBzZXVkb3NcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWQgQ1NTIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P0Nzc1J1bGV9IHJ1bGUgQSBkZXNjZW5kYW50IG9mIHRoaXMgQ1NTIHJ1bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc09iamVjdFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB0eXBlIFR5cGUgb2YgQ1NTIG9iamVjdC4gJ3J1bGUnLCAncnVsZXNldCcgb3IgJ3NlbGVjdG9ycydcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1BzZXVkb1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgQ1NTIHBzZXVkbyBzZWxlY3RvciAoaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY3NzLXNlbGVjdG9yLXBhcnNlciBmb3IgcmVmZXJlbmNlKVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwc2V1ZG8gc2VsZWN0b3JcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBwc2V1ZG8gc2VsZWN0b3JcbiAqL1xuXG5jbGFzcyBDc3NDb252ZXJ0ZXIge1xuXG4gIGNvbnN0cnVjdG9yIChzZWxlY3RvciwgcGtnKSB7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHRoaXMucGtnID0gcGtnO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBgPHBrZ05hbWU+OmlkL2AgcHJlZml4IHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgaWYgaXQncyBub3QgdGhlcmUgYWxyZWFkeVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRvciBUaGUgaW5pdGlhbCBsb2NhdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyB3aXRoIGA8cGtnTmFtZT46aWQvYCBwcmVwZW5kZWQgKGlmIGl0IHdhc24ndCBhbHJlYWR5KVxuICAgKi9cbiAgZm9ybWF0SWRMb2NhdG9yIChsb2NhdG9yKSB7XG4gICAgcmV0dXJuIElEX0xPQ0FUT1JfUEFUVEVSTi50ZXN0KGxvY2F0b3IpXG4gICAgICA/IGxvY2F0b3JcbiAgICAgIDogYCR7dGhpcy5wa2cgfHwgJ2FuZHJvaWQnfTppZC8ke2xvY2F0b3J9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIGF0dHJpYnV0ZSBpbnRvIGEgVWlTZWxlY3RvciBtZXRob2QgY2FsbFxuICAgKlxuICAgKiBAcGFyYW0ge0Nzc0F0dHJ9IGNzc0F0dHIgQ1NTIGF0dHJpYnV0ZSBvYmplY3RcbiAgICogQHJldHVybnMge3N0cmluZ30gQ1NTIGF0dHJpYnV0ZSBwYXJzZWQgYXMgVWlTZWxlY3RvclxuICAgKi9cbiAgcGFyc2VBdHRyIChjc3NBdHRyKSB7XG4gICAgaWYgKGNzc0F0dHIudmFsdWVUeXBlICYmIGNzc0F0dHIudmFsdWVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NBdHRyLm5hbWV9PSR7Y3NzQXR0ci52YWx1ZX0nIGlzIGFuIGludmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICAgICAgYE9ubHkgJ3N0cmluZycgYW5kIGVtcHR5IGF0dHJpYnV0ZSB0eXBlcyBhcmUgc3VwcG9ydGVkLiBGb3VuZCAnJHtjc3NBdHRyLnZhbHVlVHlwZX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJOYW1lID0gYXNzZXJ0R2V0QXR0ck5hbWUoY3NzQXR0cik7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHRvU25ha2VDYXNlKGF0dHJOYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgaXQncyBhIHN1cHBvcnRlZCBhdHRyaWJ1dGVcbiAgICBpZiAoIVNUUl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIUJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IHN1cHBvcnRlZC4gU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlIGAgK1xuICAgICAgICBgJyR7Wy4uLlNUUl9BVFRSUywgLi4uQk9PTEVBTl9BVFRSU10uam9pbignLCAnKX0nYCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgYm9vbGVhbiwgaWYgaXQncyBhIGJvb2xlYW4gYXR0cmlidXRlXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KCR7YXNzZXJ0R2V0Qm9vbChjc3NBdHRyKX0pYDtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcGFyc2UgYXMgc3RyaW5nXG4gICAgbGV0IHZhbHVlID0gY3NzQXR0ci52YWx1ZSB8fCAnJztcbiAgICBpZiAoYXR0ck5hbWUgPT09IFJFU09VUkNFX0lEKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0SWRMb2NhdG9yKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJcIilgO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY3NzQXR0ci5vcGVyYXRvcikge1xuICAgICAgY2FzZSAnPSc6XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX0oXCIke3ZhbHVlfVwiKWA7XG4gICAgICBjYXNlICcqPSc6XG4gICAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9Q29udGFpbnMoXCIke3ZhbHVlfVwiKWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICAgIGNhc2UgJ149JzpcbiAgICAgICAgaWYgKFsnZGVzY3JpcHRpb24nLCAndGV4dCddLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1TdGFydHNXaXRoKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiXiR7ZXNjYXBlUmVnRXhwKHZhbHVlKX1cIilgO1xuICAgICAgY2FzZSAnJD0nOlxuICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9TWF0Y2hlcyhcIiR7ZXNjYXBlUmVnRXhwKHZhbHVlKX0kXCIpYDtcbiAgICAgIGNhc2UgJ349JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2dldFdvcmRNYXRjaGVyUmVnZXgodmFsdWUpfVwiKWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBVbnJlYWNoYWJsZSwgYnV0IGFkZGluZyBlcnJvciBpbiBjYXNlIGEgbmV3IENTUyBhdHRyaWJ1dGUgaXMgYWRkZWQuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIGF0dHJpYnV0ZSBvcGVyYXRvciAnJHtjc3NBdHRyLm9wZXJhdG9yfScuIGAgK1xuICAgICAgICAgIGAgJz0nLCAnKj0nLCAnXj0nLCAnJD0nIGFuZCAnfj0nIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgcHNldWRvIGNsYXNzIHRvIGEgVWlTZWxlY3RvclxuICAgKlxuICAgKiBAcGFyYW0ge0Nzc1BzZXVkb30gY3NzUHNldWRvIENTUyBQc2V1ZG8gY2xhc3NcbiAgICogQHJldHVybnMge3N0cmluZ30gUHNldWRvIHNlbGVjdG9yIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gICAqL1xuICBwYXJzZVBzZXVkbyAoY3NzUHNldWRvKSB7XG4gICAgaWYgKGNzc1BzZXVkby52YWx1ZVR5cGUgJiYgY3NzUHNldWRvLnZhbHVlVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUHNldWRvLm5hbWV9PSR7Y3NzUHNldWRvLnZhbHVlfScuIGAgK1xuICAgICAgICBgVW5zdXBwb3J0ZWQgY3NzIHBzZXVkbyBjbGFzcyB2YWx1ZSB0eXBlOiAnJHtjc3NQc2V1ZG8udmFsdWVUeXBlfScuIE9ubHkgJ3N0cmluZycgdHlwZSBvciBlbXB0eSBpcyBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHNldWRvTmFtZSA9IGFzc2VydEdldEF0dHJOYW1lKGNzc1BzZXVkbyk7XG5cbiAgICBpZiAoQk9PTEVBTl9BVFRSUy5pbmNsdWRlcyhwc2V1ZG9OYW1lKSkge1xuICAgICAgcmV0dXJuIGAuJHt0b1NuYWtlQ2FzZShwc2V1ZG9OYW1lKX0oJHthc3NlcnRHZXRCb29sKGNzc1BzZXVkbyl9KWA7XG4gICAgfVxuXG4gICAgaWYgKE5VTUVSSUNfQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICAgIHJldHVybiBgLiR7cHNldWRvTmFtZX0oJHtjc3NQc2V1ZG8udmFsdWV9KWA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgcnVsZSB0byBhIFVpU2VsZWN0b3JcbiAgICogQHBhcmFtIHtDc3NSdWxlfSBjc3NSdWxlIENTUyBydWxlIGRlZmluaXRpb25cbiAgICovXG4gIHBhcnNlQ3NzUnVsZSAoY3NzUnVsZSkge1xuICAgIGNvbnN0IHsgbmVzdGluZ09wZXJhdG9yIH0gPSBjc3NSdWxlO1xuICAgIGlmIChuZXN0aW5nT3BlcmF0b3IgJiYgbmVzdGluZ09wZXJhdG9yICE9PSAnICcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmVzdGluZ09wZXJhdG9yfScgaXMgbm90IGEgc3VwcG9ydGVkIGNvbWJpbmF0b3IuIGAgK1xuICAgICAgICBgT25seSBjaGlsZCBjb21iaW5hdG9yICg+KSBhbmQgZGVzY2VuZGFudCBjb21iaW5hdG9yIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgbGV0IHVpQXV0b21hdG9yU2VsZWN0b3IgPSAnbmV3IFVpU2VsZWN0b3IoKSc7XG4gICAgaWYgKGNzc1J1bGUudGFnTmFtZSAmJiBjc3NSdWxlLnRhZ05hbWUgIT09ICcqJykge1xuICAgICAgbGV0IGFuZHJvaWRDbGFzcyA9IFtjc3NSdWxlLnRhZ05hbWVdO1xuICAgICAgaWYgKGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICBmb3IgKGNvbnN0IGNzc0NsYXNzTmFtZXMgb2YgY3NzUnVsZS5jbGFzc05hbWVzKSB7XG4gICAgICAgICAgYW5kcm9pZENsYXNzLnB1c2goY3NzQ2xhc3NOYW1lcyk7XG4gICAgICAgIH1cbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZShcIiR7YW5kcm9pZENsYXNzLmpvaW4oJy4nKX1cIilgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZU1hdGNoZXMoXCIke2Nzc1J1bGUudGFnTmFtZX1cIilgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY3NzUnVsZS5jbGFzc05hbWVzKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2xhc3NOYW1lTWF0Y2hlcyhcIiR7Y3NzUnVsZS5jbGFzc05hbWVzLmpvaW4oJ1xcXFwuJyl9XCIpYDtcbiAgICB9XG4gICAgaWYgKGNzc1J1bGUuaWQpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5yZXNvdXJjZUlkKFwiJHt0aGlzLmZvcm1hdElkTG9jYXRvcihjc3NSdWxlLmlkKX1cIilgO1xuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5hdHRycykge1xuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGNzc1J1bGUuYXR0cnMpIHtcbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSB0aGlzLnBhcnNlQXR0cihhdHRyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNzc1J1bGUucHNldWRvcykge1xuICAgICAgZm9yIChjb25zdCBwc2V1ZG8gb2YgY3NzUnVsZS5wc2V1ZG9zKSB7XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gdGhpcy5wYXJzZVBzZXVkbyhwc2V1ZG8pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5ydWxlKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2hpbGRTZWxlY3Rvcigke3RoaXMucGFyc2VDc3NSdWxlKGNzc1J1bGUucnVsZSl9KWA7XG4gICAgfVxuICAgIHJldHVybiB1aUF1dG9tYXRvclNlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgQ1NTIG9iamVjdCB0byBVaUF1dG9tYXRvcjIgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtDc3NPYmplY3R9IGNzcyBDU1Mgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgb2JqZWN0IHBhcnNlZCBhcyBhIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQ3NzT2JqZWN0IChjc3MpIHtcbiAgICBzd2l0Y2ggKGNzcy50eXBlKSB7XG4gICAgICBjYXNlICdydWxlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NSdWxlKGNzcyk7XG4gICAgICBjYXNlICdydWxlU2V0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NPYmplY3QoY3NzLnJ1bGUpO1xuICAgICAgY2FzZSAnc2VsZWN0b3JzJzpcbiAgICAgICAgcmV0dXJuIGNzcy5zZWxlY3RvcnMubWFwKChzZWxlY3RvcikgPT4gdGhpcy5wYXJzZUNzc09iamVjdChzZWxlY3RvcikpLmpvaW4oJzsgJyk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFRoaXMgaXMgbmV2ZXIgcmVhY2hhYmxlLCBidXQgaWYgaXQgZXZlciBpcyBkbyB0aGlzLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVpQXV0b21hdG9yIGRvZXMgbm90IHN1cHBvcnQgJyR7Y3NzLnR5cGV9JyBjc3MuIE9ubHkgc3VwcG9ydHMgJ3J1bGUnLCAncnVsZVNldCcsICdzZWxlY3RvcnMnIGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHNlbGVjdG9yIHRvIGEgVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgc2VsZWN0b3IgY29udmVydGVkIHRvIGEgVWlTZWxlY3RvclxuICAgKi9cbiAgdG9VaUF1dG9tYXRvclNlbGVjdG9yICgpIHtcbiAgICBsZXQgY3NzT2JqO1xuICAgIHRyeSB7XG4gICAgICBjc3NPYmogPSBwYXJzZXIucGFyc2UodGhpcy5zZWxlY3Rvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkU2VsZWN0b3JFcnJvcihgSW52YWxpZCBDU1Mgc2VsZWN0b3IgJyR7dGhpcy5zZWxlY3Rvcn0nLiBSZWFzb246ICcke2V9J2ApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NPYmplY3QoY3NzT2JqKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRTZWxlY3RvckVycm9yKGBVbnN1cHBvcnRlZCBDU1Mgc2VsZWN0b3IgJyR7dGhpcy5zZWxlY3Rvcn0nLiBSZWFzb246ICcke2V9J2ApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDc3NDb252ZXJ0ZXI7Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUEsTUFBTUEsTUFBTSxHQUFHLElBQUlDLG9DQUFpQixFQUFFO0FBQ3RDRCxNQUFNLENBQUNFLHVCQUF1QixDQUFDLEtBQUssQ0FBQztBQUNyQ0YsTUFBTSxDQUFDRyx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUM5Q0gsTUFBTSxDQUFDSSx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDbkRKLE1BQU0sQ0FBQ0ssaUJBQWlCLEVBQUU7QUFFMUIsTUFBTUMsV0FBVyxHQUFHLGFBQWE7QUFDakMsTUFBTUMsa0JBQWtCLEdBQUcscUNBQXFDO0FBRWhFLE1BQU1DLGFBQWEsR0FBRyxDQUNwQixXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUMzRCxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FDdEQ7QUFFRCxNQUFNQyxhQUFhLEdBQUcsQ0FDcEIsT0FBTyxFQUFFLFVBQVUsQ0FDcEI7QUFFRCxNQUFNQyxTQUFTLEdBQUcsQ0FDaEIsYUFBYSxFQUFFSixXQUFXLEVB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
|
|
181
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZXIiLCJDc3NTZWxlY3RvclBhcnNlciIsInJlZ2lzdGVyU2VsZWN0b3JQc2V1ZG9zIiwicmVnaXN0ZXJOZXN0aW5nT3BlcmF0b3JzIiwicmVnaXN0ZXJBdHRyRXF1YWxpdHlNb2RzIiwiZW5hYmxlU3Vic3RpdHV0ZXMiLCJSRVNPVVJDRV9JRCIsIklEX0xPQ0FUT1JfUEFUVEVSTiIsIkJPT0xFQU5fQVRUUlMiLCJOVU1FUklDX0FUVFJTIiwiU1RSX0FUVFJTIiwiQUxMX0FUVFJTIiwiQVRUUklCVVRFX0FMSUFTRVMiLCJ0b1NuYWtlQ2FzZSIsInN0ciIsInRva2VucyIsInNwbGl0IiwibWFwIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsInRvTG93ZXJDYXNlIiwib3V0Iiwiam9pbiIsImFzc2VydEdldEJvb2wiLCJjc3MiLCJ2YWwiLCJ2YWx1ZSIsImluY2x1ZGVzIiwiRXJyb3IiLCJuYW1lIiwiYXNzZXJ0R2V0QXR0ck5hbWUiLCJhdHRyTmFtZSIsIm9mZmljaWFsQXR0ciIsImFsaWFzQXR0cnMiLCJnZXRXb3JkTWF0Y2hlclJlZ2V4Iiwid29yZCIsImVzY2FwZVJlZ0V4cCIsIkNzc0NvbnZlcnRlciIsImNvbnN0cnVjdG9yIiwic2VsZWN0b3IiLCJwa2ciLCJmb3JtYXRJZExvY2F0b3IiLCJsb2NhdG9yIiwidGVzdCIsInBhcnNlQXR0ciIsImNzc0F0dHIiLCJ2YWx1ZVR5cGUiLCJtZXRob2ROYW1lIiwib3BlcmF0b3IiLCJwYXJzZVBzZXVkbyIsImNzc1BzZXVkbyIsInBzZXVkb05hbWUiLCJwYXJzZUNzc1J1bGUiLCJjc3NSdWxlIiwibmVzdGluZ09wZXJhdG9yIiwidWlBdXRvbWF0b3JTZWxlY3RvciIsInRhZ05hbWUiLCJhbmRyb2lkQ2xhc3MiLCJjbGFzc05hbWVzIiwiY3NzQ2xhc3NOYW1lcyIsInB1c2giLCJpZCIsImF0dHJzIiwiYXR0ciIsInBzZXVkb3MiLCJwc2V1ZG8iLCJydWxlIiwicGFyc2VDc3NPYmplY3QiLCJ0eXBlIiwic2VsZWN0b3JzIiwidG9VaUF1dG9tYXRvclNlbGVjdG9yIiwiY3NzT2JqIiwicGFyc2UiLCJlIiwiZXJyb3JzIiwiSW52YWxpZFNlbGVjdG9yRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9saWIvY3NzLWNvbnZlcnRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDc3NTZWxlY3RvclBhcnNlciB9IGZyb20gJ2Nzcy1zZWxlY3Rvci1wYXJzZXInO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBwYXJzZXIgPSBuZXcgQ3NzU2VsZWN0b3JQYXJzZXIoKTtcbnBhcnNlci5yZWdpc3RlclNlbGVjdG9yUHNldWRvcygnaGFzJyk7XG5wYXJzZXIucmVnaXN0ZXJOZXN0aW5nT3BlcmF0b3JzKCc+JywgJysnLCAnficpO1xucGFyc2VyLnJlZ2lzdGVyQXR0ckVxdWFsaXR5TW9kcygnXicsICckJywgJyonLCAnficpO1xucGFyc2VyLmVuYWJsZVN1YnN0aXR1dGVzKCk7XG5cbmNvbnN0IFJFU09VUkNFX0lEID0gJ3Jlc291cmNlLWlkJztcbmNvbnN0IElEX0xPQ0FUT1JfUEFUVEVSTiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOS5fXSo6aWRcXC9bXFxTXSskLztcblxuY29uc3QgQk9PTEVBTl9BVFRSUyA9IFtcbiAgJ2NoZWNrYWJsZScsICdjaGVja2VkJywgJ2NsaWNrYWJsZScsICdlbmFibGVkJywgJ2ZvY3VzYWJsZScsXG4gICdmb2N1c2VkJywgJ2xvbmctY2xpY2thYmxlJywgJ3Njcm9sbGFibGUnLCAnc2VsZWN0ZWQnLFxuXTtcblxuY29uc3QgTlVNRVJJQ19BVFRSUyA9IFtcbiAgJ2luZGV4JywgJ2luc3RhbmNlJyxcbl07XG5cbmNvbnN0IFNUUl9BVFRSUyA9IFtcbiAgJ2Rlc2NyaXB0aW9uJywgUkVTT1VSQ0VfSUQsICd0ZXh0JywgJ2NsYXNzLW5hbWUnLCAncGFja2FnZS1uYW1lJ1xuXTtcblxuY29uc3QgQUxMX0FUVFJTID0gW1xuICAuLi5CT09MRUFOX0FUVFJTLFxuICAuLi5OVU1FUklDX0FUVFJTLFxuICAuLi5TVFJfQVRUUlMsXG5dO1xuXG5jb25zdCBBVFRSSUJVVEVfQUxJQVNFUyA9IFtcbiAgW1JFU09VUkNFX0lELCBbJ2lkJ11dLFxuICBbJ2Rlc2NyaXB0aW9uJywgW1xuICAgICdjb250ZW50LWRlc2NyaXB0aW9uJywgJ2NvbnRlbnQtZGVzYycsXG4gICAgJ2Rlc2MnLCAnYWNjZXNzaWJpbGl0eS1pZCcsXG4gIF1dLFxuICBbJ2luZGV4JywgWydudGgtY2hpbGQnXV0sXG5dO1xuXG4vKipcbiAqIENvbnZlcnQgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRvIHNuYWtlIGNhc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRyYW5zbGF0ZWQgdG8gc25ha2UgY2FzZVxuICovXG5mdW5jdGlvbiB0b1NuYWtlQ2FzZSAoc3RyKSB7XG4gIGlmICghc3RyKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IHRva2VucyA9IHN0ci5zcGxpdCgnLScpLm1hcCgoc3RyKSA9PiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSk7XG4gIGNvbnN0IG91dCA9IHRva2Vucy5qb2luKCcnKTtcbiAgcmV0dXJuIG91dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIG91dC5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NOYW1lVmFsdWVPYmplY3RcbiAqIEBwcm9wZXJ0eSB7P25hbWV9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIENTUyBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBDU1Mgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIGJvb2xlYW4gZnJvbSBhIENTUyBvYmplY3QuIElmIGVtcHR5LCByZXR1cm4gdHJ1ZS4gSWYgbm90IHRydWUvZmFsc2UvZW1wdHksIHRocm93IGV4Y2VwdGlvblxuICpcbiAqIEBwYXJhbSB7Q3NzTmFtZVZhbHVlT2JqZWN0fSBjc3MgQSBDU1Mgb2JqZWN0IHRoYXQgaGFzICduYW1lJyBhbmQgJ3ZhbHVlJ1xuICogQHJldHVybnMge3N0cmluZ30gRWl0aGVyICd0cnVlJyBvciAnZmFsc2UnLiBJZiB2YWx1ZSBpcyBlbXB0eSwgcmV0dXJuICd0cnVlJ1xuICovXG5mdW5jdGlvbiBhc3NlcnRHZXRCb29sIChjc3MpIHtcbiAgY29uc3QgdmFsID0gY3NzLnZhbHVlPy50b0xvd2VyQ2FzZSgpIHx8ICd0cnVlJzsgLy8gYW4gb21pdHRlZCBib29sZWFuIGF0dHJpYnV0ZSBtZWFucyAndHJ1ZScgKGUuZy46IGlucHV0W2NoZWNrZWRdIG1lYW5zIGNoZWNrZWQgaXMgdHJ1ZSlcbiAgaWYgKFsndHJ1ZScsICdmYWxzZSddLmluY2x1ZGVzKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzLm5hbWV9JyBtdXN0IGJlIHRydWUsIGZhbHNlIG9yIGVtcHR5LiBGb3VuZCAnJHtjc3MudmFsdWV9J2ApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY2Fub25pY2FsIGZvcm0gb2YgYSBDU1MgYXR0cmlidXRlIG5hbWVcbiAqXG4gKiBDb252ZXJ0cyB0byBsb3dlcmNhc2UgYW5kIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuXG4gKiB3aGF0IGl0IGlzIGFuIGFsaWFzIGZvclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjc3MgQ1NTIG9iamVjdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNhbm9uaWNhbCBhdHRyaWJ1dGUgbmFtZVxuICovXG5mdW5jdGlvbiBhc3NlcnRHZXRBdHRyTmFtZSAoY3NzKSB7XG4gIGNvbnN0IGF0dHJOYW1lID0gY3NzLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDaGVjayBpZiBpdCdzIHN1cHBvcnRlZCBhbmQgaWYgaXQgaXMsIHJldHVybiBpdFxuICBpZiAoQUxMX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgIHJldHVybiBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gSWYgYXR0ck5hbWUgaXMgYW4gYWxpYXMgZm9yIHNvbWV0aGluZyBlbHNlLCByZXR1cm4gdGhhdFxuICBmb3IgKGNvbnN0IFtvZmZpY2lhbEF0dHIsIGFsaWFzQXR0cnNdIG9mIEFUVFJJQlVURV9BTElBU0VTKSB7XG4gICAgaWYgKGFsaWFzQXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gb2ZmaWNpYWxBdHRyO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICBgU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlICcke0FMTF9BVFRSUy5qb2luKCcsICcpfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgYSByZWdleCB0aGF0IG1hdGNoZXMgYSB3aG9sZSB3b3JkLiBGb3IgdGhlIH49IENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgcmVnZXggXCJ3b3JkXCIgbWF0Y2hlclxuICovXG5mdW5jdGlvbiBnZXRXb3JkTWF0Y2hlclJlZ2V4ICh3b3JkKSB7XG4gIHJldHVybiBgXFxcXGIoXFxcXHcqJHtlc2NhcGVSZWdFeHAod29yZCl9XFxcXHcqKVxcXFxiYDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NBdHRyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUeXBlIG9mIGF0dHJpYnV0ZSAobXVzdCBiZSBzdHJpbmcgb3IgZW1wdHkpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIGJldHdlZW4gdmFsdWUgYW5kIHZhbHVlIHR5cGUgKD0sICo9LCAsIF49LCAkPSlcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1J1bGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbmVzdGluZ09wZXJhdG9yIFRoZSBuZXN0aW5nIG9wZXJhdG9yIChha2E6IGNvbWJpbmF0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHRhZ05hbWUgVGhlIHRhZyBuYW1lIChha2E6IHR5cGUgc2VsZWN0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL1R5cGVfc2VsZWN0b3JzKVxuICogQHByb3BlcnR5IHs/c3RyaW5nW119IGNsYXNzTmFtZXMgQW4gYXJyYXkgb2YgQ1NTIGNsYXNzIG5hbWVzXG4gKiBAcHJvcGVydHkgez9Dc3NBdHRyW119IGF0dHJzIEFuIGFycmF5IG9mIENTUyBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkgez9Dc3NQc2V1ZG9bXX0gYXR0cnMgQW4gYXJyYXkgb2YgQ1NTIHBzZXVkb3NcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWQgQ1NTIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P0Nzc1J1bGV9IHJ1bGUgQSBkZXNjZW5kYW50IG9mIHRoaXMgQ1NTIHJ1bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc09iamVjdFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB0eXBlIFR5cGUgb2YgQ1NTIG9iamVjdC4gJ3J1bGUnLCAncnVsZXNldCcgb3IgJ3NlbGVjdG9ycydcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1BzZXVkb1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgQ1NTIHBzZXVkbyBzZWxlY3RvciAoaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY3NzLXNlbGVjdG9yLXBhcnNlciBmb3IgcmVmZXJlbmNlKVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwc2V1ZG8gc2VsZWN0b3JcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBwc2V1ZG8gc2VsZWN0b3JcbiAqL1xuXG5jbGFzcyBDc3NDb252ZXJ0ZXIge1xuXG4gIGNvbnN0cnVjdG9yIChzZWxlY3RvciwgcGtnKSB7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHRoaXMucGtnID0gcGtnO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBgPHBrZ05hbWU+OmlkL2AgcHJlZml4IHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgaWYgaXQncyBub3QgdGhlcmUgYWxyZWFkeVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRvciBUaGUgaW5pdGlhbCBsb2NhdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyB3aXRoIGA8cGtnTmFtZT46aWQvYCBwcmVwZW5kZWQgKGlmIGl0IHdhc24ndCBhbHJlYWR5KVxuICAgKi9cbiAgZm9ybWF0SWRMb2NhdG9yIChsb2NhdG9yKSB7XG4gICAgcmV0dXJuIElEX0xPQ0FUT1JfUEFUVEVSTi50ZXN0KGxvY2F0b3IpXG4gICAgICA/IGxvY2F0b3JcbiAgICAgIDogYCR7dGhpcy5wa2cgfHwgJ2FuZHJvaWQnfTppZC8ke2xvY2F0b3J9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIGF0dHJpYnV0ZSBpbnRvIGEgVWlTZWxlY3RvciBtZXRob2QgY2FsbFxuICAgKlxuICAgKiBAcGFyYW0ge0Nzc0F0dHJ9IGNzc0F0dHIgQ1NTIGF0dHJpYnV0ZSBvYmplY3RcbiAgICogQHJldHVybnMge3N0cmluZ30gQ1NTIGF0dHJpYnV0ZSBwYXJzZWQgYXMgVWlTZWxlY3RvclxuICAgKi9cbiAgcGFyc2VBdHRyIChjc3NBdHRyKSB7XG4gICAgaWYgKGNzc0F0dHIudmFsdWVUeXBlICYmIGNzc0F0dHIudmFsdWVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NBdHRyLm5hbWV9PSR7Y3NzQXR0ci52YWx1ZX0nIGlzIGFuIGludmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICAgICAgYE9ubHkgJ3N0cmluZycgYW5kIGVtcHR5IGF0dHJpYnV0ZSB0eXBlcyBhcmUgc3VwcG9ydGVkLiBGb3VuZCAnJHtjc3NBdHRyLnZhbHVlVHlwZX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJOYW1lID0gYXNzZXJ0R2V0QXR0ck5hbWUoY3NzQXR0cik7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHRvU25ha2VDYXNlKGF0dHJOYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgaXQncyBhIHN1cHBvcnRlZCBhdHRyaWJ1dGVcbiAgICBpZiAoIVNUUl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIUJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IHN1cHBvcnRlZC4gU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlIGAgK1xuICAgICAgICBgJyR7Wy4uLlNUUl9BVFRSUywgLi4uQk9PTEVBTl9BVFRSU10uam9pbignLCAnKX0nYCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgYm9vbGVhbiwgaWYgaXQncyBhIGJvb2xlYW4gYXR0cmlidXRlXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KCR7YXNzZXJ0R2V0Qm9vbChjc3NBdHRyKX0pYDtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcGFyc2UgYXMgc3RyaW5nXG4gICAgbGV0IHZhbHVlID0gY3NzQXR0ci52YWx1ZSB8fCAnJztcbiAgICBpZiAoYXR0ck5hbWUgPT09IFJFU09VUkNFX0lEKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0SWRMb2NhdG9yKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJcIilgO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY3NzQXR0ci5vcGVyYXRvcikge1xuICAgICAgY2FzZSAnPSc6XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX0oXCIke3ZhbHVlfVwiKWA7XG4gICAgICBjYXNlICcqPSc6XG4gICAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9Q29udGFpbnMoXCIke3ZhbHVlfVwiKWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICAgIGNhc2UgJ149JzpcbiAgICAgICAgaWYgKFsnZGVzY3JpcHRpb24nLCAndGV4dCddLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1TdGFydHNXaXRoKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiXiR7ZXNjYXBlUmVnRXhwKHZhbHVlKX1cIilgO1xuICAgICAgY2FzZSAnJD0nOlxuICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9TWF0Y2hlcyhcIiR7ZXNjYXBlUmVnRXhwKHZhbHVlKX0kXCIpYDtcbiAgICAgIGNhc2UgJ349JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2dldFdvcmRNYXRjaGVyUmVnZXgodmFsdWUpfVwiKWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBVbnJlYWNoYWJsZSwgYnV0IGFkZGluZyBlcnJvciBpbiBjYXNlIGEgbmV3IENTUyBhdHRyaWJ1dGUgaXMgYWRkZWQuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIGF0dHJpYnV0ZSBvcGVyYXRvciAnJHtjc3NBdHRyLm9wZXJhdG9yfScuIGAgK1xuICAgICAgICAgIGAgJz0nLCAnKj0nLCAnXj0nLCAnJD0nIGFuZCAnfj0nIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgcHNldWRvIGNsYXNzIHRvIGEgVWlTZWxlY3RvclxuICAgKlxuICAgKiBAcGFyYW0ge0Nzc1BzZXVkb30gY3NzUHNldWRvIENTUyBQc2V1ZG8gY2xhc3NcbiAgICogQHJldHVybnMge3N0cmluZ30gUHNldWRvIHNlbGVjdG9yIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gICAqL1xuICBwYXJzZVBzZXVkbyAoY3NzUHNldWRvKSB7XG4gICAgaWYgKGNzc1BzZXVkby52YWx1ZVR5cGUgJiYgY3NzUHNldWRvLnZhbHVlVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUHNldWRvLm5hbWV9PSR7Y3NzUHNldWRvLnZhbHVlfScuIGAgK1xuICAgICAgICBgVW5zdXBwb3J0ZWQgY3NzIHBzZXVkbyBjbGFzcyB2YWx1ZSB0eXBlOiAnJHtjc3NQc2V1ZG8udmFsdWVUeXBlfScuIE9ubHkgJ3N0cmluZycgdHlwZSBvciBlbXB0eSBpcyBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHNldWRvTmFtZSA9IGFzc2VydEdldEF0dHJOYW1lKGNzc1BzZXVkbyk7XG5cbiAgICBpZiAoQk9PTEVBTl9BVFRSUy5pbmNsdWRlcyhwc2V1ZG9OYW1lKSkge1xuICAgICAgcmV0dXJuIGAuJHt0b1NuYWtlQ2FzZShwc2V1ZG9OYW1lKX0oJHthc3NlcnRHZXRCb29sKGNzc1BzZXVkbyl9KWA7XG4gICAgfVxuXG4gICAgaWYgKE5VTUVSSUNfQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICAgIHJldHVybiBgLiR7cHNldWRvTmFtZX0oJHtjc3NQc2V1ZG8udmFsdWV9KWA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgcnVsZSB0byBhIFVpU2VsZWN0b3JcbiAgICogQHBhcmFtIHtDc3NSdWxlfSBjc3NSdWxlIENTUyBydWxlIGRlZmluaXRpb25cbiAgICovXG4gIHBhcnNlQ3NzUnVsZSAoY3NzUnVsZSkge1xuICAgIGNvbnN0IHsgbmVzdGluZ09wZXJhdG9yIH0gPSBjc3NSdWxlO1xuICAgIGlmIChuZXN0aW5nT3BlcmF0b3IgJiYgbmVzdGluZ09wZXJhdG9yICE9PSAnICcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmVzdGluZ09wZXJhdG9yfScgaXMgbm90IGEgc3VwcG9ydGVkIGNvbWJpbmF0b3IuIGAgK1xuICAgICAgICBgT25seSBjaGlsZCBjb21iaW5hdG9yICg+KSBhbmQgZGVzY2VuZGFudCBjb21iaW5hdG9yIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgbGV0IHVpQXV0b21hdG9yU2VsZWN0b3IgPSAnbmV3IFVpU2VsZWN0b3IoKSc7XG4gICAgaWYgKGNzc1J1bGUudGFnTmFtZSAmJiBjc3NSdWxlLnRhZ05hbWUgIT09ICcqJykge1xuICAgICAgbGV0IGFuZHJvaWRDbGFzcyA9IFtjc3NSdWxlLnRhZ05hbWVdO1xuICAgICAgaWYgKGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICBmb3IgKGNvbnN0IGNzc0NsYXNzTmFtZXMgb2YgY3NzUnVsZS5jbGFzc05hbWVzKSB7XG4gICAgICAgICAgYW5kcm9pZENsYXNzLnB1c2goY3NzQ2xhc3NOYW1lcyk7XG4gICAgICAgIH1cbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZShcIiR7YW5kcm9pZENsYXNzLmpvaW4oJy4nKX1cIilgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZU1hdGNoZXMoXCIke2Nzc1J1bGUudGFnTmFtZX1cIilgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY3NzUnVsZS5jbGFzc05hbWVzKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2xhc3NOYW1lTWF0Y2hlcyhcIiR7Y3NzUnVsZS5jbGFzc05hbWVzLmpvaW4oJ1xcXFwuJyl9XCIpYDtcbiAgICB9XG4gICAgaWYgKGNzc1J1bGUuaWQpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5yZXNvdXJjZUlkKFwiJHt0aGlzLmZvcm1hdElkTG9jYXRvcihjc3NSdWxlLmlkKX1cIilgO1xuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5hdHRycykge1xuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGNzc1J1bGUuYXR0cnMpIHtcbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSB0aGlzLnBhcnNlQXR0cihhdHRyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNzc1J1bGUucHNldWRvcykge1xuICAgICAgZm9yIChjb25zdCBwc2V1ZG8gb2YgY3NzUnVsZS5wc2V1ZG9zKSB7XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gdGhpcy5wYXJzZVBzZXVkbyhwc2V1ZG8pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5ydWxlKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2hpbGRTZWxlY3Rvcigke3RoaXMucGFyc2VDc3NSdWxlKGNzc1J1bGUucnVsZSl9KWA7XG4gICAgfVxuICAgIHJldHVybiB1aUF1dG9tYXRvclNlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgQ1NTIG9iamVjdCB0byBVaUF1dG9tYXRvcjIgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtDc3NPYmplY3R9IGNzcyBDU1Mgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgb2JqZWN0IHBhcnNlZCBhcyBhIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQ3NzT2JqZWN0IChjc3MpIHtcbiAgICBzd2l0Y2ggKGNzcy50eXBlKSB7XG4gICAgICBjYXNlICdydWxlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NSdWxlKGNzcyk7XG4gICAgICBjYXNlICdydWxlU2V0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NPYmplY3QoY3NzLnJ1bGUpO1xuICAgICAgY2FzZSAnc2VsZWN0b3JzJzpcbiAgICAgICAgcmV0dXJuIGNzcy5zZWxlY3RvcnMubWFwKChzZWxlY3RvcikgPT4gdGhpcy5wYXJzZUNzc09iamVjdChzZWxlY3RvcikpLmpvaW4oJzsgJyk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFRoaXMgaXMgbmV2ZXIgcmVhY2hhYmxlLCBidXQgaWYgaXQgZXZlciBpcyBkbyB0aGlzLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVpQXV0b21hdG9yIGRvZXMgbm90IHN1cHBvcnQgJyR7Y3NzLnR5cGV9JyBjc3MuIE9ubHkgc3VwcG9ydHMgJ3J1bGUnLCAncnVsZVNldCcsICdzZWxlY3RvcnMnIGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHNlbGVjdG9yIHRvIGEgVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgc2VsZWN0b3IgY29udmVydGVkIHRvIGEgVWlTZWxlY3RvclxuICAgKi9cbiAgdG9VaUF1dG9tYXRvclNlbGVjdG9yICgpIHtcbiAgICBsZXQgY3NzT2JqO1xuICAgIHRyeSB7XG4gICAgICBjc3NPYmogPSBwYXJzZXIucGFyc2UodGhpcy5zZWxlY3Rvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkU2VsZWN0b3JFcnJvcihgSW52YWxpZCBDU1Mgc2VsZWN0b3IgJyR7dGhpcy5zZWxlY3Rvcn0nLiBSZWFzb246ICcke2V9J2ApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NPYmplY3QoY3NzT2JqKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRTZWxlY3RvckVycm9yKGBVbnN1cHBvcnRlZCBDU1Mgc2VsZWN0b3IgJyR7dGhpcy5zZWxlY3Rvcn0nLiBSZWFzb246ICcke2V9J2ApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDc3NDb252ZXJ0ZXI7Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUEsTUFBTUEsTUFBTSxHQUFHLElBQUlDLG9DQUFpQixFQUFFO0FBQ3RDRCxNQUFNLENBQUNFLHVCQUF1QixDQUFDLEtBQUssQ0FBQztBQUNyQ0YsTUFBTSxDQUFDRyx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUM5Q0gsTUFBTSxDQUFDSSx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDbkRKLE1BQU0sQ0FBQ0ssaUJBQWlCLEVBQUU7QUFFMUIsTUFBTUMsV0FBVyxHQUFHLGFBQWE7QUFDakMsTUFBTUMsa0JBQWtCLEdBQUcscUNBQXFDO0FBRWhFLE1BQU1DLGFBQWEsR0FBRyxDQUNwQixXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUMzRCxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FDdEQ7QUFFRCxNQUFNQyxhQUFhLEdBQUcsQ0FDcEIsT0FBTyxFQUFFLFVBQVUsQ0FDcEI7QUFFRCxNQUFNQyxTQUFTLEdBQUcsQ0FDaEIsYUFBYSxFQUFFSixXQUFXLEVB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
|
|
@@ -1 +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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"}
|
|
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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"}
|