@appium/support 2.61.1 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/build/lib/console.d.ts +1 -1
  2. package/build/lib/console.js +169 -105
  3. package/build/lib/console.js.map +1 -1
  4. package/build/lib/env.d.ts.map +1 -1
  5. package/build/lib/env.js +144 -117
  6. package/build/lib/env.js.map +1 -1
  7. package/build/lib/fs.d.ts +9 -2
  8. package/build/lib/fs.d.ts.map +1 -1
  9. package/build/lib/fs.js +358 -246
  10. package/build/lib/fs.js.map +1 -1
  11. package/build/lib/image-util.js +139 -124
  12. package/build/lib/image-util.js.map +1 -1
  13. package/build/lib/index.js +64 -103
  14. package/build/lib/index.js.map +1 -1
  15. package/build/lib/log-internal.d.ts +4 -27
  16. package/build/lib/log-internal.d.ts.map +1 -1
  17. package/build/lib/log-internal.js +141 -123
  18. package/build/lib/log-internal.js.map +1 -1
  19. package/build/lib/logger.d.ts +1 -1
  20. package/build/lib/logger.d.ts.map +1 -1
  21. package/build/lib/logger.js +5 -14
  22. package/build/lib/logger.js.map +1 -1
  23. package/build/lib/logging.d.ts +3 -4
  24. package/build/lib/logging.d.ts.map +1 -1
  25. package/build/lib/logging.js +139 -110
  26. package/build/lib/logging.js.map +1 -1
  27. package/build/lib/mjpeg.js +169 -141
  28. package/build/lib/mjpeg.js.map +1 -1
  29. package/build/lib/mkdirp.js +7 -13
  30. package/build/lib/mkdirp.js.map +1 -1
  31. package/build/lib/net.d.ts.map +1 -1
  32. package/build/lib/net.js +278 -254
  33. package/build/lib/net.js.map +1 -1
  34. package/build/lib/node.js +203 -192
  35. package/build/lib/node.js.map +1 -1
  36. package/build/lib/npm.d.ts +19 -4
  37. package/build/lib/npm.d.ts.map +1 -1
  38. package/build/lib/npm.js +277 -228
  39. package/build/lib/npm.js.map +1 -1
  40. package/build/lib/plist.js +145 -136
  41. package/build/lib/plist.js.map +1 -1
  42. package/build/lib/process.js +41 -42
  43. package/build/lib/process.js.map +1 -1
  44. package/build/lib/system.js +39 -56
  45. package/build/lib/system.js.map +1 -1
  46. package/build/lib/tempdir.js +112 -73
  47. package/build/lib/tempdir.js.map +1 -1
  48. package/build/lib/timing.js +99 -84
  49. package/build/lib/timing.js.map +1 -1
  50. package/build/lib/util.js +454 -356
  51. package/build/lib/util.js.map +1 -1
  52. package/build/lib/zip.js +469 -423
  53. package/build/lib/zip.js.map +1 -1
  54. package/build/tsconfig.tsbuildinfo +1 -1
  55. package/lib/env.js +6 -4
  56. package/lib/fs.js +15 -1
  57. package/lib/log-internal.js +12 -16
  58. package/lib/logging.js +2 -3
  59. package/lib/net.js +15 -6
  60. package/lib/npm.js +28 -18
  61. package/package.json +20 -19
package/build/lib/util.js CHANGED
@@ -1,90 +1,26 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.W3C_WEB_ELEMENT_IDENTIFIER = exports.MiB = exports.KiB = exports.GiB = void 0;
7
- exports.cancellableDelay = cancellableDelay;
8
- exports.coerceVersion = coerceVersion;
9
- exports.compareVersions = compareVersions;
10
- exports.escapeSpace = escapeSpace;
11
- exports.escapeSpecialChars = escapeSpecialChars;
12
- exports.filterObject = filterObject;
13
- exports.getLockFileGuard = getLockFileGuard;
14
- exports.hasContent = hasContent;
15
- exports.hasValue = hasValue;
16
- exports.isSameDestination = isSameDestination;
17
- exports.isSubPath = isSubPath;
18
- exports.jsonStringify = jsonStringify;
19
- exports.localIp = localIp;
20
- exports.multiResolve = multiResolve;
21
- exports.pluralize = pluralize;
22
- exports.quote = quote;
23
- exports.safeJsonParse = safeJsonParse;
24
- Object.defineProperty(exports, "shellParse", {
25
- enumerable: true,
26
- get: function () {
27
- return _shellQuote.parse;
28
- }
29
- });
30
- exports.toInMemoryBase64 = toInMemoryBase64;
31
- exports.toReadableSizeString = toReadableSizeString;
32
- exports.unleakString = unleakString;
33
- exports.unwrapElement = unwrapElement;
34
- Object.defineProperty(exports, "uuidV1", {
35
- enumerable: true,
36
- get: function () {
37
- return _uuid.v1;
38
- }
39
- });
40
- Object.defineProperty(exports, "uuidV3", {
41
- enumerable: true,
42
- get: function () {
43
- return _uuid.v3;
44
- }
45
- });
46
- Object.defineProperty(exports, "uuidV4", {
47
- enumerable: true,
48
- get: function () {
49
- return _uuid.v4;
50
- }
51
- });
52
- Object.defineProperty(exports, "uuidV5", {
53
- enumerable: true,
54
- get: function () {
55
- return _uuid.v5;
56
- }
57
- });
58
- exports.wrapElement = wrapElement;
59
-
60
- require("source-map-support/register");
61
-
62
- var _bluebird = _interopRequireDefault(require("bluebird"));
63
-
64
- var _lodash = _interopRequireDefault(require("lodash"));
65
-
66
- var _os = _interopRequireDefault(require("os"));
67
-
68
- var _path = _interopRequireDefault(require("path"));
69
-
70
- var _fs = _interopRequireDefault(require("./fs"));
71
-
72
- var _semver = _interopRequireDefault(require("semver"));
73
-
74
- var _shellQuote = require("shell-quote");
75
-
76
- var _pluralize = _interopRequireDefault(require("pluralize"));
77
-
78
- var _stream = _interopRequireDefault(require("stream"));
79
-
80
- var _base64Stream = require("base64-stream");
81
-
82
- var _uuid = require("uuid");
83
-
84
- var _lockfile2 = _interopRequireDefault(require("lockfile"));
85
-
86
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
87
-
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getLockFileGuard = exports.shellParse = exports.uuidV5 = exports.uuidV4 = exports.uuidV3 = exports.uuidV1 = exports.toInMemoryBase64 = exports.KiB = exports.MiB = exports.GiB = exports.pluralize = exports.jsonStringify = exports.unleakString = exports.quote = exports.coerceVersion = exports.compareVersions = exports.isSameDestination = exports.W3C_WEB_ELEMENT_IDENTIFIER = exports.isSubPath = exports.toReadableSizeString = exports.filterObject = exports.unwrapElement = exports.wrapElement = exports.safeJsonParse = exports.multiResolve = exports.cancellableDelay = exports.localIp = exports.escapeSpecialChars = exports.escapeSpace = exports.hasValue = exports.hasContent = void 0;
7
+ const bluebird_1 = __importDefault(require("bluebird"));
8
+ const lodash_1 = __importDefault(require("lodash"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const fs_1 = __importDefault(require("./fs"));
12
+ const semver_1 = __importDefault(require("semver"));
13
+ const shell_quote_1 = require("shell-quote");
14
+ Object.defineProperty(exports, "shellParse", { enumerable: true, get: function () { return shell_quote_1.parse; } });
15
+ const pluralize_1 = __importDefault(require("pluralize"));
16
+ const stream_1 = __importDefault(require("stream"));
17
+ const base64_stream_1 = require("base64-stream");
18
+ const uuid_1 = require("uuid");
19
+ Object.defineProperty(exports, "uuidV1", { enumerable: true, get: function () { return uuid_1.v1; } });
20
+ Object.defineProperty(exports, "uuidV3", { enumerable: true, get: function () { return uuid_1.v3; } });
21
+ Object.defineProperty(exports, "uuidV4", { enumerable: true, get: function () { return uuid_1.v4; } });
22
+ Object.defineProperty(exports, "uuidV5", { enumerable: true, get: function () { return uuid_1.v5; } });
23
+ const lockfile_1 = __importDefault(require("lockfile"));
88
24
  const W3C_WEB_ELEMENT_IDENTIFIER = 'element-6066-11e4-a52e-4f735466cecf';
89
25
  exports.W3C_WEB_ELEMENT_IDENTIFIER = W3C_WEB_ELEMENT_IDENTIFIER;
90
26
  const KiB = 1024;
@@ -93,325 +29,487 @@ const MiB = KiB * 1024;
93
29
  exports.MiB = MiB;
94
30
  const GiB = MiB * 1024;
95
31
  exports.GiB = GiB;
96
-
32
+ /**
33
+ * @template {string} T
34
+ * @param {T} val
35
+ * @returns {val is NonEmptyString<T>}
36
+ */
97
37
  function hasContent(val) {
98
- return _lodash.default.isString(val) && val !== '';
38
+ return lodash_1.default.isString(val) && val !== '';
99
39
  }
100
-
40
+ exports.hasContent = hasContent;
41
+ /**
42
+ * return true if the the value is not `undefined`, `null`, or `NaN`.
43
+ *
44
+ * XXX: `NaN` is not expressible in TypeScript.
45
+ * @template T
46
+ * @param {T} val
47
+ * @returns {val is NonNullable<T>}
48
+ */
101
49
  function hasValue(val) {
102
- if (_lodash.default.isNumber(val)) {
103
- return !_lodash.default.isNaN(val);
104
- }
105
-
106
- return !_lodash.default.isUndefined(val) && !_lodash.default.isNull(val);
50
+ // avoid incorrectly evaluating `0` as false
51
+ if (lodash_1.default.isNumber(val)) {
52
+ return !lodash_1.default.isNaN(val);
53
+ }
54
+ return !lodash_1.default.isUndefined(val) && !lodash_1.default.isNull(val);
107
55
  }
108
-
56
+ exports.hasValue = hasValue;
57
+ // escape spaces in string, for commandline calls
109
58
  function escapeSpace(str) {
110
- return str.split(/ /).join('\\ ');
59
+ return str.split(/ /).join('\\ ');
111
60
  }
112
-
61
+ exports.escapeSpace = escapeSpace;
113
62
  function escapeSpecialChars(str, quoteEscape) {
114
- if (typeof str !== 'string') {
63
+ if (typeof str !== 'string') {
64
+ return str;
65
+ }
66
+ if (typeof quoteEscape === 'undefined') {
67
+ quoteEscape = false;
68
+ }
69
+ str = str
70
+ .replace(/[\\]/g, '\\\\')
71
+ .replace(/[\/]/g, '\\/') // eslint-disable-line no-useless-escape
72
+ .replace(/[\b]/g, '\\b')
73
+ .replace(/[\f]/g, '\\f')
74
+ .replace(/[\n]/g, '\\n')
75
+ .replace(/[\r]/g, '\\r')
76
+ .replace(/[\t]/g, '\\t')
77
+ .replace(/[\"]/g, '\\"') // eslint-disable-line no-useless-escape
78
+ .replace(/\\'/g, "\\'");
79
+ if (quoteEscape) {
80
+ let re = new RegExp(quoteEscape, 'g');
81
+ str = str.replace(re, `\\${quoteEscape}`);
82
+ }
115
83
  return str;
116
- }
117
-
118
- if (typeof quoteEscape === 'undefined') {
119
- quoteEscape = false;
120
- }
121
-
122
- str = str.replace(/[\\]/g, '\\\\').replace(/[\/]/g, '\\/').replace(/[\b]/g, '\\b').replace(/[\f]/g, '\\f').replace(/[\n]/g, '\\n').replace(/[\r]/g, '\\r').replace(/[\t]/g, '\\t').replace(/[\"]/g, '\\"').replace(/\\'/g, "\\'");
123
-
124
- if (quoteEscape) {
125
- let re = new RegExp(quoteEscape, 'g');
126
- str = str.replace(re, `\\${quoteEscape}`);
127
- }
128
-
129
- return str;
130
84
  }
131
-
85
+ exports.escapeSpecialChars = escapeSpecialChars;
132
86
  function localIp() {
133
- let ip = _lodash.default.chain(_os.default.networkInterfaces()).values().flatten().filter(function (val) {
134
- return val.family === 'IPv4' && val.internal === false;
135
- }).map('address').first().value();
136
-
137
- return ip;
87
+ let ip = lodash_1.default.chain(os_1.default.networkInterfaces())
88
+ .values()
89
+ .flatten()
90
+ // @ts-ignore
91
+ .filter(function (val) {
92
+ return val.family === 'IPv4' && val.internal === false;
93
+ })
94
+ .map('address')
95
+ .first()
96
+ .value();
97
+ return ip;
138
98
  }
139
-
99
+ exports.localIp = localIp;
100
+ /*
101
+ * Creates a promise that is cancellable, and will timeout
102
+ * after `ms` delay
103
+ */
140
104
  function cancellableDelay(ms) {
141
- let timer;
142
- let resolve;
143
- let reject;
144
- const delay = new _bluebird.default.Promise((_resolve, _reject) => {
145
- resolve = _resolve;
146
- reject = _reject;
147
- timer = setTimeout(function () {
148
- resolve();
149
- }, ms);
150
- });
151
-
152
- delay.cancel = function () {
153
- clearTimeout(timer);
154
- reject(new _bluebird.default.CancellationError());
155
- };
156
-
157
- return delay;
105
+ let timer;
106
+ let resolve;
107
+ let reject;
108
+ const delay = new bluebird_1.default.Promise((_resolve, _reject) => {
109
+ resolve = _resolve;
110
+ reject = _reject;
111
+ timer = setTimeout(function () {
112
+ resolve();
113
+ }, ms);
114
+ });
115
+ // override Bluebird's `cancel`, which does not work when using `await` on
116
+ // a promise, since `resolve`/`reject` are never called
117
+ delay.cancel = function () {
118
+ clearTimeout(timer);
119
+ reject(new bluebird_1.default.CancellationError());
120
+ };
121
+ return delay;
158
122
  }
159
-
123
+ exports.cancellableDelay = cancellableDelay;
160
124
  function multiResolve(roots, ...args) {
161
- return roots.map(root => _path.default.resolve(root, ...args));
125
+ return roots.map((root) => path_1.default.resolve(root, ...args));
162
126
  }
163
-
127
+ exports.multiResolve = multiResolve;
128
+ /*
129
+ * Parses an object if possible. Otherwise returns the object without parsing.
130
+ */
164
131
  function safeJsonParse(obj) {
165
- try {
166
- return JSON.parse(obj);
167
- } catch (ign) {
168
- return obj;
169
- }
132
+ try {
133
+ return JSON.parse(obj);
134
+ }
135
+ catch (ign) {
136
+ // ignore: this is not json parsable
137
+ return obj;
138
+ }
170
139
  }
171
-
140
+ exports.safeJsonParse = safeJsonParse;
141
+ /*
142
+ * Stringifies the object passed in, converting Buffers into Strings for better
143
+ * display. This mimics JSON.stringify (see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
144
+ * except the `replacer` argument can only be a function.
145
+ *
146
+ * @param {object} obj - the object to be serialized
147
+ * @param {?function} replacer - function to transform the properties added to the
148
+ * serialized object
149
+ * @param {?number|string} space - used to insert white space into the output JSON
150
+ * string for readability purposes. Defaults to 2
151
+ * returns {string} - the JSON object serialized as a string
152
+ */
172
153
  function jsonStringify(obj, replacer, space = 2) {
173
- if (!_lodash.default.isFunction(replacer)) {
174
- replacer = (k, v) => v;
175
- }
176
-
177
- const bufferToJSON = Buffer.prototype.toJSON;
178
- delete Buffer.prototype.toJSON;
179
-
180
- try {
181
- return JSON.stringify(obj, (key, value) => {
182
- const updatedValue = Buffer.isBuffer(value) ? value.toString('utf8') : value;
183
- return replacer(key, updatedValue);
184
- }, space);
185
- } finally {
186
- Buffer.prototype.toJSON = bufferToJSON;
187
- }
154
+ // if no replacer is passed, or it is not a function, just use a pass-through
155
+ if (!lodash_1.default.isFunction(replacer)) {
156
+ replacer = (k, v) => v;
157
+ }
158
+ // Buffers cannot be serialized in a readable way
159
+ const bufferToJSON = Buffer.prototype.toJSON;
160
+ delete Buffer.prototype.toJSON;
161
+ try {
162
+ return JSON.stringify(obj, (key, value) => {
163
+ const updatedValue = Buffer.isBuffer(value) ? value.toString('utf8') : value;
164
+ return replacer(key, updatedValue);
165
+ }, space);
166
+ }
167
+ finally {
168
+ // restore the function, so as to not break further serialization
169
+ Buffer.prototype.toJSON = bufferToJSON;
170
+ }
188
171
  }
189
-
172
+ exports.jsonStringify = jsonStringify;
173
+ /*
174
+ * Removes the wrapper from element, if it exists.
175
+ * { ELEMENT: 4 } becomes 4
176
+ * { element-6066-11e4-a52e-4f735466cecf: 5 } becomes 5
177
+ */
190
178
  function unwrapElement(el) {
191
- for (const propName of [W3C_WEB_ELEMENT_IDENTIFIER, 'ELEMENT']) {
192
- if (_lodash.default.has(el, propName)) {
193
- return el[propName];
179
+ for (const propName of [W3C_WEB_ELEMENT_IDENTIFIER, 'ELEMENT']) {
180
+ if (lodash_1.default.has(el, propName)) {
181
+ return el[propName];
182
+ }
194
183
  }
195
- }
196
-
197
- return el;
184
+ return el;
198
185
  }
199
-
186
+ exports.unwrapElement = unwrapElement;
200
187
  function wrapElement(elementId) {
201
- return {
202
- ELEMENT: elementId,
203
- [W3C_WEB_ELEMENT_IDENTIFIER]: elementId
204
- };
188
+ return {
189
+ ELEMENT: elementId,
190
+ [W3C_WEB_ELEMENT_IDENTIFIER]: elementId,
191
+ };
205
192
  }
206
-
193
+ exports.wrapElement = wrapElement;
194
+ /*
195
+ * Returns object consisting of all properties in the original element
196
+ * which were truthy given the predicate.
197
+ * If the predicate is
198
+ * * missing - it will remove all properties whose values are `undefined`
199
+ * * a scalar - it will test all properties' values against that value
200
+ * * a function - it will pass each value and the original object into the function
201
+ */
207
202
  function filterObject(obj, predicate) {
208
- let newObj = _lodash.default.clone(obj);
209
-
210
- if (_lodash.default.isUndefined(predicate)) {
211
- predicate = v => !_lodash.default.isUndefined(v);
212
- } else if (!_lodash.default.isFunction(predicate)) {
213
- const valuePredicate = predicate;
214
-
215
- predicate = v => v === valuePredicate;
216
- }
217
-
218
- for (const key of Object.keys(obj)) {
219
- if (!predicate(obj[key], obj)) {
220
- delete newObj[key];
203
+ let newObj = lodash_1.default.clone(obj);
204
+ if (lodash_1.default.isUndefined(predicate)) {
205
+ // remove any element from the object whose value is undefined
206
+ predicate = (v) => !lodash_1.default.isUndefined(v);
221
207
  }
222
- }
223
-
224
- return newObj;
208
+ else if (!lodash_1.default.isFunction(predicate)) {
209
+ // make predicate into a function
210
+ const valuePredicate = predicate;
211
+ predicate = (v) => v === valuePredicate;
212
+ }
213
+ for (const key of Object.keys(obj)) {
214
+ if (!predicate(obj[key], obj)) {
215
+ delete newObj[key];
216
+ }
217
+ }
218
+ return newObj;
225
219
  }
226
-
220
+ exports.filterObject = filterObject;
221
+ /**
222
+ * Converts number of bytes to a readable size string.
223
+ *
224
+ * @param {number|string} bytes - The actual number of bytes.
225
+ * @returns {string} The actual string representation, for example
226
+ * '1.00 KB' for '1024 B'
227
+ * @throws {Error} If bytes count cannot be converted to an integer or
228
+ * if it is less than zero.
229
+ */
227
230
  function toReadableSizeString(bytes) {
228
- const intBytes = parseInt(String(bytes), 10);
229
-
230
- if (isNaN(intBytes) || intBytes < 0) {
231
- throw new Error(`Cannot convert '${bytes}' to a readable size format`);
232
- }
233
-
234
- if (intBytes >= GiB) {
235
- return `${(intBytes / (GiB * 1.0)).toFixed(2)} GB`;
236
- } else if (intBytes >= MiB) {
237
- return `${(intBytes / (MiB * 1.0)).toFixed(2)} MB`;
238
- } else if (intBytes >= KiB) {
239
- return `${(intBytes / (KiB * 1.0)).toFixed(2)} KB`;
240
- }
241
-
242
- return `${intBytes} B`;
231
+ const intBytes = parseInt(String(bytes), 10);
232
+ if (isNaN(intBytes) || intBytes < 0) {
233
+ throw new Error(`Cannot convert '${bytes}' to a readable size format`);
234
+ }
235
+ if (intBytes >= GiB) {
236
+ return `${(intBytes / (GiB * 1.0)).toFixed(2)} GB`;
237
+ }
238
+ else if (intBytes >= MiB) {
239
+ return `${(intBytes / (MiB * 1.0)).toFixed(2)} MB`;
240
+ }
241
+ else if (intBytes >= KiB) {
242
+ return `${(intBytes / (KiB * 1.0)).toFixed(2)} KB`;
243
+ }
244
+ return `${intBytes} B`;
243
245
  }
244
-
246
+ exports.toReadableSizeString = toReadableSizeString;
247
+ /**
248
+ * Checks whether the given path is a subpath of the
249
+ * particular root folder. Both paths can include .. and . specifiers
250
+ *
251
+ * @param {string} originalPath The absolute file/folder path
252
+ * @param {string} root The absolute root folder path
253
+ * @param {?boolean} forcePosix Set it to true if paths must be interpreted in POSIX format
254
+ * @returns {boolean} true if the given original path is the subpath of the root folder
255
+ * @throws {Error} if any of the given paths is not absolute
256
+ */
245
257
  function isSubPath(originalPath, root, forcePosix = null) {
246
- const pathObj = forcePosix ? _path.default.posix : _path.default;
247
-
248
- for (const p of [originalPath, root]) {
249
- if (!pathObj.isAbsolute(p)) {
250
- throw new Error(`'${p}' is expected to be an absolute path`);
258
+ const pathObj = forcePosix ? path_1.default.posix : path_1.default;
259
+ for (const p of [originalPath, root]) {
260
+ if (!pathObj.isAbsolute(p)) {
261
+ throw new Error(`'${p}' is expected to be an absolute path`);
262
+ }
251
263
  }
252
- }
253
-
254
- const normalizedRoot = pathObj.normalize(root);
255
- const normalizedPath = pathObj.normalize(originalPath);
256
- return normalizedPath.startsWith(normalizedRoot);
264
+ const normalizedRoot = pathObj.normalize(root);
265
+ const normalizedPath = pathObj.normalize(originalPath);
266
+ return normalizedPath.startsWith(normalizedRoot);
257
267
  }
258
-
268
+ exports.isSubPath = isSubPath;
269
+ /**
270
+ * Checks whether the given paths are pointing to the same file system
271
+ * destination.
272
+ *
273
+ * @param {string} path1 - Absolute or relative path to a file/folder
274
+ * @param {string} path2 - Absolute or relative path to a file/folder
275
+ * @param {...string} pathN - Zero or more absolute or relative paths to files/folders
276
+ * @returns {Promise<boolean>} true if all paths are pointing to the same file system item
277
+ */
259
278
  async function isSameDestination(path1, path2, ...pathN) {
260
- const allPaths = [path1, path2, ...pathN];
261
-
262
- if (!(await _bluebird.default.reduce(allPaths, async (a, b) => a && (await _fs.default.exists(b)), true))) {
263
- return false;
264
- }
265
-
266
- const areAllItemsEqual = arr => !!arr.reduce((a, b) => a === b ? a : NaN);
267
-
268
- if (areAllItemsEqual(allPaths)) {
269
- return true;
270
- }
271
-
272
- let mapCb = async x => (await _fs.default.stat(x, {
273
- bigint: true
274
- })).ino;
275
-
276
- return areAllItemsEqual(await _bluebird.default.map(allPaths, mapCb));
279
+ const allPaths = [path1, path2, ...pathN];
280
+ if (!(await bluebird_1.default.reduce(allPaths, async (a, b) => a && (await fs_1.default.exists(b)), true))) {
281
+ return false;
282
+ }
283
+ const areAllItemsEqual = (arr) => !!arr.reduce((a, b) => (a === b ? a : NaN));
284
+ if (areAllItemsEqual(allPaths)) {
285
+ return true;
286
+ }
287
+ let mapCb = async (x) => (await fs_1.default.stat(x, {
288
+ bigint: true,
289
+ })).ino;
290
+ return areAllItemsEqual(await bluebird_1.default.map(allPaths, mapCb));
277
291
  }
278
-
279
- function coerceVersion(ver, strict = true) {
280
- const result = _semver.default.valid(_semver.default.coerce(`${ver}`));
281
-
282
- if (strict && !result) {
283
- throw new Error(`'${ver}' cannot be coerced to a valid version number`);
284
- }
285
-
286
- return result;
292
+ exports.isSameDestination = isSameDestination;
293
+ /**
294
+ * Coerces the given number/string to a valid version string
295
+ *
296
+ * @template {boolean} [Strict=true]
297
+ * @param {string} ver - Version string to coerce
298
+ * @param {Strict} [strict] - If `true` then an exception will be thrown
299
+ * if `ver` cannot be coerced
300
+ * @returns {Strict extends true ? string : string|null} Coerced version number or null if the string cannot be
301
+ * coerced and strict mode is disabled
302
+ * @throws {Error} if strict mode is enabled and `ver` cannot be coerced
303
+ */
304
+ function coerceVersion(ver, strict = /** @type {Strict} */ (true)) {
305
+ const result = semver_1.default.valid(semver_1.default.coerce(`${ver}`));
306
+ if (strict && !result) {
307
+ throw new Error(`'${ver}' cannot be coerced to a valid version number`);
308
+ }
309
+ return /** @type {Strict extends true ? string : string?} */ (result);
287
310
  }
288
-
311
+ exports.coerceVersion = coerceVersion;
289
312
  const SUPPORTED_OPERATORS = ['==', '!=', '>', '<', '>=', '<=', '='];
290
-
313
+ /**
314
+ * Compares two version strings
315
+ *
316
+ * @param {string} ver1 - The first version number to compare. Should be a valid
317
+ * version number supported by semver parser.
318
+ * @param {string} ver2 - The second version number to compare. Should be a valid
319
+ * version number supported by semver parser.
320
+ * @param {string} operator - One of supported version number operators:
321
+ * ==, !=, >, <, <=, >=, =
322
+ * @returns {boolean} true or false depending on the actual comparison result
323
+ * @throws {Error} if an unsupported operator is supplied or any of the supplied
324
+ * version strings cannot be coerced
325
+ */
291
326
  function compareVersions(ver1, operator, ver2) {
292
- if (!SUPPORTED_OPERATORS.includes(operator)) {
293
- throw new Error(`The '${operator}' comparison operator is not supported. ` + `Only '${JSON.stringify(SUPPORTED_OPERATORS)}' operators are supported`);
294
- }
295
-
296
- const semverOperator = ['==', '!='].includes(operator) ? '=' : operator;
297
-
298
- const result = _semver.default.satisfies(coerceVersion(ver1), `${semverOperator}${coerceVersion(ver2)}`);
299
-
300
- return operator === '!=' ? !result : result;
327
+ if (!SUPPORTED_OPERATORS.includes(operator)) {
328
+ throw new Error(`The '${operator}' comparison operator is not supported. ` +
329
+ `Only '${JSON.stringify(SUPPORTED_OPERATORS)}' operators are supported`);
330
+ }
331
+ const semverOperator = ['==', '!='].includes(operator) ? '=' : operator;
332
+ const result = semver_1.default.satisfies(coerceVersion(ver1), `${semverOperator}${coerceVersion(ver2)}`);
333
+ return operator === '!=' ? !result : result;
301
334
  }
302
-
335
+ exports.compareVersions = compareVersions;
336
+ /**
337
+ * Add appropriate quotes to command arguments. See https://github.com/substack/node-shell-quote
338
+ * for more details
339
+ *
340
+ * @param {string|string[]} args - The arguments that will be parsed
341
+ * @returns {string} - The arguments, quoted
342
+ */
303
343
  function quote(args) {
304
- return (0, _shellQuote.quote)(_lodash.default.castArray(args));
344
+ return (0, shell_quote_1.quote)(lodash_1.default.castArray(args));
305
345
  }
306
-
346
+ exports.quote = quote;
347
+ /**
348
+ * This function is necessary to workaround unexpected memory leaks
349
+ * caused by NodeJS string interning
350
+ * behavior described in https://bugs.chromium.org/p/v8/issues/detail?id=2869
351
+ *
352
+ * @param {*} s - The string to unleak
353
+ * @return {string} Either the unleaked string or the original object converted to string
354
+ */
307
355
  function unleakString(s) {
308
- return ` ${s}`.substr(1);
356
+ return ` ${s}`.substr(1);
309
357
  }
310
-
358
+ exports.unleakString = unleakString;
359
+ /**
360
+ * @typedef PluralizeOptions
361
+ * @property {boolean} [inclusive=false] - Whether to prefix with the number (e.g., 3 ducks)
362
+ */
363
+ /**
364
+ * Get the form of a word appropriate to the count
365
+ *
366
+ * @param {string} word - The word to pluralize
367
+ * @param {number} count - How many of the word exist
368
+ * @param {PluralizeOptions|boolean} options - options for word pluralization,
369
+ * or a boolean indicating the options.inclusive property
370
+ * @returns {string} The word pluralized according to the number
371
+ */
311
372
  function pluralize(word, count, options = {}) {
312
- let inclusive = false;
313
-
314
- if (_lodash.default.isBoolean(options)) {
315
- inclusive = options;
316
- } else if (_lodash.default.isBoolean(options === null || options === void 0 ? void 0 : options.inclusive)) {
317
- inclusive = options.inclusive;
318
- }
319
-
320
- return (0, _pluralize.default)(word, count, inclusive);
373
+ let inclusive = false;
374
+ if (lodash_1.default.isBoolean(options)) {
375
+ // if passed in as a boolean
376
+ inclusive = options;
377
+ }
378
+ else if (lodash_1.default.isBoolean(options?.inclusive)) {
379
+ // if passed in as an options hash
380
+ inclusive = options.inclusive;
381
+ }
382
+ return (0, pluralize_1.default)(word, count, inclusive);
321
383
  }
322
-
384
+ exports.pluralize = pluralize;
385
+ /**
386
+ * @typedef EncodingOptions
387
+ * @property {number} [maxSize=1073741824] The maximum size of
388
+ * the resulting buffer in bytes. This is set to 1GB by default, because
389
+ * Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap
390
+ * size must be enough to keep the resulting object (usually this size is
391
+ * limited to 1.4 GB)
392
+ */
393
+ /**
394
+ * Converts contents of a local file to an in-memory base-64 encoded buffer.
395
+ * The operation is memory-usage friendly and should be used while encoding
396
+ * large files to base64
397
+ *
398
+ * @param {string} srcPath The full path to the file being encoded
399
+ * @param {EncodingOptions} opts
400
+ * @returns {Promise<Buffer>} base64-encoded content of the source file as memory buffer
401
+ * @throws {Error} if there was an error while reading the source file
402
+ * or the source file is too
403
+ */
323
404
  async function toInMemoryBase64(srcPath, opts = {}) {
324
- if (!(await _fs.default.exists(srcPath)) || (await _fs.default.stat(srcPath)).isDirectory()) {
325
- throw new Error(`No such file: ${srcPath}`);
326
- }
327
-
328
- const {
329
- maxSize = 1 * GiB
330
- } = opts;
331
- const resultBuffers = [];
332
- let resultBuffersSize = 0;
333
- const resultWriteStream = new _stream.default.Writable({
334
- write: (buffer, encoding, next) => {
335
- resultBuffers.push(buffer);
336
- resultBuffersSize += buffer.length;
337
-
338
- if (maxSize > 0 && resultBuffersSize > maxSize) {
339
- resultWriteStream.emit('error', new Error(`The size of the resulting ` + `buffer must not be greater than ${toReadableSizeString(maxSize)}`));
340
- }
341
-
342
- next();
405
+ if (!(await fs_1.default.exists(srcPath)) || (await fs_1.default.stat(srcPath)).isDirectory()) {
406
+ throw new Error(`No such file: ${srcPath}`);
343
407
  }
344
- });
345
-
346
- const readerStream = _fs.default.createReadStream(srcPath);
347
-
348
- const base64EncoderStream = new _base64Stream.Base64Encode();
349
- const resultWriteStreamPromise = new _bluebird.default((resolve, reject) => {
350
- resultWriteStream.once('error', e => {
351
- readerStream.unpipe(base64EncoderStream);
352
- base64EncoderStream.unpipe(resultWriteStream);
353
- readerStream.destroy();
354
- reject(e);
408
+ const { maxSize = 1 * GiB } = opts;
409
+ const resultBuffers = [];
410
+ let resultBuffersSize = 0;
411
+ const resultWriteStream = new stream_1.default.Writable({
412
+ write: (buffer, encoding, next) => {
413
+ resultBuffers.push(buffer);
414
+ resultBuffersSize += buffer.length;
415
+ if (maxSize > 0 && resultBuffersSize > maxSize) {
416
+ resultWriteStream.emit('error', new Error(`The size of the resulting ` +
417
+ `buffer must not be greater than ${toReadableSizeString(maxSize)}`));
418
+ }
419
+ next();
420
+ },
421
+ });
422
+ const readerStream = fs_1.default.createReadStream(srcPath);
423
+ const base64EncoderStream = new base64_stream_1.Base64Encode();
424
+ const resultWriteStreamPromise = new bluebird_1.default((resolve, reject) => {
425
+ resultWriteStream.once('error', (e) => {
426
+ readerStream.unpipe(base64EncoderStream);
427
+ base64EncoderStream.unpipe(resultWriteStream);
428
+ readerStream.destroy();
429
+ reject(e);
430
+ });
431
+ resultWriteStream.once('finish', resolve);
432
+ });
433
+ const readStreamPromise = new bluebird_1.default((resolve, reject) => {
434
+ readerStream.once('close', resolve);
435
+ readerStream.once('error', (e) => reject(new Error(`Failed to read '${srcPath}': ${e.message}`)));
355
436
  });
356
- resultWriteStream.once('finish', resolve);
357
- });
358
- const readStreamPromise = new _bluebird.default((resolve, reject) => {
359
- readerStream.once('close', resolve);
360
- readerStream.once('error', e => reject(new Error(`Failed to read '${srcPath}': ${e.message}`)));
361
- });
362
- readerStream.pipe(base64EncoderStream);
363
- base64EncoderStream.pipe(resultWriteStream);
364
- await _bluebird.default.all([readStreamPromise, resultWriteStreamPromise]);
365
- return Buffer.concat(resultBuffers);
437
+ readerStream.pipe(base64EncoderStream);
438
+ base64EncoderStream.pipe(resultWriteStream);
439
+ await bluebird_1.default.all([readStreamPromise, resultWriteStreamPromise]);
440
+ return Buffer.concat(resultBuffers);
366
441
  }
367
-
442
+ exports.toInMemoryBase64 = toInMemoryBase64;
443
+ /**
444
+ * @typedef LockFileOptions
445
+ * @property {number} [timeout=120] The max time in seconds to wait for the lock
446
+ * @property {boolean} [tryRecovery=false] Whether to try lock recovery if
447
+ * the first attempt to acquire it timed out.
448
+ */
449
+ /**
450
+ * Create an async function which, when called, will not proceed until a certain file is no
451
+ * longer present on the system. This allows for preventing concurrent behavior across processes
452
+ * using a known lockfile path.
453
+ *
454
+ * @template T
455
+ * @param {string} lockFile The full path to the file used for the lock
456
+ * @param {LockFileOptions} opts
457
+ * @returns async function that takes another async function defining the locked
458
+ * behavior
459
+ */
368
460
  function getLockFileGuard(lockFile, opts = {}) {
369
- const {
370
- timeout = 120,
371
- tryRecovery = false
372
- } = opts;
373
-
374
- const lock = _bluebird.default.promisify(_lockfile2.default.lock);
375
-
376
- const check = _bluebird.default.promisify(_lockfile2.default.check);
377
-
378
- const unlock = _bluebird.default.promisify(_lockfile2.default.unlock);
379
-
380
- const guard = async behavior => {
381
- let triedRecovery = false;
382
-
383
- do {
384
- try {
385
- if (_lockfile2.default.checkSync(lockFile)) {
386
- await lock(lockFile, {
387
- wait: timeout * 1000
388
- });
389
- } else {
390
- _lockfile2.default.lockSync(lockFile);
461
+ const { timeout = 120, tryRecovery = false } = opts;
462
+ const lock = /** @type {(lockfile: string, opts: import('lockfile').Options)=>B<void>} */ (bluebird_1.default.promisify(lockfile_1.default.lock));
463
+ const check = bluebird_1.default.promisify(lockfile_1.default.check);
464
+ const unlock = bluebird_1.default.promisify(lockfile_1.default.unlock);
465
+ /**
466
+ * @param {(...args: any[]) => T} behavior
467
+ * @returns {Promise<T>}
468
+ */
469
+ const guard = async (behavior) => {
470
+ let triedRecovery = false;
471
+ do {
472
+ try {
473
+ // if the lockfile doesn't exist, lock it synchronously to make sure no other call
474
+ // on the same spin of the event loop can also initiate a lock. If the lockfile does exist
475
+ // then just use the regular async 'lock' method which will wait on the lock.
476
+ if (lockfile_1.default.checkSync(lockFile)) {
477
+ await lock(lockFile, { wait: timeout * 1000 });
478
+ }
479
+ else {
480
+ lockfile_1.default.lockSync(lockFile);
481
+ }
482
+ break;
483
+ }
484
+ catch (e) {
485
+ if (lodash_1.default.includes(e.message, 'EEXIST') && tryRecovery && !triedRecovery) {
486
+ // There could be cases where a process has been forcefully terminated
487
+ // without a chance to clean up pending locks: https://github.com/npm/lockfile/issues/26
488
+ lockfile_1.default.unlockSync(lockFile);
489
+ triedRecovery = true;
490
+ continue;
491
+ }
492
+ throw new Error(`Could not acquire lock on '${lockFile}' after ${timeout}s. ` +
493
+ `Original error: ${e.message}`);
494
+ }
495
+ // eslint-disable-next-line no-constant-condition
496
+ } while (true);
497
+ try {
498
+ return await behavior();
391
499
  }
392
-
393
- break;
394
- } catch (e) {
395
- if (_lodash.default.includes(e.message, 'EEXIST') && tryRecovery && !triedRecovery) {
396
- _lockfile2.default.unlockSync(lockFile);
397
-
398
- triedRecovery = true;
399
- continue;
500
+ finally {
501
+ // whether the behavior succeeded or not, get rid of the lock
502
+ await unlock(lockFile);
400
503
  }
401
-
402
- throw new Error(`Could not acquire lock on '${lockFile}' after ${timeout}s. ` + `Original error: ${e.message}`);
403
- }
404
- } while (true);
405
-
406
- try {
407
- return await behavior();
408
- } finally {
409
- await unlock(lockFile);
410
- }
411
- };
412
-
413
- guard.check = async () => await check(lockFile);
414
-
415
- return guard;
504
+ };
505
+ guard.check = async () => await check(lockFile);
506
+ return guard;
416
507
  }
417
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiIsIktpQiIsIk1pQiIsIkdpQiIsImhhc0NvbnRlbnQiLCJ2YWwiLCJfIiwiaXNTdHJpbmciLCJoYXNWYWx1ZSIsImlzTnVtYmVyIiwiaXNOYU4iLCJpc1VuZGVmaW5lZCIsImlzTnVsbCIsImVzY2FwZVNwYWNlIiwic3RyIiwic3BsaXQiLCJqb2luIiwiZXNjYXBlU3BlY2lhbENoYXJzIiwicXVvdGVFc2NhcGUiLCJyZXBsYWNlIiwicmUiLCJSZWdFeHAiLCJsb2NhbElwIiwiaXAiLCJjaGFpbiIsIm9zIiwibmV0d29ya0ludGVyZmFjZXMiLCJ2YWx1ZXMiLCJmbGF0dGVuIiwiZmlsdGVyIiwiZmFtaWx5IiwiaW50ZXJuYWwiLCJtYXAiLCJmaXJzdCIsInZhbHVlIiwiY2FuY2VsbGFibGVEZWxheSIsIm1zIiwidGltZXIiLCJyZXNvbHZlIiwicmVqZWN0IiwiZGVsYXkiLCJCIiwiUHJvbWlzZSIsIl9yZXNvbHZlIiwiX3JlamVjdCIsInNldFRpbWVvdXQiLCJjYW5jZWwiLCJjbGVhclRpbWVvdXQiLCJDYW5jZWxsYXRpb25FcnJvciIsIm11bHRpUmVzb2x2ZSIsInJvb3RzIiwiYXJncyIsInJvb3QiLCJwYXRoIiwic2FmZUpzb25QYXJzZSIsIm9iaiIsIkpTT04iLCJwYXJzZSIsImlnbiIsImpzb25TdHJpbmdpZnkiLCJyZXBsYWNlciIsInNwYWNlIiwiaXNGdW5jdGlvbiIsImsiLCJ2IiwiYnVmZmVyVG9KU09OIiwiQnVmZmVyIiwicHJvdG90eXBlIiwidG9KU09OIiwic3RyaW5naWZ5Iiwia2V5IiwidXBkYXRlZFZhbHVlIiwiaXNCdWZmZXIiLCJ0b1N0cmluZyIsInVud3JhcEVsZW1lbnQiLCJlbCIsInByb3BOYW1lIiwiaGFzIiwid3JhcEVsZW1lbnQiLCJlbGVtZW50SWQiLCJFTEVNRU5UIiwiZmlsdGVyT2JqZWN0IiwicHJlZGljYXRlIiwibmV3T2JqIiwiY2xvbmUiLCJ2YWx1ZVByZWRpY2F0ZSIsIk9iamVjdCIsImtleXMiLCJ0b1JlYWRhYmxlU2l6ZVN0cmluZyIsImJ5dGVzIiwiaW50Qnl0ZXMiLCJwYXJzZUludCIsIlN0cmluZyIsIkVycm9yIiwidG9GaXhlZCIsImlzU3ViUGF0aCIsIm9yaWdpbmFsUGF0aCIsImZvcmNlUG9zaXgiLCJwYXRoT2JqIiwicG9zaXgiLCJwIiwiaXNBYnNvbHV0ZSIsIm5vcm1hbGl6ZWRSb290Iiwibm9ybWFsaXplIiwibm9ybWFsaXplZFBhdGgiLCJzdGFydHNXaXRoIiwiaXNTYW1lRGVzdGluYXRpb24iLCJwYXRoMSIsInBhdGgyIiwicGF0aE4iLCJhbGxQYXRocyIsInJlZHVjZSIsImEiLCJiIiwiZnMiLCJleGlzdHMiLCJhcmVBbGxJdGVtc0VxdWFsIiwiYXJyIiwiTmFOIiwibWFwQ2IiLCJ4Iiwic3RhdCIsImJpZ2ludCIsImlubyIsImNvZXJjZVZlcnNpb24iLCJ2ZXIiLCJzdHJpY3QiLCJyZXN1bHQiLCJzZW12ZXIiLCJ2YWxpZCIsImNvZXJjZSIsIlNVUFBPUlRFRF9PUEVSQVRPUlMiLCJjb21wYXJlVmVyc2lvbnMiLCJ2ZXIxIiwib3BlcmF0b3IiLCJ2ZXIyIiwiaW5jbHVkZXMiLCJzZW12ZXJPcGVyYXRvciIsInNhdGlzZmllcyIsInF1b3RlIiwic2hlbGxRdW90ZSIsImNhc3RBcnJheSIsInVubGVha1N0cmluZyIsInMiLCJzdWJzdHIiLCJwbHVyYWxpemUiLCJ3b3JkIiwiY291bnQiLCJvcHRpb25zIiwiaW5jbHVzaXZlIiwiaXNCb29sZWFuIiwicGx1cmFsaXplTGliIiwidG9Jbk1lbW9yeUJhc2U2NCIsInNyY1BhdGgiLCJvcHRzIiwiaXNEaXJlY3RvcnkiLCJtYXhTaXplIiwicmVzdWx0QnVmZmVycyIsInJlc3VsdEJ1ZmZlcnNTaXplIiwicmVzdWx0V3JpdGVTdHJlYW0iLCJzdHJlYW0iLCJXcml0YWJsZSIsIndyaXRlIiwiYnVmZmVyIiwiZW5jb2RpbmciLCJuZXh0IiwicHVzaCIsImxlbmd0aCIsImVtaXQiLCJyZWFkZXJTdHJlYW0iLCJjcmVhdGVSZWFkU3RyZWFtIiwiYmFzZTY0RW5jb2RlclN0cmVhbSIsIkJhc2U2NEVuY29kZSIsInJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZSIsIm9uY2UiLCJlIiwidW5waXBlIiwiZGVzdHJveSIsInJlYWRTdHJlYW1Qcm9taXNlIiwibWVzc2FnZSIsInBpcGUiLCJhbGwiLCJjb25jYXQiLCJnZXRMb2NrRmlsZUd1YXJkIiwibG9ja0ZpbGUiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJsb2NrIiwicHJvbWlzaWZ5IiwiX2xvY2tmaWxlIiwiY2hlY2siLCJ1bmxvY2siLCJndWFyZCIsImJlaGF2aW9yIiwidHJpZWRSZWNvdmVyeSIsImNoZWNrU3luYyIsIndhaXQiLCJsb2NrU3luYyIsInVubG9ja1N5bmMiXSwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJy4vZnMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvc2hlbGwtcXVvdGVcbiAgcXVvdGUgYXMgc2hlbGxRdW90ZSxcbiAgcGFyc2UgYXMgc2hlbGxQYXJzZSxcbn0gZnJvbSAnc2hlbGwtcXVvdGUnO1xuaW1wb3J0IHBsdXJhbGl6ZUxpYiBmcm9tICdwbHVyYWxpemUnO1xuaW1wb3J0IHN0cmVhbSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHtCYXNlNjRFbmNvZGV9IGZyb20gJ2Jhc2U2NC1zdHJlYW0nO1xuaW1wb3J0IHtcbiAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvdXVpZFxuICB2MSBhcyB1dWlkVjEsXG4gIHYzIGFzIHV1aWRWMyxcbiAgdjQgYXMgdXVpZFY0LFxuICB2NSBhcyB1dWlkVjUsXG59IGZyb20gJ3V1aWQnO1xuaW1wb3J0IF9sb2NrZmlsZSBmcm9tICdsb2NrZmlsZSc7XG5cbmNvbnN0IFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSID0gJ2VsZW1lbnQtNjA2Ni0xMWU0LWE1MmUtNGY3MzU0NjZjZWNmJztcbmNvbnN0IEtpQiA9IDEwMjQ7XG5jb25zdCBNaUIgPSBLaUIgKiAxMDI0O1xuY29uc3QgR2lCID0gTWlCICogMTAyNDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gVFxuICogQHBhcmFtIHtUfSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgTm9uRW1wdHlTdHJpbmc8VD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDb250ZW50KHZhbCkge1xuICByZXR1cm4gXy5pc1N0cmluZyh2YWwpICYmIHZhbCAhPT0gJyc7XG59XG5cbi8qKlxuICogcmV0dXJuIHRydWUgaWYgdGhlIHRoZSB2YWx1ZSBpcyBub3QgYHVuZGVmaW5lZGAsIGBudWxsYCwgb3IgYE5hTmAuXG4gKlxuICogWFhYOiBgTmFOYCBpcyBub3QgZXhwcmVzc2libGUgaW4gVHlwZVNjcmlwdC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBOb25OdWxsYWJsZTxUPn1cbiAqL1xuZnVuY3Rpb24gaGFzVmFsdWUodmFsKSB7XG4gIC8vIGF2b2lkIGluY29ycmVjdGx5IGV2YWx1YXRpbmcgYDBgIGFzIGZhbHNlXG4gIGlmIChfLmlzTnVtYmVyKHZhbCkpIHtcbiAgICByZXR1cm4gIV8uaXNOYU4odmFsKTtcbiAgfVxuICByZXR1cm4gIV8uaXNVbmRlZmluZWQodmFsKSAmJiAhXy5pc051bGwodmFsKTtcbn1cblxuLy8gZXNjYXBlIHNwYWNlcyBpbiBzdHJpbmcsIGZvciBjb21tYW5kbGluZSBjYWxsc1xuZnVuY3Rpb24gZXNjYXBlU3BhY2Uoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAvKS5qb2luKCdcXFxcICcpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVTcGVjaWFsQ2hhcnMoc3RyLCBxdW90ZUVzY2FwZSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIGlmICh0eXBlb2YgcXVvdGVFc2NhcGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcXVvdGVFc2NhcGUgPSBmYWxzZTtcbiAgfVxuICBzdHIgPSBzdHJcbiAgICAucmVwbGFjZSgvW1xcXFxdL2csICdcXFxcXFxcXCcpXG4gICAgLnJlcGxhY2UoL1tcXC9dL2csICdcXFxcLycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgICAucmVwbGFjZSgvW1xcYl0vZywgJ1xcXFxiJylcbiAgICAucmVwbGFjZSgvW1xcZl0vZywgJ1xcXFxmJylcbiAgICAucmVwbGFjZSgvW1xcbl0vZywgJ1xcXFxuJylcbiAgICAucmVwbGFjZSgvW1xccl0vZywgJ1xcXFxyJylcbiAgICAucmVwbGFjZSgvW1xcdF0vZywgJ1xcXFx0JylcbiAgICAucmVwbGFjZSgvW1xcXCJdL2csICdcXFxcXCInKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgLnJlcGxhY2UoL1xcXFwnL2csIFwiXFxcXCdcIik7XG4gIGlmIChxdW90ZUVzY2FwZSkge1xuICAgIGxldCByZSA9IG5ldyBSZWdFeHAocXVvdGVFc2NhcGUsICdnJyk7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UocmUsIGBcXFxcJHtxdW90ZUVzY2FwZX1gKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBsb2NhbElwKCkge1xuICBsZXQgaXAgPSBfLmNoYWluKG9zLm5ldHdvcmtJbnRlcmZhY2VzKCkpXG4gICAgLnZhbHVlcygpXG4gICAgLmZsYXR0ZW4oKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICAuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiB2YWwuZmFtaWx5ID09PSAnSVB2NCcgJiYgdmFsLmludGVybmFsID09PSBmYWxzZTtcbiAgICB9KVxuICAgIC5tYXAoJ2FkZHJlc3MnKVxuICAgIC5maXJzdCgpXG4gICAgLnZhbHVlKCk7XG4gIHJldHVybiBpcDtcbn1cblxuLypcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgY2FuY2VsbGFibGUsIGFuZCB3aWxsIHRpbWVvdXRcbiAqIGFmdGVyIGBtc2AgZGVsYXlcbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGFibGVEZWxheShtcykge1xuICBsZXQgdGltZXI7XG4gIGxldCByZXNvbHZlO1xuICBsZXQgcmVqZWN0O1xuXG4gIGNvbnN0IGRlbGF5ID0gbmV3IEIuUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0sIG1zKTtcbiAgfSk7XG5cbiAgLy8gb3ZlcnJpZGUgQmx1ZWJpcmQncyBgY2FuY2VsYCwgd2hpY2ggZG9lcyBub3Qgd29yayB3aGVuIHVzaW5nIGBhd2FpdGAgb25cbiAgLy8gYSBwcm9taXNlLCBzaW5jZSBgcmVzb2x2ZWAvYHJlamVjdGAgYXJlIG5ldmVyIGNhbGxlZFxuICBkZWxheS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICByZWplY3QobmV3IEIuQ2FuY2VsbGF0aW9uRXJyb3IoKSk7XG4gIH07XG4gIHJldHVybiBkZWxheTtcbn1cblxuZnVuY3Rpb24gbXVsdGlSZXNvbHZlKHJvb3RzLCAuLi5hcmdzKSB7XG4gIHJldHVybiByb290cy5tYXAoKHJvb3QpID0+IHBhdGgucmVzb2x2ZShyb290LCAuLi5hcmdzKSk7XG59XG5cbi8qXG4gKiBQYXJzZXMgYW4gb2JqZWN0IGlmIHBvc3NpYmxlLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgb2JqZWN0IHdpdGhvdXQgcGFyc2luZy5cbiAqL1xuZnVuY3Rpb24gc2FmZUpzb25QYXJzZShvYmopIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvYmopO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICAvLyBpZ25vcmU6IHRoaXMgaXMgbm90IGpzb24gcGFyc2FibGVcbiAgICByZXR1cm4gb2JqO1xuICB9XG59XG5cbi8qXG4gKiBTdHJpbmdpZmllcyB0aGUgb2JqZWN0IHBhc3NlZCBpbiwgY29udmVydGluZyBCdWZmZXJzIGludG8gU3RyaW5ncyBmb3IgYmV0dGVyXG4gKiBkaXNwbGF5LiBUaGlzIG1pbWljcyBKU09OLnN0cmluZ2lmeSAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogZXhjZXB0IHRoZSBgcmVwbGFjZXJgIGFyZ3VtZW50IGNhbiBvbmx5IGJlIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHs/ZnVuY3Rpb259IHJlcGxhY2VyIC0gZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBwcm9wZXJ0aWVzIGFkZGVkIHRvIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBvYmplY3RcbiAqIEBwYXJhbSB7P251bWJlcnxzdHJpbmd9IHNwYWNlIC0gdXNlZCB0byBpbnNlcnQgd2hpdGUgc3BhY2UgaW50byB0aGUgb3V0cHV0IEpTT05cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciByZWFkYWJpbGl0eSBwdXJwb3Nlcy4gRGVmYXVsdHMgdG8gMlxuICogcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBKU09OIG9iamVjdCBzZXJpYWxpemVkIGFzIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdpZnkob2JqLCByZXBsYWNlciwgc3BhY2UgPSAyKSB7XG4gIC8vIGlmIG5vIHJlcGxhY2VyIGlzIHBhc3NlZCwgb3IgaXQgaXMgbm90IGEgZnVuY3Rpb24sIGp1c3QgdXNlIGEgcGFzcy10aHJvdWdoXG4gIGlmICghXy5pc0Z1bmN0aW9uKHJlcGxhY2VyKSkge1xuICAgIHJlcGxhY2VyID0gKGssIHYpID0+IHY7XG4gIH1cblxuICAvLyBCdWZmZXJzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGluIGEgcmVhZGFibGUgd2F5XG4gIGNvbnN0IGJ1ZmZlclRvSlNPTiA9IEJ1ZmZlci5wcm90b3R5cGUudG9KU09OO1xuICBkZWxldGUgQnVmZmVyLnByb3RvdHlwZS50b0pTT047XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuICAgICAgb2JqLFxuICAgICAgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZFZhbHVlID0gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA/IHZhbHVlLnRvU3RyaW5nKCd1dGY4JykgOiB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VyKGtleSwgdXBkYXRlZFZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBzcGFjZVxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gcmVzdG9yZSB0aGUgZnVuY3Rpb24sIHNvIGFzIHRvIG5vdCBicmVhayBmdXJ0aGVyIHNlcmlhbGl6YXRpb25cbiAgICBCdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGJ1ZmZlclRvSlNPTjtcbiAgfVxufVxuXG4vKlxuICogUmVtb3ZlcyB0aGUgd3JhcHBlciBmcm9tIGVsZW1lbnQsIGlmIGl0IGV4aXN0cy5cbiAqICAgeyBFTEVNRU5UOiA0IH0gYmVjb21lcyA0XG4gKiAgIHsgZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2Y6IDUgfSBiZWNvbWVzIDVcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudChlbCkge1xuICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiwgJ0VMRU1FTlQnXSkge1xuICAgIGlmIChfLmhhcyhlbCwgcHJvcE5hbWUpKSB7XG4gICAgICByZXR1cm4gZWxbcHJvcE5hbWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWw7XG59XG5cbmZ1bmN0aW9uIHdyYXBFbGVtZW50KGVsZW1lbnRJZCkge1xuICByZXR1cm4ge1xuICAgIEVMRU1FTlQ6IGVsZW1lbnRJZCxcbiAgICBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdOiBlbGVtZW50SWQsXG4gIH07XG59XG5cbi8qXG4gKiBSZXR1cm5zIG9iamVjdCBjb25zaXN0aW5nIG9mIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBvcmlnaW5hbCBlbGVtZW50XG4gKiB3aGljaCB3ZXJlIHRydXRoeSBnaXZlbiB0aGUgcHJlZGljYXRlLlxuICogSWYgdGhlIHByZWRpY2F0ZSBpc1xuICogICAqIG1pc3NpbmcgLSBpdCB3aWxsIHJlbW92ZSBhbGwgcHJvcGVydGllcyB3aG9zZSB2YWx1ZXMgYXJlIGB1bmRlZmluZWRgXG4gKiAgICogYSBzY2FsYXIgLSBpdCB3aWxsIHRlc3QgYWxsIHByb3BlcnRpZXMnIHZhbHVlcyBhZ2FpbnN0IHRoYXQgdmFsdWVcbiAqICAgKiBhIGZ1bmN0aW9uIC0gaXQgd2lsbCBwYXNzIGVhY2ggdmFsdWUgYW5kIHRoZSBvcmlnaW5hbCBvYmplY3QgaW50byB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZmlsdGVyT2JqZWN0KG9iaiwgcHJlZGljYXRlKSB7XG4gIGxldCBuZXdPYmogPSBfLmNsb25lKG9iaik7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByZWRpY2F0ZSkpIHtcbiAgICAvLyByZW1vdmUgYW55IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgIHByZWRpY2F0ZSA9ICh2KSA9PiAhXy5pc1VuZGVmaW5lZCh2KTtcbiAgfSBlbHNlIGlmICghXy5pc0Z1bmN0aW9uKHByZWRpY2F0ZSkpIHtcbiAgICAvLyBtYWtlIHByZWRpY2F0ZSBpbnRvIGEgZnVuY3Rpb25cbiAgICBjb25zdCB2YWx1ZVByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICBwcmVkaWNhdGUgPSAodikgPT4gdiA9PT0gdmFsdWVQcmVkaWNhdGU7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmICghcHJlZGljYXRlKG9ialtrZXldLCBvYmopKSB7XG4gICAgICBkZWxldGUgbmV3T2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29udmVydHMgbnVtYmVyIG9mIGJ5dGVzIHRvIGEgcmVhZGFibGUgc2l6ZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBieXRlcyAtIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGFjdHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGZvciBleGFtcGxlXG4gKiAgICAgICAgICAgICAgICAgICAnMS4wMCBLQicgZm9yICcxMDI0IEInXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYnl0ZXMgY291bnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIG9yXG4gKiAgICAgICAgICAgICAgICAgaWYgaXQgaXMgbGVzcyB0aGFuIHplcm8uXG4gKi9cbmZ1bmN0aW9uIHRvUmVhZGFibGVTaXplU3RyaW5nKGJ5dGVzKSB7XG4gIGNvbnN0IGludEJ5dGVzID0gcGFyc2VJbnQoU3RyaW5nKGJ5dGVzKSwgMTApO1xuICBpZiAoaXNOYU4oaW50Qnl0ZXMpIHx8IGludEJ5dGVzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgJyR7Ynl0ZXN9JyB0byBhIHJlYWRhYmxlIHNpemUgZm9ybWF0YCk7XG4gIH1cbiAgaWYgKGludEJ5dGVzID49IEdpQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoR2lCICogMS4wKSkudG9GaXhlZCgyKX0gR0JgO1xuICB9IGVsc2UgaWYgKGludEJ5dGVzID49IE1pQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoTWlCICogMS4wKSkudG9GaXhlZCgyKX0gTUJgO1xuICB9IGVsc2UgaWYgKGludEJ5dGVzID49IEtpQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoS2lCICogMS4wKSkudG9GaXhlZCgyKX0gS0JgO1xuICB9XG4gIHJldHVybiBgJHtpbnRCeXRlc30gQmA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgYSBzdWJwYXRoIG9mIHRoZVxuICogcGFydGljdWxhciByb290IGZvbGRlci4gQm90aCBwYXRocyBjYW4gaW5jbHVkZSAuLiBhbmQgLiBzcGVjaWZpZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9yaWdpbmFsUGF0aCBUaGUgYWJzb2x1dGUgZmlsZS9mb2xkZXIgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3QgVGhlIGFic29sdXRlIHJvb3QgZm9sZGVyIHBhdGhcbiAqIEBwYXJhbSB7P2Jvb2xlYW59IGZvcmNlUG9zaXggU2V0IGl0IHRvIHRydWUgaWYgcGF0aHMgbXVzdCBiZSBpbnRlcnByZXRlZCBpbiBQT1NJWCBmb3JtYXRcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBnaXZlbiBvcmlnaW5hbCBwYXRoIGlzIHRoZSBzdWJwYXRoIG9mIHRoZSByb290IGZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IGlmIGFueSBvZiB0aGUgZ2l2ZW4gcGF0aHMgaXMgbm90IGFic29sdXRlXG4gKi9cbmZ1bmN0aW9uIGlzU3ViUGF0aChvcmlnaW5hbFBhdGgsIHJvb3QsIGZvcmNlUG9zaXggPSBudWxsKSB7XG4gIGNvbnN0IHBhdGhPYmogPSBmb3JjZVBvc2l4ID8gcGF0aC5wb3NpeCA6IHBhdGg7XG4gIGZvciAoY29uc3QgcCBvZiBbb3JpZ2luYWxQYXRoLCByb290XSkge1xuICAgIGlmICghcGF0aE9iai5pc0Fic29sdXRlKHApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3B9JyBpcyBleHBlY3RlZCB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRSb290ID0gcGF0aE9iai5ub3JtYWxpemUocm9vdCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aE9iai5ub3JtYWxpemUob3JpZ2luYWxQYXRoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZFJvb3QpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRocyBhcmUgcG9pbnRpbmcgdG8gdGhlIHNhbWUgZmlsZSBzeXN0ZW1cbiAqIGRlc3RpbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoMSAtIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gYSBmaWxlL2ZvbGRlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGgyIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUvZm9sZGVyXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcGF0aE4gLSBaZXJvIG9yIG1vcmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aHMgdG8gZmlsZXMvZm9sZGVyc1xuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IHRydWUgaWYgYWxsIHBhdGhzIGFyZSBwb2ludGluZyB0byB0aGUgc2FtZSBmaWxlIHN5c3RlbSBpdGVtXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzU2FtZURlc3RpbmF0aW9uKHBhdGgxLCBwYXRoMiwgLi4ucGF0aE4pIHtcbiAgY29uc3QgYWxsUGF0aHMgPSBbcGF0aDEsIHBhdGgyLCAuLi5wYXRoTl07XG4gIGlmICghKGF3YWl0IEIucmVkdWNlKGFsbFBhdGhzLCBhc3luYyAoYSwgYikgPT4gYSAmJiAoYXdhaXQgZnMuZXhpc3RzKGIpKSwgdHJ1ZSkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYXJlQWxsSXRlbXNFcXVhbCA9IChhcnIpID0+ICEhYXJyLnJlZHVjZSgoYSwgYikgPT4gKGEgPT09IGIgPyBhIDogTmFOKSk7XG4gIGlmIChhcmVBbGxJdGVtc0VxdWFsKGFsbFBhdGhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IG1hcENiID0gYXN5bmMgKHgpID0+XG4gICAgKFxuICAgICAgYXdhaXQgZnMuc3RhdCh4LCB7XG4gICAgICAgIGJpZ2ludDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgKS5pbm87XG4gIHJldHVybiBhcmVBbGxJdGVtc0VxdWFsKGF3YWl0IEIubWFwKGFsbFBhdGhzLCBtYXBDYikpO1xufVxuXG4vKipcbiAqIENvZXJjZXMgdGhlIGdpdmVuIG51bWJlci9zdHJpbmcgdG8gYSB2YWxpZCB2ZXJzaW9uIHN0cmluZ1xuICpcbiAqIEB0ZW1wbGF0ZSB7Ym9vbGVhbn0gW1N0cmljdD10cnVlXVxuICogQHBhcmFtIHtzdHJpbmd9IHZlciAtIFZlcnNpb24gc3RyaW5nIHRvIGNvZXJjZVxuICogQHBhcmFtIHtTdHJpY3R9IFtzdHJpY3RdIC0gSWYgYHRydWVgIHRoZW4gYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duXG4gKiBpZiBgdmVyYCBjYW5ub3QgYmUgY29lcmNlZFxuICogQHJldHVybnMge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmd8bnVsbH0gQ29lcmNlZCB2ZXJzaW9uIG51bWJlciBvciBudWxsIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlXG4gKiBjb2VyY2VkIGFuZCBzdHJpY3QgbW9kZSBpcyBkaXNhYmxlZFxuICogQHRocm93cyB7RXJyb3J9IGlmIHN0cmljdCBtb2RlIGlzIGVuYWJsZWQgYW5kIGB2ZXJgIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZVZlcnNpb24odmVyLCBzdHJpY3QgPSAvKiogQHR5cGUge1N0cmljdH0gKi8gKHRydWUpKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGAke3Zlcn1gKSk7XG4gIGlmIChzdHJpY3QgJiYgIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7dmVyfScgY2Fubm90IGJlIGNvZXJjZWQgdG8gYSB2YWxpZCB2ZXJzaW9uIG51bWJlcmApO1xuICB9XG4gIHJldHVybiAvKiogQHR5cGUge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmc/fSAqLyAocmVzdWx0KTtcbn1cblxuY29uc3QgU1VQUE9SVEVEX09QRVJBVE9SUyA9IFsnPT0nLCAnIT0nLCAnPicsICc8JywgJz49JywgJzw9JywgJz0nXTtcblxuLyoqXG4gKiBDb21wYXJlcyB0d28gdmVyc2lvbiBzdHJpbmdzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcjEgLSBUaGUgZmlyc3QgdmVyc2lvbiBudW1iZXIgdG8gY29tcGFyZS4gU2hvdWxkIGJlIGEgdmFsaWRcbiAqIHZlcnNpb24gbnVtYmVyIHN1cHBvcnRlZCBieSBzZW12ZXIgcGFyc2VyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcjIgLSBUaGUgc2Vjb25kIHZlcnNpb24gbnVtYmVyIHRvIGNvbXBhcmUuIFNob3VsZCBiZSBhIHZhbGlkXG4gKiB2ZXJzaW9uIG51bWJlciBzdXBwb3J0ZWQgYnkgc2VtdmVyIHBhcnNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIE9uZSBvZiBzdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgb3BlcmF0b3JzOlxuICogPT0sICE9LCA+LCA8LCA8PSwgPj0sID1cbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB0aGUgYWN0dWFsIGNvbXBhcmlzb24gcmVzdWx0XG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gdW5zdXBwb3J0ZWQgb3BlcmF0b3IgaXMgc3VwcGxpZWQgb3IgYW55IG9mIHRoZSBzdXBwbGllZFxuICogdmVyc2lvbiBzdHJpbmdzIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyh2ZXIxLCBvcGVyYXRvciwgdmVyMikge1xuICBpZiAoIVNVUFBPUlRFRF9PUEVSQVRPUlMuaW5jbHVkZXMob3BlcmF0b3IpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSAnJHtvcGVyYXRvcn0nIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgIGBPbmx5ICcke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9PUEVSQVRPUlMpfScgb3BlcmF0b3JzIGFyZSBzdXBwb3J0ZWRgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlbXZlck9wZXJhdG9yID0gWyc9PScsICchPSddLmluY2x1ZGVzKG9wZXJhdG9yKSA/ICc9JyA6IG9wZXJhdG9yO1xuICBjb25zdCByZXN1bHQgPSBzZW12ZXIuc2F0aXNmaWVzKGNvZXJjZVZlcnNpb24odmVyMSksIGAke3NlbXZlck9wZXJhdG9yfSR7Y29lcmNlVmVyc2lvbih2ZXIyKX1gKTtcbiAgcmV0dXJuIG9wZXJhdG9yID09PSAnIT0nID8gIXJlc3VsdCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBZGQgYXBwcm9wcmlhdGUgcXVvdGVzIHRvIGNvbW1hbmQgYXJndW1lbnRzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL25vZGUtc2hlbGwtcXVvdGVcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gYXJncyAtIFRoZSBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhcnNlZFxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgYXJndW1lbnRzLCBxdW90ZWRcbiAqL1xuZnVuY3Rpb24gcXVvdGUoYXJncykge1xuICByZXR1cm4gc2hlbGxRdW90ZShfLmNhc3RBcnJheShhcmdzKSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgdG8gd29ya2Fyb3VuZCB1bmV4cGVjdGVkIG1lbW9yeSBsZWFrc1xuICogY2F1c2VkIGJ5IE5vZGVKUyBzdHJpbmcgaW50ZXJuaW5nXG4gKiBiZWhhdmlvciBkZXNjcmliZWQgaW4gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Mjg2OVxuICpcbiAqIEBwYXJhbSB7Kn0gcyAtIFRoZSBzdHJpbmcgdG8gdW5sZWFrXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEVpdGhlciB0aGUgdW5sZWFrZWQgc3RyaW5nIG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgY29udmVydGVkIHRvIHN0cmluZ1xuICovXG5mdW5jdGlvbiB1bmxlYWtTdHJpbmcocykge1xuICByZXR1cm4gYCAke3N9YC5zdWJzdHIoMSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgUGx1cmFsaXplT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbaW5jbHVzaXZlPWZhbHNlXSAtIFdoZXRoZXIgdG8gcHJlZml4IHdpdGggdGhlIG51bWJlciAoZS5nLiwgMyBkdWNrcylcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgZm9ybSBvZiBhIHdvcmQgYXBwcm9wcmlhdGUgdG8gdGhlIGNvdW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmQgLSBUaGUgd29yZCB0byBwbHVyYWxpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIEhvdyBtYW55IG9mIHRoZSB3b3JkIGV4aXN0XG4gKiBAcGFyYW0ge1BsdXJhbGl6ZU9wdGlvbnN8Ym9vbGVhbn0gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIHdvcmQgcGx1cmFsaXphdGlvbixcbiAqICAgb3IgYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG9wdGlvbnMuaW5jbHVzaXZlIHByb3BlcnR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgd29yZCBwbHVyYWxpemVkIGFjY29yZGluZyB0byB0aGUgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZSh3b3JkLCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBpbmNsdXNpdmUgPSBmYWxzZTtcbiAgaWYgKF8uaXNCb29sZWFuKG9wdGlvbnMpKSB7XG4gICAgLy8gaWYgcGFzc2VkIGluIGFzIGEgYm9vbGVhblxuICAgIGluY2x1c2l2ZSA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAoXy5pc0Jvb2xlYW4ob3B0aW9ucz8uaW5jbHVzaXZlKSkge1xuICAgIC8vIGlmIHBhc3NlZCBpbiBhcyBhbiBvcHRpb25zIGhhc2hcbiAgICBpbmNsdXNpdmUgPSBvcHRpb25zLmluY2x1c2l2ZTtcbiAgfVxuICByZXR1cm4gcGx1cmFsaXplTGliKHdvcmQsIGNvdW50LCBpbmNsdXNpdmUpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIEVuY29kaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhTaXplPTEwNzM3NDE4MjRdIFRoZSBtYXhpbXVtIHNpemUgb2ZcbiAqIHRoZSByZXN1bHRpbmcgYnVmZmVyIGluIGJ5dGVzLiBUaGlzIGlzIHNldCB0byAxR0IgYnkgZGVmYXVsdCwgYmVjYXVzZVxuICogQXBwaXVtIGxpbWl0cyB0aGUgbWF4aW11bSBIVFRQIGJvZHkgc2l6ZSB0byAxR0IuIEFsc28sIHRoZSBOb2RlSlMgaGVhcFxuICogc2l6ZSBtdXN0IGJlIGVub3VnaCB0byBrZWVwIHRoZSByZXN1bHRpbmcgb2JqZWN0ICh1c3VhbGx5IHRoaXMgc2l6ZSBpc1xuICogbGltaXRlZCB0byAxLjQgR0IpXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyBjb250ZW50cyBvZiBhIGxvY2FsIGZpbGUgdG8gYW4gaW4tbWVtb3J5IGJhc2UtNjQgZW5jb2RlZCBidWZmZXIuXG4gKiBUaGUgb3BlcmF0aW9uIGlzIG1lbW9yeS11c2FnZSBmcmllbmRseSBhbmQgc2hvdWxkIGJlIHVzZWQgd2hpbGUgZW5jb2RpbmdcbiAqIGxhcmdlIGZpbGVzIHRvIGJhc2U2NFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUgYmVpbmcgZW5jb2RlZFxuICogQHBhcmFtIHtFbmNvZGluZ09wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IGJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIGFzIG1lbW9yeSBidWZmZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmVhZGluZyB0aGUgc291cmNlIGZpbGVcbiAqIG9yIHRoZSBzb3VyY2UgZmlsZSBpcyB0b29cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdG9Jbk1lbW9yeUJhc2U2NChzcmNQYXRoLCBvcHRzID0ge30pIHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHNyY1BhdGgpKSB8fCAoYXdhaXQgZnMuc3RhdChzcmNQYXRoKSkuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBmaWxlOiAke3NyY1BhdGh9YCk7XG4gIH1cblxuICBjb25zdCB7bWF4U2l6ZSA9IDEgKiBHaUJ9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0QnVmZmVycyA9IFtdO1xuICBsZXQgcmVzdWx0QnVmZmVyc1NpemUgPSAwO1xuICBjb25zdCByZXN1bHRXcml0ZVN0cmVhbSA9IG5ldyBzdHJlYW0uV3JpdGFibGUoe1xuICAgIHdyaXRlOiAoYnVmZmVyLCBlbmNvZGluZywgbmV4dCkgPT4ge1xuICAgICAgcmVzdWx0QnVmZmVycy5wdXNoKGJ1ZmZlcik7XG4gICAgICByZXN1bHRCdWZmZXJzU2l6ZSArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgaWYgKG1heFNpemUgPiAwICYmIHJlc3VsdEJ1ZmZlcnNTaXplID4gbWF4U2l6ZSkge1xuICAgICAgICByZXN1bHRXcml0ZVN0cmVhbS5lbWl0KFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYCArXG4gICAgICAgICAgICAgIGBidWZmZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuICR7dG9SZWFkYWJsZVNpemVTdHJpbmcobWF4U2l6ZSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG5leHQoKTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCByZWFkZXJTdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHNyY1BhdGgpO1xuICBjb25zdCBiYXNlNjRFbmNvZGVyU3RyZWFtID0gbmV3IEJhc2U2NEVuY29kZSgpO1xuICBjb25zdCByZXN1bHRXcml0ZVN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVzdWx0V3JpdGVTdHJlYW0ub25jZSgnZXJyb3InLCAoZSkgPT4ge1xuICAgICAgcmVhZGVyU3RyZWFtLnVucGlwZShiYXNlNjRFbmNvZGVyU3RyZWFtKTtcbiAgICAgIGJhc2U2NEVuY29kZXJTdHJlYW0udW5waXBlKHJlc3VsdFdyaXRlU3RyZWFtKTtcbiAgICAgIHJlYWRlclN0cmVhbS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoZSk7XG4gICAgfSk7XG4gICAgcmVzdWx0V3JpdGVTdHJlYW0ub25jZSgnZmluaXNoJywgcmVzb2x2ZSk7XG4gIH0pO1xuICBjb25zdCByZWFkU3RyZWFtUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZWFkZXJTdHJlYW0ub25jZSgnY2xvc2UnLCByZXNvbHZlKTtcbiAgICByZWFkZXJTdHJlYW0ub25jZSgnZXJyb3InLCAoZSkgPT5cbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byByZWFkICcke3NyY1BhdGh9JzogJHtlLm1lc3NhZ2V9YCkpXG4gICAgKTtcbiAgfSk7XG4gIHJlYWRlclN0cmVhbS5waXBlKGJhc2U2NEVuY29kZXJTdHJlYW0pO1xuICBiYXNlNjRFbmNvZGVyU3RyZWFtLnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuXG4gIGF3YWl0IEIuYWxsKFtyZWFkU3RyZWFtUHJvbWlzZSwgcmVzdWx0V3JpdGVTdHJlYW1Qcm9taXNlXSk7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KHJlc3VsdEJ1ZmZlcnMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIExvY2tGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0PTEyMF0gVGhlIG1heCB0aW1lIGluIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGxvY2tcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyeVJlY292ZXJ5PWZhbHNlXSBXaGV0aGVyIHRvIHRyeSBsb2NrIHJlY292ZXJ5IGlmXG4gKiB0aGUgZmlyc3QgYXR0ZW1wdCB0byBhY3F1aXJlIGl0IHRpbWVkIG91dC5cbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBhbiBhc3luYyBmdW5jdGlvbiB3aGljaCwgd2hlbiBjYWxsZWQsIHdpbGwgbm90IHByb2NlZWQgdW50aWwgYSBjZXJ0YWluIGZpbGUgaXMgbm9cbiAqIGxvbmdlciBwcmVzZW50IG9uIHRoZSBzeXN0ZW0uIFRoaXMgYWxsb3dzIGZvciBwcmV2ZW50aW5nIGNvbmN1cnJlbnQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3Nlc1xuICogdXNpbmcgYSBrbm93biBsb2NrZmlsZSBwYXRoLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9ja0ZpbGUgVGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZSB1c2VkIGZvciB0aGUgbG9ja1xuICogQHBhcmFtIHtMb2NrRmlsZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIGFzeW5jIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW5vdGhlciBhc3luYyBmdW5jdGlvbiBkZWZpbmluZyB0aGUgbG9ja2VkXG4gKiBiZWhhdmlvclxuICovXG5mdW5jdGlvbiBnZXRMb2NrRmlsZUd1YXJkKGxvY2tGaWxlLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge3RpbWVvdXQgPSAxMjAsIHRyeVJlY292ZXJ5ID0gZmFsc2V9ID0gb3B0cztcblxuICBjb25zdCBsb2NrID0gLyoqIEB0eXBlIHsobG9ja2ZpbGU6IHN0cmluZywgb3B0czogaW1wb3J0KCdsb2NrZmlsZScpLk9wdGlvbnMpPT5CPHZvaWQ+fSAqLyAoXG4gICAgQi5wcm9taXNpZnkoX2xvY2tmaWxlLmxvY2spXG4gICk7XG4gIGNvbnN0IGNoZWNrID0gQi5wcm9taXNpZnkoX2xvY2tmaWxlLmNoZWNrKTtcbiAgY29uc3QgdW5sb2NrID0gQi5wcm9taXNpZnkoX2xvY2tmaWxlLnVubG9jayk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBUfSBiZWhhdmlvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn1cbiAgICovXG4gIGNvbnN0IGd1YXJkID0gYXN5bmMgKGJlaGF2aW9yKSA9PiB7XG4gICAgbGV0IHRyaWVkUmVjb3ZlcnkgPSBmYWxzZTtcbiAgICBkbyB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBpZiB0aGUgbG9ja2ZpbGUgZG9lc24ndCBleGlzdCwgbG9jayBpdCBzeW5jaHJvbm91c2x5IHRvIG1ha2Ugc3VyZSBubyBvdGhlciBjYWxsXG4gICAgICAgIC8vIG9uIHRoZSBzYW1lIHNwaW4gb2YgdGhlIGV2ZW50IGxvb3AgY2FuIGFsc28gaW5pdGlhdGUgYSBsb2NrLiBJZiB0aGUgbG9ja2ZpbGUgZG9lcyBleGlzdFxuICAgICAgICAvLyB0aGVuIGp1c3QgdXNlIHRoZSByZWd1bGFyIGFzeW5jICdsb2NrJyBtZXRob2Qgd2hpY2ggd2lsbCB3YWl0IG9uIHRoZSBsb2NrLlxuICAgICAgICBpZiAoX2xvY2tmaWxlLmNoZWNrU3luYyhsb2NrRmlsZSkpIHtcbiAgICAgICAgICBhd2FpdCBsb2NrKGxvY2tGaWxlLCB7d2FpdDogdGltZW91dCAqIDEwMDB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfbG9ja2ZpbGUubG9ja1N5bmMobG9ja0ZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoXy5pbmNsdWRlcyhlLm1lc3NhZ2UsICdFRVhJU1QnKSAmJiB0cnlSZWNvdmVyeSAmJiAhdHJpZWRSZWNvdmVyeSkge1xuICAgICAgICAgIC8vIFRoZXJlIGNvdWxkIGJlIGNhc2VzIHdoZXJlIGEgcHJvY2VzcyBoYXMgYmVlbiBmb3JjZWZ1bGx5IHRlcm1pbmF0ZWRcbiAgICAgICAgICAvLyB3aXRob3V0IGEgY2hhbmNlIHRvIGNsZWFuIHVwIHBlbmRpbmcgbG9ja3M6IGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vbG9ja2ZpbGUvaXNzdWVzLzI2XG4gICAgICAgICAgX2xvY2tmaWxlLnVubG9ja1N5bmMobG9ja0ZpbGUpO1xuICAgICAgICAgIHRyaWVkUmVjb3ZlcnkgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGFjcXVpcmUgbG9jayBvbiAnJHtsb2NrRmlsZX0nIGFmdGVyICR7dGltZW91dH1zLiBgICtcbiAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgIH0gd2hpbGUgKHRydWUpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYmVoYXZpb3IoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gd2hldGhlciB0aGUgYmVoYXZpb3Igc3VjY2VlZGVkIG9yIG5vdCwgZ2V0IHJpZCBvZiB0aGUgbG9ja1xuICAgICAgYXdhaXQgdW5sb2NrKGxvY2tGaWxlKTtcbiAgICB9XG4gIH07XG5cbiAgZ3VhcmQuY2hlY2sgPSBhc3luYyAoKSA9PiBhd2FpdCBjaGVjayhsb2NrRmlsZSk7XG5cbiAgcmV0dXJuIGd1YXJkO1xufVxuXG5leHBvcnQge1xuICBoYXNWYWx1ZSxcbiAgZXNjYXBlU3BhY2UsXG4gIGVzY2FwZVNwZWNpYWxDaGFycyxcbiAgbG9jYWxJcCxcbiAgY2FuY2VsbGFibGVEZWxheSxcbiAgbXVsdGlSZXNvbHZlLFxuICBzYWZlSnNvblBhcnNlLFxuICB3cmFwRWxlbWVudCxcbiAgdW53cmFwRWxlbWVudCxcbiAgZmlsdGVyT2JqZWN0LFxuICB0b1JlYWRhYmxlU2l6ZVN0cmluZyxcbiAgaXNTdWJQYXRoLFxuICBXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUixcbiAgaXNTYW1lRGVzdGluYXRpb24sXG4gIGNvbXBhcmVWZXJzaW9ucyxcbiAgY29lcmNlVmVyc2lvbixcbiAgcXVvdGUsXG4gIHVubGVha1N0cmluZyxcbiAganNvblN0cmluZ2lmeSxcbiAgcGx1cmFsaXplLFxuICBHaUIsXG4gIE1pQixcbiAgS2lCLFxuICB0b0luTWVtb3J5QmFzZTY0LFxuICB1dWlkVjEsXG4gIHV1aWRWMyxcbiAgdXVpZFY0LFxuICB1dWlkVjUsXG4gIHNoZWxsUGFyc2UsXG4gIGdldExvY2tGaWxlR3VhcmQsXG59O1xuXG4vKipcbiAqIEEgYHN0cmluZ2Agd2hpY2ggaXMgbmV2ZXIgYCcnYC5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyAnJyA/IG5ldmVyIDogVH0gTm9uRW1wdHlTdHJpbmdcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBT0E7Ozs7QUFFQSxNQUFNQSwwQkFBMEIsR0FBRyxxQ0FBbkM7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHLElBQVo7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHRCxHQUFHLEdBQUcsSUFBbEI7O0FBQ0EsTUFBTUUsR0FBRyxH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
508
+ exports.getLockFileGuard = getLockFileGuard;
509
+ /**
510
+ * A `string` which is never `''`.
511
+ *
512
+ * @template {string} T
513
+ * @typedef {T extends '' ? never : T} NonEmptyString
514
+ */
515
+ //# sourceMappingURL=util.js.map