socket-function 1.2.1 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SocketFunction.d.ts +1 -1
- package/SocketFunctionTypes.d.ts +1 -1
- package/hot/HotReloadController.d.ts +3 -3
- package/index.d.ts +25 -10
- package/package.json +1 -1
- package/require/CSSShim.d.ts +1 -1
- package/require/RequireController.d.ts +2 -2
- package/require/compileFlags.d.ts +1 -1
- package/require/require.d.ts +1 -1
- package/src/callManager.d.ts +1 -1
- package/test.ts +5 -11
- package/time/trueTimeShim.d.ts +16 -1
- package/time/trueTimeShim.ts +121 -34
- package/dist/SetProcessVariables.ts.cache +0 -9
- package/dist/SocketFunction.ts.cache +0 -467
- package/hot/dist/HotReloadController.ts.cache +0 -252
- package/require/dist/RequireController.ts.cache +0 -386
- package/require/dist/compileFlags.ts.cache +0 -41
- package/require/dist/extMapper.ts.cache +0 -368
- package/require/dist/require.ts.cache +0 -676
- package/src/JSONLACKS/dist/JSONLACKS.ts.cache +0 -469
- package/src/dist/CallFactory.ts.cache +0 -930
- package/src/dist/Zip.ts.cache +0 -156
- package/src/dist/batching.ts.cache +0 -377
- package/src/dist/bits.ts.cache +0 -121
- package/src/dist/buffers.ts.cache +0 -76
- package/src/dist/caching.ts.cache +0 -302
- package/src/dist/callHTTPHandler.ts.cache +0 -264
- package/src/dist/callManager.ts.cache +0 -159
- package/src/dist/certStore.ts.cache +0 -59
- package/src/dist/createSingleton.ts.cache +0 -62
- package/src/dist/fixLargeNetworkCalls.ts.cache +0 -17
- package/src/dist/forwardPort.ts.cache +0 -222
- package/src/dist/https.ts.cache +0 -141
- package/src/dist/misc.ts.cache +0 -499
- package/src/dist/nodeCache.ts.cache +0 -136
- package/src/dist/nodeProxy.ts.cache +0 -57
- package/src/dist/protocolNegotiation.ts.cache +0 -101
- package/src/dist/tlsParsing.ts.cache +0 -85
- package/src/dist/types.ts.cache +0 -9
- package/src/dist/webSocketServer.ts.cache +0 -365
- package/src/dist/websocketFactory.ts.cache +0 -53
- package/src/formatting/dist/colors.ts.cache +0 -98
- package/src/formatting/dist/format.ts.cache +0 -396
- package/src/formatting/dist/logColors.ts.cache +0 -28
- package/src/lz4/dist/LZ4.ts.cache +0 -53
- package/src/profiling/dist/getOwnTime.ts.cache +0 -100
- package/src/profiling/dist/measure.ts.cache +0 -338
- package/src/profiling/dist/stats.ts.cache +0 -202
- package/src/profiling/dist/statsFormat.ts.cache +0 -45
- package/time/dist/trueTimeShim.ts.cache +0 -656
|
@@ -1,676 +0,0 @@
|
|
|
1
|
-
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
|
-
/// <reference path="../src/src.d.ts" />
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
4
|
-
//exports.requireMain = void 0;
|
|
5
|
-
function requireMain() {
|
|
6
|
-
var _a;
|
|
7
|
-
async function requestText(endpoint, values) {
|
|
8
|
-
var _a, _b, _c;
|
|
9
|
-
let url = new URL(endpoint);
|
|
10
|
-
let json = JSON.stringify(values);
|
|
11
|
-
let response;
|
|
12
|
-
if (json.length < 6000) {
|
|
13
|
-
// NOTE: Try to use a GET, as GETs can be cached! However, if the data is too large,
|
|
14
|
-
// we have to use a post, or else the request url will be too large
|
|
15
|
-
for (let key in values) {
|
|
16
|
-
url.searchParams.set(key, JSON.stringify(values[key]));
|
|
17
|
-
}
|
|
18
|
-
response = await fetch(url.toString(), {
|
|
19
|
-
method: "GET",
|
|
20
|
-
credentials: "include",
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
response = await fetch(url.toString(), {
|
|
25
|
-
method: "POST",
|
|
26
|
-
body: json,
|
|
27
|
-
credentials: "include",
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
let compressionRatio = 1;
|
|
31
|
-
let uncompressedLength = response.headers.get("X-Uncompressed-Content-Length");
|
|
32
|
-
let compressedLength = response.headers.get("Content-Length");
|
|
33
|
-
if (uncompressedLength && compressedLength) {
|
|
34
|
-
compressionRatio = +uncompressedLength / +compressedLength;
|
|
35
|
-
}
|
|
36
|
-
let totalLength = +(uncompressedLength || compressedLength || 0);
|
|
37
|
-
if (totalLength) {
|
|
38
|
-
(_a = globalThis.onProgressHandler) === null || _a === void 0 ? void 0 : _a.call(globalThis, {
|
|
39
|
-
type: "Download",
|
|
40
|
-
addValue: 0,
|
|
41
|
-
addMax: Math.floor(totalLength / compressionRatio),
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
// If it's an error, set requestError
|
|
45
|
-
if (!response.ok) {
|
|
46
|
-
(_b = globalThis.onErrorHandler) === null || _b === void 0 ? void 0 : _b.call(globalThis, response.statusText);
|
|
47
|
-
}
|
|
48
|
-
// Stream it, so we can get progrss
|
|
49
|
-
let reader = response.body.getReader();
|
|
50
|
-
let result = "";
|
|
51
|
-
while (true) {
|
|
52
|
-
let { done, value } = await reader.read();
|
|
53
|
-
if (done)
|
|
54
|
-
break;
|
|
55
|
-
result += new TextDecoder().decode(value);
|
|
56
|
-
let cur = ((value === null || value === void 0 ? void 0 : value.length) || 0) / compressionRatio;
|
|
57
|
-
(_c = globalThis.onProgressHandler) === null || _c === void 0 ? void 0 : _c.call(globalThis, {
|
|
58
|
-
type: "Download",
|
|
59
|
-
addValue: cur,
|
|
60
|
-
addMax: 0,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
return result;
|
|
64
|
-
}
|
|
65
|
-
const g = globalThis;
|
|
66
|
-
let startTime = Date.now();
|
|
67
|
-
globalThis.BOOT_TIME = startTime;
|
|
68
|
-
// Set to the first rootDomain, unless the first import does not have a domain
|
|
69
|
-
let mainRootOrigin = location.origin + location.pathname;
|
|
70
|
-
let isFirstImport = true;
|
|
71
|
-
Symbol.dispose = Symbol.dispose || Symbol("dispose");
|
|
72
|
-
Symbol.asyncDispose = Symbol.asyncDispose || Symbol("asyncDispose");
|
|
73
|
-
// Globals
|
|
74
|
-
Object.assign(window, {
|
|
75
|
-
process: {
|
|
76
|
-
argv: ((_a = window === null || window === void 0 ? void 0 : window.process) === null || _a === void 0 ? void 0 : _a.argv) || [],
|
|
77
|
-
env: {
|
|
78
|
-
// Mirror the tnode.js setting
|
|
79
|
-
NODE_ENV: "production",
|
|
80
|
-
},
|
|
81
|
-
versions: {},
|
|
82
|
-
},
|
|
83
|
-
setImmediate(callback) {
|
|
84
|
-
setTimeout(callback, 0);
|
|
85
|
-
},
|
|
86
|
-
// Ignore flags for now, even though they should work fine if we just hardcoded compileFlags.ts here.
|
|
87
|
-
setFlag() { },
|
|
88
|
-
global: window,
|
|
89
|
-
});
|
|
90
|
-
// Not real modules, as we just define their exports
|
|
91
|
-
const builtInModuleExports = {
|
|
92
|
-
worker_threads: {
|
|
93
|
-
isMainThread: true,
|
|
94
|
-
},
|
|
95
|
-
util: {
|
|
96
|
-
// https://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor
|
|
97
|
-
inherits(constructor, superConstructor) {
|
|
98
|
-
Object.setPrototypeOf(constructor.prototype, superConstructor.prototype);
|
|
99
|
-
},
|
|
100
|
-
TextDecoder: TextDecoder,
|
|
101
|
-
TextEncoder: TextEncoder,
|
|
102
|
-
},
|
|
103
|
-
buffer: { Buffer },
|
|
104
|
-
stream: {
|
|
105
|
-
// HACK: Needed to get SAX JS to work correctly.
|
|
106
|
-
Stream: function () { },
|
|
107
|
-
Transform: function () { },
|
|
108
|
-
},
|
|
109
|
-
timers: {
|
|
110
|
-
// TODO: Add all members of timers
|
|
111
|
-
setImmediate: window.setImmediate,
|
|
112
|
-
},
|
|
113
|
-
child_process: {},
|
|
114
|
-
events: {},
|
|
115
|
-
};
|
|
116
|
-
globalThis.builtInModuleExports = globalThis.builtInModuleExports || {};
|
|
117
|
-
Object.assign(globalThis.builtInModuleExports, builtInModuleExports);
|
|
118
|
-
let lastTime = 0;
|
|
119
|
-
function nextTime() {
|
|
120
|
-
let time = Date.now();
|
|
121
|
-
if (time <= lastTime) {
|
|
122
|
-
// NOTE: We SHOULD really add epsilon, but... this is a lot easier, and is close enough,
|
|
123
|
-
// as times will never have too large of a magnitude.
|
|
124
|
-
time = lastTime + 0.01;
|
|
125
|
-
}
|
|
126
|
-
lastTime = time;
|
|
127
|
-
return time;
|
|
128
|
-
}
|
|
129
|
-
/** @type {{
|
|
130
|
-
[resolvePath: string]: {
|
|
131
|
-
// May be different then the module filename
|
|
132
|
-
filename: string;
|
|
133
|
-
// If a module is not allowed clientside it is likely requests will be empty,
|
|
134
|
-
// to save effort parsing requests for modules that only exist to give better
|
|
135
|
-
// error messages.
|
|
136
|
-
requests: {
|
|
137
|
-
// request => resolvedPath
|
|
138
|
-
[request: string]: string;
|
|
139
|
-
};
|
|
140
|
-
asyncRequests: { [request: string]: true };
|
|
141
|
-
// NOTE: IF !allowclient && !serveronly, it might just mean we didn't add allowclient
|
|
142
|
-
// to the module yet. BUT, if serveronly, then we know for sure we don't want it client.
|
|
143
|
-
// So the messages and behavior will be different.
|
|
144
|
-
allowclient?: boolean;
|
|
145
|
-
serveronly?: boolean;
|
|
146
|
-
|
|
147
|
-
source?: string;
|
|
148
|
-
}
|
|
149
|
-
}} */
|
|
150
|
-
let serializedModules = Object.create(null);
|
|
151
|
-
let moduleCache = Object.create(null);
|
|
152
|
-
let alreadyHave;
|
|
153
|
-
let rootResolveCache = Object.create(null);
|
|
154
|
-
rootRequire.cache = moduleCache;
|
|
155
|
-
// Expose require for debugging, not so it can be called
|
|
156
|
-
g.require = rootRequire;
|
|
157
|
-
g.import = rootRequire;
|
|
158
|
-
g.r = function r(text) {
|
|
159
|
-
text = text.toLowerCase();
|
|
160
|
-
return Object.values(moduleCache).filter((x) => x.filename.toLowerCase().includes(text))[0].exports;
|
|
161
|
-
};
|
|
162
|
-
let requireBatch;
|
|
163
|
-
function rootRequire(request, batch) {
|
|
164
|
-
if (request.includes("file://")) {
|
|
165
|
-
// How does this happen? It definitely breaks things, and we could remove the file://, but... how
|
|
166
|
-
// does it even happen?
|
|
167
|
-
debugger;
|
|
168
|
-
}
|
|
169
|
-
if (isFirstImport) {
|
|
170
|
-
isFirstImport = false;
|
|
171
|
-
if (request.startsWith("https://")) {
|
|
172
|
-
mainRootOrigin = getRootDomain(request);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
if (!request.startsWith("https://")) {
|
|
176
|
-
request = mainRootOrigin + request;
|
|
177
|
-
}
|
|
178
|
-
if (!batch) {
|
|
179
|
-
if (request in rootResolveCache) {
|
|
180
|
-
let resolvedRequest = rootResolveCache[request];
|
|
181
|
-
if (resolvedRequest in rootRequire.cache) {
|
|
182
|
-
return rootRequire.cache[resolvedRequest].exports;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
if (request in rootRequire.cache) {
|
|
186
|
-
return rootRequire.cache[request].exports;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
if (request in builtInModuleExports) {
|
|
190
|
-
return builtInModuleExports[request];
|
|
191
|
-
}
|
|
192
|
-
if (batch) {
|
|
193
|
-
if (!requireBatch) {
|
|
194
|
-
requireBatch = requireBatch || {};
|
|
195
|
-
setTimeout(() => {
|
|
196
|
-
if (!requireBatch)
|
|
197
|
-
throw new Error("Impossible");
|
|
198
|
-
let requests = Object.keys(requireBatch);
|
|
199
|
-
let callbacks = Object.values(requireBatch).reduce((a, b) => a.concat(b), []);
|
|
200
|
-
requireBatch = undefined;
|
|
201
|
-
void rootRequireMultiple(requests).then(() => {
|
|
202
|
-
for (let callback of callbacks) {
|
|
203
|
-
callback();
|
|
204
|
-
}
|
|
205
|
-
}, (err) => {
|
|
206
|
-
throw err;
|
|
207
|
-
});
|
|
208
|
-
}, 0);
|
|
209
|
-
}
|
|
210
|
-
return new Promise((resolve) => {
|
|
211
|
-
if (!requireBatch)
|
|
212
|
-
throw new Error("Impossible");
|
|
213
|
-
requireBatch[request] = requireBatch[request] || [];
|
|
214
|
-
requireBatch[request].push(resolve);
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
return rootRequireMultiple([request]).then((x) => x[0].exports);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
function getRootDomain(request) {
|
|
222
|
-
let url = new URL(request);
|
|
223
|
-
let origin = url.origin;
|
|
224
|
-
// Fix stupid :443 erasure (other ports aren't erased, except 80, but we'll never use HTTP,
|
|
225
|
-
// so that's fine).
|
|
226
|
-
{
|
|
227
|
-
let remaining = request.slice(origin.length);
|
|
228
|
-
if (remaining.startsWith(":443/")) {
|
|
229
|
-
origin += ":443";
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
return origin + "/";
|
|
233
|
-
}
|
|
234
|
-
async function rootRequireMultiple(requests) {
|
|
235
|
-
var _a, _b;
|
|
236
|
-
console.log(`%cimport(${requests.join(", ")}) at ${Date.now() - startTime}ms`, "color: orange");
|
|
237
|
-
let time = Date.now();
|
|
238
|
-
let alreadyHaveRanges;
|
|
239
|
-
if (alreadyHave) {
|
|
240
|
-
let seqNums = Object.keys(alreadyHave.seqNums).map((x) => +x);
|
|
241
|
-
seqNums.sort((a, b) => a - b);
|
|
242
|
-
let seqNumRanges = [];
|
|
243
|
-
alreadyHaveRanges = { requireSeqNumProcessId: alreadyHave.requireSeqNumProcessId, seqNumRanges };
|
|
244
|
-
for (let seqNum of seqNums) {
|
|
245
|
-
let prev = seqNumRanges[seqNumRanges.length - 1];
|
|
246
|
-
if ((prev === null || prev === void 0 ? void 0 : prev.e) === seqNum) {
|
|
247
|
-
prev.e++;
|
|
248
|
-
}
|
|
249
|
-
else {
|
|
250
|
-
seqNumRanges.push({ s: seqNum, e: seqNum + 1 });
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
for (let range of seqNumRanges) {
|
|
254
|
-
if (range.s + 1 === range.e) {
|
|
255
|
-
delete range.e;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
let domainOrigin = "";
|
|
260
|
-
let originalRequests = requests;
|
|
261
|
-
if (requests.some(x => x.startsWith("https://"))) {
|
|
262
|
-
requests = requests.map((request) => {
|
|
263
|
-
if (!request.startsWith("https://")) {
|
|
264
|
-
throw new Error(`Mixed domains with non-domain requests is not supported presently. Requests: ${requests.join(" | ")}`);
|
|
265
|
-
}
|
|
266
|
-
let origin = getRootDomain(request);
|
|
267
|
-
if (domainOrigin && domainOrigin !== origin) {
|
|
268
|
-
// TODO: If this happens, we can probably just split the call up into multiple calls?
|
|
269
|
-
throw new Error(`Mixed domains in require call is not supported presently. Requests: ${requests.join(" | ")}`);
|
|
270
|
-
}
|
|
271
|
-
domainOrigin = origin;
|
|
272
|
-
// By stripping by length, we can turn https://example.com/./test => "./test"
|
|
273
|
-
// (where as if we used pathname, it would turn into "/test"
|
|
274
|
-
return request.slice(domainOrigin.length);
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
let args = [requests, alreadyHaveRanges];
|
|
278
|
-
// We have to add hardcoded support for droppermissions, because... this call
|
|
279
|
-
// doesn't have the conventional persisted code sending code, because... it's
|
|
280
|
-
// all on its own.
|
|
281
|
-
let searchParams = new URLSearchParams(location.search);
|
|
282
|
-
if (searchParams.get("droppermissions") !== null) {
|
|
283
|
-
args.push(true);
|
|
284
|
-
}
|
|
285
|
-
let requestUrlBase = location.origin + location.pathname;
|
|
286
|
-
if (domainOrigin) {
|
|
287
|
-
requestUrlBase = domainOrigin;
|
|
288
|
-
}
|
|
289
|
-
let requestUrl = requestUrlBase + `?classGuid=RequireController-e2f811f3-14b8-4759-b0d6-73f14516cf1d&functionName=getModules`;
|
|
290
|
-
let remapImportRequestsClientside = globalThis.remapImportRequestsClientside;
|
|
291
|
-
if (remapImportRequestsClientside) {
|
|
292
|
-
for (let fnc of remapImportRequestsClientside) {
|
|
293
|
-
args = await fnc(args);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
let rawText = await requestText(requestUrl, { args });
|
|
297
|
-
let resultObj;
|
|
298
|
-
try {
|
|
299
|
-
resultObj = JSON.parse(rawText);
|
|
300
|
-
}
|
|
301
|
-
catch (e) {
|
|
302
|
-
throw new Error(`require(${JSON.stringify(requests)}). Likely a permissions error, possibly fixed by restarting the local http server. Start of response was: ${JSON.stringify(rawText.slice(0, 100))}. Error is: ${e.stack}`);
|
|
303
|
-
}
|
|
304
|
-
let { modules, requestsResolvedPaths, requireSeqNumProcessId, error } = resultObj;
|
|
305
|
-
if (error) {
|
|
306
|
-
let errorObj = new Error();
|
|
307
|
-
errorObj.stack = error;
|
|
308
|
-
throw errorObj;
|
|
309
|
-
}
|
|
310
|
-
if (Object.keys(modules).length === 1 && "" in modules) {
|
|
311
|
-
debugger;
|
|
312
|
-
eval(modules[""].source || "");
|
|
313
|
-
throw new Error(`Failed to find modules for ${originalRequests.join(", ")} (mapped to ${requests.join(", ")})`);
|
|
314
|
-
}
|
|
315
|
-
if (domainOrigin) {
|
|
316
|
-
function fixDomain(request) {
|
|
317
|
-
if (!request)
|
|
318
|
-
return request;
|
|
319
|
-
return domainOrigin + request;
|
|
320
|
-
}
|
|
321
|
-
requests = requests.map(fixDomain);
|
|
322
|
-
for (let [id, module] of Object.entries(modules)) {
|
|
323
|
-
delete modules[id];
|
|
324
|
-
modules[fixDomain(id)] = module;
|
|
325
|
-
module.filename = fixDomain(module.filename);
|
|
326
|
-
module.requests = Object.fromEntries(Object.entries(module.requests).map(([k, v]) => [k, fixDomain(v)]));
|
|
327
|
-
module.originalId = fixDomain(module.originalId);
|
|
328
|
-
}
|
|
329
|
-
requestsResolvedPaths = requestsResolvedPaths.map(fixDomain);
|
|
330
|
-
}
|
|
331
|
-
for (let i = 0; i < requests.length; i++) {
|
|
332
|
-
rootResolveCache[requests[i]] = requestsResolvedPaths[i];
|
|
333
|
-
}
|
|
334
|
-
(_a = globalThis.onProgressHandler) === null || _a === void 0 ? void 0 : _a.call(globalThis, {
|
|
335
|
-
type: "Compile",
|
|
336
|
-
addValue: 0,
|
|
337
|
-
addMax: Object.keys(modules).length,
|
|
338
|
-
});
|
|
339
|
-
// Store the function, so we only call it if it exists BEFORE we import
|
|
340
|
-
// (which means we already have something loading, so this is likely hot reloading...)
|
|
341
|
-
let observerOnHotReload = g.observerOnHotReload;
|
|
342
|
-
setTimeout(() => {
|
|
343
|
-
if (observerOnHotReload) {
|
|
344
|
-
observerOnHotReload();
|
|
345
|
-
}
|
|
346
|
-
}, 0);
|
|
347
|
-
time = Date.now() - time;
|
|
348
|
-
let moduleCount = Object.values(modules).filter((x) => x.source).length;
|
|
349
|
-
let requireModuleCount = Object.values(modules).filter((x) => !x.source).length;
|
|
350
|
-
let dependenciesOnlyText = requireModuleCount ? ` (+${requireModuleCount} dependencies only)` : "";
|
|
351
|
-
console.log(`%cimport(${requests.join(", ")}) finished download ${time.toFixed(0)}ms, ${Math.ceil(rawText.length / 1024)}KB, ${moduleCount} modules${dependenciesOnlyText} at ${(Date.now() - startTime).toFixed(0)}ms`, "color: lightgreen");
|
|
352
|
-
if ((alreadyHave === null || alreadyHave === void 0 ? void 0 : alreadyHave.requireSeqNumProcessId) !== requireSeqNumProcessId) {
|
|
353
|
-
alreadyHave = undefined;
|
|
354
|
-
}
|
|
355
|
-
alreadyHave = alreadyHave || { requireSeqNumProcessId, seqNums: {} };
|
|
356
|
-
for (let id in modules) {
|
|
357
|
-
let module = modules[id];
|
|
358
|
-
alreadyHave.seqNums[module.seqNum] = 1;
|
|
359
|
-
serializedModules[id] = module;
|
|
360
|
-
}
|
|
361
|
-
time = Date.now();
|
|
362
|
-
let lastWaitTime = time;
|
|
363
|
-
for (let key of Object.keys(modules)) {
|
|
364
|
-
getModule(key, "preload");
|
|
365
|
-
// Wait, so we can render progress (and in generals, so the UI remains somewhat responsive)
|
|
366
|
-
if (Date.now() - lastWaitTime > 10) {
|
|
367
|
-
await new Promise(resolve => setTimeout(resolve, 0));
|
|
368
|
-
lastWaitTime = Date.now();
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
time = Date.now() - time;
|
|
372
|
-
console.log(`%cimport(${requests.join(", ")}) finished compile ${time.toFixed(0)}ms (${moduleCount} modules) at ${(Date.now() - startTime).toFixed(0)}ms`, "color: hotpink");
|
|
373
|
-
(_b = globalThis.onProgressHandler) === null || _b === void 0 ? void 0 : _b.call(globalThis, {
|
|
374
|
-
type: "Evaluate",
|
|
375
|
-
addValue: 0,
|
|
376
|
-
addMax: Object.keys(modules).length,
|
|
377
|
-
});
|
|
378
|
-
time = Date.now();
|
|
379
|
-
try {
|
|
380
|
-
return requestsResolvedPaths.map((x) => getModule(x));
|
|
381
|
-
}
|
|
382
|
-
finally {
|
|
383
|
-
time = Date.now() - time;
|
|
384
|
-
console.log(`%cimport(${requests.join(", ")}) finished evaluate ${time.toFixed(0)}ms (${moduleCount} modules) at ${(Date.now() - startTime).toFixed(0)}ms`, "color: lightblue");
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
function createRequire(module, serializedModule, asyncIsFineOuter) {
|
|
388
|
-
require.cache = moduleCache;
|
|
389
|
-
// Dynamically get folder, incase our filename changes
|
|
390
|
-
function getModuleFolder() {
|
|
391
|
-
return module.filename.replace(/\\/g, "/").split("/").slice(0, -1).join("/") + "/";
|
|
392
|
-
}
|
|
393
|
-
function resolve(request) {
|
|
394
|
-
let requests = serializedModule.requests;
|
|
395
|
-
if (request in requests) {
|
|
396
|
-
return requests[request];
|
|
397
|
-
}
|
|
398
|
-
let absolutePath = request;
|
|
399
|
-
if (absolutePath.startsWith("./") || absolutePath.startsWith("../")) {
|
|
400
|
-
let folderParts = getModuleFolder().split("/");
|
|
401
|
-
while (absolutePath.startsWith("./") || absolutePath.startsWith("../")) {
|
|
402
|
-
if (absolutePath.startsWith("./")) {
|
|
403
|
-
absolutePath = absolutePath.slice("./".length);
|
|
404
|
-
}
|
|
405
|
-
else {
|
|
406
|
-
folderParts.pop();
|
|
407
|
-
absolutePath = absolutePath.slice("../".length);
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
absolutePath = folderParts.join("/") + "/" + absolutePath;
|
|
411
|
-
}
|
|
412
|
-
// Still use the same domain
|
|
413
|
-
if (!absolutePath.startsWith("https://")) {
|
|
414
|
-
absolutePath = mainRootOrigin + absolutePath;
|
|
415
|
-
}
|
|
416
|
-
return absolutePath;
|
|
417
|
-
}
|
|
418
|
-
require.resolve = resolve;
|
|
419
|
-
return require;
|
|
420
|
-
function require(request, asyncIsFine) {
|
|
421
|
-
var _a, _b;
|
|
422
|
-
if (asyncIsFineOuter) {
|
|
423
|
-
asyncIsFine = true;
|
|
424
|
-
}
|
|
425
|
-
if (typeof asyncIsFine !== "boolean") {
|
|
426
|
-
asyncIsFine = false;
|
|
427
|
-
}
|
|
428
|
-
if (request in serializedModule.asyncRequests) {
|
|
429
|
-
asyncIsFine = true;
|
|
430
|
-
}
|
|
431
|
-
if (request in builtInModuleExports) {
|
|
432
|
-
return builtInModuleExports[request];
|
|
433
|
-
}
|
|
434
|
-
let absolutePath = resolve(request);
|
|
435
|
-
let resolvedPath;
|
|
436
|
-
if (request in moduleCache) {
|
|
437
|
-
resolvedPath = request;
|
|
438
|
-
}
|
|
439
|
-
else if (absolutePath in moduleCache) {
|
|
440
|
-
resolvedPath = absolutePath;
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
if (!(request in serializedModule.requests)) {
|
|
444
|
-
if (!asyncIsFine && !globalThis.suppressUnexpectedModuleWarning) {
|
|
445
|
-
console.warn(`Accessed unexpected module %c${request}%c in %c${module.id}%c\n\tTreating it as an async require.\n\tAll modules require synchronously clientside must be required serverside at a module level. Expected imports: ${Object.keys(serializedModule.requests).join(" | ")}`, "color: red", "color: unset", "color: red", "color: unset");
|
|
446
|
-
}
|
|
447
|
-
return rootRequire(absolutePath);
|
|
448
|
-
}
|
|
449
|
-
// Built in modules that we haven't been implemented
|
|
450
|
-
if (serializedModule.requests[request] === "") {
|
|
451
|
-
return {};
|
|
452
|
-
}
|
|
453
|
-
resolvedPath = serializedModule.requests[request];
|
|
454
|
-
}
|
|
455
|
-
if (resolvedPath !== "NOTALLOWEDCLIENTSIDE" && !serializedModules[resolvedPath]) {
|
|
456
|
-
if (!asyncIsFine) {
|
|
457
|
-
console.warn(`Accessed unexpected module %c${request}%c in %c${module.id}%c\n\tTreating it as an async require.\n\tAll modules require synchronously clientside must be required serverside at a module level. Expected imports: ${Object.keys(serializedModule.requests).join(" | ")}`, "color: red", "color: unset", "color: red", "color: unset");
|
|
458
|
-
}
|
|
459
|
-
return rootRequire(resolvedPath);
|
|
460
|
-
}
|
|
461
|
-
let exportsOverride;
|
|
462
|
-
if (resolvedPath === "NOTALLOWEDCLIENTSIDE" || !((_a = serializedModules[resolvedPath]) === null || _a === void 0 ? void 0 : _a.allowclient)) {
|
|
463
|
-
let childId = resolvedPath === "NOTALLOWEDCLIENTSIDE" ? request : resolvedPath;
|
|
464
|
-
if ((_b = serializedModules[resolvedPath]) === null || _b === void 0 ? void 0 : _b.serveronly) {
|
|
465
|
-
exportsOverride = new Proxy({}, {
|
|
466
|
-
get(target, property) {
|
|
467
|
-
if (property === "__esModule")
|
|
468
|
-
return undefined;
|
|
469
|
-
// NOTE: Return a toString that evaluates to "" so we can EXPLICITLY detect non-loaded modules
|
|
470
|
-
if (property === unloadedModule)
|
|
471
|
-
return true;
|
|
472
|
-
if (property === "default")
|
|
473
|
-
return exportsOverride;
|
|
474
|
-
throw new Error(`Module ${childId} is serverside only. Tried to access ${String(property)} from ${module.id}`);
|
|
475
|
-
},
|
|
476
|
-
});
|
|
477
|
-
}
|
|
478
|
-
else {
|
|
479
|
-
exportsOverride = new Proxy({}, {
|
|
480
|
-
get(target, property) {
|
|
481
|
-
if (property === "__esModule")
|
|
482
|
-
return undefined;
|
|
483
|
-
// NOTE: Return a toString that evaluates to "" so we can EXPLICITLY detect non-loaded modules
|
|
484
|
-
if (property === unloadedModule)
|
|
485
|
-
return true;
|
|
486
|
-
if (property === "default")
|
|
487
|
-
return exportsOverride;
|
|
488
|
-
let type = "non-whitelisted";
|
|
489
|
-
if (!serializedModules[resolvedPath]) {
|
|
490
|
-
type = "missing module";
|
|
491
|
-
}
|
|
492
|
-
console.warn(`Accessed ${type} module %c${childId}%c, specifically property %c${String(property)}%c.\n\tAdd %cmodule.allowclient = true%c to the file to allow access.\n\t(IF it is a 3rd party library, use the global "setFlag" helper (in the file you imported the module) to set properties on other modules (it can even recursively set properties)).\n\n\tFrom ${module.id}`, "color: red", "color: unset", "color: red", "color: unset", "color: red", "color: unset");
|
|
493
|
-
return undefined;
|
|
494
|
-
},
|
|
495
|
-
});
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
if (resolvedPath === "NOTALLOWEDCLIENTSIDE") {
|
|
499
|
-
return exportsOverride;
|
|
500
|
-
}
|
|
501
|
-
let providerModule = getModule(resolvedPath);
|
|
502
|
-
module.children.push(providerModule);
|
|
503
|
-
if (exportsOverride !== undefined) {
|
|
504
|
-
providerModule.exports = exportsOverride;
|
|
505
|
-
}
|
|
506
|
-
let exports = providerModule.exports;
|
|
507
|
-
let remapExports = providerModule.remapExports;
|
|
508
|
-
if (remapExports && typeof remapExports === "function") {
|
|
509
|
-
exports = remapExports(exports, module);
|
|
510
|
-
}
|
|
511
|
-
return exports;
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
/** Generates the module root function, which can be called to evaluate the module,
|
|
515
|
-
* and has code equal to contents.
|
|
516
|
-
* - filename is just for debugging / stack traces
|
|
517
|
-
*/
|
|
518
|
-
function wrapSafe(filename, contents) {
|
|
519
|
-
// TODO: Have the serverside inform us of the correct loader, or... have it actually emit a .json loader.
|
|
520
|
-
if (filename.endsWith(".json")) {
|
|
521
|
-
return (exports, require, module) => (module.exports = contents && JSON.parse(contents));
|
|
522
|
-
}
|
|
523
|
-
// NOTE: debugName only matters during module evaluation. After that the sourcemap should work.
|
|
524
|
-
let debugName = filename
|
|
525
|
-
.replace(/\\/g, "/")
|
|
526
|
-
.split("/")
|
|
527
|
-
.slice(-1)[0]
|
|
528
|
-
.replace(/\./g, "_")
|
|
529
|
-
.replace(/[^a-zA-Z_]/g, "");
|
|
530
|
-
// NOTE: eval is used instead of new Function, as new Function inject lines, which messes
|
|
531
|
-
// up our sourcemaps.
|
|
532
|
-
// NOTE: All on one line, so we don't break sourcemaps by TOO much. We could also parse
|
|
533
|
-
// the sourcemap and adjust it, but... it is much easier to just not change the line counts.
|
|
534
|
-
return eval(`(function ${debugName}(exports, require, module, __filename, __dirname, importDynamic) {"use strict";${contents}\n })`);
|
|
535
|
-
}
|
|
536
|
-
const unloadedModule = Symbol("unloadedModule");
|
|
537
|
-
let currentModuleEvaluationStack = [];
|
|
538
|
-
// See https://nodejs.org/api/modules.html
|
|
539
|
-
function getModule(resolvedId, preload) {
|
|
540
|
-
var _a;
|
|
541
|
-
if (resolvedId === "") {
|
|
542
|
-
return {};
|
|
543
|
-
}
|
|
544
|
-
if (resolvedId in moduleCache) {
|
|
545
|
-
let module = moduleCache[resolvedId];
|
|
546
|
-
if (!preload && !module.loaded) {
|
|
547
|
-
module.loaded = true;
|
|
548
|
-
module.load();
|
|
549
|
-
}
|
|
550
|
-
return module;
|
|
551
|
-
}
|
|
552
|
-
let serializedModule = serializedModules[resolvedId];
|
|
553
|
-
if (!serializedModule) {
|
|
554
|
-
// I can't figure out why this happens as it seems to happen very rarely and only when I'm debugging other code.
|
|
555
|
-
// - I have had it happen immediately after starting the app. Although in theory a hot reload could have
|
|
556
|
-
// triggered due to VS code writing to a file.
|
|
557
|
-
// - I've had times when it happens once after startup and then it goes away and other times where it
|
|
558
|
-
// happens every single time and never goes away until I restart aipaint.
|
|
559
|
-
// - Maybe it happens if we switch servers and so the root paths are different in some way?
|
|
560
|
-
debugger;
|
|
561
|
-
console.warn(`Failed to find module ${resolvedId}. The server should have given an error about this.`, serializedModules);
|
|
562
|
-
}
|
|
563
|
-
let module = Object.create(null);
|
|
564
|
-
moduleCache[resolvedId] = module;
|
|
565
|
-
module.id = resolvedId;
|
|
566
|
-
module.filename = (serializedModule === null || serializedModule === void 0 ? void 0 : serializedModule.filename) || "";
|
|
567
|
-
module.exports = {};
|
|
568
|
-
// Default default of exports to the exports itself
|
|
569
|
-
module.exports.default = module.exports;
|
|
570
|
-
module.children = [];
|
|
571
|
-
for (let key in (serializedModule === null || serializedModule === void 0 ? void 0 : serializedModule.flags) || {}) {
|
|
572
|
-
if (key === "loaded")
|
|
573
|
-
continue;
|
|
574
|
-
module[key] = true;
|
|
575
|
-
}
|
|
576
|
-
module.load = load;
|
|
577
|
-
let originalSource = (serializedModule === null || serializedModule === void 0 ? void 0 : serializedModule.source) || "";
|
|
578
|
-
let moduleFnc = wrapSafe(module.id, originalSource);
|
|
579
|
-
(_a = globalThis.onProgressHandler) === null || _a === void 0 ? void 0 : _a.call(globalThis, {
|
|
580
|
-
type: "Compile",
|
|
581
|
-
addValue: 1,
|
|
582
|
-
addMax: 0,
|
|
583
|
-
});
|
|
584
|
-
if (!preload) {
|
|
585
|
-
module.loaded = true;
|
|
586
|
-
module.load();
|
|
587
|
-
}
|
|
588
|
-
function load() {
|
|
589
|
-
var _a;
|
|
590
|
-
const serializedModule = serializedModules[resolvedId];
|
|
591
|
-
if (!serializedModule)
|
|
592
|
-
return;
|
|
593
|
-
if (!module.loaded) {
|
|
594
|
-
module.evaluateStarted = false;
|
|
595
|
-
if (alreadyHave) {
|
|
596
|
-
delete alreadyHave.seqNums[serializedModule.seqNum];
|
|
597
|
-
}
|
|
598
|
-
// NOTE: There is almost never a way to recover from module downloading errors, so just don't catch them
|
|
599
|
-
return Promise.resolve()
|
|
600
|
-
.then(() => rootRequire(resolvedId, true))
|
|
601
|
-
.then(async () => {
|
|
602
|
-
module.loaded = true;
|
|
603
|
-
await load();
|
|
604
|
-
});
|
|
605
|
-
}
|
|
606
|
-
// Skip double loads
|
|
607
|
-
if (module.evaluateStarted)
|
|
608
|
-
return;
|
|
609
|
-
module.original = serializedModule;
|
|
610
|
-
module.requires = serializedModule.requests;
|
|
611
|
-
module.require = createRequire(module, serializedModule);
|
|
612
|
-
// TODO: Once typescript supports dynamic import, map import() to importDynamic, so it
|
|
613
|
-
// uses our import function, instead of the built in one.
|
|
614
|
-
// (As apparently we can't just override import on a per module basis, because
|
|
615
|
-
// we can't have an identify called "import"... which is annoying).
|
|
616
|
-
let importDynamic = createRequire(module, serializedModule, true);
|
|
617
|
-
module.import = importDynamic;
|
|
618
|
-
let source = serializedModule.source;
|
|
619
|
-
module.allowclient = !!serializedModule.source;
|
|
620
|
-
// Import children, as the children may be allowed clientside, and may have side-effects!
|
|
621
|
-
if (!source) {
|
|
622
|
-
let requests = Object.keys(serializedModule.requests)
|
|
623
|
-
.filter((x) => x !== "NOTALLOWEDCLIENTSIDE")
|
|
624
|
-
.filter((x) => !(x in serializedModule.asyncRequests));
|
|
625
|
-
source = requests.map((id) => `require(${JSON.stringify(id)});\n`).join("");
|
|
626
|
-
}
|
|
627
|
-
module.size = source.length;
|
|
628
|
-
module.source = source;
|
|
629
|
-
if (source !== originalSource) {
|
|
630
|
-
originalSource = source;
|
|
631
|
-
moduleFnc = wrapSafe(module.id, originalSource);
|
|
632
|
-
}
|
|
633
|
-
let dirname = module.filename.replace(/\\/g, "/").split("/").slice(0, -1).join("/");
|
|
634
|
-
let time = Date.now();
|
|
635
|
-
currentModuleEvaluationStack.push(module.filename);
|
|
636
|
-
try {
|
|
637
|
-
module.evaluateStarted = true;
|
|
638
|
-
module.isPreloading = true;
|
|
639
|
-
module.evalStartTime = nextTime();
|
|
640
|
-
module.evalEndTime = undefined;
|
|
641
|
-
moduleFnc.call({
|
|
642
|
-
// NOTE: Adding __importStar to the module causes typescript to use our implementation,
|
|
643
|
-
// which checks for unloadedModule and returns undefined in that case.
|
|
644
|
-
__importStar(mod) {
|
|
645
|
-
if (mod[unloadedModule])
|
|
646
|
-
return undefined;
|
|
647
|
-
return mod;
|
|
648
|
-
},
|
|
649
|
-
__importDefault(mod) {
|
|
650
|
-
return mod.default ? mod : { default: mod };
|
|
651
|
-
},
|
|
652
|
-
}, module.exports,
|
|
653
|
-
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
654
|
-
module.require, module, module.filename, dirname, importDynamic);
|
|
655
|
-
module.evalEndTime = nextTime();
|
|
656
|
-
time = Date.now() - time;
|
|
657
|
-
// NOTE: This log statment is disabled as I believe it causes lag (when devtools is open).
|
|
658
|
-
// As in, adding about 500ms to our load time, which is annoying when debugging.
|
|
659
|
-
//console.debug(`Evaluated module ${module.filename} ${Math.ceil(source.length / 1024)}KB`);
|
|
660
|
-
}
|
|
661
|
-
finally {
|
|
662
|
-
module.isPreloading = false;
|
|
663
|
-
currentModuleEvaluationStack.pop();
|
|
664
|
-
(_a = globalThis.onProgressHandler) === null || _a === void 0 ? void 0 : _a.call(globalThis, {
|
|
665
|
-
type: "Evaluate",
|
|
666
|
-
addValue: 1,
|
|
667
|
-
addMax: 0,
|
|
668
|
-
});
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
return module;
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
exports.requireMain = requireMain;
|
|
675
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlcXVpcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdDQUF3Qzs7O0FBb0J4QyxTQUFnQixXQUFXOztJQUN2QixLQUFLLFVBQVUsV0FBVyxDQUFDLFFBQWdCLEVBQUUsTUFBVzs7UUFDcEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxJQUFJLFFBQWtCLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3JCLG9GQUFvRjtZQUNwRixvRUFBb0U7WUFDcEUsS0FBSyxJQUFJLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDckIsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDbkMsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsV0FBVyxFQUFFLFNBQVM7YUFDekIsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNuQyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJLEVBQUUsSUFBSTtnQkFDVixXQUFXLEVBQUUsU0FBUzthQUN6QixDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0Is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QyxRQUFRLEVBQ2YsT0FBTyxFQUNQLGFBQWEsQ0FDaEIsQ0FBQztnQkFDRixNQUFNLENBQUMsV0FBVyxHQUFHLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDekIsMEZBQTBGO2dCQUMxRixpRkFBaUY7Z0JBQ2pGLDRGQUE0RjtZQUNoRyxDQUFDO29CQUFTLENBQUM7Z0JBQ1AsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzVCLDRCQUE0QixDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUVuQyxNQUFBLFVBQVUsQ0FBQyxpQkFBaUIsMkRBQUc7b0JBQzNCLElBQUksRUFBRSxVQUFVO29CQUNoQixRQUFRLEVBQUUsQ0FBQztvQkFDWCxNQUFNLEVBQUUsQ0FBQztpQkFDWixDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7QUFDTCxDQUFDO0FBbHlCRCxrQ0FreUJDIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL3NyYy9zcmMuZC50c1wiIC8+XG5cbmltcG9ydCB7IEdldE1vZHVsZXNBcmdzIH0gZnJvbSBcIi4vUmVxdWlyZUNvbnRyb2xsZXJcIjtcblxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgdmFyIG9uUHJvZ3Jlc3NIYW5kbGVyOiB1bmRlZmluZWQgfCAoKHByb2dyZXNzOiB7XG4gICAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgICAgYWRkVmFsdWU6IG51bWJlcjtcbiAgICAgICAgYWRkTWF4OiBudW1iZXI7XG4gICAgfSkgPT4gdm9pZCk7XG4gICAgdmFyIG9uRXJyb3JIYW5kbGVyOiB1bmRlZmluZWQgfCAoKGVycm9yOiBzdHJpbmcpID0+IHZvaWQpO1xuXG5cbiAgICB2YXIgQk9PVF9USU1FOiBudW1iZXI7XG4gICAgdmFyIGJ1aWx0SW5Nb2R1bGVFeHBvcnRzOiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVNYWluKCkge1xuICAgIGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RUZXh0KGVuZHBvaW50OiBzdHJpbmcsIHZhbHVlczogYW55KSB7XG4gICAgICAgIGxldCB1cmwgPSBuZXcgVVJMKGVuZHBvaW50KTtcblxuICAgICAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlcyk7XG4gICAgICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgICAgIGlmIChqc29uLmxlbmd0aCA8IDYwMDApIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRyeSB0byB1c2UgYSBHRVQsIGFzIEdFVHMgY2FuIGJlIGNhY2hlZCEgSG93ZXZlciwgaWYgdGhlIGRhdGEgaXMgdG9vIGxhcmdlLFxuICAgICAgICAgICAgLy8gIHdlIGhhdmUgdG8gdXNlIGEgcG9zdCwgb3IgZWxzZSB0aGUgcmVxdWVzdCB1cmwgd2lsbCBiZSB0b28gbGFyZ2VcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlc1trZXldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwudG9TdHJpbmcoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgYm9keToganNvbixcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb21wcmVzc2lvblJhdGlvID0gMTtcbiAgICAgICAgbGV0IHVuY29tcHJlc3NlZExlbmd0aCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiWC1VbmNvbXByZXNzZWQtQ29udGVudC1MZW5ndGhcIik7XG4gICAgICAgIGxldCBjb21wcmVzc2VkTGVuZ3RoID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJDb250ZW50LUxlbmd0aFwiKTtcbiAgICAgICAgaWYgKHVuY29tcHJlc3NlZExlbmd0aCAmJiBjb21wcmVzc2VkTGVuZ3RoKSB7XG4gICAgICAgICAgICBjb21wcmVzc2lvblJhdGlvID0gK3VuY29tcHJlc3NlZExlbmd0aCAvICtjb21wcmVzc2VkTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbExlbmd0aCA9ICsodW5jb21wcmVzc2VkTGVuZ3RoIHx8IGNvbXByZXNzZWRMZW5ndGggfHwgMCk7XG4gICAgICAgIGlmICh0b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgZ2xvYmFsVGhpcy5vblByb2dyZXNzSGFuZGxlcj8uKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIkRvd25sb2FkXCIsXG4gICAgICAgICAgICAgICAgYWRkVmFsdWU6IDAsXG4gICAgICAgICAgICAgICAgYWRkTWF4OiBNYXRoLmZsb29yKHRvdGFsTGVuZ3RoIC8gY29tcHJlc3Npb25SYXRpbyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGl0J3MgYW4gZXJyb3IsIHNldCByZXF1ZXN0RXJyb3JcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgZ2xvYmFsVGhpcy5vbkVycm9ySGFuZGxlcj8uKHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RyZWFtIGl0LCBzbyB3ZSBjYW4gZ2V0IHByb2dyc3NcbiAgICAgICAgbGV0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkhLmdldFJlYWRlcigpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgICAgICAgICAgcmVzdWx0ICs9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICBsZXQgY3VyID0gKHZhbHVlPy5sZW5ndGggfHwgMCkgLyBjb21wcmVzc2lvblJhdGlvO1xuICAgICAgICAgICAgZ2xvYmFsVGhpcy5vblByb2dyZXNzSGFuZGxlcj8uKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIkRvd25sb2FkXCIsXG4gICAgICAgICAgICAgICAgYWRkVmFsdWU6IGN1cixcbiAgICAgICAgICAgICAgICBhZGRNYXg6IDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgZyA9IGdsb2JhbFRoaXMgYXMgYW55O1xuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGdsb2JhbFRoaXMuQk9PVF9USU1FID0gc3RhcnRUaW1lO1xuXG4gICAgLy8gU2V0IHRvIHRoZSBmaXJzdCByb290RG9tYWluLCB1bmxlc3MgdGhlIGZpcnN0IGltcG9ydCBkb2VzIG5vdCBoYXZlIGEgZG9tYWluXG4gICAgbGV0IG1haW5Sb290T3JpZ2luID0gbG9jYXRpb24ub3JpZ2luICsgbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgbGV0IGlzRmlyc3RJbXBvcnQgPSB0cnVlO1xuXG4gICAgKFN5bWJvbCBhcyBhbnkpLmRpc3Bvc2UgPSBTeW1ib2wuZGlzcG9zZSB8fCBTeW1ib2woXCJkaXNwb3NlXCIpO1xuICAgIChTeW1ib2wgYXMgYW55KS5hc3luY0Rpc3Bvc2UgPSBTeW1ib2wuYXN5bmNEaXNwb3NlIHx8IFN5bWJvbChcImFzeW5jRGlzcG9zZVwiKTtcblxuICAgIC8vIEdsb2JhbHNcbiAgICBPYmplY3QuYXNzaWduKHdpbmRvdywge1xuICAgICAgICBwcm9jZXNzOiB7XG4gICAgICAgICAgICBhcmd2OiB3aW5kb3c/LnByb2Nlc3M/LmFyZ3YgfHwgW10sXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAvLyBNaXJyb3IgdGhlIHRub2RlLmpzIHNldHRpbmdcbiAgICAgICAgICAgICAgICBOT0RFX0VOVjogXCJwcm9kdWN0aW9uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbnM6IHt9LFxuICAgICAgICB9LFxuICAgICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDApO1xuICAgICAgICB9LFxuICAgICAgICAvLyBJZ25vcmUgZmxhZ3MgZm9yIG5vdywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGQgd29yayBmaW5lIGlmIHdlIGp1c3QgaGFyZGNvZGVkIGNvbXBpbGVGbGFncy50cyBoZXJlLlxuICAgICAgICBzZXRGbGFnKCkgeyB9LFxuICAgICAgICBnbG9iYWw6IHdpbmRvdyxcbiAgICB9KTtcblxuICAgIC8vIE5vdCByZWFsIG1vZHVsZXMsIGFzIHdlIGp1c3QgZGVmaW5lIHRoZWlyIGV4cG9ydHNcbiAgICBjb25zdCBidWlsdEluTW9kdWxlRXhwb3J0cyA9IHtcbiAgICAgICAgd29ya2VyX3RocmVhZHM6IHtcbiAgICAgICAgICAgIGlzTWFpblRocmVhZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgdXRpbDoge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS91dGlsLmh0bWwjdXRpbF91dGlsX2luaGVyaXRzX2NvbnN0cnVjdG9yX3N1cGVyY29uc3RydWN0b3JcbiAgICAgICAgICAgIGluaGVyaXRzKGNvbnN0cnVjdG9yOiBhbnksIHN1cGVyQ29uc3RydWN0b3I6IGFueSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBUZXh0RGVjb2RlcjogVGV4dERlY29kZXIsXG4gICAgICAgICAgICBUZXh0RW5jb2RlcjogVGV4dEVuY29kZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGJ1ZmZlcjogeyBCdWZmZXIgfSxcbiAgICAgICAgc3RyZWFtOiB7XG4gICAgICAgICAgICAvLyBIQUNLOiBOZWVkZWQgdG8gZ2V0IFNBWCBKUyB0byB3b3JrIGNvcnJlY3RseS5cbiAgICAgICAgICAgIFN0cmVhbTogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICAgICAgVHJhbnNmb3JtOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVyczoge1xuICAgICAgICAgICAgLy8gVE9ETzogQWRkIGFsbCBtZW1iZXJzIG9mIHRpbWVyc1xuICAgICAgICAgICAgc2V0SW1tZWRpYXRlOiB3aW5kb3cuc2V0SW1tZWRpYXRlLFxuICAgICAgICB9LFxuICAgICAgICBjaGlsZF9wcm9jZXNzOiB7fSxcbiAgICAgICAgZXZlbnRzOiB7fSxcbiAgICB9O1xuICAgIGdsb2JhbFRoaXMuYnVpbHRJbk1vZHVsZUV4cG9ydHMgPSBnbG9iYWxUaGlzLmJ1aWx0SW5Nb2R1bGVFeHBvcnRzIHx8IHt9O1xuICAgIE9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcy5idWlsdEluTW9kdWxlRXhwb3J0cywgYnVpbHRJbk1vZHVsZUV4cG9ydHMpO1xuXG4gICAgbGV0IGxhc3RUaW1lID0gMDtcbiAgICBmdW5jdGlvbiBuZXh0VGltZSgpIHtcbiAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAodGltZSA8PSBsYXN0VGltZSkge1xuICAgICAgICAgICAgLy8gTk9URTogV2UgU0hPVUxEIHJlYWxseSBhZGQgZXBzaWxvbiwgYnV0Li4uIHRoaXMgaXMgYSBsb3QgZWFzaWVyLCBhbmQgaXMgY2xvc2UgZW5vdWdoLFxuICAgICAgICAgICAgLy8gIGFzIHRpbWVzIHdpbGwgbmV2ZXIgaGF2ZSB0b28gbGFyZ2Ugb2YgYSBtYWduaXR1ZGUuXG4gICAgICAgICAgICB0aW1lID0gbGFzdFRpbWUgKyAwLjAxO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RUaW1lID0gdGltZTtcbiAgICAgICAgcmV0dXJuIHRpbWU7XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHt7XG4gICAgICAgIFtyZXNvbHZlUGF0aDogc3RyaW5nXToge1xuICAgICAgICAgICAgLy8gTWF5IGJlIGRpZmZlcmVudCB0aGVuIHRoZSBtb2R1bGUgZmlsZW5hbWVcbiAgICAgICAgICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAvLyBJZiBhIG1vZHVsZSBpcyBub3QgYWxsb3dlZCBjbGllbnRzaWRlIGl0IGlzIGxpa2VseSByZXF1ZXN0cyB3aWxsIGJlIGVtcHR5LFxuICAgICAgICAgICAgLy8gIHRvIHNhdmUgZWZmb3J0IHBhcnNpbmcgcmVxdWVzdHMgZm9yIG1vZHVsZXMgdGhhdCBvbmx5IGV4aXN0IHRvIGdpdmUgYmV0dGVyXG4gICAgICAgICAgICAvLyAgZXJyb3IgbWVzc2FnZXMuXG4gICAgICAgICAgICByZXF1ZXN0czoge1xuICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgPT4gcmVzb2x2ZWRQYXRoXG4gICAgICAgICAgICAgICAgW3JlcXVlc3Q6IHN0cmluZ106IHN0cmluZztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhc3luY1JlcXVlc3RzOiB7IFtyZXF1ZXN0OiBzdHJpbmddOiB0cnVlIH07XG4gICAgICAgICAgICAvLyBOT1RFOiBJRiAhYWxsb3djbGllbnQgJiYgIXNlcnZlcm9ubHksIGl0IG1pZ2h0IGp1c3QgbWVhbiB3ZSBkaWRuJ3QgYWRkIGFsbG93Y2xpZW50XG4gICAgICAgICAgICAvLyAgdG8gdGhlIG1vZHVsZSB5ZXQuIEJVVCwgaWYgc2VydmVyb25seSwgdGhlbiB3ZSBrbm93IGZvciBzdXJlIHdlIGRvbid0IHdhbnQgaXQgY2xpZW50LlxuICAgICAgICAgICAgLy8gIFNvIHRoZSBtZXNzYWdlcyBhbmQgYmVoYXZpb3Igd2lsbCBiZSBkaWZmZXJlbnQuXG4gICAgICAgICAgICBhbGxvd2NsaWVudD86IGJvb2xlYW47XG4gICAgICAgICAgICBzZXJ2ZXJvbmx5PzogYm9vbGVhbjtcbiAgICBcbiAgICAgICAgICAgIHNvdXJjZT86IHN0cmluZztcbiAgICAgICAgfVxuICAgIH19ICovXG4gICAgbGV0IHNlcmlhbGl6ZWRNb2R1bGVzOiB7IFtpZDogc3RyaW5nXTogU2VyaWFsaXplZE1vZHVsZSB8IHVuZGVmaW5lZCB9ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHR5cGUgTW9kdWxlVHlwZSA9IE5vZGVKUy5Nb2R1bGUgJiB7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgIGV4cG9ydHM6IHVua25vd247XG4gICAgICAgIGNoaWxkcmVuOiBNb2R1bGVUeXBlW107XG4gICAgICAgIGZsYWdzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgICAgICAgbG9hZDogKCkgPT4gdm9pZDtcbiAgICAgICAgbG9hZGVkOiBib29sZWFuO1xuICAgICAgICBpc1ByZWxvYWRpbmc6IGJvb2xlYW47XG4gICAgICAgIGV2YWxTdGFydFRpbWU6IG51bWJlcjtcbiAgICAgICAgZXZhbEVuZFRpbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgZXZhbHVhdGVTdGFydGVkOiBib29sZWFuO1xuICAgICAgICBzb3VyY2U6IHN0cmluZztcbiAgICAgICAgYWxsb3djbGllbnQ6IGJvb2xlYW47XG4gICAgICAgIHNpemU6IG51bWJlcjtcbiAgICAgICAgb3JpZ2luYWw6IFNlcmlhbGl6ZWRNb2R1bGU7XG4gICAgICAgIGltcG9ydDogKHJlcXVlc3Q6IHN0cmluZywgYXN5bmNJc0ZpbmU/OiBib29sZWFuKSA9PiB1bmtub3duO1xuICAgIH07XG5cbiAgICBsZXQgbW9kdWxlQ2FjaGU6IHsgW2lkOiBzdHJpbmddOiBNb2R1bGVUeXBlIH0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBhbHJlYWR5SGF2ZToge1xuICAgICAgICByZXF1aXJlU2VxTnVtUHJvY2Vzc0lkOiBzdHJpbmc7XG4gICAgICAgIHNlcU51bXM6IHsgW3NlcU51bTogc3RyaW5nXTogdHJ1ZSB8IDEgfCAwIHwgdW5kZWZpbmVkIH07XG4gICAgfSB8IHVuZGVmaW5lZDtcblxuICAgIGxldCByb290UmVzb2x2ZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHJvb3RSZXF1aXJlLmNhY2hlID0gbW9kdWxlQ2FjaGU7XG4gICAgLy8gRXhwb3NlIHJlcXVpcmUgZm9yIGRlYnVnZ2luZywgbm90IHNvIGl0IGNhbiBiZSBjYWxsZWRcbiAgICBnLnJlcXVpcmUgPSByb290UmVxdWlyZTtcbiAgICBnLmltcG9ydCA9IHJvb3RSZXF1aXJlO1xuXG4gICAgZy5yID0gZnVuY3Rpb24gcih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobW9kdWxlQ2FjaGUpLmZpbHRlcigoeCkgPT4geC5maWxlbmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpKVswXS5leHBvcnRzO1xuICAgIH07XG5cbiAgICBsZXQgcmVxdWlyZUJhdGNoOiB7IFtyZXF1ZXN0OiBzdHJpbmddOiAoKCkgPT4gdm9pZClbXSB9IHwgdW5kZWZpbmVkO1xuICAgIGZ1bmN0aW9uIHJvb3RSZXF1aXJlKHJlcXVlc3Q6IHN0cmluZywgYmF0Y2g/OiBib29sZWFuKTogdW5rbm93biB7XG4gICAgICAgIGlmIChyZXF1ZXN0LmluY2x1ZGVzKFwiZmlsZTovL1wiKSkge1xuICAgICAgICAgICAgLy8gSG93IGRvZXMgdGhpcyBoYXBwZW4/IEl0IGRlZmluaXRlbHkgYnJlYWtzIHRoaW5ncywgYW5kIHdlIGNvdWxkIHJlbW92ZSB0aGUgZmlsZTovLywgYnV0Li4uIGhvd1xuICAgICAgICAgICAgLy8gIGRvZXMgaXQgZXZlbiBoYXBwZW4/XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGaXJzdEltcG9ydCkge1xuICAgICAgICAgICAgaXNGaXJzdEltcG9ydCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3Quc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICAgICAgbWFpblJvb3RPcmlnaW4gPSBnZXRSb290RG9tYWluKHJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcmVxdWVzdC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBtYWluUm9vdE9yaWdpbiArIHJlcXVlc3Q7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWJhdGNoKSB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdCBpbiByb290UmVzb2x2ZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc29sdmVkUmVxdWVzdCA9IHJvb3RSZXNvbHZlQ2FjaGVbcmVxdWVzdF07XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVxdWVzdCBpbiByb290UmVxdWlyZS5jYWNoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9vdFJlcXVpcmUuY2FjaGVbcmVzb2x2ZWRSZXF1ZXN0XS5leHBvcnRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlcXVlc3QgaW4gcm9vdFJlcXVpcmUuY2FjaGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdFJlcXVpcmUuY2FjaGVbcmVxdWVzdF0uZXhwb3J0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXF1ZXN0IGluIGJ1aWx0SW5Nb2R1bGVFeHBvcnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbHRJbk1vZHVsZUV4cG9ydHNbcmVxdWVzdCBhcyBrZXlvZiB0eXBlb2YgYnVpbHRJbk1vZHVsZUV4cG9ydHNdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXRjaCkge1xuICAgICAgICAgICAgaWYgKCFyZXF1aXJlQmF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlQmF0Y2ggPSByZXF1aXJlQmF0Y2ggfHwge307XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZUJhdGNoKSB0aHJvdyBuZXcgRXJyb3IoXCJJbXBvc3NpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdHMgPSBPYmplY3Qua2V5cyhyZXF1aXJlQmF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FsbGJhY2tzID0gT2JqZWN0LnZhbHVlcyhyZXF1aXJlQmF0Y2gpLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZUJhdGNoID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB2b2lkIHJvb3RSZXF1aXJlTXVsdGlwbGUocmVxdWVzdHMpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2FsbGJhY2sgb2YgY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmVCYXRjaCkgdGhyb3cgbmV3IEVycm9yKFwiSW1wb3NzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICByZXF1aXJlQmF0Y2hbcmVxdWVzdF0gPSByZXF1aXJlQmF0Y2hbcmVxdWVzdF0gfHwgW107XG4gICAgICAgICAgICAgICAgcmVxdWlyZUJhdGNoW3JlcXVlc3RdLnB1c2gocmVzb2x2ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByb290UmVxdWlyZU11bHRpcGxlKFtyZXF1ZXN0XSkudGhlbigoeCkgPT4geFswXS5leHBvcnRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFJvb3REb21haW4ocmVxdWVzdDogc3RyaW5nKSB7XG4gICAgICAgIGxldCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QpO1xuICAgICAgICBsZXQgb3JpZ2luID0gdXJsLm9yaWdpbjtcbiAgICAgICAgLy8gRml4IHN0dXBpZCA6NDQzIGVyYXN1cmUgKG90aGVyIHBvcnRzIGFyZW4ndCBlcmFzZWQsIGV4Y2VwdCA4MCwgYnV0IHdlJ2xsIG5ldmVyIHVzZSBIVFRQLFxuICAgICAgICAvLyAgc28gdGhhdCdzIGZpbmUpLlxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcmVtYWluaW5nID0gcmVxdWVzdC5zbGljZShvcmlnaW4ubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChyZW1haW5pbmcuc3RhcnRzV2l0aChcIjo0NDMvXCIpKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luICs9IFwiOjQ0M1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmlnaW4gKyBcIi9cIjtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiByb290UmVxdWlyZU11bHRpcGxlKHJlcXVlc3RzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJWNpbXBvcnQoJHtyZXF1ZXN0cy5qb2luKFwiLCBcIil9KSBhdCAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9bXNgLCBcImNvbG9yOiBvcmFuZ2VcIik7XG5cbiAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIGxldCBhbHJlYWR5SGF2ZVJhbmdlcztcbiAgICAgICAgaWYgKGFscmVhZHlIYXZlKSB7XG4gICAgICAgICAgICBsZXQgc2VxTnVtcyA9IE9iamVjdC5rZXlzKGFscmVhZHlIYXZlLnNlcU51bXMpLm1hcCgoeCkgPT4gK3gpO1xuICAgICAgICAgICAgc2VxTnVtcy5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgICAgICBsZXQgc2VxTnVtUmFuZ2VzOiB7IHM6IG51bWJlcjsgZT86IG51bWJlciB9W10gPSBbXTtcbiAgICAgICAgICAgIGFscmVhZHlIYXZlUmFuZ2VzID0geyByZXF1aXJlU2VxTnVtUHJvY2Vzc0lkOiBhbHJlYWR5SGF2ZS5yZXF1aXJlU2VxTnVtUHJvY2Vzc0lkLCBzZXFOdW1SYW5nZXMgfTtcbiAgICAgICAgICAgIGZvciAobGV0IHNlcU51bSBvZiBzZXFOdW1zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByZXYgPSBzZXFOdW1SYW5nZXNbc2VxTnVtUmFuZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2Py5lID09PSBzZXFOdW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5lKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VxTnVtUmFuZ2VzLnB1c2goeyBzOiBzZXFOdW0sIGU6IHNlcU51bSArIDEgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc2VxTnVtUmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLnMgKyAxID09PSByYW5nZS5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByYW5nZS5lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkb21haW5PcmlnaW4gPSBcIlwiO1xuICAgICAgICBsZXQgb3JpZ2luYWxSZXF1ZXN0cyA9IHJlcXVlc3RzO1xuICAgICAgICBpZiAocmVxdWVzdHMuc29tZSh4ID0+IHguc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSkge1xuICAgICAgICAgICAgcmVxdWVzdHMgPSByZXF1ZXN0cy5tYXAoKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3Quc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWl4ZWQgZG9tYWlucyB3aXRoIG5vbi1kb21haW4gcmVxdWVzdHMgaXMgbm90IHN1cHBvcnRlZCBwcmVzZW50bHkuIFJlcXVlc3RzOiAke3JlcXVlc3RzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBvcmlnaW4gPSBnZXRSb290RG9tYWluKHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIGlmIChkb21haW5PcmlnaW4gJiYgZG9tYWluT3JpZ2luICE9PSBvcmlnaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogSWYgdGhpcyBoYXBwZW5zLCB3ZSBjYW4gcHJvYmFibHkganVzdCBzcGxpdCB0aGUgY2FsbCB1cCBpbnRvIG11bHRpcGxlIGNhbGxzP1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1peGVkIGRvbWFpbnMgaW4gcmVxdWlyZSBjYWxsIGlzIG5vdCBzdXBwb3J0ZWQgcHJlc2VudGx5LiBSZXF1ZXN0czogJHtyZXF1ZXN0cy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb21haW5PcmlnaW4gPSBvcmlnaW47XG4gICAgICAgICAgICAgICAgLy8gQnkgc3RyaXBwaW5nIGJ5IGxlbmd0aCwgd2UgY2FuIHR1cm4gaHR0cHM6Ly9leGFtcGxlLmNvbS8uL3Rlc3QgPT4gXCIuL3Rlc3RcIlxuICAgICAgICAgICAgICAgIC8vICAod2hlcmUgYXMgaWYgd2UgdXNlZCBwYXRobmFtZSwgaXQgd291bGQgdHVybiBpbnRvIFwiL3Rlc3RcIlxuICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnNsaWNlKGRvbWFpbk9yaWdpbi5sZW5ndGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXJnczogR2V0TW9kdWxlc0FyZ3MgPSBbcmVxdWVzdHMsIGFscmVhZHlIYXZlUmFuZ2VzXTtcbiAgICAgICAgLy8gV2UgaGF2ZSB0byBhZGQgaGFyZGNvZGVkIHN1cHBvcnQgZm9yIGRyb3BwZXJtaXNzaW9ucywgYmVjYXVzZS4uLiB0aGlzIGNhbGxcbiAgICAgICAgLy8gIGRvZXNuJ3QgaGF2ZSB0aGUgY29udmVudGlvbmFsIHBlcnNpc3RlZCBjb2RlIHNlbmRpbmcgY29kZSwgYmVjYXVzZS4uLiBpdCdzXG4gICAgICAgIC8vICBhbGwgb24gaXRzIG93bi5cbiAgICAgICAgbGV0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgaWYgKHNlYXJjaFBhcmFtcy5nZXQoXCJkcm9wcGVybWlzc2lvbnNcIikgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXF1ZXN0VXJsQmFzZSA9IGxvY2F0aW9uLm9yaWdpbiArIGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgICBpZiAoZG9tYWluT3JpZ2luKSB7XG4gICAgICAgICAgICByZXF1ZXN0VXJsQmFzZSA9IGRvbWFpbk9yaWdpbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVxdWVzdFVybCA9IHJlcXVlc3RVcmxCYXNlICsgYD9jbGFzc0d1aWQ9UmVxdWlyZUNvbnRyb2xsZXItZTJmODExZjMtMTRiOC00NzU5LWIwZDYtNzNmMTQ1MTZjZjFkJmZ1bmN0aW9uTmFtZT1nZXRNb2R1bGVzYDtcblxuICAgICAgICBsZXQgcmVtYXBJbXBvcnRSZXF1ZXN0c0NsaWVudHNpZGUgPSBnbG9iYWxUaGlzLnJlbWFwSW1wb3J0UmVxdWVzdHNDbGllbnRzaWRlO1xuICAgICAgICBpZiAocmVtYXBJbXBvcnRSZXF1ZXN0c0NsaWVudHNpZGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZuYyBvZiByZW1hcEltcG9ydFJlcXVlc3RzQ2xpZW50c2lkZSkge1xuICAgICAgICAgICAgICAgIGFyZ3MgPSBhd2FpdCBmbmMoYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJhd1RleHQgPSBhd2FpdCByZXF1ZXN0VGV4dChyZXF1ZXN0VXJsLCB7IGFyZ3MgfSk7XG4gICAgICAgIGxldCByZXN1bHRPYmo6IHtcbiAgICAgICAgICAgIG1vZHVsZXM6IHsgW2lkOiBzdHJpbmddOiBTZXJpYWxpemVkTW9kdWxlIH07XG4gICAgICAgICAgICByZXF1ZXN0c1Jlc29sdmVkUGF0aHM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcmVxdWlyZVNlcU51bVByb2Nlc3NJZDogc3RyaW5nO1xuICAgICAgICAgICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHRPYmogPSBKU09OLnBhcnNlKHJhd1RleHQpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxdWlyZSgke0pTT04uc3RyaW5naWZ5KHJlcXVlc3RzKX0pLiBMaWtlbHkgYSBwZXJtaXNzaW9ucyBlcnJvciwgcG9zc2libHkgZml4ZWQgYnkgcmVzdGFydGluZyB0aGUgbG9jYWwgaHR0cCBzZXJ2ZXIuIFN0YXJ0IG9mIHJlc3BvbnNlIHdhczogJHtKU09OLnN0cmluZ2lmeShyYXdUZXh0LnNsaWNlKDAsIDEwMCkpfS4gRXJyb3IgaXM6ICR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBtb2R1bGVzLCByZXF1ZXN0c1Jlc29sdmVkUGF0aHMsIHJlcXVpcmVTZXFOdW1Qcm9jZXNzSWQsIGVycm9yIH0gPSByZXN1bHRPYmo7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JPYmogPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIGVycm9yT2JqLnN0YWNrID0gZXJyb3I7XG4gICAgICAgICAgICB0aHJvdyBlcnJvck9iajtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1vZHVsZXMpLmxlbmd0aCA9PT0gMSAmJiBcIlwiIGluIG1vZHVsZXMpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgZXZhbChtb2R1bGVzW1wiXCJdLnNvdXJjZSB8fCBcIlwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgbW9kdWxlcyBmb3IgJHtvcmlnaW5hbFJlcXVlc3RzLmpvaW4oXCIsIFwiKX0gKG1hcHBlZCB0byAke3JlcXVlc3RzLmpvaW4oXCIsIFwiKX0pYCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmIChkb21haW5PcmlnaW4pIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGZpeERvbWFpbihyZXF1ZXN0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3QpIHJldHVybiByZXF1ZXN0O1xuICAgICAgICAgICAgICAgIHJldHVybiBkb21haW5PcmlnaW4gKyByZXF1ZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVxdWVzdHMgPSByZXF1ZXN0cy5tYXAoZml4RG9tYWluKTtcbiAgICAgICAgICAgIGZvciAobGV0IFtpZCwgbW9kdWxlXSBvZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBtb2R1bGVzW2lkXTtcbiAgICAgICAgICAgICAgICBtb2R1bGVzW2ZpeERvbWFpbihpZCldID0gbW9kdWxlO1xuICAgICAgICAgICAgICAgIG1vZHVsZS5maWxlbmFtZSA9IGZpeERvbWFpbihtb2R1bGUuZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgIG1vZHVsZS5yZXF1ZXN0cyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhtb2R1bGUucmVxdWVzdHMpLm1hcCgoW2ssIHZdKSA9PiBbaywgZml4RG9tYWluKHYpXSkpO1xuICAgICAgICAgICAgICAgIG1vZHVsZS5vcmlnaW5hbElkID0gZml4RG9tYWluKG1vZHVsZS5vcmlnaW5hbElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcXVlc3RzUmVzb2x2ZWRQYXRocyA9IHJlcXVlc3RzUmVzb2x2ZWRQYXRocy5tYXAoZml4RG9tYWluKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcm9vdFJlc29sdmVDYWNoZVtyZXF1ZXN0c1tpXV0gPSByZXF1ZXN0c1Jlc29sdmVkUGF0aHNbaV07XG4gICAgICAgIH1cblxuICAgICAgICBnbG9iYWxUaGlzLm9uUHJvZ3Jlc3NIYW5kbGVyPy4oe1xuICAgICAgICAgICAgdHlwZTogXCJDb21waWxlXCIsXG4gICAgICAgICAgICBhZGRWYWx1ZTogMCxcbiAgICAgICAgICAgIGFkZE1heDogT2JqZWN0LmtleXMobW9kdWxlcykubGVuZ3RoLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdG9yZSB0aGUgZnVuY3Rpb24sIHNvIHdlIG9ubHkgY2FsbCBpdCBpZiBpdCBleGlzdHMgQkVGT1JFIHdlIGltcG9ydFxuICAgICAgICAvLyAgKHdoaWNoIG1lYW5zIHdlIGFscmVhZHkgaGF2ZSBzb21ldGhpbmcgbG9hZGluZywgc28gdGhpcyBpcyBsaWtlbHkgaG90IHJlbG9hZGluZy4uLilcbiAgICAgICAgbGV0IG9ic2VydmVyT25Ib3RSZWxvYWQgPSBnLm9ic2VydmVyT25Ib3RSZWxvYWQ7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyT25Ib3RSZWxvYWQpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlck9uSG90UmVsb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIHRpbWUgPSBEYXRlLm5vdygpIC0gdGltZTtcbiAgICAgICAgbGV0IG1vZHVsZUNvdW50ID0gT2JqZWN0LnZhbHVlcyhtb2R1bGVzKS5maWx0ZXIoKHgpID0+IHguc291cmNlKS5sZW5ndGg7XG4gICAgICAgIGxldCByZXF1aXJlTW9kdWxlQ291bnQgPSBPYmplY3QudmFsdWVzKG1vZHVsZXMpLmZpbHRlcigoeCkgPT4gIXguc291cmNlKS5sZW5ndGg7XG4gICAgICAgIGxldCBkZXBlbmRlbmNpZXNPbmx5VGV4dCA9IHJlcXVpcmVNb2R1bGVDb3VudCA/IGAgKCske3JlcXVpcmVNb2R1bGVDb3VudH0gZGVwZW5kZW5jaWVzIG9ubHkpYCA6IFwiXCI7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYCVjaW1wb3J0KCR7cmVxdWVzdHMuam9pbihcIiwgXCIpfSkgZmluaXNoZWQgZG93bmxvYWQgJHt0aW1lLnRvRml4ZWQoMCl9bXMsICR7TWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgIHJhd1RleHQubGVuZ3RoIC8gMTAyNFxuICAgICAgICAgICAgKX1LQiwgJHttb2R1bGVDb3VudH0gbW9kdWxlcyR7ZGVwZW5kZW5jaWVzT25seVRleHR9IGF0ICR7KERhdGUubm93KCkgLSBzdGFydFRpbWUpLnRvRml4ZWQoMCl9bXNgLFxuICAgICAgICAgICAgXCJjb2xvcjogbGlnaHRncmVlblwiXG4gICAgICAgICk7XG5cblxuXG4gICAgICAgIGlmIChhbHJlYWR5SGF2ZT8ucmVxdWlyZVNlcU51bVByb2Nlc3NJZCAhPT0gcmVxdWlyZVNlcU51bVByb2Nlc3NJZCkge1xuICAgICAgICAgICAgYWxyZWFkeUhhdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYWxyZWFkeUhhdmUgPSBhbHJlYWR5SGF2ZSB8fCB7IHJlcXVpcmVTZXFOdW1Qcm9jZXNzSWQsIHNlcU51bXM6IHt9IH07XG5cbiAgICAgICAgZm9yIChsZXQgaWQgaW4gbW9kdWxlcykge1xuICAgICAgICAgICAgbGV0IG1vZHVsZSA9IG1vZHVsZXNbaWRdO1xuICAgICAgICAgICAgYWxyZWFkeUhhdmUuc2VxTnVtc1ttb2R1bGUuc2VxTnVtXSA9IDE7XG4gICAgICAgICAgICBzZXJpYWxpemVkTW9kdWxlc1tpZF0gPSBtb2R1bGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGxhc3RXYWl0VGltZSA9IHRpbWU7XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhtb2R1bGVzKSkge1xuICAgICAgICAgICAgZ2V0TW9kdWxlKGtleSwgXCJwcmVsb2FkXCIpO1xuICAgICAgICAgICAgLy8gV2FpdCwgc28gd2UgY2FuIHJlbmRlciBwcm9ncmVzcyAoYW5kIGluIGdlbmVyYWxzLCBzbyB0aGUgVUkgcmVtYWlucyBzb21ld2hhdCByZXNwb25zaXZlKVxuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSBsYXN0V2FpdFRpbWUgPiAxMCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gICAgICAgICAgICAgICAgbGFzdFdhaXRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRpbWUgPSBEYXRlLm5vdygpIC0gdGltZTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgJWNpbXBvcnQoJHtyZXF1ZXN0cy5qb2luKFwiLCBcIil9KSBmaW5pc2hlZCBjb21waWxlICR7dGltZS50b0ZpeGVkKDApfW1zICgke21vZHVsZUNvdW50fSBtb2R1bGVzKSBhdCAkeyhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKS50b0ZpeGVkKDApfW1zYCxcbiAgICAgICAgICAgIFwiY29sb3I6IGhvdHBpbmtcIlxuICAgICAgICApO1xuXG5cbiAgICAgICAgZ2xvYmFsVGhpcy5vblByb2dyZXNzSGFuZGxlcj8uKHtcbiAgICAgICAgICAgIHR5cGU6IFwiRXZhbHVhdGVcIixcbiAgICAgICAgICAgIGFkZFZhbHVlOiAwLFxuICAgICAgICAgICAgYWRkTWF4OiBPYmplY3Qua2V5cyhtb2R1bGVzKS5sZW5ndGgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RzUmVzb2x2ZWRQYXRocy5tYXAoKHgpID0+IGdldE1vZHVsZSh4KSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aW1lID0gRGF0ZS5ub3coKSAtIHRpbWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBgJWNpbXBvcnQoJHtyZXF1ZXN0cy5qb2luKFwiLCBcIil9KSBmaW5pc2hlZCBldmFsdWF0ZSAke3RpbWUudG9GaXhlZCgwKX1tcyAoJHttb2R1bGVDb3VudH0gbW9kdWxlcykgYXQgJHsoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSkudG9GaXhlZCgwKX1tc2AsXG4gICAgICAgICAgICAgICAgXCJjb2xvcjogbGlnaHRibHVlXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVSZXF1aXJlKG1vZHVsZTogTW9kdWxlVHlwZSwgc2VyaWFsaXplZE1vZHVsZTogU2VyaWFsaXplZE1vZHVsZSwgYXN5bmNJc0ZpbmVPdXRlcj86IGJvb2xlYW4pIHtcbiAgICAgICAgcmVxdWlyZS5jYWNoZSA9IG1vZHVsZUNhY2hlO1xuICAgICAgICAvLyBEeW5hbWljYWxseSBnZXQgZm9sZGVyLCBpbmNhc2Ugb3VyIGZpbGVuYW1lIGNoYW5nZXNcbiAgICAgICAgZnVuY3Rpb24gZ2V0TW9kdWxlRm9sZGVyKCkge1xuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS5maWxlbmFtZS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKS5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpICsgXCIvXCI7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZShyZXF1ZXN0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0cyA9IHNlcmlhbGl6ZWRNb2R1bGUucmVxdWVzdHM7XG4gICAgICAgICAgICBpZiAocmVxdWVzdCBpbiByZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0c1tyZXF1ZXN0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhYnNvbHV0ZVBhdGggPSByZXF1ZXN0O1xuICAgICAgICAgICAgaWYgKGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgfHwgYWJzb2x1dGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgZm9sZGVyUGFydHMgPSBnZXRNb2R1bGVGb2xkZXIoKS5zcGxpdChcIi9cIik7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgfHwgYWJzb2x1dGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlUGF0aCA9IGFic29sdXRlUGF0aC5zbGljZShcIi4vXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclBhcnRzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVQYXRoID0gYWJzb2x1dGVQYXRoLnNsaWNlKFwiLi4vXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhYnNvbHV0ZVBhdGggPSBmb2xkZXJQYXJ0cy5qb2luKFwiL1wiKSArIFwiL1wiICsgYWJzb2x1dGVQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RpbGwgdXNlIHRoZSBzYW1lIGRvbWFpblxuICAgICAgICAgICAgaWYgKCFhYnNvbHV0ZVBhdGguc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICAgICAgYWJzb2x1dGVQYXRoID0gbWFpblJvb3RPcmlnaW4gKyBhYnNvbHV0ZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWJzb2x1dGVQYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJlcXVpcmUucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHJldHVybiByZXF1aXJlO1xuICAgICAgICBmdW5jdGlvbiByZXF1aXJlKHJlcXVlc3Q6IHN0cmluZywgYXN5bmNJc0ZpbmU/OiBib29sZWFuKSB7XG4gICAgICAgICAgICBpZiAoYXN5bmNJc0ZpbmVPdXRlcikge1xuICAgICAgICAgICAgICAgIGFzeW5jSXNGaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXN5bmNJc0ZpbmUgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNJc0ZpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluIHNlcmlhbGl6ZWRNb2R1bGUuYXN5bmNSZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgIGFzeW5jSXNGaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluIGJ1aWx0SW5Nb2R1bGVFeHBvcnRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWx0SW5Nb2R1bGVFeHBvcnRzW3JlcXVlc3QgYXMga2V5b2YgdHlwZW9mIGJ1aWx0SW5Nb2R1bGVFeHBvcnRzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFic29sdXRlUGF0aCA9IHJlc29sdmUocmVxdWVzdCk7XG5cbiAgICAgICAgICAgIGxldCByZXNvbHZlZFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluIG1vZHVsZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVxdWVzdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWJzb2x1dGVQYXRoIGluIG1vZHVsZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gYWJzb2x1dGVQYXRoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIShyZXF1ZXN0IGluIHNlcmlhbGl6ZWRNb2R1bGUucmVxdWVzdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXN5bmNJc0ZpbmUgJiYgIWdsb2JhbFRoaXMuc3VwcHJlc3NVbmV4cGVjdGVkTW9kdWxlV2FybmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBBY2Nlc3NlZCB1bmV4cGVjdGVkIG1vZHVsZSAlYyR7cmVxdWVzdH0lYyBpbiAlYyR7bW9kdWxlLmlkfSVjXFxuXFx0VHJlYXRpbmcgaXQgYXMgYW4gYXN5bmMgcmVxdWlyZS5cXG5cXHRBbGwgbW9kdWxlcyByZXF1aXJlIHN5bmNocm9ub3VzbHkgY2xpZW50c2lkZSBtdXN0IGJlIHJlcXVpcmVkIHNlcnZlcnNpZGUgYXQgYSBtb2R1bGUgbGV2ZWwuIEV4cGVjdGVkIGltcG9ydHM6ICR7T2JqZWN0LmtleXMoc2VyaWFsaXplZE1vZHVsZS5yZXF1ZXN0cykuam9pbihcIiB8IFwiKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3I6IHJlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3I6IHVuc2V0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvcjogcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvcjogdW5zZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9vdFJlcXVpcmUoYWJzb2x1dGVQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBCdWlsdCBpbiBtb2R1bGVzIHRoYXQgd2UgaGF2ZW4ndCBiZWVuIGltcGxlbWVudGVkXG4gICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZWRNb2R1bGUucmVxdWVzdHNbcmVxdWVzdF0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlc29sdmVkUGF0aCA9IHNlcmlhbGl6ZWRNb2R1bGUucmVxdWVzdHNbcmVxdWVzdF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWRQYXRoICE9PSBcIk5PVEFMTE9XRURDTElFTlRTSURFXCIgJiYgIXNlcmlhbGl6ZWRNb2R1bGVzW3Jlc29sdmVkUGF0aF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFzeW5jSXNGaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBBY2Nlc3NlZCB1bmV4cGVjdGVkIG1vZHVsZSAlYyR7cmVxdWVzdH0lYyBpbiAlYyR7bW9kdWxlLmlkfSVjXFxuXFx0VHJlYXRpbmcgaXQgYXMgYW4gYXN5bmMgcmVxdWlyZS5cXG5cXHRBbGwgbW9kdWxlcyByZXF1aXJlIHN5bmNocm9ub3VzbHkgY2xpZW50c2lkZSBtdXN0IGJlIHJlcXVpcmVkIHNlcnZlcnNpZGUgYXQgYSBtb2R1bGUgbGV2ZWwuIEV4cGVjdGVkIGltcG9ydHM6ICR7T2JqZWN0LmtleXMoc2VyaWFsaXplZE1vZHVsZS5yZXF1ZXN0cykuam9pbihcIiB8IFwiKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvcjogcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yOiB1bnNldFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvcjogcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yOiB1bnNldFwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByb290UmVxdWlyZShyZXNvbHZlZFBhdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZXhwb3J0c092ZXJyaWRlOiB1bmtub3duIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkUGF0aCA9PT0gXCJOT1RBTExPV0VEQ0xJRU5UU0lERVwiIHx8ICFzZXJpYWxpemVkTW9kdWxlc1tyZXNvbHZlZFBhdGhdPy5hbGxvd2NsaWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZElkID0gcmVzb2x2ZWRQYXRoID09PSBcIk5PVEFMTE9XRURDTElFTlRTSURFXCIgPyByZXF1ZXN0IDogcmVzb2x2ZWRQYXRoO1xuICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkTW9kdWxlc1tyZXNvbHZlZFBhdGhdPy5zZXJ2ZXJvbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cG9ydHNPdmVycmlkZSA9IG5ldyBQcm94eShcbiAgICAgICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCh0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFJldHVybiBhIHRvU3RyaW5nIHRoYXQgZXZhbHVhdGVzIHRvIFwiXCIgc28gd2UgY2FuIEVYUExJQ0lUTFkgZGV0ZWN0IG5vbi1sb2FkZWQgbW9kdWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgPT09IHVubG9hZGVkTW9kdWxlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSBcImRlZmF1bHRcIikgcmV0dXJuIGV4cG9ydHNPdmVycmlkZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTW9kdWxlICR7Y2hpbGRJZH0gaXMgc2VydmVyc2lkZSBvbmx5LiBUcmllZCB0byBhY2Nlc3MgJHtTdHJpbmcocHJvcGVydHkpfSBmcm9tICR7bW9kdWxlLmlkfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cG9ydHNPdmVycmlkZSA9IG5ldyBQcm94eShcbiAgICAgICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCh0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFJldHVybiBhIHRvU3RyaW5nIHRoYXQgZXZhbHVhdGVzIHRvIFwiXCIgc28gd2UgY2FuIEVYUExJQ0lUTFkgZGV0ZWN0IG5vbi1sb2FkZWQgbW9kdWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgPT09IHVubG9hZGVkTW9kdWxlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSBcImRlZmF1bHRcIikgcmV0dXJuIGV4cG9ydHNPdmVycmlkZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IFwibm9uLXdoaXRlbGlzdGVkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VyaWFsaXplZE1vZHVsZXNbcmVzb2x2ZWRQYXRoIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBcIm1pc3NpbmcgbW9kdWxlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQWNjZXNzZWQgJHt0eXBlfSBtb2R1bGUgJWMke2NoaWxkSWR9JWMsIHNwZWNpZmljYWxseSBwcm9wZXJ0eSAlYyR7U3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfSVjLlxcblxcdEFkZCAlY21vZHVsZS5hbGxvd2NsaWVudCA9IHRydWUlYyB0byB0aGUgZmlsZSB0byBhbGxvdyBhY2Nlc3MuXFxuXFx0KElGIGl0IGlzIGEgM3JkIHBhcnR5IGxpYnJhcnksIHVzZSB0aGUgZ2xvYmFsIFwic2V0RmxhZ1wiIGhlbHBlciAoaW4gdGhlIGZpbGUgeW91IGltcG9ydGVkIHRoZSBtb2R1bGUpIHRvIHNldCBwcm9wZXJ0aWVzIG9uIG90aGVyIG1vZHVsZXMgKGl0IGNhbiBldmVuIHJlY3Vyc2l2ZWx5IHNldCBwcm9wZXJ0aWVzKSkuXFxuXFxuXFx0RnJvbSAke21vZHVsZS5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yOiByZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3I6IHVuc2V0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yOiByZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3I6IHVuc2V0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yOiByZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3I6IHVuc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc29sdmVkUGF0aCA9PT0gXCJOT1RBTExPV0VEQ0xJRU5UU0lERVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHNPdmVycmlkZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHByb3ZpZGVyTW9kdWxlID0gZ2V0TW9kdWxlKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgICBtb2R1bGUuY2hpbGRyZW4ucHVzaChwcm92aWRlck1vZHVsZSk7XG4gICAgICAgICAgICBpZiAoZXhwb3J0c092ZXJyaWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlck1vZHVsZS5leHBvcnRzID0gZXhwb3J0c092ZXJyaWRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZXhwb3J0cyA9IHByb3ZpZGVyTW9kdWxlLmV4cG9ydHM7XG4gICAgICAgICAgICBsZXQgcmVtYXBFeHBvcnRzID0gcHJvdmlkZXJNb2R1bGUucmVtYXBFeHBvcnRzO1xuICAgICAgICAgICAgaWYgKHJlbWFwRXhwb3J0cyAmJiB0eXBlb2YgcmVtYXBFeHBvcnRzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBleHBvcnRzID0gcmVtYXBFeHBvcnRzKGV4cG9ydHMsIG1vZHVsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBleHBvcnRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEdlbmVyYXRlcyB0aGUgbW9kdWxlIHJvb3QgZnVuY3Rpb24sIHdoaWNoIGNhbiBiZSBjYWxsZWQgdG8gZXZhbHVhdGUgdGhlIG1vZHVsZSxcbiAgICAgKiAgICAgIGFuZCBoYXMgY29kZSBlcXVhbCB0byBjb250ZW50cy5cbiAgICAgKiAgICAgIC0gZmlsZW5hbWUgaXMganVzdCBmb3IgZGVidWdnaW5nIC8gc3RhY2sgdHJhY2VzXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcFNhZmUoZmlsZW5hbWU6IHN0cmluZywgY29udGVudHM6IHN0cmluZykge1xuICAgICAgICAvLyBUT0RPOiBIYXZlIHRoZSBzZXJ2ZXJzaWRlIGluZm9ybSB1cyBvZiB0aGUgY29ycmVjdCBsb2FkZXIsIG9yLi4uIGhhdmUgaXQgYWN0dWFsbHkgZW1pdCBhIC5qc29uIGxvYWRlci5cbiAgICAgICAgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgIHJldHVybiAoZXhwb3J0czogdW5rbm93biwgcmVxdWlyZTogdW5rbm93biwgbW9kdWxlOiBNb2R1bGVUeXBlKSA9PiAobW9kdWxlLmV4cG9ydHMgPSBjb250ZW50cyAmJiBKU09OLnBhcnNlKGNvbnRlbnRzKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RFOiBkZWJ1Z05hbWUgb25seSBtYXR0ZXJzIGR1cmluZyBtb2R1bGUgZXZhbHVhdGlvbi4gQWZ0ZXIgdGhhdCB0aGUgc291cmNlbWFwIHNob3VsZCB3b3JrLlxuICAgICAgICBsZXQgZGVidWdOYW1lID0gZmlsZW5hbWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuICAgICAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgLnNsaWNlKC0xKVswXVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLi9nLCBcIl9cIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXmEtekEtWl9dL2csIFwiXCIpO1xuICAgICAgICAvLyBOT1RFOiBldmFsIGlzIHVzZWQgaW5zdGVhZCBvZiBuZXcgRnVuY3Rpb24sIGFzIG5ldyBGdW5jdGlvbiBpbmplY3QgbGluZXMsIHdoaWNoIG1lc3Nlc1xuICAgICAgICAvLyAgdXAgb3VyIHNvdXJjZW1hcHMuXG4gICAgICAgIC8vIE5PVEU6IEFsbCBvbiBvbmUgbGluZSwgc28gd2UgZG9uJ3QgYnJlYWsgc291cmNlbWFwcyBieSBUT08gbXVjaC4gV2UgY291bGQgYWxzbyBwYXJzZVxuICAgICAgICAvLyAgdGhlIHNvdXJjZW1hcCBhbmQgYWRqdXN0IGl0LCBidXQuLi4gaXQgaXMgbXVjaCBlYXNpZXIgdG8ganVzdCBub3QgY2hhbmdlIHRoZSBsaW5lIGNvdW50cy5cbiAgICAgICAgcmV0dXJuIGV2YWwoXG4gICAgICAgICAgICBgKGZ1bmN0aW9uICR7ZGVidWdOYW1lfShleHBvcnRzLCByZXF1aXJlLCBtb2R1bGUsIF9fZmlsZW5hbWUsIF9fZGlybmFtZSwgaW1wb3J0RHluYW1pYykge1widXNlIHN0cmljdFwiOyR7Y29udGVudHN9XFxuIH0pYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVubG9hZGVkTW9kdWxlID0gU3ltYm9sKFwidW5sb2FkZWRNb2R1bGVcIik7XG5cbiAgICBsZXQgY3VycmVudE1vZHVsZUV2YWx1YXRpb25TdGFjazogc3RyaW5nW10gPSBbXTtcbiAgICAvLyBTZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9tb2R1bGVzLmh0bWxcbiAgICBmdW5jdGlvbiBnZXRNb2R1bGUocmVzb2x2ZWRJZDogc3RyaW5nLCBwcmVsb2FkPzogXCJwcmVsb2FkXCIpOiBNb2R1bGVUeXBlIHtcbiAgICAgICAgaWYgKHJlc29sdmVkSWQgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7fSBhcyBNb2R1bGVUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZElkIGluIG1vZHVsZUNhY2hlKSB7XG4gICAgICAgICAgICBsZXQgbW9kdWxlID0gbW9kdWxlQ2FjaGVbcmVzb2x2ZWRJZF07XG4gICAgICAgICAgICBpZiAoIXByZWxvYWQgJiYgIW1vZHVsZS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBtb2R1bGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBtb2R1bGUubG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZXJpYWxpemVkTW9kdWxlID0gc2VyaWFsaXplZE1vZHVsZXNbcmVzb2x2ZWRJZF07XG4gICAgICAgIGlmICghc2VyaWFsaXplZE1vZHVsZSkge1xuICAgICAgICAgICAgLy8gSSBjYW4ndCBmaWd1cmUgb3V0IHdoeSB0aGlzIGhhcHBlbnMgYXMgaXQgc2VlbXMgdG8gaGFwcGVuIHZlcnkgcmFyZWx5IGFuZCBvbmx5IHdoZW4gSSdtIGRlYnVnZ2luZyBvdGhlciBjb2RlLlxuICAgICAgICAgICAgLy8gIC0gSSBoYXZlIGhhZCBpdCBoYXBwZW4gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnRpbmcgdGhlIGFwcC4gQWx0aG91Z2ggaW4gdGhlb3J5IGEgaG90IHJlbG9hZCBjb3VsZCBoYXZlXG4gICAgICAgICAgICAvLyAgICAgIHRyaWdnZXJlZCBkdWUgdG8gVlMgY29kZSB3cml0aW5nIHRvIGEgZmlsZS4gXG4gICAgICAgICAgICAvLyAgLSBJJ3ZlIGhhZCB0aW1lcyB3aGVuIGl0IGhhcHBlbnMgb25jZSBhZnRlciBzdGFydHVwIGFuZCB0aGVuIGl0IGdvZXMgYXdheSBhbmQgb3RoZXIgdGltZXMgd2hlcmUgaXRcbiAgICAgICAgICAgIC8vICAgICAgaGFwcGVucyBldmVyeSBzaW5nbGUgdGltZSBhbmQgbmV2ZXIgZ29lcyBhd2F5IHVudGlsIEkgcmVzdGFydCBhaXBhaW50LlxuICAgICAgICAgICAgLy8gIC0gTWF5YmUgaXQgaGFwcGVucyBpZiB3ZSBzd2l0Y2ggc2VydmVycyBhbmQgc28gdGhlIHJvb3QgcGF0aHMgYXJlIGRpZmZlcmVudCBpbiBzb21lIHdheT9cbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gZmluZCBtb2R1bGUgJHtyZXNvbHZlZElkfS4gVGhlIHNlcnZlciBzaG91bGQgaGF2ZSBnaXZlbiBhbiBlcnJvciBhYm91dCB0aGlzLmAsIHNlcmlhbGl6ZWRNb2R1bGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtb2R1bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpIGFzIE1vZHVsZVR5cGU7XG4gICAgICAgIG1vZHVsZUNhY2hlW3Jlc29sdmVkSWRdID0gbW9kdWxlO1xuICAgICAgICBtb2R1bGUuaWQgPSByZXNvbHZlZElkO1xuICAgICAgICBtb2R1bGUuZmlsZW5hbWUgPSBzZXJpYWxpemVkTW9kdWxlPy5maWxlbmFtZSB8fCBcIlwiO1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuICAgICAgICAvLyBEZWZhdWx0IGRlZmF1bHQgb2YgZXhwb3J0cyB0byB0aGUgZXhwb3J0cyBpdHNlbGZcbiAgICAgICAgKG1vZHVsZS5leHBvcnRzIGFzIGFueSkuZGVmYXVsdCA9IG1vZHVsZS5leHBvcnRzO1xuICAgICAgICBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHNlcmlhbGl6ZWRNb2R1bGU/LmZsYWdzIHx8IHt9KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcImxvYWRlZFwiKSBjb250aW51ZTtcbiAgICAgICAgICAgIChtb2R1bGUgYXMgYW55KVtrZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZHVsZS5sb2FkID0gbG9hZDtcblxuICAgICAgICBsZXQgb3JpZ2luYWxTb3VyY2UgPSBzZXJpYWxpemVkTW9kdWxlPy5zb3VyY2UgfHwgXCJcIjtcbiAgICAgICAgbGV0IG1vZHVsZUZuYyA9IHdyYXBTYWZlKG1vZHVsZS5pZCwgb3JpZ2luYWxTb3VyY2UpO1xuXG4gICAgICAgIGdsb2JhbFRoaXMub25Qcm9ncmVzc0hhbmRsZXI/Lih7XG4gICAgICAgICAgICB0eXBlOiBcIkNvbXBpbGVcIixcbiAgICAgICAgICAgIGFkZFZhbHVlOiAxLFxuICAgICAgICAgICAgYWRkTWF4OiAwLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXByZWxvYWQpIHtcbiAgICAgICAgICAgIG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgbW9kdWxlLmxvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGxvYWQoKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkTW9kdWxlID0gc2VyaWFsaXplZE1vZHVsZXNbcmVzb2x2ZWRJZF07XG4gICAgICAgICAgICBpZiAoIXNlcmlhbGl6ZWRNb2R1bGUpIHJldHVybjtcbiAgICAgICAgICAgIGlmICghbW9kdWxlLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5ldmFsdWF0ZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeUhhdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFscmVhZHlIYXZlLnNlcU51bXNbc2VyaWFsaXplZE1vZHVsZS5zZXFOdW1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBUaGVyZSBpcyBhbG1vc3QgbmV2ZXIgYSB3YXkgdG8gcmVjb3ZlciBmcm9tIG1vZHVsZSBkb3dubG9hZGluZyBlcnJvcnMsIHNvIGp1c3QgZG9uJ3QgY2F0Y2ggdGhlbVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiByb290UmVxdWlyZShyZXNvbHZlZElkLCB0cnVlKSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2FkKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTa2lwIGRvdWJsZSBsb2Fkc1xuICAgICAgICAgICAgaWYgKG1vZHVsZS5ldmFsdWF0ZVN0YXJ0ZWQpIHJldHVybjtcblxuICAgICAgICAgICAgbW9kdWxlLm9yaWdpbmFsID0gc2VyaWFsaXplZE1vZHVsZTtcblxuICAgICAgICAgICAgbW9kdWxlLnJlcXVpcmVzID0gc2VyaWFsaXplZE1vZHVsZS5yZXF1ZXN0cztcbiAgICAgICAgICAgIG1vZHVsZS5yZXF1aXJlID0gY3JlYXRlUmVxdWlyZShtb2R1bGUsIHNlcmlhbGl6ZWRNb2R1bGUpIGFzIGFueTtcbiAgICAgICAgICAgIC8vIFRPRE86IE9uY2UgdHlwZXNjcmlwdCBzdXBwb3J0cyBkeW5hbWljIGltcG9ydCwgbWFwIGltcG9ydCgpIHRvIGltcG9ydER5bmFtaWMsIHNvIGl0XG4gICAgICAgICAgICAvLyAgdXNlcyBvdXIgaW1wb3J0IGZ1bmN0aW9uLCBpbnN0ZWFkIG9mIHRoZSBidWlsdCBpbiBvbmUuXG4gICAgICAgICAgICAvLyAgKEFzIGFwcGFyZW50bHkgd2UgY2FuJ3QganVzdCBvdmVycmlkZSBpbXBvcnQgb24gYSBwZXIgbW9kdWxlIGJhc2lzLCBiZWNhdXNlXG4gICAgICAgICAgICAvLyAgICAgIHdlIGNhbid0IGhhdmUgYW4gaWRlbnRpZnkgY2FsbGVkIFwiaW1wb3J0XCIuLi4gd2hpY2ggaXMgYW5ub3lpbmcpLlxuICAgICAgICAgICAgbGV0IGltcG9ydER5bmFtaWMgPSBjcmVhdGVSZXF1aXJlKG1vZHVsZSwgc2VyaWFsaXplZE1vZHVsZSwgdHJ1ZSk7XG4gICAgICAgICAgICBtb2R1bGUuaW1wb3J0ID0gaW1wb3J0RHluYW1pYztcblxuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNlcmlhbGl6ZWRNb2R1bGUuc291cmNlO1xuXG4gICAgICAgICAgICBtb2R1bGUuYWxsb3djbGllbnQgPSAhIXNlcmlhbGl6ZWRNb2R1bGUuc291cmNlO1xuXG4gICAgICAgICAgICAvLyBJbXBvcnQgY2hpbGRyZW4sIGFzIHRoZSBjaGlsZHJlbiBtYXkgYmUgYWxsb3dlZCBjbGllbnRzaWRlLCBhbmQgbWF5IGhhdmUgc2lkZS1lZmZlY3RzIVxuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdHMgPSBPYmplY3Qua2V5cyhzZXJpYWxpemVkTW9kdWxlLnJlcXVlc3RzKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh4KSA9PiB4ICE9PSBcIk5PVEFMTE9XRURDTElFTlRTSURFXCIpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+ICEoeCBpbiBzZXJpYWxpemVkTW9kdWxlLmFzeW5jUmVxdWVzdHMpKTtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSByZXF1ZXN0cy5tYXAoKGlkKSA9PiBgcmVxdWlyZSgke0pTT04uc3RyaW5naWZ5KGlkKX0pO1xcbmApLmpvaW4oXCJcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vZHVsZS5zaXplID0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIG1vZHVsZS5zb3VyY2UgPSBzb3VyY2U7XG5cbiAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IG9yaWdpbmFsU291cmNlKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxTb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICAgICAgbW9kdWxlRm5jID0gd3JhcFNhZmUobW9kdWxlLmlkLCBvcmlnaW5hbFNvdXJjZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBkaXJuYW1lID0gbW9kdWxlLmZpbGVuYW1lLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG5cbiAgICAgICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGN1cnJlbnRNb2R1bGVFdmFsdWF0aW9uU3RhY2sucHVzaChtb2R1bGUuZmlsZW5hbWUpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBtb2R1bGUuZXZhbHVhdGVTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBtb2R1bGUuaXNQcmVsb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBtb2R1bGUuZXZhbFN0YXJ0VGltZSA9IG5leHRUaW1lKCk7XG4gICAgICAgICAgICAgICAgbW9kdWxlLmV2YWxFbmRUaW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIG1vZHVsZUZuYy5jYWxsKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBBZGRpbmcgX19pbXBvcnRTdGFyIHRvIHRoZSBtb2R1bGUgY2F1c2VzIHR5cGVzY3JpcHQgdG8gdXNlIG91ciBpbXBsZW1lbnRhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICB3aGljaCBjaGVja3MgZm9yIHVubG9hZGVkTW9kdWxlIGFuZCByZXR1cm5zIHVuZGVmaW5lZCBpbiB0aGF0IGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2ltcG9ydFN0YXIobW9kOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kW3VubG9hZGVkTW9kdWxlXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9faW1wb3J0RGVmYXVsdChtb2Q6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2QuZGVmYXVsdCA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGUucmVxdWlyZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydER5bmFtaWNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG1vZHVsZS5ldmFsRW5kVGltZSA9IG5leHRUaW1lKCk7XG4gICAgICAgICAgICAgICAgdGltZSA9IERhdGUubm93KCkgLSB0aW1lO1xuICAgICAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgbG9nIHN0YXRtZW50IGlzIGRpc2FibGVkIGFzIEkgYmVsaWV2ZSBpdCBjYXVzZXMgbGFnICh3aGVuIGRldnRvb2xzIGlzIG9wZW4pLlxuICAgICAgICAgICAgICAgIC8vICBBcyBpbiwgYWRkaW5nIGFib3V0IDUwMG1zIHRvIG91ciBsb2FkIHRpbWUsIHdoaWNoIGlzIGFubm95aW5nIHdoZW4gZGVidWdnaW5nLlxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhgRXZhbHVhdGVkIG1vZHVsZSAke21vZHVsZS5maWxlbmFtZX0gJHtNYXRoLmNlaWwoc291cmNlLmxlbmd0aCAvIDEwMjQpfUtCYCk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5pc1ByZWxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlRXZhbHVhdGlvblN0YWNrLnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5vblByb2dyZXNzSGFuZGxlcj8uKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJFdmFsdWF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRWYWx1ZTogMSxcbiAgICAgICAgICAgICAgICAgICAgYWRkTWF4OiAwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICB9XG59Il19
|
|
676
|
-
/* _JS_SOURCE_HASH = "15af84828acbac04ce4afc013df34adb3fef63924b44dbeeddf60bb9cf7d838b"; */
|