@dbx-tools/model 0.6.90 → 0.6.91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/src/resolve.js +12 -1
- package/package.json +5 -4
- package/src/resolve.ts +12 -0
package/index.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
|
+
export const PACKAGE_IDENTIFIER = "@dbx-tools/model";
|
|
5
6
|
export * as classes from "./src/classes.ts";
|
|
6
7
|
export * as fallback from "./src/fallback.ts";
|
|
7
8
|
export * as invoke from "./src/invoke.ts";
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// GENERATED by projen watch - DO NOT EDIT.
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
|
+
export const PACKAGE_IDENTIFIER = "@dbx-tools/model";
|
|
4
5
|
export * as classes from "./src/classes.js";
|
|
5
6
|
export * as fallback from "./src/fallback.js";
|
|
6
7
|
export * as invoke from "./src/invoke.js";
|
|
@@ -10,4 +11,4 @@ export { CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./src/classes.js";
|
|
|
10
11
|
export { FALLBACK_MODEL_IDS } from "./src/fallback.js";
|
|
11
12
|
export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH } from "./src/invoke.js";
|
|
12
13
|
export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/serving.js";
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR2pILE9BQU8sRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9tb2RlbFwiO1xuZXhwb3J0ICogYXMgY2xhc3NlcyBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0ICogYXMgZmFsbGJhY2sgZnJvbSBcIi4vc3JjL2ZhbGxiYWNrLnRzXCI7XG5leHBvcnQgKiBhcyBpbnZva2UgZnJvbSBcIi4vc3JjL2ludm9rZS50c1wiO1xuZXhwb3J0ICogYXMgcmVzb2x2ZSBmcm9tIFwiLi9zcmMvcmVzb2x2ZS50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZyBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0IHsgQ0hBVF9DTEFTU19PUkRFUiwgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0IHsgRkFMTEJBQ0tfTU9ERUxfSURTIH0gZnJvbSBcIi4vc3JjL2ZhbGxiYWNrLnRzXCI7XG5leHBvcnQgeyBJTlZPQ0FUSU9OU19TVUZGSVgsIFJFU1BPTlNFU19QQVRILCBPUEVOX1JFU1BPTlNFU19QQVRILCBDSEFUX0NPTVBMRVRJT05TX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzb2x2ZU1vZGVsSW5wdXQsIFJlc29sdmVkTW9kZWxTZWxlY3Rpb24sIFNlbGVjdE1vZGVsSW5wdXQsIFNlYXJjaE1vZGVsc0lucHV0IH0gZnJvbSBcIi4vc3JjL3Jlc29sdmUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucywgUmVzb2x2ZWRNb2RlbCwgUmVzb2x2ZU1vZGVsT3B0aW9ucywgU2NvcmVkRW5kcG9pbnQgfSBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuIl19
|
package/lib/src/resolve.js
CHANGED
|
@@ -66,6 +66,7 @@ export function rankModels(endpoints, query = {}) {
|
|
|
66
66
|
const search = query.search?.trim();
|
|
67
67
|
let ranked;
|
|
68
68
|
if (search) {
|
|
69
|
+
const gptFamilySearch = search.toLowerCase() === "gpt";
|
|
69
70
|
const scores = new Map();
|
|
70
71
|
for (const match of searchServingEndpoints(search, candidates.map((c) => c.endpoint), query.threshold !== undefined ? { threshold: query.threshold } : {})) {
|
|
71
72
|
scores.set(match.endpoint.name, match.score);
|
|
@@ -74,11 +75,21 @@ export function rankModels(endpoints, query = {}) {
|
|
|
74
75
|
// keep their best-first within-class order.
|
|
75
76
|
ranked = candidates
|
|
76
77
|
.filter((c) => scores.has(c.endpoint.name))
|
|
78
|
+
.filter((c) => !gptFamilySearch || !/(?:^|[-_.])gpt[-_.]?oss(?:[-_.]|$)/i.test(c.endpoint.name))
|
|
77
79
|
.map((c) => ({ ...c, score: scores.get(c.endpoint.name) }))
|
|
78
80
|
.sort((a, b) => {
|
|
79
81
|
const byMatch = matchBucket(a.score) - matchBucket(b.score);
|
|
80
82
|
if (byMatch !== 0)
|
|
81
83
|
return byMatch;
|
|
84
|
+
if (gptFamilySearch) {
|
|
85
|
+
const aVersion = classify.versionTuple(a.endpoint.name);
|
|
86
|
+
const bVersion = classify.versionTuple(b.endpoint.name);
|
|
87
|
+
for (let index = 0; index < 3; index++) {
|
|
88
|
+
const byVersion = (bVersion[index] ?? 0) - (aVersion[index] ?? 0);
|
|
89
|
+
if (byVersion !== 0)
|
|
90
|
+
return byVersion;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
82
93
|
return MODEL_CLASS_ORDER.indexOf(a.modelClass) - MODEL_CLASS_ORDER.indexOf(b.modelClass);
|
|
83
94
|
});
|
|
84
95
|
}
|
|
@@ -251,4 +262,4 @@ function pickFirstAvailable(candidates, endpoints) {
|
|
|
251
262
|
}
|
|
252
263
|
return candidates[0] ?? FALLBACK_MODEL_IDS[0];
|
|
253
264
|
}
|
|
254
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsUUFBUSxHQUtULE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixzQkFBc0IsR0FJdkIsTUFBTSxjQUFjLENBQUM7QUF1RHRCOzs7OztHQUtHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBeUI7SUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3hCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUU7SUFFdEIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sUUFBUSxHQUNaLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO0lBRXpGLHlFQUF5RTtJQUN6RSw2Q0FBNkM7SUFDN0MsTUFBTSxVQUFVLEdBQWtCLEVBQUUsQ0FBQztJQUNyQyxLQUFLLE1BQU0sVUFBVSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLEtBQUssTUFBTSxRQUFR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Q0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoRSxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsT0FBTyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixVQUE2QixFQUM3QixTQUE0QztJQUU1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFFLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV29ya3NwYWNlLWF3YXJlIG1vZGVsIHNlbGVjdGlvbi5cbiAqXG4gKiBHaXZlbiBhIGNhbGxlcidzIGludGVudCAtIGEgc2VhcmNoIHN0cmluZywgYSBjYXBhYmlsaXR5IHtAbGluayBNb2RlbENsYXNzfVxuICogY2VpbGluZywgYm90aCwgb3Igbm90aGluZyAtIHRoZSB0b29sa2l0IHJldHVybnMgbWF0Y2hpbmcgZW5kcG9pbnRzIHJhbmtlZCBieVxuICogbWF0Y2ggcXVhbGl0eSB0aGVuIGNsYXNzLCBvciBjb2xsYXBzZXMgdG8gdGhlIHNpbmdsZSBiZXN0IGlkIHRoZSB3b3Jrc3BhY2VcbiAqIGFjdHVhbGx5IGhhcywgZGVncmFkaW5nIGZyb20gXCJiZXN0IGluIHJhbmdlXCIgZG93biB0byB0aGUgc3RhdGljIGZhbGxiYWNrXG4gKiBmbG9vci4gU2VsZWN0aW9uIGlzIGNoYXQtb25seTogZW1iZWRkaW5nIGVuZHBvaW50cyBzdXJmYWNlIG9ubHkgd2hlblxuICogYG1vZGVsQ2xhc3NgIGlzIGV4cGxpY2l0bHkge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfS5cbiAqXG4gKiBUd28gc2hhcGVzIG9mIHNlbGVjdGlvbiwgZWFjaCBpbiBhIHB1cmUgZm9ybSAob3ZlciBhbiBlbmRwb2ludCBsaXN0IHRoZVxuICogY2FsbGVyIGFscmVhZHkgaG9sZHMpIGFuZCBhbiBJL08gd3JhcHBlciAodGhhdCBsaXN0cyBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICogZmlyc3QpOiByYW5raW5nLCB3aGljaCByZXR1cm5zIGEgbWF0Y2gtIHRoZW4gY2xhc3Mtb3JkZXJlZCBsaXN0LCBhbmRcbiAqIHNpbmdsZS1zZWxlY3Rpb24sIHdoaWNoIGNvbGxhcHNlcyB0byBvbmUgaWQgcGx1cyBob3cgaXQgd2FzIHJlYWNoZWQgYW5kXG4gKiBsYXllcnMgdGhlIG9wZXJhdG9yLXBpbm5lZCBmYWxsYmFjayAvIHN0YXRpYy1mbG9vciBzYWZldHkgbmV0IG9uIHRvcC4gQSBjaGF0XG4gKiBgbW9kZWxDbGFzc2AgYWN0cyBhcyBhIGNlaWxpbmc6IHRoYXQgYmFuZCBhbmQgdGhlIGxlc3MtY2FwYWJsZSBjaGF0IGJhbmRzXG4gKiBiZWxvdyBpdCBhcmUgZWxpZ2libGUgKHNlZSB7QGxpbmsgY2xhc3Nlc0F0T3JCZWxvd30pLCBzbyBhIGBjaGF0LWJhbGFuY2VkYFxuICogYXNrIGNhbiBmYWxsIHRvIGBjaGF0LWZhc3RgIGJ1dCBuZXZlciBlc2NhbGF0ZSB0byBgY2hhdC10aGlua2luZ2AuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBjbGFzc2lmeSxcbiAgbW9kZWwsXG4gIHR5cGUgTW9kZWxRdWVyeSxcbiAgdHlwZSBSYW5rZWRNb2RlbCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcblxuaW1wb3J0IHsgQ0hBVF9DTEFTU19PUkRFUiwgY2xhc3Nlc0F0T3JCZWxvdywgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9jbGFzc2VzLnRzXCI7XG5pbXBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMsIG1vZGVsc0ZvckNsYXNzIH0gZnJvbSBcIi4vZmFsbGJhY2sudHNcIjtcbmltcG9ydCB7XG4gIGxpc3RTZXJ2aW5nRW5kcG9pbnRzLFxuICBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzLFxuICB0eXBlIFJlc29sdmVkTW9kZWwsXG4gIHR5cGUgUmVzb2x2ZU1vZGVsT3B0aW9ucyxcbiAgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlLFxufSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IG1vZGVsLk1vZGVsQ2xhc3M7XG5cbi8qKiBDYWxsZXIgaW50ZW50IHBhc3NlZCB0byB7QGxpbmsgcmVzb2x2ZU1vZGVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZU1vZGVsSW5wdXQge1xuICAvKipcbiAgICogRXhwbGljaXQgbW9kZWwgaWQgLyBsb29zZSBuYW1lIChwZXItcmVxdWVzdCBvdmVycmlkZSwgYWdlbnQgLyBwbHVnaW5cbiAgICogZGVmYXVsdCwgb3IgZW52IHZhcikuIFdoZW4gc2V0IGl0IHdpbnMgb3ZlciBgbW9kZWxDbGFzc2AgYW5kIGBmYWxsYmFja3NgLlxuICAgKi9cbiAgZXhwbGljaXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGdXp6eS1tYXRjaCBhbiBgZXhwbGljaXRgIG5hbWUgYWdhaW5zdCB0aGUgbGl2ZSBjYXRhbG9ndWUgc28gbG9vc2UgbmFtZXNcbiAgICogbGlrZSBgXCJjbGF1ZGUgc29ubmV0XCJgIHJlc29sdmUuIERlZmF1bHQgYHRydWVgLiBXaGVuIGBmYWxzZWAgdGhlIGV4cGxpY2l0XG4gICAqIGlucHV0IGlzIHJldHVybmVkIHZlcmJhdGltIChEYXRhYnJpY2tzIHN1cmZhY2VzIHRoZSBjYW5vbmljYWwgNDA0IGlmIGl0XG4gICAqIGRvZXNuJ3QgZXhpc3QpLlxuICAgKi9cbiAgZnV6enk/OiBib29sZWFuO1xuICAvKiogRnVzZS5qcyB0aHJlc2hvbGQgZm9yd2FyZGVkIHRvIHRoZSBmdXp6eSBgc2VhcmNoYCBtYXRjaCAoe0BsaW5rIHNlYXJjaFNlcnZpbmdFbmRwb2ludHN9KS4gKi9cbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICAvKiogUmVxdWlyZSBhIG1vZGVsIHRoYXQgc3VwcG9ydHMgYSBjb21wbGV0ZSBmdW5jdGlvbi10b29sIHJvdW5kLXRyaXAuICovXG4gIHJlcXVpcmVzVG9vbHM/OiBib29sZWFuO1xuICAvKipcbiAgICogQ2hhdCBjYXBhYmlsaXR5IGNsYXNzIHRvIHJlc29sdmUgd2hlbiBubyBgZXhwbGljaXRgIGlkIGlzIGdpdmVuLiBUaGUgbGl2ZVxuICAgKiBjYXRhbG9ndWUgaXMgY2xhc3NpZmllZCBieSBpdHMgRm91bmRhdGlvbiBNb2RlbCBBUEkgc2NvcmVzIGFuZCB0aGUgdG9wXG4gICAqIGF2YWlsYWJsZSBtb2RlbCBpbiB0aGUgY2xhc3MgKGFuZCB0aGUgY2hhdCBiYW5kcyBiZWxvdyBpdCkgd2lucywgZmFsbGluZ1xuICAgKiBiYWNrIHRvIHRoZSBjbGFzcydzIHNtYWxsIHN0YXRpYyBsaXN0LlxuICAgKi9cbiAgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG4gIC8qKlxuICAgKiBPcGVyYXRvci1zdXBwbGllZCBmYWxsYmFjayBpZHMgdHJpZWQgKmZpcnN0KiBpbiB0aGUgbm8tZXhwbGljaXQsIG5vLWNsYXNzXG4gICAqIHBhdGggKGUuZy4gYSByZWd1bGF0ZWQgd29ya3NwYWNlIHBpbm5lZCB0byBhbiBhcHByb3ZlZCBzdWJzZXQpLCBhaGVhZCBvZlxuICAgKiB0aGUgYXV0by1jbGFzc2lmaWVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIGZhbGxiYWNrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKiogT3V0Y29tZSBvZiB7QGxpbmsgcmVzb2x2ZU1vZGVsfTogdGhlIGNob3NlbiBpZCBwbHVzIGhvdyBpdCB3YXMgcmVhY2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbiB7XG4gIG1vZGVsSWQ6IHN0cmluZztcbiAgc291cmNlOiBcImV4cGxpY2l0XCIgfCBcImZ1enp5LW1hdGNoXCIgfCBcImNsYXNzXCIgfCBcImZhbGxiYWNrXCI7XG59XG5cbi8qKiBJbnRlbnQgKyBjYXRhbG9ndWUga25vYnMgcGFzc2VkIHRvIHtAbGluayBzZWxlY3RNb2RlbH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE1vZGVsSW5wdXQgZXh0ZW5kcyBSZXNvbHZlTW9kZWxJbnB1dCB7XG4gIC8qKiBUVEwgb3ZlcnJpZGUgZm9yIHRoZSBjYWNoZWQgYC9zZXJ2aW5nLWVuZHBvaW50c2AgbGlzdGluZywgaW4gbXMuICovXG4gIHR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogVFRMIG92ZXJyaWRlIG1lcmdlZCBpbnRvIGEge0BsaW5rIE1vZGVsUXVlcnl9IGZvciB7QGxpbmsgc2VhcmNoTW9kZWxzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoTW9kZWxzSW5wdXQgZXh0ZW5kcyBNb2RlbFF1ZXJ5IHtcbiAgLyoqIFRUTCBvdmVycmlkZSBmb3IgdGhlIGNhY2hlZCBgL3NlcnZpbmctZW5kcG9pbnRzYCBsaXN0aW5nLCBpbiBtcy4gKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUm91bmQgYSBGdXNlIHNjb3JlIHRvIHRoZSBkaXNwbGF5IHByZWNpc2lvbiBzbyB2ZXJzaW9uIHNpYmxpbmdzIHRoYXQgbWF0Y2ggYVxuICogdG9rZW4gaWRlbnRpY2FsbHkgKGUuZy4gYG9wdXMtNC03YCB2cyBgb3B1cy00LThgIGZvciB0aGUgcXVlcnkgYFwib3B1c1wiYCkgdGllXG4gKiBvbiBtYXRjaCBhbmQgbGV0IHRoZSBjbGFzcyAvIHdpdGhpbi1jbGFzcyByYW5rIGRlY2lkZSAtIHdoaWNoIGlzIHdoYXRcbiAqIHN1cmZhY2VzIHRoZSBuZXdlciwgaGlnaGVyLXF1YWxpdHkgc2libGluZy5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hCdWNrZXQoc2NvcmU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKChzY29yZSA/PyAwKSAqIDEwMDApO1xufVxuXG4vKipcbiAqIFJhbmsgdGhlIGxpdmUgY2F0YWxvZ3VlIGFnYWluc3QgYSB7QGxpbmsgTW9kZWxRdWVyeX0sIGJlc3QtZmlyc3QuXG4gKlxuICogQ2FuZGlkYXRlcyBhcmUgdGhlIGNsYXNzaWZpZWQgZW5kcG9pbnRzIGluIHRoZSBlbGlnaWJsZSBjbGFzc2VzOlxuICoge0BsaW5rIGNsYXNzZXNBdE9yQmVsb3d9IHRoZSByZXF1ZXN0ZWQgYG1vZGVsQ2xhc3NgLCBvciAtIHdoZW4gbm9uZSBpcyBnaXZlblxuICogLSB0aGUgY2hhdCBiYW5kcyBvbmx5ICh7QGxpbmsgQ0hBVF9DTEFTU19PUkRFUn0pLCBzbyBhIGdlbmVyYWwgYXNrIG5ldmVyXG4gKiBzdXJmYWNlcyBhbiBlbWJlZGRpbmcgZW5kcG9pbnQuIEVhY2ggY2xhc3MgYnVja2V0IGlzIGFscmVhZHkgYmVzdC1maXJzdCBmcm9tXG4gKiB7QGxpbmsgY2xhc3NpZnkuY2xhc3NpZnlFbmRwb2ludHN9LiBSYW5raW5nIGlzICoqbWF0Y2ggdGhlbiBjbGFzcyoqOlxuICpcbiAqIDEuIFdpdGggYSBgc2VhcmNoYCwgb25seSBlbmRwb2ludHMgbWF0Y2hpbmcgaXQgc3Vydml2ZSwgb3JkZXJlZCBieSBtYXRjaFxuICogICAgZGlzdGFuY2UgKGJ1Y2tldGVkIHZpYSB7QGxpbmsgbWF0Y2hCdWNrZXR9IHNvIG5lYXItaWRlbnRpY2FsIHNjb3JlcyB0aWUpLFxuICogICAgdGhlbiBieSBjbGFzcyAobW9yZSBjYXBhYmxlIGZpcnN0KSwgdGhlbiBieSB0aGUgc3RhYmxlIHdpdGhpbi1jbGFzcyByYW5rLlxuICogMi4gV2l0aG91dCBhIGBzZWFyY2hgLCB0aGUgY2xhc3MtdGhlbi1yYW5rIGNhbmRpZGF0ZSBvcmRlciBzdGFuZHMuXG4gKlxuICogQSBgbGltaXRgIHRydW5jYXRlcyB0aGUgcmVzdWx0LiBSZXR1cm5zIGBbXWAgd2hlbiBub3RoaW5nIGlzIGVsaWdpYmxlIG9yXG4gKiBtYXRjaGVzIC0gY2FsbGVycyBsYXllciB0aGVpciBvd24gZmFsbGJhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5rTW9kZWxzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgcXVlcnk6IE1vZGVsUXVlcnkgPSB7fSxcbik6IFJhbmtlZE1vZGVsW10ge1xuICBjb25zdCBjbGFzc2lmaWVkID0gY2xhc3NpZnkuY2xhc3NpZnlFbmRwb2ludHMoZW5kcG9pbnRzKTtcbiAgY29uc3QgZWxpZ2libGUgPVxuICAgIHF1ZXJ5Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IGNsYXNzZXNBdE9yQmVsb3cocXVlcnkubW9kZWxDbGFzcykgOiBDSEFUX0NMQVNTX09SREVSO1xuXG4gIC8vIEZsYXR0ZW4gZWxpZ2libGUgY2xhc3NlcyBpbiBjYXBhYmlsaXR5IG9yZGVyLCBjYXJyeWluZyBlYWNoIGVuZHBvaW50J3NcbiAgLy8gY2xhc3M7IGJ1Y2tldCBvcmRlciBpcyBhbHJlYWR5IGJlc3QtZmlyc3QuXG4gIGNvbnN0IGNhbmRpZGF0ZXM6IFJhbmtlZE1vZGVsW10gPSBbXTtcbiAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIGVsaWdpYmxlKSB7XG4gICAgZm9yIChjb25zdCBlbmRwb2ludCBvZiBjbGFzc2lmaWVkW21vZGVsQ2xhc3NdKSB7XG4gICAgICBpZiAocXVlcnkucmVxdWlyZXNUb29scyAmJiAhY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLnRvb2xzKSBjb250aW51ZTtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IGVuZHBvaW50LCBtb2RlbENsYXNzIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlYXJjaCA9IHF1ZXJ5LnNlYXJjaD8udHJpbSgpO1xuICBsZXQgcmFua2VkOiBSYW5rZWRNb2RlbFtdO1xuICBpZiAoc2VhcmNoKSB7XG4gICAgY29uc3Qgc2NvcmVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoXG4gICAgICBzZWFyY2gsXG4gICAgICBjYW5kaWRhdGVzLm1hcCgoYykgPT4gYy5lbmRwb2ludCksXG4gICAgICBxdWVyeS50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBxdWVyeS50aHJlc2hvbGQgfSA6IHt9LFxuICAgICkpIHtcbiAgICAgIHNjb3Jlcy5zZXQobWF0Y2guZW5kcG9pbnQubmFtZSwgbWF0Y2guc2NvcmUpO1xuICAgIH1cbiAgICAvLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGlzIHN0YWJsZSwgc28gZW5kcG9pbnRzIGVxdWFsIG9uIG1hdGNoIGFuZCBjbGFzc1xuICAgIC8vIGtlZXAgdGhlaXIgYmVzdC1maXJzdCB3aXRoaW4tY2xhc3Mgb3JkZXIuXG4gICAgcmFua2VkID0gY2FuZGlkYXRlc1xuICAgICAgLmZpbHRlcigoYykgPT4gc2NvcmVzLmhhcyhjLmVuZHBvaW50Lm5hbWUpKVxuICAgICAgLm1hcCgoYykgPT4gKHsgLi4uYywgc2NvcmU6IHNjb3Jlcy5nZXQoYy5lbmRwb2ludC5uYW1lKSB9KSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ5TWF0Y2ggPSBtYXRjaEJ1Y2tldChhLnNjb3JlKSAtIG1hdGNoQnVja2V0KGIuc2NvcmUpO1xuICAgICAgICBpZiAoYnlNYXRjaCAhPT0gMCkgcmV0dXJuIGJ5TWF0Y2g7XG4gICAgICAgIHJldHVybiBNT0RFTF9DTEFTU19PUkRFUi5pbmRleE9mKGEubW9kZWxDbGFzcykgLSBNT0RFTF9DTEFTU19PUkRFUi5pbmRleE9mKGIubW9kZWxDbGFzcyk7XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByYW5rZWQgPSBjYW5kaWRhdGVzO1xuICB9XG5cbiAgcmV0dXJuIHF1ZXJ5LmxpbWl0ICE9PSB1bmRlZmluZWQgPyByYW5rZWQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgcXVlcnkubGltaXQpKSA6IHJhbmtlZDtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZSB7QGxpbmsgcmFua01vZGVsc30gdG8gYSBzaW5nbGUgaWQ6IHRoZSBjbG9zZXN0IGVuZHBvaW50IHRvIGBzZWFyY2hgXG4gKiBpbiBhIGNhdGFsb2d1ZSBzbmFwc2hvdCwgb3IgdGhlIGlucHV0IHZlcmJhdGltIHdoZW4gbm90aGluZyBzY29yZXMgd2l0aGluIHRoZVxuICogdGhyZXNob2xkLlxuICpcbiAqIFRoZSByYW5rLWJhc2VkIGNvdW50ZXJwYXJ0IHRvIHRoZSBGdXNlLW9ubHkge0BsaW5rIHJlc29sdmVNb2RlbElkfTogZXF1YWxcbiAqIG1hdGNoIHNjb3JlcyBhcmUgYnJva2VuIGJ5IGNsYXNzIGFuZCB0aGVuIHdpdGhpbi1jbGFzcyB2ZXJzaW9uLCBzbyBhIGxvb3NlXG4gKiBgXCJvcHVzXCJgIHByZWZlcnMgYG9wdXMtNWAgb3ZlciBgb3B1cy00LTdgIGluc3RlYWQgb2YgcGlja2luZyB3aGljaGV2ZXJcbiAqIHNpYmxpbmcgRnVzZSBoYXBwZW5lZCB0byBvcmRlciBmaXJzdC4gUmV0dXJuaW5nIHRoZSBpbnB1dCB1bm1hdGNoZWQgKHJhdGhlclxuICogdGhhbiBhIG5lYXIgbmVpZ2hib3VyKSBpcyBkZWxpYmVyYXRlIC0gYSBkZWxpYmVyYXRlIGVuZHBvaW50IGlkIGlzIG5ldmVyXG4gKiBzaWxlbnRseSByZXdyaXR0ZW4sIGFuZCBEYXRhYnJpY2tzIHN1cmZhY2VzIGEgY2xlYW4gNDA0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFua01vZGVsSWQoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBzZWFyY2g6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbCB7XG4gIGNvbnN0IFt0b3BdID0gcmFua01vZGVscyhlbmRwb2ludHMsIHtcbiAgICBzZWFyY2gsXG4gICAgbGltaXQ6IDEsXG4gICAgLi4uKG9wdGlvbnMudGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHRocmVzaG9sZDogb3B0aW9ucy50aHJlc2hvbGQgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy5yZXF1aXJlc1Rvb2xzICE9PSB1bmRlZmluZWQgPyB7IHJlcXVpcmVzVG9vbHM6IG9wdGlvbnMucmVxdWlyZXNUb29scyB9IDoge30pLFxuICB9KTtcbiAgaWYgKCF0b3ApIHJldHVybiB7IG1vZGVsSWQ6IHNlYXJjaCwgbWF0Y2hlZDogZmFsc2UgfTtcbiAgcmV0dXJuIHsgbW9kZWxJZDogdG9wLmVuZHBvaW50Lm5hbWUsIG1hdGNoZWQ6IHRydWUsIHNjb3JlOiB0b3Auc2NvcmUgfTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgcmFua01vZGVsSWR9IGFnYWluc3QgYSBjYXRhbG9ndWUgdGhlIGNhbGxlciBtYXkgYmUgaG9sZGluZyBzdGFsZTpcbiAqIG1hdGNoIHRoZSBsb2FkZWQgc25hcHNob3QsIGFuZCBvbiBhIG1pc3MgcmVsb2FkIG9uY2Ugd2l0aCBgZm9yY2VgIGFuZCBtYXRjaFxuICogYWdhaW4uIFRoYXQgd2F5IGEgbW9kZWwgZGVwbG95ZWQgYWZ0ZXIgdGhlIGNhdGFsb2d1ZSB3YXMgY2FjaGVkIHN0aWxsXG4gKiByZXNvbHZlcyBvbiBmaXJzdCB1c2UsIHdpdGhvdXQgYSByZXN0YXJ0IGFuZCB3aXRob3V0IGdpdmluZyB1cCBjYWNoaW5nLlxuICpcbiAqIFRoZSBjYXRhbG9ndWUgYXJyaXZlcyBhcyBhIGxvYWRlciByYXRoZXIgdGhhbiBhIGNsaWVudCBzbyB0aGUgY2FsbGVyIGtlZXBzXG4gKiBvd25lcnNoaXAgb2YgKmhvdyogaXQgaXMgY2FjaGVkIC0ge0BsaW5rIGxpc3RTZXJ2aW5nRW5kcG9pbnRzfSBhbmQgaXRzXG4gKiBgQ2FjaGVNYW5hZ2VyYCwgYSBwbGFpbiBwcm9jZXNzLWxpZmV0aW1lIGZpZWxkIGluIGEgQ0xJLCBvciBhIHRlc3QgZG91YmxlLlxuICogT25seSBvbmUgcmVsb2FkIGlzIGF0dGVtcHRlZDogYSBnZW51aW5lbHkgdW5rbm93biBuYW1lIHNob3VsZCBmYWlsIGZhc3RcbiAqIHJhdGhlciB0aGFuIHJlLWxpc3Qgb24gZXZlcnkgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gbG9hZCAtIFJldHVybnMgdGhlIGNhdGFsb2d1ZTsgYGZvcmNlYCBhc2tzIGl0IHRvIGJ5cGFzcyBpdHMgY2FjaGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYW5rTW9kZWxJZExpdmUoXG4gIGxvYWQ6IChmb3JjZTogYm9vbGVhbikgPT4gUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+LFxuICBzZWFyY2g6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxSZXNvbHZlZE1vZGVsPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmFua01vZGVsSWQoYXdhaXQgbG9hZChmYWxzZSksIHNlYXJjaCwgb3B0aW9ucyk7XG4gIGlmIChyZXNvbHZlZC5tYXRjaGVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gIHJldHVybiByYW5rTW9kZWxJZChhd2FpdCBsb2FkKHRydWUpLCBzZWFyY2gsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJhbmsgYSB3b3Jrc3BhY2UncyBjYXRhbG9ndWUgaW4gb25lIGNhbGw6IGxpc3QgaXRzIGAvc2VydmluZy1lbmRwb2ludHNgXG4gKiAoY2FjaGVkKSBhbmQgcnVuIHtAbGluayByYW5rTW9kZWxzfSBvdmVyIHRoZSByZXN1bHQuIFRoZSBsaXN0IGNvdW50ZXJwYXJ0IHRvXG4gKiB7QGxpbmsgc2VsZWN0TW9kZWx9LCBmb3IgYSBjb25zdW1lciB0aGF0IHdhbnRzIHRoZSBmdWxsIHJhbmtlZCBzZXQgKGEgbW9kZWxcbiAqIHBpY2tlciwgYSBDTEkpIHJhdGhlciB0aGFuIGEgc2luZ2xlIGlkLiBDYXRhbG9ndWUgZmV0Y2hlcyBmYWlsIGxvdWQ6IG5ldHdvcmtcbiAqIC8gYXV0aCBlcnJvcnMgcHJvcGFnYXRlIHNvIHRoZSBjYWxsZXIgc2VlcyB0aGUgcmVhbCBTREsgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gaG9zdCAtIFdvcmtzcGFjZSBob3N0IHVzZWQgYXMgdGhlIGNhY2hlIGtleS4gUGFzcyB0aGUgdmFsdWUgcmVzb2x2ZWRcbiAqICAgZnJvbSBgY2xpZW50LmNvbmZpZy5nZXRIb3N0KClgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhcmNoTW9kZWxzKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIGhvc3Q6IHN0cmluZyxcbiAgaW5wdXQ6IFNlYXJjaE1vZGVsc0lucHV0ID0ge30sXG4pOiBQcm9taXNlPFJhbmtlZE1vZGVsW10+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdFNlcnZpbmdFbmRwb2ludHMoXG4gICAgY2xpZW50LFxuICAgIGhvc3QsXG4gICAgaW5wdXQudHRsTXMgIT09IHVuZGVmaW5lZCA/IHsgdHRsTXM6IGlucHV0LnR0bE1zIH0gOiB7fSxcbiAgKTtcbiAgcmV0dXJuIHJhbmtNb2RlbHMoZW5kcG9pbnRzLCBpbnB1dCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIG1vZGVsIGlkIGZvciBhIHdvcmtzcGFjZSBpbiBvbmUgY2FsbDogbGlzdCBpdHMgYC9zZXJ2aW5nLWVuZHBvaW50c2BcbiAqIChjYWNoZWQpIGFuZCBydW4ge0BsaW5rIHJlc29sdmVNb2RlbH0gb3ZlciB0aGUgcmVzdWx0LiBUaGlzIGlzIHRoZSBlbnRyeVxuICogcG9pbnQgZm9yIGFueSBjb25zdW1lciB0aGF0IGhvbGRzIGEgYFdvcmtzcGFjZUNsaWVudGAgYW5kIGp1c3Qgd2FudHMgYSB1c2FibGVcbiAqIG1vZGVsIG5hbWUgLSBhIExha2VmbG93IGpvYiwgYSBvbmUtb2ZmIHNjcmlwdCwgb3IgdGhlIE1hc3RyYSBwbHVnaW4gYWxpa2UuXG4gKlxuICogQ2hlYXAgZXhpdDogd2hlbiBhbiBgZXhwbGljaXRgIG5hbWUgaXMgZ2l2ZW4sIGBmdXp6eWAgaXMgb2ZmLCBhbmQgdG9vbFxuICogY2FwYWJpbGl0eSBpcyBub3QgcmVxdWlyZWQsIHRoZSBjYXRhbG9ndWUgaXMgbmV2ZXIgZmV0Y2hlZC4gQ2F0YWxvZ3VlXG4gKiBmZXRjaGVzIG90aGVyd2lzZSBmYWlsIGxvdWQ6IG5ldHdvcmsgLyBhdXRoIGVycm9ycyBwcm9wYWdhdGUgc28gdGhlIGNhbGxlclxuICogc2VlcyB0aGUgcmVhbCBTREsgbWVzc2FnZSBpbnN0ZWFkIG9mIGEgc2lsZW50IGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSBob3N0IC0gV29ya3NwYWNlIGhvc3QgdXNlZCBhcyB0aGUgY2FjaGUga2V5LiBQYXNzIHRoZSB2YWx1ZSByZXNvbHZlZFxuICogICBmcm9tIGBjbGllbnQuY29uZmlnLmdldEhvc3QoKWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWxlY3RNb2RlbChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBob3N0OiBzdHJpbmcsXG4gIGlucHV0OiBTZWxlY3RNb2RlbElucHV0ID0ge30sXG4pOiBQcm9taXNlPFJlc29sdmVkTW9kZWxTZWxlY3Rpb24+IHtcbiAgaWYgKGlucHV0LmV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiYgaW5wdXQuZnV6enkgPT09IGZhbHNlICYmICFpbnB1dC5yZXF1aXJlc1Rvb2xzKSB7XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogaW5wdXQuZXhwbGljaXQsIHNvdXJjZTogXCJleHBsaWNpdFwiIH07XG4gIH1cbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdFNlcnZpbmdFbmRwb2ludHMoY2xpZW50LCBob3N0LCB7XG4gICAgLi4uKGlucHV0LnR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bE1zOiBpbnB1dC50dGxNcyB9IDoge30pLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVNb2RlbChlbmRwb2ludHMsIGlucHV0KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgc2luZ2xlIG1vZGVsIGlkIGZyb20gdGhlIGxpdmUgY2F0YWxvZ3VlIGFuZCBjYWxsZXIgaW50ZW50LFxuICogZGVsZWdhdGluZyB0aGUgbGl2ZSBzZWxlY3Rpb24gdG8ge0BsaW5rIHJhbmtNb2RlbHN9IHdpdGggYGxpbWl0OiAxYC5cbiAqXG4gKiAxLiAqKkV4cGxpY2l0IGFzayoqOiB3aXRoIGBmdXp6eWAgb2ZmLCByZXR1cm5lZCB2ZXJiYXRpbTsgb3RoZXJ3aXNlXG4gKiAgICBmdXp6eS1yYW5rZWQgd2l0aGluIHRoZSAob3B0aW9uYWwpIGNsYXNzIGNlaWxpbmcgYW5kIHRoZSBiZXN0IHRha2VuLFxuICogICAgZmFsbGluZyBiYWNrIHRvIHRoZSBpbnB1dCB2ZXJiYXRpbSB3aGVuIG5vdGhpbmcgbWF0Y2hlcy5cbiAqIDIuICoqTm8gZXhwbGljaXQgYXNrKio6IGFuIG9wZXJhdG9yLXBpbm5lZCBgZmFsbGJhY2tgIHRoYXQgZXhpc3RzIGluIHRoZSBsaXZlXG4gKiAgICBjYXRhbG9ndWUgd2lucyBmaXJzdDsgdGhlbiB0aGUgcmFua2VkIGxpdmUgY2F0YWxvZ3VlIChjbGFzcyBjZWlsaW5nXG4gKiAgICBhcHBsaWVkKTsgdGhlbiB0aGUgc3RhdGljIHtAbGluayBGQUxMQkFDS19NT0RFTF9JRFN9IGZsb29yIHdoZW4gdGhlXG4gKiAgICBjYXRhbG9ndWUgeWllbGRzIG5vdGhpbmcgaW4gcmFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kZWwoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBpbnB1dDogUmVzb2x2ZU1vZGVsSW5wdXQgPSB7fSxcbik6IFJlc29sdmVkTW9kZWxTZWxlY3Rpb24ge1xuICBpZiAoaW5wdXQuZXhwbGljaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChpbnB1dC5mdXp6eSA9PT0gZmFsc2UpIHtcbiAgICAgIGlmIChpbnB1dC5yZXF1aXJlc1Rvb2xzKSBhc3NlcnRUb29sU3VwcG9ydChlbmRwb2ludHMsIGlucHV0LmV4cGxpY2l0KTtcbiAgICAgIHJldHVybiB7IG1vZGVsSWQ6IGlucHV0LmV4cGxpY2l0LCBzb3VyY2U6IFwiZXhwbGljaXRcIiB9O1xuICAgIH1cbiAgICBjb25zdCBbdG9wXSA9IHJhbmtNb2RlbHMoZW5kcG9pbnRzLCBidWlsZFF1ZXJ5KGlucHV0LCBpbnB1dC5leHBsaWNpdCkpO1xuICAgIGlmIChpbnB1dC5yZXF1aXJlc1Rvb2xzICYmICF0b3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdG9vbC1jYXBhYmxlIG1vZGVsIG1hdGNoZXMgXCIke2lucHV0LmV4cGxpY2l0fVwiYCk7XG4gICAgfVxuICAgIHJldHVybiB7IG1vZGVsSWQ6IHRvcD8uZW5kcG9pbnQubmFtZSA/PyBpbnB1dC5leHBsaWNpdCwgc291cmNlOiBcImZ1enp5LW1hdGNoXCIgfTtcbiAgfVxuXG4gIC8vIE9wZXJhdG9yLXBpbm5lZCBmYWxsYmFja3Mgd2luIHdoZW4gcHJlc2VudCBhbmQgbGl2ZSAoZS5nLiBhIHJlZ3VsYXRlZFxuICAvLyB3b3Jrc3BhY2UgcmVzdHJpY3RlZCB0byBhbiBhcHByb3ZlZCBzdWJzZXQpLlxuICBpZiAoaW5wdXQubW9kZWxDbGFzcyA9PT0gdW5kZWZpbmVkICYmIGlucHV0LmZhbGxiYWNrcyAmJiBpbnB1dC5mYWxsYmFja3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KFxuICAgICAgZW5kcG9pbnRzXG4gICAgICAgIC5maWx0ZXIoKGVuZHBvaW50KSA9PiAhaW5wdXQucmVxdWlyZXNUb29scyB8fCBjbGFzc2lmeS5lbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpXG4gICAgICAgIC5tYXAoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lKSxcbiAgICApO1xuICAgIGNvbnN0IHBpbm5lZCA9IGlucHV0LmZhbGxiYWNrcy5maW5kKChpZCkgPT4gcHJlc2VudC5oYXMoaWQpKTtcbiAgICBpZiAocGlubmVkKSByZXR1cm4geyBtb2RlbElkOiBwaW5uZWQsIHNvdXJjZTogXCJmYWxsYmFja1wiIH07XG4gIH1cblxuICBjb25zdCBzb3VyY2UgPSBpbnB1dC5tb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyBcImNsYXNzXCIgOiBcImZhbGxiYWNrXCI7XG4gIGNvbnN0IFt0b3BdID0gcmFua01vZGVscyhlbmRwb2ludHMsIGJ1aWxkUXVlcnkoaW5wdXQsIHVuZGVmaW5lZCkpO1xuICBpZiAodG9wKSByZXR1cm4geyBtb2RlbElkOiB0b3AuZW5kcG9pbnQubmFtZSwgc291cmNlIH07XG5cbiAgLy8gTGl2ZSBjYXRhbG9ndWUgeWllbGRlZCBub3RoaW5nIGluIHJhbmdlOiB3YWxrIHRoZSBzdGF0aWMgZmxvb3IuXG4gIGNvbnN0IGZsb29yU291cmNlID1cbiAgICBpbnB1dC5tb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyBtb2RlbHNGb3JDbGFzcyhpbnB1dC5tb2RlbENsYXNzKSA6IChpbnB1dC5mYWxsYmFja3MgPz8gW10pO1xuICBjb25zdCBmbG9vciA9IG9iamVjdC5zZXF1ZW5jZShmbG9vclNvdXJjZSkuY29uY2F0KEZBTExCQUNLX01PREVMX0lEUykuZGlzdGluY3QoKS50b0FycmF5KCk7XG4gIGlmIChpbnB1dC5yZXF1aXJlc1Rvb2xzKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gbmV3IFNldChcbiAgICAgIGVuZHBvaW50c1xuICAgICAgICAuZmlsdGVyKChlbmRwb2ludCkgPT4gY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLnRvb2xzKVxuICAgICAgICAubWFwKChlbmRwb2ludCkgPT4gZW5kcG9pbnQubmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGZsb29yLmZpbmQoKGlkKSA9PiBhdmFpbGFibGUuaGFzKGlkKSk7XG4gICAgaWYgKCFzZWxlY3RlZCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gdG9vbC1jYXBhYmxlIG1vZGVsIGlzIGF2YWlsYWJsZVwiKTtcbiAgICByZXR1cm4geyBtb2RlbElkOiBzZWxlY3RlZCwgc291cmNlIH07XG4gIH1cbiAgcmV0dXJuIHsgbW9kZWxJZDogcGlja0ZpcnN0QXZhaWxhYmxlKGZsb29yLCBlbmRwb2ludHMpLCBzb3VyY2UgfTtcbn1cblxuLyoqIEJ1aWxkIGEge0BsaW5rIE1vZGVsUXVlcnl9IGZyb20ge0BsaW5rIFJlc29sdmVNb2RlbElucHV0fSBmb3IgdGhlIGBsaW1pdDogMWAgZGVsZWdhdGlvbi4gKi9cbmZ1bmN0aW9uIGJ1aWxkUXVlcnkoaW5wdXQ6IFJlc29sdmVNb2RlbElucHV0LCBzZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZCk6IE1vZGVsUXVlcnkge1xuICByZXR1cm4ge1xuICAgIC4uLihzZWFyY2ggIT09IHVuZGVmaW5lZCA/IHsgc2VhcmNoIH0gOiB7fSksXG4gICAgLi4uKGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IHsgbW9kZWxDbGFzczogaW5wdXQubW9kZWxDbGFzcyB9IDoge30pLFxuICAgIC4uLihpbnB1dC5yZXF1aXJlc1Rvb2xzICE9PSB1bmRlZmluZWQgPyB7IHJlcXVpcmVzVG9vbHM6IGlucHV0LnJlcXVpcmVzVG9vbHMgfSA6IHt9KSxcbiAgICAuLi4oaW5wdXQudGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHRocmVzaG9sZDogaW5wdXQudGhyZXNob2xkIH0gOiB7fSksXG4gICAgbGltaXQ6IDEsXG4gIH07XG59XG5cbi8qKiBUaHJvdyB3aGVuIGFuIGV4cGxpY2l0IGlkIGlzIGFic2VudCBvciBub3QgdmVyaWZpZWQgZm9yIGZ1bmN0aW9uIHRvb2xzLiAqL1xuZnVuY3Rpb24gYXNzZXJ0VG9vbFN1cHBvcnQoZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sIG1vZGVsSWQ6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBlbmRwb2ludCA9IGVuZHBvaW50cy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09PSBtb2RlbElkKTtcbiAgaWYgKCFlbmRwb2ludCB8fCAhY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLnRvb2xzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBcIiR7bW9kZWxJZH1cIiBkb2VzIG5vdCBzdXBwb3J0IGZ1bmN0aW9uIHRvb2xzYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBmaXJzdCBpZCBpbiBgY2FuZGlkYXRlc2Agd2hvc2UgZW5kcG9pbnQgaXMgcHJlc2VudCBpbiBgZW5kcG9pbnRzYC5cbiAqIFJldHVybnMgdGhlIHRvcCBjYW5kaWRhdGUgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBub25lIG9mIHRoZW0gc28gY2FsbGVyc1xuICogYWx3YXlzIGdldCBhIHN0cmluZzsgYW4gb2ZmbGluZSB3b3Jrc3BhY2UgdGhlbiByZWNlaXZlcyBhIGNsZWFuIDQwNCBmcm9tXG4gKiBEYXRhYnJpY2tzIGluc3RlYWQgb2YgYSBtYWxmb3JtZWQgY29uZmlnLlxuICovXG5mdW5jdGlvbiBwaWNrRmlyc3RBdmFpbGFibGUoXG4gIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KGVuZHBvaW50cy5tYXAoKGUpID0+IGUubmFtZSkpO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHByZXNlbnQuaGFzKGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gRkFMTEJBQ0tfTU9ERUxfSURTWzBdITtcbn1cbiJdfQ==
|
|
265
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsUUFBUSxHQUtULE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixzQkFBc0IsR0FJdkIsTUFBTSxjQUFjLENBQUM7QUF1RHRCOzs7OztHQUtHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBeUI7SUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3hCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUU7SUFFdEIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sUUFBUSxHQUNaLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO0lBRXpGLHlFQUF5RTtJQUN6RSw2Q0FBNkM7SUFDN0MsTUFBTSxVQUFVLEdBQWtCLEVBQUUsQ0FBQztJQUNyQyxLQUFLLE1BQU0sVUFBVSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLEtBQUssTUFBTSxRQUFR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QVUsRUFBRSxDQUFDO1FBQ25DLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFFLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV29ya3NwYWNlLWF3YXJlIG1vZGVsIHNlbGVjdGlvbi5cbiAqXG4gKiBHaXZlbiBhIGNhbGxlcidzIGludGVudCAtIGEgc2VhcmNoIHN0cmluZywgYSBjYXBhYmlsaXR5IHtAbGluayBNb2RlbENsYXNzfVxuICogY2VpbGluZywgYm90aCwgb3Igbm90aGluZyAtIHRoZSB0b29sa2l0IHJldHVybnMgbWF0Y2hpbmcgZW5kcG9pbnRzIHJhbmtlZCBieVxuICogbWF0Y2ggcXVhbGl0eSB0aGVuIGNsYXNzLCBvciBjb2xsYXBzZXMgdG8gdGhlIHNpbmdsZSBiZXN0IGlkIHRoZSB3b3Jrc3BhY2VcbiAqIGFjdHVhbGx5IGhhcywgZGVncmFkaW5nIGZyb20gXCJiZXN0IGluIHJhbmdlXCIgZG93biB0byB0aGUgc3RhdGljIGZhbGxiYWNrXG4gKiBmbG9vci4gU2VsZWN0aW9uIGlzIGNoYXQtb25seTogZW1iZWRkaW5nIGVuZHBvaW50cyBzdXJmYWNlIG9ubHkgd2hlblxuICogYG1vZGVsQ2xhc3NgIGlzIGV4cGxpY2l0bHkge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfS5cbiAqXG4gKiBUd28gc2hhcGVzIG9mIHNlbGVjdGlvbiwgZWFjaCBpbiBhIHB1cmUgZm9ybSAob3ZlciBhbiBlbmRwb2ludCBsaXN0IHRoZVxuICogY2FsbGVyIGFscmVhZHkgaG9sZHMpIGFuZCBhbiBJL08gd3JhcHBlciAodGhhdCBsaXN0cyBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICogZmlyc3QpOiByYW5raW5nLCB3aGljaCByZXR1cm5zIGEgbWF0Y2gtIHRoZW4gY2xhc3Mtb3JkZXJlZCBsaXN0LCBhbmRcbiAqIHNpbmdsZS1zZWxlY3Rpb24sIHdoaWNoIGNvbGxhcHNlcyB0byBvbmUgaWQgcGx1cyBob3cgaXQgd2FzIHJlYWNoZWQgYW5kXG4gKiBsYXllcnMgdGhlIG9wZXJhdG9yLXBpbm5lZCBmYWxsYmFjayAvIHN0YXRpYy1mbG9vciBzYWZldHkgbmV0IG9uIHRvcC4gQSBjaGF0XG4gKiBgbW9kZWxDbGFzc2AgYWN0cyBhcyBhIGNlaWxpbmc6IHRoYXQgYmFuZCBhbmQgdGhlIGxlc3MtY2FwYWJsZSBjaGF0IGJhbmRzXG4gKiBiZWxvdyBpdCBhcmUgZWxpZ2libGUgKHNlZSB7QGxpbmsgY2xhc3Nlc0F0T3JCZWxvd30pLCBzbyBhIGBjaGF0LWJhbGFuY2VkYFxuICogYXNrIGNhbiBmYWxsIHRvIGBjaGF0LWZhc3RgIGJ1dCBuZXZlciBlc2NhbGF0ZSB0byBgY2hhdC10aGlua2luZ2AuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBjbGFzc2lmeSxcbiAgbW9kZWwsXG4gIHR5cGUgTW9kZWxRdWVyeSxcbiAgdHlwZSBSYW5rZWRNb2RlbCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcblxuaW1wb3J0IHsgQ0hBVF9DTEFTU19PUkRFUiwgY2xhc3Nlc0F0T3JCZWxvdywgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9jbGFzc2VzLnRzXCI7XG5pbXBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMsIG1vZGVsc0ZvckNsYXNzIH0gZnJvbSBcIi4vZmFsbGJhY2sudHNcIjtcbmltcG9ydCB7XG4gIGxpc3RTZXJ2aW5nRW5kcG9pbnRzLFxuICBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzLFxuICB0eXBlIFJlc29sdmVkTW9kZWwsXG4gIHR5cGUgUmVzb2x2ZU1vZGVsT3B0aW9ucyxcbiAgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlLFxufSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IG1vZGVsLk1vZGVsQ2xhc3M7XG5cbi8qKiBDYWxsZXIgaW50ZW50IHBhc3NlZCB0byB7QGxpbmsgcmVzb2x2ZU1vZGVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZU1vZGVsSW5wdXQge1xuICAvKipcbiAgICogRXhwbGljaXQgbW9kZWwgaWQgLyBsb29zZSBuYW1lIChwZXItcmVxdWVzdCBvdmVycmlkZSwgYWdlbnQgLyBwbHVnaW5cbiAgICogZGVmYXVsdCwgb3IgZW52IHZhcikuIFdoZW4gc2V0IGl0IHdpbnMgb3ZlciBgbW9kZWxDbGFzc2AgYW5kIGBmYWxsYmFja3NgLlxuICAgKi9cbiAgZXhwbGljaXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGdXp6eS1tYXRjaCBhbiBgZXhwbGljaXRgIG5hbWUgYWdhaW5zdCB0aGUgbGl2ZSBjYXRhbG9ndWUgc28gbG9vc2UgbmFtZXNcbiAgICogbGlrZSBgXCJjbGF1ZGUgc29ubmV0XCJgIHJlc29sdmUuIERlZmF1bHQgYHRydWVgLiBXaGVuIGBmYWxzZWAgdGhlIGV4cGxpY2l0XG4gICAqIGlucHV0IGlzIHJldHVybmVkIHZlcmJhdGltIChEYXRhYnJpY2tzIHN1cmZhY2VzIHRoZSBjYW5vbmljYWwgNDA0IGlmIGl0XG4gICAqIGRvZXNuJ3QgZXhpc3QpLlxuICAgKi9cbiAgZnV6enk/OiBib29sZWFuO1xuICAvKiogRnVzZS5qcyB0aHJlc2hvbGQgZm9yd2FyZGVkIHRvIHRoZSBmdXp6eSBgc2VhcmNoYCBtYXRjaCAoe0BsaW5rIHNlYXJjaFNlcnZpbmdFbmRwb2ludHN9KS4gKi9cbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICAvKiogUmVxdWlyZSBhIG1vZGVsIHRoYXQgc3VwcG9ydHMgYSBjb21wbGV0ZSBmdW5jdGlvbi10b29sIHJvdW5kLXRyaXAuICovXG4gIHJlcXVpcmVzVG9vbHM/OiBib29sZWFuO1xuICAvKipcbiAgICogQ2hhdCBjYXBhYmlsaXR5IGNsYXNzIHRvIHJlc29sdmUgd2hlbiBubyBgZXhwbGljaXRgIGlkIGlzIGdpdmVuLiBUaGUgbGl2ZVxuICAgKiBjYXRhbG9ndWUgaXMgY2xhc3NpZmllZCBieSBpdHMgRm91bmRhdGlvbiBNb2RlbCBBUEkgc2NvcmVzIGFuZCB0aGUgdG9wXG4gICAqIGF2YWlsYWJsZSBtb2RlbCBpbiB0aGUgY2xhc3MgKGFuZCB0aGUgY2hhdCBiYW5kcyBiZWxvdyBpdCkgd2lucywgZmFsbGluZ1xuICAgKiBiYWNrIHRvIHRoZSBjbGFzcydzIHNtYWxsIHN0YXRpYyBsaXN0LlxuICAgKi9cbiAgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG4gIC8qKlxuICAgKiBPcGVyYXRvci1zdXBwbGllZCBmYWxsYmFjayBpZHMgdHJpZWQgKmZpcnN0KiBpbiB0aGUgbm8tZXhwbGljaXQsIG5vLWNsYXNzXG4gICAqIHBhdGggKGUuZy4gYSByZWd1bGF0ZWQgd29ya3NwYWNlIHBpbm5lZCB0byBhbiBhcHByb3ZlZCBzdWJzZXQpLCBhaGVhZCBvZlxuICAgKiB0aGUgYXV0by1jbGFzc2lmaWVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIGZhbGxiYWNrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKiogT3V0Y29tZSBvZiB7QGxpbmsgcmVzb2x2ZU1vZGVsfTogdGhlIGNob3NlbiBpZCBwbHVzIGhvdyBpdCB3YXMgcmVhY2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbiB7XG4gIG1vZGVsSWQ6IHN0cmluZztcbiAgc291cmNlOiBcImV4cGxpY2l0XCIgfCBcImZ1enp5LW1hdGNoXCIgfCBcImNsYXNzXCIgfCBcImZhbGxiYWNrXCI7XG59XG5cbi8qKiBJbnRlbnQgKyBjYXRhbG9ndWUga25vYnMgcGFzc2VkIHRvIHtAbGluayBzZWxlY3RNb2RlbH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE1vZGVsSW5wdXQgZXh0ZW5kcyBSZXNvbHZlTW9kZWxJbnB1dCB7XG4gIC8qKiBUVEwgb3ZlcnJpZGUgZm9yIHRoZSBjYWNoZWQgYC9zZXJ2aW5nLWVuZHBvaW50c2AgbGlzdGluZywgaW4gbXMuICovXG4gIHR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogVFRMIG92ZXJyaWRlIG1lcmdlZCBpbnRvIGEge0BsaW5rIE1vZGVsUXVlcnl9IGZvciB7QGxpbmsgc2VhcmNoTW9kZWxzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoTW9kZWxzSW5wdXQgZXh0ZW5kcyBNb2RlbFF1ZXJ5IHtcbiAgLyoqIFRUTCBvdmVycmlkZSBmb3IgdGhlIGNhY2hlZCBgL3NlcnZpbmctZW5kcG9pbnRzYCBsaXN0aW5nLCBpbiBtcy4gKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUm91bmQgYSBGdXNlIHNjb3JlIHRvIHRoZSBkaXNwbGF5IHByZWNpc2lvbiBzbyB2ZXJzaW9uIHNpYmxpbmdzIHRoYXQgbWF0Y2ggYVxuICogdG9rZW4gaWRlbnRpY2FsbHkgKGUuZy4gYG9wdXMtNC03YCB2cyBgb3B1cy00LThgIGZvciB0aGUgcXVlcnkgYFwib3B1c1wiYCkgdGllXG4gKiBvbiBtYXRjaCBhbmQgbGV0IHRoZSBjbGFzcyAvIHdpdGhpbi1jbGFzcyByYW5rIGRlY2lkZSAtIHdoaWNoIGlzIHdoYXRcbiAqIHN1cmZhY2VzIHRoZSBuZXdlciwgaGlnaGVyLXF1YWxpdHkgc2libGluZy5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hCdWNrZXQoc2NvcmU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKChzY29yZSA/PyAwKSAqIDEwMDApO1xufVxuXG4vKipcbiAqIFJhbmsgdGhlIGxpdmUgY2F0YWxvZ3VlIGFnYWluc3QgYSB7QGxpbmsgTW9kZWxRdWVyeX0sIGJlc3QtZmlyc3QuXG4gKlxuICogQ2FuZGlkYXRlcyBhcmUgdGhlIGNsYXNzaWZpZWQgZW5kcG9pbnRzIGluIHRoZSBlbGlnaWJsZSBjbGFzc2VzOlxuICoge0BsaW5rIGNsYXNzZXNBdE9yQmVsb3d9IHRoZSByZXF1ZXN0ZWQgYG1vZGVsQ2xhc3NgLCBvciAtIHdoZW4gbm9uZSBpcyBnaXZlblxuICogLSB0aGUgY2hhdCBiYW5kcyBvbmx5ICh7QGxpbmsgQ0hBVF9DTEFTU19PUkRFUn0pLCBzbyBhIGdlbmVyYWwgYXNrIG5ldmVyXG4gKiBzdXJmYWNlcyBhbiBlbWJlZGRpbmcgZW5kcG9pbnQuIEVhY2ggY2xhc3MgYnVja2V0IGlzIGFscmVhZHkgYmVzdC1maXJzdCBmcm9tXG4gKiB7QGxpbmsgY2xhc3NpZnkuY2xhc3NpZnlFbmRwb2ludHN9LiBSYW5raW5nIGlzICoqbWF0Y2ggdGhlbiBjbGFzcyoqOlxuICpcbiAqIDEuIFdpdGggYSBgc2VhcmNoYCwgb25seSBlbmRwb2ludHMgbWF0Y2hpbmcgaXQgc3Vydml2ZSwgb3JkZXJlZCBieSBtYXRjaFxuICogICAgZGlzdGFuY2UgKGJ1Y2tldGVkIHZpYSB7QGxpbmsgbWF0Y2hCdWNrZXR9IHNvIG5lYXItaWRlbnRpY2FsIHNjb3JlcyB0aWUpLFxuICogICAgdGhlbiBieSBjbGFzcyAobW9yZSBjYXBhYmxlIGZpcnN0KSwgdGhlbiBieSB0aGUgc3RhYmxlIHdpdGhpbi1jbGFzcyByYW5rLlxuICogMi4gV2l0aG91dCBhIGBzZWFyY2hgLCB0aGUgY2xhc3MtdGhlbi1yYW5rIGNhbmRpZGF0ZSBvcmRlciBzdGFuZHMuXG4gKlxuICogQSBgbGltaXRgIHRydW5jYXRlcyB0aGUgcmVzdWx0LiBSZXR1cm5zIGBbXWAgd2hlbiBub3RoaW5nIGlzIGVsaWdpYmxlIG9yXG4gKiBtYXRjaGVzIC0gY2FsbGVycyBsYXllciB0aGVpciBvd24gZmFsbGJhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5rTW9kZWxzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgcXVlcnk6IE1vZGVsUXVlcnkgPSB7fSxcbik6IFJhbmtlZE1vZGVsW10ge1xuICBjb25zdCBjbGFzc2lmaWVkID0gY2xhc3NpZnkuY2xhc3NpZnlFbmRwb2ludHMoZW5kcG9pbnRzKTtcbiAgY29uc3QgZWxpZ2libGUgPVxuICAgIHF1ZXJ5Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IGNsYXNzZXNBdE9yQmVsb3cocXVlcnkubW9kZWxDbGFzcykgOiBDSEFUX0NMQVNTX09SREVSO1xuXG4gIC8vIEZsYXR0ZW4gZWxpZ2libGUgY2xhc3NlcyBpbiBjYXBhYmlsaXR5IG9yZGVyLCBjYXJyeWluZyBlYWNoIGVuZHBvaW50J3NcbiAgLy8gY2xhc3M7IGJ1Y2tldCBvcmRlciBpcyBhbHJlYWR5IGJlc3QtZmlyc3QuXG4gIGNvbnN0IGNhbmRpZGF0ZXM6IFJhbmtlZE1vZGVsW10gPSBbXTtcbiAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIGVsaWdpYmxlKSB7XG4gICAgZm9yIChjb25zdCBlbmRwb2ludCBvZiBjbGFzc2lmaWVkW21vZGVsQ2xhc3NdKSB7XG4gICAgICBpZiAocXVlcnkucmVxdWlyZXNUb29scyAmJiAhY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLnRvb2xzKSBjb250aW51ZTtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IGVuZHBvaW50LCBtb2RlbENsYXNzIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlYXJjaCA9IHF1ZXJ5LnNlYXJjaD8udHJpbSgpO1xuICBsZXQgcmFua2VkOiBSYW5rZWRNb2RlbFtdO1xuICBpZiAoc2VhcmNoKSB7XG4gICAgY29uc3QgZ3B0RmFtaWx5U2VhcmNoID0gc2VhcmNoLnRvTG93ZXJDYXNlKCkgPT09IFwiZ3B0XCI7XG4gICAgY29uc3Qgc2NvcmVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoXG4gICAgICBzZWFyY2gsXG4gICAgICBjYW5kaWRhdGVzLm1hcCgoYykgPT4gYy5lbmRwb2ludCksXG4gICAgICBxdWVyeS50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBxdWVyeS50aHJlc2hvbGQgfSA6IHt9LFxuICAgICkpIHtcbiAgICAgIHNjb3Jlcy5zZXQobWF0Y2guZW5kcG9pbnQubmFtZSwgbWF0Y2guc2NvcmUpO1xuICAgIH1cbiAgICAvLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGlzIHN0YWJsZSwgc28gZW5kcG9pbnRzIGVxdWFsIG9uIG1hdGNoIGFuZCBjbGFzc1xuICAgIC8vIGtlZXAgdGhlaXIgYmVzdC1maXJzdCB3aXRoaW4tY2xhc3Mgb3JkZXIuXG4gICAgcmFua2VkID0gY2FuZGlkYXRlc1xuICAgICAgLmZpbHRlcigoYykgPT4gc2NvcmVzLmhhcyhjLmVuZHBvaW50Lm5hbWUpKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGMpID0+ICFncHRGYW1pbHlTZWFyY2ggfHwgIS8oPzpefFstXy5dKWdwdFstXy5dP29zcyg/OlstXy5dfCQpL2kudGVzdChjLmVuZHBvaW50Lm5hbWUpLFxuICAgICAgKVxuICAgICAgLm1hcCgoYykgPT4gKHsgLi4uYywgc2NvcmU6IHNjb3Jlcy5nZXQoYy5lbmRwb2ludC5uYW1lKSB9KSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ5TWF0Y2ggPSBtYXRjaEJ1Y2tldChhLnNjb3JlKSAtIG1hdGNoQnVja2V0KGIuc2NvcmUpO1xuICAgICAgICBpZiAoYnlNYXRjaCAhPT0gMCkgcmV0dXJuIGJ5TWF0Y2g7XG4gICAgICAgIGlmIChncHRGYW1pbHlTZWFyY2gpIHtcbiAgICAgICAgICBjb25zdCBhVmVyc2lvbiA9IGNsYXNzaWZ5LnZlcnNpb25UdXBsZShhLmVuZHBvaW50Lm5hbWUpO1xuICAgICAgICAgIGNvbnN0IGJWZXJzaW9uID0gY2xhc3NpZnkudmVyc2lvblR1cGxlKGIuZW5kcG9pbnQubmFtZSk7XG4gICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDM7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5VmVyc2lvbiA9IChiVmVyc2lvbltpbmRleF0gPz8gMCkgLSAoYVZlcnNpb25baW5kZXhdID8/IDApO1xuICAgICAgICAgICAgaWYgKGJ5VmVyc2lvbiAhPT0gMCkgcmV0dXJuIGJ5VmVyc2lvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1PREVMX0NMQVNTX09SREVSLmluZGV4T2YoYS5tb2RlbENsYXNzKSAtIE1PREVMX0NMQVNTX09SREVSLmluZGV4T2YoYi5tb2RlbENsYXNzKTtcbiAgICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJhbmtlZCA9IGNhbmRpZGF0ZXM7XG4gIH1cblxuICByZXR1cm4gcXVlcnkubGltaXQgIT09IHVuZGVmaW5lZCA/IHJhbmtlZC5zbGljZSgwLCBNYXRoLm1heCgwLCBxdWVyeS5saW1pdCkpIDogcmFua2VkO1xufVxuXG4vKipcbiAqIENvbGxhcHNlIHtAbGluayByYW5rTW9kZWxzfSB0byBhIHNpbmdsZSBpZDogdGhlIGNsb3Nlc3QgZW5kcG9pbnQgdG8gYHNlYXJjaGBcbiAqIGluIGEgY2F0YWxvZ3VlIHNuYXBzaG90LCBvciB0aGUgaW5wdXQgdmVyYmF0aW0gd2hlbiBub3RoaW5nIHNjb3JlcyB3aXRoaW4gdGhlXG4gKiB0aHJlc2hvbGQuXG4gKlxuICogVGhlIHJhbmstYmFzZWQgY291bnRlcnBhcnQgdG8gdGhlIEZ1c2Utb25seSB7QGxpbmsgcmVzb2x2ZU1vZGVsSWR9OiBlcXVhbFxuICogbWF0Y2ggc2NvcmVzIGFyZSBicm9rZW4gYnkgY2xhc3MgYW5kIHRoZW4gd2l0aGluLWNsYXNzIHZlcnNpb24sIHNvIGEgbG9vc2VcbiAqIGBcIm9wdXNcImAgcHJlZmVycyBgb3B1cy01YCBvdmVyIGBvcHVzLTQtN2AgaW5zdGVhZCBvZiBwaWNraW5nIHdoaWNoZXZlclxuICogc2libGluZyBGdXNlIGhhcHBlbmVkIHRvIG9yZGVyIGZpcnN0LiBSZXR1cm5pbmcgdGhlIGlucHV0IHVubWF0Y2hlZCAocmF0aGVyXG4gKiB0aGFuIGEgbmVhciBuZWlnaGJvdXIpIGlzIGRlbGliZXJhdGUgLSBhIGRlbGliZXJhdGUgZW5kcG9pbnQgaWQgaXMgbmV2ZXJcbiAqIHNpbGVudGx5IHJld3JpdHRlbiwgYW5kIERhdGFicmlja3Mgc3VyZmFjZXMgYSBjbGVhbiA0MDQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5rTW9kZWxJZChcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIHNlYXJjaDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4pOiBSZXNvbHZlZE1vZGVsIHtcbiAgY29uc3QgW3RvcF0gPSByYW5rTW9kZWxzKGVuZHBvaW50cywge1xuICAgIHNlYXJjaCxcbiAgICBsaW1pdDogMSxcbiAgICAuLi4ob3B0aW9ucy50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBvcHRpb25zLnRocmVzaG9sZCB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnJlcXVpcmVzVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgcmVxdWlyZXNUb29sczogb3B0aW9ucy5yZXF1aXJlc1Rvb2xzIH0gOiB7fSksXG4gIH0pO1xuICBpZiAoIXRvcCkgcmV0dXJuIHsgbW9kZWxJZDogc2VhcmNoLCBtYXRjaGVkOiBmYWxzZSB9O1xuICByZXR1cm4geyBtb2RlbElkOiB0b3AuZW5kcG9pbnQubmFtZSwgbWF0Y2hlZDogdHJ1ZSwgc2NvcmU6IHRvcC5zY29yZSB9O1xufVxuXG4vKipcbiAqIHtAbGluayByYW5rTW9kZWxJZH0gYWdhaW5zdCBhIGNhdGFsb2d1ZSB0aGUgY2FsbGVyIG1heSBiZSBob2xkaW5nIHN0YWxlOlxuICogbWF0Y2ggdGhlIGxvYWRlZCBzbmFwc2hvdCwgYW5kIG9uIGEgbWlzcyByZWxvYWQgb25jZSB3aXRoIGBmb3JjZWAgYW5kIG1hdGNoXG4gKiBhZ2Fpbi4gVGhhdCB3YXkgYSBtb2RlbCBkZXBsb3llZCBhZnRlciB0aGUgY2F0YWxvZ3VlIHdhcyBjYWNoZWQgc3RpbGxcbiAqIHJlc29sdmVzIG9uIGZpcnN0IHVzZSwgd2l0aG91dCBhIHJlc3RhcnQgYW5kIHdpdGhvdXQgZ2l2aW5nIHVwIGNhY2hpbmcuXG4gKlxuICogVGhlIGNhdGFsb2d1ZSBhcnJpdmVzIGFzIGEgbG9hZGVyIHJhdGhlciB0aGFuIGEgY2xpZW50IHNvIHRoZSBjYWxsZXIga2VlcHNcbiAqIG93bmVyc2hpcCBvZiAqaG93KiBpdCBpcyBjYWNoZWQgLSB7QGxpbmsgbGlzdFNlcnZpbmdFbmRwb2ludHN9IGFuZCBpdHNcbiAqIGBDYWNoZU1hbmFnZXJgLCBhIHBsYWluIHByb2Nlc3MtbGlmZXRpbWUgZmllbGQgaW4gYSBDTEksIG9yIGEgdGVzdCBkb3VibGUuXG4gKiBPbmx5IG9uZSByZWxvYWQgaXMgYXR0ZW1wdGVkOiBhIGdlbnVpbmVseSB1bmtub3duIG5hbWUgc2hvdWxkIGZhaWwgZmFzdFxuICogcmF0aGVyIHRoYW4gcmUtbGlzdCBvbiBldmVyeSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBsb2FkIC0gUmV0dXJucyB0aGUgY2F0YWxvZ3VlOyBgZm9yY2VgIGFza3MgaXQgdG8gYnlwYXNzIGl0cyBjYWNoZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhbmtNb2RlbElkTGl2ZShcbiAgbG9hZDogKGZvcmNlOiBib29sZWFuKSA9PiBQcm9taXNlPHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4sXG4gIHNlYXJjaDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFJlc29sdmVkTW9kZWw+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByYW5rTW9kZWxJZChhd2FpdCBsb2FkKGZhbHNlKSwgc2VhcmNoLCBvcHRpb25zKTtcbiAgaWYgKHJlc29sdmVkLm1hdGNoZWQpIHJldHVybiByZXNvbHZlZDtcbiAgcmV0dXJuIHJhbmtNb2RlbElkKGF3YWl0IGxvYWQodHJ1ZSksIHNlYXJjaCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmFuayBhIHdvcmtzcGFjZSdzIGNhdGFsb2d1ZSBpbiBvbmUgY2FsbDogbGlzdCBpdHMgYC9zZXJ2aW5nLWVuZHBvaW50c2BcbiAqIChjYWNoZWQpIGFuZCBydW4ge0BsaW5rIHJhbmtNb2RlbHN9IG92ZXIgdGhlIHJlc3VsdC4gVGhlIGxpc3QgY291bnRlcnBhcnQgdG9cbiAqIHtAbGluayBzZWxlY3RNb2RlbH0sIGZvciBhIGNvbnN1bWVyIHRoYXQgd2FudHMgdGhlIGZ1bGwgcmFua2VkIHNldCAoYSBtb2RlbFxuICogcGlja2VyLCBhIENMSSkgcmF0aGVyIHRoYW4gYSBzaW5nbGUgaWQuIENhdGFsb2d1ZSBmZXRjaGVzIGZhaWwgbG91ZDogbmV0d29ya1xuICogLyBhdXRoIGVycm9ycyBwcm9wYWdhdGUgc28gdGhlIGNhbGxlciBzZWVzIHRoZSByZWFsIFNESyBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBob3N0IC0gV29ya3NwYWNlIGhvc3QgdXNlZCBhcyB0aGUgY2FjaGUga2V5LiBQYXNzIHRoZSB2YWx1ZSByZXNvbHZlZFxuICogICBmcm9tIGBjbGllbnQuY29uZmlnLmdldEhvc3QoKWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWFyY2hNb2RlbHMoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgaG9zdDogc3RyaW5nLFxuICBpbnB1dDogU2VhcmNoTW9kZWxzSW5wdXQgPSB7fSxcbik6IFByb21pc2U8UmFua2VkTW9kZWxbXT4ge1xuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhcbiAgICBjbGllbnQsXG4gICAgaG9zdCxcbiAgICBpbnB1dC50dGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGxNczogaW5wdXQudHRsTXMgfSA6IHt9LFxuICApO1xuICByZXR1cm4gcmFua01vZGVscyhlbmRwb2ludHMsIGlucHV0KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgbW9kZWwgaWQgZm9yIGEgd29ya3NwYWNlIGluIG9uZSBjYWxsOiBsaXN0IGl0cyBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICogKGNhY2hlZCkgYW5kIHJ1biB7QGxpbmsgcmVzb2x2ZU1vZGVsfSBvdmVyIHRoZSByZXN1bHQuIFRoaXMgaXMgdGhlIGVudHJ5XG4gKiBwb2ludCBmb3IgYW55IGNvbnN1bWVyIHRoYXQgaG9sZHMgYSBgV29ya3NwYWNlQ2xpZW50YCBhbmQganVzdCB3YW50cyBhIHVzYWJsZVxuICogbW9kZWwgbmFtZSAtIGEgTGFrZWZsb3cgam9iLCBhIG9uZS1vZmYgc2NyaXB0LCBvciB0aGUgTWFzdHJhIHBsdWdpbiBhbGlrZS5cbiAqXG4gKiBDaGVhcCBleGl0OiB3aGVuIGFuIGBleHBsaWNpdGAgbmFtZSBpcyBnaXZlbiwgYGZ1enp5YCBpcyBvZmYsIGFuZCB0b29sXG4gKiBjYXBhYmlsaXR5IGlzIG5vdCByZXF1aXJlZCwgdGhlIGNhdGFsb2d1ZSBpcyBuZXZlciBmZXRjaGVkLiBDYXRhbG9ndWVcbiAqIGZldGNoZXMgb3RoZXJ3aXNlIGZhaWwgbG91ZDogbmV0d29yayAvIGF1dGggZXJyb3JzIHByb3BhZ2F0ZSBzbyB0aGUgY2FsbGVyXG4gKiBzZWVzIHRoZSByZWFsIFNESyBtZXNzYWdlIGluc3RlYWQgb2YgYSBzaWxlbnQgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIGhvc3QgLSBXb3Jrc3BhY2UgaG9zdCB1c2VkIGFzIHRoZSBjYWNoZSBrZXkuIFBhc3MgdGhlIHZhbHVlIHJlc29sdmVkXG4gKiAgIGZyb20gYGNsaWVudC5jb25maWcuZ2V0SG9zdCgpYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdE1vZGVsKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIGhvc3Q6IHN0cmluZyxcbiAgaW5wdXQ6IFNlbGVjdE1vZGVsSW5wdXQgPSB7fSxcbik6IFByb21pc2U8UmVzb2x2ZWRNb2RlbFNlbGVjdGlvbj4ge1xuICBpZiAoaW5wdXQuZXhwbGljaXQgIT09IHVuZGVmaW5lZCAmJiBpbnB1dC5mdXp6eSA9PT0gZmFsc2UgJiYgIWlucHV0LnJlcXVpcmVzVG9vbHMpIHtcbiAgICByZXR1cm4geyBtb2RlbElkOiBpbnB1dC5leHBsaWNpdCwgc291cmNlOiBcImV4cGxpY2l0XCIgfTtcbiAgfVxuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhjbGllbnQsIGhvc3QsIHtcbiAgICAuLi4oaW5wdXQudHRsTXMgIT09IHVuZGVmaW5lZCA/IHsgdHRsTXM6IGlucHV0LnR0bE1zIH0gOiB7fSksXG4gIH0pO1xuICByZXR1cm4gcmVzb2x2ZU1vZGVsKGVuZHBvaW50cywgaW5wdXQpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBzaW5nbGUgbW9kZWwgaWQgZnJvbSB0aGUgbGl2ZSBjYXRhbG9ndWUgYW5kIGNhbGxlciBpbnRlbnQsXG4gKiBkZWxlZ2F0aW5nIHRoZSBsaXZlIHNlbGVjdGlvbiB0byB7QGxpbmsgcmFua01vZGVsc30gd2l0aCBgbGltaXQ6IDFgLlxuICpcbiAqIDEuICoqRXhwbGljaXQgYXNrKio6IHdpdGggYGZ1enp5YCBvZmYsIHJldHVybmVkIHZlcmJhdGltOyBvdGhlcndpc2VcbiAqICAgIGZ1enp5LXJhbmtlZCB3aXRoaW4gdGhlIChvcHRpb25hbCkgY2xhc3MgY2VpbGluZyBhbmQgdGhlIGJlc3QgdGFrZW4sXG4gKiAgICBmYWxsaW5nIGJhY2sgdG8gdGhlIGlucHV0IHZlcmJhdGltIHdoZW4gbm90aGluZyBtYXRjaGVzLlxuICogMi4gKipObyBleHBsaWNpdCBhc2sqKjogYW4gb3BlcmF0b3ItcGlubmVkIGBmYWxsYmFja2AgdGhhdCBleGlzdHMgaW4gdGhlIGxpdmVcbiAqICAgIGNhdGFsb2d1ZSB3aW5zIGZpcnN0OyB0aGVuIHRoZSByYW5rZWQgbGl2ZSBjYXRhbG9ndWUgKGNsYXNzIGNlaWxpbmdcbiAqICAgIGFwcGxpZWQpOyB0aGVuIHRoZSBzdGF0aWMge0BsaW5rIEZBTExCQUNLX01PREVMX0lEU30gZmxvb3Igd2hlbiB0aGVcbiAqICAgIGNhdGFsb2d1ZSB5aWVsZHMgbm90aGluZyBpbiByYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNb2RlbChcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIGlucHV0OiBSZXNvbHZlTW9kZWxJbnB1dCA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbiB7XG4gIGlmIChpbnB1dC5leHBsaWNpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlucHV0LmZ1enp5ID09PSBmYWxzZSkge1xuICAgICAgaWYgKGlucHV0LnJlcXVpcmVzVG9vbHMpIGFzc2VydFRvb2xTdXBwb3J0KGVuZHBvaW50cywgaW5wdXQuZXhwbGljaXQpO1xuICAgICAgcmV0dXJuIHsgbW9kZWxJZDogaW5wdXQuZXhwbGljaXQsIHNvdXJjZTogXCJleHBsaWNpdFwiIH07XG4gICAgfVxuICAgIGNvbnN0IFt0b3BdID0gcmFua01vZGVscyhlbmRwb2ludHMsIGJ1aWxkUXVlcnkoaW5wdXQsIGlucHV0LmV4cGxpY2l0KSk7XG4gICAgaWYgKGlucHV0LnJlcXVpcmVzVG9vbHMgJiYgIXRvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0b29sLWNhcGFibGUgbW9kZWwgbWF0Y2hlcyBcIiR7aW5wdXQuZXhwbGljaXR9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogdG9wPy5lbmRwb2ludC5uYW1lID8/IGlucHV0LmV4cGxpY2l0LCBzb3VyY2U6IFwiZnV6enktbWF0Y2hcIiB9O1xuICB9XG5cbiAgLy8gT3BlcmF0b3ItcGlubmVkIGZhbGxiYWNrcyB3aW4gd2hlbiBwcmVzZW50IGFuZCBsaXZlIChlLmcuIGEgcmVndWxhdGVkXG4gIC8vIHdvcmtzcGFjZSByZXN0cmljdGVkIHRvIGFuIGFwcHJvdmVkIHN1YnNldCkuXG4gIGlmIChpbnB1dC5tb2RlbENsYXNzID09PSB1bmRlZmluZWQgJiYgaW5wdXQuZmFsbGJhY2tzICYmIGlucHV0LmZhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcHJlc2VudCA9IG5ldyBTZXQoXG4gICAgICBlbmRwb2ludHNcbiAgICAgICAgLmZpbHRlcigoZW5kcG9pbnQpID0+ICFpbnB1dC5yZXF1aXJlc1Rvb2xzIHx8IGNsYXNzaWZ5LmVuZHBvaW50Q2FwYWJpbGl0aWVzKGVuZHBvaW50KS50b29scylcbiAgICAgICAgLm1hcCgoZW5kcG9pbnQpID0+IGVuZHBvaW50Lm5hbWUpLFxuICAgICk7XG4gICAgY29uc3QgcGlubmVkID0gaW5wdXQuZmFsbGJhY2tzLmZpbmQoKGlkKSA9PiBwcmVzZW50LmhhcyhpZCkpO1xuICAgIGlmIChwaW5uZWQpIHJldHVybiB7IG1vZGVsSWQ6IHBpbm5lZCwgc291cmNlOiBcImZhbGxiYWNrXCIgfTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IFwiY2xhc3NcIiA6IFwiZmFsbGJhY2tcIjtcbiAgY29uc3QgW3RvcF0gPSByYW5rTW9kZWxzKGVuZHBvaW50cywgYnVpbGRRdWVyeShpbnB1dCwgdW5kZWZpbmVkKSk7XG4gIGlmICh0b3ApIHJldHVybiB7IG1vZGVsSWQ6IHRvcC5lbmRwb2ludC5uYW1lLCBzb3VyY2UgfTtcblxuICAvLyBMaXZlIGNhdGFsb2d1ZSB5aWVsZGVkIG5vdGhpbmcgaW4gcmFuZ2U6IHdhbGsgdGhlIHN0YXRpYyBmbG9vci5cbiAgY29uc3QgZmxvb3JTb3VyY2UgPVxuICAgIGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IG1vZGVsc0ZvckNsYXNzKGlucHV0Lm1vZGVsQ2xhc3MpIDogKGlucHV0LmZhbGxiYWNrcyA/PyBbXSk7XG4gIGNvbnN0IGZsb29yID0gb2JqZWN0LnNlcXVlbmNlKGZsb29yU291cmNlKS5jb25jYXQoRkFMTEJBQ0tfTU9ERUxfSURTKS5kaXN0aW5jdCgpLnRvQXJyYXkoKTtcbiAgaWYgKGlucHV0LnJlcXVpcmVzVG9vbHMpIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBuZXcgU2V0KFxuICAgICAgZW5kcG9pbnRzXG4gICAgICAgIC5maWx0ZXIoKGVuZHBvaW50KSA9PiBjbGFzc2lmeS5lbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpXG4gICAgICAgIC5tYXAoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lKSxcbiAgICApO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gZmxvb3IuZmluZCgoaWQpID0+IGF2YWlsYWJsZS5oYXMoaWQpKTtcbiAgICBpZiAoIXNlbGVjdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJObyB0b29sLWNhcGFibGUgbW9kZWwgaXMgYXZhaWxhYmxlXCIpO1xuICAgIHJldHVybiB7IG1vZGVsSWQ6IHNlbGVjdGVkLCBzb3VyY2UgfTtcbiAgfVxuICByZXR1cm4geyBtb2RlbElkOiBwaWNrRmlyc3RBdmFpbGFibGUoZmxvb3IsIGVuZHBvaW50cyksIHNvdXJjZSB9O1xufVxuXG4vKiogQnVpbGQgYSB7QGxpbmsgTW9kZWxRdWVyeX0gZnJvbSB7QGxpbmsgUmVzb2x2ZU1vZGVsSW5wdXR9IGZvciB0aGUgYGxpbWl0OiAxYCBkZWxlZ2F0aW9uLiAqL1xuZnVuY3Rpb24gYnVpbGRRdWVyeShpbnB1dDogUmVzb2x2ZU1vZGVsSW5wdXQsIHNlYXJjaDogc3RyaW5nIHwgdW5kZWZpbmVkKTogTW9kZWxRdWVyeSB7XG4gIHJldHVybiB7XG4gICAgLi4uKHNlYXJjaCAhPT0gdW5kZWZpbmVkID8geyBzZWFyY2ggfSA6IHt9KSxcbiAgICAuLi4oaW5wdXQubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8geyBtb2RlbENsYXNzOiBpbnB1dC5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgLi4uKGlucHV0LnJlcXVpcmVzVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgcmVxdWlyZXNUb29sczogaW5wdXQucmVxdWlyZXNUb29scyB9IDoge30pLFxuICAgIC4uLihpbnB1dC50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBpbnB1dC50aHJlc2hvbGQgfSA6IHt9KSxcbiAgICBsaW1pdDogMSxcbiAgfTtcbn1cblxuLyoqIFRocm93IHdoZW4gYW4gZXhwbGljaXQgaWQgaXMgYWJzZW50IG9yIG5vdCB2ZXJpZmllZCBmb3IgZnVuY3Rpb24gdG9vbHMuICovXG5mdW5jdGlvbiBhc3NlcnRUb29sU3VwcG9ydChlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSwgbW9kZWxJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGVuZHBvaW50ID0gZW5kcG9pbnRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG1vZGVsSWQpO1xuICBpZiAoIWVuZHBvaW50IHx8ICFjbGFzc2lmeS5lbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIFwiJHttb2RlbElkfVwiIGRvZXMgbm90IHN1cHBvcnQgZnVuY3Rpb24gdG9vbHNgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmQgdGhlIGZpcnN0IGlkIGluIGBjYW5kaWRhdGVzYCB3aG9zZSBlbmRwb2ludCBpcyBwcmVzZW50IGluIGBlbmRwb2ludHNgLlxuICogUmV0dXJucyB0aGUgdG9wIGNhbmRpZGF0ZSB3aGVuIHRoZSB3b3Jrc3BhY2UgaGFzIG5vbmUgb2YgdGhlbSBzbyBjYWxsZXJzXG4gKiBhbHdheXMgZ2V0IGEgc3RyaW5nOyBhbiBvZmZsaW5lIHdvcmtzcGFjZSB0aGVuIHJlY2VpdmVzIGEgY2xlYW4gNDA0IGZyb21cbiAqIERhdGFicmlja3MgaW5zdGVhZCBvZiBhIG1hbGZvcm1lZCBjb25maWcuXG4gKi9cbmZ1bmN0aW9uIHBpY2tGaXJzdEF2YWlsYWJsZShcbiAgY2FuZGlkYXRlczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcHJlc2VudCA9IG5ldyBTZXQoZW5kcG9pbnRzLm1hcCgoZSkgPT4gZS5uYW1lKSk7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAocHJlc2VudC5oYXMoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlc1swXSA/PyBGQUxMQkFDS19NT0RFTF9JRFNbMF0hO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -18,15 +18,16 @@
|
|
|
18
18
|
"projen": "projen"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
+
"@dbx-tools/test-polyglot": "0.6.91",
|
|
21
22
|
"@types/bun": "^1.3.14",
|
|
22
23
|
"@types/node": "^24.6.0",
|
|
23
24
|
"typescript": "^5.9.3"
|
|
24
25
|
},
|
|
25
26
|
"dependencies": {
|
|
26
27
|
"@databricks/appkit": "^0.43.0",
|
|
27
|
-
"@dbx-tools/appkit": "0.6.
|
|
28
|
-
"@dbx-tools/shared-core": "0.6.
|
|
29
|
-
"@dbx-tools/shared-model": "0.6.
|
|
28
|
+
"@dbx-tools/appkit": "0.6.91",
|
|
29
|
+
"@dbx-tools/shared-core": "0.6.91",
|
|
30
|
+
"@dbx-tools/shared-model": "0.6.91",
|
|
30
31
|
"fuse.js": "^7.4.2"
|
|
31
32
|
},
|
|
32
33
|
"main": "./lib/index.js",
|
|
@@ -43,7 +44,7 @@
|
|
|
43
44
|
"./package.json": "./package.json"
|
|
44
45
|
}
|
|
45
46
|
},
|
|
46
|
-
"version": "0.6.
|
|
47
|
+
"version": "0.6.91",
|
|
47
48
|
"types": "./lib/index.d.ts",
|
|
48
49
|
"type": "module",
|
|
49
50
|
"exports": {
|
package/src/resolve.ts
CHANGED
|
@@ -140,6 +140,7 @@ export function rankModels(
|
|
|
140
140
|
const search = query.search?.trim();
|
|
141
141
|
let ranked: RankedModel[];
|
|
142
142
|
if (search) {
|
|
143
|
+
const gptFamilySearch = search.toLowerCase() === "gpt";
|
|
143
144
|
const scores = new Map<string, number>();
|
|
144
145
|
for (const match of searchServingEndpoints(
|
|
145
146
|
search,
|
|
@@ -152,10 +153,21 @@ export function rankModels(
|
|
|
152
153
|
// keep their best-first within-class order.
|
|
153
154
|
ranked = candidates
|
|
154
155
|
.filter((c) => scores.has(c.endpoint.name))
|
|
156
|
+
.filter(
|
|
157
|
+
(c) => !gptFamilySearch || !/(?:^|[-_.])gpt[-_.]?oss(?:[-_.]|$)/i.test(c.endpoint.name),
|
|
158
|
+
)
|
|
155
159
|
.map((c) => ({ ...c, score: scores.get(c.endpoint.name) }))
|
|
156
160
|
.sort((a, b) => {
|
|
157
161
|
const byMatch = matchBucket(a.score) - matchBucket(b.score);
|
|
158
162
|
if (byMatch !== 0) return byMatch;
|
|
163
|
+
if (gptFamilySearch) {
|
|
164
|
+
const aVersion = classify.versionTuple(a.endpoint.name);
|
|
165
|
+
const bVersion = classify.versionTuple(b.endpoint.name);
|
|
166
|
+
for (let index = 0; index < 3; index++) {
|
|
167
|
+
const byVersion = (bVersion[index] ?? 0) - (aVersion[index] ?? 0);
|
|
168
|
+
if (byVersion !== 0) return byVersion;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
159
171
|
return MODEL_CLASS_ORDER.indexOf(a.modelClass) - MODEL_CLASS_ORDER.indexOf(b.modelClass);
|
|
160
172
|
});
|
|
161
173
|
} else {
|