@dbx-tools/model 0.9.40 → 0.9.46

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.
@@ -18,16 +18,13 @@ import * as environmentUtils from "@dbx-tools/shared-core/environment-utils";
18
18
  import * as log from "@dbx-tools/shared-core/log";
19
19
  import cacache from "cacache";
20
20
  import envPaths from "env-paths";
21
+ import packageManifest from "../package.json" with { type: "json" };
21
22
  import { MODEL_METADATA_TTL_MS } from "./_metadata-contract.js";
22
23
  const logger = log.logger("model/metadata-cache");
23
- let packageIdentityPromise;
24
- function packageIdentity() {
25
- packageIdentityPromise ??= import("../index.js").then((mod) => ({
26
- identifier: mod.PACKAGE_IDENTIFIER,
27
- version: mod.PACKAGE_VERSION,
28
- }));
29
- return packageIdentityPromise;
30
- }
24
+ const PACKAGE_IDENTITY = {
25
+ identifier: packageManifest.name,
26
+ version: packageManifest.version,
27
+ };
31
28
  const inflight = new Map();
32
29
  /** Default cacache root for a package version under the dbx-tools cache dir. */
33
30
  export function defaultMetadataCacheDir(version) {
@@ -164,7 +161,7 @@ export function createMetadataCache(options) {
164
161
  async function resolveCacheDir(options) {
165
162
  if (options.cacheDir)
166
163
  return options.cacheDir;
167
- const version = options.version ?? (await packageIdentity()).version;
164
+ const version = options.version ?? PACKAGE_IDENTITY.version;
168
165
  return defaultMetadataCacheDir(version);
169
166
  }
170
167
  /** Prefer a non-empty fresh array, else previous, else fallback. */
@@ -231,4 +228,4 @@ function isCacheMiss(error) {
231
228
  "code" in error &&
232
229
  error.code === "ENOENT");
233
230
  }
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSwwQ0FBMEMsQ0FBQztBQUM3RSxPQUFPLEtBQUssR0FBRyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xELE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBT2xELElBQUksc0JBQTRELENBQUM7QUFFakUsU0FBUyxlQUFlO0lBQ3RCLHNCQUFzQixLQUFLLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsVUFBVSxFQUFFLEdBQUcsQ0FBQyxrQkFBa0I7UUFDbEMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxlQUFlO0tBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ0osT0FBTyxzQkFBc0IsQ0FBQztBQUNoQyxDQUFDO0FBMERELE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO0FBRXJELGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsdUJBQXVCLENBQUMsT0FBZTtJQUNyRCxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ25FLE9BQU8sT0FBTyxDQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFD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QU8sQ0FBQyxDQUFDO0lBQzNCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBSSxJQUFZO0lBQ25DLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBWSxDQUFDO1FBQzVELElBQ0UsQ0FBQyxNQUFNO1lBQ1AsT0FBTyxNQUFNLEtBQUssUUFBUTtZQUMxQixPQUFRLE1BQWlDLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFDbEUsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLE1BQWdDLENBQUM7SUFDMUMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYztJQUNqQyxPQUFPLE9BQU8sQ0FDWixLQUFLO1FBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixNQUFNLElBQUksS0FBSztRQUNkLEtBQTJCLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FDL0MsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnbm9zdGljIGRhaWx5IG1ldGFkYXRhIGNhY2hlIG9uIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9jYWNhY2hlIHwgY2FjYWNoZX0uXG4gKlxuICogVXNlcyBjYWNhY2hlJ3MgYnVpbHQtaW4gbWVtb3J5IG1lbW9pemF0aW9uIChgbWVtb2l6ZTogdHJ1ZWAgb24gcHV0OyBnZXRzIHJlYWRcbiAqIHRoZSBpbi1tZW1vcnkgbGF5ZXIgYnkgZGVmYXVsdCkgd2l0aCBjb250ZW50LWFkZHJlc3NlZCBkaXNrIHVuZGVyXG4gKiBgZW52LXBhdGhzKFwiZGJ4LXRvb2xzXCIpLmNhY2hlL21vZGVsLWdhdGV3YXkvPHZlcnNpb24+L2AuIERpc2sgcGVyc2lzdGVuY2UgaXNcbiAqIGRpc2FibGVkIGluc2lkZSBhIERhdGFicmlja3MgQXBwICh7QGxpbmsgZW52aXJvbm1lbnRVdGlscy5pc0RhdGFicmlja3NBcHBFbnZ9KTtcbiAqIHRob3NlIHByb2Nlc3NlcyBrZWVwIGEgcHJvY2Vzcy1sb2NhbCBNYXAgb25seS5cbiAqXG4gKiBFYWNoIGNhY2hlIG93bnMgYSBrZXksIGhhcmQtY29kZWQgZmFsbGJhY2ssIG9wdGlvbmFsIG5ldHdvcmsgbG9hZGVyLCBhbmQgYVxuICogbWVyZ2VyIHRoYXQgY29tYmluZXMgZnJlc2ggLyBwcmV2aW91cyAvIGZhbGxiYWNrIHZhbHVlcy4gRnJlc2huZXNzIGlzIHRoZVxuICogZW52ZWxvcGUgYHJlZnJlc2hlZEF0YCB3aW5kb3cgKGRlZmF1bHQgb25lIGRheSksIG5vdCBjYWNhY2hlJ3Mgc2hvcnQgTFJVIFRUTC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0ICogYXMgZW52aXJvbm1lbnRVdGlscyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9lbnZpcm9ubWVudC11dGlsc1wiO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2xvZ1wiO1xuaW1wb3J0IGNhY2FjaGUgZnJvbSBcImNhY2FjaGVcIjtcbmltcG9ydCBlbnZQYXRocyBmcm9tIFwiZW52LXBhdGhzXCI7XG5cbmltcG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUyB9IGZyb20gXCIuL19tZXRhZGF0YS1jb250cmFjdC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibW9kZWwvbWV0YWRhdGEtY2FjaGVcIik7XG5cbmludGVyZmFjZSBQYWNrYWdlSWRlbnRpdHkge1xuICByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxubGV0IHBhY2thZ2VJZGVudGl0eVByb21pc2U6IFByb21pc2U8UGFja2FnZUlkZW50aXR5PiB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGFja2FnZUlkZW50aXR5KCk6IFByb21pc2U8UGFja2FnZUlkZW50aXR5PiB7XG4gIHBhY2thZ2VJZGVudGl0eVByb21pc2UgPz89IGltcG9ydChcIi4uL2luZGV4LnRzXCIpLnRoZW4oKG1vZCkgPT4gKHtcbiAgICBpZGVudGlmaWVyOiBtb2QuUEFDS0FHRV9JREVOVElGSUVSLFxuICAgIHZlcnNpb246IG1vZC5QQUNLQUdFX1ZFUlNJT04sXG4gIH0pKTtcbiAgcmV0dXJuIHBhY2thZ2VJZGVudGl0eVByb21pc2U7XG59XG5cbi8qKiBFbnZlbG9wZSBzdG9yZWQgYXMgSlNPTiBieXRlcyBpbiBjYWNhY2hlIGZvciBldmVyeSBrZXkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4ge1xuICByZWFkb25seSByZWZyZXNoZWRBdDogbnVtYmVyO1xuICByZWFkb25seSB2YWx1ZTogVDtcbn1cblxuLyoqIEZhY3RvcnkgaW5wdXRzIGZvciBvbmUgbmFtZWQgbWV0YWRhdGEgY2FjaGUuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhQ2FjaGVPcHRpb25zPFQ+IHtcbiAgLyoqIFN0YWJsZSBjYWNhY2hlIGtleS4gKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIC8qKiBIYXJkLWNvZGVkIC8gY29tbWl0dGVkIGJhc2VsaW5lIHVzZWQgd2hlbiBzdG9yZSBhbmQgbG9hZCBib3RoIG1pc3MuICovXG4gIHJlYWRvbmx5IGZhbGxiYWNrOiBUO1xuICAvKipcbiAgICogUmVmcmVzaCBzb3VyY2UuIFdoZW4gb21pdHRlZCB0aGUgY2FjaGUgb25seSBzZXJ2ZXMgc3RvcmUgKyBmYWxsYmFjayBhbmRcbiAgICoge0BsaW5rIE1ldGFkYXRhQ2FjaGUudXBkYXRlfSBtdXRhdGlvbnMgKGZvciBleGFtcGxlIGVycm9yLWxlYXJuZWQgdmFsdWVzKS5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWQ/OiAoKSA9PiBQcm9taXNlPFQ+O1xuICAvKiogQ29tYmluZSBhIGZyZXNoIGxvYWQsIHByaW9yIHN0b3JlIHZhbHVlLCBhbmQgdGhlIGhhcmQtY29kZWQgZmFsbGJhY2suICovXG4gIHJlYWRvbmx5IG1lcmdlOiAoaW5wdXQ6IE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PFQ+KSA9PiBUO1xuICAvKiogRnJlc2huZXNzIHdpbmRvdzsgZGVmYXVsdHMgdG8ge0BsaW5rIE1PREVMX01FVEFEQVRBX1RUTF9NU30gKG9uZSBkYXkpLiAqL1xuICByZWFkb25seSB0dGxNcz86IG51bWJlcjtcbiAgLyoqIFBhY2thZ2UgdmVyc2lvbiBzZWdtZW50IGluIHRoZSBjYWNoZSBwYXRoLiBEZWZhdWx0cyB0byB0aGlzIHBhY2thZ2UuICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKiBPdmVycmlkZSB0aGUgY2FjYWNoZSByb290IGRpcmVjdG9yeSAodGVzdHMpLiAqL1xuICByZWFkb25seSBjYWNoZURpcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEZvcmNlIGRpc2sgb24vb2ZmLiBEZWZhdWx0cyB0byBvZmYgaW5zaWRlIERhdGFicmlja3MgQXBwcywgb24gb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzaz86IGJvb2xlYW47XG4gIC8qKiBDbG9jayBvdmVycmlkZSBmb3IgdGVzdHMuICovXG4gIHJlYWRvbmx5IG5vdz86ICgpID0+IG51bWJlcjtcbn1cblxuLyoqIEFyZ3VtZW50cyBwYXNzZWQgdG8gYSBjYWNoZSBtZXJnZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PFQ+IHtcbiAgcmVhZG9ubHkgZnJlc2g6IFQgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHByZXZpb3VzOiBUIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBmYWxsYmFjazogVDtcbn1cblxuLyoqIE9uZSB2ZXJzaW9uZWQgbWV0YWRhdGEgY2FjaGUgKGNhY2FjaGUgbWVtb3J5ICsgb3B0aW9uYWwgZGlzaykuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhQ2FjaGU8VD4ge1xuICAvKiogQWJzb2x1dGUgY2FjYWNoZSByb290IGZvciB0aGlzIHBhY2thZ2UgdmVyc2lvbiAodW51c2VkIHdoZW4gZGlzayBpcyBvZmYpLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIGNhY2FjaGUgZGlzayBwZXJzaXN0ZW5jZSBpcyBlbmFibGVkIGZvciB0aGlzIGluc3RhbmNlLiAqL1xuICByZWFkb25seSBkaXNrRW5hYmxlZDogYm9vbGVhbjtcbiAgLyoqIFJldHVybiBhIGZyZXNoLW9yLWZhbGxiYWNrIHZhbHVlLCByZWZyZXNoaW5nIHdoZW4gc3RhbGUuICovXG4gIGdldCgpOiBQcm9taXNlPFQ+O1xuICAvKiogUmVhZCBtZW1vcnkgLyBkaXNrIHdpdGhvdXQgcmVmcmVzaGluZy4gKi9cbiAgcGVlaygpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuICAvKiogTXV0YXRlIHRoZSBjYWNoZWQgdmFsdWUgYW5kIHBlcnNpc3QgaXQuICovXG4gIHVwZGF0ZShtdXRhdG9yOiAoY3VycmVudDogVCkgPT4gVCk6IFByb21pc2U8VD47XG4gIC8qKiBGb3JjZSBhIHJlZnJlc2ggYXR0ZW1wdCBldmVuIHdoZW4gdGhlIGVudHJ5IGlzIHN0aWxsIGZyZXNoLiAqL1xuICByZWZyZXNoKCk6IFByb21pc2U8VD47XG59XG5cbmNvbnN0IGluZmxpZ2h0ID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG5cbi8qKiBEZWZhdWx0IGNhY2FjaGUgcm9vdCBmb3IgYSBwYWNrYWdlIHZlcnNpb24gdW5kZXIgdGhlIGRieC10b29scyBjYWNoZSBkaXIuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdE1ldGFkYXRhQ2FjaGVEaXIodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnkgPSBlbnZQYXRocyhcImRieC10b29sc1wiLCB7IHN1ZmZpeDogXCJcIiB9KS5jYWNoZTtcbiAgcmV0dXJuIHJlc29sdmUoY2FjaGVEaXJlY3RvcnksIFwibW9kZWwtZ2F0ZXdheVwiLCB2ZXJzaW9uKTtcbn1cblxuLyoqIFdoZXRoZXIgbWV0YWRhdGEgY2FjaGVzIHNob3VsZCBwZXJzaXN0IHRvIGRpc2sgaW4gdGhpcyBwcm9jZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGFkYXRhQ2FjaGVEaXNrRW5hYmxlZChlbnZpcm9ubWVudDogTm9kZUpTLlByb2Nlc3NFbnYgPSBwcm9jZXNzLmVudik6IGJvb2xlYW4ge1xuICByZXR1cm4gIWVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52KGVudmlyb25tZW50KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgb25lIGRhaWx5IGNhY2hlIGJhY2tlZCBieSBjYWNhY2hlIG1lbW9pemF0aW9uLCB3aXRoIG9wdGlvbmFsIGRpc2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXRhZGF0YUNhY2hlPFQ+KG9wdGlvbnM6IE1ldGFkYXRhQ2FjaGVPcHRpb25zPFQ+KTogTWV0YWRhdGFDYWNoZTxUPiB7XG4gIGNvbnN0IHR0bE1zID0gb3B0aW9ucy50dGxNcyA/PyBNT0RFTF9NRVRBREFUQV9UVExfTVM7XG4gIGNvbnN0IGRpc2tFbmFibGVkID0gb3B0aW9ucy5kaXNrID8/IG1ldGFkYXRhQ2FjaGVEaXNrRW5hYmxlZCgpO1xuICBjb25zdCBub3cgPSBvcHRpb25zLm5vdyA/PyBEYXRlLm5vdztcbiAgY29uc3QgcGF0aFByb21pc2UgPSByZXNvbHZlQ2FjaGVEaXIob3B0aW9ucyk7XG4gIGxldCBwYXRoID0gb3B0aW9ucy5jYWNoZURpcjtcblxuICBjb25zdCBmbGlnaHRLZXkgPSAoY2FjaGVQYXRoOiBzdHJpbmcsIHN1ZmZpeCA9IFwiXCIpOiBzdHJpbmcgPT5cbiAgICBgJHtjYWNoZVBhdGh9Ojoke29wdGlvbnMua2V5fSR7c3VmZml4fWA7XG5cbiAgLyoqIFByb2Nlc3MtbG9jYWwgc3RvcmUgdXNlZCB3aGVuIGRpc2sgaXMgb2ZmIChEYXRhYnJpY2tzIEFwcHMpLiAqL1xuICBjb25zdCBtZW1vcnlPbmx5ID0gbmV3IE1hcDxzdHJpbmcsIE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4+KCk7XG5cbiAgY29uc3QgcmVzb2x2ZVZhbHVlID0gKGlucHV0OiBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxUPik6IFQgPT4gb3B0aW9ucy5tZXJnZShpbnB1dCk7XG5cbiAgY29uc3QgaXNGcmVzaCA9IChyZWNvcmQ6IE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4gfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gICAgQm9vbGVhbihyZWNvcmQgJiYgbm93KCkgLSByZWNvcmQucmVmcmVzaGVkQXQgPCB0dGxNcyk7XG5cbiAgY29uc3QgY2FjaGVQYXRoID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgcGF0aCA/Pz0gYXdhaXQgcGF0aFByb21pc2U7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH07XG5cbiAgY29uc3QgcmVhZFJlY29yZCA9IGFzeW5jICgpOiBQcm9taXNlPE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICBpZiAoIWRpc2tFbmFibGVkKSByZXR1cm4gbWVtb3J5T25seS5nZXQob3B0aW9ucy5rZXkpO1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IGNhY2hlUGF0aCgpO1xuICAgIHRyeSB7XG4gICAgICAvLyBjYWNhY2hlIHJlYWRzIGl0cyBpbi1tZW1vcnkgbWVtbyBmaXJzdCB1bmxlc3MgbWVtb2l6ZSBpcyBmYWxzZVxuICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCBjYWNhY2hlLmdldChyZXNvbHZlZFBhdGgsIG9wdGlvbnMua2V5KTtcbiAgICAgIHJldHVybiBkZWNvZGVSZWNvcmQ8VD4oZW50cnkuZGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0NhY2hlTWlzcyhlcnJvcikpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBsb2dnZXIud2FybihcIm1ldGFkYXRhIGNhY2hlIGNhY2FjaGUgcmVhZCBmYWlsZWRcIiwge1xuICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICBwYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB3cml0ZVJlY29yZCA9IGFzeW5jIChyZWNvcmQ6IE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIWRpc2tFbmFibGVkKSB7XG4gICAgICBtZW1vcnlPbmx5LnNldChvcHRpb25zLmtleSwgcmVjb3JkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gYXdhaXQgY2FjaGVQYXRoKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNhY2FjaGUucHV0KHJlc29sdmVkUGF0aCwgb3B0aW9ucy5rZXksIGAke0pTT04uc3RyaW5naWZ5KHJlY29yZCl9XFxuYCwge1xuICAgICAgICBtZW1vaXplOiB0cnVlLFxuICAgICAgICBtZXRhZGF0YTogeyByZWZyZXNoZWRBdDogcmVjb3JkLnJlZnJlc2hlZEF0IH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oXCJtZXRhZGF0YSBjYWNoZSBjYWNhY2hlIHdyaXRlIGZhaWxlZFwiLCB7XG4gICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcGVyc2lzdCA9IGFzeW5jICh2YWx1ZTogVCwgcmVmcmVzaGVkQXQgPSBub3coKSk6IFByb21pc2U8VD4gPT4ge1xuICAgIGF3YWl0IHdyaXRlUmVjb3JkKHsgcmVmcmVzaGVkQXQsIHZhbHVlIH0pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICBjb25zdCByZWZyZXNoID0gYXN5bmMgKGZvcmNlOiBib29sZWFuKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gYXdhaXQgY2FjaGVQYXRoKCk7XG4gICAgcmV0dXJuIGNvYWxlc2NlKGZsaWdodEtleShyZXNvbHZlZFBhdGgpLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHJlYWRSZWNvcmQoKTtcbiAgICAgIGlmICghZm9yY2UgJiYgaXNGcmVzaChwcmV2aW91cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVWYWx1ZSh7XG4gICAgICAgICAgZnJlc2g6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwcmV2aW91czogcHJldmlvdXM/LnZhbHVlLFxuICAgICAgICAgIGZhbGxiYWNrOiBvcHRpb25zLmZhbGxiYWNrLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbGV0IGZyZXNoOiBUIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG9wdGlvbnMubG9hZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZyZXNoID0gYXdhaXQgb3B0aW9ucy5sb2FkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oXCJtZXRhZGF0YSBjYWNoZSByZWZyZXNoIGZhaWxlZDsga2VlcGluZyBsYXN0IGtub3duIGdvb2RcIiwge1xuICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgICAgZGlza0VuYWJsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSByZXNvbHZlVmFsdWUoe1xuICAgICAgICBmcmVzaCxcbiAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzPy52YWx1ZSxcbiAgICAgICAgZmFsbGJhY2s6IG9wdGlvbnMuZmFsbGJhY2ssXG4gICAgICB9KTtcbiAgICAgIGlmIChmcmVzaCAhPT0gdW5kZWZpbmVkIHx8ICFwcmV2aW91cykge1xuICAgICAgICBhd2FpdCBwZXJzaXN0KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGdldCBwYXRoKCkge1xuICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1ldGFkYXRhIGNhY2hlIHBhdGggaXMgbm90IHJlc29sdmVkIHVudGlsIHRoZSBmaXJzdCBjYWNoZSByZWFkXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSxcbiAgICBkaXNrRW5hYmxlZCxcbiAgICBnZXQ6ICgpID0+IHJlZnJlc2goZmFsc2UpLFxuICAgIHBlZWs6IGFzeW5jICgpID0+IChhd2FpdCByZWFkUmVjb3JkKCkpPy52YWx1ZSxcbiAgICByZWZyZXNoOiAoKSA9PiByZWZyZXNoKHRydWUpLFxuICAgIHVwZGF0ZTogYXN5bmMgKG11dGF0b3IpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IGNhY2hlUGF0aCgpO1xuICAgICAgcmV0dXJuIGNvYWxlc2NlKGZsaWdodEtleShyZXNvbHZlZFBhdGgsIFwiOnVwZGF0ZVwiKSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHJlYWRSZWNvcmQoKTtcbiAgICAgICAgY29uc3QgYmFzZWxpbmUgPSByZXNvbHZlVmFsdWUoe1xuICAgICAgICAgIGZyZXNoOiB1bmRlZmluZWQsXG4gICAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzPy52YWx1ZSxcbiAgICAgICAgICBmYWxsYmFjazogb3B0aW9ucy5mYWxsYmFjayxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwZXJzaXN0KG11dGF0b3IoYmFzZWxpbmUpKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDYWNoZURpcihvcHRpb25zOiB7XG4gIHJlYWRvbmx5IGNhY2hlRGlyPzogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChvcHRpb25zLmNhY2hlRGlyKSByZXR1cm4gb3B0aW9ucy5jYWNoZURpcjtcbiAgY29uc3QgdmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbiA/PyAoYXdhaXQgcGFja2FnZUlkZW50aXR5KCkpLnZlcnNpb247XG4gIHJldHVybiBkZWZhdWx0TWV0YWRhdGFDYWNoZURpcih2ZXJzaW9uKTtcbn1cblxuLyoqIFByZWZlciBhIG5vbi1lbXB0eSBmcmVzaCBhcnJheSwgZWxzZSBwcmV2aW91cywgZWxzZSBmYWxsYmFjay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVByZWZlckZyZXNoTGlzdDxUPihpbnB1dDogTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQ8cmVhZG9ubHkgVFtdPik6IFRbXSB7XG4gIGlmIChpbnB1dC5mcmVzaCAmJiBpbnB1dC5mcmVzaC5sZW5ndGggPiAwKSByZXR1cm4gWy4uLmlucHV0LmZyZXNoXTtcbiAgaWYgKGlucHV0LnByZXZpb3VzICYmIGlucHV0LnByZXZpb3VzLmxlbmd0aCA+IDApIHJldHVybiBbLi4uaW5wdXQucHJldmlvdXNdO1xuICByZXR1cm4gWy4uLmlucHV0LmZhbGxiYWNrXTtcbn1cblxuLyoqXG4gKiBTaGFsbG93LW1lcmdlIHJlY29yZCBjYXRhbG9ndWVzOiBmYWxsYmFjaywgdGhlbiBwcmV2aW91cywgdGhlbiBmcmVzaCBrZXlzLlxuICogRnJlc2ggdmFsdWVzIHdpbiBwZXIga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcmVmZXJGcmVzaFJlY29yZDxUPihcbiAgaW5wdXQ6IE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFQ+Pj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBUPiB7XG4gIHJldHVybiB7XG4gICAgLi4uaW5wdXQuZmFsbGJhY2ssXG4gICAgLi4uKGlucHV0LnByZXZpb3VzID8/IHt9KSxcbiAgICAuLi4oaW5wdXQuZnJlc2ggPz8ge30pLFxuICB9O1xufVxuXG4vKiogVGVzdCBoZWxwZXI6IHdpcGUgYSBjYWNhY2hlIHJvb3QgYW5kIGNsZWFyIGNhY2FjaGUgbWVtb2l6YXRpb24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzZXRNZXRhZGF0YUNhY2hlRGlyKGNhY2hlRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjYWNhY2hlLnJtLmFsbChjYWNoZURpcik7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGVtcHR5IC8gbWlzc2luZyBjYWNoZSBpcyBmaW5lXG4gIH1cbiAgY2FjYWNoZS5jbGVhck1lbW9pemVkKCk7XG4gIGZvciAoY29uc3Qga2V5IG9mIFsuLi5pbmZsaWdodC5rZXlzKCldKSB7XG4gICAgaWYgKGtleS5zdGFydHNXaXRoKGAke2NhY2hlRGlyfTo6YCkpIGluZmxpZ2h0LmRlbGV0ZShrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvYWxlc2NlPFQ+KGtleTogc3RyaW5nLCB3b3JrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGV4aXN0aW5nID0gaW5mbGlnaHQuZ2V0KGtleSk7XG4gIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nIGFzIFByb21pc2U8VD47XG4gIGNvbnN0IHBlbmRpbmcgPSB3b3JrKCkuZmluYWxseSgoKSA9PiB7XG4gICAgaWYgKGluZmxpZ2h0LmdldChrZXkpID09PSBwZW5kaW5nKSBpbmZsaWdodC5kZWxldGUoa2V5KTtcbiAgfSk7XG4gIGluZmxpZ2h0LnNldChrZXksIHBlbmRpbmcpO1xuICByZXR1cm4gcGVuZGluZztcbn1cblxuZnVuY3Rpb24gZGVjb2RlUmVjb3JkPFQ+KGRhdGE6IEJ1ZmZlcik6IE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZyhcInV0ZjhcIikpIGFzIHVua25vd247XG4gICAgaWYgKFxuICAgICAgIXBhcnNlZCB8fFxuICAgICAgdHlwZW9mIHBhcnNlZCAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgdHlwZW9mIChwYXJzZWQgYXMgTWV0YWRhdGFDYWNoZVJlY29yZDxUPikucmVmcmVzaGVkQXQgIT09IFwibnVtYmVyXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWQgYXMgTWV0YWRhdGFDYWNoZVJlY29yZDxUPjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NhY2hlTWlzcyhlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICBlcnJvciAmJlxuICAgIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwiY29kZVwiIGluIGVycm9yICYmXG4gICAgKGVycm9yIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlID09PSBcIkVOT0VOVFwiLFxuICApO1xufVxuXG4iXX0=
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSwwQ0FBMEMsQ0FBQztBQUM3RSxPQUFPLEtBQUssR0FBRyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xELE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxlQUFlLE1BQU0saUJBQWlCLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBT2xELE1BQU0sZ0JBQWdCLEdBQW9CO0lBQ3hDLFVBQVUsRUFBRSxlQUFlLENBQUMsSUFBSTtJQUNoQyxPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU87Q0FDakMsQ0FBQztBQTBERixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztBQUVyRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BQWU7SUFDckQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNuRSxPQUFPLE9BQU8sQ0FBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsTUFBTSxVQUFVLHdCQUF3QixDQUFDLGNBQWlDLE9BQU8sQ0FBQyxHQUFHO0lBQ25GLE9BQU8s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QU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQVksQ0FBQztRQUM1RCxJQUNFLENBQUMsTUFBTTtZQUNQLE9BQU8sTUFBTSxLQUFLLFFBQVE7WUFDMUIsT0FBUSxNQUFpQyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQ2xFLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxNQUFnQyxDQUFDO0lBQzFDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWM7SUFDakMsT0FBTyxPQUFPLENBQ1osS0FBSztRQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsTUFBTSxJQUFJLEtBQUs7UUFDZCxLQUEyQixDQUFDLElBQUksS0FBSyxRQUFRLENBQy9DLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZ25vc3RpYyBkYWlseSBtZXRhZGF0YSBjYWNoZSBvbiB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY2FjYWNoZSB8IGNhY2FjaGV9LlxuICpcbiAqIFVzZXMgY2FjYWNoZSdzIGJ1aWx0LWluIG1lbW9yeSBtZW1vaXphdGlvbiAoYG1lbW9pemU6IHRydWVgIG9uIHB1dDsgZ2V0cyByZWFkXG4gKiB0aGUgaW4tbWVtb3J5IGxheWVyIGJ5IGRlZmF1bHQpIHdpdGggY29udGVudC1hZGRyZXNzZWQgZGlzayB1bmRlclxuICogYGVudi1wYXRocyhcImRieC10b29sc1wiKS5jYWNoZS9tb2RlbC1nYXRld2F5Lzx2ZXJzaW9uPi9gLiBEaXNrIHBlcnNpc3RlbmNlIGlzXG4gKiBkaXNhYmxlZCBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCAoe0BsaW5rIGVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52fSk7XG4gKiB0aG9zZSBwcm9jZXNzZXMga2VlcCBhIHByb2Nlc3MtbG9jYWwgTWFwIG9ubHkuXG4gKlxuICogRWFjaCBjYWNoZSBvd25zIGEga2V5LCBoYXJkLWNvZGVkIGZhbGxiYWNrLCBvcHRpb25hbCBuZXR3b3JrIGxvYWRlciwgYW5kIGFcbiAqIG1lcmdlciB0aGF0IGNvbWJpbmVzIGZyZXNoIC8gcHJldmlvdXMgLyBmYWxsYmFjayB2YWx1ZXMuIEZyZXNobmVzcyBpcyB0aGVcbiAqIGVudmVsb3BlIGByZWZyZXNoZWRBdGAgd2luZG93IChkZWZhdWx0IG9uZSBkYXkpLCBub3QgY2FjYWNoZSdzIHNob3J0IExSVSBUVEwuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCAqIGFzIGVudmlyb25tZW50VXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZW52aXJvbm1lbnQtdXRpbHNcIjtcbmltcG9ydCAqIGFzIGxvZyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9sb2dcIjtcbmltcG9ydCBjYWNhY2hlIGZyb20gXCJjYWNhY2hlXCI7XG5pbXBvcnQgZW52UGF0aHMgZnJvbSBcImVudi1wYXRoc1wiO1xuXG5pbXBvcnQgcGFja2FnZU1hbmlmZXN0IGZyb20gXCIuLi9wYWNrYWdlLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUyB9IGZyb20gXCIuL19tZXRhZGF0YS1jb250cmFjdC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibW9kZWwvbWV0YWRhdGEtY2FjaGVcIik7XG5cbmludGVyZmFjZSBQYWNrYWdlSWRlbnRpdHkge1xuICByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuY29uc3QgUEFDS0FHRV9JREVOVElUWTogUGFja2FnZUlkZW50aXR5ID0ge1xuICBpZGVudGlmaWVyOiBwYWNrYWdlTWFuaWZlc3QubmFtZSxcbiAgdmVyc2lvbjogcGFja2FnZU1hbmlmZXN0LnZlcnNpb24sXG59O1xuXG4vKiogRW52ZWxvcGUgc3RvcmVkIGFzIEpTT04gYnl0ZXMgaW4gY2FjYWNoZSBmb3IgZXZlcnkga2V5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHtcbiAgcmVhZG9ubHkgcmVmcmVzaGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgdmFsdWU6IFQ7XG59XG5cbi8qKiBGYWN0b3J5IGlucHV0cyBmb3Igb25lIG5hbWVkIG1ldGFkYXRhIGNhY2hlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlT3B0aW9uczxUPiB7XG4gIC8qKiBTdGFibGUgY2FjYWNoZSBrZXkuICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAvKiogSGFyZC1jb2RlZCAvIGNvbW1pdHRlZCBiYXNlbGluZSB1c2VkIHdoZW4gc3RvcmUgYW5kIGxvYWQgYm90aCBtaXNzLiAqL1xuICByZWFkb25seSBmYWxsYmFjazogVDtcbiAgLyoqXG4gICAqIFJlZnJlc2ggc291cmNlLiBXaGVuIG9taXR0ZWQgdGhlIGNhY2hlIG9ubHkgc2VydmVzIHN0b3JlICsgZmFsbGJhY2sgYW5kXG4gICAqIHtAbGluayBNZXRhZGF0YUNhY2hlLnVwZGF0ZX0gbXV0YXRpb25zIChmb3IgZXhhbXBsZSBlcnJvci1sZWFybmVkIHZhbHVlcykuXG4gICAqL1xuICByZWFkb25seSBsb2FkPzogKCkgPT4gUHJvbWlzZTxUPjtcbiAgLyoqIENvbWJpbmUgYSBmcmVzaCBsb2FkLCBwcmlvciBzdG9yZSB2YWx1ZSwgYW5kIHRoZSBoYXJkLWNvZGVkIGZhbGxiYWNrLiAqL1xuICByZWFkb25seSBtZXJnZTogKGlucHV0OiBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxUPikgPT4gVDtcbiAgLyoqIEZyZXNobmVzcyB3aW5kb3c7IGRlZmF1bHRzIHRvIHtAbGluayBNT0RFTF9NRVRBREFUQV9UVExfTVN9IChvbmUgZGF5KS4gKi9cbiAgcmVhZG9ubHkgdHRsTXM/OiBudW1iZXI7XG4gIC8qKiBQYWNrYWdlIHZlcnNpb24gc2VnbWVudCBpbiB0aGUgY2FjaGUgcGF0aC4gRGVmYXVsdHMgdG8gdGhpcyBwYWNrYWdlLiAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuICAvKiogT3ZlcnJpZGUgdGhlIGNhY2FjaGUgcm9vdCBkaXJlY3RvcnkgKHRlc3RzKS4gKi9cbiAgcmVhZG9ubHkgY2FjaGVEaXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGb3JjZSBkaXNrIG9uL29mZi4gRGVmYXVsdHMgdG8gb2ZmIGluc2lkZSBEYXRhYnJpY2tzIEFwcHMsIG9uIG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IGRpc2s/OiBib29sZWFuO1xuICAvKiogQ2xvY2sgb3ZlcnJpZGUgZm9yIHRlc3RzLiAqL1xuICByZWFkb25seSBub3c/OiAoKSA9PiBudW1iZXI7XG59XG5cbi8qKiBBcmd1bWVudHMgcGFzc2VkIHRvIGEgY2FjaGUgbWVyZ2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxUPiB7XG4gIHJlYWRvbmx5IGZyZXNoOiBUIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBwcmV2aW91czogVCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZmFsbGJhY2s6IFQ7XG59XG5cbi8qKiBPbmUgdmVyc2lvbmVkIG1ldGFkYXRhIGNhY2hlIChjYWNhY2hlIG1lbW9yeSArIG9wdGlvbmFsIGRpc2spLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlPFQ+IHtcbiAgLyoqIEFic29sdXRlIGNhY2FjaGUgcm9vdCBmb3IgdGhpcyBwYWNrYWdlIHZlcnNpb24gKHVudXNlZCB3aGVuIGRpc2sgaXMgb2ZmKS4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKiogV2hldGhlciBjYWNhY2hlIGRpc2sgcGVyc2lzdGVuY2UgaXMgZW5hYmxlZCBmb3IgdGhpcyBpbnN0YW5jZS4gKi9cbiAgcmVhZG9ubHkgZGlza0VuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKiBSZXR1cm4gYSBmcmVzaC1vci1mYWxsYmFjayB2YWx1ZSwgcmVmcmVzaGluZyB3aGVuIHN0YWxlLiAqL1xuICBnZXQoKTogUHJvbWlzZTxUPjtcbiAgLyoqIFJlYWQgbWVtb3J5IC8gZGlzayB3aXRob3V0IHJlZnJlc2hpbmcuICovXG4gIHBlZWsoKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgLyoqIE11dGF0ZSB0aGUgY2FjaGVkIHZhbHVlIGFuZCBwZXJzaXN0IGl0LiAqL1xuICB1cGRhdGUobXV0YXRvcjogKGN1cnJlbnQ6IFQpID0+IFQpOiBQcm9taXNlPFQ+O1xuICAvKiogRm9yY2UgYSByZWZyZXNoIGF0dGVtcHQgZXZlbiB3aGVuIHRoZSBlbnRyeSBpcyBzdGlsbCBmcmVzaC4gKi9cbiAgcmVmcmVzaCgpOiBQcm9taXNlPFQ+O1xufVxuXG5jb25zdCBpbmZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuXG4vKiogRGVmYXVsdCBjYWNhY2hlIHJvb3QgZm9yIGEgcGFja2FnZSB2ZXJzaW9uIHVuZGVyIHRoZSBkYngtdG9vbHMgY2FjaGUgZGlyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRNZXRhZGF0YUNhY2hlRGlyKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5ID0gZW52UGF0aHMoXCJkYngtdG9vbHNcIiwgeyBzdWZmaXg6IFwiXCIgfSkuY2FjaGU7XG4gIHJldHVybiByZXNvbHZlKGNhY2hlRGlyZWN0b3J5LCBcIm1vZGVsLWdhdGV3YXlcIiwgdmVyc2lvbik7XG59XG5cbi8qKiBXaGV0aGVyIG1ldGFkYXRhIGNhY2hlcyBzaG91bGQgcGVyc2lzdCB0byBkaXNrIGluIHRoaXMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRhZGF0YUNhY2hlRGlza0VuYWJsZWQoZW52aXJvbm1lbnQ6IE5vZGVKUy5Qcm9jZXNzRW52ID0gcHJvY2Vzcy5lbnYpOiBib29sZWFuIHtcbiAgcmV0dXJuICFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudihlbnZpcm9ubWVudCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIG9uZSBkYWlseSBjYWNoZSBiYWNrZWQgYnkgY2FjYWNoZSBtZW1vaXphdGlvbiwgd2l0aCBvcHRpb25hbCBkaXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWV0YWRhdGFDYWNoZTxUPihvcHRpb25zOiBNZXRhZGF0YUNhY2hlT3B0aW9uczxUPik6IE1ldGFkYXRhQ2FjaGU8VD4ge1xuICBjb25zdCB0dGxNcyA9IG9wdGlvbnMudHRsTXMgPz8gTU9ERUxfTUVUQURBVEFfVFRMX01TO1xuICBjb25zdCBkaXNrRW5hYmxlZCA9IG9wdGlvbnMuZGlzayA/PyBtZXRhZGF0YUNhY2hlRGlza0VuYWJsZWQoKTtcbiAgY29uc3Qgbm93ID0gb3B0aW9ucy5ub3cgPz8gRGF0ZS5ub3c7XG4gIGNvbnN0IHBhdGhQcm9taXNlID0gcmVzb2x2ZUNhY2hlRGlyKG9wdGlvbnMpO1xuICBsZXQgcGF0aCA9IG9wdGlvbnMuY2FjaGVEaXI7XG5cbiAgY29uc3QgZmxpZ2h0S2V5ID0gKGNhY2hlUGF0aDogc3RyaW5nLCBzdWZmaXggPSBcIlwiKTogc3RyaW5nID0+XG4gICAgYCR7Y2FjaGVQYXRofTo6JHtvcHRpb25zLmtleX0ke3N1ZmZpeH1gO1xuXG4gIC8qKiBQcm9jZXNzLWxvY2FsIHN0b3JlIHVzZWQgd2hlbiBkaXNrIGlzIG9mZiAoRGF0YWJyaWNrcyBBcHBzKS4gKi9cbiAgY29uc3QgbWVtb3J5T25seSA9IG5ldyBNYXA8c3RyaW5nLCBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+PigpO1xuXG4gIGNvbnN0IHJlc29sdmVWYWx1ZSA9IChpbnB1dDogTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQ8VD4pOiBUID0+IG9wdGlvbnMubWVyZ2UoaW5wdXQpO1xuXG4gIGNvbnN0IGlzRnJlc2ggPSAocmVjb3JkOiBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICAgIEJvb2xlYW4ocmVjb3JkICYmIG5vdygpIC0gcmVjb3JkLnJlZnJlc2hlZEF0IDwgdHRsTXMpO1xuXG4gIGNvbnN0IGNhY2hlUGF0aCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIHBhdGggPz89IGF3YWl0IHBhdGhQcm9taXNlO1xuICAgIHJldHVybiBwYXRoO1xuICB9O1xuXG4gIGNvbnN0IHJlYWRSZWNvcmQgPSBhc3luYyAoKTogUHJvbWlzZTxNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgaWYgKCFkaXNrRW5hYmxlZCkgcmV0dXJuIG1lbW9yeU9ubHkuZ2V0KG9wdGlvbnMua2V5KTtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCBjYWNoZVBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgLy8gY2FjYWNoZSByZWFkcyBpdHMgaW4tbWVtb3J5IG1lbW8gZmlyc3QgdW5sZXNzIG1lbW9pemUgaXMgZmFsc2VcbiAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgY2FjYWNoZS5nZXQocmVzb2x2ZWRQYXRoLCBvcHRpb25zLmtleSk7XG4gICAgICByZXR1cm4gZGVjb2RlUmVjb3JkPFQ+KGVudHJ5LmRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNDYWNoZU1pc3MoZXJyb3IpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgbG9nZ2VyLndhcm4oXCJtZXRhZGF0YSBjYWNoZSBjYWNhY2hlIHJlYWQgZmFpbGVkXCIsIHtcbiAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgd3JpdGVSZWNvcmQgPSBhc3luYyAocmVjb3JkOiBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFkaXNrRW5hYmxlZCkge1xuICAgICAgbWVtb3J5T25seS5zZXQob3B0aW9ucy5rZXksIHJlY29yZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IGNhY2hlUGF0aCgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYWNhY2hlLnB1dChyZXNvbHZlZFBhdGgsIG9wdGlvbnMua2V5LCBgJHtKU09OLnN0cmluZ2lmeShyZWNvcmQpfVxcbmAsIHtcbiAgICAgICAgbWVtb2l6ZTogdHJ1ZSxcbiAgICAgICAgbWV0YWRhdGE6IHsgcmVmcmVzaGVkQXQ6IHJlY29yZC5yZWZyZXNoZWRBdCB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwibWV0YWRhdGEgY2FjaGUgY2FjYWNoZSB3cml0ZSBmYWlsZWRcIiwge1xuICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICBwYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHBlcnNpc3QgPSBhc3luYyAodmFsdWU6IFQsIHJlZnJlc2hlZEF0ID0gbm93KCkpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBhd2FpdCB3cml0ZVJlY29yZCh7IHJlZnJlc2hlZEF0LCB2YWx1ZSB9KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgY29uc3QgcmVmcmVzaCA9IGFzeW5jIChmb3JjZTogYm9vbGVhbik6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IGNhY2hlUGF0aCgpO1xuICAgIHJldHVybiBjb2FsZXNjZShmbGlnaHRLZXkocmVzb2x2ZWRQYXRoKSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCByZWFkUmVjb3JkKCk7XG4gICAgICBpZiAoIWZvcmNlICYmIGlzRnJlc2gocHJldmlvdXMpKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVmFsdWUoe1xuICAgICAgICAgIGZyZXNoOiB1bmRlZmluZWQsXG4gICAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzPy52YWx1ZSxcbiAgICAgICAgICBmYWxsYmFjazogb3B0aW9ucy5mYWxsYmFjayxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBmcmVzaDogVCB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvcHRpb25zLmxvYWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmcmVzaCA9IGF3YWl0IG9wdGlvbnMubG9hZCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwibWV0YWRhdGEgY2FjaGUgcmVmcmVzaCBmYWlsZWQ7IGtlZXBpbmcgbGFzdCBrbm93biBnb29kXCIsIHtcbiAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgICAgIGRpc2tFbmFibGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZVZhbHVlKHtcbiAgICAgICAgZnJlc2gsXG4gICAgICAgIHByZXZpb3VzOiBwcmV2aW91cz8udmFsdWUsXG4gICAgICAgIGZhbGxiYWNrOiBvcHRpb25zLmZhbGxiYWNrLFxuICAgICAgfSk7XG4gICAgICBpZiAoZnJlc2ggIT09IHVuZGVmaW5lZCB8fCAhcHJldmlvdXMpIHtcbiAgICAgICAgYXdhaXQgcGVyc2lzdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQgcGF0aCgpIHtcbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtZXRhZGF0YSBjYWNoZSBwYXRoIGlzIG5vdCByZXNvbHZlZCB1bnRpbCB0aGUgZmlyc3QgY2FjaGUgcmVhZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH0sXG4gICAgZGlza0VuYWJsZWQsXG4gICAgZ2V0OiAoKSA9PiByZWZyZXNoKGZhbHNlKSxcbiAgICBwZWVrOiBhc3luYyAoKSA9PiAoYXdhaXQgcmVhZFJlY29yZCgpKT8udmFsdWUsXG4gICAgcmVmcmVzaDogKCkgPT4gcmVmcmVzaCh0cnVlKSxcbiAgICB1cGRhdGU6IGFzeW5jIChtdXRhdG9yKSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCBjYWNoZVBhdGgoKTtcbiAgICAgIHJldHVybiBjb2FsZXNjZShmbGlnaHRLZXkocmVzb2x2ZWRQYXRoLCBcIjp1cGRhdGVcIiksIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCByZWFkUmVjb3JkKCk7XG4gICAgICAgIGNvbnN0IGJhc2VsaW5lID0gcmVzb2x2ZVZhbHVlKHtcbiAgICAgICAgICBmcmVzaDogdW5kZWZpbmVkLFxuICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cz8udmFsdWUsXG4gICAgICAgICAgZmFsbGJhY2s6IG9wdGlvbnMuZmFsbGJhY2ssXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGVyc2lzdChtdXRhdG9yKGJhc2VsaW5lKSk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2FjaGVEaXIob3B0aW9uczoge1xuICByZWFkb25seSBjYWNoZURpcj86IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAob3B0aW9ucy5jYWNoZURpcikgcmV0dXJuIG9wdGlvbnMuY2FjaGVEaXI7XG4gIGNvbnN0IHZlcnNpb24gPSBvcHRpb25zLnZlcnNpb24gPz8gUEFDS0FHRV9JREVOVElUWS52ZXJzaW9uO1xuICByZXR1cm4gZGVmYXVsdE1ldGFkYXRhQ2FjaGVEaXIodmVyc2lvbik7XG59XG5cbi8qKiBQcmVmZXIgYSBub24tZW1wdHkgZnJlc2ggYXJyYXksIGVsc2UgcHJldmlvdXMsIGVsc2UgZmFsbGJhY2suICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcmVmZXJGcmVzaExpc3Q8VD4oaW5wdXQ6IE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PHJlYWRvbmx5IFRbXT4pOiBUW10ge1xuICBpZiAoaW5wdXQuZnJlc2ggJiYgaW5wdXQuZnJlc2gubGVuZ3RoID4gMCkgcmV0dXJuIFsuLi5pbnB1dC5mcmVzaF07XG4gIGlmIChpbnB1dC5wcmV2aW91cyAmJiBpbnB1dC5wcmV2aW91cy5sZW5ndGggPiAwKSByZXR1cm4gWy4uLmlucHV0LnByZXZpb3VzXTtcbiAgcmV0dXJuIFsuLi5pbnB1dC5mYWxsYmFja107XG59XG5cbi8qKlxuICogU2hhbGxvdy1tZXJnZSByZWNvcmQgY2F0YWxvZ3VlczogZmFsbGJhY2ssIHRoZW4gcHJldmlvdXMsIHRoZW4gZnJlc2gga2V5cy5cbiAqIEZyZXNoIHZhbHVlcyB3aW4gcGVyIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQ8VD4oXG4gIGlucHV0OiBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBUPj4+LFxuKTogUmVjb3JkPHN0cmluZywgVD4ge1xuICByZXR1cm4ge1xuICAgIC4uLmlucHV0LmZhbGxiYWNrLFxuICAgIC4uLihpbnB1dC5wcmV2aW91cyA/PyB7fSksXG4gICAgLi4uKGlucHV0LmZyZXNoID8/IHt9KSxcbiAgfTtcbn1cblxuLyoqIFRlc3QgaGVscGVyOiB3aXBlIGEgY2FjYWNoZSByb290IGFuZCBjbGVhciBjYWNhY2hlIG1lbW9pemF0aW9uLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc2V0TWV0YWRhdGFDYWNoZURpcihjYWNoZURpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2FjYWNoZS5ybS5hbGwoY2FjaGVEaXIpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBlbXB0eSAvIG1pc3NpbmcgY2FjaGUgaXMgZmluZVxuICB9XG4gIGNhY2FjaGUuY2xlYXJNZW1vaXplZCgpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBbLi4uaW5mbGlnaHQua2V5cygpXSkge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHtjYWNoZURpcn06OmApKSBpbmZsaWdodC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2FsZXNjZTxUPihrZXk6IHN0cmluZywgd29yazogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCBleGlzdGluZyA9IGluZmxpZ2h0LmdldChrZXkpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZyBhcyBQcm9taXNlPFQ+O1xuICBjb25zdCBwZW5kaW5nID0gd29yaygpLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmIChpbmZsaWdodC5nZXQoa2V5KSA9PT0gcGVuZGluZykgaW5mbGlnaHQuZGVsZXRlKGtleSk7XG4gIH0pO1xuICBpbmZsaWdodC5zZXQoa2V5LCBwZW5kaW5nKTtcbiAgcmV0dXJuIHBlbmRpbmc7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVJlY29yZDxUPihkYXRhOiBCdWZmZXIpOiBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoXCJ1dGY4XCIpKSBhcyB1bmtub3duO1xuICAgIGlmIChcbiAgICAgICFwYXJzZWQgfHxcbiAgICAgIHR5cGVvZiBwYXJzZWQgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgIHR5cGVvZiAocGFyc2VkIGFzIE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4pLnJlZnJlc2hlZEF0ICE9PSBcIm51bWJlclwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkIGFzIE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDYWNoZU1pc3MoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgZXJyb3IgJiZcbiAgICB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcImNvZGVcIiBpbiBlcnJvciAmJlxuICAgIChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFTk9FTlRcIixcbiAgKTtcbn1cbiJdfQ==
@@ -1,10 +1,8 @@
1
- import type { ModelCapabilities, ModelMetadata, ModelRateLimits, ModelStatus, ServingEndpointSummary } from "@dbx-tools/shared-model/contracts";
1
+ import type { ModelCapabilities, ModelMetadata, ModelRateLimits, ServingEndpointSummary } from "@dbx-tools/shared-model/contracts";
2
2
  import { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, type ModelCapabilityCatalogue } from "./_metadata-contract.ts";
3
3
  import { type ReasoningLevel, type ReasoningModelCatalogue } from "./reasoning-translation.ts";
4
4
  export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, };
5
5
  interface MetadataIndex {
6
- readonly retiredNames: readonly string[];
7
- readonly retiredKeys: ReadonlySet<string>;
8
6
  readonly capabilities: {
9
7
  readonly [Key in keyof ModelCapabilityCatalogue]: ReadonlySet<string>;
10
8
  };
@@ -22,8 +20,7 @@ export declare function refreshModelMetadata(): Promise<MetadataIndex>;
22
20
  export declare function hydrateModelMetadata(): Promise<MetadataIndex>;
23
21
  /** Absolute cacache root used by the documentation / learned caches. */
24
22
  export declare function modelMetadataCachePath(): string;
25
- /** Return the committed retired-model names. The array is cached and immutable. */
26
- export declare function retiredModelNames(): readonly string[];
23
+ export { modelStatusFor, retiredModelNames } from "./_retirement.ts";
27
24
  /** Return the committed reasoning-effort catalogue. Cached per process. */
28
25
  export declare function reasoningModelCatalogue(): ReasoningModelCatalogue;
29
26
  /** Return error-learned reasoning ladders persisted in the metadata cache. */
@@ -43,8 +40,6 @@ export declare function rememberReasoningLevels(model: string, levels: readonly
43
40
  * nothing). The raw error body is never written to disk.
44
41
  */
45
42
  export declare function learnReasoningLevelsFromError(model: string, body: unknown): Promise<ReasoningLevel[]>;
46
- /** Resolve whether any supplied identity is listed in the retirement snapshot. */
47
- export declare function modelStatusFor(...models: readonly (string | ServingEndpointSummary)[]): ModelStatus;
48
43
  /** Resolve documented model capabilities from a name or endpoint summary. */
49
44
  export declare function modelCapabilitiesFor(model: string | ServingEndpointSummary): ModelCapabilities;
50
45
  /** Resolve published ITPM, OTPM, and QPH limits from a model identity. */
@@ -11,26 +11,23 @@
11
11
  * @module
12
12
  */
13
13
  import * as functionUtils from "@dbx-tools/shared-core/function-utils";
14
- import * as log from "@dbx-tools/shared-core/log";
15
14
  import { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, } from "./_metadata-contract.js";
16
15
  import { parseModelCapabilities, parseModelRateLimits, parseReasoningModels, parseRetiredModels, } from "./_metadata-generator.js";
17
- import { createMetadataCache, mergePreferFreshList, mergePreferFreshRecord, } from "./metadata-cache.js";
16
+ import { COMMITTED_RETIRED_MODELS, modelStatusFor, replaceRetiredModelNames, RETIRED_MODELS_GENERATED_AT, } from "./_retirement.js";
18
17
  import capabilitiesSnapshotJson from "./generated/model-capabilities.json" with { type: "json" };
19
18
  import rateLimitsSnapshotJson from "./generated/model-rate-limits.json" with { type: "json" };
20
19
  import reasoningSnapshotJson from "./generated/model-reasoning.json" with { type: "json" };
21
- import retiredModelsSnapshotJson from "./generated/retired-models.json" with { type: "json" };
22
- import { modelSearchQuery } from "./policy.js";
20
+ import { createMetadataCache, mergePreferFreshList, mergePreferFreshRecord, } from "./metadata-cache.js";
21
+ import { inheritsNativeWebSearch, isFoundationModelIdentity, modelSearchQuery } from "./policy.js";
23
22
  import { defaultReasoningLevels, documentedReasoningLevels, parseReasoning, parseReasoningLevels, uniqueReasoningLevels, } from "./reasoning-translation.js";
24
23
  export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, };
25
- const logger = log.logger("model/metadata");
26
- const retiredModelsSnapshot = retiredModelsSnapshotJson;
27
24
  const capabilitiesSnapshot = capabilitiesSnapshotJson;
28
25
  const rateLimitsSnapshot = rateLimitsSnapshotJson;
29
26
  const reasoningSnapshot = reasoningSnapshotJson;
30
27
  const USER_AGENT = "dbx-tools-model-metadata/1";
31
28
  const retiredCache = createMetadataCache({
32
29
  key: "retired-models",
33
- fallback: retiredModelsSnapshot.models,
30
+ fallback: COMMITTED_RETIRED_MODELS,
34
31
  load: async () => parseRetiredModels(await loadPage(RETIRED_MODELS_URL), nowSeconds()).models,
35
32
  merge: mergePreferFreshList,
36
33
  });
@@ -88,7 +85,7 @@ let liveIndex;
88
85
  const metadataIndex = functionUtils.memoize(() => liveIndex ?? buildIndexFromCommitted());
89
86
  function buildIndexFromCommitted() {
90
87
  return buildIndex({
91
- retiredNames: retiredModelsSnapshot.models,
88
+ retiredNames: COMMITTED_RETIRED_MODELS,
92
89
  capabilities: capabilitiesSnapshot.capabilities,
93
90
  rateLimits: rateLimitsSnapshot.catalogue.models,
94
91
  reasoning: reasoningSnapshot.catalogue.models,
@@ -96,9 +93,8 @@ function buildIndexFromCommitted() {
96
93
  });
97
94
  }
98
95
  function buildIndex(input) {
96
+ replaceRetiredModelNames(input.retiredNames);
99
97
  return {
100
- retiredNames: Object.freeze([...input.retiredNames]),
101
- retiredKeys: new Set(input.retiredNames.map(retiredModelKey).filter(Boolean)),
102
98
  capabilities: {
103
99
  responses: new Set(input.capabilities.responses),
104
100
  imageInput: new Set(input.capabilities.imageInput),
@@ -152,13 +148,10 @@ export async function refreshModelMetadata() {
152
148
  });
153
149
  return refreshInflight;
154
150
  }
155
- void hydrateModelMetadata().catch((error) => {
156
- logger.warn("metadata cache hydrate failed; using committed snapshots", { error });
157
- });
158
151
  /** Load cacache / memory entries without forcing a network refresh. */
159
152
  export async function hydrateModelMetadata() {
160
153
  const [retiredNames, capabilities, rateLimits, reasoning, learnedReasoning] = await Promise.all([
161
- peekOrFallback(retiredCache, retiredModelsSnapshot.models),
154
+ peekOrFallback(retiredCache, COMMITTED_RETIRED_MODELS),
162
155
  peekOrFallback(capabilitiesCache, capabilitiesSnapshot.capabilities),
163
156
  peekOrFallback(rateLimitsCache, rateLimitsSnapshot.catalogue.models),
164
157
  peekOrFallback(reasoningDocsCache, reasoningSnapshot.catalogue.models),
@@ -183,10 +176,7 @@ async function peekOrFallback(cache, fallback) {
183
176
  export function modelMetadataCachePath() {
184
177
  return retiredCache.path;
185
178
  }
186
- /** Return the committed retired-model names. The array is cached and immutable. */
187
- export function retiredModelNames() {
188
- return metadataIndex().retiredNames;
189
- }
179
+ export { modelStatusFor, retiredModelNames } from "./_retirement.js";
190
180
  /** Return the committed reasoning-effort catalogue. Cached per process. */
191
181
  export function reasoningModelCatalogue() {
192
182
  return metadataIndex().reasoning;
@@ -229,30 +219,19 @@ export async function rememberReasoningLevels(model, levels) {
229
219
  export async function learnReasoningLevelsFromError(model, body) {
230
220
  return rememberReasoningLevels(model, parseReasoningLevels(body));
231
221
  }
232
- /** Resolve whether any supplied identity is listed in the retirement snapshot. */
233
- export function modelStatusFor(...models) {
234
- const retired = metadataIndex().retiredKeys;
235
- const deprecated = models
236
- .flatMap((model) => modelIdentities(model))
237
- .some((identity) => {
238
- const candidate = retiredModelKey(identity);
239
- for (const key of retired) {
240
- if (candidate === key || candidate.startsWith(`${key}-`))
241
- return true;
242
- }
243
- return false;
244
- });
245
- return { deprecated };
246
- }
247
222
  /** Resolve documented model capabilities from a name or endpoint summary. */
248
223
  export function modelCapabilitiesFor(model) {
249
224
  const capabilities = metadataIndex().capabilities;
250
- const keys = modelIdentities(model, false).flatMap((identity) => modelKey(identity) ?? []);
225
+ const identities = modelIdentities(model, false);
226
+ const keys = identities.flatMap((identity) => modelKey(identity) ?? []);
251
227
  return {
252
228
  responses: keys.some((key) => capabilities.responses.has(key)),
253
229
  imageInput: keys.some((key) => capabilities.imageInput.has(key)),
254
230
  applyPatch: keys.some((key) => capabilities.applyPatch.has(key)),
255
- webSearch: keys.some((key) => capabilities.webSearch.has(key)),
231
+ // Version inheritance only applies to hosted foundation identities.
232
+ webSearch: keys.some((key) => capabilities.webSearch.has(key)) ||
233
+ identities.some((identity) => isFoundationModelIdentity(identity) &&
234
+ inheritsNativeWebSearch(identity, capabilities.webSearch)),
256
235
  };
257
236
  }
258
237
  /** Resolve published ITPM, OTPM, and QPH limits from a model identity. */
@@ -302,7 +281,7 @@ export function modelMetadataFor(model) {
302
281
  /** Return generation timestamps for the committed metadata snapshots. */
303
282
  export function modelMetadataGeneratedAt() {
304
283
  return {
305
- retiredModels: retiredModelsSnapshot.generatedAt,
284
+ retiredModels: RETIRED_MODELS_GENERATED_AT,
306
285
  capabilities: capabilitiesSnapshot.generatedAt,
307
286
  rateLimits: rateLimitsSnapshot.generatedAt,
308
287
  reasoning: reasoningSnapshot.generatedAt,
@@ -321,22 +300,6 @@ function modelIdentities(model, includeDisplayName = true) {
321
300
  function modelKey(value) {
322
301
  return modelSearchQuery(value)?.replaceAll(" ", "-");
323
302
  }
324
- const RETIRED_MODEL_PREFIXES = new Set([
325
- "ai",
326
- "anthropic",
327
- "databricks",
328
- "dbx",
329
- "google",
330
- "meta",
331
- "openai",
332
- "system",
333
- ]);
334
- function retiredModelKey(value) {
335
- const tokens = value.toLowerCase().match(/[a-z0-9]+/g) ?? [];
336
- while (tokens[0] && RETIRED_MODEL_PREFIXES.has(tokens[0]))
337
- tokens.shift();
338
- return tokens.join("-");
339
- }
340
303
  async function loadPage(url) {
341
304
  const response = await fetch(url, {
342
305
  headers: { "user-agent": USER_AGENT },
@@ -350,4 +313,4 @@ async function loadPage(url) {
350
313
  function nowSeconds() {
351
314
  return Math.floor(Date.now() / 1000);
352
315
  }
353
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxPQUFPLEtBQUssYUFBYSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxHQUFHLE1BQU0sNEJBQTRCLENBQUM7QUFTbEQsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIscUJBQXFCLEdBTXRCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLHNCQUFzQixHQUV2QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sd0JBQXdCLE1BQU0scUNBQXFDLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDakcsT0FBTyxzQkFBc0IsTUFBTSxvQ0FBb0MsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM5RixPQUFPLHFCQUFxQixNQUFNLGtDQUFrQyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzNGLE9BQU8seUJBQXlCLE1BQU0saUNBQWlDLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDOUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIseUJBQXlCLEVBQ3pCLGNBQWMsRUFDZCxvQkFBb0IsRUFHcEIscUJBQXFCLEdBQ3RCLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixx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Q0FBQyxDQUFDO1FBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsS0FBSyxVQUFVLFFBQVEsQ0FBQyxHQUFXO0lBQ2pDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNoQyxPQUFPLEVBQUUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFO1FBQ3JDLE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztLQUNwQyxDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDekIsQ0FBQztBQUVELFNBQVMsVUFBVTtJQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJ1aWxkLWdlbmVyYXRlZCBEYXRhYnJpY2tzIG1vZGVsIHJldGlyZW1lbnQsIGNhcGFiaWxpdHksIHJhdGUtbGltaXQsIGFuZFxuICogcmVhc29uaW5nLWVmZm9ydCBtZXRhZGF0YSwgcGx1cyBhIGRhaWx5IHdyaXRlLXRocm91Z2ggY2FjaGUgZm9yIHJlZnJlc2hlZFxuICogZG9jcyBhbmQgZXJyb3ItbGVhcm5lZCByZWFzb25pbmcgbGFkZGVycy5cbiAqXG4gKiBDb21taXR0ZWQgc25hcHNob3RzIHNlZWQgZXZlcnkgcHJvY2Vzcy4ge0BsaW5rIHJlZnJlc2hNb2RlbE1ldGFkYXRhfSBwdWxsc1xuICogZG9jdW1lbnRhdGlvbiB0aHJvdWdoIHtAbGluayBjcmVhdGVNZXRhZGF0YUNhY2hlfSAoY2FjYWNoZSBtZW1vaXplICsgZGlzaykgYW5kXG4gKiByZWJ1aWxkcyB0aGUgaW4tbWVtb3J5IGluZGV4LiBFcnJvci1sZWFybmVkIGVmZm9ydHMgdXNlIHRoZSBzYW1lIHN0b3JlIHZpYVxuICoge0BsaW5rIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzfS4gRGlzayB3cml0ZXMgYXJlIHNraXBwZWQgaW4gRGF0YWJyaWNrcyBBcHBzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0ICogYXMgZnVuY3Rpb25VdGlscyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9mdW5jdGlvbi11dGlsc1wiO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2xvZ1wiO1xuaW1wb3J0IHR5cGUge1xuICBNb2RlbENhcGFiaWxpdGllcyxcbiAgTW9kZWxNZXRhZGF0YSxcbiAgTW9kZWxSYXRlTGltaXRzLFxuICBNb2RlbFN0YXR1cyxcbiAgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuXG5pbXBvcnQge1xuICBNT0RFTF9NRVRBREFUQV9UVExfTVMsXG4gIE1PREVMX1JBVEVfTElNSVRTX1VSTCxcbiAgT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMLFxuICBRVUVSWV9SRUFTT05fTU9ERUxTX1VSTCxcbiAgUkVUSVJFRF9NT0RFTFNfVVJMLFxuICBXRUJfU0VBUkNIX01PREVMU19VUkwsXG4gIHR5cGUgTW9kZWxDYXBhYmlsaXRpZXNTbmFwc2hvdCxcbiAgdHlwZSBNb2RlbENhcGFiaWxpdHlDYXRhbG9ndWUsXG4gIHR5cGUgTW9kZWxSYXRlTGltaXRzU25hcHNob3QsXG4gIHR5cGUgUmVhc29uaW5nTW9kZWxzU25hcHNob3QsXG4gIHR5cGUgUmV0aXJlZE1vZGVsc1NuYXBzaG90LFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtY29udHJhY3QudHNcIjtcbmltcG9ydCB7XG4gIHBhcnNlTW9kZWxDYXBhYmlsaXRpZXMsXG4gIHBhcnNlTW9kZWxSYXRlTGltaXRzLFxuICBwYXJzZVJlYXNvbmluZ01vZGVscyxcbiAgcGFyc2VSZXRpcmVkTW9kZWxzLFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVNZXRhZGF0YUNhY2hlLFxuICBtZXJnZVByZWZlckZyZXNoTGlzdCxcbiAgbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbiAgdHlwZSBNZXRhZGF0YUNhY2hlLFxufSBmcm9tIFwiLi9tZXRhZGF0YS1jYWNoZS50c1wiO1xuaW1wb3J0IGNhcGFiaWxpdGllc1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWwtY2FwYWJpbGl0aWVzLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCByYXRlTGltaXRzU25hcHNob3RKc29uIGZyb20gXCIuL2dlbmVyYXRlZC9tb2RlbC1yYXRlLWxpbWl0cy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgcmVhc29uaW5nU25hcHNob3RKc29uIGZyb20gXCIuL2dlbmVyYXRlZC9tb2RlbC1yZWFzb25pbmcuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHJldGlyZWRNb2RlbHNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL3JldGlyZWQtbW9kZWxzLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7IG1vZGVsU2VhcmNoUXVlcnkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcbmltcG9ydCB7XG4gIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMsXG4gIGRvY3VtZW50ZWRSZWFzb25pbmdMZXZlbHMsXG4gIHBhcnNlUmVhc29uaW5nLFxuICBwYXJzZVJlYXNvbmluZ0xldmVscyxcbiAgdHlwZSBSZWFzb25pbmdMZXZlbCxcbiAgdHlwZSBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSxcbiAgdW5pcXVlUmVhc29uaW5nTGV2ZWxzLFxufSBmcm9tIFwiLi9yZWFzb25pbmctdHJhbnNsYXRpb24udHNcIjtcblxuZXhwb3J0IHtcbiAgTU9ERUxfTUVUQURBVEFfVFRMX01TLFxuICBNT0RFTF9SQVRFX0xJTUlUU19VUkwsXG4gIE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCxcbiAgUVVFUllfUkVBU09OX01PREVMU19VUkwsXG4gIFJFVElSRURfTU9ERUxTX1VSTCxcbiAgV0VCX1NFQVJDSF9NT0RFTFNfVVJMLFxufTtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1vZGVsL21ldGFkYXRhXCIpO1xuXG5jb25zdCByZXRpcmVkTW9kZWxzU25hcHNob3QgPSByZXRpcmVkTW9kZWxzU25hcHNob3RKc29uIGFzIFJldGlyZWRNb2RlbHNTbmFwc2hvdDtcbmNvbnN0IGNhcGFiaWxpdGllc1NuYXBzaG90ID0gY2FwYWJpbGl0aWVzU25hcHNob3RKc29uIGFzIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3Q7XG5jb25zdCByYXRlTGltaXRzU25hcHNob3QgPSByYXRlTGltaXRzU25hcHNob3RKc29uIGFzIE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90O1xuY29uc3QgcmVhc29uaW5nU25hcHNob3QgPSByZWFzb25pbmdTbmFwc2hvdEpzb24gYXMgUmVhc29uaW5nTW9kZWxzU25hcHNob3Q7XG5cbmludGVyZmFjZSBNZXRhZGF0YUluZGV4IHtcbiAgcmVhZG9ubHkgcmV0aXJlZE5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcmV0aXJlZEtleXM6IFJlYWRvbmx5U2V0PHN0cmluZz47XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczoge1xuICAgIHJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlXTogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcbiAgfTtcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlO1xuICByZWFkb25seSBsZWFybmVkUmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbn1cblxudHlwZSBDYXBhYmlsaXR5U2V0cyA9IE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZTtcblxuY29uc3QgVVNFUl9BR0VOVCA9IFwiZGJ4LXRvb2xzLW1vZGVsLW1ldGFkYXRhLzFcIjtcblxuY29uc3QgcmV0aXJlZENhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxyZWFkb25seSBzdHJpbmdbXT4oe1xuICBrZXk6IFwicmV0aXJlZC1tb2RlbHNcIixcbiAgZmFsbGJhY2s6IHJldGlyZWRNb2RlbHNTbmFwc2hvdC5tb2RlbHMsXG4gIGxvYWQ6IGFzeW5jICgpID0+IHBhcnNlUmV0aXJlZE1vZGVscyhhd2FpdCBsb2FkUGFnZShSRVRJUkVEX01PREVMU19VUkwpLCBub3dTZWNvbmRzKCkpLm1vZGVscyxcbiAgbWVyZ2U6IG1lcmdlUHJlZmVyRnJlc2hMaXN0LFxufSk7XG5cbmNvbnN0IGNhcGFiaWxpdGllc0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxDYXBhYmlsaXR5U2V0cz4oe1xuICBrZXk6IFwibW9kZWwtY2FwYWJpbGl0aWVzXCIsXG4gIGZhbGxiYWNrOiBjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMsXG4gIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcmVzcG9uc2VzSHRtbCwgd2ViU2VhcmNoSHRtbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBsb2FkUGFnZShPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwpLFxuICAgICAgbG9hZFBhZ2UoV0VCX1NFQVJDSF9NT0RFTFNfVVJMKSxcbiAgICBdKTtcbiAgICByZXR1cm4gcGFyc2VNb2RlbENhcGFiaWxpdGllcyhyZXNwb25zZXNIdG1sLCB3ZWJTZWFyY2hIdG1sLCBub3dTZWNvbmRzKCkpLmNhcGFiaWxpdGllcztcbiAgfSxcbiAgbWVyZ2U6IChpbnB1dCkgPT4gKHtcbiAgICByZXNwb25zZXM6IG1lcmdlUHJlZmVyRnJlc2hMaXN0KHtcbiAgICAgIGZyZXNoOiBpbnB1dC5mcmVzaD8ucmVzcG9uc2VzLFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5yZXNwb25zZXMsXG4gICAgICBmYWxsYmFjazogaW5wdXQuZmFsbGJhY2sucmVzcG9uc2VzLFxuICAgIH0pLFxuICAgIGltYWdlSW5wdXQ6IG1lcmdlUHJlZmVyRnJlc2hMaXN0KHtcbiAgICAgIGZyZXNoOiBpbnB1dC5mcmVzaD8uaW1hZ2VJbnB1dCxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8uaW1hZ2VJbnB1dCxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5pbWFnZUlucHV0LFxuICAgIH0pLFxuICAgIGFwcGx5UGF0Y2g6IG1lcmdlUHJlZmVyRnJlc2hMaXN0KHtcbiAgICAgIGZyZXNoOiBpbnB1dC5mcmVzaD8uYXBwbHlQYXRjaCxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8uYXBwbHlQYXRjaCxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5hcHBseVBhdGNoLFxuICAgIH0pLFxuICAgIHdlYlNlYXJjaDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy53ZWJTZWFyY2gsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LndlYlNlYXJjaCxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay53ZWJTZWFyY2gsXG4gICAgfSksXG4gIH0pLFxufSk7XG5cbmNvbnN0IHJhdGVMaW1pdHNDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgTW9kZWxSYXRlTGltaXRzPj4+KHtcbiAga2V5OiBcIm1vZGVsLXJhdGUtbGltaXRzXCIsXG4gIGZhbGxiYWNrOiByYXRlTGltaXRzU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbG9hZDogYXN5bmMgKCkgPT5cbiAgICBwYXJzZU1vZGVsUmF0ZUxpbWl0cyhhd2FpdCBsb2FkUGFnZShNT0RFTF9SQVRFX0xJTUlUU19VUkwpLCBub3dTZWNvbmRzKCkpLmNhdGFsb2d1ZS5tb2RlbHMsXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmNvbnN0IHJlYXNvbmluZ0RvY3NDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pj4oe1xuICBrZXk6IFwibW9kZWwtcmVhc29uaW5nXCIsXG4gIGZhbGxiYWNrOiByZWFzb25pbmdTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICBsb2FkOiBhc3luYyAoKSA9PlxuICAgIHBhcnNlUmVhc29uaW5nTW9kZWxzKGF3YWl0IGxvYWRQYWdlKFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMKSwgbm93U2Vjb25kcygpKS5jYXRhbG9ndWUubW9kZWxzLFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbn0pO1xuXG5jb25zdCBsZWFybmVkUmVhc29uaW5nQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pj4oe1xuICBrZXk6IFwibGVhcm5lZC1yZWFzb25pbmdcIixcbiAgZmFsbGJhY2s6IHt9LFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbn0pO1xuXG5sZXQgbGl2ZUluZGV4OiBNZXRhZGF0YUluZGV4IHwgdW5kZWZpbmVkO1xuXG5jb25zdCBtZXRhZGF0YUluZGV4ID0gZnVuY3Rpb25VdGlscy5tZW1vaXplPE1ldGFkYXRhSW5kZXg+KCgpID0+IGxpdmVJbmRleCA/PyBidWlsZEluZGV4RnJvbUNvbW1pdHRlZCgpKTtcblxuZnVuY3Rpb24gYnVpbGRJbmRleEZyb21Db21taXR0ZWQoKTogTWV0YWRhdGFJbmRleCB7XG4gIHJldHVybiBidWlsZEluZGV4KHtcbiAgICByZXRpcmVkTmFtZXM6IHJldGlyZWRNb2RlbHNTbmFwc2hvdC5tb2RlbHMsXG4gICAgY2FwYWJpbGl0aWVzOiBjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMsXG4gICAgcmF0ZUxpbWl0czogcmF0ZUxpbWl0c1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gICAgcmVhc29uaW5nOiByZWFzb25pbmdTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IHt9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRJbmRleChpbnB1dDoge1xuICByZWFkb25seSByZXRpcmVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IENhcGFiaWxpdHlTZXRzO1xuICByZWFkb25seSByYXRlTGltaXRzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+PjtcbiAgcmVhZG9ubHkgcmVhc29uaW5nOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+O1xuICByZWFkb25seSBsZWFybmVkUmVhc29uaW5nOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj47XG59KTogTWV0YWRhdGFJbmRleCB7XG4gIHJldHVybiB7XG4gICAgcmV0aXJlZE5hbWVzOiBPYmplY3QuZnJlZXplKFsuLi5pbnB1dC5yZXRpcmVkTmFtZXNdKSxcbiAgICByZXRpcmVkS2V5czogbmV3IFNldChpbnB1dC5yZXRpcmVkTmFtZXMubWFwKHJldGlyZWRNb2RlbEtleSkuZmlsdGVyKEJvb2xlYW4pKSxcbiAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgIHJlc3BvbnNlczogbmV3IFNldChpbnB1dC5jYXBhYmlsaXRpZXMucmVzcG9uc2VzKSxcbiAgICAgIGltYWdlSW5wdXQ6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLmltYWdlSW5wdXQpLFxuICAgICAgYXBwbHlQYXRjaDogbmV3IFNldChpbnB1dC5jYXBhYmlsaXRpZXMuYXBwbHlQYXRjaCksXG4gICAgICB3ZWJTZWFyY2g6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCksXG4gICAgfSxcbiAgICByYXRlTGltaXRzOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGlucHV0LnJhdGVMaW1pdHMpKSxcbiAgICByZWFzb25pbmc6IGZyZWV6ZVJlYXNvbmluZ0NhdGFsb2d1ZShpbnB1dC5yZWFzb25pbmcpLFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IGZyZWV6ZUxlYXJuZWRDYXRhbG9ndWUoaW5wdXQubGVhcm5lZFJlYXNvbmluZyksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZyZWV6ZVJlYXNvbmluZ0NhdGFsb2d1ZShcbiAgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+LFxuKTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhtb2RlbHMpLm1hcCgoW2tleSwgbGV2ZWxzXSkgPT4gW1xuICAgICAgICBrZXksXG4gICAgICAgIE9iamVjdC5mcmVlemUoXG4gICAgICAgICAgdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGxldmVscy5mbGF0TWFwKChsZXZlbCkgPT4gcGFyc2VSZWFzb25pbmcobGV2ZWwpID8/IFtdKSksXG4gICAgICAgICksXG4gICAgICBdKSxcbiAgICApLFxuICApO1xufVxuXG5mdW5jdGlvbiBmcmVlemVMZWFybmVkQ2F0YWxvZ3VlKFxuICBtb2RlbHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pixcbik6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWxzKS5tYXAoKFtrZXksIGxldmVsc10pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBPYmplY3QuZnJlZXplKHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMpKSxcbiAgICAgIF0pLFxuICAgICksXG4gICk7XG59XG5cbmxldCByZWZyZXNoSW5mbGlnaHQ6IFByb21pc2U8TWV0YWRhdGFJbmRleD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogSHlkcmF0ZSBvciByZWZyZXNoIGRvY3VtZW50YXRpb24gKyBsZWFybmVkIGNhY2hlcyBpbnRvIHRoZSBwcm9jZXNzIGluZGV4LlxuICpcbiAqIFNhZmUgdG8gY2FsbCBvbiBnYXRld2F5IHN0YXJ0dXAuIENvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSBvbmUgcmVmcmVzaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hNb2RlbE1ldGFkYXRhKCk6IFByb21pc2U8TWV0YWRhdGFJbmRleD4ge1xuICBpZiAocmVmcmVzaEluZmxpZ2h0KSByZXR1cm4gcmVmcmVzaEluZmxpZ2h0O1xuICByZWZyZXNoSW5mbGlnaHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtyZXRpcmVkTmFtZXMsIGNhcGFiaWxpdGllcywgcmF0ZUxpbWl0cywgcmVhc29uaW5nLCBsZWFybmVkUmVhc29uaW5nXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHJldGlyZWRDYWNoZS5nZXQoKSxcbiAgICAgIGNhcGFiaWxpdGllc0NhY2hlLmdldCgpLFxuICAgICAgcmF0ZUxpbWl0c0NhY2hlLmdldCgpLFxuICAgICAgcmVhc29uaW5nRG9jc0NhY2hlLmdldCgpLFxuICAgICAgbGVhcm5lZFJlYXNvbmluZ0NhY2hlLmdldCgpLFxuICAgIF0pO1xuICAgIGxpdmVJbmRleCA9IGJ1aWxkSW5kZXgoe1xuICAgICAgcmV0aXJlZE5hbWVzLFxuICAgICAgY2FwYWJpbGl0aWVzLFxuICAgICAgcmF0ZUxpbWl0cyxcbiAgICAgIHJlYXNvbmluZyxcbiAgICAgIGxlYXJuZWRSZWFzb25pbmcsXG4gICAgfSk7XG4gICAgcmV0dXJuIGxpdmVJbmRleDtcbiAgfSkoKS5maW5hbGx5KCgpID0+IHtcbiAgICByZWZyZXNoSW5mbGlnaHQgPSB1bmRlZmluZWQ7XG4gIH0pO1xuICByZXR1cm4gcmVmcmVzaEluZmxpZ2h0O1xufVxuXG52b2lkIGh5ZHJhdGVNb2RlbE1ldGFkYXRhKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gIGxvZ2dlci53YXJuKFwibWV0YWRhdGEgY2FjaGUgaHlkcmF0ZSBmYWlsZWQ7IHVzaW5nIGNvbW1pdHRlZCBzbmFwc2hvdHNcIiwgeyBlcnJvciB9KTtcbn0pO1xuXG4vKiogTG9hZCBjYWNhY2hlIC8gbWVtb3J5IGVudHJpZXMgd2l0aG91dCBmb3JjaW5nIGEgbmV0d29yayByZWZyZXNoLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVNb2RlbE1ldGFkYXRhKCk6IFByb21pc2U8TWV0YWRhdGFJbmRleD4ge1xuICBjb25zdCBbcmV0aXJlZE5hbWVzLCBjYXBhYmlsaXRpZXMsIHJhdGVMaW1pdHMsIHJlYXNvbmluZywgbGVhcm5lZFJlYXNvbmluZ10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgcGVla09yRmFsbGJhY2socmV0aXJlZENhY2hlLCByZXRpcmVkTW9kZWxzU25hcHNob3QubW9kZWxzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhjYXBhYmlsaXRpZXNDYWNoZSwgY2FwYWJpbGl0aWVzU25hcHNob3QuY2FwYWJpbGl0aWVzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyYXRlTGltaXRzQ2FjaGUsIHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyZWFzb25pbmdEb2NzQ2FjaGUsIHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGxlYXJuZWRSZWFzb25pbmdDYWNoZSwge30pLFxuICBdKTtcbiAgbGl2ZUluZGV4ID0gYnVpbGRJbmRleCh7XG4gICAgcmV0aXJlZE5hbWVzLFxuICAgIGNhcGFiaWxpdGllcyxcbiAgICByYXRlTGltaXRzLFxuICAgIHJlYXNvbmluZyxcbiAgICBsZWFybmVkUmVhc29uaW5nLFxuICB9KTtcbiAgcmV0dXJuIGxpdmVJbmRleDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGVla09yRmFsbGJhY2s8VD4oY2FjaGU6IE1ldGFkYXRhQ2FjaGU8VD4sIGZhbGxiYWNrOiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHBlZWtlZCA9IGF3YWl0IGNhY2hlLnBlZWsoKTtcbiAgaWYgKHBlZWtlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcGVla2VkO1xuICByZXR1cm4gY2FjaGUuZ2V0KCkuY2F0Y2goKCkgPT4gZmFsbGJhY2spO1xufVxuXG4vKiogQWJzb2x1dGUgY2FjYWNoZSByb290IHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gLyBsZWFybmVkIGNhY2hlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbE1ldGFkYXRhQ2FjaGVQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiByZXRpcmVkQ2FjaGUucGF0aDtcbn1cblxuLyoqIFJldHVybiB0aGUgY29tbWl0dGVkIHJldGlyZWQtbW9kZWwgbmFtZXMuIFRoZSBhcnJheSBpcyBjYWNoZWQgYW5kIGltbXV0YWJsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXRpcmVkTW9kZWxOYW1lcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIHJldHVybiBtZXRhZGF0YUluZGV4KCkucmV0aXJlZE5hbWVzO1xufVxuXG4vKiogUmV0dXJuIHRoZSBjb21taXR0ZWQgcmVhc29uaW5nLWVmZm9ydCBjYXRhbG9ndWUuIENhY2hlZCBwZXIgcHJvY2Vzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFzb25pbmdNb2RlbENhdGFsb2d1ZSgpOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBtZXRhZGF0YUluZGV4KCkucmVhc29uaW5nO1xufVxuXG4vKiogUmV0dXJuIGVycm9yLWxlYXJuZWQgcmVhc29uaW5nIGxhZGRlcnMgcGVyc2lzdGVkIGluIHRoZSBtZXRhZGF0YSBjYWNoZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZWFybmVkUmVhc29uaW5nQ2F0YWxvZ3VlKCk6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIG1ldGFkYXRhSW5kZXgoKS5sZWFybmVkUmVhc29uaW5nO1xufVxuXG4vKipcbiAqIFN0b3JlIGxldmVscyBsZWFybmVkIGZyb20gYW4gdXBzdHJlYW0gZXJyb3IgYW5kIHBlcnNpc3QgdGhlbSB3cml0ZS10aHJvdWdoLlxuICpcbiAqIEVtcHR5IGxpc3RzIGFyZSBpZ25vcmVkIHNvIGEgZmFpbGVkIHBhcnNlIGNhbm5vdCB3aXBlIGRlZmF1bHRzLiBFcnJvciBib2RpZXNcbiAqIHRoZW1zZWx2ZXMgYXJlIG5ldmVyIHN0b3JlZCAtIG9ubHkgdGhlIHBhcnNlZCBsYWRkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1lbWJlclJlYXNvbmluZ0xldmVscyhcbiAgbW9kZWw6IHN0cmluZyxcbiAgbGV2ZWxzOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdLFxuKTogUHJvbWlzZTxSZWFzb25pbmdMZXZlbFtdPiB7XG4gIGNvbnN0IHVuaXF1ZSA9IHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMpO1xuICBpZiAodW5pcXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1vZGVsUmVhc29uaW5nTGV2ZWxzRm9yKG1vZGVsKTtcbiAgY29uc3Qga2V5ID0gbW9kZWxLZXkobW9kZWwpO1xuICBpZiAoIWtleSkgcmV0dXJuIG1vZGVsUmVhc29uaW5nTGV2ZWxzRm9yKG1vZGVsKTtcbiAgY29uc3QgY2F0YWxvZ3VlID0gYXdhaXQgbGVhcm5lZFJlYXNvbmluZ0NhY2hlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHtcbiAgICAuLi5jdXJyZW50LFxuICAgIFtrZXldOiB1bmlxdWUsXG4gIH0pKTtcbiAgY29uc3QgY3VycmVudCA9IG1ldGFkYXRhSW5kZXgoKTtcbiAgbGl2ZUluZGV4ID0ge1xuICAgIC4uLmN1cnJlbnQsXG4gICAgbGVhcm5lZFJlYXNvbmluZzogZnJlZXplTGVhcm5lZENhdGFsb2d1ZShjYXRhbG9ndWUpLFxuICB9O1xuICByZXR1cm4gWy4uLnVuaXF1ZV07XG59XG5cbi8qKlxuICogUGFyc2UgYW4gdXBzdHJlYW0gZXJyb3IgYm9keSBhbmQgcGVyc2lzdCB0aGUgc3VwcG9ydGVkIGxhZGRlciBmb3IgYG1vZGVsYC5cbiAqXG4gKiBBY2NlcHRzIHRoZSBzYW1lIG5lc3RlZCBEYXRhYnJpY2tzIGVudmVsb3BlcyBhcyB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9LlxuICogUmV0dXJucyB0aGUgbGV2ZWxzIHRoYXQgd2VyZSBzdG9yZWQgKG9yIHRoZSBjdXJyZW50IGxvb2t1cCB3aGVuIHBhcnNlIHlpZWxkc1xuICogbm90aGluZykuIFRoZSByYXcgZXJyb3IgYm9keSBpcyBuZXZlciB3cml0dGVuIHRvIGRpc2suXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsZWFyblJlYXNvbmluZ0xldmVsc0Zyb21FcnJvcihcbiAgbW9kZWw6IHN0cmluZyxcbiAgYm9keTogdW5rbm93bixcbik6IFByb21pc2U8UmVhc29uaW5nTGV2ZWxbXT4ge1xuICByZXR1cm4gcmVtZW1iZXJSZWFzb25pbmdMZXZlbHMobW9kZWwsIHBhcnNlUmVhc29uaW5nTGV2ZWxzKGJvZHkpKTtcbn1cblxuLyoqIFJlc29sdmUgd2hldGhlciBhbnkgc3VwcGxpZWQgaWRlbnRpdHkgaXMgbGlzdGVkIGluIHRoZSByZXRpcmVtZW50IHNuYXBzaG90LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsU3RhdHVzRm9yKFxuICAuLi5tb2RlbHM6IHJlYWRvbmx5IChzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KVtdXG4pOiBNb2RlbFN0YXR1cyB7XG4gIGNvbnN0IHJldGlyZWQgPSBtZXRhZGF0YUluZGV4KCkucmV0aXJlZEtleXM7XG4gIGNvbnN0IGRlcHJlY2F0ZWQgPSBtb2RlbHNcbiAgICAuZmxhdE1hcCgobW9kZWwpID0+IG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpXG4gICAgLnNvbWUoKGlkZW50aXR5KSA9PiB7XG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSByZXRpcmVkTW9kZWxLZXkoaWRlbnRpdHkpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmV0aXJlZCkge1xuICAgICAgICBpZiAoY2FuZGlkYXRlID09PSBrZXkgfHwgY2FuZGlkYXRlLnN0YXJ0c1dpdGgoYCR7a2V5fS1gKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIHJldHVybiB7IGRlcHJlY2F0ZWQgfTtcbn1cblxuLyoqIFJlc29sdmUgZG9jdW1lbnRlZCBtb2RlbCBjYXBhYmlsaXRpZXMgZnJvbSBhIG5hbWUgb3IgZW5kcG9pbnQgc3VtbWFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbENhcGFiaWxpdGllc0Zvcihtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsQ2FwYWJpbGl0aWVzIHtcbiAgY29uc3QgY2FwYWJpbGl0aWVzID0gbWV0YWRhdGFJbmRleCgpLmNhcGFiaWxpdGllcztcbiAgY29uc3Qga2V5cyA9IG1vZGVsSWRlbnRpdGllcyhtb2RlbCwgZmFsc2UpLmZsYXRNYXAoKGlkZW50aXR5KSA9PiBtb2RlbEtleShpZGVudGl0eSkgPz8gW10pO1xuICByZXR1cm4ge1xuICAgIHJlc3BvbnNlczoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5yZXNwb25zZXMuaGFzKGtleSkpLFxuICAgIGltYWdlSW5wdXQ6IGtleXMuc29tZSgoa2V5KSA9PiBjYXBhYmlsaXRpZXMuaW1hZ2VJbnB1dC5oYXMoa2V5KSksXG4gICAgYXBwbHlQYXRjaDoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5hcHBseVBhdGNoLmhhcyhrZXkpKSxcbiAgICB3ZWJTZWFyY2g6IGtleXMuc29tZSgoa2V5KSA9PiBjYXBhYmlsaXRpZXMud2ViU2VhcmNoLmhhcyhrZXkpKSxcbiAgfTtcbn1cblxuLyoqIFJlc29sdmUgcHVibGlzaGVkIElUUE0sIE9UUE0sIGFuZCBRUEggbGltaXRzIGZyb20gYSBtb2RlbCBpZGVudGl0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFJhdGVMaW1pdHNGb3IoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuKTogTW9kZWxSYXRlTGltaXRzIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbGltaXRzID0gbWV0YWRhdGFJbmRleCgpLnJhdGVMaW1pdHM7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsS2V5KGlkZW50aXR5KTtcbiAgICBpZiAoIWtleSkgY29udGludWU7XG4gICAgY29uc3QgZm91bmQgPSBsaW1pdHMuZ2V0KGtleSk7XG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHJlYXNvbmluZyBsZXZlbHM6IGxlYXJuZWQgZnJvbSBlcnJvcnMsIHRoZW4gZG9jdW1lbnRhdGlvbiwgdGhlblxuICogZmFtaWx5IGRlZmF1bHRzLlxuICpcbiAqIERvZXMgbm90IHBhcnNlIGVycm9yIGJvZGllczsgY2FsbGVycyBzaG91bGQgdXNlIHtAbGluayBwYXJzZVJlYXNvbmluZ0xldmVsc31cbiAqIGFuZCB0aGVuIHtAbGluayByZW1lbWJlclJlYXNvbmluZ0xldmVsc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFJlYXNvbmluZ0xldmVsc0ZvcihcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4pOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgaW5kZXggPSBtZXRhZGF0YUluZGV4KCk7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGxlYXJuZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5sZWFybmVkUmVhc29uaW5nKTtcbiAgICBpZiAobGVhcm5lZD8ubGVuZ3RoKSByZXR1cm4gbGVhcm5lZDtcbiAgfVxuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBkb2N1bWVudGVkID0gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhpZGVudGl0eSwgaW5kZXgucmVhc29uaW5nKTtcbiAgICBpZiAoZG9jdW1lbnRlZD8ubGVuZ3RoKSByZXR1cm4gZG9jdW1lbnRlZDtcbiAgfVxuICBjb25zdCBwcmltYXJ5ID1cbiAgICB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyBtb2RlbCA6IChtb2RlbC5tb2RlbFNlcnZpY2VOYW1lID8/IG1vZGVsLm5hbWUpO1xuICByZXR1cm4gZGVmYXVsdFJlYXNvbmluZ0xldmVscyhwcmltYXJ5KTtcbn1cblxuLyoqIFJlc29sdmUgcmV0aXJlbWVudCwgY2FwYWJpbGl0eSwgYW5kIHJhdGUtbGltaXQgbWV0YWRhdGEgdG9nZXRoZXIuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxNZXRhZGF0YUZvcihtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsTWV0YWRhdGEge1xuICBjb25zdCByYXRlTGltaXRzID0gbW9kZWxSYXRlTGltaXRzRm9yKG1vZGVsKTtcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6IG1vZGVsU3RhdHVzRm9yKG1vZGVsKSxcbiAgICBjYXBhYmlsaXRpZXM6IG1vZGVsQ2FwYWJpbGl0aWVzRm9yKG1vZGVsKSxcbiAgICAuLi4ocmF0ZUxpbWl0cyA/IHsgcmF0ZUxpbWl0cyB9IDoge30pLFxuICB9O1xufVxuXG4vKiogUmV0dXJuIGdlbmVyYXRpb24gdGltZXN0YW1wcyBmb3IgdGhlIGNvbW1pdHRlZCBtZXRhZGF0YSBzbmFwc2hvdHMuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxNZXRhZGF0YUdlbmVyYXRlZEF0KCk6IFJlYWRvbmx5PHtcbiAgcmV0aXJlZE1vZGVsczogbnVtYmVyO1xuICBjYXBhYmlsaXRpZXM6IG51bWJlcjtcbiAgcmF0ZUxpbWl0czogbnVtYmVyO1xuICByZWFzb25pbmc6IG51bWJlcjtcbn0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXRpcmVkTW9kZWxzOiByZXRpcmVkTW9kZWxzU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gICAgY2FwYWJpbGl0aWVzOiBjYXBhYmlsaXRpZXNTbmFwc2hvdC5nZW5lcmF0ZWRBdCxcbiAgICByYXRlTGltaXRzOiByYXRlTGltaXRzU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gICAgcmVhc29uaW5nOiByZWFzb25pbmdTbmFwc2hvdC5nZW5lcmF0ZWRBdCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbW9kZWxJZGVudGl0aWVzKFxuICBtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgaW5jbHVkZURpc3BsYXlOYW1lID0gdHJ1ZSxcbik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFttb2RlbF07XG4gIHJldHVybiBbXG4gICAgbW9kZWwubmFtZSxcbiAgICAuLi4oaW5jbHVkZURpc3BsYXlOYW1lID8gW21vZGVsLmRpc3BsYXlOYW1lXSA6IFtdKSxcbiAgICBtb2RlbC5tb2RlbFNlcnZpY2VOYW1lLFxuICAgIC4uLk9iamVjdC52YWx1ZXMobW9kZWwuc2VydmljZU5hbWVzID8/IHt9KSxcbiAgXS5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gbW9kZWxLZXkodmFsdWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBtb2RlbFNlYXJjaFF1ZXJ5KHZhbHVlKT8ucmVwbGFjZUFsbChcIiBcIiwgXCItXCIpO1xufVxuXG5jb25zdCBSRVRJUkVEX01PREVMX1BSRUZJWEVTID0gbmV3IFNldChbXG4gIFwiYWlcIixcbiAgXCJhbnRocm9waWNcIixcbiAgXCJkYXRhYnJpY2tzXCIsXG4gIFwiZGJ4XCIsXG4gIFwiZ29vZ2xlXCIsXG4gIFwibWV0YVwiLFxuICBcIm9wZW5haVwiLFxuICBcInN5c3RlbVwiLFxuXSk7XG5cbmZ1bmN0aW9uIHJldGlyZWRNb2RlbEtleSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zID0gdmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvW2EtejAtOV0rL2cpID8/IFtdO1xuICB3aGlsZSAodG9rZW5zWzBdICYmIFJFVElSRURfTU9ERUxfUFJFRklYRVMuaGFzKHRva2Vuc1swXSkpIHRva2Vucy5zaGlmdCgpO1xuICByZXR1cm4gdG9rZW5zLmpvaW4oXCItXCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkUGFnZSh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgaGVhZGVyczogeyBcInVzZXItYWdlbnRcIjogVVNFUl9BR0VOVCB9LFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxNV8wMDApLFxuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIHJldHVybmVkIEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3VybH1gKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG5mdW5jdGlvbiBub3dTZWNvbmRzKCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbn1cbiJdfQ==
316
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxPQUFPLEtBQUssYUFBYSxNQUFNLHVDQUF1QyxDQUFDO0FBUXZFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQix1QkFBdUIsRUFDdkIsa0JBQWtCLEVBQ2xCLHFCQUFxQixHQUt0QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLGNBQWMsRUFDZCx3QkFBd0IsRUFDeEIsMkJBQTJCLEdBQzVCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyx3QkFBd0IsTUFBTSxxQ0FBcUMsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNqRyxPQUFPLHNCQUFzQixNQUFNLG9DQUFvQyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzlGLE9BQU8scUJBQXFCLE1BQU0sa0NBQWtDLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDM0YsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsc0JBQXNCLEdBRXZCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25HLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIseUJBQXlCLEVBQ3pCLGNBQWMsRUFDZCxvQkFBb0IsRUFHcEIscUJBQXFCLEdBQ3RCLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUNMLHFCQUFxQixFQUNy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Q3BDLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN6QixDQUFDO0FBRUQsU0FBUyxVQUFVO0lBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnVpbGQtZ2VuZXJhdGVkIERhdGFicmlja3MgbW9kZWwgcmV0aXJlbWVudCwgY2FwYWJpbGl0eSwgcmF0ZS1saW1pdCwgYW5kXG4gKiByZWFzb25pbmctZWZmb3J0IG1ldGFkYXRhLCBwbHVzIGEgZGFpbHkgd3JpdGUtdGhyb3VnaCBjYWNoZSBmb3IgcmVmcmVzaGVkXG4gKiBkb2NzIGFuZCBlcnJvci1sZWFybmVkIHJlYXNvbmluZyBsYWRkZXJzLlxuICpcbiAqIENvbW1pdHRlZCBzbmFwc2hvdHMgc2VlZCBldmVyeSBwcm9jZXNzLiB7QGxpbmsgcmVmcmVzaE1vZGVsTWV0YWRhdGF9IHB1bGxzXG4gKiBkb2N1bWVudGF0aW9uIHRocm91Z2gge0BsaW5rIGNyZWF0ZU1ldGFkYXRhQ2FjaGV9IChjYWNhY2hlIG1lbW9pemUgKyBkaXNrKSBhbmRcbiAqIHJlYnVpbGRzIHRoZSBpbi1tZW1vcnkgaW5kZXguIEVycm9yLWxlYXJuZWQgZWZmb3J0cyB1c2UgdGhlIHNhbWUgc3RvcmUgdmlhXG4gKiB7QGxpbmsgcmVtZW1iZXJSZWFzb25pbmdMZXZlbHN9LiBEaXNrIHdyaXRlcyBhcmUgc2tpcHBlZCBpbiBEYXRhYnJpY2tzIEFwcHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgKiBhcyBmdW5jdGlvblV0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2Z1bmN0aW9uLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzLFxuICBNb2RlbE1ldGFkYXRhLFxuICBNb2RlbFJhdGVMaW1pdHMsXG4gIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9jb250cmFjdHNcIjtcblxuaW1wb3J0IHtcbiAgTU9ERUxfTUVUQURBVEFfVFRMX01TLFxuICBNT0RFTF9SQVRFX0xJTUlUU19VUkwsXG4gIE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCxcbiAgUVVFUllfUkVBU09OX01PREVMU19VUkwsXG4gIFJFVElSRURfTU9ERUxTX1VSTCxcbiAgV0VCX1NFQVJDSF9NT0RFTFNfVVJMLFxuICB0eXBlIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3QsXG4gIHR5cGUgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlLFxuICB0eXBlIE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90LFxuICB0eXBlIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90LFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtY29udHJhY3QudHNcIjtcbmltcG9ydCB7XG4gIHBhcnNlTW9kZWxDYXBhYmlsaXRpZXMsXG4gIHBhcnNlTW9kZWxSYXRlTGltaXRzLFxuICBwYXJzZVJlYXNvbmluZ01vZGVscyxcbiAgcGFyc2VSZXRpcmVkTW9kZWxzLFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQge1xuICBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMsXG4gIG1vZGVsU3RhdHVzRm9yLFxuICByZXBsYWNlUmV0aXJlZE1vZGVsTmFtZXMsXG4gIFJFVElSRURfTU9ERUxTX0dFTkVSQVRFRF9BVCxcbn0gZnJvbSBcIi4vX3JldGlyZW1lbnQudHNcIjtcbmltcG9ydCBjYXBhYmlsaXRpZXNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLWNhcGFiaWxpdGllcy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgcmF0ZUxpbWl0c1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWwtcmF0ZS1saW1pdHMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHJlYXNvbmluZ1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWwtcmVhc29uaW5nLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7XG4gIGNyZWF0ZU1ldGFkYXRhQ2FjaGUsXG4gIG1lcmdlUHJlZmVyRnJlc2hMaXN0LFxuICBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxuICB0eXBlIE1ldGFkYXRhQ2FjaGUsXG59IGZyb20gXCIuL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5pbXBvcnQgeyBpbmhlcml0c05hdGl2ZVdlYlNlYXJjaCwgaXNGb3VuZGF0aW9uTW9kZWxJZGVudGl0eSwgbW9kZWxTZWFyY2hRdWVyeSB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuaW1wb3J0IHtcbiAgZGVmYXVsdFJlYXNvbmluZ0xldmVscyxcbiAgZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyxcbiAgcGFyc2VSZWFzb25pbmcsXG4gIHBhcnNlUmVhc29uaW5nTGV2ZWxzLFxuICB0eXBlIFJlYXNvbmluZ0xldmVsLFxuICB0eXBlIFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlLFxuICB1bmlxdWVSZWFzb25pbmdMZXZlbHMsXG59IGZyb20gXCIuL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuXG5leHBvcnQge1xuICBNT0RFTF9NRVRBREFUQV9UVExfTVMsXG4gIE1PREVMX1JBVEVfTElNSVRTX1VSTCxcbiAgT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMLFxuICBRVUVSWV9SRUFTT05fTU9ERUxTX1VSTCxcbiAgUkVUSVJFRF9NT0RFTFNfVVJMLFxuICBXRUJfU0VBUkNIX01PREVMU19VUkwsXG59O1xuXG5jb25zdCBjYXBhYmlsaXRpZXNTbmFwc2hvdCA9IGNhcGFiaWxpdGllc1NuYXBzaG90SnNvbiBhcyBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90O1xuY29uc3QgcmF0ZUxpbWl0c1NuYXBzaG90ID0gcmF0ZUxpbWl0c1NuYXBzaG90SnNvbiBhcyBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdDtcbmNvbnN0IHJlYXNvbmluZ1NuYXBzaG90ID0gcmVhc29uaW5nU25hcHNob3RKc29uIGFzIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90O1xuXG5pbnRlcmZhY2UgTWV0YWRhdGFJbmRleCB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczoge1xuICAgIHJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlXTogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcbiAgfTtcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlO1xuICByZWFkb25seSBsZWFybmVkUmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbn1cblxudHlwZSBDYXBhYmlsaXR5U2V0cyA9IE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZTtcblxuY29uc3QgVVNFUl9BR0VOVCA9IFwiZGJ4LXRvb2xzLW1vZGVsLW1ldGFkYXRhLzFcIjtcblxuY29uc3QgcmV0aXJlZENhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxyZWFkb25seSBzdHJpbmdbXT4oe1xuICBrZXk6IFwicmV0aXJlZC1tb2RlbHNcIixcbiAgZmFsbGJhY2s6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgbG9hZDogYXN5bmMgKCkgPT4gcGFyc2VSZXRpcmVkTW9kZWxzKGF3YWl0IGxvYWRQYWdlKFJFVElSRURfTU9ERUxTX1VSTCksIG5vd1NlY29uZHMoKSkubW9kZWxzLFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaExpc3QsXG59KTtcblxuY29uc3QgY2FwYWJpbGl0aWVzQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPENhcGFiaWxpdHlTZXRzPih7XG4gIGtleTogXCJtb2RlbC1jYXBhYmlsaXRpZXNcIixcbiAgZmFsbGJhY2s6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtyZXNwb25zZXNIdG1sLCB3ZWJTZWFyY2hIdG1sXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGxvYWRQYWdlKE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCksXG4gICAgICBsb2FkUGFnZShXRUJfU0VBUkNIX01PREVMU19VUkwpLFxuICAgIF0pO1xuICAgIHJldHVybiBwYXJzZU1vZGVsQ2FwYWJpbGl0aWVzKHJlc3BvbnNlc0h0bWwsIHdlYlNlYXJjaEh0bWwsIG5vd1NlY29uZHMoKSkuY2FwYWJpbGl0aWVzO1xuICB9LFxuICBtZXJnZTogKGlucHV0KSA9PiAoe1xuICAgIHJlc3BvbnNlczogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5yZXNwb25zZXMsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LnJlc3BvbnNlcyxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5yZXNwb25zZXMsXG4gICAgfSksXG4gICAgaW1hZ2VJbnB1dDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5pbWFnZUlucHV0LFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5pbWFnZUlucHV0LFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmltYWdlSW5wdXQsXG4gICAgfSksXG4gICAgYXBwbHlQYXRjaDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5hcHBseVBhdGNoLFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5hcHBseVBhdGNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmFwcGx5UGF0Y2gsXG4gICAgfSksXG4gICAgd2ViU2VhcmNoOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LndlYlNlYXJjaCxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8ud2ViU2VhcmNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLndlYlNlYXJjaCxcbiAgICB9KSxcbiAgfSksXG59KTtcblxuY29uc3QgcmF0ZUxpbWl0c0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+Pj4oe1xuICBrZXk6IFwibW9kZWwtcmF0ZS1saW1pdHNcIixcbiAgZmFsbGJhY2s6IHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICBsb2FkOiBhc3luYyAoKSA9PlxuICAgIHBhcnNlTW9kZWxSYXRlTGltaXRzKGF3YWl0IGxvYWRQYWdlKE1PREVMX1JBVEVfTElNSVRTX1VSTCksIG5vd1NlY29uZHMoKSkuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbWVyZ2U6IG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQsXG59KTtcblxuY29uc3QgcmVhc29uaW5nRG9jc0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+Pih7XG4gIGtleTogXCJtb2RlbC1yZWFzb25pbmdcIixcbiAgZmFsbGJhY2s6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgcGFyc2VSZWFzb25pbmdNb2RlbHMoYXdhaXQgbG9hZFBhZ2UoUVVFUllfUkVBU09OX01PREVMU19VUkwpLCBub3dTZWNvbmRzKCkpLmNhdGFsb2d1ZS5tb2RlbHMsXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmNvbnN0IGxlYXJuZWRSZWFzb25pbmdDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8XG4gIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+PlxuPih7XG4gIGtleTogXCJsZWFybmVkLXJlYXNvbmluZ1wiLFxuICBmYWxsYmFjazoge30sXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmxldCBsaXZlSW5kZXg6IE1ldGFkYXRhSW5kZXggfCB1bmRlZmluZWQ7XG5cbmNvbnN0IG1ldGFkYXRhSW5kZXggPSBmdW5jdGlvblV0aWxzLm1lbW9pemU8TWV0YWRhdGFJbmRleD4oXG4gICgpID0+IGxpdmVJbmRleCA/PyBidWlsZEluZGV4RnJvbUNvbW1pdHRlZCgpLFxuKTtcblxuZnVuY3Rpb24gYnVpbGRJbmRleEZyb21Db21taXR0ZWQoKTogTWV0YWRhdGFJbmRleCB7XG4gIHJldHVybiBidWlsZEluZGV4KHtcbiAgICByZXRpcmVkTmFtZXM6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgICBjYXBhYmlsaXRpZXM6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgICByYXRlTGltaXRzOiByYXRlTGltaXRzU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgICByZWFzb25pbmc6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gICAgbGVhcm5lZFJlYXNvbmluZzoge30sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEluZGV4KGlucHV0OiB7XG4gIHJlYWRvbmx5IHJldGlyZWROYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eVNldHM7XG4gIHJlYWRvbmx5IHJhdGVMaW1pdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0cz4+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG4gIHJlYWRvbmx5IGxlYXJuZWRSZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pjtcbn0pOiBNZXRhZGF0YUluZGV4IHtcbiAgcmVwbGFjZVJldGlyZWRNb2RlbE5hbWVzKGlucHV0LnJldGlyZWROYW1lcyk7XG4gIHJldHVybiB7XG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyksXG4gICAgICBpbWFnZUlucHV0OiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy5pbWFnZUlucHV0KSxcbiAgICAgIGFwcGx5UGF0Y2g6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2gpLFxuICAgICAgd2ViU2VhcmNoOiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gpLFxuICAgIH0sXG4gICAgcmF0ZUxpbWl0czogbmV3IE1hcChPYmplY3QuZW50cmllcyhpbnB1dC5yYXRlTGltaXRzKSksXG4gICAgcmVhc29uaW5nOiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoaW5wdXQucmVhc29uaW5nKSxcbiAgICBsZWFybmVkUmVhc29uaW5nOiBmcmVlemVMZWFybmVkQ2F0YWxvZ3VlKGlucHV0LmxlYXJuZWRSZWFzb25pbmcpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoXG4gIG1vZGVsczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pixcbik6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWxzKS5tYXAoKFtrZXksIGxldmVsc10pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBPYmplY3QuZnJlZXplKFxuICAgICAgICAgIHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMuZmxhdE1hcCgobGV2ZWwpID0+IHBhcnNlUmVhc29uaW5nKGxldmVsKSA/PyBbXSkpLFxuICAgICAgICApLFxuICAgICAgXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZnJlZXplTGVhcm5lZENhdGFsb2d1ZShcbiAgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj4sXG4pOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKG1vZGVscykubWFwKChba2V5LCBsZXZlbHNdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKSksXG4gICAgICBdKSxcbiAgICApLFxuICApO1xufVxuXG5sZXQgcmVmcmVzaEluZmxpZ2h0OiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEh5ZHJhdGUgb3IgcmVmcmVzaCBkb2N1bWVudGF0aW9uICsgbGVhcm5lZCBjYWNoZXMgaW50byB0aGUgcHJvY2VzcyBpbmRleC5cbiAqXG4gKiBTYWZlIHRvIGNhbGwgb24gZ2F0ZXdheSBzdGFydHVwLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgb25lIHJlZnJlc2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoTW9kZWxNZXRhZGF0YSgpOiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHtcbiAgaWYgKHJlZnJlc2hJbmZsaWdodCkgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbiAgcmVmcmVzaEluZmxpZ2h0ID0gKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcmV0aXJlZE5hbWVzLCBjYXBhYmlsaXRpZXMsIHJhdGVMaW1pdHMsIHJlYXNvbmluZywgbGVhcm5lZFJlYXNvbmluZ10gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFtcbiAgICAgICAgcmV0aXJlZENhY2hlLmdldCgpLFxuICAgICAgICBjYXBhYmlsaXRpZXNDYWNoZS5nZXQoKSxcbiAgICAgICAgcmF0ZUxpbWl0c0NhY2hlLmdldCgpLFxuICAgICAgICByZWFzb25pbmdEb2NzQ2FjaGUuZ2V0KCksXG4gICAgICAgIGxlYXJuZWRSZWFzb25pbmdDYWNoZS5nZXQoKSxcbiAgICAgIF0sXG4gICAgKTtcbiAgICBsaXZlSW5kZXggPSBidWlsZEluZGV4KHtcbiAgICAgIHJldGlyZWROYW1lcyxcbiAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgIHJhdGVMaW1pdHMsXG4gICAgICByZWFzb25pbmcsXG4gICAgICBsZWFybmVkUmVhc29uaW5nLFxuICAgIH0pO1xuICAgIHJldHVybiBsaXZlSW5kZXg7XG4gIH0pKCkuZmluYWxseSgoKSA9PiB7XG4gICAgcmVmcmVzaEluZmxpZ2h0ID0gdW5kZWZpbmVkO1xuICB9KTtcbiAgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbn1cblxuLyoqIExvYWQgY2FjYWNoZSAvIG1lbW9yeSBlbnRyaWVzIHdpdGhvdXQgZm9yY2luZyBhIG5ldHdvcmsgcmVmcmVzaC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlTW9kZWxNZXRhZGF0YSgpOiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHtcbiAgY29uc3QgW3JldGlyZWROYW1lcywgY2FwYWJpbGl0aWVzLCByYXRlTGltaXRzLCByZWFzb25pbmcsIGxlYXJuZWRSZWFzb25pbmddID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHBlZWtPckZhbGxiYWNrKHJldGlyZWRDYWNoZSwgQ09NTUlUVEVEX1JFVElSRURfTU9ERUxTKSxcbiAgICBwZWVrT3JGYWxsYmFjayhjYXBhYmlsaXRpZXNDYWNoZSwgY2FwYWJpbGl0aWVzU25hcHNob3QuY2FwYWJpbGl0aWVzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyYXRlTGltaXRzQ2FjaGUsIHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyZWFzb25pbmdEb2NzQ2FjaGUsIHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGxlYXJuZWRSZWFzb25pbmdDYWNoZSwge30pLFxuICBdKTtcbiAgbGl2ZUluZGV4ID0gYnVpbGRJbmRleCh7XG4gICAgcmV0aXJlZE5hbWVzLFxuICAgIGNhcGFiaWxpdGllcyxcbiAgICByYXRlTGltaXRzLFxuICAgIHJlYXNvbmluZyxcbiAgICBsZWFybmVkUmVhc29uaW5nLFxuICB9KTtcbiAgcmV0dXJuIGxpdmVJbmRleDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGVla09yRmFsbGJhY2s8VD4oY2FjaGU6IE1ldGFkYXRhQ2FjaGU8VD4sIGZhbGxiYWNrOiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHBlZWtlZCA9IGF3YWl0IGNhY2hlLnBlZWsoKTtcbiAgaWYgKHBlZWtlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcGVla2VkO1xuICByZXR1cm4gY2FjaGUuZ2V0KCkuY2F0Y2goKCkgPT4gZmFsbGJhY2spO1xufVxuXG4vKiogQWJzb2x1dGUgY2FjYWNoZSByb290IHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gLyBsZWFybmVkIGNhY2hlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbE1ldGFkYXRhQ2FjaGVQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiByZXRpcmVkQ2FjaGUucGF0aDtcbn1cblxuZXhwb3J0IHsgbW9kZWxTdGF0dXNGb3IsIHJldGlyZWRNb2RlbE5hbWVzIH0gZnJvbSBcIi4vX3JldGlyZW1lbnQudHNcIjtcblxuLyoqIFJldHVybiB0aGUgY29tbWl0dGVkIHJlYXNvbmluZy1lZmZvcnQgY2F0YWxvZ3VlLiBDYWNoZWQgcGVyIHByb2Nlc3MuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhc29uaW5nTW9kZWxDYXRhbG9ndWUoKTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUge1xuICByZXR1cm4gbWV0YWRhdGFJbmRleCgpLnJlYXNvbmluZztcbn1cblxuLyoqIFJldHVybiBlcnJvci1sZWFybmVkIHJlYXNvbmluZyBsYWRkZXJzIHBlcnNpc3RlZCBpbiB0aGUgbWV0YWRhdGEgY2FjaGUuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhcm5lZFJlYXNvbmluZ0NhdGFsb2d1ZSgpOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBtZXRhZGF0YUluZGV4KCkubGVhcm5lZFJlYXNvbmluZztcbn1cblxuLyoqXG4gKiBTdG9yZSBsZXZlbHMgbGVhcm5lZCBmcm9tIGFuIHVwc3RyZWFtIGVycm9yIGFuZCBwZXJzaXN0IHRoZW0gd3JpdGUtdGhyb3VnaC5cbiAqXG4gKiBFbXB0eSBsaXN0cyBhcmUgaWdub3JlZCBzbyBhIGZhaWxlZCBwYXJzZSBjYW5ub3Qgd2lwZSBkZWZhdWx0cy4gRXJyb3IgYm9kaWVzXG4gKiB0aGVtc2VsdmVzIGFyZSBuZXZlciBzdG9yZWQgLSBvbmx5IHRoZSBwYXJzZWQgbGFkZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtZW1iZXJSZWFzb25pbmdMZXZlbHMoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IFByb21pc2U8UmVhc29uaW5nTGV2ZWxbXT4ge1xuICBjb25zdCB1bmlxdWUgPSB1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKTtcbiAgaWYgKHVuaXF1ZS5sZW5ndGggPT09IDApIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGtleSA9IG1vZGVsS2V5KG1vZGVsKTtcbiAgaWYgKCFrZXkpIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGNhdGFsb2d1ZSA9IGF3YWl0IGxlYXJuZWRSZWFzb25pbmdDYWNoZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7XG4gICAgLi4uY3VycmVudCxcbiAgICBba2V5XTogdW5pcXVlLFxuICB9KSk7XG4gIGNvbnN0IGN1cnJlbnQgPSBtZXRhZGF0YUluZGV4KCk7XG4gIGxpdmVJbmRleCA9IHtcbiAgICAuLi5jdXJyZW50LFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IGZyZWV6ZUxlYXJuZWRDYXRhbG9ndWUoY2F0YWxvZ3VlKSxcbiAgfTtcbiAgcmV0dXJuIFsuLi51bmlxdWVdO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuIHVwc3RyZWFtIGVycm9yIGJvZHkgYW5kIHBlcnNpc3QgdGhlIHN1cHBvcnRlZCBsYWRkZXIgZm9yIGBtb2RlbGAuXG4gKlxuICogQWNjZXB0cyB0aGUgc2FtZSBuZXN0ZWQgRGF0YWJyaWNrcyBlbnZlbG9wZXMgYXMge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfS5cbiAqIFJldHVybnMgdGhlIGxldmVscyB0aGF0IHdlcmUgc3RvcmVkIChvciB0aGUgY3VycmVudCBsb29rdXAgd2hlbiBwYXJzZSB5aWVsZHNcbiAqIG5vdGhpbmcpLiBUaGUgcmF3IGVycm9yIGJvZHkgaXMgbmV2ZXIgd3JpdHRlbiB0byBkaXNrLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGVhcm5SZWFzb25pbmdMZXZlbHNGcm9tRXJyb3IoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGJvZHk6IHVua25vd24sXG4pOiBQcm9taXNlPFJlYXNvbmluZ0xldmVsW10+IHtcbiAgcmV0dXJuIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzKG1vZGVsLCBwYXJzZVJlYXNvbmluZ0xldmVscyhib2R5KSk7XG59XG5cbi8qKiBSZXNvbHZlIGRvY3VtZW50ZWQgbW9kZWwgY2FwYWJpbGl0aWVzIGZyb20gYSBuYW1lIG9yIGVuZHBvaW50IHN1bW1hcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxDYXBhYmlsaXRpZXNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbENhcGFiaWxpdGllcyB7XG4gIGNvbnN0IGNhcGFiaWxpdGllcyA9IG1ldGFkYXRhSW5kZXgoKS5jYXBhYmlsaXRpZXM7XG4gIGNvbnN0IGlkZW50aXRpZXMgPSBtb2RlbElkZW50aXRpZXMobW9kZWwsIGZhbHNlKTtcbiAgY29uc3Qga2V5cyA9IGlkZW50aXRpZXMuZmxhdE1hcCgoaWRlbnRpdHkpID0+IG1vZGVsS2V5KGlkZW50aXR5KSA/PyBbXSk7XG4gIHJldHVybiB7XG4gICAgcmVzcG9uc2VzOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnJlc3BvbnNlcy5oYXMoa2V5KSksXG4gICAgaW1hZ2VJbnB1dDoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5pbWFnZUlucHV0LmhhcyhrZXkpKSxcbiAgICBhcHBseVBhdGNoOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2guaGFzKGtleSkpLFxuICAgIC8vIFZlcnNpb24gaW5oZXJpdGFuY2Ugb25seSBhcHBsaWVzIHRvIGhvc3RlZCBmb3VuZGF0aW9uIGlkZW50aXRpZXMuXG4gICAgd2ViU2VhcmNoOlxuICAgICAga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy53ZWJTZWFyY2guaGFzKGtleSkpIHx8XG4gICAgICBpZGVudGl0aWVzLnNvbWUoXG4gICAgICAgIChpZGVudGl0eSkgPT5cbiAgICAgICAgICBpc0ZvdW5kYXRpb25Nb2RlbElkZW50aXR5KGlkZW50aXR5KSAmJlxuICAgICAgICAgIGluaGVyaXRzTmF0aXZlV2ViU2VhcmNoKGlkZW50aXR5LCBjYXBhYmlsaXRpZXMud2ViU2VhcmNoKSxcbiAgICAgICksXG4gIH07XG59XG5cbi8qKiBSZXNvbHZlIHB1Ymxpc2hlZCBJVFBNLCBPVFBNLCBhbmQgUVBIIGxpbWl0cyBmcm9tIGEgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSYXRlTGltaXRzRm9yKFxuICBtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbik6IE1vZGVsUmF0ZUxpbWl0cyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxpbWl0cyA9IG1ldGFkYXRhSW5kZXgoKS5yYXRlTGltaXRzO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbEtleShpZGVudGl0eSk7XG4gICAgaWYgKCFrZXkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZvdW5kID0gbGltaXRzLmdldChrZXkpO1xuICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSByZWFzb25pbmcgbGV2ZWxzOiBsZWFybmVkIGZyb20gZXJyb3JzLCB0aGVuIGRvY3VtZW50YXRpb24sIHRoZW5cbiAqIGZhbWlseSBkZWZhdWx0cy5cbiAqXG4gKiBEb2VzIG5vdCBwYXJzZSBlcnJvciBib2RpZXM7IGNhbGxlcnMgc2hvdWxkIHVzZSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9XG4gKiBhbmQgdGhlbiB7QGxpbmsgcmVtZW1iZXJSZWFzb25pbmdMZXZlbHN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSZWFzb25pbmdMZXZlbHNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgaW5kZXggPSBtZXRhZGF0YUluZGV4KCk7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGxlYXJuZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5sZWFybmVkUmVhc29uaW5nKTtcbiAgICBpZiAobGVhcm5lZD8ubGVuZ3RoKSByZXR1cm4gbGVhcm5lZDtcbiAgfVxuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBkb2N1bWVudGVkID0gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhpZGVudGl0eSwgaW5kZXgucmVhc29uaW5nKTtcbiAgICBpZiAoZG9jdW1lbnRlZD8ubGVuZ3RoKSByZXR1cm4gZG9jdW1lbnRlZDtcbiAgfVxuICBjb25zdCBwcmltYXJ5ID0gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiAobW9kZWwubW9kZWxTZXJ2aWNlTmFtZSA/PyBtb2RlbC5uYW1lKTtcbiAgcmV0dXJuIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMocHJpbWFyeSk7XG59XG5cbi8qKiBSZXNvbHZlIHJldGlyZW1lbnQsIGNhcGFiaWxpdHksIGFuZCByYXRlLWxpbWl0IG1ldGFkYXRhIHRvZ2V0aGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhIHtcbiAgY29uc3QgcmF0ZUxpbWl0cyA9IG1vZGVsUmF0ZUxpbWl0c0Zvcihtb2RlbCk7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiBtb2RlbFN0YXR1c0Zvcihtb2RlbCksXG4gICAgY2FwYWJpbGl0aWVzOiBtb2RlbENhcGFiaWxpdGllc0Zvcihtb2RlbCksXG4gICAgLi4uKHJhdGVMaW1pdHMgPyB7IHJhdGVMaW1pdHMgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIFJldHVybiBnZW5lcmF0aW9uIHRpbWVzdGFtcHMgZm9yIHRoZSBjb21taXR0ZWQgbWV0YWRhdGEgc25hcHNob3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFHZW5lcmF0ZWRBdCgpOiBSZWFkb25seTx7XG4gIHJldGlyZWRNb2RlbHM6IG51bWJlcjtcbiAgY2FwYWJpbGl0aWVzOiBudW1iZXI7XG4gIHJhdGVMaW1pdHM6IG51bWJlcjtcbiAgcmVhc29uaW5nOiBudW1iZXI7XG59PiB7XG4gIHJldHVybiB7XG4gICAgcmV0aXJlZE1vZGVsczogUkVUSVJFRF9NT0RFTFNfR0VORVJBVEVEX0FULFxuICAgIGNhcGFiaWxpdGllczogY2FwYWJpbGl0aWVzU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gICAgcmF0ZUxpbWl0czogcmF0ZUxpbWl0c1NuYXBzaG90LmdlbmVyYXRlZEF0LFxuICAgIHJlYXNvbmluZzogcmVhc29uaW5nU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vZGVsSWRlbnRpdGllcyhcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGluY2x1ZGVEaXNwbGF5TmFtZSA9IHRydWUsXG4pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIHJldHVybiBbbW9kZWxdO1xuICByZXR1cm4gW1xuICAgIG1vZGVsLm5hbWUsXG4gICAgLi4uKGluY2x1ZGVEaXNwbGF5TmFtZSA/IFttb2RlbC5kaXNwbGF5TmFtZV0gOiBbXSksXG4gICAgbW9kZWwubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAuLi5PYmplY3QudmFsdWVzKG1vZGVsLnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIG1vZGVsS2V5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gbW9kZWxTZWFyY2hRdWVyeSh2YWx1ZSk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFBhZ2UodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIGhlYWRlcnM6IHsgXCJ1c2VyLWFnZW50XCI6IFVTRVJfQUdFTlQgfSxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTVfMDAwKSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiByZXR1cm5lZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHt1cmx9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuZnVuY3Rpb24gbm93U2Vjb25kcygpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG59XG4iXX0=
@@ -13,6 +13,8 @@ export interface ModelClientOptions {
13
13
  auth?: ModelAuthOptions;
14
14
  /** In-memory endpoint catalogue TTL in milliseconds. */
15
15
  cacheTtlMs?: number;
16
+ /** Hydrate Node-only metadata caches before constructing the client. */
17
+ hydrateMetadata?: boolean;
16
18
  }
17
19
  /** Secret-free runtime identity and cache configuration. */
18
20
  export interface ModelClientStatus {