@appium/base-driver 8.7.3 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/build/lib/basedriver/capabilities.d.ts +11 -163
  2. package/build/lib/basedriver/capabilities.d.ts.map +1 -1
  3. package/build/lib/basedriver/capabilities.js +354 -236
  4. package/build/lib/basedriver/capabilities.js.map +1 -1
  5. package/build/lib/basedriver/commands/event.d.ts +7 -6
  6. package/build/lib/basedriver/commands/event.d.ts.map +1 -1
  7. package/build/lib/basedriver/commands/event.js +55 -35
  8. package/build/lib/basedriver/commands/event.js.map +1 -1
  9. package/build/lib/basedriver/commands/execute.d.ts +7 -6
  10. package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
  11. package/build/lib/basedriver/commands/execute.js +66 -58
  12. package/build/lib/basedriver/commands/execute.js.map +1 -1
  13. package/build/lib/basedriver/commands/find.d.ts +9 -7
  14. package/build/lib/basedriver/commands/find.d.ts.map +1 -1
  15. package/build/lib/basedriver/commands/find.js +102 -54
  16. package/build/lib/basedriver/commands/find.js.map +1 -1
  17. package/build/lib/basedriver/commands/index.d.ts +3 -7
  18. package/build/lib/basedriver/commands/index.d.ts.map +1 -1
  19. package/build/lib/basedriver/commands/index.js +30 -33
  20. package/build/lib/basedriver/commands/index.js.map +1 -1
  21. package/build/lib/basedriver/commands/log.d.ts +8 -9
  22. package/build/lib/basedriver/commands/log.d.ts.map +1 -1
  23. package/build/lib/basedriver/commands/log.js +54 -38
  24. package/build/lib/basedriver/commands/log.js.map +1 -1
  25. package/build/lib/basedriver/commands/session.d.ts +7 -6
  26. package/build/lib/basedriver/commands/session.d.ts.map +1 -1
  27. package/build/lib/basedriver/commands/session.js +46 -39
  28. package/build/lib/basedriver/commands/session.js.map +1 -1
  29. package/build/lib/basedriver/commands/settings.d.ts +7 -7
  30. package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
  31. package/build/lib/basedriver/commands/settings.js +35 -28
  32. package/build/lib/basedriver/commands/settings.js.map +1 -1
  33. package/build/lib/basedriver/commands/timeout.d.ts +7 -5
  34. package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
  35. package/build/lib/basedriver/commands/timeout.js +144 -162
  36. package/build/lib/basedriver/commands/timeout.js.map +1 -1
  37. package/build/lib/basedriver/core.d.ts +6 -157
  38. package/build/lib/basedriver/core.d.ts.map +1 -1
  39. package/build/lib/basedriver/core.js +361 -230
  40. package/build/lib/basedriver/core.js.map +1 -1
  41. package/build/lib/basedriver/desired-caps.js +80 -110
  42. package/build/lib/basedriver/desired-caps.js.map +1 -1
  43. package/build/lib/basedriver/device-settings.js +57 -62
  44. package/build/lib/basedriver/device-settings.js.map +1 -1
  45. package/build/lib/basedriver/driver.d.ts +11 -262
  46. package/build/lib/basedriver/driver.d.ts.map +1 -1
  47. package/build/lib/basedriver/driver.js +362 -262
  48. package/build/lib/basedriver/driver.js.map +1 -1
  49. package/build/lib/basedriver/helpers.js +500 -495
  50. package/build/lib/basedriver/helpers.js.map +1 -1
  51. package/build/lib/basedriver/logger.d.ts +1 -1
  52. package/build/lib/basedriver/logger.d.ts.map +1 -1
  53. package/build/lib/basedriver/logger.js +5 -15
  54. package/build/lib/basedriver/logger.js.map +1 -1
  55. package/build/lib/constants.js +14 -14
  56. package/build/lib/constants.js.map +1 -1
  57. package/build/lib/express/crash.js +8 -15
  58. package/build/lib/express/crash.js.map +1 -1
  59. package/build/lib/express/express-logging.js +49 -59
  60. package/build/lib/express/express-logging.js.map +1 -1
  61. package/build/lib/express/idempotency.js +125 -177
  62. package/build/lib/express/idempotency.js.map +1 -1
  63. package/build/lib/express/logger.d.ts +1 -1
  64. package/build/lib/express/logger.d.ts.map +1 -1
  65. package/build/lib/express/logger.js +5 -15
  66. package/build/lib/express/logger.js.map +1 -1
  67. package/build/lib/express/middleware.js +82 -107
  68. package/build/lib/express/middleware.js.map +1 -1
  69. package/build/lib/express/server.d.ts +17 -5
  70. package/build/lib/express/server.d.ts.map +1 -1
  71. package/build/lib/express/server.js +259 -224
  72. package/build/lib/express/server.js.map +1 -1
  73. package/build/lib/express/static.js +64 -81
  74. package/build/lib/express/static.js.map +1 -1
  75. package/build/lib/express/websocket.js +115 -87
  76. package/build/lib/express/websocket.js.map +1 -1
  77. package/build/lib/helpers/capabilities.d.ts +1 -59
  78. package/build/lib/helpers/capabilities.d.ts.map +1 -1
  79. package/build/lib/helpers/capabilities.js +72 -69
  80. package/build/lib/helpers/capabilities.js.map +1 -1
  81. package/build/lib/index.js +64 -180
  82. package/build/lib/index.js.map +1 -1
  83. package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
  84. package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
  85. package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
  86. package/build/lib/jsonwp-proxy/proxy.js +355 -393
  87. package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
  88. package/build/lib/jsonwp-status/status.js +119 -130
  89. package/build/lib/jsonwp-status/status.js.map +1 -1
  90. package/build/lib/protocol/errors.d.ts +135 -32
  91. package/build/lib/protocol/errors.d.ts.map +1 -1
  92. package/build/lib/protocol/errors.js +871 -919
  93. package/build/lib/protocol/errors.js.map +1 -1
  94. package/build/lib/protocol/helpers.js +37 -37
  95. package/build/lib/protocol/helpers.js.map +1 -1
  96. package/build/lib/protocol/index.js +22 -109
  97. package/build/lib/protocol/index.js.map +1 -1
  98. package/build/lib/protocol/protocol.js +394 -350
  99. package/build/lib/protocol/protocol.js.map +1 -1
  100. package/build/lib/protocol/routes.d.ts +1238 -4
  101. package/build/lib/protocol/routes.d.ts.map +1 -1
  102. package/build/lib/protocol/routes.js +964 -1327
  103. package/build/lib/protocol/routes.js.map +1 -1
  104. package/build/lib/protocol/validators.js +32 -39
  105. package/build/lib/protocol/validators.js.map +1 -1
  106. package/build/tsconfig.tsbuildinfo +1 -1
  107. package/lib/basedriver/capabilities.js +80 -39
  108. package/lib/basedriver/commands/event.js +10 -5
  109. package/lib/basedriver/commands/execute.js +14 -9
  110. package/lib/basedriver/commands/find.js +18 -12
  111. package/lib/basedriver/commands/index.js +21 -16
  112. package/lib/basedriver/commands/log.js +24 -18
  113. package/lib/basedriver/commands/session.js +10 -5
  114. package/lib/basedriver/commands/settings.js +9 -6
  115. package/lib/basedriver/commands/timeout.js +10 -4
  116. package/lib/basedriver/core.js +2 -3
  117. package/lib/basedriver/driver.js +12 -16
  118. package/lib/express/server.js +6 -3
  119. package/lib/protocol/errors.js +155 -44
  120. package/lib/protocol/routes.js +11 -7
  121. package/package.json +14 -16
@@ -1,253 +1,371 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.STANDARD_CAPS = exports.PREFIXED_APPIUM_OPTS_CAP = exports.APPIUM_VENDOR_PREFIX = exports.APPIUM_OPTS_CAP = void 0;
7
- exports.findNonPrefixedCaps = findNonPrefixedCaps;
8
- exports.isStandardCap = isStandardCap;
9
- exports.mergeCaps = mergeCaps;
10
- exports.parseCaps = parseCaps;
11
- exports.processCapabilities = processCapabilities;
12
- exports.promoteAppiumOptions = promoteAppiumOptions;
13
- exports.stripAppiumPrefixes = stripAppiumPrefixes;
14
- exports.validateCaps = validateCaps;
15
-
16
- require("source-map-support/register");
17
-
18
- var _lodash = _interopRequireDefault(require("lodash"));
19
-
20
- var _desiredCaps = require("./desired-caps");
21
-
22
- var _support = require("@appium/support");
23
-
24
- var _logger = _interopRequireDefault(require("./logger"));
25
-
26
- var _errors = require("../protocol/errors");
27
-
28
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
-
2
+ // @ts-check
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PREFIXED_APPIUM_OPTS_CAP = exports.promoteAppiumOptions = exports.stripAppiumPrefixes = exports.isStandardCap = exports.findNonPrefixedCaps = exports.APPIUM_VENDOR_PREFIX = exports.mergeCaps = exports.validateCaps = exports.processCapabilities = exports.parseCaps = exports.STANDARD_CAPS = void 0;
8
+ const lodash_1 = __importDefault(require("lodash"));
9
+ const desired_caps_1 = require("./desired-caps");
10
+ const support_1 = require("@appium/support");
11
+ const logger_1 = __importDefault(require("./logger"));
12
+ const errors_1 = require("../protocol/errors");
30
13
  const APPIUM_VENDOR_PREFIX = 'appium:';
31
14
  exports.APPIUM_VENDOR_PREFIX = APPIUM_VENDOR_PREFIX;
32
- const APPIUM_OPTS_CAP = 'options';
33
- exports.APPIUM_OPTS_CAP = APPIUM_OPTS_CAP;
34
- const PREFIXED_APPIUM_OPTS_CAP = `${APPIUM_VENDOR_PREFIX}${APPIUM_OPTS_CAP}`;
15
+ const PREFIXED_APPIUM_OPTS_CAP = `${APPIUM_VENDOR_PREFIX}options`;
35
16
  exports.PREFIXED_APPIUM_OPTS_CAP = PREFIXED_APPIUM_OPTS_CAP;
36
-
17
+ /**
18
+ * Takes primary caps object and merges it into a secondary caps object.
19
+ * @template {Constraints} [T={}]
20
+ * @template {Constraints} [U={}]
21
+ * @param {Capabilities<T>} [primary]
22
+ * @param {Capabilities<U>} [secondary]
23
+ * @returns {Merge<Capabilities<T>, Capabilities<U>>}
24
+ * @see https://www.w3.org/TR/webdriver/#dfn-merging-capabilities)
25
+ */
37
26
  function mergeCaps(primary = {}, secondary = {}) {
38
- let result = { ...primary
39
- };
40
-
41
- for (let [name, value] of _lodash.default.toPairs(secondary)) {
42
- if (!_lodash.default.isUndefined(primary[name])) {
43
- throw new _errors.errors.InvalidArgumentError(`property '${name}' should not exist on both primary (${JSON.stringify(primary)}) and secondary (${JSON.stringify(secondary)}) object`);
44
- }
45
-
46
- result[name] = value;
47
- }
48
-
49
- return result;
27
+ let result = /** @type {Merge<Capabilities<T>, Capabilities<U>>} */ ({
28
+ ...primary,
29
+ });
30
+ for (let [name, value] of /** @type {[keyof typeof secondary, any]} */ (lodash_1.default.toPairs(secondary))) {
31
+ // Overwriting is not allowed. Primary and secondary must have different properties (w3c rule 4.4)
32
+ if (!lodash_1.default.isUndefined(primary[name])) {
33
+ throw new errors_1.errors.InvalidArgumentError(`property '${name}' should not exist on both primary (${JSON.stringify(primary)}) and secondary (${JSON.stringify(secondary)}) object`);
34
+ }
35
+ result[ /** @type {keyof typeof result} */(name)] = value;
36
+ }
37
+ return result;
50
38
  }
51
-
52
- function validateCaps(caps, constraints = {}, opts = {}) {
53
- let {
54
- skipPresenceConstraint
55
- } = opts;
56
-
57
- if (!_lodash.default.isPlainObject(caps)) {
58
- throw new _errors.errors.InvalidArgumentError(`must be a JSON object`);
59
- }
60
-
61
- constraints = _lodash.default.mapValues(constraints, skipPresenceConstraint ? constraint => _lodash.default.omit(constraint, 'presence') : constraint => {
62
- if (constraint.presence === true) {
63
- return { ..._lodash.default.omit(constraint, 'presence'),
64
- presence: {
65
- allowEmpty: false
39
+ exports.mergeCaps = mergeCaps;
40
+ // Validates caps against a set of constraints
41
+ /**
42
+ * @template {Constraints} [C={}]
43
+ * @param {Capabilities<C>} caps
44
+ * @param {C} [constraints]
45
+ * @param {ValidateCapsOpts} [opts]
46
+ * @returns {Capabilities<C>}
47
+ */
48
+ function validateCaps(caps, constraints = /** @type {C} */ ({}), opts = {}) {
49
+ let { skipPresenceConstraint } = opts;
50
+ if (!lodash_1.default.isPlainObject(caps)) {
51
+ throw new errors_1.errors.InvalidArgumentError(`must be a JSON object`);
52
+ }
53
+ // Remove the 'presence' constraint if we're not checking for it
54
+ constraints = /** @type {C} */ (lodash_1.default.mapValues(constraints, skipPresenceConstraint
55
+ ? /** @param {Constraint} constraint */
56
+ (constraint) => lodash_1.default.omit(constraint, 'presence')
57
+ : /** @param {Constraint} constraint */
58
+ (constraint) => {
59
+ if (constraint.presence === true) {
60
+ return { ...lodash_1.default.omit(constraint, 'presence'), presence: { allowEmpty: false } };
61
+ }
62
+ return constraint;
63
+ }));
64
+ const validationErrors = desired_caps_1.validator.validate(lodash_1.default.pickBy(caps, support_1.util.hasValue), constraints, {
65
+ fullMessages: false,
66
+ });
67
+ if (validationErrors) {
68
+ let message = [];
69
+ for (let [attribute, reasons] of lodash_1.default.toPairs(validationErrors)) {
70
+ for (let reason of reasons) {
71
+ message.push(`'${attribute}' ${reason}`);
72
+ }
66
73
  }
67
- };
68
- }
69
-
70
- return constraint;
71
- });
72
-
73
- const validationErrors = _desiredCaps.validator.validate(_lodash.default.pickBy(caps, _support.util.hasValue), constraints, {
74
- fullMessages: false
75
- });
76
-
77
- if (validationErrors) {
78
- let message = [];
79
-
80
- for (let [attribute, reasons] of _lodash.default.toPairs(validationErrors)) {
81
- for (let reason of reasons) {
82
- message.push(`'${attribute}' ${reason}`);
83
- }
84
- }
85
-
86
- throw new _errors.errors.InvalidArgumentError(message.join('; '));
87
- }
88
-
89
- return caps;
74
+ throw new errors_1.errors.InvalidArgumentError(message.join('; '));
75
+ }
76
+ // Return caps
77
+ return caps;
90
78
  }
91
-
92
- const STANDARD_CAPS = Object.freeze(new Set(['browserName', 'browserVersion', 'platformName', 'acceptInsecureCerts', 'pageLoadStrategy', 'proxy', 'setWindowRect', 'timeouts', 'unhandledPromptBehavior']));
93
- exports.STANDARD_CAPS = STANDARD_CAPS;
94
- const STANDARD_CAPS_LOWER = new Set([...STANDARD_CAPS].map(cap => cap.toLowerCase()));
95
-
79
+ exports.validateCaps = validateCaps;
80
+ /**
81
+ * Standard, non-prefixed capabilities
82
+ * @see https://www.w3.org/TR/webdriver/#dfn-table-of-standard-capabilities)
83
+ */
84
+ exports.STANDARD_CAPS = Object.freeze(new Set(
85
+ /** @type {StringKeyOf<import('@appium/types').StandardCapabilities>[]} */ ([
86
+ 'browserName',
87
+ 'browserVersion',
88
+ 'platformName',
89
+ 'acceptInsecureCerts',
90
+ 'pageLoadStrategy',
91
+ 'proxy',
92
+ 'setWindowRect',
93
+ 'timeouts',
94
+ 'unhandledPromptBehavior',
95
+ ])));
96
+ const STANDARD_CAPS_LOWER = new Set([...exports.STANDARD_CAPS].map((cap) => cap.toLowerCase()));
97
+ /**
98
+ * @param {string} cap
99
+ * @returns {boolean}
100
+ */
96
101
  function isStandardCap(cap) {
97
- return STANDARD_CAPS_LOWER.has(cap.toLowerCase());
102
+ return STANDARD_CAPS_LOWER.has(cap.toLowerCase());
98
103
  }
99
-
104
+ exports.isStandardCap = isStandardCap;
105
+ /**
106
+ * If the 'appium:' prefix was provided and it's a valid capability, strip out the prefix
107
+ * @template {Constraints} [C={}]
108
+ * @param {import('@appium/types').NSCapabilities<C>} caps
109
+ * @see https://www.w3.org/TR/webdriver/#dfn-extension-capabilities
110
+ * @internal
111
+ * @returns {import('@appium/types').Capabilities<C>}
112
+ */
100
113
  function stripAppiumPrefixes(caps) {
101
- const [prefixedCaps, nonPrefixedCaps] = _lodash.default.partition(_lodash.default.keys(caps), cap => String(cap).startsWith(APPIUM_VENDOR_PREFIX));
102
-
103
- let strippedCaps = _lodash.default.pick(caps, nonPrefixedCaps);
104
-
105
- const badPrefixedCaps = [];
106
-
107
- for (let prefixedCap of prefixedCaps) {
108
- const strippedCapName = prefixedCap.substring(APPIUM_VENDOR_PREFIX.length);
109
-
110
- if (isStandardCap(strippedCapName)) {
111
- badPrefixedCaps.push(strippedCapName);
112
-
113
- if (_lodash.default.isNil(strippedCaps[strippedCapName])) {
114
- strippedCaps[strippedCapName] = caps[prefixedCap];
115
- } else {
116
- _logger.default.warn(`Ignoring capability '${prefixedCap}=${caps[prefixedCap]}' and ` + `using capability '${strippedCapName}=${strippedCaps[strippedCapName]}'`);
117
- }
118
- } else {
119
- strippedCaps[strippedCapName] = caps[prefixedCap];
120
- }
121
- }
122
-
123
- if (badPrefixedCaps.length > 0) {
124
- _logger.default.warn(`The capabilities ${JSON.stringify(badPrefixedCaps)} are standard capabilities and do not require "appium:" prefix`);
125
- }
126
-
127
- return strippedCaps;
114
+ // split into prefixed and non-prefixed.
115
+ // non-prefixed should be standard caps at this point
116
+ const [prefixedCaps, nonPrefixedCaps] = lodash_1.default.partition(lodash_1.default.keys(caps), (cap) => String(cap).startsWith(APPIUM_VENDOR_PREFIX));
117
+ // initialize this with the k/v pairs of the non-prefixed caps
118
+ let strippedCaps = /** @type {import('@appium/types').Capabilities<C>} */ (lodash_1.default.pick(caps, nonPrefixedCaps));
119
+ const badPrefixedCaps = [];
120
+ // Strip out the 'appium:' prefix
121
+ for (let prefixedCap of prefixedCaps) {
122
+ const strippedCapName = /** @type {StringKeyOf<import('@appium/types').Capabilities<C>>} */ (prefixedCap.substring(APPIUM_VENDOR_PREFIX.length));
123
+ // If it's standard capability that was prefixed, add it to an array of incorrectly prefixed capabilities
124
+ if (isStandardCap(strippedCapName)) {
125
+ badPrefixedCaps.push(strippedCapName);
126
+ if (lodash_1.default.isNil(strippedCaps[strippedCapName])) {
127
+ strippedCaps[strippedCapName] = caps[prefixedCap];
128
+ }
129
+ else {
130
+ logger_1.default.warn(`Ignoring capability '${prefixedCap}=${caps[prefixedCap]}' and ` +
131
+ `using capability '${strippedCapName}=${strippedCaps[strippedCapName]}'`);
132
+ }
133
+ }
134
+ else {
135
+ strippedCaps[strippedCapName] = caps[prefixedCap];
136
+ }
137
+ }
138
+ // If we found standard caps that were incorrectly prefixed, throw an exception (e.g.: don't accept 'appium:platformName', only accept just 'platformName')
139
+ if (badPrefixedCaps.length > 0) {
140
+ logger_1.default.warn(`The capabilities ${JSON.stringify(badPrefixedCaps)} are standard capabilities and do not require "appium:" prefix`);
141
+ }
142
+ return strippedCaps;
128
143
  }
129
-
130
- function findNonPrefixedCaps({
131
- alwaysMatch = {},
132
- firstMatch = []
133
- }) {
134
- return _lodash.default.chain([alwaysMatch, ...firstMatch]).reduce((unprefixedCaps, caps) => [...unprefixedCaps, ...Object.keys(caps).filter(cap => !cap.includes(':') && !isStandardCap(cap))], []).uniq().value();
144
+ exports.stripAppiumPrefixes = stripAppiumPrefixes;
145
+ /**
146
+ * Get an array of all the unprefixed caps that are being used in 'alwaysMatch' and all of the 'firstMatch' object
147
+ * @template {Constraints} [C={}]
148
+ * @param {import('@appium/types').W3CCapabilities<C>} caps A capabilities object
149
+ */
150
+ function findNonPrefixedCaps({ alwaysMatch = {}, firstMatch = [] }) {
151
+ return lodash_1.default.chain([alwaysMatch, ...firstMatch])
152
+ .reduce((unprefixedCaps, caps) => [
153
+ ...unprefixedCaps,
154
+ ...Object.keys(caps).filter((cap) => !cap.includes(':') && !isStandardCap(cap)),
155
+ ], [])
156
+ .uniq()
157
+ .value();
135
158
  }
136
-
137
- function parseCaps(caps, constraints = {}, shouldValidateCaps = true) {
138
- if (!_lodash.default.isPlainObject(caps)) {
139
- throw new _errors.errors.InvalidArgumentError('The capabilities argument was not valid for the following reason(s): "capabilities" must be a JSON object.');
140
- }
141
-
142
- let {
143
- alwaysMatch: requiredCaps = {},
144
- firstMatch: allFirstMatchCaps = [{}]
145
- } = caps;
146
-
147
- if (!_lodash.default.isArray(allFirstMatchCaps)) {
148
- throw new _errors.errors.InvalidArgumentError('The capabilities.firstMatch argument was not valid for the following reason(s): "capabilities.firstMatch" must be a JSON array or undefined');
149
- }
150
-
151
- if (allFirstMatchCaps.length === 0) {
152
- _logger.default.warn(`The firstMatch array in the given capabilities has no entries. Adding an empty entry fo rnow, ` + `but it will require one or more entries as W3C spec.`);
153
-
154
- allFirstMatchCaps.push({});
155
- }
156
-
157
- let nonPrefixedCaps = findNonPrefixedCaps(caps);
158
-
159
- if (!_lodash.default.isEmpty(nonPrefixedCaps)) {
160
- throw new _errors.errors.InvalidArgumentError(`All non-standard capabilities should have a vendor prefix. The following capabilities did not have one: ${nonPrefixedCaps}`);
161
- }
162
-
163
- let strippedRequiredCaps = stripAppiumPrefixes(requiredCaps);
164
- let strippedAllFirstMatchCaps = allFirstMatchCaps.map(stripAppiumPrefixes);
165
-
166
- if (shouldValidateCaps) {
167
- strippedRequiredCaps = validateCaps(strippedRequiredCaps, constraints, {
168
- skipPresenceConstraint: true
169
- });
170
- }
171
-
172
- const filteredConstraints = _lodash.default.omitBy(constraints, (_, key) => key in strippedRequiredCaps);
173
-
174
- let validationErrors = [];
175
-
176
- let validatedFirstMatchCaps = _lodash.default.compact(strippedAllFirstMatchCaps.map(firstMatchCaps => {
177
- try {
178
- return shouldValidateCaps ? validateCaps(firstMatchCaps, filteredConstraints) : firstMatchCaps;
179
- } catch (e) {
180
- validationErrors.push(e.message);
181
- }
182
- }));
183
-
184
- let matchedCaps = null;
185
-
186
- for (let firstMatchCaps of validatedFirstMatchCaps) {
187
- try {
188
- matchedCaps = mergeCaps(strippedRequiredCaps, firstMatchCaps);
189
-
190
- if (matchedCaps) {
191
- break;
192
- }
193
- } catch (err) {
194
- _logger.default.warn(err.message);
195
-
196
- validationErrors.push(err.message);
197
- }
198
- }
199
-
200
- return {
201
- requiredCaps,
202
- allFirstMatchCaps,
203
- validatedFirstMatchCaps,
204
- matchedCaps,
205
- validationErrors
206
- };
159
+ exports.findNonPrefixedCaps = findNonPrefixedCaps;
160
+ /**
161
+ * Parse capabilities
162
+ * @template {Constraints} [C={}]
163
+ * @param {import('@appium/types').W3CCapabilities<C>} caps
164
+ * @param {C} [constraints]
165
+ * @param {boolean} [shouldValidateCaps]
166
+ * @see https://www.w3.org/TR/webdriver/#processing-capabilities
167
+ */
168
+ function parseCaps(caps, constraints = /** @type {C} */ ({}), shouldValidateCaps = true) {
169
+ // If capabilities request is not an object, return error (#1.1)
170
+ if (!lodash_1.default.isPlainObject(caps)) {
171
+ throw new errors_1.errors.InvalidArgumentError('The capabilities argument was not valid for the following reason(s): "capabilities" must be a JSON object.');
172
+ }
173
+ // Let 'requiredCaps' be property named 'alwaysMatch' from capabilities request (#2)
174
+ // and 'allFirstMatchCaps' be property named 'firstMatch' from capabilities request (#3)
175
+ let { alwaysMatch: requiredCaps = {}, // If 'requiredCaps' is undefined, set it to an empty JSON object (#2.1)
176
+ firstMatch: allFirstMatchCaps = [{}], // If 'firstMatch' is undefined set it to a singleton list with one empty object (#3.1)
177
+ } = caps;
178
+ // Reject 'firstMatch' argument if it's not an array (#3.2)
179
+ if (!lodash_1.default.isArray(allFirstMatchCaps)) {
180
+ throw new errors_1.errors.InvalidArgumentError('The capabilities.firstMatch argument was not valid for the following reason(s): "capabilities.firstMatch" must be a JSON array or undefined');
181
+ }
182
+ // If an empty array as provided, we'll be forgiving and make it an array of one empty object
183
+ // In the future, reject 'firstMatch' argument if its array did not have one or more entries (#3.2)
184
+ if (allFirstMatchCaps.length === 0) {
185
+ logger_1.default.warn(`The firstMatch array in the given capabilities has no entries. Adding an empty entry fo rnow, ` +
186
+ `but it will require one or more entries as W3C spec.`);
187
+ allFirstMatchCaps.push({});
188
+ }
189
+ // Check for non-prefixed, non-standard capabilities and log warnings if they are found
190
+ let nonPrefixedCaps = findNonPrefixedCaps(caps);
191
+ if (!lodash_1.default.isEmpty(nonPrefixedCaps)) {
192
+ throw new errors_1.errors.InvalidArgumentError(`All non-standard capabilities should have a vendor prefix. The following capabilities did not have one: ${nonPrefixedCaps}`);
193
+ }
194
+ // Strip out the 'appium:' prefix from all
195
+ let strippedRequiredCaps = stripAppiumPrefixes(requiredCaps);
196
+ let strippedAllFirstMatchCaps = allFirstMatchCaps.map(stripAppiumPrefixes);
197
+ // Validate the requiredCaps. But don't validate 'presence' because if that constraint fails on 'alwaysMatch' it could still pass on one of the 'firstMatch' keys
198
+ if (shouldValidateCaps) {
199
+ strippedRequiredCaps = validateCaps(strippedRequiredCaps, constraints, {
200
+ skipPresenceConstraint: true,
201
+ });
202
+ }
203
+ // Remove the 'presence' constraint for any keys that are already present in 'requiredCaps'
204
+ // since we know that this constraint has already passed
205
+ const filteredConstraints = /** @type {C} */ (lodash_1.default.omitBy(constraints, (_, key) => key in strippedRequiredCaps));
206
+ // Validate all of the first match capabilities and return an array with only the valid caps (see spec #5)
207
+ /** @type {string[]} */
208
+ let validationErrors = [];
209
+ let validatedFirstMatchCaps = lodash_1.default.compact(strippedAllFirstMatchCaps.map(
210
+ /**
211
+ * @param {import('@appium/types').Capabilities<C>} firstMatchCaps
212
+ */
213
+ (firstMatchCaps) => {
214
+ try {
215
+ // Validate firstMatch caps
216
+ return shouldValidateCaps
217
+ ? validateCaps(firstMatchCaps, filteredConstraints)
218
+ : firstMatchCaps;
219
+ }
220
+ catch (e) {
221
+ validationErrors.push(e.message);
222
+ }
223
+ }));
224
+ // Try to merge requiredCaps with first match capabilities, break once it finds its first match (see spec #6)
225
+ let matchedCaps = null;
226
+ for (let firstMatchCaps of validatedFirstMatchCaps) {
227
+ try {
228
+ matchedCaps = mergeCaps(strippedRequiredCaps, firstMatchCaps);
229
+ if (matchedCaps) {
230
+ break;
231
+ }
232
+ }
233
+ catch (err) {
234
+ logger_1.default.warn(err.message);
235
+ validationErrors.push(err.message);
236
+ }
237
+ }
238
+ // Returns variables for testing purposes
239
+ return {
240
+ requiredCaps,
241
+ allFirstMatchCaps,
242
+ validatedFirstMatchCaps,
243
+ matchedCaps,
244
+ validationErrors,
245
+ };
207
246
  }
208
-
209
- function processCapabilities(w3cCaps, constraints = {}, shouldValidateCaps = true) {
210
- const {
211
- matchedCaps,
212
- validationErrors
213
- } = parseCaps(w3cCaps, constraints, shouldValidateCaps);
214
-
215
- if (!_support.util.hasValue(matchedCaps)) {
216
- if (_lodash.default.isArray(w3cCaps.firstMatch) && w3cCaps.firstMatch.length > 1) {
217
- throw new _errors.errors.InvalidArgumentError(`Could not find matching capabilities from ${JSON.stringify(w3cCaps)}:\n ${validationErrors.join('\n')}`);
218
- } else {
219
- throw new _errors.errors.InvalidArgumentError(validationErrors[0]);
220
- }
221
- }
222
-
223
- return matchedCaps ?? {};
247
+ exports.parseCaps = parseCaps;
248
+ // Calls parseCaps and just returns the matchedCaps variable
249
+ /**
250
+ * @template {Constraints} C
251
+ * @param {import('@appium/types').W3CCapabilities<C>} w3cCaps
252
+ * @param {C} [constraints]
253
+ * @param {boolean} [shouldValidateCaps]
254
+ * @returns {import('@appium/types').Capabilities<C>}
255
+ */
256
+ function processCapabilities(w3cCaps, constraints = /** @type {C} */ ({}), shouldValidateCaps = true) {
257
+ const { matchedCaps, validationErrors } = parseCaps(w3cCaps, constraints, shouldValidateCaps);
258
+ // If we found an error throw an exception
259
+ if (!support_1.util.hasValue(matchedCaps)) {
260
+ if (lodash_1.default.isArray(w3cCaps.firstMatch) && w3cCaps.firstMatch.length > 1) {
261
+ // If there was more than one 'firstMatch' cap, indicate that we couldn't find a matching capabilities set and show all the errors
262
+ throw new errors_1.errors.InvalidArgumentError(`Could not find matching capabilities from ${JSON.stringify(w3cCaps)}:\n ${validationErrors.join('\n')}`);
263
+ }
264
+ else {
265
+ // Otherwise, just show the singular error message
266
+ throw new errors_1.errors.InvalidArgumentError(validationErrors[0]);
267
+ }
268
+ }
269
+ return /** @type {Capabilities<C>} */ (matchedCaps ?? {});
224
270
  }
225
-
271
+ exports.processCapabilities = processCapabilities;
272
+ /**
273
+ * Return a copy of a capabilities object which has taken everything within the 'options'
274
+ * capability and promoted it to the top level.
275
+ *
276
+ * @template {Constraints} C
277
+ * @param {import('@appium/types').W3CCapabilities<C>} originalCaps
278
+ * @return {import('@appium/types').W3CCapabilities<C>} the capabilities with 'options' promoted if necessary
279
+ */
226
280
  function promoteAppiumOptions(originalCaps) {
227
- const appiumOptions = originalCaps[APPIUM_OPTS_CAP];
228
-
229
- if (!appiumOptions) {
230
- return originalCaps;
231
- }
232
-
233
- let caps = _lodash.default.cloneDeep(originalCaps);
234
-
235
- if (!_lodash.default.isPlainObject(appiumOptions)) {
236
- throw new _errors.errors.SessionNotCreatedError(`The ${APPIUM_OPTS_CAP} capability must be an object`);
237
- }
238
-
239
- const strippedAppiumOptions = stripAppiumPrefixes(appiumOptions);
240
-
241
- const overwrittenKeys = _lodash.default.intersection(Object.keys(caps), Object.keys(strippedAppiumOptions));
242
-
243
- if (overwrittenKeys.length > 0) {
244
- _logger.default.warn(`Found capabilities inside ${PREFIXED_APPIUM_OPTS_CAP} that will overwrite ` + `capabilities at the top level: ${JSON.stringify(overwrittenKeys)}`);
245
- }
246
-
247
- caps = { ...caps,
248
- ...strippedAppiumOptions
249
- };
250
- delete caps[APPIUM_OPTS_CAP];
251
- return caps;
281
+ const promoteForObject = (obj) => {
282
+ const appiumOptions = obj[PREFIXED_APPIUM_OPTS_CAP];
283
+ if (!appiumOptions) {
284
+ return obj;
285
+ }
286
+ if (!lodash_1.default.isPlainObject(appiumOptions)) {
287
+ throw new errors_1.errors.SessionNotCreatedError(`The ${PREFIXED_APPIUM_OPTS_CAP} capability must be an object`);
288
+ }
289
+ if (lodash_1.default.isEmpty(appiumOptions)) {
290
+ return obj;
291
+ }
292
+ logger_1.default.debug(`Found ${PREFIXED_APPIUM_OPTS_CAP} capability present; will promote items inside to caps`);
293
+ /**
294
+ * @param {string} capName
295
+ */
296
+ const shouldAddVendorPrefix = (capName) => !capName.startsWith(APPIUM_VENDOR_PREFIX);
297
+ const verifyIfAcceptable = (capName) => {
298
+ if (!lodash_1.default.isString(capName)) {
299
+ throw new errors_1.errors.SessionNotCreatedError(`Capability names in ${PREFIXED_APPIUM_OPTS_CAP} must be strings. '${capName}' is unexpected`);
300
+ }
301
+ if (isStandardCap(capName)) {
302
+ throw new errors_1.errors.SessionNotCreatedError(`${PREFIXED_APPIUM_OPTS_CAP} must only contain vendor-specific capabilties. '${capName}' is unexpected`);
303
+ }
304
+ return capName;
305
+ };
306
+ const preprocessedOptions = (0, lodash_1.default)(appiumOptions)
307
+ .mapKeys((value, key) => verifyIfAcceptable(key))
308
+ .mapKeys((value, key) => shouldAddVendorPrefix(key) ? `${APPIUM_VENDOR_PREFIX}${key}` : key)
309
+ .value();
310
+ // warn if we are going to overwrite any keys on the base caps object
311
+ const overwrittenKeys = lodash_1.default.intersection(Object.keys(obj), Object.keys(preprocessedOptions));
312
+ if (overwrittenKeys.length > 0) {
313
+ logger_1.default.warn(`Found capabilities inside ${PREFIXED_APPIUM_OPTS_CAP} that will overwrite ` +
314
+ `capabilities at the top level: ${JSON.stringify(overwrittenKeys)}`);
315
+ }
316
+ return lodash_1.default.cloneDeep({
317
+ ...(lodash_1.default.omit(obj, PREFIXED_APPIUM_OPTS_CAP)),
318
+ ...preprocessedOptions
319
+ });
320
+ };
321
+ const { alwaysMatch, firstMatch } = originalCaps;
322
+ const result = {};
323
+ if (lodash_1.default.isPlainObject(alwaysMatch)) {
324
+ result.alwaysMatch = promoteForObject(alwaysMatch);
325
+ }
326
+ else if ('alwaysMatch' in originalCaps) {
327
+ result.alwaysMatch = alwaysMatch;
328
+ }
329
+ if (lodash_1.default.isArray(firstMatch)) {
330
+ result.firstMatch = firstMatch.map(promoteForObject);
331
+ }
332
+ else if ('firstMatch' in originalCaps) {
333
+ result.firstMatch = firstMatch;
334
+ }
335
+ return result;
252
336
  }
253
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBJVU1fVkVORE9SX1BSRUZJWCIsIkFQUElVTV9PUFRTX0NBUCIsIlBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCIsIm1lcmdlQ2FwcyIsInByaW1hcnkiLCJzZWNvbmRhcnkiLCJyZXN1bHQiLCJuYW1lIiwidmFsdWUiLCJfIiwidG9QYWlycyIsImlzVW5kZWZpbmVkIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsaWRhdGVDYXBzIiwiY2FwcyIsImNvbnN0cmFpbnRzIiwib3B0cyIsInNraXBQcmVzZW5jZUNvbnN0cmFpbnQiLCJpc1BsYWluT2JqZWN0IiwibWFwVmFsdWVzIiwiY29uc3RyYWludCIsIm9taXQiLCJwcmVzZW5jZSIsImFsbG93RW1wdHkiLCJ2YWxpZGF0aW9uRXJyb3JzIiwidmFsaWRhdG9yIiwidmFsaWRhdGUiLCJwaWNrQnkiLCJ1dGlsIiwiaGFzVmFsdWUiLCJmdWxsTWVzc2FnZXMiLCJtZXNzYWdlIiwiYXR0cmlidXRlIiwicmVhc29ucyIsInJlYXNvbiIsInB1c2giLCJqb2luIiwiU1RBTkRBUkRfQ0FQUyIsIk9iamVjdCIsImZyZWV6ZSIsIlNldCIsIlNUQU5EQVJEX0NBUFNfTE9XRVIiLCJtYXAiLCJjYXAiLCJ0b0xvd2VyQ2FzZSIsImlzU3RhbmRhcmRDYXAiLCJoYXMiLCJzdHJpcEFwcGl1bVByZWZpeGVzIiwicHJlZml4ZWRDYXBzIiwibm9uUHJlZml4ZWRDYXBzIiwicGFydGl0aW9uIiwia2V5cyIsIlN0cmluZyIsInN0YXJ0c1dpdGgiLCJzdHJpcHBlZENhcHMiLCJwaWNrIiwiYmFkUHJlZml4ZWRDYXBzIiwicHJlZml4ZWRDYXAiLCJzdHJpcHBlZENhcE5hbWUiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJpc05pbCIsImxvZyIsIndhcm4iLCJmaW5kTm9uUHJlZml4ZWRDYXBzIiwiYWx3YXlzTWF0Y2giLCJmaXJzdE1hdGNoIiwiY2hhaW4iLCJyZWR1Y2UiLCJ1bnByZWZpeGVkQ2FwcyIsImZpbHRlciIsImluY2x1ZGVzIiwidW5pcSIsInBhcnNlQ2FwcyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInJlcXVpcmVkQ2FwcyIsImFsbEZpcnN0TWF0Y2hDYXBzIiwiaXNBcnJheSIsImlzRW1wdHkiLCJzdHJpcHBlZFJlcXVpcmVkQ2FwcyIsInN0cmlwcGVkQWxsRmlyc3RNYXRjaENhcHMiLCJmaWx0ZXJlZENvbnN0cmFpbnRzIiwib21pdEJ5Iiwia2V5IiwidmFsaWRhdGVkRmlyc3RNYXRjaENhcHMiLCJjb21wYWN0IiwiZmlyc3RNYXRjaENhcHMiLCJlIiwibWF0Y2hlZENhcHMiLCJlcnIiLCJwcm9jZXNzQ2FwYWJpbGl0aWVzIiwidzNjQ2FwcyIsInByb21vdGVBcHBpdW1PcHRpb25zIiwib3JpZ2luYWxDYXBzIiwiYXBwaXVtT3B0aW9ucyIsImNsb25lRGVlcCIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJzdHJpcHBlZEFwcGl1bU9wdGlvbnMiLCJvdmVyd3JpdHRlbktleXMiLCJpbnRlcnNlY3Rpb24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvYmFzZWRyaXZlci9jYXBhYmlsaXRpZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge3ZhbGlkYXRvcn0gZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHt1dGlsfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge2Vycm9yc30gZnJvbSAnLi4vcHJvdG9jb2wvZXJyb3JzJztcblxuY29uc3QgQVBQSVVNX1ZFTkRPUl9QUkVGSVggPSAnYXBwaXVtOic7XG5jb25zdCBBUFBJVU1fT1BUU19DQVAgPSAnb3B0aW9ucyc7XG5jb25zdCBQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVAgPSBgJHtBUFBJVU1fVkVORE9SX1BSRUZJWH0ke0FQUElVTV9PUFRTX0NBUH1gO1xuXG4vKipcbiAqIFRha2VzIHByaW1hcnkgY2FwcyBvYmplY3QgYW5kIG1lcmdlcyBpdCBpbnRvIGEgc2Vjb25kYXJ5IGNhcHMgb2JqZWN0LlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW1Q9e31dXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBbVT17fV1cbiAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzPFQ+fSBbcHJpbWFyeV1cbiAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzPFU+fSBbc2Vjb25kYXJ5XVxuICogQHJldHVybnMge2ltcG9ydCgndHlwZS1mZXN0JykuTWVyZ2U8Q2FwYWJpbGl0aWVzPFQ+LCBDYXBhYmlsaXRpZXM8VT4+fVxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNkZm4tbWVyZ2luZy1jYXBhYmlsaXRpZXMpXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQ2FwcyhwcmltYXJ5ID0ge30sIHNlY29uZGFyeSA9IHt9KSB7XG4gIGxldCByZXN1bHQgPSAvKiogQHR5cGUge2ltcG9ydCgndHlwZS1mZXN0JykuTWVyZ2U8Q2FwYWJpbGl0aWVzPFQ+LCBDYXBhYmlsaXRpZXM8VT4+fSAqLyAoe1xuICAgIC4uLnByaW1hcnksXG4gIH0pO1xuXG4gIGZvciAobGV0IFtuYW1lLCB2YWx1ZV0gb2YgLyoqIEB0eXBlIHtba2V5b2YgdHlwZW9mIHNlY29uZGFyeSwgYW55XX0gKi8gKF8udG9QYWlycyhzZWNvbmRhcnkpKSkge1xuICAgIC8vIE92ZXJ3cml0aW5nIGlzIG5vdCBhbGxvd2VkLiBQcmltYXJ5IGFuZCBzZWNvbmRhcnkgbXVzdCBoYXZlIGRpZmZlcmVudCBwcm9wZXJ0aWVzICh3M2MgcnVsZSA0LjQpXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHByaW1hcnlbbmFtZV0pKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICBgcHJvcGVydHkgJyR7bmFtZX0nIHNob3VsZCBub3QgZXhpc3Qgb24gYm90aCBwcmltYXJ5ICgke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHByaW1hcnlcbiAgICAgICAgKX0pIGFuZCBzZWNvbmRhcnkgKCR7SlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5KX0pIG9iamVjdGBcbiAgICAgICk7XG4gICAgfVxuICAgIHJlc3VsdFsvKiogQHR5cGUge2tleW9mIHR5cGVvZiByZXN1bHR9ICovIChuYW1lKV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFZhbGlkYXRlcyBjYXBzIGFnYWluc3QgYSBzZXQgb2YgY29uc3RyYWludHNcbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9e31dXG4gKiBAcGFyYW0ge0NhcGFiaWxpdGllczxDPn0gY2Fwc1xuICogQHBhcmFtIHtDfSBbY29uc3RyYWludHNdXG4gKiBAcGFyYW0ge1ZhbGlkYXRlQ2Fwc09wdHN9IFtvcHRzXVxuICogQHJldHVybnMge0NhcGFiaWxpdGllczxDPn1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDYXBzKGNhcHMsIGNvbnN0cmFpbnRzID0gLyoqIEB0eXBlIHtDfSAqLyAoe30pLCBvcHRzID0ge30pIHtcbiAgbGV0IHtza2lwUHJlc2VuY2VDb25zdHJhaW50fSA9IG9wdHM7XG5cbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoY2FwcykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBtdXN0IGJlIGEgSlNPTiBvYmplY3RgKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgJ3ByZXNlbmNlJyBjb25zdHJhaW50IGlmIHdlJ3JlIG5vdCBjaGVja2luZyBmb3IgaXRcbiAgY29uc3RyYWludHMgPSAvKiogQHR5cGUge0N9ICovIChcbiAgICBfLm1hcFZhbHVlcyhcbiAgICAgIGNvbnN0cmFpbnRzLFxuICAgICAgc2tpcFByZXNlbmNlQ29uc3RyYWludFxuICAgICAgICA/IC8qKiBAcGFyYW0ge0NvbnN0cmFpbnR9IGNvbnN0cmFpbnQgKi9cbiAgICAgICAgICAoY29uc3RyYWludCkgPT4gXy5vbWl0KGNvbnN0cmFpbnQsICdwcmVzZW5jZScpXG4gICAgICAgIDogLyoqIEBwYXJhbSB7Q29uc3RyYWludH0gY29uc3RyYWludCAqL1xuICAgICAgICAgIChjb25zdHJhaW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5wcmVzZW5jZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gey4uLl8ub21pdChjb25zdHJhaW50LCAncHJlc2VuY2UnKSwgcHJlc2VuY2U6IHthbGxvd0VtcHR5OiBmYWxzZX19O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnQ7XG4gICAgICAgICAgfVxuICAgIClcbiAgKTtcblxuICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdG9yLnZhbGlkYXRlKF8ucGlja0J5KGNhcHMsIHV0aWwuaGFzVmFsdWUpLCBjb25zdHJhaW50cywge1xuICAgIGZ1bGxNZXNzYWdlczogZmFsc2UsXG4gIH0pO1xuXG4gIGlmICh2YWxpZGF0aW9uRXJyb3JzKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSBbXTtcbiAgICBmb3IgKGxldCBbYXR0cmlidXRlLCByZWFzb25zXSBvZiBfLnRvUGFpcnModmFsaWRhdGlvbkVycm9ycykpIHtcbiAgICAgIGZvciAobGV0IHJlYXNvbiBvZiByZWFzb25zKSB7XG4gICAgICAgIG1lc3NhZ2UucHVzaChgJyR7YXR0cmlidXRlfScgJHtyZWFzb259YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IobWVzc2FnZS5qb2luKCc7ICcpKTtcbiAgfVxuXG4gIC8vIFJldHVybiBjYXBzXG4gIHJldHVybiBjYXBzO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkLCBub24tcHJlZml4ZWQgY2FwYWJpbGl0aWVzXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi10YWJsZS1vZi1zdGFuZGFyZC1jYXBhYmlsaXRpZXMpXG4gKi9cbmV4cG9ydCBjb25zdCBTVEFOREFSRF9DQVBTID0gT2JqZWN0LmZyZWV6ZShcbiAgbmV3IFNldChcbiAgICAvKiogQHR5cGUge2ltcG9ydCgndHlwZS1mZXN0JykuU3RyaW5nS2V5T2Y8aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU3RhbmRhcmRDYXBhYmlsaXRpZXM+W119ICovIChbXG4gICAgICAnYnJvd3Nlck5hbWUnLFxuICAgICAgJ2Jyb3dzZXJWZXJzaW9uJyxcbiAgICAgICdwbGF0Zm9ybU5hbWUnLFxuICAgICAgJ2FjY2VwdEluc2VjdXJlQ2VydHMnLFxuICAgICAgJ3BhZ2VMb2FkU3RyYXRlZ3knLFxuICAgICAgJ3Byb3h5JyxcbiAgICAgICdzZXRXaW5kb3dSZWN0JyxcbiAgICAgICd0aW1lb3V0cycsXG4gICAgICAndW5oYW5kbGVkUHJvbXB0QmVoYXZpb3InLFxuICAgIF0pXG4gIClcbik7XG5cbmNvbnN0IFNUQU5EQVJEX0NBUFNfTE9XRVIgPSBuZXcgU2V0KFsuLi5TVEFOREFSRF9DQVBTXS5tYXAoKGNhcCkgPT4gY2FwLnRvTG93ZXJDYXNlKCkpKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2FwXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTdGFuZGFyZENhcChjYXApIHtcbiAgcmV0dXJuIFNUQU5EQVJEX0NBUFNfTE9XRVIuaGFzKGNhcC50b0xvd2VyQ2FzZSgpKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgJ2FwcGl1bTonIHByZWZpeCB3YXMgcHJvdmlkZWQgYW5kIGl0J3MgYSB2YWxpZCBjYXBhYmlsaXR5LCBzdHJpcCBvdXQgdGhlIHByZWZpeFxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9e31dXG4gKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLk5TQ2FwYWJpbGl0aWVzPEM+fSBjYXBzXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi1leHRlbnNpb24tY2FwYWJpbGl0aWVzXG4gKiBAaW50ZXJuYWxcbiAqIEByZXR1cm5zIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59XG4gKi9cbmZ1bmN0aW9uIHN0cmlwQXBwaXVtUHJlZml4ZXMoY2Fwcykge1xuICAvLyBzcGxpdCBpbnRvIHByZWZpeGVkIGFuZCBub24tcHJlZml4ZWQuXG4gIC8vIG5vbi1wcmVmaXhlZCBzaG91bGQgYmUgc3RhbmRhcmQgY2FwcyBhdCB0aGlzIHBvaW50XG4gIGNvbnN0IFtwcmVmaXhlZENhcHMsIG5vblByZWZpeGVkQ2Fwc10gPSBfLnBhcnRpdGlvbihfLmtleXMoY2FwcyksIChjYXApID0+XG4gICAgU3RyaW5nKGNhcCkuc3RhcnRzV2l0aChBUFBJVU1fVkVORE9SX1BSRUZJWClcbiAgKTtcblxuICAvLyBpbml0aWFsaXplIHRoaXMgd2l0aCB0aGUgay92IHBhaXJzIG9mIHRoZSBub24tcHJlZml4ZWQgY2Fwc1xuICBsZXQgc3RyaXBwZWRDYXBzID0gLyoqIEB0eXBlIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59ICovIChcbiAgICBfLnBpY2soY2Fwcywgbm9uUHJlZml4ZWRDYXBzKVxuICApO1xuICBjb25zdCBiYWRQcmVmaXhlZENhcHMgPSBbXTtcblxuICAvLyBTdHJpcCBvdXQgdGhlICdhcHBpdW06JyBwcmVmaXhcbiAgZm9yIChsZXQgcHJlZml4ZWRDYXAgb2YgcHJlZml4ZWRDYXBzKSB7XG4gICAgY29uc3Qgc3RyaXBwZWRDYXBOYW1lID1cbiAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KCd0eXBlLWZlc3QnKS5TdHJpbmdLZXlPZjxpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz4+fSAqLyAoXG4gICAgICAgIHByZWZpeGVkQ2FwLnN1YnN0cmluZyhBUFBJVU1fVkVORE9SX1BSRUZJWC5sZW5ndGgpXG4gICAgICApO1xuXG4gICAgLy8gSWYgaXQncyBzdGFuZGFyZCBjYXBhYmlsaXR5IHRoYXQgd2FzIHByZWZpeGVkLCBhZGQgaXQgdG8gYW4gYXJyYXkgb2YgaW5jb3JyZWN0bHkgcHJlZml4ZWQgY2FwYWJpbGl0aWVzXG4gICAgaWYgKGlzU3RhbmRhcmRDYXAoc3RyaXBwZWRDYXBOYW1lKSkge1xuICAgICAgYmFkUHJlZml4ZWRDYXBzLnB1c2goc3RyaXBwZWRDYXBOYW1lKTtcbiAgICAgIGlmIChfLmlzTmlsKHN0cmlwcGVkQ2Fwc1tzdHJpcHBlZENhcE5hbWVdKSkge1xuICAgICAgICBzdHJpcHBlZENhcHNbc3RyaXBwZWRDYXBOYW1lXSA9IGNhcHNbcHJlZml4ZWRDYXBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgYElnbm9yaW5nIGNhcGFiaWxpdHkgJyR7cHJlZml4ZWRDYXB9PSR7Y2Fwc1twcmVmaXhlZENhcF19JyBhbmQgYCArXG4gICAgICAgICAgICBgdXNpbmcgY2FwYWJpbGl0eSAnJHtzdHJpcHBlZENhcE5hbWV9PSR7c3RyaXBwZWRDYXBzW3N0cmlwcGVkQ2FwTmFtZV19J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyaXBwZWRDYXBzW3N0cmlwcGVkQ2FwTmFtZV0gPSBjYXBzW3ByZWZpeGVkQ2FwXTtcbiAgICB9XG4gIH1cblxuICAvLyBJZiB3ZSBmb3VuZCBzdGFuZGFyZCBjYXBzIHRoYXQgd2VyZSBpbmNvcnJlY3RseSBwcmVmaXhlZCwgdGhyb3cgYW4gZXhjZXB0aW9uIChlLmcuOiBkb24ndCBhY2NlcHQgJ2FwcGl1bTpwbGF0Zm9ybU5hbWUnLCBvbmx5IGFjY2VwdCBqdXN0ICdwbGF0Zm9ybU5hbWUnKVxuICBpZiAoYmFkUHJlZml4ZWRDYXBzLmxlbmd0aCA+IDApIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBUaGUgY2FwYWJpbGl0aWVzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGJhZFByZWZpeGVkQ2Fwc1xuICAgICAgKX0gYXJlIHN0YW5kYXJkIGNhcGFiaWxpdGllcyBhbmQgZG8gbm90IHJlcXVpcmUgXCJhcHBpdW06XCIgcHJlZml4YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHN0cmlwcGVkQ2Fwcztcbn1cblxuLyoqXG4gKiBHZXQgYW4gYXJyYXkgb2YgYWxsIHRoZSB1bnByZWZpeGVkIGNhcHMgdGhhdCBhcmUgYmVpbmcgdXNlZCBpbiAnYWx3YXlzTWF0Y2gnIGFuZCBhbGwgb2YgdGhlICdmaXJzdE1hdGNoJyBvYmplY3RcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPXt9XVxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXM8Qz59IGNhcHMgQSBjYXBhYmlsaXRpZXMgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGZpbmROb25QcmVmaXhlZENhcHMoe2Fsd2F5c01hdGNoID0ge30sIGZpcnN0TWF0Y2ggPSBbXX0pIHtcbiAgcmV0dXJuIF8uY2hhaW4oW2Fsd2F5c01hdGNoLCAuLi5maXJzdE1hdGNoXSlcbiAgICAucmVkdWNlKFxuICAgICAgKHVucHJlZml4ZWRDYXBzLCBjYXBzKSA9PiBbXG4gICAgICAgIC4uLnVucHJlZml4ZWRDYXBzLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhjYXBzKS5maWx0ZXIoKGNhcCkgPT4gIWNhcC5pbmNsdWRlcygnOicpICYmICFpc1N0YW5kYXJkQ2FwKGNhcCkpLFxuICAgICAgXSxcbiAgICAgIFtdXG4gICAgKVxuICAgIC51bmlxKClcbiAgICAudmFsdWUoKTtcbn1cblxuLyoqXG4gKiBQYXJzZSBjYXBhYmlsaXRpZXNcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPXt9XVxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXM8Qz59IGNhcHNcbiAqIEBwYXJhbSB7Q30gW2NvbnN0cmFpbnRzXVxuICogQHBhcmFtIHtib29sZWFufSBbc2hvdWxkVmFsaWRhdGVDYXBzXVxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNwcm9jZXNzaW5nLWNhcGFiaWxpdGllc1xuICovXG5mdW5jdGlvbiBwYXJzZUNhcHMoY2FwcywgY29uc3RyYWludHMgPSAvKiogQHR5cGUge0N9ICovICh7fSksIHNob3VsZFZhbGlkYXRlQ2FwcyA9IHRydWUpIHtcbiAgLy8gSWYgY2FwYWJpbGl0aWVzIHJlcXVlc3QgaXMgbm90IGFuIG9iamVjdCwgcmV0dXJuIGVycm9yICgjMS4xKVxuICBpZiAoIV8uaXNQbGFpbk9iamVjdChjYXBzKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAnVGhlIGNhcGFiaWxpdGllcyBhcmd1bWVudCB3YXMgbm90IHZhbGlkIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbihzKTogXCJjYXBhYmlsaXRpZXNcIiBtdXN0IGJlIGEgSlNPTiBvYmplY3QuJ1xuICAgICk7XG4gIH1cblxuICAvLyBMZXQgJ3JlcXVpcmVkQ2FwcycgYmUgcHJvcGVydHkgbmFtZWQgJ2Fsd2F5c01hdGNoJyBmcm9tIGNhcGFiaWxpdGllcyByZXF1ZXN0ICgjMilcbiAgLy8gYW5kICdhbGxGaXJzdE1hdGNoQ2FwcycgYmUgcHJvcGVydHkgbmFtZWQgJ2ZpcnN0TWF0Y2gnIGZyb20gY2FwYWJpbGl0aWVzIHJlcXVlc3QgKCMzKVxuICBsZXQge1xuICAgIGFsd2F5c01hdGNoOiByZXF1aXJlZENhcHMgPSB7fSwgLy8gSWYgJ3JlcXVpcmVkQ2FwcycgaXMgdW5kZWZpbmVkLCBzZXQgaXQgdG8gYW4gZW1wdHkgSlNPTiBvYmplY3QgKCMyLjEpXG4gICAgZmlyc3RNYXRjaDogYWxsRmlyc3RNYXRjaENhcHMgPSBbe31dLCAvLyBJZiAnZmlyc3RNYXRjaCcgaXMgdW5kZWZpbmVkIHNldCBpdCB0byBhIHNpbmdsZXRvbiBsaXN0IHdpdGggb25lIGVtcHR5IG9iamVjdCAoIzMuMSlcbiAgfSA9IGNhcHM7XG5cbiAgLy8gUmVqZWN0ICdmaXJzdE1hdGNoJyBhcmd1bWVudCBpZiBpdCdzIG5vdCBhbiBhcnJheSAoIzMuMilcbiAgaWYgKCFfLmlzQXJyYXkoYWxsRmlyc3RNYXRjaENhcHMpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICdUaGUgY2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2ggYXJndW1lbnQgd2FzIG5vdCB2YWxpZCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb24ocyk6IFwiY2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2hcIiBtdXN0IGJlIGEgSlNPTiBhcnJheSBvciB1bmRlZmluZWQnXG4gICAgKTtcbiAgfVxuXG4gIC8vIElmIGFuIGVtcHR5IGFycmF5IGFzIHByb3ZpZGVkLCB3ZSdsbCBiZSBmb3JnaXZpbmcgYW5kIG1ha2UgaXQgYW4gYXJyYXkgb2Ygb25lIGVtcHR5IG9iamVjdFxuICAvLyBJbiB0aGUgZnV0dXJlLCByZWplY3QgJ2ZpcnN0TWF0Y2gnIGFyZ3VtZW50IGlmIGl0cyBhcnJheSBkaWQgbm90IGhhdmUgb25lIG9yIG1vcmUgZW50cmllcyAoIzMuMilcbiAgaWYgKGFsbEZpcnN0TWF0Y2hDYXBzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYFRoZSBmaXJzdE1hdGNoIGFycmF5IGluIHRoZSBnaXZlbiBjYXBhYmlsaXRpZXMgaGFzIG5vIGVudHJpZXMuIEFkZGluZyBhbiBlbXB0eSBlbnRyeSBmbyBybm93LCBgICtcbiAgICAgICAgYGJ1dCBpdCB3aWxsIHJlcXVpcmUgb25lIG9yIG1vcmUgZW50cmllcyBhcyBXM0Mgc3BlYy5gXG4gICAgKTtcbiAgICBhbGxGaXJzdE1hdGNoQ2Fwcy5wdXNoKHt9KTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBub24tcHJlZml4ZWQsIG5vbi1zdGFuZGFyZCBjYXBhYmlsaXRpZXMgYW5kIGxvZyB3YXJuaW5ncyBpZiB0aGV5IGFyZSBmb3VuZFxuICBsZXQgbm9uUHJlZml4ZWRDYXBzID0gZmluZE5vblByZWZpeGVkQ2FwcyhjYXBzKTtcbiAgaWYgKCFfLmlzRW1wdHkobm9uUHJlZml4ZWRDYXBzKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICBgQWxsIG5vbi1zdGFuZGFyZCBjYXBhYmlsaXRpZXMgc2hvdWxkIGhhdmUgYSB2ZW5kb3IgcHJlZml4LiBUaGUgZm9sbG93aW5nIGNhcGFiaWxpdGllcyBkaWQgbm90IGhhdmUgb25lOiAke25vblByZWZpeGVkQ2Fwc31gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN0cmlwIG91dCB0aGUgJ2FwcGl1bTonIHByZWZpeCBmcm9tIGFsbFxuICBsZXQgc3RyaXBwZWRSZXF1aXJlZENhcHMgPSBzdHJpcEFwcGl1bVByZWZpeGVzKHJlcXVpcmVkQ2Fwcyk7XG4gIGxldCBzdHJpcHBlZEFsbEZpcnN0TWF0Y2hDYXBzID0gYWxsRmlyc3RNYXRjaENhcHMubWFwKHN0cmlwQXBwaXVtUHJlZml4ZXMpO1xuXG4gIC8vIFZhbGlkYXRlIHRoZSByZXF1aXJlZENhcHMuIEJ1dCBkb24ndCB2YWxpZGF0ZSAncHJlc2VuY2UnIGJlY2F1c2UgaWYgdGhhdCBjb25zdHJhaW50IGZhaWxzIG9uICdhbHdheXNNYXRjaCcgaXQgY291bGQgc3RpbGwgcGFzcyBvbiBvbmUgb2YgdGhlICdmaXJzdE1hdGNoJyBrZXlzXG4gIGlmIChzaG91bGRWYWxpZGF0ZUNhcHMpIHtcbiAgICBzdHJpcHBlZFJlcXVpcmVkQ2FwcyA9IHZhbGlkYXRlQ2FwcyhzdHJpcHBlZFJlcXVpcmVkQ2FwcywgY29uc3RyYWludHMsIHtcbiAgICAgIHNraXBQcmVzZW5jZUNvbnN0cmFpbnQ6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgLy8gUmVtb3ZlIHRoZSAncHJlc2VuY2UnIGNvbnN0cmFpbnQgZm9yIGFueSBrZXlzIHRoYXQgYXJlIGFscmVhZHkgcHJlc2VudCBpbiAncmVxdWlyZWRDYXBzJ1xuICAvLyBzaW5jZSB3ZSBrbm93IHRoYXQgdGhpcyBjb25zdHJhaW50IGhhcyBhbHJlYWR5IHBhc3NlZFxuICBjb25zdCBmaWx0ZXJlZENvbnN0cmFpbnRzID0gLyoqIEB0eXBlIHtDfSAqLyAoXG4gICAgXy5vbWl0QnkoY29uc3RyYWludHMsIChfLCBrZXkpID0+IGtleSBpbiBzdHJpcHBlZFJlcXVpcmVkQ2FwcylcbiAgKTtcblxuICAvLyBWYWxpZGF0ZSBhbGwgb2YgdGhlIGZpcnN0IG1hdGNoIGNhcGFiaWxpdGllcyBhbmQgcmV0dXJuIGFuIGFycmF5IHdpdGggb25seSB0aGUgdmFsaWQgY2FwcyAoc2VlIHNwZWMgIzUpXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGxldCB2YWxpZGF0aW9uRXJyb3JzID0gW107XG4gIGxldCB2YWxpZGF0ZWRGaXJzdE1hdGNoQ2FwcyA9IF8uY29tcGFjdChcbiAgICBzdHJpcHBlZEFsbEZpcnN0TWF0Y2hDYXBzLm1hcChcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59IGZpcnN0TWF0Y2hDYXBzXG4gICAgICAgKi9cbiAgICAgIChmaXJzdE1hdGNoQ2FwcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFZhbGlkYXRlIGZpcnN0TWF0Y2ggY2Fwc1xuICAgICAgICAgIHJldHVybiBzaG91bGRWYWxpZGF0ZUNhcHNcbiAgICAgICAgICAgID8gdmFsaWRhdGVDYXBzKGZpcnN0TWF0Y2hDYXBzLCBmaWx0ZXJlZENvbnN0cmFpbnRzKVxuICAgICAgICAgICAgOiBmaXJzdE1hdGNoQ2FwcztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMucHVzaChlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICApO1xuXG4gIC8vIFRyeSB0byBtZXJnZSByZXF1aXJlZENhcHMgd2l0aCBmaXJzdCBtYXRjaCBjYXBhYmlsaXRpZXMsIGJyZWFrIG9uY2UgaXQgZmluZHMgaXRzIGZpcnN0IG1hdGNoIChzZWUgc3BlYyAjNilcbiAgbGV0IG1hdGNoZWRDYXBzID0gbnVsbDtcbiAgZm9yIChsZXQgZmlyc3RNYXRjaENhcHMgb2YgdmFsaWRhdGVkRmlyc3RNYXRjaENhcHMpIHtcbiAgICB0cnkge1xuICAgICAgbWF0Y2hlZENhcHMgPSBtZXJnZUNhcHMoc3RyaXBwZWRSZXF1aXJlZENhcHMsIGZpcnN0TWF0Y2hDYXBzKTtcbiAgICAgIGlmIChtYXRjaGVkQ2Fwcykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGVyci5tZXNzYWdlKTtcbiAgICAgIHZhbGlkYXRpb25FcnJvcnMucHVzaChlcnIubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyB2YXJpYWJsZXMgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgcmV0dXJuIHtcbiAgICByZXF1aXJlZENhcHMsXG4gICAgYWxsRmlyc3RNYXRjaENhcHMsXG4gICAgdmFsaWRhdGVkRmlyc3RNYXRjaENhcHMsXG4gICAgbWF0Y2hlZENhcHMsXG4gICAgdmFsaWRhdGlvbkVycm9ycyxcbiAgfTtcbn1cblxuLy8gQ2FsbHMgcGFyc2VDYXBzIGFuZCBqdXN0IHJldHVybnMgdGhlIG1hdGNoZWRDYXBzIHZhcmlhYmxlXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IENcbiAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVzNDQ2FwYWJpbGl0aWVzPEM+fSB3M2NDYXBzXG4gKiBAcGFyYW0ge0N9IFtjb25zdHJhaW50c11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Nob3VsZFZhbGlkYXRlQ2Fwc11cbiAqIEByZXR1cm5zIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8Qz59XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDYXBhYmlsaXRpZXMoXG4gIHczY0NhcHMsXG4gIGNvbnN0cmFpbnRzID0gLyoqIEB0eXBlIHtDfSAqLyAoe30pLFxuICBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlXG4pIHtcbiAgY29uc3Qge21hdGNoZWRDYXBzLCB2YWxpZGF0aW9uRXJyb3JzfSA9IHBhcnNlQ2Fwcyh3M2NDYXBzLCBjb25zdHJhaW50cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcblxuICAvLyBJZiB3ZSBmb3VuZCBhbiBlcnJvciB0aHJvdyBhbiBleGNlcHRpb25cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG1hdGNoZWRDYXBzKSkge1xuICAgIGlmIChfLmlzQXJyYXkodzNjQ2Fwcy5maXJzdE1hdGNoKSAmJiB3M2NDYXBzLmZpcnN0TWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgLy8gSWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgJ2ZpcnN0TWF0Y2gnIGNhcCwgaW5kaWNhdGUgdGhhdCB3ZSBjb3VsZG4ndCBmaW5kIGEgbWF0Y2hpbmcgY2FwYWJpbGl0aWVzIHNldCBhbmQgc2hvdyBhbGwgdGhlIGVycm9yc1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIGNhcGFiaWxpdGllcyBmcm9tICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgdzNjQ2Fwc1xuICAgICAgICApfTpcXG4gJHt2YWxpZGF0aW9uRXJyb3JzLmpvaW4oJ1xcbicpfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZSwganVzdCBzaG93IHRoZSBzaW5ndWxhciBlcnJvciBtZXNzYWdlXG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKHZhbGlkYXRpb25FcnJvcnNbMF0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge0NhcGFiaWxpdGllczxDPn0gKi8gKG1hdGNoZWRDYXBzID8/IHt9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBjb3B5IG9mIGEgY2FwYWJpbGl0aWVzIG9iamVjdCB3aGljaCBoYXMgdGFrZW4gZXZlcnl0aGluZyB3aXRoaW4gdGhlICdvcHRpb25zJ1xuICogY2FwYWJpbGl0eSBhbmQgcHJvbW90ZWQgaXQgdG8gdGhlIHRvcCBsZXZlbC4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBydW4gYWZ0ZXJcbiAqIGFsbCB2ZW5kb3IgcHJlZml4ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3RyaXBwZWQgZnJvbSB0aGUgdG9wIGxldmVsLiBTbyB3ZSBhcmUgZGVhbGluZyB3aXRoIGUuZy5cbiAqICdvcHRpb25zJyBhbmQgbm90ICdhcHBpdW06b3B0aW9ucycgYXQgdGhpcyBwb2ludC4gQW55IHByZWZpeGVzIF9pbnNpZGVfIHRoZSAnb3B0aW9ucycgY2FwYWJpbGl0eVxuICogd2lsbCB0aGVtc2VsdmVzIGJlIHN0cmlwcGVkLiBUaGlzIGlzIGRlc2lnbmVkIGFzIGFuIGludGVybmFsIGZ1bmN0aW9uLCBub3Qgb25lIHRvIG9wZXJhdGUgb25cbiAqIHVzZXItY29uc3RydWN0ZWQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcmlnaW5hbENhcHMgLSB0aGUgY2FwYWJpbGl0aWVzIHRvIGFuYWx5emUgYW5kIHByb21vdGUgZnJvbSAnb3B0aW9ucydcbiAqIEByZXR1cm4ge29iamVjdCF9IC0gdGhlIGNhcGFiaWxpdGllcyB3aXRoICdvcHRpb25zJyBwcm9tb3RlZCBpZiBuZWNlc3NhcnlcbiAqL1xuZnVuY3Rpb24gcHJvbW90ZUFwcGl1bU9wdGlvbnMob3JpZ2luYWxDYXBzKSB7XG4gIGNvbnN0IGFwcGl1bU9wdGlvbnMgPSBvcmlnaW5hbENhcHNbQVBQSVVNX09QVFNfQ0FQXTtcbiAgaWYgKCFhcHBpdW1PcHRpb25zKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsQ2FwcztcbiAgfVxuXG4gIGxldCBjYXBzID0gXy5jbG9uZURlZXAob3JpZ2luYWxDYXBzKTtcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoYXBwaXVtT3B0aW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoYFRoZSAke0FQUElVTV9PUFRTX0NBUH0gY2FwYWJpbGl0eSBtdXN0IGJlIGFuIG9iamVjdGApO1xuICB9XG5cbiAgLy8gZmlyc3QgZ2V0IHJpZCBvZiBhbnkgcHJlZml4ZXMgaW5zaWRlIGFwcGl1bTpvcHRpb25zXG4gIGNvbnN0IHN0cmlwcGVkQXBwaXVtT3B0aW9ucyA9IHN0cmlwQXBwaXVtUHJlZml4ZXMoYXBwaXVtT3B0aW9ucyk7XG4gIC8vIHdhcm4gaWYgd2UgYXJlIGdvaW5nIHRvIG92ZXJ3cml0ZSBhbnkga2V5cyBvbiB0aGUgYmFzZSBjYXBzIG9iamVjdFxuICBjb25zdCBvdmVyd3JpdHRlbktleXMgPSBfLmludGVyc2VjdGlvbihPYmplY3Qua2V5cyhjYXBzKSwgT2JqZWN0LmtleXMoc3RyaXBwZWRBcHBpdW1PcHRpb25zKSk7XG4gIGlmIChvdmVyd3JpdHRlbktleXMubGVuZ3RoID4gMCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYEZvdW5kIGNhcGFiaWxpdGllcyBpbnNpZGUgJHtQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVB9IHRoYXQgd2lsbCBvdmVyd3JpdGUgYCArXG4gICAgICAgIGBjYXBhYmlsaXRpZXMgYXQgdGhlIHRvcCBsZXZlbDogJHtKU09OLnN0cmluZ2lmeShvdmVyd3JpdHRlbktleXMpfWBcbiAgICApO1xuICB9XG5cbiAgLy8gbm93IGp1c3QgYXBwbHkgdGhlbSB0byB0aGUgbWFpbiBjYXBzIG9iamVjdFxuICBjYXBzID0gey4uLmNhcHMsIC4uLnN0cmlwcGVkQXBwaXVtT3B0aW9uc307XG5cbiAgLy8gYW5kIHJlbW92ZSBhbGwgdHJhY2VzIG9mIHRoZSBvcHRpb25zIGNhcFxuICBkZWxldGUgY2Fwc1tBUFBJVU1fT1BUU19DQVBdO1xuICByZXR1cm4gY2Fwcztcbn1cblxuZXhwb3J0IHtcbiAgcGFyc2VDYXBzLFxuICBwcm9jZXNzQ2FwYWJpbGl0aWVzLFxuICB2YWxpZGF0ZUNhcHMsXG4gIG1lcmdlQ2FwcyxcbiAgQVBQSVVNX1ZFTkRPUl9QUkVGSVgsXG4gIEFQUElVTV9PUFRTX0NBUCxcbiAgZmluZE5vblByZWZpeGVkQ2FwcyxcbiAgaXNTdGFuZGFyZENhcCxcbiAgc3RyaXBBcHBpdW1QcmVmaXhlcyxcbiAgcHJvbW90ZUFwcGl1bU9wdGlvbnMsXG4gIFBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCxcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzfSBDb25zdHJhaW50c1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnR9IENvbnN0cmFpbnRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TdHJpbmdSZWNvcmR9IFN0cmluZ1JlY29yZFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkJhc2VEcml2ZXJDYXBDb25zdHJhaW50c30gQmFzZURyaXZlckNhcENvbnN0cmFpbnRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBWYWxpZGF0ZUNhcHNPcHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtza2lwUHJlc2VuY2VDb25zdHJhaW50XSAtIGlmIHRydWUsIHNraXAgdGhlIHByZXNlbmNlIGNvbnN0cmFpbnRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLk5TQ2FwYWJpbGl0aWVzPEMsIEV4dHJhPn0gTlNDYXBhYmlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllczxDLCBFeHRyYT59IENhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9QmFzZURyaXZlckNhcENvbnN0cmFpbnRzXVxuICogQHRlbXBsYXRlIHtTdHJpbmdSZWNvcmR8dm9pZH0gW0V4dHJhPXZvaWRdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVzNDQ2FwYWJpbGl0aWVzPEMsIEV4dHJhPn0gVzNDQ2FwYWJpbGl0aWVzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLG9CQUFvQixHQUFHLFNBQTdCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxTQUF4Qjs7QUFDQSxNQUFNQyx3QkFBd0IsR0FBSSxHQUFFRixvQkFBcUIsR0FBRUMsZUFBZ0IsRUFBM0U7OztBQVdBLFNBQVNFLFNBQVQsQ0FBbUJDLE9BQU8sR0FBRyxFQUE3QixFQUFpQ0MsU0FBUyxHQUFHLEVBQTdDLEVBQWlEO0VBQy9DLElBQUlDLE1BQU0sR0FBK0UsRUFDdkYsR0FBR0Y7RUFEb0YsQ0FBekY7O0VBSUEsS0FBSyxJQUFJLENBQUNHLElBQUQsRUFBT0MsS0FBUCxDQUFULElBQXdFQyxlQUFBLENBQUVDLE9BQUYsQ0FBVUwsU0FBVixDQUF4RSxFQUErRjtJQUU3RixJQUFJLENBQUNJLGVBQUEsQ0FBRUUsV0FBRixDQUFjUCxPQUFPLENBQUNHLElBQUQsQ0FBckIsQ0FBTCxFQUFtQztNQUNqQyxNQUFNLElBQUlLLGNBQUEsQ0FBT0Msb0JBQVgsQ0FDSCxhQUFZTixJQUFLLHVDQUFzQ08sSUFBSSxDQUFDQyxTQUFMLENBQ3REWCxPQURzRCxDQUV0RCxvQkFBbUJVLElBQUksQ0FBQ0MsU0FBTCxDQUFlVixTQUFmLENBQTBCLFVBSDNDLENBQU47SUFLRDs7SUFDREMsTUFBTSxDQUFxQ0MsSUFBckMsQ0FBTixHQUFvREMsS0FBcEQ7RUFD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
337
+ exports.promoteAppiumOptions = promoteAppiumOptions;
338
+ /**
339
+ * @typedef {import('@appium/types').Constraints} Constraints
340
+ * @typedef {import('@appium/types').Constraint} Constraint
341
+ * @typedef {import('@appium/types').StringRecord} StringRecord
342
+ * @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints
343
+ */
344
+ /**
345
+ * @typedef ValidateCapsOpts
346
+ * @property {boolean} [skipPresenceConstraint] - if true, skip the presence constraint
347
+ */
348
+ /**
349
+ * @template {Constraints} [C=BaseDriverCapConstraints]
350
+ * @template {StringRecord|void} [Extra=void]
351
+ * @typedef {import('@appium/types').NSCapabilities<C, Extra>} NSCapabilities
352
+ */
353
+ /**
354
+ * @template {Constraints} [C=BaseDriverCapConstraints]
355
+ * @template {StringRecord|void} [Extra=void]
356
+ * @typedef {import('@appium/types').Capabilities<C, Extra>} Capabilities
357
+ */
358
+ /**
359
+ * @template {Constraints} [C=BaseDriverCapConstraints]
360
+ * @template {StringRecord|void} [Extra=void]
361
+ * @typedef {import('@appium/types').W3CCapabilities<C, Extra>} W3CCapabilities
362
+ */
363
+ /**
364
+ * @template T,U
365
+ * @typedef {import('type-fest').Merge<T,U>} Merge
366
+ */
367
+ /**
368
+ * @template T
369
+ * @typedef {import('type-fest').StringKeyOf<T>} StringKeyOf
370
+ */
371
+ //# sourceMappingURL=capabilities.js.map