util.js
50.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.hasContent = hasContent;
exports.hasValue = hasValue;
exports.escapeSpace = escapeSpace;
exports.escapeSpecialChars = escapeSpecialChars;
exports.localIp = localIp;
exports.cancellableDelay = cancellableDelay;
exports.multiResolve = multiResolve;
exports.safeJsonParse = safeJsonParse;
exports.wrapElement = wrapElement;
exports.unwrapElement = unwrapElement;
exports.filterObject = filterObject;
exports.toReadableSizeString = toReadableSizeString;
exports.isSubPath = isSubPath;
exports.isSameDestination = isSameDestination;
exports.compareVersions = compareVersions;
exports.coerceVersion = coerceVersion;
exports.quote = quote;
exports.unleakString = unleakString;
exports.jsonStringify = jsonStringify;
exports.pluralize = pluralize;
exports.toInMemoryBase64 = toInMemoryBase64;
exports.getLockFileGuard = getLockFileGuard;
Object.defineProperty(exports, "shellParse", {
enumerable: true,
get: function () {
return _shellQuote.parse;
}
});
Object.defineProperty(exports, "uuidV1", {
enumerable: true,
get: function () {
return _uuid.v1;
}
});
Object.defineProperty(exports, "uuidV3", {
enumerable: true,
get: function () {
return _uuid.v3;
}
});
Object.defineProperty(exports, "uuidV4", {
enumerable: true,
get: function () {
return _uuid.v4;
}
});
Object.defineProperty(exports, "uuidV5", {
enumerable: true,
get: function () {
return _uuid.v5;
}
});
exports.KiB = exports.MiB = exports.GiB = exports.W3C_WEB_ELEMENT_IDENTIFIER = void 0;
require("source-map-support/register");
var _bluebird = _interopRequireDefault(require("bluebird"));
var _lodash = _interopRequireDefault(require("lodash"));
var _os = _interopRequireDefault(require("os"));
var _path = _interopRequireDefault(require("path"));
var _fs = _interopRequireDefault(require("./fs"));
var _semver = _interopRequireDefault(require("semver"));
var _shellQuote = require("shell-quote");
var _pluralize = _interopRequireDefault(require("pluralize"));
var _stream = _interopRequireDefault(require("stream"));
var _base64Stream = require("base64-stream");
var _uuid = require("uuid");
var _lockfile2 = _interopRequireDefault(require("lockfile"));
const W3C_WEB_ELEMENT_IDENTIFIER = 'element-6066-11e4-a52e-4f735466cecf';
exports.W3C_WEB_ELEMENT_IDENTIFIER = W3C_WEB_ELEMENT_IDENTIFIER;
const KiB = 1024;
exports.KiB = KiB;
const MiB = KiB * 1024;
exports.MiB = MiB;
const GiB = MiB * 1024;
exports.GiB = GiB;
function hasContent(val) {
return _lodash.default.isString(val) && val !== '';
}
function hasValue(val) {
let hasVal = false;
if (_lodash.default.isNumber(val)) {
hasVal = !_lodash.default.isNaN(val);
} else {
hasVal = !_lodash.default.isUndefined(val) && !_lodash.default.isNull(val);
}
return hasVal;
}
function escapeSpace(str) {
return str.split(/ /).join('\\ ');
}
function escapeSpecialChars(str, quoteEscape) {
if (typeof str !== 'string') {
return str;
}
if (typeof quoteEscape === 'undefined') {
quoteEscape = false;
}
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, "\\'");
if (quoteEscape) {
let re = new RegExp(quoteEscape, 'g');
str = str.replace(re, `\\${quoteEscape}`);
}
return str;
}
function localIp() {
let ip = _lodash.default.chain(_os.default.networkInterfaces()).values().flatten().filter(function (val) {
return val.family === 'IPv4' && val.internal === false;
}).map('address').first().value();
return ip;
}
function cancellableDelay(ms) {
let timer;
let resolve;
let reject;
const delay = new _bluebird.default.Promise((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
timer = setTimeout(function () {
resolve();
}, ms);
});
delay.cancel = function () {
clearTimeout(timer);
reject(new _bluebird.default.CancellationError());
};
return delay;
}
function multiResolve(roots, ...args) {
return roots.map(root => _path.default.resolve(root, ...args));
}
function safeJsonParse(obj) {
try {
return JSON.parse(obj);
} catch (ign) {
return obj;
}
}
function jsonStringify(obj, replacer, space = 2) {
if (!_lodash.default.isFunction(replacer)) {
replacer = (k, v) => v;
}
const bufferToJSON = Buffer.prototype.toJSON;
delete Buffer.prototype.toJSON;
try {
return JSON.stringify(obj, (key, value) => {
const updatedValue = Buffer.isBuffer(value) ? value.toString('utf8') : value;
return replacer(key, updatedValue);
}, space);
} finally {
Buffer.prototype.toJSON = bufferToJSON;
}
}
function unwrapElement(el) {
for (const propName of [W3C_WEB_ELEMENT_IDENTIFIER, 'ELEMENT']) {
if (_lodash.default.has(el, propName)) {
return el[propName];
}
}
return el;
}
function wrapElement(elementId) {
return {
ELEMENT: elementId,
[W3C_WEB_ELEMENT_IDENTIFIER]: elementId
};
}
function filterObject(obj, predicate) {
let newObj = _lodash.default.clone(obj);
if (_lodash.default.isUndefined(predicate)) {
predicate = v => !_lodash.default.isUndefined(v);
} else if (!_lodash.default.isFunction(predicate)) {
const valuePredicate = predicate;
predicate = v => v === valuePredicate;
}
for (const key of Object.keys(obj)) {
if (!predicate(obj[key], obj)) {
delete newObj[key];
}
}
return newObj;
}
function toReadableSizeString(bytes) {
const intBytes = parseInt(bytes, 10);
if (isNaN(intBytes) || intBytes < 0) {
throw new Error(`Cannot convert '${bytes}' to a readable size format`);
}
if (intBytes >= GiB) {
return `${parseFloat(intBytes / (GiB * 1.0)).toFixed(2)} GB`;
} else if (intBytes >= MiB) {
return `${parseFloat(intBytes / (MiB * 1.0)).toFixed(2)} MB`;
} else if (intBytes >= KiB) {
return `${parseFloat(intBytes / (KiB * 1.0)).toFixed(2)} KB`;
}
return `${intBytes} B`;
}
function isSubPath(originalPath, root, forcePosix = null) {
const pathObj = forcePosix ? _path.default.posix : _path.default;
for (const p of [originalPath, root]) {
if (!pathObj.isAbsolute(p)) {
throw new Error(`'${p}' is expected to be an absolute path`);
}
}
const normalizedRoot = pathObj.normalize(root);
const normalizedPath = pathObj.normalize(originalPath);
return normalizedPath.startsWith(normalizedRoot);
}
async function isSameDestination(path1, path2, ...pathN) {
const allPaths = [path1, path2, ...pathN];
if (!(await _bluebird.default.reduce(allPaths, async (a, b) => a && (await _fs.default.exists(b)), true))) {
return false;
}
const areAllItemsEqual = arr => !!arr.reduce((a, b) => a === b ? a : NaN);
if (areAllItemsEqual(allPaths)) {
return true;
}
let mapCb = async x => await _fs.default.stat(x, {
bigint: true
}).ino;
if (_semver.default.lt(process.version, '10.5.0')) {
mapCb = async x => await _fs.default.stat(x).ino;
}
return areAllItemsEqual(await _bluebird.default.map(allPaths, mapCb));
}
function coerceVersion(ver, strict = true) {
const result = _semver.default.valid(_semver.default.coerce(`${ver}`));
if (strict && !result) {
throw new Error(`'${ver}' cannot be coerced to a valid version number`);
}
return result;
}
const SUPPORTED_OPERATORS = ['==', '!=', '>', '<', '>=', '<=', '='];
function compareVersions(ver1, operator, ver2) {
if (!SUPPORTED_OPERATORS.includes(operator)) {
throw new Error(`The '${operator}' comparison operator is not supported. ` + `Only '${JSON.stringify(SUPPORTED_OPERATORS)}' operators are supported`);
}
const semverOperator = ['==', '!='].includes(operator) ? '=' : operator;
const result = _semver.default.satisfies(coerceVersion(ver1), `${semverOperator}${coerceVersion(ver2)}`);
return operator === '!=' ? !result : result;
}
function quote(args) {
return (0, _shellQuote.quote)(args);
}
function unleakString(s) {
return ` ${s}`.substr(1);
}
function pluralize(word, count, options = {}) {
let inclusive = false;
if (_lodash.default.isBoolean(options)) {
inclusive = options;
} else if (_lodash.default.isBoolean(options === null || options === void 0 ? void 0 : options.inclusive)) {
inclusive = options.inclusive;
}
return (0, _pluralize.default)(word, count, inclusive);
}
async function toInMemoryBase64(srcPath, opts = {}) {
if (!(await _fs.default.exists(srcPath)) || (await _fs.default.stat(srcPath)).isDirectory()) {
throw new Error(`No such file: ${srcPath}`);
}
const {
maxSize = 1 * GiB
} = opts;
const resultBuffers = [];
let resultBuffersSize = 0;
const resultWriteStream = new _stream.default.Writable({
write: (buffer, encoding, next) => {
resultBuffers.push(buffer);
resultBuffersSize += buffer.length;
if (maxSize > 0 && resultBuffersSize > maxSize) {
resultWriteStream.emit('error', new Error(`The size of the resulting ` + `buffer must not be greater than ${toReadableSizeString(maxSize)}`));
}
next();
}
});
const readerStream = _fs.default.createReadStream(srcPath);
const base64EncoderStream = new _base64Stream.Base64Encode();
const resultWriteStreamPromise = new _bluebird.default((resolve, reject) => {
resultWriteStream.once('error', e => {
readerStream.unpipe(base64EncoderStream);
base64EncoderStream.unpipe(resultWriteStream);
readerStream.destroy();
reject(e);
});
resultWriteStream.once('finish', resolve);
});
const readStreamPromise = new _bluebird.default((resolve, reject) => {
readerStream.once('close', resolve);
readerStream.once('error', e => reject(new Error(`Failed to read '${srcPath}': ${e.message}`)));
});
readerStream.pipe(base64EncoderStream);
base64EncoderStream.pipe(resultWriteStream);
await _bluebird.default.all([readStreamPromise, resultWriteStreamPromise]);
return Buffer.concat(resultBuffers);
}
function getLockFileGuard(lockFile, opts = {}) {
const {
timeout = 120,
tryRecovery = false
} = opts;
const lock = _bluebird.default.promisify(_lockfile2.default.lock);
const check = _bluebird.default.promisify(_lockfile2.default.check);
const unlock = _bluebird.default.promisify(_lockfile2.default.unlock);
const guard = async behavior => {
let triedRecovery = false;
do {
try {
if (_lockfile2.default.checkSync(lockFile)) {
await lock(lockFile, {
wait: timeout * 1000
});
} else {
_lockfile2.default.lockSync(lockFile);
}
break;
} catch (e) {
if (_lodash.default.includes(e.message, 'EEXIST') && tryRecovery && !triedRecovery) {
_lockfile2.default.unlockSync(lockFile);
triedRecovery = true;
continue;
}
throw new Error(`Could not acquire lock on '${lockFile}' after ${timeout}s. ` + `Original error: ${e.message}`);
}
} while (true);
try {
return await behavior();
} finally {
await unlock(lockFile);
}
};
guard.check = async () => await check(lockFile);
return guard;
}require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlsLmpzIl0sIm5hbWVzIjpbIlczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSIiwiS2lCIiwiTWlCIiwiR2lCIiwiaGFzQ29udGVudCIsInZhbCIsIl8iLCJpc1N0cmluZyIsImhhc1ZhbHVlIiwiaGFzVmFsIiwiaXNOdW1iZXIiLCJpc05hTiIsImlzVW5kZWZpbmVkIiwiaXNOdWxsIiwiZXNjYXBlU3BhY2UiLCJzdHIiLCJzcGxpdCIsImpvaW4iLCJlc2NhcGVTcGVjaWFsQ2hhcnMiLCJxdW90ZUVzY2FwZSIsInJlcGxhY2UiLCJyZSIsIlJlZ0V4cCIsImxvY2FsSXAiLCJpcCIsImNoYWluIiwib3MiLCJuZXR3b3JrSW50ZXJmYWNlcyIsInZhbHVlcyIsImZsYXR0ZW4iLCJmaWx0ZXIiLCJmYW1pbHkiLCJpbnRlcm5hbCIsIm1hcCIsImZpcnN0IiwidmFsdWUiLCJjYW5jZWxsYWJsZURlbGF5IiwibXMiLCJ0aW1lciIsInJlc29sdmUiLCJyZWplY3QiLCJkZWxheSIsIkIiLCJQcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0Iiwic2V0VGltZW91dCIsImNhbmNlbCIsImNsZWFyVGltZW91dCIsIkNhbmNlbGxhdGlvbkVycm9yIiwibXVsdGlSZXNvbHZlIiwicm9vdHMiLCJhcmdzIiwicm9vdCIsInBhdGgiLCJzYWZlSnNvblBhcnNlIiwib2JqIiwiSlNPTiIsInBhcnNlIiwiaWduIiwianNvblN0cmluZ2lmeSIsInJlcGxhY2VyIiwic3BhY2UiLCJpc0Z1bmN0aW9uIiwiayIsInYiLCJidWZmZXJUb0pTT04iLCJCdWZmZXIiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJzdHJpbmdpZnkiLCJrZXkiLCJ1cGRhdGVkVmFsdWUiLCJpc0J1ZmZlciIsInRvU3RyaW5nIiwidW53cmFwRWxlbWVudCIsImVsIiwicHJvcE5hbWUiLCJoYXMiLCJ3cmFwRWxlbWVudCIsImVsZW1lbnRJZCIsIkVMRU1FTlQiLCJmaWx0ZXJPYmplY3QiLCJwcmVkaWNhdGUiLCJuZXdPYmoiLCJjbG9uZSIsInZhbHVlUHJlZGljYXRlIiwiT2JqZWN0Iiwia2V5cyIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwiYnl0ZXMiLCJpbnRCeXRlcyIsInBhcnNlSW50IiwiRXJyb3IiLCJwYXJzZUZsb2F0IiwidG9GaXhlZCIsImlzU3ViUGF0aCIsIm9yaWdpbmFsUGF0aCIsImZvcmNlUG9zaXgiLCJwYXRoT2JqIiwicG9zaXgiLCJwIiwiaXNBYnNvbHV0ZSIsIm5vcm1hbGl6ZWRSb290Iiwibm9ybWFsaXplIiwibm9ybWFsaXplZFBhdGgiLCJzdGFydHNXaXRoIiwiaXNTYW1lRGVzdGluYXRpb24iLCJwYXRoMSIsInBhdGgyIiwicGF0aE4iLCJhbGxQYXRocyIsInJlZHVjZSIsImEiLCJiIiwiZnMiLCJleGlzdHMiLCJhcmVBbGxJdGVtc0VxdWFsIiwiYXJyIiwiTmFOIiwibWFwQ2IiLCJ4Iiwic3RhdCIsImJpZ2ludCIsImlubyIsInNlbXZlciIsImx0IiwicHJvY2VzcyIsInZlcnNpb24iLCJjb2VyY2VWZXJzaW9uIiwidmVyIiwic3RyaWN0IiwicmVzdWx0IiwidmFsaWQiLCJjb2VyY2UiLCJTVVBQT1JURURfT1BFUkFUT1JTIiwiY29tcGFyZVZlcnNpb25zIiwidmVyMSIsIm9wZXJhdG9yIiwidmVyMiIsImluY2x1ZGVzIiwic2VtdmVyT3BlcmF0b3IiLCJzYXRpc2ZpZXMiLCJxdW90ZSIsInVubGVha1N0cmluZyIsInMiLCJzdWJzdHIiLCJwbHVyYWxpemUiLCJ3b3JkIiwiY291bnQiLCJvcHRpb25zIiwiaW5jbHVzaXZlIiwiaXNCb29sZWFuIiwidG9Jbk1lbW9yeUJhc2U2NCIsInNyY1BhdGgiLCJvcHRzIiwiaXNEaXJlY3RvcnkiLCJtYXhTaXplIiwicmVzdWx0QnVmZmVycyIsInJlc3VsdEJ1ZmZlcnNTaXplIiwicmVzdWx0V3JpdGVTdHJlYW0iLCJzdHJlYW0iLCJXcml0YWJsZSIsIndyaXRlIiwiYnVmZmVyIiwiZW5jb2RpbmciLCJuZXh0IiwicHVzaCIsImxlbmd0aCIsImVtaXQiLCJyZWFkZXJTdHJlYW0iLCJjcmVhdGVSZWFkU3RyZWFtIiwiYmFzZTY0RW5jb2RlclN0cmVhbSIsIkJhc2U2NEVuY29kZSIsInJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZSIsIm9uY2UiLCJlIiwidW5waXBlIiwiZGVzdHJveSIsInJlYWRTdHJlYW1Qcm9taXNlIiwibWVzc2FnZSIsInBpcGUiLCJhbGwiLCJjb25jYXQiLCJnZXRMb2NrRmlsZUd1YXJkIiwibG9ja0ZpbGUiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJsb2NrIiwicHJvbWlzaWZ5IiwiX2xvY2tmaWxlIiwiY2hlY2siLCJ1bmxvY2siLCJndWFyZCIsImJlaGF2aW9yIiwidHJpZWRSZWNvdmVyeSIsImNoZWNrU3luYyIsIndhaXQiLCJsb2NrU3luYyIsInVubG9ja1N5bmMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUtBOztBQUdBLE1BQU1BLDBCQUEwQixHQUFHLHFDQUFuQzs7QUFDQSxNQUFNQyxHQUFHLEdBQUcsSUFBWjs7QUFDQSxNQUFNQyxHQUFHLEdBQUdELEdBQUcsR0FBRyxJQUFsQjs7QUFDQSxNQUFNRSxHQUFHLEdBQUdELEdBQUcsR0FBRyxJQUFsQjs7O0FBRU8sU0FBU0UsVUFBVCxDQUFxQkMsR0FBckIsRUFBMEI7QUFDL0IsU0FBT0MsZ0JBQUVDLFFBQUYsQ0FBV0YsR0FBWCxLQUFtQkEsR0FBRyxLQUFLLEVBQWxDO0FBQ0Q7O0FBR0QsU0FBU0csUUFBVCxDQUFtQkgsR0FBbkIsRUFBd0I7QUFDdEIsTUFBSUksTUFBTSxHQUFHLEtBQWI7O0FBRUEsTUFBSUgsZ0JBQUVJLFFBQUYsQ0FBV0wsR0FBWCxDQUFKLEVBQXFCO0FBQ25CSSxJQUFBQSxNQUFNLEdBQUcsQ0FBQ0gsZ0JBQUVLLEtBQUYsQ0FB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QiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJy4vZnMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvc2hlbGwtcXVvdGVcbiAgcXVvdGUgYXMgc2hlbGxRdW90ZSxcbiAgcGFyc2UgYXMgc2hlbGxQYXJzZSxcbn0gZnJvbSAnc2hlbGwtcXVvdGUnO1xuaW1wb3J0IHBsdXJhbGl6ZUxpYiBmcm9tICdwbHVyYWxpemUnO1xuaW1wb3J0IHN0cmVhbSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgQmFzZTY0RW5jb2RlIH0gZnJvbSAnYmFzZTY0LXN0cmVhbSc7XG5pbXBvcnQge1xuICAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS91dWlkXG4gIHYxIGFzIHV1aWRWMSwgdjMgYXMgdXVpZFYzLFxuICB2NCBhcyB1dWlkVjQsIHY1IGFzIHV1aWRWNVxufSBmcm9tICd1dWlkJztcbmltcG9ydCBfbG9ja2ZpbGUgZnJvbSAnbG9ja2ZpbGUnO1xuXG5cbmNvbnN0IFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSID0gJ2VsZW1lbnQtNjA2Ni0xMWU0LWE1MmUtNGY3MzU0NjZjZWNmJztcbmNvbnN0IEtpQiA9IDEwMjQ7XG5jb25zdCBNaUIgPSBLaUIgKiAxMDI0O1xuY29uc3QgR2lCID0gTWlCICogMTAyNDtcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0NvbnRlbnQgKHZhbCkge1xuICByZXR1cm4gXy5pc1N0cmluZyh2YWwpICYmIHZhbCAhPT0gJyc7XG59XG5cbi8vIHJldHVybiB0cnVlIGlmIHRoZSB0aGUgdmFsdWUgaXMgbm90IHVuZGVmaW5lZCwgbnVsbCwgb3IgTmFOLlxuZnVuY3Rpb24gaGFzVmFsdWUgKHZhbCkge1xuICBsZXQgaGFzVmFsID0gZmFsc2U7XG4gIC8vIGF2b2lkIGluY29ycmVjdGx5IGV2YWx1YXRpbmcgYDBgIGFzIGZhbHNlXG4gIGlmIChfLmlzTnVtYmVyKHZhbCkpIHtcbiAgICBoYXNWYWwgPSAhXy5pc05hTih2YWwpO1xuICB9IGVsc2Uge1xuICAgIGhhc1ZhbCA9ICFfLmlzVW5kZWZpbmVkKHZhbCkgJiYgIV8uaXNOdWxsKHZhbCk7XG4gIH1cblxuICByZXR1cm4gaGFzVmFsO1xufVxuXG4vLyBlc2NhcGUgc3BhY2VzIGluIHN0cmluZywgZm9yIGNvbW1hbmRsaW5lIGNhbGxzXG5mdW5jdGlvbiBlc2NhcGVTcGFjZSAoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAvKS5qb2luKCdcXFxcICcpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVTcGVjaWFsQ2hhcnMgKHN0ciwgcXVvdGVFc2NhcGUpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBpZiAodHlwZW9mIHF1b3RlRXNjYXBlID09PSAndW5kZWZpbmVkJykge1xuICAgIHF1b3RlRXNjYXBlID0gZmFsc2U7XG4gIH1cbiAgc3RyID0gc3RyXG4gICAgLnJlcGxhY2UoL1tcXFxcXS9nLCAnXFxcXFxcXFwnKVxuICAgIC5yZXBsYWNlKC9bXFwvXS9nLCAnXFxcXC8nKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgLnJlcGxhY2UoL1tcXGJdL2csICdcXFxcYicpXG4gICAgLnJlcGxhY2UoL1tcXGZdL2csICdcXFxcZicpXG4gICAgLnJlcGxhY2UoL1tcXG5dL2csICdcXFxcbicpXG4gICAgLnJlcGxhY2UoL1tcXHJdL2csICdcXFxccicpXG4gICAgLnJlcGxhY2UoL1tcXHRdL2csICdcXFxcdCcpXG4gICAgLnJlcGxhY2UoL1tcXFwiXS9nLCAnXFxcXFwiJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICAgIC5yZXBsYWNlKC9cXFxcJy9nLCBcIlxcXFwnXCIpO1xuICBpZiAocXVvdGVFc2NhcGUpIHtcbiAgICBsZXQgcmUgPSBuZXcgUmVnRXhwKHF1b3RlRXNjYXBlLCAnZycpO1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKHJlLCBgXFxcXCR7cXVvdGVFc2NhcGV9YCk7XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gbG9jYWxJcCAoKSB7XG4gIGxldCBpcCA9IF8uY2hhaW4ob3MubmV0d29ya0ludGVyZmFjZXMoKSlcbiAgICAudmFsdWVzKClcbiAgICAuZmxhdHRlbigpXG4gICAgLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gKHZhbC5mYW1pbHkgPT09ICdJUHY0JyAmJiB2YWwuaW50ZXJuYWwgPT09IGZhbHNlKTtcbiAgICB9KVxuICAgIC5tYXAoJ2FkZHJlc3MnKVxuICAgIC5maXJzdCgpXG4gICAgLnZhbHVlKCk7XG4gIHJldHVybiBpcDtcbn1cblxuLypcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgY2FuY2VsbGFibGUsIGFuZCB3aWxsIHRpbWVvdXRcbiAqIGFmdGVyIGBtc2AgZGVsYXlcbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGFibGVEZWxheSAobXMpIHtcbiAgbGV0IHRpbWVyO1xuICBsZXQgcmVzb2x2ZTtcbiAgbGV0IHJlamVjdDtcblxuICBjb25zdCBkZWxheSA9IG5ldyBCLlByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgcmVzb2x2ZSA9IF9yZXNvbHZlO1xuICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9LCBtcyk7XG4gIH0pO1xuXG4gIC8vIG92ZXJyaWRlIEJsdWViaXJkJ3MgYGNhbmNlbGAsIHdoaWNoIGRvZXMgbm90IHdvcmsgd2hlbiB1c2luZyBgYXdhaXRgIG9uXG4gIC8vIGEgcHJvbWlzZSwgc2luY2UgYHJlc29sdmVgL2ByZWplY3RgIGFyZSBuZXZlciBjYWxsZWRcbiAgZGVsYXkuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgcmVqZWN0KG5ldyBCLkNhbmNlbGxhdGlvbkVycm9yKCkpO1xuICB9O1xuICByZXR1cm4gZGVsYXk7XG59XG5cbmZ1bmN0aW9uIG11bHRpUmVzb2x2ZSAocm9vdHMsIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIHJvb3RzLm1hcCgocm9vdCkgPT4gcGF0aC5yZXNvbHZlKHJvb3QsIC4uLmFyZ3MpKTtcbn1cblxuLypcbiAqIFBhcnNlcyBhbiBvYmplY3QgaWYgcG9zc2libGUuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBvYmplY3Qgd2l0aG91dCBwYXJzaW5nLlxuICovXG5mdW5jdGlvbiBzYWZlSnNvblBhcnNlIChvYmopIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvYmopO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICAvLyBpZ25vcmU6IHRoaXMgaXMgbm90IGpzb24gcGFyc2FibGVcbiAgICByZXR1cm4gb2JqO1xuICB9XG59XG5cbi8qXG4gKiBTdHJpbmdpZmllcyB0aGUgb2JqZWN0IHBhc3NlZCBpbiwgY29udmVydGluZyBCdWZmZXJzIGludG8gU3RyaW5ncyBmb3IgYmV0dGVyXG4gKiBkaXNwbGF5LiBUaGlzIG1pbWljcyBKU09OLnN0cmluZ2lmeSAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogZXhjZXB0IHRoZSBgcmVwbGFjZXJgIGFyZ3VtZW50IGNhbiBvbmx5IGJlIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHs/ZnVuY3Rpb259IHJlcGxhY2VyIC0gZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBwcm9wZXJ0aWVzIGFkZGVkIHRvIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBvYmplY3RcbiAqIEBwYXJhbSB7P251bWJlcnxzdHJpbmd9IHNwYWNlIC0gdXNlZCB0byBpbnNlcnQgd2hpdGUgc3BhY2UgaW50byB0aGUgb3V0cHV0IEpTT05cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciByZWFkYWJpbGl0eSBwdXJwb3Nlcy4gRGVmYXVsdHMgdG8gMlxuICogcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBKU09OIG9iamVjdCBzZXJpYWxpemVkIGFzIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdpZnkgKG9iaiwgcmVwbGFjZXIsIHNwYWNlID0gMikge1xuICAvLyBpZiBubyByZXBsYWNlciBpcyBwYXNzZWQsIG9yIGl0IGlzIG5vdCBhIGZ1bmN0aW9uLCBqdXN0IHVzZSBhIHBhc3MtdGhyb3VnaFxuICBpZiAoIV8uaXNGdW5jdGlvbihyZXBsYWNlcikpIHtcbiAgICByZXBsYWNlciA9IChrLCB2KSA9PiB2O1xuICB9XG5cbiAgLy8gQnVmZmVycyBjYW5ub3QgYmUgc2VyaWFsaXplZCBpbiBhIHJlYWRhYmxlIHdheVxuICBjb25zdCBidWZmZXJUb0pTT04gPSBCdWZmZXIucHJvdG90eXBlLnRvSlNPTjtcbiAgZGVsZXRlIEJ1ZmZlci5wcm90b3R5cGUudG9KU09OO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkVmFsdWUgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpXG4gICAgICAgID8gdmFsdWUudG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgICA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHJlcGxhY2VyKGtleSwgdXBkYXRlZFZhbHVlKTtcbiAgICB9LCBzcGFjZSk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gcmVzdG9yZSB0aGUgZnVuY3Rpb24sIHNvIGFzIHRvIG5vdCBicmVhayBmdXJ0aGVyIHNlcmlhbGl6YXRpb25cbiAgICBCdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGJ1ZmZlclRvSlNPTjtcbiAgfVxufVxuXG4vKlxuICogUmVtb3ZlcyB0aGUgd3JhcHBlciBmcm9tIGVsZW1lbnQsIGlmIGl0IGV4aXN0cy5cbiAqICAgeyBFTEVNRU5UOiA0IH0gYmVjb21lcyA0XG4gKiAgIHsgZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2Y6IDUgfSBiZWNvbWVzIDVcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudCAoZWwpIHtcbiAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIsICdFTEVNRU5UJ10pIHtcbiAgICBpZiAoXy5oYXMoZWwsIHByb3BOYW1lKSkge1xuICAgICAgcmV0dXJuIGVsW3Byb3BOYW1lXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVsO1xufVxuXG5mdW5jdGlvbiB3cmFwRWxlbWVudCAoZWxlbWVudElkKSB7XG4gIHJldHVybiB7XG4gICAgRUxFTUVOVDogZWxlbWVudElkLFxuICAgIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IGVsZW1lbnRJZCxcbiAgfTtcbn1cblxuLypcbiAqIFJldHVybnMgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG9yaWdpbmFsIGVsZW1lbnRcbiAqIHdoaWNoIHdlcmUgdHJ1dGh5IGdpdmVuIHRoZSBwcmVkaWNhdGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGlzXG4gKiAgICogbWlzc2luZyAtIGl0IHdpbGwgcmVtb3ZlIGFsbCBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGBcbiAqICAgKiBhIHNjYWxhciAtIGl0IHdpbGwgdGVzdCBhbGwgcHJvcGVydGllcycgdmFsdWVzIGFnYWluc3QgdGhhdCB2YWx1ZVxuICogICAqIGEgZnVuY3Rpb24gLSBpdCB3aWxsIHBhc3MgZWFjaCB2YWx1ZSBhbmQgdGhlIG9yaWdpbmFsIG9iamVjdCBpbnRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBmaWx0ZXJPYmplY3QgKG9iaiwgcHJlZGljYXRlKSB7XG4gIGxldCBuZXdPYmogPSBfLmNsb25lKG9iaik7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByZWRpY2F0ZSkpIHtcbiAgICAvLyByZW1vdmUgYW55IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgIHByZWRpY2F0ZSA9ICh2KSA9PiAhXy5pc1VuZGVmaW5lZCh2KTtcbiAgfSBlbHNlIGlmICghXy5pc0Z1bmN0aW9uKHByZWRpY2F0ZSkpIHtcbiAgICAvLyBtYWtlIHByZWRpY2F0ZSBpbnRvIGEgZnVuY3Rpb25cbiAgICBjb25zdCB2YWx1ZVByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICBwcmVkaWNhdGUgPSAodikgPT4gdiA9PT0gdmFsdWVQcmVkaWNhdGU7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmICghcHJlZGljYXRlKG9ialtrZXldLCBvYmopKSB7XG4gICAgICBkZWxldGUgbmV3T2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29udmVydHMgbnVtYmVyIG9mIGJ5dGVzIHRvIGEgcmVhZGFibGUgc2l6ZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBieXRlcyAtIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGFjdHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGZvciBleGFtcGxlXG4gKiAgICAgICAgICAgICAgICAgICAnMS4wMCBLQicgZm9yICcxMDI0IEInXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYnl0ZXMgY291bnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIG9yXG4gKiAgICAgICAgICAgICAgICAgaWYgaXQgaXMgbGVzcyB0aGFuIHplcm8uXG4gKi9cbmZ1bmN0aW9uIHRvUmVhZGFibGVTaXplU3RyaW5nIChieXRlcykge1xuICBjb25zdCBpbnRCeXRlcyA9IHBhcnNlSW50KGJ5dGVzLCAxMCk7XG4gIGlmIChpc05hTihpbnRCeXRlcykgfHwgaW50Qnl0ZXMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCAnJHtieXRlc30nIHRvIGEgcmVhZGFibGUgc2l6ZSBmb3JtYXRgKTtcbiAgfVxuICBpZiAoaW50Qnl0ZXMgPj0gR2lCKSB7XG4gICAgcmV0dXJuIGAke3BhcnNlRmxvYXQoaW50Qnl0ZXMgLyAoR2lCICogMS4wKSkudG9GaXhlZCgyKX0gR0JgO1xuICB9IGVsc2UgaWYgKGludEJ5dGVzID49IE1pQikge1xuICAgIHJldHVybiBgJHtwYXJzZUZsb2F0KGludEJ5dGVzIC8gKE1pQiAqIDEuMCkpLnRvRml4ZWQoMil9IE1CYDtcbiAgfSBlbHNlIGlmIChpbnRCeXRlcyA+PSBLaUIpIHtcbiAgICByZXR1cm4gYCR7cGFyc2VGbG9hdChpbnRCeXRlcyAvIChLaUIgKiAxLjApKS50b0ZpeGVkKDIpfSBLQmA7XG4gIH1cbiAgcmV0dXJuIGAke2ludEJ5dGVzfSBCYDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBhIHN1YnBhdGggb2YgdGhlXG4gKiBwYXJ0aWN1bGFyIHJvb3QgZm9sZGVyLiBCb3RoIHBhdGhzIGNhbiBpbmNsdWRlIC4uIGFuZCAuIHNwZWNpZmllcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3JpZ2luYWxQYXRoIFRoZSBhYnNvbHV0ZSBmaWxlL2ZvbGRlciBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9vdCBUaGUgYWJzb2x1dGUgcm9vdCBmb2xkZXIgcGF0aFxuICogQHBhcmFtIHs/Ym9vbGVhbn0gZm9yY2VQb3NpeCBTZXQgaXQgdG8gdHJ1ZSBpZiBwYXRocyBtdXN0IGJlIGludGVycHJldGVkIGluIFBPU0lYIGZvcm1hdFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGdpdmVuIG9yaWdpbmFsIHBhdGggaXMgdGhlIHN1YnBhdGggb2YgdGhlIHJvb3QgZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW55IG9mIHRoZSBnaXZlbiBwYXRocyBpcyBub3QgYWJzb2x1dGVcbiAqL1xuZnVuY3Rpb24gaXNTdWJQYXRoIChvcmlnaW5hbFBhdGgsIHJvb3QsIGZvcmNlUG9zaXggPSBudWxsKSB7XG4gIGNvbnN0IHBhdGhPYmogPSBmb3JjZVBvc2l4ID8gcGF0aC5wb3NpeCA6IHBhdGg7XG4gIGZvciAoY29uc3QgcCBvZiBbb3JpZ2luYWxQYXRoLCByb290XSkge1xuICAgIGlmICghcGF0aE9iai5pc0Fic29sdXRlKHApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3B9JyBpcyBleHBlY3RlZCB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRSb290ID0gcGF0aE9iai5ub3JtYWxpemUocm9vdCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aE9iai5ub3JtYWxpemUob3JpZ2luYWxQYXRoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZFJvb3QpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRocyBhcmUgcG9pbnRpbmcgdG8gdGhlIHNhbWUgZmlsZSBzeXN0ZW1cbiAqIGRlc3RpbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoMSAtIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gYSBmaWxlL2ZvbGRlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGgyIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUvZm9sZGVyXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcGF0aE4gLSBaZXJvIG9yIG1vcmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aHMgdG8gZmlsZXMvZm9sZGVyc1xuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYWxsIHBhdGhzIGFyZSBwb2ludGluZyB0byB0aGUgc2FtZSBmaWxlIHN5c3RlbSBpdGVtXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzU2FtZURlc3RpbmF0aW9uIChwYXRoMSwgcGF0aDIsIC4uLnBhdGhOKSB7XG4gIGNvbnN0IGFsbFBhdGhzID0gW3BhdGgxLCBwYXRoMiwgLi4ucGF0aE5dO1xuICBpZiAoIWF3YWl0IEIucmVkdWNlKGFsbFBhdGhzLCBhc3luYyAoYSwgYikgPT4gYSAmJiBhd2FpdCBmcy5leGlzdHMoYiksIHRydWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYXJlQWxsSXRlbXNFcXVhbCA9IChhcnIpID0+ICEhYXJyLnJlZHVjZSgoYSwgYikgPT4gYSA9PT0gYiA/IGEgOiBOYU4pO1xuICBpZiAoYXJlQWxsSXRlbXNFcXVhbChhbGxQYXRocykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE5vZGUgMTAuNS4wIGludHJvZHVjZWQgYmlnaW50IHN1cHBvcnQgaW4gc3RhdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHByZWNpc2lvblxuICAvLyBob3dldmVyIGJlbG93IHRoYXQgdGhlIG9wdGlvbnMgZ2V0IGludGVycHJldGVkIGFzIHRoZSBjYWxsYmFja1xuICAvLyBUT0RPOiByZW1vdmUgd2hlbiBOb2RlIDEwIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiAgbGV0IG1hcENiID0gYXN5bmMgKHgpID0+IGF3YWl0IGZzLnN0YXQoeCwge1xuICAgIGJpZ2ludDogdHJ1ZSxcbiAgfSkuaW5vO1xuICBpZiAoc2VtdmVyLmx0KHByb2Nlc3MudmVyc2lvbiwgJzEwLjUuMCcpKSB7XG4gICAgbWFwQ2IgPSBhc3luYyAoeCkgPT4gYXdhaXQgZnMuc3RhdCh4KS5pbm87XG4gIH1cbiAgcmV0dXJuIGFyZUFsbEl0ZW1zRXF1YWwoYXdhaXQgQi5tYXAoYWxsUGF0aHMsIG1hcENiKSk7XG59XG5cbi8qKlxuICogQ29lcmNlcyB0aGUgZ2l2ZW4gbnVtYmVyL3N0cmluZyB0byBhIHZhbGlkIHZlcnNpb24gc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB2ZXIgLSBWZXJzaW9uIHN0cmluZyB0byBjb2VyY2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc3RyaWN0IFt0cnVlXSAtIElmIHRydWUgdGhlbiBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd25cbiAqIGlmIGB2ZXJgIGNhbm5vdCBiZSBjb2VyY2VkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb2VyY2VkIHZlcnNpb24gbnVtYmVyIG9yIG51bGwgaWYgdGhlIHN0cmluZyBjYW5ub3QgYmVcbiAqIGNvZXJjZWQgYW5kIHN0cmljdCBtb2RlIGlzIGRpc2FibGVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgc3RyaWN0IG1vZGUgaXMgZW5hYmxlZCBhbmQgYHZlcmAgY2Fubm90IGJlIGNvZXJjZWRcbiAqL1xuZnVuY3Rpb24gY29lcmNlVmVyc2lvbiAodmVyLCBzdHJpY3QgPSB0cnVlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGAke3Zlcn1gKSk7XG4gIGlmIChzdHJpY3QgJiYgIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7dmVyfScgY2Fubm90IGJlIGNvZXJjZWQgdG8gYSB2YWxpZCB2ZXJzaW9uIG51bWJlcmApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IFNVUFBPUlRFRF9PUEVSQVRPUlMgPSBbJz09JywgJyE9JywgJz4nLCAnPCcsICc+PScsICc8PScsICc9J107XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIHZlcnNpb24gc3RyaW5nc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdmVyMSAtIFRoZSBmaXJzdCB2ZXJzaW9uIG51bWJlciB0byBjb21wYXJlLiBTaG91bGQgYmUgYSB2YWxpZFxuICogdmVyc2lvbiBudW1iZXIgc3VwcG9ydGVkIGJ5IHNlbXZlciBwYXJzZXIuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHZlcjIgLSBUaGUgc2Vjb25kIHZlcnNpb24gbnVtYmVyIHRvIGNvbXBhcmUuIFNob3VsZCBiZSBhIHZhbGlkXG4gKiB2ZXJzaW9uIG51bWJlciBzdXBwb3J0ZWQgYnkgc2VtdmVyIHBhcnNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIE9uZSBvZiBzdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgb3BlcmF0b3JzOlxuICogPT0sICE9LCA+LCA8LCA8PSwgPj0sID1cbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB0aGUgYWN0dWFsIGNvbXBhcmlzb24gcmVzdWx0XG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gdW5zdXBwb3J0ZWQgb3BlcmF0b3IgaXMgc3VwcGxpZWQgb3IgYW55IG9mIHRoZSBzdXBwbGllZFxuICogdmVyc2lvbiBzdHJpbmdzIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyAodmVyMSwgb3BlcmF0b3IsIHZlcjIpIHtcbiAgaWYgKCFTVVBQT1JURURfT1BFUkFUT1JTLmluY2x1ZGVzKG9wZXJhdG9yKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlICcke29wZXJhdG9yfScgY29tcGFyaXNvbiBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkLiBgICtcbiAgICAgIGBPbmx5ICcke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9PUEVSQVRPUlMpfScgb3BlcmF0b3JzIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuXG4gIGNvbnN0IHNlbXZlck9wZXJhdG9yID0gWyc9PScsICchPSddLmluY2x1ZGVzKG9wZXJhdG9yKSA/ICc9JyA6IG9wZXJhdG9yO1xuICBjb25zdCByZXN1bHQgPSBzZW12ZXIuc2F0aXNmaWVzKGNvZXJjZVZlcnNpb24odmVyMSksIGAke3NlbXZlck9wZXJhdG9yfSR7Y29lcmNlVmVyc2lvbih2ZXIyKX1gKTtcbiAgcmV0dXJuIG9wZXJhdG9yID09PSAnIT0nID8gIXJlc3VsdCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBZGQgYXBwcm9wcmlhdGUgcXVvdGVzIHRvIGNvbW1hbmQgYXJndW1lbnRzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL25vZGUtc2hlbGwtcXVvdGVcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSAtIFRoZSBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhcnNlZFxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgYXJndW1lbnRzLCBxdW90ZWRcbiAqL1xuZnVuY3Rpb24gcXVvdGUgKGFyZ3MpIHtcbiAgcmV0dXJuIHNoZWxsUXVvdGUoYXJncyk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgdG8gd29ya2Fyb3VuZCB1bmV4cGVjdGVkIG1lbW9yeSBsZWFrc1xuICogY2F1c2VkIGJ5IE5vZGVKUyBzdHJpbmcgaW50ZXJuaW5nXG4gKiBiZWhhdmlvciBkZXNjcmliZWQgaW4gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Mjg2OVxuICpcbiAqIEBwYXJhbSB7Kn0gcyAtIFRoZSBzdHJpbmcgdG8gdW5sZWFrXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEVpdGhlciB0aGUgdW5sZWFrZWQgc3RyaW5nIG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgY29udmVydGVkIHRvIHN0cmluZ1xuICovXG5mdW5jdGlvbiB1bmxlYWtTdHJpbmcgKHMpIHtcbiAgcmV0dXJuIGAgJHtzfWAuc3Vic3RyKDEpO1xufVxuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGx1cmFsaXplT3B0aW9uc1xuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gaW5jbHVzaXZlIFtmYWxzZV0gLSBXaGV0aGVyIHRvIHByZWZpeCB3aXRoIHRoZSBudW1iZXIgKGUuZy4sIDMgZHVja3MpXG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIGZvcm0gb2YgYSB3b3JkIGFwcHJvcHJpYXRlIHRvIHRoZSBjb3VudFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkIC0gVGhlIHdvcmQgdG8gcGx1cmFsaXplXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBIb3cgbWFueSBvZiB0aGUgd29yZCBleGlzdFxuICogQHBhcmFtIHs/UGx1cmFsaXplT3B0aW9uc3xib29sZWFufSBvcHRpb25zfGluY2x1c2l2ZSAtIG9wdGlvbnMgZm9yIHdvcmQgcGx1cmFsaXphdGlvbixcbiAqICAgb3IgYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG9wdGlvbnMuaW5jbHVzaXZlIHByb3BlcnR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgd29yZCBwbHVyYWxpemVkIGFjY29yZGluZyB0byB0aGUgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZSAod29yZCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICBsZXQgaW5jbHVzaXZlID0gZmFsc2U7XG4gIGlmIChfLmlzQm9vbGVhbihvcHRpb25zKSkge1xuICAgIC8vIGlmIHBhc3NlZCBpbiBhcyBhIGJvb2xlYW5cbiAgICBpbmNsdXNpdmUgPSBvcHRpb25zO1xuICB9IGVsc2UgaWYgKF8uaXNCb29sZWFuKG9wdGlvbnM/LmluY2x1c2l2ZSkpIHtcbiAgICAvLyBpZiBwYXNzZWQgaW4gYXMgYW4gb3B0aW9ucyBoYXNoXG4gICAgaW5jbHVzaXZlID0gb3B0aW9ucy5pbmNsdXNpdmU7XG4gIH1cbiAgcmV0dXJuIHBsdXJhbGl6ZUxpYih3b3JkLCBjb3VudCwgaW5jbHVzaXZlKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFbmNvZGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhTaXplIFsxMDczNzQxODI0XSBUaGUgbWF4aW11bSBzaXplIG9mXG4gKiB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBpbiBieXRlcy4gVGhpcyBpcyBzZXQgdG8gMUdCIGJ5IGRlZmF1bHQsIGJlY2F1c2VcbiAqIEFwcGl1bSBsaW1pdHMgdGhlIG1heGltdW0gSFRUUCBib2R5IHNpemUgdG8gMUdCLiBBbHNvLCB0aGUgTm9kZUpTIGhlYXBcbiAqIHNpemUgbXVzdCBiZSBlbm91Z2ggdG8ga2VlcCB0aGUgcmVzdWx0aW5nIG9iamVjdCAodXN1YWxseSB0aGlzIHNpemUgaXNcbiAqIGxpbWl0ZWQgdG8gMS40IEdCKVxuICovXG5cbi8qKlxuICogQ29udmVydHMgY29udGVudHMgb2YgYSBsb2NhbCBmaWxlIHRvIGFuIGluLW1lbW9yeSBiYXNlLTY0IGVuY29kZWQgYnVmZmVyLlxuICogVGhlIG9wZXJhdGlvbiBpcyBtZW1vcnktdXNhZ2UgZnJpZW5kbHkgYW5kIHNob3VsZCBiZSB1c2VkIHdoaWxlIGVuY29kaW5nXG4gKiBsYXJnZSBmaWxlcyB0byBiYXNlNjRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGJlaW5nIGVuY29kZWRcbiAqIEBwYXJhbSB7RW5jb2RpbmdPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBiYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSBhcyBtZW1vcnkgYnVmZmVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJlYWRpbmcgdGhlIHNvdXJjZSBmaWxlXG4gKiBvciB0aGUgc291cmNlIGZpbGUgaXMgdG9vXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvSW5NZW1vcnlCYXNlNjQgKHNyY1BhdGgsIG9wdHMgPSB7fSkge1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoc3JjUGF0aCkpIHx8IChhd2FpdCBmcy5zdGF0KHNyY1BhdGgpKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGZpbGU6ICR7c3JjUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBtYXhTaXplID0gMSAqIEdpQixcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IHJlc3VsdEJ1ZmZlcnMgPSBbXTtcbiAgbGV0IHJlc3VsdEJ1ZmZlcnNTaXplID0gMDtcbiAgY29uc3QgcmVzdWx0V3JpdGVTdHJlYW0gPSBuZXcgc3RyZWFtLldyaXRhYmxlKHtcbiAgICB3cml0ZTogKGJ1ZmZlciwgZW5jb2RpbmcsIG5leHQpID0+IHtcbiAgICAgIHJlc3VsdEJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgICAgcmVzdWx0QnVmZmVyc1NpemUgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICAgIGlmIChtYXhTaXplID4gMCAmJiByZXN1bHRCdWZmZXJzU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgcmVzdWx0V3JpdGVTdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoYFRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYCArXG4gICAgICAgICAgYGJ1ZmZlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gJHt0b1JlYWRhYmxlU2l6ZVN0cmluZyhtYXhTaXplKX1gKSk7XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgcmVhZGVyU3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShzcmNQYXRoKTtcbiAgY29uc3QgYmFzZTY0RW5jb2RlclN0cmVhbSA9IG5ldyBCYXNlNjRFbmNvZGUoKTtcbiAgY29uc3QgcmVzdWx0V3JpdGVTdHJlYW1Qcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlc3VsdFdyaXRlU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgIHJlYWRlclN0cmVhbS51bnBpcGUoYmFzZTY0RW5jb2RlclN0cmVhbSk7XG4gICAgICBiYXNlNjRFbmNvZGVyU3RyZWFtLnVucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG4gICAgICByZWFkZXJTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgcmVqZWN0KGUpO1xuICAgIH0pO1xuICAgIHJlc3VsdFdyaXRlU3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIHJlc29sdmUpO1xuICB9KTtcbiAgY29uc3QgcmVhZFN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVhZGVyU3RyZWFtLm9uY2UoJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgcmVhZGVyU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGUpID0+IHJlamVjdChcbiAgICAgIG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlYWQgJyR7c3JjUGF0aH0nOiAke2UubWVzc2FnZX1gKSkpO1xuICB9KTtcbiAgcmVhZGVyU3RyZWFtLnBpcGUoYmFzZTY0RW5jb2RlclN0cmVhbSk7XG4gIGJhc2U2NEVuY29kZXJTdHJlYW0ucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG5cbiAgYXdhaXQgQi5hbGwoW3JlYWRTdHJlYW1Qcm9taXNlLCByZXN1bHRXcml0ZVN0cmVhbVByb21pc2VdKTtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocmVzdWx0QnVmZmVycyk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9ja0ZpbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbMTIwXSBUaGUgbWF4IHRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgbG9ja1xuICogQHByb3BlcnR5IHtib29sZWFufSB0cnlSZWNvdmVyeSBbZmFsc2VdIFdoZXRoZXIgdG8gdHJ5IGxvY2sgcmVjb3ZlcnkgaWZcbiAqIHRoZSBmaXJzdCBhdHRlbXB0IHRvIGFjcXVpcmUgaXQgdGltZWQgb3V0LlxuICovXG5cbi8qKlxuICogQ3JlYXRlIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGNhbGxlZCwgd2lsbCBub3QgcHJvY2VlZCB1bnRpbCBhIGNlcnRhaW4gZmlsZSBpcyBub1xuICogbG9uZ2VyIHByZXNlbnQgb24gdGhlIHN5c3RlbS4gVGhpcyBhbGxvd3MgZm9yIHByZXZlbnRpbmcgY29uY3VycmVudCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzXG4gKiB1c2luZyBhIGtub3duIGxvY2tmaWxlIHBhdGguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2tGaWxlIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUgdXNlZCBmb3IgdGhlIGxvY2tcbiAqIEBwYXJhbSB7TG9ja0ZpbGVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7QXN5bmNGdW5jdGlvbn0gYXN5bmMgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbm90aGVyIGFzeW5jIGZ1bmN0aW9uIGRlZmluaW5nIHRoZSBsb2NrZWRcbiAqIGJlaGF2aW9yXG4gKi9cbmZ1bmN0aW9uIGdldExvY2tGaWxlR3VhcmQgKGxvY2tGaWxlLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSAxMjAsXG4gICAgdHJ5UmVjb3ZlcnkgPSBmYWxzZSxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgbG9jayA9IEIucHJvbWlzaWZ5KF9sb2NrZmlsZS5sb2NrKTtcbiAgY29uc3QgY2hlY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUuY2hlY2spO1xuICBjb25zdCB1bmxvY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUudW5sb2NrKTtcblxuICBjb25zdCBndWFyZCA9IGFzeW5jIChiZWhhdmlvcikgPT4ge1xuICAgIGxldCB0cmllZFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgZG8ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaWYgdGhlIGxvY2tmaWxlIGRvZXNuJ3QgZXhpc3QsIGxvY2sgaXQgc3luY2hyb25vdXNseSB0byBtYWtlIHN1cmUgbm8gb3RoZXIgY2FsbFxuICAgICAgICAvLyBvbiB0aGUgc2FtZSBzcGluIG9mIHRoZSBldmVudCBsb29wIGNhbiBhbHNvIGluaXRpYXRlIGEgbG9jay4gSWYgdGhlIGxvY2tmaWxlIGRvZXMgZXhpc3RcbiAgICAgICAgLy8gdGhlbiBqdXN0IHVzZSB0aGUgcmVndWxhciBhc3luYyAnbG9jaycgbWV0aG9kIHdoaWNoIHdpbGwgd2FpdCBvbiB0aGUgbG9jay5cbiAgICAgICAgaWYgKF9sb2NrZmlsZS5jaGVja1N5bmMobG9ja0ZpbGUpKSB7XG4gICAgICAgICAgYXdhaXQgbG9jayhsb2NrRmlsZSwge3dhaXQ6IHRpbWVvdXQgKiAxMDAwfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2xvY2tmaWxlLmxvY2tTeW5jKGxvY2tGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoZS5tZXNzYWdlLCAnRUVYSVNUJykgJiYgdHJ5UmVjb3ZlcnkgJiYgIXRyaWVkUmVjb3ZlcnkpIHtcbiAgICAgICAgICAvLyBUaGVyZSBjb3VsZCBiZSBjYXNlcyB3aGVyZSBhIHByb2Nlc3MgaGFzIGJlZW4gZm9yY2VmdWxseSB0ZXJtaW5hdGVkXG4gICAgICAgICAgLy8gd2l0aG91dCBhIGNoYW5jZSB0byBjbGVhbiB1cCBwZW5kaW5nIGxvY2tzOiBodHRwczovL2dpdGh1Yi5jb20vbnBtL2xvY2tmaWxlL2lzc3Vlcy8yNlxuICAgICAgICAgIF9sb2NrZmlsZS51bmxvY2tTeW5jKGxvY2tGaWxlKTtcbiAgICAgICAgICB0cmllZFJlY292ZXJ5ID0gdHJ1ZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBhY3F1aXJlIGxvY2sgb24gJyR7bG9ja0ZpbGV9JyBhZnRlciAke3RpbWVvdXR9cy4gYCArXG4gICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBiZWhhdmlvcigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyB3aGV0aGVyIHRoZSBiZWhhdmlvciBzdWNjZWVkZWQgb3Igbm90LCBnZXQgcmlkIG9mIHRoZSBsb2NrXG4gICAgICBhd2FpdCB1bmxvY2sobG9ja0ZpbGUpO1xuICAgIH1cbiAgfTtcblxuICBndWFyZC5jaGVjayA9IGFzeW5jICgpID0+IGF3YWl0IGNoZWNrKGxvY2tGaWxlKTtcblxuICByZXR1cm4gZ3VhcmQ7XG59XG5cbmV4cG9ydCB7XG4gIGhhc1ZhbHVlLCBlc2NhcGVTcGFjZSwgZXNjYXBlU3BlY2lhbENoYXJzLCBsb2NhbElwLCBjYW5jZWxsYWJsZURlbGF5LFxuICBtdWx0aVJlc29sdmUsIHNhZmVKc29uUGFyc2UsIHdyYXBFbGVtZW50LCB1bndyYXBFbGVtZW50LCBmaWx0ZXJPYmplY3QsXG4gIHRvUmVhZGFibGVTaXplU3RyaW5nLCBpc1N1YlBhdGgsIFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSLFxuICBpc1NhbWVEZXN0aW5hdGlvbiwgY29tcGFyZVZlcnNpb25zLCBjb2VyY2VWZXJzaW9uLCBxdW90ZSwgdW5sZWFrU3RyaW5nLFxuICBqc29uU3RyaW5naWZ5LCBwbHVyYWxpemUsIEdpQiwgTWlCLCBLaUIsIHRvSW5NZW1vcnlCYXNlNjQsXG4gIHV1aWRWMSwgdXVpZFYzLCB1dWlkVjQsIHV1aWRWNSwgc2hlbGxQYXJzZSwgZ2V0TG9ja0ZpbGVHdWFyZFxufTtcbiJdLCJmaWxlIjoibGliL3V0aWwuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==