appium 2.0.0-beta.3 → 2.0.0-beta.34
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 +10 -11
- package/build/lib/appium.d.ts +215 -0
- package/build/lib/appium.d.ts.map +1 -0
- package/build/lib/appium.js +241 -132
- package/build/lib/cli/args.d.ts +20 -0
- package/build/lib/cli/args.d.ts.map +1 -0
- package/build/lib/cli/args.js +96 -282
- package/build/lib/cli/driver-command.d.ts +36 -0
- package/build/lib/cli/driver-command.d.ts.map +1 -0
- package/build/lib/cli/driver-command.js +19 -12
- package/build/lib/cli/extension-command.d.ts +345 -0
- package/build/lib/cli/extension-command.d.ts.map +1 -0
- package/build/lib/cli/extension-command.js +171 -96
- package/build/lib/cli/extension.d.ts +14 -0
- package/build/lib/cli/extension.d.ts.map +1 -0
- package/build/lib/cli/extension.js +31 -16
- package/build/lib/cli/parser.d.ts +80 -0
- package/build/lib/cli/parser.d.ts.map +1 -0
- package/build/lib/cli/parser.js +152 -95
- package/build/lib/cli/plugin-command.d.ts +39 -0
- package/build/lib/cli/plugin-command.d.ts.map +1 -0
- package/build/lib/cli/plugin-command.js +18 -13
- package/build/lib/cli/utils.d.ts +29 -0
- package/build/lib/cli/utils.d.ts.map +1 -0
- package/build/lib/cli/utils.js +27 -3
- package/build/lib/config-file.d.ts +100 -0
- package/build/lib/config-file.d.ts.map +1 -0
- package/build/lib/config-file.js +136 -0
- package/build/lib/config.d.ts +41 -0
- package/build/lib/config.d.ts.map +1 -0
- package/build/lib/config.js +92 -67
- package/build/lib/constants.d.ts +48 -0
- package/build/lib/constants.d.ts.map +1 -0
- package/build/lib/constants.js +60 -0
- package/build/lib/extension/driver-config.d.ts +84 -0
- package/build/lib/extension/driver-config.d.ts.map +1 -0
- package/build/lib/extension/driver-config.js +190 -0
- package/build/lib/extension/extension-config.d.ts +170 -0
- package/build/lib/extension/extension-config.d.ts.map +1 -0
- package/build/lib/extension/extension-config.js +297 -0
- package/build/lib/extension/index.d.ts +39 -0
- package/build/lib/extension/index.d.ts.map +1 -0
- package/build/lib/extension/index.js +77 -0
- package/build/lib/extension/manifest.d.ts +174 -0
- package/build/lib/extension/manifest.d.ts.map +1 -0
- package/build/lib/extension/manifest.js +246 -0
- package/build/lib/extension/package-changed.d.ts +11 -0
- package/build/lib/extension/package-changed.d.ts.map +1 -0
- package/build/lib/extension/package-changed.js +68 -0
- package/build/lib/extension/plugin-config.d.ts +62 -0
- package/build/lib/extension/plugin-config.d.ts.map +1 -0
- package/build/lib/extension/plugin-config.js +87 -0
- package/build/lib/grid-register.d.ts +10 -0
- package/build/lib/grid-register.d.ts.map +1 -0
- package/build/lib/grid-register.js +21 -25
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +4 -6
- package/build/lib/logsink.d.ts +4 -0
- package/build/lib/logsink.d.ts.map +1 -0
- package/build/lib/logsink.js +12 -16
- package/build/lib/main.d.ts +54 -0
- package/build/lib/main.d.ts.map +1 -0
- package/build/lib/main.js +189 -90
- package/build/lib/schema/arg-spec.d.ts +143 -0
- package/build/lib/schema/arg-spec.d.ts.map +1 -0
- package/build/lib/schema/arg-spec.js +119 -0
- package/build/lib/schema/cli-args.d.ts +19 -0
- package/build/lib/schema/cli-args.d.ts.map +1 -0
- package/build/lib/schema/cli-args.js +180 -0
- package/build/lib/schema/cli-transformers.d.ts +5 -0
- package/build/lib/schema/cli-transformers.d.ts.map +1 -0
- package/build/lib/schema/cli-transformers.js +74 -0
- package/build/lib/schema/index.d.ts +3 -0
- package/build/lib/schema/index.d.ts.map +1 -0
- package/build/lib/schema/index.js +34 -0
- package/build/lib/schema/keywords.d.ts +24 -0
- package/build/lib/schema/keywords.d.ts.map +1 -0
- package/build/lib/schema/keywords.js +70 -0
- package/build/lib/schema/schema.d.ts +259 -0
- package/build/lib/schema/schema.d.ts.map +1 -0
- package/build/lib/schema/schema.js +452 -0
- package/build/lib/utils.d.ts +66 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +35 -139
- package/build/tsconfig.tsbuildinfo +1 -0
- package/build/types/appium-manifest.d.ts +40 -0
- package/build/types/appium-manifest.d.ts.map +1 -0
- package/build/types/cli.d.ts +112 -0
- package/build/types/cli.d.ts.map +1 -0
- package/build/types/extension.d.ts +43 -0
- package/build/types/extension.d.ts.map +1 -0
- package/build/types/external-manifest.d.ts +47 -0
- package/build/types/external-manifest.d.ts.map +1 -0
- package/build/types/index.d.ts +15 -0
- package/build/types/index.d.ts.map +1 -0
- package/index.js +11 -0
- package/lib/appium-config.schema.json +278 -0
- package/lib/appium.js +402 -155
- package/lib/cli/args.js +174 -377
- package/lib/cli/driver-command.js +22 -7
- package/lib/cli/extension-command.js +372 -177
- package/lib/cli/extension.js +32 -10
- package/lib/cli/parser.js +253 -83
- package/lib/cli/plugin-command.js +19 -6
- package/lib/cli/utils.js +22 -2
- package/lib/config-file.js +223 -0
- package/lib/config.js +170 -69
- package/lib/constants.js +78 -0
- package/lib/extension/driver-config.js +249 -0
- package/lib/extension/extension-config.js +458 -0
- package/lib/extension/index.js +102 -0
- package/lib/extension/manifest.js +484 -0
- package/lib/extension/package-changed.js +63 -0
- package/lib/extension/plugin-config.js +113 -0
- package/lib/grid-register.js +25 -22
- package/lib/logger.js +1 -1
- package/lib/logsink.js +14 -7
- package/lib/main.js +255 -90
- package/lib/schema/arg-spec.js +232 -0
- package/lib/schema/cli-args.js +261 -0
- package/lib/schema/cli-transformers.js +122 -0
- package/lib/schema/index.js +2 -0
- package/lib/schema/keywords.js +134 -0
- package/lib/schema/schema.js +734 -0
- package/lib/utils.js +85 -129
- package/package.json +68 -85
- package/scripts/postinstall.js +71 -0
- package/types/appium-manifest.ts +61 -0
- package/types/cli.ts +153 -0
- package/types/extension.ts +56 -0
- package/types/external-manifest.ts +58 -0
- package/types/index.ts +14 -0
- package/CHANGELOG.md +0 -3515
- package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
- package/build/lib/cli/npm.js +0 -206
- package/build/lib/cli/parser-helpers.js +0 -82
- package/build/lib/driver-config.js +0 -77
- package/build/lib/drivers.js +0 -96
- package/build/lib/extension-config.js +0 -251
- package/build/lib/plugin-config.js +0 -59
- package/build/lib/plugins.js +0 -14
- package/lib/cli/npm.js +0 -183
- package/lib/cli/parser-helpers.js +0 -79
- package/lib/driver-config.js +0 -46
- package/lib/drivers.js +0 -81
- package/lib/extension-config.js +0 -208
- package/lib/plugin-config.js +0 -34
- package/lib/plugins.js +0 -10
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.validate = exports.resetSchema = exports.registerSchema = exports.isFinalized = exports.isAllowedSchemaFileExtension = exports.hasArgSpec = exports.getSchema = exports.getDefaultsForSchema = exports.getDefaultsForExtension = exports.getArgSpec = exports.getAllArgSpecs = exports.flattenSchema = exports.finalizeSchema = exports.SchemaUnsupportedSchemaError = exports.SchemaUnknownSchemaError = exports.SchemaNameConflictError = exports.SchemaFinalizationError = exports.RoachHotelMap = exports.ALLOWED_SCHEMA_EXTENSIONS = void 0;
|
|
9
|
+
|
|
10
|
+
require("source-map-support/register");
|
|
11
|
+
|
|
12
|
+
var _ajv = _interopRequireDefault(require("ajv"));
|
|
13
|
+
|
|
14
|
+
var _ajvFormats = _interopRequireDefault(require("ajv-formats"));
|
|
15
|
+
|
|
16
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
17
|
+
|
|
18
|
+
var _path = _interopRequireDefault(require("path"));
|
|
19
|
+
|
|
20
|
+
var _constants = require("../constants");
|
|
21
|
+
|
|
22
|
+
var _schema = require("@appium/schema");
|
|
23
|
+
|
|
24
|
+
var _argSpec = require("./arg-spec");
|
|
25
|
+
|
|
26
|
+
var _keywords = require("./keywords");
|
|
27
|
+
|
|
28
|
+
class RoachHotelMap extends Map {
|
|
29
|
+
set(key, value) {
|
|
30
|
+
if (this.has(key)) {
|
|
31
|
+
throw new Error(`${key} is already set`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return super.set(key, value);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
delete(key) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
clear() {
|
|
42
|
+
throw new Error(`Cannot clear RoachHotelMap`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
exports.RoachHotelMap = RoachHotelMap;
|
|
48
|
+
const ALLOWED_SCHEMA_EXTENSIONS = new Set(['.json', '.js', '.cjs']);
|
|
49
|
+
exports.ALLOWED_SCHEMA_EXTENSIONS = ALLOWED_SCHEMA_EXTENSIONS;
|
|
50
|
+
|
|
51
|
+
class AppiumSchema {
|
|
52
|
+
_argSpecs = new RoachHotelMap();
|
|
53
|
+
_registeredSchemas = {
|
|
54
|
+
[_constants.DRIVER_TYPE]: new Map(),
|
|
55
|
+
[_constants.PLUGIN_TYPE]: new Map()
|
|
56
|
+
};
|
|
57
|
+
_ajv;
|
|
58
|
+
static _instance;
|
|
59
|
+
_finalizedSchemas = null;
|
|
60
|
+
|
|
61
|
+
constructor() {
|
|
62
|
+
this._ajv = AppiumSchema._instantiateAjv();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
static create() {
|
|
66
|
+
if (!AppiumSchema._instance) {
|
|
67
|
+
const instance = new AppiumSchema();
|
|
68
|
+
AppiumSchema._instance = instance;
|
|
69
|
+
|
|
70
|
+
_lodash.default.bindAll(instance, ['finalize', 'flatten', 'getAllArgSpecs', 'getArgSpec', 'getDefaults', 'getDefaultsForExtension', 'getSchema', 'hasArgSpec', 'isFinalized', 'registerSchema', 'hasRegisteredSchema', 'reset', 'validate']);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return AppiumSchema._instance;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
hasRegisteredSchema(extType, extName) {
|
|
77
|
+
return this._registeredSchemas[extType].has(extName);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
isFinalized() {
|
|
81
|
+
return Boolean(this._finalizedSchemas);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
getAllArgSpecs() {
|
|
85
|
+
return this._argSpecs;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
finalize() {
|
|
89
|
+
if (this.isFinalized()) {
|
|
90
|
+
return this._finalizedSchemas;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const ajv = this._ajv;
|
|
94
|
+
|
|
95
|
+
const baseSchema = _lodash.default.cloneDeep(_schema.AppiumConfigJsonSchema);
|
|
96
|
+
|
|
97
|
+
const addArgSpecs = (schema, extType, extName) => {
|
|
98
|
+
for (let [propName, propSchema] of Object.entries(schema)) {
|
|
99
|
+
const argSpec = _argSpec.ArgSpec.create(propName, {
|
|
100
|
+
dest: propSchema.appiumCliDest,
|
|
101
|
+
defaultValue: propSchema.default,
|
|
102
|
+
extType,
|
|
103
|
+
extName
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const {
|
|
107
|
+
arg
|
|
108
|
+
} = argSpec;
|
|
109
|
+
|
|
110
|
+
this._argSpecs.set(arg, argSpec);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
addArgSpecs(_lodash.default.omit(baseSchema.properties.server.properties, [_constants.DRIVER_TYPE, _constants.PLUGIN_TYPE]));
|
|
115
|
+
const finalizedSchemas = {};
|
|
116
|
+
|
|
117
|
+
const finalSchema = _lodash.default.reduce(this._registeredSchemas, (baseSchema, extensionSchemas, extType) => {
|
|
118
|
+
extensionSchemas.forEach((schema, extName) => {
|
|
119
|
+
const $ref = _argSpec.ArgSpec.toSchemaBaseRef(extType, extName);
|
|
120
|
+
|
|
121
|
+
schema.$id = $ref;
|
|
122
|
+
schema.additionalProperties = false;
|
|
123
|
+
baseSchema.properties.server.properties[extType].properties[extName] = {
|
|
124
|
+
$ref,
|
|
125
|
+
$comment: extName
|
|
126
|
+
};
|
|
127
|
+
ajv.validateSchema(schema, true);
|
|
128
|
+
addArgSpecs(schema.properties, extType, extName);
|
|
129
|
+
ajv.addSchema(schema, $ref);
|
|
130
|
+
finalizedSchemas[$ref] = schema;
|
|
131
|
+
});
|
|
132
|
+
return baseSchema;
|
|
133
|
+
}, baseSchema);
|
|
134
|
+
|
|
135
|
+
ajv.addSchema(finalSchema, _argSpec.APPIUM_CONFIG_SCHEMA_ID);
|
|
136
|
+
finalizedSchemas[_argSpec.APPIUM_CONFIG_SCHEMA_ID] = finalSchema;
|
|
137
|
+
ajv.validateSchema(finalSchema, true);
|
|
138
|
+
this._finalizedSchemas = finalizedSchemas;
|
|
139
|
+
return Object.freeze(finalizedSchemas);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
static _instantiateAjv() {
|
|
143
|
+
const ajv = (0, _ajvFormats.default)(new _ajv.default({
|
|
144
|
+
allErrors: true
|
|
145
|
+
}));
|
|
146
|
+
|
|
147
|
+
_lodash.default.forEach(_keywords.keywords, keyword => {
|
|
148
|
+
ajv.addKeyword(keyword);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
return ajv;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
reset() {
|
|
155
|
+
for (const schemaId of Object.keys((_this$_finalizedSchem = this._finalizedSchemas) !== null && _this$_finalizedSchem !== void 0 ? _this$_finalizedSchem : {})) {
|
|
156
|
+
var _this$_finalizedSchem;
|
|
157
|
+
|
|
158
|
+
this._ajv.removeSchema(schemaId);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
this._argSpecs = new RoachHotelMap();
|
|
162
|
+
this._registeredSchemas = {
|
|
163
|
+
[_constants.DRIVER_TYPE]: new Map(),
|
|
164
|
+
[_constants.PLUGIN_TYPE]: new Map()
|
|
165
|
+
};
|
|
166
|
+
this._finalizedSchemas = null;
|
|
167
|
+
this._ajv = AppiumSchema._instantiateAjv();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
registerSchema(extType, extName, schema) {
|
|
171
|
+
if (!(extType && extName) || _lodash.default.isUndefined(schema)) {
|
|
172
|
+
throw new TypeError('Expected extension type, extension name, and a defined schema');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (!AppiumSchema.isSupportedSchemaType(schema)) {
|
|
176
|
+
throw new SchemaUnsupportedSchemaError(schema, extType, extName);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const normalizedExtName = _lodash.default.kebabCase(extName);
|
|
180
|
+
|
|
181
|
+
if (this.hasRegisteredSchema(extType, normalizedExtName)) {
|
|
182
|
+
if (this._registeredSchemas[extType].get(normalizedExtName) === schema) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
throw new SchemaNameConflictError(extType, extName);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
this._ajv.validateSchema(schema, true);
|
|
190
|
+
|
|
191
|
+
this._registeredSchemas[extType].set(normalizedExtName, schema);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
getArgSpec(name, extType, extName) {
|
|
195
|
+
return this._argSpecs.get(_argSpec.ArgSpec.toArg(name, extType, extName));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
hasArgSpec(name, extType, extName) {
|
|
199
|
+
return this._argSpecs.has(_argSpec.ArgSpec.toArg(name, extType, extName));
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
getDefaults(flatten = true) {
|
|
203
|
+
if (!this.isFinalized()) {
|
|
204
|
+
throw new SchemaFinalizationError();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const reducer = flatten ? (defaults, {
|
|
208
|
+
defaultValue,
|
|
209
|
+
dest
|
|
210
|
+
}) => {
|
|
211
|
+
if (!_lodash.default.isUndefined(defaultValue)) {
|
|
212
|
+
defaults[dest] = defaultValue;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return defaults;
|
|
216
|
+
} : (defaults, {
|
|
217
|
+
defaultValue,
|
|
218
|
+
dest
|
|
219
|
+
}) => {
|
|
220
|
+
if (!_lodash.default.isUndefined(defaultValue)) {
|
|
221
|
+
_lodash.default.set(defaults, dest, defaultValue);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return defaults;
|
|
225
|
+
};
|
|
226
|
+
const retval = {};
|
|
227
|
+
return [...this._argSpecs.values()].reduce(reducer, retval);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
getDefaultsForExtension(extType, extName) {
|
|
231
|
+
if (!this.isFinalized()) {
|
|
232
|
+
throw new SchemaFinalizationError();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const specs = [...this._argSpecs.values()].filter(spec => spec.extType === extType && spec.extName === extName);
|
|
236
|
+
return specs.reduce((defaults, {
|
|
237
|
+
defaultValue,
|
|
238
|
+
rawDest
|
|
239
|
+
}) => {
|
|
240
|
+
if (!_lodash.default.isUndefined(defaultValue)) {
|
|
241
|
+
defaults[rawDest] = defaultValue;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return defaults;
|
|
245
|
+
}, {});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
flatten() {
|
|
249
|
+
const schema = this.getSchema();
|
|
250
|
+
const stack = [{
|
|
251
|
+
properties: schema.properties,
|
|
252
|
+
prefix: []
|
|
253
|
+
}];
|
|
254
|
+
const flattened = [];
|
|
255
|
+
|
|
256
|
+
for (const {
|
|
257
|
+
properties,
|
|
258
|
+
prefix
|
|
259
|
+
} of stack) {
|
|
260
|
+
const pairs = _lodash.default.toPairs(properties);
|
|
261
|
+
|
|
262
|
+
for (const [key, value] of pairs) {
|
|
263
|
+
const {
|
|
264
|
+
properties,
|
|
265
|
+
$ref
|
|
266
|
+
} = value;
|
|
267
|
+
|
|
268
|
+
if (properties) {
|
|
269
|
+
stack.push({
|
|
270
|
+
properties,
|
|
271
|
+
prefix: key === _argSpec.SERVER_PROP_NAME ? [] : [...prefix, key]
|
|
272
|
+
});
|
|
273
|
+
} else if ($ref) {
|
|
274
|
+
let refSchema;
|
|
275
|
+
|
|
276
|
+
try {
|
|
277
|
+
refSchema = this.getSchema($ref);
|
|
278
|
+
} catch (err) {
|
|
279
|
+
throw new SchemaUnknownSchemaError($ref);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const {
|
|
283
|
+
normalizedExtName
|
|
284
|
+
} = _argSpec.ArgSpec.extensionInfoFromRootSchemaId($ref);
|
|
285
|
+
|
|
286
|
+
if (!normalizedExtName) {
|
|
287
|
+
throw new ReferenceError(`Could not determine extension name from schema ID ${$ref}. This is a bug.`);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
stack.push({
|
|
291
|
+
properties: refSchema.properties,
|
|
292
|
+
prefix: [...prefix, key, normalizedExtName]
|
|
293
|
+
});
|
|
294
|
+
} else if (key !== _constants.DRIVER_TYPE && key !== _constants.PLUGIN_TYPE) {
|
|
295
|
+
const [extType, extName] = prefix;
|
|
296
|
+
const argSpec = this.getArgSpec(key, extType, extName);
|
|
297
|
+
|
|
298
|
+
if (!argSpec) {
|
|
299
|
+
throw new ReferenceError(`Unknown argument with key ${key}, extType ${extType} and extName ${extName}. This is a bug.`);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
flattened.push({
|
|
303
|
+
schema: _lodash.default.cloneDeep(value),
|
|
304
|
+
argSpec
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return flattened;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
getSchema(ref = _argSpec.APPIUM_CONFIG_SCHEMA_ID) {
|
|
314
|
+
return this._getValidator(ref).schema;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
_getValidator(id = _argSpec.APPIUM_CONFIG_SCHEMA_ID) {
|
|
318
|
+
const validator = this._ajv.getSchema(id);
|
|
319
|
+
|
|
320
|
+
if (!validator) {
|
|
321
|
+
if (id === _argSpec.APPIUM_CONFIG_SCHEMA_ID) {
|
|
322
|
+
throw new SchemaFinalizationError();
|
|
323
|
+
} else {
|
|
324
|
+
throw new SchemaUnknownSchemaError(id);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return validator;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
validate(value, ref = _argSpec.APPIUM_CONFIG_SCHEMA_ID) {
|
|
332
|
+
const validator = this._getValidator(ref);
|
|
333
|
+
|
|
334
|
+
return !validator(value) && _lodash.default.isArray(validator.errors) ? [...validator.errors] : [];
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
static isAllowedSchemaFileExtension(filename) {
|
|
338
|
+
return ALLOWED_SCHEMA_EXTENSIONS.has(_path.default.extname(filename));
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
static isSupportedSchemaType(schema) {
|
|
342
|
+
return _lodash.default.isPlainObject(schema) && schema.$async !== true;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
class SchemaFinalizationError extends Error {
|
|
348
|
+
code = 'APPIUMERR_SCHEMA_FINALIZATION';
|
|
349
|
+
|
|
350
|
+
constructor() {
|
|
351
|
+
super('Schema not yet finalized; `finalize()` must be called first.');
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
exports.SchemaFinalizationError = SchemaFinalizationError;
|
|
357
|
+
|
|
358
|
+
class SchemaNameConflictError extends Error {
|
|
359
|
+
code = 'APPIUMERR_SCHEMA_NAME_CONFLICT';
|
|
360
|
+
data;
|
|
361
|
+
|
|
362
|
+
constructor(extType, extName) {
|
|
363
|
+
super(`Name for ${extType} schema "${extName}" conflicts with an existing schema`);
|
|
364
|
+
this.data = {
|
|
365
|
+
extType,
|
|
366
|
+
extName
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
exports.SchemaNameConflictError = SchemaNameConflictError;
|
|
373
|
+
|
|
374
|
+
class SchemaUnknownSchemaError extends ReferenceError {
|
|
375
|
+
code = 'APPIUMERR_SCHEMA_UNKNOWN_SCHEMA';
|
|
376
|
+
data;
|
|
377
|
+
|
|
378
|
+
constructor(schemaId) {
|
|
379
|
+
super(`Unknown schema: "${schemaId}"`);
|
|
380
|
+
this.data = {
|
|
381
|
+
schemaId
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
exports.SchemaUnknownSchemaError = SchemaUnknownSchemaError;
|
|
388
|
+
|
|
389
|
+
class SchemaUnsupportedSchemaError extends TypeError {
|
|
390
|
+
code = 'APPIUMERR_SCHEMA_UNSUPPORTED_SCHEMA';
|
|
391
|
+
data;
|
|
392
|
+
|
|
393
|
+
constructor(schema, extType, extName) {
|
|
394
|
+
super((() => {
|
|
395
|
+
let msg = `Unsupported schema from ${extType} "${extName}":`;
|
|
396
|
+
|
|
397
|
+
if (_lodash.default.isBoolean(schema)) {
|
|
398
|
+
return `${msg} schema cannot be a boolean`;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
if (_lodash.default.isPlainObject(schema)) {
|
|
402
|
+
if (schema.$async) {
|
|
403
|
+
return `${msg} schema cannot be an async schema`;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
throw new TypeError(`schema IS supported; this error should not be thrown (this is a bug). value of schema: ${JSON.stringify(schema)}`);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
return `${msg} schema must be a plain object without a true "$async" property`;
|
|
410
|
+
})());
|
|
411
|
+
this.data = {
|
|
412
|
+
schema,
|
|
413
|
+
extType,
|
|
414
|
+
extName
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
exports.SchemaUnsupportedSchemaError = SchemaUnsupportedSchemaError;
|
|
421
|
+
const appiumSchema = AppiumSchema.create();
|
|
422
|
+
const {
|
|
423
|
+
registerSchema,
|
|
424
|
+
getAllArgSpecs,
|
|
425
|
+
getArgSpec,
|
|
426
|
+
hasArgSpec,
|
|
427
|
+
isFinalized,
|
|
428
|
+
finalize: finalizeSchema,
|
|
429
|
+
reset: resetSchema,
|
|
430
|
+
validate,
|
|
431
|
+
getSchema,
|
|
432
|
+
flatten: flattenSchema,
|
|
433
|
+
getDefaults: getDefaultsForSchema,
|
|
434
|
+
getDefaultsForExtension
|
|
435
|
+
} = appiumSchema;
|
|
436
|
+
exports.getDefaultsForExtension = getDefaultsForExtension;
|
|
437
|
+
exports.getDefaultsForSchema = getDefaultsForSchema;
|
|
438
|
+
exports.flattenSchema = flattenSchema;
|
|
439
|
+
exports.getSchema = getSchema;
|
|
440
|
+
exports.validate = validate;
|
|
441
|
+
exports.resetSchema = resetSchema;
|
|
442
|
+
exports.finalizeSchema = finalizeSchema;
|
|
443
|
+
exports.isFinalized = isFinalized;
|
|
444
|
+
exports.hasArgSpec = hasArgSpec;
|
|
445
|
+
exports.getArgSpec = getArgSpec;
|
|
446
|
+
exports.getAllArgSpecs = getAllArgSpecs;
|
|
447
|
+
exports.registerSchema = registerSchema;
|
|
448
|
+
const {
|
|
449
|
+
isAllowedSchemaFileExtension
|
|
450
|
+
} = AppiumSchema;
|
|
451
|
+
exports.isAllowedSchemaFileExtension = isAllowedSchemaFileExtension;
|
|
452
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSb2FjaEhvdGVsTWFwIiwiTWFwIiwic2V0Iiwia2V5IiwidmFsdWUiLCJoYXMiLCJFcnJvciIsImRlbGV0ZSIsImNsZWFyIiwiQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyIsIlNldCIsIkFwcGl1bVNjaGVtYSIsIl9hcmdTcGVjcyIsIl9yZWdpc3RlcmVkU2NoZW1hcyIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJfYWp2IiwiX2luc3RhbmNlIiwiX2ZpbmFsaXplZFNjaGVtYXMiLCJjb25zdHJ1Y3RvciIsIl9pbnN0YW50aWF0ZUFqdiIsImNyZWF0ZSIsImluc3RhbmNlIiwiXyIsImJpbmRBbGwiLCJoYXNSZWdpc3RlcmVkU2NoZW1hIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJpc0ZpbmFsaXplZCIsIkJvb2xlYW4iLCJnZXRBbGxBcmdTcGVjcyIsImZpbmFsaXplIiwiYWp2IiwiYmFzZVNjaGVtYSIsImNsb25lRGVlcCIsIkFwcGl1bUNvbmZpZ0pzb25TY2hlbWEiLCJhZGRBcmdTcGVjcyIsInNjaGVtYSIsInByb3BOYW1lIiwicHJvcFNjaGVtYSIsIk9iamVjdCIsImVudHJpZXMiLCJhcmdTcGVjIiwiQXJnU3BlYyIsImRlc3QiLCJhcHBpdW1DbGlEZXN0IiwiZGVmYXVsdFZhbHVlIiwiZGVmYXVsdCIsImFyZyIsIm9taXQiLCJwcm9wZXJ0aWVzIiwic2VydmVyIiwiZmluYWxpemVkU2NoZW1hcyIsImZpbmFsU2NoZW1hIiwicmVkdWNlIiwiZXh0ZW5zaW9uU2NoZW1hcyIsImZvckVhY2giLCIkcmVmIiwidG9TY2hlbWFCYXNlUmVmIiwiJGlkIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCIkY29tbWVudCIsInZhbGlkYXRlU2NoZW1hIiwiYWRkU2NoZW1hIiwiQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQiLCJmcmVlemUiLCJBanYiLCJhbGxFcnJvcnMiLCJrZXl3b3JkcyIsImtleXdvcmQiLCJhZGRLZXl3b3JkIiwicmVzZXQiLCJzY2hlbWFJZCIsImtleXMiLCJyZW1vdmVTY2hlbWEiLCJyZWdpc3RlclNjaGVtYSIsImlzVW5kZWZpbmVkIiwiVHlwZUVycm9yIiwiaXNTdXBwb3J0ZWRTY2hlbWFUeXBlIiwiU2NoZW1hVW5zdXBwb3J0ZWRTY2hlbWFFcnJvciIsIm5vcm1hbGl6ZWRFeHROYW1lIiwia2ViYWJDYXNlIiwiZ2V0IiwiU2NoZW1hTmFtZUNvbmZsaWN0RXJyb3IiLCJnZXRBcmdTcGVjIiwibmFtZSIsInRvQXJnIiwiaGFzQXJnU3BlYyIsImdldERlZmF1bHRzIiwiZmxhdHRlbiIsIlNjaGVtYUZpbmFsaXphdGlvbkVycm9yIiwicmVkdWNlciIsImRlZmF1bHRzIiwicmV0dmFsIiwidmFsdWVzIiwiZ2V0RGVmYXVsdHNGb3JFeHRlbnNpb24iLCJzcGVjcyIsImZpbHRlciIsInNwZWMiLCJyYXdEZXN0IiwiZ2V0U2NoZW1hIiwic3RhY2siLCJwcmVmaXgiLCJmbGF0dGVuZWQiLCJwYWlycyIsInRvUGFpcnMiLCJwdXNoIiwiU0VSVkVSX1BST1BfTkFNRSIsInJlZlNjaGVtYSIsImVyciIsIlNjaGVtYVVua25vd25TY2hlbWFFcnJvciIsImV4dGVuc2lvbkluZm9Gcm9tUm9vdFNjaGVtYUlkIiwiUmVmZXJlbmNlRXJyb3IiLCJyZWYiLCJfZ2V0VmFsaWRhdG9yIiwiaWQiLCJ2YWxpZGF0b3IiLCJ2YWxpZGF0ZSIsImlzQXJyYXkiLCJlcnJvcnMiLCJpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uIiwiZmlsZW5hbWUiLCJwYXRoIiwiZXh0bmFtZSIsImlzUGxhaW5PYmplY3QiLCIkYXN5bmMiLCJjb2RlIiwiZGF0YSIsIm1zZyIsImlzQm9vbGVhbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJhcHBpdW1TY2hlbWEiLCJmaW5hbGl6ZVNjaGVtYSIsInJlc2V0U2NoZW1hIiwiZmxhdHRlblNjaGVtYSIsImdldERlZmF1bHRzRm9yU2NoZW1hIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3NjaGVtYS9zY2hlbWEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgQWp2IGZyb20gJ2Fqdic7XG5pbXBvcnQgYWRkRm9ybWF0cyBmcm9tICdhanYtZm9ybWF0cyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBEUklWRVJfVFlQRSwgUExVR0lOX1RZUEUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXBwaXVtQ29uZmlnSnNvblNjaGVtYSB9IGZyb20gJ0BhcHBpdW0vc2NoZW1hJztcbmltcG9ydCB7IEFQUElVTV9DT05GSUdfU0NIRU1BX0lELCBBcmdTcGVjLCBTRVJWRVJfUFJPUF9OQU1FIH0gZnJvbSAnLi9hcmctc3BlYyc7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gJy4va2V5d29yZHMnO1xuXG4vKipcbiAqIEtleS92YWx1ZSBwYWlycyBnbyBpbi4uLiBidXQgdGhleSBkb24ndCBjb21lIG91dC5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAZXh0ZW5kcyB7TWFwPEssVj59XG4gKi9cbmV4cG9ydCBjbGFzcyBSb2FjaEhvdGVsTWFwIGV4dGVuZHMgTWFwIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7S30ga2V5XG4gICAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAgICovXG4gIHNldCAoa2V5LCB2YWx1ZSkge1xuICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBpcyBhbHJlYWR5IHNldGApO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7S30ga2V5XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZGVsZXRlIChrZXkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjbGVhciAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIgUm9hY2hIb3RlbE1hcGApO1xuICB9XG59XG5cbi8qKlxuICogRXh0ZW5zaW9ucyB0aGF0IGFuIGV4dGVuc2lvbiBzY2hlbWEgZmlsZSBjYW4gaGF2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFsnLmpzb24nLCAnLmpzJywgJy5janMnXSk7XG5cbi8qKlxuICogQSB3cmFwcGVyIGFyb3VuZCBBanYgYW5kIHNjaGVtYS1yZWxhdGVkIGZ1bmN0aW9ucy5cbiAqXG4gKiBTaG91bGQgaGF2ZSBiZWVuIG5hbWVkIEhpZ2hsYW5kZXIsIGJlY2F1c2UgX3RoZXJlIGNhbiBvbmx5IGJlIG9uZV9cbiAqL1xuY2xhc3MgQXBwaXVtU2NoZW1hIHtcbiAgLyoqXG4gICAqIEEgbWFwcGluZyBvZiB1bmlxdWUgYXJndW1lbnQgSURzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFyZ1NwZWN9cy5cbiAgICpcbiAgICogQW4gXCJhcmd1bWVudFwiIGlzIGEgQ0xJIGFyZ3VtZW50IG9yIGEgY29uZmlnIHByb3BlcnR5LlxuICAgKlxuICAgKiBVc2VkIHRvIHByb3ZpZGUgZWFzeSBsb29rdXBzIG9mIGFyZ3VtZW50IG1ldGFkYXRhIHdoZW4gY29udmVydGluZyBiZXR3ZWVuIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnMgb2YgdGhvc2UgYXJndW1lbnRzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7Um9hY2hIb3RlbE1hcDxzdHJpbmcsQXJnU3BlYz59XG4gICAqL1xuICBfYXJnU3BlY3MgPSBuZXcgUm9hY2hIb3RlbE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBleHRlbnNpb24gdHlwZXMgdG8gZXh0ZW5zaW9uIG5hbWVzIHRvIHNjaGVtYSBvYmplY3RzLlxuICAgKlxuICAgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBuYW1pbmcgY29uZmxpY3RzLiBUaGUgc2NoZW1hc1xuICAgKiBhcmUgc3RvcmVkIGhlcmUgaW4gbWVtb3J5IHVudGlsIHRoZSBpbnN0YW5jZSBpcyBfZmluYWxpemVkXy5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1JlY29yZDxFeHRlbnNpb25UeXBlLE1hcDxzdHJpbmcsU2NoZW1hT2JqZWN0Pj59XG4gICAqL1xuICBfcmVnaXN0ZXJlZFNjaGVtYXMgPSB7W0RSSVZFUl9UWVBFXTogbmV3IE1hcCgpLCBbUExVR0lOX1RZUEVdOiBuZXcgTWFwKCl9O1xuXG4gIC8qKlxuICAgKiBBanYgaW5zdGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0Fqdn1cbiAgICovXG4gIF9hanY7XG5cbiAgLyoqXG4gICAqIFNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0FwcGl1bVNjaGVtYX1cbiAgICovXG4gIHN0YXRpYyBfaW5zdGFuY2U7XG5cbiAgLyoqXG4gICAqIExvb2t1cCBvZiBzY2hlbWEgSURzIHRvIGZpbmFsaXplZCBzY2hlbWFzLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgcmVmZXJlbmNlcywgYnV0IHJhdGhlciB0aGUgcm9vdCBzY2hlbWFzIHRoZW1zZWx2ZXMuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFN0cmljdFNjaGVtYU9iamVjdD4/fVxuICAgKi9cbiAgX2ZpbmFsaXplZFNjaGVtYXMgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBBanYsIGFkZHMgc3RhbmRhcmQgZm9ybWF0cyBhbmQgb3VyIGN1c3RvbSBrZXl3b3Jkcy5cbiAgICogQHNlZSBodHRwczovL25wbS5pbS9hanYtZm9ybWF0c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMuX2FqdiA9IEFwcGl1bVNjaGVtYS5faW5zdGFudGlhdGVBanYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB7QGxpbmsgQXBwaXVtU2NoZW1hfSBpbnN0YW5jZXMuXG4gICAqXG4gICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2UgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIGNyZWF0ZXMgYSBuZXcgb25lLlxuICAgKiBCaW5kcyBwdWJsaWMgbWV0aG9kcyB0byB0aGUgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtBcHBpdW1TY2hlbWF9XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlICgpIHtcbiAgICBpZiAoIUFwcGl1bVNjaGVtYS5faW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEFwcGl1bVNjaGVtYSgpO1xuICAgICAgQXBwaXVtU2NoZW1hLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgXy5iaW5kQWxsKGluc3RhbmNlLCBbXG4gICAgICAgICdmaW5hbGl6ZScsXG4gICAgICAgICdmbGF0dGVuJyxcbiAgICAgICAgJ2dldEFsbEFyZ1NwZWNzJyxcbiAgICAgICAgJ2dldEFyZ1NwZWMnLFxuICAgICAgICAnZ2V0RGVmYXVsdHMnLFxuICAgICAgICAnZ2V0RGVmYXVsdHNGb3JFeHRlbnNpb24nLFxuICAgICAgICAnZ2V0U2NoZW1hJyxcbiAgICAgICAgJ2hhc0FyZ1NwZWMnLFxuICAgICAgICAnaXNGaW5hbGl6ZWQnLFxuICAgICAgICAncmVnaXN0ZXJTY2hlbWEnLFxuICAgICAgICAnaGFzUmVnaXN0ZXJlZFNjaGVtYScsXG4gICAgICAgICdyZXNldCcsXG4gICAgICAgICd2YWxpZGF0ZScsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQXBwaXVtU2NoZW1hLl9pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBhIHNjaGVtYSBoYXMgYmVlbiByZWdpc3RlcmVkIHVzaW5nIGdpdmVuIGV4dGVuc2lvbiB0eXBlIGFuZCBuYW1lLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgbm90IGRlcGVuZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gX2ZpbmFsaXplZF8uXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZSAtIEV4dGVuc2lvbiB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIC0gTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgcmVnaXN0ZXJlZFxuICAgKi9cbiAgaGFzUmVnaXN0ZXJlZFNjaGVtYSAoZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hc1tleHRUeXBlXS5oYXMoZXh0TmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGB0cnVlYCBpZiB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplIGZpbmFsaXplfSBoYXMgYmVlbiBjYWxsZWRcbiAgICogc3VjY2Vzc2Z1bGx5IGFuZCB7QGxpbmsgQXBwaXVtU2NoZW1hLnJlc2V0IHJlc2V0fSBoYXMgbm90IGJlZW4gY2FsbGVkIHNpbmNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgZmluYWxpemVkXG4gICAqL1xuICBpc0ZpbmFsaXplZCAoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fZmluYWxpemVkU2NoZW1hcyk7XG4gIH1cblxuICBnZXRBbGxBcmdTcGVjcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FyZ1NwZWNzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyB3aGVuIG5vIG1vcmUgc2NoZW1hcyB3aWxsIGJlIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIFRoaXMgZG9lcyB0aHJlZSB0aGluZ3M6XG4gICAqIDEuIEl0IGNvbWJpbmVzIGFsbCBzY2hlbWFzIGZyb20gZXh0ZW5zaW9ucyBpbnRvIHRoZSBBcHBpdW0gY29uZmlnIHNjaGVtYSxcbiAgICogICAgdGhlbiBhZGRzIHRoZSByZXN1bHQgdG8gdGhlIGBBanZgIGluc3RhbmNlLlxuICAgKiAyLiBJdCBhZGRzIHNjaGVtYXMgZm9yIF9lYWNoXyBhcmd1bWVudC9wcm9wZXJ0eSBmb3IgdmFsaWRhdGlvbiBwdXJwb3Nlcy5cbiAgICogICAgVGhlIENMSSB1c2VzIHRoZXNlIHNjaGVtYXMgdG8gdmFsaWRhdGUgc3BlY2lmaWMgYXJndW1lbnRzLlxuICAgKiAzLiBUaGUgc2NoZW1hcyBhcmUgdmFsaWRhdGVkIGFnYWluc3QgSlNPTiBzY2hlbWEgZHJhZnQtMDcgKHdoaWNoIGlzIHRoZVxuICAgKiAgICBvbmx5IG9uZSBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lKVxuICAgKlxuICAgKiBBbnkgbWV0aG9kIGluIHRoaXMgaW5zdGFuY2UgdGhhdCBuZWVkcyB0byBpbnRlcmFjdCB3aXRoIHRoZSBgQWp2YCBpbnN0YW5jZVxuICAgKiB3aWxsIHRocm93IGlmIHRoaXMgbWV0aG9kIGhhcyBub3QgYmVlbiBjYWxsZWQuXG4gICAqXG4gICAqIElmIHRoZSBpbnN0YW5jZSBoYXMgYWxyZWFkeSBiZWVuIGZpbmFsaXplZCwgdGhpcyBpcyBhIG5vLW9wLlxuICAgKiBAcHVibGljXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgc2NoZW1hIGlzIG5vdCB2YWxpZFxuICAgKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+Pn0gUmVjb3JkIG9mIHNjaGVtYSBJRHMgdG8gZnVsbCBzY2hlbWEgb2JqZWN0c1xuICAgKi9cbiAgZmluYWxpemUgKCkge1xuICAgIGlmICh0aGlzLmlzRmluYWxpemVkKCkpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzPn0gKi8gKFxuICAgICAgICB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFqdiA9IHRoaXMuX2FqdjtcblxuICAgIC8vIEFqdiB3aWxsIF9tdXRhdGVfIHRoZSBzY2hlbWEsIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQuXG4gICAgY29uc3QgYmFzZVNjaGVtYSA9IF8uY2xvbmVEZWVwKEFwcGl1bUNvbmZpZ0pzb25TY2hlbWEpO1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NjaGVtYU9iamVjdH0gc2NoZW1hXG4gICAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdXG4gICAgICovXG4gICAgY29uc3QgYWRkQXJnU3BlY3MgPSAoc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKSA9PiB7XG4gICAgICBmb3IgKGxldCBbcHJvcE5hbWUsIHByb3BTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICAgICAgY29uc3QgYXJnU3BlYyA9IEFyZ1NwZWMuY3JlYXRlKHByb3BOYW1lLCB7XG4gICAgICAgICAgZGVzdDogcHJvcFNjaGVtYS5hcHBpdW1DbGlEZXN0LFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcHJvcFNjaGVtYS5kZWZhdWx0LFxuICAgICAgICAgIGV4dFR5cGUsXG4gICAgICAgICAgZXh0TmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHthcmd9ID0gYXJnU3BlYztcbiAgICAgICAgdGhpcy5fYXJnU3BlY3Muc2V0KGFyZywgYXJnU3BlYyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGFkZEFyZ1NwZWNzKFxuICAgICAgXy5vbWl0KGJhc2VTY2hlbWEucHJvcGVydGllcy5zZXJ2ZXIucHJvcGVydGllcywgW1xuICAgICAgICBEUklWRVJfVFlQRSxcbiAgICAgICAgUExVR0lOX1RZUEUsXG4gICAgICBdKSxcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pn1cbiAgICAgKi9cbiAgICBjb25zdCBmaW5hbGl6ZWRTY2hlbWFzID0ge307XG5cbiAgICBjb25zdCBmaW5hbFNjaGVtYSA9IF8ucmVkdWNlKFxuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXMsXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7dHlwZW9mIGJhc2VTY2hlbWF9IGJhc2VTY2hlbWFcbiAgICAgICAqIEBwYXJhbSB7TWFwPHN0cmluZyxTY2hlbWFPYmplY3Q+fSBleHRlbnNpb25TY2hlbWFzXG4gICAgICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICAgICAqL1xuICAgICAgKGJhc2VTY2hlbWEsIGV4dGVuc2lvblNjaGVtYXMsIGV4dFR5cGUpID0+IHtcbiAgICAgICAgZXh0ZW5zaW9uU2NoZW1hcy5mb3JFYWNoKChzY2hlbWEsIGV4dE5hbWUpID0+IHtcbiAgICAgICAgICBjb25zdCAkcmVmID0gQXJnU3BlYy50b1NjaGVtYUJhc2VSZWYoZXh0VHlwZSwgZXh0TmFtZSk7XG4gICAgICAgICAgc2NoZW1hLiRpZCA9ICRyZWY7XG4gICAgICAgICAgc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZmFsc2U7IC8vIHRoaXMgbWFrZXMgYHNjaGVtYWAgYmVjb21lIGEgYFN0cmljdFNjaGVtYU9iamVjdGBcbiAgICAgICAgICBiYXNlU2NoZW1hLnByb3BlcnRpZXMuc2VydmVyLnByb3BlcnRpZXNbZXh0VHlwZV0ucHJvcGVydGllc1tleHROYW1lXSA9XG4gICAgICAgICAgICB7JHJlZiwgJGNvbW1lbnQ6IGV4dE5hbWV9O1xuICAgICAgICAgIGFqdi52YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRydWUpO1xuICAgICAgICAgIGFkZEFyZ1NwZWNzKHNjaGVtYS5wcm9wZXJ0aWVzLCBleHRUeXBlLCBleHROYW1lKTtcbiAgICAgICAgICBhanYuYWRkU2NoZW1hKHNjaGVtYSwgJHJlZik7XG4gICAgICAgICAgZmluYWxpemVkU2NoZW1hc1skcmVmXSA9IC8qKiBAdHlwZSB7U3RyaWN0U2NoZW1hT2JqZWN0fSAqLyAoc2NoZW1hKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBiYXNlU2NoZW1hO1xuICAgICAgfSxcbiAgICAgIGJhc2VTY2hlbWEsXG4gICAgKTtcblxuICAgIGFqdi5hZGRTY2hlbWEoZmluYWxTY2hlbWEsIEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKTtcbiAgICBmaW5hbGl6ZWRTY2hlbWFzW0FQUElVTV9DT05GSUdfU0NIRU1BX0lEXSA9IGZpbmFsU2NoZW1hO1xuICAgIGFqdi52YWxpZGF0ZVNjaGVtYShmaW5hbFNjaGVtYSwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID0gZmluYWxpemVkU2NoZW1hcztcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShmaW5hbGl6ZWRTY2hlbWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIGFuZCBjcmVhdGVzIGFuIEFqdiBpbnN0YW5jZS5cbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge0Fqdn1cbiAgICovXG4gIHN0YXRpYyBfaW5zdGFudGlhdGVBanYgKCkge1xuICAgIGNvbnN0IGFqdiA9IGFkZEZvcm1hdHMoXG4gICAgICBuZXcgQWp2KHtcbiAgICAgICAgLy8gd2l0aG91dCB0aGlzIG5vdCBtdWNoIHZhbGlkYXRpb24gYWN0dWFsbHkgaGFwcGVuc1xuICAgICAgICBhbGxFcnJvcnM6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gYWRkIGN1c3RvbSBrZXl3b3JkcyB0byBhanYuIHNlZSBzY2hlbWEta2V5d29yZHMuanNcbiAgICBfLmZvckVhY2goa2V5d29yZHMsIChrZXl3b3JkKSA9PiB7XG4gICAgICBhanYuYWRkS2V5d29yZChrZXl3b3JkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBhanY7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoaXMgaW5zdGFuY2UgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLlxuICAgKlxuICAgKiAtIFJlbW92ZXMgYWxsIGFkZGVkIHNjaGVtYXMgZnJvbSB0aGUgYEFqdmAgaW5zdGFuY2VcbiAgICogLSBSZXNldHMgdGhlIG1hcCBvZiB7QGxpbmsgQXJnU3BlYyBBcmdTcGVjc31cbiAgICogLSBSZXNldHMgdGhlIG1hcCBvZiByZWdpc3RlcmVkIHNjaGVtYXNcbiAgICogLSBTZXRzIHRoZSB7QGxpbmsgQXBwaXVtU2NoZW1hLl9maW5hbGl6ZWQgX2ZpbmFsaXplZH0gZmxhZyB0byBgZmFsc2VgXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0gYWdhaW4sIHlvdSdsbCB3YW50IHRvIGNhbGwgdGhpcyBmaXJzdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXNldCAoKSB7XG4gICAgZm9yIChjb25zdCBzY2hlbWFJZCBvZiBPYmplY3Qua2V5cyh0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID8/IHt9KSkge1xuICAgICAgdGhpcy5fYWp2LnJlbW92ZVNjaGVtYShzY2hlbWFJZCk7XG4gICAgfVxuICAgIHRoaXMuX2FyZ1NwZWNzID0gbmV3IFJvYWNoSG90ZWxNYXAoKTtcbiAgICB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hcyA9IHtcbiAgICAgIFtEUklWRVJfVFlQRV06IG5ldyBNYXAoKSxcbiAgICAgIFtQTFVHSU5fVFlQRV06IG5ldyBNYXAoKSxcbiAgICB9O1xuICAgIHRoaXMuX2ZpbmFsaXplZFNjaGVtYXMgPSBudWxsO1xuXG4gICAgLy8gQWp2IHNlZW1zIHRvIGhhdmUgYW4gb3Zlci1lYWdlciBjYWNoZSwgc28gd2UgaGF2ZSB0byBkdW1wIHRoZSBvYmplY3QgZW50aXJlbHkuXG4gICAgdGhpcy5fYWp2ID0gQXBwaXVtU2NoZW1hLl9pbnN0YW50aWF0ZUFqdigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHNjaGVtYSBmcm9tIGFuIGV4dGVuc2lvbi5cbiAgICpcbiAgICogVGhpcyBpcyBcImZhaWwtZmFzdFwiIGluIHRoYXQgdGhlIHNjaGVtYSB3aWxsIGltbWVkaWF0ZWx5IGJlIHZhbGlkYXRlZCBhZ2FpbnN0IEpTT04gc2NoZW1hIGRyYWZ0LTA3IF9vcl8gd2hhdGV2ZXIgdGhlIHZhbHVlIG9mIHRoZSBzY2hlbWEncyBgJHNjaGVtYWAgcHJvcCBpcy5cbiAgICpcbiAgICogRG9lcyBfbm90XyBhZGQgdGhlIHNjaGVtYSB0byB0aGUgYGFqdmAgaW5zdGFuY2UgKHRoaXMgaXMgZG9uZSBieSB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplfSkuXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZSAtIEV4dGVuc2lvbiB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIC0gVW5pcXVlIGV4dGVuc2lvbiBuYW1lIGZvciBgdHlwZWBcbiAgICogQHBhcmFtIHtTY2hlbWFPYmplY3R9IHNjaGVtYSAtIFNjaGVtYSBvYmplY3RcbiAgICogQHRocm93cyB7U2NoZW1hTmFtZUNvbmZsaWN0RXJyb3J9IElmIHRoZSBzY2hlbWEgaXMgYW4gaW52YWxpZFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlZ2lzdGVyU2NoZW1hIChleHRUeXBlLCBleHROYW1lLCBzY2hlbWEpIHtcbiAgICBpZiAoIShleHRUeXBlICYmIGV4dE5hbWUpIHx8IF8uaXNVbmRlZmluZWQoc2NoZW1hKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ0V4cGVjdGVkIGV4dGVuc2lvbiB0eXBlLCBleHRlbnNpb24gbmFtZSwgYW5kIGEgZGVmaW5lZCBzY2hlbWEnLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFBcHBpdW1TY2hlbWEuaXNTdXBwb3J0ZWRTY2hlbWFUeXBlKHNjaGVtYSkpIHtcbiAgICAgIHRocm93IG5ldyBTY2hlbWFVbnN1cHBvcnRlZFNjaGVtYUVycm9yKHNjaGVtYSwgZXh0VHlwZSwgZXh0TmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHROYW1lID0gXy5rZWJhYkNhc2UoZXh0TmFtZSk7XG4gICAgaWYgKHRoaXMuaGFzUmVnaXN0ZXJlZFNjaGVtYShleHRUeXBlLCBub3JtYWxpemVkRXh0TmFtZSkpIHtcbiAgICAgIGlmICh0aGlzLl9yZWdpc3RlcmVkU2NoZW1hc1tleHRUeXBlXS5nZXQobm9ybWFsaXplZEV4dE5hbWUpID09PSBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFNjaGVtYU5hbWVDb25mbGljdEVycm9yKGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgIH1cbiAgICB0aGlzLl9hanYudmFsaWRhdGVTY2hlbWEoc2NoZW1hLCB0cnVlKTtcblxuICAgIHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzW2V4dFR5cGVdLnNldChub3JtYWxpemVkRXh0TmFtZSwgc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEge0BsaW5rIEFyZ1NwZWN9IGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBDTEkgYXJndW1lbnQgbmFtZVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXSAtIEV4dGVuc2lvbiB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0TmFtZV0gLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7QXJnU3BlY3x1bmRlZmluZWR9IEFyZ1NwZWMgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kXG4gICAqL1xuICBnZXRBcmdTcGVjIChuYW1lLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FyZ1NwZWNzLmdldChBcmdTcGVjLnRvQXJnKG5hbWUsIGV4dFR5cGUsIGV4dE5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgaW5zdGFuY2Uga25vd3MgYWJvdXQgYW4gYXJndW1lbnQgYnkgdGhlIGdpdmVuIGBuYW1lYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBDTEkgYXJndW1lbnQgbmFtZVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXSAtIEV4dGVuc2lvbiB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0TmFtZV0gLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHN1Y2ggYW4ge0BsaW5rIEFyZ1NwZWN9IGV4aXN0c1xuICAgKi9cbiAgaGFzQXJnU3BlYyAobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcy5oYXMoQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGBSZWNvcmRgIG9mIGFyZ3VtZW50IFwiZGVzdFwiIHN0cmluZ3MgdG8gZGVmYXVsdCB2YWx1ZXMuXG4gICAqXG4gICAqIFRoZSBcImRlc3RcIiBzdHJpbmcgaXMgdGhlIHByb3BlcnR5IG5hbWUgaW4gb2JqZWN0IHJldHVybmVkIGJ5XG4gICAqIGBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlclsncGFyc2VfYXJncyddYC5cbiAgICogQHRlbXBsYXRlIHtib29sZWFufHVuZGVmaW5lZH0gRmxhdHRlbmVkXG4gICAqIEBwYXJhbSB7RmxhdHRlbmVkfSBbZmxhdHRlbj10cnVlXSAtIElmIGB0cnVlYCwgZmxhdHRlbnMgdGhlIHJldHVybmVkIG9iamVjdFxuICAgKiB1c2luZyBcImtleXBhdGhcIi1zdHlsZSBrZXlzIG9mIHRoZSBmb3JtYXQgYDxleHRUeXBlPi48ZXh0TmFtZT4uPGFyZ05hbWU+YC5cbiAgICogT3RoZXJ3aXNlLCByZXR1cm5zIGEgbmVzdGVkIG9iamVjdCB1c2luZyBgZXh0VHlwZWAgYW5kIGBleHROYW1lYCBhc1xuICAgKiBwcm9wZXJ0aWVzLiBCYXNlIGFyZ3VtZW50cyAoc2VydmVyIGFyZ3VtZW50cykgYXJlIGFsd2F5cyBhdCB0aGUgdG9wIGxldmVsLlxuICAgKiBAcmV0dXJucyB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fVxuICAgKi9cbiAgZ2V0RGVmYXVsdHMgKGZsYXR0ZW4gPSAvKiogQHR5cGUge0ZsYXR0ZW5lZH0gKi8gKHRydWUpKSB7XG4gICAgaWYgKCF0aGlzLmlzRmluYWxpemVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBTY2hlbWFGaW5hbGl6YXRpb25FcnJvcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNhbGxiYWNrIERlZmF1bHRSZWR1Y2VyXG4gICAgICogQHBhcmFtIHtEZWZhdWx0VmFsdWVzPEZsYXR0ZW5lZD59IGRlZmF1bHRzXG4gICAgICogQHBhcmFtIHtBcmdTcGVjfSBhcmdTcGVjXG4gICAgICogQHJldHVybnMge0RlZmF1bHRWYWx1ZXM8RmxhdHRlbmVkPn1cbiAgICAgKi9cbiAgICAvKiogQHR5cGUge0RlZmF1bHRSZWR1Y2VyfSAqL1xuICAgIGNvbnN0IHJlZHVjZXIgPSBmbGF0dGVuXG4gICAgICA/IChkZWZhdWx0cywge2RlZmF1bHRWYWx1ZSwgZGVzdH0pID0+IHtcbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICBkZWZhdWx0c1tkZXN0XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgICB9XG4gICAgICA6IChkZWZhdWx0cywge2RlZmF1bHRWYWx1ZSwgZGVzdH0pID0+IHtcbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICBfLnNldChkZWZhdWx0cywgZGVzdCwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgICB9O1xuXG4gICAgLyoqIEB0eXBlIHtEZWZhdWx0VmFsdWVzPEZsYXR0ZW5lZD59ICovXG4gICAgY29uc3QgcmV0dmFsID0ge307XG4gICAgcmV0dXJuIFsuLi50aGlzLl9hcmdTcGVjcy52YWx1ZXMoKV0ucmVkdWNlKHJlZHVjZXIsIHJldHZhbCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGZsYXR0ZW5lZCBSZWNvcmQgb2YgZGVmYXVsdHMgZm9yIGEgc3BlY2lmaWMgZXh0ZW5zaW9uLiBLZXlzIHdpbGxcbiAgICogYmUgb2YgZm9ybWF0IGA8YXJnTmFtZT5gLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLEFyZ1NwZWNEZWZhdWx0VmFsdWU+fVxuICAgKi9cbiAgZ2V0RGVmYXVsdHNGb3JFeHRlbnNpb24gKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNGaW5hbGl6ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYUZpbmFsaXphdGlvbkVycm9yKCk7XG4gICAgfVxuICAgIGNvbnN0IHNwZWNzID0gWy4uLnRoaXMuX2FyZ1NwZWNzLnZhbHVlcygpXS5maWx0ZXIoXG4gICAgICAoc3BlYykgPT4gc3BlYy5leHRUeXBlID09PSBleHRUeXBlICYmIHNwZWMuZXh0TmFtZSA9PT0gZXh0TmFtZSxcbiAgICApO1xuICAgIHJldHVybiBzcGVjcy5yZWR1Y2UoKGRlZmF1bHRzLCB7ZGVmYXVsdFZhbHVlLCByYXdEZXN0fSkgPT4ge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgZGVmYXVsdHNbcmF3RGVzdF0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfSwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW4gc2NoZW1hIGludG8gYW4gYXJyYXkgb2YgYFNjaGVtYU9iamVjdGBzIGFuZCBhc3NvY2lhdGVkXG4gICAqIHtAbGluayBBcmdTcGVjIEFyZ1NwZWNzfS5cbiAgICpcbiAgICogQ29udmVydHMgbmVzdGVkIGV4dGVuc2lvbiBzY2hlbWFzIHRvIGtleXMgYmFzZWQgb24gdGhlIGV4dGVuc2lvbiB0eXBlIGFuZFxuICAgKiBuYW1lLiBVc2VkIHdoZW4gdHJhbnNsYXRpbmcgdG8gYGFyZ3BhcnNlYCBvcHRpb25zIG9yIGdldHRpbmcgdGhlIGxpc3Qgb2ZcbiAgICogZGVmYXVsdCB2YWx1ZXMgKHNlZSB7QGxpbmsgQXBwaXVtU2NoZW1hLmdldERlZmF1bHRzfSkgZm9yIENMSSBvciBvdGhlcndpc2UuXG4gICAqXG4gICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gaW50ZXJtZWRpYXRlIHJlcHJzZW50YXRpb24gdXNlZCBieSBgY2xpLWFyZ3NgXG4gICAqIG1vZHVsZSdzIGB0b1BhcnNlckFyZ3NgLCB3aGljaCBjb252ZXJ0cyB0aGUgZmluYWxpemVkIHNjaGVtYSB0byBwYXJhbWV0ZXJzXG4gICAqIHVzZWQgYnkgYGFyZ3BhcnNlYC5cbiAgICogQHRocm93cyBJZiB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplfSBoYXMgbm90IGJlZW4gY2FsbGVkIHlldC5cbiAgICogQHJldHVybnMge0ZsYXR0ZW5lZFNjaGVtYX1cbiAgICovXG4gIGZsYXR0ZW4gKCkge1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCk7XG5cbiAgICAvKiogQHR5cGUgeyB7cHJvcGVydGllczogU2NoZW1hT2JqZWN0LCBwcmVmaXg6IHN0cmluZ1tdfVtdIH0gKi9cbiAgICBjb25zdCBzdGFjayA9IFt7cHJvcGVydGllczogc2NoZW1hLnByb3BlcnRpZXMsIHByZWZpeDogW119XTtcbiAgICAvKiogQHR5cGUge0ZsYXR0ZW5lZFNjaGVtYX0gKi9cbiAgICBjb25zdCBmbGF0dGVuZWQgPSBbXTtcblxuICAgIC8vIHRoaXMgYml0IGlzIGEgcmVjdXJzaXZlIGFsZ29yaXRobSByZXdyaXR0ZW4gYXMgYSBmb3IgbG9vcC5cbiAgICAvLyB3aGVuIHdlIGZpbmQgc29tZXRoaW5nIHdlIHdhbnQgdG8gdHJhdmVyc2UsIHdlIGFkZCBpdCB0byBgc3RhY2tgXG4gICAgZm9yIChjb25zdCB7cHJvcGVydGllcywgcHJlZml4fSBvZiBzdGFjaykge1xuICAgICAgY29uc3QgcGFpcnMgPSBfLnRvUGFpcnMocHJvcGVydGllcyk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBwYWlycykge1xuICAgICAgICBjb25zdCB7cHJvcGVydGllcywgJHJlZn0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICBwcmVmaXg6IGtleSA9PT0gU0VSVkVSX1BST1BfTkFNRSA/IFtdIDogWy4uLnByZWZpeCwga2V5XSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgkcmVmKSB7XG4gICAgICAgICAgbGV0IHJlZlNjaGVtYTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVmU2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoJHJlZik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gaWYgYW4gZXh0ZW5zaW9uIHNjaGVtYSBzdXBwbGllcyBhICRyZWYgdG8gYSBub24tZXhpc3RlbnQgc2NoZW1hXG4gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVW5rbm93blNjaGVtYUVycm9yKCRyZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7bm9ybWFsaXplZEV4dE5hbWV9ID1cbiAgICAgICAgICAgIEFyZ1NwZWMuZXh0ZW5zaW9uSW5mb0Zyb21Sb290U2NoZW1hSWQoJHJlZik7XG4gICAgICAgICAgaWYgKCFub3JtYWxpemVkRXh0TmFtZSkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgZXh0ZW5zaW9uIG5hbWUgZnJvbSBzY2hlbWEgSUQgJHskcmVmfS4gVGhpcyBpcyBhIGJ1Zy5gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiByZWZTY2hlbWEucHJvcGVydGllcyxcbiAgICAgICAgICAgIHByZWZpeDogWy4uLnByZWZpeCwga2V5LCBub3JtYWxpemVkRXh0TmFtZV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSBEUklWRVJfVFlQRSAmJiBrZXkgIT09IFBMVUdJTl9UWVBFKSB7XG4gICAgICAgICAgY29uc3QgW2V4dFR5cGUsIGV4dE5hbWVdID0gcHJlZml4O1xuICAgICAgICAgIGNvbnN0IGFyZ1NwZWMgPSB0aGlzLmdldEFyZ1NwZWMoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAvKiogQHR5cGUge0V4dGVuc2lvblR5cGV9ICovIChleHRUeXBlKSxcbiAgICAgICAgICAgIGV4dE5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWFyZ1NwZWMpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBVbmtub3duIGFyZ3VtZW50IHdpdGgga2V5ICR7a2V5fSwgZXh0VHlwZSAke2V4dFR5cGV9IGFuZCBleHROYW1lICR7ZXh0TmFtZX0uIFRoaXMgaXMgYSBidWcuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHtzY2hlbWE6IF8uY2xvbmVEZWVwKHZhbHVlKSwgYXJnU3BlY30pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXR0ZW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHNjaGVtYSBpdHNlbGZcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlZl0gLSBTY2hlbWEgSURcbiAgICogQHRocm93cyBJZiB0aGUgc2NoZW1hIGhhcyBub3QgeWV0IGJlZW4gZmluYWxpemVkXG4gICAqIEByZXR1cm5zIHtTY2hlbWFPYmplY3R9XG4gICAqL1xuICBnZXRTY2hlbWEgKHJlZiA9IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7U2NoZW1hT2JqZWN0fSAqLyAodGhpcy5fZ2V0VmFsaWRhdG9yKHJlZikuc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgc2NoZW1hIHZhbGlkYXRvciBmdW5jdGlvbiBmcm9tIEFqdlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2lkXSAtIFNjaGVtYSBJRFxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5WYWxpZGF0ZUZ1bmN0aW9ufVxuICAgKi9cbiAgX2dldFZhbGlkYXRvciAoaWQgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMuX2Fqdi5nZXRTY2hlbWEoaWQpO1xuICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICBpZiAoaWQgPT09IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgICAgIHRocm93IG5ldyBTY2hlbWFGaW5hbGl6YXRpb25FcnJvcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVVua25vd25TY2hlbWFFcnJvcihpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gb2JqZWN0LCB2YWxpZGF0ZXMgaXQgYWdhaW5zdCB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEuXG4gICAqIElmIGVycm9ycyBvY2N1ciwgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgbm9uLWVtcHR5LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgKGhvcGVmdWxseSBhbiBvYmplY3QpIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIHNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlZl0gLSBTY2hlbWEgSUQgb3IgcmVmLlxuICAgKiBAcHVibGljXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLkVycm9yT2JqZWN0W119IEFycmF5IG9mIGVycm9ycywgaWYgYW55LlxuICAgKi9cbiAgdmFsaWRhdGUgKHZhbHVlLCByZWYgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMuX2dldFZhbGlkYXRvcihyZWYpO1xuICAgIHJldHVybiAhdmFsaWRhdG9yKHZhbHVlKSAmJiBfLmlzQXJyYXkodmFsaWRhdG9yLmVycm9ycylcbiAgICAgID8gWy4uLnZhbGlkYXRvci5lcnJvcnNdXG4gICAgICA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGBmaWxlbmFtZWAncyBmaWxlIGV4dGVuc2lvbiBpcyBhbGxvd2VkIChpbiB7QGxpbmsgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OU30pLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbiAoZmlsZW5hbWUpIHtcbiAgICByZXR1cm4gQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUy5oYXMocGF0aC5leHRuYW1lKGZpbGVuYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYHNjaGVtYWAgaXMgYSBwbGFpbiBvYmplY3Qgd2l0aCBhIG5vbi10cnVlIGAkYXN5bmNgIHByb3BlcnR5LlxuICAgKiBAcGFyYW0ge2FueX0gc2NoZW1hIC0gU2NoZW1hIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHtzY2hlbWEgaXMgU2NoZW1hT2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGlzU3VwcG9ydGVkU2NoZW1hVHlwZSAoc2NoZW1hKSB7XG4gICAgcmV0dXJuIF8uaXNQbGFpbk9iamVjdChzY2hlbWEpICYmIHNjaGVtYS4kYXN5bmMgIT09IHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUge0BsaW5rIEFwcGl1bVNjaGVtYX0gaW5zdGFuY2UgaGFzIG5vdCB5ZXQgYmVlbiBmaW5hbGl6ZWQsIGJ1dFxuICogdGhlIG1ldGhvZCBjYWxsZWQgcmVxdWlyZXMgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFGaW5hbGl6YXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfU0NIRU1BX0ZJTkFMSVpBVElPTic7XG5cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKCdTY2hlbWEgbm90IHlldCBmaW5hbGl6ZWQ7IGBmaW5hbGl6ZSgpYCBtdXN0IGJlIGNhbGxlZCBmaXJzdC4nKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgXCJ1bmlxdWVcIiBzY2hlbWEgSUQgY29uZmxpY3RzIHdpdGggYW4gZXhpc3Rpbmcgc2NoZW1hIElELlxuICpcbiAqIFRoaXMgaXMgbGlrZWx5IGdvaW5nIHRvIGJlIGNhdXNlZCBieSBhdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIHRoZSBzYW1lIHNjaGVtYSB0d2ljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYU5hbWVDb25mbGljdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9TQ0hFTUFfTkFNRV9DT05GTElDVCc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7ZXh0VHlwZTogRXh0ZW5zaW9uVHlwZSwgZXh0TmFtZTogc3RyaW5nfT59XG4gICAqL1xuICBkYXRhO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yIChleHRUeXBlLCBleHROYW1lKSB7XG4gICAgc3VwZXIoXG4gICAgICBgTmFtZSBmb3IgJHtleHRUeXBlfSBzY2hlbWEgXCIke2V4dE5hbWV9XCIgY29uZmxpY3RzIHdpdGggYW4gZXhpc3Rpbmcgc2NoZW1hYCxcbiAgICApO1xuICAgIHRoaXMuZGF0YSA9IHtleHRUeXBlLCBleHROYW1lfTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgc2NoZW1hIElEIHdhcyBleHBlY3RlZCwgYnV0IGl0IGRvZXNuJ3QgZXhpc3Qgb24gdGhlIHtAbGluayBBanZ9IGluc3RhbmNlLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hVW5rbm93blNjaGVtYUVycm9yIGV4dGVuZHMgUmVmZXJlbmNlRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9TQ0hFTUFfVU5LTk9XTl9TQ0hFTUEnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8e3NjaGVtYUlkOiBzdHJpbmd9Pn1cbiAgICovXG4gIGRhdGE7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFJZFxuICAgKi9cbiAgY29uc3RydWN0b3IgKHNjaGVtYUlkKSB7XG4gICAgc3VwZXIoYFVua25vd24gc2NoZW1hOiBcIiR7c2NoZW1hSWR9XCJgKTtcbiAgICB0aGlzLmRhdGEgPSB7c2NoZW1hSWR9O1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBzY2hlbWEgaXMgcHJvdmlkZWQsIGJ1dCBpdCdzIG9mIGFuIHVuc3VwcG9ydGVkIHR5cGUuXG4gKlxuICogXCJWYWxpZFwiIHNjaGVtYXMgd2hpY2ggYXJlIHVuc3VwcG9ydGVkIGluY2x1ZGUgYm9vbGVhbiBzY2hlbWFzIGFuZCBhc3luYyBzY2hlbWFzXG4gKiAoaGF2aW5nIGEgYHRydWVgIGAkYXN5bmNgIHByb3BlcnR5KS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYVVuc3VwcG9ydGVkU2NoZW1hRXJyb3IgZXh0ZW5kcyBUeXBlRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9TQ0hFTUFfVU5TVVBQT1JURURfU0NIRU1BJztcblxuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHtzY2hlbWE6IGFueSwgZXh0VHlwZTogRXh0ZW5zaW9uVHlwZSwgZXh0TmFtZTogc3RyaW5nfT59XG4gICAqL1xuICBkYXRhO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gc2NoZW1hXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKHNjaGVtYSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvODI3N1xuICAgIHN1cGVyKFxuICAgICAgKCgpID0+IHtcbiAgICAgICAgbGV0IG1zZyA9IGBVbnN1cHBvcnRlZCBzY2hlbWEgZnJvbSAke2V4dFR5cGV9IFwiJHtleHROYW1lfVwiOmA7XG4gICAgICAgIGlmIChfLmlzQm9vbGVhbihzY2hlbWEpKSB7XG4gICAgICAgICAgcmV0dXJuIGAke21zZ30gc2NoZW1hIGNhbm5vdCBiZSBhIGJvb2xlYW5gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfLmlzUGxhaW5PYmplY3Qoc2NoZW1hKSkge1xuICAgICAgICAgIGlmIChzY2hlbWEuJGFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7bXNnfSBzY2hlbWEgY2Fubm90IGJlIGFuIGFzeW5jIHNjaGVtYWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBzY2hlbWEgSVMgc3VwcG9ydGVkOyB0aGlzIGVycm9yIHNob3VsZCBub3QgYmUgdGhyb3duICh0aGlzIGlzIGEgYnVnKS4gdmFsdWUgb2Ygc2NoZW1hOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7bXNnfSBzY2hlbWEgbXVzdCBiZSBhIHBsYWluIG9iamVjdCB3aXRob3V0IGEgdHJ1ZSBcIiRhc3luY1wiIHByb3BlcnR5YDtcbiAgICAgIH0pKCksXG4gICAgKTtcbiAgICB0aGlzLmRhdGEgPSB7c2NoZW1hLCBleHRUeXBlLCBleHROYW1lfTtcbiAgfVxufVxuXG5jb25zdCBhcHBpdW1TY2hlbWEgPSBBcHBpdW1TY2hlbWEuY3JlYXRlKCk7XG5cbmV4cG9ydCBjb25zdCB7XG4gIHJlZ2lzdGVyU2NoZW1hLFxuICBnZXRBbGxBcmdTcGVjcyxcbiAgZ2V0QXJnU3BlYyxcbiAgaGFzQXJnU3BlYyxcbiAgaXNGaW5hbGl6ZWQsXG4gIGZpbmFsaXplOiBmaW5hbGl6ZVNjaGVtYSxcbiAgcmVzZXQ6IHJlc2V0U2NoZW1hLFxuICB2YWxpZGF0ZSxcbiAgZ2V0U2NoZW1hLFxuICBmbGF0dGVuOiBmbGF0dGVuU2NoZW1hLFxuICBnZXREZWZhdWx0czogZ2V0RGVmYXVsdHNGb3JTY2hlbWEsXG4gIGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uLFxufSA9IGFwcGl1bVNjaGVtYTtcbmV4cG9ydCBjb25zdCB7aXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbn0gPSBBcHBpdW1TY2hlbWE7XG5cbi8qKlxuICogQXBwaXVtIG9ubHkgc3VwcG9ydHMgc2NoZW1hcyB0aGF0IGFyZSBwbGFpbiBvYmplY3RzOyBub3QgYXJyYXlzLlxuICogQHR5cGVkZWYge2ltcG9ydCgnYWp2JykuU2NoZW1hT2JqZWN0ICYge1trZXk6IG51bWJlcl06IG5ldmVyfX0gU2NoZW1hT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9leHRlbnNpb24vbWFuaWZlc3QnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKi9cblxuLyoqXG4gKiBBbiBvYmplY3QgaGF2aW5nIHByb3BlcnR5IGBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VgXG4gKiBAdHlwZWRlZiBTdHJpY3RQcm9wXG4gKiBAcHJvcGVydHkge2ZhbHNlfSBhZGRpdGlvbmFsUHJvcGVydGllc1xuICovXG5cbi8qKlxuICogQSB7QGxpbmsgU2NoZW1hT2JqZWN0fSB3aXRoIGBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VgXG4gKiBAdHlwZWRlZiB7U2NoZW1hT2JqZWN0ICYgU3RyaWN0UHJvcH0gU3RyaWN0U2NoZW1hT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBBIGxpc3Qgb2Ygc2NoZW1hcyBhc3NvY2lhdGVkIHdpdGggcHJvcGVydGllcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB7QGxpbmsgQXJnU3BlY30gb2JqZWN0cy5cbiAqXG4gKiBJbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB3aGVuIGNvbnZlcnRpbmcgdGhlIGVudGlyZSBzY2hlbWEgZG93biB0byBDTEkgYXJndW1lbnRzLlxuICogQHR5cGVkZWYgeyB7c2NoZW1hOiBTY2hlbWFPYmplY3QsIGFyZ1NwZWM6IEFyZ1NwZWN9W10gfSBGbGF0dGVuZWRTY2hlbWFcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcmdTcGVjWydkZWZhdWx0VmFsdWUnXX0gQXJnU3BlY0RlZmF1bHRWYWx1ZVxuICovXG5cbi8qKlxuICogZS5nLiBge2RyaXZlcjoge2ZvbzogJ2Jhcid9fWAgd2hlcmUgYGZvb2AgaXMgdGhlIGFyZyBuYW1lIGFuZCBgYmFyYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLFJlY29yZDxzdHJpbmcsQXJnU3BlY0RlZmF1bHRWYWx1ZT4+fSBOZXN0ZWRBcmdTcGVjRGVmYXVsdFZhbHVlXG4gKi9cblxuLyoqXG4gKiBIZWxwZXIgdHlwZSBmb3IgdGhlIHJldHVybiB2YWx1ZSBvZiB7QGxpbmsgQXBwaXVtU2NoZW1hLmdldERlZmF1bHRzfVxuICogQHRlbXBsYXRlIHtib29sZWFufHVuZGVmaW5lZH0gRmxhdHRlbmVkXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZyxGbGF0dGVuZWQgZXh0ZW5kcyB0cnVlID8gQXJnU3BlY0RlZmF1bHRWYWx1ZSA6IEFyZ1NwZWNEZWZhdWx0VmFsdWUgfCBOZXN0ZWRBcmdTcGVjRGVmYXVsdFZhbHVlPn0gRGVmYXVsdFZhbHVlc1xuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBUU8sTUFBTUEsYUFBTixTQUE0QkMsR0FBNUIsQ0FBZ0M7RUFLckNDLEdBQUcsQ0FBRUMsR0FBRixFQUFPQyxLQUFQLEVBQWM7SUFDZixJQUFJLEtBQUtDLEdBQUwsQ0FBU0YsR0FBVCxDQUFKLEVBQW1CO01BQ2pCLE1BQU0sSUFBSUcsS0FBSixDQUFXLEdBQUVILEdBQUksaUJBQWpCLENBQU47SUFDRDs7SUFDRCxPQUFPLE1BQU1ELEdBQU4sQ0FBVUMsR0FBVixFQUFlQyxLQUFmLENBQVA7RUFDRDs7RUFNREcsTUFBTSxDQUFFSixHQUFGLEVBQU87SUFDWCxPQUFPLEtBQVA7RUFDRDs7RUFFREssS0FBSyxHQUFJO0lBQ1AsTUFBTSxJQUFJRixLQUFKLENBQVcsNEJBQVgsQ0FBTjtFQUNEOztBQXRCb0M7OztBQTRCaEMsTUFBTUcseUJBQXlCLEdBQUcsSUFBSUMsR0FBSixDQUFRLENBQUMsT0FBRCxFQUFVLEtBQVYsRUFBaUIsTUFBakIsQ0FBUixDQUFsQzs7O0FBT1AsTUFBTUMsWUFBTixDQUFtQjtFQVVqQkMsU0FBUyxHQUFHLElB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
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export type ParsedDriverCaps = {
|
|
2
|
+
desiredCaps: Capabilities;
|
|
3
|
+
protocol: string;
|
|
4
|
+
processedJsonwpCapabilities?: any;
|
|
5
|
+
processedW3CCapabilities?: W3CCapabilities | undefined;
|
|
6
|
+
};
|
|
7
|
+
export type InvalidCaps = {
|
|
8
|
+
error: Error;
|
|
9
|
+
protocol: string;
|
|
10
|
+
desiredCaps?: Partial<import("@wdio/types/build/Capabilities").Capabilities & import("@wdio/types/build/Capabilities").AppiumCapabilities & {
|
|
11
|
+
[x: string]: any;
|
|
12
|
+
}> | undefined;
|
|
13
|
+
processedJsonwpCapabilities?: any;
|
|
14
|
+
processedW3CCapabilities?: W3CCapabilities | undefined;
|
|
15
|
+
};
|
|
16
|
+
export type W3CCapabilities = import('@appium/types').W3CCapabilities;
|
|
17
|
+
export type Capabilities = import('@appium/types').Capabilities;
|
|
18
|
+
export type AppiumW3CCapabilities = import('@appium/types').AppiumW3CCapabilities;
|
|
19
|
+
/**
|
|
20
|
+
* Dumps to value to the console using `info` logger.
|
|
21
|
+
*
|
|
22
|
+
* @todo May want to force color to be `false` if {@link isStdoutTTY} is `false`.
|
|
23
|
+
*/
|
|
24
|
+
export const inspect: (t1: any) => void;
|
|
25
|
+
/**
|
|
26
|
+
* Takes the caps that were provided in the request and translates them
|
|
27
|
+
* into caps that can be used by the inner drivers.
|
|
28
|
+
*
|
|
29
|
+
* @param {any} jsonwpCapabilities
|
|
30
|
+
* @param {W3CCapabilities} w3cCapabilities
|
|
31
|
+
* @param {import('@appium/types').Constraints} constraints
|
|
32
|
+
* @param {import('@appium/types').DefaultCapabilitiesConfig} [defaultCapabilities]
|
|
33
|
+
* @returns {ParsedDriverCaps|InvalidCaps}
|
|
34
|
+
*/
|
|
35
|
+
export function parseCapsForInnerDriver(jsonwpCapabilities: any, w3cCapabilities: W3CCapabilities, constraints?: import('@appium/types').Constraints, defaultCapabilities?: import("@appium/types").DefaultCapabilitiesConfig | undefined): ParsedDriverCaps | InvalidCaps;
|
|
36
|
+
/**
|
|
37
|
+
* Takes a capabilities objects and prefixes capabilities with `appium:`
|
|
38
|
+
* @param {Capabilities} caps Desired capabilities object
|
|
39
|
+
* @returns {AppiumW3CCapabilities}
|
|
40
|
+
*/
|
|
41
|
+
export function insertAppiumPrefixes(caps: Capabilities): AppiumW3CCapabilities;
|
|
42
|
+
export function getPackageVersion(pkgName: any): any;
|
|
43
|
+
/**
|
|
44
|
+
* Pulls the initial values of Appium settings from the given capabilities argument.
|
|
45
|
+
* Each setting item must satisfy the following format:
|
|
46
|
+
* `setting[setting_name]: setting_value`
|
|
47
|
+
* The capabilities argument itself gets mutated, so it does not contain parsed
|
|
48
|
+
* settings anymore to avoid further parsing issues.
|
|
49
|
+
* Check
|
|
50
|
+
* https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/settings.md
|
|
51
|
+
* for more details on the available settings.
|
|
52
|
+
*
|
|
53
|
+
* @param {?Object} caps - Capabilities dictionary. It is mutated if
|
|
54
|
+
* one or more settings have been pulled from it
|
|
55
|
+
* @return {Object} - An empty dictionary if the given caps contains no
|
|
56
|
+
* setting items or a dictionary containing parsed Appium setting names along with
|
|
57
|
+
* their values.
|
|
58
|
+
*/
|
|
59
|
+
export function pullSettings(caps: any | null): any;
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
* @param {AppiumW3CCapabilities} caps
|
|
63
|
+
* @returns {Capabilities}
|
|
64
|
+
*/
|
|
65
|
+
export function removeAppiumPrefixes(caps: AppiumW3CCapabilities): Capabilities;
|
|
66
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../lib/utils.js"],"names":[],"mappings":";iBAwOc,YAAY;cACZ,MAAM;kCACN,GAAG;;;;WAOH,KAAK;cACL,MAAM;;;;kCAEN,GAAG;;;8BAKJ,OAAO,eAAe,EAAE,eAAe;2BACvC,OAAO,eAAe,EAAE,YAAY;oCACpC,OAAO,eAAe,EAAE,qBAAqB;AA1O1D;;;;GAIG;AACH,wCAOK;AAEL;;;;;;;;;GASG;AACH,4DANW,GAAG,mBACH,eAAe,gBACf,OAAO,eAAe,EAAE,WAAW,wFAEjC,gBAAgB,GAAC,WAAW,CA2FxC;AAED;;;;GAIG;AACH,2CAHW,YAAY,GACV,qBAAqB,CAyBjC;AAyBD,qDAGC;AAED;;;;;;;;;;;;;;;GAeG;AACH,oDAgBC;AA5DD;;;;GAIG;AACH,2CAHW,qBAAqB,GACnB,YAAY,CAaxB"}
|