sliftutils 1.7.107 → 1.7.108

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/index.d.ts CHANGED
@@ -2855,16 +2855,13 @@ declare module "sliftutils/storage/TransactionStorage" {
2855
2855
 
2856
2856
  declare module "sliftutils/storage/archiveHelpers" {
2857
2857
  import type { IArchives } from "./IArchives";
2858
- /** Copies one file between two archives. Small files go as a single get2+set; past LARGE_COPY_THRESHOLD the copy streams through setLargeFile in LARGE_COPY_CHUNK ranged reads, so the whole file is never in memory. Returns the copied file's info, or undefined when the source doesn't have the file. */
2858
+ /** Copies one file between two archives. The source's CURRENT size and write time always come from getInfo right here - callers never supply them, because a stale size turns into ranged reads of a file that has changed (failing forever), and a stale write time re-orders history. Small files go as a single get2+set; past LARGE_COPY_THRESHOLD the copy streams through setLargeFile in LARGE_COPY_CHUNK ranged reads, so the whole file is never in memory. Returns the copied file's info, or undefined when the source doesn't have the file. */
2859
2859
  export declare function copyArchiveFile(config: {
2860
2860
  from: IArchives;
2861
2861
  to: IArchives;
2862
2862
  path: string;
2863
2863
  /** The path at the destination - defaults to path (the common case: the same key moving between two archives). */
2864
2864
  toPath?: string;
2865
- size?: number;
2866
- /** Stamps the destination write with this time INSTEAD of now - which makes the copy lose (silently) to anything newer at the destination, tombstones included. That is exactly right for synchronization, which copies the same key between replicas and must preserve its ordering, and exactly wrong for anything else - so omit it unless the destination is another copy of the same key. */
2867
- writeTime?: number;
2868
2865
  forceSetImmutable?: boolean;
2869
2866
  noChecks?: boolean;
2870
2867
  internal?: boolean;
@@ -4571,7 +4568,7 @@ declare module "sliftutils/storage/remoteStorage/storageLogs" {
4571
4568
  /// <reference types="node" />
4572
4569
  import { LogFileInfo } from "../StreamingLogs";
4573
4570
  export declare const LOGS_FOLDER_NAME = "logs";
4574
- /** One mutation the server performed: set/del/move/undelete/setLarge/routingConfig, plus the per-file synchronization writes ("sync get"/"sync set"). Sizes and times, never the data. internal marks writes pushed by a peer's synchronization rather than a client. Also printed to the console. */
4571
+ /** One mutation the server performed: set/del/move/undelete/setLarge/routingConfig, plus the per-file synchronization writes ("sync get"/"sync set"). Sizes and times, never the data. internal marks writes pushed by a peer's synchronization rather than a client. Stream-only - one entry per write is exactly what the console does NOT need. */
4575
4572
  export declare function logMutation(entry: {
4576
4573
  op: string;
4577
4574
  account: string;
@@ -4830,7 +4827,7 @@ declare module "sliftutils/storage/remoteStorage/storeSync" {
4830
4827
  since: number;
4831
4828
  route?: [number, number];
4832
4829
  }): Promise<void>;
4833
- private runSourceSync;
4830
+ private startSourceSyncLoops;
4834
4831
  private pullSource;
4835
4832
  private pushSource;
4836
4833
  private updateScanIndex;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliftutils",
3
- "version": "1.7.107",
3
+ "version": "1.7.108",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -1,14 +1,11 @@
1
1
  import type { IArchives } from "./IArchives";
2
- /** Copies one file between two archives. Small files go as a single get2+set; past LARGE_COPY_THRESHOLD the copy streams through setLargeFile in LARGE_COPY_CHUNK ranged reads, so the whole file is never in memory. Returns the copied file's info, or undefined when the source doesn't have the file. */
2
+ /** Copies one file between two archives. The source's CURRENT size and write time always come from getInfo right here - callers never supply them, because a stale size turns into ranged reads of a file that has changed (failing forever), and a stale write time re-orders history. Small files go as a single get2+set; past LARGE_COPY_THRESHOLD the copy streams through setLargeFile in LARGE_COPY_CHUNK ranged reads, so the whole file is never in memory. Returns the copied file's info, or undefined when the source doesn't have the file. */
3
3
  export declare function copyArchiveFile(config: {
4
4
  from: IArchives;
5
5
  to: IArchives;
6
6
  path: string;
7
7
  /** The path at the destination - defaults to path (the common case: the same key moving between two archives). */
8
8
  toPath?: string;
9
- size?: number;
10
- /** Stamps the destination write with this time INSTEAD of now - which makes the copy lose (silently) to anything newer at the destination, tombstones included. That is exactly right for synchronization, which copies the same key between replicas and must preserve its ordering, and exactly wrong for anything else - so omit it unless the destination is another copy of the same key. */
11
- writeTime?: number;
12
9
  forceSetImmutable?: boolean;
13
10
  noChecks?: boolean;
14
11
  internal?: boolean;
@@ -6,17 +6,13 @@ import type { IArchives } from "./IArchives";
6
6
  const LARGE_COPY_THRESHOLD = 64 * 1024 * 1024;
7
7
  const LARGE_COPY_CHUNK = 32 * 1024 * 1024;
8
8
 
9
- /** Copies one file between two archives. Small files go as a single get2+set; past LARGE_COPY_THRESHOLD the copy streams through setLargeFile in LARGE_COPY_CHUNK ranged reads, so the whole file is never in memory. Returns the copied file's info, or undefined when the source doesn't have the file. */
9
+ /** Copies one file between two archives. The source's CURRENT size and write time always come from getInfo right here - callers never supply them, because a stale size turns into ranged reads of a file that has changed (failing forever), and a stale write time re-orders history. Small files go as a single get2+set; past LARGE_COPY_THRESHOLD the copy streams through setLargeFile in LARGE_COPY_CHUNK ranged reads, so the whole file is never in memory. Returns the copied file's info, or undefined when the source doesn't have the file. */
10
10
  export async function copyArchiveFile(config: {
11
11
  from: IArchives;
12
12
  to: IArchives;
13
13
  path: string;
14
14
  /** The path at the destination - defaults to path (the common case: the same key moving between two archives). */
15
15
  toPath?: string;
16
- // From the caller's metadata scan; getInfo fills it in when omitted
17
- size?: number;
18
- /** Stamps the destination write with this time INSTEAD of now - which makes the copy lose (silently) to anything newer at the destination, tombstones included. That is exactly right for synchronization, which copies the same key between replicas and must preserve its ordering, and exactly wrong for anything else - so omit it unless the destination is another copy of the same key. */
19
- writeTime?: number;
20
16
  forceSetImmutable?: boolean;
21
17
  noChecks?: boolean;
22
18
  internal?: boolean;
@@ -24,14 +20,11 @@ export async function copyArchiveFile(config: {
24
20
  }): Promise<{ writeTime: number; size: number } | undefined> {
25
21
  let { from, to, path } = config;
26
22
  let toPath = config.toPath || path;
27
- let size = config.size;
28
- if (size === undefined) {
29
- let info = await from.getInfo(path, { noFallbacks: config.noFallbacks });
30
- if (!info) return undefined;
31
- size = info.size;
32
- }
33
- // Preserving the source's stamp is ONLY for synchronization (copies of the same key between replicas, where the original ordering must survive propagation) - those callers pass writeTime explicitly. A plain copy is a NEW write and is stamped now: stamping it with the source's old time makes it LOSE to any newer write or tombstone at the destination, silently - move a file back to a folder it was deleted from and the copy is dropped, then the caller deletes the source, and the file is gone entirely.
34
- let writeTime = config.writeTime || Date.now();
23
+ let info = await from.getInfo(path, { noFallbacks: config.noFallbacks });
24
+ if (!info) return undefined;
25
+ let size = info.size;
26
+ // internal (synchronization between replicas of the same key) preserves the source's write time, so ordering survives propagation. A plain copy is a NEW write and is stamped now: the source's old stamp would make it LOSE to any newer write or tombstone at the destination, silently - move a file back to a folder it was deleted from and the copy is dropped, then the caller deletes the source, and the file is gone entirely.
27
+ let writeTime = config.internal && info.writeTime || Date.now();
35
28
  if (size <= LARGE_COPY_THRESHOLD) {
36
29
  let result = await from.get2(path, { internal: config.internal, noFallbacks: config.noFallbacks });
37
30
  // Empty counts as absent, never as content to copy: an empty file IS a deletion, set refuses empty buffers, and deletions travel through their own path (del / scan tombstones)
@@ -1,4 +1,4 @@
1
- "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
1
+ "use strict";
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
@@ -423,4 +423,4 @@ function applyFindInfoShape(files, prefix, config) {
423
423
  }
424
424
  exports.applyFindInfoShape = applyFindInfoShape;
425
425
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNEaXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQXJjaGl2ZXNEaXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIseURBQW1EO0FBQ25ELDJEQUErRDtBQUMvRCxtREFBbUU7QUFDbkUsMkNBQXNOO0FBQ3ROLCtEQUE2RDtBQUU3RCw0YkFBNGI7QUFFNWIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4Qyw2UEFBNlA7QUFDN1AsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBUXJELDhjQUE4YztBQUM5YyxNQUFNLGVBQWU7SUFNakI7UUFMUSxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFDakQsMERBQTBEO1FBQ2xELFFBQUcsR0FBa0IsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUcvQyxJQUFBLDBCQUFlLEVBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELCtFQUErRTtJQUN4RSxHQUFHLENBQUksUUFBZ0IsRUFBRSxHQUFxQjtRQUNqRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QiwyRkFBMkY7UUFDM0YsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FB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QUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxJQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQXJCRCxnREFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBzb3J0LCBiaW5hcnlTZWFyY2hCYXNpYyB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBEZWxDb25maWcsIEZpbmRDb25maWcsIEdldENvbmZpZywgR2V0SW5mb0NvbmZpZywgTW92ZUZpbGVDb25maWcsIFNldENvbmZpZywgU2V0TGFyZ2VGaWxlQ29uZmlnLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCB9IGZyb20gXCIuL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgZmlsdGVyQ2hhbmdlcyB9IGZyb20gXCIuL3JlbW90ZVN0b3JhZ2UvcmVtb3RlQ29uZmlnXCI7XG5cbi8vIFRoZSBiYXNlIGZpbGUtc3lzdGVtIElBcmNoaXZlczogc3RvcmFnZSBpcyBvbmUtdG8tb25lIHdpdGggdGhlIGZpbGUgc3lzdGVtLCBldmVyeSBrZXkgaXMgZXhhY3RseSBvbmUgcmVhbCBmaWxlIHVuZGVyIDxmb2xkZXI+L2ZpbGVzLCBzbyB0aGUgZmlsZSBzeXN0ZW0gaXRzZWxmIGlzIHRoZSBpbmRleC4gRmlsZSBoYW5kbGVzIGFyZSBjYWNoZWQgYW5kIHJldXNlZCwgYW5kIGNsb3NlZCBvbmNlIGlkbGUgKHNlZSBGaWxlSGFuZGxlQ2FjaGUpLiBBbGwgb3BlcmF0aW9ucyBvbiBhIGZpbGUgcnVuIGluIHNlcmlhbCwgc28gdGhleSBjYW4ndCBjb2xsaWRlIHdpdGggZWFjaCBvdGhlciBvciB3aXRoIGhhbmRsZSBjbG9zaW5nLiBVc2VkIGFzIHRoZSBkaXNrIHN5bmNocm9uaXphdGlvbiBzb3VyY2Ugb2YgQmxvYlN0b3JlIChzZWUgcmVtb3RlU3RvcmFnZS9ibG9iU3RvcmUudHMpLlxuXG5jb25zdCBIQU5ETEVfSURMRV9USU1FT1VUID0gMTAwMCAqIDYwO1xuY29uc3QgSEFORExFX1NXRUVQX0lOVEVSVkFMID0gMTAwMCAqIDE1O1xuLy8gVXBsb2FkIHRlbXAgZmlsZXMgYXJlIG9ubHkgZ2FyYmFnZSBvbmNlIHRoZXkgYXJlIGNsZWFybHkgYWJhbmRvbmVkLiBBbm90aGVyIHByb2Nlc3MgY2FuIHNoYXJlIG91ciBmb2xkZXIgKGV2ZXJ5IGRlcGxveSBvdmVybGFwIGRvZXMpLCBzbyBhIGZyZXNoIHRlbXAgZmlsZSBtYXkgYmUgSVRTIGluLXByb2dyZXNzIHVwbG9hZCAtIGRlbGV0aW5nIGl0IHdvdWxkIHNpbGVudGx5IHR1cm4gdGhhdCB1cGxvYWQgaW50byBhbiBlbXB0eSBmaWxlLlxuY29uc3QgVVBMT0FEX0FCQU5ET05FRF9BR0UgPSAxMDAwICogNjAgKiA2MCAqIDI0ICogMztcblxudHlwZSBIYW5kbGVFbnRyeSA9IHtcbiAgICBmaWxlUGF0aDogc3RyaW5nO1xuICAgIGhhbmRsZTogZnMucHJvbWlzZXMuRmlsZUhhbmRsZTtcbiAgICBsYXN0VXNlOiBudW1iZXI7XG59O1xuXG4vLyBDYWNoZXMgb3BlbiBmaWxlIGhhbmRsZXMsIGNsb3NpbmcgdGhlbSBvbmNlIGlkbGUgZm9yIEhBTkRMRV9JRExFX1RJTUVPVVQuIEluc3RlYWQgb2Ygb25lIHNldFRpbWVvdXQgcGVyIGhhbmRsZSwgYSBsaXN0IHNvcnRlZCBieSBsYXN0IHVzZSBpcyBzd2VwdCBwZXJpb2RpY2FsbHkgKGVudHJpZXMgYXJlIG1vdmVkIHZpYSBiaW5hcnkgc2VhcmNoIG9uIGFjY2VzcywgYW5kIGxhc3RVc2UgdmFsdWVzIG9ubHkgaW5jcmVhc2UsIHNvIHRvdWNoZWQgZW50cmllcyBhcHBlbmQgYXQgdGhlIGVuZCkuIEFsc28gc2VyaWFsaXplcyBvcGVyYXRpb25zIHBlciBmaWxlOiBlYWNoIG9wZXJhdGlvbiBvbmx5IHN0YXJ0cyBvbmNlIHRoZSBwcmV2aW91cyBvbmUgb24gdGhlIHNhbWUgZmlsZSBmaW5pc2hlZCwgYW5kIGEgaGFuZGxlIGlzIG5ldmVyIGNsb3NlZCB3aGlsZSBhbiBvcGVyYXRpb24gaXMgcGVuZGluZyBvbiBpdC5cbmNsYXNzIEZpbGVIYW5kbGVDYWNoZSB7XG4gICAgcHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEhhbmRsZUVudHJ5PigpO1xuICAgIC8vIFNvcnRlZCBieSBsYXN0VXNlIGFzY2VuZGluZyAobGVhc3QgcmVjZW50bHkgdXNlZCBmaXJzdClcbiAgICBwcml2YXRlIGxydTogSGFuZGxlRW50cnlbXSA9IFtdO1xuICAgIHByaXZhdGUgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChIQU5ETEVfU1dFRVBfSU5URVJWQUwsICgpID0+IHRoaXMuc3dlZXAoKSk7XG4gICAgfVxuXG4gICAgLy8gUnVucyBmbmMgYWZ0ZXIgZXZlcnkgcHJldmlvdXNseSBzY2hlZHVsZWQgb3BlcmF0aW9uIG9uIGZpbGVQYXRoIGhhcyBmaW5pc2hlZFxuICAgIHB1YmxpYyBydW48VD4oZmlsZVBhdGg6IHN0cmluZywgZm5jOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5wZW5kaW5nLmdldChmaWxlUGF0aCkgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBwcmV2LnRoZW4oZm5jKTtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgY2hhaW4gbXVzdCBuZXZlciByZWplY3QsIG9yIG9uZSBmYWlsZWQgb3BlcmF0aW9uIHdvdWxkIHBvaXNvbiBhbGwgbGF0ZXIgb25lc1xuICAgICAgICBsZXQgbGFzdCA9IHJlc3VsdC50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nLnNldChmaWxlUGF0aCwgbGFzdCk7XG4gICAgICAgIHZvaWQgbGFzdC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHN0aWxsIHRoZSBsYXN0IHBlbmRpbmcgb3BlcmF0aW9uIG9uIHRoaXMgZmlsZSwgY2xlYXIgb3Vyc2VsdmVzXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nLmdldChmaWxlUGF0aCkgPT09IGxhc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gT25seSBjYWxsIGluc2lkZSBydW4oKSBmb3IgdGhlIHNhbWUgZmlsZVBhdGggKHNvIG9wZW5zIGNhbid0IGNvbGxpZGUgd2l0aCBjbG9zZXMpXG4gICAgcHVibGljIGFzeW5jIGdldEhhbmRsZShmaWxlUGF0aDogc3RyaW5nLCBmbGFnczogbnVtYmVyKTogUHJvbWlzZTxmcy5wcm9taXNlcy5GaWxlSGFuZGxlPiB7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbUxSVShlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeS5sYXN0VXNlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRoaXMubHJ1LnB1c2goZW50cnkpO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmhhbmRsZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgZnMucHJvbWlzZXMub3BlbihmaWxlUGF0aCwgZmxhZ3MpO1xuICAgICAgICBlbnRyeSA9IHsgZmlsZVBhdGgsIGhhbmRsZSwgbGFzdFVzZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGZpbGVQYXRoLCBlbnRyeSk7XG4gICAgICAgIHRoaXMubHJ1LnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgIH1cblxuICAgIC8vIE9ubHkgY2FsbCBpbnNpZGUgcnVuKCkgZm9yIHRoZSBzYW1lIGZpbGVQYXRoXG4gICAgcHVibGljIGFzeW5jIGNsb3NlTm93KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChmaWxlUGF0aCk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybjtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShmaWxlUGF0aCk7XG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbUxSVShlbnRyeSk7XG4gICAgICAgIGF3YWl0IGVudHJ5LmhhbmRsZS5jbG9zZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlRnJvbUxSVShlbnRyeTogSGFuZGxlRW50cnkpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gYmluYXJ5U2VhcmNoQmFzaWModGhpcy5scnUsIHggPT4geC5sYXN0VXNlLCBlbnRyeS5sYXN0VXNlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgICAgICAvLyBNdWx0aXBsZSBlbnRyaWVzIGNhbiBzaGFyZSBhIGxhc3RVc2UsIHNvIHNjYW4gZm9yIHRoZSBleGFjdCBvbmVcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgdGhpcy5scnUubGVuZ3RoICYmIHRoaXMubHJ1W2luZGV4XS5sYXN0VXNlID09PSBlbnRyeS5sYXN0VXNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5scnVbaW5kZXhdID09PSBlbnRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMubHJ1LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3dlZXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gSEFORExFX0lETEVfVElNRU9VVDtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgdGhpcy5scnUubGVuZ3RoICYmIHRoaXMubHJ1W2luZGV4XS5sYXN0VXNlIDw9IGN1dG9mZikge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5scnVbaW5kZXhdO1xuICAgICAgICAgICAgLy8gQ2FuJ3QgY2xvc2UgYSBoYW5kbGUgd2l0aCBhIHBlbmRpbmcgb3BlcmF0aW9uOyBpdCdsbCBiZSBzd2VwdCBhZnRlciBpdCBmaW5pc2hlc1xuICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZy5oYXMoZW50cnkuZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubHJ1LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGVudHJ5LmZpbGVQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IGVudHJ5LmhhbmRsZS5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJjaGl2ZXNEaXNrIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvbGRlcjogc3RyaW5nKSB7IH1cblxuICAgIHByaXZhdGUgZmlsZXNEaXIgPSBwYXRoLmpvaW4odGhpcy5mb2xkZXIsIFwiZmlsZXNcIik7XG4gICAgcHJpdmF0ZSB1cGxvYWRzRGlyID0gcGF0aC5qb2luKHRoaXMuZm9sZGVyLCBcInVwbG9hZHNcIik7XG4gICAgcHJpdmF0ZSBoYW5kbGVzID0gbmV3IEZpbGVIYW5kbGVDYWNoZSgpO1xuICAgIHByaXZhdGUgbGFyZ2VVcGxvYWRzID0gbmV3IE1hcDxzdHJpbmcsIHsgdG1wUGF0aDogc3RyaW5nIH0+KCk7XG4gICAgcHJpdmF0ZSBuZXh0TGFyZ2VVcGxvYWRJZCA9IDE7XG5cbiAgICBwdWJsaWMgaW5pdCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0aGlzLmZpbGVzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodGhpcy51cGxvYWRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgbGV0IGN1dG9mZiA9IERhdGUubm93KCkgLSBVUExPQURfQUJBTkRPTkVEX0FHRTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRoaXMudXBsb2Fkc0RpcikpIHtcbiAgICAgICAgICAgIGxldCB1cGxvYWRQYXRoID0gcGF0aC5qb2luKHRoaXMudXBsb2Fkc0RpciwgZmlsZSk7XG4gICAgICAgICAgICAvLyBUaGUgbXRpbWUgYWR2YW5jZXMgb24gZXZlcnkgYXBwZW5kLCBzbyBhbiBhY3RpdmUgdXBsb2FkIChldmVuIGFub3RoZXIgcHJvY2VzcydzKSBhbHdheXMgbG9va3MgZnJlc2hcbiAgICAgICAgICAgIGxldCBzdGF0cyA9IGF3YWl0IHN0YXRPclVuZGVmaW5lZCh1cGxvYWRQYXRoKTtcbiAgICAgICAgICAgIGlmICghc3RhdHMgfHwgc3RhdHMubXRpbWVNcyA+IGN1dG9mZikgY29udGludWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgYWJhbmRvbmVkIHVwbG9hZCB0ZW1wIGZpbGUgJHt1cGxvYWRQYXRofSAobGFzdCB3cml0dGVuICR7bmV3IERhdGUoc3RhdHMubXRpbWVNcykudG9JU09TdHJpbmcoKX0pYCk7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsodXBsb2FkUGF0aCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIHJldHVybiBgZGlzayAke3RoaXMuZm9sZGVyfWA7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgLy8gTm8gbmF0aXZlIGNoYW5nZSBmZWVkIC0gYSBmdWxsIGxpc3RpbmcgZmlsdGVyZWQgaW4gbWVtb3J5IChzZWUgdGhlIHNjYW5uaW5nIG5vdGUgaW4gU3RvcmVTeW5jLnB1bGxTb3VyY2UgZm9yIHdoeSB0aGUgbGlzdGluZyBpdHNlbGYgdGFrZXMgbm8gZmlsdGVycylcbiAgICAgICAgcmV0dXJuIGZpbHRlckNoYW5nZXMoYXdhaXQgdGhpcy5maW5kSW5mbyhcIlwiKSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsZVBhdGgoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmVzdWx0ID0gcGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIGtleSk7XG4gICAgICAgIGlmICghcmVzdWx0LnN0YXJ0c1dpdGgodGhpcy5maWxlc0RpciArIHBhdGguc2VwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSAke0pTT04uc3RyaW5naWZ5KGtleS5zbGljZSgwLCAyMDApKX0sIGl0IGVzY2FwZXMgdGhlIHN0b3JlIGZvbGRlcmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gZm9yY2VTZXRJbW11dGFibGUgaXMgYWNjZXB0ZWQgYW5kIG5lZWRzIG5vIGhhbmRsaW5nOiBkaXNrIHNvdXJjZXMgYXJlIG5ldmVyIGltbXV0YWJsZSwgYW5kIHRoZSBvbGRlci13cml0ZSBuby1vcCBiZWxvdyBhbHJlYWR5IGdpdmVzIHN5bmNocm9uaXphdGlvbiBpdHMgb25seS10YWtlLXRoZS1sYXRlc3Qgc2VtYW50aWNzXG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGtleSl9IG9uICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcgLSBjYWxsIGRlbCBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWQgPSBjb25maWc/Lmxhc3RNb2RpZmllZDtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KVxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBsYXN0TW9kaWZpZWQgPCBleGlzdGluZy5tdGltZU1zKSByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGxldCBoYW5kbGUgPSBhd2FpdCB0aGlzLmhhbmRsZXMuZ2V0SGFuZGxlKGZpbGVQYXRoLCBmcy5jb25zdGFudHMuT19SRFdSIHwgZnMuY29uc3RhbnRzLk9fQ1JFQVQpO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnRydW5jYXRlKDApO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLndyaXRlKGRhdGEsIDAsIGRhdGEubGVuZ3RoLCAwKTtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUudXRpbWVzKG5ldyBEYXRlKGxhc3RNb2RpZmllZCksIG5ldyBEYXRlKGxhc3RNb2RpZmllZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICAvLyBjb25maWcgaXMgYWNjZXB0ZWQgYW5kIGlnbm9yZWQ6IGEgZGlzayBkZWxldGlvbiBpcyBhIHBoeXNpY2FsIHJlbW92ZSAobm8gdG9tYnN0b25lIHRvIHN0YW1wIC0gQmxvYlN0b3JlJ3MgaW5kZXggY2FycmllcyB0aGUgdG9tYnN0b25lIGZvciBkaXNrIHNvdXJjZXMpXG4gICAgcHVibGljIGFzeW5jIGRlbChrZXk6IHN0cmluZywgY29uZmlnPzogRGVsQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZmlsZVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyhmaWxlUGF0aCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhmaWxlUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbW92ZShjb25maWc6IE1vdmVGaWxlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBjb25maWcudG9QYXRoKSByZXR1cm47XG4gICAgICAgIGxldCBmcm9tUGF0aCA9IHRoaXMuZmlsZVBhdGgoY29uZmlnLmZyb21QYXRoKTtcbiAgICAgICAgbGV0IHRvUGF0aCA9IHRoaXMuZmlsZVBhdGgoY29uZmlnLnRvUGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4oZnJvbVBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyhmcm9tUGF0aCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKHRvUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyh0b1BhdGgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZSh0b1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUoZnJvbVBhdGgsIHRvUGF0aCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgIT09IFwiRU5PRU5UXCIpIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfSBvbiAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiB0aGUgc291cmNlIGZpbGUgZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVGhlIHJlbmFtZSBwcmVzZXJ2ZXMgdGhlIG10aW1lLCBidXQgYSBtb3ZlIG11c3Qgc3RhbXAgRlJFU0ggKHNlZSBJQXJjaGl2ZXMubW92ZSkgLSB0aGUgb2xkIHN0YW1wIGlzIGhvdyBhIG1vdmVkIGZpbGUgbG9zZXMgdG8gYSBzdGFsZSB0b21ic3RvbmUgYXQgaXRzIG5ldyBwYXRoXG4gICAgICAgICAgICAgICAgbGV0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudXRpbWVzKHRvUGF0aCwgbm93LCBub3cpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoa2V5OiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoa2V5LCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihrZXk6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWc/LnJhbmdlO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlOiBmcy5wcm9taXNlcy5GaWxlSGFuZGxlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBoYW5kbGUgPSBhd2FpdCB0aGlzLmhhbmRsZXMuZ2V0SGFuZGxlKGZpbGVQYXRoLCBmcy5jb25zdGFudHMuT19SRFdSKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzdGF0cyA9IGF3YWl0IGhhbmRsZS5zdGF0KCk7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHN0YXRzLnNpemU7XG4gICAgICAgICAgICAvLyBBIHNpemUtMCBmaWxlIGlzIGEgdG9tYnN0b25lIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKSAtIGFic2VudCwgdW5sZXNzIHRoZSBjYWxsZXIgYXNrZWQgZm9yIHRvbWJzdG9uZXMuIFJhbmdlZCByZWFkcyBvZiBhIFJFQUwgZmlsZSBjYW4gc3RpbGwgbGVnaXRpbWF0ZWx5IHJldHVybiBubyBieXRlcyAocmFuZ2UgcGFzdCBFT0YsIGJlbG93KS5cbiAgICAgICAgICAgIGlmICghc2l6ZSAmJiAhY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHJhbmdlICYmIE1hdGgubWluKHJhbmdlLnN0YXJ0LCBzaXplKSB8fCAwO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHJhbmdlICYmIE1hdGgubWluKHJhbmdlLmVuZCwgc2l6ZSkgfHwgc2l6ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBzdGF0cy5tdGltZU1zLCBzaXplIH07XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gQnVmZmVyLmFsbG9jKGVuZCAtIHN0YXJ0KTtcbiAgICAgICAgICAgIGxldCB7IGJ5dGVzUmVhZCB9ID0gYXdhaXQgaGFuZGxlLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBzdGFydCk7XG4gICAgICAgICAgICBpZiAoYnl0ZXNSZWFkICE9PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2J1ZmZlci5sZW5ndGh9IGJ5dGVzIGF0ICR7ZmlsZVBhdGh9OiR7c3RhcnR9LCByZWFkICR7Ynl0ZXNSZWFkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogYnVmZmVyLCB3cml0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcsIGNvbmZpZz86IEdldEluZm9Db25maWcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoKGtleSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgaWYgKCFzdGF0cyB8fCAhc3RhdHMuaXNGaWxlKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIXN0YXRzLnNpemUgJiYgIWNvbmZpZz8uaW5jbHVkZVRvbWJzdG9uZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemU6IHN0YXRzLnNpemUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0RmlsZXMoXCJcIiwgcHJlZml4LCBpbmZvcyk7XG4gICAgICAgIGxldCBmaWxlcyA9IEFycmF5LmZyb20oaW5mb3MudmFsdWVzKCkpO1xuICAgICAgICBmaWxlcyA9IGFwcGx5RmluZEluZm9TaGFwZShmaWxlcywgcHJlZml4LCBjb25maWcpO1xuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICAvLyByZWxEaXIgaXMgXCJcIiBvciBlbmRzIHdpdGggXCIvXCIuIE9ubHkgZGVzY2VuZHMgaW50byBkaXJlY3RvcmllcyB0aGF0IGNhbiBzdGlsbCBtYXRjaCB0aGUgcHJlZml4LlxuICAgIHByaXZhdGUgYXN5bmMgY29sbGVjdEZpbGVzKHJlbERpcjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZywgaW5mb3M6IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIHJlbERpciksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGxldCByZWxQYXRoID0gcmVsRGlyICsgZW50cnkubmFtZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpclBhdGggPSByZWxQYXRoICsgXCIvXCI7XG4gICAgICAgICAgICAgICAgaWYgKGRpclBhdGguc3RhcnRzV2l0aChwcmVmaXgpIHx8IHByZWZpeC5zdGFydHNXaXRoKGRpclBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKGRpclBhdGgsIHByZWZpeCwgaW5mb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZW50cnkuaXNGaWxlKCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFyZWxQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc3RhdHMgPSBhd2FpdCBzdGF0T3JVbmRlZmluZWQocGF0aC5qb2luKHRoaXMuZmlsZXNEaXIsIHJlbFBhdGgpKTtcbiAgICAgICAgICAgIC8vIERlbGV0ZWQgd2hpbGUgd2Ugd2VyZSB3YWxraW5nXG4gICAgICAgICAgICBpZiAoIXN0YXRzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGluZm9zLnNldChyZWxQYXRoLCB7IHBhdGg6IHJlbFBhdGgsIGNyZWF0ZVRpbWU6IHN0YXRzLm10aW1lTXMsIHNpemU6IHN0YXRzLnNpemUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgcmF3IGRpc2sgaGFzIG5vIHdpbmRvd3MsIHJvdXRlcywgb3IgaW1tdXRhYmlsaXR5LCBzbyB0aGUgcmVzdCBvZiB0aGUgU2V0Q29uZmlnIGhhcyBub3RoaW5nIHRvIGFwcGx5IHRvIGhlcmUgKHRoZSBzdG9yZSB3cmFwcGluZyB0aGlzIGRpc2sgaXMgd2hhdCBlbmZvcmNlcyB0aGVtKVxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiBTZXRMYXJnZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgdGhpcy5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluaXNoTGFyZ2VVcGxvYWQoaWQsIGNvbmZpZy5wYXRoLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYW5jZWxMYXJnZVVwbG9hZChpZCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGFyZ2UgZmlsZXMgc3RyZWFtIGludG8gdGhlaXIgb3duIGZpbGUgdW5kZXIgdXBsb2Fkcy8sIHRoZW4gbW92ZSBpbnRvIHBsYWNlIG9uIGZpbmlzaC4gTm8gaGFuZGxlIGlzIG9wZW5lZCB1bnRpbCB0aGUgZmlyc3QgYXBwZW5kIGFjdHVhbGx5IGhhcHBlbnMuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0TGFyZ2VVcGxvYWQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBpZCA9IGAke0RhdGUubm93KCl9XyR7dGhpcy5uZXh0TGFyZ2VVcGxvYWRJZCsrfWA7XG4gICAgICAgIHRoaXMubGFyZ2VVcGxvYWRzLnNldChpZCwgeyB0bXBQYXRoOiBwYXRoLmpvaW4odGhpcy51cGxvYWRzRGlyLCBgdXBsb2FkXyR7aWR9LnRtcGApIH0pO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIC8qKiBvZmZzZXQgbWFrZXMgdGhlIHdyaXRlIFBPU0lUSU9OQUwgaW5zdGVhZCBvZiBhcHBlbmRpbmc6IGEgcmV0cmllZCBwYXJ0IGxhbmRzIGV4YWN0bHkgd2hlcmUgdGhlIGZhaWxlZCBhdHRlbXB0IHdvdWxkIGhhdmUsIHNvIHBhcnQgcmV0cmllcyBhcmUgaWRlbXBvdGVudC4gT25lIHVwbG9hZCBtdXN0IHVzZSBlaXRoZXIgYXBwZW5kcyBvciBvZmZzZXRzIHRocm91Z2hvdXQsIG5ldmVyIGJvdGggLSB0aGUgY2FjaGVkIGhhbmRsZSBrZWVwcyBpdHMgZmlyc3QgZmxhZ3MsIGFuZCBPX0FQUEVORCBpZ25vcmVzIHRoZSBwb3NpdGlvbiBhcmd1bWVudC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgYXBwZW5kTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywgZGF0YTogQnVmZmVyLCBvZmZzZXQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVwbG9hZCA9IHRoaXMubGFyZ2VVcGxvYWRzLmdldChpZCk7XG4gICAgICAgIGlmICghdXBsb2FkKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7aWR9YCk7XG4gICAgICAgIGNvbnN0IHRtcFBhdGggPSB1cGxvYWQudG1wUGF0aDtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bih0bXBQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZSh0bXBQYXRoLCBmcy5jb25zdGFudHMuT19XUk9OTFkgfCBmcy5jb25zdGFudHMuT19DUkVBVCB8IGZzLmNvbnN0YW50cy5PX0FQUEVORCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLndyaXRlKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gYXdhaXQgdGhpcy5oYW5kbGVzLmdldEhhbmRsZSh0bXBQYXRoLCBmcy5jb25zdGFudHMuT19XUk9OTFkgfCBmcy5jb25zdGFudHMuT19DUkVBVCk7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGUud3JpdGUoZGF0YSwgMCwgZGF0YS5sZW5ndGgsIG9mZnNldCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluaXNoTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGxhc3RNb2RpZmllZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgdXBsb2FkID0gdGhpcy5sYXJnZVVwbG9hZHMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCF1cGxvYWQpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsYXJnZSB1cGxvYWQgJHtpZH1gKTtcbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0bXBQYXRoID0gdXBsb2FkLnRtcFBhdGg7XG4gICAgICAgIHRoaXMubGFyZ2VVcGxvYWRzLmRlbGV0ZShpZCk7XG4gICAgICAgIGxldCBmaWxlUGF0aCA9IHRoaXMuZmlsZVBhdGgoa2V5KTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLnJ1bih0bXBQYXRoLCAoKSA9PiB0aGlzLmhhbmRsZXMuY2xvc2VOb3codG1wUGF0aCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXMucnVuKGZpbGVQYXRoLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBDbG9zZSBhbnkgY2FjaGVkIGhhbmRsZSB0byB0aGUgZmlsZSB3ZSdyZSByZXBsYWNpbmcsIHNvIGxhdGVyIHJlYWRzIHJlb3BlbiB0aGUgbmV3IGZpbGVcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5jbG9zZU5vdyhmaWxlUGF0aCk7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKHRtcFBhdGgsIGZpbGVQYXRoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgIT09IFwiRU5PRU5UXCIpIHRocm93IGU7XG4gICAgICAgICAgICAgICAgLy8gRWl0aGVyIG5vdGhpbmcgd2FzIGV2ZXIgYXBwZW5kZWQsIG9yIHRoZSB0ZW1wIGZpbGUgd2FzIGRlc3Ryb3llZCB1bmRlciB1cyAtIGJvdGggbXVzdCBmYWlsIGxvdWRseS4gTWF0ZXJpYWxpemluZyBhbiBlbXB0eSBmaWxlIGhlcmUgKHRoZSBvbGQgYmVoYXZpb3IpIHNpbGVudGx5IHR1cm5lZCB0aGUgdXBsb2FkIGludG8gYSBERUxFVElPTiwgc2luY2UgYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSBpbiB0aGlzIHN5c3RlbS5cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhcmdlIHVwbG9hZCBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IGhhcyBubyBkYXRhOiB0aGUgdXBsb2FkIHRlbXAgZmlsZSAke3RtcFBhdGh9IGRvZXMgbm90IGV4aXN0LiBFaXRoZXIgbm8gZGF0YSB3YXMgZXZlciBhcHBlbmRlZCAoZW1wdHkgZmlsZXMgYXJlIGZvcmJpZGRlbiAtIHRoZXkgcmVhZCBiYWNrIGFzIGRlbGV0aW9uczsgdXNlIGRlbCB0byBkZWxldGUpIG9yIHRoZSB0ZW1wIGZpbGUgd2FzIHJlbW92ZWQgd2hpbGUgdGhlIHVwbG9hZCB3YXMgcnVubmluZy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSByZW5hbWUgcHJlc2VydmVzIHRoZSB0ZW1wIGZpbGUncyBtdGltZSwgd2hpY2ggaXMganVzdCB3aGVuIHRoZSBsYXN0IGFwcGVuZCBoYXBwZW5lZCAtIHRoZSBsb2dpY2FsIHdyaXRlIHRpbWUgaGFzIHRvIGJlIHN0YW1wZWQgZXhwbGljaXRseSAoaXQgaXMgdGhlIG1ldGFkYXRhIHNjYW5zIG9yZGVyIGV2ZXJ5dGhpbmcgYnkpXG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudXRpbWVzKGZpbGVQYXRoLCBuZXcgRGF0ZShsYXN0TW9kaWZpZWQpLCBuZXcgRGF0ZShsYXN0TW9kaWZpZWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjYW5jZWxMYXJnZVVwbG9hZChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cGxvYWQgPSB0aGlzLmxhcmdlVXBsb2Fkcy5nZXQoaWQpO1xuICAgICAgICBpZiAoIXVwbG9hZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0bXBQYXRoID0gdXBsb2FkLnRtcFBhdGg7XG4gICAgICAgIHRoaXMubGFyZ2VVcGxvYWRzLmRlbGV0ZShpZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlcy5ydW4odG1wUGF0aCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVzLmNsb3NlTm93KHRtcFBhdGgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsodG1wUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZ2V0VVJMIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpc2sgYXJjaGl2ZXMgKCR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIHBhdGggJHtwYXRofSlgKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXRPclVuZGVmaW5lZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxmcy5TdGF0cyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbGVQYXRoKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG59XG5cbi8vIFRoZSBmb2xkZXJzL3NoYWxsb3cgcG9zdC1wcm9jZXNzaW5nIHNoYXJlZCBieSBmaW5kSW5mbyBpbXBsZW1lbnRhdGlvbnMgdGhhdCBsaXN0IGZsYXQgZmlsZXMgKHVzZWQgYnkgQXJjaGl2ZXNEaXNrIG9uIHRoZSByYXcgZGlzayB3YWxrLCBhbmQgYnkgQmxvYlN0b3JlIG9uIGl0cyBpbmRleCkuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlGaW5kSW5mb1NoYXBlKGZpbGVzOiBBcmNoaXZlRmlsZUluZm9bXSwgcHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBBcmNoaXZlRmlsZUluZm9bXSB7XG4gICAgaWYgKGNvbmZpZz8udHlwZSA9PT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgbGV0IGZvbGRlcnMgPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBsZXQgcmVzdCA9IGZpbGUucGF0aC5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgICAgIGxldCByZXN0UGFydHMgPSByZXN0LnNwbGl0KFwiL1wiKTtcbiAgICAgICAgICAgIGlmIChyZXN0UGFydHMubGVuZ3RoIDwgMikgY29udGludWU7XG4gICAgICAgICAgICBsZXQgZm9sZGVyOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnNoYWxsb3cpIHtcbiAgICAgICAgICAgICAgICBmb2xkZXIgPSBwcmVmaXggKyByZXN0UGFydHNbMF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvbGRlciA9IGZpbGUucGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9sZGVycy5zZXQoZm9sZGVyLCB7IHBhdGg6IGZvbGRlciwgY3JlYXRlVGltZTogZmlsZS5jcmVhdGVUaW1lLCBzaXplOiBmaWxlLnNpemUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZm9sZGVycy52YWx1ZXMoKSk7XG4gICAgfVxuICAgIGlmIChjb25maWc/LnNoYWxsb3cpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLnBhdGguc2xpY2UocHJlZml4Lmxlbmd0aCkuaW5jbHVkZXMoXCIvXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVzO1xufVxuIl19
426
- /* _JS_SOURCE_HASH = "ac4b8614525f3a1d51e133cc1fa0fb0055596a4ef63cc8d9f7795423dbbf4aed"; */
426
+ /* _JS_SOURCE_HASH = "361aedb6f38f6fbb2754516331f38394d71441e1a68d99725d803a4f57c827e6"; */
@@ -4,19 +4,16 @@ Object.defineProperty(exports, "__esModule", { value: true , configurable: true}
4
4
  // Cross-archive file operations built ON TOP of IArchives (copy, move) - helpers over the interface, not part of it, so they live beside it rather than in it.
5
5
  const LARGE_COPY_THRESHOLD = 64 * 1024 * 1024;
6
6
  const LARGE_COPY_CHUNK = 32 * 1024 * 1024;
7
- /** Copies one file between two archives. Small files go as a single get2+set; past LARGE_COPY_THRESHOLD the copy streams through setLargeFile in LARGE_COPY_CHUNK ranged reads, so the whole file is never in memory. Returns the copied file's info, or undefined when the source doesn't have the file. */
7
+ /** Copies one file between two archives. The source's CURRENT size and write time always come from getInfo right here - callers never supply them, because a stale size turns into ranged reads of a file that has changed (failing forever), and a stale write time re-orders history. Small files go as a single get2+set; past LARGE_COPY_THRESHOLD the copy streams through setLargeFile in LARGE_COPY_CHUNK ranged reads, so the whole file is never in memory. Returns the copied file's info, or undefined when the source doesn't have the file. */
8
8
  async function copyArchiveFile(config) {
9
9
  let { from, to, path } = config;
10
10
  let toPath = config.toPath || path;
11
- let size = config.size;
12
- if (size === undefined) {
13
- let info = await from.getInfo(path, { noFallbacks: config.noFallbacks });
14
- if (!info)
15
- return undefined;
16
- size = info.size;
17
- }
18
- // Preserving the source's stamp is ONLY for synchronization (copies of the same key between replicas, where the original ordering must survive propagation) - those callers pass writeTime explicitly. A plain copy is a NEW write and is stamped now: stamping it with the source's old time makes it LOSE to any newer write or tombstone at the destination, silently - move a file back to a folder it was deleted from and the copy is dropped, then the caller deletes the source, and the file is gone entirely.
19
- let writeTime = config.writeTime || Date.now();
11
+ let info = await from.getInfo(path, { noFallbacks: config.noFallbacks });
12
+ if (!info)
13
+ return undefined;
14
+ let size = info.size;
15
+ // internal (synchronization between replicas of the same key) preserves the source's write time, so ordering survives propagation. A plain copy is a NEW write and is stamped now: the source's old stamp would make it LOSE to any newer write or tombstone at the destination, silently - move a file back to a folder it was deleted from and the copy is dropped, then the caller deletes the source, and the file is gone entirely.
16
+ let writeTime = config.internal && info.writeTime || Date.now();
20
17
  if (size <= LARGE_COPY_THRESHOLD) {
21
18
  let result = await from.get2(path, { internal: config.internal, noFallbacks: config.noFallbacks });
22
19
  // Empty counts as absent, never as content to copy: an empty file IS a deletion, set refuses empty buffers, and deletions travel through their own path (del / scan tombstones)
@@ -83,5 +80,5 @@ async function moveArchiveFile(config) {
83
80
  await from.del(path);
84
81
  }
85
82
  exports.moveArchiveFile = moveArchiveFile;
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZUhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhcmNoaXZlSGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSwrSkFBK0o7QUFFL0osTUFBTSxvQkFBb0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM5QyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRTFDLDZTQUE2UztBQUN0UyxLQUFLLFVBQVUsZUFBZSxDQUFDLE1BY3JDO0lBQ0csSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQ2hDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDO0lBQ25DLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDdkIsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDckIsSUFBSSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzVCLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFDRCx3ZkFBd2Y7SUFDeGYsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDL0MsSUFBSSxJQUFJLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMvQixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFD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Q1gsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDaEcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxJQUFJLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsd0ZBQXdGLENBQUMsQ0FBQztJQUMvUCxDQUFDO0lBQ0QsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUExQkQsMENBMEJDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVHlwZS1vbmx5OiBJQXJjaGl2ZXMudHMgcmUtZXhwb3J0cyBvdXIgZnVuY3Rpb25zLCBzbyBhIHZhbHVlIGltcG9ydCBiYWNrIGF0IGl0IHdvdWxkIGJlIGEgcmVxdWlyZSBjeWNsZVxuaW1wb3J0IHR5cGUgeyBJQXJjaGl2ZXMgfSBmcm9tIFwiLi9JQXJjaGl2ZXNcIjtcblxuLy8gQ3Jvc3MtYXJjaGl2ZSBmaWxlIG9wZXJhdGlvbnMgYnVpbHQgT04gVE9QIG9mIElBcmNoaXZlcyAoY29weSwgbW92ZSkgLSBoZWxwZXJzIG92ZXIgdGhlIGludGVyZmFjZSwgbm90IHBhcnQgb2YgaXQsIHNvIHRoZXkgbGl2ZSBiZXNpZGUgaXQgcmF0aGVyIHRoYW4gaW4gaXQuXG5cbmNvbnN0IExBUkdFX0NPUFlfVEhSRVNIT0xEID0gNjQgKiAxMDI0ICogMTAyNDtcbmNvbnN0IExBUkdFX0NPUFlfQ0hVTksgPSAzMiAqIDEwMjQgKiAxMDI0O1xuXG4vKiogQ29waWVzIG9uZSBmaWxlIGJldHdlZW4gdHdvIGFyY2hpdmVzLiBTbWFsbCBmaWxlcyBnbyBhcyBhIHNpbmdsZSBnZXQyK3NldDsgcGFzdCBMQVJHRV9DT1BZX1RIUkVTSE9MRCB0aGUgY29weSBzdHJlYW1zIHRocm91Z2ggc2V0TGFyZ2VGaWxlIGluIExBUkdFX0NPUFlfQ0hVTksgcmFuZ2VkIHJlYWRzLCBzbyB0aGUgd2hvbGUgZmlsZSBpcyBuZXZlciBpbiBtZW1vcnkuIFJldHVybnMgdGhlIGNvcGllZCBmaWxlJ3MgaW5mbywgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHNvdXJjZSBkb2Vzbid0IGhhdmUgdGhlIGZpbGUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weUFyY2hpdmVGaWxlKGNvbmZpZzoge1xuICAgIGZyb206IElBcmNoaXZlcztcbiAgICB0bzogSUFyY2hpdmVzO1xuICAgIHBhdGg6IHN0cmluZztcbiAgICAvKiogVGhlIHBhdGggYXQgdGhlIGRlc3RpbmF0aW9uIC0gZGVmYXVsdHMgdG8gcGF0aCAodGhlIGNvbW1vbiBjYXNlOiB0aGUgc2FtZSBrZXkgbW92aW5nIGJldHdlZW4gdHdvIGFyY2hpdmVzKS4gKi9cbiAgICB0b1BhdGg/OiBzdHJpbmc7XG4gICAgLy8gRnJvbSB0aGUgY2FsbGVyJ3MgbWV0YWRhdGEgc2NhbjsgZ2V0SW5mbyBmaWxscyBpdCBpbiB3aGVuIG9taXR0ZWRcbiAgICBzaXplPzogbnVtYmVyO1xuICAgIC8qKiBTdGFtcHMgdGhlIGRlc3RpbmF0aW9uIHdyaXRlIHdpdGggdGhpcyB0aW1lIElOU1RFQUQgb2Ygbm93IC0gd2hpY2ggbWFrZXMgdGhlIGNvcHkgbG9zZSAoc2lsZW50bHkpIHRvIGFueXRoaW5nIG5ld2VyIGF0IHRoZSBkZXN0aW5hdGlvbiwgdG9tYnN0b25lcyBpbmNsdWRlZC4gVGhhdCBpcyBleGFjdGx5IHJpZ2h0IGZvciBzeW5jaHJvbml6YXRpb24sIHdoaWNoIGNvcGllcyB0aGUgc2FtZSBrZXkgYmV0d2VlbiByZXBsaWNhcyBhbmQgbXVzdCBwcmVzZXJ2ZSBpdHMgb3JkZXJpbmcsIGFuZCBleGFjdGx5IHdyb25nIGZvciBhbnl0aGluZyBlbHNlIC0gc28gb21pdCBpdCB1bmxlc3MgdGhlIGRlc3RpbmF0aW9uIGlzIGFub3RoZXIgY29weSBvZiB0aGUgc2FtZSBrZXkuICovXG4gICAgd3JpdGVUaW1lPzogbnVtYmVyO1xuICAgIGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgICBub0NoZWNrcz86IGJvb2xlYW47XG4gICAgaW50ZXJuYWw/OiBib29sZWFuO1xuICAgIG5vRmFsbGJhY2tzPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IHsgZnJvbSwgdG8sIHBhdGggfSA9IGNvbmZpZztcbiAgICBsZXQgdG9QYXRoID0gY29uZmlnLnRvUGF0aCB8fCBwYXRoO1xuICAgIGxldCBzaXplID0gY29uZmlnLnNpemU7XG4gICAgaWYgKHNpemUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGZyb20uZ2V0SW5mbyhwYXRoLCB7IG5vRmFsbGJhY2tzOiBjb25maWcubm9GYWxsYmFja3MgfSk7XG4gICAgICAgIGlmICghaW5mbykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgc2l6ZSA9IGluZm8uc2l6ZTtcbiAgICB9XG4gICAgLy8gUHJlc2VydmluZyB0aGUgc291cmNlJ3Mgc3RhbXAgaXMgT05MWSBmb3Igc3luY2hyb25pemF0aW9uIChjb3BpZXMgb2YgdGhlIHNhbWUga2V5IGJldHdlZW4gcmVwbGljYXMsIHdoZXJlIHRoZSBvcmlnaW5hbCBvcmRlcmluZyBtdXN0IHN1cnZpdmUgcHJvcGFnYXRpb24pIC0gdGhvc2UgY2FsbGVycyBwYXNzIHdyaXRlVGltZSBleHBsaWNpdGx5LiBBIHBsYWluIGNvcHkgaXMgYSBORVcgd3JpdGUgYW5kIGlzIHN0YW1wZWQgbm93OiBzdGFtcGluZyBpdCB3aXRoIHRoZSBzb3VyY2UncyBvbGQgdGltZSBtYWtlcyBpdCBMT1NFIHRvIGFueSBuZXdlciB3cml0ZSBvciB0b21ic3RvbmUgYXQgdGhlIGRlc3RpbmF0aW9uLCBzaWxlbnRseSAtIG1vdmUgYSBmaWxlIGJhY2sgdG8gYSBmb2xkZXIgaXQgd2FzIGRlbGV0ZWQgZnJvbSBhbmQgdGhlIGNvcHkgaXMgZHJvcHBlZCwgdGhlbiB0aGUgY2FsbGVyIGRlbGV0ZXMgdGhlIHNvdXJjZSwgYW5kIHRoZSBmaWxlIGlzIGdvbmUgZW50aXJlbHkuXG4gICAgbGV0IHdyaXRlVGltZSA9IGNvbmZpZy53cml0ZVRpbWUgfHwgRGF0ZS5ub3coKTtcbiAgICBpZiAoc2l6ZSA8PSBMQVJHRV9DT1BZX1RIUkVTSE9MRCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZnJvbS5nZXQyKHBhdGgsIHsgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCwgbm9GYWxsYmFja3M6IGNvbmZpZy5ub0ZhbGxiYWNrcyB9KTtcbiAgICAgICAgLy8gRW1wdHkgY291bnRzIGFzIGFic2VudCwgbmV2ZXIgYXMgY29udGVudCB0byBjb3B5OiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24sIHNldCByZWZ1c2VzIGVtcHR5IGJ1ZmZlcnMsIGFuZCBkZWxldGlvbnMgdHJhdmVsIHRocm91Z2ggdGhlaXIgb3duIHBhdGggKGRlbCAvIHNjYW4gdG9tYnN0b25lcylcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhIHx8ICFyZXN1bHQuZGF0YS5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGF3YWl0IHRvLnNldCh0b1BhdGgsIHJlc3VsdC5kYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogY29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlLCBub0NoZWNrczogY29uZmlnLm5vQ2hlY2tzLCBpbnRlcm5hbDogY29uZmlnLmludGVybmFsIH0pO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5kYXRhLmxlbmd0aCB9O1xuICAgIH1cbiAgICAvLyBDb25zdCBzbyB0aGUgY2xvc3VyZSBrZWVwcyB0aGUgbmFycm93ZWQgdHlwZVxuICAgIGNvbnN0IHRvdGFsU2l6ZSA9IHNpemU7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgYXdhaXQgdG8uc2V0TGFyZ2VGaWxlKHtcbiAgICAgICAgcGF0aDogdG9QYXRoLFxuICAgICAgICBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSxcbiAgICAgICAgZm9yY2VTZXRJbW11dGFibGU6IGNvbmZpZy5mb3JjZVNldEltbXV0YWJsZSxcbiAgICAgICAgbm9DaGVja3M6IGNvbmZpZy5ub0NoZWNrcyxcbiAgICAgICAgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCxcbiAgICAgICAgcmVzdGFydFN0cmVhbTogKCkgPT4ge1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0TmV4dERhdGE6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gdG90YWxTaXplKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKG9mZnNldCArIExBUkdFX0NPUFlfQ0hVTkssIHRvdGFsU2l6ZSk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGZyb20uZ2V0KHBhdGgsIHsgcmFuZ2U6IHsgc3RhcnQ6IG9mZnNldCwgZW5kIH0sIGludGVybmFsOiBjb25maWcuaW50ZXJuYWwsIG5vRmFsbGJhY2tzOiBjb25maWcubm9GYWxsYmFja3MgfSk7XG4gICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5nZWQgcmVhZCBvZiAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBmcm9tICR7ZnJvbS5nZXREZWJ1Z05hbWUoKX0gcmV0dXJuZWQgJHtkYXRhICYmIGRhdGEubGVuZ3RoIHx8IFwibm90aGluZ1wifSBhdCAke29mZnNldH0tJHtlbmR9IChleHBlY3RlZCAke2VuZCAtIG9mZnNldH0gYnl0ZXMgb2YgYSAke3RvdGFsU2l6ZX0gYnl0ZSBmaWxlIC0gaXQgY2hhbmdlZCBvciB2YW5pc2hlZCBtaWQtY29weSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiB7IHdyaXRlVGltZSwgc2l6ZTogdG90YWxTaXplIH07XG59XG5cbi8qKlxuICogTW92ZXMgb25lIGZpbGUgLSBiZXR3ZWVuIHR3byBhcmNoaXZlcywgb3IgYmV0d2VlbiB0d28gcGF0aHMgb2Ygb25lLiBXaGVuIGZyb20gYW5kIHRvIGFyZSB0aGUgU0FNRVxuICogYXJjaGl2ZXMgaW5zdGFuY2UgYW5kIGl0IGltcGxlbWVudHMgbW92ZSwgdGhlIGJhY2tlbmQgbW92ZXMgdGhlIGZpbGUgaXRzZWxmIChiYWNrYmxhemUgY29waWVzXG4gKiBzZXJ2ZXItc2lkZSwgZGlzayByZW5hbWVzLCB0aGUgc3RvcmFnZSBzZXJ2ZXIgcmVsb2NhdGVzIGl0IG5vZGUtc2lkZSkgYW5kIHRoZSBieXRlcyBuZXZlciB0cmF2ZWxcbiAqIHRocm91Z2ggdXMuIEV2ZXJ5dGhpbmcgZWxzZSBpcyB0aGUgc2FmZSBmYWxsYmFjazogY29weSwgdGhlbiBDT05GSVJNIHRoZSBkZXN0aW5hdGlvbiBhY3R1YWxseVxuICogcmVwb3J0cyB0aGUgZmlsZSAoZ2V0SW5mbyksIGFuZCBvbmx5IHRoZW4gZGVsZXRlIHRoZSBzb3VyY2UgLSB0aGUgb25lIG9yZGVyIGluIHdoaWNoIG5vIGZhaWx1cmVcbiAqIGNhbiBsb3NlIHRoZSBmaWxlLCBvbmx5IGF0IHdvcnN0IGxlYXZlIGl0IGluIGJvdGggcGxhY2VzLiBUaHJvd3Mgd2hlbiB0aGUgc291cmNlIGRvZXNuJ3QgaGF2ZSB0aGVcbiAqIGZpbGUsIG9yIHdoZW4gdGhlIGNvcHkgY2Fubm90IGJlIGNvbmZpcm1lZCAodGhlIHNvdXJjZSBpcyB0aGVuIGxlZnQgdW50b3VjaGVkKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1vdmVBcmNoaXZlRmlsZShjb25maWc6IHtcbiAgICBmcm9tOiBJQXJjaGl2ZXM7XG4gICAgdG86IElBcmNoaXZlcztcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwYXRoIGF0IHRoZSBkZXN0aW5hdGlvbiAtIGRlZmF1bHRzIHRvIHBhdGggKG1vdmluZyBiZXR3ZWVuIHR3byBhcmNoaXZlcykuIFJlcXVpcmVkIGluIHByYWN0aWNlIHdoZW4gZnJvbSBhbmQgdG8gYXJlIHRoZSBzYW1lIGFyY2hpdmVzLCB3aGVyZSB0aGUgc2FtZSBwYXRoIHdvdWxkIGJlIGEgbm8tb3AuICovXG4gICAgdG9QYXRoPzogc3RyaW5nO1xuICAgIG5vRmFsbGJhY2tzPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeyBmcm9tLCB0bywgcGF0aCB9ID0gY29uZmlnO1xuICAgIGxldCB0b1BhdGggPSBjb25maWcudG9QYXRoIHx8IHBhdGg7XG4gICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgIGlmIChwYXRoID09PSB0b1BhdGgpIHJldHVybjtcbiAgICAgICAgaWYgKGZyb20ubW92ZSkge1xuICAgICAgICAgICAgYXdhaXQgZnJvbS5tb3ZlKHsgZnJvbVBhdGg6IHBhdGgsIHRvUGF0aCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbSwgdG8sIHBhdGgsIHRvUGF0aCwgbm9GYWxsYmFja3M6IGNvbmZpZy5ub0ZhbGxiYWNrcyB9KTtcbiAgICBpZiAoIWNvcGllZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtb3ZlICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9OiAke2Zyb20uZ2V0RGVidWdOYW1lKCl9IGRvZXMgbm90IGhhdmUgaXRgKTtcbiAgICB9XG4gICAgbGV0IGNvbmZpcm1lZCA9IGF3YWl0IHRvLmdldEluZm8odG9QYXRoLCB7IG5vRmFsbGJhY2tzOiBjb25maWcubm9GYWxsYmFja3MgfSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgZGVsZXRpbmcgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gZnJvbSAke2Zyb20uZ2V0RGVidWdOYW1lKCl9IGFmdGVyIGNvcHlpbmcgaXQ6ICR7dG8uZ2V0RGVidWdOYW1lKCl9IGRvZXMgbm90IHJlcG9ydCAke0pTT04uc3RyaW5naWZ5KHRvUGF0aCl9ICh0aGUgY29weSBjbGFpbWVkIHRvIHN1Y2NlZWQsIHNvIHNvbWV0aGluZyBpcyB3cm9uZyAtIHRoZSBmaWxlIGlzIGxlZnQgYXQgdGhlIHNvdXJjZSlgKTtcbiAgICB9XG4gICAgYXdhaXQgZnJvbS5kZWwocGF0aCk7XG59XG4iXX0=
87
- /* _JS_SOURCE_HASH = "efb7e176a5023c455a425aab42865a490510f64906e5ddb68fdbccf7a7085cd9"; */
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZUhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhcmNoaXZlSGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSwrSkFBK0o7QUFFL0osTUFBTSxvQkFBb0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM5QyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRTFDLDRoQkFBNGhCO0FBQ3JoQixLQUFLLFVBQVUsZUFBZSxDQUFDLE1BVXJDO0lBQ0csSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQ2hDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDO0lBQ25DLElBQUksSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDekUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLHlhQUF5YTtJQUN6YSxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hFLElBQUksSUFBSSxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDL0IsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNuRyxnTEFBZ0w7UUFDaEwsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJ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QUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2hHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBQ0QsSUFBSSxTQUFTLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM5RSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxZQUFZLEVBQUUsb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHdGQUF3RixDQUFDLENBQUM7SUFDL1AsQ0FBQztJQUNELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBMUJELDBDQTBCQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFR5cGUtb25seTogSUFyY2hpdmVzLnRzIHJlLWV4cG9ydHMgb3VyIGZ1bmN0aW9ucywgc28gYSB2YWx1ZSBpbXBvcnQgYmFjayBhdCBpdCB3b3VsZCBiZSBhIHJlcXVpcmUgY3ljbGVcbmltcG9ydCB0eXBlIHsgSUFyY2hpdmVzIH0gZnJvbSBcIi4vSUFyY2hpdmVzXCI7XG5cbi8vIENyb3NzLWFyY2hpdmUgZmlsZSBvcGVyYXRpb25zIGJ1aWx0IE9OIFRPUCBvZiBJQXJjaGl2ZXMgKGNvcHksIG1vdmUpIC0gaGVscGVycyBvdmVyIHRoZSBpbnRlcmZhY2UsIG5vdCBwYXJ0IG9mIGl0LCBzbyB0aGV5IGxpdmUgYmVzaWRlIGl0IHJhdGhlciB0aGFuIGluIGl0LlxuXG5jb25zdCBMQVJHRV9DT1BZX1RIUkVTSE9MRCA9IDY0ICogMTAyNCAqIDEwMjQ7XG5jb25zdCBMQVJHRV9DT1BZX0NIVU5LID0gMzIgKiAxMDI0ICogMTAyNDtcblxuLyoqIENvcGllcyBvbmUgZmlsZSBiZXR3ZWVuIHR3byBhcmNoaXZlcy4gVGhlIHNvdXJjZSdzIENVUlJFTlQgc2l6ZSBhbmQgd3JpdGUgdGltZSBhbHdheXMgY29tZSBmcm9tIGdldEluZm8gcmlnaHQgaGVyZSAtIGNhbGxlcnMgbmV2ZXIgc3VwcGx5IHRoZW0sIGJlY2F1c2UgYSBzdGFsZSBzaXplIHR1cm5zIGludG8gcmFuZ2VkIHJlYWRzIG9mIGEgZmlsZSB0aGF0IGhhcyBjaGFuZ2VkIChmYWlsaW5nIGZvcmV2ZXIpLCBhbmQgYSBzdGFsZSB3cml0ZSB0aW1lIHJlLW9yZGVycyBoaXN0b3J5LiBTbWFsbCBmaWxlcyBnbyBhcyBhIHNpbmdsZSBnZXQyK3NldDsgcGFzdCBMQVJHRV9DT1BZX1RIUkVTSE9MRCB0aGUgY29weSBzdHJlYW1zIHRocm91Z2ggc2V0TGFyZ2VGaWxlIGluIExBUkdFX0NPUFlfQ0hVTksgcmFuZ2VkIHJlYWRzLCBzbyB0aGUgd2hvbGUgZmlsZSBpcyBuZXZlciBpbiBtZW1vcnkuIFJldHVybnMgdGhlIGNvcGllZCBmaWxlJ3MgaW5mbywgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHNvdXJjZSBkb2Vzbid0IGhhdmUgdGhlIGZpbGUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weUFyY2hpdmVGaWxlKGNvbmZpZzoge1xuICAgIGZyb206IElBcmNoaXZlcztcbiAgICB0bzogSUFyY2hpdmVzO1xuICAgIHBhdGg6IHN0cmluZztcbiAgICAvKiogVGhlIHBhdGggYXQgdGhlIGRlc3RpbmF0aW9uIC0gZGVmYXVsdHMgdG8gcGF0aCAodGhlIGNvbW1vbiBjYXNlOiB0aGUgc2FtZSBrZXkgbW92aW5nIGJldHdlZW4gdHdvIGFyY2hpdmVzKS4gKi9cbiAgICB0b1BhdGg/OiBzdHJpbmc7XG4gICAgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuO1xuICAgIG5vQ2hlY2tzPzogYm9vbGVhbjtcbiAgICBpbnRlcm5hbD86IGJvb2xlYW47XG4gICAgbm9GYWxsYmFja3M/OiBib29sZWFuO1xufSk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgeyBmcm9tLCB0bywgcGF0aCB9ID0gY29uZmlnO1xuICAgIGxldCB0b1BhdGggPSBjb25maWcudG9QYXRoIHx8IHBhdGg7XG4gICAgbGV0IGluZm8gPSBhd2FpdCBmcm9tLmdldEluZm8ocGF0aCwgeyBub0ZhbGxiYWNrczogY29uZmlnLm5vRmFsbGJhY2tzIH0pO1xuICAgIGlmICghaW5mbykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBsZXQgc2l6ZSA9IGluZm8uc2l6ZTtcbiAgICAvLyBpbnRlcm5hbCAoc3luY2hyb25pemF0aW9uIGJldHdlZW4gcmVwbGljYXMgb2YgdGhlIHNhbWUga2V5KSBwcmVzZXJ2ZXMgdGhlIHNvdXJjZSdzIHdyaXRlIHRpbWUsIHNvIG9yZGVyaW5nIHN1cnZpdmVzIHByb3BhZ2F0aW9uLiBBIHBsYWluIGNvcHkgaXMgYSBORVcgd3JpdGUgYW5kIGlzIHN0YW1wZWQgbm93OiB0aGUgc291cmNlJ3Mgb2xkIHN0YW1wIHdvdWxkIG1ha2UgaXQgTE9TRSB0byBhbnkgbmV3ZXIgd3JpdGUgb3IgdG9tYnN0b25lIGF0IHRoZSBkZXN0aW5hdGlvbiwgc2lsZW50bHkgLSBtb3ZlIGEgZmlsZSBiYWNrIHRvIGEgZm9sZGVyIGl0IHdhcyBkZWxldGVkIGZyb20gYW5kIHRoZSBjb3B5IGlzIGRyb3BwZWQsIHRoZW4gdGhlIGNhbGxlciBkZWxldGVzIHRoZSBzb3VyY2UsIGFuZCB0aGUgZmlsZSBpcyBnb25lIGVudGlyZWx5LlxuICAgIGxldCB3cml0ZVRpbWUgPSBjb25maWcuaW50ZXJuYWwgJiYgaW5mby53cml0ZVRpbWUgfHwgRGF0ZS5ub3coKTtcbiAgICBpZiAoc2l6ZSA8PSBMQVJHRV9DT1BZX1RIUkVTSE9MRCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZnJvbS5nZXQyKHBhdGgsIHsgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCwgbm9GYWxsYmFja3M6IGNvbmZpZy5ub0ZhbGxiYWNrcyB9KTtcbiAgICAgICAgLy8gRW1wdHkgY291bnRzIGFzIGFic2VudCwgbmV2ZXIgYXMgY29udGVudCB0byBjb3B5OiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24sIHNldCByZWZ1c2VzIGVtcHR5IGJ1ZmZlcnMsIGFuZCBkZWxldGlvbnMgdHJhdmVsIHRocm91Z2ggdGhlaXIgb3duIHBhdGggKGRlbCAvIHNjYW4gdG9tYnN0b25lcylcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhIHx8ICFyZXN1bHQuZGF0YS5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGF3YWl0IHRvLnNldCh0b1BhdGgsIHJlc3VsdC5kYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogY29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlLCBub0NoZWNrczogY29uZmlnLm5vQ2hlY2tzLCBpbnRlcm5hbDogY29uZmlnLmludGVybmFsIH0pO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5kYXRhLmxlbmd0aCB9O1xuICAgIH1cbiAgICAvLyBDb25zdCBzbyB0aGUgY2xvc3VyZSBrZWVwcyB0aGUgbmFycm93ZWQgdHlwZVxuICAgIGNvbnN0IHRvdGFsU2l6ZSA9IHNpemU7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgYXdhaXQgdG8uc2V0TGFyZ2VGaWxlKHtcbiAgICAgICAgcGF0aDogdG9QYXRoLFxuICAgICAgICBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSxcbiAgICAgICAgZm9yY2VTZXRJbW11dGFibGU6IGNvbmZpZy5mb3JjZVNldEltbXV0YWJsZSxcbiAgICAgICAgbm9DaGVja3M6IGNvbmZpZy5ub0NoZWNrcyxcbiAgICAgICAgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCxcbiAgICAgICAgcmVzdGFydFN0cmVhbTogKCkgPT4ge1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0TmV4dERhdGE6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gdG90YWxTaXplKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKG9mZnNldCArIExBUkdFX0NPUFlfQ0hVTkssIHRvdGFsU2l6ZSk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGZyb20uZ2V0KHBhdGgsIHsgcmFuZ2U6IHsgc3RhcnQ6IG9mZnNldCwgZW5kIH0sIGludGVybmFsOiBjb25maWcuaW50ZXJuYWwsIG5vRmFsbGJhY2tzOiBjb25maWcubm9GYWxsYmFja3MgfSk7XG4gICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5nZWQgcmVhZCBvZiAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBmcm9tICR7ZnJvbS5nZXREZWJ1Z05hbWUoKX0gcmV0dXJuZWQgJHtkYXRhICYmIGRhdGEubGVuZ3RoIHx8IFwibm90aGluZ1wifSBhdCAke29mZnNldH0tJHtlbmR9IChleHBlY3RlZCAke2VuZCAtIG9mZnNldH0gYnl0ZXMgb2YgYSAke3RvdGFsU2l6ZX0gYnl0ZSBmaWxlIC0gaXQgY2hhbmdlZCBvciB2YW5pc2hlZCBtaWQtY29weSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiB7IHdyaXRlVGltZSwgc2l6ZTogdG90YWxTaXplIH07XG59XG5cbi8qKlxuICogTW92ZXMgb25lIGZpbGUgLSBiZXR3ZWVuIHR3byBhcmNoaXZlcywgb3IgYmV0d2VlbiB0d28gcGF0aHMgb2Ygb25lLiBXaGVuIGZyb20gYW5kIHRvIGFyZSB0aGUgU0FNRVxuICogYXJjaGl2ZXMgaW5zdGFuY2UgYW5kIGl0IGltcGxlbWVudHMgbW92ZSwgdGhlIGJhY2tlbmQgbW92ZXMgdGhlIGZpbGUgaXRzZWxmIChiYWNrYmxhemUgY29waWVzXG4gKiBzZXJ2ZXItc2lkZSwgZGlzayByZW5hbWVzLCB0aGUgc3RvcmFnZSBzZXJ2ZXIgcmVsb2NhdGVzIGl0IG5vZGUtc2lkZSkgYW5kIHRoZSBieXRlcyBuZXZlciB0cmF2ZWxcbiAqIHRocm91Z2ggdXMuIEV2ZXJ5dGhpbmcgZWxzZSBpcyB0aGUgc2FmZSBmYWxsYmFjazogY29weSwgdGhlbiBDT05GSVJNIHRoZSBkZXN0aW5hdGlvbiBhY3R1YWxseVxuICogcmVwb3J0cyB0aGUgZmlsZSAoZ2V0SW5mbyksIGFuZCBvbmx5IHRoZW4gZGVsZXRlIHRoZSBzb3VyY2UgLSB0aGUgb25lIG9yZGVyIGluIHdoaWNoIG5vIGZhaWx1cmVcbiAqIGNhbiBsb3NlIHRoZSBmaWxlLCBvbmx5IGF0IHdvcnN0IGxlYXZlIGl0IGluIGJvdGggcGxhY2VzLiBUaHJvd3Mgd2hlbiB0aGUgc291cmNlIGRvZXNuJ3QgaGF2ZSB0aGVcbiAqIGZpbGUsIG9yIHdoZW4gdGhlIGNvcHkgY2Fubm90IGJlIGNvbmZpcm1lZCAodGhlIHNvdXJjZSBpcyB0aGVuIGxlZnQgdW50b3VjaGVkKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1vdmVBcmNoaXZlRmlsZShjb25maWc6IHtcbiAgICBmcm9tOiBJQXJjaGl2ZXM7XG4gICAgdG86IElBcmNoaXZlcztcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwYXRoIGF0IHRoZSBkZXN0aW5hdGlvbiAtIGRlZmF1bHRzIHRvIHBhdGggKG1vdmluZyBiZXR3ZWVuIHR3byBhcmNoaXZlcykuIFJlcXVpcmVkIGluIHByYWN0aWNlIHdoZW4gZnJvbSBhbmQgdG8gYXJlIHRoZSBzYW1lIGFyY2hpdmVzLCB3aGVyZSB0aGUgc2FtZSBwYXRoIHdvdWxkIGJlIGEgbm8tb3AuICovXG4gICAgdG9QYXRoPzogc3RyaW5nO1xuICAgIG5vRmFsbGJhY2tzPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeyBmcm9tLCB0bywgcGF0aCB9ID0gY29uZmlnO1xuICAgIGxldCB0b1BhdGggPSBjb25maWcudG9QYXRoIHx8IHBhdGg7XG4gICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgIGlmIChwYXRoID09PSB0b1BhdGgpIHJldHVybjtcbiAgICAgICAgaWYgKGZyb20ubW92ZSkge1xuICAgICAgICAgICAgYXdhaXQgZnJvbS5tb3ZlKHsgZnJvbVBhdGg6IHBhdGgsIHRvUGF0aCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbSwgdG8sIHBhdGgsIHRvUGF0aCwgbm9GYWxsYmFja3M6IGNvbmZpZy5ub0ZhbGxiYWNrcyB9KTtcbiAgICBpZiAoIWNvcGllZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtb3ZlICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9OiAke2Zyb20uZ2V0RGVidWdOYW1lKCl9IGRvZXMgbm90IGhhdmUgaXRgKTtcbiAgICB9XG4gICAgbGV0IGNvbmZpcm1lZCA9IGF3YWl0IHRvLmdldEluZm8odG9QYXRoLCB7IG5vRmFsbGJhY2tzOiBjb25maWcubm9GYWxsYmFja3MgfSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgZGVsZXRpbmcgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gZnJvbSAke2Zyb20uZ2V0RGVidWdOYW1lKCl9IGFmdGVyIGNvcHlpbmcgaXQ6ICR7dG8uZ2V0RGVidWdOYW1lKCl9IGRvZXMgbm90IHJlcG9ydCAke0pTT04uc3RyaW5naWZ5KHRvUGF0aCl9ICh0aGUgY29weSBjbGFpbWVkIHRvIHN1Y2NlZWQsIHNvIHNvbWV0aGluZyBpcyB3cm9uZyAtIHRoZSBmaWxlIGlzIGxlZnQgYXQgdGhlIHNvdXJjZSlgKTtcbiAgICB9XG4gICAgYXdhaXQgZnJvbS5kZWwocGF0aCk7XG59XG4iXX0=
84
+ /* _JS_SOURCE_HASH = "3f4425d396aad4af5038c7dadec3359e6266b310d603c8f8b6b9e99375041c3f"; */
@@ -1,4 +1,4 @@
1
- "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
1
+ "use strict";
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
@@ -71,9 +71,9 @@ function write(kind, entry, alsoConsole) {
71
71
  return;
72
72
  logs.log({ kind, time: Date.now(), ...baseFields(), ...entry });
73
73
  }
74
- /** One mutation the server performed: set/del/move/undelete/setLarge/routingConfig, plus the per-file synchronization writes ("sync get"/"sync set"). Sizes and times, never the data. internal marks writes pushed by a peer's synchronization rather than a client. Also printed to the console. */
74
+ /** One mutation the server performed: set/del/move/undelete/setLarge/routingConfig, plus the per-file synchronization writes ("sync get"/"sync set"). Sizes and times, never the data. internal marks writes pushed by a peer's synchronization rather than a client. Stream-only - one entry per write is exactly what the console does NOT need. */
75
75
  function logMutation(entry) {
76
- write("mutation", entry, true);
76
+ write("mutation", entry, false);
77
77
  }
78
78
  exports.logMutation = logMutation;
79
79
  /** A synchronization key point: scans and full syncs starting/finishing, reconciles, boundary scans - what an operator greps for to see whether the fleet is converging. Also printed to the console. */
@@ -124,5 +124,5 @@ async function readStorageLogFile(name) {
124
124
  return await logs.readFileCompressed(name);
125
125
  }
126
126
  exports.readStorageLogFile = readStorageLogFile;
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZUxvZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yYWdlTG9ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLHlEQUFtRDtBQUNuRCxvREFBOEQ7QUFDOUQsaURBQWtGO0FBQ2xGLGtEQUF3RDtBQUV4RCwyWkFBMlo7QUFFOVksUUFBQSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7QUFFdkMsbUxBQW1MO0FBQ25MLElBQUksWUFBdUMsQ0FBQztBQUM1QyxTQUFTLE9BQU87SUFDWixJQUFJLFlBQVk7UUFBRSxPQUFPLFlBQVksQ0FBQztJQUN0QyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLENBQUM7UUFDRCxNQUFNLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFBLCtCQUFnQixHQUFFLEVBQUUsd0JBQWdCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ0wsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUNELGdCQUFnQixFQUFFLENBQUM7SUFDbkIsWUFBWSxHQUFHLElBQUksNkJBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLGlCQUFpQjtJQUN0QixLQUFLLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzFELEtBQUssSUFBSSxPQUFPLElBQUksU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtnQkFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDL0UsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLFNB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UUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQUMsQ0FBVyxhQUFYLENBQUMsdUJBQUQsQ0FBQyxDQUFZLEtBQUssbUNBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLEVBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkosQ0FBQztZQUFDLFdBQU0sQ0FBQyxDQUFDLENBQUM7b0JBQVMsQ0FBQztnQkFDakIsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMxQixDQUFDO1FBQ0wsQ0FBQyxDQUFDO0lBQ04sQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsZ0hBQWdIO0FBQ3pHLEtBQUssVUFBVSxtQkFBbUI7SUFDckMsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDckIsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixPQUFPLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFKRCxrREFJQztBQUVELHNIQUFzSDtBQUMvRyxLQUFLLFVBQVUsa0JBQWtCLENBQUMsSUFBWTtJQUNqRCxJQUFJLElBQUksR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUNyQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDUixNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQU5ELGdEQU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBTdHJlYW1pbmdMb2dzLCBMb2dGaWxlSW5mbyB9IGZyb20gXCIuLi9TdHJlYW1pbmdMb2dzXCI7XG5pbXBvcnQgeyBnZXRTdG9yYWdlRm9sZGVyLCBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwgfSBmcm9tIFwiLi9zZXJ2ZXJDb25maWdcIjtcbmltcG9ydCB7IGdldE93blRocmVhZElkIH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvY2VydHNcIjtcblxuLy8gVGhlIHN0b3JhZ2Ugc2VydmVyJ3Mgb3BlcmF0aW9uIGxvZzogZXZlcnkgbXV0YXRpb24gKG5ldmVyIHRoZSBkYXRhIGl0c2VsZiAtIGp1c3Qgd2hhdCBoYXBwZW5lZCwgdG8gd2hhdCwgd2hlbiwgaG93IGJpZywgYW5kIHdobyBhc2tlZCksIGV2ZXJ5IGVycm9yLCBhbmQgdGhlIHN5bmNocm9uaXphdGlvbiBrZXkgcG9pbnRzLCBzdHJlYW1lZCBhcyBKU09OIGxpbmVzIGludG8gPHN0b3JhZ2UgZm9sZGVyPi9sb2dzIChzZWUgU3RyZWFtaW5nTG9ncyBmb3IgdGhlIGZpbGUgbGlmZWN5Y2xlKS4gRXZlcnl0aGluZyBoZXJlIGlzIGEgc2FmZSBuby1vcCBvbiBwcm9jZXNzZXMgdGhhdCBoYXZlIG5vIHN0b3JhZ2UgZm9sZGVyIC0gbG9nZ2luZyBtdXN0IG5ldmVyIGJlIHRoZSB0aGluZyB0aGF0IGJyZWFrcyBhIHJlcXVlc3QuXG5cbmV4cG9ydCBjb25zdCBMT0dTX0ZPTERFUl9OQU1FID0gXCJsb2dzXCI7XG5cbi8vIE5PVCBsYXp5OiBhIGZhaWx1cmUgdG8gcmVzb2x2ZSB0aGUgZm9sZGVyICh0aGUgc2VydmVyIGNvbmZpZyBtYXkgc2ltcGx5IG5vdCBiZSBTRVQgeWV0IHRoaXMgZWFybHkgaW4gc3RhcnR1cCkgbXVzdCBiZSByZXRyaWVkIG9uIHRoZSBuZXh0IGxvZyBjYWxsLCBub3QgY2FjaGVkIGFzIFwibm8gbG9ncyBldmVyXCJcbmxldCBsb2dzSW5zdGFuY2U6IFN0cmVhbWluZ0xvZ3MgfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBnZXRMb2dzKCk6IFN0cmVhbWluZ0xvZ3MgfCB1bmRlZmluZWQge1xuICAgIGlmIChsb2dzSW5zdGFuY2UpIHJldHVybiBsb2dzSW5zdGFuY2U7XG4gICAgbGV0IGZvbGRlcjogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICAgIGZvbGRlciA9IHBhdGguam9pbihnZXRTdG9yYWdlRm9sZGVyKCksIExPR1NfRk9MREVSX05BTUUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBob29rRXJyb3JMb2dnaW5nKCk7XG4gICAgbG9nc0luc3RhbmNlID0gbmV3IFN0cmVhbWluZ0xvZ3MoeyBmb2xkZXIsIHRocmVhZElkOiBnZXRUaHJlYWRJZFNhZmUoKSB9KTtcbiAgICByZXR1cm4gbG9nc0luc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBmaXJzdEV4dGVybmFsSVB2NCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGZvciAobGV0IGFkZHJlc3NlcyBvZiBPYmplY3QudmFsdWVzKG9zLm5ldHdvcmtJbnRlcmZhY2VzKCkpKSB7XG4gICAgICAgIGZvciAobGV0IGFkZHJlc3Mgb2YgYWRkcmVzc2VzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoYWRkcmVzcy5mYW1pbHkgPT09IFwiSVB2NFwiICYmICFhZGRyZXNzLmludGVybmFsKSByZXR1cm4gYWRkcmVzcy5hZGRyZXNzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIE1lbW9pemVkIG9uIFNVQ0NFU1Mgb25seTogdGhlIHRocmVhZCBjZXJ0IG1heSBub3QgYmUgbG9hZGVkIHlldCB3aGVuIHRoZSBmaXJzdCBlbnRyaWVzIGFyZSB3cml0dGVuLCBhbmQgdGhhdCBtdXN0IG5vdCBwZXJtYW5lbnRseSBzdHJpcCB0aGUgdGhyZWFkIGlkIGZyb20gZXZlcnkgbGF0ZXIgZW50cnlcbmxldCBjYWNoZWRUaHJlYWRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuZnVuY3Rpb24gZ2V0VGhyZWFkSWRTYWZlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNhY2hlZFRocmVhZElkKSByZXR1cm4gY2FjaGVkVGhyZWFkSWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY2FjaGVkVGhyZWFkSWQgPSBnZXRPd25UaHJlYWRJZChnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKT8ucm9vdERvbWFpbiB8fCBcIlwiKTtcbiAgICB9IGNhdGNoIHsgfVxuICAgIHJldHVybiBjYWNoZWRUaHJlYWRJZDtcbn1cblxuY29uc3QgY2FjaGVkSXAgPSBsYXp5KCgpID0+IGZpcnN0RXh0ZXJuYWxJUHY0KCkpO1xuXG4vLyB0aHJlYWRJZCBhbmQgZG9tYWluIGFyZSByZS1yZXNvbHZlZCB1bnRpbCBrbm93biAoZWFybHkgZW50cmllcyBtYXkgcHJlZGF0ZSB0aGUgY29uZmlnL2NlcnRzKTsgdGhlIHJlc3QgbmV2ZXIgY2hhbmdlc1xuZnVuY3Rpb24gYmFzZUZpZWxkcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBwaWQ6IHByb2Nlc3MucGlkLFxuICAgICAgICB0aHJlYWRJZDogZ2V0VGhyZWFkSWRTYWZlKCksXG4gICAgICAgIGVudHJ5UG9pbnQ6IHByb2Nlc3MuYXJndlsxXSxcbiAgICAgICAgaXA6IGNhY2hlZElwKCksXG4gICAgICAgIGRvbWFpbjogZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCk/LmRvbWFpbixcbiAgICB9O1xufVxuXG4vLyBFdmVyeXRoaW5nIGxvZ2dlZCBoZXJlIGdvZXMgQk9USCB0byB0aGUgc3RvcmFnZSBsb2cgc3RyZWFtIGFuZCB0aGUgY29uc29sZSAtIG9uZSBjYWxsLCBuZXZlciB0d28uIFRoZSBjb25zb2xlIGxpbmUgY2FycmllcyBvbmx5IHRoZSBlbnRyeSAodGhlIGJhc2UgZmllbGRzIGFyZSBjb25zdGFudCBwZXIgcHJvY2Vzcywgc28gdGhleSB3b3VsZCBqdXN0IGJlIG5vaXNlIHRoZXJlKTsgdGhlIHN0cmVhbSBnZXRzIGV2ZXJ5dGhpbmcuXG5mdW5jdGlvbiB3cml0ZShraW5kOiBzdHJpbmcsIGVudHJ5OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSwgYWxzb0NvbnNvbGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoYWxzb0NvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFske2tpbmR9XSAke0pTT04uc3RyaW5naWZ5KGVudHJ5KX1gKTtcbiAgICB9XG4gICAgbGV0IGxvZ3MgPSBnZXRMb2dzKCk7XG4gICAgaWYgKCFsb2dzKSByZXR1cm47XG4gICAgbG9ncy5sb2coeyBraW5kLCB0aW1lOiBEYXRlLm5vdygpLCAuLi5iYXNlRmllbGRzKCksIC4uLmVudHJ5IH0pO1xufVxuXG4vKiogT25lIG11dGF0aW9uIHRoZSBzZXJ2ZXIgcGVyZm9ybWVkOiBzZXQvZGVsL21vdmUvdW5kZWxldGUvc2V0TGFyZ2Uvcm91dGluZ0NvbmZpZywgcGx1cyB0aGUgcGVyLWZpbGUgc3luY2hyb25pemF0aW9uIHdyaXRlcyAoXCJzeW5jIGdldFwiL1wic3luYyBzZXRcIikuIFNpemVzIGFuZCB0aW1lcywgbmV2ZXIgdGhlIGRhdGEuIGludGVybmFsIG1hcmtzIHdyaXRlcyBwdXNoZWQgYnkgYSBwZWVyJ3Mgc3luY2hyb25pemF0aW9uIHJhdGhlciB0aGFuIGEgY2xpZW50LiBBbHNvIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nTXV0YXRpb24oZW50cnk6IHsgb3A6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHN0b3JlPzogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IHRvUGF0aD86IHN0cmluZzsgc2l6ZT86IG51bWJlcjsgd3JpdGVUaW1lPzogbnVtYmVyOyBjYWxsZXJJZD86IHN0cmluZzsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICB3cml0ZShcIm11dGF0aW9uXCIsIGVudHJ5LCB0cnVlKTtcbn1cblxuLyoqIEEgc3luY2hyb25pemF0aW9uIGtleSBwb2ludDogc2NhbnMgYW5kIGZ1bGwgc3luY3Mgc3RhcnRpbmcvZmluaXNoaW5nLCByZWNvbmNpbGVzLCBib3VuZGFyeSBzY2FucyAtIHdoYXQgYW4gb3BlcmF0b3IgZ3JlcHMgZm9yIHRvIHNlZSB3aGV0aGVyIHRoZSBmbGVldCBpcyBjb252ZXJnaW5nLiBBbHNvIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nU3luY0V2ZW50KGVudHJ5OiB7IGV2ZW50OiBzdHJpbmc7IHN0b3JlOiBzdHJpbmc7IHNvdXJjZT86IHN0cmluZzsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KTogdm9pZCB7XG4gICAgd3JpdGUoXCJzeW5jXCIsIGVudHJ5LCB0cnVlKTtcbn1cblxuLyoqIE9uZSBjb25zb2xlLmVycm9yIGlzIGFsbCBhbiBlcnJvciB0YWtlcyAoY29uc29sZS5lcnJvciBhbmQgY29uc29sZS53YXJuIGFyZSBIT09LRUQgdG8gZmVlZCB0aGUgc3RyZWFtKSAtIHRoaXMganVzdCBndWFyYW50ZWVzIHRoZSBob29rIGlzIGluc3RhbGxlZCBmaXJzdCwgZm9yIHZlcnktZWFybHkgY2FsbGVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dTdG9yYWdlRXJyb3IobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgZ2V0TG9ncygpO1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG59XG5cbi8vIEV2ZXJ5dGhpbmcgY29uc29sZS5lcnJvcmVkIG9yIGNvbnNvbGUud2FybmVkIGFsc28gbGFuZHMgaW4gdGhlIGxvZyBzdHJlYW0gKHdpdGggYSByZWVudHJhbmN5IGd1YXJkOiBhIGZhaWx1cmUgSU5TSURFIGxvZ2dpbmcgbXVzdCBub3QgbG9nIGl0c2VsZiBmb3JldmVyKVxubGV0IHdyaXRpbmdIb29rZWQgPSBmYWxzZTtcbmNvbnN0IGhvb2tFcnJvckxvZ2dpbmcgPSBsYXp5KCgpID0+IHtcbiAgICBmb3IgKGxldCBsZXZlbCBvZiBbXCJlcnJvclwiLCBcIndhcm5cIl0gYXMgY29uc3QpIHtcbiAgICAgICAgbGV0IG9yaWdpbmFsID0gY29uc29sZVtsZXZlbF0uYmluZChjb25zb2xlKTtcbiAgICAgICAgY29uc29sZVtsZXZlbF0gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICBvcmlnaW5hbCguLi5hcmdzKTtcbiAgICAgICAgICAgIGlmICh3cml0aW5nSG9va2VkKSByZXR1cm47XG4gICAgICAgICAgICB3cml0aW5nSG9va2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd3JpdGUobGV2ZWwsIHsgbWVzc2FnZTogYXJncy5tYXAoeCA9PiB0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiAmJiB4IHx8ICgoeCBhcyBFcnJvcik/LnN0YWNrID8/IEpTT04uc3RyaW5naWZ5KHgpKSkuam9pbihcIiBcIikuc2xpY2UoMCwgNTAwMCkgfSwgZmFsc2UpO1xuICAgICAgICAgICAgfSBjYXRjaCB7IH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgd3JpdGluZ0hvb2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn0pO1xuXG4vKiogVGhlIGxvZyBmaWxlcyB0aGlzIHNlcnZlciBob2xkcyAtIHNlZSBTdHJlYW1pbmdMb2dzLmxpc3RGaWxlcy4gRW1wdHkgb24gcHJvY2Vzc2VzIHdpdGggbm8gc3RvcmFnZSBmb2xkZXIuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFN0b3JhZ2VMb2dGaWxlcygpOiBQcm9taXNlPExvZ0ZpbGVJbmZvW10+IHtcbiAgICBsZXQgbG9ncyA9IGdldExvZ3MoKTtcbiAgICBpZiAoIWxvZ3MpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXdhaXQgbG9ncy5saXN0RmlsZXMoKTtcbn1cblxuLyoqIE9uZSBsb2cgZmlsZSdzIGJ5dGVzLCBhbHdheXMgTFo0LWNvbXByZXNzZWQgLSBzZWUgU3RyZWFtaW5nTG9ncy5yZWFkRmlsZUNvbXByZXNzZWQgKGRlY29kZSB3aXRoIGRlY29kZUxvZ0ZpbGUpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTdG9yYWdlTG9nRmlsZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGxldCBsb2dzID0gZ2V0TG9ncygpO1xuICAgIGlmICghbG9ncykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoaXMgcHJvY2VzcyBoYXMgbm8gc3RvcmFnZSBmb2xkZXIsIHNvIGl0IGhhcyBubyBsb2dzIHRvIHJlYWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGxvZ3MucmVhZEZpbGVDb21wcmVzc2VkKG5hbWUpO1xufVxuIl19
128
- /* _JS_SOURCE_HASH = "81fef140ce9d0a1c09da64d7ee07a0fbf41c9c9ae4f403b341e8ad72e637dc1d"; */
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZUxvZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yYWdlTG9ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLHlEQUFtRDtBQUNuRCxvREFBOEQ7QUFDOUQsaURBQWtGO0FBQ2xGLGtEQUF3RDtBQUV4RCwyWkFBMlo7QUFFOVksUUFBQSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7QUFFdkMsbUxBQW1MO0FBQ25MLElBQUksWUFBdUMsQ0FBQztBQUM1QyxTQUFTLE9BQU87SUFDWixJQUFJLFlBQVk7UUFBRSxPQUFPLFlBQVksQ0FBQztJQUN0QyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLENBQUM7UUFDRCxNQUFNLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFBLCtCQUFnQixHQUFFLEVBQUUsd0JBQWdCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ0wsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUNELGdCQUFnQixFQUFFLENBQUM7SUFDbkIsWUFBWSxHQUFHLElBQUksNkJBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLGlCQUFpQjtJQUN0QixLQUFLLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzFELEtBQUssSUFBSSxPQUFPLElBQUksU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtnQkFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDL0UsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLFNB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UUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQUMsQ0FBVyxhQUFYLENBQUMsdUJBQUQsQ0FBQyxDQUFZLEtBQUssbUNBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLEVBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkosQ0FBQztZQUFDLFdBQU0sQ0FBQyxDQUFDLENBQUM7b0JBQVMsQ0FBQztnQkFDakIsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMxQixDQUFDO1FBQ0wsQ0FBQyxDQUFDO0lBQ04sQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsZ0hBQWdIO0FBQ3pHLEtBQUssVUFBVSxtQkFBbUI7SUFDckMsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDckIsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixPQUFPLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFKRCxrREFJQztBQUVELHNIQUFzSDtBQUMvRyxLQUFLLFVBQVUsa0JBQWtCLENBQUMsSUFBWTtJQUNqRCxJQUFJLElBQUksR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUNyQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDUixNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQU5ELGdEQU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBTdHJlYW1pbmdMb2dzLCBMb2dGaWxlSW5mbyB9IGZyb20gXCIuLi9TdHJlYW1pbmdMb2dzXCI7XG5pbXBvcnQgeyBnZXRTdG9yYWdlRm9sZGVyLCBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwgfSBmcm9tIFwiLi9zZXJ2ZXJDb25maWdcIjtcbmltcG9ydCB7IGdldE93blRocmVhZElkIH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvY2VydHNcIjtcblxuLy8gVGhlIHN0b3JhZ2Ugc2VydmVyJ3Mgb3BlcmF0aW9uIGxvZzogZXZlcnkgbXV0YXRpb24gKG5ldmVyIHRoZSBkYXRhIGl0c2VsZiAtIGp1c3Qgd2hhdCBoYXBwZW5lZCwgdG8gd2hhdCwgd2hlbiwgaG93IGJpZywgYW5kIHdobyBhc2tlZCksIGV2ZXJ5IGVycm9yLCBhbmQgdGhlIHN5bmNocm9uaXphdGlvbiBrZXkgcG9pbnRzLCBzdHJlYW1lZCBhcyBKU09OIGxpbmVzIGludG8gPHN0b3JhZ2UgZm9sZGVyPi9sb2dzIChzZWUgU3RyZWFtaW5nTG9ncyBmb3IgdGhlIGZpbGUgbGlmZWN5Y2xlKS4gRXZlcnl0aGluZyBoZXJlIGlzIGEgc2FmZSBuby1vcCBvbiBwcm9jZXNzZXMgdGhhdCBoYXZlIG5vIHN0b3JhZ2UgZm9sZGVyIC0gbG9nZ2luZyBtdXN0IG5ldmVyIGJlIHRoZSB0aGluZyB0aGF0IGJyZWFrcyBhIHJlcXVlc3QuXG5cbmV4cG9ydCBjb25zdCBMT0dTX0ZPTERFUl9OQU1FID0gXCJsb2dzXCI7XG5cbi8vIE5PVCBsYXp5OiBhIGZhaWx1cmUgdG8gcmVzb2x2ZSB0aGUgZm9sZGVyICh0aGUgc2VydmVyIGNvbmZpZyBtYXkgc2ltcGx5IG5vdCBiZSBTRVQgeWV0IHRoaXMgZWFybHkgaW4gc3RhcnR1cCkgbXVzdCBiZSByZXRyaWVkIG9uIHRoZSBuZXh0IGxvZyBjYWxsLCBub3QgY2FjaGVkIGFzIFwibm8gbG9ncyBldmVyXCJcbmxldCBsb2dzSW5zdGFuY2U6IFN0cmVhbWluZ0xvZ3MgfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBnZXRMb2dzKCk6IFN0cmVhbWluZ0xvZ3MgfCB1bmRlZmluZWQge1xuICAgIGlmIChsb2dzSW5zdGFuY2UpIHJldHVybiBsb2dzSW5zdGFuY2U7XG4gICAgbGV0IGZvbGRlcjogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICAgIGZvbGRlciA9IHBhdGguam9pbihnZXRTdG9yYWdlRm9sZGVyKCksIExPR1NfRk9MREVSX05BTUUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBob29rRXJyb3JMb2dnaW5nKCk7XG4gICAgbG9nc0luc3RhbmNlID0gbmV3IFN0cmVhbWluZ0xvZ3MoeyBmb2xkZXIsIHRocmVhZElkOiBnZXRUaHJlYWRJZFNhZmUoKSB9KTtcbiAgICByZXR1cm4gbG9nc0luc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBmaXJzdEV4dGVybmFsSVB2NCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGZvciAobGV0IGFkZHJlc3NlcyBvZiBPYmplY3QudmFsdWVzKG9zLm5ldHdvcmtJbnRlcmZhY2VzKCkpKSB7XG4gICAgICAgIGZvciAobGV0IGFkZHJlc3Mgb2YgYWRkcmVzc2VzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoYWRkcmVzcy5mYW1pbHkgPT09IFwiSVB2NFwiICYmICFhZGRyZXNzLmludGVybmFsKSByZXR1cm4gYWRkcmVzcy5hZGRyZXNzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIE1lbW9pemVkIG9uIFNVQ0NFU1Mgb25seTogdGhlIHRocmVhZCBjZXJ0IG1heSBub3QgYmUgbG9hZGVkIHlldCB3aGVuIHRoZSBmaXJzdCBlbnRyaWVzIGFyZSB3cml0dGVuLCBhbmQgdGhhdCBtdXN0IG5vdCBwZXJtYW5lbnRseSBzdHJpcCB0aGUgdGhyZWFkIGlkIGZyb20gZXZlcnkgbGF0ZXIgZW50cnlcbmxldCBjYWNoZWRUaHJlYWRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuZnVuY3Rpb24gZ2V0VGhyZWFkSWRTYWZlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNhY2hlZFRocmVhZElkKSByZXR1cm4gY2FjaGVkVGhyZWFkSWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY2FjaGVkVGhyZWFkSWQgPSBnZXRPd25UaHJlYWRJZChnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKT8ucm9vdERvbWFpbiB8fCBcIlwiKTtcbiAgICB9IGNhdGNoIHsgfVxuICAgIHJldHVybiBjYWNoZWRUaHJlYWRJZDtcbn1cblxuY29uc3QgY2FjaGVkSXAgPSBsYXp5KCgpID0+IGZpcnN0RXh0ZXJuYWxJUHY0KCkpO1xuXG4vLyB0aHJlYWRJZCBhbmQgZG9tYWluIGFyZSByZS1yZXNvbHZlZCB1bnRpbCBrbm93biAoZWFybHkgZW50cmllcyBtYXkgcHJlZGF0ZSB0aGUgY29uZmlnL2NlcnRzKTsgdGhlIHJlc3QgbmV2ZXIgY2hhbmdlc1xuZnVuY3Rpb24gYmFzZUZpZWxkcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBwaWQ6IHByb2Nlc3MucGlkLFxuICAgICAgICB0aHJlYWRJZDogZ2V0VGhyZWFkSWRTYWZlKCksXG4gICAgICAgIGVudHJ5UG9pbnQ6IHByb2Nlc3MuYXJndlsxXSxcbiAgICAgICAgaXA6IGNhY2hlZElwKCksXG4gICAgICAgIGRvbWFpbjogZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCk/LmRvbWFpbixcbiAgICB9O1xufVxuXG4vLyBFdmVyeXRoaW5nIGxvZ2dlZCBoZXJlIGdvZXMgQk9USCB0byB0aGUgc3RvcmFnZSBsb2cgc3RyZWFtIGFuZCB0aGUgY29uc29sZSAtIG9uZSBjYWxsLCBuZXZlciB0d28uIFRoZSBjb25zb2xlIGxpbmUgY2FycmllcyBvbmx5IHRoZSBlbnRyeSAodGhlIGJhc2UgZmllbGRzIGFyZSBjb25zdGFudCBwZXIgcHJvY2Vzcywgc28gdGhleSB3b3VsZCBqdXN0IGJlIG5vaXNlIHRoZXJlKTsgdGhlIHN0cmVhbSBnZXRzIGV2ZXJ5dGhpbmcuXG5mdW5jdGlvbiB3cml0ZShraW5kOiBzdHJpbmcsIGVudHJ5OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSwgYWxzb0NvbnNvbGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoYWxzb0NvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFske2tpbmR9XSAke0pTT04uc3RyaW5naWZ5KGVudHJ5KX1gKTtcbiAgICB9XG4gICAgbGV0IGxvZ3MgPSBnZXRMb2dzKCk7XG4gICAgaWYgKCFsb2dzKSByZXR1cm47XG4gICAgbG9ncy5sb2coeyBraW5kLCB0aW1lOiBEYXRlLm5vdygpLCAuLi5iYXNlRmllbGRzKCksIC4uLmVudHJ5IH0pO1xufVxuXG4vKiogT25lIG11dGF0aW9uIHRoZSBzZXJ2ZXIgcGVyZm9ybWVkOiBzZXQvZGVsL21vdmUvdW5kZWxldGUvc2V0TGFyZ2Uvcm91dGluZ0NvbmZpZywgcGx1cyB0aGUgcGVyLWZpbGUgc3luY2hyb25pemF0aW9uIHdyaXRlcyAoXCJzeW5jIGdldFwiL1wic3luYyBzZXRcIikuIFNpemVzIGFuZCB0aW1lcywgbmV2ZXIgdGhlIGRhdGEuIGludGVybmFsIG1hcmtzIHdyaXRlcyBwdXNoZWQgYnkgYSBwZWVyJ3Mgc3luY2hyb25pemF0aW9uIHJhdGhlciB0aGFuIGEgY2xpZW50LiBTdHJlYW0tb25seSAtIG9uZSBlbnRyeSBwZXIgd3JpdGUgaXMgZXhhY3RseSB3aGF0IHRoZSBjb25zb2xlIGRvZXMgTk9UIG5lZWQuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nTXV0YXRpb24oZW50cnk6IHsgb3A6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHN0b3JlPzogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IHRvUGF0aD86IHN0cmluZzsgc2l6ZT86IG51bWJlcjsgd3JpdGVUaW1lPzogbnVtYmVyOyBjYWxsZXJJZD86IHN0cmluZzsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICB3cml0ZShcIm11dGF0aW9uXCIsIGVudHJ5LCBmYWxzZSk7XG59XG5cbi8qKiBBIHN5bmNocm9uaXphdGlvbiBrZXkgcG9pbnQ6IHNjYW5zIGFuZCBmdWxsIHN5bmNzIHN0YXJ0aW5nL2ZpbmlzaGluZywgcmVjb25jaWxlcywgYm91bmRhcnkgc2NhbnMgLSB3aGF0IGFuIG9wZXJhdG9yIGdyZXBzIGZvciB0byBzZWUgd2hldGhlciB0aGUgZmxlZXQgaXMgY29udmVyZ2luZy4gQWxzbyBwcmludGVkIHRvIHRoZSBjb25zb2xlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ1N5bmNFdmVudChlbnRyeTogeyBldmVudDogc3RyaW5nOyBzdG9yZTogc3RyaW5nOyBzb3VyY2U/OiBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSk6IHZvaWQge1xuICAgIHdyaXRlKFwic3luY1wiLCBlbnRyeSwgdHJ1ZSk7XG59XG5cbi8qKiBPbmUgY29uc29sZS5lcnJvciBpcyBhbGwgYW4gZXJyb3IgdGFrZXMgKGNvbnNvbGUuZXJyb3IgYW5kIGNvbnNvbGUud2FybiBhcmUgSE9PS0VEIHRvIGZlZWQgdGhlIHN0cmVhbSkgLSB0aGlzIGp1c3QgZ3VhcmFudGVlcyB0aGUgaG9vayBpcyBpbnN0YWxsZWQgZmlyc3QsIGZvciB2ZXJ5LWVhcmx5IGNhbGxlcnMuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nU3RvcmFnZUVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGdldExvZ3MoKTtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xufVxuXG4vLyBFdmVyeXRoaW5nIGNvbnNvbGUuZXJyb3JlZCBvciBjb25zb2xlLndhcm5lZCBhbHNvIGxhbmRzIGluIHRoZSBsb2cgc3RyZWFtICh3aXRoIGEgcmVlbnRyYW5jeSBndWFyZDogYSBmYWlsdXJlIElOU0lERSBsb2dnaW5nIG11c3Qgbm90IGxvZyBpdHNlbGYgZm9yZXZlcilcbmxldCB3cml0aW5nSG9va2VkID0gZmFsc2U7XG5jb25zdCBob29rRXJyb3JMb2dnaW5nID0gbGF6eSgoKSA9PiB7XG4gICAgZm9yIChsZXQgbGV2ZWwgb2YgW1wiZXJyb3JcIiwgXCJ3YXJuXCJdIGFzIGNvbnN0KSB7XG4gICAgICAgIGxldCBvcmlnaW5hbCA9IGNvbnNvbGVbbGV2ZWxdLmJpbmQoY29uc29sZSk7XG4gICAgICAgIGNvbnNvbGVbbGV2ZWxdID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgICAgb3JpZ2luYWwoLi4uYXJncyk7XG4gICAgICAgICAgICBpZiAod3JpdGluZ0hvb2tlZCkgcmV0dXJuO1xuICAgICAgICAgICAgd3JpdGluZ0hvb2tlZCA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdyaXRlKGxldmVsLCB7IG1lc3NhZ2U6IGFyZ3MubWFwKHggPT4gdHlwZW9mIHggPT09IFwic3RyaW5nXCIgJiYgeCB8fCAoKHggYXMgRXJyb3IpPy5zdGFjayA/PyBKU09OLnN0cmluZ2lmeSh4KSkpLmpvaW4oXCIgXCIpLnNsaWNlKDAsIDUwMDApIH0sIGZhbHNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHdyaXRpbmdIb29rZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59KTtcblxuLyoqIFRoZSBsb2cgZmlsZXMgdGhpcyBzZXJ2ZXIgaG9sZHMgLSBzZWUgU3RyZWFtaW5nTG9ncy5saXN0RmlsZXMuIEVtcHR5IG9uIHByb2Nlc3NlcyB3aXRoIG5vIHN0b3JhZ2UgZm9sZGVyLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTdG9yYWdlTG9nRmlsZXMoKTogUHJvbWlzZTxMb2dGaWxlSW5mb1tdPiB7XG4gICAgbGV0IGxvZ3MgPSBnZXRMb2dzKCk7XG4gICAgaWYgKCFsb2dzKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGF3YWl0IGxvZ3MubGlzdEZpbGVzKCk7XG59XG5cbi8qKiBPbmUgbG9nIGZpbGUncyBieXRlcywgYWx3YXlzIExaNC1jb21wcmVzc2VkIC0gc2VlIFN0cmVhbWluZ0xvZ3MucmVhZEZpbGVDb21wcmVzc2VkIChkZWNvZGUgd2l0aCBkZWNvZGVMb2dGaWxlKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkU3RvcmFnZUxvZ0ZpbGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBsZXQgbG9ncyA9IGdldExvZ3MoKTtcbiAgICBpZiAoIWxvZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIHByb2Nlc3MgaGFzIG5vIHN0b3JhZ2UgZm9sZGVyLCBzbyBpdCBoYXMgbm8gbG9ncyB0byByZWFkYCk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBsb2dzLnJlYWRGaWxlQ29tcHJlc3NlZChuYW1lKTtcbn1cbiJdfQ==
128
+ /* _JS_SOURCE_HASH = "f86b5463724c925b2746a25399d35510958d35837879980b9d9dd00c4a943c8d"; */