sliftutils 1.7.21 → 1.7.23

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.
@@ -129,12 +129,18 @@ exports.addExtraListenPort = addExtraListenPort;
129
129
  function findSelfIndexes(routing, account, bucketName) {
130
130
  let { domain, port } = getStorageServerConfig();
131
131
  let indexes = [];
132
+ // The takeover's alternate port is the OTHER process of the switchover, on OUR machine with
133
+ // OUR disk - self for sync purposes on both sides (the old node must not scan/push its own
134
+ // successor; the shared folder plus the switchover disk scans reconcile them)
135
+ let takeoverAltPort = (0, deployTakeover_1.getTakeoverAltPort)();
132
136
  for (let i = 0; i < routing.sources.length; i++) {
133
137
  let source = routing.sources[i];
134
138
  if (typeof source === "string" || source.type !== "remote")
135
139
  continue;
136
140
  let parsed = (0, remoteConfig_1.parseHostedUrl)(source.url);
137
- if (parsed.address === domain && (parsed.port === port || extraListenPorts.has(parsed.port)) && parsed.account === account && parsed.bucketName === bucketName) {
141
+ if (parsed.address !== domain || parsed.account !== account || parsed.bucketName !== bucketName)
142
+ continue;
143
+ if (parsed.port === port || extraListenPorts.has(parsed.port) || parsed.port === takeoverAltPort) {
138
144
  indexes.push(i);
139
145
  }
140
146
  }
@@ -398,11 +404,11 @@ async function writeBucketFile(account, bucketName, filePath, data, config) {
398
404
  if (!(config === null || config === void 0 ? void 0 : config.lastModified) && loaded.selfEntries.length) {
399
405
  let timeValid = loaded.selfEntries.filter(x => writeTime >= x.validWindow[0] - IArchives_1.WRITE_PAST_WINDOW_GRACE && writeTime <= x.validWindow[1] + IArchives_1.WRITE_PAST_WINDOW_GRACE);
400
406
  if (!timeValid.length) {
401
- logWrongTargetRejection(`Rejecting fresh write of ${JSON.stringify(filePath)} to bucket ${account}/${bucketName}: outside our valid windows (a switchover moved the write target)`);
407
+ logWrongTargetRejection(`Rejecting fresh write of ${JSON.stringify(filePath)} to bucket ${account}/${bucketName}: writeTime ${writeTime} (${new Date(writeTime).toISOString()}) is outside all our valid windows ${JSON.stringify(loaded.selfEntries.map(x => x.validWindow))} even with the ${IArchives_1.WRITE_PAST_WINDOW_GRACE}ms grace (a switchover moved the write target)`);
402
408
  throw new Error(`${IArchives_1.STORAGE_WRONG_VALID_WINDOW} This server is not a valid write target at ${writeTime} for bucket ${account}/${bucketName} (our valid windows: ${JSON.stringify(loaded.selfEntries.map(x => x.validWindow))}). Re-resolve the currently valid source and retry.`);
403
409
  }
404
410
  if (!timeValid.some(x => (0, remoteConfig_1.routeContains)(x.route, route))) {
405
- logWrongTargetRejection(`Rejecting fresh write of ${JSON.stringify(filePath)} to bucket ${account}/${bucketName}: route ${route} is not ours (the client's shard config is stale)`);
411
+ logWrongTargetRejection(`Rejecting fresh write of ${JSON.stringify(filePath)} to bucket ${account}/${bucketName}: route ${route} is outside our routes ${JSON.stringify(timeValid.map(x => x.route || IArchives_1.FULL_ROUTE))} at writeTime ${writeTime} (the client's shard config is stale)`);
406
412
  throw new Error(`${IArchives_1.STORAGE_WRONG_ROUTE} This server does not handle route ${route} (key ${JSON.stringify(filePath)}) for bucket ${account}/${bucketName} (our routes at this time: ${JSON.stringify(timeValid.map(x => x.route || IArchives_1.FULL_ROUTE))}). Re-resolve the source for this key and retry.`);
407
413
  }
408
414
  }
@@ -629,5 +635,5 @@ function getLocalArchives(account, bucketName) {
629
635
  return archives;
630
636
  }
631
637
  exports.getLocalArchives = getLocalArchives;
632
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsb0RBQXlEO0FBQ3pELDhEQUEyRDtBQUMzRCxnREFBNkM7QUFDN0Msa0RBQStDO0FBQy9DLDJDQUFzRDtBQUN0RCw0Q0FJc0I7QUFDdEIsaURBQTRKO0FBQzVKLHFEQUF1RjtBQUN2RixxREFBcUQ7QUFHckQsdUNBQW1DO0FBd0JuQyxJQUFJLE1BQXVDLENBQUM7QUFDNUMsU0FBZ0Isc0JBQXNCLENBQUMsS0FBMEI7SUFDN0QsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNuQixDQUFDO0FBRkQsd0RBRUM7QUFDRCxTQUFnQixzQkFBc0I7SUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBTEQsd0RBS0M7QUFDRCxpR0FBaUc7QUFDakcseURBQXlEO0FBQ3pELFNBQWdCLDhCQUE4QjtJQUMxQyxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRkQsd0VBRUM7QUFFRCxrR0FBa0c7QUFDbEcsbUdBQW1HO0FBQ25HLDZDQUE2QztBQUM3QyxJQUFJLG9CQUF3QyxDQUFDO0FBQzdDLFNBQWdCLHVCQUF1QixDQUFDLE1BQTBCO0lBQzlELG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUNsQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQix1QkFBdUI7SUFDbkMsT0FBTyxvQkFBb0IsQ0FBQztBQUNoQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQixtQkFBbUI7SUFDL0IsSUFBSSxvQkFBb0I7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUZELGtEQUVDO0FBRUQsa0dBQWtHO0FBQ2xHLGtHQUFrRztBQUNsRyxnR0FBZ0c7QUFDaEcsdUJBQXVCO0FBQ3ZCLGlHQUFpRztBQUNqRyxnRkFBZ0Y7QUFDaEYsU0FBUyxnQkFBZ0I7SUFDckIsSUFBSSxNQUFNLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztJQUM5QyxJQUFJLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDakMsSUFBSSxNQUFNLEdBQUcsSUFBQSxnQkFBTSxFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsa0dBQWtHLENBQUMsQ0FBQztJQUN4SCxDQUFDO0lBQ0QsT0FBTyxjQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBc0MsQ0FBQztBQUNyRSxTQUFTLGdCQUFnQixDQUFJLElBQVk7SUFDckMsSUFBSSxPQUFPLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDWCxPQUFPLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNsQixJQUFJLElBQUksR0FBRyxNQUFNLElBQUEscUNBQXFCLEVBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1lBQzNELElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckQsSUFBSSxlQUFlLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sSUFBSSx5QkFBVyxDQUFVLElBQUksdUNBQWtCLENBQUMsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ25ILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDTCxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsT0FBTyxPQUErQixDQUFDO0FBQzNDLENBQUM7QUFDRCxTQUFnQixRQUFRO0lBQ3BCLE9BQU8sZ0JBQWdCLENBQWMsT0FBTyxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUZELDRCQUVDO0FBQ0QsU0FBZ0IsV0FBVztJQUN2QixPQUFPLGdCQUFnQixDQUFrQixVQUFVLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRkQsa0NBRUM7QUFFRCx1TEFBdUw7QUFDaEwsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BQWlEO0lBQ3RGLElBQUksS0FBSyxHQUFHLE1BQU0sUUFBUSxFQUFFLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUM7SUFDbEMsSUFBSSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLEtBQUssSUFBSSxHQUFHLElBQUksTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFBRSxTQUFTO1FBQ3RDLElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUIsU0FBUztRQUNiLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixTQUFTLGVBQWUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDcEYsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDRCxLQUFLLElBQUksU0FBUyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLFNBQVMsZUFBZSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRixNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvRyxDQUFDO0FBQ0wsQ0FBQztBQWxCRCxnREFrQkM7QUFzQkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTZDLENBQUM7QUFFckUsZ0dBQWdHO0FBQ2hHLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsd0ZBQXdGO0FBQ3hGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBRXJDLFNBQVMsZUFBZSxDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUN4RCxPQUFPLGNBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQsa0dBQWtHO0FBQ2xHLG9GQUFvRjtBQUNwRixNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFDM0MsU0FBZ0Isa0JBQWtCLENBQUMsSUFBWTtJQUMzQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUZELGdEQUVDO0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBcUIsRUFBRSxPQUFlLEVBQUUsVUFBa0I7SUFDL0UsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hELElBQUksT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM5QyxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLFNBQVM7UUFDckUsSUFBSSxNQUFNLEdBQUcsSUFBQSw2QkFBYyxFQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDN0osT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUFFRCw4RkFBOEY7QUFDOUYsNEZBQTRGO0FBQzVGLCtGQUErRjtBQUMvRix3RkFBd0Y7QUFDeEYsaUJBQWlCO0FBQ2pCLFNBQVMsYUFBYSxDQUFDLE9BQXVCLEVBQUUsSUFBWSxFQUFFLEtBQWM7SUFDeEUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEIsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUEsNEJBQWEsRUFBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUN2QixDQUFDO0lBQ0wsQ0FBQztJQUNELElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLElBQUksVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDO0lBQ2xDLElBQUksSUFBOEIsQ0FBQztJQUNuQyxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUM7SUFDNUIsS0FBSyxJQUFJLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN4QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RyxJQUFJLFFBQVEsR0FBRyxZQUFZLEVBQUUsQ0FBQztZQUMxQixZQUFZLEdBQUcsUUFBUSxDQUFDO1lBQ3hCLElBQUksR0FBRyxLQUFLLENBQUM7UUFDakIsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQsZ0dBQWdHO0FBQ2hHLGdHQUFnRztBQUNoRyxrR0FBa0c7QUFDbEcsU0FBUyw2QkFBNkIsQ0FBQyxNQUFvQjs7SUFDdkQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNyRixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU07UUFBRSxPQUFPO0lBQy9CLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUMzQyxJQUFJLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ25ELElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDeEIsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2IsdUZBQXVGO1lBQ3ZGLElBQUksT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxJQUFJLE9BQU8sS0FBSyxNQUFNO2dCQUFFLE9BQU87WUFDL0IsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUM7Z0JBQzVCLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QyxPQUFPO1lBQ1gsQ0FBQztZQUNELE1BQU0scUJBQXFCLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsZ0NBQWdDLEVBQUUsQ0FBQyxDQUFDO1FBQzlILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsR0FBRyxHQUFHLHVCQUF1QixFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztJQUNwRixNQUFBLE1BQUMsS0FBZ0MsRUFBQyxLQUFLLGtEQUFJLENBQUM7QUFDaEQsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQWUsRUFBRSxVQUFrQixFQUFFLE9BQXFCO0lBQzNFLElBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEQsK0ZBQStGO0lBQy9GLDZGQUE2RjtJQUM3Riw2RkFBNkY7SUFDN0YscUJBQXFCO0lBQ3JCLElBQUksU0FBUyxHQUFHLElBQUEsaUNBQWdCLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsSUFBSSxXQUFXLEdBQUcsZUFBZSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEUsSUFBSSxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFpQixDQUFDLENBQUM7SUFDN0UsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNsRCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1AsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsT0FBTyxFQUFFLENBQUM7UUFDaEIsS0FBSyxHQUFHLElBQUksMkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxDQUFDO1NBQU0sQ0FBQztRQUNKLDBGQUEwRjtRQUMxRiwyRkFBMkY7UUFDM0YsMkZBQTJGO1FBQzNGLHlGQUF5RjtRQUN6RixtRkFBbUY7UUFDbkYsMEZBQTBGO1FBQzFGLHlGQUF5RjtRQUN6Riw2RUFBNkU7UUFDN0UsSUFBSSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEMsb0ZBQW9GO1FBQ3BGLElBQUksT0FBTyxHQUFxQixDQUFDO2dCQUM3QixNQUFNLEVBQUUsSUFBSSwyQkFBWSxDQUFDLE1BQU0sQ0FBQztnQkFDaEMsV0FBVyxFQUFFLENBQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFdBQVcsS0FBSSw2QkFBaUI7YUFDdEQsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLHVEQUF1RCxPQUFPLElBQUksVUFBVSwyREFBMkQsQ0FBQyxDQUFDO1FBQ3pKLENBQUM7YUFBTSxDQUFDO1lBQ0osS0FBSyxJQUFJLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM1RCxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFBRSxTQUFTO2dCQUM5RCxnRkFBZ0Y7Z0JBQ2hGLDJFQUEyRTtnQkFDM0UsSUFBSSxXQUFXLEdBQUcsSUFBQSxnQ0FBaUIsRUFBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLFdBQVc7b0JBQUUsU0FBUztnQkFDM0IsK0VBQStFO2dCQUMvRSw2REFBNkQ7Z0JBQzdELE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBQSxrQ0FBaUIsRUFBQyxNQUFNLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxLQUFJLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxVQUFVLENBQUEsRUFBRSxDQUFDLENBQUM7WUFDaEssQ0FBQztRQUNMLENBQUM7UUFDRCxLQUFLLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUU7WUFDbkMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNsQixtRkFBbUY7Z0JBQ25GLCtFQUErRTtnQkFDL0UsSUFBSSxHQUFHLEtBQUssMkJBQVk7b0JBQUUsT0FBTztnQkFDakMsS0FBSyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUNELGVBQWUsRUFBRSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsZUFBZTtZQUN0QyxnQkFBZ0IsRUFBaEIsaUNBQWdCO1NBQ25CLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCxJQUFJLE1BQU0sR0FBaUIsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzVILDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxLQUFLLFVBQVUsVUFBVSxDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUN6RCxJQUFJLElBQUksR0FBRyxNQUFNLElBQUksMkJBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsQ0FBQztJQUMxRixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVCLE9BQU8sV0FBVyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBQSwrQkFBZ0IsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxTQUFnQixlQUFlLENBQUMsT0FBZSxFQUFFLFVBQWtCO0lBQy9ELElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ3JDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekIsdUZBQXVGO1FBQ3ZGLHVEQUF1RDtRQUN2RCxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN6QyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7UUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFO1lBQ0osSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUM5QixPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBbkJELDBDQW1CQztBQUVELCtGQUErRjtBQUMvRiwwQkFBMEI7QUFDMUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7QUFDeEQsU0FBUyxxQkFBcUIsQ0FBQyxPQUFlLEVBQUUsVUFBa0IsRUFBRSxNQUE2QztJQUM3RyxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNyQyxJQUFJLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3BELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzVELEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEdBQUcsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEYsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUIsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVELEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxPQUFlLEVBQUUsVUFBa0IsRUFBRSxNQUE2QztJQUNqSCxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNyQyxJQUFJLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPO0lBQ3BCLDhGQUE4RjtJQUM5Rix5QkFBeUI7SUFDekIsSUFBSSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQywyQkFBWSxDQUFDLENBQUM7SUFDaEQsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPO0lBQ2xCLElBQUksT0FBTyxHQUFHLElBQUEsK0JBQWdCLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssQ0FBQSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssTUFBTSxDQUFDLFdBQVc7UUFBRSxPQUFPO0lBQzdFLElBQUksTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLEdBQUcsS0FBSyxNQUFNLENBQUMsTUFBTSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDekYsQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxHQUFHLHdCQUF3QixDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLEtBQUssWUFBWSxxQkFBUyxFQUFFLENBQUM7UUFDcEMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBRUQsNkZBQTZGO0FBQzdGLGlHQUFpRztBQUNqRywrRkFBK0Y7QUFDL0YsU0FBUyxjQUFjLENBQUMsTUFBb0IsRUFBRSxTQUFpQixFQUFFLEtBQWE7SUFDMUUsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9ELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFVBQVUsRUFBRSxDQUFDO0FBQzlELENBQUM7QUFFTSxLQUFLLFVBQVUsYUFBYSxDQUFDLE1BQW9CLEVBQUUsUUFBZ0IsRUFBRSxTQUFpQjtJQUN6RixJQUFJLElBQUksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBQSx1QkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDNUUsSUFBSSxDQUFDLENBQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFNBQVMsQ0FBQTtRQUFFLE9BQU87SUFDN0IsSUFBSSxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLFVBQVUsZ0NBQWdDLFNBQVMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQzFMLENBQUM7QUFDTCxDQUFDO0FBTkQsc0NBTUM7QUFFRCxtR0FBbUc7QUFDbkcsb0ZBQW9GO0FBQ3BGLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM1QyxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUMzQixTQUFTLHVCQUF1QixDQUFDLE9BQWU7SUFDNUMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsa0JBQWtCLEdBQUcseUJBQXlCO1FBQUUsT0FBTztJQUN4RSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQsK0ZBQStGO0FBQy9GLHFFQUFxRTtBQUNyRSxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztBQUV2RCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsT0FBZSxFQUFFLFVBQWtCLEVBQUUsSUFBWSxFQUFFLE1BQWtDO0lBQ25ILElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ3JDLDRFQUE0RTtJQUM1RSxJQUFJLFFBQVEsR0FBRyxJQUFBLCtCQUFnQixFQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLElBQUksTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN4RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksMkJBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLDJCQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzdILE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDckMsT0FBTztJQUNYLENBQUM7SUFDRCw2RkFBNkY7SUFDN0YsNEZBQTRGO0lBQzVGLHFFQUFxRTtJQUNyRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFBLCtCQUFnQixFQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUEsK0JBQWdCLEVBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDcEgsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsR0FBRyxrRUFBa0UsSUFBQSwrQkFBZ0IsRUFBQyxRQUFRLENBQUMsOENBQThDLElBQUEsK0JBQWdCLEVBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtREFBbUQsTUFBTSxDQUFDLFdBQVcsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdWLENBQUM7SUFDRCwwRkFBMEY7SUFDMUYsNEZBQTRGO0lBQzVGLG9FQUFvRTtJQUNwRSxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLDJCQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLE1BQU0scUJBQXFCLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFTSxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQWUsRUFBRSxVQUFrQixFQUFFLFFBQWdCLEVBQUUsSUFBWSxFQUFFLE1BQWtDO0lBQ3pJLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsSUFBSSxRQUFRLEtBQUssMkJBQVksRUFBRSxDQUFDO1FBQzVCLElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ3JDLElBQUksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxSCwyRkFBMkY7UUFDM0YsMEJBQTBCO1FBQzFCLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsT0FBTyxNQUFNLEdBQUcsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxlQUFlLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxPQUFPLElBQUksVUFBVSxnREFBZ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQywyQkFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakosQ0FBQztJQUNELDZGQUE2RjtJQUM3RixnR0FBZ0c7SUFDaEcsSUFBSSxTQUFTLEdBQUcsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsWUFBWSxLQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNuRCxvRkFBb0Y7SUFDcEYsK0ZBQStGO0lBQy9GLHlGQUF5RjtJQUN6RixpRkFBaUY7SUFDakYsSUFBSSxLQUFLLEdBQUcsSUFBQSx1QkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLElBQUksQ0FBQyxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxZQUFZLENBQUEsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3JELElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsbUNBQXVCLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsbUNBQXVCLENBQUMsQ0FBQztRQUNuSyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLHVCQUF1QixDQUFDLDRCQUE0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLE9BQU8sSUFBSSxVQUFVLG1FQUFtRSxDQUFDLENBQUM7WUFDcEwsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLHNDQUEwQiwrQ0FBK0MsU0FBUyxlQUFlLE9BQU8sSUFBSSxVQUFVLHdCQUF3QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDdFIsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBQSw0QkFBYSxFQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RELHVCQUF1QixDQUFDLDRCQUE0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLE9BQU8sSUFBSSxVQUFVLFdBQVcsS0FBSyxtREFBbUQsQ0FBQyxDQUFDO1lBQ3BMLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRywrQkFBbUIsc0NBQXNDLEtBQUssU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsT0FBTyxJQUFJLFVBQVUsOEJBQThCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksc0JBQVUsQ0FBQyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDdFMsQ0FBQztJQUNMLENBQUM7SUFDRCxNQUFNLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDckgsQ0FBQztBQW5DRCwwQ0FtQ0M7QUFFRCxTQUFnQixlQUFlLENBQUMsTUFBb0I7O0lBQ2hELElBQUksUUFBUSxHQUFHLE1BQUEsTUFBQSxNQUFNLENBQUMsS0FBSyxFQUFDLGVBQWUsa0RBQUksQ0FBQztJQUNoRCxPQUFPO1FBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZTtRQUNwRCx1RkFBdUY7UUFDdkYsaUZBQWlGO1FBQ2pGLFlBQVksRUFBRSxJQUFBLGlDQUFnQixFQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUMsS0FBSyxFQUFFLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxLQUFLO1FBQ3RCLFlBQVksRUFBRSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsT0FBTztRQUMvQixlQUFlLEVBQUUsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLGVBQWU7UUFDMUMsT0FBTyxFQUFFLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxPQUFPO0tBQzdCLENBQUM7QUFDTixDQUFDO0FBWkQsMENBWUM7QUFFTSxLQUFLLFVBQVUsdUJBQXVCO0lBQ3pDLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDbEMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsK0JBQStCLEVBQUUsQ0FBQyxDQUFDO0lBQ3JJLENBQUM7QUFDTCxDQUFDO0FBTEQsMERBS0M7QUFFTSxLQUFLLFVBQVUsMEJBQTBCOztJQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxPQUFPLENBQUMsSUFBSSwyREFBMkQsQ0FBQyxDQUFDO0lBQ2hJLEtBQUssSUFBSSxhQUFhLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDOUMsSUFBSSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxNQUFNO1lBQUUsU0FBUztRQUN0QixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxxQkFBUyxDQUFDO1lBQUUsU0FBUztRQUM1QyxJQUFJLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsbURBQW1ELE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxNQUFDLENBQVcsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEksQ0FBQztJQUNMLENBQUM7QUFDTCxDQUFDO0FBYkQsZ0VBYUM7QUFFRCxJQUFBLGdDQUFlLEVBQUMsS0FBSyxDQUFDLEVBQUU7SUFDcEIsSUFBSSxLQUFLLEtBQUssY0FBYyxFQUFFLENBQUM7UUFDM0IsS0FBSyx1QkFBdUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDRCxJQUFJLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN2QixLQUFLLDBCQUEwQixFQUFFLENBQUM7SUFDdEMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBVUg7OztnQkFHZ0I7QUFDVCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsT0FBZTs7SUFDcEQsSUFBSSxhQUFhLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEYsSUFBSSxLQUFlLENBQUM7SUFDcEIsSUFBSSxDQUFDO1FBQ0QsS0FBSyxHQUFHLE1BQU0sWUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUFDLFdBQU0sQ0FBQztRQUNMLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUNELElBQUksT0FBTyxHQUF1QixFQUFFLENBQUM7SUFDckMsS0FBSyxJQUFJLFVBQVUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUM7Z0JBQ0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUM7Z0JBQ2pDLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1QsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM1RSxTQUFTO2dCQUNiLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFDLENBQVcsQ0FBQyxLQUFLLG1DQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRyxTQUFTO1lBQ2IsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUM7WUFDRCxJQUFJLElBQUksR0FBRyxNQUFNLElBQUksMkJBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1IsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxvQkFBb0IsMkJBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDeEYsU0FBUztZQUNiLENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUEsK0JBQWdCLEVBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEcsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFDLENBQVcsQ0FBQyxLQUFLLG1DQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDbkIsQ0FBQztBQW5DRCxnREFtQ0M7QUFFTSxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLFVBQWtCLEVBQUUsUUFBZ0I7SUFDeEYsSUFBSSxRQUFRLEtBQUssMkJBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxTQUFTLENBQUMsMkJBQVksQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO0lBQ2hKLENBQUM7SUFDRCxJQUFJLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEQsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPO0lBQ3BCLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUEsdUJBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0YsQ0FBQztBQVBELDRDQU9DO0FBRUQsK0JBQStCO0FBRS9CLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFN0MsZ0dBQWdHO0FBQ2hHLCtGQUErRjtBQUMvRixNQUFNLG1CQUFtQjtJQUNyQixZQUFvQixPQUFlLEVBQVUsVUFBa0I7UUFBM0MsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUFVLGVBQVUsR0FBVixVQUFVLENBQVE7SUFBSSxDQUFDO0lBRTVELEtBQUssQ0FBQyxTQUFTO1FBQ25CLE9BQU8sTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLFlBQVk7UUFDZixPQUFPLGVBQWUsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUNNLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxNQUFtRDtRQUNsRixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDO0lBQzlDLENBQUM7SUFDTSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQWdCLEVBQUUsTUFBbUQ7UUFDbkYsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM5QixPQUFPLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDTSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQWdCLEVBQUUsSUFBWSxFQUFFLE1BQWtDO1FBQy9FLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdFLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFDTSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQWdCO1FBQzdCLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDTSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQW9FO1FBQzFGLG1CQUFtQixFQUFFLENBQUM7UUFDdEIsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsZ0RBQWdELElBQUksQ0FBQyxTQUFTLENBQUMsMkJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNKLENBQUM7UUFDRCxNQUFNLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFJLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUM7WUFDRCxPQUFPLElBQUksRUFBRSxDQUFDO2dCQUNWLElBQUksSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsSUFBSTtvQkFBRSxNQUFNO2dCQUNqQixLQUFLLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksb0JBQW9CLEVBQUUsQ0FBQztvQkFDeEUsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO2dCQUNuRyxDQUFDO1lBQ0wsQ0FBQztZQUNELE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxDQUFDO1FBQ1osQ0FBQztJQUNMLENBQUM7SUFDTSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQWdCO1FBQ2pDLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDOUIsT0FBTyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDTSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQWMsRUFBRSxNQUF5RDtRQUMzRixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNNLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBYyxFQUFFLE1BQXlEO1FBQ3ZGLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDTSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQWdCO1FBQ2hDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztRQUNoRCxPQUFPLElBQUEsMkJBQVksRUFBQyxXQUFXLE1BQU0sSUFBSSxJQUFJLFNBQVMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9JLENBQUM7SUFDTSxLQUFLLENBQUMsU0FBUztRQUNsQixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQyw0RkFBNEY7UUFDNUYsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbkQsT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNNLEtBQUssQ0FBQyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDTSxLQUFLLENBQUMsZUFBZSxDQUFDLElBQVk7UUFDckMsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxtRUFBbUUsQ0FBQyxDQUFDO1FBQ2xJLENBQUM7UUFDRCxPQUFPLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNNLEtBQUssQ0FBQyxhQUFhO1FBQ3RCLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUMxRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSwyRUFBMkUsQ0FBQyxDQUFDO1FBQzFJLENBQUM7UUFDRCxPQUFPLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0NBQ0o7QUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztBQUNuRCxTQUFnQixnQkFBZ0IsQ0FBQyxPQUFlLEVBQUUsVUFBa0I7SUFDaEUsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLElBQUksVUFBVSxFQUFFLENBQUM7SUFDckMsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxJQUFJLFFBQVE7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM5QixJQUFJLFFBQVEsR0FBRyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1RCxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqQyxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDO0FBUEQsNENBT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQyIH0gZnJvbSBcIi4uL0ZpbGVGb2xkZXJBUElcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uU3RvcmFnZSB9IGZyb20gXCIuLi9UcmFuc2FjdGlvblN0b3JhZ2VcIjtcbmltcG9ydCB7IEpTT05TdG9yYWdlIH0gZnJvbSBcIi4uL0pTT05TdG9yYWdlXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0Rpc2sgfSBmcm9tIFwiLi4vQXJjaGl2ZXNEaXNrXCI7XG5pbXBvcnQgeyBCbG9iU3RvcmUsIElCdWNrZXRTdG9yZSB9IGZyb20gXCIuL2Jsb2JTdG9yZVwiO1xuaW1wb3J0IHtcbiAgICBSZW1vdGVDb25maWcsIEhvc3RlZENvbmZpZywgSUFyY2hpdmVzLCBBcmNoaXZlc1NvdXJjZSwgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZyxcbiAgICBBcmNoaXZlc1N5bmNTdGF0dXMsIEZVTExfVkFMSURfV0lORE9XLFxuICAgIFdSSVRFX1BBU1RfV0lORE9XX0dSQUNFLCBTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPVywgU1RPUkFHRV9XUk9OR19ST1VURSwgRlVMTF9ST1VURSxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBwYXJzZVJvdXRpbmdEYXRhLCBwYXJzZUhvc3RlZFVybCwgYnVpbGRGaWxlVXJsLCBnZXRDb25maWdWZXJzaW9uLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcm91dGVJbnRlcnNlY3Rpb24gfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IGFwcGx5RGVwbG95UmVtYXAsIGdldEZsdXNoRGVhZGxpbmUsIG9uVGFrZW92ZXJFdmVudCB9IGZyb20gXCIuL2RlcGxveVRha2VvdmVyXCI7XG5pbXBvcnQgeyBjcmVhdGVBcGlBcmNoaXZlcyB9IGZyb20gXCIuL2NyZWF0ZUFyY2hpdmVzXCI7XG5pbXBvcnQgdHlwZSB7IElTdG9yYWdlIH0gZnJvbSBcIi4uL0lTdG9yYWdlXCI7XG5pbXBvcnQgdHlwZSB7IEFjY2Vzc1JlcXVlc3QsIFRydXN0UmVjb3JkIH0gZnJvbSBcIi4vc3RvcmFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGdldEFyZyB9IGZyb20gXCIuL2NsaUFyZ3NcIjtcblxuLy8gVGhlIHN0b3JhZ2Ugc2VydmVyJ3MgZ2xvYmFsIHNlcnZlci1zaWRlIHN0YXRlLiBob3N0U3RvcmFnZVNlcnZlciBzZXRzIHRoZSBjb25maWcgb25jZSBhdFxuLy8gc3RhcnR1cDsgZXZlcnl0aGluZyBlbHNlIChzeXN0ZW0gc3RvcmFnZXMsIGJ1Y2tldHMpIGlzIGEgZ2xvYmFsIGNhY2hlIGNyZWF0ZWQgbGF6aWx5IG9uIGZpcnN0XG4vLyB1c2UsIHRocm93aW5nIGlmIHRoZSBjb25maWcgd2FzIG5ldmVyIHNldC5cbi8vXG4vLyBCdWNrZXRzIGhhdmUgbm8gc2VwYXJhdGUgcmVnaXN0cnk6IGVhY2ggYnVja2V0J3MgY29uZmlndXJhdGlvbiAoYSBSZW1vdGVDb25maWcpIGxpdmVzIGluc2lkZSB0aGVcbi8vIGJ1Y2tldCBpdHNlbGYsIGF0IFJPVVRJTkdfRklMRS4gQSBidWNrZXQgZXhpc3RzIGlmZiB0aGF0IGZpbGUgZXhpc3RzLiBXcml0aW5nIGl0IGNyZWF0ZXMgdGhlXG4vLyBidWNrZXQgKGJ1aWxkaW5nIGl0cyBzdG9yZSwgd2hpY2ggbWF5IGltbWVkaWF0ZWx5IHN0YXJ0IHN5bmNocm9uaXphdGlvbiBzY2Fucyk7IG92ZXJ3cml0aW5nIGl0IOKAlFxuLy8gZGlyZWN0bHkgb3IgdmlhIGEgZmlsZSBwdWxsZWQgaW4gZnJvbSBhIHN5bmNocm9uaXphdGlvbiBzb3VyY2Ug4oCUIHJlYnVpbGRzIHRoZSBzdG9yZSB3aXRoIHRoZSBuZXdcbi8vIHNvdXJjZXMgKGNhbmNlbGxpbmcgdGhlIG9sZCBzdG9yZSdzIHNjYW5zKS5cblxuZXhwb3J0IHR5cGUgU3RvcmFnZVNlcnZlckNvbmZpZyA9IHtcbiAgICBkb21haW46IHN0cmluZztcbiAgICBwb3J0OiBudW1iZXI7XG4gICAgcm9vdERvbWFpbjogc3RyaW5nO1xuICAgIC8vIHVzZXJAZXh0ZXJuYWxJcCBvZiB0aGUgc3RvcmFnZSBtYWNoaW5lLCBmb3IgZ2VuZXJhdGVkIHNzaCBjb21tYW5kc1xuICAgIHNzaFRhcmdldDogc3RyaW5nO1xuICAgIC8vIEFic29sdXRlIGNvbW1hbmQgdGhhdCBydW5zIHRoZSBncmFudEFjY2VzcyBDTEkgb24gdGhlIHN0b3JhZ2UgbWFjaGluZSAoYWRtaW4gYXJncyBhcHBlbmRlZClcbiAgICBzZXJ2ZXJDb21tYW5kOiBzdHJpbmc7XG4gICAgLy8gVGhlIHNlcnZlcidzIHJvb3Qgc3RvcmFnZSBmb2xkZXIgKGFic29sdXRlKVxuICAgIGZvbGRlcjogc3RyaW5nO1xufTtcblxubGV0IGNvbmZpZzogU3RvcmFnZVNlcnZlckNvbmZpZyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRTdG9yYWdlU2VydmVyQ29uZmlnKHZhbHVlOiBTdG9yYWdlU2VydmVyQ29uZmlnKTogdm9pZCB7XG4gICAgY29uZmlnID0gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpOiBTdG9yYWdlU2VydmVyQ29uZmlnIHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0b3JhZ2Ugc2VydmVyIGlzIG5vdCBpbml0aWFsaXplZCAodGhpcyBBUEkgb25seSB3b3JrcyBvbiB0aGUgc3RvcmFnZSBzZXJ2ZXIpYCk7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59XG4vLyBGb3Igc2VsZi1kZXRlY3Rpb246IGNvZGUgdGhhdCBDQU4gcnVuIG91dHNpZGUgdGhlIHN0b3JhZ2Ugc2VydmVyIChjcmVhdGVBcmNoaXZlcykgdXNlcyB0aGlzIHRvXG4vLyBjaGVjayBcImlzIHRoaXMgVVJMIG91ciBvd24gcHJvY2Vzcz9cIiB3aXRob3V0IHRocm93aW5nLlxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCgpOiBTdG9yYWdlU2VydmVyQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuXG4vLyBXaGVuIHNldCwgYWxsIHdyaXRlLXBhdGggb3BlcmF0aW9ucyAoY3JlYXRpbmcgZmlsZXMsIGFwcGVuZGluZyBsYXJnZSB1cGxvYWRzLCBjcmVhdGluZyBidWNrZXRzKVxuLy8gdGhyb3cgdGhpcyBtZXNzYWdlLiBSZWFkcywgZmluZEluZm8sIGFuZCBkZWxldGVzIHN0aWxsIHdvcmsg4oCUIHNvIGNsaWVudHMgY2FuIGZyZWUgc3BhY2UuIE1hbmFnZWRcbi8vIGJ5IGhvc3RTdG9yYWdlU2VydmVyJ3MgZGlzay1zcGFjZSBtb25pdG9yLlxubGV0IHdyaXRlc1JlamVjdGVkUmVhc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gc2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24ocmVhc29uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB3cml0ZXNSZWplY3RlZFJlYXNvbiA9IHJlYXNvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcml0ZXNSZWplY3RlZFJlYXNvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB3cml0ZXNSZWplY3RlZFJlYXNvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRXcml0ZXNBbGxvd2VkKCk6IHZvaWQge1xuICAgIGlmICh3cml0ZXNSZWplY3RlZFJlYXNvbikgdGhyb3cgbmV3IEVycm9yKHdyaXRlc1JlamVjdGVkUmVhc29uKTtcbn1cblxuLy8gVGhlIHN5c3RlbSBzdG9yYWdlcyAodHJ1c3QsIHJlcXVlc3RzKSBhcmUgdGhlIHNhbWUga2luZCBvZiB0aGluZyDigJQgYSBKU09OIGtleS92YWx1ZSBzdG9yZSB1bmRlclxuLy8gPGZvbGRlcj4vc3lzdGVtMi88bmFtZT4g4oCUIHNvIHRoZXkgc2hhcmUgb25lIGNhY2hlLCBrZXllZCBieSBuYW1lLiAoXCJzeXN0ZW0yXCIgYmVjYXVzZSB0aGUgbGF5b3V0XG4vLyBjaGFuZ2VkIHdoZW4gYnVja2V0IGNvbmZpZ3MgbW92ZWQgaW50byB0aGUgYnVja2V0cyB0aGVtc2VsdmVzOyBvbGQgXCJzeXN0ZW1cIi9cImJ1Y2tldHNcIiBmb2xkZXJzXG4vLyBhcmUgc2ltcGx5IGlnbm9yZWQuKVxuLy8gc2V0VHJ1c3RlZE1hY2hpbmVzIGlzIGNhbGxlZCBieSBjb25zdW1lcnMgQkVGT1JFIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIsIHNvIHdoZW4gdGhlIGNvbmZpZyBpc24ndFxuLy8gc2V0IHlldCB3ZSBmYWxsIGJhY2sgdG8gdGhlIHNhbWUgLS1mb2xkZXIgYXJnIHRoZSBDTEkgc3RhcnRzIHRoZSBzZXJ2ZXIgd2l0aC5cbmZ1bmN0aW9uIGdldFN0b3JhZ2VGb2xkZXIoKTogc3RyaW5nIHtcbiAgICBsZXQgY29uZmlnID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCk7XG4gICAgaWYgKGNvbmZpZykgcmV0dXJuIGNvbmZpZy5mb2xkZXI7XG4gICAgbGV0IGZvbGRlciA9IGdldEFyZyhcImZvbGRlclwiKTtcbiAgICBpZiAoIWZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0b3JhZ2Ugc2VydmVyIGlzIG5vdCBpbml0aWFsaXplZCBhbmQgdGhlcmUgaXMgbm8gLS1mb2xkZXIgYXJnLCBzbyB0aGUgc3RvcmFnZSBmb2xkZXIgaXMgdW5rbm93bmApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKGZvbGRlcik7XG59XG5cbmNvbnN0IHN5c3RlbVN0b3JhZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8SVN0b3JhZ2U8dW5rbm93bj4+PigpO1xuZnVuY3Rpb24gZ2V0U3lzdGVtU3RvcmFnZTxUPihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPElTdG9yYWdlPFQ+PiB7XG4gICAgbGV0IHN0b3JhZ2UgPSBzeXN0ZW1TdG9yYWdlcy5nZXQobmFtZSk7XG4gICAgaWYgKCFzdG9yYWdlKSB7XG4gICAgICAgIHN0b3JhZ2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJvb3QgPSBhd2FpdCBnZXRGaWxlU3RvcmFnZU5lc3RlZDIoZ2V0U3RvcmFnZUZvbGRlcigpKTtcbiAgICAgICAgICAgIGxldCBzeXN0ZW0gPSBhd2FpdCByb290LmZvbGRlci5nZXRTdG9yYWdlKFwic3lzdGVtMlwiKTtcbiAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbk5hbWUgPSBcInN0b3JhZ2VcIiArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEpTT05TdG9yYWdlPHVua25vd24+KG5ldyBUcmFuc2FjdGlvblN0b3JhZ2UoYXdhaXQgc3lzdGVtLmZvbGRlci5nZXRTdG9yYWdlKG5hbWUpLCB0cmFuc2FjdGlvbk5hbWUpKTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgc3lzdGVtU3RvcmFnZXMuc2V0KG5hbWUsIHN0b3JhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcmFnZSBhcyBQcm9taXNlPElTdG9yYWdlPFQ+Pjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcnVzdCgpOiBQcm9taXNlPElTdG9yYWdlPFRydXN0UmVjb3JkPj4ge1xuICAgIHJldHVybiBnZXRTeXN0ZW1TdG9yYWdlPFRydXN0UmVjb3JkPihcInRydXN0XCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcXVlc3RzKCk6IFByb21pc2U8SVN0b3JhZ2U8QWNjZXNzUmVxdWVzdFtdPj4ge1xuICAgIHJldHVybiBnZXRTeXN0ZW1TdG9yYWdlPEFjY2Vzc1JlcXVlc3RbXT4oXCJyZXF1ZXN0c1wiKTtcbn1cblxuLyoqIE1ha2VzIG1hY2hpbmVJZHMgdGhlIGNvbXBsZXRlIHRydXN0IGxpc3QgZm9yIHRoZSBhY2NvdW50OiBtYWNoaW5lcyBub3QgaW4gdGhlIGxpc3QgbG9zZSBhY2Nlc3MsIG1hY2hpbmVzIGFscmVhZHkgdHJ1c3RlZCBrZWVwIHRoZWlyIGV4aXN0aW5nIHJlY29yZCwgYW5kIG1pc3Npbmcgb25lcyBhcmUgYWRkZWQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0VHJ1c3RlZE1hY2hpbmVzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IG1hY2hpbmVJZHM6IHN0cmluZ1tdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgdHJ1c3QgPSBhd2FpdCBnZXRUcnVzdCgpO1xuICAgIGxldCBwcmVmaXggPSBgJHtjb25maWcuYWNjb3VudH18YDtcbiAgICBsZXQgZGVzaXJlZCA9IG5ldyBTZXQoY29uZmlnLm1hY2hpbmVJZHMpO1xuICAgIGZvciAobGV0IGtleSBvZiBhd2FpdCB0cnVzdC5nZXRLZXlzKCkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IGtleS5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgaWYgKGRlc2lyZWQuaGFzKG1hY2hpbmVJZCkpIHtcbiAgICAgICAgICAgIGRlc2lyZWQuZGVsZXRlKG1hY2hpbmVJZCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZpbmcgdHJ1c3QgZm9yIG1hY2hpbmUgJHttYWNoaW5lSWR9IG9uIGFjY291bnQgJHtjb25maWcuYWNjb3VudH1gKTtcbiAgICAgICAgYXdhaXQgdHJ1c3QucmVtb3ZlKGtleSk7XG4gICAgfVxuICAgIGZvciAobGV0IG1hY2hpbmVJZCBvZiBkZXNpcmVkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBZGRpbmcgdHJ1c3QgZm9yIG1hY2hpbmUgJHttYWNoaW5lSWR9IG9uIGFjY291bnQgJHtjb25maWcuYWNjb3VudH1gKTtcbiAgICAgICAgYXdhaXQgdHJ1c3Quc2V0KGAke3ByZWZpeH0ke21hY2hpbmVJZH1gLCB7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50LCBtYWNoaW5lSWQsIGlwOiBcIlwiLCB0aW1lOiBEYXRlLm5vdygpIH0pO1xuICAgIH1cbn1cblxuLy8g4pSA4pSAIGJ1Y2tldHMg4pSA4pSAXG5cbmV4cG9ydCB0eXBlIExvYWRlZEJ1Y2tldCA9IHtcbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgIC8vIFRoZSBidWNrZXQncyBwYXJzZWQgcm91dGluZyBjb25maWcgKHRoZSBjb250ZW50cyBvZiBST1VUSU5HX0ZJTEUpXG4gICAgcm91dGluZzogUmVtb3RlQ29uZmlnO1xuICAgIC8vIEpTT04gb2Ygcm91dGluZywgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICByb3V0aW5nSlNPTjogc3RyaW5nO1xuICAgIC8vIEFMTCBvZiBvdXIgb3duIGVudHJpZXMgaW4gcm91dGluZy5zb3VyY2VzICh0aGlzIGJ1Y2tldCBvbiB0aGlzIHNlcnZlcikuIE1vcmUgdGhhbiBvbmUgd2hlblxuICAgIC8vIHRoZSBidWNrZXQncyBvcHRpb25zIGNoYW5nZSBvdmVyIHRpbWUgLSBvbmUgZW50cnkgcGVyIHZhbGlkIHdpbmRvdyAoZS5nLiBpbW11dGFibGUgZHJvcHBlZCxcbiAgICAvLyBvciBmYXN0IGVuYWJsZWQsIHN0YXJ0aW5nIGF0IGEgc2NoZWR1bGVkIGluc3RhbnQpLlxuICAgIHNlbGZFbnRyaWVzOiBIb3N0ZWRDb25maWdbXTtcbiAgICAvLyBUaGUgZW50cnkgdmFsaWQgd2hlbiB0aGUgc3RvcmUgd2FzIGJ1aWx0IC0gdGhlIHN0cnVjdHVyYWwgb3B0aW9ucyAocmF3RGlzaywgd2hpY2ggZW50cmllc1xuICAgIC8vIGFyZSBkb3duc3RyZWFtKS4gUGVyLXdyaXRlIG9wdGlvbnMgKGZhc3QvaW1tdXRhYmxlKSBhcmUgaW5zdGVhZCBldmFsdWF0ZWQgYXQgZWFjaCB3cml0ZSdzXG4gICAgLy8gdGltZSwgc2VlIGdldFdyaXRlQ29uZmlnL2Fzc2VydE11dGFibGUuIHVuZGVmaW5lZCB3aGVuIHRoZSBjb25maWcgZG9lc24ndCBtZW50aW9uIHVzLlxuICAgIHNlbGY6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBzdG9yZTogSUJ1Y2tldFN0b3JlO1xufTtcblxuY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZD4+KCk7XG5cbi8vIHNldFRpbWVvdXQgY2Fubm90IHJlcHJlc2VudCBsb25nZXIgZGVsYXlzOyBtb3JlIGRpc3RhbnQgd2luZG93IGJvdW5kYXJpZXMgcmUtY2hlY2sgYWZ0ZXIgdGhpc1xuY29uc3QgTUFYX1JFQlVJTERfVElNRVJfREVMQVkgPSAyICoqIDMxIC0gMTtcbi8vIFJlYnVpbGQgc2xpZ2h0bHkgYWZ0ZXIgdGhlIGJvdW5kYXJ5LCBzbyB0aGUgbmV3bHktdmFsaWQgZW50cnkgaXMgdW5hbWJpZ3VvdXNseSBhY3RpdmVcbmNvbnN0IFJFQlVJTERfQk9VTkRBUllfQlVGRkVSID0gMTAwMDtcblxuZnVuY3Rpb24gZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKS5mb2xkZXIsIFwiYnVja2V0czJcIiwgYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbi8vIFBvcnRzIHdlIGFyZSBsaXN0ZW5pbmcgb24gYmV5b25kIHRoZSBtYWluIGNvbmZpZyBwb3J0IC0gYSBkZXBsb3ktdGFrZW92ZXIgc3VjY2Vzc29yIHNlcnZlcyBvbiBhXG4vLyB0ZW1wb3JhcnkgYWx0ZXJuYXRlIHBvcnQsIGFuZCBtdXN0IHJlY29nbml6ZSBhbHRlcm5hdGUtcG9ydCBzb3VyY2UgVVJMcyBhcyBpdHNlbGZcbmNvbnN0IGV4dHJhTGlzdGVuUG9ydHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbmV4cG9ydCBmdW5jdGlvbiBhZGRFeHRyYUxpc3RlblBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gICAgZXh0cmFMaXN0ZW5Qb3J0cy5hZGQocG9ydCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRTZWxmSW5kZXhlcyhyb3V0aW5nOiBSZW1vdGVDb25maWcsIGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIGxldCBpbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGluZy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSByb3V0aW5nLnNvdXJjZXNbaV07XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IHNvdXJjZS50eXBlICE9PSBcInJlbW90ZVwiKSBjb250aW51ZTtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHNvdXJjZS51cmwpO1xuICAgICAgICBpZiAocGFyc2VkLmFkZHJlc3MgPT09IGRvbWFpbiAmJiAocGFyc2VkLnBvcnQgPT09IHBvcnQgfHwgZXh0cmFMaXN0ZW5Qb3J0cy5oYXMocGFyc2VkLnBvcnQpKSAmJiBwYXJzZWQuYWNjb3VudCA9PT0gYWNjb3VudCAmJiBwYXJzZWQuYnVja2V0TmFtZSA9PT0gYnVja2V0TmFtZSkge1xuICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleGVzO1xufVxuXG4vLyBUaGUgZW50cnkgd2hvc2UgdmFsaWQgd2luZG93IGNvbnRhaW5zIHRoZSB0aW1lIChhbW9uZyB0aGUgZW50cmllcyBjb3ZlcmluZyB0aGUga2V5J3Mgcm91dGUsXG4vLyB3aGVuIG9uZSBpcyBnaXZlbiAtIGEgc2VydmVyIGNhbiBob2xkIGRpZmZlcmVudCBzaGFyZHMgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucykuIEhhbGYtb3BlblxuLy8gKFtzdGFydCwgZW5kKSksIHNvIGNsZWFuIGJyZWFrcyByZXNvbHZlIHVuYW1iaWd1b3VzbHkuIEZhbGxzIGJhY2sgdG8gdGhlIG5lYXJlc3Qgd2luZG93IHdoZW5cbi8vIG5vbmUgY29udGFpbnMgdGhlIHRpbWUgLSBnYXBzIHNob3VsZG4ndCBleGlzdCwgYnV0IGEgd3JpdGUgbXVzdCBzdGlsbCByZXNvbHZlIHRvIFNPTUVcbi8vIGNvbmZpZ3VyYXRpb24uXG5mdW5jdGlvbiBzZWxlY3RFbnRyeUF0KGVudHJpZXM6IEhvc3RlZENvbmZpZ1tdLCB0aW1lOiBudW1iZXIsIHJvdXRlPzogbnVtYmVyKTogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgY292ZXJpbmcgPSBlbnRyaWVzLmZpbHRlcih4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgaWYgKGNvdmVyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgZW50cmllcyA9IGNvdmVyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjb250YWluaW5nID0gZW50cmllcy5maW5kKHggPT4geC52YWxpZFdpbmRvd1swXSA8PSB0aW1lICYmIHRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICBpZiAoY29udGFpbmluZykgcmV0dXJuIGNvbnRhaW5pbmc7XG4gICAgbGV0IGJlc3Q6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBsZXQgZGlzdGFuY2UgPSBNYXRoLm1pbihNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMF0pLCBNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMV0pKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XG4gICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgIGJlc3QgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdDtcbn1cblxuLy8gQnVja2V0IG9wdGlvbnMgY2FuIGNoYW5nZSBvdmVyIHRpbWUgKG11bHRpcGxlIHNlbGYgZW50cmllcyB3aXRoIGRpZmZlcmVudCB2YWxpZCB3aW5kb3dzKSwgYW5kXG4vLyB0aGUgc3RydWN0dXJhbCBvbmVzIChyYXdEaXNrLCB0aGUgZG93bnN0cmVhbSBsaXN0KSBhcmUgYmFrZWQgaW50byB0aGUgc3RvcmUgLSBzbyB0aGUgc3RvcmUgaXNcbi8vIHJlYnVpbHQgc2hvcnRseSBhZnRlciBlYWNoIG9mIG91ciB3aW5kb3cgYm91bmRhcmllcyBwYXNzZXMsIG1ha2luZyB0aGUgbmV3bHktdmFsaWQgZW50cnkgYXBwbHkuXG5mdW5jdGlvbiBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZChsb2FkZWQ6IExvYWRlZEJ1Y2tldCk6IHZvaWQge1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBib3VuZGFyaWVzID0gbG9hZGVkLnNlbGZFbnRyaWVzLmZsYXRNYXAoeCA9PiB4LnZhbGlkV2luZG93KS5maWx0ZXIodCA9PiB0ID4gbm93KTtcbiAgICBpZiAoIWJvdW5kYXJpZXMubGVuZ3RoKSByZXR1cm47XG4gICAgbGV0IG5leHRCb3VuZGFyeSA9IE1hdGgubWluKC4uLmJvdW5kYXJpZXMpO1xuICAgIGxldCBrZXkgPSBgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX1gO1xuICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBBIHJvdXRpbmcgY2hhbmdlIG1heSBoYXZlIGFscmVhZHkgcmVwbGFjZWQgdGhpcyBzdG9yZTsgb25seSBJVCBnZXRzIGEgYm91bmRhcnkgdGltZXJcbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gYXdhaXQgYnVja2V0cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBsb2FkZWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIDwgbmV4dEJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQobG9hZGVkLmFjY291bnQsIGxvYWRlZC5idWNrZXROYW1lLCB7IGZvcmNlOiB0cnVlLCByZWFzb246IFwiYSB2YWxpZCB3aW5kb3cgYm91bmRhcnkgcGFzc2VkXCIgfSk7XG4gICAgICAgIH0pKCk7XG4gICAgfSwgTWF0aC5taW4obmV4dEJvdW5kYXJ5IC0gbm93ICsgUkVCVUlMRF9CT1VOREFSWV9CVUZGRVIsIE1BWF9SRUJVSUxEX1RJTUVSX0RFTEFZKSk7XG4gICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRCdWNrZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHJvdXRpbmc6IFJlbW90ZUNvbmZpZyk6IExvYWRlZEJ1Y2tldCB7XG4gICAgbGV0IGZvbGRlciA9IGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAvLyBUaGUgZGVwbG95LXRha2VvdmVyIHJlbWFwIGlzIGFuIElOVEVSUFJFVEFUSU9OIG92ZXJsYXk6IGV2ZXJ5dGhpbmcgYmVoYXZpb3JhbCAoc2VsZiBlbnRyaWVzLFxuICAgIC8vIHdpbmRvd3MsIGRvd25zdHJlYW0gc291cmNlcykgdXNlcyB0aGUgcmVtYXBwZWQgdmlldywgd2hpbGUgbG9hZGVkLnJvdXRpbmcvcm91dGluZ0pTT04gc3RheVxuICAgIC8vIHRoZSBTVE9SRUQgY29uZmlnIC0gc28gdmVyc2lvbiBndWFyZHMsIGNoYW5nZSBkZXRlY3Rpb24sIGFuZCBzeW5jaHJvbml6YXRpb24gbmV2ZXIgc2VlIChvclxuICAgIC8vIHBlcnNpc3QpIHRoZSByZW1hcFxuICAgIGxldCBlZmZlY3RpdmUgPSBhcHBseURlcGxveVJlbWFwKHJvdXRpbmcpO1xuICAgIGxldCBzZWxmSW5kZXhlcyA9IGZpbmRTZWxmSW5kZXhlcyhlZmZlY3RpdmUsIGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxldCBzZWxmRW50cmllcyA9IHNlbGZJbmRleGVzLm1hcChpID0+IGVmZmVjdGl2ZS5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZyk7XG4gICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KHNlbGZFbnRyaWVzLCBEYXRlLm5vdygpKTtcbiAgICBsZXQgc2VsZkluZGV4ID0gLTE7XG4gICAgaWYgKHNlbGYpIHtcbiAgICAgICAgc2VsZkluZGV4ID0gZWZmZWN0aXZlLnNvdXJjZXMuaW5kZXhPZihzZWxmKTtcbiAgICB9XG4gICAgbGV0IHN0b3JlOiBJQnVja2V0U3RvcmU7XG4gICAgaWYgKHNlbGY/LnJhd0Rpc2spIHtcbiAgICAgICAgc3RvcmUgPSBuZXcgQXJjaGl2ZXNEaXNrKGZvbGRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3VyIG93biBkaXNrIGlzIHRoZSBiYXNlIHNvdXJjZTsgb25seSB0aGUgcm91dGluZyBlbnRyaWVzIERPV05TVFJFQU0gZnJvbSB1cyAoYWZ0ZXIgb3VyXG4gICAgICAgIC8vIGN1cnJlbnRseS12YWxpZCBlbnRyeSkgYmVjb21lIHN5bmNocm9uaXphdGlvbiBzb3VyY2VzLiBVcHN0cmVhbSBzb3VyY2VzIHN5bmMgZnJvbSB1cywgc29cbiAgICAgICAgLy8gd3JpdGluZyB0byBvciBzY2FubmluZyB0aGVtIHdvdWxkIGp1c3QgZWNobyBvdXIgb3duIGRhdGEgYmFjayAoYW5kIG1ha2Ugb3VyIGF2YWlsYWJpbGl0eVxuICAgICAgICAvLyBkZXBlbmQgb24gdGhlaXJzKS4gQSBzZXJ2ZXIgTk9UIGluIHRoZSBsaXN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYnVja2V0OiBpdCBrZWVwc1xuICAgICAgICAvLyBpdHMgZGlzayBkYXRhICh0aGUgY29uZmlnIG1heSByZS1hZGQgaXQpLCBidXQgc3RvcHMgYWxsIHN5bmNocm9uaXphdGlvbiAtIG5vIG9uZVxuICAgICAgICAvLyBjb250YWN0cyBhIHJlbW92ZWQgc291cmNlLCBhbmQgc2Nhbm5pbmcvcHVzaGluZyBhcyBpZiB3ZSB3ZXJlIHN0aWxsIG9uZSB3b3VsZCBmaWdodCB0aGVcbiAgICAgICAgLy8gcmVhbCBjaGFpbi4gVGhlIGNvbmZpZy1sZXZlbCB2YWxpZFdpbmRvdyByaWRlcyBvbiBlYWNoIEFyY2hpdmVzU291cmNlOyB0aGUgZGlzayBzb3VyY2VcbiAgICAgICAgLy8gc2hhcmVzIG91ciBjdXJyZW50bHktdmFsaWQgZW50cnkncyB3aW5kb3cgKGl0IGhvbGRzIG91ciBjb3B5IG9mIHRoZSBkYXRhKS5cbiAgICAgICAgbGV0IG93bkluZGV4ZXMgPSBuZXcgU2V0KHNlbGZJbmRleGVzKTtcbiAgICAgICAgLy8gT3VyIG93biBkaXNrIGdldHMgbm8gcm91dGUgZmlsdGVyOiBldmVyeXRoaW5nIGl0IGhvbGRzIGlzIG91cnMgdG8gaW5kZXggYW5kIHNlcnZlXG4gICAgICAgIGxldCBzb3VyY2VzOiBBcmNoaXZlc1NvdXJjZVtdID0gW3tcbiAgICAgICAgICAgIHNvdXJjZTogbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpLFxuICAgICAgICAgICAgdmFsaWRXaW5kb3c6IHNlbGY/LnZhbGlkV2luZG93IHx8IEZVTExfVkFMSURfV0lORE9XLFxuICAgICAgICB9XTtcbiAgICAgICAgaWYgKHNlbGZJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaGlzIHNlcnZlciBpcyBub3QgaW4gdGhlIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OyBrZWVwaW5nIGl0cyBkYXRhIG9uIGRpc2sgYnV0IG5vIGxvbmdlciBzeW5jaHJvbml6aW5nIGl0YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc2VsZkluZGV4ICsgMTsgaSA8IGVmZmVjdGl2ZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IGVmZmVjdGl2ZS5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IG93bkluZGV4ZXMuaGFzKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBEaXNqb2ludC1zaGFyZCBzb3VyY2VzIG5ldmVyIHRhbGsgdG8gZWFjaCBvdGhlcjsgYSBwYXJ0aWFsIG92ZXJsYXAgc3luY3Mgb25seVxuICAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlcnNlY3Rpb24gKHNjYW5zIGlnbm9yZSB0aGUgcmVzdCwgd3JpdGVzIG9ubHkgc2VuZCBtYXRjaGluZyBrZXlzKVxuICAgICAgICAgICAgICAgIGxldCBzaGFyZWRSb3V0ZSA9IHJvdXRlSW50ZXJzZWN0aW9uKHNlbGY/LnJvdXRlLCBzb3VyY2Uucm91dGUpO1xuICAgICAgICAgICAgICAgIGlmICghc2hhcmVkUm91dGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEEgYm91bmRlZC1jYWNoZSBzZXJ2ZXIgKG5vRnVsbFN5bmMgb24gb3VyIG93biBlbnRyeSkgbXVzdCBub3QgZnVsbC1zeW5jIGZyb21cbiAgICAgICAgICAgICAgICAvLyBBTlkgc291cmNlLCBvciBpdHMgZGlzayB3b3VsZCBmaWxsIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpbWl0XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHsgc291cmNlOiBjcmVhdGVBcGlBcmNoaXZlcyhzb3VyY2UpLCB2YWxpZFdpbmRvdzogc291cmNlLnZhbGlkV2luZG93LCByb3V0ZTogc2hhcmVkUm91dGUsIG5vRnVsbFN5bmM6IHNvdXJjZS5ub0Z1bGxTeW5jIHx8IHNlbGY/Lm5vRnVsbFN5bmMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmUgPSBuZXcgQmxvYlN0b3JlKGZvbGRlciwgc291cmNlcywge1xuICAgICAgICAgICAgb25JbmRleENoYW5nZWQ6IGtleSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZXMgZm9yIG91ciBvd24gcm91dGluZyB3cml0ZXMgQU5EIHJvdXRpbmcgZmlsZXMgcHVsbGVkIGluIHZpYSBzeW5jaHJvbml6YXRpb25cbiAgICAgICAgICAgICAgICAvLyAob25seSBldmVyIG5ld2VyIG9uZXMsIHNlZSBJQXJjaGl2ZXMuc2V0KSDigJQgZWl0aGVyIHdheSwgYXBwbHkgdGhlIG5ldyBjb25maWdcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2b2lkIHNjaGVkdWxlUm91dGluZ1JlbG9hZChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHNlbGY/LnJlYWRlckRpc2tMaW1pdCxcbiAgICAgICAgICAgIGdldEZsdXNoRGVhZGxpbmUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkOiBMb2FkZWRCdWNrZXQgPSB7IGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcsIHJvdXRpbmdKU09OOiBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSwgc2VsZkVudHJpZXMsIHNlbGYsIHN0b3JlIH07XG4gICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkKTtcbiAgICByZXR1cm4gbG9hZGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgZGF0YSA9IGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5nZXQoUk9VVElOR19GSUxFKTtcbiAgICBpZiAoIWRhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIHBhcnNlUm91dGluZ0RhdGEoZGF0YSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9hZGVkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGxvYWRlZCA9IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgbG9hZGVkID0gbG9hZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBsb2FkZWQpO1xuICAgICAgICAvLyBNaXNzaW5nIGJ1Y2tldHMgYXJlIG5vdCBjYWNoZWQg4oCUIHRoZXkgY2FuIGJlIGNyZWF0ZWQgYXQgYW55IHRpbWUgKGd1YXJkaW5nIGFnYWluc3QgYVxuICAgICAgICAvLyBjb25jdXJyZW50IGNyZWF0ZSBoYXZpbmcgYWxyZWFkeSByZXBsYWNlZCBvdXIgZW50cnkpXG4gICAgICAgIHZvaWQgbG9hZGVkLnRoZW4oYnVja2V0ID0+IHtcbiAgICAgICAgICAgIGlmICghYnVja2V0ICYmIGJ1Y2tldHMuZ2V0KGtleSkgPT09IGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIGJ1Y2tldHMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgIGlmIChidWNrZXRzLmdldChrZXkpID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBidWNrZXRzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvYWRlZDtcbn1cblxuLy8gUm91dGluZyByZWxvYWRzIGFyZSBzZXJpYWxpemVkIHBlciBidWNrZXQsIHNvIGNvbmN1cnJlbnQgd3JpdGVzL3N5bmNzIGNhbid0IHJlYnVpbGQgdGhlIHNhbWVcbi8vIHN0b3JlIHR3aWNlIGluIHBhcmFsbGVsXG5jb25zdCByb3V0aW5nUmVsb2FkcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuZnVuY3Rpb24gc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBjb25maWc/OiB7IGZvcmNlPzogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IG5leHQgPSAocm91dGluZ1JlbG9hZHMuZ2V0KGtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICAgIC50aGVuKCgpID0+IGNoZWNrUm91dGluZ0NoYW5nZWQoYWNjb3VudCwgYnVja2V0TmFtZSwgY29uZmlnKSlcbiAgICAgICAgLmNhdGNoKGUgPT4gY29uc29sZS5lcnJvcihgUmVsb2FkaW5nIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDpgLCBlKSk7XG4gICAgcm91dGluZ1JlbG9hZHMuc2V0KGtleSwgbmV4dCk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUm91dGluZ0NoYW5nZWQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgZm9yY2U/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgYnVja2V0cy5nZXQoa2V5KTtcbiAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgIC8vIGdldCgpIGNhY2hlLXJlYWRzIHRoZSBmaWxlIG9udG8gb3VyIGRpc2sgd2hlbiBhIHJlbW90ZSBzb3VyY2UgaG9sZHMgaXQsIHNvIHRoZSBidWNrZXQgc3RpbGxcbiAgICAvLyBleGlzdHMgYWZ0ZXIgYSByZXN0YXJ0XG4gICAgbGV0IGRhdGEgPSBhd2FpdCBsb2FkZWQuc3RvcmUuZ2V0KFJPVVRJTkdfRklMRSk7XG4gICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgbGV0IHJvdXRpbmcgPSBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgIGlmICghY29uZmlnPy5mb3JjZSAmJiBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSA9PT0gbG9hZGVkLnJvdXRpbmdKU09OKSByZXR1cm47XG4gICAgaWYgKGNvbmZpZz8uZm9yY2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlYnVpbGRpbmcgdGhlIHN0b3JlIGZvciBidWNrZXQgJHtrZXl9ICgke2NvbmZpZy5yZWFzb24gfHwgXCJmb3JjZWRcIn0pYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJvdXRpbmcgY29uZmlnIGNoYW5nZWQgZm9yIGJ1Y2tldCAke2tleX0sIHJlYnVpbGRpbmcgaXRzIHN0b3JlYCk7XG4gICAgfVxuICAgIGlmIChsb2FkZWQuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpIHtcbiAgICAgICAgYXdhaXQgbG9hZGVkLnN0b3JlLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUoYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZykpKTtcbn1cblxuLy8gUGVyLXdyaXRlIG9wdGlvbnMgYXJlIGV2YWx1YXRlZCBhdCB0aGUgV1JJVEUncyB0aW1lIChhbmQgdGhlIGtleSdzIHJvdXRlKSwgbm90IHRoZSBjdXJyZW50XG4vLyBjb25maWc6IHRoZSB3cml0ZSB0aW1lIGlzIHN0YW1wZWQgZXhhY3RseSBvbmNlIChhdCB0aGUgZmlyc3Qgbm9kZSB0aGF0IHJlY2VpdmVzIHRoZSB3cml0ZSkgYW5kXG4vLyBwcm9wYWdhdGVzIHdpdGggdGhlIGRhdGEsIHNvIGV2ZXJ5IG5vZGUgcmVzb2x2ZXMgdGhlIHNhbWUgc2VsZiBlbnRyeSAtIGFuZCB0aGUgc2FtZSBvcHRpb25zLlxuZnVuY3Rpb24gZ2V0V3JpdGVDb25maWcoYnVja2V0OiBMb2FkZWRCdWNrZXQsIHdyaXRlVGltZTogbnVtYmVyLCByb3V0ZTogbnVtYmVyKTogeyBmYXN0PzogYm9vbGVhbjsgd3JpdGVEZWxheT86IG51bWJlciB9IHtcbiAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQoYnVja2V0LnNlbGZFbnRyaWVzLCB3cml0ZVRpbWUsIHJvdXRlKTtcbiAgICByZXR1cm4geyBmYXN0OiBzZWxmPy5mYXN0LCB3cml0ZURlbGF5OiBzZWxmPy53cml0ZURlbGF5IH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRNdXRhYmxlKGJ1Y2tldDogTG9hZGVkQnVja2V0LCBmaWxlUGF0aDogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdChidWNrZXQuc2VsZkVudHJpZXMsIHdyaXRlVGltZSwgZ2V0Um91dGUoZmlsZVBhdGgpKTtcbiAgICBpZiAoIXNlbGY/LmltbXV0YWJsZSkgcmV0dXJuO1xuICAgIGlmIChhd2FpdCBidWNrZXQuc3RvcmUuZ2V0SW5mbyhmaWxlUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHtidWNrZXQuYWNjb3VudH0vJHtidWNrZXQuYnVja2V0TmFtZX0gaXMgaW1tdXRhYmxlIChhdCB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSkgYW5kICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSBhbHJlYWR5IGV4aXN0cywgc28gaXQgY2Fubm90IGJlIHdyaXR0ZW4gdG9gKTtcbiAgICB9XG59XG5cbi8vIFdyb25nLXRhcmdldCByZWplY3Rpb25zIGFyZSByYXJlIGFuZCBpbXBvcnRhbnQgKHRoZXkgQVJFIHRoZSBzd2l0Y2hvdmVyIGhhbmRvZmYpLCBidXQgYSBidXJzdCBvZlxuLy8gcmFjaW5nIHdyaXRlcyBhdCBhIGJvdW5kYXJ5IG11c3Qgbm90IGZsb29kIHRoZSBsb2cgLSBzbyBhdCBtb3N0IG9uZSBsaW5lIGEgbWludXRlXG5jb25zdCBXUk9OR19UQVJHRVRfTE9HX1RIUk9UVExFID0gNjAgKiAxMDAwO1xubGV0IGxhc3RXcm9uZ1RhcmdldExvZyA9IDA7XG5mdW5jdGlvbiBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RXcm9uZ1RhcmdldExvZyA8IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUpIHJldHVybjtcbiAgICBsYXN0V3JvbmdUYXJnZXRMb2cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xufVxuXG4vLyBSb3V0aW5nIHdyaXRlcyBhcmUgc2VyaWFsaXplZCBwZXIgYnVja2V0LCBzbyB0d28gY29uY3VycmVudCBjcmVhdGVzIGNhbid0IGJvdGggYnVpbGQgYSBzdG9yZVxuLy8gKHRoZSBsb3NlcidzIHN0b3JlIHdvdWxkIGxlYWsgd2l0aCBpdHMgc3luYyBsb29wcyBydW5uaW5nIGZvcmV2ZXIpXG5jb25zdCByb3V0aW5nV3JpdGVzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUm91dGluZ0NvbmZpZyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIC8vIFZhbGlkYXRlcyBiZWZvcmUgc3RvcmluZyBhbnl0aGluZywgc28gYSBiYWQgY29uZmlnIGNhbid0IGJyaWNrIHRoZSBidWNrZXRcbiAgICBsZXQgaW5jb21pbmcgPSBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgYXdhaXQgbmV3IEFyY2hpdmVzRGlzayhnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUoYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgaW5jb21pbmcpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDcmVhdGVkIGJ1Y2tldCAke2tleX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIGNoYW5nZWQgY29uZmlnIG11c3QgY2FycnkgYSBoaWdoZXIgdmVyc2lvbiB0aGFuIHRoZSBvbmUgY3VycmVudGx5IHN0b3JlZCDigJQgb3RoZXJ3aXNlIHR3b1xuICAgIC8vIGNsaWVudHMgd2l0aCBkaWZmZXJlbnQgY29uZmlncyBhdCB0aGUgc2FtZSB2ZXJzaW9uIHdvdWxkIGtlZXAgY2xvYmJlcmluZyBlYWNoIG90aGVyLiBTYW1lXG4gICAgLy8gY29udGVudCBhdCBhbnkgdmVyc2lvbiBpcyBhIGhhcm1sZXNzIG5vLW9wIGFuZCBpcyBhbGxvd2VkIHRocm91Z2guXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KGluY29taW5nKSAhPT0gbG9hZGVkLnJvdXRpbmdKU09OICYmIGdldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpIDw9IGdldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVwZGF0ZSByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7a2V5fTogdGhlIG5ldyBjb25maWcgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IG9uZSBidXQgaXRzIHZlcnNpb24gKCR7Z2V0Q29uZmlnVmVyc2lvbihpbmNvbWluZyl9KSBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHZlcnNpb24gKCR7Z2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZyl9KS4gSW5jcmVtZW50IHRoZSB2ZXJzaW9uIHRvIHVwZGF0ZSBpdC4gQ3VycmVudDogJHtsb2FkZWQucm91dGluZ0pTT059LiBBdHRlbXB0ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpfWApO1xuICAgIH1cbiAgICAvLyBSb3V0aW5nIHdyaXRlcyBieXBhc3MgZmFzdCBtb2RlICh0aGUgY29uZmlnIG11c3QgYXBwbHkgaW1tZWRpYXRlbHkgYW5kIHN1cnZpdmUgYSBjcmFzaClcbiAgICAvLyBhbmQgaWdub3JlIGltbXV0YWJsZSAodGhlIHJvdXRpbmcgZmlsZSBtdXN0IGFsd2F5cyBzdGF5IHVwZGF0YWJsZSkuIEFuIG9sZGVyIGxhc3RNb2RpZmllZFxuICAgIC8vIG5vLW9wcyBpbnNpZGUgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSByZWxvYWQgYmVsb3cgc2VlcyBubyBjaGFuZ2UuXG4gICAgYXdhaXQgbG9hZGVkLnN0b3JlLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUJ1Y2tldEZpbGUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICBpZiAoZmlsZVBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgICAgIGxldCBydW4gPSAocm91dGluZ1dyaXRlcy5nZXQoa2V5KSB8fCBQcm9taXNlLnJlc29sdmUoKSkudGhlbigoKSA9PiB3cml0ZVJvdXRpbmdDb25maWcoYWNjb3VudCwgYnVja2V0TmFtZSwgZGF0YSwgY29uZmlnKSk7XG4gICAgICAgIC8vIFRoZSBjaGFpbiBtdXN0IHN1cnZpdmUgYSBmYWlsZWQgd3JpdGUsIHNvIHRoZSBzdG9yZWQgbGluayBzd2FsbG93cyB0aGUgZXJyb3IgKHRoZSBjYWxsZXJcbiAgICAgICAgLy8gc3RpbGwgZ2V0cyBpdCBmcm9tIHJ1bilcbiAgICAgICAgcm91dGluZ1dyaXRlcy5zZXQoa2V5LCBydW4udGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVuO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSBkb2VzIG5vdCBleGlzdC4gV3JpdGUgaXRzIHJvdXRpbmcgY29uZmlnIHRvICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gdG8gY3JlYXRlIGl0LmApO1xuICAgIH1cbiAgICAvLyBUaGUgd3JpdGUgdGltZSBpcyBkZXRlcm1pbmVkIGV4YWN0bHkgb25jZSwgSEVSRSBhdCB0aGUgZmlyc3Qgbm9kZSB0aGF0IHJlY2VpdmVzIHRoZSB3cml0ZTtcbiAgICAvLyBpdCBwcm9wYWdhdGVzIGFzIGxhc3RNb2RpZmllZCwgc28gZXZlcnkgbm9kZSBldmFsdWF0ZXMgdGhlIGJ1Y2tldCBvcHRpb25zIGF0IHRoZSBzYW1lIGluc3RhbnRcbiAgICBsZXQgd3JpdGVUaW1lID0gY29uZmlnPy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKTtcbiAgICAvLyBPbmx5IGZyZXNobHktc3RhbXBlZCB3cml0ZXMgYXJlIGNoZWNrZWQ6IGEgd3JpdGUgd2l0aCBhbiBleHBsaWNpdCBsYXN0TW9kaWZpZWQgaXNcbiAgICAvLyBzeW5jaHJvbml6YXRpb24vYmFja2ZpbGwgKG9sZCBkYXRhIGxlZ2l0aW1hdGVseSBsYW5kcyBvbiBzb3VyY2VzIHdob3NlIHdpbmRvdyBoYXMgbW92ZWQgb24pLFxuICAgIC8vIGJ1dCBhIGZyZXNoIHdyaXRlIHJlYWNoaW5nIHVzIG91dHNpZGUgb3VyIHdpbmRvd3Mvcm91dGVzIG1lYW5zIHRoZSBjbGllbnQgcmVzb2x2ZWQgaXRzXG4gICAgLy8gdGFyZ2V0IGZyb20gYSBzdGFsZSB2aWV3IC0gaXQgbXVzdCByZS1yZXNvbHZlIGFuZCByZXRyeSBhdCB0aGUgY29ycmVjdCBzb3VyY2UuXG4gICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoZmlsZVBhdGgpO1xuICAgIGlmICghY29uZmlnPy5sYXN0TW9kaWZpZWQgJiYgbG9hZGVkLnNlbGZFbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICBsZXQgdGltZVZhbGlkID0gbG9hZGVkLnNlbGZFbnRyaWVzLmZpbHRlcih4ID0+IHdyaXRlVGltZSA+PSB4LnZhbGlkV2luZG93WzBdIC0gV1JJVEVfUEFTVF9XSU5ET1dfR1JBQ0UgJiYgd3JpdGVUaW1lIDw9IHgudmFsaWRXaW5kb3dbMV0gKyBXUklURV9QQVNUX1dJTkRPV19HUkFDRSk7XG4gICAgICAgIGlmICghdGltZVZhbGlkLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gdG8gYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfTogb3V0c2lkZSBvdXIgdmFsaWQgd2luZG93cyAoYSBzd2l0Y2hvdmVyIG1vdmVkIHRoZSB3cml0ZSB0YXJnZXQpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1d9IFRoaXMgc2VydmVyIGlzIG5vdCBhIHZhbGlkIHdyaXRlIHRhcmdldCBhdCAke3dyaXRlVGltZX0gZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gKG91ciB2YWxpZCB3aW5kb3dzOiAke0pTT04uc3RyaW5naWZ5KGxvYWRlZC5zZWxmRW50cmllcy5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9KS4gUmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5IHZhbGlkIHNvdXJjZSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aW1lVmFsaWQuc29tZSh4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKSkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gdG8gYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfTogcm91dGUgJHtyb3V0ZX0gaXMgbm90IG91cnMgKHRoZSBjbGllbnQncyBzaGFyZCBjb25maWcgaXMgc3RhbGUpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19ST1VURX0gVGhpcyBzZXJ2ZXIgZG9lcyBub3QgaGFuZGxlIHJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9KSBmb3IgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSAob3VyIHJvdXRlcyBhdCB0aGlzIHRpbWU6ICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSkuIFJlLXJlc29sdmUgdGhlIHNvdXJjZSBmb3IgdGhpcyBrZXkgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGF3YWl0IGFzc2VydE11dGFibGUobG9hZGVkLCBmaWxlUGF0aCwgd3JpdGVUaW1lKTtcbiAgICBhd2FpdCBsb2FkZWQuc3RvcmUuc2V0KGZpbGVQYXRoLCBkYXRhLCB7IC4uLmdldFdyaXRlQ29uZmlnKGxvYWRlZCwgd3JpdGVUaW1lLCByb3V0ZSksIGxhc3RNb2RpZmllZDogd3JpdGVUaW1lIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVja2V0Q29uZmlnKGJ1Y2tldDogTG9hZGVkQnVja2V0KTogQXJjaGl2ZXNDb25maWcge1xuICAgIGxldCBwcm9ncmVzcyA9IGJ1Y2tldC5zdG9yZS5nZXRTeW5jUHJvZ3Jlc3M/LigpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiAhIWJ1Y2tldC5zdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIsXG4gICAgICAgIC8vIFRoZSByZW1hcHBlZCAoaW50ZXJwcmV0YXRpb24pIHZpZXc6IGdldENvbmZpZyBpcyBob3cgY2xpZW50cyBsZWFybiBvZiBhbiBpbi1wcm9ncmVzc1xuICAgICAgICAvLyBkZXBsb3kgdGFrZW92ZXIsIHNpbmNlIHRoZSByZW1hcCBpcyBuZXZlciB3cml0dGVuIGludG8gdGhlIHJvdXRpbmcgZmlsZSBpdHNlbGZcbiAgICAgICAgcmVtb3RlQ29uZmlnOiBhcHBseURlcGxveVJlbWFwKGJ1Y2tldC5yb3V0aW5nKSxcbiAgICAgICAgaW5kZXg6IHByb2dyZXNzPy5pbmRleCxcbiAgICAgICAgaW5kZXhTb3VyY2VzOiBwcm9ncmVzcz8uc291cmNlcyxcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0OiBwcm9ncmVzcz8ucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICBzeW5jaW5nOiBwcm9ncmVzcz8uc3luY2luZyxcbiAgICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVidWlsZEFsbExvYWRlZEJ1Y2tldHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChsZXQga2V5IG9mIFsuLi5idWNrZXRzLmtleXMoKV0pIHtcbiAgICAgICAgbGV0IHNsYXNoID0ga2V5LmluZGV4T2YoXCIvXCIpO1xuICAgICAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoa2V5LnNsaWNlKDAsIHNsYXNoKSwga2V5LnNsaWNlKHNsYXNoICsgMSksIHsgZm9yY2U6IHRydWUsIHJlYXNvbjogXCJkZXBsb3kgdGFrZW92ZXIgc3RhdGUgY2hhbmdlZFwiIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc2NhbkFsbExvYWRlZEJ1Y2tldERpc2tzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKGBEZXBsb3kgc3dpdGNob3ZlciBkaXNrIHJlc2NhbiBzdGFydGluZyAoJHtidWNrZXRzLnNpemV9IGxvYWRlZCBidWNrZXRzKSAtIGNhdGNoaW5nIGZpbGVzIHRoZSBvdGhlciBwcm9jZXNzIHdyb3RlYCk7XG4gICAgZm9yIChsZXQgbG9hZGVkUHJvbWlzZSBvZiBbLi4uYnVja2V0cy52YWx1ZXMoKV0pIHtcbiAgICAgICAgbGV0IGxvYWRlZCA9IGF3YWl0IGxvYWRlZFByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKCFsb2FkZWQpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgc3RvcmUgPSBsb2FkZWQuc3RvcmU7XG4gICAgICAgIGlmICghKHN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSkgY29udGludWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBzdG9yZS5yZXNjYW5CYXNlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYERlcGxveSBzd2l0Y2hvdmVyIGRpc2sgcmVzY2FuIGZhaWxlZCBmb3IgYnVja2V0ICR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5vblRha2VvdmVyRXZlbnQoZXZlbnQgPT4ge1xuICAgIGlmIChldmVudCA9PT0gXCJyZW1hcENoYW5nZWRcIikge1xuICAgICAgICB2b2lkIHJlYnVpbGRBbGxMb2FkZWRCdWNrZXRzKCk7XG4gICAgfVxuICAgIGlmIChldmVudCA9PT0gXCJkaXNrU2NhblwiKSB7XG4gICAgICAgIHZvaWQgcmVzY2FuQWxsTG9hZGVkQnVja2V0RGlza3MoKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IHR5cGUgU2VydmVyQnVja2V0SW5mbyA9IHtcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgLy8gTG9hZGVkIGluIG1lbW9yeSAoY3JlYXRlZCBvciBhY2Nlc3NlZCBzaW5jZSBzdGFydHVwKSwgc28gaXRzIHN5bmNocm9uaXphdGlvbiBpcyBydW5uaW5nXG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIGNvbmZpZz86IEFyY2hpdmVzQ29uZmlnO1xuICAgIGVycm9yPzogc3RyaW5nO1xufTtcblxuLyoqIEV2ZXJ5IGJ1Y2tldCB0aGUgYWNjb3VudCBoYXMgb24gdGhpcyBzZXJ2ZXIsIGFjdGl2ZSBvciBub3QsIGVhY2ggd2l0aCBpdHMgY29uZmlndXJhdGlvbi5cbiAqICBJbmFjdGl2ZSBidWNrZXRzIGFyZSBpbnNwZWN0ZWQgc3RyYWlnaHQgZnJvbSBkaXNrIFdJVEhPVVQgbG9hZGluZyB0aGVtIC0gbG9hZGluZyB3b3VsZCBzdGFydFxuICogIHRoZWlyIHN5bmNocm9uaXphdGlvbiwgYW5kIG9sZCBpbnZhbGlkIGJ1Y2tldHMgbXVzdCBzdGF5IGluZXJ0ICh0aGVpciBwYXJzZSBlcnJvciBpcyByZXBvcnRlZFxuICogIGluc3RlYWQpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RBY2NvdW50QnVja2V0cyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIGxldCBhY2NvdW50Rm9sZGVyID0gcGF0aC5qb2luKGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKS5mb2xkZXIsIFwiYnVja2V0czJcIiwgYWNjb3VudCk7XG4gICAgbGV0IG5hbWVzOiBzdHJpbmdbXTtcbiAgICB0cnkge1xuICAgICAgICBuYW1lcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoYWNjb3VudEZvbGRlcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdHM6IFNlcnZlckJ1Y2tldEluZm9bXSA9IFtdO1xuICAgIGZvciAobGV0IGJ1Y2tldE5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgbGV0IGxvYWRlZFByb21pc2UgPSBidWNrZXRzLmdldChgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YCk7XG4gICAgICAgIGlmIChsb2FkZWRQcm9taXNlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCBsb2FkZWRQcm9taXNlO1xuICAgICAgICAgICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiB0cnVlLCBjb25maWc6IGdldEJ1Y2tldENvbmZpZyhsb2FkZWQpIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiB0cnVlLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5nZXQoUk9VVElOR19GSUxFKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGVycm9yOiBgTm8gcm91dGluZyBmaWxlICgke1JPVVRJTkdfRklMRX0pYCB9KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGNvbmZpZzogeyByZW1vdGVDb25maWc6IHBhcnNlUm91dGluZ0RhdGEoZGF0YSkgfSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgYnVja2V0TmFtZSwgYWN0aXZlOiBmYWxzZSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJ1Y2tldEZpbGUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZmlsZVBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBkZWxldGVkIChvdmVyd3JpdGUgaXQgdG8gY2hhbmdlIHRoZSBidWNrZXQncyBjb25maWd1cmF0aW9uKWApO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgYXdhaXQgbG9hZGVkLnN0b3JlLmRlbChmaWxlUGF0aCwgZ2V0V3JpdGVDb25maWcobG9hZGVkLCBEYXRlLm5vdygpLCBnZXRSb3V0ZShmaWxlUGF0aCkpKTtcbn1cblxuLy8g4pSA4pSAIGxvY2FsIElBcmNoaXZlcyBhY2Nlc3Mg4pSA4pSAXG5cbmNvbnN0IExBUkdFX0ZJTEVfUEFSVF9TSVpFID0gOCAqIDEwMjQgKiAxMDI0O1xuXG4vLyBUaGUgaW4tcHJvY2VzcyBJQXJjaGl2ZXMgZm9yIGEgYnVja2V0IGhvc3RlZCBieSBUSElTIHNlcnZlciDigJQgdXNlZCB3aGVuIGEgUmVtb3RlQ29uZmlnIHNvdXJjZVxuLy8gVVJMIHBvaW50cyBhdCBvdXJzZWx2ZXMsIHNvIHdlIGRvbid0IHRhbGsgdG8gb3Vyc2VsdmVzIG92ZXIgSFRUUFMuIE9uZSBzaW5nbGV0b24gcGVyIGJ1Y2tldC5cbmNsYXNzIEFyY2hpdmVzTG9jYWxCdWNrZXQgaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYWNjb3VudDogc3RyaW5nLCBwcml2YXRlIGJ1Y2tldE5hbWU6IHN0cmluZykgeyB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEJ1Y2tldCgpOiBQcm9taXNlPExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gYGxvY2FsQnVja2V0LyR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX1gO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVCdWNrZXRGaWxlKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgZGVsZXRlQnVja2V0RmlsZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9IGRvZXMgbm90IGV4aXN0LiBXcml0ZSBpdHMgcm91dGluZyBjb25maWcgdG8gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSB0byBjcmVhdGUgaXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgYXNzZXJ0TXV0YWJsZShidWNrZXQsIGNvbmZpZy5wYXRoLCBEYXRlLm5vdygpKTtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgYnVja2V0LnN0b3JlLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGRhdGEubGVuZ3RoOyBvZmZzZXQgKz0gTEFSR0VfRklMRV9QQVJUX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgTEFSR0VfRklMRV9QQVJUX1NJWkUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBidWNrZXQuc3RvcmUuZmluaXNoTGFyZ2VVcGxvYWQoaWQsIGNvbmZpZy5wYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmNhbmNlbExhcmdlVXBsb2FkKGlkKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldEluZm8oZmlsZU5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgICAgICByZXR1cm4gYnVpbGRGaWxlVXJsKGBodHRwczovLyR7ZG9tYWlufToke3BvcnR9L2ZpbGUvJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5hY2NvdW50KX0vJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5idWNrZXROYW1lKX1gLCBmaWxlUGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgLy8gTWlzc2luZyBidWNrZXRzIHNheSB0cnVlLCBtYXRjaGluZyB3aGF0IHRoZXkgYmVjb21lIG9uY2UgY3JlYXRlZCAodGhlIGRlZmF1bHQgc3RvcmUgdHlwZSlcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiB0cnVlIH07XG4gICAgICAgIHJldHVybiBnZXRCdWNrZXRDb25maWcoYnVja2V0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcih0aW1lOiBudW1iZXIpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoIWJ1Y2tldC5zdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRDaGFuZ2VzQWZ0ZXIgKHJhd0Rpc2sgYnVja2V0cyBoYXZlIG5vIGluZGV4KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyKHRpbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IGFsbFNjYW5zQ29tcGxldGU6IHRydWUsIGluZGV4U2l6ZTogMCwgc291cmNlczogW10gfTtcbiAgICAgICAgaWYgKCFidWNrZXQuc3RvcmUuZ2V0U3luY1N0YXR1cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHt0aGlzLmFjY291bnR9LyR7dGhpcy5idWNrZXROYW1lfSBkb2VzIG5vdCBzdXBwb3J0IGdldFN5bmNTdGF0dXMgKHJhd0Rpc2sgYnVja2V0cyBoYXZlIG5vIHN5bmNocm9uaXphdGlvbilgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldFN5bmNTdGF0dXMoKTtcbiAgICB9XG59XG5cbmNvbnN0IGxvY2FsQXJjaGl2ZXMgPSBuZXcgTWFwPHN0cmluZywgSUFyY2hpdmVzPigpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsQXJjaGl2ZXMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBJQXJjaGl2ZXMge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgZXhpc3RpbmcgPSBsb2NhbEFyY2hpdmVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGxldCBhcmNoaXZlcyA9IG5ldyBBcmNoaXZlc0xvY2FsQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxvY2FsQXJjaGl2ZXMuc2V0KGtleSwgYXJjaGl2ZXMpO1xuICAgIHJldHVybiBhcmNoaXZlcztcbn1cbiJdfQ==
633
- /* _JS_SOURCE_HASH = "dff35132db24f439e770399f39c2b02617fee900ffcc20ccb2998814f92e7fb7"; */
638
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsb0RBQXlEO0FBQ3pELDhEQUEyRDtBQUMzRCxnREFBNkM7QUFDN0Msa0RBQStDO0FBQy9DLDJDQUFzRDtBQUN0RCw0Q0FJc0I7QUFDdEIsaURBQTRKO0FBQzVKLHFEQUEyRztBQUMzRyxxREFBcUQ7QUFHckQsdUNBQW1DO0FBd0JuQyxJQUFJLE1BQXVDLENBQUM7QUFDNUMsU0FBZ0Isc0JBQXNCLENBQUMsS0FBMEI7SUFDN0QsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNuQixDQUFDO0FBRkQsd0RBRUM7QUFDRCxTQUFnQixzQkFBc0I7SUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBTEQsd0RBS0M7QUFDRCxpR0FBaUc7QUFDakcseURBQXlEO0FBQ3pELFNBQWdCLDhCQUE4QjtJQUMxQyxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRkQsd0VBRUM7QUFFRCxrR0FBa0c7QUFDbEcsbUdBQW1HO0FBQ25HLDZDQUE2QztBQUM3QyxJQUFJLG9CQUF3QyxDQUFDO0FBQzdDLFNBQWdCLHVCQUF1QixDQUFDLE1BQTBCO0lBQzlELG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUNsQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQix1QkFBdUI7SUFDbkMsT0FBTyxvQkFBb0IsQ0FBQztBQUNoQyxDQUFDO0FBRkQsMERBRUM7QUFDRCxTQUFnQixtQkFBbUI7SUFDL0IsSUFBSSxvQkFBb0I7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDcEUs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LElBQUksQ0FBQyxVQUFVLDJFQUEyRSxDQUFDLENBQUM7UUFDMUksQ0FBQztRQUNELE9BQU8sTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlDLENBQUM7Q0FDSjtBQUVELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO0FBQ25ELFNBQWdCLGdCQUFnQixDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUNoRSxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNyQyxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzlCLElBQUksUUFBUSxHQUFHLElBQUksbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzVELGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFQRCw0Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBnZXRGaWxlU3RvcmFnZU5lc3RlZDIgfSBmcm9tIFwiLi4vRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdG9yYWdlIH0gZnJvbSBcIi4uL1RyYW5zYWN0aW9uU3RvcmFnZVwiO1xuaW1wb3J0IHsgSlNPTlN0b3JhZ2UgfSBmcm9tIFwiLi4vSlNPTlN0b3JhZ2VcIjtcbmltcG9ydCB7IEFyY2hpdmVzRGlzayB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IEJsb2JTdG9yZSwgSUJ1Y2tldFN0b3JlIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZUNvbmZpZywgSG9zdGVkQ29uZmlnLCBJQXJjaGl2ZXMsIEFyY2hpdmVzU291cmNlLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLFxuICAgIEFyY2hpdmVzU3luY1N0YXR1cywgRlVMTF9WQUxJRF9XSU5ET1csXG4gICAgV1JJVEVfUEFTVF9XSU5ET1dfR1JBQ0UsIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1JPVVRFLCBGVUxMX1JPVVRFLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIHBhcnNlUm91dGluZ0RhdGEsIHBhcnNlSG9zdGVkVXJsLCBidWlsZEZpbGVVcmwsIGdldENvbmZpZ1ZlcnNpb24sIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCByb3V0ZUludGVyc2VjdGlvbiB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgYXBwbHlEZXBsb3lSZW1hcCwgZ2V0Rmx1c2hEZWFkbGluZSwgZ2V0VGFrZW92ZXJBbHRQb3J0LCBvblRha2VvdmVyRXZlbnQgfSBmcm9tIFwiLi9kZXBsb3lUYWtlb3ZlclwiO1xuaW1wb3J0IHsgY3JlYXRlQXBpQXJjaGl2ZXMgfSBmcm9tIFwiLi9jcmVhdGVBcmNoaXZlc1wiO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZSB9IGZyb20gXCIuLi9JU3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUgeyBBY2Nlc3NSZXF1ZXN0LCBUcnVzdFJlY29yZCB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBnZXRBcmcgfSBmcm9tIFwiLi9jbGlBcmdzXCI7XG5cbi8vIFRoZSBzdG9yYWdlIHNlcnZlcidzIGdsb2JhbCBzZXJ2ZXItc2lkZSBzdGF0ZS4gaG9zdFN0b3JhZ2VTZXJ2ZXIgc2V0cyB0aGUgY29uZmlnIG9uY2UgYXRcbi8vIHN0YXJ0dXA7IGV2ZXJ5dGhpbmcgZWxzZSAoc3lzdGVtIHN0b3JhZ2VzLCBidWNrZXRzKSBpcyBhIGdsb2JhbCBjYWNoZSBjcmVhdGVkIGxhemlseSBvbiBmaXJzdFxuLy8gdXNlLCB0aHJvd2luZyBpZiB0aGUgY29uZmlnIHdhcyBuZXZlciBzZXQuXG4vL1xuLy8gQnVja2V0cyBoYXZlIG5vIHNlcGFyYXRlIHJlZ2lzdHJ5OiBlYWNoIGJ1Y2tldCdzIGNvbmZpZ3VyYXRpb24gKGEgUmVtb3RlQ29uZmlnKSBsaXZlcyBpbnNpZGUgdGhlXG4vLyBidWNrZXQgaXRzZWxmLCBhdCBST1VUSU5HX0ZJTEUuIEEgYnVja2V0IGV4aXN0cyBpZmYgdGhhdCBmaWxlIGV4aXN0cy4gV3JpdGluZyBpdCBjcmVhdGVzIHRoZVxuLy8gYnVja2V0IChidWlsZGluZyBpdHMgc3RvcmUsIHdoaWNoIG1heSBpbW1lZGlhdGVseSBzdGFydCBzeW5jaHJvbml6YXRpb24gc2NhbnMpOyBvdmVyd3JpdGluZyBpdCDigJRcbi8vIGRpcmVjdGx5IG9yIHZpYSBhIGZpbGUgcHVsbGVkIGluIGZyb20gYSBzeW5jaHJvbml6YXRpb24gc291cmNlIOKAlCByZWJ1aWxkcyB0aGUgc3RvcmUgd2l0aCB0aGUgbmV3XG4vLyBzb3VyY2VzIChjYW5jZWxsaW5nIHRoZSBvbGQgc3RvcmUncyBzY2FucykuXG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VTZXJ2ZXJDb25maWcgPSB7XG4gICAgZG9tYWluOiBzdHJpbmc7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIHJvb3REb21haW46IHN0cmluZztcbiAgICAvLyB1c2VyQGV4dGVybmFsSXAgb2YgdGhlIHN0b3JhZ2UgbWFjaGluZSwgZm9yIGdlbmVyYXRlZCBzc2ggY29tbWFuZHNcbiAgICBzc2hUYXJnZXQ6IHN0cmluZztcbiAgICAvLyBBYnNvbHV0ZSBjb21tYW5kIHRoYXQgcnVucyB0aGUgZ3JhbnRBY2Nlc3MgQ0xJIG9uIHRoZSBzdG9yYWdlIG1hY2hpbmUgKGFkbWluIGFyZ3MgYXBwZW5kZWQpXG4gICAgc2VydmVyQ29tbWFuZDogc3RyaW5nO1xuICAgIC8vIFRoZSBzZXJ2ZXIncyByb290IHN0b3JhZ2UgZm9sZGVyIChhYnNvbHV0ZSlcbiAgICBmb2xkZXI6IHN0cmluZztcbn07XG5cbmxldCBjb25maWc6IFN0b3JhZ2VTZXJ2ZXJDb25maWcgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gc2V0U3RvcmFnZVNlcnZlckNvbmZpZyh2YWx1ZTogU3RvcmFnZVNlcnZlckNvbmZpZyk6IHZvaWQge1xuICAgIGNvbmZpZyA9IHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTogU3RvcmFnZVNlcnZlckNvbmZpZyB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIHNlcnZlciBpcyBub3QgaW5pdGlhbGl6ZWQgKHRoaXMgQVBJIG9ubHkgd29ya3Mgb24gdGhlIHN0b3JhZ2Ugc2VydmVyKWApO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xufVxuLy8gRm9yIHNlbGYtZGV0ZWN0aW9uOiBjb2RlIHRoYXQgQ0FOIHJ1biBvdXRzaWRlIHRoZSBzdG9yYWdlIHNlcnZlciAoY3JlYXRlQXJjaGl2ZXMpIHVzZXMgdGhpcyB0b1xuLy8gY2hlY2sgXCJpcyB0aGlzIFVSTCBvdXIgb3duIHByb2Nlc3M/XCIgd2l0aG91dCB0aHJvd2luZy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTogU3RvcmFnZVNlcnZlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cblxuLy8gV2hlbiBzZXQsIGFsbCB3cml0ZS1wYXRoIG9wZXJhdGlvbnMgKGNyZWF0aW5nIGZpbGVzLCBhcHBlbmRpbmcgbGFyZ2UgdXBsb2FkcywgY3JlYXRpbmcgYnVja2V0cylcbi8vIHRocm93IHRoaXMgbWVzc2FnZS4gUmVhZHMsIGZpbmRJbmZvLCBhbmQgZGVsZXRlcyBzdGlsbCB3b3JrIOKAlCBzbyBjbGllbnRzIGNhbiBmcmVlIHNwYWNlLiBNYW5hZ2VkXG4vLyBieSBob3N0U3RvcmFnZVNlcnZlcidzIGRpc2stc3BhY2UgbW9uaXRvci5cbmxldCB3cml0ZXNSZWplY3RlZFJlYXNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdyaXRlc1JlamVjdGVkUmVhc29uKHJlYXNvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgd3JpdGVzUmVqZWN0ZWRSZWFzb24gPSByZWFzb247XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gd3JpdGVzUmVqZWN0ZWRSZWFzb247XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0V3JpdGVzQWxsb3dlZCgpOiB2b2lkIHtcbiAgICBpZiAod3JpdGVzUmVqZWN0ZWRSZWFzb24pIHRocm93IG5ldyBFcnJvcih3cml0ZXNSZWplY3RlZFJlYXNvbik7XG59XG5cbi8vIFRoZSBzeXN0ZW0gc3RvcmFnZXMgKHRydXN0LCByZXF1ZXN0cykgYXJlIHRoZSBzYW1lIGtpbmQgb2YgdGhpbmcg4oCUIGEgSlNPTiBrZXkvdmFsdWUgc3RvcmUgdW5kZXJcbi8vIDxmb2xkZXI+L3N5c3RlbTIvPG5hbWU+IOKAlCBzbyB0aGV5IHNoYXJlIG9uZSBjYWNoZSwga2V5ZWQgYnkgbmFtZS4gKFwic3lzdGVtMlwiIGJlY2F1c2UgdGhlIGxheW91dFxuLy8gY2hhbmdlZCB3aGVuIGJ1Y2tldCBjb25maWdzIG1vdmVkIGludG8gdGhlIGJ1Y2tldHMgdGhlbXNlbHZlczsgb2xkIFwic3lzdGVtXCIvXCJidWNrZXRzXCIgZm9sZGVyc1xuLy8gYXJlIHNpbXBseSBpZ25vcmVkLilcbi8vIHNldFRydXN0ZWRNYWNoaW5lcyBpcyBjYWxsZWQgYnkgY29uc3VtZXJzIEJFRk9SRSBzdGFydGluZyB0aGUgc2VydmVyLCBzbyB3aGVuIHRoZSBjb25maWcgaXNuJ3Rcbi8vIHNldCB5ZXQgd2UgZmFsbCBiYWNrIHRvIHRoZSBzYW1lIC0tZm9sZGVyIGFyZyB0aGUgQ0xJIHN0YXJ0cyB0aGUgc2VydmVyIHdpdGguXG5mdW5jdGlvbiBnZXRTdG9yYWdlRm9sZGVyKCk6IHN0cmluZyB7XG4gICAgbGV0IGNvbmZpZyA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCgpO1xuICAgIGlmIChjb25maWcpIHJldHVybiBjb25maWcuZm9sZGVyO1xuICAgIGxldCBmb2xkZXIgPSBnZXRBcmcoXCJmb2xkZXJcIik7XG4gICAgaWYgKCFmb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIHNlcnZlciBpcyBub3QgaW5pdGlhbGl6ZWQgYW5kIHRoZXJlIGlzIG5vIC0tZm9sZGVyIGFyZywgc28gdGhlIHN0b3JhZ2UgZm9sZGVyIGlzIHVua25vd25gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShmb2xkZXIpO1xufVxuXG5jb25zdCBzeXN0ZW1TdG9yYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPElTdG9yYWdlPHVua25vd24+Pj4oKTtcbmZ1bmN0aW9uIGdldFN5c3RlbVN0b3JhZ2U8VD4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxJU3RvcmFnZTxUPj4ge1xuICAgIGxldCBzdG9yYWdlID0gc3lzdGVtU3RvcmFnZXMuZ2V0KG5hbWUpO1xuICAgIGlmICghc3RvcmFnZSkge1xuICAgICAgICBzdG9yYWdlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCByb290ID0gYXdhaXQgZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQyKGdldFN0b3JhZ2VGb2xkZXIoKSk7XG4gICAgICAgICAgICBsZXQgc3lzdGVtID0gYXdhaXQgcm9vdC5mb2xkZXIuZ2V0U3RvcmFnZShcInN5c3RlbTJcIik7XG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25OYW1lID0gXCJzdG9yYWdlXCIgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OU3RvcmFnZTx1bmtub3duPihuZXcgVHJhbnNhY3Rpb25TdG9yYWdlKGF3YWl0IHN5c3RlbS5mb2xkZXIuZ2V0U3RvcmFnZShuYW1lKSwgdHJhbnNhY3Rpb25OYW1lKSk7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHN5c3RlbVN0b3JhZ2VzLnNldChuYW1lLCBzdG9yYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JhZ2UgYXMgUHJvbWlzZTxJU3RvcmFnZTxUPj47XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJ1c3QoKTogUHJvbWlzZTxJU3RvcmFnZTxUcnVzdFJlY29yZD4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxUcnVzdFJlY29yZD4oXCJ0cnVzdFwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXF1ZXN0cygpOiBQcm9taXNlPElTdG9yYWdlPEFjY2Vzc1JlcXVlc3RbXT4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxBY2Nlc3NSZXF1ZXN0W10+KFwicmVxdWVzdHNcIik7XG59XG5cbi8qKiBNYWtlcyBtYWNoaW5lSWRzIHRoZSBjb21wbGV0ZSB0cnVzdCBsaXN0IGZvciB0aGUgYWNjb3VudDogbWFjaGluZXMgbm90IGluIHRoZSBsaXN0IGxvc2UgYWNjZXNzLCBtYWNoaW5lcyBhbHJlYWR5IHRydXN0ZWQga2VlcCB0aGVpciBleGlzdGluZyByZWNvcmQsIGFuZCBtaXNzaW5nIG9uZXMgYXJlIGFkZGVkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFRydXN0ZWRNYWNoaW5lcyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBtYWNoaW5lSWRzOiBzdHJpbmdbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICBsZXQgcHJlZml4ID0gYCR7Y29uZmlnLmFjY291bnR9fGA7XG4gICAgbGV0IGRlc2lyZWQgPSBuZXcgU2V0KGNvbmZpZy5tYWNoaW5lSWRzKTtcbiAgICBmb3IgKGxldCBrZXkgb2YgYXdhaXQgdHJ1c3QuZ2V0S2V5cygpKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgIGxldCBtYWNoaW5lSWQgPSBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgICAgIGlmIChkZXNpcmVkLmhhcyhtYWNoaW5lSWQpKSB7XG4gICAgICAgICAgICBkZXNpcmVkLmRlbGV0ZShtYWNoaW5lSWQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFJlbW92aW5nIHRydXN0IGZvciBtYWNoaW5lICR7bWFjaGluZUlkfSBvbiBhY2NvdW50ICR7Y29uZmlnLmFjY291bnR9YCk7XG4gICAgICAgIGF3YWl0IHRydXN0LnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICBmb3IgKGxldCBtYWNoaW5lSWQgb2YgZGVzaXJlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQWRkaW5nIHRydXN0IGZvciBtYWNoaW5lICR7bWFjaGluZUlkfSBvbiBhY2NvdW50ICR7Y29uZmlnLmFjY291bnR9YCk7XG4gICAgICAgIGF3YWl0IHRydXN0LnNldChgJHtwcmVmaXh9JHttYWNoaW5lSWR9YCwgeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgbWFjaGluZUlkLCBpcDogXCJcIiwgdGltZTogRGF0ZS5ub3coKSB9KTtcbiAgICB9XG59XG5cbi8vIOKUgOKUgCBidWNrZXRzIOKUgOKUgFxuXG5leHBvcnQgdHlwZSBMb2FkZWRCdWNrZXQgPSB7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAvLyBUaGUgYnVja2V0J3MgcGFyc2VkIHJvdXRpbmcgY29uZmlnICh0aGUgY29udGVudHMgb2YgUk9VVElOR19GSUxFKVxuICAgIHJvdXRpbmc6IFJlbW90ZUNvbmZpZztcbiAgICAvLyBKU09OIG9mIHJvdXRpbmcsIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgcm91dGluZ0pTT046IHN0cmluZztcbiAgICAvLyBBTEwgb2Ygb3VyIG93biBlbnRyaWVzIGluIHJvdXRpbmcuc291cmNlcyAodGhpcyBidWNrZXQgb24gdGhpcyBzZXJ2ZXIpLiBNb3JlIHRoYW4gb25lIHdoZW5cbiAgICAvLyB0aGUgYnVja2V0J3Mgb3B0aW9ucyBjaGFuZ2Ugb3ZlciB0aW1lIC0gb25lIGVudHJ5IHBlciB2YWxpZCB3aW5kb3cgKGUuZy4gaW1tdXRhYmxlIGRyb3BwZWQsXG4gICAgLy8gb3IgZmFzdCBlbmFibGVkLCBzdGFydGluZyBhdCBhIHNjaGVkdWxlZCBpbnN0YW50KS5cbiAgICBzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgLy8gVGhlIGVudHJ5IHZhbGlkIHdoZW4gdGhlIHN0b3JlIHdhcyBidWlsdCAtIHRoZSBzdHJ1Y3R1cmFsIG9wdGlvbnMgKHJhd0Rpc2ssIHdoaWNoIGVudHJpZXNcbiAgICAvLyBhcmUgZG93bnN0cmVhbSkuIFBlci13cml0ZSBvcHRpb25zIChmYXN0L2ltbXV0YWJsZSkgYXJlIGluc3RlYWQgZXZhbHVhdGVkIGF0IGVhY2ggd3JpdGUnc1xuICAgIC8vIHRpbWUsIHNlZSBnZXRXcml0ZUNvbmZpZy9hc3NlcnRNdXRhYmxlLiB1bmRlZmluZWQgd2hlbiB0aGUgY29uZmlnIGRvZXNuJ3QgbWVudGlvbiB1cy5cbiAgICBzZWxmOiBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgc3RvcmU6IElCdWNrZXRTdG9yZTtcbn07XG5cbmNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+PigpO1xuXG4vLyBzZXRUaW1lb3V0IGNhbm5vdCByZXByZXNlbnQgbG9uZ2VyIGRlbGF5czsgbW9yZSBkaXN0YW50IHdpbmRvdyBib3VuZGFyaWVzIHJlLWNoZWNrIGFmdGVyIHRoaXNcbmNvbnN0IE1BWF9SRUJVSUxEX1RJTUVSX0RFTEFZID0gMiAqKiAzMSAtIDE7XG4vLyBSZWJ1aWxkIHNsaWdodGx5IGFmdGVyIHRoZSBib3VuZGFyeSwgc28gdGhlIG5ld2x5LXZhbGlkIGVudHJ5IGlzIHVuYW1iaWd1b3VzbHkgYWN0aXZlXG5jb25zdCBSRUJVSUxEX0JPVU5EQVJZX0JVRkZFUiA9IDEwMDA7XG5cbmZ1bmN0aW9uIGdldEJ1Y2tldEZvbGRlcihhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkuZm9sZGVyLCBcImJ1Y2tldHMyXCIsIGFjY291bnQsIGJ1Y2tldE5hbWUpO1xufVxuXG4vLyBQb3J0cyB3ZSBhcmUgbGlzdGVuaW5nIG9uIGJleW9uZCB0aGUgbWFpbiBjb25maWcgcG9ydCAtIGEgZGVwbG95LXRha2VvdmVyIHN1Y2Nlc3NvciBzZXJ2ZXMgb24gYVxuLy8gdGVtcG9yYXJ5IGFsdGVybmF0ZSBwb3J0LCBhbmQgbXVzdCByZWNvZ25pemUgYWx0ZXJuYXRlLXBvcnQgc291cmNlIFVSTHMgYXMgaXRzZWxmXG5jb25zdCBleHRyYUxpc3RlblBvcnRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5leHBvcnQgZnVuY3Rpb24gYWRkRXh0cmFMaXN0ZW5Qb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGV4dHJhTGlzdGVuUG9ydHMuYWRkKHBvcnQpO1xufVxuZnVuY3Rpb24gZmluZFNlbGZJbmRleGVzKHJvdXRpbmc6IFJlbW90ZUNvbmZpZywgYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgbGV0IGluZGV4ZXM6IG51bWJlcltdID0gW107XG4gICAgLy8gVGhlIHRha2VvdmVyJ3MgYWx0ZXJuYXRlIHBvcnQgaXMgdGhlIE9USEVSIHByb2Nlc3Mgb2YgdGhlIHN3aXRjaG92ZXIsIG9uIE9VUiBtYWNoaW5lIHdpdGhcbiAgICAvLyBPVVIgZGlzayAtIHNlbGYgZm9yIHN5bmMgcHVycG9zZXMgb24gYm90aCBzaWRlcyAodGhlIG9sZCBub2RlIG11c3Qgbm90IHNjYW4vcHVzaCBpdHMgb3duXG4gICAgLy8gc3VjY2Vzc29yOyB0aGUgc2hhcmVkIGZvbGRlciBwbHVzIHRoZSBzd2l0Y2hvdmVyIGRpc2sgc2NhbnMgcmVjb25jaWxlIHRoZW0pXG4gICAgbGV0IHRha2VvdmVyQWx0UG9ydCA9IGdldFRha2VvdmVyQWx0UG9ydCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGluZy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSByb3V0aW5nLnNvdXJjZXNbaV07XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IHNvdXJjZS50eXBlICE9PSBcInJlbW90ZVwiKSBjb250aW51ZTtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHNvdXJjZS51cmwpO1xuICAgICAgICBpZiAocGFyc2VkLmFkZHJlc3MgIT09IGRvbWFpbiB8fCBwYXJzZWQuYWNjb3VudCAhPT0gYWNjb3VudCB8fCBwYXJzZWQuYnVja2V0TmFtZSAhPT0gYnVja2V0TmFtZSkgY29udGludWU7XG4gICAgICAgIGlmIChwYXJzZWQucG9ydCA9PT0gcG9ydCB8fCBleHRyYUxpc3RlblBvcnRzLmhhcyhwYXJzZWQucG9ydCkgfHwgcGFyc2VkLnBvcnQgPT09IHRha2VvdmVyQWx0UG9ydCkge1xuICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleGVzO1xufVxuXG4vLyBUaGUgZW50cnkgd2hvc2UgdmFsaWQgd2luZG93IGNvbnRhaW5zIHRoZSB0aW1lIChhbW9uZyB0aGUgZW50cmllcyBjb3ZlcmluZyB0aGUga2V5J3Mgcm91dGUsXG4vLyB3aGVuIG9uZSBpcyBnaXZlbiAtIGEgc2VydmVyIGNhbiBob2xkIGRpZmZlcmVudCBzaGFyZHMgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucykuIEhhbGYtb3BlblxuLy8gKFtzdGFydCwgZW5kKSksIHNvIGNsZWFuIGJyZWFrcyByZXNvbHZlIHVuYW1iaWd1b3VzbHkuIEZhbGxzIGJhY2sgdG8gdGhlIG5lYXJlc3Qgd2luZG93IHdoZW5cbi8vIG5vbmUgY29udGFpbnMgdGhlIHRpbWUgLSBnYXBzIHNob3VsZG4ndCBleGlzdCwgYnV0IGEgd3JpdGUgbXVzdCBzdGlsbCByZXNvbHZlIHRvIFNPTUVcbi8vIGNvbmZpZ3VyYXRpb24uXG5mdW5jdGlvbiBzZWxlY3RFbnRyeUF0KGVudHJpZXM6IEhvc3RlZENvbmZpZ1tdLCB0aW1lOiBudW1iZXIsIHJvdXRlPzogbnVtYmVyKTogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgY292ZXJpbmcgPSBlbnRyaWVzLmZpbHRlcih4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgaWYgKGNvdmVyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgZW50cmllcyA9IGNvdmVyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjb250YWluaW5nID0gZW50cmllcy5maW5kKHggPT4geC52YWxpZFdpbmRvd1swXSA8PSB0aW1lICYmIHRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICBpZiAoY29udGFpbmluZykgcmV0dXJuIGNvbnRhaW5pbmc7XG4gICAgbGV0IGJlc3Q6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBsZXQgZGlzdGFuY2UgPSBNYXRoLm1pbihNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMF0pLCBNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMV0pKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XG4gICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgIGJlc3QgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdDtcbn1cblxuLy8gQnVja2V0IG9wdGlvbnMgY2FuIGNoYW5nZSBvdmVyIHRpbWUgKG11bHRpcGxlIHNlbGYgZW50cmllcyB3aXRoIGRpZmZlcmVudCB2YWxpZCB3aW5kb3dzKSwgYW5kXG4vLyB0aGUgc3RydWN0dXJhbCBvbmVzIChyYXdEaXNrLCB0aGUgZG93bnN0cmVhbSBsaXN0KSBhcmUgYmFrZWQgaW50byB0aGUgc3RvcmUgLSBzbyB0aGUgc3RvcmUgaXNcbi8vIHJlYnVpbHQgc2hvcnRseSBhZnRlciBlYWNoIG9mIG91ciB3aW5kb3cgYm91bmRhcmllcyBwYXNzZXMsIG1ha2luZyB0aGUgbmV3bHktdmFsaWQgZW50cnkgYXBwbHkuXG5mdW5jdGlvbiBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZChsb2FkZWQ6IExvYWRlZEJ1Y2tldCk6IHZvaWQge1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBib3VuZGFyaWVzID0gbG9hZGVkLnNlbGZFbnRyaWVzLmZsYXRNYXAoeCA9PiB4LnZhbGlkV2luZG93KS5maWx0ZXIodCA9PiB0ID4gbm93KTtcbiAgICBpZiAoIWJvdW5kYXJpZXMubGVuZ3RoKSByZXR1cm47XG4gICAgbGV0IG5leHRCb3VuZGFyeSA9IE1hdGgubWluKC4uLmJvdW5kYXJpZXMpO1xuICAgIGxldCBrZXkgPSBgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX1gO1xuICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBBIHJvdXRpbmcgY2hhbmdlIG1heSBoYXZlIGFscmVhZHkgcmVwbGFjZWQgdGhpcyBzdG9yZTsgb25seSBJVCBnZXRzIGEgYm91bmRhcnkgdGltZXJcbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gYXdhaXQgYnVja2V0cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBsb2FkZWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIDwgbmV4dEJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQobG9hZGVkLmFjY291bnQsIGxvYWRlZC5idWNrZXROYW1lLCB7IGZvcmNlOiB0cnVlLCByZWFzb246IFwiYSB2YWxpZCB3aW5kb3cgYm91bmRhcnkgcGFzc2VkXCIgfSk7XG4gICAgICAgIH0pKCk7XG4gICAgfSwgTWF0aC5taW4obmV4dEJvdW5kYXJ5IC0gbm93ICsgUkVCVUlMRF9CT1VOREFSWV9CVUZGRVIsIE1BWF9SRUJVSUxEX1RJTUVSX0RFTEFZKSk7XG4gICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRCdWNrZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHJvdXRpbmc6IFJlbW90ZUNvbmZpZyk6IExvYWRlZEJ1Y2tldCB7XG4gICAgbGV0IGZvbGRlciA9IGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAvLyBUaGUgZGVwbG95LXRha2VvdmVyIHJlbWFwIGlzIGFuIElOVEVSUFJFVEFUSU9OIG92ZXJsYXk6IGV2ZXJ5dGhpbmcgYmVoYXZpb3JhbCAoc2VsZiBlbnRyaWVzLFxuICAgIC8vIHdpbmRvd3MsIGRvd25zdHJlYW0gc291cmNlcykgdXNlcyB0aGUgcmVtYXBwZWQgdmlldywgd2hpbGUgbG9hZGVkLnJvdXRpbmcvcm91dGluZ0pTT04gc3RheVxuICAgIC8vIHRoZSBTVE9SRUQgY29uZmlnIC0gc28gdmVyc2lvbiBndWFyZHMsIGNoYW5nZSBkZXRlY3Rpb24sIGFuZCBzeW5jaHJvbml6YXRpb24gbmV2ZXIgc2VlIChvclxuICAgIC8vIHBlcnNpc3QpIHRoZSByZW1hcFxuICAgIGxldCBlZmZlY3RpdmUgPSBhcHBseURlcGxveVJlbWFwKHJvdXRpbmcpO1xuICAgIGxldCBzZWxmSW5kZXhlcyA9IGZpbmRTZWxmSW5kZXhlcyhlZmZlY3RpdmUsIGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxldCBzZWxmRW50cmllcyA9IHNlbGZJbmRleGVzLm1hcChpID0+IGVmZmVjdGl2ZS5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZyk7XG4gICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KHNlbGZFbnRyaWVzLCBEYXRlLm5vdygpKTtcbiAgICBsZXQgc2VsZkluZGV4ID0gLTE7XG4gICAgaWYgKHNlbGYpIHtcbiAgICAgICAgc2VsZkluZGV4ID0gZWZmZWN0aXZlLnNvdXJjZXMuaW5kZXhPZihzZWxmKTtcbiAgICB9XG4gICAgbGV0IHN0b3JlOiBJQnVja2V0U3RvcmU7XG4gICAgaWYgKHNlbGY/LnJhd0Rpc2spIHtcbiAgICAgICAgc3RvcmUgPSBuZXcgQXJjaGl2ZXNEaXNrKGZvbGRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3VyIG93biBkaXNrIGlzIHRoZSBiYXNlIHNvdXJjZTsgb25seSB0aGUgcm91dGluZyBlbnRyaWVzIERPV05TVFJFQU0gZnJvbSB1cyAoYWZ0ZXIgb3VyXG4gICAgICAgIC8vIGN1cnJlbnRseS12YWxpZCBlbnRyeSkgYmVjb21lIHN5bmNocm9uaXphdGlvbiBzb3VyY2VzLiBVcHN0cmVhbSBzb3VyY2VzIHN5bmMgZnJvbSB1cywgc29cbiAgICAgICAgLy8gd3JpdGluZyB0byBvciBzY2FubmluZyB0aGVtIHdvdWxkIGp1c3QgZWNobyBvdXIgb3duIGRhdGEgYmFjayAoYW5kIG1ha2Ugb3VyIGF2YWlsYWJpbGl0eVxuICAgICAgICAvLyBkZXBlbmQgb24gdGhlaXJzKS4gQSBzZXJ2ZXIgTk9UIGluIHRoZSBsaXN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYnVja2V0OiBpdCBrZWVwc1xuICAgICAgICAvLyBpdHMgZGlzayBkYXRhICh0aGUgY29uZmlnIG1heSByZS1hZGQgaXQpLCBidXQgc3RvcHMgYWxsIHN5bmNocm9uaXphdGlvbiAtIG5vIG9uZVxuICAgICAgICAvLyBjb250YWN0cyBhIHJlbW92ZWQgc291cmNlLCBhbmQgc2Nhbm5pbmcvcHVzaGluZyBhcyBpZiB3ZSB3ZXJlIHN0aWxsIG9uZSB3b3VsZCBmaWdodCB0aGVcbiAgICAgICAgLy8gcmVhbCBjaGFpbi4gVGhlIGNvbmZpZy1sZXZlbCB2YWxpZFdpbmRvdyByaWRlcyBvbiBlYWNoIEFyY2hpdmVzU291cmNlOyB0aGUgZGlzayBzb3VyY2VcbiAgICAgICAgLy8gc2hhcmVzIG91ciBjdXJyZW50bHktdmFsaWQgZW50cnkncyB3aW5kb3cgKGl0IGhvbGRzIG91ciBjb3B5IG9mIHRoZSBkYXRhKS5cbiAgICAgICAgbGV0IG93bkluZGV4ZXMgPSBuZXcgU2V0KHNlbGZJbmRleGVzKTtcbiAgICAgICAgLy8gT3VyIG93biBkaXNrIGdldHMgbm8gcm91dGUgZmlsdGVyOiBldmVyeXRoaW5nIGl0IGhvbGRzIGlzIG91cnMgdG8gaW5kZXggYW5kIHNlcnZlXG4gICAgICAgIGxldCBzb3VyY2VzOiBBcmNoaXZlc1NvdXJjZVtdID0gW3tcbiAgICAgICAgICAgIHNvdXJjZTogbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpLFxuICAgICAgICAgICAgdmFsaWRXaW5kb3c6IHNlbGY/LnZhbGlkV2luZG93IHx8IEZVTExfVkFMSURfV0lORE9XLFxuICAgICAgICB9XTtcbiAgICAgICAgaWYgKHNlbGZJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaGlzIHNlcnZlciBpcyBub3QgaW4gdGhlIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OyBrZWVwaW5nIGl0cyBkYXRhIG9uIGRpc2sgYnV0IG5vIGxvbmdlciBzeW5jaHJvbml6aW5nIGl0YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc2VsZkluZGV4ICsgMTsgaSA8IGVmZmVjdGl2ZS5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IGVmZmVjdGl2ZS5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IG93bkluZGV4ZXMuaGFzKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBEaXNqb2ludC1zaGFyZCBzb3VyY2VzIG5ldmVyIHRhbGsgdG8gZWFjaCBvdGhlcjsgYSBwYXJ0aWFsIG92ZXJsYXAgc3luY3Mgb25seVxuICAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlcnNlY3Rpb24gKHNjYW5zIGlnbm9yZSB0aGUgcmVzdCwgd3JpdGVzIG9ubHkgc2VuZCBtYXRjaGluZyBrZXlzKVxuICAgICAgICAgICAgICAgIGxldCBzaGFyZWRSb3V0ZSA9IHJvdXRlSW50ZXJzZWN0aW9uKHNlbGY/LnJvdXRlLCBzb3VyY2Uucm91dGUpO1xuICAgICAgICAgICAgICAgIGlmICghc2hhcmVkUm91dGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEEgYm91bmRlZC1jYWNoZSBzZXJ2ZXIgKG5vRnVsbFN5bmMgb24gb3VyIG93biBlbnRyeSkgbXVzdCBub3QgZnVsbC1zeW5jIGZyb21cbiAgICAgICAgICAgICAgICAvLyBBTlkgc291cmNlLCBvciBpdHMgZGlzayB3b3VsZCBmaWxsIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpbWl0XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHsgc291cmNlOiBjcmVhdGVBcGlBcmNoaXZlcyhzb3VyY2UpLCB2YWxpZFdpbmRvdzogc291cmNlLnZhbGlkV2luZG93LCByb3V0ZTogc2hhcmVkUm91dGUsIG5vRnVsbFN5bmM6IHNvdXJjZS5ub0Z1bGxTeW5jIHx8IHNlbGY/Lm5vRnVsbFN5bmMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmUgPSBuZXcgQmxvYlN0b3JlKGZvbGRlciwgc291cmNlcywge1xuICAgICAgICAgICAgb25JbmRleENoYW5nZWQ6IGtleSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZXMgZm9yIG91ciBvd24gcm91dGluZyB3cml0ZXMgQU5EIHJvdXRpbmcgZmlsZXMgcHVsbGVkIGluIHZpYSBzeW5jaHJvbml6YXRpb25cbiAgICAgICAgICAgICAgICAvLyAob25seSBldmVyIG5ld2VyIG9uZXMsIHNlZSBJQXJjaGl2ZXMuc2V0KSDigJQgZWl0aGVyIHdheSwgYXBwbHkgdGhlIG5ldyBjb25maWdcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2b2lkIHNjaGVkdWxlUm91dGluZ1JlbG9hZChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHNlbGY/LnJlYWRlckRpc2tMaW1pdCxcbiAgICAgICAgICAgIGdldEZsdXNoRGVhZGxpbmUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkOiBMb2FkZWRCdWNrZXQgPSB7IGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcsIHJvdXRpbmdKU09OOiBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSwgc2VsZkVudHJpZXMsIHNlbGYsIHN0b3JlIH07XG4gICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkKTtcbiAgICByZXR1cm4gbG9hZGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgZGF0YSA9IGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5nZXQoUk9VVElOR19GSUxFKTtcbiAgICBpZiAoIWRhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIHBhcnNlUm91dGluZ0RhdGEoZGF0YSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9hZGVkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGxvYWRlZCA9IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgbG9hZGVkID0gbG9hZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBsb2FkZWQpO1xuICAgICAgICAvLyBNaXNzaW5nIGJ1Y2tldHMgYXJlIG5vdCBjYWNoZWQg4oCUIHRoZXkgY2FuIGJlIGNyZWF0ZWQgYXQgYW55IHRpbWUgKGd1YXJkaW5nIGFnYWluc3QgYVxuICAgICAgICAvLyBjb25jdXJyZW50IGNyZWF0ZSBoYXZpbmcgYWxyZWFkeSByZXBsYWNlZCBvdXIgZW50cnkpXG4gICAgICAgIHZvaWQgbG9hZGVkLnRoZW4oYnVja2V0ID0+IHtcbiAgICAgICAgICAgIGlmICghYnVja2V0ICYmIGJ1Y2tldHMuZ2V0KGtleSkgPT09IGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIGJ1Y2tldHMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgIGlmIChidWNrZXRzLmdldChrZXkpID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBidWNrZXRzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvYWRlZDtcbn1cblxuLy8gUm91dGluZyByZWxvYWRzIGFyZSBzZXJpYWxpemVkIHBlciBidWNrZXQsIHNvIGNvbmN1cnJlbnQgd3JpdGVzL3N5bmNzIGNhbid0IHJlYnVpbGQgdGhlIHNhbWVcbi8vIHN0b3JlIHR3aWNlIGluIHBhcmFsbGVsXG5jb25zdCByb3V0aW5nUmVsb2FkcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuZnVuY3Rpb24gc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBjb25maWc/OiB7IGZvcmNlPzogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IG5leHQgPSAocm91dGluZ1JlbG9hZHMuZ2V0KGtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICAgIC50aGVuKCgpID0+IGNoZWNrUm91dGluZ0NoYW5nZWQoYWNjb3VudCwgYnVja2V0TmFtZSwgY29uZmlnKSlcbiAgICAgICAgLmNhdGNoKGUgPT4gY29uc29sZS5lcnJvcihgUmVsb2FkaW5nIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDpgLCBlKSk7XG4gICAgcm91dGluZ1JlbG9hZHMuc2V0KGtleSwgbmV4dCk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUm91dGluZ0NoYW5nZWQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgZm9yY2U/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgYnVja2V0cy5nZXQoa2V5KTtcbiAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgIC8vIGdldCgpIGNhY2hlLXJlYWRzIHRoZSBmaWxlIG9udG8gb3VyIGRpc2sgd2hlbiBhIHJlbW90ZSBzb3VyY2UgaG9sZHMgaXQsIHNvIHRoZSBidWNrZXQgc3RpbGxcbiAgICAvLyBleGlzdHMgYWZ0ZXIgYSByZXN0YXJ0XG4gICAgbGV0IGRhdGEgPSBhd2FpdCBsb2FkZWQuc3RvcmUuZ2V0KFJPVVRJTkdfRklMRSk7XG4gICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgbGV0IHJvdXRpbmcgPSBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgIGlmICghY29uZmlnPy5mb3JjZSAmJiBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSA9PT0gbG9hZGVkLnJvdXRpbmdKU09OKSByZXR1cm47XG4gICAgaWYgKGNvbmZpZz8uZm9yY2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlYnVpbGRpbmcgdGhlIHN0b3JlIGZvciBidWNrZXQgJHtrZXl9ICgke2NvbmZpZy5yZWFzb24gfHwgXCJmb3JjZWRcIn0pYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJvdXRpbmcgY29uZmlnIGNoYW5nZWQgZm9yIGJ1Y2tldCAke2tleX0sIHJlYnVpbGRpbmcgaXRzIHN0b3JlYCk7XG4gICAgfVxuICAgIGlmIChsb2FkZWQuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpIHtcbiAgICAgICAgYXdhaXQgbG9hZGVkLnN0b3JlLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUoYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZykpKTtcbn1cblxuLy8gUGVyLXdyaXRlIG9wdGlvbnMgYXJlIGV2YWx1YXRlZCBhdCB0aGUgV1JJVEUncyB0aW1lIChhbmQgdGhlIGtleSdzIHJvdXRlKSwgbm90IHRoZSBjdXJyZW50XG4vLyBjb25maWc6IHRoZSB3cml0ZSB0aW1lIGlzIHN0YW1wZWQgZXhhY3RseSBvbmNlIChhdCB0aGUgZmlyc3Qgbm9kZSB0aGF0IHJlY2VpdmVzIHRoZSB3cml0ZSkgYW5kXG4vLyBwcm9wYWdhdGVzIHdpdGggdGhlIGRhdGEsIHNvIGV2ZXJ5IG5vZGUgcmVzb2x2ZXMgdGhlIHNhbWUgc2VsZiBlbnRyeSAtIGFuZCB0aGUgc2FtZSBvcHRpb25zLlxuZnVuY3Rpb24gZ2V0V3JpdGVDb25maWcoYnVja2V0OiBMb2FkZWRCdWNrZXQsIHdyaXRlVGltZTogbnVtYmVyLCByb3V0ZTogbnVtYmVyKTogeyBmYXN0PzogYm9vbGVhbjsgd3JpdGVEZWxheT86IG51bWJlciB9IHtcbiAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQoYnVja2V0LnNlbGZFbnRyaWVzLCB3cml0ZVRpbWUsIHJvdXRlKTtcbiAgICByZXR1cm4geyBmYXN0OiBzZWxmPy5mYXN0LCB3cml0ZURlbGF5OiBzZWxmPy53cml0ZURlbGF5IH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRNdXRhYmxlKGJ1Y2tldDogTG9hZGVkQnVja2V0LCBmaWxlUGF0aDogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdChidWNrZXQuc2VsZkVudHJpZXMsIHdyaXRlVGltZSwgZ2V0Um91dGUoZmlsZVBhdGgpKTtcbiAgICBpZiAoIXNlbGY/LmltbXV0YWJsZSkgcmV0dXJuO1xuICAgIGlmIChhd2FpdCBidWNrZXQuc3RvcmUuZ2V0SW5mbyhmaWxlUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHtidWNrZXQuYWNjb3VudH0vJHtidWNrZXQuYnVja2V0TmFtZX0gaXMgaW1tdXRhYmxlIChhdCB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSkgYW5kICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSBhbHJlYWR5IGV4aXN0cywgc28gaXQgY2Fubm90IGJlIHdyaXR0ZW4gdG9gKTtcbiAgICB9XG59XG5cbi8vIFdyb25nLXRhcmdldCByZWplY3Rpb25zIGFyZSByYXJlIGFuZCBpbXBvcnRhbnQgKHRoZXkgQVJFIHRoZSBzd2l0Y2hvdmVyIGhhbmRvZmYpLCBidXQgYSBidXJzdCBvZlxuLy8gcmFjaW5nIHdyaXRlcyBhdCBhIGJvdW5kYXJ5IG11c3Qgbm90IGZsb29kIHRoZSBsb2cgLSBzbyBhdCBtb3N0IG9uZSBsaW5lIGEgbWludXRlXG5jb25zdCBXUk9OR19UQVJHRVRfTE9HX1RIUk9UVExFID0gNjAgKiAxMDAwO1xubGV0IGxhc3RXcm9uZ1RhcmdldExvZyA9IDA7XG5mdW5jdGlvbiBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RXcm9uZ1RhcmdldExvZyA8IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUpIHJldHVybjtcbiAgICBsYXN0V3JvbmdUYXJnZXRMb2cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xufVxuXG4vLyBSb3V0aW5nIHdyaXRlcyBhcmUgc2VyaWFsaXplZCBwZXIgYnVja2V0LCBzbyB0d28gY29uY3VycmVudCBjcmVhdGVzIGNhbid0IGJvdGggYnVpbGQgYSBzdG9yZVxuLy8gKHRoZSBsb3NlcidzIHN0b3JlIHdvdWxkIGxlYWsgd2l0aCBpdHMgc3luYyBsb29wcyBydW5uaW5nIGZvcmV2ZXIpXG5jb25zdCByb3V0aW5nV3JpdGVzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUm91dGluZ0NvbmZpZyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIC8vIFZhbGlkYXRlcyBiZWZvcmUgc3RvcmluZyBhbnl0aGluZywgc28gYSBiYWQgY29uZmlnIGNhbid0IGJyaWNrIHRoZSBidWNrZXRcbiAgICBsZXQgaW5jb21pbmcgPSBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgYXdhaXQgbmV3IEFyY2hpdmVzRGlzayhnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUoYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgaW5jb21pbmcpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDcmVhdGVkIGJ1Y2tldCAke2tleX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIGNoYW5nZWQgY29uZmlnIG11c3QgY2FycnkgYSBoaWdoZXIgdmVyc2lvbiB0aGFuIHRoZSBvbmUgY3VycmVudGx5IHN0b3JlZCDigJQgb3RoZXJ3aXNlIHR3b1xuICAgIC8vIGNsaWVudHMgd2l0aCBkaWZmZXJlbnQgY29uZmlncyBhdCB0aGUgc2FtZSB2ZXJzaW9uIHdvdWxkIGtlZXAgY2xvYmJlcmluZyBlYWNoIG90aGVyLiBTYW1lXG4gICAgLy8gY29udGVudCBhdCBhbnkgdmVyc2lvbiBpcyBhIGhhcm1sZXNzIG5vLW9wIGFuZCBpcyBhbGxvd2VkIHRocm91Z2guXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KGluY29taW5nKSAhPT0gbG9hZGVkLnJvdXRpbmdKU09OICYmIGdldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpIDw9IGdldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVwZGF0ZSByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7a2V5fTogdGhlIG5ldyBjb25maWcgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IG9uZSBidXQgaXRzIHZlcnNpb24gKCR7Z2V0Q29uZmlnVmVyc2lvbihpbmNvbWluZyl9KSBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHZlcnNpb24gKCR7Z2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZyl9KS4gSW5jcmVtZW50IHRoZSB2ZXJzaW9uIHRvIHVwZGF0ZSBpdC4gQ3VycmVudDogJHtsb2FkZWQucm91dGluZ0pTT059LiBBdHRlbXB0ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpfWApO1xuICAgIH1cbiAgICAvLyBSb3V0aW5nIHdyaXRlcyBieXBhc3MgZmFzdCBtb2RlICh0aGUgY29uZmlnIG11c3QgYXBwbHkgaW1tZWRpYXRlbHkgYW5kIHN1cnZpdmUgYSBjcmFzaClcbiAgICAvLyBhbmQgaWdub3JlIGltbXV0YWJsZSAodGhlIHJvdXRpbmcgZmlsZSBtdXN0IGFsd2F5cyBzdGF5IHVwZGF0YWJsZSkuIEFuIG9sZGVyIGxhc3RNb2RpZmllZFxuICAgIC8vIG5vLW9wcyBpbnNpZGUgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSByZWxvYWQgYmVsb3cgc2VlcyBubyBjaGFuZ2UuXG4gICAgYXdhaXQgbG9hZGVkLnN0b3JlLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUJ1Y2tldEZpbGUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICBpZiAoZmlsZVBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgICAgIGxldCBydW4gPSAocm91dGluZ1dyaXRlcy5nZXQoa2V5KSB8fCBQcm9taXNlLnJlc29sdmUoKSkudGhlbigoKSA9PiB3cml0ZVJvdXRpbmdDb25maWcoYWNjb3VudCwgYnVja2V0TmFtZSwgZGF0YSwgY29uZmlnKSk7XG4gICAgICAgIC8vIFRoZSBjaGFpbiBtdXN0IHN1cnZpdmUgYSBmYWlsZWQgd3JpdGUsIHNvIHRoZSBzdG9yZWQgbGluayBzd2FsbG93cyB0aGUgZXJyb3IgKHRoZSBjYWxsZXJcbiAgICAgICAgLy8gc3RpbGwgZ2V0cyBpdCBmcm9tIHJ1bilcbiAgICAgICAgcm91dGluZ1dyaXRlcy5zZXQoa2V5LCBydW4udGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVuO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSBkb2VzIG5vdCBleGlzdC4gV3JpdGUgaXRzIHJvdXRpbmcgY29uZmlnIHRvICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gdG8gY3JlYXRlIGl0LmApO1xuICAgIH1cbiAgICAvLyBUaGUgd3JpdGUgdGltZSBpcyBkZXRlcm1pbmVkIGV4YWN0bHkgb25jZSwgSEVSRSBhdCB0aGUgZmlyc3Qgbm9kZSB0aGF0IHJlY2VpdmVzIHRoZSB3cml0ZTtcbiAgICAvLyBpdCBwcm9wYWdhdGVzIGFzIGxhc3RNb2RpZmllZCwgc28gZXZlcnkgbm9kZSBldmFsdWF0ZXMgdGhlIGJ1Y2tldCBvcHRpb25zIGF0IHRoZSBzYW1lIGluc3RhbnRcbiAgICBsZXQgd3JpdGVUaW1lID0gY29uZmlnPy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKTtcbiAgICAvLyBPbmx5IGZyZXNobHktc3RhbXBlZCB3cml0ZXMgYXJlIGNoZWNrZWQ6IGEgd3JpdGUgd2l0aCBhbiBleHBsaWNpdCBsYXN0TW9kaWZpZWQgaXNcbiAgICAvLyBzeW5jaHJvbml6YXRpb24vYmFja2ZpbGwgKG9sZCBkYXRhIGxlZ2l0aW1hdGVseSBsYW5kcyBvbiBzb3VyY2VzIHdob3NlIHdpbmRvdyBoYXMgbW92ZWQgb24pLFxuICAgIC8vIGJ1dCBhIGZyZXNoIHdyaXRlIHJlYWNoaW5nIHVzIG91dHNpZGUgb3VyIHdpbmRvd3Mvcm91dGVzIG1lYW5zIHRoZSBjbGllbnQgcmVzb2x2ZWQgaXRzXG4gICAgLy8gdGFyZ2V0IGZyb20gYSBzdGFsZSB2aWV3IC0gaXQgbXVzdCByZS1yZXNvbHZlIGFuZCByZXRyeSBhdCB0aGUgY29ycmVjdCBzb3VyY2UuXG4gICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoZmlsZVBhdGgpO1xuICAgIGlmICghY29uZmlnPy5sYXN0TW9kaWZpZWQgJiYgbG9hZGVkLnNlbGZFbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICBsZXQgdGltZVZhbGlkID0gbG9hZGVkLnNlbGZFbnRyaWVzLmZpbHRlcih4ID0+IHdyaXRlVGltZSA+PSB4LnZhbGlkV2luZG93WzBdIC0gV1JJVEVfUEFTVF9XSU5ET1dfR1JBQ0UgJiYgd3JpdGVUaW1lIDw9IHgudmFsaWRXaW5kb3dbMV0gKyBXUklURV9QQVNUX1dJTkRPV19HUkFDRSk7XG4gICAgICAgIGlmICghdGltZVZhbGlkLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gdG8gYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfTogd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAoJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBpcyBvdXRzaWRlIGFsbCBvdXIgdmFsaWQgd2luZG93cyAke0pTT04uc3RyaW5naWZ5KGxvYWRlZC5zZWxmRW50cmllcy5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9IGV2ZW4gd2l0aCB0aGUgJHtXUklURV9QQVNUX1dJTkRPV19HUkFDRX1tcyBncmFjZSAoYSBzd2l0Y2hvdmVyIG1vdmVkIHRoZSB3cml0ZSB0YXJnZXQpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1d9IFRoaXMgc2VydmVyIGlzIG5vdCBhIHZhbGlkIHdyaXRlIHRhcmdldCBhdCAke3dyaXRlVGltZX0gZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gKG91ciB2YWxpZCB3aW5kb3dzOiAke0pTT04uc3RyaW5naWZ5KGxvYWRlZC5zZWxmRW50cmllcy5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9KS4gUmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5IHZhbGlkIHNvdXJjZSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aW1lVmFsaWQuc29tZSh4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKSkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gdG8gYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfTogcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBvdXIgcm91dGVzICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSBhdCB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICh0aGUgY2xpZW50J3Mgc2hhcmQgY29uZmlnIGlzIHN0YWxlKWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfUk9VVEV9IFRoaXMgc2VydmVyIGRvZXMgbm90IGhhbmRsZSByb3V0ZSAke3JvdXRlfSAoa2V5ICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSkgZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gKG91ciByb3V0ZXMgYXQgdGhpcyB0aW1lOiAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBhc3NlcnRNdXRhYmxlKGxvYWRlZCwgZmlsZVBhdGgsIHdyaXRlVGltZSk7XG4gICAgYXdhaXQgbG9hZGVkLnN0b3JlLnNldChmaWxlUGF0aCwgZGF0YSwgeyAuLi5nZXRXcml0ZUNvbmZpZyhsb2FkZWQsIHdyaXRlVGltZSwgcm91dGUpLCBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1Y2tldENvbmZpZyhidWNrZXQ6IExvYWRlZEJ1Y2tldCk6IEFyY2hpdmVzQ29uZmlnIHtcbiAgICBsZXQgcHJvZ3Jlc3MgPSBidWNrZXQuc3RvcmUuZ2V0U3luY1Byb2dyZXNzPy4oKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogISFidWNrZXQuc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyLFxuICAgICAgICAvLyBUaGUgcmVtYXBwZWQgKGludGVycHJldGF0aW9uKSB2aWV3OiBnZXRDb25maWcgaXMgaG93IGNsaWVudHMgbGVhcm4gb2YgYW4gaW4tcHJvZ3Jlc3NcbiAgICAgICAgLy8gZGVwbG95IHRha2VvdmVyLCBzaW5jZSB0aGUgcmVtYXAgaXMgbmV2ZXIgd3JpdHRlbiBpbnRvIHRoZSByb3V0aW5nIGZpbGUgaXRzZWxmXG4gICAgICAgIHJlbW90ZUNvbmZpZzogYXBwbHlEZXBsb3lSZW1hcChidWNrZXQucm91dGluZyksXG4gICAgICAgIGluZGV4OiBwcm9ncmVzcz8uaW5kZXgsXG4gICAgICAgIGluZGV4U291cmNlczogcHJvZ3Jlc3M/LnNvdXJjZXMsXG4gICAgICAgIHJlYWRlckRpc2tMaW1pdDogcHJvZ3Jlc3M/LnJlYWRlckRpc2tMaW1pdCxcbiAgICAgICAgc3luY2luZzogcHJvZ3Jlc3M/LnN5bmNpbmcsXG4gICAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYnVpbGRBbGxMb2FkZWRCdWNrZXRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IGtleSBvZiBbLi4uYnVja2V0cy5rZXlzKCldKSB7XG4gICAgICAgIGxldCBzbGFzaCA9IGtleS5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgYXdhaXQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGtleS5zbGljZSgwLCBzbGFzaCksIGtleS5zbGljZShzbGFzaCArIDEpLCB7IGZvcmNlOiB0cnVlLCByZWFzb246IFwiZGVwbG95IHRha2VvdmVyIHN0YXRlIGNoYW5nZWRcIiB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNjYW5BbGxMb2FkZWRCdWNrZXREaXNrcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZyhgRGVwbG95IHN3aXRjaG92ZXIgZGlzayByZXNjYW4gc3RhcnRpbmcgKCR7YnVja2V0cy5zaXplfSBsb2FkZWQgYnVja2V0cykgLSBjYXRjaGluZyBmaWxlcyB0aGUgb3RoZXIgcHJvY2VzcyB3cm90ZWApO1xuICAgIGZvciAobGV0IGxvYWRlZFByb21pc2Ugb2YgWy4uLmJ1Y2tldHMudmFsdWVzKCldKSB7XG4gICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCBsb2FkZWRQcm9taXNlLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICghbG9hZGVkKSBjb250aW51ZTtcbiAgICAgICAgbGV0IHN0b3JlID0gbG9hZGVkLnN0b3JlO1xuICAgICAgICBpZiAoIShzdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSkpIGNvbnRpbnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgc3RvcmUucmVzY2FuQmFzZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBEZXBsb3kgc3dpdGNob3ZlciBkaXNrIHJlc2NhbiBmYWlsZWQgZm9yIGJ1Y2tldCAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxub25UYWtlb3ZlckV2ZW50KGV2ZW50ID0+IHtcbiAgICBpZiAoZXZlbnQgPT09IFwicmVtYXBDaGFuZ2VkXCIpIHtcbiAgICAgICAgdm9pZCByZWJ1aWxkQWxsTG9hZGVkQnVja2V0cygpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQgPT09IFwiZGlza1NjYW5cIikge1xuICAgICAgICB2b2lkIHJlc2NhbkFsbExvYWRlZEJ1Y2tldERpc2tzKCk7XG4gICAgfVxufSk7XG5cbmV4cG9ydCB0eXBlIFNlcnZlckJ1Y2tldEluZm8gPSB7XG4gICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgIC8vIExvYWRlZCBpbiBtZW1vcnkgKGNyZWF0ZWQgb3IgYWNjZXNzZWQgc2luY2Ugc3RhcnR1cCksIHNvIGl0cyBzeW5jaHJvbml6YXRpb24gaXMgcnVubmluZ1xuICAgIGFjdGl2ZTogYm9vbGVhbjtcbiAgICBjb25maWc/OiBBcmNoaXZlc0NvbmZpZztcbiAgICBlcnJvcj86IHN0cmluZztcbn07XG5cbi8qKiBFdmVyeSBidWNrZXQgdGhlIGFjY291bnQgaGFzIG9uIHRoaXMgc2VydmVyLCBhY3RpdmUgb3Igbm90LCBlYWNoIHdpdGggaXRzIGNvbmZpZ3VyYXRpb24uXG4gKiAgSW5hY3RpdmUgYnVja2V0cyBhcmUgaW5zcGVjdGVkIHN0cmFpZ2h0IGZyb20gZGlzayBXSVRIT1VUIGxvYWRpbmcgdGhlbSAtIGxvYWRpbmcgd291bGQgc3RhcnRcbiAqICB0aGVpciBzeW5jaHJvbml6YXRpb24sIGFuZCBvbGQgaW52YWxpZCBidWNrZXRzIG11c3Qgc3RheSBpbmVydCAodGhlaXIgcGFyc2UgZXJyb3IgaXMgcmVwb3J0ZWRcbiAqICBpbnN0ZWFkKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0QWNjb3VudEJ1Y2tldHMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICBsZXQgYWNjb3VudEZvbGRlciA9IHBhdGguam9pbihnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkuZm9sZGVyLCBcImJ1Y2tldHMyXCIsIGFjY291bnQpO1xuICAgIGxldCBuYW1lczogc3RyaW5nW107XG4gICAgdHJ5IHtcbiAgICAgICAgbmFtZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGFjY291bnRGb2xkZXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxldCByZXN1bHRzOiBTZXJ2ZXJCdWNrZXRJbmZvW10gPSBbXTtcbiAgICBmb3IgKGxldCBidWNrZXROYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgIGxldCBsb2FkZWRQcm9taXNlID0gYnVja2V0cy5nZXQoYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWApO1xuICAgICAgICBpZiAobG9hZGVkUHJvbWlzZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgbG9hZGVkID0gYXdhaXQgbG9hZGVkUHJvbWlzZTtcbiAgICAgICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogdHJ1ZSwgY29uZmlnOiBnZXRCdWNrZXRDb25maWcobG9hZGVkKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogdHJ1ZSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKSB9KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBuZXcgQXJjaGl2ZXNEaXNrKGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKSkuZ2V0KFJPVVRJTkdfRklMRSk7XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goeyBidWNrZXROYW1lLCBhY3RpdmU6IGZhbHNlLCBlcnJvcjogYE5vIHJvdXRpbmcgZmlsZSAoJHtST1VUSU5HX0ZJTEV9KWAgfSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goeyBidWNrZXROYW1lLCBhY3RpdmU6IGZhbHNlLCBjb25maWc6IHsgcmVtb3RlQ29uZmlnOiBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpIH0gfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCkgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVCdWNrZXRGaWxlKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZpbGVQYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgZGVsZXRlZCAob3ZlcndyaXRlIGl0IHRvIGNoYW5nZSB0aGUgYnVja2V0J3MgY29uZmlndXJhdGlvbilgKTtcbiAgICB9XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5kZWwoZmlsZVBhdGgsIGdldFdyaXRlQ29uZmlnKGxvYWRlZCwgRGF0ZS5ub3coKSwgZ2V0Um91dGUoZmlsZVBhdGgpKSk7XG59XG5cbi8vIOKUgOKUgCBsb2NhbCBJQXJjaGl2ZXMgYWNjZXNzIOKUgOKUgFxuXG5jb25zdCBMQVJHRV9GSUxFX1BBUlRfU0laRSA9IDggKiAxMDI0ICogMTAyNDtcblxuLy8gVGhlIGluLXByb2Nlc3MgSUFyY2hpdmVzIGZvciBhIGJ1Y2tldCBob3N0ZWQgYnkgVEhJUyBzZXJ2ZXIg4oCUIHVzZWQgd2hlbiBhIFJlbW90ZUNvbmZpZyBzb3VyY2Vcbi8vIFVSTCBwb2ludHMgYXQgb3Vyc2VsdmVzLCBzbyB3ZSBkb24ndCB0YWxrIHRvIG91cnNlbHZlcyBvdmVyIEhUVFBTLiBPbmUgc2luZ2xldG9uIHBlciBidWNrZXQuXG5jbGFzcyBBcmNoaXZlc0xvY2FsQnVja2V0IGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFjY291bnQ6IHN0cmluZywgcHJpdmF0ZSBidWNrZXROYW1lOiBzdHJpbmcpIHsgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCdWNrZXQoKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldExvYWRlZEJ1Y2tldCh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGBsb2NhbEJ1Y2tldC8ke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9YDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHdyaXRlQnVja2V0RmlsZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUsIGRhdGEsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGRlbGV0ZUJ1Y2tldEZpbGUodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGZpbGVOYW1lKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHt0aGlzLmFjY291bnR9LyR7dGhpcy5idWNrZXROYW1lfSBkb2VzIG5vdCBleGlzdC4gV3JpdGUgaXRzIHJvdXRpbmcgY29uZmlnIHRvICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gdG8gY3JlYXRlIGl0LmApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGFzc2VydE11dGFibGUoYnVja2V0LCBjb25maWcucGF0aCwgRGF0ZS5ub3coKSk7XG4gICAgICAgIGxldCBpZCA9IGF3YWl0IGJ1Y2tldC5zdG9yZS5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBkYXRhLmxlbmd0aDsgb2Zmc2V0ICs9IExBUkdFX0ZJTEVfUEFSVF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1Y2tldC5zdG9yZS5hcHBlbmRMYXJnZVVwbG9hZChpZCwgZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIExBUkdFX0ZJTEVfUEFSVF9TSVpFKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmZpbmlzaExhcmdlVXBsb2FkKGlkLCBjb25maWcucGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGF3YWl0IGJ1Y2tldC5zdG9yZS5jYW5jZWxMYXJnZVVwbG9hZChpZCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRJbmZvKGZpbGVOYW1lKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpKS5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgeyBkb21haW4sIHBvcnQgfSA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkRmlsZVVybChgaHR0cHM6Ly8ke2RvbWFpbn06JHtwb3J0fS9maWxlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYWNjb3VudCl9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYnVja2V0TmFtZSl9YCwgZmlsZVBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIC8vIE1pc3NpbmcgYnVja2V0cyBzYXkgdHJ1ZSwgbWF0Y2hpbmcgd2hhdCB0aGV5IGJlY29tZSBvbmNlIGNyZWF0ZWQgKHRoZSBkZWZhdWx0IHN0b3JlIHR5cGUpXG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4geyBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdHJ1ZSB9O1xuICAgICAgICByZXR1cm4gZ2V0QnVja2V0Q29uZmlnKGJ1Y2tldCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIodGltZTogbnVtYmVyKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiBbXTtcbiAgICAgICAgaWYgKCFidWNrZXQuc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9IGRvZXMgbm90IHN1cHBvcnQgZ2V0Q2hhbmdlc0FmdGVyIChyYXdEaXNrIGJ1Y2tldHMgaGF2ZSBubyBpbmRleClgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldENoYW5nZXNBZnRlcih0aW1lKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldFN5bmNTdGF0dXMoKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4geyBhbGxTY2Fuc0NvbXBsZXRlOiB0cnVlLCBpbmRleFNpemU6IDAsIHNvdXJjZXM6IFtdIH07XG4gICAgICAgIGlmICghYnVja2V0LnN0b3JlLmdldFN5bmNTdGF0dXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRTeW5jU3RhdHVzIChyYXdEaXNrIGJ1Y2tldHMgaGF2ZSBubyBzeW5jaHJvbml6YXRpb24pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRTeW5jU3RhdHVzKCk7XG4gICAgfVxufVxuXG5jb25zdCBsb2NhbEFyY2hpdmVzID0gbmV3IE1hcDxzdHJpbmcsIElBcmNoaXZlcz4oKTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbEFyY2hpdmVzKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogSUFyY2hpdmVzIHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGV4aXN0aW5nID0gbG9jYWxBcmNoaXZlcy5nZXQoa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICBsZXQgYXJjaGl2ZXMgPSBuZXcgQXJjaGl2ZXNMb2NhbEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsb2NhbEFyY2hpdmVzLnNldChrZXksIGFyY2hpdmVzKTtcbiAgICByZXR1cm4gYXJjaGl2ZXM7XG59XG4iXX0=
639
+ /* _JS_SOURCE_HASH = "402031dccdec8240738cc0e925ab3eba5418ec4451931e02728ba3466ed912f9"; */
@@ -53,7 +53,7 @@ export class SourceWrapper {
53
53
  let wrapper = new SourceWrapper(config, options?.background !== false);
54
54
  if (config.type === "backblaze") {
55
55
  if (await hasBackblazeCreds()) {
56
- wrapper.api = new ArchivesBackblaze({ bucketName: parseBackblazeUrl(config.url).bucketName, public: config.public, immutable: config.immutable });
56
+ wrapper.api = new ArchivesBackblaze({ bucketName: parseBackblazeUrl(config.url).bucketName, public: config.public, immutable: config.immutable, allowedOrigins: config.allowedOrigins });
57
57
  } else if (isNode()) {
58
58
  wrapper.writeBlocked = `No backblaze credentials for ${config.url}. Provide backblaze.json.applicationKeyId and backblaze.json.applicationKey via getSecret to enable API access.`;
59
59
  } else {
@@ -93,7 +93,7 @@ export class SourceWrapper {
93
93
  let endText = end === Number.MAX_SAFE_INTEGER && "forever" || new Date(end).toISOString();
94
94
  parts.push(`validWindow [${startText}, ${endText}]`);
95
95
  }
96
- return `source/${this.config.url}${parts.length && ` (${parts.join(", ")})` || ""}`;
96
+ return `source ${this.config.url}${parts.length && ` (${parts.join(", ")})` || ""}`;
97
97
  }
98
98
 
99
99
  public isConnected(): boolean {
@@ -10,17 +10,19 @@ A client adopts a routing config once, during initialization, and then runs on i
10
10
 
11
11
  Every store fully rescans its sources' metadata (on startup and periodically), and every write — including deletions — is ordered by last-write time. Deletions are tombstones: an empty file IS a missing file, kept as a size-0 index entry (for a week) so the deletion itself propagates and reconciles like any other write. Because everything is a timestamped write and scans are bidirectional (pull what they have, push what they're missing), any two sources can be merged in any order and converge to the same state: newest write time wins, per file. There is no operation whose loss corrupts the system — a failed background write, a missed delete, a source that was down for a day — the next scan reconciles it.
12
12
 
13
- ## The full source list is duplicated into every source
13
+ ## storage/storagerouting.json Has the routing config and is duplicated on every node.
14
14
 
15
15
  Each bucket stores its complete routing config (the full redundancy list) inside itself, at storage/storagerouting.json, on every source. Discovery is therefore trivial: as long as ONE node is up, a client reading it gets the full overview of the intended sources. And because clients re-discover on every startup (and re-read every 5 minutes), a developer can change the configuration in one place and clients rapidly accept it — no redeploy, no coordinated restart of the fleet.
16
16
 
17
+ If the client tries to do a write where the valid state is far enough away or the sharding is wrong, it will re-download the routing config throttled, so it only does this at most once every 30 seconds, and retry the request.
18
+
17
19
  ## BulkDatabase2 index + our own disk as just another source
18
20
 
19
21
  Each bucket's store keeps a BulkDatabase2 index of every file (path, write time, size, holding source), served from memory — existence checks and listings are extremely fast, never touching a source. The trick that keeps the index accurate: our own disk is not special-cased, it is simply the first synchronization source. The same scan/reconcile code that synchronizes remote sources also synchronizes the disk with the index, so the index self-heals from the same machinery instead of needing separate consistency logic.
20
22
 
21
23
  ## Metadata first, data second
22
24
 
23
- Synchronization starts with metadata: every source's full listing (path, write time, size) is scanned into the index up front. This is fast and small, so a server very quickly knows exactly what exists everywhere and can act as a consistent authority on the bucket (serving correct reads, listings, and existence checks by fetching bytes from whichever source holds them) long before it has downloaded the actual data. The data then follows: eagerly by default (the full sync), or when there is simply too much data to copy in noFullSync mode, where the disk is only a lazy read cache. Either way consistency is unchanged: the index is complete, writes still go to all the servers, and only where the bytes rest differs.
25
+ We have an index that says where our data is, which we load immediately. Therefore, we can start acting as the authority immediately. And then we do a fast sync based on all of our sources, one of them being a disk source, in order to update this. This means that almost all the time we are immediately ready, and if anything is out of sync, we'll find it as quickly as possible. The index and our syncs just synchronize which files exist, their write times, and their sizes, which is almost always sufficient to characterize a unique state, while being very fast, and supported for all sources (backblaze, etc).
24
26
 
25
27
  ## Client writes are consistent; client reads are redundant
26
28
 
@@ -29,3 +31,19 @@ Clients always write to the same node — the first source whose valid window is
29
31
  ## Trust instead of API keys
30
32
 
31
33
  Machines authenticate with their certs.ts identity (proving ownership of their machine key with a signed, server-bound token), and access is granted per account to specific machineIds. No API keys are minted, copied into configs, or passed around — granting a machine access is one command on the storage machine, and revoking it is removing the trust record. The only API keys left in the system are the ones third parties force on us: backblaze and cloudflare, both resolved through getSecret.
34
+
35
+ ## storage/storagerouting.json is a special file
36
+
37
+ This is our special file that stores the routing information. We write it directly to each node. The client side tries to keep an updated version of these (that's mentioned earlier And is how the client can keep up to date even if the client's code isn't up to date, As long as at least one of the sources is still alive).
38
+
39
+ IMPORTANTLY! This special file is never synchronized between different storage nodes. It's only directly written to, and it's only read off of our disk. It can be written to on any node. We don't take into account the valid state window or the shard. We still do take into account the write time, though, the latest write time wins. We only allow writes if version >= the previous version.
40
+
41
+ ## fast writes
42
+
43
+ We support a flag that does fast writes, which will cause us to batch all the writes in memory, Returning from the set call immediately. This allows you to do many writes to the same file with very little disk I/O. This uses a configurable delay amount. You could set it to zero and then we just won't delay it at all, and we'll flush everything to the disk immediately away.
44
+
45
+ The deploy system will tell us if it's intending to switch over a source, which we use to create a virtual valid state window in the middle that uses a different port.
46
+
47
+ We look at the valid state windows and we make sure we never delay past the valid state window. In fact, if we are within five minutes of being invalid due to the valid state window, we flush the writes immediately. That way, when the next valid window starts running, the writes will be already on disk.
48
+
49
+ We also do scans when we are coming up to the valid state window. If we are going to be the new valid state window, both before, a little bit after, and farther after. This helps the switch over be smoother so we get all of the trailing writes. These scans use our ability to ask for the changes since a certain time. We do the scan on the right write node. The write node is always the first available node.
@@ -6,10 +6,15 @@ export declare const REMOTE_STORAGE_CLASS_GUID = "RemoteStorageController-b7e42a
6
6
  export declare const STORAGE_AUTH_PURPOSE = "remoteStorage-auth-1";
7
7
  export declare const STORAGE_NOT_AUTHENTICATED = "REMOTE_STORAGE_NOT_AUTHENTICATED_cf2f7b1e";
8
8
  export declare const STORAGE_ACCESS_DENIED = "REMOTE_STORAGE_ACCESS_DENIED_9d81a4c0";
9
+ export type AuthTokenData = {
10
+ purpose: string;
11
+ time: number;
12
+ server: string;
13
+ };
9
14
  export type AuthToken = {
10
15
  certPem: string;
11
- time: number;
12
16
  signature: string;
17
+ data: AuthTokenData;
13
18
  };
14
19
  export type AccessRequest = {
15
20
  requestId: string;
@@ -37,10 +37,17 @@ const AUTH_TIME_WINDOW = timeInMinute * 10;
37
37
  const MAX_SESSIONS = 100 * 1000;
38
38
  const MAX_REQUESTS_PER_IP = 50;
39
39
 
40
+ export type AuthTokenData = {
41
+ purpose: string;
42
+ time: number;
43
+ // The address the client dialed. The port varies freely (deploy takeovers serve on alternate
44
+ // ports); only the domain is security-relevant, as it is what the cert binds to.
45
+ server: string;
46
+ };
40
47
  export type AuthToken = {
41
48
  certPem: string;
42
- time: number;
43
49
  signature: string;
50
+ data: AuthTokenData;
44
51
  };
45
52
  export type AccessRequest = {
46
53
  requestId: string;
@@ -158,14 +165,23 @@ class RemoteStorageControllerBase {
158
165
  async authenticate(token: AuthToken): Promise<{ machineId: string; ip: string }> {
159
166
  let { domain, port } = getStorageServerConfig();
160
167
  let caller = SocketFunction.getCaller();
161
- if (Math.abs(Date.now() - token.time) > AUTH_TIME_WINDOW) {
162
- throw new Error(`Auth token time is too far from the server time (token ${token.time}, server ${Date.now()}, allowed drift ${AUTH_TIME_WINDOW}ms)`);
168
+ // First establish that the signature signs the data exactly as the client sent it, THEN
169
+ // validate the data's fields. The two steps must never be mixed - reconstructing the
170
+ // payload from expectations conflates "is this signed" with "is this acceptable".
171
+ verify(token.certPem, token.signature, token.data);
172
+ let { purpose, time, server } = token.data;
173
+ if (purpose !== STORAGE_AUTH_PURPOSE) {
174
+ throw new Error(`Auth token purpose is ${JSON.stringify(purpose)}, expected ${JSON.stringify(STORAGE_AUTH_PURPOSE)}`);
175
+ }
176
+ if (Math.abs(Date.now() - time) > AUTH_TIME_WINDOW) {
177
+ throw new Error(`Auth token time is too far from the server time (token ${time}, server ${Date.now()}, allowed drift ${AUTH_TIME_WINDOW}ms)`);
178
+ }
179
+ // Clients sign the address they dialed. The port varies freely (deploy takeovers serve on
180
+ // alternate ports); the domain is the replay boundary, so only it must match us.
181
+ let tokenDomain = server.split(":")[0];
182
+ if (tokenDomain !== domain) {
183
+ throw new Error(`Auth token is for server ${JSON.stringify(server)}, but this server is ${JSON.stringify(`${domain}:${port}`)}`);
163
184
  }
164
- verify(token.certPem, token.signature, {
165
- purpose: STORAGE_AUTH_PURPOSE,
166
- time: token.time,
167
- server: `${domain}:${port}`,
168
- });
169
185
  let machineId = getCommonName(token.certPem).split(".")[0];
170
186
  if (!verifyMachineIdForPublicKey({ machineId, publicKey: getPublicIdentifier(token.certPem) })) {
171
187
  throw new Error(`Certificate common name ${JSON.stringify(getCommonName(token.certPem))} does not match its public key`);
@@ -42,7 +42,6 @@ export declare function writeBucketFile(account: string, bucketName: string, fil
42
42
  }): Promise<void>;
43
43
  export declare function getBucketConfig(bucket: LoadedBucket): ArchivesConfig;
44
44
  export declare function rebuildAllLoadedBuckets(): Promise<void>;
45
- export declare function rescanAllLoadedBucketDisks(): Promise<void>;
46
45
  export type ServerBucketInfo = {
47
46
  bucketName: string;
48
47
  active: boolean;