@dbx-tools/model 0.9.40 → 0.9.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/policy.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /** TypeScript-owned model-family and serving capability policy. */
2
2
  import { ModelClass, } from "@dbx-tools/shared-model/contracts";
3
- import { supportsToolsByFamily } from "./classify.js";
3
+ import { compareVersionTuples, supportsToolsByFamily, versionTuple } from "./classify.js";
4
4
  const FAMILIES = [
5
5
  "claude",
6
6
  "gpt",
@@ -37,6 +37,51 @@ export function modelSearchQuery(name) {
37
37
  return undefined;
38
38
  return [parsed.family, ...parsed.version.map(String), ...parsed.model].join(" ");
39
39
  }
40
+ /**
41
+ * Return whether `name` has native web search: an exact documented identity, or
42
+ * a later {@link versionTuple} in the same family as a documented native
43
+ * web-search model. Intra-family floors use the name digit parser so identities
44
+ * like `databricks-claude-opus-4-8` and `system.ai.gpt-6-1-sol` compare.
45
+ * Hosted GPT-OSS weights never inherit.
46
+ */
47
+ export function inheritsNativeWebSearch(name, documented) {
48
+ const documentedKeys = documented instanceof Set ? documented : new Set(documented);
49
+ const key = modelSearchQuery(name)?.replaceAll(" ", "-");
50
+ if (key && documentedKeys.has(key))
51
+ return true;
52
+ const family = modelFamily(name);
53
+ if (!family || isOpenWeightsGpt(name))
54
+ return false;
55
+ const version = versionTuple(name);
56
+ if (isZeroVersion(version))
57
+ return false;
58
+ let floor;
59
+ for (const entry of documentedKeys) {
60
+ if (modelFamily(entry) !== family || isOpenWeightsGpt(entry))
61
+ continue;
62
+ const documentedVersion = versionTuple(entry);
63
+ if (isZeroVersion(documentedVersion))
64
+ continue;
65
+ if (!floor || compareVersionTuples(documentedVersion, floor) < 0) {
66
+ floor = documentedVersion;
67
+ }
68
+ }
69
+ return floor !== undefined && compareVersionTuples(version, floor) >= 0;
70
+ }
71
+ /**
72
+ * Return whether an identity names a Databricks-hosted foundation model
73
+ * (`databricks-*` endpoint or `system.ai.*` model service). Custom and
74
+ * external endpoints use arbitrary names, so their digits are not versions.
75
+ */
76
+ export function isFoundationModelIdentity(name) {
77
+ return /^(?:databricks-|system\.ai\.)/i.test(name.trim());
78
+ }
79
+ function isOpenWeightsGpt(name) {
80
+ return modelFamily(name) === "gpt" && /(?:^|[-_.])oss(?:[-_.]|$)/i.test(name);
81
+ }
82
+ function isZeroVersion(version) {
83
+ return version.every((part) => (part ?? 0) === 0);
84
+ }
40
85
  /** Return the reasoning efforts accepted by a model family. */
41
86
  export function modelReasoningEfforts(name) {
42
87
  const normalized = name.toLowerCase();
@@ -187,4 +232,4 @@ function parseModelName(name) {
187
232
  model: [...remainder.slice(0, versionStart), ...remainder.slice(cursor)],
188
233
  };
189
234
  }
190
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtRUFBbUU7QUFFbkUsT0FBTyxFQUNMLFVBQVUsR0FHWCxNQUFNLG1DQUFtQyxDQUFDO0FBRTNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV0RCxNQUFNLFFBQVEsR0FBRztJQUNmLFFBQVE7SUFDUixLQUFLO0lBQ0wsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sVUFBVTtJQUNWLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLE9BQU87SUFDUCxTQUFTO0lBQ1QsS0FBSztJQUNMLEtBQUs7Q0FDRyxDQUFDO0FBRVgsTUFBTSxRQUFRLEdBQXNCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RCxNQUFNLE9BQU8sR0FBc0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JGLE1BQU0sV0FBVyxHQUFzQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkUsTUFBTSxNQUFNLEdBQXNCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0YsTUFBTSxNQUFNLEdBQXNCLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFRdkUsaUVBQWlFO0FBQ2pFLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWTtJQUN0QyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7QUFDdEMsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQWM7SUFD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QUcsWUFBWSxDQUFDO0lBQzFCLE9BQU8sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdEYsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU87UUFDTCxNQUFNO1FBQ04sT0FBTztRQUNQLEtBQUssRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3pFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFR5cGVTY3JpcHQtb3duZWQgbW9kZWwtZmFtaWx5IGFuZCBzZXJ2aW5nIGNhcGFiaWxpdHkgcG9saWN5LiAqL1xuXG5pbXBvcnQge1xuICBNb2RlbENsYXNzLFxuICB0eXBlIFJlYXNvbmluZ0VmZm9ydCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbmltcG9ydCB7IHN1cHBvcnRzVG9vbHNCeUZhbWlseSB9IGZyb20gXCIuL2NsYXNzaWZ5LnRzXCI7XG5cbmNvbnN0IEZBTUlMSUVTID0gW1xuICBcImNsYXVkZVwiLFxuICBcImdwdFwiLFxuICBcImdlbWluaVwiLFxuICBcImxsYW1hXCIsXG4gIFwiZ3Jva1wiLFxuICBcImRlZXBzZWVrXCIsXG4gIFwicXdlblwiLFxuICBcImdsbVwiLFxuICBcImtpbWlcIixcbiAgXCJnZW1tYVwiLFxuICBcImlua2xpbmdcIixcbiAgXCJiZ2VcIixcbiAgXCJndGVcIixcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IFNUQU5EQVJEOiBSZWFzb25pbmdFZmZvcnRbXSA9IFtcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIl07XG5jb25zdCBHUFRfNV82OiBSZWFzb25pbmdFZmZvcnRbXSA9IFtcIm5vbmVcIiwgXCJsb3dcIiwgXCJtZWRpdW1cIiwgXCJoaWdoXCIsIFwieGhpZ2hcIiwgXCJtYXhcIl07XG5jb25zdCBHUFRfNV81X1BSTzogUmVhc29uaW5nRWZmb3J0W10gPSBbXCJtZWRpdW1cIiwgXCJoaWdoXCIsIFwieGhpZ2hcIl07XG5jb25zdCBDTEFVREU6IFJlYXNvbmluZ0VmZm9ydFtdID0gW1wibm9uZVwiLCBcIm1pbmltYWxcIiwgXCJsb3dcIiwgXCJtZWRpdW1cIiwgXCJoaWdoXCIsIFwieGhpZ2hcIiwgXCJtYXhcIl07XG5jb25zdCBHRU1JTkk6IFJlYXNvbmluZ0VmZm9ydFtdID0gW1wibWluaW1hbFwiLCBcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIl07XG5cbmludGVyZmFjZSBQYXJzZWRNb2RlbE5hbWUge1xuICBmYW1pbHk6ICh0eXBlb2YgRkFNSUxJRVMpW251bWJlcl07XG4gIHZlcnNpb246IG51bWJlcltdO1xuICBtb2RlbDogc3RyaW5nW107XG59XG5cbi8qKiBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgZmFtaWx5IHBhcnNlZCBmcm9tIGEgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxGYW1pbHkobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHBhcnNlTW9kZWxOYW1lKG5hbWUpPy5mYW1pbHk7XG59XG5cbi8qKiBSYW5rIGEgZmFtaWx5IGJ5IGhvdyBtYWpvciBpdCBpczsgdW5yZWNvZ25pemVkIGZhbWlsaWVzIHNvcnQgbGFzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbEZhbWlseVJhbmsoZmFtaWx5OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IEZBTUlMSUVTLmluZGV4T2YoZmFtaWx5IGFzICh0eXBlb2YgRkFNSUxJRVMpW251bWJlcl0pO1xuICByZXR1cm4gaW5kZXggPj0gMCA/IGluZGV4IDogRkFNSUxJRVMubGVuZ3RoO1xufVxuXG4vKiogTm9ybWFsaXplIGEgcmVjb2duaXplZCBtb2RlbCBpZGVudGl0eSBpbnRvIGZhbWlseSwgdmVyc2lvbiwgYW5kIHZhcmlhbnQgdG9rZW5zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsU2VhcmNoUXVlcnkobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VNb2RlbE5hbWUobmFtZSk7XG4gIGlmICghcGFyc2VkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gW3BhcnNlZC5mYW1pbHksIC4uLnBhcnNlZC52ZXJzaW9uLm1hcChTdHJpbmcpLCAuLi5wYXJzZWQubW9kZWxdLmpvaW4oXCIgXCIpO1xufVxuXG4vKiogUmV0dXJuIHRoZSByZWFzb25pbmcgZWZmb3J0cyBhY2NlcHRlZCBieSBhIG1vZGVsIGZhbWlseS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFJlYXNvbmluZ0VmZm9ydHMobmFtZTogc3RyaW5nKTogUmVhc29uaW5nRWZmb3J0W10ge1xuICBjb25zdCBub3JtYWxpemVkID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU1vZGVsTmFtZShuYW1lKTtcbiAgbGV0IGVmZm9ydHM6IFJlYXNvbmluZ0VmZm9ydFtdID0gW107XG4gIGlmIChwYXJzZWQ/LmZhbWlseSA9PT0gXCJncHRcIiAmJiBwYXJzZWQudmVyc2lvbi5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgW21ham9yID0gMCwgbWlub3IgPSAwXSA9IHBhcnNlZC52ZXJzaW9uO1xuICAgIGlmIChtYWpvciA+PSA1KSB7XG4gICAgICBlZmZvcnRzID1cbiAgICAgICAgbWFqb3IgPT09IDUgJiYgbWlub3IgPT09IDUgJiYgcGFyc2VkLm1vZGVsLmluY2x1ZGVzKFwicHJvXCIpXG4gICAgICAgICAgPyBHUFRfNV81X1BST1xuICAgICAgICAgIDogbWFqb3IgPT09IDUgJiYgbWlub3IgPT09IDZcbiAgICAgICAgICAgID8gR1BUXzVfNlxuICAgICAgICAgICAgOiBTVEFOREFSRDtcbiAgICB9XG4gIH1cbiAgaWYgKHBhcnNlZD8uZmFtaWx5ID09PSBcImdwdFwiICYmIHBhcnNlZC5tb2RlbC5pbmNsdWRlcyhcIm9zc1wiKSkgZWZmb3J0cyA9IFNUQU5EQVJEO1xuICBpZiAocGFyc2VkPy5mYW1pbHkgPT09IFwiY2xhdWRlXCIpIHtcbiAgICBjb25zdCBbbWFqb3IgPSAwLCBtaW5vciA9IDBdID0gcGFyc2VkLnZlcnNpb247XG4gICAgaWYgKG1ham9yID4gMyB8fCAobWFqb3IgPT09IDMgJiYgbWlub3IgPj0gNykpIGVmZm9ydHMgPSBDTEFVREU7XG4gIH1cbiAgaWYgKHBhcnNlZD8uZmFtaWx5ID09PSBcImdlbWluaVwiKSBlZmZvcnRzID0gR0VNSU5JO1xuICBpZiAobm9ybWFsaXplZC5pbmNsdWRlcyhcImNvZGV4XCIpIHx8IC8oPzpefFstXy4vXSlvKD86MXwzfDQpKD86Wy1fLi9dfCQpL2kudGVzdChuYW1lKSkge1xuICAgIGVmZm9ydHMgPSBTVEFOREFSRDtcbiAgfVxuICByZXR1cm4gZWZmb3J0cztcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIHBvbGljeSB2ZXJpZmllcyBhIGNvbXBsZXRlIHRvb2wtY2FsbGluZyByb3VuZCB0cmlwLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsU3VwcG9ydHNUb29scyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN1cHBvcnRzVG9vbHNCeUZhbWlseShuYW1lKTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGEgZGlzY292ZXJlZCBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgYSB0b29sLWNhbGxpbmcgY2hhdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmRwb2ludFN1cHBvcnRzVG9vbHMoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBib29sZWFuIHtcbiAgY29uc3QgZW1iZWRkaW5nID1cbiAgICBlbmRwb2ludC50YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCIgfHwgZW5kcG9pbnQuY2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nO1xuICBjb25zdCBjaGF0ID0gIWVtYmVkZGluZyAmJiAoZW5kcG9pbnQudGFzayA9PT0gXCJsbG0vdjEvY2hhdFwiIHx8IGVuZHBvaW50LmNsYXNzICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gY2hhdCAmJiAoZW5kcG9pbnQuc3VwcG9ydHNUb29scyA/PyBtb2RlbFN1cHBvcnRzVG9vbHMoZW5kcG9pbnQubmFtZSkpO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgYSBtb2RlbCByZXF1aXJlcyBEYXRhYnJpY2tzJyBuYXRpdmUgUmVzcG9uc2VzIGVuZHBvaW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzcG9uc2VzT25seShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImNvZGV4XCIpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VNb2RlbE5hbWUobmFtZSk7XG4gIGlmICghcGFyc2VkIHx8IHBhcnNlZC5mYW1pbHkgIT09IFwiZ3B0XCIgfHwgcGFyc2VkLm1vZGVsLmluY2x1ZGVzKFwib3NzXCIpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IFttYWpvciA9IDAsIG1pbm9yID0gMF0gPSBwYXJzZWQudmVyc2lvbjtcbiAgcmV0dXJuIG1ham9yID4gNSB8fCAobWFqb3IgPT09IDUgJiYgbWlub3IgPj0gNCk7XG59XG5cbi8qKiBSZXR1cm4gdGhlIERhdGFicmlja3MgaW5mZXJlbmNlIHByb3RvY29sIHJlcXVpcmVkIGJ5IGEgbW9kZWwuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxTZXJ2aW5nQXBpKG5hbWU6IHN0cmluZyk6IFwiY2hhdFwiIHwgXCJyZXNwb25zZXNcIiB7XG4gIHJldHVybiBpc1Jlc3BvbnNlc09ubHkobmFtZSkgPyBcInJlc3BvbnNlc1wiIDogXCJjaGF0XCI7XG59XG5cbi8qKiBSZXR1cm4gdGhlIENoYXQgQ29tcGxldGlvbnMgZWZmb3J0IHJlcXVpcmVkIHdoZW4gZnVuY3Rpb24gdG9vbHMgYXJlIHByZXNlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFRvb2xSZWFzb25pbmdFZmZvcnQobmFtZTogc3RyaW5nKTogUmVhc29uaW5nRWZmb3J0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VNb2RlbE5hbWUobmFtZSk7XG4gIGlmICghcGFyc2VkIHx8IHBhcnNlZC5mYW1pbHkgIT09IFwiZ3B0XCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFttYWpvciA9IDAsIG1pbm9yID0gMF0gPSBwYXJzZWQudmVyc2lvbjtcbiAgcmV0dXJuIG1ham9yID09PSA1ICYmIG1pbm9yID09PSA2ID8gXCJub25lXCIgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBEZXJpdmUgcHJvdmlkZXItc3BlY2lmaWMgbW9kZWwgbmFtZXMgZnJvbSBhIERhdGFicmlja3MgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxTZXJ2aWNlTmFtZXMobmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTW9kZWxOYW1lKG5hbWUpO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIHt9O1xuICBjb25zdCB2ZXJzaW9uID0gcGFyc2VkLnZlcnNpb24uam9pbihcIi5cIik7XG4gIGNvbnN0IHN1ZmZpeCA9IHBhcnNlZC5tb2RlbC5sZW5ndGggPyBgLSR7cGFyc2VkLm1vZGVsLmpvaW4oXCItXCIpfWAgOiBcIlwiO1xuICBzd2l0Y2ggKHBhcnNlZC5mYW1pbHkpIHtcbiAgICBjYXNlIFwiZ3B0XCI6XG4gICAgICByZXR1cm4gcGFyc2VkLm1vZGVsLmluY2x1ZGVzKFwib3NzXCIpID8ge30gOiB7IG9wZW5haTogYGdwdC0ke3ZlcnNpb259JHtzdWZmaXh9YCB9O1xuICAgIGNhc2UgXCJjbGF1ZGVcIjoge1xuICAgICAgY29uc3QgW3ZhcmlhbnQsIC4uLnJlc3RdID0gcGFyc2VkLm1vZGVsO1xuICAgICAgcmV0dXJuIHZhcmlhbnRcbiAgICAgICAgPyB7IGFudGhyb3BpYzogYGNsYXVkZS0ke3ZhcmlhbnR9LSR7dmVyc2lvbn0ke3Jlc3QubGVuZ3RoID8gYC0ke3Jlc3Quam9pbihcIi1cIil9YCA6IFwiXCJ9YCB9XG4gICAgICAgIDoge307XG4gICAgfVxuICAgIGNhc2UgXCJnZW1pbmlcIjpcbiAgICBjYXNlIFwiZ2VtbWFcIjpcbiAgICAgIHJldHVybiB7IGdvb2dsZTogYCR7cGFyc2VkLmZhbWlseX0tJHt2ZXJzaW9ufSR7c3VmZml4fWAgfTtcbiAgICBjYXNlIFwiZ2xtXCI6XG4gICAgICByZXR1cm4geyB6aGlwdTogYGdsbS0ke3ZlcnNpb259JHtzdWZmaXh9YCB9O1xuICAgIGNhc2UgXCJncm9rXCI6XG4gICAgICByZXR1cm4geyB4YWk6IGBncm9rLSR7dmVyc2lvbn0ke3N1ZmZpeH1gIH07XG4gICAgY2FzZSBcImxsYW1hXCI6XG4gICAgICByZXR1cm4geyBtZXRhOiBgbGxhbWEtJHt2ZXJzaW9ufSR7c3VmZml4fWAgfTtcbiAgICBjYXNlIFwicXdlblwiOlxuICAgICAgcmV0dXJuIHsgYWxpYmFiYTogYHF3ZW4ke3ZlcnNpb259JHtzdWZmaXh9YCB9O1xuICAgIGNhc2UgXCJkZWVwc2Vla1wiOlxuICAgICAgcmV0dXJuIHsgZGVlcHNlZWs6IGBkZWVwc2Vlay12JHtwYXJzZWQudmVyc2lvblswXSA/PyBcIlwifSR7c3VmZml4fWAgfTtcbiAgICBjYXNlIFwia2ltaVwiOlxuICAgICAgcmV0dXJuIHsgbW9vbnNob3Q6IGBraW1pLWske3BhcnNlZC52ZXJzaW9uWzBdID8/IFwiXCJ9JHtzdWZmaXh9YCB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VNb2RlbE5hbWUobmFtZTogc3RyaW5nKTogUGFyc2VkTW9kZWxOYW1lIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gbmFtZS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9bYS16MC05XSsvZykgPz8gW107XG4gIGxldCBmYW1pbHlJbmRleCA9IC0xO1xuICBsZXQgZmFtaWx5OiBQYXJzZWRNb2RlbE5hbWVbXCJmYW1pbHlcIl0gfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICBjb25zdCBjb21wYWN0UXdlbiA9IC9ecXdlbihcXGQrKSQvLmV4ZWModG9rZW4pO1xuICAgIGlmIChjb21wYWN0UXdlbikge1xuICAgICAgZmFtaWx5SW5kZXggPSBpbmRleDtcbiAgICAgIGZhbWlseSA9IFwicXdlblwiO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChGQU1JTElFUy5pbmNsdWRlcyh0b2tlbiBhcyBQYXJzZWRNb2RlbE5hbWVbXCJmYW1pbHlcIl0pKSB7XG4gICAgICBmYW1pbHlJbmRleCA9IGluZGV4O1xuICAgICAgZmFtaWx5ID0gdG9rZW4gYXMgUGFyc2VkTW9kZWxOYW1lW1wiZmFtaWx5XCJdO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmICghZmFtaWx5IHx8IGZhbWlseUluZGV4IDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVtYWluZGVyID0gdG9rZW5zLnNsaWNlKGZhbWlseUluZGV4ICsgMSk7XG4gIGNvbnN0IG51bWVyaWMgPSAodmFsdWU6IHN0cmluZykgPT4gL15cXGQrJC8udGVzdCh2YWx1ZSk7XG4gIGxldCB2ZXJzaW9uU3RhcnQgPSByZW1haW5kZXIuZmluZEluZGV4KG51bWVyaWMpO1xuICBpZiAoZmFtaWx5ID09PSBcInF3ZW5cIiAmJiAvXnF3ZW5cXGQrJC8udGVzdCh0b2tlbnNbZmFtaWx5SW5kZXhdISkpIHtcbiAgICB2ZXJzaW9uU3RhcnQgPSAwO1xuICAgIHJlbWFpbmRlci51bnNoaWZ0KHRva2Vuc1tmYW1pbHlJbmRleF0hLnNsaWNlKDQpKTtcbiAgfVxuICBpZiAoZmFtaWx5ID09PSBcImRlZXBzZWVrXCIpIHtcbiAgICBjb25zdCBwcmVmaXhlZCA9IHJlbWFpbmRlci5maW5kSW5kZXgoKHZhbHVlKSA9PiAvXnZcXGQrJC8udGVzdCh2YWx1ZSkpO1xuICAgIGlmIChwcmVmaXhlZCA+PSAwKSByZW1haW5kZXJbcHJlZml4ZWRdID0gcmVtYWluZGVyW3ByZWZpeGVkXSEuc2xpY2UoMSk7XG4gICAgdmVyc2lvblN0YXJ0ID0gcmVtYWluZGVyLmZpbmRJbmRleChudW1lcmljKTtcbiAgfVxuICBpZiAoZmFtaWx5ID09PSBcImtpbWlcIikge1xuICAgIGNvbnN0IHByZWZpeGVkID0gcmVtYWluZGVyLmZpbmRJbmRleCgodmFsdWUpID0+IC9ea1xcZCskLy50ZXN0KHZhbHVlKSk7XG4gICAgaWYgKHByZWZpeGVkID49IDApIHJlbWFpbmRlcltwcmVmaXhlZF0gPSByZW1haW5kZXJbcHJlZml4ZWRdIS5zbGljZSgxKTtcbiAgICB2ZXJzaW9uU3RhcnQgPSByZW1haW5kZXIuZmluZEluZGV4KG51bWVyaWMpO1xuICB9XG4gIGlmICh2ZXJzaW9uU3RhcnQgPCAwKSByZXR1cm4geyBmYW1pbHksIHZlcnNpb246IFtdLCBtb2RlbDogcmVtYWluZGVyIH07XG4gIGNvbnN0IHZlcnNpb246IG51bWJlcltdID0gW107XG4gIGxldCBjdXJzb3IgPSB2ZXJzaW9uU3RhcnQ7XG4gIHdoaWxlIChjdXJzb3IgPCByZW1haW5kZXIubGVuZ3RoICYmIHZlcnNpb24ubGVuZ3RoIDwgMiAmJiBudW1lcmljKHJlbWFpbmRlcltjdXJzb3JdISkpIHtcbiAgICB2ZXJzaW9uLnB1c2goTnVtYmVyKHJlbWFpbmRlcltjdXJzb3JdKSk7XG4gICAgY3Vyc29yICs9IDE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBmYW1pbHksXG4gICAgdmVyc2lvbixcbiAgICBtb2RlbDogWy4uLnJlbWFpbmRlci5zbGljZSgwLCB2ZXJzaW9uU3RhcnQpLCAuLi5yZW1haW5kZXIuc2xpY2UoY3Vyc29yKV0sXG4gIH07XG59XG4iXX0=
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtRUFBbUU7QUFFbkUsT0FBTyxFQUNMLFVBQVUsR0FHWCxNQUFNLG1DQUFtQyxDQUFDO0FBRTNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUYsTUFBTSxRQUFRLEdBQUc7SUFDZixRQUFRO0lBQ1IsS0FBSztJQUNMLFFBQVE7SUFDUixPQUFPO0lBQ1AsTUFBTTtJQUNOLFVBQVU7SUFDVixNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsU0FBUztJQUNULEtBQUs7SUFDTCxLQUFLO0NBQ0csQ0FBQztBQUVYLE1BQU0sUUFBUSxHQUFzQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDOUQsTUFBTSxPQUFPLEdBQXNCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNyRixNQUFNLFdBQVcsR0FBc0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25FLE1BQU0sTUFBTSxHQUFzQixDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9GLE1BQU0sTUFBTSxHQUFzQixDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBUXZFLGlFQUFpRTtBQUNqRSxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVk7SUFDdEMsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO0FBQ3RDLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsTUFBTSxV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cmlwdC1vd25lZCBtb2RlbC1mYW1pbHkgYW5kIHNlcnZpbmcgY2FwYWJpbGl0eSBwb2xpY3kuICovXG5cbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIHR5cGUgUmVhc29uaW5nRWZmb3J0LFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9jb250cmFjdHNcIjtcblxuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25UdXBsZXMsIHN1cHBvcnRzVG9vbHNCeUZhbWlseSwgdmVyc2lvblR1cGxlIH0gZnJvbSBcIi4vY2xhc3NpZnkudHNcIjtcblxuY29uc3QgRkFNSUxJRVMgPSBbXG4gIFwiY2xhdWRlXCIsXG4gIFwiZ3B0XCIsXG4gIFwiZ2VtaW5pXCIsXG4gIFwibGxhbWFcIixcbiAgXCJncm9rXCIsXG4gIFwiZGVlcHNlZWtcIixcbiAgXCJxd2VuXCIsXG4gIFwiZ2xtXCIsXG4gIFwia2ltaVwiLFxuICBcImdlbW1hXCIsXG4gIFwiaW5rbGluZ1wiLFxuICBcImJnZVwiLFxuICBcImd0ZVwiLFxuXSBhcyBjb25zdDtcblxuY29uc3QgU1RBTkRBUkQ6IFJlYXNvbmluZ0VmZm9ydFtdID0gW1wibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiXTtcbmNvbnN0IEdQVF81XzY6IFJlYXNvbmluZ0VmZm9ydFtdID0gW1wibm9uZVwiLCBcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIiwgXCJ4aGlnaFwiLCBcIm1heFwiXTtcbmNvbnN0IEdQVF81XzVfUFJPOiBSZWFzb25pbmdFZmZvcnRbXSA9IFtcIm1lZGl1bVwiLCBcImhpZ2hcIiwgXCJ4aGlnaFwiXTtcbmNvbnN0IENMQVVERTogUmVhc29uaW5nRWZmb3J0W10gPSBbXCJub25lXCIsIFwibWluaW1hbFwiLCBcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIiwgXCJ4aGlnaFwiLCBcIm1heFwiXTtcbmNvbnN0IEdFTUlOSTogUmVhc29uaW5nRWZmb3J0W10gPSBbXCJtaW5pbWFsXCIsIFwibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiXTtcblxuaW50ZXJmYWNlIFBhcnNlZE1vZGVsTmFtZSB7XG4gIGZhbWlseTogKHR5cGVvZiBGQU1JTElFUylbbnVtYmVyXTtcbiAgdmVyc2lvbjogbnVtYmVyW107XG4gIG1vZGVsOiBzdHJpbmdbXTtcbn1cblxuLyoqIFJldHVybiB0aGUgbm9ybWFsaXplZCBmYW1pbHkgcGFyc2VkIGZyb20gYSBtb2RlbCBpZGVudGl0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbEZhbWlseShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcGFyc2VNb2RlbE5hbWUobmFtZSk/LmZhbWlseTtcbn1cblxuLyoqIFJhbmsgYSBmYW1pbHkgYnkgaG93IG1ham9yIGl0IGlzOyB1bnJlY29nbml6ZWQgZmFtaWxpZXMgc29ydCBsYXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsRmFtaWx5UmFuayhmYW1pbHk6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gRkFNSUxJRVMuaW5kZXhPZihmYW1pbHkgYXMgKHR5cGVvZiBGQU1JTElFUylbbnVtYmVyXSk7XG4gIHJldHVybiBpbmRleCA+PSAwID8gaW5kZXggOiBGQU1JTElFUy5sZW5ndGg7XG59XG5cbi8qKiBOb3JtYWxpemUgYSByZWNvZ25pemVkIG1vZGVsIGlkZW50aXR5IGludG8gZmFtaWx5LCB2ZXJzaW9uLCBhbmQgdmFyaWFudCB0b2tlbnMuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxTZWFyY2hRdWVyeShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU1vZGVsTmFtZShuYW1lKTtcbiAgaWYgKCFwYXJzZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBbcGFyc2VkLmZhbWlseSwgLi4ucGFyc2VkLnZlcnNpb24ubWFwKFN0cmluZyksIC4uLnBhcnNlZC5tb2RlbF0uam9pbihcIiBcIik7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYG5hbWVgIGhhcyBuYXRpdmUgd2ViIHNlYXJjaDogYW4gZXhhY3QgZG9jdW1lbnRlZCBpZGVudGl0eSwgb3JcbiAqIGEgbGF0ZXIge0BsaW5rIHZlcnNpb25UdXBsZX0gaW4gdGhlIHNhbWUgZmFtaWx5IGFzIGEgZG9jdW1lbnRlZCBuYXRpdmVcbiAqIHdlYi1zZWFyY2ggbW9kZWwuIEludHJhLWZhbWlseSBmbG9vcnMgdXNlIHRoZSBuYW1lIGRpZ2l0IHBhcnNlciBzbyBpZGVudGl0aWVzXG4gKiBsaWtlIGBkYXRhYnJpY2tzLWNsYXVkZS1vcHVzLTQtOGAgYW5kIGBzeXN0ZW0uYWkuZ3B0LTYtMS1zb2xgIGNvbXBhcmUuXG4gKiBIb3N0ZWQgR1BULU9TUyB3ZWlnaHRzIG5ldmVyIGluaGVyaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmhlcml0c05hdGl2ZVdlYlNlYXJjaChuYW1lOiBzdHJpbmcsIGRvY3VtZW50ZWQ6IEl0ZXJhYmxlPHN0cmluZz4pOiBib29sZWFuIHtcbiAgY29uc3QgZG9jdW1lbnRlZEtleXMgPSBkb2N1bWVudGVkIGluc3RhbmNlb2YgU2V0ID8gZG9jdW1lbnRlZCA6IG5ldyBTZXQoZG9jdW1lbnRlZCk7XG4gIGNvbnN0IGtleSA9IG1vZGVsU2VhcmNoUXVlcnkobmFtZSk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKTtcbiAgaWYgKGtleSAmJiBkb2N1bWVudGVkS2V5cy5oYXMoa2V5KSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGZhbWlseSA9IG1vZGVsRmFtaWx5KG5hbWUpO1xuICBpZiAoIWZhbWlseSB8fCBpc09wZW5XZWlnaHRzR3B0KG5hbWUpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uVHVwbGUobmFtZSk7XG4gIGlmIChpc1plcm9WZXJzaW9uKHZlcnNpb24pKSByZXR1cm4gZmFsc2U7XG4gIGxldCBmbG9vcjogcmVhZG9ubHkgbnVtYmVyW10gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZG9jdW1lbnRlZEtleXMpIHtcbiAgICBpZiAobW9kZWxGYW1pbHkoZW50cnkpICE9PSBmYW1pbHkgfHwgaXNPcGVuV2VpZ2h0c0dwdChlbnRyeSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRvY3VtZW50ZWRWZXJzaW9uID0gdmVyc2lvblR1cGxlKGVudHJ5KTtcbiAgICBpZiAoaXNaZXJvVmVyc2lvbihkb2N1bWVudGVkVmVyc2lvbikpIGNvbnRpbnVlO1xuICAgIGlmICghZmxvb3IgfHwgY29tcGFyZVZlcnNpb25UdXBsZXMoZG9jdW1lbnRlZFZlcnNpb24sIGZsb29yKSA8IDApIHtcbiAgICAgIGZsb29yID0gZG9jdW1lbnRlZFZlcnNpb247XG4gICAgfVxuICB9XG4gIHJldHVybiBmbG9vciAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmVWZXJzaW9uVHVwbGVzKHZlcnNpb24sIGZsb29yKSA+PSAwO1xufVxuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGFuIGlkZW50aXR5IG5hbWVzIGEgRGF0YWJyaWNrcy1ob3N0ZWQgZm91bmRhdGlvbiBtb2RlbFxuICogKGBkYXRhYnJpY2tzLSpgIGVuZHBvaW50IG9yIGBzeXN0ZW0uYWkuKmAgbW9kZWwgc2VydmljZSkuIEN1c3RvbSBhbmRcbiAqIGV4dGVybmFsIGVuZHBvaW50cyB1c2UgYXJiaXRyYXJ5IG5hbWVzLCBzbyB0aGVpciBkaWdpdHMgYXJlIG5vdCB2ZXJzaW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRm91bmRhdGlvbk1vZGVsSWRlbnRpdHkobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXig/OmRhdGFicmlja3MtfHN5c3RlbVxcLmFpXFwuKS9pLnRlc3QobmFtZS50cmltKCkpO1xufVxuXG5mdW5jdGlvbiBpc09wZW5XZWlnaHRzR3B0KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbW9kZWxGYW1pbHkobmFtZSkgPT09IFwiZ3B0XCIgJiYgLyg/Ol58Wy1fLl0pb3NzKD86Wy1fLl18JCkvaS50ZXN0KG5hbWUpO1xufVxuXG5mdW5jdGlvbiBpc1plcm9WZXJzaW9uKHZlcnNpb246IHJlYWRvbmx5IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLmV2ZXJ5KChwYXJ0KSA9PiAocGFydCA/PyAwKSA9PT0gMCk7XG59XG5cbi8qKiBSZXR1cm4gdGhlIHJlYXNvbmluZyBlZmZvcnRzIGFjY2VwdGVkIGJ5IGEgbW9kZWwgZmFtaWx5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsUmVhc29uaW5nRWZmb3J0cyhuYW1lOiBzdHJpbmcpOiBSZWFzb25pbmdFZmZvcnRbXSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTW9kZWxOYW1lKG5hbWUpO1xuICBsZXQgZWZmb3J0czogUmVhc29uaW5nRWZmb3J0W10gPSBbXTtcbiAgaWYgKHBhcnNlZD8uZmFtaWx5ID09PSBcImdwdFwiICYmIHBhcnNlZC52ZXJzaW9uLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBbbWFqb3IgPSAwLCBtaW5vciA9IDBdID0gcGFyc2VkLnZlcnNpb247XG4gICAgaWYgKG1ham9yID49IDUpIHtcbiAgICAgIGVmZm9ydHMgPVxuICAgICAgICBtYWpvciA9PT0gNSAmJiBtaW5vciA9PT0gNSAmJiBwYXJzZWQubW9kZWwuaW5jbHVkZXMoXCJwcm9cIilcbiAgICAgICAgICA/IEdQVF81XzVfUFJPXG4gICAgICAgICAgOiBtYWpvciA9PT0gNSAmJiBtaW5vciA9PT0gNlxuICAgICAgICAgICAgPyBHUFRfNV82XG4gICAgICAgICAgICA6IFNUQU5EQVJEO1xuICAgIH1cbiAgfVxuICBpZiAocGFyc2VkPy5mYW1pbHkgPT09IFwiZ3B0XCIgJiYgcGFyc2VkLm1vZGVsLmluY2x1ZGVzKFwib3NzXCIpKSBlZmZvcnRzID0gU1RBTkRBUkQ7XG4gIGlmIChwYXJzZWQ/LmZhbWlseSA9PT0gXCJjbGF1ZGVcIikge1xuICAgIGNvbnN0IFttYWpvciA9IDAsIG1pbm9yID0gMF0gPSBwYXJzZWQudmVyc2lvbjtcbiAgICBpZiAobWFqb3IgPiAzIHx8IChtYWpvciA9PT0gMyAmJiBtaW5vciA+PSA3KSkgZWZmb3J0cyA9IENMQVVERTtcbiAgfVxuICBpZiAocGFyc2VkPy5mYW1pbHkgPT09IFwiZ2VtaW5pXCIpIGVmZm9ydHMgPSBHRU1JTkk7XG4gIGlmIChub3JtYWxpemVkLmluY2x1ZGVzKFwiY29kZXhcIikgfHwgLyg/Ol58Wy1fLi9dKW8oPzoxfDN8NCkoPzpbLV8uL118JCkvaS50ZXN0KG5hbWUpKSB7XG4gICAgZWZmb3J0cyA9IFNUQU5EQVJEO1xuICB9XG4gIHJldHVybiBlZmZvcnRzO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgcG9saWN5IHZlcmlmaWVzIGEgY29tcGxldGUgdG9vbC1jYWxsaW5nIHJvdW5kIHRyaXAuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxTdXBwb3J0c1Rvb2xzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc3VwcG9ydHNUb29sc0J5RmFtaWx5KG5hbWUpO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgYSBkaXNjb3ZlcmVkIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBhIHRvb2wtY2FsbGluZyBjaGF0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZHBvaW50U3VwcG9ydHNUb29scyhlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IGJvb2xlYW4ge1xuICBjb25zdCBlbWJlZGRpbmcgPVxuICAgIGVuZHBvaW50LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIiB8fCBlbmRwb2ludC5jbGFzcyA9PT0gTW9kZWxDbGFzcy5FbWJlZGRpbmc7XG4gIGNvbnN0IGNoYXQgPSAhZW1iZWRkaW5nICYmIChlbmRwb2ludC50YXNrID09PSBcImxsbS92MS9jaGF0XCIgfHwgZW5kcG9pbnQuY2xhc3MgIT09IHVuZGVmaW5lZCk7XG4gIHJldHVybiBjaGF0ICYmIChlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID8/IG1vZGVsU3VwcG9ydHNUb29scyhlbmRwb2ludC5uYW1lKSk7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBhIG1vZGVsIHJlcXVpcmVzIERhdGFicmlja3MnIG5hdGl2ZSBSZXNwb25zZXMgZW5kcG9pbnQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNwb25zZXNPbmx5KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiY29kZXhcIikpIHJldHVybiB0cnVlO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU1vZGVsTmFtZShuYW1lKTtcbiAgaWYgKCFwYXJzZWQgfHwgcGFyc2VkLmZhbWlseSAhPT0gXCJncHRcIiB8fCBwYXJzZWQubW9kZWwuaW5jbHVkZXMoXCJvc3NcIikpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgW21ham9yID0gMCwgbWlub3IgPSAwXSA9IHBhcnNlZC52ZXJzaW9uO1xuICByZXR1cm4gbWFqb3IgPiA1IHx8IChtYWpvciA9PT0gNSAmJiBtaW5vciA+PSA0KTtcbn1cblxuLyoqIFJldHVybiB0aGUgRGF0YWJyaWNrcyBpbmZlcmVuY2UgcHJvdG9jb2wgcmVxdWlyZWQgYnkgYSBtb2RlbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFNlcnZpbmdBcGkobmFtZTogc3RyaW5nKTogXCJjaGF0XCIgfCBcInJlc3BvbnNlc1wiIHtcbiAgcmV0dXJuIGlzUmVzcG9uc2VzT25seShuYW1lKSA/IFwicmVzcG9uc2VzXCIgOiBcImNoYXRcIjtcbn1cblxuLyoqIFJldHVybiB0aGUgQ2hhdCBDb21wbGV0aW9ucyBlZmZvcnQgcmVxdWlyZWQgd2hlbiBmdW5jdGlvbiB0b29scyBhcmUgcHJlc2VudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGF0VG9vbFJlYXNvbmluZ0VmZm9ydChuYW1lOiBzdHJpbmcpOiBSZWFzb25pbmdFZmZvcnQgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU1vZGVsTmFtZShuYW1lKTtcbiAgaWYgKCFwYXJzZWQgfHwgcGFyc2VkLmZhbWlseSAhPT0gXCJncHRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgW21ham9yID0gMCwgbWlub3IgPSAwXSA9IHBhcnNlZC52ZXJzaW9uO1xuICByZXR1cm4gbWFqb3IgPT09IDUgJiYgbWlub3IgPT09IDYgPyBcIm5vbmVcIiA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIERlcml2ZSBwcm92aWRlci1zcGVjaWZpYyBtb2RlbCBuYW1lcyBmcm9tIGEgRGF0YWJyaWNrcyBtb2RlbCBpZGVudGl0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFNlcnZpY2VOYW1lcyhuYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VNb2RlbE5hbWUobmFtZSk7XG4gIGlmICghcGFyc2VkKSByZXR1cm4ge307XG4gIGNvbnN0IHZlcnNpb24gPSBwYXJzZWQudmVyc2lvbi5qb2luKFwiLlwiKTtcbiAgY29uc3Qgc3VmZml4ID0gcGFyc2VkLm1vZGVsLmxlbmd0aCA/IGAtJHtwYXJzZWQubW9kZWwuam9pbihcIi1cIil9YCA6IFwiXCI7XG4gIHN3aXRjaCAocGFyc2VkLmZhbWlseSkge1xuICAgIGNhc2UgXCJncHRcIjpcbiAgICAgIHJldHVybiBwYXJzZWQubW9kZWwuaW5jbHVkZXMoXCJvc3NcIikgPyB7fSA6IHsgb3BlbmFpOiBgZ3B0LSR7dmVyc2lvbn0ke3N1ZmZpeH1gIH07XG4gICAgY2FzZSBcImNsYXVkZVwiOiB7XG4gICAgICBjb25zdCBbdmFyaWFudCwgLi4ucmVzdF0gPSBwYXJzZWQubW9kZWw7XG4gICAgICByZXR1cm4gdmFyaWFudFxuICAgICAgICA/IHsgYW50aHJvcGljOiBgY2xhdWRlLSR7dmFyaWFudH0tJHt2ZXJzaW9ufSR7cmVzdC5sZW5ndGggPyBgLSR7cmVzdC5qb2luKFwiLVwiKX1gIDogXCJcIn1gIH1cbiAgICAgICAgOiB7fTtcbiAgICB9XG4gICAgY2FzZSBcImdlbWluaVwiOlxuICAgIGNhc2UgXCJnZW1tYVwiOlxuICAgICAgcmV0dXJuIHsgZ29vZ2xlOiBgJHtwYXJzZWQuZmFtaWx5fS0ke3ZlcnNpb259JHtzdWZmaXh9YCB9O1xuICAgIGNhc2UgXCJnbG1cIjpcbiAgICAgIHJldHVybiB7IHpoaXB1OiBgZ2xtLSR7dmVyc2lvbn0ke3N1ZmZpeH1gIH07XG4gICAgY2FzZSBcImdyb2tcIjpcbiAgICAgIHJldHVybiB7IHhhaTogYGdyb2stJHt2ZXJzaW9ufSR7c3VmZml4fWAgfTtcbiAgICBjYXNlIFwibGxhbWFcIjpcbiAgICAgIHJldHVybiB7IG1ldGE6IGBsbGFtYS0ke3ZlcnNpb259JHtzdWZmaXh9YCB9O1xuICAgIGNhc2UgXCJxd2VuXCI6XG4gICAgICByZXR1cm4geyBhbGliYWJhOiBgcXdlbiR7dmVyc2lvbn0ke3N1ZmZpeH1gIH07XG4gICAgY2FzZSBcImRlZXBzZWVrXCI6XG4gICAgICByZXR1cm4geyBkZWVwc2VlazogYGRlZXBzZWVrLXYke3BhcnNlZC52ZXJzaW9uWzBdID8/IFwiXCJ9JHtzdWZmaXh9YCB9O1xuICAgIGNhc2UgXCJraW1pXCI6XG4gICAgICByZXR1cm4geyBtb29uc2hvdDogYGtpbWktayR7cGFyc2VkLnZlcnNpb25bMF0gPz8gXCJcIn0ke3N1ZmZpeH1gIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZU1vZGVsTmFtZShuYW1lOiBzdHJpbmcpOiBQYXJzZWRNb2RlbE5hbWUgfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnMgPSBuYW1lLnRvTG93ZXJDYXNlKCkubWF0Y2goL1thLXowLTldKy9nKSA/PyBbXTtcbiAgbGV0IGZhbWlseUluZGV4ID0gLTE7XG4gIGxldCBmYW1pbHk6IFBhcnNlZE1vZGVsTmFtZVtcImZhbWlseVwiXSB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2Vucy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0hO1xuICAgIGNvbnN0IGNvbXBhY3RRd2VuID0gL15xd2VuKFxcZCspJC8uZXhlYyh0b2tlbik7XG4gICAgaWYgKGNvbXBhY3RRd2VuKSB7XG4gICAgICBmYW1pbHlJbmRleCA9IGluZGV4O1xuICAgICAgZmFtaWx5ID0gXCJxd2VuXCI7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKEZBTUlMSUVTLmluY2x1ZGVzKHRva2VuIGFzIFBhcnNlZE1vZGVsTmFtZVtcImZhbWlseVwiXSkpIHtcbiAgICAgIGZhbWlseUluZGV4ID0gaW5kZXg7XG4gICAgICBmYW1pbHkgPSB0b2tlbiBhcyBQYXJzZWRNb2RlbE5hbWVbXCJmYW1pbHlcIl07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKCFmYW1pbHkgfHwgZmFtaWx5SW5kZXggPCAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZW1haW5kZXIgPSB0b2tlbnMuc2xpY2UoZmFtaWx5SW5kZXggKyAxKTtcbiAgY29uc3QgbnVtZXJpYyA9ICh2YWx1ZTogc3RyaW5nKSA9PiAvXlxcZCskLy50ZXN0KHZhbHVlKTtcbiAgbGV0IHZlcnNpb25TdGFydCA9IHJlbWFpbmRlci5maW5kSW5kZXgobnVtZXJpYyk7XG4gIGlmIChmYW1pbHkgPT09IFwicXdlblwiICYmIC9ecXdlblxcZCskLy50ZXN0KHRva2Vuc1tmYW1pbHlJbmRleF0hKSkge1xuICAgIHZlcnNpb25TdGFydCA9IDA7XG4gICAgcmVtYWluZGVyLnVuc2hpZnQodG9rZW5zW2ZhbWlseUluZGV4XSEuc2xpY2UoNCkpO1xuICB9XG4gIGlmIChmYW1pbHkgPT09IFwiZGVlcHNlZWtcIikge1xuICAgIGNvbnN0IHByZWZpeGVkID0gcmVtYWluZGVyLmZpbmRJbmRleCgodmFsdWUpID0+IC9edlxcZCskLy50ZXN0KHZhbHVlKSk7XG4gICAgaWYgKHByZWZpeGVkID49IDApIHJlbWFpbmRlcltwcmVmaXhlZF0gPSByZW1haW5kZXJbcHJlZml4ZWRdIS5zbGljZSgxKTtcbiAgICB2ZXJzaW9uU3RhcnQgPSByZW1haW5kZXIuZmluZEluZGV4KG51bWVyaWMpO1xuICB9XG4gIGlmIChmYW1pbHkgPT09IFwia2ltaVwiKSB7XG4gICAgY29uc3QgcHJlZml4ZWQgPSByZW1haW5kZXIuZmluZEluZGV4KCh2YWx1ZSkgPT4gL15rXFxkKyQvLnRlc3QodmFsdWUpKTtcbiAgICBpZiAocHJlZml4ZWQgPj0gMCkgcmVtYWluZGVyW3ByZWZpeGVkXSA9IHJlbWFpbmRlcltwcmVmaXhlZF0hLnNsaWNlKDEpO1xuICAgIHZlcnNpb25TdGFydCA9IHJlbWFpbmRlci5maW5kSW5kZXgobnVtZXJpYyk7XG4gIH1cbiAgaWYgKHZlcnNpb25TdGFydCA8IDApIHJldHVybiB7IGZhbWlseSwgdmVyc2lvbjogW10sIG1vZGVsOiByZW1haW5kZXIgfTtcbiAgY29uc3QgdmVyc2lvbjogbnVtYmVyW10gPSBbXTtcbiAgbGV0IGN1cnNvciA9IHZlcnNpb25TdGFydDtcbiAgd2hpbGUgKGN1cnNvciA8IHJlbWFpbmRlci5sZW5ndGggJiYgdmVyc2lvbi5sZW5ndGggPCAyICYmIG51bWVyaWMocmVtYWluZGVyW2N1cnNvcl0hKSkge1xuICAgIHZlcnNpb24ucHVzaChOdW1iZXIocmVtYWluZGVyW2N1cnNvcl0pKTtcbiAgICBjdXJzb3IgKz0gMTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGZhbWlseSxcbiAgICB2ZXJzaW9uLFxuICAgIG1vZGVsOiBbLi4ucmVtYWluZGVyLnNsaWNlKDAsIHZlcnNpb25TdGFydCksIC4uLnJlbWFpbmRlci5zbGljZShjdXJzb3IpXSxcbiAgfTtcbn1cbiJdfQ==
@@ -106,7 +106,10 @@ const ALIASES = {
106
106
  const SUPPORTED_VALUES_PATTERN = /supported\s+values?\s+are\s*:?\s*(.+?)(?:\.?\s*(?:param|type|code)\b|$)/is;
107
107
  const TOKEN_PATTERN = /'([^']+)'|"([^"]+)"|`([^`]+)`|\b([a-z][a-z0-9_-]*)\b/gi;
108
108
  const MAX_JSON_UNWRAP_DEPTH = 8;
109
- const aliasDocuments = Object.entries(ALIASES).map(([token, level]) => ({ token, level }));
109
+ const aliasDocuments = Object.entries(ALIASES).map(([token, level]) => ({
110
+ token,
111
+ level,
112
+ }));
110
113
  const aliasFuse = new Fuse(aliasDocuments, {
111
114
  keys: ["token"],
112
115
  includeScore: true,
@@ -330,7 +333,9 @@ export function adaptRequestReasoning(body, levels) {
330
333
  changed = true;
331
334
  }
332
335
  }
333
- return changed ? { body: next, changed: true, wireEffort: wire } : { body, changed: false, wireEffort: wire };
336
+ return changed
337
+ ? { body: next, changed: true, wireEffort: wire }
338
+ : { body, changed: false, wireEffort: wire };
334
339
  }
335
340
  /** Normalize labels for alias lookup (`Extra High` → `extra-high`). */
336
341
  export function normalizeReasoningToken(value) {
@@ -441,4 +446,4 @@ function tryUnwrapJson(text) {
441
446
  }
442
447
  return undefined;
443
448
  }
444
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhc29uaW5nLXRyYW5zbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSzVELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRyxFQUFFLEtBQUs7SUFDVixNQUFNLEVBQUUsUUFBUTtJQUNoQixJQUFJLEVBQUUsTUFBTTtJQUNaLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLEdBQUcsRUFBRSxLQUFLO0NBQ3VDLENBQUM7QUFFcEQsa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE4QjtJQUN6RCxjQUFjLENBQUMsR0FBRztJQUNsQixjQUFjLENBQUMsTUFBTTtJQUNyQixjQUFjLENBQUMsSUFBSTtJQUNuQixjQUFjLENBQUMsU0FBUztJQUN4QixjQUFjLENBQUMsR0FBRztDQUNuQixDQUFDO0FBS0YsTUFBTSxRQUFRLEdBQThCO0lBQzFDLGNBQWMsQ0FBQyxHQUFHO0lBQ2xCLGNBQWMsQ0FBQyxNQUFNO0lBQ3JCLGNBQWMsQ0FBQyxJQUFJO0NBQ3BCLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBOEI7SUFDakQsY0FBYyxDQUFDLEdBQUc7SUFDbEIsY0FBYyxDQUFDLE1BQU07SUFDckIsY0FBYyxDQUFDLElBQUk7SUFDbkIsY0FBYyxDQUFDLFNBQVM7Q0FDekIs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QUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDeEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekYsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyQyxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJpYyByZWFzb25pbmctYnVkZ2V0IHRyYW5zbGF0aW9uIGZvciBNb2RlbCBTZXJ2aW5nIGFuZCBnYXRld2F5IGNhbGxlcnMuXG4gKlxuICogUHJvdmlkZXIgd2lyZXMgZGlzYWdyZWUgb24gZWZmb3J0IGxhYmVscyAoYHhoaWdoYCwgYHVsdHJhYCwgYG1lZGAsIGBub25lYCwg4oCmKS5cbiAqIFRoaXMgbW9kdWxlIG93bnMgb25lIGluZHVzdHJ5LXNoYXBlZCBsYWRkZXIgYW5kIHR3byBwYXJzZXJzOlxuICpcbiAqIC0ge0BsaW5rIHBhcnNlUmVhc29uaW5nfTogZnV6enktbWF0Y2ggb25lIGxhYmVsIG9udG8ge0BsaW5rIFJlYXNvbmluZ0xldmVsfVxuICogLSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9OiB1bndyYXAgbmVzdGVkIC8gZG91YmxlLWVuY29kZWQgZXJyb3IgYm9kaWVzXG4gKiAtIHtAbGluayByZW1hcFJlYXNvbmluZ30gLyB7QGxpbmsgYWRhcHRSZXF1ZXN0UmVhc29uaW5nfTogbWFwIGEgcmVxdWVzdCBvbnRvIGFcbiAqICAgc3VwcG9ydGVkIGxhZGRlciBhbmQgcmV3cml0ZSBgcmVhc29uaW5nX2VmZm9ydGAgLyBgcmVhc29uaW5nLmVmZm9ydGBcbiAqXG4gKiBEb2N1bWVudGVkIG1vZGVsIGxhZGRlcnMgY29tZSBmcm9tIHRoZSBjb21taXR0ZWQgSFRNTCBzbmFwc2hvdCByZWZyZXNoZWQgYnlcbiAqIGBidW4gcnVuIC0tZmlsdGVyICdAZGJ4LXRvb2xzL21vZGVsJyBtZXRhZGF0YWAgKHNhbWUgY2FjaGUgcGF0aCBhc1xuICogY2FwYWJpbGl0aWVzIC8gcmF0ZSBsaW1pdHMpLiBFcnJvci1ib2R5IHBhcnNpbmcgaXMgbmV2ZXIgY2FjaGVkOyBjYWxsZXJzXG4gKiBwZXJzaXN0IGxlYXJuZWQgbGFkZGVycyB2aWEgdGhlIG1ldGFkYXRhIG1vZHVsZS5cbiAqXG4gKiBFcnJvciBib2RpZXMgYXJyaXZlIGFzIGNvbXBsZXRlIEhUVFAgSlNPTiB3aGV0aGVyIHRoZSByZXF1ZXN0IGFza2VkIGZvclxuICogc3RyZWFtaW5nIG9yIG5vdCAoRGF0YWJyaWNrcyByZWplY3RzIHVuc3VwcG9ydGVkIGVmZm9ydHMgd2l0aCA0MDAgYmVmb3JlIFNTRVxuICogc3RhcnRzKSwgc28ge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfSBhcHBsaWVzIHRvIGJvdGggcGF0aHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGpzb24gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgaXNSZWNvcmQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vYmplY3RcIjtcbmltcG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL3N0cmluZy11dGlsc1wiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IHsgbW9kZWxGYW1pbHksIG1vZGVsU2VhcmNoUXVlcnkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxuLyoqIEluZHVzdHJ5LWdlbmVyaWMgcmVhc29uaW5nIGJ1ZGdldCBsZXZlbHMsIGxvd2VzdCB0byBoaWdoZXN0LiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTGV2ZWwgPSBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiIHwgXCJleHRyYS1oaWdoXCIgfCBcIm1heFwiO1xuXG4vKiogUnVudGltZSB2YWx1ZXMgZm9yIHtAbGluayBSZWFzb25pbmdMZXZlbH0uICovXG5leHBvcnQgY29uc3QgUmVhc29uaW5nTGV2ZWwgPSB7XG4gIExvdzogXCJsb3dcIixcbiAgTWVkaXVtOiBcIm1lZGl1bVwiLFxuICBIaWdoOiBcImhpZ2hcIixcbiAgRXh0cmFIaWdoOiBcImV4dHJhLWhpZ2hcIixcbiAgTWF4OiBcIm1heFwiLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+O1xuXG4vKiogQ2Fub25pY2FsIGxhZGRlciBvcmRlciB1c2VkIHdoZW4gc29ydGluZyBvciByYW5raW5nIHJlbWFwcy4gKi9cbmV4cG9ydCBjb25zdCBSRUFTT05JTkdfTEVWRUxTOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG4vKiogTW9kZWwgaWRlbnRpdHkg4oaSIGFjY2VwdGVkIHtAbGluayBSZWFzb25pbmdMZXZlbH0gbGFkZGVyLiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj47XG5cbmNvbnN0IFNUQU5EQVJEOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfRVhUUkFfSElHSDogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTG93LFxuICBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfTUFYOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG5jb25zdCBHUFRfNV81X1BSTzogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG5dO1xuXG4vKipcbiAqIEFsaWFzIHRhYmxlIGZvciBleGFjdCAvIG5lYXItZXhhY3QgbGFiZWxzLiBLZXlzIGFyZSB7QGxpbmsgbm9ybWFsaXplUmVhc29uaW5nVG9rZW59XG4gKiByZXN1bHRzLiBQcm92aWRlciB3aXJlcyAoYHhoaWdoYCkgYW5kIHBsYWluIEVuZ2xpc2ggKGB1bHRyYWAsIGBtZWRgKSBib3RoIGxhbmRcbiAqIG9uIHRoZSBnZW5lcmljIGxhZGRlci5cbiAqL1xuY29uc3QgQUxJQVNFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+PiA9IHtcbiAgbG93OiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIGw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbm9uZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBvZmY6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgZGlzYWJsZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBkaXNhYmxlZDogUmVhc29uaW5nTGV2ZWwuTG93LFxuICB6ZXJvOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIG1pbmltYWw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWluOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIHRpbnk6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbGlnaHQ6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWVkaXVtOiBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIG1lZDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBtaWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgbW9kZXJhdGU6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgZGVmYXVsdDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBub3JtYWw6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgYmFsYW5jZWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgaGlnaDogUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgaGk6IFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIGhlYXZ5OiBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBcImV4dHJhLWhpZ2hcIjogUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBleHRyYWhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGg6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmE6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgXCJ1bHRyYS1oaWdoXCI6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmFoaWdoOiBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG4gIG1heDogUmVhc29uaW5nTGV2ZWwuTWF4LFxuICBtYXhpbXVtOiBSZWFzb25pbmdMZXZlbC5NYXgsXG4gIGhpZ2hlc3Q6IFJlYXNvbmluZ0xldmVsLk1heCxcbiAgZnVsbDogUmVhc29uaW5nTGV2ZWwuTWF4LFxufTtcblxuY29uc3QgU1VQUE9SVEVEX1ZBTFVFU19QQVRURVJOID1cbiAgL3N1cHBvcnRlZFxccyt2YWx1ZXM/XFxzK2FyZVxccyo6P1xccyooLis/KSg/OlxcLj9cXHMqKD86cGFyYW18dHlwZXxjb2RlKVxcYnwkKS9pcztcbmNvbnN0IFRPS0VOX1BBVFRFUk4gPSAvJyhbXiddKyknfFwiKFteXCJdKylcInxgKFteYF0rKWB8XFxiKFthLXpdW2EtejAtOV8tXSopXFxiL2dpO1xuY29uc3QgTUFYX0pTT05fVU5XUkFQX0RFUFRIID0gODtcblxuaW50ZXJmYWNlIEFsaWFzRG9jdW1lbnQge1xuICByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICByZWFkb25seSBsZXZlbDogUmVhc29uaW5nTGV2ZWw7XG59XG5cbmNvbnN0IGFsaWFzRG9jdW1lbnRzOiByZWFkb25seSBBbGlhc0RvY3VtZW50W10gPSBPYmplY3QuZW50cmllcyhBTElBU0VTKS5tYXAoXG4gIChbdG9rZW4sIGxldmVsXSkgPT4gKHsgdG9rZW4sIGxldmVsIH0pLFxuKTtcblxuY29uc3QgYWxpYXNGdXNlID0gbmV3IEZ1c2UoYWxpYXNEb2N1bWVudHMsIHtcbiAga2V5czogW1widG9rZW5cIl0sXG4gIGluY2x1ZGVTY29yZTogdHJ1ZSxcbiAgdGhyZXNob2xkOiAwLjM1LFxuICBpZ25vcmVMb2NhdGlvbjogdHJ1ZSxcbn0pO1xuXG4vKipcbiAqIEZ1enp5LW1hdGNoIG9uZSByZWFzb25pbmcgbGFiZWwgb250byB7QGxpbmsgUmVhc29uaW5nTGV2ZWx9LlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgaW5wdXQgaXMgZW1wdHkgb3IgY2Fubm90IGJlIG1hcHBlZCBjb25maWRlbnRseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVhc29uaW5nKHZhbHVlOiB1bmtub3duKTogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUmVhc29uaW5nVG9rZW4oU3RyaW5nKHZhbHVlKSk7XG4gIGlmICghbm9ybWFsaXplZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZXhhY3QgPSBBTElBU0VTW25vcm1hbGl6ZWRdID8/IEFMSUFTRVNbbm9ybWFsaXplZC5yZXBsYWNlKC8tL2csIFwiXCIpXTtcbiAgaWYgKGV4YWN0KSByZXR1cm4gZXhhY3Q7XG4gIGNvbnN0IFttYXRjaF0gPSBhbGlhc0Z1c2Uuc2VhcmNoKG5vcm1hbGl6ZWQpO1xuICBpZiAoIW1hdGNoIHx8IChtYXRjaC5zY29yZSA/PyAxKSA+IDAuMzUpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBtYXRjaC5pdGVtLmxldmVsO1xufVxuXG4vKipcbiAqIEV4dHJhY3Qgc3VwcG9ydGVkIHJlYXNvbmluZyBsZXZlbHMgZnJvbSBhbiB1cHN0cmVhbSBlcnJvciBib2R5LlxuICpcbiAqIEFjY2VwdHMgcmF3IHJlc3BvbnNlIHRleHQsIGFscmVhZHktcGFyc2VkIEpTT04sIG9yIERhdGFicmlja3MgZW52ZWxvcGVzIHRoYXRcbiAqIG5lc3QgSlNPTiBzdHJpbmdzIHNldmVyYWwgdGltZXMuIFJldHVybnMgYFtdYCB3aGVuIG5vIHN1cHBvcnRlZC12YWx1ZXMgbGlzdFxuICogY2FuIGJlIHJlY292ZXJlZC4gUmVzdWx0cyBhcmUgbm90IGNhY2hlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVhc29uaW5nTGV2ZWxzKGJvZHk6IHVua25vd24pOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgbGV2ZWxzOiBSZWFzb25pbmdMZXZlbFtdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PFJlYXNvbmluZ0xldmVsPigpO1xuICBmb3IgKGNvbnN0IHRleHQgb2YgY29sbGVjdFRleHRMZWF2ZXMoYm9keSkpIHtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIGV4dHJhY3RTdXBwb3J0ZWRUb2tlbnModGV4dCkpIHtcbiAgICAgIGNvbnN0IGxldmVsID0gcGFyc2VSZWFzb25pbmcodG9rZW4pO1xuICAgICAgaWYgKCFsZXZlbCB8fCBzZWVuLmhhcyhsZXZlbCkpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQobGV2ZWwpO1xuICAgICAgbGV2ZWxzLnB1c2gobGV2ZWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGV2ZWxzO1xufVxuXG4vKipcbiAqIExvb2sgdXAgZG9jdW1lbnRlZCBsZXZlbHMgZm9yIGEgbW9kZWwgaWRlbnRpdHkgaW5zaWRlIGEgY2F0YWxvZ3VlLlxuICpcbiAqIE1hdGNoZXMgZXhhY3QgY2F0YWxvZ3VlIGtleXMgYW5kIHN1ZmZpeCBpZGVudGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhcbiAgbW9kZWw6IHN0cmluZyxcbiAgY2F0YWxvZ3VlOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSxcbik6IFJlYXNvbmluZ0xldmVsW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXlzID0gY2F0YWxvZ3VlS2V5c0Zvcihtb2RlbCk7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCBsZXZlbHMgPSBjYXRhbG9ndWVba2V5XTtcbiAgICBpZiAobGV2ZWxzPy5sZW5ndGgpIHJldHVybiBbLi4ubGV2ZWxzXTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIGxldmVsc10gb2YgT2JqZWN0LmVudHJpZXMoY2F0YWxvZ3VlKSkge1xuICAgIGlmIChrZXlzLnNvbWUoKGNhbmRpZGF0ZSkgPT4ga2V5LmVuZHNXaXRoKGNhbmRpZGF0ZSkgfHwgY2FuZGlkYXRlLmVuZHNXaXRoKGtleSkpKSB7XG4gICAgICByZXR1cm4gWy4uLmxldmVsc107XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSGFyZC1jb2RlZCBmYW1pbHkgZGVmYXVsdHMgdXNlZCB3aGVuIGRvY3VtZW50YXRpb24gaGFzIG5vIGVudHJ5LlxuICpcbiAqIFVua25vd24gZmFtaWxpZXMgcmV0dXJuIHRoZSBzdGFuZGFyZCBsb3cvbWVkaXVtL2hpZ2ggbGFkZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFJlYXNvbmluZ0xldmVscyhtb2RlbDogc3RyaW5nKTogUmVhc29uaW5nTGV2ZWxbXSB7XG4gIGNvbnN0IGZhbWlseSA9IG1vZGVsRmFtaWx5KG1vZGVsKT8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG1vZGVsLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChmYW1pbHkgPT09IFwiZ3Jva1wiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJncm9rXCIpKSByZXR1cm4gWy4uLldJVEhfRVhUUkFfSElHSF07XG4gIGlmIChmYW1pbHkgPT09IFwiZ2VtaW5pXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImdlbWluaVwiKSkgcmV0dXJuIFsuLi5TVEFOREFSRF07XG4gIGlmIChmYW1pbHkgPT09IFwiY2xhdWRlXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImNsYXVkZVwiKSkgcmV0dXJuIFsuLi5XSVRIX01BWF07XG4gIGlmIChmYW1pbHkgPT09IFwiZ2xtXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImdsbVwiKSkge1xuICAgIHJldHVybiBbUmVhc29uaW5nTGV2ZWwuSGlnaCwgUmVhc29uaW5nTGV2ZWwuTWF4XTtcbiAgfVxuICBpZiAoXG4gICAgZmFtaWx5ID09PSBcImRlZXBzZWVrXCIgfHxcbiAgICBub3JtYWxpemVkLmluY2x1ZGVzKFwiZGVlcHNlZWtcIikgfHxcbiAgICBmYW1pbHkgPT09IFwia2ltaVwiIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcyhcImtpbWlcIilcbiAgKSB7XG4gICAgcmV0dXJuIFtSZWFzb25pbmdMZXZlbC5Mb3csIFJlYXNvbmluZ0xldmVsLkhpZ2gsIFJlYXNvbmluZ0xldmVsLk1heF07XG4gIH1cbiAgaWYgKGZhbWlseSA9PT0gXCJpbmtsaW5nXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImlua2xpbmdcIikpIHJldHVybiBbLi4uV0lUSF9NQVhdO1xuICBpZiAoZmFtaWx5ID09PSBcImdwdFwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJncHRcIikgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImNvZGV4XCIpKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJvc3NcIikpIHJldHVybiBbLi4uU1RBTkRBUkRdO1xuICAgIGlmICgvKD86XnxbLV8uXSk1Wy1fLl0/NSg/OlstXy5dfCQpLy50ZXN0KG5vcm1hbGl6ZWQpICYmIG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJwcm9cIikpIHtcbiAgICAgIHJldHVybiBbLi4uR1BUXzVfNV9QUk9dO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAvKD86XnxbLV8uXSk1Wy1fLl0/Nig/OlstXy5dfCQpLy50ZXN0KG5vcm1hbGl6ZWQpIHx8XG4gICAgICAvKD86XnxbLV8uXSk2KD86Wy1fLl18JCkvLnRlc3Qobm9ybWFsaXplZClcbiAgICApIHtcbiAgICAgIHJldHVybiBbLi4uV0lUSF9NQVhdO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbiAgfVxuICBpZiAoLyg/Ol58Wy1fLi9dKW8oPzoxfDN8NCkoPzpbLV8uL118JCkvLnRlc3QobW9kZWwpIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJjb2RleFwiKSkge1xuICAgIHJldHVybiBbLi4uU1RBTkRBUkRdO1xuICB9XG4gIHJldHVybiBbLi4uU1RBTkRBUkRdO1xufVxuXG4vKipcbiAqIFByZWZlciBhIGRvY3VtZW50YXRpb24gY2F0YWxvZ3VlIHdoZW4gcHJvdmlkZWQsIG90aGVyd2lzZVxuICoge0BsaW5rIGRlZmF1bHRSZWFzb25pbmdMZXZlbHN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhc29uaW5nTGV2ZWxzRm9yKFxuICBtb2RlbDogc3RyaW5nLFxuICBjYXRhbG9ndWU/OiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSxcbik6IFJlYXNvbmluZ0xldmVsW10ge1xuICBpZiAoY2F0YWxvZ3VlKSB7XG4gICAgY29uc3QgZG9jdW1lbnRlZCA9IGRvY3VtZW50ZWRSZWFzb25pbmdMZXZlbHMobW9kZWwsIGNhdGFsb2d1ZSk7XG4gICAgaWYgKGRvY3VtZW50ZWQ/Lmxlbmd0aCkgcmV0dXJuIGRvY3VtZW50ZWQ7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMobW9kZWwpO1xufVxuXG4vKipcbiAqIE1hcCBhIGdlbmVyaWMgbGV2ZWwgb250byB0aGUgbW9zdCBjb21tb24gcHJvdmlkZXIgd2lyZSB0b2tlbi5cbiAqXG4gKiBgZXh0cmEtaGlnaGAgYmVjb21lcyBgeGhpZ2hgIGJlY2F1c2UgdGhhdCBpcyB3aGF0IERhdGFicmlja3MgLyBPcGVuQUkgZXJyb3JcbiAqIG1lc3NhZ2VzIGFkdmVydGlzZSB0b2RheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlYXNvbmluZyhsZXZlbDogUmVhc29uaW5nTGV2ZWwpOiBzdHJpbmcge1xuICByZXR1cm4gbGV2ZWwgPT09IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCA/IFwieGhpZ2hcIiA6IGxldmVsO1xufVxuXG4vKiogV2lyZSB0b2tlbnMgdGhhdCBtZWFuIFwiZG8gbm90IHJlYXNvblwiIHJhdGhlciB0aGFuIFwidXNlIGEgbG93IGJ1ZGdldFwiLiAqL1xuY29uc3QgRElTQUJMRURfUkVBU09OSU5HX1RPS0VOUyA9IG5ldyBTZXQoW1wibm9uZVwiLCBcIm9mZlwiLCBcImRpc2FibGVcIiwgXCJkaXNhYmxlZFwiXSk7XG5cbi8qKlxuICogUmVtYXAgYSByZXF1ZXN0ZWQgZWZmb3J0IG9udG8gdGhlIG5lYXJlc3Qgc3VwcG9ydGVkIHtAbGluayBSZWFzb25pbmdMZXZlbH0uXG4gKlxuICogYG5vbmVgIC8gYG9mZmAgKGFuZCBkaXNhYmxlIGFsaWFzZXMpIGFyZSBub3QgYSBsb3cgYnVkZ2V0OiB3aGVuIHRoZSBtb2RlbFxuICogcmVxdWlyZXMgcmVhc29uaW5nLCB0aGV5IHNuYXAgdG8gdGhlIHN1cHBvcnRlZCBsZXZlbCBjbG9zZXN0IHRvXG4gKiB7QGxpbmsgUmVhc29uaW5nTGV2ZWwuTWVkaXVtfS4gT3RoZXIgcmVxdWVzdHMgcHJlZmVyIHRoZSBoaWdoZXN0IGFsbG93ZWRcbiAqIGxldmVsIGF0IG9yIGJlbG93IHRoZSByZXF1ZXN0LCBvdGhlcndpc2UgdGhlIGxvd2VzdCBhbGxvd2VkIGxldmVsLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgcGFyc2VkIG9yIGBsZXZlbHNgIGlzIGVtcHR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtYXBSZWFzb25pbmcoXG4gIHJlcXVlc3RlZDogdW5rbm93bixcbiAgbGV2ZWxzOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdLFxuKTogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAobGV2ZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzRGlzYWJsZWRSZWFzb25pbmdUb2tlbihyZXF1ZXN0ZWQpKSB7XG4gICAgcmV0dXJuIG5lYXJlc3RSZWFzb25pbmcoUmVhc29uaW5nTGV2ZWwuTWVkaXVtLCBsZXZlbHMpO1xuICB9XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlUmVhc29uaW5nKHJlcXVlc3RlZCk7XG4gIGlmICghcGFyc2VkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAobGV2ZWxzLmluY2x1ZGVzKHBhcnNlZCkpIHJldHVybiBwYXJzZWQ7XG4gIGNvbnN0IHJlcXVlc3RlZEluZGV4ID0gUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKHBhcnNlZCk7XG4gIGxldCBiZXN0OiBSZWFzb25pbmdMZXZlbCB8IHVuZGVmaW5lZDtcbiAgbGV0IGJlc3RJbmRleCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgZm9yIChjb25zdCBsZXZlbCBvZiBsZXZlbHMpIHtcbiAgICBjb25zdCBpbmRleCA9IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihsZXZlbCk7XG4gICAgaWYgKGluZGV4IDw9IHJlcXVlc3RlZEluZGV4ICYmIGluZGV4ID4gYmVzdEluZGV4KSB7XG4gICAgICBiZXN0ID0gbGV2ZWw7XG4gICAgICBiZXN0SW5kZXggPSBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJlc3QgPz8gbGV2ZWxzWzBdO1xufVxuXG5mdW5jdGlvbiBpc0Rpc2FibGVkUmVhc29uaW5nVG9rZW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gRElTQUJMRURfUkVBU09OSU5HX1RPS0VOUy5oYXMobm9ybWFsaXplUmVhc29uaW5nVG9rZW4oU3RyaW5nKHZhbHVlKSkpO1xufVxuXG4vKiogQ2xvc2VzdCBzdXBwb3J0ZWQgbGV2ZWwgdG8gYHRhcmdldGA7IHRpZXMgcHJlZmVyIHRoZSBoaWdoZXIgYnVkZ2V0LiAqL1xuZnVuY3Rpb24gbmVhcmVzdFJlYXNvbmluZyhcbiAgdGFyZ2V0OiBSZWFzb25pbmdMZXZlbCxcbiAgbGV2ZWxzOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdLFxuKTogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAobGV2ZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGxldmVscy5pbmNsdWRlcyh0YXJnZXQpKSByZXR1cm4gdGFyZ2V0O1xuICBjb25zdCB0YXJnZXRJbmRleCA9IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZih0YXJnZXQpO1xuICBsZXQgYmVzdDogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQ7XG4gIGxldCBiZXN0RGlzdGFuY2UgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGZvciAoY29uc3QgbGV2ZWwgb2YgbGV2ZWxzKSB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyhSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YobGV2ZWwpIC0gdGFyZ2V0SW5kZXgpO1xuICAgIGlmIChcbiAgICAgIGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlIHx8XG4gICAgICAoZGlzdGFuY2UgPT09IGJlc3REaXN0YW5jZSAmJlxuICAgICAgICBSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YobGV2ZWwpID4gUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKGJlc3QgPz8gbGV2ZWwpKVxuICAgICkge1xuICAgICAgYmVzdCA9IGxldmVsO1xuICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBiZXN0O1xufVxuXG4vKiogUmVzdWx0IG9mIGFkYXB0aW5nIHJlYXNvbmluZyBmaWVsZHMgb24gYSBnYXRld2F5IHJlcXVlc3QgYm9keS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlZFJlcXVlc3RSZWFzb25pbmcge1xuICAvKiogQm9keSB3aXRoIHJlbWFwcGVkIHdpcmUgdG9rZW5zIChzYW1lIHJlZmVyZW5jZSB3aGVuIHVuY2hhbmdlZCkuICovXG4gIHJlYWRvbmx5IGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFRydWUgd2hlbiBhbnkgcmVhc29uaW5nIGZpZWxkIHdhcyByZXdyaXR0ZW4uICovXG4gIHJlYWRvbmx5IGNoYW5nZWQ6IGJvb2xlYW47XG4gIC8qKiBXaXJlIHRva2VuIHdyaXR0ZW4gd2hlbiBhIHJlYXNvbmluZyBmaWVsZCB3YXMgcHJlc2VudCBhbmQgcmVtYXBwZWQuICovXG4gIHJlYWRvbmx5IHdpcmVFZmZvcnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV3cml0ZSBgcmVhc29uaW5nX2VmZm9ydGAgLyBgcmVhc29uaW5nLmVmZm9ydGAgb250byBhIHN1cHBvcnRlZCBsYWRkZXIuXG4gKlxuICogTW9kZWwtYWdub3N0aWM6IGNhbGxlcnMgc3VwcGx5IHRoZSBhbGxvd2VkIGxldmVscyAobGVhcm5lZCwgZG9jdW1lbnRlZCwgb3JcbiAqIGRlZmF1bHRzKS4gQm9kaWVzIHdpdGhvdXQgcmVhc29uaW5nIGZpZWxkcyBhcmUgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRhcHRSZXF1ZXN0UmVhc29uaW5nKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IEFkYXB0ZWRSZXF1ZXN0UmVhc29uaW5nIHtcbiAgaWYgKGxldmVscy5sZW5ndGggPT09IDApIHJldHVybiB7IGJvZHksIGNoYW5nZWQ6IGZhbHNlIH07XG5cbiAgY29uc3QgdG9wTGV2ZWwgPSBib2R5LnJlYXNvbmluZ19lZmZvcnQ7XG4gIGNvbnN0IHJlYXNvbmluZyA9IGlzUmVjb3JkKGJvZHkucmVhc29uaW5nKSA/IGJvZHkucmVhc29uaW5nIDogdW5kZWZpbmVkO1xuICBjb25zdCBuZXN0ZWQgPSByZWFzb25pbmc/LmVmZm9ydDtcbiAgY29uc3QgcmVxdWVzdGVkID0gdG9wTGV2ZWwgPz8gbmVzdGVkO1xuICBpZiAocmVxdWVzdGVkID09PSB1bmRlZmluZWQpIHJldHVybiB7IGJvZHksIGNoYW5nZWQ6IGZhbHNlIH07XG5cbiAgY29uc3QgcmVtYXBwZWQgPSByZW1hcFJlYXNvbmluZyhyZXF1ZXN0ZWQsIGxldmVscyk7XG4gIGlmICghcmVtYXBwZWQpIHJldHVybiB7IGJvZHksIGNoYW5nZWQ6IGZhbHNlIH07XG4gIGNvbnN0IHdpcmUgPSBmb3JtYXRSZWFzb25pbmcocmVtYXBwZWQpO1xuXG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGxldCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uYm9keSB9O1xuXG4gIGlmICh0eXBlb2YgdG9wTGV2ZWwgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHRvcExldmVsID09PSBcIm51bWJlclwiKSB7XG4gICAgaWYgKFN0cmluZyh0b3BMZXZlbCkgIT09IHdpcmUpIHtcbiAgICAgIG5leHQgPSB7IC4uLm5leHQsIHJlYXNvbmluZ19lZmZvcnQ6IHdpcmUgfTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAocmVhc29uaW5nICYmICh0eXBlb2YgbmVzdGVkID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBuZXN0ZWQgPT09IFwibnVtYmVyXCIpKSB7XG4gICAgaWYgKFN0cmluZyhuZXN0ZWQpICE9PSB3aXJlKSB7XG4gICAgICBuZXh0ID0geyAuLi5uZXh0LCByZWFzb25pbmc6IHsgLi4ucmVhc29uaW5nLCBlZmZvcnQ6IHdpcmUgfSB9O1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNoYW5nZWQgPyB7IGJvZHk6IG5leHQsIGNoYW5nZWQ6IHRydWUsIHdpcmVFZmZvcnQ6IHdpcmUgfSA6IHsgYm9keSwgY2hhbmdlZDogZmFsc2UsIHdpcmVFZmZvcnQ6IHdpcmUgfTtcbn1cblxuLyoqIE5vcm1hbGl6ZSBsYWJlbHMgZm9yIGFsaWFzIGxvb2t1cCAoYEV4dHJhIEhpZ2hgIOKGkiBgZXh0cmEtaGlnaGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlYXNvbmluZ1Rva2VuKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIHN0cmluZ1V0aWxzXG4gICAgICAudHJpbVRvTnVsbCh2YWx1ZSlcbiAgICAgID8udG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1tfXFxzXSsvZywgXCItXCIpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTktXS9nLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoLy0rL2csIFwiLVwiKVxuICAgICAgLnJlcGxhY2UoL14tfC0kL2csIFwiXCIpID8/IFwiXCJcbiAgKTtcbn1cblxuLyoqIERlZHVwbGljYXRlIGxldmVscyB3aGlsZSBwcmVzZXJ2aW5nIGZpcnN0LXNlZW4gb3JkZXIuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSk6IFJlYXNvbmluZ0xldmVsW10ge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxSZWFzb25pbmdMZXZlbD4oKTtcbiAgY29uc3Qgb3JkZXJlZDogUmVhc29uaW5nTGV2ZWxbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxldmVsIG9mIGxldmVscykge1xuICAgIGlmIChzZWVuLmhhcyhsZXZlbCkpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKGxldmVsKTtcbiAgICBvcmRlcmVkLnB1c2gobGV2ZWwpO1xuICB9XG4gIHJldHVybiBvcmRlcmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0U3VwcG9ydGVkVG9rZW5zKHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbWF0Y2ggPSBTVVBQT1JURURfVkFMVUVTX1BBVFRFUk4uZXhlYyh0ZXh0KTtcbiAgaWYgKCFtYXRjaD8uWzFdKSByZXR1cm4gW107XG4gIHJldHVybiB0b2tlbnNGcm9tRnJhZ21lbnQobWF0Y2hbMV0pO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVLZXlzRm9yKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGlyZWN0ID0gbW9kZWxDYXRhbG9ndWVLZXkobW9kZWwpO1xuICBpZiAoZGlyZWN0KSBrZXlzLmFkZChkaXJlY3QpO1xuICBjb25zdCBzdHJpcHBlZCA9IG1vZGVsXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXmRhdGFicmlja3NcXC8vLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9ec3lzdGVtXFwuYWlcXC4vLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9eZGF0YWJyaWNrcy0vLCBcIlwiKTtcbiAgY29uc3Qgc3RyaXBwZWRLZXkgPSBtb2RlbENhdGFsb2d1ZUtleShzdHJpcHBlZCk7XG4gIGlmIChzdHJpcHBlZEtleSkga2V5cy5hZGQoc3RyaXBwZWRLZXkpO1xuICBjb25zdCB3aXRoUHJlZml4ID0gbW9kZWxDYXRhbG9ndWVLZXkoYGRhdGFicmlja3MtJHtzdHJpcHBlZH1gKTtcbiAgaWYgKHdpdGhQcmVmaXgpIGtleXMuYWRkKHdpdGhQcmVmaXgpO1xuICByZXR1cm4gWy4uLmtleXNdO1xufVxuXG5mdW5jdGlvbiBtb2RlbENhdGFsb2d1ZUtleShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0cmltbWVkID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChuYW1lKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKFxuICAgIG1vZGVsU2VhcmNoUXVlcnkodHJpbW1lZCk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKSA/P1xuICAgIHRyaW1tZWRcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvXmRhdGFicmlja3MtLywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5fLV0rL2csIFwiLVwiKVxuICApO1xufVxuXG5mdW5jdGlvbiB0b2tlbnNGcm9tRnJhZ21lbnQoZnJhZ21lbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgZnJhZ21lbnQubWF0Y2hBbGwoVE9LRU5fUEFUVEVSTikpIHtcbiAgICBjb25zdCB0b2tlbiA9IHBhcnRbMV0gPz8gcGFydFsyXSA/PyBwYXJ0WzNdID8/IHBhcnRbNF07XG4gICAgaWYgKCF0b2tlbiB8fCB0b2tlbiA9PT0gXCJhbmRcIiB8fCB0b2tlbiA9PT0gXCJvclwiIHx8IHRva2VuID09PSBcIm9mXCIpIGNvbnRpbnVlO1xuICAgIHRva2Vucy5wdXNoKHRva2VuLnJlcGxhY2UoL15bXCInYF0rfFtcIidgXSskL2csIFwiXCIpKTtcbiAgfVxuICByZXR1cm4gdG9rZW5zO1xufVxuXG4vKipcbiAqIFdhbGsgYSB2YWx1ZSB0cmVlLCB1bndyYXBwaW5nIG5lc3RlZCBKU09OIHN0cmluZ3MsIGFuZCBjb2xsZWN0IHRleHQgbGVhdmVzXG4gKiB0aGF0IG1heSBjb250YWluIGEgc3VwcG9ydGVkLXZhbHVlcyBzZW50ZW5jZS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFRleHRMZWF2ZXModmFsdWU6IHVua25vd24sIGRlcHRoID0gMCk6IHN0cmluZ1tdIHtcbiAgaWYgKHZhbHVlID09IG51bGwgfHwgZGVwdGggPiBNQVhfSlNPTl9VTldSQVBfREVQVEgpIHJldHVybiBbXTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gW107XG4gICAgY29uc3QgcGFyc2VkID0gdHJ5VW53cmFwSnNvbih0cmltbWVkKTtcbiAgICBpZiAocGFyc2VkICE9PSB1bmRlZmluZWQgJiYgcGFyc2VkICE9PSB0cmltbWVkKSB7XG4gICAgICByZXR1cm4gY29sbGVjdFRleHRMZWF2ZXMocGFyc2VkLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gW3RyaW1tZWRdO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFtTdHJpbmcodmFsdWUpXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKGVudHJ5KSA9PiBjb2xsZWN0VGV4dExlYXZlcyhlbnRyeSwgZGVwdGggKyAxKSk7XG4gIH1cbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXModmFsdWUpLmZsYXRNYXAoKGVudHJ5KSA9PiBjb2xsZWN0VGV4dExlYXZlcyhlbnRyeSwgZGVwdGggKyAxKSk7XG59XG5cbmZ1bmN0aW9uIHRyeVVud3JhcEpzb24odGV4dDogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGFzUmVjb3JkID0ganNvbi5wYXJzZVJlY29yZCh0ZXh0KTtcbiAgaWYgKGFzUmVjb3JkKSByZXR1cm4gYXNSZWNvcmQ7XG4gIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2UodGV4dCk7XG4gIGlmIChwYXJzZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHBhcnNlZDtcbiAgaWYgKHRleHQuaW5jbHVkZXMoJ1xcXFxcIicpIHx8IHRleHQuaW5jbHVkZXMoXCJcXFxcblwiKSkge1xuICAgIGNvbnN0IHVuZXNjYXBlZCA9IHRleHQucmVwbGFjZSgvXFxcXFwiL2csICdcIicpLnJlcGxhY2UoL1xcXFxuL2csIFwiXFxuXCIpLnJlcGxhY2UoL1xcXFxcXFxcL2csIFwiXFxcXFwiKTtcbiAgICBpZiAodW5lc2NhcGVkICE9PSB0ZXh0KSB7XG4gICAgICBjb25zdCBuZXN0ZWQgPSBqc29uLnBhcnNlKHVuZXNjYXBlZCk7XG4gICAgICBpZiAobmVzdGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBuZXN0ZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
449
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhc29uaW5nLXRyYW5zbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSzVELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRyxFQUFFLEtBQUs7SUFDVixNQUFNLEVBQUUsUUFBUTtJQUNoQixJQUFJLEVBQUUsTUFBTTtJQUNaLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLEdBQUcsRUFBRSxLQUFLO0NBQ3VDLENBQUM7QUFFcEQsa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE4QjtJQUN6RCxjQUFjLENBQUMsR0FBRztJQUNsQixjQUFjLENBQUMsTUFBTTtJQUNyQixjQUFjLENBQUMsSUFBSTtJQUNuQixjQUFjLENBQUMsU0FBUztJQUN4QixjQUFjLENBQUMsR0FBRztDQUNuQixDQUFDO0FBS0YsTUFBTSxRQUFRLEdBQThCO0lBQzFDLGNBQWMsQ0FBQyxHQUFHO0lBQ2xCLGNBQWMsQ0FBQyxNQUFNO0lBQ3JCLGNBQWMsQ0FBQyxJQUFJO0NBQ3BCLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBOEI7SUFDakQsY0FBYyxDQUFDLEdBQUc7SUFDbEIsY0FBYyxDQUFDLE1BQU07SUFDckIsY0FBYyxDQUFDLElBQUk7SUFDbkIsY0FBYyxDQUFDLFNBQVM7Q0FDekIs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QUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDeEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekYsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyQyxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJpYyByZWFzb25pbmctYnVkZ2V0IHRyYW5zbGF0aW9uIGZvciBNb2RlbCBTZXJ2aW5nIGFuZCBnYXRld2F5IGNhbGxlcnMuXG4gKlxuICogUHJvdmlkZXIgd2lyZXMgZGlzYWdyZWUgb24gZWZmb3J0IGxhYmVscyAoYHhoaWdoYCwgYHVsdHJhYCwgYG1lZGAsIGBub25lYCwg4oCmKS5cbiAqIFRoaXMgbW9kdWxlIG93bnMgb25lIGluZHVzdHJ5LXNoYXBlZCBsYWRkZXIgYW5kIHR3byBwYXJzZXJzOlxuICpcbiAqIC0ge0BsaW5rIHBhcnNlUmVhc29uaW5nfTogZnV6enktbWF0Y2ggb25lIGxhYmVsIG9udG8ge0BsaW5rIFJlYXNvbmluZ0xldmVsfVxuICogLSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9OiB1bndyYXAgbmVzdGVkIC8gZG91YmxlLWVuY29kZWQgZXJyb3IgYm9kaWVzXG4gKiAtIHtAbGluayByZW1hcFJlYXNvbmluZ30gLyB7QGxpbmsgYWRhcHRSZXF1ZXN0UmVhc29uaW5nfTogbWFwIGEgcmVxdWVzdCBvbnRvIGFcbiAqICAgc3VwcG9ydGVkIGxhZGRlciBhbmQgcmV3cml0ZSBgcmVhc29uaW5nX2VmZm9ydGAgLyBgcmVhc29uaW5nLmVmZm9ydGBcbiAqXG4gKiBEb2N1bWVudGVkIG1vZGVsIGxhZGRlcnMgY29tZSBmcm9tIHRoZSBjb21taXR0ZWQgSFRNTCBzbmFwc2hvdCByZWZyZXNoZWQgYnlcbiAqIGBidW4gcnVuIC0tZmlsdGVyICdAZGJ4LXRvb2xzL21vZGVsJyBtZXRhZGF0YWAgKHNhbWUgY2FjaGUgcGF0aCBhc1xuICogY2FwYWJpbGl0aWVzIC8gcmF0ZSBsaW1pdHMpLiBFcnJvci1ib2R5IHBhcnNpbmcgaXMgbmV2ZXIgY2FjaGVkOyBjYWxsZXJzXG4gKiBwZXJzaXN0IGxlYXJuZWQgbGFkZGVycyB2aWEgdGhlIG1ldGFkYXRhIG1vZHVsZS5cbiAqXG4gKiBFcnJvciBib2RpZXMgYXJyaXZlIGFzIGNvbXBsZXRlIEhUVFAgSlNPTiB3aGV0aGVyIHRoZSByZXF1ZXN0IGFza2VkIGZvclxuICogc3RyZWFtaW5nIG9yIG5vdCAoRGF0YWJyaWNrcyByZWplY3RzIHVuc3VwcG9ydGVkIGVmZm9ydHMgd2l0aCA0MDAgYmVmb3JlIFNTRVxuICogc3RhcnRzKSwgc28ge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfSBhcHBsaWVzIHRvIGJvdGggcGF0aHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGpzb24gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgaXNSZWNvcmQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vYmplY3RcIjtcbmltcG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL3N0cmluZy11dGlsc1wiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IHsgbW9kZWxGYW1pbHksIG1vZGVsU2VhcmNoUXVlcnkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxuLyoqIEluZHVzdHJ5LWdlbmVyaWMgcmVhc29uaW5nIGJ1ZGdldCBsZXZlbHMsIGxvd2VzdCB0byBoaWdoZXN0LiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTGV2ZWwgPSBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiIHwgXCJleHRyYS1oaWdoXCIgfCBcIm1heFwiO1xuXG4vKiogUnVudGltZSB2YWx1ZXMgZm9yIHtAbGluayBSZWFzb25pbmdMZXZlbH0uICovXG5leHBvcnQgY29uc3QgUmVhc29uaW5nTGV2ZWwgPSB7XG4gIExvdzogXCJsb3dcIixcbiAgTWVkaXVtOiBcIm1lZGl1bVwiLFxuICBIaWdoOiBcImhpZ2hcIixcbiAgRXh0cmFIaWdoOiBcImV4dHJhLWhpZ2hcIixcbiAgTWF4OiBcIm1heFwiLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+O1xuXG4vKiogQ2Fub25pY2FsIGxhZGRlciBvcmRlciB1c2VkIHdoZW4gc29ydGluZyBvciByYW5raW5nIHJlbWFwcy4gKi9cbmV4cG9ydCBjb25zdCBSRUFTT05JTkdfTEVWRUxTOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG4vKiogTW9kZWwgaWRlbnRpdHkg4oaSIGFjY2VwdGVkIHtAbGluayBSZWFzb25pbmdMZXZlbH0gbGFkZGVyLiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj47XG5cbmNvbnN0IFNUQU5EQVJEOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfRVhUUkFfSElHSDogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTG93LFxuICBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfTUFYOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG5jb25zdCBHUFRfNV81X1BSTzogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG5dO1xuXG4vKipcbiAqIEFsaWFzIHRhYmxlIGZvciBleGFjdCAvIG5lYXItZXhhY3QgbGFiZWxzLiBLZXlzIGFyZSB7QGxpbmsgbm9ybWFsaXplUmVhc29uaW5nVG9rZW59XG4gKiByZXN1bHRzLiBQcm92aWRlciB3aXJlcyAoYHhoaWdoYCkgYW5kIHBsYWluIEVuZ2xpc2ggKGB1bHRyYWAsIGBtZWRgKSBib3RoIGxhbmRcbiAqIG9uIHRoZSBnZW5lcmljIGxhZGRlci5cbiAqL1xuY29uc3QgQUxJQVNFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+PiA9IHtcbiAgbG93OiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIGw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbm9uZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBvZmY6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgZGlzYWJsZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBkaXNhYmxlZDogUmVhc29uaW5nTGV2ZWwuTG93LFxuICB6ZXJvOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIG1pbmltYWw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWluOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIHRpbnk6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbGlnaHQ6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWVkaXVtOiBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIG1lZDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBtaWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgbW9kZXJhdGU6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgZGVmYXVsdDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBub3JtYWw6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgYmFsYW5jZWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgaGlnaDogUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgaGk6IFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIGhlYXZ5OiBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBcImV4dHJhLWhpZ2hcIjogUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBleHRyYWhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGg6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmE6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgXCJ1bHRyYS1oaWdoXCI6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmFoaWdoOiBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG4gIG1heDogUmVhc29uaW5nTGV2ZWwuTWF4LFxuICBtYXhpbXVtOiBSZWFzb25pbmdMZXZlbC5NYXgsXG4gIGhpZ2hlc3Q6IFJlYXNvbmluZ0xldmVsLk1heCxcbiAgZnVsbDogUmVhc29uaW5nTGV2ZWwuTWF4LFxufTtcblxuY29uc3QgU1VQUE9SVEVEX1ZBTFVFU19QQVRURVJOID1cbiAgL3N1cHBvcnRlZFxccyt2YWx1ZXM/XFxzK2FyZVxccyo6P1xccyooLis/KSg/OlxcLj9cXHMqKD86cGFyYW18dHlwZXxjb2RlKVxcYnwkKS9pcztcbmNvbnN0IFRPS0VOX1BBVFRFUk4gPSAvJyhbXiddKyknfFwiKFteXCJdKylcInxgKFteYF0rKWB8XFxiKFthLXpdW2EtejAtOV8tXSopXFxiL2dpO1xuY29uc3QgTUFYX0pTT05fVU5XUkFQX0RFUFRIID0gODtcblxuaW50ZXJmYWNlIEFsaWFzRG9jdW1lbnQge1xuICByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICByZWFkb25seSBsZXZlbDogUmVhc29uaW5nTGV2ZWw7XG59XG5cbmNvbnN0IGFsaWFzRG9jdW1lbnRzOiByZWFkb25seSBBbGlhc0RvY3VtZW50W10gPSBPYmplY3QuZW50cmllcyhBTElBU0VTKS5tYXAoKFt0b2tlbiwgbGV2ZWxdKSA9PiAoe1xuICB0b2tlbixcbiAgbGV2ZWwsXG59KSk7XG5cbmNvbnN0IGFsaWFzRnVzZSA9IG5ldyBGdXNlKGFsaWFzRG9jdW1lbnRzLCB7XG4gIGtleXM6IFtcInRva2VuXCJdLFxuICBpbmNsdWRlU2NvcmU6IHRydWUsXG4gIHRocmVzaG9sZDogMC4zNSxcbiAgaWdub3JlTG9jYXRpb246IHRydWUsXG59KTtcblxuLyoqXG4gKiBGdXp6eS1tYXRjaCBvbmUgcmVhc29uaW5nIGxhYmVsIG9udG8ge0BsaW5rIFJlYXNvbmluZ0xldmVsfS5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGlucHV0IGlzIGVtcHR5IG9yIGNhbm5vdCBiZSBtYXBwZWQgY29uZmlkZW50bHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlYXNvbmluZyh2YWx1ZTogdW5rbm93bik6IFJlYXNvbmluZ0xldmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVJlYXNvbmluZ1Rva2VuKFN0cmluZyh2YWx1ZSkpO1xuICBpZiAoIW5vcm1hbGl6ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGV4YWN0ID0gQUxJQVNFU1tub3JtYWxpemVkXSA/PyBBTElBU0VTW25vcm1hbGl6ZWQucmVwbGFjZSgvLS9nLCBcIlwiKV07XG4gIGlmIChleGFjdCkgcmV0dXJuIGV4YWN0O1xuICBjb25zdCBbbWF0Y2hdID0gYWxpYXNGdXNlLnNlYXJjaChub3JtYWxpemVkKTtcbiAgaWYgKCFtYXRjaCB8fCAobWF0Y2guc2NvcmUgPz8gMSkgPiAwLjM1KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbWF0Y2guaXRlbS5sZXZlbDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHN1cHBvcnRlZCByZWFzb25pbmcgbGV2ZWxzIGZyb20gYW4gdXBzdHJlYW0gZXJyb3IgYm9keS5cbiAqXG4gKiBBY2NlcHRzIHJhdyByZXNwb25zZSB0ZXh0LCBhbHJlYWR5LXBhcnNlZCBKU09OLCBvciBEYXRhYnJpY2tzIGVudmVsb3BlcyB0aGF0XG4gKiBuZXN0IEpTT04gc3RyaW5ncyBzZXZlcmFsIHRpbWVzLiBSZXR1cm5zIGBbXWAgd2hlbiBubyBzdXBwb3J0ZWQtdmFsdWVzIGxpc3RcbiAqIGNhbiBiZSByZWNvdmVyZWQuIFJlc3VsdHMgYXJlIG5vdCBjYWNoZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlYXNvbmluZ0xldmVscyhib2R5OiB1bmtub3duKTogUmVhc29uaW5nTGV2ZWxbXSB7XG4gIGNvbnN0IGxldmVsczogUmVhc29uaW5nTGV2ZWxbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxSZWFzb25pbmdMZXZlbD4oKTtcbiAgZm9yIChjb25zdCB0ZXh0IG9mIGNvbGxlY3RUZXh0TGVhdmVzKGJvZHkpKSB7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBleHRyYWN0U3VwcG9ydGVkVG9rZW5zKHRleHQpKSB7XG4gICAgICBjb25zdCBsZXZlbCA9IHBhcnNlUmVhc29uaW5nKHRva2VuKTtcbiAgICAgIGlmICghbGV2ZWwgfHwgc2Vlbi5oYXMobGV2ZWwpKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKGxldmVsKTtcbiAgICAgIGxldmVscy5wdXNoKGxldmVsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxldmVscztcbn1cblxuLyoqXG4gKiBMb29rIHVwIGRvY3VtZW50ZWQgbGV2ZWxzIGZvciBhIG1vZGVsIGlkZW50aXR5IGluc2lkZSBhIGNhdGFsb2d1ZS5cbiAqXG4gKiBNYXRjaGVzIGV4YWN0IGNhdGFsb2d1ZSBrZXlzIGFuZCBzdWZmaXggaWRlbnRpdGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvY3VtZW50ZWRSZWFzb25pbmdMZXZlbHMoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGNhdGFsb2d1ZTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsXG4pOiBSZWFzb25pbmdMZXZlbFtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5cyA9IGNhdGFsb2d1ZUtleXNGb3IobW9kZWwpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgbGV2ZWxzID0gY2F0YWxvZ3VlW2tleV07XG4gICAgaWYgKGxldmVscz8ubGVuZ3RoKSByZXR1cm4gWy4uLmxldmVsc107XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCBsZXZlbHNdIG9mIE9iamVjdC5lbnRyaWVzKGNhdGFsb2d1ZSkpIHtcbiAgICBpZiAoa2V5cy5zb21lKChjYW5kaWRhdGUpID0+IGtleS5lbmRzV2l0aChjYW5kaWRhdGUpIHx8IGNhbmRpZGF0ZS5lbmRzV2l0aChrZXkpKSkge1xuICAgICAgcmV0dXJuIFsuLi5sZXZlbHNdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEhhcmQtY29kZWQgZmFtaWx5IGRlZmF1bHRzIHVzZWQgd2hlbiBkb2N1bWVudGF0aW9uIGhhcyBubyBlbnRyeS5cbiAqXG4gKiBVbmtub3duIGZhbWlsaWVzIHJldHVybiB0aGUgc3RhbmRhcmQgbG93L21lZGl1bS9oaWdoIGxhZGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMobW9kZWw6IHN0cmluZyk6IFJlYXNvbmluZ0xldmVsW10ge1xuICBjb25zdCBmYW1pbHkgPSBtb2RlbEZhbWlseShtb2RlbCk/LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBtb2RlbC50b0xvd2VyQ2FzZSgpO1xuICBpZiAoZmFtaWx5ID09PSBcImdyb2tcIiB8fCBub3JtYWxpemVkLmluY2x1ZGVzKFwiZ3Jva1wiKSkgcmV0dXJuIFsuLi5XSVRIX0VYVFJBX0hJR0hdO1xuICBpZiAoZmFtaWx5ID09PSBcImdlbWluaVwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJnZW1pbmlcIikpIHJldHVybiBbLi4uU1RBTkRBUkRdO1xuICBpZiAoZmFtaWx5ID09PSBcImNsYXVkZVwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJjbGF1ZGVcIikpIHJldHVybiBbLi4uV0lUSF9NQVhdO1xuICBpZiAoZmFtaWx5ID09PSBcImdsbVwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJnbG1cIikpIHtcbiAgICByZXR1cm4gW1JlYXNvbmluZ0xldmVsLkhpZ2gsIFJlYXNvbmluZ0xldmVsLk1heF07XG4gIH1cbiAgaWYgKFxuICAgIGZhbWlseSA9PT0gXCJkZWVwc2Vla1wiIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcyhcImRlZXBzZWVrXCIpIHx8XG4gICAgZmFtaWx5ID09PSBcImtpbWlcIiB8fFxuICAgIG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJraW1pXCIpXG4gICkge1xuICAgIHJldHVybiBbUmVhc29uaW5nTGV2ZWwuTG93LCBSZWFzb25pbmdMZXZlbC5IaWdoLCBSZWFzb25pbmdMZXZlbC5NYXhdO1xuICB9XG4gIGlmIChmYW1pbHkgPT09IFwiaW5rbGluZ1wiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJpbmtsaW5nXCIpKSByZXR1cm4gWy4uLldJVEhfTUFYXTtcbiAgaWYgKGZhbWlseSA9PT0gXCJncHRcIiB8fCBub3JtYWxpemVkLmluY2x1ZGVzKFwiZ3B0XCIpIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJjb2RleFwiKSkge1xuICAgIGlmIChub3JtYWxpemVkLmluY2x1ZGVzKFwib3NzXCIpKSByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbiAgICBpZiAoLyg/Ol58Wy1fLl0pNVstXy5dPzUoPzpbLV8uXXwkKS8udGVzdChub3JtYWxpemVkKSAmJiBub3JtYWxpemVkLmluY2x1ZGVzKFwicHJvXCIpKSB7XG4gICAgICByZXR1cm4gWy4uLkdQVF81XzVfUFJPXTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgLyg/Ol58Wy1fLl0pNVstXy5dPzYoPzpbLV8uXXwkKS8udGVzdChub3JtYWxpemVkKSB8fFxuICAgICAgLyg/Ol58Wy1fLl0pNig/OlstXy5dfCQpLy50ZXN0KG5vcm1hbGl6ZWQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gWy4uLldJVEhfTUFYXTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5TVEFOREFSRF07XG4gIH1cbiAgaWYgKC8oPzpefFstXy4vXSlvKD86MXwzfDQpKD86Wy1fLi9dfCQpLy50ZXN0KG1vZGVsKSB8fCBub3JtYWxpemVkLmluY2x1ZGVzKFwiY29kZXhcIikpIHtcbiAgICByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbiAgfVxuICByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbn1cblxuLyoqXG4gKiBQcmVmZXIgYSBkb2N1bWVudGF0aW9uIGNhdGFsb2d1ZSB3aGVuIHByb3ZpZGVkLCBvdGhlcndpc2VcbiAqIHtAbGluayBkZWZhdWx0UmVhc29uaW5nTGV2ZWxzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYXNvbmluZ0xldmVsc0ZvcihcbiAgbW9kZWw6IHN0cmluZyxcbiAgY2F0YWxvZ3VlPzogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsXG4pOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgaWYgKGNhdGFsb2d1ZSkge1xuICAgIGNvbnN0IGRvY3VtZW50ZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKG1vZGVsLCBjYXRhbG9ndWUpO1xuICAgIGlmIChkb2N1bWVudGVkPy5sZW5ndGgpIHJldHVybiBkb2N1bWVudGVkO1xuICB9XG4gIHJldHVybiBkZWZhdWx0UmVhc29uaW5nTGV2ZWxzKG1vZGVsKTtcbn1cblxuLyoqXG4gKiBNYXAgYSBnZW5lcmljIGxldmVsIG9udG8gdGhlIG1vc3QgY29tbW9uIHByb3ZpZGVyIHdpcmUgdG9rZW4uXG4gKlxuICogYGV4dHJhLWhpZ2hgIGJlY29tZXMgYHhoaWdoYCBiZWNhdXNlIHRoYXQgaXMgd2hhdCBEYXRhYnJpY2tzIC8gT3BlbkFJIGVycm9yXG4gKiBtZXNzYWdlcyBhZHZlcnRpc2UgdG9kYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRSZWFzb25pbmcobGV2ZWw6IFJlYXNvbmluZ0xldmVsKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxldmVsID09PSBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2ggPyBcInhoaWdoXCIgOiBsZXZlbDtcbn1cblxuLyoqIFdpcmUgdG9rZW5zIHRoYXQgbWVhbiBcImRvIG5vdCByZWFzb25cIiByYXRoZXIgdGhhbiBcInVzZSBhIGxvdyBidWRnZXRcIi4gKi9cbmNvbnN0IERJU0FCTEVEX1JFQVNPTklOR19UT0tFTlMgPSBuZXcgU2V0KFtcIm5vbmVcIiwgXCJvZmZcIiwgXCJkaXNhYmxlXCIsIFwiZGlzYWJsZWRcIl0pO1xuXG4vKipcbiAqIFJlbWFwIGEgcmVxdWVzdGVkIGVmZm9ydCBvbnRvIHRoZSBuZWFyZXN0IHN1cHBvcnRlZCB7QGxpbmsgUmVhc29uaW5nTGV2ZWx9LlxuICpcbiAqIGBub25lYCAvIGBvZmZgIChhbmQgZGlzYWJsZSBhbGlhc2VzKSBhcmUgbm90IGEgbG93IGJ1ZGdldDogd2hlbiB0aGUgbW9kZWxcbiAqIHJlcXVpcmVzIHJlYXNvbmluZywgdGhleSBzbmFwIHRvIHRoZSBzdXBwb3J0ZWQgbGV2ZWwgY2xvc2VzdCB0b1xuICoge0BsaW5rIFJlYXNvbmluZ0xldmVsLk1lZGl1bX0uIE90aGVyIHJlcXVlc3RzIHByZWZlciB0aGUgaGlnaGVzdCBhbGxvd2VkXG4gKiBsZXZlbCBhdCBvciBiZWxvdyB0aGUgcmVxdWVzdCwgb3RoZXJ3aXNlIHRoZSBsb3dlc3QgYWxsb3dlZCBsZXZlbC5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIHJlcXVlc3QgY2Fubm90IGJlIHBhcnNlZCBvciBgbGV2ZWxzYCBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFwUmVhc29uaW5nKFxuICByZXF1ZXN0ZWQ6IHVua25vd24sXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IFJlYXNvbmluZ0xldmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGxldmVscy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpc0Rpc2FibGVkUmVhc29uaW5nVG9rZW4ocmVxdWVzdGVkKSkge1xuICAgIHJldHVybiBuZWFyZXN0UmVhc29uaW5nKFJlYXNvbmluZ0xldmVsLk1lZGl1bSwgbGV2ZWxzKTtcbiAgfVxuICBjb25zdCBwYXJzZWQgPSBwYXJzZVJlYXNvbmluZyhyZXF1ZXN0ZWQpO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGxldmVscy5pbmNsdWRlcyhwYXJzZWQpKSByZXR1cm4gcGFyc2VkO1xuICBjb25zdCByZXF1ZXN0ZWRJbmRleCA9IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihwYXJzZWQpO1xuICBsZXQgYmVzdDogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQ7XG4gIGxldCBiZXN0SW5kZXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gIGZvciAoY29uc3QgbGV2ZWwgb2YgbGV2ZWxzKSB7XG4gICAgY29uc3QgaW5kZXggPSBSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YobGV2ZWwpO1xuICAgIGlmIChpbmRleCA8PSByZXF1ZXN0ZWRJbmRleCAmJiBpbmRleCA+IGJlc3RJbmRleCkge1xuICAgICAgYmVzdCA9IGxldmVsO1xuICAgICAgYmVzdEluZGV4ID0gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiBiZXN0ID8/IGxldmVsc1swXTtcbn1cblxuZnVuY3Rpb24gaXNEaXNhYmxlZFJlYXNvbmluZ1Rva2VuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIERJU0FCTEVEX1JFQVNPTklOR19UT0tFTlMuaGFzKG5vcm1hbGl6ZVJlYXNvbmluZ1Rva2VuKFN0cmluZyh2YWx1ZSkpKTtcbn1cblxuLyoqIENsb3Nlc3Qgc3VwcG9ydGVkIGxldmVsIHRvIGB0YXJnZXRgOyB0aWVzIHByZWZlciB0aGUgaGlnaGVyIGJ1ZGdldC4gKi9cbmZ1bmN0aW9uIG5lYXJlc3RSZWFzb25pbmcoXG4gIHRhcmdldDogUmVhc29uaW5nTGV2ZWwsXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IFJlYXNvbmluZ0xldmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGxldmVscy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChsZXZlbHMuaW5jbHVkZXModGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgY29uc3QgdGFyZ2V0SW5kZXggPSBSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YodGFyZ2V0KTtcbiAgbGV0IGJlc3Q6IFJlYXNvbmluZ0xldmVsIHwgdW5kZWZpbmVkO1xuICBsZXQgYmVzdERpc3RhbmNlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICBmb3IgKGNvbnN0IGxldmVsIG9mIGxldmVscykge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKGxldmVsKSAtIHRhcmdldEluZGV4KTtcbiAgICBpZiAoXG4gICAgICBkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSB8fFxuICAgICAgKGRpc3RhbmNlID09PSBiZXN0RGlzdGFuY2UgJiZcbiAgICAgICAgUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKGxldmVsKSA+IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihiZXN0ID8/IGxldmVsKSlcbiAgICApIHtcbiAgICAgIGJlc3QgPSBsZXZlbDtcbiAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmVzdDtcbn1cblxuLyoqIFJlc3VsdCBvZiBhZGFwdGluZyByZWFzb25pbmcgZmllbGRzIG9uIGEgZ2F0ZXdheSByZXF1ZXN0IGJvZHkuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZWRSZXF1ZXN0UmVhc29uaW5nIHtcbiAgLyoqIEJvZHkgd2l0aCByZW1hcHBlZCB3aXJlIHRva2VucyAoc2FtZSByZWZlcmVuY2Ugd2hlbiB1bmNoYW5nZWQpLiAqL1xuICByZWFkb25seSBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIC8qKiBUcnVlIHdoZW4gYW55IHJlYXNvbmluZyBmaWVsZCB3YXMgcmV3cml0dGVuLiAqL1xuICByZWFkb25seSBjaGFuZ2VkOiBib29sZWFuO1xuICAvKiogV2lyZSB0b2tlbiB3cml0dGVuIHdoZW4gYSByZWFzb25pbmcgZmllbGQgd2FzIHByZXNlbnQgYW5kIHJlbWFwcGVkLiAqL1xuICByZWFkb25seSB3aXJlRWZmb3J0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJld3JpdGUgYHJlYXNvbmluZ19lZmZvcnRgIC8gYHJlYXNvbmluZy5lZmZvcnRgIG9udG8gYSBzdXBwb3J0ZWQgbGFkZGVyLlxuICpcbiAqIE1vZGVsLWFnbm9zdGljOiBjYWxsZXJzIHN1cHBseSB0aGUgYWxsb3dlZCBsZXZlbHMgKGxlYXJuZWQsIGRvY3VtZW50ZWQsIG9yXG4gKiBkZWZhdWx0cykuIEJvZGllcyB3aXRob3V0IHJlYXNvbmluZyBmaWVsZHMgYXJlIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYXB0UmVxdWVzdFJlYXNvbmluZyhcbiAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICBsZXZlbHM6IHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10sXG4pOiBBZGFwdGVkUmVxdWVzdFJlYXNvbmluZyB7XG4gIGlmIChsZXZlbHMubGVuZ3RoID09PSAwKSByZXR1cm4geyBib2R5LCBjaGFuZ2VkOiBmYWxzZSB9O1xuXG4gIGNvbnN0IHRvcExldmVsID0gYm9keS5yZWFzb25pbmdfZWZmb3J0O1xuICBjb25zdCByZWFzb25pbmcgPSBpc1JlY29yZChib2R5LnJlYXNvbmluZykgPyBib2R5LnJlYXNvbmluZyA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbmVzdGVkID0gcmVhc29uaW5nPy5lZmZvcnQ7XG4gIGNvbnN0IHJlcXVlc3RlZCA9IHRvcExldmVsID8/IG5lc3RlZDtcbiAgaWYgKHJlcXVlc3RlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4geyBib2R5LCBjaGFuZ2VkOiBmYWxzZSB9O1xuXG4gIGNvbnN0IHJlbWFwcGVkID0gcmVtYXBSZWFzb25pbmcocmVxdWVzdGVkLCBsZXZlbHMpO1xuICBpZiAoIXJlbWFwcGVkKSByZXR1cm4geyBib2R5LCBjaGFuZ2VkOiBmYWxzZSB9O1xuICBjb25zdCB3aXJlID0gZm9ybWF0UmVhc29uaW5nKHJlbWFwcGVkKTtcblxuICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICBsZXQgbmV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLmJvZHkgfTtcblxuICBpZiAodHlwZW9mIHRvcExldmVsID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB0b3BMZXZlbCA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmIChTdHJpbmcodG9wTGV2ZWwpICE9PSB3aXJlKSB7XG4gICAgICBuZXh0ID0geyAuLi5uZXh0LCByZWFzb25pbmdfZWZmb3J0OiB3aXJlIH07XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHJlYXNvbmluZyAmJiAodHlwZW9mIG5lc3RlZCA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgbmVzdGVkID09PSBcIm51bWJlclwiKSkge1xuICAgIGlmIChTdHJpbmcobmVzdGVkKSAhPT0gd2lyZSkge1xuICAgICAgbmV4dCA9IHsgLi4ubmV4dCwgcmVhc29uaW5nOiB7IC4uLnJlYXNvbmluZywgZWZmb3J0OiB3aXJlIH0gfTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGFuZ2VkXG4gICAgPyB7IGJvZHk6IG5leHQsIGNoYW5nZWQ6IHRydWUsIHdpcmVFZmZvcnQ6IHdpcmUgfVxuICAgIDogeyBib2R5LCBjaGFuZ2VkOiBmYWxzZSwgd2lyZUVmZm9ydDogd2lyZSB9O1xufVxuXG4vKiogTm9ybWFsaXplIGxhYmVscyBmb3IgYWxpYXMgbG9va3VwIChgRXh0cmEgSGlnaGAg4oaSIGBleHRyYS1oaWdoYCkuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmVhc29uaW5nVG9rZW4odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgc3RyaW5nVXRpbHNcbiAgICAgIC50cmltVG9OdWxsKHZhbHVlKVxuICAgICAgPy50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvW19cXHNdKy9nLCBcIi1cIilcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS1dL2csIFwiXCIpXG4gICAgICAucmVwbGFjZSgvLSsvZywgXCItXCIpXG4gICAgICAucmVwbGFjZSgvXi18LSQvZywgXCJcIikgPz8gXCJcIlxuICApO1xufVxuXG4vKiogRGVkdXBsaWNhdGUgbGV2ZWxzIHdoaWxlIHByZXNlcnZpbmcgZmlyc3Qtc2VlbiBvcmRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdKTogUmVhc29uaW5nTGV2ZWxbXSB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PFJlYXNvbmluZ0xldmVsPigpO1xuICBjb25zdCBvcmRlcmVkOiBSZWFzb25pbmdMZXZlbFtdID0gW107XG4gIGZvciAoY29uc3QgbGV2ZWwgb2YgbGV2ZWxzKSB7XG4gICAgaWYgKHNlZW4uaGFzKGxldmVsKSkgY29udGludWU7XG4gICAgc2Vlbi5hZGQobGV2ZWwpO1xuICAgIG9yZGVyZWQucHVzaChsZXZlbCk7XG4gIH1cbiAgcmV0dXJuIG9yZGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdXBwb3J0ZWRUb2tlbnModGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBtYXRjaCA9IFNVUFBPUlRFRF9WQUxVRVNfUEFUVEVSTi5leGVjKHRleHQpO1xuICBpZiAoIW1hdGNoPy5bMV0pIHJldHVybiBbXTtcbiAgcmV0dXJuIHRva2Vuc0Zyb21GcmFnbWVudChtYXRjaFsxXSk7XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZUtleXNGb3IobW9kZWw6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkaXJlY3QgPSBtb2RlbENhdGFsb2d1ZUtleShtb2RlbCk7XG4gIGlmIChkaXJlY3QpIGtleXMuYWRkKGRpcmVjdCk7XG4gIGNvbnN0IHN0cmlwcGVkID0gbW9kZWxcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9eZGF0YWJyaWNrc1xcLy8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL15zeXN0ZW1cXC5haVxcLi8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL15kYXRhYnJpY2tzLS8sIFwiXCIpO1xuICBjb25zdCBzdHJpcHBlZEtleSA9IG1vZGVsQ2F0YWxvZ3VlS2V5KHN0cmlwcGVkKTtcbiAgaWYgKHN0cmlwcGVkS2V5KSBrZXlzLmFkZChzdHJpcHBlZEtleSk7XG4gIGNvbnN0IHdpdGhQcmVmaXggPSBtb2RlbENhdGFsb2d1ZUtleShgZGF0YWJyaWNrcy0ke3N0cmlwcGVkfWApO1xuICBpZiAod2l0aFByZWZpeCkga2V5cy5hZGQod2l0aFByZWZpeCk7XG4gIHJldHVybiBbLi4ua2V5c107XG59XG5cbmZ1bmN0aW9uIG1vZGVsQ2F0YWxvZ3VlS2V5KG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRyaW1tZWQgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG5hbWUpO1xuICBpZiAoIXRyaW1tZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAoXG4gICAgbW9kZWxTZWFyY2hRdWVyeSh0cmltbWVkKT8ucmVwbGFjZUFsbChcIiBcIiwgXCItXCIpID8/XG4gICAgdHJpbW1lZFxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9eZGF0YWJyaWNrcy0vLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05Ll8tXSsvZywgXCItXCIpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHRva2Vuc0Zyb21GcmFnbWVudChmcmFnbWVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGFydCBvZiBmcmFnbWVudC5tYXRjaEFsbChUT0tFTl9QQVRURVJOKSkge1xuICAgIGNvbnN0IHRva2VuID0gcGFydFsxXSA/PyBwYXJ0WzJdID8/IHBhcnRbM10gPz8gcGFydFs0XTtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuID09PSBcImFuZFwiIHx8IHRva2VuID09PSBcIm9yXCIgfHwgdG9rZW4gPT09IFwib2ZcIikgY29udGludWU7XG4gICAgdG9rZW5zLnB1c2godG9rZW4ucmVwbGFjZSgvXltcIidgXSt8W1wiJ2BdKyQvZywgXCJcIikpO1xuICB9XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKlxuICogV2FsayBhIHZhbHVlIHRyZWUsIHVud3JhcHBpbmcgbmVzdGVkIEpTT04gc3RyaW5ncywgYW5kIGNvbGxlY3QgdGV4dCBsZWF2ZXNcbiAqIHRoYXQgbWF5IGNvbnRhaW4gYSBzdXBwb3J0ZWQtdmFsdWVzIHNlbnRlbmNlLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0VGV4dExlYXZlcyh2YWx1ZTogdW5rbm93biwgZGVwdGggPSAwKTogc3RyaW5nW10ge1xuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBkZXB0aCA+IE1BWF9KU09OX1VOV1JBUF9ERVBUSCkgcmV0dXJuIFtdO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIXRyaW1tZWQpIHJldHVybiBbXTtcbiAgICBjb25zdCBwYXJzZWQgPSB0cnlVbndyYXBKc29uKHRyaW1tZWQpO1xuICAgIGlmIChwYXJzZWQgIT09IHVuZGVmaW5lZCAmJiBwYXJzZWQgIT09IHRyaW1tZWQpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0VGV4dExlYXZlcyhwYXJzZWQsIGRlcHRoICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBbdHJpbW1lZF07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gW1N0cmluZyh2YWx1ZSldO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUuZmxhdE1hcCgoZW50cnkpID0+IGNvbGxlY3RUZXh0TGVhdmVzKGVudHJ5LCBkZXB0aCArIDEpKTtcbiAgfVxuICBpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWx1ZSkuZmxhdE1hcCgoZW50cnkpID0+IGNvbGxlY3RUZXh0TGVhdmVzKGVudHJ5LCBkZXB0aCArIDEpKTtcbn1cblxuZnVuY3Rpb24gdHJ5VW53cmFwSnNvbih0ZXh0OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgYXNSZWNvcmQgPSBqc29uLnBhcnNlUmVjb3JkKHRleHQpO1xuICBpZiAoYXNSZWNvcmQpIHJldHVybiBhc1JlY29yZDtcbiAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZSh0ZXh0KTtcbiAgaWYgKHBhcnNlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcGFyc2VkO1xuICBpZiAodGV4dC5pbmNsdWRlcygnXFxcXFwiJykgfHwgdGV4dC5pbmNsdWRlcyhcIlxcXFxuXCIpKSB7XG4gICAgY29uc3QgdW5lc2NhcGVkID0gdGV4dC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykucmVwbGFjZSgvXFxcXG4vZywgXCJcXG5cIikucmVwbGFjZSgvXFxcXFxcXFwvZywgXCJcXFxcXCIpO1xuICAgIGlmICh1bmVzY2FwZWQgIT09IHRleHQpIHtcbiAgICAgIGNvbnN0IG5lc3RlZCA9IGpzb24ucGFyc2UodW5lc2NhcGVkKTtcbiAgICAgIGlmIChuZXN0ZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG5lc3RlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"root":["../src/_metadata-contract.ts","../src/_metadata-generator.ts","../src/_ranking.ts","../src/_selection.ts","../src/classes.ts","../src/classify.ts","../src/fallback.ts","../src/invoke.ts","../src/metadata-cache.ts","../src/metadata.ts","../src/model-catalog.ts","../src/model-client.ts","../src/policy.ts","../src/reasoning-translation.ts","../src/resolve.ts","../src/serving-wire.ts","../scripts/generate-metadata.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/_metadata-contract.ts","../src/_metadata-generator.ts","../src/_ranking.ts","../src/_retirement.ts","../src/_selection.ts","../src/bindings.ts","../src/classes.ts","../src/classify.ts","../src/fallback.ts","../src/invoke.ts","../src/metadata-cache.ts","../src/metadata.ts","../src/model-catalog.ts","../src/model-client.ts","../src/policy.ts","../src/reasoning-translation.ts","../src/resolve.ts","../src/serving-wire.ts","../scripts/generate-metadata.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -27,11 +27,11 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@databricks/appkit": "0.81.0",
30
- "@dbx-tools/appkit": "^0.9.40",
31
- "@dbx-tools/auth": "^0.9.40",
32
- "@dbx-tools/shared-auth": "^0.9.40",
33
- "@dbx-tools/shared-core": "^0.9.40",
34
- "@dbx-tools/shared-model": "^0.9.40",
30
+ "@dbx-tools/appkit": "^0.9.43",
31
+ "@dbx-tools/auth": "^0.9.43",
32
+ "@dbx-tools/shared-auth": "^0.9.43",
33
+ "@dbx-tools/shared-core": "^0.9.43",
34
+ "@dbx-tools/shared-model": "^0.9.43",
35
35
  "cacache": "^21.0.1",
36
36
  "env-paths": "^4.0.0",
37
37
  "fuse.js": "^7.4.2"
@@ -47,6 +47,10 @@
47
47
  "types": "./lib/index.d.ts",
48
48
  "default": "./lib/index.js"
49
49
  },
50
+ "./bindings": {
51
+ "types": "./lib/src/bindings.d.ts",
52
+ "default": "./lib/src/bindings.js"
53
+ },
50
54
  "./classes": {
51
55
  "types": "./lib/src/classes.d.ts",
52
56
  "default": "./lib/src/classes.js"
@@ -98,7 +102,7 @@
98
102
  "./package.json": "./package.json"
99
103
  }
100
104
  },
101
- "version": "0.9.40",
105
+ "version": "0.9.43",
102
106
  "types": "./lib/index.d.ts",
103
107
  "dbxToolsConfig": {
104
108
  "tags": [
@@ -111,6 +115,10 @@
111
115
  "types": "./lib/index.d.ts",
112
116
  "default": "./lib/index.js"
113
117
  },
118
+ "./bindings": {
119
+ "types": "./lib/src/bindings.d.ts",
120
+ "default": "./lib/src/bindings.js"
121
+ },
114
122
  "./classes": {
115
123
  "types": "./lib/src/classes.d.ts",
116
124
  "default": "./lib/src/classes.js"
@@ -7,7 +7,7 @@ import type {
7
7
  ReasoningModelsSnapshot,
8
8
  RetiredModelsSnapshot,
9
9
  } from "./_metadata-contract.ts";
10
- import { modelSearchQuery } from "./policy.ts";
10
+ import { inheritsNativeWebSearch, modelSearchQuery } from "./policy.ts";
11
11
  import {
12
12
  parseReasoning,
13
13
  REASONING_LEVELS,
@@ -132,10 +132,7 @@ export function parseModelRateLimits(html: string, generatedAt: number): ModelRa
132
132
  }
133
133
 
134
134
  /** Parse reasoning-effort ladders from the Query reasoning models HTML table. */
135
- export function parseReasoningModels(
136
- html: string,
137
- generatedAt: number,
138
- ): ReasoningModelsSnapshot {
135
+ export function parseReasoningModels(html: string, generatedAt: number): ReasoningModelsSnapshot {
139
136
  const $ = load(html);
140
137
  const models: Record<string, ReasoningLevel[]> = {};
141
138
  $("table").each((_, table) => {
@@ -147,7 +144,10 @@ export function parseReasoningModels(
147
144
  if (!headers.some((header) => header.includes("model"))) return;
148
145
  if (!headers.some((header) => header.includes("parameter"))) return;
149
146
  rows.slice(1).each((__, row) => {
150
- const cells = $(row).find("th, td").toArray().map((cell) => $(cell));
147
+ const cells = $(row)
148
+ .find("th, td")
149
+ .toArray()
150
+ .map((cell) => $(cell));
151
151
  if (cells.length < 2) return;
152
152
  const modelNames = reasoningModelNamesFromCell(cells[0]!, $);
153
153
  if (modelNames.length === 0) return;
@@ -268,7 +268,6 @@ function modelsAfterHeading($: CheerioAPI, headingId: string): string[] {
268
268
  }
269
269
 
270
270
  function nativeWebSearchModels($: CheerioAPI, responses: readonly string[]): string[] {
271
- const families = new Set<string>();
272
271
  const models = new Set<string>();
273
272
  let nativeSection = false;
274
273
  for (const element of sectionElements($, "supported-models")) {
@@ -285,11 +284,10 @@ function nativeWebSearchModels($: CheerioAPI, responses: readonly string[]): str
285
284
  const model = modelKey(value);
286
285
  if (!model) continue;
287
286
  models.add(model);
288
- families.add(model.split("-", 1)[0]);
289
287
  }
290
288
  }
291
289
  for (const model of responses) {
292
- if (families.has(model.split("-", 1)[0])) models.add(model);
290
+ if (inheritsNativeWebSearch(model, models)) models.add(model);
293
291
  }
294
292
  return [...models].sort();
295
293
  }
@@ -307,11 +305,13 @@ function codeValuesAfterHeading($: CheerioAPI, headingId: string): string[] {
307
305
 
308
306
  function sectionElements($: CheerioAPI, headingId: string): Selection[] {
309
307
  const heading = $(`#${headingId}`).first();
310
- if (heading.length === 0)
308
+ if (heading.length === 0) {
311
309
  throw new Error(`Databricks capability page is missing section ${headingId}`);
310
+ }
312
311
  const level = headingLevel(nodeTagName(heading.get(0)));
313
- if (level === undefined)
312
+ if (level === undefined) {
314
313
  throw new Error(`Databricks capability section ${headingId} is not a heading`);
314
+ }
315
315
  const elements: Selection[] = [];
316
316
  let sibling = heading.next();
317
317
  while (sibling.length > 0) {
package/src/_ranking.ts CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  import { toModelDisplayName } from "@dbx-tools/shared-model/display";
9
9
  import Fuse from "fuse.js";
10
10
 
11
+ import { modelStatusFor } from "./_retirement.ts";
11
12
  import { classesAtOrBelow, CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./classes.ts";
12
13
  import {
13
14
  classifyEndpoints,
@@ -15,7 +16,6 @@ import {
15
16
  supportsToolsByFamily,
16
17
  versionTuple,
17
18
  } from "./classify.ts";
18
- import { modelStatusFor } from "./metadata.ts";
19
19
  import { modelFamily, modelReasoningEfforts, modelServiceNames } from "./policy.ts";
20
20
 
21
21
  type ModelClass = ModelClassType;
@@ -0,0 +1,70 @@
1
+ /** Lightweight model retirement state shared by discovery and metadata caches. */
2
+ import type { ModelStatus, ServingEndpointSummary } from "@dbx-tools/shared-model/contracts";
3
+
4
+ import type { RetiredModelsSnapshot } from "./_metadata-contract.ts";
5
+ import retiredModelsSnapshotJson from "./generated/retired-models.json" with { type: "json" };
6
+
7
+ const snapshot = retiredModelsSnapshotJson as RetiredModelsSnapshot;
8
+ const RETIRED_MODEL_PREFIXES = new Set([
9
+ "ai",
10
+ "anthropic",
11
+ "databricks",
12
+ "dbx",
13
+ "google",
14
+ "meta",
15
+ "openai",
16
+ "system",
17
+ ]);
18
+
19
+ let names: readonly string[] = Object.freeze([...snapshot.models]);
20
+ let keys = retiredKeys(names);
21
+
22
+ export const COMMITTED_RETIRED_MODELS = snapshot.models;
23
+ export const RETIRED_MODELS_GENERATED_AT = snapshot.generatedAt;
24
+
25
+ /** Replace retirement state after metadata cache hydration or refresh. */
26
+ export function replaceRetiredModelNames(models: readonly string[]): void {
27
+ names = Object.freeze([...models]);
28
+ keys = retiredKeys(names);
29
+ }
30
+
31
+ /** Return the active retired-model names. */
32
+ export function retiredModelNames(): readonly string[] {
33
+ return names;
34
+ }
35
+
36
+ /** Resolve whether any supplied identity is listed as retired. */
37
+ export function modelStatusFor(
38
+ ...models: readonly (string | ServingEndpointSummary)[]
39
+ ): ModelStatus {
40
+ const deprecated = models
41
+ .flatMap((model) => modelIdentities(model))
42
+ .some((identity) => {
43
+ const candidate = retiredModelKey(identity);
44
+ for (const key of keys) {
45
+ if (candidate === key || candidate.startsWith(`${key}-`)) return true;
46
+ }
47
+ return false;
48
+ });
49
+ return { deprecated };
50
+ }
51
+
52
+ function retiredKeys(models: readonly string[]): ReadonlySet<string> {
53
+ return new Set(models.map(retiredModelKey).filter(Boolean));
54
+ }
55
+
56
+ function modelIdentities(model: string | ServingEndpointSummary): string[] {
57
+ if (typeof model === "string") return [model];
58
+ return [
59
+ model.name,
60
+ model.displayName,
61
+ model.modelServiceName,
62
+ ...Object.values(model.serviceNames ?? {}),
63
+ ].filter((value): value is string => Boolean(value));
64
+ }
65
+
66
+ function retiredModelKey(value: string): string {
67
+ const tokens = value.toLowerCase().match(/[a-z0-9]+/g) ?? [];
68
+ while (tokens[0] && RETIRED_MODEL_PREFIXES.has(tokens[0])) tokens.shift();
69
+ return tokens.join("-");
70
+ }