sliftutils 1.7.87 → 1.7.89

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 (127) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/dist/treeSummary.ts.cache +2 -2
  3. package/index.d.ts +675 -296
  4. package/misc/dist/environment.ts.cache +2 -2
  5. package/misc/dist/getSecret.ts.cache +2 -2
  6. package/misc/dist/strings.ts.cache +2 -2
  7. package/misc/dist/zip.ts.cache +2 -2
  8. package/misc/https/dist/certs.ts.cache +2 -2
  9. package/misc/https/dist/cloudflareHelpers.ts.cache +2 -2
  10. package/misc/https/dist/dns.ts.cache +2 -2
  11. package/misc/https/dist/hostServer.ts.cache +49 -21
  12. package/misc/https/dist/hostsFile.ts.cache +82 -0
  13. package/misc/https/dist/httpsCerts.ts.cache +2 -2
  14. package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
  15. package/misc/https/hostServer.d.ts +6 -2
  16. package/misc/https/hostServer.ts +52 -19
  17. package/misc/https/hostsFile.d.ts +7 -0
  18. package/misc/https/hostsFile.ts +66 -0
  19. package/package.json +1 -1
  20. package/render-utils/dist/observer.tsx.cache +2 -2
  21. package/storage/ArchivesDisk.d.ts +3 -6
  22. package/storage/ArchivesDisk.ts +26 -2
  23. package/storage/BulkDatabase2/BulkDatabaseReader.ts +1 -1
  24. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
  25. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
  26. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
  27. package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +3 -3
  28. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
  29. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
  30. package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
  31. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
  32. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
  33. package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
  34. package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
  35. package/storage/IArchives.d.ts +37 -24
  36. package/storage/IArchives.ts +47 -62
  37. package/storage/LogMap.d.ts +56 -0
  38. package/storage/LogMap.ts +220 -0
  39. package/storage/archiveHelpers.d.ts +36 -0
  40. package/storage/archiveHelpers.ts +103 -0
  41. package/storage/backblaze.d.ts +7 -12
  42. package/storage/backblaze.ts +53 -48
  43. package/storage/dist/ArchivesDisk.ts.cache +28 -2
  44. package/storage/dist/FileFolderAPI.tsx.cache +2 -2
  45. package/storage/dist/IArchives.ts.cache +16 -52
  46. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  47. package/storage/dist/JSONStorage.ts.cache +2 -2
  48. package/storage/dist/LogMap.ts.cache +212 -0
  49. package/storage/dist/PendingManager.tsx.cache +2 -2
  50. package/storage/dist/TransactionStorage.ts.cache +2 -2
  51. package/storage/dist/backblaze.ts.cache +58 -44
  52. package/storage/dist/fileSystemPointer.ts.cache +2 -2
  53. package/storage/dist/remoteFileStorage.ts.cache +2 -2
  54. package/storage/remoteStorage/ArchivesDelayed.d.ts +66 -0
  55. package/storage/remoteStorage/ArchivesDelayed.ts +237 -0
  56. package/storage/remoteStorage/ArchivesRemote.d.ts +5 -6
  57. package/storage/remoteStorage/ArchivesRemote.ts +26 -5
  58. package/storage/remoteStorage/ArchivesUrl.d.ts +2 -5
  59. package/storage/remoteStorage/ArchivesUrl.ts +2 -2
  60. package/storage/remoteStorage/accessPage.tsx +12 -0
  61. package/storage/remoteStorage/accessStats.d.ts +1 -1
  62. package/storage/remoteStorage/accessStats.ts +3 -3
  63. package/storage/remoteStorage/blobStore.d.ts +162 -189
  64. package/storage/remoteStorage/blobStore.ts +495 -952
  65. package/storage/remoteStorage/bucketDisk.d.ts +24 -3
  66. package/storage/remoteStorage/bucketDisk.ts +56 -22
  67. package/storage/remoteStorage/certTrustModal.d.ts +1 -0
  68. package/storage/remoteStorage/certTrustModal.tsx +48 -0
  69. package/storage/remoteStorage/cliArgs.d.ts +2 -0
  70. package/storage/remoteStorage/cliArgs.ts +5 -0
  71. package/storage/remoteStorage/createArchives.d.ts +8 -7
  72. package/storage/remoteStorage/createArchives.ts +65 -26
  73. package/storage/remoteStorage/deployTakeover.ts +1 -1
  74. package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +220 -0
  75. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +25 -5
  76. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +3 -3
  77. package/storage/remoteStorage/dist/accessPage.tsx.cache +13 -3
  78. package/storage/remoteStorage/dist/accessStats.ts.cache +6 -6
  79. package/storage/remoteStorage/dist/blobStore.ts.cache +483 -965
  80. package/storage/remoteStorage/dist/bucketDisk.ts.cache +60 -29
  81. package/storage/remoteStorage/dist/certTrustModal.tsx.cache +55 -0
  82. package/storage/remoteStorage/dist/cliArgs.ts.cache +9 -4
  83. package/storage/remoteStorage/dist/createArchives.ts.cache +63 -26
  84. package/storage/remoteStorage/dist/deployTakeover.ts.cache +5 -5
  85. package/storage/remoteStorage/dist/intermediateManagement.ts.cache +286 -0
  86. package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
  87. package/storage/remoteStorage/dist/remoteConfig.ts.cache +122 -56
  88. package/storage/remoteStorage/dist/serverConfig.ts.cache +4 -4
  89. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +7 -11
  90. package/storage/remoteStorage/dist/sourcesList.ts.cache +3 -6
  91. package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
  92. package/storage/remoteStorage/dist/storageController.ts.cache +27 -12
  93. package/storage/remoteStorage/dist/storageServer.ts.cache +27 -7
  94. package/storage/remoteStorage/dist/storageServerCli.ts.cache +7 -3
  95. package/storage/remoteStorage/dist/storageServerState.ts.cache +133 -696
  96. package/storage/remoteStorage/dist/storeConfig.ts.cache +52 -0
  97. package/storage/remoteStorage/dist/storePlan.ts.cache +110 -81
  98. package/storage/remoteStorage/dist/storeSources.ts.cache +51 -0
  99. package/storage/remoteStorage/dist/storeSync.ts.cache +650 -0
  100. package/storage/remoteStorage/dist/validation.ts.cache +14 -4
  101. package/storage/remoteStorage/intermediateManagement.d.ts +12 -0
  102. package/storage/remoteStorage/intermediateManagement.ts +264 -0
  103. package/storage/remoteStorage/remoteConfig.d.ts +32 -0
  104. package/storage/remoteStorage/remoteConfig.ts +115 -50
  105. package/storage/remoteStorage/serverConfig.d.ts +1 -1
  106. package/storage/remoteStorage/serverConfig.ts +1 -1
  107. package/storage/remoteStorage/sourceWrapper.ts +4 -8
  108. package/storage/remoteStorage/sourcesList.d.ts +0 -2
  109. package/storage/remoteStorage/sourcesList.ts +0 -3
  110. package/storage/remoteStorage/spec.md +18 -4
  111. package/storage/remoteStorage/storageController.d.ts +10 -0
  112. package/storage/remoteStorage/storageController.ts +29 -16
  113. package/storage/remoteStorage/storageServer.d.ts +2 -0
  114. package/storage/remoteStorage/storageServer.ts +28 -4
  115. package/storage/remoteStorage/storageServerCli.ts +5 -1
  116. package/storage/remoteStorage/storageServerState.d.ts +34 -21
  117. package/storage/remoteStorage/storageServerState.ts +147 -662
  118. package/storage/remoteStorage/storeConfig.d.ts +30 -0
  119. package/storage/remoteStorage/storeConfig.ts +62 -0
  120. package/storage/remoteStorage/storePlan.d.ts +29 -17
  121. package/storage/remoteStorage/storePlan.ts +112 -85
  122. package/storage/remoteStorage/storeSources.d.ts +11 -0
  123. package/storage/remoteStorage/storeSources.ts +47 -0
  124. package/storage/remoteStorage/storeSync.d.ts +53 -0
  125. package/storage/remoteStorage/storeSync.ts +632 -0
  126. package/storage/remoteStorage/validation.d.ts +2 -0
  127. package/storage/remoteStorage/validation.ts +10 -0
@@ -1,14 +1,15 @@
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
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
- //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.filterChanges = exports.getRoute = exports.parseVariableRoute = exports.ROUTING_FILE = void 0;
6
+ //exports.serializeRemoteConfig = exports.parseRoutingData = exports.sourcePersistentUrl = exports.sourceIdentity = exports.assertValidRemoteConfig = exports.normalizeRemoteConfig = exports.normalizeSource = exports.replaceHostedUrlPort = exports.parseBackblazeUrl = exports.parseHostedUrl = exports.buildFileUrl = exports.getBucketBaseUrl = exports.getConfigVersion = exports.routeIntersection = exports.routesOverlap = exports.routeContains = exports.filterChanges = exports.getRoute = exports.parseVariableRoute = exports.ROUTING_FILE = void 0;
7
7
  const misc_1 = require("socket-function/src/misc");
8
8
  const bits_1 = require("socket-function/src/bits");
9
9
  const compileFlags_1 = require("socket-function/require/compileFlags");
10
10
  const js_sha256_1 = __importDefault(require("js-sha256"));
11
11
  const IArchives_1 = require("../IArchives");
12
+ const validation_1 = require("./validation");
12
13
  (0, compileFlags_1.setFlag)(require, "js-sha256", "allowclient", true);
13
14
  // Parsing / normalization of RemoteConfig (see IArchives.ts). Every bucket stores its own configuration (a RemoteConfig) inside itself, at ROUTING_FILE. Writing that file creates the bucket / reconfigures it (see storageServerState.ts); clients reconcile it by version (see createArchives.ts).
14
15
  exports.ROUTING_FILE = "storage/storagerouting.json";
@@ -120,40 +121,88 @@ function replaceHostedUrlPort(url, port) {
120
121
  return u.toString();
121
122
  }
122
123
  exports.replaceHostedUrlPort = replaceHostedUrlPort;
124
+ /**
125
+ * Puts a source into the shape the code expects. It does NOT judge it: this runs every time a config
126
+ * is READ, and a config that is already on disk has to keep working - a server that cannot parse its
127
+ * own routing file is a server that cannot serve, and it would stay that way forever. Anything
128
+ * missing or unusable is filled in with the safest equivalent instead, loudly where it matters.
129
+ *
130
+ * Judging happens on the way IN, in assertValidRemoteConfig.
131
+ */
123
132
  function normalizeSource(source) {
124
133
  if (typeof source !== "string") {
125
- let window = source.validWindow;
126
- if (!Array.isArray(window) || window.length !== 2 || !window.every(x => typeof x === "number")) {
127
- throw new Error(`Object source configs must specify validWindow ([startMs, endMs] of the write times the source is valid for) - configuration changes must be scheduled, not flipped instantly. Use FULL_VALID_WINDOW when the source is always valid. Was ${JSON.stringify(window)} on ${JSON.stringify(source).slice(0, 500)}`);
128
- }
129
- let route = source.route;
130
- if (route !== undefined && (!Array.isArray(route) || route.length !== 2 || !route.every(x => typeof x === "number") || route[0] < 0 || route[1] > 1 || route[0] >= route[1])) {
131
- throw new Error(`Source route must be a [start, end) fraction range within [0, 1] with start < end, was ${JSON.stringify(route)} on ${JSON.stringify(source).slice(0, 500)}`);
132
- }
133
- if (source.readerDiskLimit !== undefined) {
134
- if (typeof source.readerDiskLimit !== "number" || source.readerDiskLimit <= 0) {
135
- throw new Error(`readerDiskLimit must be a positive byte count, was ${JSON.stringify(source.readerDiskLimit)} on ${JSON.stringify(source).slice(0, 500)}`);
136
- }
137
- if (!source.noFullSync) {
138
- throw new Error(`readerDiskLimit requires noFullSync: a full copy cannot be bounded, only a read cache can. On ${JSON.stringify(source).slice(0, 500)}`);
134
+ let normalized = { ...source };
135
+ // Configs written before names existed have none, and a name that could not be a folder cannot be used as one. Both get the derived name: deterministic, so every server picks the same one for the same entry.
136
+ if (!isUsableSourceName(normalized.name)) {
137
+ let derived = derivedSourceName(normalized);
138
+ if (normalized.name !== undefined) {
139
+ console.error(`Source name ${JSON.stringify(normalized.name)} in a routing config cannot be used as a folder name, so this entry is being read as ${JSON.stringify(derived)}: ${JSON.stringify(source).slice(0, 500)}`);
139
140
  }
141
+ normalized.name = derived;
140
142
  }
141
- if (source.type === "remote") {
142
- // Throws if the URL is malformed, so bad configs are rejected before they're stored
143
- parseHostedUrl(source.url);
143
+ let window = normalized.validWindow;
144
+ if (!Array.isArray(window) || window.length !== 2 || !window.every(x => typeof x === "number")) {
145
+ console.error(`Source ${JSON.stringify(normalized.name)} has no usable validWindow (${JSON.stringify(window)}), reading it as always valid: ${JSON.stringify(source).slice(0, 500)}`);
146
+ normalized.validWindow = IArchives_1.FULL_VALID_WINDOW;
147
+ }
148
+ let route = normalized.route;
149
+ if (route !== undefined && !isUsableRoute(route)) {
150
+ console.error(`Source ${JSON.stringify(normalized.name)} has an unusable route (${JSON.stringify(route)}), reading it as the whole key space: ${JSON.stringify(source).slice(0, 500)}`);
151
+ normalized.route = undefined;
144
152
  }
145
- return source;
153
+ return normalized;
146
154
  }
147
155
  let hostname = new URL(source).hostname;
148
156
  if (hostname.endsWith(".backblazeb2.com")) {
149
157
  // Validates the URL (throws on malformed) before it's stored; the bucket name is read back out of the URL at use sites, never stored on the config.
150
- parseBackblazeUrl(source);
151
- return { type: "backblaze", url: source, validWindow: IArchives_1.FULL_VALID_WINDOW, public: true };
158
+ let parsed = parseBackblazeUrl(source);
159
+ return { type: "backblaze", url: source, name: sanitizeSourceName(parsed.bucketName), validWindow: IArchives_1.FULL_VALID_WINDOW, public: true };
152
160
  }
153
- parseHostedUrl(source);
154
- return { type: "remote", url: source, validWindow: IArchives_1.FULL_VALID_WINDOW, public: true };
161
+ let parsed = parseHostedUrl(source);
162
+ return { type: "remote", url: source, name: sanitizeSourceName(`${parsed.address}-${parsed.port}`), validWindow: IArchives_1.FULL_VALID_WINDOW, public: true };
155
163
  }
156
164
  exports.normalizeSource = normalizeSource;
165
+ function isUsableSourceName(name) {
166
+ if (!name)
167
+ return false;
168
+ try {
169
+ (0, validation_1.assertValidSourceName)(name);
170
+ return true;
171
+ }
172
+ catch (_a) {
173
+ return false;
174
+ }
175
+ }
176
+ function isUsableRoute(route) {
177
+ if (!Array.isArray(route) || route.length !== 2 || !route.every(x => typeof x === "number"))
178
+ return false;
179
+ return route[0] >= 0 && route[1] <= 1 && route[0] < route[1];
180
+ }
181
+ /** The name an entry gets when it has no usable one of its own: the endpoint it points at, plus its route when it has one - so entries that were distinct storage before names existed stay distinct now. */
182
+ function derivedSourceName(source) {
183
+ let endpoint = source.url;
184
+ if (source.type === "remote") {
185
+ let parsed = parseHostedUrl(source.url);
186
+ endpoint = `${parsed.address}-${parsed.port}`;
187
+ }
188
+ else {
189
+ endpoint = parseBackblazeUrl(source.url).bucketName;
190
+ }
191
+ let route = source.route;
192
+ if (route && isUsableRoute(route) && !(route[0] === IArchives_1.FULL_ROUTE[0] && route[1] === IArchives_1.FULL_ROUTE[1])) {
193
+ endpoint += `-route-${route[0]}-${route[1]}`;
194
+ }
195
+ return sanitizeSourceName(endpoint);
196
+ }
197
+ /** A name built from something that was never meant to be one (a host, a bucket), made usable as a folder. Periods survive, so it still reads as what it came from. */
198
+ function sanitizeSourceName(from) {
199
+ let name = from.replace(/[^\w.-]/g, "-").slice(0, 64);
200
+ if (!isUsableSourceName(name)) {
201
+ // Only reachable from something with no usable characters at all; the name still has to exist
202
+ return "source";
203
+ }
204
+ return name;
205
+ }
157
206
  /** How far up from 0 the sources' routes reach without a gap (1 means the whole key space). */
158
207
  function getRouteCoverage(sources) {
159
208
  let routes = sources.map(x => x.route || IArchives_1.FULL_ROUTE);
@@ -166,16 +215,23 @@ function getRouteCoverage(sources) {
166
215
  }
167
216
  return covered;
168
217
  }
218
+ /** Puts a whole config into the shape the code expects, without judging it - see normalizeSource, and see assertValidRemoteConfig for the judging. */
169
219
  function normalizeRemoteConfig(config) {
170
- let result;
171
220
  if (typeof config !== "string" && "sources" in config) {
172
- result = { version: config.version, sources: config.sources.map(normalizeSource) };
173
- }
174
- else {
175
- result = { sources: [normalizeSource(config)] };
221
+ return { version: config.version, sources: config.sources.map(normalizeSource) };
176
222
  }
223
+ return { sources: [normalizeSource(config)] };
224
+ }
225
+ exports.normalizeRemoteConfig = normalizeRemoteConfig;
226
+ /**
227
+ * Whether a config may be WRITTEN. Everything here is a rule about the config as a whole, which is
228
+ * exactly why it cannot run on read: a config that is already stored somewhere has to keep being
229
+ * readable, or a server that once accepted a bad one could never start again. Rejecting it at the
230
+ * point it is introduced is what keeps a bad one from ever being stored in the first place.
231
+ */
232
+ function assertValidRemoteConfig(config) {
233
+ let sources = config.sources.map(normalizeSource);
177
234
  // Mixed immutability makes no sense AMONG sources valid at the same time: a mutable source would accept overwrites that its immutable peers refuse to synchronize, forking their contents. Sources are grouped by transitively overlapping valid windows (absorb everything overlapping the group, extend the group's end, repeat) - a soft check that is correct as long as windows have clean breaks (a group ends exactly where the next begins).
178
- let sources = result.sources.map(normalizeSource);
179
235
  let sorted = [...sources];
180
236
  (0, misc_1.sort)(sorted, x => x.validWindow[0]);
181
237
  let group = [];
@@ -190,22 +246,7 @@ function normalizeRemoteConfig(config) {
190
246
  if (covered < 1) {
191
247
  throw new Error(`Sources with overlapping valid windows must cover the full route space [0, 1); coverage stops at ${covered}. Sources: ${JSON.stringify(group.map(x => ({ url: x.url, validWindow: x.validWindow, route: x.route || IArchives_1.FULL_ROUTE })))}`);
192
248
  }
193
- // Every bucket must ALSO cover the full route space across its own entries, because all of a bucket's entries share one disk. A bucket that only ever synchronizes part of the key space never learns about deletions in the rest of it - and tombstones expire, so files it still holds from a route it no longer serves eventually look like live files again, and get resurrected into the chain by its next scan. An entry with no route (implicitly the full space) satisfies this on its own, which is why the usual configuration lists each bucket once per shard AND once unsharded.
194
- let byUrl = new Map();
195
- for (let source of group) {
196
- let entries = byUrl.get(source.url);
197
- if (!entries) {
198
- entries = [];
199
- byUrl.set(source.url, entries);
200
- }
201
- entries.push(source);
202
- }
203
- for (let [url, entries] of byUrl) {
204
- let urlCovered = getRouteCoverage(entries);
205
- if (urlCovered < 1) {
206
- throw new Error(`Every bucket must cover the full route space [0, 1) across its own entries with overlapping valid windows, but ${url} only covers up to ${urlCovered} (its routes: ${JSON.stringify(entries.map(x => x.route || IArchives_1.FULL_ROUTE))}). Add an entry for it with no route (or entries whose routes span the rest), alongside its sharded entries. This is enforced because a bucket's entries all share one disk: if it only ever synchronizes part of the key space, it never sees deletions in the rest, and once those tombstones expire the files it still holds are resurrected into the chain by its next scan.`);
207
- }
208
- }
249
+ // A store is NOT required to cover the whole key space on its own. It once was, because a store that holds keys outside the route it synchronizes never learns of their deletions and eventually resurrects them - but a store's data now lives under its name rather than its route, and a scan only ever indexes keys inside the route the store is configured for, so keys outside it are never taken into the index that could resurrect them. What replaces that rule is the naming discipline: a name is one storage, and pointing a name at a different route later is what would hand it keys it never synchronized.
209
250
  }
210
251
  for (let source of sorted) {
211
252
  if (group.length && source.validWindow[0] >= groupEnd) {
@@ -216,24 +257,49 @@ function normalizeRemoteConfig(config) {
216
257
  groupEnd = Math.max(groupEnd, source.validWindow[1]);
217
258
  }
218
259
  checkGroup();
219
- // Two entries with the EXACT same URL and the SAME route may never be valid at the same time: on that server the route maps to exactly one on-disk folder and one store, so simultaneous duplicates would collide on it. A different port is a different server. Non-overlapping windows are fine; that is how transitions between windows work.
260
+ // ONE entry per store at any instant. A name is a store - one folder, one index - so two entries naming it at the same time would be two answers to "what is this store configured to be right now", and every route and flag it reads would depend on which entry you happened to look at. Non-overlapping windows are fine, and are how a store's configuration changes over time.
220
261
  for (let i = 0; i < sources.length; i++) {
221
262
  for (let j = i + 1; j < sources.length; j++) {
222
263
  let a = sources[i];
223
264
  let b = sources[j];
224
- if (sourceRouteIdentity(a) !== sourceRouteIdentity(b))
265
+ if (storeIdentity(a) !== storeIdentity(b))
225
266
  continue;
226
267
  if (a.validWindow[0] < b.validWindow[1] && b.validWindow[0] < a.validWindow[1]) {
227
- throw new Error(`Two sources with the same URL have the same route with overlapping valid windows - on that server the route maps to one on-disk folder, so these would collide. Give same-route entries non-overlapping windows instead. Conflicting: ${JSON.stringify(a)} and ${JSON.stringify(b)}`);
268
+ throw new Error(`The name ${JSON.stringify(a.name)} is reused with multiple source configurations at the same time:\n ${JSON.stringify(a)}\n ${JSON.stringify(b)}\nA name is one store - one folder, one index - so it can only be configured one way at a time. Give them non-overlapping valid windows, or different names if they are meant to be different storage.`);
228
269
  }
229
270
  }
230
271
  }
231
- return result;
232
272
  }
233
- exports.normalizeRemoteConfig = normalizeRemoteConfig;
234
- /** The per-store identity of a source: its exact URL plus its route. Entries sharing this identity map to the same store/folder on the same server, so they may never overlap in time (see normalizeRemoteConfig). */
235
- function sourceRouteIdentity(source) {
236
- return `${source.url}|${JSON.stringify(source.route || IArchives_1.FULL_ROUTE)}`;
273
+ exports.assertValidRemoteConfig = assertValidRemoteConfig;
274
+ /**
275
+ * The identity of one of a store's SOURCE SLOTS - which is the endpoint it talks to, and not the same
276
+ * question as which store this is (that is CommonConfig.name). A switchover's alternate port is a
277
+ * distinct slot even though it names the same storage, because a slot holds a connection to a port.
278
+ *
279
+ * ONLY the type, the url, and the intermediate's alternate port are part of it: everything else is
280
+ * policy about how we USE the endpoint, and changing policy must never make a store believe it is
281
+ * looking at a NEW source - that would drop every index entry the old one held and rescan it from
282
+ * scratch, so the files it holds go missing from listings until the rescan finishes, for a flag flip.
283
+ *
284
+ * Built by hand rather than by serializing the config, so it cannot change just because the routing
285
+ * file was written with its keys in a different order.
286
+ */
287
+ function sourceIdentity(sourceConfig) {
288
+ if (!sourceConfig)
289
+ return "disk";
290
+ return `${sourceConfig.type}|${sourceConfig.url}|${sourceConfig.intermediate || ""}`;
291
+ }
292
+ exports.sourceIdentity = sourceIdentity;
293
+ /** What an index entry records as the holder of its bytes (see ArchivesSource.url), so it must name the endpoint FOREVER. An intermediate is a switchover's temporary alternate port onto another source, and that port is gone for good once its window passes - so it is recorded as the source it was split out of, which holds the same bucket and outlives it. */
294
+ function sourcePersistentUrl(sourceConfig, folder) {
295
+ if (!sourceConfig)
296
+ return folder;
297
+ return sourceConfig.intermediate || sourceConfig.url;
298
+ }
299
+ exports.sourcePersistentUrl = sourcePersistentUrl;
300
+ /** Which store an entry configures: its name, on the server it points at. A switchover's alternate port is the same server (so it is compared against the entry it was split out of, whose window it must not overlap); a genuinely different server with the same name is a different store, on a different machine. */
301
+ function storeIdentity(source) {
302
+ return `${source.intermediate || source.url}|${source.name}`;
237
303
  }
238
304
  function parseRoutingData(data) {
239
305
  let text = data.toString();
@@ -254,5 +320,5 @@ function serializeRemoteConfig(config) {
254
320
  return Buffer.from(JSON.stringify(config, undefined, 4));
255
321
  }
256
322
  exports.serializeRemoteConfig = serializeRemoteConfig;
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVtb3RlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUFnRDtBQUNoRCxtREFBd0Q7QUFDeEQsdUVBQStEO0FBQy9ELDBEQUFpQztBQUNqQyw0Q0FBZ0s7QUFFaEssSUFBQSxzQkFBTyxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBRW5ELHNTQUFzUztBQUV6UixRQUFBLFlBQVksR0FBRyw2QkFBNkIsQ0FBQztBQUMxRCxNQUFNLGNBQWMsR0FBRyxHQUFHLEdBQUcsb0JBQVksQ0FBQztBQUUxQyxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUUzQyxvTEFBb0w7QUFDcEwsU0FBZ0Isa0JBQWtCLENBQUMsR0FBVztJQUMxQyxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLDBCQUFjLENBQUMsQ0FBQztJQUN4QyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNuQyxJQUFJLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsMEJBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQy9FLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBTkQsZ0RBTUM7QUFFRCx3R0FBd0c7QUFDeEcsU0FBZ0IsUUFBUSxDQUFDLEdBQVc7SUFDaEMsSUFBSSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsSUFBSSxRQUFRLEtBQUssU0FBUztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzVDLHdGQUF3RjtJQUN4RixJQUFJLElB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QUMsTUFBb0I7SUFDdEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFGRCxzREFFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNvcnQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBnZXRCdWZmZXJJbnQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iaXRzXCI7XG5pbXBvcnQgeyBzZXRGbGFnIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9yZXF1aXJlL2NvbXBpbGVGbGFnc1wiO1xuaW1wb3J0IGpzU2hhMjU2IGZyb20gXCJqcy1zaGEyNTZcIjtcbmltcG9ydCB7IFJlbW90ZUNvbmZpZywgUmVtb3RlQ29uZmlnQmFzZSwgU291cmNlQ29uZmlnLCBBcmNoaXZlRmlsZUluZm8sIENoYW5nZXNBZnRlckNvbmZpZywgRlVMTF9WQUxJRF9XSU5ET1csIEZVTExfUk9VVEUsIFZBUklBQkxFX1NIQVJEIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuXG5zZXRGbGFnKHJlcXVpcmUsIFwianMtc2hhMjU2XCIsIFwiYWxsb3djbGllbnRcIiwgdHJ1ZSk7XG5cbi8vIFBhcnNpbmcgLyBub3JtYWxpemF0aW9uIG9mIFJlbW90ZUNvbmZpZyAoc2VlIElBcmNoaXZlcy50cykuIEV2ZXJ5IGJ1Y2tldCBzdG9yZXMgaXRzIG93biBjb25maWd1cmF0aW9uIChhIFJlbW90ZUNvbmZpZykgaW5zaWRlIGl0c2VsZiwgYXQgUk9VVElOR19GSUxFLiBXcml0aW5nIHRoYXQgZmlsZSBjcmVhdGVzIHRoZSBidWNrZXQgLyByZWNvbmZpZ3VyZXMgaXQgKHNlZSBzdG9yYWdlU2VydmVyU3RhdGUudHMpOyBjbGllbnRzIHJlY29uY2lsZSBpdCBieSB2ZXJzaW9uIChzZWUgY3JlYXRlQXJjaGl2ZXMudHMpLlxuXG5leHBvcnQgY29uc3QgUk9VVElOR19GSUxFID0gXCJzdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb25cIjtcbmNvbnN0IFJPVVRJTkdfU1VGRklYID0gXCIvXCIgKyBST1VUSU5HX0ZJTEU7XG5cbmNvbnN0IFJPVVRFX1BSRUNJU0lPTiA9IDEwMDAgKiAxMDAwICogMTAwMDtcblxuLyoqIFRoZSB2YXJpYWJsZS1zaGFyZCByb3V0ZSBvdmVycmlkZSBlbWJlZGRlZCBpbiB0aGUga2V5IChcIjxzZW50aW5lbD5fPHZhbHVlPlwiLCBzZWUgVkFSSUFCTEVfU0hBUkQpLCBvciB1bmRlZmluZWQgd2hlbiB0aGUga2V5IGhhcyBubyBzZW50aW5lbCBvciB0aGUgc2VudGluZWwgaGFzIG5vIHZhbHVlIHlldC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZhcmlhYmxlUm91dGUoa2V5OiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGxldCBpbmRleCA9IGtleS5pbmRleE9mKFZBUklBQkxFX1NIQVJEKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGxldCBtYXRjaCA9IC9eXyhcXGQrKD86XFwuXFxkKyk/KS8uZXhlYyhrZXkuc2xpY2UoaW5kZXggKyBWQVJJQUJMRV9TSEFSRC5sZW5ndGgpKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiArbWF0Y2hbMV07XG59XG5cbi8qKiBXaGVyZSBhIGtleSByb3V0ZXMgaW4gWzAsIDEpLiBBIG1hdGVyaWFsaXplZCB2YXJpYWJsZS1zaGFyZCBzdWZmaXggY29tcGxldGVseSBvdmVycmlkZXMgdGhlIGhhc2guICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um91dGUoa2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGxldCBvdmVycmlkZSA9IHBhcnNlVmFyaWFibGVSb3V0ZShrZXkpO1xuICAgIGlmIChvdmVycmlkZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gb3ZlcnJpZGU7XG4gICAgLy8gUHVyZSBKUywgc28gcm91dGluZyB3b3JrcyBjbGllbnRzaWRlIHRvbyAobm9kZSdzIGNyeXB0byBoYXNoaW5nIGlzIHVuYXZhaWxhYmxlIHRoZXJlKVxuICAgIGxldCBoYXNoID0gZ2V0QnVmZmVySW50KEJ1ZmZlci5mcm9tKGpzU2hhMjU2LnNoYTI1Ni5hcnJheShrZXkpKSk7XG4gICAgcmV0dXJuIGhhc2ggJSBST1VURV9QUkVDSVNJT04gLyBST1VURV9QUkVDSVNJT047XG59XG5cbi8qKiBUaGUgaW4tbWVtb3J5IGdldENoYW5nZXNBZnRlcjIgZW11bGF0aW9uLCBmb3IgYmFja2VuZHMgd2l0aG91dCBhIG5hdGl2ZSBjaGFuZ2UgZmVlZDogYSBmdWxsIGxpc3RpbmcgZmlsdGVyZWQgZG93biB0byBmaWxlcyB3cml0dGVuIGFmdGVyIGNvbmZpZy50aW1lIHdob3NlIGtleXMgcm91dGUgaW50byBjb25maWcucm91dGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckNoYW5nZXMoZmlsZXM6IEFyY2hpdmVGaWxlSW5mb1tdLCBjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IEFyY2hpdmVGaWxlSW5mb1tdIHtcbiAgICByZXR1cm4gZmlsZXMuZmlsdGVyKGZpbGUgPT4ge1xuICAgICAgICBpZiAoZmlsZS5jcmVhdGVUaW1lIDw9IGNvbmZpZy50aW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCByb3V0ZXMgPSBjb25maWcucm91dGVzO1xuICAgICAgICBpZiAocm91dGVzICYmICFyb3V0ZXMuc29tZShyb3V0ZSA9PiByb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShmaWxlLnBhdGgpKSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG59XG5cbi8vIFJvdXRlIHJhbmdlcyBhcmUgW3N0YXJ0LCBlbmQpIC0gaW5jbHVzaXZlIHN0YXJ0LCBleGNsdXNpdmUgZW5kXG5leHBvcnQgZnVuY3Rpb24gcm91dGVDb250YWlucyhyb3V0ZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgdmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghcm91dGUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiByb3V0ZVswXSA8PSB2YWx1ZSAmJiB2YWx1ZSA8IHJvdXRlWzFdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJvdXRlc092ZXJsYXAoYTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgYjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGxldCBbYVN0YXJ0LCBhRW5kXSA9IGEgfHwgRlVMTF9ST1VURTtcbiAgICBsZXQgW2JTdGFydCwgYkVuZF0gPSBiIHx8IEZVTExfUk9VVEU7XG4gICAgcmV0dXJuIGFTdGFydCA8IGJFbmQgJiYgYlN0YXJ0IDwgYUVuZDtcbn1cbi8qKiBUaGUgb3ZlcmxhcCBvZiB0d28gcm91dGUgcmFuZ2VzLCBvciB1bmRlZmluZWQgd2hlbiB0aGV5IGRvbid0IG92ZXJsYXAuICovXG5leHBvcnQgZnVuY3Rpb24gcm91dGVJbnRlcnNlY3Rpb24oYTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgYjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAgIGxldCBbYVN0YXJ0LCBhRW5kXSA9IGEgfHwgRlVMTF9ST1VURTtcbiAgICBsZXQgW2JTdGFydCwgYkVuZF0gPSBiIHx8IEZVTExfUk9VVEU7XG4gICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoYVN0YXJ0LCBiU3RhcnQpO1xuICAgIGxldCBlbmQgPSBNYXRoLm1pbihhRW5kLCBiRW5kKTtcbiAgICBpZiAoc3RhcnQgPj0gZW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBbc3RhcnQsIGVuZF07XG59XG5cbi8vIEEgbWlzc2luZyB2ZXJzaW9uIGNvdW50cyBhcyAtMSwgc28gYW55IGV4cGxpY2l0bHkgdmVyc2lvbmVkIGNvbmZpZyBiZWF0cyBhbiB1bnZlcnNpb25lZCBvbmVcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdWZXJzaW9uKGNvbmZpZzogUmVtb3RlQ29uZmlnKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29uZmlnLnZlcnNpb24gPz8gLTE7XG59XG5cbi8qKiBTdHJpcHMgdGhlIHJvdXRpbmctZmlsZSBzdWZmaXgsIGxlYXZpbmcgdGhlIGJ1Y2tldCdzIHB1YmxpYyBiYXNlIFVSTCAoZmlsZSBwYXRocyBhcHBlbmQgdG8gaXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1Y2tldEJhc2VVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsLmVuZHNXaXRoKFJPVVRJTkdfU1VGRklYKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgYnVja2V0IHJvdXRpbmcgVVJMIGVuZGluZyB3aXRoICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19TVUZGSVgpfSwgd2FzICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHVybC5zbGljZSgwLCAtUk9VVElOR19TVUZGSVgubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsZVVybChiYXNlVXJsOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBiYXNlVXJsICsgXCIvXCIgKyBmaWxlUGF0aC5zcGxpdChcIi9cIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG59XG5cbi8vIEV4OiBodHRwczovL3N0b3JhZ2UyLnZpZGdyaWR3ZWIuY29tOjQ0NDUvZmlsZS9leGFtcGxlYWNjb3VudC9leGFtcGxlYnVja2V0L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSG9zdGVkVXJsKHVybDogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlcjsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSB7XG4gICAgbGV0IGJhc2UgPSBnZXRCdWNrZXRCYXNlVXJsKHVybCk7XG4gICAgbGV0IHUgPSBuZXcgVVJMKGJhc2UpO1xuICAgIGlmICh1LnByb3RvY29sICE9PSBcImh0dHBzOlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBVUkwgbXVzdCB1c2UgaHR0cHMsIGdvdCAke0pTT04uc3RyaW5naWZ5KHUucHJvdG9jb2wpfSBpbiAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIGxldCBwYXJ0cyA9IHUucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcih4ID0+IHgpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09IFwiZmlsZVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBob3N0ZWQgYnVja2V0IFVSTCBsaWtlIGh0dHBzOi8vaG9zdDpwb3J0L2ZpbGUvPGFjY291bnQ+LzxidWNrZXROYW1lPiR7Uk9VVElOR19TVUZGSVh9LCB3YXMgJHtKU09OLnN0cmluZ2lmeSh1cmwpfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBhZGRyZXNzOiB1Lmhvc3RuYW1lLCBwb3J0OiArdS5wb3J0IHx8IDQ0MywgYWNjb3VudDogZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzFdKSwgYnVja2V0TmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzJdKSB9O1xufVxuXG4vLyBFeDogaHR0cHM6Ly9mMDAyLmJhY2tibGF6ZWIyLmNvbS9maWxlL3F1ZXJ5c3VidGVzdC1jb20tcHVibGljLWltbXV0YWJsZS9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb25cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJhY2tibGF6ZVVybCh1cmw6IHN0cmluZyk6IHsgYnVja2V0TmFtZTogc3RyaW5nIH0ge1xuICAgIGxldCBiYXNlID0gZ2V0QnVja2V0QmFzZVVybCh1cmwpO1xuICAgIGxldCB1ID0gbmV3IFVSTChiYXNlKTtcbiAgICBsZXQgcGFydHMgPSB1LnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoeCA9PiB4KTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSBcImZpbGVcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgYmFja2JsYXplIGJ1Y2tldCBVUkwgbGlrZSBodHRwczovL2YwMDIuYmFja2JsYXplYjIuY29tL2ZpbGUvPGJ1Y2tldE5hbWU+JHtST1VUSU5HX1NVRkZJWH0sIHdhcyAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGJ1Y2tldE5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1sxXSkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VIb3N0ZWRVcmxQb3J0KHVybDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGxldCB1ID0gbmV3IFVSTCh1cmwpO1xuICAgIHUucG9ydCA9IFN0cmluZyhwb3J0KTtcbiAgICByZXR1cm4gdS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU291cmNlKHNvdXJjZTogUmVtb3RlQ29uZmlnQmFzZSk6IFNvdXJjZUNvbmZpZyB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbGV0IHdpbmRvdyA9IHNvdXJjZS52YWxpZFdpbmRvdztcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHdpbmRvdykgfHwgd2luZG93Lmxlbmd0aCAhPT0gMiB8fCAhd2luZG93LmV2ZXJ5KHggPT4gdHlwZW9mIHggPT09IFwibnVtYmVyXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBzb3VyY2UgY29uZmlncyBtdXN0IHNwZWNpZnkgdmFsaWRXaW5kb3cgKFtzdGFydE1zLCBlbmRNc10gb2YgdGhlIHdyaXRlIHRpbWVzIHRoZSBzb3VyY2UgaXMgdmFsaWQgZm9yKSAtIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBtdXN0IGJlIHNjaGVkdWxlZCwgbm90IGZsaXBwZWQgaW5zdGFudGx5LiBVc2UgRlVMTF9WQUxJRF9XSU5ET1cgd2hlbiB0aGUgc291cmNlIGlzIGFsd2F5cyB2YWxpZC4gV2FzICR7SlNPTi5zdHJpbmdpZnkod2luZG93KX0gb24gJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpLnNsaWNlKDAsIDUwMCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvdXRlID0gc291cmNlLnJvdXRlO1xuICAgICAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCAmJiAoIUFycmF5LmlzQXJyYXkocm91dGUpIHx8IHJvdXRlLmxlbmd0aCAhPT0gMiB8fCAhcm91dGUuZXZlcnkoeCA9PiB0eXBlb2YgeCA9PT0gXCJudW1iZXJcIikgfHwgcm91dGVbMF0gPCAwIHx8IHJvdXRlWzFdID4gMSB8fCByb3V0ZVswXSA+PSByb3V0ZVsxXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIHJvdXRlIG11c3QgYmUgYSBbc3RhcnQsIGVuZCkgZnJhY3Rpb24gcmFuZ2Ugd2l0aGluIFswLCAxXSB3aXRoIHN0YXJ0IDwgZW5kLCB3YXMgJHtKU09OLnN0cmluZ2lmeShyb3V0ZSl9IG9uICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKS5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UucmVhZGVyRGlza0xpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlLnJlYWRlckRpc2tMaW1pdCAhPT0gXCJudW1iZXJcIiB8fCBzb3VyY2UucmVhZGVyRGlza0xpbWl0IDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlYWRlckRpc2tMaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgYnl0ZSBjb3VudCwgd2FzICR7SlNPTi5zdHJpbmdpZnkoc291cmNlLnJlYWRlckRpc2tMaW1pdCl9IG9uICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKS5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzb3VyY2Uubm9GdWxsU3luYykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVhZGVyRGlza0xpbWl0IHJlcXVpcmVzIG5vRnVsbFN5bmM6IGEgZnVsbCBjb3B5IGNhbm5vdCBiZSBib3VuZGVkLCBvbmx5IGEgcmVhZCBjYWNoZSBjYW4uIE9uICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKS5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UudHlwZSA9PT0gXCJyZW1vdGVcIikge1xuICAgICAgICAgICAgLy8gVGhyb3dzIGlmIHRoZSBVUkwgaXMgbWFsZm9ybWVkLCBzbyBiYWQgY29uZmlncyBhcmUgcmVqZWN0ZWQgYmVmb3JlIHRoZXkncmUgc3RvcmVkXG4gICAgICAgICAgICBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgICBsZXQgaG9zdG5hbWUgPSBuZXcgVVJMKHNvdXJjZSkuaG9zdG5hbWU7XG4gICAgaWYgKGhvc3RuYW1lLmVuZHNXaXRoKFwiLmJhY2tibGF6ZWIyLmNvbVwiKSkge1xuICAgICAgICAvLyBWYWxpZGF0ZXMgdGhlIFVSTCAodGhyb3dzIG9uIG1hbGZvcm1lZCkgYmVmb3JlIGl0J3Mgc3RvcmVkOyB0aGUgYnVja2V0IG5hbWUgaXMgcmVhZCBiYWNrIG91dCBvZiB0aGUgVVJMIGF0IHVzZSBzaXRlcywgbmV2ZXIgc3RvcmVkIG9uIHRoZSBjb25maWcuXG4gICAgICAgIHBhcnNlQmFja2JsYXplVXJsKHNvdXJjZSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwiYmFja2JsYXplXCIsIHVybDogc291cmNlLCB2YWxpZFdpbmRvdzogRlVMTF9WQUxJRF9XSU5ET1csIHB1YmxpYzogdHJ1ZSB9O1xuICAgIH1cbiAgICBwYXJzZUhvc3RlZFVybChzb3VyY2UpO1xuICAgIHJldHVybiB7IHR5cGU6IFwicmVtb3RlXCIsIHVybDogc291cmNlLCB2YWxpZFdpbmRvdzogRlVMTF9WQUxJRF9XSU5ET1csIHB1YmxpYzogdHJ1ZSB9O1xufVxuXG4vKiogSG93IGZhciB1cCBmcm9tIDAgdGhlIHNvdXJjZXMnIHJvdXRlcyByZWFjaCB3aXRob3V0IGEgZ2FwICgxIG1lYW5zIHRoZSB3aG9sZSBrZXkgc3BhY2UpLiAqL1xuZnVuY3Rpb24gZ2V0Um91dGVDb3ZlcmFnZShzb3VyY2VzOiBTb3VyY2VDb25maWdbXSk6IG51bWJlciB7XG4gICAgbGV0IHJvdXRlcyA9IHNvdXJjZXMubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKTtcbiAgICBzb3J0KHJvdXRlcywgeCA9PiB4WzBdKTtcbiAgICBsZXQgY292ZXJlZCA9IDA7XG4gICAgZm9yIChsZXQgcm91dGUgb2Ygcm91dGVzKSB7XG4gICAgICAgIGlmIChyb3V0ZVswXSA+IGNvdmVyZWQpIGJyZWFrO1xuICAgICAgICBjb3ZlcmVkID0gTWF0aC5tYXgoY292ZXJlZCwgcm91dGVbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gY292ZXJlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZyhjb25maWc6IFJlbW90ZUNvbmZpZyB8IFJlbW90ZUNvbmZpZ0Jhc2UpOiBSZW1vdGVDb25maWcge1xuICAgIGxldCByZXN1bHQ6IFJlbW90ZUNvbmZpZztcbiAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gXCJzdHJpbmdcIiAmJiBcInNvdXJjZXNcIiBpbiBjb25maWcpIHtcbiAgICAgICAgcmVzdWx0ID0geyB2ZXJzaW9uOiBjb25maWcudmVyc2lvbiwgc291cmNlczogY29uZmlnLnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSkgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB7IHNvdXJjZXM6IFtub3JtYWxpemVTb3VyY2UoY29uZmlnKV0gfTtcbiAgICB9XG4gICAgLy8gTWl4ZWQgaW1tdXRhYmlsaXR5IG1ha2VzIG5vIHNlbnNlIEFNT05HIHNvdXJjZXMgdmFsaWQgYXQgdGhlIHNhbWUgdGltZTogYSBtdXRhYmxlIHNvdXJjZSB3b3VsZCBhY2NlcHQgb3ZlcndyaXRlcyB0aGF0IGl0cyBpbW11dGFibGUgcGVlcnMgcmVmdXNlIHRvIHN5bmNocm9uaXplLCBmb3JraW5nIHRoZWlyIGNvbnRlbnRzLiBTb3VyY2VzIGFyZSBncm91cGVkIGJ5IHRyYW5zaXRpdmVseSBvdmVybGFwcGluZyB2YWxpZCB3aW5kb3dzIChhYnNvcmIgZXZlcnl0aGluZyBvdmVybGFwcGluZyB0aGUgZ3JvdXAsIGV4dGVuZCB0aGUgZ3JvdXAncyBlbmQsIHJlcGVhdCkgLSBhIHNvZnQgY2hlY2sgdGhhdCBpcyBjb3JyZWN0IGFzIGxvbmcgYXMgd2luZG93cyBoYXZlIGNsZWFuIGJyZWFrcyAoYSBncm91cCBlbmRzIGV4YWN0bHkgd2hlcmUgdGhlIG5leHQgYmVnaW5zKS5cbiAgICBsZXQgc291cmNlcyA9IHJlc3VsdC5zb3VyY2VzLm1hcChub3JtYWxpemVTb3VyY2UpO1xuICAgIGxldCBzb3J0ZWQgPSBbLi4uc291cmNlc107XG4gICAgc29ydChzb3J0ZWQsIHggPT4geC52YWxpZFdpbmRvd1swXSk7XG4gICAgbGV0IGdyb3VwOiB0eXBlb2Ygc291cmNlcyA9IFtdO1xuICAgIGxldCBncm91cEVuZCA9IDA7XG4gICAgZnVuY3Rpb24gY2hlY2tHcm91cCgpIHtcbiAgICAgICAgbGV0IGltbXV0YWJsZUNvdW50ID0gZ3JvdXAuZmlsdGVyKHggPT4geC5pbW11dGFibGUpLmxlbmd0aDtcbiAgICAgICAgaWYgKGltbXV0YWJsZUNvdW50ICYmIGltbXV0YWJsZUNvdW50ICE9PSBncm91cC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlcyB3aXRoIG92ZXJsYXBwaW5nIHZhbGlkIHdpbmRvd3MgbXVzdCBhZ3JlZSBvbiBpbW11dGFiaWxpdHk6ICR7aW1tdXRhYmxlQ291bnR9IG9mICR7Z3JvdXAubGVuZ3RofSBhcmUgaW1tdXRhYmxlLiBTb3VyY2VzOiAke0pTT04uc3RyaW5naWZ5KGdyb3VwLm1hcCh4ID0+ICh7IHVybDogeC51cmwsIHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LCBpbW11dGFibGU6ICEheC5pbW11dGFibGUgfSkpKX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgc291cmNlcyB2YWxpZCBhdCBhbnkgaW5zdGFudCBtdXN0IGNvdmVyIHRoZSB3aG9sZSBrZXkgc3BhY2UsIG9yIGtleXMgcm91dGluZyBpbnRvIGEgZ2FwIGNvdWxkIG5ldmVyIGJlIHJlYWRcbiAgICAgICAgbGV0IGNvdmVyZWQgPSBnZXRSb3V0ZUNvdmVyYWdlKGdyb3VwKTtcbiAgICAgICAgaWYgKGNvdmVyZWQgPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZXMgd2l0aCBvdmVybGFwcGluZyB2YWxpZCB3aW5kb3dzIG11c3QgY292ZXIgdGhlIGZ1bGwgcm91dGUgc3BhY2UgWzAsIDEpOyBjb3ZlcmFnZSBzdG9wcyBhdCAke2NvdmVyZWR9LiBTb3VyY2VzOiAke0pTT04uc3RyaW5naWZ5KGdyb3VwLm1hcCh4ID0+ICh7IHVybDogeC51cmwsIHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LCByb3V0ZTogeC5yb3V0ZSB8fCBGVUxMX1JPVVRFIH0pKSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXZlcnkgYnVja2V0IG11c3QgQUxTTyBjb3ZlciB0aGUgZnVsbCByb3V0ZSBzcGFjZSBhY3Jvc3MgaXRzIG93biBlbnRyaWVzLCBiZWNhdXNlIGFsbCBvZiBhIGJ1Y2tldCdzIGVudHJpZXMgc2hhcmUgb25lIGRpc2suIEEgYnVja2V0IHRoYXQgb25seSBldmVyIHN5bmNocm9uaXplcyBwYXJ0IG9mIHRoZSBrZXkgc3BhY2UgbmV2ZXIgbGVhcm5zIGFib3V0IGRlbGV0aW9ucyBpbiB0aGUgcmVzdCBvZiBpdCAtIGFuZCB0b21ic3RvbmVzIGV4cGlyZSwgc28gZmlsZXMgaXQgc3RpbGwgaG9sZHMgZnJvbSBhIHJvdXRlIGl0IG5vIGxvbmdlciBzZXJ2ZXMgZXZlbnR1YWxseSBsb29rIGxpa2UgbGl2ZSBmaWxlcyBhZ2FpbiwgYW5kIGdldCByZXN1cnJlY3RlZCBpbnRvIHRoZSBjaGFpbiBieSBpdHMgbmV4dCBzY2FuLiBBbiBlbnRyeSB3aXRoIG5vIHJvdXRlIChpbXBsaWNpdGx5IHRoZSBmdWxsIHNwYWNlKSBzYXRpc2ZpZXMgdGhpcyBvbiBpdHMgb3duLCB3aGljaCBpcyB3aHkgdGhlIHVzdWFsIGNvbmZpZ3VyYXRpb24gbGlzdHMgZWFjaCBidWNrZXQgb25jZSBwZXIgc2hhcmQgQU5EIG9uY2UgdW5zaGFyZGVkLlxuICAgICAgICBsZXQgYnlVcmwgPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIGdyb3VwPigpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2YgZ3JvdXApIHtcbiAgICAgICAgICAgIGxldCBlbnRyaWVzID0gYnlVcmwuZ2V0KHNvdXJjZS51cmwpO1xuICAgICAgICAgICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgZW50cmllcyA9IFtdO1xuICAgICAgICAgICAgICAgIGJ5VXJsLnNldChzb3VyY2UudXJsLCBlbnRyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVudHJpZXMucHVzaChzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFt1cmwsIGVudHJpZXNdIG9mIGJ5VXJsKSB7XG4gICAgICAgICAgICBsZXQgdXJsQ292ZXJlZCA9IGdldFJvdXRlQ292ZXJhZ2UoZW50cmllcyk7XG4gICAgICAgICAgICBpZiAodXJsQ292ZXJlZCA8IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV2ZXJ5IGJ1Y2tldCBtdXN0IGNvdmVyIHRoZSBmdWxsIHJvdXRlIHNwYWNlIFswLCAxKSBhY3Jvc3MgaXRzIG93biBlbnRyaWVzIHdpdGggb3ZlcmxhcHBpbmcgdmFsaWQgd2luZG93cywgYnV0ICR7dXJsfSBvbmx5IGNvdmVycyB1cCB0byAke3VybENvdmVyZWR9IChpdHMgcm91dGVzOiAke0pTT04uc3RyaW5naWZ5KGVudHJpZXMubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9KS4gQWRkIGFuIGVudHJ5IGZvciBpdCB3aXRoIG5vIHJvdXRlIChvciBlbnRyaWVzIHdob3NlIHJvdXRlcyBzcGFuIHRoZSByZXN0KSwgYWxvbmdzaWRlIGl0cyBzaGFyZGVkIGVudHJpZXMuIFRoaXMgaXMgZW5mb3JjZWQgYmVjYXVzZSBhIGJ1Y2tldCdzIGVudHJpZXMgYWxsIHNoYXJlIG9uZSBkaXNrOiBpZiBpdCBvbmx5IGV2ZXIgc3luY2hyb25pemVzIHBhcnQgb2YgdGhlIGtleSBzcGFjZSwgaXQgbmV2ZXIgc2VlcyBkZWxldGlvbnMgaW4gdGhlIHJlc3QsIGFuZCBvbmNlIHRob3NlIHRvbWJzdG9uZXMgZXhwaXJlIHRoZSBmaWxlcyBpdCBzdGlsbCBob2xkcyBhcmUgcmVzdXJyZWN0ZWQgaW50byB0aGUgY2hhaW4gYnkgaXRzIG5leHQgc2Nhbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc29ydGVkKSB7XG4gICAgICAgIGlmIChncm91cC5sZW5ndGggJiYgc291cmNlLnZhbGlkV2luZG93WzBdID49IGdyb3VwRW5kKSB7XG4gICAgICAgICAgICBjaGVja0dyb3VwKCk7XG4gICAgICAgICAgICBncm91cCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwLnB1c2goc291cmNlKTtcbiAgICAgICAgZ3JvdXBFbmQgPSBNYXRoLm1heChncm91cEVuZCwgc291cmNlLnZhbGlkV2luZG93WzFdKTtcbiAgICB9XG4gICAgY2hlY2tHcm91cCgpO1xuICAgIC8vIFR3byBlbnRyaWVzIHdpdGggdGhlIEVYQUNUIHNhbWUgVVJMIGFuZCB0aGUgU0FNRSByb3V0ZSBtYXkgbmV2ZXIgYmUgdmFsaWQgYXQgdGhlIHNhbWUgdGltZTogb24gdGhhdCBzZXJ2ZXIgdGhlIHJvdXRlIG1hcHMgdG8gZXhhY3RseSBvbmUgb24tZGlzayBmb2xkZXIgYW5kIG9uZSBzdG9yZSwgc28gc2ltdWx0YW5lb3VzIGR1cGxpY2F0ZXMgd291bGQgY29sbGlkZSBvbiBpdC4gQSBkaWZmZXJlbnQgcG9ydCBpcyBhIGRpZmZlcmVudCBzZXJ2ZXIuIE5vbi1vdmVybGFwcGluZyB3aW5kb3dzIGFyZSBmaW5lOyB0aGF0IGlzIGhvdyB0cmFuc2l0aW9ucyBiZXR3ZWVuIHdpbmRvd3Mgd29yay5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IGEgPSBzb3VyY2VzW2ldO1xuICAgICAgICAgICAgbGV0IGIgPSBzb3VyY2VzW2pdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZVJvdXRlSWRlbnRpdHkoYSkgIT09IHNvdXJjZVJvdXRlSWRlbnRpdHkoYikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGEudmFsaWRXaW5kb3dbMF0gPCBiLnZhbGlkV2luZG93WzFdICYmIGIudmFsaWRXaW5kb3dbMF0gPCBhLnZhbGlkV2luZG93WzFdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUd28gc291cmNlcyB3aXRoIHRoZSBzYW1lIFVSTCBoYXZlIHRoZSBzYW1lIHJvdXRlIHdpdGggb3ZlcmxhcHBpbmcgdmFsaWQgd2luZG93cyAtIG9uIHRoYXQgc2VydmVyIHRoZSByb3V0ZSBtYXBzIHRvIG9uZSBvbi1kaXNrIGZvbGRlciwgc28gdGhlc2Ugd291bGQgY29sbGlkZS4gR2l2ZSBzYW1lLXJvdXRlIGVudHJpZXMgbm9uLW92ZXJsYXBwaW5nIHdpbmRvd3MgaW5zdGVhZC4gQ29uZmxpY3Rpbmc6ICR7SlNPTi5zdHJpbmdpZnkoYSl9IGFuZCAke0pTT04uc3RyaW5naWZ5KGIpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBUaGUgcGVyLXN0b3JlIGlkZW50aXR5IG9mIGEgc291cmNlOiBpdHMgZXhhY3QgVVJMIHBsdXMgaXRzIHJvdXRlLiBFbnRyaWVzIHNoYXJpbmcgdGhpcyBpZGVudGl0eSBtYXAgdG8gdGhlIHNhbWUgc3RvcmUvZm9sZGVyIG9uIHRoZSBzYW1lIHNlcnZlciwgc28gdGhleSBtYXkgbmV2ZXIgb3ZlcmxhcCBpbiB0aW1lIChzZWUgbm9ybWFsaXplUmVtb3RlQ29uZmlnKS4gKi9cbmZ1bmN0aW9uIHNvdXJjZVJvdXRlSWRlbnRpdHkoc291cmNlOiBTb3VyY2VDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtzb3VyY2UudXJsfXwke0pTT04uc3RyaW5naWZ5KHNvdXJjZS5yb3V0ZSB8fCBGVUxMX1JPVVRFKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSb3V0aW5nRGF0YShkYXRhOiBCdWZmZXIpOiBSZW1vdGVDb25maWcge1xuICAgIGxldCB0ZXh0ID0gZGF0YS50b1N0cmluZygpO1xuICAgIGxldCBwYXJzZWQ6IFJlbW90ZUNvbmZpZztcbiAgICB0cnkge1xuICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpIGFzIFJlbW90ZUNvbmZpZztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGluZyBjb25maWcgaXMgbm90IHZhbGlkIEpTT04gKCR7U3RyaW5nKGUpfSkuIERhdGE6ICR7dGV4dC5zbGljZSgwLCA1MDApfWApO1xuICAgIH1cbiAgICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSBcIm9iamVjdFwiIHx8ICFBcnJheS5pc0FycmF5KHBhcnNlZC5zb3VyY2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdXRpbmcgY29uZmlnIG11c3QgYmUgeyB2ZXJzaW9uPywgc291cmNlczogWy4uLl0gfSwgd2FzICR7dGV4dC5zbGljZSgwLCA1MDApfWApO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplUmVtb3RlQ29uZmlnKHBhcnNlZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVSZW1vdGVDb25maWcoY29uZmlnOiBSZW1vdGVDb25maWcpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShjb25maWcsIHVuZGVmaW5lZCwgNCkpO1xufVxuIl19
258
- /* _JS_SOURCE_HASH = "0989264d65865c84abd1c0944753eb007a3b922644b941b04fd8c3917943277f"; */
323
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVtb3RlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUFnRDtBQUNoRCxtREFBd0Q7QUFDeEQsdUVBQStEO0FBQy9ELDBEQUFpQztBQUNqQyw0Q0FBZ0s7QUFDaEssNkNBQXFEO0FBRXJELElBQUEsc0JBQU8sRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUVuRCxzU0FBc1M7QUFFelIsUUFBQSxZQUFZLEdBQUcsNkJBQTZCLENBQUM7QUFDMUQsTUFBTSxjQUFjLEdBQUcsR0FBRyxHQUFHLG9CQUFZLENBQUM7QUFFMUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFM0Msb0xBQW9MO0FBQ3BMLFNBQWdCLGtCQUFrQixDQUFDLEdBQVc7SUFDMUMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQywwQkFBYyxDQUFDLENBQUM7SUFDeEMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbkMsSUFBSSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLDBCQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMvRSxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzdCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsQ0FBQztBQU5ELGdEQU1DO0FBRUQsd0dBQXdHO0FBQ3hHLFNBQWdCLFFBQVEsQ0FBQyxHQUFXO0lBQ2hDLElBQUksUUFBUSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksUUFBUSxLQUFLLFNBQVM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM1Qyx3RkFBd0Y7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LEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBWkQsNENBWUM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxNQUFvQjtJQUN0RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUZELHNEQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc29ydCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGdldEJ1ZmZlckludCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JpdHNcIjtcbmltcG9ydCB7IHNldEZsYWcgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3JlcXVpcmUvY29tcGlsZUZsYWdzXCI7XG5pbXBvcnQganNTaGEyNTYgZnJvbSBcImpzLXNoYTI1NlwiO1xuaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBSZW1vdGVDb25maWdCYXNlLCBTb3VyY2VDb25maWcsIEFyY2hpdmVGaWxlSW5mbywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBGVUxMX1ZBTElEX1dJTkRPVywgRlVMTF9ST1VURSwgVkFSSUFCTEVfU0hBUkQgfSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBhc3NlcnRWYWxpZFNvdXJjZU5hbWUgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5cbnNldEZsYWcocmVxdWlyZSwgXCJqcy1zaGEyNTZcIiwgXCJhbGxvd2NsaWVudFwiLCB0cnVlKTtcblxuLy8gUGFyc2luZyAvIG5vcm1hbGl6YXRpb24gb2YgUmVtb3RlQ29uZmlnIChzZWUgSUFyY2hpdmVzLnRzKS4gRXZlcnkgYnVja2V0IHN0b3JlcyBpdHMgb3duIGNvbmZpZ3VyYXRpb24gKGEgUmVtb3RlQ29uZmlnKSBpbnNpZGUgaXRzZWxmLCBhdCBST1VUSU5HX0ZJTEUuIFdyaXRpbmcgdGhhdCBmaWxlIGNyZWF0ZXMgdGhlIGJ1Y2tldCAvIHJlY29uZmlndXJlcyBpdCAoc2VlIHN0b3JhZ2VTZXJ2ZXJTdGF0ZS50cyk7IGNsaWVudHMgcmVjb25jaWxlIGl0IGJ5IHZlcnNpb24gKHNlZSBjcmVhdGVBcmNoaXZlcy50cykuXG5cbmV4cG9ydCBjb25zdCBST1VUSU5HX0ZJTEUgPSBcInN0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblwiO1xuY29uc3QgUk9VVElOR19TVUZGSVggPSBcIi9cIiArIFJPVVRJTkdfRklMRTtcblxuY29uc3QgUk9VVEVfUFJFQ0lTSU9OID0gMTAwMCAqIDEwMDAgKiAxMDAwO1xuXG4vKiogVGhlIHZhcmlhYmxlLXNoYXJkIHJvdXRlIG92ZXJyaWRlIGVtYmVkZGVkIGluIHRoZSBrZXkgKFwiPHNlbnRpbmVsPl88dmFsdWU+XCIsIHNlZSBWQVJJQUJMRV9TSEFSRCksIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBrZXkgaGFzIG5vIHNlbnRpbmVsIG9yIHRoZSBzZW50aW5lbCBoYXMgbm8gdmFsdWUgeWV0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmFyaWFibGVSb3V0ZShrZXk6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGluZGV4ID0ga2V5LmluZGV4T2YoVkFSSUFCTEVfU0hBUkQpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IG1hdGNoID0gL15fKFxcZCsoPzpcXC5cXGQrKT8pLy5leGVjKGtleS5zbGljZShpbmRleCArIFZBUklBQkxFX1NIQVJELmxlbmd0aCkpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuICttYXRjaFsxXTtcbn1cblxuLyoqIFdoZXJlIGEga2V5IHJvdXRlcyBpbiBbMCwgMSkuIEEgbWF0ZXJpYWxpemVkIHZhcmlhYmxlLXNoYXJkIHN1ZmZpeCBjb21wbGV0ZWx5IG92ZXJyaWRlcyB0aGUgaGFzaC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3V0ZShrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IG92ZXJyaWRlID0gcGFyc2VWYXJpYWJsZVJvdXRlKGtleSk7XG4gICAgaWYgKG92ZXJyaWRlICE9PSB1bmRlZmluZWQpIHJldHVybiBvdmVycmlkZTtcbiAgICAvLyBQdXJlIEpTLCBzbyByb3V0aW5nIHdvcmtzIGNsaWVudHNpZGUgdG9vIChub2RlJ3MgY3J5cHRvIGhhc2hpbmcgaXMgdW5hdmFpbGFibGUgdGhlcmUpXG4gICAgbGV0IGhhc2ggPSBnZXRCdWZmZXJJbnQoQnVmZmVyLmZyb20oanNTaGEyNTYuc2hhMjU2LmFycmF5KGtleSkpKTtcbiAgICByZXR1cm4gaGFzaCAlIFJPVVRFX1BSRUNJU0lPTiAvIFJPVVRFX1BSRUNJU0lPTjtcbn1cblxuLyoqIFRoZSBpbi1tZW1vcnkgZ2V0Q2hhbmdlc0FmdGVyMiBlbXVsYXRpb24sIGZvciBiYWNrZW5kcyB3aXRob3V0IGEgbmF0aXZlIGNoYW5nZSBmZWVkOiBhIGZ1bGwgbGlzdGluZyBmaWx0ZXJlZCBkb3duIHRvIGZpbGVzIHdyaXR0ZW4gYWZ0ZXIgY29uZmlnLnRpbWUgd2hvc2Uga2V5cyByb3V0ZSBpbnRvIGNvbmZpZy5yb3V0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQ2hhbmdlcyhmaWxlczogQXJjaGl2ZUZpbGVJbmZvW10sIGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogQXJjaGl2ZUZpbGVJbmZvW10ge1xuICAgIHJldHVybiBmaWxlcy5maWx0ZXIoZmlsZSA9PiB7XG4gICAgICAgIGlmIChmaWxlLmNyZWF0ZVRpbWUgPD0gY29uZmlnLnRpbWUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHJvdXRlcyA9IGNvbmZpZy5yb3V0ZXM7XG4gICAgICAgIGlmIChyb3V0ZXMgJiYgIXJvdXRlcy5zb21lKHJvdXRlID0+IHJvdXRlQ29udGFpbnMocm91dGUsIGdldFJvdXRlKGZpbGUucGF0aCkpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbn1cblxuLy8gUm91dGUgcmFuZ2VzIGFyZSBbc3RhcnQsIGVuZCkgLSBpbmNsdXNpdmUgc3RhcnQsIGV4Y2x1c2l2ZSBlbmRcbmV4cG9ydCBmdW5jdGlvbiByb3V0ZUNvbnRhaW5zKHJvdXRlOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCB2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCFyb3V0ZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHJvdXRlWzBdIDw9IHZhbHVlICYmIHZhbHVlIDwgcm91dGVbMV07XG59XG5leHBvcnQgZnVuY3Rpb24gcm91dGVzT3ZlcmxhcChhOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBiOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgbGV0IFthU3RhcnQsIGFFbmRdID0gYSB8fCBGVUxMX1JPVVRFO1xuICAgIGxldCBbYlN0YXJ0LCBiRW5kXSA9IGIgfHwgRlVMTF9ST1VURTtcbiAgICByZXR1cm4gYVN0YXJ0IDwgYkVuZCAmJiBiU3RhcnQgPCBhRW5kO1xufVxuLyoqIFRoZSBvdmVybGFwIG9mIHR3byByb3V0ZSByYW5nZXMsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZXkgZG9uJ3Qgb3ZlcmxhcC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3V0ZUludGVyc2VjdGlvbihhOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBiOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkKTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IFthU3RhcnQsIGFFbmRdID0gYSB8fCBGVUxMX1JPVVRFO1xuICAgIGxldCBbYlN0YXJ0LCBiRW5kXSA9IGIgfHwgRlVMTF9ST1VURTtcbiAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChhU3RhcnQsIGJTdGFydCk7XG4gICAgbGV0IGVuZCA9IE1hdGgubWluKGFFbmQsIGJFbmQpO1xuICAgIGlmIChzdGFydCA+PSBlbmQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIFtzdGFydCwgZW5kXTtcbn1cblxuLy8gQSBtaXNzaW5nIHZlcnNpb24gY291bnRzIGFzIC0xLCBzbyBhbnkgZXhwbGljaXRseSB2ZXJzaW9uZWQgY29uZmlnIGJlYXRzIGFuIHVudmVyc2lvbmVkIG9uZVxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ1ZlcnNpb24oY29uZmlnOiBSZW1vdGVDb25maWcpOiBudW1iZXIge1xuICAgIHJldHVybiBjb25maWcudmVyc2lvbiA/PyAtMTtcbn1cblxuLyoqIFN0cmlwcyB0aGUgcm91dGluZy1maWxlIHN1ZmZpeCwgbGVhdmluZyB0aGUgYnVja2V0J3MgcHVibGljIGJhc2UgVVJMIChmaWxlIHBhdGhzIGFwcGVuZCB0byBpdCkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVja2V0QmFzZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF1cmwuZW5kc1dpdGgoUk9VVElOR19TVUZGSVgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBidWNrZXQgcm91dGluZyBVUkwgZW5kaW5nIHdpdGggJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX1NVRkZJWCl9LCB3YXMgJHtKU09OLnN0cmluZ2lmeSh1cmwpfWApO1xuICAgIH1cbiAgICByZXR1cm4gdXJsLnNsaWNlKDAsIC1ST1VUSU5HX1NVRkZJWC5sZW5ndGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGaWxlVXJsKGJhc2VVcmw6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJhc2VVcmwgKyBcIi9cIiArIGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbn1cblxuLy8gRXg6IGh0dHBzOi8vc3RvcmFnZTIudmlkZ3JpZHdlYi5jb206NDQ0NS9maWxlL2V4YW1wbGVhY2NvdW50L2V4YW1wbGVidWNrZXQvc3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIb3N0ZWRVcmwodXJsOiBzdHJpbmcpOiB7IGFkZHJlc3M6IHN0cmluZzsgcG9ydDogbnVtYmVyOyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9IHtcbiAgICBsZXQgYmFzZSA9IGdldEJ1Y2tldEJhc2VVcmwodXJsKTtcbiAgICBsZXQgdSA9IG5ldyBVUkwoYmFzZSk7XG4gICAgaWYgKHUucHJvdG9jb2wgIT09IFwiaHR0cHM6XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIFVSTCBtdXN0IHVzZSBodHRwcywgZ290ICR7SlNPTi5zdHJpbmdpZnkodS5wcm90b2NvbCl9IGluICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gKTtcbiAgICB9XG4gICAgbGV0IHBhcnRzID0gdS5wYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKHggPT4geCk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyB8fCBwYXJ0c1swXSAhPT0gXCJmaWxlXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIGhvc3RlZCBidWNrZXQgVVJMIGxpa2UgaHR0cHM6Ly9ob3N0OnBvcnQvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+JHtST1VUSU5HX1NVRkZJWH0sIHdhcyAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGFkZHJlc3M6IHUuaG9zdG5hbWUsIHBvcnQ6ICt1LnBvcnQgfHwgNDQzLCBhY2NvdW50OiBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMV0pLCBidWNrZXROYW1lOiBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMl0pIH07XG59XG5cbi8vIEV4OiBodHRwczovL2YwMDIuYmFja2JsYXplYjIuY29tL2ZpbGUvcXVlcnlzdWJ0ZXN0LWNvbS1wdWJsaWMtaW1tdXRhYmxlL3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQmFja2JsYXplVXJsKHVybDogc3RyaW5nKTogeyBidWNrZXROYW1lOiBzdHJpbmcgfSB7XG4gICAgbGV0IGJhc2UgPSBnZXRCdWNrZXRCYXNlVXJsKHVybCk7XG4gICAgbGV0IHUgPSBuZXcgVVJMKGJhc2UpO1xuICAgIGxldCBwYXJ0cyA9IHUucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcih4ID0+IHgpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDIgfHwgcGFydHNbMF0gIT09IFwiZmlsZVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBiYWNrYmxhemUgYnVja2V0IFVSTCBsaWtlIGh0dHBzOi8vZjAwMi5iYWNrYmxhemViMi5jb20vZmlsZS88YnVja2V0TmFtZT4ke1JPVVRJTkdfU1VGRklYfSwgd2FzICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYnVja2V0TmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzFdKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUhvc3RlZFVybFBvcnQodXJsOiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgbGV0IHUgPSBuZXcgVVJMKHVybCk7XG4gICAgdS5wb3J0ID0gU3RyaW5nKHBvcnQpO1xuICAgIHJldHVybiB1LnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogUHV0cyBhIHNvdXJjZSBpbnRvIHRoZSBzaGFwZSB0aGUgY29kZSBleHBlY3RzLiBJdCBkb2VzIE5PVCBqdWRnZSBpdDogdGhpcyBydW5zIGV2ZXJ5IHRpbWUgYSBjb25maWdcbiAqIGlzIFJFQUQsIGFuZCBhIGNvbmZpZyB0aGF0IGlzIGFscmVhZHkgb24gZGlzayBoYXMgdG8ga2VlcCB3b3JraW5nIC0gYSBzZXJ2ZXIgdGhhdCBjYW5ub3QgcGFyc2UgaXRzXG4gKiBvd24gcm91dGluZyBmaWxlIGlzIGEgc2VydmVyIHRoYXQgY2Fubm90IHNlcnZlLCBhbmQgaXQgd291bGQgc3RheSB0aGF0IHdheSBmb3JldmVyLiBBbnl0aGluZ1xuICogbWlzc2luZyBvciB1bnVzYWJsZSBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgc2FmZXN0IGVxdWl2YWxlbnQgaW5zdGVhZCwgbG91ZGx5IHdoZXJlIGl0IG1hdHRlcnMuXG4gKlxuICogSnVkZ2luZyBoYXBwZW5zIG9uIHRoZSB3YXkgSU4sIGluIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU291cmNlKHNvdXJjZTogUmVtb3RlQ29uZmlnQmFzZSk6IFNvdXJjZUNvbmZpZyB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWQgPSB7IC4uLnNvdXJjZSB9O1xuICAgICAgICAvLyBDb25maWdzIHdyaXR0ZW4gYmVmb3JlIG5hbWVzIGV4aXN0ZWQgaGF2ZSBub25lLCBhbmQgYSBuYW1lIHRoYXQgY291bGQgbm90IGJlIGEgZm9sZGVyIGNhbm5vdCBiZSB1c2VkIGFzIG9uZS4gQm90aCBnZXQgdGhlIGRlcml2ZWQgbmFtZTogZGV0ZXJtaW5pc3RpYywgc28gZXZlcnkgc2VydmVyIHBpY2tzIHRoZSBzYW1lIG9uZSBmb3IgdGhlIHNhbWUgZW50cnkuXG4gICAgICAgIGlmICghaXNVc2FibGVTb3VyY2VOYW1lKG5vcm1hbGl6ZWQubmFtZSkpIHtcbiAgICAgICAgICAgIGxldCBkZXJpdmVkID0gZGVyaXZlZFNvdXJjZU5hbWUobm9ybWFsaXplZCk7XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZC5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTb3VyY2UgbmFtZSAke0pTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWQubmFtZSl9IGluIGEgcm91dGluZyBjb25maWcgY2Fubm90IGJlIHVzZWQgYXMgYSBmb2xkZXIgbmFtZSwgc28gdGhpcyBlbnRyeSBpcyBiZWluZyByZWFkIGFzICR7SlNPTi5zdHJpbmdpZnkoZGVyaXZlZCl9OiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSkuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vcm1hbGl6ZWQubmFtZSA9IGRlcml2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdpbmRvdyA9IG5vcm1hbGl6ZWQudmFsaWRXaW5kb3c7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh3aW5kb3cpIHx8IHdpbmRvdy5sZW5ndGggIT09IDIgfHwgIXdpbmRvdy5ldmVyeSh4ID0+IHR5cGVvZiB4ID09PSBcIm51bWJlclwiKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU291cmNlICR7SlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZC5uYW1lKX0gaGFzIG5vIHVzYWJsZSB2YWxpZFdpbmRvdyAoJHtKU09OLnN0cmluZ2lmeSh3aW5kb3cpfSksIHJlYWRpbmcgaXQgYXMgYWx3YXlzIHZhbGlkOiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSkuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQudmFsaWRXaW5kb3cgPSBGVUxMX1ZBTElEX1dJTkRPVztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm91dGUgPSBub3JtYWxpemVkLnJvdXRlO1xuICAgICAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCAmJiAhaXNVc2FibGVSb3V0ZShyb3V0ZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFNvdXJjZSAke0pTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWQubmFtZSl9IGhhcyBhbiB1bnVzYWJsZSByb3V0ZSAoJHtKU09OLnN0cmluZ2lmeShyb3V0ZSl9KSwgcmVhZGluZyBpdCBhcyB0aGUgd2hvbGUga2V5IHNwYWNlOiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSkuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQucm91dGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfVxuICAgIGxldCBob3N0bmFtZSA9IG5ldyBVUkwoc291cmNlKS5ob3N0bmFtZTtcbiAgICBpZiAoaG9zdG5hbWUuZW5kc1dpdGgoXCIuYmFja2JsYXplYjIuY29tXCIpKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlcyB0aGUgVVJMICh0aHJvd3Mgb24gbWFsZm9ybWVkKSBiZWZvcmUgaXQncyBzdG9yZWQ7IHRoZSBidWNrZXQgbmFtZSBpcyByZWFkIGJhY2sgb3V0IG9mIHRoZSBVUkwgYXQgdXNlIHNpdGVzLCBuZXZlciBzdG9yZWQgb24gdGhlIGNvbmZpZy5cbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlQmFja2JsYXplVXJsKHNvdXJjZSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwiYmFja2JsYXplXCIsIHVybDogc291cmNlLCBuYW1lOiBzYW5pdGl6ZVNvdXJjZU5hbWUocGFyc2VkLmJ1Y2tldE5hbWUpLCB2YWxpZFdpbmRvdzogRlVMTF9WQUxJRF9XSU5ET1csIHB1YmxpYzogdHJ1ZSB9O1xuICAgIH1cbiAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlKTtcbiAgICByZXR1cm4geyB0eXBlOiBcInJlbW90ZVwiLCB1cmw6IHNvdXJjZSwgbmFtZTogc2FuaXRpemVTb3VyY2VOYW1lKGAke3BhcnNlZC5hZGRyZXNzfS0ke3BhcnNlZC5wb3J0fWApLCB2YWxpZFdpbmRvdzogRlVMTF9WQUxJRF9XSU5ET1csIHB1YmxpYzogdHJ1ZSB9O1xufVxuXG5mdW5jdGlvbiBpc1VzYWJsZVNvdXJjZU5hbWUobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgYXNzZXJ0VmFsaWRTb3VyY2VOYW1lKG5hbWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNVc2FibGVSb3V0ZShyb3V0ZTogW251bWJlciwgbnVtYmVyXSk6IGJvb2xlYW4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShyb3V0ZSkgfHwgcm91dGUubGVuZ3RoICE9PSAyIHx8ICFyb3V0ZS5ldmVyeSh4ID0+IHR5cGVvZiB4ID09PSBcIm51bWJlclwiKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiByb3V0ZVswXSA+PSAwICYmIHJvdXRlWzFdIDw9IDEgJiYgcm91dGVbMF0gPCByb3V0ZVsxXTtcbn1cblxuLyoqIFRoZSBuYW1lIGFuIGVudHJ5IGdldHMgd2hlbiBpdCBoYXMgbm8gdXNhYmxlIG9uZSBvZiBpdHMgb3duOiB0aGUgZW5kcG9pbnQgaXQgcG9pbnRzIGF0LCBwbHVzIGl0cyByb3V0ZSB3aGVuIGl0IGhhcyBvbmUgLSBzbyBlbnRyaWVzIHRoYXQgd2VyZSBkaXN0aW5jdCBzdG9yYWdlIGJlZm9yZSBuYW1lcyBleGlzdGVkIHN0YXkgZGlzdGluY3Qgbm93LiAqL1xuZnVuY3Rpb24gZGVyaXZlZFNvdXJjZU5hbWUoc291cmNlOiBTb3VyY2VDb25maWcpOiBzdHJpbmcge1xuICAgIGxldCBlbmRwb2ludCA9IHNvdXJjZS51cmw7XG4gICAgaWYgKHNvdXJjZS50eXBlID09PSBcInJlbW90ZVwiKSB7XG4gICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgZW5kcG9pbnQgPSBgJHtwYXJzZWQuYWRkcmVzc30tJHtwYXJzZWQucG9ydH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZHBvaW50ID0gcGFyc2VCYWNrYmxhemVVcmwoc291cmNlLnVybCkuYnVja2V0TmFtZTtcbiAgICB9XG4gICAgbGV0IHJvdXRlID0gc291cmNlLnJvdXRlO1xuICAgIGlmIChyb3V0ZSAmJiBpc1VzYWJsZVJvdXRlKHJvdXRlKSAmJiAhKHJvdXRlWzBdID09PSBGVUxMX1JPVVRFWzBdICYmIHJvdXRlWzFdID09PSBGVUxMX1JPVVRFWzFdKSkge1xuICAgICAgICBlbmRwb2ludCArPSBgLXJvdXRlLSR7cm91dGVbMF19LSR7cm91dGVbMV19YDtcbiAgICB9XG4gICAgcmV0dXJuIHNhbml0aXplU291cmNlTmFtZShlbmRwb2ludCk7XG59XG5cbi8qKiBBIG5hbWUgYnVpbHQgZnJvbSBzb21ldGhpbmcgdGhhdCB3YXMgbmV2ZXIgbWVhbnQgdG8gYmUgb25lIChhIGhvc3QsIGEgYnVja2V0KSwgbWFkZSB1c2FibGUgYXMgYSBmb2xkZXIuIFBlcmlvZHMgc3Vydml2ZSwgc28gaXQgc3RpbGwgcmVhZHMgYXMgd2hhdCBpdCBjYW1lIGZyb20uICovXG5mdW5jdGlvbiBzYW5pdGl6ZVNvdXJjZU5hbWUoZnJvbTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgbmFtZSA9IGZyb20ucmVwbGFjZSgvW15cXHcuLV0vZywgXCItXCIpLnNsaWNlKDAsIDY0KTtcbiAgICBpZiAoIWlzVXNhYmxlU291cmNlTmFtZShuYW1lKSkge1xuICAgICAgICAvLyBPbmx5IHJlYWNoYWJsZSBmcm9tIHNvbWV0aGluZyB3aXRoIG5vIHVzYWJsZSBjaGFyYWN0ZXJzIGF0IGFsbDsgdGhlIG5hbWUgc3RpbGwgaGFzIHRvIGV4aXN0XG4gICAgICAgIHJldHVybiBcInNvdXJjZVwiO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZTtcbn1cblxuLyoqIEhvdyBmYXIgdXAgZnJvbSAwIHRoZSBzb3VyY2VzJyByb3V0ZXMgcmVhY2ggd2l0aG91dCBhIGdhcCAoMSBtZWFucyB0aGUgd2hvbGUga2V5IHNwYWNlKS4gKi9cbmZ1bmN0aW9uIGdldFJvdXRlQ292ZXJhZ2Uoc291cmNlczogU291cmNlQ29uZmlnW10pOiBudW1iZXIge1xuICAgIGxldCByb3V0ZXMgPSBzb3VyY2VzLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSk7XG4gICAgc29ydChyb3V0ZXMsIHggPT4geFswXSk7XG4gICAgbGV0IGNvdmVyZWQgPSAwO1xuICAgIGZvciAobGV0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgICAgICBpZiAocm91dGVbMF0gPiBjb3ZlcmVkKSBicmVhaztcbiAgICAgICAgY292ZXJlZCA9IE1hdGgubWF4KGNvdmVyZWQsIHJvdXRlWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvdmVyZWQ7XG59XG5cbi8qKiBQdXRzIGEgd2hvbGUgY29uZmlnIGludG8gdGhlIHNoYXBlIHRoZSBjb2RlIGV4cGVjdHMsIHdpdGhvdXQganVkZ2luZyBpdCAtIHNlZSBub3JtYWxpemVTb3VyY2UsIGFuZCBzZWUgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcgZm9yIHRoZSBqdWRnaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZyhjb25maWc6IFJlbW90ZUNvbmZpZyB8IFJlbW90ZUNvbmZpZ0Jhc2UpOiBSZW1vdGVDb25maWcge1xuICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSBcInN0cmluZ1wiICYmIFwic291cmNlc1wiIGluIGNvbmZpZykge1xuICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBjb25maWcudmVyc2lvbiwgc291cmNlczogY29uZmlnLnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSkgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc291cmNlczogW25vcm1hbGl6ZVNvdXJjZShjb25maWcpXSB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBjb25maWcgbWF5IGJlIFdSSVRURU4uIEV2ZXJ5dGhpbmcgaGVyZSBpcyBhIHJ1bGUgYWJvdXQgdGhlIGNvbmZpZyBhcyBhIHdob2xlLCB3aGljaCBpc1xuICogZXhhY3RseSB3aHkgaXQgY2Fubm90IHJ1biBvbiByZWFkOiBhIGNvbmZpZyB0aGF0IGlzIGFscmVhZHkgc3RvcmVkIHNvbWV3aGVyZSBoYXMgdG8ga2VlcCBiZWluZ1xuICogcmVhZGFibGUsIG9yIGEgc2VydmVyIHRoYXQgb25jZSBhY2NlcHRlZCBhIGJhZCBvbmUgY291bGQgbmV2ZXIgc3RhcnQgYWdhaW4uIFJlamVjdGluZyBpdCBhdCB0aGVcbiAqIHBvaW50IGl0IGlzIGludHJvZHVjZWQgaXMgd2hhdCBrZWVwcyBhIGJhZCBvbmUgZnJvbSBldmVyIGJlaW5nIHN0b3JlZCBpbiB0aGUgZmlyc3QgcGxhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyhjb25maWc6IFJlbW90ZUNvbmZpZyk6IHZvaWQge1xuICAgIGxldCBzb3VyY2VzID0gY29uZmlnLnNvdXJjZXMubWFwKG5vcm1hbGl6ZVNvdXJjZSk7XG4gICAgLy8gTWl4ZWQgaW1tdXRhYmlsaXR5IG1ha2VzIG5vIHNlbnNlIEFNT05HIHNvdXJjZXMgdmFsaWQgYXQgdGhlIHNhbWUgdGltZTogYSBtdXRhYmxlIHNvdXJjZSB3b3VsZCBhY2NlcHQgb3ZlcndyaXRlcyB0aGF0IGl0cyBpbW11dGFibGUgcGVlcnMgcmVmdXNlIHRvIHN5bmNocm9uaXplLCBmb3JraW5nIHRoZWlyIGNvbnRlbnRzLiBTb3VyY2VzIGFyZSBncm91cGVkIGJ5IHRyYW5zaXRpdmVseSBvdmVybGFwcGluZyB2YWxpZCB3aW5kb3dzIChhYnNvcmIgZXZlcnl0aGluZyBvdmVybGFwcGluZyB0aGUgZ3JvdXAsIGV4dGVuZCB0aGUgZ3JvdXAncyBlbmQsIHJlcGVhdCkgLSBhIHNvZnQgY2hlY2sgdGhhdCBpcyBjb3JyZWN0IGFzIGxvbmcgYXMgd2luZG93cyBoYXZlIGNsZWFuIGJyZWFrcyAoYSBncm91cCBlbmRzIGV4YWN0bHkgd2hlcmUgdGhlIG5leHQgYmVnaW5zKS5cbiAgICBsZXQgc29ydGVkID0gWy4uLnNvdXJjZXNdO1xuICAgIHNvcnQoc29ydGVkLCB4ID0+IHgudmFsaWRXaW5kb3dbMF0pO1xuICAgIGxldCBncm91cDogdHlwZW9mIHNvdXJjZXMgPSBbXTtcbiAgICBsZXQgZ3JvdXBFbmQgPSAwO1xuICAgIGZ1bmN0aW9uIGNoZWNrR3JvdXAoKSB7XG4gICAgICAgIGxldCBpbW11dGFibGVDb3VudCA9IGdyb3VwLmZpbHRlcih4ID0+IHguaW1tdXRhYmxlKS5sZW5ndGg7XG4gICAgICAgIGlmIChpbW11dGFibGVDb3VudCAmJiBpbW11dGFibGVDb3VudCAhPT0gZ3JvdXAubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZXMgd2l0aCBvdmVybGFwcGluZyB2YWxpZCB3aW5kb3dzIG11c3QgYWdyZWUgb24gaW1tdXRhYmlsaXR5OiAke2ltbXV0YWJsZUNvdW50fSBvZiAke2dyb3VwLmxlbmd0aH0gYXJlIGltbXV0YWJsZS4gU291cmNlczogJHtKU09OLnN0cmluZ2lmeShncm91cC5tYXAoeCA9PiAoeyB1cmw6IHgudXJsLCB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgaW1tdXRhYmxlOiAhIXguaW1tdXRhYmxlIH0pKSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHNvdXJjZXMgdmFsaWQgYXQgYW55IGluc3RhbnQgbXVzdCBjb3ZlciB0aGUgd2hvbGUga2V5IHNwYWNlLCBvciBrZXlzIHJvdXRpbmcgaW50byBhIGdhcCBjb3VsZCBuZXZlciBiZSByZWFkXG4gICAgICAgIGxldCBjb3ZlcmVkID0gZ2V0Um91dGVDb3ZlcmFnZShncm91cCk7XG4gICAgICAgIGlmIChjb3ZlcmVkIDwgMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2VzIHdpdGggb3ZlcmxhcHBpbmcgdmFsaWQgd2luZG93cyBtdXN0IGNvdmVyIHRoZSBmdWxsIHJvdXRlIHNwYWNlIFswLCAxKTsgY292ZXJhZ2Ugc3RvcHMgYXQgJHtjb3ZlcmVkfS4gU291cmNlczogJHtKU09OLnN0cmluZ2lmeShncm91cC5tYXAoeCA9PiAoeyB1cmw6IHgudXJsLCB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgcm91dGU6IHgucm91dGUgfHwgRlVMTF9ST1VURSB9KSkpfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgc3RvcmUgaXMgTk9UIHJlcXVpcmVkIHRvIGNvdmVyIHRoZSB3aG9sZSBrZXkgc3BhY2Ugb24gaXRzIG93bi4gSXQgb25jZSB3YXMsIGJlY2F1c2UgYSBzdG9yZSB0aGF0IGhvbGRzIGtleXMgb3V0c2lkZSB0aGUgcm91dGUgaXQgc3luY2hyb25pemVzIG5ldmVyIGxlYXJucyBvZiB0aGVpciBkZWxldGlvbnMgYW5kIGV2ZW50dWFsbHkgcmVzdXJyZWN0cyB0aGVtIC0gYnV0IGEgc3RvcmUncyBkYXRhIG5vdyBsaXZlcyB1bmRlciBpdHMgbmFtZSByYXRoZXIgdGhhbiBpdHMgcm91dGUsIGFuZCBhIHNjYW4gb25seSBldmVyIGluZGV4ZXMga2V5cyBpbnNpZGUgdGhlIHJvdXRlIHRoZSBzdG9yZSBpcyBjb25maWd1cmVkIGZvciwgc28ga2V5cyBvdXRzaWRlIGl0IGFyZSBuZXZlciB0YWtlbiBpbnRvIHRoZSBpbmRleCB0aGF0IGNvdWxkIHJlc3VycmVjdCB0aGVtLiBXaGF0IHJlcGxhY2VzIHRoYXQgcnVsZSBpcyB0aGUgbmFtaW5nIGRpc2NpcGxpbmU6IGEgbmFtZSBpcyBvbmUgc3RvcmFnZSwgYW5kIHBvaW50aW5nIGEgbmFtZSBhdCBhIGRpZmZlcmVudCByb3V0ZSBsYXRlciBpcyB3aGF0IHdvdWxkIGhhbmQgaXQga2V5cyBpdCBuZXZlciBzeW5jaHJvbml6ZWQuXG4gICAgfVxuICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3J0ZWQpIHtcbiAgICAgICAgaWYgKGdyb3VwLmxlbmd0aCAmJiBzb3VyY2UudmFsaWRXaW5kb3dbMF0gPj0gZ3JvdXBFbmQpIHtcbiAgICAgICAgICAgIGNoZWNrR3JvdXAoKTtcbiAgICAgICAgICAgIGdyb3VwID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAucHVzaChzb3VyY2UpO1xuICAgICAgICBncm91cEVuZCA9IE1hdGgubWF4KGdyb3VwRW5kLCBzb3VyY2UudmFsaWRXaW5kb3dbMV0pO1xuICAgIH1cbiAgICBjaGVja0dyb3VwKCk7XG4gICAgLy8gT05FIGVudHJ5IHBlciBzdG9yZSBhdCBhbnkgaW5zdGFudC4gQSBuYW1lIGlzIGEgc3RvcmUgLSBvbmUgZm9sZGVyLCBvbmUgaW5kZXggLSBzbyB0d28gZW50cmllcyBuYW1pbmcgaXQgYXQgdGhlIHNhbWUgdGltZSB3b3VsZCBiZSB0d28gYW5zd2VycyB0byBcIndoYXQgaXMgdGhpcyBzdG9yZSBjb25maWd1cmVkIHRvIGJlIHJpZ2h0IG5vd1wiLCBhbmQgZXZlcnkgcm91dGUgYW5kIGZsYWcgaXQgcmVhZHMgd291bGQgZGVwZW5kIG9uIHdoaWNoIGVudHJ5IHlvdSBoYXBwZW5lZCB0byBsb29rIGF0LiBOb24tb3ZlcmxhcHBpbmcgd2luZG93cyBhcmUgZmluZSwgYW5kIGFyZSBob3cgYSBzdG9yZSdzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBvdmVyIHRpbWUuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHNvdXJjZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCBhID0gc291cmNlc1tpXTtcbiAgICAgICAgICAgIGxldCBiID0gc291cmNlc1tqXTtcbiAgICAgICAgICAgIGlmIChzdG9yZUlkZW50aXR5KGEpICE9PSBzdG9yZUlkZW50aXR5KGIpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChhLnZhbGlkV2luZG93WzBdIDwgYi52YWxpZFdpbmRvd1sxXSAmJiBiLnZhbGlkV2luZG93WzBdIDwgYS52YWxpZFdpbmRvd1sxXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG5hbWUgJHtKU09OLnN0cmluZ2lmeShhLm5hbWUpfSBpcyByZXVzZWQgd2l0aCBtdWx0aXBsZSBzb3VyY2UgY29uZmlndXJhdGlvbnMgYXQgdGhlIHNhbWUgdGltZTpcXG4gICAgJHtKU09OLnN0cmluZ2lmeShhKX1cXG4gICAgJHtKU09OLnN0cmluZ2lmeShiKX1cXG5BIG5hbWUgaXMgb25lIHN0b3JlIC0gb25lIGZvbGRlciwgb25lIGluZGV4IC0gc28gaXQgY2FuIG9ubHkgYmUgY29uZmlndXJlZCBvbmUgd2F5IGF0IGEgdGltZS4gR2l2ZSB0aGVtIG5vbi1vdmVybGFwcGluZyB2YWxpZCB3aW5kb3dzLCBvciBkaWZmZXJlbnQgbmFtZXMgaWYgdGhleSBhcmUgbWVhbnQgdG8gYmUgZGlmZmVyZW50IHN0b3JhZ2UuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogVGhlIGlkZW50aXR5IG9mIG9uZSBvZiBhIHN0b3JlJ3MgU09VUkNFIFNMT1RTIC0gd2hpY2ggaXMgdGhlIGVuZHBvaW50IGl0IHRhbGtzIHRvLCBhbmQgbm90IHRoZSBzYW1lXG4gKiBxdWVzdGlvbiBhcyB3aGljaCBzdG9yZSB0aGlzIGlzICh0aGF0IGlzIENvbW1vbkNvbmZpZy5uYW1lKS4gQSBzd2l0Y2hvdmVyJ3MgYWx0ZXJuYXRlIHBvcnQgaXMgYVxuICogZGlzdGluY3Qgc2xvdCBldmVuIHRob3VnaCBpdCBuYW1lcyB0aGUgc2FtZSBzdG9yYWdlLCBiZWNhdXNlIGEgc2xvdCBob2xkcyBhIGNvbm5lY3Rpb24gdG8gYSBwb3J0LlxuICpcbiAqIE9OTFkgdGhlIHR5cGUsIHRoZSB1cmwsIGFuZCB0aGUgaW50ZXJtZWRpYXRlJ3MgYWx0ZXJuYXRlIHBvcnQgYXJlIHBhcnQgb2YgaXQ6IGV2ZXJ5dGhpbmcgZWxzZSBpc1xuICogcG9saWN5IGFib3V0IGhvdyB3ZSBVU0UgdGhlIGVuZHBvaW50LCBhbmQgY2hhbmdpbmcgcG9saWN5IG11c3QgbmV2ZXIgbWFrZSBhIHN0b3JlIGJlbGlldmUgaXQgaXNcbiAqIGxvb2tpbmcgYXQgYSBORVcgc291cmNlIC0gdGhhdCB3b3VsZCBkcm9wIGV2ZXJ5IGluZGV4IGVudHJ5IHRoZSBvbGQgb25lIGhlbGQgYW5kIHJlc2NhbiBpdCBmcm9tXG4gKiBzY3JhdGNoLCBzbyB0aGUgZmlsZXMgaXQgaG9sZHMgZ28gbWlzc2luZyBmcm9tIGxpc3RpbmdzIHVudGlsIHRoZSByZXNjYW4gZmluaXNoZXMsIGZvciBhIGZsYWcgZmxpcC5cbiAqXG4gKiBCdWlsdCBieSBoYW5kIHJhdGhlciB0aGFuIGJ5IHNlcmlhbGl6aW5nIHRoZSBjb25maWcsIHNvIGl0IGNhbm5vdCBjaGFuZ2UganVzdCBiZWNhdXNlIHRoZSByb3V0aW5nXG4gKiBmaWxlIHdhcyB3cml0dGVuIHdpdGggaXRzIGtleXMgaW4gYSBkaWZmZXJlbnQgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCFzb3VyY2VDb25maWcpIHJldHVybiBcImRpc2tcIjtcbiAgICByZXR1cm4gYCR7c291cmNlQ29uZmlnLnR5cGV9fCR7c291cmNlQ29uZmlnLnVybH18JHtzb3VyY2VDb25maWcuaW50ZXJtZWRpYXRlIHx8IFwiXCJ9YDtcbn1cblxuLyoqIFdoYXQgYW4gaW5kZXggZW50cnkgcmVjb3JkcyBhcyB0aGUgaG9sZGVyIG9mIGl0cyBieXRlcyAoc2VlIEFyY2hpdmVzU291cmNlLnVybCksIHNvIGl0IG11c3QgbmFtZSB0aGUgZW5kcG9pbnQgRk9SRVZFUi4gQW4gaW50ZXJtZWRpYXRlIGlzIGEgc3dpdGNob3ZlcidzIHRlbXBvcmFyeSBhbHRlcm5hdGUgcG9ydCBvbnRvIGFub3RoZXIgc291cmNlLCBhbmQgdGhhdCBwb3J0IGlzIGdvbmUgZm9yIGdvb2Qgb25jZSBpdHMgd2luZG93IHBhc3NlcyAtIHNvIGl0IGlzIHJlY29yZGVkIGFzIHRoZSBzb3VyY2UgaXQgd2FzIHNwbGl0IG91dCBvZiwgd2hpY2ggaG9sZHMgdGhlIHNhbWUgYnVja2V0IGFuZCBvdXRsaXZlcyBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3VyY2VQZXJzaXN0ZW50VXJsKHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkLCBmb2xkZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFzb3VyY2VDb25maWcpIHJldHVybiBmb2xkZXI7XG4gICAgcmV0dXJuIHNvdXJjZUNvbmZpZy5pbnRlcm1lZGlhdGUgfHwgc291cmNlQ29uZmlnLnVybDtcbn1cblxuLyoqIFdoaWNoIHN0b3JlIGFuIGVudHJ5IGNvbmZpZ3VyZXM6IGl0cyBuYW1lLCBvbiB0aGUgc2VydmVyIGl0IHBvaW50cyBhdC4gQSBzd2l0Y2hvdmVyJ3MgYWx0ZXJuYXRlIHBvcnQgaXMgdGhlIHNhbWUgc2VydmVyIChzbyBpdCBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSBlbnRyeSBpdCB3YXMgc3BsaXQgb3V0IG9mLCB3aG9zZSB3aW5kb3cgaXQgbXVzdCBub3Qgb3ZlcmxhcCk7IGEgZ2VudWluZWx5IGRpZmZlcmVudCBzZXJ2ZXIgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGEgZGlmZmVyZW50IHN0b3JlLCBvbiBhIGRpZmZlcmVudCBtYWNoaW5lLiAqL1xuZnVuY3Rpb24gc3RvcmVJZGVudGl0eShzb3VyY2U6IFNvdXJjZUNvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3NvdXJjZS5pbnRlcm1lZGlhdGUgfHwgc291cmNlLnVybH18JHtzb3VyY2UubmFtZX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSb3V0aW5nRGF0YShkYXRhOiBCdWZmZXIpOiBSZW1vdGVDb25maWcge1xuICAgIGxldCB0ZXh0ID0gZGF0YS50b1N0cmluZygpO1xuICAgIGxldCBwYXJzZWQ6IFJlbW90ZUNvbmZpZztcbiAgICB0cnkge1xuICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpIGFzIFJlbW90ZUNvbmZpZztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGluZyBjb25maWcgaXMgbm90IHZhbGlkIEpTT04gKCR7U3RyaW5nKGUpfSkuIERhdGE6ICR7dGV4dC5zbGljZSgwLCA1MDApfWApO1xuICAgIH1cbiAgICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSBcIm9iamVjdFwiIHx8ICFBcnJheS5pc0FycmF5KHBhcnNlZC5zb3VyY2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdXRpbmcgY29uZmlnIG11c3QgYmUgeyB2ZXJzaW9uPywgc291cmNlczogWy4uLl0gfSwgd2FzICR7dGV4dC5zbGljZSgwLCA1MDApfWApO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplUmVtb3RlQ29uZmlnKHBhcnNlZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVSZW1vdGVDb25maWcoY29uZmlnOiBSZW1vdGVDb25maWcpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShjb25maWcsIHVuZGVmaW5lZCwgNCkpO1xufVxuIl19
324
+ /* _JS_SOURCE_HASH = "36089fc0a1ba870b13210eb40f236ac33903290983b2c1d7e7b7aaac0fe26285"; */
@@ -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
  };
@@ -102,7 +102,7 @@ function removeExtraListenPort(port) {
102
102
  extraListenPorts.delete(port);
103
103
  }
104
104
  exports.removeExtraListenPort = removeExtraListenPort;
105
- /** Whether address:port is this server process. The ONE self test - findSelfIndexes, createApiArchives, and SourceWrapper all consult it, so "is this me" cannot disagree between the routing plan and connection building: a URL that is us on an extra listen port must never become a network client to ourselves, which is how infinite self-request loops form. */
105
+ /** Whether address:port is this server process, including its extra listen ports (a deploy switchover's alternate port is still us). Used to tell which config entries are OUR copy of a bucket - the stores we run - as opposed to peers we synchronize with. Talking to ourselves is not one of the things it prevents: a source that happens to be us is reached over the API like any other. */
106
106
  function isOwnAddress(address, port) {
107
107
  let config = getStorageServerConfigOptional();
108
108
  if (!config)
@@ -112,5 +112,5 @@ function isOwnAddress(address, port) {
112
112
  return port === config.port || extraListenPorts.has(port);
113
113
  }
114
114
  exports.isOwnAddress = isOwnAddress;
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VydmVyQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4QixvREFBeUQ7QUFDekQsOERBQTJEO0FBQzNELGdEQUE2QztBQUc3Qyx1Q0FBbUM7QUFhbkMsSUFBSSxNQUF1QyxDQUFDO0FBQzVDLFNBQWdCLHNCQUFzQixDQUFDLEtBQTBCO0lBQzdELE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDbkIsQ0FBQztBQUZELHdEQUVDO0FBQ0QsU0FBZ0Isc0JBQXNCO0lBQ2xDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsK0VBQStFLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUxELHdEQUtDO0FBQ0QsU0FBZ0IsOEJBQThCO0lBQzFDLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFGRCx3RUFFQztBQUVELElBQUksb0JBQXdDLENBQUM7QUFDN0MsU0FBZ0IsdUJBQXVCLENBQUMsTUFBMEI7SUFDOUQsb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQ2xDLENBQUM7QUFGRCwwREFFQztBQUNELFNBQWdCLHVCQUF1QjtJQUNuQyxPQUFPLG9CQUFvQixDQUFDO0FBQ2hDLENBQUM7QUFGRCwwREFFQztBQUNELFNBQWdCLG1CQUFtQjtJQUMvQixJQUFJLG9CQUFvQjtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRkQsa0RBRUM7QUFFRCxTQUFnQixnQkFBZ0I7SUFDNUIsSUFBSSxNQUFNLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztJQUM5QyxJQUFJLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDakMsSUFBSSxNQUFNLEdBQUcsSUFBQSxnQkFBTSxFQUFDLFFBQVEsQ0FBQyxDQUFD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LEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0csQ0FBQztBQUNMLENBQUM7QUFsQkQsZ0RBa0JDO0FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0FBQzNDLFNBQWdCLGtCQUFrQixDQUFDLElBQVk7SUFDM0MsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFGRCxnREFFQztBQUNELFNBQWdCLHFCQUFxQixDQUFDLElBQVk7SUFDOUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFGRCxzREFFQztBQUNELHdXQUF3VztBQUN4VyxTQUFnQixZQUFZLENBQUMsT0FBZSxFQUFFLElBQVk7SUFDdEQsSUFBSSxNQUFNLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztJQUM5QyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLElBQUksT0FBTyxLQUFLLE1BQU0sQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUMsT0FBTyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUxELG9DQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGdldEZpbGVTdG9yYWdlTmVzdGVkMiB9IGZyb20gXCIuLi9GaWxlRm9sZGVyQVBJXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0b3JhZ2UgfSBmcm9tIFwiLi4vVHJhbnNhY3Rpb25TdG9yYWdlXCI7XG5pbXBvcnQgeyBKU09OU3RvcmFnZSB9IGZyb20gXCIuLi9KU09OU3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZSB9IGZyb20gXCIuLi9JU3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUgeyBBY2Nlc3NSZXF1ZXN0LCBUcnVzdFJlY29yZCB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBnZXRBcmcgfSBmcm9tIFwiLi9jbGlBcmdzXCI7XG5cbi8vIFRoZSBzdG9yYWdlIHNlcnZlcidzIHByb2Nlc3MtbGV2ZWwgaWRlbnRpdHkgYW5kIHN5c3RlbSBzdGF0ZTogd2hpY2ggc2VydmVyIHdlIGFyZSAoY29uZmlnLCBleHRyYSBwb3J0cyksIHdoZXRoZXIgd3JpdGVzIGFyZSBhbGxvd2VkLCBhbmQgdGhlIHRydXN0L3JlcXVlc3Qgc3RvcmVzLlxuXG5leHBvcnQgdHlwZSBTdG9yYWdlU2VydmVyQ29uZmlnID0ge1xuICAgIGRvbWFpbjogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICByb290RG9tYWluOiBzdHJpbmc7XG4gICAgc3NoVGFyZ2V0OiBzdHJpbmc7XG4gICAgc2VydmVyQ29tbWFuZDogc3RyaW5nO1xuICAgIGZvbGRlcjogc3RyaW5nO1xufTtcblxubGV0IGNvbmZpZzogU3RvcmFnZVNlcnZlckNvbmZpZyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRTdG9yYWdlU2VydmVyQ29uZmlnKHZhbHVlOiBTdG9yYWdlU2VydmVyQ29uZmlnKTogdm9pZCB7XG4gICAgY29uZmlnID0gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpOiBTdG9yYWdlU2VydmVyQ29uZmlnIHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0b3JhZ2Ugc2VydmVyIGlzIG5vdCBpbml0aWFsaXplZCAodGhpcyBBUEkgb25seSB3b3JrcyBvbiB0aGUgc3RvcmFnZSBzZXJ2ZXIpYCk7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCk6IFN0b3JhZ2VTZXJ2ZXJDb25maWcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjb25maWc7XG59XG5cbmxldCB3cml0ZXNSZWplY3RlZFJlYXNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdyaXRlc1JlamVjdGVkUmVhc29uKHJlYXNvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgd3JpdGVzUmVqZWN0ZWRSZWFzb24gPSByZWFzb247XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gd3JpdGVzUmVqZWN0ZWRSZWFzb247XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0V3JpdGVzQWxsb3dlZCgpOiB2b2lkIHtcbiAgICBpZiAod3JpdGVzUmVqZWN0ZWRSZWFzb24pIHRocm93IG5ldyBFcnJvcih3cml0ZXNSZWplY3RlZFJlYXNvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlRm9sZGVyKCk6IHN0cmluZyB7XG4gICAgbGV0IGNvbmZpZyA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCgpO1xuICAgIGlmIChjb25maWcpIHJldHVybiBjb25maWcuZm9sZGVyO1xuICAgIGxldCBmb2xkZXIgPSBnZXRBcmcoXCJmb2xkZXJcIik7XG4gICAgaWYgKCFmb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIHNlcnZlciBpcyBub3QgaW5pdGlhbGl6ZWQgYW5kIHRoZXJlIGlzIG5vIC0tZm9sZGVyIGFyZywgc28gdGhlIHN0b3JhZ2UgZm9sZGVyIGlzIHVua25vd25gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShmb2xkZXIpO1xufVxuXG5jb25zdCBzeXN0ZW1TdG9yYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPElTdG9yYWdlPHVua25vd24+Pj4oKTtcbmZ1bmN0aW9uIGdldFN5c3RlbVN0b3JhZ2U8VD4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxJU3RvcmFnZTxUPj4ge1xuICAgIGxldCBzdG9yYWdlID0gc3lzdGVtU3RvcmFnZXMuZ2V0KG5hbWUpO1xuICAgIGlmICghc3RvcmFnZSkge1xuICAgICAgICBzdG9yYWdlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCByb290ID0gYXdhaXQgZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQyKGdldFN0b3JhZ2VGb2xkZXIoKSk7XG4gICAgICAgICAgICBsZXQgc3lzdGVtID0gYXdhaXQgcm9vdC5mb2xkZXIuZ2V0U3RvcmFnZShcInN5c3RlbTJcIik7XG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25OYW1lID0gXCJzdG9yYWdlXCIgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OU3RvcmFnZTx1bmtub3duPihuZXcgVHJhbnNhY3Rpb25TdG9yYWdlKGF3YWl0IHN5c3RlbS5mb2xkZXIuZ2V0U3RvcmFnZShuYW1lKSwgdHJhbnNhY3Rpb25OYW1lKSk7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHN5c3RlbVN0b3JhZ2VzLnNldChuYW1lLCBzdG9yYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JhZ2UgYXMgUHJvbWlzZTxJU3RvcmFnZTxUPj47XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJ1c3QoKTogUHJvbWlzZTxJU3RvcmFnZTxUcnVzdFJlY29yZD4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxUcnVzdFJlY29yZD4oXCJ0cnVzdFwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXF1ZXN0cygpOiBQcm9taXNlPElTdG9yYWdlPEFjY2Vzc1JlcXVlc3RbXT4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxBY2Nlc3NSZXF1ZXN0W10+KFwicmVxdWVzdHNcIik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRUcnVzdGVkTWFjaGluZXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgbWFjaGluZUlkczogc3RyaW5nW10gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgbGV0IHByZWZpeCA9IGAke2NvbmZpZy5hY2NvdW50fXxgO1xuICAgIGxldCBkZXNpcmVkID0gbmV3IFNldChjb25maWcubWFjaGluZUlkcyk7XG4gICAgZm9yIChsZXQga2V5IG9mIGF3YWl0IHRydXN0LmdldEtleXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbWFjaGluZUlkID0ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAoZGVzaXJlZC5oYXMobWFjaGluZUlkKSkge1xuICAgICAgICAgICAgZGVzaXJlZC5kZWxldGUobWFjaGluZUlkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgZm9yIChsZXQgbWFjaGluZUlkIG9mIGRlc2lyZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFkZGluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cHJlZml4fSR7bWFjaGluZUlkfWAsIHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIG1hY2hpbmVJZCwgaXA6IFwiXCIsIHRpbWU6IERhdGUubm93KCkgfSk7XG4gICAgfVxufVxuXG5jb25zdCBleHRyYUxpc3RlblBvcnRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5leHBvcnQgZnVuY3Rpb24gYWRkRXh0cmFMaXN0ZW5Qb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGV4dHJhTGlzdGVuUG9ydHMuYWRkKHBvcnQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUV4dHJhTGlzdGVuUG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBleHRyYUxpc3RlblBvcnRzLmRlbGV0ZShwb3J0KTtcbn1cbi8qKiBXaGV0aGVyIGFkZHJlc3M6cG9ydCBpcyB0aGlzIHNlcnZlciBwcm9jZXNzLiBUaGUgT05FIHNlbGYgdGVzdCAtIGZpbmRTZWxmSW5kZXhlcywgY3JlYXRlQXBpQXJjaGl2ZXMsIGFuZCBTb3VyY2VXcmFwcGVyIGFsbCBjb25zdWx0IGl0LCBzbyBcImlzIHRoaXMgbWVcIiBjYW5ub3QgZGlzYWdyZWUgYmV0d2VlbiB0aGUgcm91dGluZyBwbGFuIGFuZCBjb25uZWN0aW9uIGJ1aWxkaW5nOiBhIFVSTCB0aGF0IGlzIHVzIG9uIGFuIGV4dHJhIGxpc3RlbiBwb3J0IG11c3QgbmV2ZXIgYmVjb21lIGEgbmV0d29yayBjbGllbnQgdG8gb3Vyc2VsdmVzLCB3aGljaCBpcyBob3cgaW5maW5pdGUgc2VsZi1yZXF1ZXN0IGxvb3BzIGZvcm0uICovXG5leHBvcnQgZnVuY3Rpb24gaXNPd25BZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgcG9ydDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgbGV0IGNvbmZpZyA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCgpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGFkZHJlc3MgIT09IGNvbmZpZy5kb21haW4pIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gcG9ydCA9PT0gY29uZmlnLnBvcnQgfHwgZXh0cmFMaXN0ZW5Qb3J0cy5oYXMocG9ydCk7XG59XG4iXX0=
116
- /* _JS_SOURCE_HASH = "f72848b2cee2010e63b13859d8c7d109ab01969f165c8a4d0f186d691fa6d42b"; */
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VydmVyQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4QixvREFBeUQ7QUFDekQsOERBQTJEO0FBQzNELGdEQUE2QztBQUc3Qyx1Q0FBbUM7QUFhbkMsSUFBSSxNQUF1QyxDQUFDO0FBQzVDLFNBQWdCLHNCQUFzQixDQUFDLEtBQTBCO0lBQzdELE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDbkIsQ0FBQztBQUZELHdEQUVDO0FBQ0QsU0FBZ0Isc0JBQXNCO0lBQ2xDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsK0VBQStFLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUxELHdEQUtDO0FBQ0QsU0FBZ0IsOEJBQThCO0lBQzFDLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFGRCx3RUFFQztBQUVELElBQUksb0JBQXdDLENBQUM7QUFDN0MsU0FBZ0IsdUJBQXVCLENBQUMsTUFBMEI7SUFDOUQsb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQ2xDLENBQUM7QUFGRCwwREFFQztBQUNELFNBQWdCLHVCQUF1QjtJQUNuQyxPQUFPLG9CQUFvQixDQUFDO0FBQ2hDLENBQUM7QUFGRCwwREFFQztBQUNELFNBQWdCLG1CQUFtQjtJQUMvQixJQUFJLG9CQUFvQjtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRkQsa0RBRUM7QUFFRCxTQUFnQixnQkFBZ0I7SUFDNUIsSUFBSSxNQUFNLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztJQUM5QyxJQUFJLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDakMsSUFBSSxNQUFNLEdBQUcsSUFBQSxnQkFBTSxFQUFDLFFBQVEsQ0FBQyxDQUFD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LEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0csQ0FBQztBQUNMLENBQUM7QUFsQkQsZ0RBa0JDO0FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0FBQzNDLFNBQWdCLGtCQUFrQixDQUFDLElBQVk7SUFDM0MsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFGRCxnREFFQztBQUNELFNBQWdCLHFCQUFxQixDQUFDLElBQVk7SUFDOUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFGRCxzREFFQztBQUNELG9ZQUFvWTtBQUNwWSxTQUFnQixZQUFZLENBQUMsT0FBZSxFQUFFLElBQVk7SUFDdEQsSUFBSSxNQUFNLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztJQUM5QyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLElBQUksT0FBTyxLQUFLLE1BQU0sQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUMsT0FBTyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUxELG9DQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGdldEZpbGVTdG9yYWdlTmVzdGVkMiB9IGZyb20gXCIuLi9GaWxlRm9sZGVyQVBJXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0b3JhZ2UgfSBmcm9tIFwiLi4vVHJhbnNhY3Rpb25TdG9yYWdlXCI7XG5pbXBvcnQgeyBKU09OU3RvcmFnZSB9IGZyb20gXCIuLi9KU09OU3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZSB9IGZyb20gXCIuLi9JU3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUgeyBBY2Nlc3NSZXF1ZXN0LCBUcnVzdFJlY29yZCB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBnZXRBcmcgfSBmcm9tIFwiLi9jbGlBcmdzXCI7XG5cbi8vIFRoZSBzdG9yYWdlIHNlcnZlcidzIHByb2Nlc3MtbGV2ZWwgaWRlbnRpdHkgYW5kIHN5c3RlbSBzdGF0ZTogd2hpY2ggc2VydmVyIHdlIGFyZSAoY29uZmlnLCBleHRyYSBwb3J0cyksIHdoZXRoZXIgd3JpdGVzIGFyZSBhbGxvd2VkLCBhbmQgdGhlIHRydXN0L3JlcXVlc3Qgc3RvcmVzLlxuXG5leHBvcnQgdHlwZSBTdG9yYWdlU2VydmVyQ29uZmlnID0ge1xuICAgIGRvbWFpbjogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICByb290RG9tYWluOiBzdHJpbmc7XG4gICAgc3NoVGFyZ2V0OiBzdHJpbmc7XG4gICAgc2VydmVyQ29tbWFuZDogc3RyaW5nO1xuICAgIGZvbGRlcjogc3RyaW5nO1xufTtcblxubGV0IGNvbmZpZzogU3RvcmFnZVNlcnZlckNvbmZpZyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRTdG9yYWdlU2VydmVyQ29uZmlnKHZhbHVlOiBTdG9yYWdlU2VydmVyQ29uZmlnKTogdm9pZCB7XG4gICAgY29uZmlnID0gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpOiBTdG9yYWdlU2VydmVyQ29uZmlnIHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0b3JhZ2Ugc2VydmVyIGlzIG5vdCBpbml0aWFsaXplZCAodGhpcyBBUEkgb25seSB3b3JrcyBvbiB0aGUgc3RvcmFnZSBzZXJ2ZXIpYCk7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCk6IFN0b3JhZ2VTZXJ2ZXJDb25maWcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjb25maWc7XG59XG5cbmxldCB3cml0ZXNSZWplY3RlZFJlYXNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdyaXRlc1JlamVjdGVkUmVhc29uKHJlYXNvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgd3JpdGVzUmVqZWN0ZWRSZWFzb24gPSByZWFzb247XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gd3JpdGVzUmVqZWN0ZWRSZWFzb247XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0V3JpdGVzQWxsb3dlZCgpOiB2b2lkIHtcbiAgICBpZiAod3JpdGVzUmVqZWN0ZWRSZWFzb24pIHRocm93IG5ldyBFcnJvcih3cml0ZXNSZWplY3RlZFJlYXNvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlRm9sZGVyKCk6IHN0cmluZyB7XG4gICAgbGV0IGNvbmZpZyA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCgpO1xuICAgIGlmIChjb25maWcpIHJldHVybiBjb25maWcuZm9sZGVyO1xuICAgIGxldCBmb2xkZXIgPSBnZXRBcmcoXCJmb2xkZXJcIik7XG4gICAgaWYgKCFmb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIHNlcnZlciBpcyBub3QgaW5pdGlhbGl6ZWQgYW5kIHRoZXJlIGlzIG5vIC0tZm9sZGVyIGFyZywgc28gdGhlIHN0b3JhZ2UgZm9sZGVyIGlzIHVua25vd25gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShmb2xkZXIpO1xufVxuXG5jb25zdCBzeXN0ZW1TdG9yYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPElTdG9yYWdlPHVua25vd24+Pj4oKTtcbmZ1bmN0aW9uIGdldFN5c3RlbVN0b3JhZ2U8VD4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxJU3RvcmFnZTxUPj4ge1xuICAgIGxldCBzdG9yYWdlID0gc3lzdGVtU3RvcmFnZXMuZ2V0KG5hbWUpO1xuICAgIGlmICghc3RvcmFnZSkge1xuICAgICAgICBzdG9yYWdlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCByb290ID0gYXdhaXQgZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQyKGdldFN0b3JhZ2VGb2xkZXIoKSk7XG4gICAgICAgICAgICBsZXQgc3lzdGVtID0gYXdhaXQgcm9vdC5mb2xkZXIuZ2V0U3RvcmFnZShcInN5c3RlbTJcIik7XG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25OYW1lID0gXCJzdG9yYWdlXCIgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OU3RvcmFnZTx1bmtub3duPihuZXcgVHJhbnNhY3Rpb25TdG9yYWdlKGF3YWl0IHN5c3RlbS5mb2xkZXIuZ2V0U3RvcmFnZShuYW1lKSwgdHJhbnNhY3Rpb25OYW1lKSk7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHN5c3RlbVN0b3JhZ2VzLnNldChuYW1lLCBzdG9yYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JhZ2UgYXMgUHJvbWlzZTxJU3RvcmFnZTxUPj47XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJ1c3QoKTogUHJvbWlzZTxJU3RvcmFnZTxUcnVzdFJlY29yZD4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxUcnVzdFJlY29yZD4oXCJ0cnVzdFwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXF1ZXN0cygpOiBQcm9taXNlPElTdG9yYWdlPEFjY2Vzc1JlcXVlc3RbXT4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxBY2Nlc3NSZXF1ZXN0W10+KFwicmVxdWVzdHNcIik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRUcnVzdGVkTWFjaGluZXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgbWFjaGluZUlkczogc3RyaW5nW10gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgbGV0IHByZWZpeCA9IGAke2NvbmZpZy5hY2NvdW50fXxgO1xuICAgIGxldCBkZXNpcmVkID0gbmV3IFNldChjb25maWcubWFjaGluZUlkcyk7XG4gICAgZm9yIChsZXQga2V5IG9mIGF3YWl0IHRydXN0LmdldEtleXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbWFjaGluZUlkID0ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAoZGVzaXJlZC5oYXMobWFjaGluZUlkKSkge1xuICAgICAgICAgICAgZGVzaXJlZC5kZWxldGUobWFjaGluZUlkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgZm9yIChsZXQgbWFjaGluZUlkIG9mIGRlc2lyZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFkZGluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cHJlZml4fSR7bWFjaGluZUlkfWAsIHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIG1hY2hpbmVJZCwgaXA6IFwiXCIsIHRpbWU6IERhdGUubm93KCkgfSk7XG4gICAgfVxufVxuXG5jb25zdCBleHRyYUxpc3RlblBvcnRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5leHBvcnQgZnVuY3Rpb24gYWRkRXh0cmFMaXN0ZW5Qb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGV4dHJhTGlzdGVuUG9ydHMuYWRkKHBvcnQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUV4dHJhTGlzdGVuUG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBleHRyYUxpc3RlblBvcnRzLmRlbGV0ZShwb3J0KTtcbn1cbi8qKiBXaGV0aGVyIGFkZHJlc3M6cG9ydCBpcyB0aGlzIHNlcnZlciBwcm9jZXNzLCBpbmNsdWRpbmcgaXRzIGV4dHJhIGxpc3RlbiBwb3J0cyAoYSBkZXBsb3kgc3dpdGNob3ZlcidzIGFsdGVybmF0ZSBwb3J0IGlzIHN0aWxsIHVzKS4gVXNlZCB0byB0ZWxsIHdoaWNoIGNvbmZpZyBlbnRyaWVzIGFyZSBPVVIgY29weSBvZiBhIGJ1Y2tldCAtIHRoZSBzdG9yZXMgd2UgcnVuIC0gYXMgb3Bwb3NlZCB0byBwZWVycyB3ZSBzeW5jaHJvbml6ZSB3aXRoLiBUYWxraW5nIHRvIG91cnNlbHZlcyBpcyBub3Qgb25lIG9mIHRoZSB0aGluZ3MgaXQgcHJldmVudHM6IGEgc291cmNlIHRoYXQgaGFwcGVucyB0byBiZSB1cyBpcyByZWFjaGVkIG92ZXIgdGhlIEFQSSBsaWtlIGFueSBvdGhlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc093bkFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBsZXQgY29uZmlnID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYWRkcmVzcyAhPT0gY29uZmlnLmRvbWFpbikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBwb3J0ID09PSBjb25maWcucG9ydCB8fCBleHRyYUxpc3RlblBvcnRzLmhhcyhwb3J0KTtcbn1cbiJdfQ==
116
+ /* _JS_SOURCE_HASH = "98271b0570515909a669568a6cbd7df5d4bd3ee306dd47a7a56335b60bc92980"; */