sliftutils 1.7.66 → 1.7.68
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/CLAUDE.md +1 -0
- package/dist/test.ts.cache +187 -36
- package/dist/treeSummary.ts.cache +359 -0
- package/index.d.ts +67 -18
- package/misc/dist/environment.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/zip.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/package.json +1 -1
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/storage/ArchivesDisk.d.ts +2 -2
- package/storage/ArchivesDisk.ts +3 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
- package/storage/IArchives.d.ts +14 -2
- package/storage/IArchives.ts +15 -2
- package/storage/backblaze.d.ts +2 -2
- package/storage/backblaze.ts +5 -4
- package/storage/dist/ArchivesDisk.ts.cache +5 -3
- package/storage/dist/FileFolderAPI.tsx.cache +2 -2
- package/storage/dist/IArchives.ts.cache +2 -2
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/PendingManager.tsx.cache +2 -2
- package/storage/dist/TransactionStorage.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +6 -5
- package/storage/dist/fileSystemPointer.ts.cache +2 -2
- package/storage/dist/remoteFileStorage.ts.cache +2 -2
- package/storage/remoteStorage/ArchivesRemote.d.ts +2 -2
- package/storage/remoteStorage/ArchivesRemote.ts +3 -3
- package/storage/remoteStorage/ArchivesUrl.d.ts +2 -2
- package/storage/remoteStorage/ArchivesUrl.ts +8 -6
- package/storage/remoteStorage/accessStats.d.ts +25 -0
- package/storage/remoteStorage/accessStats.ts +86 -0
- package/storage/remoteStorage/blobStore.d.ts +3 -3
- package/storage/remoteStorage/blobStore.ts +9 -5
- package/storage/remoteStorage/createArchives.d.ts +2 -2
- package/storage/remoteStorage/createArchives.ts +3 -3
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +4 -4
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +11 -7
- package/storage/remoteStorage/dist/blobStore.ts.cache +11 -5
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +4 -4
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +52 -15
- package/storage/remoteStorage/dist/storageServerState.ts.cache +26 -75
- package/storage/remoteStorage/storageController.d.ts +9 -1
- package/storage/remoteStorage/storageController.ts +49 -11
- package/storage/remoteStorage/storageServerState.d.ts +2 -2
- package/storage/remoteStorage/storageServerState.ts +24 -71
- package/test-files-cache.json +1 -0
- package/test.ts +127 -10
- package/treeSummary.d.ts +31 -0
- package/treeSummary.ts +331 -54
package/CLAUDE.md
CHANGED
|
@@ -45,6 +45,7 @@ from `.cursor/rules/*.mdc` so Claude reads them automatically.
|
|
|
45
45
|
- Avoid callback hell with `import { PromiseObj } from "socket-function/src/misc";` — wrap event callbacks in a `PromiseObj` and await it.
|
|
46
46
|
- `import { keyBy, keyByArray } from "socket-function/src/misc";` for building lookups.
|
|
47
47
|
- Never use `alert`. Throw instead.
|
|
48
|
+
- Always use the helper functions for potentially large numbers (> 1000), and time spans. For time spans, it takes the time in terms of milliseconds. For example, 5,000 would be formatted as 5 seconds. `import { formatNumber, formatTime } from "socket-function/src/formatting/format";`
|
|
48
49
|
|
|
49
50
|
## MobX state
|
|
50
51
|
|
package/dist/test.ts.cache
CHANGED
|
@@ -1,48 +1,199 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
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;
|
|
4
24
|
};
|
|
5
25
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
26
|
+
const fs = __importStar(require("fs"));
|
|
27
|
+
const path = __importStar(require("path"));
|
|
28
|
+
const format_1 = require("socket-function/src/formatting/format");
|
|
29
|
+
const misc_1 = require("socket-function/src/misc");
|
|
30
|
+
const treeSummary_1 = require("./treeSummary");
|
|
31
|
+
const SUMMARY_COUNT = 30;
|
|
32
|
+
const TIMING_RUNS = 20;
|
|
33
|
+
const SCAN_DIRS = [
|
|
34
|
+
"D:/repos/qs-cyoa",
|
|
35
|
+
"D:/repos/querysub",
|
|
36
|
+
"D:/repos/socket-function",
|
|
37
|
+
"D:/repos/sliftutils",
|
|
38
|
+
"D:/repos/inference-weights",
|
|
39
|
+
];
|
|
40
|
+
// Matches the gitignored "test*.json" pattern, so the cache never gets tracked.
|
|
41
|
+
const CACHE_FILE = "D:/repos/sliftutils/test-files-cache.json";
|
|
42
|
+
async function collectFiles(dirs, output) {
|
|
43
|
+
for (let dir of dirs) {
|
|
44
|
+
let basePath = dir.endsWith("/") && dir || dir + "/";
|
|
45
|
+
await collectDir(dir, basePath, output);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function collectDir(dir, basePath, output) {
|
|
49
|
+
let entries = await fs.promises.readdir(dir, { withFileTypes: true });
|
|
50
|
+
for (let entry of entries) {
|
|
51
|
+
let fullPath = path.join(dir, entry.name);
|
|
52
|
+
let entryPath = basePath + entry.name;
|
|
53
|
+
if (entry.isDirectory()) {
|
|
54
|
+
await collectDir(fullPath, entryPath + "/", output);
|
|
55
|
+
}
|
|
56
|
+
else if (entry.isFile()) {
|
|
57
|
+
let stats = await fs.promises.stat(fullPath);
|
|
58
|
+
output.push({ path: entryPath, size: stats.size });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function summarize(files, weightBySize) {
|
|
63
|
+
let tree = new treeSummary_1.TreeSummary({
|
|
64
|
+
getPath: file => file.path,
|
|
65
|
+
createSummary: () => ({ count: 0, totalSize: 0 }),
|
|
66
|
+
addToSummary: (file, summary) => {
|
|
67
|
+
summary.count++;
|
|
68
|
+
summary.totalSize += file.size;
|
|
69
|
+
},
|
|
70
|
+
mergeSummaries: (target, source) => {
|
|
71
|
+
target.count += source.count;
|
|
72
|
+
target.totalSize += source.totalSize;
|
|
73
|
+
},
|
|
74
|
+
getWeight: summary => {
|
|
75
|
+
if (weightBySize)
|
|
76
|
+
return summary.totalSize;
|
|
77
|
+
return summary.count;
|
|
78
|
+
},
|
|
79
|
+
expectedOutputCount: 100,
|
|
22
80
|
});
|
|
81
|
+
let addStart = performance.now();
|
|
82
|
+
for (let file of files) {
|
|
83
|
+
tree.add(file);
|
|
84
|
+
}
|
|
85
|
+
let addTime = performance.now() - addStart;
|
|
86
|
+
let queryStart = performance.now();
|
|
87
|
+
let summaries = tree.getSummaries(SUMMARY_COUNT);
|
|
88
|
+
for (let i = 1; i < TIMING_RUNS; i++) {
|
|
89
|
+
summaries = tree.getSummaries(SUMMARY_COUNT);
|
|
90
|
+
}
|
|
91
|
+
let queryTime = (performance.now() - queryStart) / TIMING_RUNS;
|
|
92
|
+
let label = weightBySize && "size" || "count";
|
|
93
|
+
console.log(`\n=== weighted by ${label}, ${SUMMARY_COUNT} entries ===`);
|
|
94
|
+
console.log(`add: ${(0, format_1.formatTime)(addTime)} total for ${(0, format_1.formatNumber)(files.length)} files, tracking ${(0, format_1.formatNumber)(tree.getTrackedNodeCount())} nodes, getSummaries: ${(0, format_1.formatTime)(queryTime)} avg over ${TIMING_RUNS} runs`);
|
|
95
|
+
let totalWeight = 0;
|
|
96
|
+
for (let entry of summaries) {
|
|
97
|
+
totalWeight += entry.weight;
|
|
98
|
+
}
|
|
99
|
+
(0, misc_1.sort)(summaries, entry => -entry.weight);
|
|
100
|
+
// Verify each entry against the raw file list: assign every file to its most specific displayed entry (exact paths beat prefixes, longer prefixes beat shorter), which is the partition the entries claim to represent.
|
|
101
|
+
let actuals = summaries.map(() => ({ count: 0, totalSize: 0 }));
|
|
102
|
+
let unmatchedCount = 0;
|
|
103
|
+
let unmatchedSize = 0;
|
|
104
|
+
for (let file of files) {
|
|
105
|
+
let bestIndex = -1;
|
|
106
|
+
let bestLen = -1;
|
|
107
|
+
for (let i = 0; i < summaries.length; i++) {
|
|
108
|
+
let entryPath = summaries[i].path;
|
|
109
|
+
if (entryPath.endsWith("*")) {
|
|
110
|
+
let prefix = entryPath.slice(0, -1);
|
|
111
|
+
if (prefix.length > bestLen && file.path.startsWith(prefix)) {
|
|
112
|
+
bestIndex = i;
|
|
113
|
+
bestLen = prefix.length;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else if (file.path === entryPath && entryPath.length + 1 > bestLen) {
|
|
117
|
+
bestIndex = i;
|
|
118
|
+
bestLen = entryPath.length + 1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (bestIndex === -1) {
|
|
122
|
+
unmatchedCount++;
|
|
123
|
+
unmatchedSize += file.size;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
actuals[bestIndex].count++;
|
|
127
|
+
actuals[bestIndex].totalSize += file.size;
|
|
128
|
+
}
|
|
129
|
+
let shownPercent = 0;
|
|
130
|
+
let specificPercent = 0;
|
|
131
|
+
for (let i = 0; i < summaries.length; i++) {
|
|
132
|
+
let entry = summaries[i];
|
|
133
|
+
let percent = entry.weight / totalWeight * 100;
|
|
134
|
+
shownPercent += percent;
|
|
135
|
+
if (entry.kind === "self" || entry.kind === "subtree") {
|
|
136
|
+
specificPercent += percent;
|
|
137
|
+
}
|
|
138
|
+
let actual = actuals[i];
|
|
139
|
+
let diff = "";
|
|
140
|
+
if (actual.count !== entry.summary.count || actual.totalSize !== entry.summary.totalSize) {
|
|
141
|
+
diff = ` DIFF actual files=${(0, format_1.formatNumber)(actual.count)} size=${(0, format_1.formatNumber)(actual.totalSize)}B`;
|
|
142
|
+
}
|
|
143
|
+
console.log(`${percent.toFixed(1).padStart(5)}% ${entry.path.padEnd(60)} files=${(0, format_1.formatNumber)(entry.summary.count).padStart(6)} size=${((0, format_1.formatNumber)(entry.summary.totalSize) + "B").padStart(8)}${diff}`);
|
|
144
|
+
}
|
|
145
|
+
if (unmatchedCount > 0) {
|
|
146
|
+
console.log(`UNMATCHED: ${(0, format_1.formatNumber)(unmatchedCount)} files (${(0, format_1.formatNumber)(unmatchedSize)}B) matched no displayed entry`);
|
|
147
|
+
}
|
|
148
|
+
console.log(`top ${summaries.length} entries cover ${shownPercent.toFixed(1)}% (specific paths ${specificPercent.toFixed(1)}%, combined leftovers ${(shownPercent - specificPercent).toFixed(1)}%)`);
|
|
149
|
+
// Entries are a strict partition (each file in exactly one entry), so these must match the real totals exactly.
|
|
150
|
+
let entryCount = 0;
|
|
151
|
+
let entrySize = 0;
|
|
152
|
+
for (let entry of summaries) {
|
|
153
|
+
entryCount += entry.summary.count;
|
|
154
|
+
entrySize += entry.summary.totalSize;
|
|
155
|
+
}
|
|
156
|
+
let actualSize = 0;
|
|
157
|
+
for (let file of files) {
|
|
158
|
+
actualSize += file.size;
|
|
159
|
+
}
|
|
160
|
+
console.log(`entry totals: files=${(0, format_1.formatNumber)(entryCount)} (actual ${(0, format_1.formatNumber)(files.length)}), size=${(0, format_1.formatNumber)(entrySize)}B (actual ${(0, format_1.formatNumber)(actualSize)}B)`);
|
|
161
|
+
}
|
|
162
|
+
async function getFiles() {
|
|
163
|
+
var _a;
|
|
164
|
+
try {
|
|
165
|
+
let cached = JSON.parse(await fs.promises.readFile(CACHE_FILE, "utf8"));
|
|
166
|
+
if (JSON.stringify(cached.dirs) === JSON.stringify(SCAN_DIRS)) {
|
|
167
|
+
console.log(`loaded ${(0, format_1.formatNumber)(cached.files.length)} files from cache ${CACHE_FILE}`);
|
|
168
|
+
return cached.files;
|
|
169
|
+
}
|
|
170
|
+
console.log(`cache dirs changed (cached ${JSON.stringify(cached.dirs)}, now ${JSON.stringify(SCAN_DIRS)}), rescanning`);
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
if (err.code === "ENOENT") {
|
|
174
|
+
console.log(`no cache file at ${CACHE_FILE}, scanning`);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
console.log(`cache read failed, rescanning:`, (_a = err.stack) !== null && _a !== void 0 ? _a : err);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
let files = [];
|
|
181
|
+
let scanStart = performance.now();
|
|
182
|
+
await collectFiles(SCAN_DIRS, files);
|
|
183
|
+
await fs.promises.writeFile(CACHE_FILE, JSON.stringify({ dirs: SCAN_DIRS, files }));
|
|
184
|
+
console.log(`scanned ${(0, format_1.formatNumber)(files.length)} files in ${(0, format_1.formatTime)(performance.now() - scanStart)}, cached to ${CACHE_FILE}`);
|
|
185
|
+
return files;
|
|
23
186
|
}
|
|
24
187
|
async function main() {
|
|
25
|
-
let
|
|
26
|
-
console.log(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
socket.end("hello");
|
|
30
|
-
});
|
|
31
|
-
await new Promise(resolve => listener.listen(TEST_PORT, "0.0.0.0", () => resolve()));
|
|
32
|
-
console.log(`listening on 0.0.0.0:${TEST_PORT}`);
|
|
33
|
-
await (0, forwardPort_1.forwardPort)({ externalPort: TEST_PORT, internalPort: TEST_PORT });
|
|
34
|
-
let mappings = await (0, forwardPort_1.listPortMappings)();
|
|
35
|
-
let ours = mappings.find(x => x.externalPort === TEST_PORT);
|
|
36
|
-
console.log(`mapping for ${TEST_PORT} after create:`, JSON.stringify(ours) || "MISSING");
|
|
37
|
-
console.log(`LAN direct (${lanIP}:${TEST_PORT}):`, await testConnect(lanIP || "127.0.0.1", TEST_PORT));
|
|
38
|
-
console.log(`hairpin (${EXTERNAL_IP}:${TEST_PORT}):`, await testConnect(EXTERNAL_IP, TEST_PORT));
|
|
39
|
-
listener.close();
|
|
40
|
-
process.exit(0);
|
|
188
|
+
let files = await getFiles();
|
|
189
|
+
console.log(`collected ${(0, format_1.formatNumber)(files.length)} files from ${SCAN_DIRS.join(", ")}`);
|
|
190
|
+
summarize(files, true);
|
|
191
|
+
summarize(files, false);
|
|
41
192
|
}
|
|
42
193
|
main().catch(e => {
|
|
43
194
|
var _a;
|
|
44
195
|
console.error((_a = e.stack) !== null && _a !== void 0 ? _a : e);
|
|
45
196
|
process.exit(1);
|
|
46
197
|
});
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4Q0FBc0I7QUFDdEIsaUVBQW9HO0FBRXBHLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQztBQUN2QixNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUM7QUFFcEMsU0FBUyxXQUFXLENBQUMsSUFBWSxFQUFFLElBQVk7SUFDM0MsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN6QixJQUFJLE1BQU0sR0FBRyxhQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RCxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7WUFDdEIsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUN0QixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUUsQ0FBdUIsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxLQUFLLFVBQVUsSUFBSTtJQUNmLElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSxnQ0FBa0IsR0FBRSxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRWxDLElBQUksUUFBUSxHQUFHLGFBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDckMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sSUFBSSxPQUFPLENBQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFFakQsTUFBTSxJQUFBLHlCQUFXLEVBQUMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBRXhFLElBQUksUUFBUSxHQUFHLE1BQU0sSUFBQSw4QkFBZ0IsR0FBRSxDQUFDO0lBQ3hDLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQzVELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxTQUFTLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUM7SUFFekYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEtBQUssSUFBSSxTQUFTLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQyxLQUFLLElBQUksV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDdkcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLFdBQVcsSUFBSSxTQUFTLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUVqRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFOztJQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBQyxDQUFXLENBQUMsS0FBSyxtQ0FBSSxDQUFDLENBQUMsQ0FBQztJQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5ldCBmcm9tIFwibmV0XCI7XG5pbXBvcnQgeyBsaXN0UG9ydE1hcHBpbmdzLCBmb3J3YXJkUG9ydCwgZ2V0TG9jYWxJbnRlcm5hbElQIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9yd2FyZFBvcnRcIjtcblxuY29uc3QgVEVTVF9QT1JUID0gNTI5OTtcbmNvbnN0IEVYVEVSTkFMX0lQID0gXCI5OS4yNTAuMTI0LjkxXCI7XG5cbmZ1bmN0aW9uIHRlc3RDb25uZWN0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGxldCBzb2NrZXQgPSBuZXQuY29ubmVjdCh7IGhvc3QsIHBvcnQsIHRpbWVvdXQ6IDgwMDAgfSk7XG4gICAgICAgIHNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHJlc29sdmUoXCJDT05ORUNURURcIik7XG4gICAgICAgIH0pO1xuICAgICAgICBzb2NrZXQub24oXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICByZXNvbHZlKFwiVElNRU9VVFwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvY2tldC5vbihcImVycm9yXCIsIGUgPT4gcmVzb2x2ZSgoZSBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSB8fCBTdHJpbmcoZSkpKTtcbiAgICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgICBsZXQgbGFuSVAgPSBhd2FpdCBnZXRMb2NhbEludGVybmFsSVAoKTtcbiAgICBjb25zb2xlLmxvZyhcIm91ciBMQU4gSVA6XCIsIGxhbklQKTtcblxuICAgIGxldCBsaXN0ZW5lciA9IG5ldC5jcmVhdGVTZXJ2ZXIoc29ja2V0ID0+IHtcbiAgICAgICAgc29ja2V0Lm9uKFwiZXJyb3JcIiwgKCkgPT4gc29ja2V0LmRlc3Ryb3koKSk7XG4gICAgICAgIHNvY2tldC5lbmQoXCJoZWxsb1wiKTtcbiAgICB9KTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IGxpc3RlbmVyLmxpc3RlbihURVNUX1BPUlQsIFwiMC4wLjAuMFwiLCAoKSA9PiByZXNvbHZlKCkpKTtcbiAgICBjb25zb2xlLmxvZyhgbGlzdGVuaW5nIG9uIDAuMC4wLjA6JHtURVNUX1BPUlR9YCk7XG5cbiAgICBhd2FpdCBmb3J3YXJkUG9ydCh7IGV4dGVybmFsUG9ydDogVEVTVF9QT1JULCBpbnRlcm5hbFBvcnQ6IFRFU1RfUE9SVCB9KTtcblxuICAgIGxldCBtYXBwaW5ncyA9IGF3YWl0IGxpc3RQb3J0TWFwcGluZ3MoKTtcbiAgICBsZXQgb3VycyA9IG1hcHBpbmdzLmZpbmQoeCA9PiB4LmV4dGVybmFsUG9ydCA9PT0gVEVTVF9QT1JUKTtcbiAgICBjb25zb2xlLmxvZyhgbWFwcGluZyBmb3IgJHtURVNUX1BPUlR9IGFmdGVyIGNyZWF0ZTpgLCBKU09OLnN0cmluZ2lmeShvdXJzKSB8fCBcIk1JU1NJTkdcIik7XG5cbiAgICBjb25zb2xlLmxvZyhgTEFOIGRpcmVjdCAoJHtsYW5JUH06JHtURVNUX1BPUlR9KTpgLCBhd2FpdCB0ZXN0Q29ubmVjdChsYW5JUCB8fCBcIjEyNy4wLjAuMVwiLCBURVNUX1BPUlQpKTtcbiAgICBjb25zb2xlLmxvZyhgaGFpcnBpbiAoJHtFWFRFUk5BTF9JUH06JHtURVNUX1BPUlR9KTpgLCBhd2FpdCB0ZXN0Q29ubmVjdChFWFRFUk5BTF9JUCwgVEVTVF9QT1JUKSk7XG5cbiAgICBsaXN0ZW5lci5jbG9zZSgpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxubWFpbigpLmNhdGNoKGUgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuIl1//9
|
|
48
|
-
/* _JS_SOURCE_HASH = "
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0Isa0VBQWlGO0FBQ2pGLG1EQUFnRDtBQUNoRCwrQ0FBNEM7QUFFNUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUN2QixNQUFNLFNBQVMsR0FBRztJQUNkLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsMEJBQTBCO0lBQzFCLHFCQUFxQjtJQUNyQiw0QkFBNEI7Q0FDL0IsQ0FBQztBQUVGLGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsR0FBRywyQ0FBMkMsQ0FBQztBQUsvRCxLQUFLLFVBQVUsWUFBWSxDQUFDLElBQWMsRUFBRSxNQUFrQjtJQUMxRCxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDckQsTUFBTSxVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxVQUFVLENBQUMsR0FBVyxFQUFFLFFBQWdCLEVBQUUsTUFBa0I7SUFDdkUsSUFBSSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RSxLQUFLLElBQUksS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztR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QyxDQUFDO0lBQ3BJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxLQUFLLFVBQVUsSUFBSTtJQUNmLElBQUksS0FBSyxHQUFHLE1BQU0sUUFBUSxFQUFFLENBQUM7SUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUEscUJBQVksRUFBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUYsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2QixTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7O0lBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFDLENBQVcsQ0FBQyxLQUFLLG1DQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgVHJlZVN1bW1hcnkgfSBmcm9tIFwiLi90cmVlU3VtbWFyeVwiO1xuXG5jb25zdCBTVU1NQVJZX0NPVU5UID0gMzA7XG5jb25zdCBUSU1JTkdfUlVOUyA9IDIwO1xuY29uc3QgU0NBTl9ESVJTID0gW1xuICAgIFwiRDovcmVwb3MvcXMtY3lvYVwiLFxuICAgIFwiRDovcmVwb3MvcXVlcnlzdWJcIixcbiAgICBcIkQ6L3JlcG9zL3NvY2tldC1mdW5jdGlvblwiLFxuICAgIFwiRDovcmVwb3Mvc2xpZnR1dGlsc1wiLFxuICAgIFwiRDovcmVwb3MvaW5mZXJlbmNlLXdlaWdodHNcIixcbl07XG5cbi8vIE1hdGNoZXMgdGhlIGdpdGlnbm9yZWQgXCJ0ZXN0Ki5qc29uXCIgcGF0dGVybiwgc28gdGhlIGNhY2hlIG5ldmVyIGdldHMgdHJhY2tlZC5cbmNvbnN0IENBQ0hFX0ZJTEUgPSBcIkQ6L3JlcG9zL3NsaWZ0dXRpbHMvdGVzdC1maWxlcy1jYWNoZS5qc29uXCI7XG5cbnR5cGUgRmlsZUluZm8gPSB7IHBhdGg6IHN0cmluZzsgc2l6ZTogbnVtYmVyIH07XG50eXBlIEZpbGVTdW1tYXJ5ID0geyBjb3VudDogbnVtYmVyOyB0b3RhbFNpemU6IG51bWJlciB9O1xuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0RmlsZXMoZGlyczogc3RyaW5nW10sIG91dHB1dDogRmlsZUluZm9bXSkge1xuICAgIGZvciAobGV0IGRpciBvZiBkaXJzKSB7XG4gICAgICAgIGxldCBiYXNlUGF0aCA9IGRpci5lbmRzV2l0aChcIi9cIikgJiYgZGlyIHx8IGRpciArIFwiL1wiO1xuICAgICAgICBhd2FpdCBjb2xsZWN0RGlyKGRpciwgYmFzZVBhdGgsIG91dHB1dCk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0RGlyKGRpcjogc3RyaW5nLCBiYXNlUGF0aDogc3RyaW5nLCBvdXRwdXQ6IEZpbGVJbmZvW10pIHtcbiAgICBsZXQgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBsZXQgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgbGV0IGVudHJ5UGF0aCA9IGJhc2VQYXRoICsgZW50cnkubmFtZTtcbiAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIGF3YWl0IGNvbGxlY3REaXIoZnVsbFBhdGgsIGVudHJ5UGF0aCArIFwiL1wiLCBvdXRwdXQpO1xuICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZ1bGxQYXRoKTtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKHsgcGF0aDogZW50cnlQYXRoLCBzaXplOiBzdGF0cy5zaXplIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzdW1tYXJpemUoZmlsZXM6IEZpbGVJbmZvW10sIHdlaWdodEJ5U2l6ZTogYm9vbGVhbikge1xuICAgIGxldCB0cmVlID0gbmV3IFRyZWVTdW1tYXJ5PEZpbGVJbmZvLCBGaWxlU3VtbWFyeT4oe1xuICAgICAgICBnZXRQYXRoOiBmaWxlID0+IGZpbGUucGF0aCxcbiAgICAgICAgY3JlYXRlU3VtbWFyeTogKCkgPT4gKHsgY291bnQ6IDAsIHRvdGFsU2l6ZTogMCB9KSxcbiAgICAgICAgYWRkVG9TdW1tYXJ5OiAoZmlsZSwgc3VtbWFyeSkgPT4ge1xuICAgICAgICAgICAgc3VtbWFyeS5jb3VudCsrO1xuICAgICAgICAgICAgc3VtbWFyeS50b3RhbFNpemUgKz0gZmlsZS5zaXplO1xuICAgICAgICB9LFxuICAgICAgICBtZXJnZVN1bW1hcmllczogKHRhcmdldCwgc291cmNlKSA9PiB7XG4gICAgICAgICAgICB0YXJnZXQuY291bnQgKz0gc291cmNlLmNvdW50O1xuICAgICAgICAgICAgdGFyZ2V0LnRvdGFsU2l6ZSArPSBzb3VyY2UudG90YWxTaXplO1xuICAgICAgICB9LFxuICAgICAgICBnZXRXZWlnaHQ6IHN1bW1hcnkgPT4ge1xuICAgICAgICAgICAgaWYgKHdlaWdodEJ5U2l6ZSkgcmV0dXJuIHN1bW1hcnkudG90YWxTaXplO1xuICAgICAgICAgICAgcmV0dXJuIHN1bW1hcnkuY291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkT3V0cHV0Q291bnQ6IDEwMCxcbiAgICB9KTtcbiAgICBsZXQgYWRkU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIHRyZWUuYWRkKGZpbGUpO1xuICAgIH1cbiAgICBsZXQgYWRkVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gYWRkU3RhcnQ7XG4gICAgbGV0IHF1ZXJ5U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBsZXQgc3VtbWFyaWVzID0gdHJlZS5nZXRTdW1tYXJpZXMoU1VNTUFSWV9DT1VOVCk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBUSU1JTkdfUlVOUzsgaSsrKSB7XG4gICAgICAgIHN1bW1hcmllcyA9IHRyZWUuZ2V0U3VtbWFyaWVzKFNVTU1BUllfQ09VTlQpO1xuICAgIH1cbiAgICBsZXQgcXVlcnlUaW1lID0gKHBlcmZvcm1hbmNlLm5vdygpIC0gcXVlcnlTdGFydCkgLyBUSU1JTkdfUlVOUztcbiAgICBsZXQgbGFiZWwgPSB3ZWlnaHRCeVNpemUgJiYgXCJzaXplXCIgfHwgXCJjb3VudFwiO1xuICAgIGNvbnNvbGUubG9nKGBcXG49PT0gd2VpZ2h0ZWQgYnkgJHtsYWJlbH0sICR7U1VNTUFSWV9DT1VOVH0gZW50cmllcyA9PT1gKTtcbiAgICBjb25zb2xlLmxvZyhgYWRkOiAke2Zvcm1hdFRpbWUoYWRkVGltZSl9IHRvdGFsIGZvciAke2Zvcm1hdE51bWJlcihmaWxlcy5sZW5ndGgpfSBmaWxlcywgdHJhY2tpbmcgJHtmb3JtYXROdW1iZXIodHJlZS5nZXRUcmFja2VkTm9kZUNvdW50KCkpfSBub2RlcywgZ2V0U3VtbWFyaWVzOiAke2Zvcm1hdFRpbWUocXVlcnlUaW1lKX0gYXZnIG92ZXIgJHtUSU1JTkdfUlVOU30gcnVuc2ApO1xuICAgIGxldCB0b3RhbFdlaWdodCA9IDA7XG4gICAgZm9yIChsZXQgZW50cnkgb2Ygc3VtbWFyaWVzKSB7XG4gICAgICAgIHRvdGFsV2VpZ2h0ICs9IGVudHJ5LndlaWdodDtcbiAgICB9XG4gICAgc29ydChzdW1tYXJpZXMsIGVudHJ5ID0+IC1lbnRyeS53ZWlnaHQpO1xuICAgIC8vIFZlcmlmeSBlYWNoIGVudHJ5IGFnYWluc3QgdGhlIHJhdyBmaWxlIGxpc3Q6IGFzc2lnbiBldmVyeSBmaWxlIHRvIGl0cyBtb3N0IHNwZWNpZmljIGRpc3BsYXllZCBlbnRyeSAoZXhhY3QgcGF0aHMgYmVhdCBwcmVmaXhlcywgbG9uZ2VyIHByZWZpeGVzIGJlYXQgc2hvcnRlciksIHdoaWNoIGlzIHRoZSBwYXJ0aXRpb24gdGhlIGVudHJpZXMgY2xhaW0gdG8gcmVwcmVzZW50LlxuICAgIGxldCBhY3R1YWxzID0gc3VtbWFyaWVzLm1hcCgoKSA9PiAoeyBjb3VudDogMCwgdG90YWxTaXplOiAwIH0pKTtcbiAgICBsZXQgdW5tYXRjaGVkQ291bnQgPSAwO1xuICAgIGxldCB1bm1hdGNoZWRTaXplID0gMDtcbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGxldCBiZXN0SW5kZXggPSAtMTtcbiAgICAgICAgbGV0IGJlc3RMZW4gPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdW1tYXJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBlbnRyeVBhdGggPSBzdW1tYXJpZXNbaV0ucGF0aDtcbiAgICAgICAgICAgIGlmIChlbnRyeVBhdGguZW5kc1dpdGgoXCIqXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByZWZpeCA9IGVudHJ5UGF0aC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGggPiBiZXN0TGVuICYmIGZpbGUucGF0aC5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYmVzdExlbiA9IHByZWZpeC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlLnBhdGggPT09IGVudHJ5UGF0aCAmJiBlbnRyeVBhdGgubGVuZ3RoICsgMSA+IGJlc3RMZW4pIHtcbiAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGJlc3RMZW4gPSBlbnRyeVBhdGgubGVuZ3RoICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVzdEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgdW5tYXRjaGVkQ291bnQrKztcbiAgICAgICAgICAgIHVubWF0Y2hlZFNpemUgKz0gZmlsZS5zaXplO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYWN0dWFsc1tiZXN0SW5kZXhdLmNvdW50Kys7XG4gICAgICAgIGFjdHVhbHNbYmVzdEluZGV4XS50b3RhbFNpemUgKz0gZmlsZS5zaXplO1xuICAgIH1cbiAgICBsZXQgc2hvd25QZXJjZW50ID0gMDtcbiAgICBsZXQgc3BlY2lmaWNQZXJjZW50ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1bW1hcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZW50cnkgPSBzdW1tYXJpZXNbaV07XG4gICAgICAgIGxldCBwZXJjZW50ID0gZW50cnkud2VpZ2h0IC8gdG90YWxXZWlnaHQgKiAxMDA7XG4gICAgICAgIHNob3duUGVyY2VudCArPSBwZXJjZW50O1xuICAgICAgICBpZiAoZW50cnkua2luZCA9PT0gXCJzZWxmXCIgfHwgZW50cnkua2luZCA9PT0gXCJzdWJ0cmVlXCIpIHtcbiAgICAgICAgICAgIHNwZWNpZmljUGVyY2VudCArPSBwZXJjZW50O1xuICAgICAgICB9XG4gICAgICAgIGxldCBhY3R1YWwgPSBhY3R1YWxzW2ldO1xuICAgICAgICBsZXQgZGlmZiA9IFwiXCI7XG4gICAgICAgIGlmIChhY3R1YWwuY291bnQgIT09IGVudHJ5LnN1bW1hcnkuY291bnQgfHwgYWN0dWFsLnRvdGFsU2l6ZSAhPT0gZW50cnkuc3VtbWFyeS50b3RhbFNpemUpIHtcbiAgICAgICAgICAgIGRpZmYgPSBgICBESUZGIGFjdHVhbCBmaWxlcz0ke2Zvcm1hdE51bWJlcihhY3R1YWwuY291bnQpfSBzaXplPSR7Zm9ybWF0TnVtYmVyKGFjdHVhbC50b3RhbFNpemUpfUJgO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGAke3BlcmNlbnQudG9GaXhlZCgxKS5wYWRTdGFydCg1KX0lICR7ZW50cnkucGF0aC5wYWRFbmQoNjApfSBmaWxlcz0ke2Zvcm1hdE51bWJlcihlbnRyeS5zdW1tYXJ5LmNvdW50KS5wYWRTdGFydCg2KX0gc2l6ZT0keyhmb3JtYXROdW1iZXIoZW50cnkuc3VtbWFyeS50b3RhbFNpemUpICsgXCJCXCIpLnBhZFN0YXJ0KDgpfSR7ZGlmZn1gKTtcbiAgICB9XG4gICAgaWYgKHVubWF0Y2hlZENvdW50ID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgVU5NQVRDSEVEOiAke2Zvcm1hdE51bWJlcih1bm1hdGNoZWRDb3VudCl9IGZpbGVzICgke2Zvcm1hdE51bWJlcih1bm1hdGNoZWRTaXplKX1CKSBtYXRjaGVkIG5vIGRpc3BsYXllZCBlbnRyeWApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgdG9wICR7c3VtbWFyaWVzLmxlbmd0aH0gZW50cmllcyBjb3ZlciAke3Nob3duUGVyY2VudC50b0ZpeGVkKDEpfSUgKHNwZWNpZmljIHBhdGhzICR7c3BlY2lmaWNQZXJjZW50LnRvRml4ZWQoMSl9JSwgY29tYmluZWQgbGVmdG92ZXJzICR7KHNob3duUGVyY2VudCAtIHNwZWNpZmljUGVyY2VudCkudG9GaXhlZCgxKX0lKWApO1xuICAgIC8vIEVudHJpZXMgYXJlIGEgc3RyaWN0IHBhcnRpdGlvbiAoZWFjaCBmaWxlIGluIGV4YWN0bHkgb25lIGVudHJ5KSwgc28gdGhlc2UgbXVzdCBtYXRjaCB0aGUgcmVhbCB0b3RhbHMgZXhhY3RseS5cbiAgICBsZXQgZW50cnlDb3VudCA9IDA7XG4gICAgbGV0IGVudHJ5U2l6ZSA9IDA7XG4gICAgZm9yIChsZXQgZW50cnkgb2Ygc3VtbWFyaWVzKSB7XG4gICAgICAgIGVudHJ5Q291bnQgKz0gZW50cnkuc3VtbWFyeS5jb3VudDtcbiAgICAgICAgZW50cnlTaXplICs9IGVudHJ5LnN1bW1hcnkudG90YWxTaXplO1xuICAgIH1cbiAgICBsZXQgYWN0dWFsU2l6ZSA9IDA7XG4gICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBhY3R1YWxTaXplICs9IGZpbGUuc2l6ZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYGVudHJ5IHRvdGFsczogZmlsZXM9JHtmb3JtYXROdW1iZXIoZW50cnlDb3VudCl9IChhY3R1YWwgJHtmb3JtYXROdW1iZXIoZmlsZXMubGVuZ3RoKX0pLCBzaXplPSR7Zm9ybWF0TnVtYmVyKGVudHJ5U2l6ZSl9QiAoYWN0dWFsICR7Zm9ybWF0TnVtYmVyKGFjdHVhbFNpemUpfUIpYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVzKCk6IFByb21pc2U8RmlsZUluZm9bXT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBjYWNoZWQgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKENBQ0hFX0ZJTEUsIFwidXRmOFwiKSkgYXMgeyBkaXJzOiBzdHJpbmdbXTsgZmlsZXM6IEZpbGVJbmZvW10gfTtcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGNhY2hlZC5kaXJzKSA9PT0gSlNPTi5zdHJpbmdpZnkoU0NBTl9ESVJTKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYGxvYWRlZCAke2Zvcm1hdE51bWJlcihjYWNoZWQuZmlsZXMubGVuZ3RoKX0gZmlsZXMgZnJvbSBjYWNoZSAke0NBQ0hFX0ZJTEV9YCk7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkLmZpbGVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBjYWNoZSBkaXJzIGNoYW5nZWQgKGNhY2hlZCAke0pTT04uc3RyaW5naWZ5KGNhY2hlZC5kaXJzKX0sIG5vdyAke0pTT04uc3RyaW5naWZ5KFNDQU5fRElSUyl9KSwgcmVzY2FubmluZ2ApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoKGVyciBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFTk9FTlRcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYG5vIGNhY2hlIGZpbGUgYXQgJHtDQUNIRV9GSUxFfSwgc2Nhbm5pbmdgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBjYWNoZSByZWFkIGZhaWxlZCwgcmVzY2FubmluZzpgLCAoZXJyIGFzIEVycm9yKS5zdGFjayA/PyBlcnIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBmaWxlczogRmlsZUluZm9bXSA9IFtdO1xuICAgIGxldCBzY2FuU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBhd2FpdCBjb2xsZWN0RmlsZXMoU0NBTl9ESVJTLCBmaWxlcyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKENBQ0hFX0ZJTEUsIEpTT04uc3RyaW5naWZ5KHsgZGlyczogU0NBTl9ESVJTLCBmaWxlcyB9KSk7XG4gICAgY29uc29sZS5sb2coYHNjYW5uZWQgJHtmb3JtYXROdW1iZXIoZmlsZXMubGVuZ3RoKX0gZmlsZXMgaW4gJHtmb3JtYXRUaW1lKHBlcmZvcm1hbmNlLm5vdygpIC0gc2NhblN0YXJ0KX0sIGNhY2hlZCB0byAke0NBQ0hFX0ZJTEV9YCk7XG4gICAgcmV0dXJuIGZpbGVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICAgIGxldCBmaWxlcyA9IGF3YWl0IGdldEZpbGVzKCk7XG4gICAgY29uc29sZS5sb2coYGNvbGxlY3RlZCAke2Zvcm1hdE51bWJlcihmaWxlcy5sZW5ndGgpfSBmaWxlcyBmcm9tICR7U0NBTl9ESVJTLmpvaW4oXCIsIFwiKX1gKTtcbiAgICBzdW1tYXJpemUoZmlsZXMsIHRydWUpO1xuICAgIHN1bW1hcml6ZShmaWxlcywgZmFsc2UpO1xufVxuXG5tYWluKCkuY2F0Y2goZSA9PiB7XG4gICAgY29uc29sZS5lcnJvcigoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG4iXX0=
|
|
199
|
+
/* _JS_SOURCE_HASH = "90802e23dfaf68469b5c319fa6270629c6b9178410c4c003fd4293ec3f46f4f9"; */
|