sliftutils 1.7.13 → 1.7.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/index.d.ts +64 -38
  3. package/misc/dist/getSecret.ts.cache +2 -2
  4. package/misc/dist/strings.ts.cache +2 -2
  5. package/misc/https/dist/certs.ts.cache +2 -2
  6. package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
  7. package/misc/https/hostServer.d.ts +7 -0
  8. package/misc/https/hostServer.ts +89 -20
  9. package/misc/openrouter.ts +17 -14
  10. package/package.json +2 -2
  11. package/storage/ArchivesDisk.d.ts +1 -1
  12. package/storage/ArchivesDisk.ts +2 -1
  13. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
  14. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
  15. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
  16. package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +2 -2
  17. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
  18. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
  19. package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
  20. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
  21. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
  22. package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
  23. package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
  24. package/storage/IArchives.d.ts +5 -1
  25. package/storage/IArchives.ts +5 -1
  26. package/storage/backblaze.d.ts +1 -1
  27. package/storage/backblaze.ts +9 -6
  28. package/storage/remoteStorage/ArchivesRemote.d.ts +1 -1
  29. package/storage/remoteStorage/ArchivesRemote.ts +2 -1
  30. package/storage/remoteStorage/ArchivesUrl.d.ts +1 -1
  31. package/storage/remoteStorage/ArchivesUrl.ts +13 -9
  32. package/storage/remoteStorage/blobStore.d.ts +6 -2
  33. package/storage/remoteStorage/blobStore.ts +46 -6
  34. package/storage/remoteStorage/createArchives.d.ts +10 -11
  35. package/storage/remoteStorage/createArchives.ts +74 -26
  36. package/storage/remoteStorage/deployTakeover.d.ts +24 -0
  37. package/storage/remoteStorage/deployTakeover.ts +373 -0
  38. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +16 -11
  39. package/storage/remoteStorage/dist/blobStore.ts.cache +39 -4
  40. package/storage/remoteStorage/dist/createArchives.ts.cache +91 -9
  41. package/storage/remoteStorage/dist/deployTakeover.ts.cache +371 -0
  42. package/storage/remoteStorage/dist/remoteConfig.ts.cache +9 -3
  43. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +3 -3
  44. package/storage/remoteStorage/dist/storageController.ts.cache +11 -12
  45. package/storage/remoteStorage/dist/storageServerState.ts.cache +120 -19
  46. package/storage/remoteStorage/remoteConfig.d.ts +1 -0
  47. package/storage/remoteStorage/remoteConfig.ts +6 -0
  48. package/storage/remoteStorage/storageServer.ts +14 -1
  49. package/storage/remoteStorage/storageServerState.d.ts +3 -0
  50. package/storage/remoteStorage/storageServerState.ts +55 -8
  51. package/yarn.lock +4 -4
  52. package/storage/dist/faceFramesData.ts.cache +0 -55
  53. package/storage/embeddingBench.d.ts +0 -1
  54. package/storage/embeddingBench.ts +0 -152
  55. package/storage/faceFramesData.d.ts +0 -1
  56. package/storage/faceFramesData.ts +0 -49
  57. package/storage/faceFramesServer.d.ts +0 -1
  58. package/storage/faceFramesServer.ts +0 -56
  59. package/storage/proxydatabase/ivfDbCheck.d.ts +0 -1
  60. package/storage/proxydatabase/ivfDbCheck.ts +0 -85
@@ -0,0 +1,371 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
+ //exports.getMainPortAcquireDelay = exports.getFlushDeadline = exports.applyDeployRemap = exports.onTakeoverEvent = exports.registerAltPort = exports.initDeployTakeover = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const child_process_1 = require("child_process");
10
+ const remoteConfig_1 = require("./remoteConfig");
11
+ // Deploy takeover: the deploy manager (querysub's parametersTimeline) writes <n>-parameters.json
12
+ // files into our instance folder describing when each version runs and when it is shut down. Old
13
+ // and new version overlap for the overlap time (O = oldEnd - newStart). We turn that overlap into
14
+ // an atomic write handoff by REINTERPRETING every routing source that points at us: its valid
15
+ // window is split so that the middle of the overlap ([S + 0.5*O, S + 1.5*O]) points at the new
16
+ // process's temporary alternate port. The existing valid-window machinery then does everything -
17
+ // the old process starts rejecting fresh writes at the first boundary, clients re-resolve, and the
18
+ // new process (which recognizes the alternate port as itself) takes over. The remap is an
19
+ // INTERPRETATION OVERLAY, applied where routing configs are used (see applyDeployRemap callers) -
20
+ // it is never written to disk, never synchronized, and never part of any stored configuration.
21
+ //
22
+ // Everything here is recomputed idempotently from its inputs (timeline files, the port registry,
23
+ // our ancestor pids, the clock) - files can appear or change at any moment, and we can start at
24
+ // any point during a switchover.
25
+ const PARAMETERS_TIMELINE_FILE_REGEX = /^(\d+)-parameters\.json$/;
26
+ const ALIVE_WINDOW_FOREVER = Number.MAX_SAFE_INTEGER;
27
+ const TIMELINE_POLL_INTERVAL = 60 * 1000;
28
+ // Processes listening on an alternate port register it here (sibling of the storage folder), keyed
29
+ // by their actual pid; content includes their ancestor pids so the timeline entry pid (a shell
30
+ // ancestor of the process) can be matched to a registry entry
31
+ const PORT_REGISTRY_FOLDER_NAME = "storagePortRegistry";
32
+ // Main-port acquisition attempts run this often, tightening near the predecessor's scheduled death
33
+ const ACQUIRE_SLOW_DELAY = 30 * 1000;
34
+ const ACQUIRE_FAST_DELAY = 5 * 1000;
35
+ const ACQUIRE_FAST_WINDOW = 60 * 1000;
36
+ // Disk rescans fire this far before and after the write handoff, catching files the other process
37
+ // wrote (the BulkDatabase2 index is atomic but its entries land at write time, not file time)
38
+ const SWITCH_SCAN_LEAD = 10 * 1000;
39
+ // The dying process must have flushed everything before the handoff: fast-write delays never
40
+ // extend past S + overlap * this fraction, and after that point fast writes flush immediately
41
+ const FLUSH_DEADLINE_FRACTION = 0.25;
42
+ const BOUNDARY_A_FRACTION = 0.5;
43
+ const BOUNDARY_B_FRACTION = 1.5;
44
+ const REMAP_EXPIRE_FRACTION = 2;
45
+ let initialized;
46
+ let ancestorPids = new Set();
47
+ let timelineFolder;
48
+ let ourAltPort;
49
+ let current = {};
50
+ let currentKey = JSON.stringify(current);
51
+ let eventListeners = [];
52
+ let eventTimers = [];
53
+ function execText(command) {
54
+ return new Promise((resolve, reject) => {
55
+ (0, child_process_1.exec)(command, (error, stdout) => {
56
+ if (error) {
57
+ reject(error);
58
+ return;
59
+ }
60
+ resolve(stdout);
61
+ });
62
+ });
63
+ }
64
+ // The timeline entry pid is the screen shell that spawned us - an ancestor - so we walk our whole
65
+ // ancestor chain to find which entry is us
66
+ async function getAncestorPids() {
67
+ let pids = new Set([process.pid]);
68
+ let currentPid = process.pid;
69
+ while (true) {
70
+ let ppid;
71
+ if (currentPid === process.pid && process.ppid) {
72
+ ppid = process.ppid;
73
+ }
74
+ else {
75
+ try {
76
+ ppid = parseInt((await execText(`ps -o ppid= -p ${currentPid}`)).trim());
77
+ }
78
+ catch (_a) {
79
+ break;
80
+ }
81
+ }
82
+ if (!ppid || Number.isNaN(ppid) || ppid <= 1 || pids.has(ppid))
83
+ break;
84
+ pids.add(ppid);
85
+ currentPid = ppid;
86
+ }
87
+ return pids;
88
+ }
89
+ async function findTimelineFolder() {
90
+ let dir = process.cwd();
91
+ while (true) {
92
+ let files = [];
93
+ try {
94
+ files = await fs_1.default.promises.readdir(dir);
95
+ }
96
+ catch (_a) { }
97
+ if (files.some(file => PARAMETERS_TIMELINE_FILE_REGEX.test(file))) {
98
+ return dir.replaceAll("\\", "/") + "/";
99
+ }
100
+ let parent = path_1.default.dirname(dir);
101
+ if (parent === dir)
102
+ return undefined;
103
+ dir = parent;
104
+ }
105
+ }
106
+ function pidAlive(pid) {
107
+ try {
108
+ process.kill(pid, 0);
109
+ return true;
110
+ }
111
+ catch (e) {
112
+ return e.code === "EPERM";
113
+ }
114
+ }
115
+ function getRegistryFolder() {
116
+ if (!initialized) {
117
+ throw new Error(`Deploy takeover is not initialized`);
118
+ }
119
+ return path_1.default.join(path_1.default.dirname(path_1.default.resolve(initialized.storageFolder)), PORT_REGISTRY_FOLDER_NAME);
120
+ }
121
+ async function readPortRegistry() {
122
+ let folder = getRegistryFolder();
123
+ let files = [];
124
+ try {
125
+ files = await fs_1.default.promises.readdir(folder);
126
+ }
127
+ catch (_a) {
128
+ return [];
129
+ }
130
+ let entries = [];
131
+ for (let file of files) {
132
+ let match = /^(\d+)\.json$/.exec(file);
133
+ if (!match)
134
+ continue;
135
+ let pid = parseInt(match[1]);
136
+ if (!pidAlive(pid)) {
137
+ try {
138
+ await fs_1.default.promises.unlink(path_1.default.join(folder, file));
139
+ }
140
+ catch (_b) { }
141
+ continue;
142
+ }
143
+ try {
144
+ let entry = JSON.parse(await fs_1.default.promises.readFile(path_1.default.join(folder, file), "utf8"));
145
+ entries.push({ ...entry, pid });
146
+ }
147
+ catch (_c) { }
148
+ }
149
+ return entries;
150
+ }
151
+ async function readTimelineEntries() {
152
+ var _a;
153
+ if (!timelineFolder)
154
+ return [];
155
+ let entries = [];
156
+ for (let file of await fs_1.default.promises.readdir(timelineFolder)) {
157
+ if (!PARAMETERS_TIMELINE_FILE_REGEX.test(file))
158
+ continue;
159
+ try {
160
+ entries.push(JSON.parse(await fs_1.default.promises.readFile(timelineFolder + file, "utf8")));
161
+ }
162
+ catch (e) {
163
+ console.warn(`Could not read deploy timeline file ${timelineFolder + file}: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
164
+ }
165
+ }
166
+ return entries;
167
+ }
168
+ function makeRemap(successorStart, overlap, altPort) {
169
+ return {
170
+ boundaryA: successorStart + overlap * BOUNDARY_A_FRACTION,
171
+ boundaryB: successorStart + overlap * BOUNDARY_B_FRACTION,
172
+ expire: successorStart + overlap * REMAP_EXPIRE_FRACTION,
173
+ altPort,
174
+ };
175
+ }
176
+ function emit(event) {
177
+ var _a;
178
+ for (let listener of eventListeners) {
179
+ try {
180
+ listener(event);
181
+ }
182
+ catch (e) {
183
+ console.error(`Deploy takeover listener failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
184
+ }
185
+ }
186
+ }
187
+ function scheduleEvents() {
188
+ for (let timer of eventTimers) {
189
+ clearTimeout(timer);
190
+ }
191
+ eventTimers = [];
192
+ let now = Date.now();
193
+ let schedule = (time, fnc) => {
194
+ var _a, _b;
195
+ if (time <= now)
196
+ return;
197
+ let timer = setTimeout(fnc, time - now);
198
+ (_b = (_a = timer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
199
+ eventTimers.push(timer);
200
+ };
201
+ let remap = current.remap;
202
+ if (remap) {
203
+ schedule(remap.boundaryA - SWITCH_SCAN_LEAD, () => emit("diskScan"));
204
+ schedule(remap.boundaryA + SWITCH_SCAN_LEAD, () => emit("diskScan"));
205
+ schedule(remap.expire, () => void recompute().catch((e) => { var _a; return console.error(`Deploy takeover recompute failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); }));
206
+ }
207
+ }
208
+ async function recompute() {
209
+ if (!initialized || !timelineFolder)
210
+ return;
211
+ let now = Date.now();
212
+ let entries = await readTimelineEntries();
213
+ let registry = await readPortRegistry();
214
+ let us;
215
+ for (let entry of entries) {
216
+ if (entry.pid && ancestorPids.has(entry.pid)) {
217
+ us = entry;
218
+ }
219
+ }
220
+ let computed = {};
221
+ if (us) {
222
+ let usStart = us.aliveWindow[0];
223
+ let next;
224
+ let prev;
225
+ for (let entry of entries) {
226
+ if (entry === us)
227
+ continue;
228
+ if (entry.aliveWindow[0] > usStart && (!next || entry.aliveWindow[0] < next.aliveWindow[0])) {
229
+ next = entry;
230
+ }
231
+ if (entry.aliveWindow[0] < usStart && (!prev || entry.aliveWindow[0] > prev.aliveWindow[0])) {
232
+ prev = entry;
233
+ }
234
+ }
235
+ if (next && us.aliveWindow[1] !== ALIVE_WINDOW_FOREVER && next.aliveWindow[0] <= us.aliveWindow[1]) {
236
+ let overlap = us.aliveWindow[1] - next.aliveWindow[0];
237
+ let successorStart = next.aliveWindow[0];
238
+ if (overlap > 0 && now < successorStart + overlap * REMAP_EXPIRE_FRACTION) {
239
+ computed.dying = { successorStart, overlap };
240
+ const successorPid = next.pid;
241
+ if (successorPid) {
242
+ let successorEntry = registry.find(x => x.ancestorPids.includes(successorPid));
243
+ if (successorEntry) {
244
+ computed.remap = makeRemap(successorStart, overlap, successorEntry.port);
245
+ }
246
+ }
247
+ }
248
+ }
249
+ if (prev && prev.aliveWindow[1] > usStart) {
250
+ let overlap = prev.aliveWindow[1] - usStart;
251
+ computed.predecessorEnd = prev.aliveWindow[1];
252
+ if (overlap > 0 && ourAltPort && now < usStart + overlap * REMAP_EXPIRE_FRACTION && !computed.remap) {
253
+ computed.remap = makeRemap(usStart, overlap, ourAltPort);
254
+ }
255
+ }
256
+ }
257
+ let key = JSON.stringify(computed);
258
+ if (key === currentKey)
259
+ return;
260
+ current = computed;
261
+ currentKey = key;
262
+ console.log(`Deploy takeover state changed: ${key}`);
263
+ scheduleEvents();
264
+ emit("remapChanged");
265
+ }
266
+ /** Starts the takeover machinery. Returns whether a deploy timeline exists - when it doesn't,
267
+ * everything here stays inert (and the caller must NOT fall back to alternate ports, since a busy
268
+ * port then means a real misconfiguration, not a deploy). */
269
+ async function initDeployTakeover(config) {
270
+ var _a, _b;
271
+ initialized = config;
272
+ ancestorPids = await getAncestorPids();
273
+ timelineFolder = await findTimelineFolder();
274
+ if (!timelineFolder)
275
+ return false;
276
+ await recompute();
277
+ let poll = setInterval(() => {
278
+ void recompute().catch((e) => { var _a; return console.error(`Deploy takeover recompute failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); });
279
+ }, TIMELINE_POLL_INTERVAL);
280
+ (_b = (_a = poll).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
281
+ return true;
282
+ }
283
+ exports.initDeployTakeover = initDeployTakeover;
284
+ /** Called when we had to listen on an alternate port (the main port was still held by our
285
+ * predecessor): registers it so the predecessor can route the middle overlap window to us. */
286
+ async function registerAltPort(port) {
287
+ ourAltPort = port;
288
+ let folder = getRegistryFolder();
289
+ await fs_1.default.promises.mkdir(folder, { recursive: true });
290
+ let entry = { pid: process.pid, port, ancestorPids: [...ancestorPids] };
291
+ await fs_1.default.promises.writeFile(path_1.default.join(folder, `${process.pid}.json`), JSON.stringify(entry));
292
+ await recompute();
293
+ }
294
+ exports.registerAltPort = registerAltPort;
295
+ function onTakeoverEvent(listener) {
296
+ eventListeners.push(listener);
297
+ }
298
+ exports.onTakeoverEvent = onTakeoverEvent;
299
+ /** The interpretation overlay: splits every source pointing at our domain+main port so the middle
300
+ * of the deploy overlap points at the alternate port. Pure, in-memory only - the stored routing
301
+ * config is never modified, and this must never be applied to data that gets persisted. */
302
+ function applyDeployRemap(routing) {
303
+ let remap = current.remap;
304
+ let init = initialized;
305
+ if (!remap || !init)
306
+ return routing;
307
+ let sources = [];
308
+ let slice = (source, start, end, url) => {
309
+ return { ...source, url: url || source.url, validWindow: [start, end] };
310
+ };
311
+ for (let source of routing.sources) {
312
+ if (typeof source === "string" || source.type !== "remote") {
313
+ sources.push(source);
314
+ continue;
315
+ }
316
+ let parsed;
317
+ try {
318
+ parsed = (0, remoteConfig_1.parseHostedUrl)(source.url);
319
+ }
320
+ catch (_a) {
321
+ sources.push(source);
322
+ continue;
323
+ }
324
+ if (parsed.address !== init.domain || parsed.port !== init.mainPort) {
325
+ sources.push(source);
326
+ continue;
327
+ }
328
+ let [start, end] = source.validWindow;
329
+ let a = Math.max(start, Math.min(remap.boundaryA, end));
330
+ let b = Math.max(start, Math.min(remap.boundaryB, end));
331
+ let added = false;
332
+ if (a > start) {
333
+ sources.push(slice(source, start, a));
334
+ added = true;
335
+ }
336
+ if (b > a) {
337
+ sources.push(slice(source, a, b, (0, remoteConfig_1.replaceHostedUrlPort)(source.url, remap.altPort)));
338
+ added = true;
339
+ }
340
+ if (end > b) {
341
+ sources.push(slice(source, b, end));
342
+ added = true;
343
+ }
344
+ if (!added) {
345
+ sources.push(source);
346
+ }
347
+ }
348
+ return { version: routing.version, sources };
349
+ }
350
+ exports.applyDeployRemap = applyDeployRemap;
351
+ /** For the dying process: fast-write flush delays must never extend past this time, and after it
352
+ * fast writes flush immediately - so nothing is left in memory when the write window transfers. */
353
+ function getFlushDeadline() {
354
+ let dying = current.dying;
355
+ if (!dying)
356
+ return undefined;
357
+ return dying.successorStart + dying.overlap * FLUSH_DEADLINE_FRACTION;
358
+ }
359
+ exports.getFlushDeadline = getFlushDeadline;
360
+ /** How long to wait between main-port acquisition attempts: tight around the predecessor's
361
+ * scheduled death (when the port actually frees), relaxed otherwise. */
362
+ function getMainPortAcquireDelay() {
363
+ let end = current.predecessorEnd;
364
+ if (end !== undefined && Math.abs(Date.now() - end) <= ACQUIRE_FAST_WINDOW) {
365
+ return ACQUIRE_FAST_DELAY;
366
+ }
367
+ return ACQUIRE_SLOW_DELAY;
368
+ }
369
+ exports.getMainPortAcquireDelay = getMainPortAcquireDelay;
370
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95VGFrZW92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3lUYWtlb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLGlEQUFxQztBQUVyQyxpREFBc0U7QUFFdEUsaUdBQWlHO0FBQ2pHLGlHQUFpRztBQUNqRyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRixpR0FBaUc7QUFDakcsbUdBQW1HO0FBQ25HLDBGQUEwRjtBQUMxRixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLEVBQUU7QUFDRixpR0FBaUc7QUFDakcsZ0dBQWdHO0FBQ2hHLGlDQUFpQztBQUVqQyxNQUFNLDhCQUE4QixHQUFHLDBCQUEwQixDQUFDO0FBQ2xFLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0FBQ3JELE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN6QyxtR0FBbUc7QUFDbkcsK0ZBQStGO0FBQy9GLDhEQUE4RDtBQUM5RCxNQUFNLHlCQUF5QixHQUFHLHFCQUFxQixDQUFDO0FBQ3hELG1HQUFtRztBQUNuRyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN0QyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNuQyw2RkFBNkY7QUFDN0YsOEZBQThGO0FBQzlGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBcUJoQyxJQUFJLFdBQW9GLENBQUM7QUFDekYsSUFBSSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUNyQyxJQUFJLGNBQWtDLENBQUM7QUFDdkMsSUFBSSxVQUE4QixDQUFDO0FBQ25DLElBQUksT0FBTyxHQUFxQixFQUFFLENBQUM7QUFDbkMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QyxJQUFJLGNBQWMsR0FBdUMsRUFBRSxDQUFDO0FBQzVELElBQUksV0FBVyxHQUFvQyxFQUFFLENBQUM7QUFFdEQsU0FBUyxRQUFRLENBQUMsT0FBZTtJQUM3QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ25DLElBQUEsb0JBQUksRUFBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDNUIsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDUixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2QsT0FBTztZQUNYLENBQUM7WUFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxrR0FBa0c7QUFDbEcsMkNBQTJDO0FBQzNDLEtBQUssVUFBVSxlQUFlO0lBQzFCLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUMsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUM3QixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1YsSUFBSSxJQUFZLENBQUM7UUFDakIsSUFBSSxVQUFVLEtBQUssT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0MsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUM7Z0JBQ0QsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLE1BQU0sUUFBUSxDQUFDLGtCQUFrQixVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3RSxDQUFDO1lBQUMsV0FBTSxDQUFDO2dCQUNMLE1BQU07WUFDVixDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQUUsTUFBTTtRQUN0RSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2YsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVELEtBQUssVUFBVSxrQkFBa0I7SUFDN0IsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDVixJQUFJLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDO1lBQ0QsS0FBSyxHQUFHLE1BQU0sWUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUFDLFdBQU0sQ0FBQyxDQUFDLENBQUM7UUFDWCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hFLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBRyxjQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksTUFBTSxLQUFLLEdBQUc7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNyQyxHQUFHLEdBQUcsTUFBTSxDQUFDO0lBQ2pCLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsR0FBVztJQUN6QixJQUFJLENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNULE9BQVEsQ0FBdUIsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDO0lBQ3JELENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxpQkFBaUI7SUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFDRCxPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMsY0FBSSxDQUFDLE9BQU8sQ0FBQyxjQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFDdkcsQ0FBQztBQUlELEtBQUssVUFBVSxnQkFBZ0I7SUFDM0IsSUFBSSxNQUFNLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztJQUNqQyxJQUFJLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDekIsSUFBSSxDQUFDO1FBQ0QsS0FBSyxHQUFHLE1BQU0sWUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUFDLFdBQU0sQ0FBQztRQUNMLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUNELElBQUksT0FBTyxHQUFvQixFQUFFLENBQUM7SUFDbEMsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNyQixJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLO1lBQUUsU0FBUztRQUNyQixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQztnQkFDRCxNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUFDLFdBQU0sQ0FBQyxDQUFDLENBQUM7WUFDWCxTQUFTO1FBQ2IsQ0FBQztRQUNELElBQUksQ0FBQztZQUNELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBa0IsQ0FBQztZQUNyRyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQUMsV0FBTSxDQUFDLENBQUMsQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDO0FBRUQsS0FBSyxVQUFVLG1CQUFtQjs7SUFDOUIsSUFBSSxDQUFDLGNBQWM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMvQixJQUFJLE9BQU8sR0FBb0IsRUFBRSxDQUFDO0lBQ2xDLEtBQUssSUFBSSxJQUFJLElBQUksTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUztRQUN6RCxJQUFJLENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFrQixDQUFDLENBQUM7UUFDekcsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxjQUFjLEdBQUcsSUFBSSxLQUFLLE1BQUMsQ0FBVyxDQUFDLEtBQUssbUNBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3RyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxjQUFzQixFQUFFLE9BQWUsRUFBRSxPQUFlO0lBQ3ZFLE9BQU87UUFDSCxTQUFTLEVBQUUsY0FBYyxHQUFHLE9BQU8sR0FBRyxtQkFBbUI7UUFDekQsU0FBUyxFQUFFLGNBQWMsR0FBRyxPQUFPLEdBQUcsbUJBQW1CO1FBQ3pELE1BQU0sRUFBRSxjQUFjLEdBQUcsT0FBTyxHQUFHLHFCQUFxQjtRQUN4RCxPQUFPO0tBQ1YsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLElBQUksQ0FBQyxLQUFvQjs7SUFDOUIsS0FBSyxJQUFJLFFBQVEsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUM7WUFDRCxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxNQUFDLENBQVcsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakYsQ0FBQztJQUNMLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxjQUFjO0lBQ25CLEtBQUssSUFBSSxLQUFLLElBQUksV0FBVyxFQUFFLENBQUM7UUFDNUIsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNyQixJQUFJLFFBQVEsR0FBRyxDQUFDLElBQVksRUFBRSxHQUFlLEVBQUUsRUFBRTs7UUFDN0MsSUFBSSxJQUFJLElBQUksR0FBRztZQUFFLE9BQU87UUFDeEIsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBQSxNQUFDLEtBQWdDLEVBQUMsS0FBSyxrREFBSSxDQUFDO1FBQzVDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUMxQixJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1IsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDckUsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDckUsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFRLEVBQUUsRUFBRSxXQUFDLE9BQUEsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsTUFBQSxDQUFDLENBQUMsS0FBSyxtQ0FBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBLEVBQUEsQ0FBQyxDQUFDLENBQUM7SUFDM0ksQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLFVBQVUsU0FBUztJQUNwQixJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsY0FBYztRQUFFLE9BQU87SUFDNUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLElBQUksT0FBTyxHQUFHLE1BQU0sbUJBQW1CLEVBQUUsQ0FBQztJQUMxQyxJQUFJLFFBQVEsR0FBRyxNQUFNLGdCQUFnQixFQUFFLENBQUM7SUFDeEMsSUFBSSxFQUE2QixDQUFDO0lBQ2xDLEtBQUssSUFBSSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0MsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxRQUFRLEdBQXFCLEVBQUUsQ0FBQztJQUNwQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ0wsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxJQUFJLElBQStCLENBQUM7UUFDcEMsSUFBSSxJQUErQixDQUFDO1FBQ3BDLEtBQUssSUFBSSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7WUFDeEIsSUFBSSxLQUFLLEtBQUssRUFBRTtnQkFBRSxTQUFTO1lBQzNCLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMxRixJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2pCLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDMUYsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNqQixDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssb0JBQW9CLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakcsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxjQUFjLEdBQUcsT0FBTyxHQUFHLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3hFLFFBQVEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQzdDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQzlCLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2YsSUFBSSxjQUFjLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7b0JBQy9FLElBQUksY0FBYyxFQUFFLENBQUM7d0JBQ2pCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3RSxDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7WUFDeEMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDNUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxVQUFVLElBQUksR0FBRyxHQUFHLE9BQU8sR0FBRyxPQUFPLEdBQUcscUJBQXFCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDN0QsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQyxJQUFJLEdBQUcsS0FBSyxVQUFVO1FBQUUsT0FBTztJQUMvQixPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQ25CLFVBQVUsR0FBRyxHQUFHLENBQUM7SUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNyRCxjQUFjLEVBQUUsQ0FBQztJQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVEOzs4REFFOEQ7QUFDdkQsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BQW1FOztJQUN4RyxXQUFXLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLFlBQVksR0FBRyxNQUFNLGVBQWUsRUFBRSxDQUFDO0lBQ3ZDLGNBQWMsR0FBRyxNQUFNLGtCQUFrQixFQUFFLENBQUM7SUFDNUMsSUFBSSxDQUFDLGNBQWM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNsQyxNQUFNLFNBQVMsRUFBRSxDQUFDO0lBQ2xCLElBQUksSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDeEIsS0FBSyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFRLEVBQUUsRUFBRSxXQUFDLE9BQUEsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsTUFBQSxDQUFDLENBQUMsS0FBSyxtQ0FBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBLEVBQUEsQ0FBQyxDQUFDO0lBQzdHLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQzNCLE1BQUEsTUFBQyxJQUErQixFQUFDLEtBQUssa0RBQUksQ0FBQztJQUMzQyxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBWEQsZ0RBV0M7QUFFRDsrRkFDK0Y7QUFDeEYsS0FBSyxVQUFVLGVBQWUsQ0FBQyxJQUFZO0lBQzlDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDbEIsSUFBSSxNQUFNLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztJQUNqQyxNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELElBQUksS0FBSyxHQUFrQixFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUM7SUFDdkYsTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3RixNQUFNLFNBQVMsRUFBRSxDQUFDO0FBQ3RCLENBQUM7QUFQRCwwQ0FPQztBQUVELFNBQWdCLGVBQWUsQ0FBQyxRQUF3QztJQUNwRSxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFGRCwwQ0FFQztBQUVEOzs0RkFFNEY7QUFDNUYsU0FBZ0IsZ0JBQWdCLENBQUMsT0FBcUI7SUFDbEQsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUMxQixJQUFJLElBQUksR0FBRyxXQUFXLENBQUM7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUNwQyxJQUFJLE9BQU8sR0FBdUIsRUFBRSxDQUFDO0lBQ3JDLElBQUksS0FBSyxHQUFHLENBQUMsTUFBb0IsRUFBRSxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVksRUFBZ0IsRUFBRTtRQUN6RixPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQzVFLENBQUMsQ0FBQztJQUNGLEtBQUssSUFBSSxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDekQsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQixTQUFTO1FBQ2IsQ0FBQztRQUNELElBQUksTUFBeUMsQ0FBQztRQUM5QyxJQUFJLENBQUM7WUFDRCxNQUFNLEdBQUcsSUFBQSw2QkFBYyxFQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQUMsV0FBTSxDQUFDO1lBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQixTQUFTO1FBQ2IsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckIsU0FBUztRQUNiLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDdEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ1IsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBQSxtQ0FBb0IsRUFBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkYsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQixDQUFDO1FBQ0QsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDVixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUNqRCxDQUFDO0FBN0NELDRDQTZDQztBQUVEO29HQUNvRztBQUNwRyxTQUFnQixnQkFBZ0I7SUFDNUIsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUMxQixJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzdCLE9BQU8sS0FBSyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLHVCQUF1QixDQUFDO0FBQzFFLENBQUM7QUFKRCw0Q0FJQztBQUVEO3lFQUN5RTtBQUN6RSxTQUFnQix1QkFBdUI7SUFDbkMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztJQUNqQyxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUN6RSxPQUFPLGtCQUFrQixDQUFDO0lBQzlCLENBQUM7SUFDRCxPQUFPLGtCQUFrQixDQUFDO0FBQzlCLENBQUM7QUFORCwwREFNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IFJlbW90ZUNvbmZpZywgUmVtb3RlQ29uZmlnQmFzZSwgSG9zdGVkQ29uZmlnIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgcGFyc2VIb3N0ZWRVcmwsIHJlcGxhY2VIb3N0ZWRVcmxQb3J0IH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5cbi8vIERlcGxveSB0YWtlb3ZlcjogdGhlIGRlcGxveSBtYW5hZ2VyIChxdWVyeXN1YidzIHBhcmFtZXRlcnNUaW1lbGluZSkgd3JpdGVzIDxuPi1wYXJhbWV0ZXJzLmpzb25cbi8vIGZpbGVzIGludG8gb3VyIGluc3RhbmNlIGZvbGRlciBkZXNjcmliaW5nIHdoZW4gZWFjaCB2ZXJzaW9uIHJ1bnMgYW5kIHdoZW4gaXQgaXMgc2h1dCBkb3duLiBPbGRcbi8vIGFuZCBuZXcgdmVyc2lvbiBvdmVybGFwIGZvciB0aGUgb3ZlcmxhcCB0aW1lIChPID0gb2xkRW5kIC0gbmV3U3RhcnQpLiBXZSB0dXJuIHRoYXQgb3ZlcmxhcCBpbnRvXG4vLyBhbiBhdG9taWMgd3JpdGUgaGFuZG9mZiBieSBSRUlOVEVSUFJFVElORyBldmVyeSByb3V0aW5nIHNvdXJjZSB0aGF0IHBvaW50cyBhdCB1czogaXRzIHZhbGlkXG4vLyB3aW5kb3cgaXMgc3BsaXQgc28gdGhhdCB0aGUgbWlkZGxlIG9mIHRoZSBvdmVybGFwIChbUyArIDAuNSpPLCBTICsgMS41Kk9dKSBwb2ludHMgYXQgdGhlIG5ld1xuLy8gcHJvY2VzcydzIHRlbXBvcmFyeSBhbHRlcm5hdGUgcG9ydC4gVGhlIGV4aXN0aW5nIHZhbGlkLXdpbmRvdyBtYWNoaW5lcnkgdGhlbiBkb2VzIGV2ZXJ5dGhpbmcgLVxuLy8gdGhlIG9sZCBwcm9jZXNzIHN0YXJ0cyByZWplY3RpbmcgZnJlc2ggd3JpdGVzIGF0IHRoZSBmaXJzdCBib3VuZGFyeSwgY2xpZW50cyByZS1yZXNvbHZlLCBhbmQgdGhlXG4vLyBuZXcgcHJvY2VzcyAod2hpY2ggcmVjb2duaXplcyB0aGUgYWx0ZXJuYXRlIHBvcnQgYXMgaXRzZWxmKSB0YWtlcyBvdmVyLiBUaGUgcmVtYXAgaXMgYW5cbi8vIElOVEVSUFJFVEFUSU9OIE9WRVJMQVksIGFwcGxpZWQgd2hlcmUgcm91dGluZyBjb25maWdzIGFyZSB1c2VkIChzZWUgYXBwbHlEZXBsb3lSZW1hcCBjYWxsZXJzKSAtXG4vLyBpdCBpcyBuZXZlciB3cml0dGVuIHRvIGRpc2ssIG5ldmVyIHN5bmNocm9uaXplZCwgYW5kIG5ldmVyIHBhcnQgb2YgYW55IHN0b3JlZCBjb25maWd1cmF0aW9uLlxuLy9cbi8vIEV2ZXJ5dGhpbmcgaGVyZSBpcyByZWNvbXB1dGVkIGlkZW1wb3RlbnRseSBmcm9tIGl0cyBpbnB1dHMgKHRpbWVsaW5lIGZpbGVzLCB0aGUgcG9ydCByZWdpc3RyeSxcbi8vIG91ciBhbmNlc3RvciBwaWRzLCB0aGUgY2xvY2spIC0gZmlsZXMgY2FuIGFwcGVhciBvciBjaGFuZ2UgYXQgYW55IG1vbWVudCwgYW5kIHdlIGNhbiBzdGFydCBhdFxuLy8gYW55IHBvaW50IGR1cmluZyBhIHN3aXRjaG92ZXIuXG5cbmNvbnN0IFBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWCA9IC9eKFxcZCspLXBhcmFtZXRlcnNcXC5qc29uJC87XG5jb25zdCBBTElWRV9XSU5ET1dfRk9SRVZFUiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuY29uc3QgVElNRUxJTkVfUE9MTF9JTlRFUlZBTCA9IDYwICogMTAwMDtcbi8vIFByb2Nlc3NlcyBsaXN0ZW5pbmcgb24gYW4gYWx0ZXJuYXRlIHBvcnQgcmVnaXN0ZXIgaXQgaGVyZSAoc2libGluZyBvZiB0aGUgc3RvcmFnZSBmb2xkZXIpLCBrZXllZFxuLy8gYnkgdGhlaXIgYWN0dWFsIHBpZDsgY29udGVudCBpbmNsdWRlcyB0aGVpciBhbmNlc3RvciBwaWRzIHNvIHRoZSB0aW1lbGluZSBlbnRyeSBwaWQgKGEgc2hlbGxcbi8vIGFuY2VzdG9yIG9mIHRoZSBwcm9jZXNzKSBjYW4gYmUgbWF0Y2hlZCB0byBhIHJlZ2lzdHJ5IGVudHJ5XG5jb25zdCBQT1JUX1JFR0lTVFJZX0ZPTERFUl9OQU1FID0gXCJzdG9yYWdlUG9ydFJlZ2lzdHJ5XCI7XG4vLyBNYWluLXBvcnQgYWNxdWlzaXRpb24gYXR0ZW1wdHMgcnVuIHRoaXMgb2Z0ZW4sIHRpZ2h0ZW5pbmcgbmVhciB0aGUgcHJlZGVjZXNzb3IncyBzY2hlZHVsZWQgZGVhdGhcbmNvbnN0IEFDUVVJUkVfU0xPV19ERUxBWSA9IDMwICogMTAwMDtcbmNvbnN0IEFDUVVJUkVfRkFTVF9ERUxBWSA9IDUgKiAxMDAwO1xuY29uc3QgQUNRVUlSRV9GQVNUX1dJTkRPVyA9IDYwICogMTAwMDtcbi8vIERpc2sgcmVzY2FucyBmaXJlIHRoaXMgZmFyIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHdyaXRlIGhhbmRvZmYsIGNhdGNoaW5nIGZpbGVzIHRoZSBvdGhlciBwcm9jZXNzXG4vLyB3cm90ZSAodGhlIEJ1bGtEYXRhYmFzZTIgaW5kZXggaXMgYXRvbWljIGJ1dCBpdHMgZW50cmllcyBsYW5kIGF0IHdyaXRlIHRpbWUsIG5vdCBmaWxlIHRpbWUpXG5jb25zdCBTV0lUQ0hfU0NBTl9MRUFEID0gMTAgKiAxMDAwO1xuLy8gVGhlIGR5aW5nIHByb2Nlc3MgbXVzdCBoYXZlIGZsdXNoZWQgZXZlcnl0aGluZyBiZWZvcmUgdGhlIGhhbmRvZmY6IGZhc3Qtd3JpdGUgZGVsYXlzIG5ldmVyXG4vLyBleHRlbmQgcGFzdCBTICsgb3ZlcmxhcCAqIHRoaXMgZnJhY3Rpb24sIGFuZCBhZnRlciB0aGF0IHBvaW50IGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5XG5jb25zdCBGTFVTSF9ERUFETElORV9GUkFDVElPTiA9IDAuMjU7XG5jb25zdCBCT1VOREFSWV9BX0ZSQUNUSU9OID0gMC41O1xuY29uc3QgQk9VTkRBUllfQl9GUkFDVElPTiA9IDEuNTtcbmNvbnN0IFJFTUFQX0VYUElSRV9GUkFDVElPTiA9IDI7XG5cbnR5cGUgVGltZWxpbmVFbnRyeSA9IHtcbiAgICBwaWQ/OiBudW1iZXI7XG4gICAgYWxpdmVXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07XG4gICAgcGFyYW1ldGVyczogdW5rbm93bjtcbn07XG5cbnR5cGUgVGFrZW92ZXJDb21wdXRlZCA9IHtcbiAgICAvLyBXZSBhcmUgc2NoZWR1bGVkIHRvIGRpZSB3aXRoIGEgc3VjY2Vzc29yIG92ZXJsYXBwaW5nIHVzIChrbm93biBmcm9tIHRoZSBmaWxlcyBhbG9uZSwgYmVmb3JlXG4gICAgLy8gdGhlIHN1Y2Nlc3NvcidzIHBvcnQgaXMgZGlzY292ZXJlZCAtIHRoZSBmbHVzaCBkZWFkbGluZSBhcHBsaWVzIGltbWVkaWF0ZWx5KVxuICAgIGR5aW5nPzogeyBzdWNjZXNzb3JTdGFydDogbnVtYmVyOyBvdmVybGFwOiBudW1iZXIgfTtcbiAgICAvLyBUaGUgd2luZG93IHJlaW50ZXJwcmV0YXRpb24sIG9uY2UgdGhlIG1pZGRsZSB3aW5kb3cncyBwb3J0IGlzIGtub3duICh0aGUgc3VjY2Vzc29yJ3NcbiAgICAvLyByZWdpc3RlcmVkIGFsdGVybmF0ZSBwb3J0IC0gb3Igb3VyIG93biwgd2hlbiB3ZSBBUkUgdGhlIHN1Y2Nlc3NvcilcbiAgICByZW1hcD86IHsgYm91bmRhcnlBOiBudW1iZXI7IGJvdW5kYXJ5QjogbnVtYmVyOyBleHBpcmU6IG51bWJlcjsgYWx0UG9ydDogbnVtYmVyIH07XG4gICAgLy8gV2hlbiBvdXIgcHJlZGVjZXNzb3IgZGllcyBhbmQgZnJlZXMgdGhlIG1haW4gcG9ydCAoZm9yIGFjcXVpc2l0aW9uIHBhY2luZylcbiAgICBwcmVkZWNlc3NvckVuZD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFRha2VvdmVyRXZlbnQgPSBcInJlbWFwQ2hhbmdlZFwiIHwgXCJkaXNrU2NhblwiO1xuXG5sZXQgaW5pdGlhbGl6ZWQ6IHsgZG9tYWluOiBzdHJpbmc7IG1haW5Qb3J0OiBudW1iZXI7IHN0b3JhZ2VGb2xkZXI6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xubGV0IGFuY2VzdG9yUGlkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xubGV0IHRpbWVsaW5lRm9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgb3VyQWx0UG9ydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xubGV0IGN1cnJlbnQ6IFRha2VvdmVyQ29tcHV0ZWQgPSB7fTtcbmxldCBjdXJyZW50S2V5ID0gSlNPTi5zdHJpbmdpZnkoY3VycmVudCk7XG5sZXQgZXZlbnRMaXN0ZW5lcnM6ICgoZXZlbnQ6IFRha2VvdmVyRXZlbnQpID0+IHZvaWQpW10gPSBbXTtcbmxldCBldmVudFRpbWVyczogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD5bXSA9IFtdO1xuXG5mdW5jdGlvbiBleGVjVGV4dChjb21tYW5kOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGV4ZWMoY29tbWFuZCwgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLy8gVGhlIHRpbWVsaW5lIGVudHJ5IHBpZCBpcyB0aGUgc2NyZWVuIHNoZWxsIHRoYXQgc3Bhd25lZCB1cyAtIGFuIGFuY2VzdG9yIC0gc28gd2Ugd2FsayBvdXIgd2hvbGVcbi8vIGFuY2VzdG9yIGNoYWluIHRvIGZpbmQgd2hpY2ggZW50cnkgaXMgdXNcbmFzeW5jIGZ1bmN0aW9uIGdldEFuY2VzdG9yUGlkcygpOiBQcm9taXNlPFNldDxudW1iZXI+PiB7XG4gICAgbGV0IHBpZHMgPSBuZXcgU2V0PG51bWJlcj4oW3Byb2Nlc3MucGlkXSk7XG4gICAgbGV0IGN1cnJlbnRQaWQgPSBwcm9jZXNzLnBpZDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgcHBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoY3VycmVudFBpZCA9PT0gcHJvY2Vzcy5waWQgJiYgcHJvY2Vzcy5wcGlkKSB7XG4gICAgICAgICAgICBwcGlkID0gcHJvY2Vzcy5wcGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcGlkID0gcGFyc2VJbnQoKGF3YWl0IGV4ZWNUZXh0KGBwcyAtbyBwcGlkPSAtcCAke2N1cnJlbnRQaWR9YCkpLnRyaW0oKSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBwaWQgfHwgTnVtYmVyLmlzTmFOKHBwaWQpIHx8IHBwaWQgPD0gMSB8fCBwaWRzLmhhcyhwcGlkKSkgYnJlYWs7XG4gICAgICAgIHBpZHMuYWRkKHBwaWQpO1xuICAgICAgICBjdXJyZW50UGlkID0gcHBpZDtcbiAgICB9XG4gICAgcmV0dXJuIHBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRUaW1lbGluZUZvbGRlcigpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpbGVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXIpO1xuICAgICAgICB9IGNhdGNoIHsgfVxuICAgICAgICBpZiAoZmlsZXMuc29tZShmaWxlID0+IFBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWC50ZXN0KGZpbGUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRpci5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIikgKyBcIi9cIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRpcik7XG4gICAgICAgIGlmIChwYXJlbnQgPT09IGRpcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgZGlyID0gcGFyZW50O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcGlkQWxpdmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gKGUgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGUgPT09IFwiRVBFUk1cIjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5Rm9sZGVyKCk6IHN0cmluZyB7XG4gICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlcGxveSB0YWtlb3ZlciBpcyBub3QgaW5pdGlhbGl6ZWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihwYXRoLmRpcm5hbWUocGF0aC5yZXNvbHZlKGluaXRpYWxpemVkLnN0b3JhZ2VGb2xkZXIpKSwgUE9SVF9SRUdJU1RSWV9GT0xERVJfTkFNRSk7XG59XG5cbnR5cGUgUmVnaXN0cnlFbnRyeSA9IHsgcGlkOiBudW1iZXI7IHBvcnQ6IG51bWJlcjsgYW5jZXN0b3JQaWRzOiBudW1iZXJbXSB9O1xuXG5hc3luYyBmdW5jdGlvbiByZWFkUG9ydFJlZ2lzdHJ5KCk6IFByb21pc2U8UmVnaXN0cnlFbnRyeVtdPiB7XG4gICAgbGV0IGZvbGRlciA9IGdldFJlZ2lzdHJ5Rm9sZGVyKCk7XG4gICAgbGV0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICAgIGZpbGVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihmb2xkZXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxldCBlbnRyaWVzOiBSZWdpc3RyeUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IC9eKFxcZCspXFwuanNvbiQvLmV4ZWMoZmlsZSk7XG4gICAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgcGlkID0gcGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICBpZiAoIXBpZEFsaXZlKHBpZCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudW5saW5rKHBhdGguam9pbihmb2xkZXIsIGZpbGUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZm9sZGVyLCBmaWxlKSwgXCJ1dGY4XCIpKSBhcyBSZWdpc3RyeUVudHJ5O1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKHsgLi4uZW50cnksIHBpZCB9KTtcbiAgICAgICAgfSBjYXRjaCB7IH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRUaW1lbGluZUVudHJpZXMoKTogUHJvbWlzZTxUaW1lbGluZUVudHJ5W10+IHtcbiAgICBpZiAoIXRpbWVsaW5lRm9sZGVyKSByZXR1cm4gW107XG4gICAgbGV0IGVudHJpZXM6IFRpbWVsaW5lRW50cnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0aW1lbGluZUZvbGRlcikpIHtcbiAgICAgICAgaWYgKCFQQVJBTUVURVJTX1RJTUVMSU5FX0ZJTEVfUkVHRVgudGVzdChmaWxlKSkgY29udGludWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh0aW1lbGluZUZvbGRlciArIGZpbGUsIFwidXRmOFwiKSkgYXMgVGltZWxpbmVFbnRyeSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHJlYWQgZGVwbG95IHRpbWVsaW5lIGZpbGUgJHt0aW1lbGluZUZvbGRlciArIGZpbGV9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBtYWtlUmVtYXAoc3VjY2Vzc29yU3RhcnQ6IG51bWJlciwgb3ZlcmxhcDogbnVtYmVyLCBhbHRQb3J0OiBudW1iZXIpOiBUYWtlb3ZlckNvbXB1dGVkW1wicmVtYXBcIl0ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGJvdW5kYXJ5QTogc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwICogQk9VTkRBUllfQV9GUkFDVElPTixcbiAgICAgICAgYm91bmRhcnlCOiBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBCT1VOREFSWV9CX0ZSQUNUSU9OLFxuICAgICAgICBleHBpcmU6IHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIFJFTUFQX0VYUElSRV9GUkFDVElPTixcbiAgICAgICAgYWx0UG9ydCxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBlbWl0KGV2ZW50OiBUYWtlb3ZlckV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRGVwbG95IHRha2VvdmVyIGxpc3RlbmVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVFdmVudHMoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgdGltZXIgb2YgZXZlbnRUaW1lcnMpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gICAgZXZlbnRUaW1lcnMgPSBbXTtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgc2NoZWR1bGUgPSAodGltZTogbnVtYmVyLCBmbmM6ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgaWYgKHRpbWUgPD0gbm93KSByZXR1cm47XG4gICAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoZm5jLCB0aW1lIC0gbm93KTtcbiAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgZXZlbnRUaW1lcnMucHVzaCh0aW1lcik7XG4gICAgfTtcbiAgICBsZXQgcmVtYXAgPSBjdXJyZW50LnJlbWFwO1xuICAgIGlmIChyZW1hcCkge1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5ib3VuZGFyeUEgLSBTV0lUQ0hfU0NBTl9MRUFELCAoKSA9PiBlbWl0KFwiZGlza1NjYW5cIikpO1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5ib3VuZGFyeUEgKyBTV0lUQ0hfU0NBTl9MRUFELCAoKSA9PiBlbWl0KFwiZGlza1NjYW5cIikpO1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5leHBpcmUsICgpID0+IHZvaWQgcmVjb21wdXRlKCkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBEZXBsb3kgdGFrZW92ZXIgcmVjb21wdXRlIGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29tcHV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWluaXRpYWxpemVkIHx8ICF0aW1lbGluZUZvbGRlcikgcmV0dXJuO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBlbnRyaWVzID0gYXdhaXQgcmVhZFRpbWVsaW5lRW50cmllcygpO1xuICAgIGxldCByZWdpc3RyeSA9IGF3YWl0IHJlYWRQb3J0UmVnaXN0cnkoKTtcbiAgICBsZXQgdXM6IFRpbWVsaW5lRW50cnkgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkucGlkICYmIGFuY2VzdG9yUGlkcy5oYXMoZW50cnkucGlkKSkge1xuICAgICAgICAgICAgdXMgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29tcHV0ZWQ6IFRha2VvdmVyQ29tcHV0ZWQgPSB7fTtcbiAgICBpZiAodXMpIHtcbiAgICAgICAgbGV0IHVzU3RhcnQgPSB1cy5hbGl2ZVdpbmRvd1swXTtcbiAgICAgICAgbGV0IG5leHQ6IFRpbWVsaW5lRW50cnkgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBwcmV2OiBUaW1lbGluZUVudHJ5IHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkgPT09IHVzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5hbGl2ZVdpbmRvd1swXSA+IHVzU3RhcnQgJiYgKCFuZXh0IHx8IGVudHJ5LmFsaXZlV2luZG93WzBdIDwgbmV4dC5hbGl2ZVdpbmRvd1swXSkpIHtcbiAgICAgICAgICAgICAgICBuZXh0ID0gZW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW50cnkuYWxpdmVXaW5kb3dbMF0gPCB1c1N0YXJ0ICYmICghcHJldiB8fCBlbnRyeS5hbGl2ZVdpbmRvd1swXSA+IHByZXYuYWxpdmVXaW5kb3dbMF0pKSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0ICYmIHVzLmFsaXZlV2luZG93WzFdICE9PSBBTElWRV9XSU5ET1dfRk9SRVZFUiAmJiBuZXh0LmFsaXZlV2luZG93WzBdIDw9IHVzLmFsaXZlV2luZG93WzFdKSB7XG4gICAgICAgICAgICBsZXQgb3ZlcmxhcCA9IHVzLmFsaXZlV2luZG93WzFdIC0gbmV4dC5hbGl2ZVdpbmRvd1swXTtcbiAgICAgICAgICAgIGxldCBzdWNjZXNzb3JTdGFydCA9IG5leHQuYWxpdmVXaW5kb3dbMF07XG4gICAgICAgICAgICBpZiAob3ZlcmxhcCA+IDAgJiYgbm93IDwgc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwICogUkVNQVBfRVhQSVJFX0ZSQUNUSU9OKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQuZHlpbmcgPSB7IHN1Y2Nlc3NvclN0YXJ0LCBvdmVybGFwIH07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VjY2Vzc29yUGlkID0gbmV4dC5waWQ7XG4gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3NvclBpZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3VjY2Vzc29yRW50cnkgPSByZWdpc3RyeS5maW5kKHggPT4geC5hbmNlc3RvclBpZHMuaW5jbHVkZXMoc3VjY2Vzc29yUGlkKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzb3JFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQucmVtYXAgPSBtYWtlUmVtYXAoc3VjY2Vzc29yU3RhcnQsIG92ZXJsYXAsIHN1Y2Nlc3NvckVudHJ5LnBvcnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2ICYmIHByZXYuYWxpdmVXaW5kb3dbMV0gPiB1c1N0YXJ0KSB7XG4gICAgICAgICAgICBsZXQgb3ZlcmxhcCA9IHByZXYuYWxpdmVXaW5kb3dbMV0gLSB1c1N0YXJ0O1xuICAgICAgICAgICAgY29tcHV0ZWQucHJlZGVjZXNzb3JFbmQgPSBwcmV2LmFsaXZlV2luZG93WzFdO1xuICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwICYmIG91ckFsdFBvcnQgJiYgbm93IDwgdXNTdGFydCArIG92ZXJsYXAgKiBSRU1BUF9FWFBJUkVfRlJBQ1RJT04gJiYgIWNvbXB1dGVkLnJlbWFwKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQucmVtYXAgPSBtYWtlUmVtYXAodXNTdGFydCwgb3ZlcmxhcCwgb3VyQWx0UG9ydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGtleSA9IEpTT04uc3RyaW5naWZ5KGNvbXB1dGVkKTtcbiAgICBpZiAoa2V5ID09PSBjdXJyZW50S2V5KSByZXR1cm47XG4gICAgY3VycmVudCA9IGNvbXB1dGVkO1xuICAgIGN1cnJlbnRLZXkgPSBrZXk7XG4gICAgY29uc29sZS5sb2coYERlcGxveSB0YWtlb3ZlciBzdGF0ZSBjaGFuZ2VkOiAke2tleX1gKTtcbiAgICBzY2hlZHVsZUV2ZW50cygpO1xuICAgIGVtaXQoXCJyZW1hcENoYW5nZWRcIik7XG59XG5cbi8qKiBTdGFydHMgdGhlIHRha2VvdmVyIG1hY2hpbmVyeS4gUmV0dXJucyB3aGV0aGVyIGEgZGVwbG95IHRpbWVsaW5lIGV4aXN0cyAtIHdoZW4gaXQgZG9lc24ndCxcbiAqICBldmVyeXRoaW5nIGhlcmUgc3RheXMgaW5lcnQgKGFuZCB0aGUgY2FsbGVyIG11c3QgTk9UIGZhbGwgYmFjayB0byBhbHRlcm5hdGUgcG9ydHMsIHNpbmNlIGEgYnVzeVxuICogIHBvcnQgdGhlbiBtZWFucyBhIHJlYWwgbWlzY29uZmlndXJhdGlvbiwgbm90IGEgZGVwbG95KS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0RGVwbG95VGFrZW92ZXIoY29uZmlnOiB7IGRvbWFpbjogc3RyaW5nOyBtYWluUG9ydDogbnVtYmVyOyBzdG9yYWdlRm9sZGVyOiBzdHJpbmcgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGluaXRpYWxpemVkID0gY29uZmlnO1xuICAgIGFuY2VzdG9yUGlkcyA9IGF3YWl0IGdldEFuY2VzdG9yUGlkcygpO1xuICAgIHRpbWVsaW5lRm9sZGVyID0gYXdhaXQgZmluZFRpbWVsaW5lRm9sZGVyKCk7XG4gICAgaWYgKCF0aW1lbGluZUZvbGRlcikgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IHJlY29tcHV0ZSgpO1xuICAgIGxldCBwb2xsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICB2b2lkIHJlY29tcHV0ZSgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgRGVwbG95IHRha2VvdmVyIHJlY29tcHV0ZSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICB9LCBUSU1FTElORV9QT0xMX0lOVEVSVkFMKTtcbiAgICAocG9sbCBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDYWxsZWQgd2hlbiB3ZSBoYWQgdG8gbGlzdGVuIG9uIGFuIGFsdGVybmF0ZSBwb3J0ICh0aGUgbWFpbiBwb3J0IHdhcyBzdGlsbCBoZWxkIGJ5IG91clxuICogIHByZWRlY2Vzc29yKTogcmVnaXN0ZXJzIGl0IHNvIHRoZSBwcmVkZWNlc3NvciBjYW4gcm91dGUgdGhlIG1pZGRsZSBvdmVybGFwIHdpbmRvdyB0byB1cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckFsdFBvcnQocG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgb3VyQWx0UG9ydCA9IHBvcnQ7XG4gICAgbGV0IGZvbGRlciA9IGdldFJlZ2lzdHJ5Rm9sZGVyKCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgZW50cnk6IFJlZ2lzdHJ5RW50cnkgPSB7IHBpZDogcHJvY2Vzcy5waWQsIHBvcnQsIGFuY2VzdG9yUGlkczogWy4uLmFuY2VzdG9yUGlkc10gfTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGZvbGRlciwgYCR7cHJvY2Vzcy5waWR9Lmpzb25gKSwgSlNPTi5zdHJpbmdpZnkoZW50cnkpKTtcbiAgICBhd2FpdCByZWNvbXB1dGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uVGFrZW92ZXJFdmVudChsaXN0ZW5lcjogKGV2ZW50OiBUYWtlb3ZlckV2ZW50KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgZXZlbnRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG59XG5cbi8qKiBUaGUgaW50ZXJwcmV0YXRpb24gb3ZlcmxheTogc3BsaXRzIGV2ZXJ5IHNvdXJjZSBwb2ludGluZyBhdCBvdXIgZG9tYWluK21haW4gcG9ydCBzbyB0aGUgbWlkZGxlXG4gKiAgb2YgdGhlIGRlcGxveSBvdmVybGFwIHBvaW50cyBhdCB0aGUgYWx0ZXJuYXRlIHBvcnQuIFB1cmUsIGluLW1lbW9yeSBvbmx5IC0gdGhlIHN0b3JlZCByb3V0aW5nXG4gKiAgY29uZmlnIGlzIG5ldmVyIG1vZGlmaWVkLCBhbmQgdGhpcyBtdXN0IG5ldmVyIGJlIGFwcGxpZWQgdG8gZGF0YSB0aGF0IGdldHMgcGVyc2lzdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVwbG95UmVtYXAocm91dGluZzogUmVtb3RlQ29uZmlnKTogUmVtb3RlQ29uZmlnIHtcbiAgICBsZXQgcmVtYXAgPSBjdXJyZW50LnJlbWFwO1xuICAgIGxldCBpbml0ID0gaW5pdGlhbGl6ZWQ7XG4gICAgaWYgKCFyZW1hcCB8fCAhaW5pdCkgcmV0dXJuIHJvdXRpbmc7XG4gICAgbGV0IHNvdXJjZXM6IFJlbW90ZUNvbmZpZ0Jhc2VbXSA9IFtdO1xuICAgIGxldCBzbGljZSA9IChzb3VyY2U6IEhvc3RlZENvbmZpZywgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHVybD86IHN0cmluZyk6IEhvc3RlZENvbmZpZyA9PiB7XG4gICAgICAgIHJldHVybiB7IC4uLnNvdXJjZSwgdXJsOiB1cmwgfHwgc291cmNlLnVybCwgdmFsaWRXaW5kb3c6IFtzdGFydCwgZW5kXSB9O1xuICAgIH07XG4gICAgZm9yIChsZXQgc291cmNlIG9mIHJvdXRpbmcuc291cmNlcykge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UudHlwZSAhPT0gXCJyZW1vdGVcIikge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyc2VkOiB7IGFkZHJlc3M6IHN0cmluZzsgcG9ydDogbnVtYmVyIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQuYWRkcmVzcyAhPT0gaW5pdC5kb21haW4gfHwgcGFyc2VkLnBvcnQgIT09IGluaXQubWFpblBvcnQpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNvdXJjZS52YWxpZFdpbmRvdztcbiAgICAgICAgbGV0IGEgPSBNYXRoLm1heChzdGFydCwgTWF0aC5taW4ocmVtYXAuYm91bmRhcnlBLCBlbmQpKTtcbiAgICAgICAgbGV0IGIgPSBNYXRoLm1heChzdGFydCwgTWF0aC5taW4ocmVtYXAuYm91bmRhcnlCLCBlbmQpKTtcbiAgICAgICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChhID4gc3RhcnQpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzbGljZShzb3VyY2UsIHN0YXJ0LCBhKSk7XG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPiBhKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBhLCBiLCByZXBsYWNlSG9zdGVkVXJsUG9ydChzb3VyY2UudXJsLCByZW1hcC5hbHRQb3J0KSkpO1xuICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPiBiKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBiLCBlbmQpKTtcbiAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB2ZXJzaW9uOiByb3V0aW5nLnZlcnNpb24sIHNvdXJjZXMgfTtcbn1cblxuLyoqIEZvciB0aGUgZHlpbmcgcHJvY2VzczogZmFzdC13cml0ZSBmbHVzaCBkZWxheXMgbXVzdCBuZXZlciBleHRlbmQgcGFzdCB0aGlzIHRpbWUsIGFuZCBhZnRlciBpdFxuICogIGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5IC0gc28gbm90aGluZyBpcyBsZWZ0IGluIG1lbW9yeSB3aGVuIHRoZSB3cml0ZSB3aW5kb3cgdHJhbnNmZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZsdXNoRGVhZGxpbmUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZHlpbmcgPSBjdXJyZW50LmR5aW5nO1xuICAgIGlmICghZHlpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGR5aW5nLnN1Y2Nlc3NvclN0YXJ0ICsgZHlpbmcub3ZlcmxhcCAqIEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OO1xufVxuXG4vKiogSG93IGxvbmcgdG8gd2FpdCBiZXR3ZWVuIG1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0czogdGlnaHQgYXJvdW5kIHRoZSBwcmVkZWNlc3NvcidzXG4gKiAgc2NoZWR1bGVkIGRlYXRoICh3aGVuIHRoZSBwb3J0IGFjdHVhbGx5IGZyZWVzKSwgcmVsYXhlZCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpblBvcnRBY3F1aXJlRGVsYXkoKTogbnVtYmVyIHtcbiAgICBsZXQgZW5kID0gY3VycmVudC5wcmVkZWNlc3NvckVuZDtcbiAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQgJiYgTWF0aC5hYnMoRGF0ZS5ub3coKSAtIGVuZCkgPD0gQUNRVUlSRV9GQVNUX1dJTkRPVykge1xuICAgICAgICByZXR1cm4gQUNRVUlSRV9GQVNUX0RFTEFZO1xuICAgIH1cbiAgICByZXR1cm4gQUNRVUlSRV9TTE9XX0RFTEFZO1xufVxuIl19
371
+ /* _JS_SOURCE_HASH = "154a9252e403e54777d49b60b4db16fad1a05679ee037ae5a6db6ba73d410da3"; */
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
- //exports.serializeRemoteConfig = exports.parseRoutingData = exports.normalizeRemoteConfig = exports.normalizeSource = exports.parseBackblazeUrl = exports.parseHostedUrl = exports.buildFileUrl = exports.getBucketBaseUrl = exports.getConfigVersion = exports.routeIntersection = exports.routesOverlap = exports.routeContains = exports.getRoute = exports.parseVariableRoute = exports.ROUTING_FILE = void 0;
3
+ //exports.serializeRemoteConfig = exports.parseRoutingData = exports.normalizeRemoteConfig = exports.normalizeSource = exports.replaceHostedUrlPort = exports.parseBackblazeUrl = exports.parseHostedUrl = exports.buildFileUrl = exports.getBucketBaseUrl = exports.getConfigVersion = exports.routeIntersection = exports.routesOverlap = exports.routeContains = exports.getRoute = exports.parseVariableRoute = exports.ROUTING_FILE = void 0;
4
4
  module.allowclient = true;
5
5
  const misc_1 = require("socket-function/src/misc");
6
6
  const bits_1 = require("socket-function/src/bits");
@@ -99,6 +99,12 @@ function parseBackblazeUrl(url) {
99
99
  return { bucketName: decodeURIComponent(parts[1]) };
100
100
  }
101
101
  exports.parseBackblazeUrl = parseBackblazeUrl;
102
+ function replaceHostedUrlPort(url, port) {
103
+ let u = new URL(url);
104
+ u.port = String(port);
105
+ return u.toString();
106
+ }
107
+ exports.replaceHostedUrlPort = replaceHostedUrlPort;
102
108
  function normalizeSource(source) {
103
109
  if (typeof source !== "string") {
104
110
  let window = source.validWindow;
@@ -202,5 +208,5 @@ function serializeRemoteConfig(config) {
202
208
  return Buffer.from(JSON.stringify(config, undefined, 4));
203
209
  }
204
210
  exports.serializeRemoteConfig = serializeRemoteConfig;
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVtb3RlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBRTFCLG1EQUFrRTtBQUNsRSxtREFBd0Q7QUFDeEQsNENBQTRJO0FBRTVJLDBGQUEwRjtBQUMxRiwrRkFBK0Y7QUFDL0YsNkZBQTZGO0FBQzdGLHNCQUFzQjtBQUVULFFBQUEsWUFBWSxHQUFHLDZCQUE2QixDQUFDO0FBQzFELE1BQU0sY0FBYyxHQUFHLEdBQUcsR0FBRyxvQkFBWSxDQUFDO0FBRTFDLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRTNDLG9MQUFvTDtBQUNwTCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFXO0lBQzFDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsMEJBQWMsQ0FBQyxDQUFDO0lBQ3hDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ25DLElBQUksS0FBSyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRywwQkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDL0UsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFORCxnREFNQztBQUVELHdHQUF3RztBQUN4RyxTQUFnQixRQUFRLENBQUMsR0FBVztJQUNoQyxJQUFJLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QyxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDNUMsSUFBSSxJQUFJLEdBQUcsSUFBQSxtQkFBWSxFQUFDLElBQUEsdUJBQWdC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QUM7SUFDOUMsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDMUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFDRCxPQUFPLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFaRCw0Q0FZQztBQUVELFNBQWdCLHFCQUFxQixDQUFDLE1BQW9CO0lBQ3RELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuXG5pbXBvcnQgeyBzb3J0LCBzaGEyNTZIYXNoQnVmZmVyIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZ2V0QnVmZmVySW50IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYml0c1wiO1xuaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBSZW1vdGVDb25maWdCYXNlLCBIb3N0ZWRDb25maWcsIEJhY2tibGF6ZUNvbmZpZywgRlVMTF9WQUxJRF9XSU5ET1csIEZVTExfUk9VVEUsIFZBUklBQkxFX1NIQVJEIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuXG4vLyBQYXJzaW5nIC8gbm9ybWFsaXphdGlvbiBvZiBSZW1vdGVDb25maWcgKHNlZSBJQXJjaGl2ZXMudHMpLiBFdmVyeSBidWNrZXQgc3RvcmVzIGl0cyBvd25cbi8vIGNvbmZpZ3VyYXRpb24gKGEgUmVtb3RlQ29uZmlnKSBpbnNpZGUgaXRzZWxmLCBhdCBST1VUSU5HX0ZJTEUuIFdyaXRpbmcgdGhhdCBmaWxlIGNyZWF0ZXMgdGhlXG4vLyBidWNrZXQgLyByZWNvbmZpZ3VyZXMgaXQgKHNlZSBzdG9yYWdlU2VydmVyU3RhdGUudHMpOyBjbGllbnRzIHJlY29uY2lsZSBpdCBieSB2ZXJzaW9uIChzZWVcbi8vIGNyZWF0ZUFyY2hpdmVzLnRzKS5cblxuZXhwb3J0IGNvbnN0IFJPVVRJTkdfRklMRSA9IFwic3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uXCI7XG5jb25zdCBST1VUSU5HX1NVRkZJWCA9IFwiL1wiICsgUk9VVElOR19GSUxFO1xuXG5jb25zdCBST1VURV9QUkVDSVNJT04gPSAxMDAwICogMTAwMCAqIDEwMDA7XG5cbi8qKiBUaGUgdmFyaWFibGUtc2hhcmQgcm91dGUgb3ZlcnJpZGUgZW1iZWRkZWQgaW4gdGhlIGtleSAoXCI8c2VudGluZWw+Xzx2YWx1ZT5cIiwgc2VlIFZBUklBQkxFX1NIQVJEKSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGtleSBoYXMgbm8gc2VudGluZWwgb3IgdGhlIHNlbnRpbmVsIGhhcyBubyB2YWx1ZSB5ZXQuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYXJpYWJsZVJvdXRlKGtleTogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaW5kZXggPSBrZXkuaW5kZXhPZihWQVJJQUJMRV9TSEFSRCk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBsZXQgbWF0Y2ggPSAvXl8oXFxkKyg/OlxcLlxcZCspPykvLmV4ZWMoa2V5LnNsaWNlKGluZGV4ICsgVkFSSUFCTEVfU0hBUkQubGVuZ3RoKSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gK21hdGNoWzFdO1xufVxuXG4vKiogV2hlcmUgYSBrZXkgcm91dGVzIGluIFswLCAxKS4gQSBtYXRlcmlhbGl6ZWQgdmFyaWFibGUtc2hhcmQgc3VmZml4IGNvbXBsZXRlbHkgb3ZlcnJpZGVzIHRoZSBoYXNoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdXRlKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgb3ZlcnJpZGUgPSBwYXJzZVZhcmlhYmxlUm91dGUoa2V5KTtcbiAgICBpZiAob3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG92ZXJyaWRlO1xuICAgIGxldCBoYXNoID0gZ2V0QnVmZmVySW50KHNoYTI1Nkhhc2hCdWZmZXIoa2V5KSk7XG4gICAgcmV0dXJuIGhhc2ggJSBST1VURV9QUkVDSVNJT04gLyBST1VURV9QUkVDSVNJT047XG59XG5cbi8vIFJvdXRlIHJhbmdlcyBhcmUgW3N0YXJ0LCBlbmQpIC0gaW5jbHVzaXZlIHN0YXJ0LCBleGNsdXNpdmUgZW5kXG5leHBvcnQgZnVuY3Rpb24gcm91dGVDb250YWlucyhyb3V0ZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgdmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghcm91dGUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiByb3V0ZVswXSA8PSB2YWx1ZSAmJiB2YWx1ZSA8IHJvdXRlWzFdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJvdXRlc092ZXJsYXAoYTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgYjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGxldCBbYVN0YXJ0LCBhRW5kXSA9IGEgfHwgRlVMTF9ST1VURTtcbiAgICBsZXQgW2JTdGFydCwgYkVuZF0gPSBiIHx8IEZVTExfUk9VVEU7XG4gICAgcmV0dXJuIGFTdGFydCA8IGJFbmQgJiYgYlN0YXJ0IDwgYUVuZDtcbn1cbi8qKiBUaGUgb3ZlcmxhcCBvZiB0d28gcm91dGUgcmFuZ2VzLCBvciB1bmRlZmluZWQgd2hlbiB0aGV5IGRvbid0IG92ZXJsYXAuICovXG5leHBvcnQgZnVuY3Rpb24gcm91dGVJbnRlcnNlY3Rpb24oYTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgYjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAgIGxldCBbYVN0YXJ0LCBhRW5kXSA9IGEgfHwgRlVMTF9ST1VURTtcbiAgICBsZXQgW2JTdGFydCwgYkVuZF0gPSBiIHx8IEZVTExfUk9VVEU7XG4gICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoYVN0YXJ0LCBiU3RhcnQpO1xuICAgIGxldCBlbmQgPSBNYXRoLm1pbihhRW5kLCBiRW5kKTtcbiAgICBpZiAoc3RhcnQgPj0gZW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBbc3RhcnQsIGVuZF07XG59XG5cbi8vIEEgbWlzc2luZyB2ZXJzaW9uIGNvdW50cyBhcyAtMSwgc28gYW55IGV4cGxpY2l0bHkgdmVyc2lvbmVkIGNvbmZpZyBiZWF0cyBhbiB1bnZlcnNpb25lZCBvbmVcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdWZXJzaW9uKGNvbmZpZzogUmVtb3RlQ29uZmlnKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29uZmlnLnZlcnNpb24gPz8gLTE7XG59XG5cbi8qKiBTdHJpcHMgdGhlIHJvdXRpbmctZmlsZSBzdWZmaXgsIGxlYXZpbmcgdGhlIGJ1Y2tldCdzIHB1YmxpYyBiYXNlIFVSTCAoZmlsZSBwYXRocyBhcHBlbmQgdG8gaXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1Y2tldEJhc2VVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsLmVuZHNXaXRoKFJPVVRJTkdfU1VGRklYKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgYnVja2V0IHJvdXRpbmcgVVJMIGVuZGluZyB3aXRoICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19TVUZGSVgpfSwgd2FzICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHVybC5zbGljZSgwLCAtUk9VVElOR19TVUZGSVgubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsZVVybChiYXNlVXJsOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBiYXNlVXJsICsgXCIvXCIgKyBmaWxlUGF0aC5zcGxpdChcIi9cIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG59XG5cbi8vIEV4OiBodHRwczovL3N0b3JhZ2UyLnZpZGdyaWR3ZWIuY29tOjQ0NDUvZmlsZS9leGFtcGxlYWNjb3VudC9leGFtcGxlYnVja2V0L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSG9zdGVkVXJsKHVybDogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlcjsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSB7XG4gICAgbGV0IGJhc2UgPSBnZXRCdWNrZXRCYXNlVXJsKHVybCk7XG4gICAgbGV0IHUgPSBuZXcgVVJMKGJhc2UpO1xuICAgIGlmICh1LnByb3RvY29sICE9PSBcImh0dHBzOlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBVUkwgbXVzdCB1c2UgaHR0cHMsIGdvdCAke0pTT04uc3RyaW5naWZ5KHUucHJvdG9jb2wpfSBpbiAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIGxldCBwYXJ0cyA9IHUucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcih4ID0+IHgpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09IFwiZmlsZVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBob3N0ZWQgYnVja2V0IFVSTCBsaWtlIGh0dHBzOi8vaG9zdDpwb3J0L2ZpbGUvPGFjY291bnQ+LzxidWNrZXROYW1lPiR7Uk9VVElOR19TVUZGSVh9LCB3YXMgJHtKU09OLnN0cmluZ2lmeSh1cmwpfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBhZGRyZXNzOiB1Lmhvc3RuYW1lLCBwb3J0OiArdS5wb3J0IHx8IDQ0MywgYWNjb3VudDogZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzFdKSwgYnVja2V0TmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzJdKSB9O1xufVxuXG4vLyBFeDogaHR0cHM6Ly9mMDAyLmJhY2tibGF6ZWIyLmNvbS9maWxlL3F1ZXJ5c3VidGVzdC1jb20tcHVibGljLWltbXV0YWJsZS9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb25cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJhY2tibGF6ZVVybCh1cmw6IHN0cmluZyk6IHsgYnVja2V0TmFtZTogc3RyaW5nIH0ge1xuICAgIGxldCBiYXNlID0gZ2V0QnVja2V0QmFzZVVybCh1cmwpO1xuICAgIGxldCB1ID0gbmV3IFVSTChiYXNlKTtcbiAgICBsZXQgcGFydHMgPSB1LnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoeCA9PiB4KTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSBcImZpbGVcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgYmFja2JsYXplIGJ1Y2tldCBVUkwgbGlrZSBodHRwczovL2YwMDIuYmFja2JsYXplYjIuY29tL2ZpbGUvPGJ1Y2tldE5hbWU+JHtST1VUSU5HX1NVRkZJWH0sIHdhcyAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGJ1Y2tldE5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1sxXSkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNvdXJjZShzb3VyY2U6IFJlbW90ZUNvbmZpZ0Jhc2UpOiBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWcge1xuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGxldCB3aW5kb3cgPSBzb3VyY2UudmFsaWRXaW5kb3c7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh3aW5kb3cpIHx8IHdpbmRvdy5sZW5ndGggIT09IDIgfHwgIXdpbmRvdy5ldmVyeSh4ID0+IHR5cGVvZiB4ID09PSBcIm51bWJlclwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPYmplY3Qgc291cmNlIGNvbmZpZ3MgbXVzdCBzcGVjaWZ5IHZhbGlkV2luZG93IChbc3RhcnRNcywgZW5kTXNdIG9mIHRoZSB3cml0ZSB0aW1lcyB0aGUgc291cmNlIGlzIHZhbGlkIGZvcikgLSBjb25maWd1cmF0aW9uIGNoYW5nZXMgbXVzdCBiZSBzY2hlZHVsZWQsIG5vdCBmbGlwcGVkIGluc3RhbnRseS4gVXNlIEZVTExfVkFMSURfV0lORE9XIHdoZW4gdGhlIHNvdXJjZSBpcyBhbHdheXMgdmFsaWQuIFdhcyAke0pTT04uc3RyaW5naWZ5KHdpbmRvdyl9IG9uICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKS5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3V0ZSA9IHNvdXJjZS5yb3V0ZTtcbiAgICAgICAgaWYgKHJvdXRlICE9PSB1bmRlZmluZWQgJiYgKCFBcnJheS5pc0FycmF5KHJvdXRlKSB8fCByb3V0ZS5sZW5ndGggIT09IDIgfHwgIXJvdXRlLmV2ZXJ5KHggPT4gdHlwZW9mIHggPT09IFwibnVtYmVyXCIpIHx8IHJvdXRlWzBdIDwgMCB8fCByb3V0ZVsxXSA+IDEgfHwgcm91dGVbMF0gPj0gcm91dGVbMV0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSByb3V0ZSBtdXN0IGJlIGEgW3N0YXJ0LCBlbmQpIGZyYWN0aW9uIHJhbmdlIHdpdGhpbiBbMCwgMV0gd2l0aCBzdGFydCA8IGVuZCwgd2FzICR7SlNPTi5zdHJpbmdpZnkocm91dGUpfSBvbiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSkuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlLnJlYWRlckRpc2tMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZS5yZWFkZXJEaXNrTGltaXQgIT09IFwibnVtYmVyXCIgfHwgc291cmNlLnJlYWRlckRpc2tMaW1pdCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGByZWFkZXJEaXNrTGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIGJ5dGUgY291bnQsIHdhcyAke0pTT04uc3RyaW5naWZ5KHNvdXJjZS5yZWFkZXJEaXNrTGltaXQpfSBvbiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSkuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc291cmNlLm5vRnVsbFN5bmMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlYWRlckRpc2tMaW1pdCByZXF1aXJlcyBub0Z1bGxTeW5jOiBhIGZ1bGwgY29weSBjYW5ub3QgYmUgYm91bmRlZCwgb25seSBhIHJlYWQgY2FjaGUgY2FuLiBPbiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSkuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09IFwicmVtb3RlXCIpIHtcbiAgICAgICAgICAgIC8vIFRocm93cyBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCwgc28gYmFkIGNvbmZpZ3MgYXJlIHJlamVjdGVkIGJlZm9yZSB0aGV5J3JlIHN0b3JlZFxuICAgICAgICAgICAgcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9XG4gICAgbGV0IGhvc3RuYW1lID0gbmV3IFVSTChzb3VyY2UpLmhvc3RuYW1lO1xuICAgIGlmIChob3N0bmFtZS5lbmRzV2l0aChcIi5iYWNrYmxhemViMi5jb21cIikpIHtcbiAgICAgICAgLy8gVmFsaWRhdGVzIHRoZSBVUkwgKHRocm93cyBvbiBtYWxmb3JtZWQpIGJlZm9yZSBpdCdzIHN0b3JlZDsgdGhlIGJ1Y2tldCBuYW1lIGlzIHJlYWQgYmFja1xuICAgICAgICAvLyBvdXQgb2YgdGhlIFVSTCBhdCB1c2Ugc2l0ZXMsIG5ldmVyIHN0b3JlZCBvbiB0aGUgY29uZmlnLlxuICAgICAgICBwYXJzZUJhY2tibGF6ZVVybChzb3VyY2UpO1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcImJhY2tibGF6ZVwiLCB1cmw6IHNvdXJjZSwgdmFsaWRXaW5kb3c6IEZVTExfVkFMSURfV0lORE9XIH07XG4gICAgfVxuICAgIHBhcnNlSG9zdGVkVXJsKHNvdXJjZSk7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJyZW1vdGVcIiwgdXJsOiBzb3VyY2UsIHZhbGlkV2luZG93OiBGVUxMX1ZBTElEX1dJTkRPVyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmVtb3RlQ29uZmlnKGNvbmZpZzogUmVtb3RlQ29uZmlnIHwgUmVtb3RlQ29uZmlnQmFzZSk6IFJlbW90ZUNvbmZpZyB7XG4gICAgbGV0IHJlc3VsdDogUmVtb3RlQ29uZmlnO1xuICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSBcInN0cmluZ1wiICYmIFwic291cmNlc1wiIGluIGNvbmZpZykge1xuICAgICAgICByZXN1bHQgPSB7IHZlcnNpb246IGNvbmZpZy52ZXJzaW9uLCBzb3VyY2VzOiBjb25maWcuc291cmNlcy5tYXAobm9ybWFsaXplU291cmNlKSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHsgc291cmNlczogW25vcm1hbGl6ZVNvdXJjZShjb25maWcpXSB9O1xuICAgIH1cbiAgICAvLyBNaXhlZCBpbW11dGFiaWxpdHkgbWFrZXMgbm8gc2Vuc2UgQU1PTkcgc291cmNlcyB2YWxpZCBhdCB0aGUgc2FtZSB0aW1lOiBhIG11dGFibGUgc291cmNlXG4gICAgLy8gd291bGQgYWNjZXB0IG92ZXJ3cml0ZXMgdGhhdCBpdHMgaW1tdXRhYmxlIHBlZXJzIHJlZnVzZSB0byBzeW5jaHJvbml6ZSwgZm9ya2luZyB0aGVpclxuICAgIC8vIGNvbnRlbnRzLiBTb3VyY2VzIGFyZSBncm91cGVkIGJ5IHRyYW5zaXRpdmVseSBvdmVybGFwcGluZyB2YWxpZCB3aW5kb3dzIChhYnNvcmIgZXZlcnl0aGluZ1xuICAgIC8vIG92ZXJsYXBwaW5nIHRoZSBncm91cCwgZXh0ZW5kIHRoZSBncm91cCdzIGVuZCwgcmVwZWF0KSAtIGEgc29mdCBjaGVjayB0aGF0IGlzIGNvcnJlY3QgYXNcbiAgICAvLyBsb25nIGFzIHdpbmRvd3MgaGF2ZSBjbGVhbiBicmVha3MgKGEgZ3JvdXAgZW5kcyBleGFjdGx5IHdoZXJlIHRoZSBuZXh0IGJlZ2lucykuXG4gICAgbGV0IHNvdXJjZXMgPSByZXN1bHQuc291cmNlcy5tYXAobm9ybWFsaXplU291cmNlKTtcbiAgICBsZXQgc29ydGVkID0gWy4uLnNvdXJjZXNdO1xuICAgIHNvcnQoc29ydGVkLCB4ID0+IHgudmFsaWRXaW5kb3dbMF0pO1xuICAgIGxldCBncm91cDogdHlwZW9mIHNvdXJjZXMgPSBbXTtcbiAgICBsZXQgZ3JvdXBFbmQgPSAwO1xuICAgIGZ1bmN0aW9uIGNoZWNrR3JvdXAoKSB7XG4gICAgICAgIGxldCBpbW11dGFibGVDb3VudCA9IGdyb3VwLmZpbHRlcih4ID0+IHguaW1tdXRhYmxlKS5sZW5ndGg7XG4gICAgICAgIGlmIChpbW11dGFibGVDb3VudCAmJiBpbW11dGFibGVDb3VudCAhPT0gZ3JvdXAubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZXMgd2l0aCBvdmVybGFwcGluZyB2YWxpZCB3aW5kb3dzIG11c3QgYWdyZWUgb24gaW1tdXRhYmlsaXR5OiAke2ltbXV0YWJsZUNvdW50fSBvZiAke2dyb3VwLmxlbmd0aH0gYXJlIGltbXV0YWJsZS4gU291cmNlczogJHtKU09OLnN0cmluZ2lmeShncm91cC5tYXAoeCA9PiAoeyB1cmw6IHgudXJsLCB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgaW1tdXRhYmxlOiAhIXguaW1tdXRhYmxlIH0pKSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHNvdXJjZXMgdmFsaWQgYXQgYW55IGluc3RhbnQgbXVzdCBjb3ZlciB0aGUgd2hvbGUga2V5IHNwYWNlLCBvciBrZXlzIHJvdXRpbmcgaW50byBhXG4gICAgICAgIC8vIGdhcCBjb3VsZCBuZXZlciBiZSByZWFkXG4gICAgICAgIGxldCByb3V0ZXMgPSBncm91cC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpO1xuICAgICAgICBzb3J0KHJvdXRlcywgeCA9PiB4WzBdKTtcbiAgICAgICAgbGV0IGNvdmVyZWQgPSAwO1xuICAgICAgICBmb3IgKGxldCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICAgICAgICAgIGlmIChyb3V0ZVswXSA+IGNvdmVyZWQpIGJyZWFrO1xuICAgICAgICAgICAgY292ZXJlZCA9IE1hdGgubWF4KGNvdmVyZWQsIHJvdXRlWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY292ZXJlZCA8IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlcyB3aXRoIG92ZXJsYXBwaW5nIHZhbGlkIHdpbmRvd3MgbXVzdCBjb3ZlciB0aGUgZnVsbCByb3V0ZSBzcGFjZSBbMCwgMSk7IGNvdmVyYWdlIHN0b3BzIGF0ICR7Y292ZXJlZH0uIFNvdXJjZXM6ICR7SlNPTi5zdHJpbmdpZnkoZ3JvdXAubWFwKHggPT4gKHsgdXJsOiB4LnVybCwgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc29ydGVkKSB7XG4gICAgICAgIGlmIChncm91cC5sZW5ndGggJiYgc291cmNlLnZhbGlkV2luZG93WzBdID49IGdyb3VwRW5kKSB7XG4gICAgICAgICAgICBjaGVja0dyb3VwKCk7XG4gICAgICAgICAgICBncm91cCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwLnB1c2goc291cmNlKTtcbiAgICAgICAgZ3JvdXBFbmQgPSBNYXRoLm1heChncm91cEVuZCwgc291cmNlLnZhbGlkV2luZG93WzFdKTtcbiAgICB9XG4gICAgY2hlY2tHcm91cCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJvdXRpbmdEYXRhKGRhdGE6IEJ1ZmZlcik6IFJlbW90ZUNvbmZpZyB7XG4gICAgbGV0IHRleHQgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgbGV0IHBhcnNlZDogUmVtb3RlQ29uZmlnO1xuICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCkgYXMgUmVtb3RlQ29uZmlnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyBpcyBub3QgdmFsaWQgSlNPTiAoJHtTdHJpbmcoZSl9KS4gRGF0YTogJHt0ZXh0LnNsaWNlKDAsIDUwMCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09IFwib2JqZWN0XCIgfHwgIUFycmF5LmlzQXJyYXkocGFyc2VkLnNvdXJjZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGluZyBjb25maWcgbXVzdCBiZSB7IHZlcnNpb24/LCBzb3VyY2VzOiBbLi4uXSB9LCB3YXMgJHt0ZXh0LnNsaWNlKDAsIDUwMCl9YCk7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVSZW1vdGVDb25maWcocGFyc2VkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyhjb25maWc6IFJlbW90ZUNvbmZpZyk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGNvbmZpZywgdW5kZWZpbmVkLCA0KSk7XG59XG4iXX0=
206
- /* _JS_SOURCE_HASH = "3a7b4001ca69930ddc2d211daa61b2c9ba6c78217ad2d7e2d7e5cd2ae549d03a"; */
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVtb3RlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBRTFCLG1EQUFrRTtBQUNsRSxtREFBd0Q7QUFDeEQsNENBQTRJO0FBRTVJLDBGQUEwRjtBQUMxRiwrRkFBK0Y7QUFDL0YsNkZBQTZGO0FBQzdGLHNCQUFzQjtBQUVULFFBQUEsWUFBWSxHQUFHLDZCQUE2QixDQUFDO0FBQzFELE1BQU0sY0FBYyxHQUFHLEdBQUcsR0FBRyxvQkFBWSxDQUFDO0FBRTFDLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRTNDLG9MQUFvTDtBQUNwTCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFXO0lBQzFDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsMEJBQWMsQ0FBQyxDQUFDO0lBQ3hDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ25DLElBQUksS0FBSyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRywwQkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDL0UsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFORCxnREFNQztBQUVELHdHQUF3RztBQUN4RyxTQUFnQixRQUFRLENBQUMsR0FBVztJQUNoQyxJQUFJLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QyxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDNUMsSUFBSSxJQUFJLEdBQUcsSUFBQSxtQkFBWSxFQUFDLElBQUEsdUJBQWdC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QUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBN0NELHNEQTZDQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLElBQVk7SUFDekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLElBQUksTUFBb0IsQ0FBQztJQUN6QixJQUFJLENBQUM7UUFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQWlCLENBQUM7SUFDOUMsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDMUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFDRCxPQUFPLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFaRCw0Q0FZQztBQUVELFNBQWdCLHFCQUFxQixDQUFDLE1BQW9CO0lBQ3RELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuXG5pbXBvcnQgeyBzb3J0LCBzaGEyNTZIYXNoQnVmZmVyIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZ2V0QnVmZmVySW50IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYml0c1wiO1xuaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBSZW1vdGVDb25maWdCYXNlLCBIb3N0ZWRDb25maWcsIEJhY2tibGF6ZUNvbmZpZywgRlVMTF9WQUxJRF9XSU5ET1csIEZVTExfUk9VVEUsIFZBUklBQkxFX1NIQVJEIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuXG4vLyBQYXJzaW5nIC8gbm9ybWFsaXphdGlvbiBvZiBSZW1vdGVDb25maWcgKHNlZSBJQXJjaGl2ZXMudHMpLiBFdmVyeSBidWNrZXQgc3RvcmVzIGl0cyBvd25cbi8vIGNvbmZpZ3VyYXRpb24gKGEgUmVtb3RlQ29uZmlnKSBpbnNpZGUgaXRzZWxmLCBhdCBST1VUSU5HX0ZJTEUuIFdyaXRpbmcgdGhhdCBmaWxlIGNyZWF0ZXMgdGhlXG4vLyBidWNrZXQgLyByZWNvbmZpZ3VyZXMgaXQgKHNlZSBzdG9yYWdlU2VydmVyU3RhdGUudHMpOyBjbGllbnRzIHJlY29uY2lsZSBpdCBieSB2ZXJzaW9uIChzZWVcbi8vIGNyZWF0ZUFyY2hpdmVzLnRzKS5cblxuZXhwb3J0IGNvbnN0IFJPVVRJTkdfRklMRSA9IFwic3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uXCI7XG5jb25zdCBST1VUSU5HX1NVRkZJWCA9IFwiL1wiICsgUk9VVElOR19GSUxFO1xuXG5jb25zdCBST1VURV9QUkVDSVNJT04gPSAxMDAwICogMTAwMCAqIDEwMDA7XG5cbi8qKiBUaGUgdmFyaWFibGUtc2hhcmQgcm91dGUgb3ZlcnJpZGUgZW1iZWRkZWQgaW4gdGhlIGtleSAoXCI8c2VudGluZWw+Xzx2YWx1ZT5cIiwgc2VlIFZBUklBQkxFX1NIQVJEKSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGtleSBoYXMgbm8gc2VudGluZWwgb3IgdGhlIHNlbnRpbmVsIGhhcyBubyB2YWx1ZSB5ZXQuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYXJpYWJsZVJvdXRlKGtleTogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaW5kZXggPSBrZXkuaW5kZXhPZihWQVJJQUJMRV9TSEFSRCk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBsZXQgbWF0Y2ggPSAvXl8oXFxkKyg/OlxcLlxcZCspPykvLmV4ZWMoa2V5LnNsaWNlKGluZGV4ICsgVkFSSUFCTEVfU0hBUkQubGVuZ3RoKSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gK21hdGNoWzFdO1xufVxuXG4vKiogV2hlcmUgYSBrZXkgcm91dGVzIGluIFswLCAxKS4gQSBtYXRlcmlhbGl6ZWQgdmFyaWFibGUtc2hhcmQgc3VmZml4IGNvbXBsZXRlbHkgb3ZlcnJpZGVzIHRoZSBoYXNoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdXRlKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgb3ZlcnJpZGUgPSBwYXJzZVZhcmlhYmxlUm91dGUoa2V5KTtcbiAgICBpZiAob3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG92ZXJyaWRlO1xuICAgIGxldCBoYXNoID0gZ2V0QnVmZmVySW50KHNoYTI1Nkhhc2hCdWZmZXIoa2V5KSk7XG4gICAgcmV0dXJuIGhhc2ggJSBST1VURV9QUkVDSVNJT04gLyBST1VURV9QUkVDSVNJT047XG59XG5cbi8vIFJvdXRlIHJhbmdlcyBhcmUgW3N0YXJ0LCBlbmQpIC0gaW5jbHVzaXZlIHN0YXJ0LCBleGNsdXNpdmUgZW5kXG5leHBvcnQgZnVuY3Rpb24gcm91dGVDb250YWlucyhyb3V0ZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgdmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghcm91dGUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiByb3V0ZVswXSA8PSB2YWx1ZSAmJiB2YWx1ZSA8IHJvdXRlWzFdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJvdXRlc092ZXJsYXAoYTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgYjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGxldCBbYVN0YXJ0LCBhRW5kXSA9IGEgfHwgRlVMTF9ST1VURTtcbiAgICBsZXQgW2JTdGFydCwgYkVuZF0gPSBiIHx8IEZVTExfUk9VVEU7XG4gICAgcmV0dXJuIGFTdGFydCA8IGJFbmQgJiYgYlN0YXJ0IDwgYUVuZDtcbn1cbi8qKiBUaGUgb3ZlcmxhcCBvZiB0d28gcm91dGUgcmFuZ2VzLCBvciB1bmRlZmluZWQgd2hlbiB0aGV5IGRvbid0IG92ZXJsYXAuICovXG5leHBvcnQgZnVuY3Rpb24gcm91dGVJbnRlcnNlY3Rpb24oYTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgYjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAgIGxldCBbYVN0YXJ0LCBhRW5kXSA9IGEgfHwgRlVMTF9ST1VURTtcbiAgICBsZXQgW2JTdGFydCwgYkVuZF0gPSBiIHx8IEZVTExfUk9VVEU7XG4gICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoYVN0YXJ0LCBiU3RhcnQpO1xuICAgIGxldCBlbmQgPSBNYXRoLm1pbihhRW5kLCBiRW5kKTtcbiAgICBpZiAoc3RhcnQgPj0gZW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBbc3RhcnQsIGVuZF07XG59XG5cbi8vIEEgbWlzc2luZyB2ZXJzaW9uIGNvdW50cyBhcyAtMSwgc28gYW55IGV4cGxpY2l0bHkgdmVyc2lvbmVkIGNvbmZpZyBiZWF0cyBhbiB1bnZlcnNpb25lZCBvbmVcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdWZXJzaW9uKGNvbmZpZzogUmVtb3RlQ29uZmlnKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29uZmlnLnZlcnNpb24gPz8gLTE7XG59XG5cbi8qKiBTdHJpcHMgdGhlIHJvdXRpbmctZmlsZSBzdWZmaXgsIGxlYXZpbmcgdGhlIGJ1Y2tldCdzIHB1YmxpYyBiYXNlIFVSTCAoZmlsZSBwYXRocyBhcHBlbmQgdG8gaXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1Y2tldEJhc2VVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsLmVuZHNXaXRoKFJPVVRJTkdfU1VGRklYKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgYnVja2V0IHJvdXRpbmcgVVJMIGVuZGluZyB3aXRoICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19TVUZGSVgpfSwgd2FzICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHVybC5zbGljZSgwLCAtUk9VVElOR19TVUZGSVgubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsZVVybChiYXNlVXJsOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBiYXNlVXJsICsgXCIvXCIgKyBmaWxlUGF0aC5zcGxpdChcIi9cIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG59XG5cbi8vIEV4OiBodHRwczovL3N0b3JhZ2UyLnZpZGdyaWR3ZWIuY29tOjQ0NDUvZmlsZS9leGFtcGxlYWNjb3VudC9leGFtcGxlYnVja2V0L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSG9zdGVkVXJsKHVybDogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlcjsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSB7XG4gICAgbGV0IGJhc2UgPSBnZXRCdWNrZXRCYXNlVXJsKHVybCk7XG4gICAgbGV0IHUgPSBuZXcgVVJMKGJhc2UpO1xuICAgIGlmICh1LnByb3RvY29sICE9PSBcImh0dHBzOlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBVUkwgbXVzdCB1c2UgaHR0cHMsIGdvdCAke0pTT04uc3RyaW5naWZ5KHUucHJvdG9jb2wpfSBpbiAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIGxldCBwYXJ0cyA9IHUucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcih4ID0+IHgpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09IFwiZmlsZVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBob3N0ZWQgYnVja2V0IFVSTCBsaWtlIGh0dHBzOi8vaG9zdDpwb3J0L2ZpbGUvPGFjY291bnQ+LzxidWNrZXROYW1lPiR7Uk9VVElOR19TVUZGSVh9LCB3YXMgJHtKU09OLnN0cmluZ2lmeSh1cmwpfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBhZGRyZXNzOiB1Lmhvc3RuYW1lLCBwb3J0OiArdS5wb3J0IHx8IDQ0MywgYWNjb3VudDogZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzFdKSwgYnVja2V0TmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzJdKSB9O1xufVxuXG4vLyBFeDogaHR0cHM6Ly9mMDAyLmJhY2tibGF6ZWIyLmNvbS9maWxlL3F1ZXJ5c3VidGVzdC1jb20tcHVibGljLWltbXV0YWJsZS9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb25cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJhY2tibGF6ZVVybCh1cmw6IHN0cmluZyk6IHsgYnVja2V0TmFtZTogc3RyaW5nIH0ge1xuICAgIGxldCBiYXNlID0gZ2V0QnVja2V0QmFzZVVybCh1cmwpO1xuICAgIGxldCB1ID0gbmV3IFVSTChiYXNlKTtcbiAgICBsZXQgcGFydHMgPSB1LnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoeCA9PiB4KTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSBcImZpbGVcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgYmFja2JsYXplIGJ1Y2tldCBVUkwgbGlrZSBodHRwczovL2YwMDIuYmFja2JsYXplYjIuY29tL2ZpbGUvPGJ1Y2tldE5hbWU+JHtST1VUSU5HX1NVRkZJWH0sIHdhcyAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGJ1Y2tldE5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1sxXSkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VIb3N0ZWRVcmxQb3J0KHVybDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGxldCB1ID0gbmV3IFVSTCh1cmwpO1xuICAgIHUucG9ydCA9IFN0cmluZyhwb3J0KTtcbiAgICByZXR1cm4gdS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU291cmNlKHNvdXJjZTogUmVtb3RlQ29uZmlnQmFzZSk6IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZyB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbGV0IHdpbmRvdyA9IHNvdXJjZS52YWxpZFdpbmRvdztcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHdpbmRvdykgfHwgd2luZG93Lmxlbmd0aCAhPT0gMiB8fCAhd2luZG93LmV2ZXJ5KHggPT4gdHlwZW9mIHggPT09IFwibnVtYmVyXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBzb3VyY2UgY29uZmlncyBtdXN0IHNwZWNpZnkgdmFsaWRXaW5kb3cgKFtzdGFydE1zLCBlbmRNc10gb2YgdGhlIHdyaXRlIHRpbWVzIHRoZSBzb3VyY2UgaXMgdmFsaWQgZm9yKSAtIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBtdXN0IGJlIHNjaGVkdWxlZCwgbm90IGZsaXBwZWQgaW5zdGFudGx5LiBVc2UgRlVMTF9WQUxJRF9XSU5ET1cgd2hlbiB0aGUgc291cmNlIGlzIGFsd2F5cyB2YWxpZC4gV2FzICR7SlNPTi5zdHJpbmdpZnkod2luZG93KX0gb24gJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpLnNsaWNlKDAsIDUwMCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvdXRlID0gc291cmNlLnJvdXRlO1xuICAgICAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCAmJiAoIUFycmF5LmlzQXJyYXkocm91dGUpIHx8IHJvdXRlLmxlbmd0aCAhPT0gMiB8fCAhcm91dGUuZXZlcnkoeCA9PiB0eXBlb2YgeCA9PT0gXCJudW1iZXJcIikgfHwgcm91dGVbMF0gPCAwIHx8IHJvdXRlWzFdID4gMSB8fCByb3V0ZVswXSA+PSByb3V0ZVsxXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIHJvdXRlIG11c3QgYmUgYSBbc3RhcnQsIGVuZCkgZnJhY3Rpb24gcmFuZ2Ugd2l0aGluIFswLCAxXSB3aXRoIHN0YXJ0IDwgZW5kLCB3YXMgJHtKU09OLnN0cmluZ2lmeShyb3V0ZSl9IG9uICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKS5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UucmVhZGVyRGlza0xpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlLnJlYWRlckRpc2tMaW1pdCAhPT0gXCJudW1iZXJcIiB8fCBzb3VyY2UucmVhZGVyRGlza0xpbWl0IDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlYWRlckRpc2tMaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgYnl0ZSBjb3VudCwgd2FzICR7SlNPTi5zdHJpbmdpZnkoc291cmNlLnJlYWRlckRpc2tMaW1pdCl9IG9uICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKS5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzb3VyY2Uubm9GdWxsU3luYykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVhZGVyRGlza0xpbWl0IHJlcXVpcmVzIG5vRnVsbFN5bmM6IGEgZnVsbCBjb3B5IGNhbm5vdCBiZSBib3VuZGVkLCBvbmx5IGEgcmVhZCBjYWNoZSBjYW4uIE9uICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKS5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UudHlwZSA9PT0gXCJyZW1vdGVcIikge1xuICAgICAgICAgICAgLy8gVGhyb3dzIGlmIHRoZSBVUkwgaXMgbWFsZm9ybWVkLCBzbyBiYWQgY29uZmlncyBhcmUgcmVqZWN0ZWQgYmVmb3JlIHRoZXkncmUgc3RvcmVkXG4gICAgICAgICAgICBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgICBsZXQgaG9zdG5hbWUgPSBuZXcgVVJMKHNvdXJjZSkuaG9zdG5hbWU7XG4gICAgaWYgKGhvc3RuYW1lLmVuZHNXaXRoKFwiLmJhY2tibGF6ZWIyLmNvbVwiKSkge1xuICAgICAgICAvLyBWYWxpZGF0ZXMgdGhlIFVSTCAodGhyb3dzIG9uIG1hbGZvcm1lZCkgYmVmb3JlIGl0J3Mgc3RvcmVkOyB0aGUgYnVja2V0IG5hbWUgaXMgcmVhZCBiYWNrXG4gICAgICAgIC8vIG91dCBvZiB0aGUgVVJMIGF0IHVzZSBzaXRlcywgbmV2ZXIgc3RvcmVkIG9uIHRoZSBjb25maWcuXG4gICAgICAgIHBhcnNlQmFja2JsYXplVXJsKHNvdXJjZSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwiYmFja2JsYXplXCIsIHVybDogc291cmNlLCB2YWxpZFdpbmRvdzogRlVMTF9WQUxJRF9XSU5ET1cgfTtcbiAgICB9XG4gICAgcGFyc2VIb3N0ZWRVcmwoc291cmNlKTtcbiAgICByZXR1cm4geyB0eXBlOiBcInJlbW90ZVwiLCB1cmw6IHNvdXJjZSwgdmFsaWRXaW5kb3c6IEZVTExfVkFMSURfV0lORE9XIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZW1vdGVDb25maWcoY29uZmlnOiBSZW1vdGVDb25maWcgfCBSZW1vdGVDb25maWdCYXNlKTogUmVtb3RlQ29uZmlnIHtcbiAgICBsZXQgcmVzdWx0OiBSZW1vdGVDb25maWc7XG4gICAgaWYgKHR5cGVvZiBjb25maWcgIT09IFwic3RyaW5nXCIgJiYgXCJzb3VyY2VzXCIgaW4gY29uZmlnKSB7XG4gICAgICAgIHJlc3VsdCA9IHsgdmVyc2lvbjogY29uZmlnLnZlcnNpb24sIHNvdXJjZXM6IGNvbmZpZy5zb3VyY2VzLm1hcChub3JtYWxpemVTb3VyY2UpIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0geyBzb3VyY2VzOiBbbm9ybWFsaXplU291cmNlKGNvbmZpZyldIH07XG4gICAgfVxuICAgIC8vIE1peGVkIGltbXV0YWJpbGl0eSBtYWtlcyBubyBzZW5zZSBBTU9ORyBzb3VyY2VzIHZhbGlkIGF0IHRoZSBzYW1lIHRpbWU6IGEgbXV0YWJsZSBzb3VyY2VcbiAgICAvLyB3b3VsZCBhY2NlcHQgb3ZlcndyaXRlcyB0aGF0IGl0cyBpbW11dGFibGUgcGVlcnMgcmVmdXNlIHRvIHN5bmNocm9uaXplLCBmb3JraW5nIHRoZWlyXG4gICAgLy8gY29udGVudHMuIFNvdXJjZXMgYXJlIGdyb3VwZWQgYnkgdHJhbnNpdGl2ZWx5IG92ZXJsYXBwaW5nIHZhbGlkIHdpbmRvd3MgKGFic29yYiBldmVyeXRoaW5nXG4gICAgLy8gb3ZlcmxhcHBpbmcgdGhlIGdyb3VwLCBleHRlbmQgdGhlIGdyb3VwJ3MgZW5kLCByZXBlYXQpIC0gYSBzb2Z0IGNoZWNrIHRoYXQgaXMgY29ycmVjdCBhc1xuICAgIC8vIGxvbmcgYXMgd2luZG93cyBoYXZlIGNsZWFuIGJyZWFrcyAoYSBncm91cCBlbmRzIGV4YWN0bHkgd2hlcmUgdGhlIG5leHQgYmVnaW5zKS5cbiAgICBsZXQgc291cmNlcyA9IHJlc3VsdC5zb3VyY2VzLm1hcChub3JtYWxpemVTb3VyY2UpO1xuICAgIGxldCBzb3J0ZWQgPSBbLi4uc291cmNlc107XG4gICAgc29ydChzb3J0ZWQsIHggPT4geC52YWxpZFdpbmRvd1swXSk7XG4gICAgbGV0IGdyb3VwOiB0eXBlb2Ygc291cmNlcyA9IFtdO1xuICAgIGxldCBncm91cEVuZCA9IDA7XG4gICAgZnVuY3Rpb24gY2hlY2tHcm91cCgpIHtcbiAgICAgICAgbGV0IGltbXV0YWJsZUNvdW50ID0gZ3JvdXAuZmlsdGVyKHggPT4geC5pbW11dGFibGUpLmxlbmd0aDtcbiAgICAgICAgaWYgKGltbXV0YWJsZUNvdW50ICYmIGltbXV0YWJsZUNvdW50ICE9PSBncm91cC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlcyB3aXRoIG92ZXJsYXBwaW5nIHZhbGlkIHdpbmRvd3MgbXVzdCBhZ3JlZSBvbiBpbW11dGFiaWxpdHk6ICR7aW1tdXRhYmxlQ291bnR9IG9mICR7Z3JvdXAubGVuZ3RofSBhcmUgaW1tdXRhYmxlLiBTb3VyY2VzOiAke0pTT04uc3RyaW5naWZ5KGdyb3VwLm1hcCh4ID0+ICh7IHVybDogeC51cmwsIHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LCBpbW11dGFibGU6ICEheC5pbW11dGFibGUgfSkpKX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgc291cmNlcyB2YWxpZCBhdCBhbnkgaW5zdGFudCBtdXN0IGNvdmVyIHRoZSB3aG9sZSBrZXkgc3BhY2UsIG9yIGtleXMgcm91dGluZyBpbnRvIGFcbiAgICAgICAgLy8gZ2FwIGNvdWxkIG5ldmVyIGJlIHJlYWRcbiAgICAgICAgbGV0IHJvdXRlcyA9IGdyb3VwLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSk7XG4gICAgICAgIHNvcnQocm91dGVzLCB4ID0+IHhbMF0pO1xuICAgICAgICBsZXQgY292ZXJlZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgICAgICAgICAgaWYgKHJvdXRlWzBdID4gY292ZXJlZCkgYnJlYWs7XG4gICAgICAgICAgICBjb3ZlcmVkID0gTWF0aC5tYXgoY292ZXJlZCwgcm91dGVbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3ZlcmVkIDwgMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2VzIHdpdGggb3ZlcmxhcHBpbmcgdmFsaWQgd2luZG93cyBtdXN0IGNvdmVyIHRoZSBmdWxsIHJvdXRlIHNwYWNlIFswLCAxKTsgY292ZXJhZ2Ugc3RvcHMgYXQgJHtjb3ZlcmVkfS4gU291cmNlczogJHtKU09OLnN0cmluZ2lmeShncm91cC5tYXAoeCA9PiAoeyB1cmw6IHgudXJsLCB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgcm91dGU6IHgucm91dGUgfHwgRlVMTF9ST1VURSB9KSkpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3J0ZWQpIHtcbiAgICAgICAgaWYgKGdyb3VwLmxlbmd0aCAmJiBzb3VyY2UudmFsaWRXaW5kb3dbMF0gPj0gZ3JvdXBFbmQpIHtcbiAgICAgICAgICAgIGNoZWNrR3JvdXAoKTtcbiAgICAgICAgICAgIGdyb3VwID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAucHVzaChzb3VyY2UpO1xuICAgICAgICBncm91cEVuZCA9IE1hdGgubWF4KGdyb3VwRW5kLCBzb3VyY2UudmFsaWRXaW5kb3dbMV0pO1xuICAgIH1cbiAgICBjaGVja0dyb3VwKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUm91dGluZ0RhdGEoZGF0YTogQnVmZmVyKTogUmVtb3RlQ29uZmlnIHtcbiAgICBsZXQgdGV4dCA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICBsZXQgcGFyc2VkOiBSZW1vdGVDb25maWc7XG4gICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KSBhcyBSZW1vdGVDb25maWc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdXRpbmcgY29uZmlnIGlzIG5vdCB2YWxpZCBKU09OICgke1N0cmluZyhlKX0pLiBEYXRhOiAke3RleHQuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gXCJvYmplY3RcIiB8fCAhQXJyYXkuaXNBcnJheShwYXJzZWQuc291cmNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyBtdXN0IGJlIHsgdmVyc2lvbj8sIHNvdXJjZXM6IFsuLi5dIH0sIHdhcyAke3RleHQuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZyhwYXJzZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUmVtb3RlQ29uZmlnKGNvbmZpZzogUmVtb3RlQ29uZmlnKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoY29uZmlnLCB1bmRlZmluZWQsIDQpKTtcbn1cbiJdfQ==
212
+ /* _JS_SOURCE_HASH = "74b88ee67a0e83e047adda50a28b23d34b59b4a31e42c9153d90a6d3f6b03a5a"; */