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,252 +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
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
29
|
-
exports.HotReloadController = exports.onHotReload = exports.setExternalHotReloading = exports.hotReloadingGuard = exports.isHotReloading = exports.watchFilesAndTriggerHotReloading = void 0;
|
|
30
|
-
/// <reference path="../../typenode/index.d.ts" />
|
|
31
|
-
/// <reference path="../require/RequireController.ts" />
|
|
32
|
-
module.allowclient = true;
|
|
33
|
-
const SocketFunction_1 = require("../SocketFunction");
|
|
34
|
-
const caching_1 = require("../src/caching");
|
|
35
|
-
const createSingleton_1 = require("../src/createSingleton");
|
|
36
|
-
const fs = __importStar(require("fs"));
|
|
37
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
38
|
-
const misc_1 = require("../src/misc");
|
|
39
|
-
const logColors_1 = require("../src/formatting/logColors");
|
|
40
|
-
const format_1 = require("../src/formatting/format");
|
|
41
|
-
const RequireController_1 = require("../require/RequireController");
|
|
42
|
-
/** Enables some hot reload functionality.
|
|
43
|
-
* - Triggers a refresh clientside
|
|
44
|
-
* - Triggers a reload server, for modules marked with `module.hotreload`
|
|
45
|
-
*/
|
|
46
|
-
function watchFilesAndTriggerHotReloading(noAutomaticBrowserWatch = false) {
|
|
47
|
-
SocketFunction_1.SocketFunction.expose(exports.HotReloadController);
|
|
48
|
-
if (!(0, misc_1.isNode)()) {
|
|
49
|
-
if (!noAutomaticBrowserWatch) {
|
|
50
|
-
exports.HotReloadController.nodes[SocketFunction_1.SocketFunction.browserNodeId()]
|
|
51
|
-
.watchFiles()
|
|
52
|
-
.catch(e => console.error("watchFiles error", e));
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
setInterval(() => {
|
|
56
|
-
for (let module of Object.values(require.cache)) {
|
|
57
|
-
if (!module)
|
|
58
|
-
continue;
|
|
59
|
-
hotReloadModule(module);
|
|
60
|
-
}
|
|
61
|
-
}, 5000);
|
|
62
|
-
}
|
|
63
|
-
exports.watchFilesAndTriggerHotReloading = watchFilesAndTriggerHotReloading;
|
|
64
|
-
// Shared across copies of this package, so the "currently hot reloading" flag is consistent no
|
|
65
|
-
// matter which copy set it (ex, setExternalHotReloading) or reads it (callManager.registerClass
|
|
66
|
-
// reads it via the globalThis.isHotReloading bridge, which each copy overwrites). See createSingleton.
|
|
67
|
-
const isHotReloadingState = (0, createSingleton_1.createSingleton)("HotReloadController.isHotReloading", 1, () => ({ value: false }));
|
|
68
|
-
function isHotReloading() {
|
|
69
|
-
return isHotReloadingState.get().value;
|
|
70
|
-
}
|
|
71
|
-
exports.isHotReloading = isHotReloading;
|
|
72
|
-
globalThis.isHotReloading = isHotReloading;
|
|
73
|
-
function hotReloadingGuard() {
|
|
74
|
-
return !isHotReloading();
|
|
75
|
-
}
|
|
76
|
-
exports.hotReloadingGuard = hotReloadingGuard;
|
|
77
|
-
function setExternalHotReloading(value) {
|
|
78
|
-
isHotReloadingState.get().value = value;
|
|
79
|
-
}
|
|
80
|
-
exports.setExternalHotReloading = setExternalHotReloading;
|
|
81
|
-
// Shared across copies, so callbacks registered through one copy's onHotReload still fire when the
|
|
82
|
-
// first-registered copy's controller performs a reload. See createSingleton.
|
|
83
|
-
const hotReloadCallbacks = (0, createSingleton_1.createSingleton)("HotReloadController.hotReloadCallbacks", 1, () => []).get();
|
|
84
|
-
function onHotReload(callback) {
|
|
85
|
-
hotReloadCallbacks.push(callback);
|
|
86
|
-
}
|
|
87
|
-
exports.onHotReload = onHotReload;
|
|
88
|
-
const hotReloadModule = (0, caching_1.cache)((module) => {
|
|
89
|
-
if (!module.updateContents)
|
|
90
|
-
return;
|
|
91
|
-
let interval = 1000;
|
|
92
|
-
let fast = false;
|
|
93
|
-
if (module.hotreload) {
|
|
94
|
-
interval = 100;
|
|
95
|
-
fast = true;
|
|
96
|
-
}
|
|
97
|
-
let lastHashes = new Map();
|
|
98
|
-
function getHash(path) {
|
|
99
|
-
try {
|
|
100
|
-
let contents = fs.readFileSync(path, "utf8");
|
|
101
|
-
return crypto_1.default.createHash("sha256").update(contents).digest("hex");
|
|
102
|
-
}
|
|
103
|
-
catch (_a) {
|
|
104
|
-
return "";
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
watchFile(module.filename);
|
|
108
|
-
for (let path of module.watchAdditionalFiles || []) {
|
|
109
|
-
watchFile(path);
|
|
110
|
-
}
|
|
111
|
-
function watchFile(path) {
|
|
112
|
-
lastHashes.set(path, getHash(path));
|
|
113
|
-
fs.watchFile(path, { persistent: false, interval }, (curr, prev) => {
|
|
114
|
-
let newHash = getHash(path);
|
|
115
|
-
if (newHash === lastHashes.get(path))
|
|
116
|
-
return;
|
|
117
|
-
lastHashes.set(path, newHash);
|
|
118
|
-
if (path === module.filename) {
|
|
119
|
-
console.log(`Hot reloading ${module.filename} due to change`);
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
console.log(`Hot reloading ${module.filename} due to change in ${path}`);
|
|
123
|
-
}
|
|
124
|
-
doHotReload(curr.mtimeMs);
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
// IMPORTANT! changeTime is for benchmarking how long we took to hotreload (and nothing else)
|
|
128
|
-
function doHotReload(changeTime) {
|
|
129
|
-
var _a, _b, _c;
|
|
130
|
-
(_a = module.updateContents) === null || _a === void 0 ? void 0 : _a.call(module);
|
|
131
|
-
if ((0, misc_1.isNode)() && !module.noserverhotreload) {
|
|
132
|
-
if (module.hotreload
|
|
133
|
-
// A fairly big hack (as this could just be in a string, or something similar), but... it also VERY useful
|
|
134
|
-
|| ((_b = module.moduleContents) === null || _b === void 0 ? void 0 : _b.includes("\nmodule.hotreload = true;" + "\n"))
|
|
135
|
-
|| ((_c = module.moduleContents) === null || _c === void 0 ? void 0 : _c.includes("\r\nmodule.hotreload = true;" + "\r\n"))) {
|
|
136
|
-
console.log(`Serverside reloading ${module.id}`);
|
|
137
|
-
isHotReloadingState.get().value = true;
|
|
138
|
-
try {
|
|
139
|
-
module.loaded = false;
|
|
140
|
-
module.load(module.id);
|
|
141
|
-
}
|
|
142
|
-
catch (e) {
|
|
143
|
-
console.error((0, logColors_1.red)(`Error hot reloading ${module.id}`));
|
|
144
|
-
console.error(e);
|
|
145
|
-
}
|
|
146
|
-
finally {
|
|
147
|
-
setTimeout(() => {
|
|
148
|
-
isHotReloadingState.get().value = false;
|
|
149
|
-
}, 1000);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
for (let callback of hotReloadCallbacks) {
|
|
153
|
-
callback([module]);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
//module.sourceSHA256;
|
|
157
|
-
// crypto.createHash("sha256").update(contents).digest("hex")
|
|
158
|
-
if ((0, RequireController_1.getIsAllowClient)(module)) {
|
|
159
|
-
triggerClientSideReload({
|
|
160
|
-
files: [module.filename],
|
|
161
|
-
changeTime,
|
|
162
|
-
fast,
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
let reloadTriggering = false;
|
|
168
|
-
let clientWatcherNodes = new Set();
|
|
169
|
-
let pendingTriggerFiles = new Set();
|
|
170
|
-
function triggerClientSideReload(config) {
|
|
171
|
-
for (let file of config.files) {
|
|
172
|
-
pendingTriggerFiles.add(file);
|
|
173
|
-
}
|
|
174
|
-
if (reloadTriggering)
|
|
175
|
-
return;
|
|
176
|
-
reloadTriggering = true;
|
|
177
|
-
setTimeout(async () => {
|
|
178
|
-
reloadTriggering = false;
|
|
179
|
-
let files = Array.from(pendingTriggerFiles);
|
|
180
|
-
pendingTriggerFiles.clear();
|
|
181
|
-
for (let clientNodeId of clientWatcherNodes) {
|
|
182
|
-
console.log(`Notifying client of hot reload: ${clientNodeId}`, files);
|
|
183
|
-
exports.HotReloadController.nodes[clientNodeId].fileUpdated(files, config.changeTime).catch(() => {
|
|
184
|
-
console.log(`Removing erroring client: ${clientNodeId}`);
|
|
185
|
-
clientWatcherNodes.delete(clientNodeId);
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
// We need to wait, otherwise batched updates fail, WHICH, can result in updates while reloading,
|
|
189
|
-
// which causes missed updates.
|
|
190
|
-
}, config.fast ? 50 : 300);
|
|
191
|
-
}
|
|
192
|
-
class HotReloadControllerBase {
|
|
193
|
-
// TODO: Also hot reload when we reconnect to the server, as it is likely setup will need to
|
|
194
|
-
// be rerun in that case as well (for example, we need to call watchFiles again!)
|
|
195
|
-
async watchFiles() {
|
|
196
|
-
let callerId = SocketFunction_1.SocketFunction.getCaller().nodeId;
|
|
197
|
-
clientWatcherNodes.add(callerId);
|
|
198
|
-
}
|
|
199
|
-
// TODO: This is actually broken related to lazy loaded and server-only code, as the server will tell us a file changed, and then we'll see that we don't have it loaded, and so we will try to refresh.
|
|
200
|
-
// - The reason we refresh is because it might be a new file. I don't know how we could check to see if it was lazy loaded. Maybe we just shouldn't refresh ever if we can't find the module? We'll see how much we run into the extra refresh due to lazy loading...
|
|
201
|
-
async fileUpdated(files, changeTime) {
|
|
202
|
-
try {
|
|
203
|
-
console.groupCollapsed((0, logColors_1.magenta)(`Trigger hotreload for files ${(0, format_1.formatTime)(Date.now() - changeTime)} after file change`));
|
|
204
|
-
for (let file of files) {
|
|
205
|
-
console.log(file);
|
|
206
|
-
}
|
|
207
|
-
console.groupEnd();
|
|
208
|
-
let modules = [];
|
|
209
|
-
for (let file of files) {
|
|
210
|
-
file = "https://" + ((BOOTED_EDGE_NODE === null || BOOTED_EDGE_NODE === void 0 ? void 0 : BOOTED_EDGE_NODE.host) || location.host) + "/" + file;
|
|
211
|
-
let module = require.cache[file];
|
|
212
|
-
if (!module) {
|
|
213
|
-
console.log(`Module not found: ${file}, not reloading page`);
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
if (!module.hotreload) {
|
|
217
|
-
console.log(`Module not hotreloadable: ${file}, reloading page to ensure new version is loaded`);
|
|
218
|
-
document.location.reload();
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
modules.push(module);
|
|
222
|
-
}
|
|
223
|
-
for (let module of modules) {
|
|
224
|
-
module.loaded = false;
|
|
225
|
-
}
|
|
226
|
-
isHotReloadingState.get().value = true;
|
|
227
|
-
try {
|
|
228
|
-
await Promise.all(modules.map(module => module.load(module.filename)));
|
|
229
|
-
}
|
|
230
|
-
finally {
|
|
231
|
-
setTimeout(() => {
|
|
232
|
-
isHotReloadingState.get().value = false;
|
|
233
|
-
}, 1000);
|
|
234
|
-
}
|
|
235
|
-
for (let callback of hotReloadCallbacks) {
|
|
236
|
-
callback(modules);
|
|
237
|
-
}
|
|
238
|
-
console.log((0, logColors_1.magenta)(`Hot reload complete ${(0, format_1.formatTime)(Date.now() - changeTime)} after file change`));
|
|
239
|
-
}
|
|
240
|
-
catch (e) {
|
|
241
|
-
console.error(`Hot reload failed ${e.stack}`);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
exports.HotReloadController = SocketFunction_1.SocketFunction.register("HotReloadController-032b2250-3aac-4187-8c95-75412742b8f5", new HotReloadControllerBase(), () => ({
|
|
246
|
-
watchFiles: {},
|
|
247
|
-
fileUpdated: {}
|
|
248
|
-
}), () => ({}), {
|
|
249
|
-
noAutoExpose: true,
|
|
250
|
-
});
|
|
251
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSG90UmVsb2FkQ29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkhvdFJlbG9hZENvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBa0Q7QUFDbEQsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBRTFCLHNEQUFtRDtBQUNuRCw0Q0FBNkM7QUFDN0MsNERBQXlEO0FBQ3pELHVDQUF5QjtBQUN6QixvREFBNEI7QUFFNUIsc0NBQXFDO0FBQ3JDLDJEQUEyRDtBQUMzRCxxREFBc0Q7QUFFdEQsb0VBQWdFO0FBRWhFOzs7R0FHRztBQUNILFNBQWdCLGdDQUFnQyxDQUFDLHVCQUF1QixHQUFHLEtBQUs7SUFDNUUsK0JBQWMsQ0FBQyxNQUFNLENBQUMsMkJBQW1CLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUMsSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDM0IsMkJBQW1CLENBQUMsS0FBSyxDQUFDLCtCQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQ3BELFVBQVUsRUFBRTtpQkFDWixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ2hEO1FBQ1QsQ0FBQztJQUNMLENBQUM7SUFDRCxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxNQUFNO2dCQUFFLFNBQVM7WUFDdEIsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDTCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDYixDQUFDO0FBaEJELDRF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QUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRSxDQUFDO29CQUFTLENBQUM7Z0JBQ1AsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDWixtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUM1QyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDYixDQUFDO1lBRUQsS0FBSyxJQUFJLFFBQVEsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUN0QyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEIsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBQSxtQkFBTyxFQUFDLHVCQUF1QixJQUFBLG1CQUFVLEVBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBRVksUUFBQSxtQkFBbUIsR0FBRywrQkFBYyxDQUFDLFFBQVEsQ0FDdEQsMERBQTBELEVBQzFELElBQUksdUJBQXVCLEVBQUUsRUFDN0IsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNILFVBQVUsRUFBRSxFQUFFO0lBQ2QsV0FBVyxFQUFFLEVBQUU7Q0FDbEIsQ0FBQyxFQUNGLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFFTixDQUFDLEVBQ0Y7SUFDSSxZQUFZLEVBQUUsSUFBSTtDQUNyQixDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwZW5vZGUvaW5kZXguZC50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vcmVxdWlyZS9SZXF1aXJlQ29udHJvbGxlci50c1wiIC8+XG5tb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuXG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCIuLi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgY2FjaGUsIGxhenkgfSBmcm9tIFwiLi4vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IGNyZWF0ZVNpbmdsZXRvbiB9IGZyb20gXCIuLi9zcmMvY3JlYXRlU2luZ2xldG9uXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBjcnlwdG8gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IGRlYnVnYnJlYWsgZnJvbSBcImRlYnVnYnJlYWtcIjtcbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gXCIuLi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgbWFnZW50YSwgcmVkIH0gZnJvbSBcIi4uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuaW1wb3J0IHsgZm9ybWF0VGltZSB9IGZyb20gXCIuLi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7IGJhdGNoRnVuY3Rpb24gfSBmcm9tIFwiLi4vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBnZXRJc0FsbG93Q2xpZW50IH0gZnJvbSBcIi4uL3JlcXVpcmUvUmVxdWlyZUNvbnRyb2xsZXJcIjtcblxuLyoqIEVuYWJsZXMgc29tZSBob3QgcmVsb2FkIGZ1bmN0aW9uYWxpdHkuXG4gKiAgICAgIC0gVHJpZ2dlcnMgYSByZWZyZXNoIGNsaWVudHNpZGVcbiAqICAgICAgLSBUcmlnZ2VycyBhIHJlbG9hZCBzZXJ2ZXIsIGZvciBtb2R1bGVzIG1hcmtlZCB3aXRoIGBtb2R1bGUuaG90cmVsb2FkYFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2hGaWxlc0FuZFRyaWdnZXJIb3RSZWxvYWRpbmcobm9BdXRvbWF0aWNCcm93c2VyV2F0Y2ggPSBmYWxzZSkge1xuICAgIFNvY2tldEZ1bmN0aW9uLmV4cG9zZShIb3RSZWxvYWRDb250cm9sbGVyKTtcbiAgICBpZiAoIWlzTm9kZSgpKSB7XG4gICAgICAgIGlmICghbm9BdXRvbWF0aWNCcm93c2VyV2F0Y2gpIHtcbiAgICAgICAgICAgIEhvdFJlbG9hZENvbnRyb2xsZXIubm9kZXNbU29ja2V0RnVuY3Rpb24uYnJvd3Nlck5vZGVJZCgpXVxuICAgICAgICAgICAgICAgIC53YXRjaEZpbGVzKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiBjb25zb2xlLmVycm9yKFwid2F0Y2hGaWxlcyBlcnJvclwiLCBlKSlcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBmb3IgKGxldCBtb2R1bGUgb2YgT2JqZWN0LnZhbHVlcyhyZXF1aXJlLmNhY2hlKSkge1xuICAgICAgICAgICAgaWYgKCFtb2R1bGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaG90UmVsb2FkTW9kdWxlKG1vZHVsZSk7XG4gICAgICAgIH1cbiAgICB9LCA1MDAwKTtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIG5hbWVzcGFjZSBOb2RlSlMge1xuICAgICAgICBpbnRlcmZhY2UgTW9kdWxlIHtcbiAgICAgICAgICAgIC8qKiBDYXVzZXMgdXMgdG8gaG90cmVsb2FkIHRoZSBmaWxlLiBBcHBsaWVzIGJvdGggc2VydmVyc2lkZSBhbmQgY2xpZW50c2lkZS5cbiAgICAgICAgICAgICAqICAgICAgLSBJZiBub3Qgc2V0IGZvciBhbnkgZmlsZXMgY2xpZW50c2lkZSwgd2Ugd2lsbCByZWZyZXNoLlxuICAgICAgICAgICAgICogICAgICAtIElmIG5vdCBzZXQgZm9yIGFueSBmaWxlcyBzZXJ2ZXJzaWRlLCB3ZSB3aWxsIGRvIG5vdGhpbmcgKGFuZCBqdXN0IGxlYXZlIG9sZCBjb2RlIHJ1bm5pbmcpLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBob3RyZWxvYWQ/OiBib29sZWFuO1xuICAgICAgICAgICAgLyoqIE92ZXJyaWRlcyBob3RyZWxvYWQgdG8gZGlzYWJsZSBob3QgcmVsb2FkaW5nLiBVc2VmdWwgaWYgeW91IGFkZCBcImhvdHJlbG9hZC5mbGFnXCIgdG8gYSBkaXJlY3RvcnlcbiAgICAgICAgICAgICAqICAgICAgKHdoaWNoIHNldHMgaG90cmVsb2FkIG9uIGFsbCBmaWxlcyBpbiBhbmQgdW5kZXIgdGhhdCBkaXJlY3RvcnkpLCBidXQgd2FudCBhIHNwZWNpZmljIGZpbGVcbiAgICAgICAgICAgICAqICAgICAgdG8gbm90IGhvdHJlbG9hZC5cbiAgICAgICAgICAgICAqICAtIEFsc28gdXNlZnVsIGlmIHlvdSB3YW50IGZpbGVzIHRvIGhvdHJlbG9hZCBjbGllbnRzaWRlLCBidXQgbm90IHNlcnZlcnNpZGUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5vc2VydmVyaG90cmVsb2FkPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgd2F0Y2hBZGRpdGlvbmFsRmlsZXM/OiBzdHJpbmdbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgaXNIb3RSZWxvYWRpbmc6ICgoKSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZDtcbn1cblxuLy8gU2hhcmVkIGFjcm9zcyBjb3BpZXMgb2YgdGhpcyBwYWNrYWdlLCBzbyB0aGUgXCJjdXJyZW50bHkgaG90IHJlbG9hZGluZ1wiIGZsYWcgaXMgY29uc2lzdGVudCBub1xuLy8gIG1hdHRlciB3aGljaCBjb3B5IHNldCBpdCAoZXgsIHNldEV4dGVybmFsSG90UmVsb2FkaW5nKSBvciByZWFkcyBpdCAoY2FsbE1hbmFnZXIucmVnaXN0ZXJDbGFzc1xuLy8gIHJlYWRzIGl0IHZpYSB0aGUgZ2xvYmFsVGhpcy5pc0hvdFJlbG9hZGluZyBicmlkZ2UsIHdoaWNoIGVhY2ggY29weSBvdmVyd3JpdGVzKS4gU2VlIGNyZWF0ZVNpbmdsZXRvbi5cbmNvbnN0IGlzSG90UmVsb2FkaW5nU3RhdGUgPSBjcmVhdGVTaW5nbGV0b24oXCJIb3RSZWxvYWRDb250cm9sbGVyLmlzSG90UmVsb2FkaW5nXCIsIDEsICgpID0+ICh7IHZhbHVlOiBmYWxzZSB9KSk7XG5leHBvcnQgZnVuY3Rpb24gaXNIb3RSZWxvYWRpbmcoKSB7XG4gICAgcmV0dXJuIGlzSG90UmVsb2FkaW5nU3RhdGUuZ2V0KCkudmFsdWU7XG59XG5nbG9iYWxUaGlzLmlzSG90UmVsb2FkaW5nID0gaXNIb3RSZWxvYWRpbmc7XG5leHBvcnQgZnVuY3Rpb24gaG90UmVsb2FkaW5nR3VhcmQoKTogdHJ1ZSB7XG4gICAgcmV0dXJuICFpc0hvdFJlbG9hZGluZygpIGFzIGFueTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRFeHRlcm5hbEhvdFJlbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlzSG90UmVsb2FkaW5nU3RhdGUuZ2V0KCkudmFsdWUgPSB2YWx1ZTtcbn1cbi8vIFNoYXJlZCBhY3Jvc3MgY29waWVzLCBzbyBjYWxsYmFja3MgcmVnaXN0ZXJlZCB0aHJvdWdoIG9uZSBjb3B5J3Mgb25Ib3RSZWxvYWQgc3RpbGwgZmlyZSB3aGVuIHRoZVxuLy8gIGZpcnN0LXJlZ2lzdGVyZWQgY29weSdzIGNvbnRyb2xsZXIgcGVyZm9ybXMgYSByZWxvYWQuIFNlZSBjcmVhdGVTaW5nbGV0b24uXG5jb25zdCBob3RSZWxvYWRDYWxsYmFja3MgPSBjcmVhdGVTaW5nbGV0b24oXCJIb3RSZWxvYWRDb250cm9sbGVyLmhvdFJlbG9hZENhbGxiYWNrc1wiLCAxLCAoKSA9PiBbXSBhcyAoKG1vZHVsZXM6IE5vZGVKUy5Nb2R1bGVbXSkgPT4gdm9pZClbXSkuZ2V0KCk7XG5leHBvcnQgZnVuY3Rpb24gb25Ib3RSZWxvYWQoY2FsbGJhY2s6IChtb2R1bGVzOiBOb2RlSlMuTW9kdWxlW10pID0+IHZvaWQpIHtcbiAgICBob3RSZWxvYWRDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG59XG5cbmNvbnN0IGhvdFJlbG9hZE1vZHVsZSA9IGNhY2hlKChtb2R1bGU6IE5vZGVKUy5Nb2R1bGUpID0+IHtcbiAgICBpZiAoIW1vZHVsZS51cGRhdGVDb250ZW50cykgcmV0dXJuO1xuICAgIGxldCBpbnRlcnZhbCA9IDEwMDA7XG4gICAgbGV0IGZhc3QgPSBmYWxzZTtcbiAgICBpZiAobW9kdWxlLmhvdHJlbG9hZCkge1xuICAgICAgICBpbnRlcnZhbCA9IDEwMDtcbiAgICAgICAgZmFzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgbGV0IGxhc3RIYXNoZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZ1bmN0aW9uIGdldEhhc2gocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgY29udGVudHMgPSBmcy5yZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShjb250ZW50cykuZGlnZXN0KFwiaGV4XCIpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2F0Y2hGaWxlKG1vZHVsZS5maWxlbmFtZSk7XG4gICAgZm9yIChsZXQgcGF0aCBvZiBtb2R1bGUud2F0Y2hBZGRpdGlvbmFsRmlsZXMgfHwgW10pIHtcbiAgICAgICAgd2F0Y2hGaWxlKHBhdGgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdhdGNoRmlsZShwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgbGFzdEhhc2hlcy5zZXQocGF0aCwgZ2V0SGFzaChwYXRoKSk7XG4gICAgICAgIGZzLndhdGNoRmlsZShwYXRoLCB7IHBlcnNpc3RlbnQ6IGZhbHNlLCBpbnRlcnZhbCB9LCAoY3VyciwgcHJldikgPT4ge1xuICAgICAgICAgICAgbGV0IG5ld0hhc2ggPSBnZXRIYXNoKHBhdGgpO1xuICAgICAgICAgICAgaWYgKG5ld0hhc2ggPT09IGxhc3RIYXNoZXMuZ2V0KHBhdGgpKSByZXR1cm47XG4gICAgICAgICAgICBsYXN0SGFzaGVzLnNldChwYXRoLCBuZXdIYXNoKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSBtb2R1bGUuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSG90IHJlbG9hZGluZyAke21vZHVsZS5maWxlbmFtZX0gZHVlIHRvIGNoYW5nZWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSG90IHJlbG9hZGluZyAke21vZHVsZS5maWxlbmFtZX0gZHVlIHRvIGNoYW5nZSBpbiAke3BhdGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb0hvdFJlbG9hZChjdXJyLm10aW1lTXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuXG4gICAgLy8gSU1QT1JUQU5UISBjaGFuZ2VUaW1lIGlzIGZvciBiZW5jaG1hcmtpbmcgaG93IGxvbmcgd2UgdG9vayB0byBob3RyZWxvYWQgKGFuZCBub3RoaW5nIGVsc2UpXG4gICAgZnVuY3Rpb24gZG9Ib3RSZWxvYWQoY2hhbmdlVGltZTogbnVtYmVyKSB7XG4gICAgICAgIG1vZHVsZS51cGRhdGVDb250ZW50cz8uKCk7XG4gICAgICAgIGlmIChpc05vZGUoKSAmJiAhbW9kdWxlLm5vc2VydmVyaG90cmVsb2FkKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbW9kdWxlLmhvdHJlbG9hZFxuICAgICAgICAgICAgICAgIC8vIEEgZmFpcmx5IGJpZyBoYWNrIChhcyB0aGlzIGNvdWxkIGp1c3QgYmUgaW4gYSBzdHJpbmcsIG9yIHNvbWV0aGluZyBzaW1pbGFyKSwgYnV0Li4uIGl0IGFsc28gVkVSWSB1c2VmdWxcbiAgICAgICAgICAgICAgICB8fCBtb2R1bGUubW9kdWxlQ29udGVudHM/LmluY2x1ZGVzKFwiXFxubW9kdWxlLmhvdHJlbG9hZCA9IHRydWU7XCIgKyBcIlxcblwiKVxuICAgICAgICAgICAgICAgIHx8IG1vZHVsZS5tb2R1bGVDb250ZW50cz8uaW5jbHVkZXMoXCJcXHJcXG5tb2R1bGUuaG90cmVsb2FkID0gdHJ1ZTtcIiArIFwiXFxyXFxuXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgU2VydmVyc2lkZSByZWxvYWRpbmcgJHttb2R1bGUuaWR9YCk7XG4gICAgICAgICAgICAgICAgaXNIb3RSZWxvYWRpbmdTdGF0ZS5nZXQoKS52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGUubG9hZChtb2R1bGUuaWQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZWQoYEVycm9yIGhvdCByZWxvYWRpbmcgJHttb2R1bGUuaWR9YCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3RSZWxvYWRpbmdTdGF0ZS5nZXQoKS52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBjYWxsYmFjayBvZiBob3RSZWxvYWRDYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhbbW9kdWxlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9tb2R1bGUuc291cmNlU0hBMjU2O1xuICAgICAgICAvLyBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoY29udGVudHMpLmRpZ2VzdChcImhleFwiKVxuICAgICAgICBpZiAoZ2V0SXNBbGxvd0NsaWVudChtb2R1bGUpKSB7XG4gICAgICAgICAgICB0cmlnZ2VyQ2xpZW50U2lkZVJlbG9hZCh7XG4gICAgICAgICAgICAgICAgZmlsZXM6IFttb2R1bGUuZmlsZW5hbWVdLFxuICAgICAgICAgICAgICAgIGNoYW5nZVRpbWUsXG4gICAgICAgICAgICAgICAgZmFzdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5sZXQgcmVsb2FkVHJpZ2dlcmluZyA9IGZhbHNlO1xubGV0IGNsaWVudFdhdGNoZXJOb2RlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xubGV0IHBlbmRpbmdUcmlnZ2VyRmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmZ1bmN0aW9uIHRyaWdnZXJDbGllbnRTaWRlUmVsb2FkKGNvbmZpZzoge1xuICAgIGZpbGVzOiBzdHJpbmdbXTtcbiAgICBjaGFuZ2VUaW1lOiBudW1iZXI7XG4gICAgZmFzdD86IGJvb2xlYW47XG59KSB7XG4gICAgZm9yIChsZXQgZmlsZSBvZiBjb25maWcuZmlsZXMpIHtcbiAgICAgICAgcGVuZGluZ1RyaWdnZXJGaWxlcy5hZGQoZmlsZSk7XG4gICAgfVxuICAgIGlmIChyZWxvYWRUcmlnZ2VyaW5nKSByZXR1cm47XG4gICAgcmVsb2FkVHJpZ2dlcmluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbG9hZFRyaWdnZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IGZpbGVzID0gQXJyYXkuZnJvbShwZW5kaW5nVHJpZ2dlckZpbGVzKTtcbiAgICAgICAgcGVuZGluZ1RyaWdnZXJGaWxlcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGxldCBjbGllbnROb2RlSWQgb2YgY2xpZW50V2F0Y2hlck5vZGVzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTm90aWZ5aW5nIGNsaWVudCBvZiBob3QgcmVsb2FkOiAke2NsaWVudE5vZGVJZH1gLCBmaWxlcyk7XG4gICAgICAgICAgICBIb3RSZWxvYWRDb250cm9sbGVyLm5vZGVzW2NsaWVudE5vZGVJZF0uZmlsZVVwZGF0ZWQoZmlsZXMsIGNvbmZpZy5jaGFuZ2VUaW1lKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlbW92aW5nIGVycm9yaW5nIGNsaWVudDogJHtjbGllbnROb2RlSWR9YCk7XG4gICAgICAgICAgICAgICAgY2xpZW50V2F0Y2hlck5vZGVzLmRlbGV0ZShjbGllbnROb2RlSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0LCBvdGhlcndpc2UgYmF0Y2hlZCB1cGRhdGVzIGZhaWwsIFdISUNILCBjYW4gcmVzdWx0IGluIHVwZGF0ZXMgd2hpbGUgcmVsb2FkaW5nLFxuICAgICAgICAvLyAgd2hpY2ggY2F1c2VzIG1pc3NlZCB1cGRhdGVzLlxuICAgIH0sIGNvbmZpZy5mYXN0ID8gNTAgOiAzMDApO1xufVxuXG5jbGFzcyBIb3RSZWxvYWRDb250cm9sbGVyQmFzZSB7XG4gICAgLy8gVE9ETzogQWxzbyBob3QgcmVsb2FkIHdoZW4gd2UgcmVjb25uZWN0IHRvIHRoZSBzZXJ2ZXIsIGFzIGl0IGlzIGxpa2VseSBzZXR1cCB3aWxsIG5lZWQgdG9cbiAgICAvLyAgYmUgcmVydW4gaW4gdGhhdCBjYXNlIGFzIHdlbGwgKGZvciBleGFtcGxlLCB3ZSBuZWVkIHRvIGNhbGwgd2F0Y2hGaWxlcyBhZ2FpbiEpXG4gICAgYXN5bmMgd2F0Y2hGaWxlcygpIHtcbiAgICAgICAgbGV0IGNhbGxlcklkID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCkubm9kZUlkO1xuICAgICAgICBjbGllbnRXYXRjaGVyTm9kZXMuYWRkKGNhbGxlcklkKTtcbiAgICB9XG4gICAgLy8gVE9ETzogVGhpcyBpcyBhY3R1YWxseSBicm9rZW4gcmVsYXRlZCB0byBsYXp5IGxvYWRlZCBhbmQgc2VydmVyLW9ubHkgY29kZSwgYXMgdGhlIHNlcnZlciB3aWxsIHRlbGwgdXMgYSBmaWxlIGNoYW5nZWQsIGFuZCB0aGVuIHdlJ2xsIHNlZSB0aGF0IHdlIGRvbid0IGhhdmUgaXQgbG9hZGVkLCBhbmQgc28gd2Ugd2lsbCB0cnkgdG8gcmVmcmVzaC5cbiAgICAvLyAgICAgIC0gVGhlIHJlYXNvbiB3ZSByZWZyZXNoIGlzIGJlY2F1c2UgaXQgbWlnaHQgYmUgYSBuZXcgZmlsZS4gSSBkb24ndCBrbm93IGhvdyB3ZSBjb3VsZCBjaGVjayB0byBzZWUgaWYgaXQgd2FzIGxhenkgbG9hZGVkLiBNYXliZSB3ZSBqdXN0IHNob3VsZG4ndCByZWZyZXNoIGV2ZXIgaWYgd2UgY2FuJ3QgZmluZCB0aGUgbW9kdWxlPyBXZSdsbCBzZWUgaG93IG11Y2ggd2UgcnVuIGludG8gdGhlIGV4dHJhIHJlZnJlc2ggZHVlIHRvIGxhenkgbG9hZGluZy4uLlxuICAgIGFzeW5jIGZpbGVVcGRhdGVkKGZpbGVzOiBzdHJpbmdbXSwgY2hhbmdlVGltZTogbnVtYmVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKG1hZ2VudGEoYFRyaWdnZXIgaG90cmVsb2FkIGZvciBmaWxlcyAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIGNoYW5nZVRpbWUpfSBhZnRlciBmaWxlIGNoYW5nZWApKTtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgIGxldCBtb2R1bGVzOiBOb2RlSlMuTW9kdWxlW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBmaWxlID0gXCJodHRwczovL1wiICsgKEJPT1RFRF9FREdFX05PREU/Lmhvc3QgfHwgbG9jYXRpb24uaG9zdCkgKyBcIi9cIiArIGZpbGU7XG4gICAgICAgICAgICAgICAgbGV0IG1vZHVsZSA9IHJlcXVpcmUuY2FjaGVbZmlsZV07XG4gICAgICAgICAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYE1vZHVsZSBub3QgZm91bmQ6ICR7ZmlsZX0sIG5vdCByZWxvYWRpbmcgcGFnZWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbW9kdWxlLmhvdHJlbG9hZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgTW9kdWxlIG5vdCBob3RyZWxvYWRhYmxlOiAke2ZpbGV9LCByZWxvYWRpbmcgcGFnZSB0byBlbnN1cmUgbmV3IHZlcnNpb24gaXMgbG9hZGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1vZHVsZXMucHVzaChtb2R1bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgICAgICAgICAgICBtb2R1bGUubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc0hvdFJlbG9hZGluZ1N0YXRlLmdldCgpLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwobW9kdWxlcy5tYXAobW9kdWxlID0+IG1vZHVsZS5sb2FkKG1vZHVsZS5maWxlbmFtZSkpKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlzSG90UmVsb2FkaW5nU3RhdGUuZ2V0KCkudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgY2FsbGJhY2sgb2YgaG90UmVsb2FkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kdWxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBIb3QgcmVsb2FkIGNvbXBsZXRlICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gY2hhbmdlVGltZSl9IGFmdGVyIGZpbGUgY2hhbmdlYCkpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEhvdCByZWxvYWQgZmFpbGVkICR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IEhvdFJlbG9hZENvbnRyb2xsZXIgPSBTb2NrZXRGdW5jdGlvbi5yZWdpc3RlcihcbiAgICBcIkhvdFJlbG9hZENvbnRyb2xsZXItMDMyYjIyNTAtM2FhYy00MTg3LThjOTUtNzU0MTI3NDJiOGY1XCIsXG4gICAgbmV3IEhvdFJlbG9hZENvbnRyb2xsZXJCYXNlKCksXG4gICAgKCkgPT4gKHtcbiAgICAgICAgd2F0Y2hGaWxlczoge30sXG4gICAgICAgIGZpbGVVcGRhdGVkOiB7fVxuICAgIH0pLFxuICAgICgpID0+ICh7XG5cbiAgICB9KSxcbiAgICB7XG4gICAgICAgIG5vQXV0b0V4cG9zZTogdHJ1ZSxcbiAgICB9XG4pOyJdfQ==
|
|
252
|
-
/* _JS_SOURCE_HASH = "fad5234ef4614a67e7686e156e1de47b8cb72f9f93a3c3e4945c518e41eff353"; */
|