@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.
@@ -0,0 +1,59 @@
1
+ import retiredModelsSnapshotJson from "./generated/retired-models.json" with { type: "json" };
2
+ const snapshot = retiredModelsSnapshotJson;
3
+ const RETIRED_MODEL_PREFIXES = new Set([
4
+ "ai",
5
+ "anthropic",
6
+ "databricks",
7
+ "dbx",
8
+ "google",
9
+ "meta",
10
+ "openai",
11
+ "system",
12
+ ]);
13
+ let names = Object.freeze([...snapshot.models]);
14
+ let keys = retiredKeys(names);
15
+ export const COMMITTED_RETIRED_MODELS = snapshot.models;
16
+ export const RETIRED_MODELS_GENERATED_AT = snapshot.generatedAt;
17
+ /** Replace retirement state after metadata cache hydration or refresh. */
18
+ export function replaceRetiredModelNames(models) {
19
+ names = Object.freeze([...models]);
20
+ keys = retiredKeys(names);
21
+ }
22
+ /** Return the active retired-model names. */
23
+ export function retiredModelNames() {
24
+ return names;
25
+ }
26
+ /** Resolve whether any supplied identity is listed as retired. */
27
+ export function modelStatusFor(...models) {
28
+ const deprecated = models
29
+ .flatMap((model) => modelIdentities(model))
30
+ .some((identity) => {
31
+ const candidate = retiredModelKey(identity);
32
+ for (const key of keys) {
33
+ if (candidate === key || candidate.startsWith(`${key}-`))
34
+ return true;
35
+ }
36
+ return false;
37
+ });
38
+ return { deprecated };
39
+ }
40
+ function retiredKeys(models) {
41
+ return new Set(models.map(retiredModelKey).filter(Boolean));
42
+ }
43
+ function modelIdentities(model) {
44
+ if (typeof model === "string")
45
+ return [model];
46
+ return [
47
+ model.name,
48
+ model.displayName,
49
+ model.modelServiceName,
50
+ ...Object.values(model.serviceNames ?? {}),
51
+ ].filter((value) => Boolean(value));
52
+ }
53
+ function retiredModelKey(value) {
54
+ const tokens = value.toLowerCase().match(/[a-z0-9]+/g) ?? [];
55
+ while (tokens[0] && RETIRED_MODEL_PREFIXES.has(tokens[0]))
56
+ tokens.shift();
57
+ return tokens.join("-");
58
+ }
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JldGlyZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3JldGlyZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyx5QkFBeUIsTUFBTSxpQ0FBaUMsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUU5RixNQUFNLFFBQVEsR0FBRyx5QkFBa0QsQ0FBQztBQUNwRSxNQUFNLHNCQUFzQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3JDLElBQUk7SUFDSixXQUFXO0lBQ1gsWUFBWTtJQUNaLEtBQUs7SUFDTCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixRQUFRO0NBQ1QsQ0FBQyxDQUFDO0FBRUgsSUFBSSxLQUFLLEdBQXNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ25FLElBQUksSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUU5QixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7QUFFaEUsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxNQUF5QjtJQUNoRSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCw2Q0FBNkM7QUFDN0MsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxrRUFBa0U7QUFDbEUsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsR0FBRyxNQUFvRDtJQUV2RCxNQUFNLFVBQVUsR0FBRyxNQUFNO1NBQ3RCLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ2pCLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQUksU0FBUyxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEUsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQXlCO0lBQzVDLE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsS0FBc0M7SUFDN0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLE9BQU87UUFDTCxLQUFLLENBQUMsSUFBSTtRQUNWLEtBQUssQ0FBQyxXQUFXO1FBQ2pCLEtBQUssQ0FBQyxnQkFBZ0I7UUFDdEIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO0tBQzNDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEtBQWE7SUFDcEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0QsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksc0JBQXNCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBMaWdodHdlaWdodCBtb2RlbCByZXRpcmVtZW50IHN0YXRlIHNoYXJlZCBieSBkaXNjb3ZlcnkgYW5kIG1ldGFkYXRhIGNhY2hlcy4gKi9cbmltcG9ydCB0eXBlIHsgTW9kZWxTdGF0dXMsIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbmltcG9ydCB0eXBlIHsgUmV0aXJlZE1vZGVsc1NuYXBzaG90IH0gZnJvbSBcIi4vX21ldGFkYXRhLWNvbnRyYWN0LnRzXCI7XG5pbXBvcnQgcmV0aXJlZE1vZGVsc1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvcmV0aXJlZC1tb2RlbHMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuXG5jb25zdCBzbmFwc2hvdCA9IHJldGlyZWRNb2RlbHNTbmFwc2hvdEpzb24gYXMgUmV0aXJlZE1vZGVsc1NuYXBzaG90O1xuY29uc3QgUkVUSVJFRF9NT0RFTF9QUkVGSVhFUyA9IG5ldyBTZXQoW1xuICBcImFpXCIsXG4gIFwiYW50aHJvcGljXCIsXG4gIFwiZGF0YWJyaWNrc1wiLFxuICBcImRieFwiLFxuICBcImdvb2dsZVwiLFxuICBcIm1ldGFcIixcbiAgXCJvcGVuYWlcIixcbiAgXCJzeXN0ZW1cIixcbl0pO1xuXG5sZXQgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gT2JqZWN0LmZyZWV6ZShbLi4uc25hcHNob3QubW9kZWxzXSk7XG5sZXQga2V5cyA9IHJldGlyZWRLZXlzKG5hbWVzKTtcblxuZXhwb3J0IGNvbnN0IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyA9IHNuYXBzaG90Lm1vZGVscztcbmV4cG9ydCBjb25zdCBSRVRJUkVEX01PREVMU19HRU5FUkFURURfQVQgPSBzbmFwc2hvdC5nZW5lcmF0ZWRBdDtcblxuLyoqIFJlcGxhY2UgcmV0aXJlbWVudCBzdGF0ZSBhZnRlciBtZXRhZGF0YSBjYWNoZSBoeWRyYXRpb24gb3IgcmVmcmVzaC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlUmV0aXJlZE1vZGVsTmFtZXMobW9kZWxzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICBuYW1lcyA9IE9iamVjdC5mcmVlemUoWy4uLm1vZGVsc10pO1xuICBrZXlzID0gcmV0aXJlZEtleXMobmFtZXMpO1xufVxuXG4vKiogUmV0dXJuIHRoZSBhY3RpdmUgcmV0aXJlZC1tb2RlbCBuYW1lcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXRpcmVkTW9kZWxOYW1lcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIHJldHVybiBuYW1lcztcbn1cblxuLyoqIFJlc29sdmUgd2hldGhlciBhbnkgc3VwcGxpZWQgaWRlbnRpdHkgaXMgbGlzdGVkIGFzIHJldGlyZWQuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxTdGF0dXNGb3IoXG4gIC4uLm1vZGVsczogcmVhZG9ubHkgKHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpW11cbik6IE1vZGVsU3RhdHVzIHtcbiAgY29uc3QgZGVwcmVjYXRlZCA9IG1vZGVsc1xuICAgIC5mbGF0TWFwKChtb2RlbCkgPT4gbW9kZWxJZGVudGl0aWVzKG1vZGVsKSlcbiAgICAuc29tZSgoaWRlbnRpdHkpID0+IHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHJldGlyZWRNb2RlbEtleShpZGVudGl0eSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmIChjYW5kaWRhdGUgPT09IGtleSB8fCBjYW5kaWRhdGUuc3RhcnRzV2l0aChgJHtrZXl9LWApKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgcmV0dXJuIHsgZGVwcmVjYXRlZCB9O1xufVxuXG5mdW5jdGlvbiByZXRpcmVkS2V5cyhtb2RlbHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgU2V0KG1vZGVscy5tYXAocmV0aXJlZE1vZGVsS2V5KS5maWx0ZXIoQm9vbGVhbikpO1xufVxuXG5mdW5jdGlvbiBtb2RlbElkZW50aXRpZXMobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIHJldHVybiBbbW9kZWxdO1xuICByZXR1cm4gW1xuICAgIG1vZGVsLm5hbWUsXG4gICAgbW9kZWwuZGlzcGxheU5hbWUsXG4gICAgbW9kZWwubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAuLi5PYmplY3QudmFsdWVzKG1vZGVsLnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIHJldGlyZWRNb2RlbEtleSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zID0gdmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvW2EtejAtOV0rL2cpID8/IFtdO1xuICB3aGlsZSAodG9rZW5zWzBdICYmIFJFVElSRURfTU9ERUxfUFJFRklYRVMuaGFzKHRva2Vuc1swXSkpIHRva2Vucy5zaGlmdCgpO1xuICByZXR1cm4gdG9rZW5zLmpvaW4oXCItXCIpO1xufVxuIl19
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Binding-safe facade for Databricks model discovery and routing.
3
+ *
4
+ * Generated language bindings should target this module instead of binding the
5
+ * full model package. It exposes plain TypeScript records while delegating all
6
+ * authentication, catalogue caching, fuzzy matching, policy, and URL selection
7
+ * to {@link createModelClient}.
8
+ *
9
+ * @module
10
+ */
11
+ import type { ModelClass, ModelMetadata } from "@dbx-tools/shared-model/contracts";
12
+ import { type ModelProtocol } from "./model-client.ts";
13
+ /** Binding-friendly fuzzy model route request. */
14
+ export interface ResolveModelRouteOptions {
15
+ readonly profile?: string;
16
+ readonly model?: string;
17
+ readonly fuzzy?: boolean;
18
+ readonly threshold?: number;
19
+ readonly requiresTools?: boolean;
20
+ readonly modelClass?: ModelClass;
21
+ readonly fallbacks?: readonly string[];
22
+ readonly liveOnly?: boolean;
23
+ readonly protocol?: ModelProtocol;
24
+ readonly refresh?: boolean;
25
+ readonly login?: boolean;
26
+ }
27
+ /** Binding-friendly model endpoint metadata used by Graphiti and other runtimes. */
28
+ export interface ResolvedModelRoute {
29
+ readonly modelId: string;
30
+ readonly endpointName?: string;
31
+ readonly endpointTask?: string;
32
+ readonly endpointDimension?: number;
33
+ readonly source: "explicit" | "fuzzy-match" | "class" | "fallback";
34
+ readonly protocol: ModelProtocol;
35
+ readonly host: string;
36
+ readonly apiBase: string;
37
+ readonly url: string;
38
+ readonly headers: Readonly<Record<string, string>>;
39
+ readonly metadata: ModelMetadata;
40
+ }
41
+ /** Resolve one fuzzy model request through the canonical Node model client. */
42
+ export declare function resolveModelRoute(options?: ResolveModelRouteOptions): Promise<ResolvedModelRoute>;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Binding-safe facade for Databricks model discovery and routing.
3
+ *
4
+ * Generated language bindings should target this module instead of binding the
5
+ * full model package. It exposes plain TypeScript records while delegating all
6
+ * authentication, catalogue caching, fuzzy matching, policy, and URL selection
7
+ * to {@link createModelClient}.
8
+ *
9
+ * @module
10
+ */
11
+ import { createModelClient } from "./model-client.js";
12
+ /** Resolve one fuzzy model request through the canonical Node model client. */
13
+ export async function resolveModelRoute(options = {}) {
14
+ const client = await createModelClient({
15
+ ...(options.profile ? { auth: { profile: options.profile } } : {}),
16
+ });
17
+ const route = await client.route({
18
+ ...(options.model ? { explicit: options.model } : {}),
19
+ ...(options.fuzzy === undefined ? {} : { fuzzy: options.fuzzy }),
20
+ ...(options.threshold === undefined ? {} : { threshold: options.threshold }),
21
+ ...(options.requiresTools === undefined ? {} : { requiresTools: options.requiresTools }),
22
+ ...(options.modelClass ? { modelClass: options.modelClass } : {}),
23
+ ...(options.fallbacks ? { fallbacks: [...options.fallbacks] } : {}),
24
+ ...(options.liveOnly === undefined ? {} : { liveOnly: options.liveOnly }),
25
+ ...(options.protocol ? { protocol: options.protocol } : {}),
26
+ ...(options.refresh === undefined ? {} : { refresh: options.refresh }),
27
+ ...(options.login === undefined ? {} : { login: options.login }),
28
+ });
29
+ return {
30
+ modelId: route.modelId,
31
+ ...(route.endpoint?.name ? { endpointName: route.endpoint.name } : {}),
32
+ ...(route.endpoint?.task ? { endpointTask: route.endpoint.task } : {}),
33
+ ...(route.endpoint?.dimension ? { endpointDimension: route.endpoint.dimension } : {}),
34
+ source: route.source,
35
+ protocol: route.protocol,
36
+ host: route.host,
37
+ apiBase: route.apiBase,
38
+ url: route.url,
39
+ headers: { ...route.headers },
40
+ metadata: route.metadata,
41
+ };
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluZGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBR0gsT0FBTyxFQUFFLGlCQUFpQixFQUFzQixNQUFNLG1CQUFtQixDQUFDO0FBZ0MxRSwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsVUFBb0MsRUFBRTtJQUV0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLGlCQUFpQixDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ25FLENBQUMsQ0FBQztJQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMvQixHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoRSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVFLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEYsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pFLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pFLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RFLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDakUsQ0FBQyxDQUFDO0lBQ0gsT0FBTztRQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztRQUN0QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JGLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtRQUNwQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7UUFDeEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztRQUN0QixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7UUFDZCxPQUFPLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUU7UUFDN0IsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO0tBQ3pCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCaW5kaW5nLXNhZmUgZmFjYWRlIGZvciBEYXRhYnJpY2tzIG1vZGVsIGRpc2NvdmVyeSBhbmQgcm91dGluZy5cbiAqXG4gKiBHZW5lcmF0ZWQgbGFuZ3VhZ2UgYmluZGluZ3Mgc2hvdWxkIHRhcmdldCB0aGlzIG1vZHVsZSBpbnN0ZWFkIG9mIGJpbmRpbmcgdGhlXG4gKiBmdWxsIG1vZGVsIHBhY2thZ2UuIEl0IGV4cG9zZXMgcGxhaW4gVHlwZVNjcmlwdCByZWNvcmRzIHdoaWxlIGRlbGVnYXRpbmcgYWxsXG4gKiBhdXRoZW50aWNhdGlvbiwgY2F0YWxvZ3VlIGNhY2hpbmcsIGZ1enp5IG1hdGNoaW5nLCBwb2xpY3ksIGFuZCBVUkwgc2VsZWN0aW9uXG4gKiB0byB7QGxpbmsgY3JlYXRlTW9kZWxDbGllbnR9LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MsIE1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5pbXBvcnQgeyBjcmVhdGVNb2RlbENsaWVudCwgdHlwZSBNb2RlbFByb3RvY29sIH0gZnJvbSBcIi4vbW9kZWwtY2xpZW50LnRzXCI7XG5cbi8qKiBCaW5kaW5nLWZyaWVuZGx5IGZ1enp5IG1vZGVsIHJvdXRlIHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVNb2RlbFJvdXRlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICByZWFkb25seSBmdXp6eT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRocmVzaG9sZD86IG51bWJlcjtcbiAgcmVhZG9ubHkgcmVxdWlyZXNUb29scz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzO1xuICByZWFkb25seSBmYWxsYmFja3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgbGl2ZU9ubHk/OiBib29sZWFuO1xuICByZWFkb25seSBwcm90b2NvbD86IE1vZGVsUHJvdG9jb2w7XG4gIHJlYWRvbmx5IHJlZnJlc2g/OiBib29sZWFuO1xuICByZWFkb25seSBsb2dpbj86IGJvb2xlYW47XG59XG5cbi8qKiBCaW5kaW5nLWZyaWVuZGx5IG1vZGVsIGVuZHBvaW50IG1ldGFkYXRhIHVzZWQgYnkgR3JhcGhpdGkgYW5kIG90aGVyIHJ1bnRpbWVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZE1vZGVsUm91dGUge1xuICByZWFkb25seSBtb2RlbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVuZHBvaW50TmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZW5kcG9pbnRUYXNrPzogc3RyaW5nO1xuICByZWFkb25seSBlbmRwb2ludERpbWVuc2lvbj86IG51bWJlcjtcbiAgcmVhZG9ubHkgc291cmNlOiBcImV4cGxpY2l0XCIgfCBcImZ1enp5LW1hdGNoXCIgfCBcImNsYXNzXCIgfCBcImZhbGxiYWNrXCI7XG4gIHJlYWRvbmx5IHByb3RvY29sOiBNb2RlbFByb3RvY29sO1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFwaUJhc2U6IHN0cmluZztcbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBtZXRhZGF0YTogTW9kZWxNZXRhZGF0YTtcbn1cblxuLyoqIFJlc29sdmUgb25lIGZ1enp5IG1vZGVsIHJlcXVlc3QgdGhyb3VnaCB0aGUgY2Fub25pY2FsIE5vZGUgbW9kZWwgY2xpZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVNb2RlbFJvdXRlKFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxSb3V0ZU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8UmVzb2x2ZWRNb2RlbFJvdXRlPiB7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IGNyZWF0ZU1vZGVsQ2xpZW50KHtcbiAgICAuLi4ob3B0aW9ucy5wcm9maWxlID8geyBhdXRoOiB7IHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSB9IH0gOiB7fSksXG4gIH0pO1xuICBjb25zdCByb3V0ZSA9IGF3YWl0IGNsaWVudC5yb3V0ZSh7XG4gICAgLi4uKG9wdGlvbnMubW9kZWwgPyB7IGV4cGxpY2l0OiBvcHRpb25zLm1vZGVsIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMuZnV6enkgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBmdXp6eTogb3B0aW9ucy5mdXp6eSB9KSxcbiAgICAuLi4ob3B0aW9ucy50aHJlc2hvbGQgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0aHJlc2hvbGQ6IG9wdGlvbnMudGhyZXNob2xkIH0pLFxuICAgIC4uLihvcHRpb25zLnJlcXVpcmVzVG9vbHMgPT09IHVuZGVmaW5lZCA/IHt9IDogeyByZXF1aXJlc1Rvb2xzOiBvcHRpb25zLnJlcXVpcmVzVG9vbHMgfSksXG4gICAgLi4uKG9wdGlvbnMubW9kZWxDbGFzcyA/IHsgbW9kZWxDbGFzczogb3B0aW9ucy5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMuZmFsbGJhY2tzID8geyBmYWxsYmFja3M6IFsuLi5vcHRpb25zLmZhbGxiYWNrc10gfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy5saXZlT25seSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxpdmVPbmx5OiBvcHRpb25zLmxpdmVPbmx5IH0pLFxuICAgIC4uLihvcHRpb25zLnByb3RvY29sID8geyBwcm90b2NvbDogb3B0aW9ucy5wcm90b2NvbCB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnJlZnJlc2ggPT09IHVuZGVmaW5lZCA/IHt9IDogeyByZWZyZXNoOiBvcHRpb25zLnJlZnJlc2ggfSksXG4gICAgLi4uKG9wdGlvbnMubG9naW4gPT09IHVuZGVmaW5lZCA/IHt9IDogeyBsb2dpbjogb3B0aW9ucy5sb2dpbiB9KSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbW9kZWxJZDogcm91dGUubW9kZWxJZCxcbiAgICAuLi4ocm91dGUuZW5kcG9pbnQ/Lm5hbWUgPyB7IGVuZHBvaW50TmFtZTogcm91dGUuZW5kcG9pbnQubmFtZSB9IDoge30pLFxuICAgIC4uLihyb3V0ZS5lbmRwb2ludD8udGFzayA/IHsgZW5kcG9pbnRUYXNrOiByb3V0ZS5lbmRwb2ludC50YXNrIH0gOiB7fSksXG4gICAgLi4uKHJvdXRlLmVuZHBvaW50Py5kaW1lbnNpb24gPyB7IGVuZHBvaW50RGltZW5zaW9uOiByb3V0ZS5lbmRwb2ludC5kaW1lbnNpb24gfSA6IHt9KSxcbiAgICBzb3VyY2U6IHJvdXRlLnNvdXJjZSxcbiAgICBwcm90b2NvbDogcm91dGUucHJvdG9jb2wsXG4gICAgaG9zdDogcm91dGUuaG9zdCxcbiAgICBhcGlCYXNlOiByb3V0ZS5hcGlCYXNlLFxuICAgIHVybDogcm91dGUudXJsLFxuICAgIGhlYWRlcnM6IHsgLi4ucm91dGUuaGVhZGVycyB9LFxuICAgIG1ldGFkYXRhOiByb3V0ZS5tZXRhZGF0YSxcbiAgfTtcbn1cbiJdfQ==
@@ -71,6 +71,11 @@ export declare function endpointCapabilities(endpoint: ServingEndpointSummary):
71
71
  * `4.8` - the bug a `major + minor/10` score would hit.
72
72
  */
73
73
  export declare function versionTuple(name: string): [number, number, number];
74
+ /**
75
+ * Compare version tuples component-wise with missing parts as 0.
76
+ * Positive when `left` is newer.
77
+ */
78
+ export declare function compareVersionTuples(left: readonly number[], right: readonly number[]): number;
74
79
  /**
75
80
  * Best-effort chat capability band for an endpoint we have no live
76
81
  * score for, keyed off provider family and the well-known variant words
@@ -96,15 +96,23 @@ export function versionTuple(name) {
96
96
  .map(Number);
97
97
  return [nums[0] ?? 0, nums[1] ?? 0, nums[2] ?? 0];
98
98
  }
99
- /** Compare two version tuples so the higher version sorts first (descending). */
100
- function compareVersionDesc(a, b) {
101
- for (let i = 0; i < 3; i++) {
102
- const diff = (b[i] ?? 0) - (a[i] ?? 0);
99
+ /**
100
+ * Compare version tuples component-wise with missing parts as 0.
101
+ * Positive when `left` is newer.
102
+ */
103
+ export function compareVersionTuples(left, right) {
104
+ const length = Math.max(left.length, right.length, 3);
105
+ for (let index = 0; index < length; index += 1) {
106
+ const diff = (left[index] ?? 0) - (right[index] ?? 0);
103
107
  if (diff !== 0)
104
108
  return diff;
105
109
  }
106
110
  return 0;
107
111
  }
112
+ /** Compare two version tuples so the higher version sorts first (descending). */
113
+ function compareVersionDesc(a, b) {
114
+ return compareVersionTuples(b, a);
115
+ }
108
116
  /**
109
117
  * Monotonic version key for ordering siblings within a family/tier
110
118
  * (e.g. `opus-4-8` over `opus-4-7`). Encodes the {@link versionTuple}
@@ -280,4 +288,4 @@ export function classifyEndpoints(endpoints) {
280
288
  [ModelClass.Embedding]: embeddings,
281
289
  };
282
290
  }
283
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3NpZnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xhc3NpZnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBRUgsT0FBTyxFQUdMLFVBQVUsSUFBSSxnQkFBZ0IsR0FHL0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUczQyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztBQUVwQyxnRUFBZ0U7QUFDaEUsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDO0FBRWhDLDBEQUEwRDtBQUMxRCxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztBQUUzQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBWTtJQUNoRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0IsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDaEUsT0FBTyxDQUNMLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQ3BCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFFBQWdDO0lBQ25FLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUM5Riw4RUFBOEU7SUFDOUUsOENBQThDO0lBQzlD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LENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVGLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEYsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVTtLQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9kZWwtY2xhc3MgY2xhc3NpZmljYXRpb24gZm9yIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBlbmRwb2ludHMuXG4gKlxuICogQ2hhdCBjYXBhYmlsaXR5IGJhbmRzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGxpdmUgd29ya3NwYWNlIGNhdGFsb2d1ZVxuICogcmF0aGVyIHRoYW4gYSBoYW5kLW1haW50YWluZWQgdGFibGUuIERhdGFicmlja3MgcHVibGlzaGVzXG4gKiBwZXItZW5kcG9pbnQgYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBzY29yZXMgKHRoZSBBSSBQbGF5Z3JvdW5kXG4gKiBiYXJzKSBvbiB0aGUgc2VydmluZyBsaXN0OyB7QGxpbmsgY2xhc3NpZnlFbmRwb2ludHN9IGJ1Y2tldHMgc2NvcmVkXG4gKiBjaGF0IG1vZGVscyBpbnRvIHRoZSBjaGF0IHtAbGluayBNb2RlbENsYXNzfSBiYW5kcyBieSB0aGUgKnJlbGF0aXZlKlxuICogZGlzdHJpYnV0aW9uIG9mIHRob3NlIHNjb3JlcyAocXVhbnRpbGVzLCBub3QgZml4ZWQgY3V0LW9mZnMpIHNvIGFcbiAqIGJyYW5kLW5ldyBtb2RlbCB0aGF0IGxhbmRzIG91dHNpZGUgdG9kYXkncyBzY29yZSByYW5nZSBzdGlsbCBzbG90cyBpblxuICogbmV4dCB0byBpdHMgcGVlcnMuIEVtYmVkZGluZyBlbmRwb2ludHMgKGB0YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCJgKVxuICogYXJlIGJ1Y2tldGVkIGludG8ge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfSBieSB0YXNrLCBpbmRlcGVuZGVudCBvZlxuICogYW55IHNjb3JlLlxuICpcbiAqIFVuc2NvcmVkLWJ1dC1yZWNvZ25pemFibGUgY2hhdCBlbmRwb2ludHMgYXJlIHN0aWxsIHBsYWNlZCBieSBhIHNtYWxsXG4gKiBmYW1pbHkgaGV1cmlzdGljICh7QGxpbmsgY2xhc3NpZnlCeUZhbWlseX0pIHNvIGEgd29ya3NwYWNlIHdob3NlXG4gKiBtb2RlbHMgcHJlZGF0ZSBGb3VuZGF0aW9uIE1vZGVsIEFQSSBzY29yaW5nIGtlZXBzIHdvcmtpbmcuIFRoZVxuICogb2ZmbGluZSBmYWxsYmFjayBmbG9vciAtIHRoZSBoYXJkLWNvZGVkIG1vZGVsIGxpc3QgcmVhY2hlZCBmb3Igd2hlblxuICogdGhlIGxpdmUgY2F0YWxvZ3VlIGNhbid0IGJlIHJlYWQgYXQgYWxsIC0gaXMgYSBzZXJ2ZXIgY29uY2VybiBhbmRcbiAqIGxpdmVzIGluIGBAZGJ4LXRvb2xzL21vZGVsYCwgbm90IGhlcmU6IGEgYnJvd3NlciBjbGllbnQgbmV2ZXIgdGFsa3NcbiAqIHRvIERhdGFicmlja3MgZGlyZWN0bHksIHNvIGl0IGhhcyBub3RoaW5nIHRvIGZhbGwgYmFjayB0by5cbiAqXG4gKiBQdXJlIChubyBOb2RlLW9ubHkgaW1wb3J0cyksIHNvIGEgY2xpZW50IGNhbiBjbGFzc2lmeSBhIGAvbW9kZWxzYFxuICogcmVzcG9uc2Ugd2l0aG91dCBzZXJ2ZXIgZGVwZW5kZW5jaWVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICB0eXBlIEVuZHBvaW50Q2FwYWJpbGl0aWVzLFxuICB0eXBlIEZhbWlseUNsYXNzLFxuICBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NWYWx1ZXMsXG4gIHR5cGUgTW9kZWxDbGFzcyBhcyBNb2RlbENsYXNzVHlwZSxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IE1vZGVsQ2xhc3NUeXBlO1xuY29uc3QgTW9kZWxDbGFzcyA9IE1vZGVsQ2xhc3NWYWx1ZXM7XG5cbi8qKiBUYXNrIGhpbnQgRGF0YWJyaWNrcyBzdGFtcHMgb24gY2hhdCBjb21wbGV0aW9uIGVuZHBvaW50cy4gKi9cbmNvbnN0IENIQVRfVEFTSyA9IFwibGxtL3YxL2NoYXRcIjtcblxuLyoqIFRhc2sgaGludCBEYXRhYnJpY2tzIHN0YW1wcyBvbiBlbWJlZGRpbmcgZW5kcG9pbnRzLiAqL1xuY29uc3QgRU1CRURESU5HX1RBU0sgPSBcImxsbS92MS9lbWJlZGRpbmdzXCI7XG5cbi8qKlxuICogUHJvdmlkZXIgZmFtaWxpZXMgdmVyaWZpZWQgYWdhaW5zdCBEYXRhYnJpY2tzIFJlc3BvbnNlcy9PcGVuIFJlc3BvbnNlcyB3aXRoXG4gKiBib3RoIGEgZm9yY2VkIGZ1bmN0aW9uIGNhbGwgYW5kIGEgc3RhdGVsZXNzIGBmdW5jdGlvbl9jYWxsX291dHB1dGAgcmVwbGF5LlxuICpcbiAqIERhdGFicmlja3MnIGVuZHBvaW50IGxpc3QvT3BlbkFQSSBjdXJyZW50bHkgZXhwb3NlcyBubyB0b29scyBjYXBhYmlsaXR5IGJpdC5cbiAqIEtlZXAgdGhpcyBjb25zZXJ2YXRpdmU6IGFuIHVua25vd24gY2hhdCBmYW1pbHkgaXMgbm90IGFnZW50LXNhZmUgdW50aWwgaXQgaXNcbiAqIHZlcmlmaWVkLiBHZW1pbmkgaXMgZXhjbHVkZWQgYmVjYXVzZSBpdCBlbWl0cyBhIGNhbGwgYnV0IE9wZW4gUmVzcG9uc2VzXG4gKiBjYW5ub3QgcmVwbGF5IHRoZSByZXF1aXJlZCB0aG91Z2h0IHNpZ25hdHVyZTsgR1BULU9TUyByZWplY3RzIFJlc3BvbnNlc1xuICogcGFzc3Rocm91Z2ggZW50aXJlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Rvb2xzQnlGYW1pbHkobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG4gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChuLmluY2x1ZGVzKFwiZ2VtaW5pXCIpIHx8IG4uaW5jbHVkZXMoXCJncHQtb3NzXCIpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoXG4gICAgbi5pbmNsdWRlcyhcImNsYXVkZVwiKSB8fFxuICAgIG4uaW5jbHVkZXMoXCJncHRcIikgfHxcbiAgICBuLmluY2x1ZGVzKFwicXdlblwiKSB8fFxuICAgIG4uaW5jbHVkZXMoXCJnbG1cIikgfHxcbiAgICBuLmluY2x1ZGVzKFwibGxhbWFcIilcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYW4gZW5kcG9pbnQncyBjYXBhYmlsaXRpZXMgZnJvbSBpdHMgRGF0YWJyaWNrcyB0YXNrIGhpbnQgYW5kIGl0c1xuICogY2xhc3NpZmllZCB7QGxpbmsgTW9kZWxDbGFzc30sIHNvIGNvbnN1bWVycyBmaWx0ZXIgb24gY2FwYWJpbGl0eSBpbnN0ZWFkIG9mXG4gKiByZS1kZXJpdmluZyBpdCBmcm9tIHJhdyBgdGFza2AgLyBgY2xhc3NgIHN0cmluZ3MuXG4gKlxuICogRWl0aGVyIHNpZ25hbCBhbG9uZSBpcyBlbm91Z2g6IHRoZSB0YXNrIGhpbnQgaXMgYXV0aG9yaXRhdGl2ZSB3aGVuIHByZXNlbnQsXG4gKiBhbmQgdGhlIGNsYXNzIGNvdmVycyBlbmRwb2ludHMgRGF0YWJyaWNrcyBsZWZ0IHVudGFza2VkIGJ1dCB0aGUgY2xhc3NpZmllclxuICogcmVjb2duaXplZC4gRW1iZWRkaW5nIHdpbnMgb3ZlciBjaGF0IHdoZW4gYm90aCBwb2ludCBhdCBpdCwgc2luY2UgdGhlIHR3byBhcmVcbiAqIG5vdCBpbnRlcmNoYW5nZWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IEVuZHBvaW50Q2FwYWJpbGl0aWVzIHtcbiAgY29uc3QgZW1iZWRkaW5nID0gZW5kcG9pbnQudGFzayA9PT0gRU1CRURESU5HX1RBU0sgfHwgZW5kcG9pbnQuY2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nO1xuICAvLyBFdmVyeSBub24tZW1iZWRkaW5nIGNsYXNzIGlzIGEgY2hhdCBiYW5kLCBzbyBcImNsYXNzaWZpZWQgYnV0IG5vdCBlbWJlZGRpbmdcIlxuICAvLyBpcyB0aGUgY2xhc3Mtc2lkZSB0ZXN0IGZvciBjaGF0IGNhcGFiaWxpdHkuXG4gIGNvbnN0IGNoYXQgPSAhZW1iZWRkaW5nICYmIChlbmRwb2ludC50YXNrID09PSBDSEFUX1RBU0sgfHwgZW5kcG9pbnQuY2xhc3MgIT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHRvb2xzID0gY2hhdCAmJiAoZW5kcG9pbnQuc3VwcG9ydHNUb29scyA/PyBzdXBwb3J0c1Rvb2xzQnlGYW1pbHkoZW5kcG9pbnQubmFtZSkpO1xuICByZXR1cm4geyBjaGF0LCBlbWJlZGRpbmcsIHRvb2xzIH07XG59XG5cbi8qKlxuICogTnVtZXJpYyBgW21ham9yLCBtaW5vciwgcGF0Y2hdYCB2ZXJzaW9uIHBhcnNlZCBmcm9tIGFuIGVuZHBvaW50XG4gKiBuYW1lLCB1c2VkIHRvIG9yZGVyIHNpYmxpbmdzIHdpdGhpbiBhIGZhbWlseS90aWVyLiBTdGFydHMgYXQgdGhlXG4gKiBmaXJzdCBkaWdpdCBpbiB0aGUgbmFtZSwgdGhlbiByZWFkcyBzdWNjZXNzaXZlIHNlcGFyYXRvci1kZWxpbWl0ZWQsXG4gKiBkaWdpdC1wcmVmaXhlZCBjaHVua3MgYXMgdGhlIHRocmVlIGNvbXBvbmVudHMgKG1pc3Npbmcgb25lcyBkZWZhdWx0XG4gKiB0byBgMGApOlxuICpcbiAqICAgLSBgZGF0YWJyaWNrcy1jbGF1ZGUtb3B1cy00LThgICAgLT4gYFs0LCA4LCAwXWBcbiAqICAgLSBgZGF0YWJyaWNrcy1jbGF1ZGUtb3B1cy00LTEwYCAgLT4gYFs0LCAxMCwgMF1gIChzb3J0cyBhYm92ZSA0LTgpXG4gKiAgIC0gYGRhdGFicmlja3MtbWV0YS1sbGFtYS0zLTMtNzBiYC0+IGBbMywgMywgNzBdYFxuICogICAtIGBkYXRhYnJpY2tzLWJnZS1sYXJnZS1lbmAgICAgICAtPiBgWzAsIDAsIDBdYCAobm8gZGlnaXRzKVxuICpcbiAqIENvbXBvbmVudC13aXNlIGNvbXBhcmlzb24gKG5vdCBhIGRlY2ltYWwgY29sbGFwc2UpIHNvIGA0LjEwYCBiZWF0c1xuICogYDQuOGAgLSB0aGUgYnVnIGEgYG1ham9yICsgbWlub3IvMTBgIHNjb3JlIHdvdWxkIGhpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25UdXBsZShuYW1lOiBzdHJpbmcpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBzdGFydCA9IG5hbWUuc2VhcmNoKC9cXGQvKTtcbiAgaWYgKHN0YXJ0IDwgMCkgcmV0dXJuIFswLCAwLCAwXTtcbiAgY29uc3QgbnVtcyA9IG5hbWVcbiAgICAuc2xpY2Uoc3RhcnQpXG4gICAgLnNwbGl0KC9bXmEtejAtOV0rL2kpXG4gICAgLm1hcCgoY2h1bmspID0+IGNodW5rLm1hdGNoKC9eXFxkKy8pPy5bMF0pXG4gICAgLmZpbHRlcigoZGlnaXRzKTogZGlnaXRzIGlzIHN0cmluZyA9PiBkaWdpdHMgIT09IHVuZGVmaW5lZClcbiAgICAubWFwKE51bWJlcik7XG4gIHJldHVybiBbbnVtc1swXSA/PyAwLCBudW1zWzFdID8/IDAsIG51bXNbMl0gPz8gMF07XG59XG5cbi8qKiBDb21wYXJlIHR3byB2ZXJzaW9uIHR1cGxlcyBzbyB0aGUgaGlnaGVyIHZlcnNpb24gc29ydHMgZmlyc3QgKGRlc2NlbmRpbmcpLiAqL1xuZnVuY3Rpb24gY29tcGFyZVZlcnNpb25EZXNjKGE6IHJlYWRvbmx5IG51bWJlcltdLCBiOiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlciB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgY29uc3QgZGlmZiA9IChiW2ldID8/IDApIC0gKGFbaV0gPz8gMCk7XG4gICAgaWYgKGRpZmYgIT09IDApIHJldHVybiBkaWZmO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vKipcbiAqIE1vbm90b25pYyB2ZXJzaW9uIGtleSBmb3Igb3JkZXJpbmcgc2libGluZ3Mgd2l0aGluIGEgZmFtaWx5L3RpZXJcbiAqIChlLmcuIGBvcHVzLTQtOGAgb3ZlciBgb3B1cy00LTdgKS4gRW5jb2RlcyB0aGUge0BsaW5rIHZlcnNpb25UdXBsZX1cbiAqIGFzIGEgc2luZ2xlIG51bWJlciBzbyBjYWxsZXJzIHRoYXQgbmVlZCBhIHNjYWxhciByYW5rICh0aGUgZmFtaWx5XG4gKiBoZXVyaXN0aWMsIHRoZSBzdGF0aWMgZmFsbGJhY2sgb3JkZXJpbmcpIGtlZXAgd29ya2luZzsgdGhlIGVuY29kaW5nXG4gKiBwcmVzZXJ2ZXMgY29tcG9uZW50IG9yZGVyIHdpdGhvdXQgdGhlIGRlY2ltYWwtY29sbGFwc2UgYnVnLlxuICovXG5mdW5jdGlvbiB2ZXJzaW9uU2NvcmUobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgW21ham9yLCBtaW5vciwgcGF0Y2hdID0gdmVyc2lvblR1cGxlKG5hbWUpO1xuICByZXR1cm4gbWFqb3IgKiAxXzAwMF8wMDAgKyBtaW5vciAqIDFfMDAwICsgcGF0Y2g7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgY2hhdCBjYXBhYmlsaXR5IGJhbmQgZm9yIGFuIGVuZHBvaW50IHdlIGhhdmUgbm8gbGl2ZVxuICogc2NvcmUgZm9yLCBrZXllZCBvZmYgcHJvdmlkZXIgZmFtaWx5IGFuZCB0aGUgd2VsbC1rbm93biB2YXJpYW50IHdvcmRzXG4gKiBpbiB0aGUgbmFtZSAoYG9wdXNgL2Bzb25uZXRgL2BoYWlrdWAsIGBwcm9gL2BtaW5pYC9gbmFub2AsXG4gKiBgZmxhc2hgL2BmbGFzaC1saXRlYCwgTGxhbWEgcGFyYW1ldGVyIHNpemVzLCBldGMpLiBSZXR1cm5zIGBudWxsYCBmb3JcbiAqIG5hbWVzIHdlIGRvbid0IHJlY29nbml6ZSBzbyB1bmtub3duIGN1c3RvbSBlbmRwb2ludHMgYXJlIG5ldmVyXG4gKiBhdXRvLXNlbGVjdGVkIGFzIGEgZGVmYXVsdC4gVGhlIGFjY29tcGFueWluZyBgcmFua2Agb3JkZXJzIHNpYmxpbmdzXG4gKiB3aXRoaW4gYSBjbGFzcy4gT25seSBldmVyIHJldHVybnMgYSBjaGF0IGJhbmQgLSBlbWJlZGRpbmcgZW5kcG9pbnRzXG4gKiBhcmUgY2xhc3NpZmllZCBieSB0YXNrLCBub3QgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5QnlGYW1pbHkobmFtZTogc3RyaW5nKTogRmFtaWx5Q2xhc3MgfCBudWxsIHtcbiAgY29uc3QgbiA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgYXQgPSAoY2xzOiBNb2RlbENsYXNzKTogRmFtaWx5Q2xhc3MgPT4gKHsgY2xhc3M6IGNscywgcmFuazogdmVyc2lvblNjb3JlKG4pIH0pO1xuXG4gIC8vIEFudGhyb3BpYyBDbGF1ZGVcbiAgaWYgKG4uaW5jbHVkZXMoXCJvcHVzXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmcpO1xuICBpZiAobi5pbmNsdWRlcyhcInNvbm5ldFwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgaWYgKG4uaW5jbHVkZXMoXCJoYWlrdVwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuXG4gIC8vIE9wZW5BSSBvcGVuLXdlaWdodHMgKGNoZWNrIGJlZm9yZSB0aGUgZ2VuZXJpYyBncHQgYnJhbmNoKVxuICBpZiAobi5pbmNsdWRlcyhcImdwdC1vc3NcIikpIHtcbiAgICByZXR1cm4gYXQobi5pbmNsdWRlcyhcIjEyMGJcIikgPyBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCA6IE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICB9XG4gIC8vIE9wZW5BSSBHUFQgZmFtaWx5XG4gIGlmIChuLmluY2x1ZGVzKFwiZ3B0XCIpKSB7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJwcm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJtaW5pXCIpIHx8IG4uaW5jbHVkZXMoXCJuYW5vXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gICAgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgfVxuXG4gIC8vIEdvb2dsZSBHZW1pbmkgLyBHZW1tYVxuICBpZiAobi5pbmNsdWRlcyhcImdlbWluaVwiKSkge1xuICAgIGlmIChuLmluY2x1ZGVzKFwiZmxhc2gtbGl0ZVwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICAgIGlmIChuLmluY2x1ZGVzKFwicHJvXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmcpO1xuICAgIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCk7XG4gIH1cbiAgaWYgKG4uaW5jbHVkZXMoXCJnZW1tYVwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuXG4gIC8vIE1ldGEgTGxhbWFcbiAgaWYgKG4uaW5jbHVkZXMoXCJsbGFtYVwiKSkge1xuICAgIGlmIChuLmluY2x1ZGVzKFwibWF2ZXJpY2tcIikgfHwgbi5pbmNsdWRlcyhcIjQwNWJcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCI3MGJcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCk7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCI4YlwiKSB8fCBuLmluY2x1ZGVzKFwiMWJcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRGYXN0KTtcbiAgICByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICB9XG5cbiAgLy8gQWxpYmFiYSBRd2VuXG4gIGlmIChuLmluY2x1ZGVzKFwicXdlblwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIExpbmVhci1pbnRlcnBvbGF0ZWQgcXVhbnRpbGUgb2YgYW4gYXNjZW5kaW5nLXNvcnRlZCBudW1lcmljIGFycmF5LiAqL1xuZnVuY3Rpb24gcXVhbnRpbGUoc29ydGVkQXNjOiByZWFkb25seSBudW1iZXJbXSwgcDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHNvcnRlZEFzYy5sZW5ndGggPT09IDApIHJldHVybiBOdW1iZXIuTmFOO1xuICBjb25zdCBpZHggPSAoc29ydGVkQXNjLmxlbmd0aCAtIDEpICogcDtcbiAgY29uc3QgbG8gPSBNYXRoLmZsb29yKGlkeCk7XG4gIGNvbnN0IGhpID0gTWF0aC5jZWlsKGlkeCk7XG4gIGlmIChsbyA9PT0gaGkpIHJldHVybiBzb3J0ZWRBc2NbbG9dITtcbiAgcmV0dXJuIHNvcnRlZEFzY1tsb10hICsgKHNvcnRlZEFzY1toaV0hIC0gc29ydGVkQXNjW2xvXSEpICogKGlkeCAtIGxvKTtcbn1cblxuLyoqIEludGVybmFsIHNvcnRhYmxlIHdyYXBwZXIgY2FycnlpbmcgdGhlIG9yZGVyaW5nIGtleXMgZm9yIGEgYnVja2V0IGVudHJ5LiAqL1xuaW50ZXJmYWNlIFJhbmtlZCB7XG4gIGVwOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5O1xuICAvKiogUXVhbGl0eSAoc2NvcmVkKSBvciBmYW1pbHkgdmVyc2lvbiAodW5zY29yZWQpIC0gaGlnaGVyIGZpcnN0LiAqL1xuICBzb3J0OiBudW1iZXI7XG4gIC8qKiBTY29yZWQgZW5kcG9pbnRzIHJhbmsgYWhlYWQgb2YgZmFtaWx5LW9ubHkgZ3Vlc3Nlcy4gKi9cbiAgc2NvcmVkOiBib29sZWFuO1xuICB0aWVDb3N0OiBudW1iZXI7XG4gIHRpZVNwZWVkOiBudW1iZXI7XG4gIC8qKiBQYXJzZWQgbmFtZSB2ZXJzaW9uLCB0aGUgZmluYWwgdGllLWJyZWFrZXIgKG5ld2VyIHNpYmxpbmcgZmlyc3QpLiAqL1xuICB2ZXJzaW9uOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuZnVuY3Rpb24gcmFua09yZGVyKGE6IFJhbmtlZCwgYjogUmFua2VkKTogbnVtYmVyIHtcbiAgaWYgKGEuc2NvcmVkICE9PSBiLnNjb3JlZCkgcmV0dXJuIGEuc2NvcmVkID8gLTEgOiAxO1xuICBpZiAoYi5zb3J0ICE9PSBhLnNvcnQpIHJldHVybiBiLnNvcnQgLSBhLnNvcnQ7XG4gIGlmIChhLnRpZUNvc3QgIT09IGIudGllQ29zdCkgcmV0dXJuIGEudGllQ29zdCAtIGIudGllQ29zdDtcbiAgaWYgKGIudGllU3BlZWQgIT09IGEudGllU3BlZWQpIHJldHVybiBiLnRpZVNwZWVkIC0gYS50aWVTcGVlZDtcbiAgLy8gU2FtZSBzY29yZWQtbmVzcywgcXVhbGl0eSwgY29zdCwgYW5kIHNwZWVkIChlLmcuIHNldmVyYWwgQ2xhdWRlXG4gIC8vIE9wdXMgcG9pbnQgcmVsZWFzZXMpOiBwcmVmZXIgdGhlIG5ld2VyIHBhcnNlZCB2ZXJzaW9uIHNvXG4gIC8vIGBvcHVzLTQtOGAgYmVhdHMgYG9wdXMtNC03YC5cbiAgcmV0dXJuIGNvbXBhcmVWZXJzaW9uRGVzYyhhLnZlcnNpb24sIGIudmVyc2lvbik7XG59XG5cbi8qKlxuICogQnVja2V0IGxpdmUgZW5kcG9pbnRzIGludG8ge0BsaW5rIE1vZGVsQ2xhc3N9ZXMsIHJhbmtlZCBiZXN0LWZpcnN0XG4gKiB3aXRoaW4gZWFjaCBjaGF0IGJhbmQuXG4gKlxuICogRW1iZWRkaW5nIGVuZHBvaW50cyAoYHRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcImApIGdvIGludG9cbiAqIHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ30gYnkgdGFzaywgaW4gbGlzdGluZyBvcmRlciAodGhleSBjYXJyeSBub1xuICogY2FwYWJpbGl0eSBzY29yZSB0byByYW5rIG9uKS5cbiAqXG4gKiBDaGF0IGVuZHBvaW50cyAoYHRhc2sgPT09IFwibGxtL3YxL2NoYXRcImApIHNwbGl0IGludG8gdGhlIHRocmVlIGNoYXRcbiAqIGJhbmRzLiBTY29yZWQgZW5kcG9pbnRzICh0aG9zZSBjYXJyeWluZyBhIGBwcm9maWxlLnF1YWxpdHlgKSBkcml2ZVxuICogdGhlIGJhbmRpbmc6IHRoZSBvYnNlcnZlZCBxdWFsaXR5IGRpc3RyaWJ1dGlvbiBpcyBzcGxpdCBhdCBpdHMgMS8zXG4gKiBhbmQgMi8zIHF1YW50aWxlcywgc28gdGhlIHRvcCB0aGlyZCBpcyB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmd9LFxuICogdGhlIGJvdHRvbSB0aGlyZCB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0RmFzdH0sIGFuZCB0aGUgbWlkZGxlXG4gKiB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWR9LiBCZWNhdXNlIHRoZSB0aHJlc2hvbGRzIGNvbWUgZnJvbSB0aGVcbiAqIGRhdGEsIHRoZSBzcGxpdCBhZGFwdHMgYXMgRGF0YWJyaWNrcyBhZGRzIG9yIHJlc2NvcmVzIG1vZGVscyAtXG4gKiBub3RoaW5nIGlzIHBpbm5lZCB0byBhIGZpeGVkIHNjb3JlIGJhbmQuXG4gKlxuICogVW5zY29yZWQgY2hhdCBlbmRwb2ludHMgYXJlIHBsYWNlZCBieSB7QGxpbmsgY2xhc3NpZnlCeUZhbWlseX0gYW5kXG4gKiByYW5rZWQgYWZ0ZXIgdGhlIHNjb3JlZCBvbmVzIGluIHRoZWlyIGJhbmQ7IHVucmVjb2duaXplZCwgdW5zY29yZWRcbiAqIGVuZHBvaW50cyAoZS5nLiBjdXN0b20gZXh0ZXJuYWwgbW9kZWxzKSBhcmUgb21pdHRlZCBlbnRpcmVseSBzbyB0aGV5XG4gKiBhcmUgbmV2ZXIgcGlja2VkIGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0LlxuICpcbiAqIFdpdGhpbiBhIGNoYXQgYmFuZCwgc2NvcmVkIG1vZGVscyBzb3J0IGJ5IGBxdWFsaXR5YCBkZXNjLCB0aGVuIGBjb3N0YFxuICogYXNjLCB0aGVuIGBzcGVlZGAgZGVzYywgdGhlbiBwYXJzZWQgbmFtZSB2ZXJzaW9uIGRlc2M7IGZhbWlseS1vbmx5XG4gKiBtb2RlbHMgc29ydCBieSB2ZXJzaW9uIHJhbmsgdGhlbiBwYXJzZWQgdmVyc2lvbi4gVGhlIHZlcnNpb25cbiAqIHRpZS1icmVhayAoe0BsaW5rIHZlcnNpb25UdXBsZX0pIGlzIHdoYXQgc2VwYXJhdGVzIHBvaW50IHJlbGVhc2VzXG4gKiB0aGF0IHNoYXJlIGEgc2NvcmUgcHJvZmlsZSAoZS5nLiBgb3B1cy00LThgIGFoZWFkIG9mIGBvcHVzLTQtN2ApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlFbmRwb2ludHMoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuKTogUmVjb3JkPE1vZGVsQ2xhc3MsIFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICBjb25zdCBjaGF0ID0gZW5kcG9pbnRzLmZpbHRlcigoZSkgPT4gZS50YXNrID09PSBDSEFUX1RBU0spO1xuICBjb25zdCBxdWFsaXRpZXMgPSBjaGF0XG4gICAgLm1hcCgoZSkgPT4gZS5wcm9maWxlPy5xdWFsaXR5KVxuICAgIC5maWx0ZXIoKHEpOiBxIGlzIG51bWJlciA9PiBOdW1iZXIuaXNGaW5pdGUocSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgY29uc3QgbG93ID0gcXVhbnRpbGUocXVhbGl0aWVzLCAxIC8gMyk7XG4gIGNvbnN0IGhpZ2ggPSBxdWFudGlsZShxdWFsaXRpZXMsIDIgLyAzKTtcblxuICBjb25zdCBidWNrZXRzOiBSZWNvcmQ8TW9kZWxDbGFzcywgUmFua2VkW10+ID0ge1xuICAgIFtNb2RlbENsYXNzLkNoYXRUaGlua2luZ106IFtdLFxuICAgIFtNb2RlbENsYXNzLkNoYXRCYWxhbmNlZF06IFtdLFxuICAgIFtNb2RlbENsYXNzLkNoYXRGYXN0XTogW10sXG4gICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogW10sXG4gIH07XG5cbiAgZm9yIChjb25zdCBlcCBvZiBjaGF0KSB7XG4gICAgY29uc3QgcSA9IGVwLnByb2ZpbGU/LnF1YWxpdHk7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShxKSkge1xuICAgICAgY29uc3QgcXVhbGl0eSA9IHEgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgY2xzID1cbiAgICAgICAgcXVhbGl0eSA+PSBoaWdoXG4gICAgICAgICAgPyBNb2RlbENsYXNzLkNoYXRUaGlua2luZ1xuICAgICAgICAgIDogcXVhbGl0eSA8PSBsb3dcbiAgICAgICAgICAgID8gTW9kZWxDbGFzcy5DaGF0RmFzdFxuICAgICAgICAgICAgOiBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZDtcbiAgICAgIGJ1Y2tldHNbY2xzXS5wdXNoKHtcbiAgICAgICAgZXAsXG4gICAgICAgIHNvcnQ6IHF1YWxpdHksXG4gICAgICAgIHNjb3JlZDogdHJ1ZSxcbiAgICAgICAgdGllQ29zdDogZXAucHJvZmlsZT8uY29zdCA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgICAgIHRpZVNwZWVkOiBlcC5wcm9maWxlPy5zcGVlZCA/PyAwLFxuICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uVHVwbGUoZXAubmFtZSksXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBmYW1pbHkgPSBjbGFzc2lmeUJ5RmFtaWx5KGVwLm5hbWUpO1xuICAgIGlmICghZmFtaWx5KSBjb250aW51ZTtcbiAgICBidWNrZXRzW2ZhbWlseS5jbGFzc10ucHVzaCh7XG4gICAgICBlcCxcbiAgICAgIHNvcnQ6IGZhbWlseS5yYW5rLFxuICAgICAgc2NvcmVkOiBmYWxzZSxcbiAgICAgIHRpZUNvc3Q6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgIHRpZVNwZWVkOiAwLFxuICAgICAgdmVyc2lvbjogdmVyc2lvblR1cGxlKGVwLm5hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gRW1iZWRkaW5ncyBhcmUgYnVja2V0ZWQgYnkgdGFzayBpbiBsaXN0aW5nIG9yZGVyIC0gbm8gc2NvcmUgdG8gcmFuay5cbiAgY29uc3QgZW1iZWRkaW5ncyA9IGVuZHBvaW50cy5maWx0ZXIoKGUpID0+IGUudGFzayA9PT0gRU1CRURESU5HX1RBU0spO1xuXG4gIHJldHVybiB7XG4gICAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTogYnVja2V0c1tNb2RlbENsYXNzLkNoYXRUaGlua2luZ10uc29ydChyYW5rT3JkZXIpLm1hcCgoeCkgPT4geC5lcCksXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXTogYnVja2V0c1tNb2RlbENsYXNzLkNoYXRCYWxhbmNlZF0uc29ydChyYW5rT3JkZXIpLm1hcCgoeCkgPT4geC5lcCksXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdEZhc3RdLnNvcnQocmFua09yZGVyKS5tYXAoKHgpID0+IHguZXApLFxuICAgIFtNb2RlbENsYXNzLkVtYmVkZGluZ106IGVtYmVkZGluZ3MsXG4gIH07XG59XG4iXX0=
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3NpZnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xhc3NpZnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBRUgsT0FBTyxFQUdMLFVBQVUsSUFBSSxnQkFBZ0IsR0FHL0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUczQyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztBQUVwQyxnRUFBZ0U7QUFDaEUsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDO0FBRWhDLDBEQUEwRDtBQUMxRCxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztBQUUzQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBWTtJQUNoRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0IsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDaEUsT0FBTyxDQUNMLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQ3BCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFFBQWdDO0lBQ25FLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUM5Riw4RUFBOEU7SUFDOUUsOENBQThDO0lBQzlD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UyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQzlDLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLElBQUksRUFBRSxLQUFLLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUUsQ0FBQztJQUNyQyxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBZUQsU0FBUyxTQUFTLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDckMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsT0FBTztRQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQzFELElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsUUFBUTtRQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQzlELGtFQUFrRTtJQUNsRSwyREFB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QUM7SUFFRCx1RUFBdUU7SUFDdkUsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsQ0FBQztJQUV0RSxPQUFPO1FBQ0wsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVGLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEYsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVTtLQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9kZWwtY2xhc3MgY2xhc3NpZmljYXRpb24gZm9yIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBlbmRwb2ludHMuXG4gKlxuICogQ2hhdCBjYXBhYmlsaXR5IGJhbmRzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGxpdmUgd29ya3NwYWNlIGNhdGFsb2d1ZVxuICogcmF0aGVyIHRoYW4gYSBoYW5kLW1haW50YWluZWQgdGFibGUuIERhdGFicmlja3MgcHVibGlzaGVzXG4gKiBwZXItZW5kcG9pbnQgYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBzY29yZXMgKHRoZSBBSSBQbGF5Z3JvdW5kXG4gKiBiYXJzKSBvbiB0aGUgc2VydmluZyBsaXN0OyB7QGxpbmsgY2xhc3NpZnlFbmRwb2ludHN9IGJ1Y2tldHMgc2NvcmVkXG4gKiBjaGF0IG1vZGVscyBpbnRvIHRoZSBjaGF0IHtAbGluayBNb2RlbENsYXNzfSBiYW5kcyBieSB0aGUgKnJlbGF0aXZlKlxuICogZGlzdHJpYnV0aW9uIG9mIHRob3NlIHNjb3JlcyAocXVhbnRpbGVzLCBub3QgZml4ZWQgY3V0LW9mZnMpIHNvIGFcbiAqIGJyYW5kLW5ldyBtb2RlbCB0aGF0IGxhbmRzIG91dHNpZGUgdG9kYXkncyBzY29yZSByYW5nZSBzdGlsbCBzbG90cyBpblxuICogbmV4dCB0byBpdHMgcGVlcnMuIEVtYmVkZGluZyBlbmRwb2ludHMgKGB0YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCJgKVxuICogYXJlIGJ1Y2tldGVkIGludG8ge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfSBieSB0YXNrLCBpbmRlcGVuZGVudCBvZlxuICogYW55IHNjb3JlLlxuICpcbiAqIFVuc2NvcmVkLWJ1dC1yZWNvZ25pemFibGUgY2hhdCBlbmRwb2ludHMgYXJlIHN0aWxsIHBsYWNlZCBieSBhIHNtYWxsXG4gKiBmYW1pbHkgaGV1cmlzdGljICh7QGxpbmsgY2xhc3NpZnlCeUZhbWlseX0pIHNvIGEgd29ya3NwYWNlIHdob3NlXG4gKiBtb2RlbHMgcHJlZGF0ZSBGb3VuZGF0aW9uIE1vZGVsIEFQSSBzY29yaW5nIGtlZXBzIHdvcmtpbmcuIFRoZVxuICogb2ZmbGluZSBmYWxsYmFjayBmbG9vciAtIHRoZSBoYXJkLWNvZGVkIG1vZGVsIGxpc3QgcmVhY2hlZCBmb3Igd2hlblxuICogdGhlIGxpdmUgY2F0YWxvZ3VlIGNhbid0IGJlIHJlYWQgYXQgYWxsIC0gaXMgYSBzZXJ2ZXIgY29uY2VybiBhbmRcbiAqIGxpdmVzIGluIGBAZGJ4LXRvb2xzL21vZGVsYCwgbm90IGhlcmU6IGEgYnJvd3NlciBjbGllbnQgbmV2ZXIgdGFsa3NcbiAqIHRvIERhdGFicmlja3MgZGlyZWN0bHksIHNvIGl0IGhhcyBub3RoaW5nIHRvIGZhbGwgYmFjayB0by5cbiAqXG4gKiBQdXJlIChubyBOb2RlLW9ubHkgaW1wb3J0cyksIHNvIGEgY2xpZW50IGNhbiBjbGFzc2lmeSBhIGAvbW9kZWxzYFxuICogcmVzcG9uc2Ugd2l0aG91dCBzZXJ2ZXIgZGVwZW5kZW5jaWVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICB0eXBlIEVuZHBvaW50Q2FwYWJpbGl0aWVzLFxuICB0eXBlIEZhbWlseUNsYXNzLFxuICBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NWYWx1ZXMsXG4gIHR5cGUgTW9kZWxDbGFzcyBhcyBNb2RlbENsYXNzVHlwZSxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IE1vZGVsQ2xhc3NUeXBlO1xuY29uc3QgTW9kZWxDbGFzcyA9IE1vZGVsQ2xhc3NWYWx1ZXM7XG5cbi8qKiBUYXNrIGhpbnQgRGF0YWJyaWNrcyBzdGFtcHMgb24gY2hhdCBjb21wbGV0aW9uIGVuZHBvaW50cy4gKi9cbmNvbnN0IENIQVRfVEFTSyA9IFwibGxtL3YxL2NoYXRcIjtcblxuLyoqIFRhc2sgaGludCBEYXRhYnJpY2tzIHN0YW1wcyBvbiBlbWJlZGRpbmcgZW5kcG9pbnRzLiAqL1xuY29uc3QgRU1CRURESU5HX1RBU0sgPSBcImxsbS92MS9lbWJlZGRpbmdzXCI7XG5cbi8qKlxuICogUHJvdmlkZXIgZmFtaWxpZXMgdmVyaWZpZWQgYWdhaW5zdCBEYXRhYnJpY2tzIFJlc3BvbnNlcy9PcGVuIFJlc3BvbnNlcyB3aXRoXG4gKiBib3RoIGEgZm9yY2VkIGZ1bmN0aW9uIGNhbGwgYW5kIGEgc3RhdGVsZXNzIGBmdW5jdGlvbl9jYWxsX291dHB1dGAgcmVwbGF5LlxuICpcbiAqIERhdGFicmlja3MnIGVuZHBvaW50IGxpc3QvT3BlbkFQSSBjdXJyZW50bHkgZXhwb3NlcyBubyB0b29scyBjYXBhYmlsaXR5IGJpdC5cbiAqIEtlZXAgdGhpcyBjb25zZXJ2YXRpdmU6IGFuIHVua25vd24gY2hhdCBmYW1pbHkgaXMgbm90IGFnZW50LXNhZmUgdW50aWwgaXQgaXNcbiAqIHZlcmlmaWVkLiBHZW1pbmkgaXMgZXhjbHVkZWQgYmVjYXVzZSBpdCBlbWl0cyBhIGNhbGwgYnV0IE9wZW4gUmVzcG9uc2VzXG4gKiBjYW5ub3QgcmVwbGF5IHRoZSByZXF1aXJlZCB0aG91Z2h0IHNpZ25hdHVyZTsgR1BULU9TUyByZWplY3RzIFJlc3BvbnNlc1xuICogcGFzc3Rocm91Z2ggZW50aXJlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Rvb2xzQnlGYW1pbHkobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG4gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChuLmluY2x1ZGVzKFwiZ2VtaW5pXCIpIHx8IG4uaW5jbHVkZXMoXCJncHQtb3NzXCIpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoXG4gICAgbi5pbmNsdWRlcyhcImNsYXVkZVwiKSB8fFxuICAgIG4uaW5jbHVkZXMoXCJncHRcIikgfHxcbiAgICBuLmluY2x1ZGVzKFwicXdlblwiKSB8fFxuICAgIG4uaW5jbHVkZXMoXCJnbG1cIikgfHxcbiAgICBuLmluY2x1ZGVzKFwibGxhbWFcIilcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYW4gZW5kcG9pbnQncyBjYXBhYmlsaXRpZXMgZnJvbSBpdHMgRGF0YWJyaWNrcyB0YXNrIGhpbnQgYW5kIGl0c1xuICogY2xhc3NpZmllZCB7QGxpbmsgTW9kZWxDbGFzc30sIHNvIGNvbnN1bWVycyBmaWx0ZXIgb24gY2FwYWJpbGl0eSBpbnN0ZWFkIG9mXG4gKiByZS1kZXJpdmluZyBpdCBmcm9tIHJhdyBgdGFza2AgLyBgY2xhc3NgIHN0cmluZ3MuXG4gKlxuICogRWl0aGVyIHNpZ25hbCBhbG9uZSBpcyBlbm91Z2g6IHRoZSB0YXNrIGhpbnQgaXMgYXV0aG9yaXRhdGl2ZSB3aGVuIHByZXNlbnQsXG4gKiBhbmQgdGhlIGNsYXNzIGNvdmVycyBlbmRwb2ludHMgRGF0YWJyaWNrcyBsZWZ0IHVudGFza2VkIGJ1dCB0aGUgY2xhc3NpZmllclxuICogcmVjb2duaXplZC4gRW1iZWRkaW5nIHdpbnMgb3ZlciBjaGF0IHdoZW4gYm90aCBwb2ludCBhdCBpdCwgc2luY2UgdGhlIHR3byBhcmVcbiAqIG5vdCBpbnRlcmNoYW5nZWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IEVuZHBvaW50Q2FwYWJpbGl0aWVzIHtcbiAgY29uc3QgZW1iZWRkaW5nID0gZW5kcG9pbnQudGFzayA9PT0gRU1CRURESU5HX1RBU0sgfHwgZW5kcG9pbnQuY2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nO1xuICAvLyBFdmVyeSBub24tZW1iZWRkaW5nIGNsYXNzIGlzIGEgY2hhdCBiYW5kLCBzbyBcImNsYXNzaWZpZWQgYnV0IG5vdCBlbWJlZGRpbmdcIlxuICAvLyBpcyB0aGUgY2xhc3Mtc2lkZSB0ZXN0IGZvciBjaGF0IGNhcGFiaWxpdHkuXG4gIGNvbnN0IGNoYXQgPSAhZW1iZWRkaW5nICYmIChlbmRwb2ludC50YXNrID09PSBDSEFUX1RBU0sgfHwgZW5kcG9pbnQuY2xhc3MgIT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHRvb2xzID0gY2hhdCAmJiAoZW5kcG9pbnQuc3VwcG9ydHNUb29scyA/PyBzdXBwb3J0c1Rvb2xzQnlGYW1pbHkoZW5kcG9pbnQubmFtZSkpO1xuICByZXR1cm4geyBjaGF0LCBlbWJlZGRpbmcsIHRvb2xzIH07XG59XG5cbi8qKlxuICogTnVtZXJpYyBgW21ham9yLCBtaW5vciwgcGF0Y2hdYCB2ZXJzaW9uIHBhcnNlZCBmcm9tIGFuIGVuZHBvaW50XG4gKiBuYW1lLCB1c2VkIHRvIG9yZGVyIHNpYmxpbmdzIHdpdGhpbiBhIGZhbWlseS90aWVyLiBTdGFydHMgYXQgdGhlXG4gKiBmaXJzdCBkaWdpdCBpbiB0aGUgbmFtZSwgdGhlbiByZWFkcyBzdWNjZXNzaXZlIHNlcGFyYXRvci1kZWxpbWl0ZWQsXG4gKiBkaWdpdC1wcmVmaXhlZCBjaHVua3MgYXMgdGhlIHRocmVlIGNvbXBvbmVudHMgKG1pc3Npbmcgb25lcyBkZWZhdWx0XG4gKiB0byBgMGApOlxuICpcbiAqICAgLSBgZGF0YWJyaWNrcy1jbGF1ZGUtb3B1cy00LThgICAgLT4gYFs0LCA4LCAwXWBcbiAqICAgLSBgZGF0YWJyaWNrcy1jbGF1ZGUtb3B1cy00LTEwYCAgLT4gYFs0LCAxMCwgMF1gIChzb3J0cyBhYm92ZSA0LTgpXG4gKiAgIC0gYGRhdGFicmlja3MtbWV0YS1sbGFtYS0zLTMtNzBiYC0+IGBbMywgMywgNzBdYFxuICogICAtIGBkYXRhYnJpY2tzLWJnZS1sYXJnZS1lbmAgICAgICAtPiBgWzAsIDAsIDBdYCAobm8gZGlnaXRzKVxuICpcbiAqIENvbXBvbmVudC13aXNlIGNvbXBhcmlzb24gKG5vdCBhIGRlY2ltYWwgY29sbGFwc2UpIHNvIGA0LjEwYCBiZWF0c1xuICogYDQuOGAgLSB0aGUgYnVnIGEgYG1ham9yICsgbWlub3IvMTBgIHNjb3JlIHdvdWxkIGhpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25UdXBsZShuYW1lOiBzdHJpbmcpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBzdGFydCA9IG5hbWUuc2VhcmNoKC9cXGQvKTtcbiAgaWYgKHN0YXJ0IDwgMCkgcmV0dXJuIFswLCAwLCAwXTtcbiAgY29uc3QgbnVtcyA9IG5hbWVcbiAgICAuc2xpY2Uoc3RhcnQpXG4gICAgLnNwbGl0KC9bXmEtejAtOV0rL2kpXG4gICAgLm1hcCgoY2h1bmspID0+IGNodW5rLm1hdGNoKC9eXFxkKy8pPy5bMF0pXG4gICAgLmZpbHRlcigoZGlnaXRzKTogZGlnaXRzIGlzIHN0cmluZyA9PiBkaWdpdHMgIT09IHVuZGVmaW5lZClcbiAgICAubWFwKE51bWJlcik7XG4gIHJldHVybiBbbnVtc1swXSA/PyAwLCBudW1zWzFdID8/IDAsIG51bXNbMl0gPz8gMF07XG59XG5cbi8qKlxuICogQ29tcGFyZSB2ZXJzaW9uIHR1cGxlcyBjb21wb25lbnQtd2lzZSB3aXRoIG1pc3NpbmcgcGFydHMgYXMgMC5cbiAqIFBvc2l0aXZlIHdoZW4gYGxlZnRgIGlzIG5ld2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVZlcnNpb25UdXBsZXMobGVmdDogcmVhZG9ubHkgbnVtYmVyW10sIHJpZ2h0OiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlciB7XG4gIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgsIDMpO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgZGlmZiA9IChsZWZ0W2luZGV4XSA/PyAwKSAtIChyaWdodFtpbmRleF0gPz8gMCk7XG4gICAgaWYgKGRpZmYgIT09IDApIHJldHVybiBkaWZmO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vKiogQ29tcGFyZSB0d28gdmVyc2lvbiB0dXBsZXMgc28gdGhlIGhpZ2hlciB2ZXJzaW9uIHNvcnRzIGZpcnN0IChkZXNjZW5kaW5nKS4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uRGVzYyhhOiByZWFkb25seSBudW1iZXJbXSwgYjogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXIge1xuICByZXR1cm4gY29tcGFyZVZlcnNpb25UdXBsZXMoYiwgYSk7XG59XG5cbi8qKlxuICogTW9ub3RvbmljIHZlcnNpb24ga2V5IGZvciBvcmRlcmluZyBzaWJsaW5ncyB3aXRoaW4gYSBmYW1pbHkvdGllclxuICogKGUuZy4gYG9wdXMtNC04YCBvdmVyIGBvcHVzLTQtN2ApLiBFbmNvZGVzIHRoZSB7QGxpbmsgdmVyc2lvblR1cGxlfVxuICogYXMgYSBzaW5nbGUgbnVtYmVyIHNvIGNhbGxlcnMgdGhhdCBuZWVkIGEgc2NhbGFyIHJhbmsgKHRoZSBmYW1pbHlcbiAqIGhldXJpc3RpYywgdGhlIHN0YXRpYyBmYWxsYmFjayBvcmRlcmluZykga2VlcCB3b3JraW5nOyB0aGUgZW5jb2RpbmdcbiAqIHByZXNlcnZlcyBjb21wb25lbnQgb3JkZXIgd2l0aG91dCB0aGUgZGVjaW1hbC1jb2xsYXBzZSBidWcuXG4gKi9cbmZ1bmN0aW9uIHZlcnNpb25TY29yZShuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSB2ZXJzaW9uVHVwbGUobmFtZSk7XG4gIHJldHVybiBtYWpvciAqIDFfMDAwXzAwMCArIG1pbm9yICogMV8wMDAgKyBwYXRjaDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBjaGF0IGNhcGFiaWxpdHkgYmFuZCBmb3IgYW4gZW5kcG9pbnQgd2UgaGF2ZSBubyBsaXZlXG4gKiBzY29yZSBmb3IsIGtleWVkIG9mZiBwcm92aWRlciBmYW1pbHkgYW5kIHRoZSB3ZWxsLWtub3duIHZhcmlhbnQgd29yZHNcbiAqIGluIHRoZSBuYW1lIChgb3B1c2AvYHNvbm5ldGAvYGhhaWt1YCwgYHByb2AvYG1pbmlgL2BuYW5vYCxcbiAqIGBmbGFzaGAvYGZsYXNoLWxpdGVgLCBMbGFtYSBwYXJhbWV0ZXIgc2l6ZXMsIGV0YykuIFJldHVybnMgYG51bGxgIGZvclxuICogbmFtZXMgd2UgZG9uJ3QgcmVjb2duaXplIHNvIHVua25vd24gY3VzdG9tIGVuZHBvaW50cyBhcmUgbmV2ZXJcbiAqIGF1dG8tc2VsZWN0ZWQgYXMgYSBkZWZhdWx0LiBUaGUgYWNjb21wYW55aW5nIGByYW5rYCBvcmRlcnMgc2libGluZ3NcbiAqIHdpdGhpbiBhIGNsYXNzLiBPbmx5IGV2ZXIgcmV0dXJucyBhIGNoYXQgYmFuZCAtIGVtYmVkZGluZyBlbmRwb2ludHNcbiAqIGFyZSBjbGFzc2lmaWVkIGJ5IHRhc2ssIG5vdCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlCeUZhbWlseShuYW1lOiBzdHJpbmcpOiBGYW1pbHlDbGFzcyB8IG51bGwge1xuICBjb25zdCBuID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBhdCA9IChjbHM6IE1vZGVsQ2xhc3MpOiBGYW1pbHlDbGFzcyA9PiAoeyBjbGFzczogY2xzLCByYW5rOiB2ZXJzaW9uU2NvcmUobikgfSk7XG5cbiAgLy8gQW50aHJvcGljIENsYXVkZVxuICBpZiAobi5pbmNsdWRlcyhcIm9wdXNcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gIGlmIChuLmluY2x1ZGVzKFwic29ubmV0XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICBpZiAobi5pbmNsdWRlcyhcImhhaWt1XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG5cbiAgLy8gT3BlbkFJIG9wZW4td2VpZ2h0cyAoY2hlY2sgYmVmb3JlIHRoZSBnZW5lcmljIGdwdCBicmFuY2gpXG4gIGlmIChuLmluY2x1ZGVzKFwiZ3B0LW9zc1wiKSkge1xuICAgIHJldHVybiBhdChuLmluY2x1ZGVzKFwiMTIwYlwiKSA/IE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkIDogTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gIH1cbiAgLy8gT3BlbkFJIEdQVCBmYW1pbHlcbiAgaWYgKG4uaW5jbHVkZXMoXCJncHRcIikpIHtcbiAgICBpZiAobi5pbmNsdWRlcyhcInByb1wiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIm1pbmlcIikgfHwgbi5pbmNsdWRlcyhcIm5hbm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRGYXN0KTtcbiAgICByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICB9XG5cbiAgLy8gR29vZ2xlIEdlbWluaSAvIEdlbW1hXG4gIGlmIChuLmluY2x1ZGVzKFwiZ2VtaW5pXCIpKSB7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJmbGFzaC1saXRlXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJwcm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gICAgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgfVxuICBpZiAobi5pbmNsdWRlcyhcImdlbW1hXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG5cbiAgLy8gTWV0YSBMbGFtYVxuICBpZiAobi5pbmNsdWRlcyhcImxsYW1hXCIpKSB7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJtYXZlcmlja1wiKSB8fCBuLmluY2x1ZGVzKFwiNDA1YlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIjcwYlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIjhiXCIpIHx8IG4uaW5jbHVkZXMoXCIxYlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICAgIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCk7XG4gIH1cblxuICAvLyBBbGliYWJhIFF3ZW5cbiAgaWYgKG4uaW5jbHVkZXMoXCJxd2VuXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogTGluZWFyLWludGVycG9sYXRlZCBxdWFudGlsZSBvZiBhbiBhc2NlbmRpbmctc29ydGVkIG51bWVyaWMgYXJyYXkuICovXG5mdW5jdGlvbiBxdWFudGlsZShzb3J0ZWRBc2M6IHJlYWRvbmx5IG51bWJlcltdLCBwOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoc29ydGVkQXNjLmxlbmd0aCA9PT0gMCkgcmV0dXJuIE51bWJlci5OYU47XG4gIGNvbnN0IGlkeCA9IChzb3J0ZWRBc2MubGVuZ3RoIC0gMSkgKiBwO1xuICBjb25zdCBsbyA9IE1hdGguZmxvb3IoaWR4KTtcbiAgY29uc3QgaGkgPSBNYXRoLmNlaWwoaWR4KTtcbiAgaWYgKGxvID09PSBoaSkgcmV0dXJuIHNvcnRlZEFzY1tsb10hO1xuICByZXR1cm4gc29ydGVkQXNjW2xvXSEgKyAoc29ydGVkQXNjW2hpXSEgLSBzb3J0ZWRBc2NbbG9dISkgKiAoaWR4IC0gbG8pO1xufVxuXG4vKiogSW50ZXJuYWwgc29ydGFibGUgd3JhcHBlciBjYXJyeWluZyB0aGUgb3JkZXJpbmcga2V5cyBmb3IgYSBidWNrZXQgZW50cnkuICovXG5pbnRlcmZhY2UgUmFua2VkIHtcbiAgZXA6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnk7XG4gIC8qKiBRdWFsaXR5IChzY29yZWQpIG9yIGZhbWlseSB2ZXJzaW9uICh1bnNjb3JlZCkgLSBoaWdoZXIgZmlyc3QuICovXG4gIHNvcnQ6IG51bWJlcjtcbiAgLyoqIFNjb3JlZCBlbmRwb2ludHMgcmFuayBhaGVhZCBvZiBmYW1pbHktb25seSBndWVzc2VzLiAqL1xuICBzY29yZWQ6IGJvb2xlYW47XG4gIHRpZUNvc3Q6IG51bWJlcjtcbiAgdGllU3BlZWQ6IG51bWJlcjtcbiAgLyoqIFBhcnNlZCBuYW1lIHZlcnNpb24sIHRoZSBmaW5hbCB0aWUtYnJlYWtlciAobmV3ZXIgc2libGluZyBmaXJzdCkuICovXG4gIHZlcnNpb246IHJlYWRvbmx5IG51bWJlcltdO1xufVxuXG5mdW5jdGlvbiByYW5rT3JkZXIoYTogUmFua2VkLCBiOiBSYW5rZWQpOiBudW1iZXIge1xuICBpZiAoYS5zY29yZWQgIT09IGIuc2NvcmVkKSByZXR1cm4gYS5zY29yZWQgPyAtMSA6IDE7XG4gIGlmIChiLnNvcnQgIT09IGEuc29ydCkgcmV0dXJuIGIuc29ydCAtIGEuc29ydDtcbiAgaWYgKGEudGllQ29zdCAhPT0gYi50aWVDb3N0KSByZXR1cm4gYS50aWVDb3N0IC0gYi50aWVDb3N0O1xuICBpZiAoYi50aWVTcGVlZCAhPT0gYS50aWVTcGVlZCkgcmV0dXJuIGIudGllU3BlZWQgLSBhLnRpZVNwZWVkO1xuICAvLyBTYW1lIHNjb3JlZC1uZXNzLCBxdWFsaXR5LCBjb3N0LCBhbmQgc3BlZWQgKGUuZy4gc2V2ZXJhbCBDbGF1ZGVcbiAgLy8gT3B1cyBwb2ludCByZWxlYXNlcyk6IHByZWZlciB0aGUgbmV3ZXIgcGFyc2VkIHZlcnNpb24gc29cbiAgLy8gYG9wdXMtNC04YCBiZWF0cyBgb3B1cy00LTdgLlxuICByZXR1cm4gY29tcGFyZVZlcnNpb25EZXNjKGEudmVyc2lvbiwgYi52ZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBCdWNrZXQgbGl2ZSBlbmRwb2ludHMgaW50byB7QGxpbmsgTW9kZWxDbGFzc31lcywgcmFua2VkIGJlc3QtZmlyc3RcbiAqIHdpdGhpbiBlYWNoIGNoYXQgYmFuZC5cbiAqXG4gKiBFbWJlZGRpbmcgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiYCkgZ28gaW50b1xuICoge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfSBieSB0YXNrLCBpbiBsaXN0aW5nIG9yZGVyICh0aGV5IGNhcnJ5IG5vXG4gKiBjYXBhYmlsaXR5IHNjb3JlIHRvIHJhbmsgb24pLlxuICpcbiAqIENoYXQgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvY2hhdFwiYCkgc3BsaXQgaW50byB0aGUgdGhyZWUgY2hhdFxuICogYmFuZHMuIFNjb3JlZCBlbmRwb2ludHMgKHRob3NlIGNhcnJ5aW5nIGEgYHByb2ZpbGUucXVhbGl0eWApIGRyaXZlXG4gKiB0aGUgYmFuZGluZzogdGhlIG9ic2VydmVkIHF1YWxpdHkgZGlzdHJpYnV0aW9uIGlzIHNwbGl0IGF0IGl0cyAxLzNcbiAqIGFuZCAyLzMgcXVhbnRpbGVzLCBzbyB0aGUgdG9wIHRoaXJkIGlzIHtAbGluayBNb2RlbENsYXNzLkNoYXRUaGlua2luZ30sXG4gKiB0aGUgYm90dG9tIHRoaXJkIHtAbGluayBNb2RlbENsYXNzLkNoYXRGYXN0fSwgYW5kIHRoZSBtaWRkbGVcbiAqIHtAbGluayBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZH0uIEJlY2F1c2UgdGhlIHRocmVzaG9sZHMgY29tZSBmcm9tIHRoZVxuICogZGF0YSwgdGhlIHNwbGl0IGFkYXB0cyBhcyBEYXRhYnJpY2tzIGFkZHMgb3IgcmVzY29yZXMgbW9kZWxzIC1cbiAqIG5vdGhpbmcgaXMgcGlubmVkIHRvIGEgZml4ZWQgc2NvcmUgYmFuZC5cbiAqXG4gKiBVbnNjb3JlZCBjaGF0IGVuZHBvaW50cyBhcmUgcGxhY2VkIGJ5IHtAbGluayBjbGFzc2lmeUJ5RmFtaWx5fSBhbmRcbiAqIHJhbmtlZCBhZnRlciB0aGUgc2NvcmVkIG9uZXMgaW4gdGhlaXIgYmFuZDsgdW5yZWNvZ25pemVkLCB1bnNjb3JlZFxuICogZW5kcG9pbnRzIChlLmcuIGN1c3RvbSBleHRlcm5hbCBtb2RlbHMpIGFyZSBvbWl0dGVkIGVudGlyZWx5IHNvIHRoZXlcbiAqIGFyZSBuZXZlciBwaWNrZWQgYXMgYW4gYXV0b21hdGljIGRlZmF1bHQuXG4gKlxuICogV2l0aGluIGEgY2hhdCBiYW5kLCBzY29yZWQgbW9kZWxzIHNvcnQgYnkgYHF1YWxpdHlgIGRlc2MsIHRoZW4gYGNvc3RgXG4gKiBhc2MsIHRoZW4gYHNwZWVkYCBkZXNjLCB0aGVuIHBhcnNlZCBuYW1lIHZlcnNpb24gZGVzYzsgZmFtaWx5LW9ubHlcbiAqIG1vZGVscyBzb3J0IGJ5IHZlcnNpb24gcmFuayB0aGVuIHBhcnNlZCB2ZXJzaW9uLiBUaGUgdmVyc2lvblxuICogdGllLWJyZWFrICh7QGxpbmsgdmVyc2lvblR1cGxlfSkgaXMgd2hhdCBzZXBhcmF0ZXMgcG9pbnQgcmVsZWFzZXNcbiAqIHRoYXQgc2hhcmUgYSBzY29yZSBwcm9maWxlIChlLmcuIGBvcHVzLTQtOGAgYWhlYWQgb2YgYG9wdXMtNC03YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUVuZHBvaW50cyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBSZWNvcmQ8TW9kZWxDbGFzcywgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IGNoYXQgPSBlbmRwb2ludHMuZmlsdGVyKChlKSA9PiBlLnRhc2sgPT09IENIQVRfVEFTSyk7XG4gIGNvbnN0IHF1YWxpdGllcyA9IGNoYXRcbiAgICAubWFwKChlKSA9PiBlLnByb2ZpbGU/LnF1YWxpdHkpXG4gICAgLmZpbHRlcigocSk6IHEgaXMgbnVtYmVyID0+IE51bWJlci5pc0Zpbml0ZShxKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICBjb25zdCBsb3cgPSBxdWFudGlsZShxdWFsaXRpZXMsIDEgLyAzKTtcbiAgY29uc3QgaGlnaCA9IHF1YW50aWxlKHF1YWxpdGllcywgMiAvIDMpO1xuXG4gIGNvbnN0IGJ1Y2tldHM6IFJlY29yZDxNb2RlbENsYXNzLCBSYW5rZWRbXT4gPSB7XG4gICAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTogW10sXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXTogW10sXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOiBbXSxcbiAgICBbTW9kZWxDbGFzcy5FbWJlZGRpbmddOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IGVwIG9mIGNoYXQpIHtcbiAgICBjb25zdCBxID0gZXAucHJvZmlsZT8ucXVhbGl0eTtcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHEpKSB7XG4gICAgICBjb25zdCBxdWFsaXR5ID0gcSBhcyBudW1iZXI7XG4gICAgICBjb25zdCBjbHMgPVxuICAgICAgICBxdWFsaXR5ID49IGhpZ2hcbiAgICAgICAgICA/IE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXG4gICAgICAgICAgOiBxdWFsaXR5IDw9IGxvd1xuICAgICAgICAgICAgPyBNb2RlbENsYXNzLkNoYXRGYXN0XG4gICAgICAgICAgICA6IE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkO1xuICAgICAgYnVja2V0c1tjbHNdLnB1c2goe1xuICAgICAgICBlcCxcbiAgICAgICAgc29ydDogcXVhbGl0eSxcbiAgICAgICAgc2NvcmVkOiB0cnVlLFxuICAgICAgICB0aWVDb3N0OiBlcC5wcm9maWxlPy5jb3N0ID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgdGllU3BlZWQ6IGVwLnByb2ZpbGU/LnNwZWVkID8/IDAsXG4gICAgICAgIHZlcnNpb246IHZlcnNpb25UdXBsZShlcC5uYW1lKSxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGZhbWlseSA9IGNsYXNzaWZ5QnlGYW1pbHkoZXAubmFtZSk7XG4gICAgaWYgKCFmYW1pbHkpIGNvbnRpbnVlO1xuICAgIGJ1Y2tldHNbZmFtaWx5LmNsYXNzXS5wdXNoKHtcbiAgICAgIGVwLFxuICAgICAgc29ydDogZmFtaWx5LnJhbmssXG4gICAgICBzY29yZWQ6IGZhbHNlLFxuICAgICAgdGllQ29zdDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgdGllU3BlZWQ6IDAsXG4gICAgICB2ZXJzaW9uOiB2ZXJzaW9uVHVwbGUoZXAubmFtZSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBFbWJlZGRpbmdzIGFyZSBidWNrZXRlZCBieSB0YXNrIGluIGxpc3Rpbmcgb3JkZXIgLSBubyBzY29yZSB0byByYW5rLlxuICBjb25zdCBlbWJlZGRpbmdzID0gZW5kcG9pbnRzLmZpbHRlcigoZSkgPT4gZS50YXNrID09PSBFTUJFRERJTkdfVEFTSyk7XG5cbiAgcmV0dXJuIHtcbiAgICBbTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmddOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXS5zb3J0KHJhbmtPcmRlcikubWFwKCh4KSA9PiB4LmVwKSxcbiAgICBbTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWRdOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXS5zb3J0KHJhbmtPcmRlcikubWFwKCh4KSA9PiB4LmVwKSxcbiAgICBbTW9kZWxDbGFzcy5DaGF0RmFzdF06IGJ1Y2tldHNbTW9kZWxDbGFzcy5DaGF0RmFzdF0uc29ydChyYW5rT3JkZXIpLm1hcCgoeCkgPT4geC5lcCksXG4gICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogZW1iZWRkaW5ncyxcbiAgfTtcbn1cbiJdfQ==
@@ -18,16 +18,13 @@ import * as environmentUtils from "@dbx-tools/shared-core/environment-utils";
18
18
  import * as log from "@dbx-tools/shared-core/log";
19
19
  import cacache from "cacache";
20
20
  import envPaths from "env-paths";
21
+ import packageManifest from "../package.json" with { type: "json" };
21
22
  import { MODEL_METADATA_TTL_MS } from "./_metadata-contract.js";
22
23
  const logger = log.logger("model/metadata-cache");
23
- let packageIdentityPromise;
24
- function packageIdentity() {
25
- packageIdentityPromise ??= import("../index.js").then((mod) => ({
26
- identifier: mod.PACKAGE_IDENTIFIER,
27
- version: mod.PACKAGE_VERSION,
28
- }));
29
- return packageIdentityPromise;
30
- }
24
+ const PACKAGE_IDENTITY = {
25
+ identifier: packageManifest.name,
26
+ version: packageManifest.version,
27
+ };
31
28
  const inflight = new Map();
32
29
  /** Default cacache root for a package version under the dbx-tools cache dir. */
33
30
  export function defaultMetadataCacheDir(version) {
@@ -164,7 +161,7 @@ export function createMetadataCache(options) {
164
161
  async function resolveCacheDir(options) {
165
162
  if (options.cacheDir)
166
163
  return options.cacheDir;
167
- const version = options.version ?? (await packageIdentity()).version;
164
+ const version = options.version ?? PACKAGE_IDENTITY.version;
168
165
  return defaultMetadataCacheDir(version);
169
166
  }
170
167
  /** Prefer a non-empty fresh array, else previous, else fallback. */
@@ -231,4 +228,4 @@ function isCacheMiss(error) {
231
228
  "code" in error &&
232
229
  error.code === "ENOENT");
233
230
  }
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSwwQ0FBMEMsQ0FBQztBQUM3RSxPQUFPLEtBQUssR0FBRyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xELE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBT2xELElBQUksc0JBQTRELENBQUM7QUFFakUsU0FBUyxlQUFlO0lBQ3RCLHNCQUFzQixLQUFLLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsVUFBVSxFQUFFLEdBQUcsQ0FBQyxrQkFBa0I7UUFDbEMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxlQUFlO0tBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ0osT0FBTyxzQkFBc0IsQ0FBQztBQUNoQyxDQUFDO0FBMERELE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO0FBRXJELGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsdUJBQXVCLENBQUMsT0FBZTtJQUNyRCxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ25FLE9BQU8sT0FBTyxDQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFD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QU8sQ0FBQyxDQUFDO0lBQzNCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBSSxJQUFZO0lBQ25DLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBWSxDQUFDO1FBQzVELElBQ0UsQ0FBQyxNQUFNO1lBQ1AsT0FBTyxNQUFNLEtBQUssUUFBUTtZQUMxQixPQUFRLE1BQWlDLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFDbEUsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLE1BQWdDLENBQUM7SUFDMUMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYztJQUNqQyxPQUFPLE9BQU8sQ0FDWixLQUFLO1FBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixNQUFNLElBQUksS0FBSztRQUNkLEtBQTJCLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FDL0MsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnbm9zdGljIGRhaWx5IG1ldGFkYXRhIGNhY2hlIG9uIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9jYWNhY2hlIHwgY2FjYWNoZX0uXG4gKlxuICogVXNlcyBjYWNhY2hlJ3MgYnVpbHQtaW4gbWVtb3J5IG1lbW9pemF0aW9uIChgbWVtb2l6ZTogdHJ1ZWAgb24gcHV0OyBnZXRzIHJlYWRcbiAqIHRoZSBpbi1tZW1vcnkgbGF5ZXIgYnkgZGVmYXVsdCkgd2l0aCBjb250ZW50LWFkZHJlc3NlZCBkaXNrIHVuZGVyXG4gKiBgZW52LXBhdGhzKFwiZGJ4LXRvb2xzXCIpLmNhY2hlL21vZGVsLWdhdGV3YXkvPHZlcnNpb24+L2AuIERpc2sgcGVyc2lzdGVuY2UgaXNcbiAqIGRpc2FibGVkIGluc2lkZSBhIERhdGFicmlja3MgQXBwICh7QGxpbmsgZW52aXJvbm1lbnRVdGlscy5pc0RhdGFicmlja3NBcHBFbnZ9KTtcbiAqIHRob3NlIHByb2Nlc3NlcyBrZWVwIGEgcHJvY2Vzcy1sb2NhbCBNYXAgb25seS5cbiAqXG4gKiBFYWNoIGNhY2hlIG93bnMgYSBrZXksIGhhcmQtY29kZWQgZmFsbGJhY2ssIG9wdGlvbmFsIG5ldHdvcmsgbG9hZGVyLCBhbmQgYVxuICogbWVyZ2VyIHRoYXQgY29tYmluZXMgZnJlc2ggLyBwcmV2aW91cyAvIGZhbGxiYWNrIHZhbHVlcy4gRnJlc2huZXNzIGlzIHRoZVxuICogZW52ZWxvcGUgYHJlZnJlc2hlZEF0YCB3aW5kb3cgKGRlZmF1bHQgb25lIGRheSksIG5vdCBjYWNhY2hlJ3Mgc2hvcnQgTFJVIFRUTC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0ICogYXMgZW52aXJvbm1lbnRVdGlscyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9lbnZpcm9ubWVudC11dGlsc1wiO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2xvZ1wiO1xuaW1wb3J0IGNhY2FjaGUgZnJvbSBcImNhY2FjaGVcIjtcbmltcG9ydCBlbnZQYXRocyBmcm9tIFwiZW52LXBhdGhzXCI7XG5cbmltcG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUyB9IGZyb20gXCIuL19tZXRhZGF0YS1jb250cmFjdC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibW9kZWwvbWV0YWRhdGEtY2FjaGVcIik7XG5cbmludGVyZmFjZSBQYWNrYWdlSWRlbnRpdHkge1xuICByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxubGV0IHBhY2thZ2VJZGVudGl0eVByb21pc2U6IFByb21pc2U8UGFja2FnZUlkZW50aXR5PiB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGFja2FnZUlkZW50aXR5KCk6IFByb21pc2U8UGFja2FnZUlkZW50aXR5PiB7XG4gIHBhY2thZ2VJZGVudGl0eVByb21pc2UgPz89IGltcG9ydChcIi4uL2luZGV4LnRzXCIpLnRoZW4oKG1vZCkgPT4gKHtcbiAgICBpZGVudGlmaWVyOiBtb2QuUEFDS0FHRV9JREVOVElGSUVSLFxuICAgIHZlcnNpb246IG1vZC5QQUNLQUdFX1ZFUlNJT04sXG4gIH0pKTtcbiAgcmV0dXJuIHBhY2thZ2VJZGVudGl0eVByb21pc2U7XG59XG5cbi8qKiBFbnZlbG9wZSBzdG9yZWQgYXMgSlNPTiBieXRlcyBpbiBjYWNhY2hlIGZvciBldmVyeSBrZXkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4ge1xuICByZWFkb25seSByZWZyZXNoZWRBdDogbnVtYmVyO1xuICByZWFkb25seSB2YWx1ZTogVDtcbn1cblxuLyoqIEZhY3RvcnkgaW5wdXRzIGZvciBvbmUgbmFtZWQgbWV0YWRhdGEgY2FjaGUuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhQ2FjaGVPcHRpb25zPFQ+IHtcbiAgLyoqIFN0YWJsZSBjYWNhY2hlIGtleS4gKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIC8qKiBIYXJkLWNvZGVkIC8gY29tbWl0dGVkIGJhc2VsaW5lIHVzZWQgd2hlbiBzdG9yZSBhbmQgbG9hZCBib3RoIG1pc3MuICovXG4gIHJlYWRvbmx5IGZhbGxiYWNrOiBUO1xuICAvKipcbiAgICogUmVmcmVzaCBzb3VyY2UuIFdoZW4gb21pdHRlZCB0aGUgY2FjaGUgb25seSBzZXJ2ZXMgc3RvcmUgKyBmYWxsYmFjayBhbmRcbiAgICoge0BsaW5rIE1ldGFkYXRhQ2FjaGUudXBkYXRlfSBtdXRhdGlvbnMgKGZvciBleGFtcGxlIGVycm9yLWxlYXJuZWQgdmFsdWVzKS5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWQ/OiAoKSA9PiBQcm9taXNlPFQ+O1xuICAvKiogQ29tYmluZSBhIGZyZXNoIGxvYWQsIHByaW9yIHN0b3JlIHZhbHVlLCBhbmQgdGhlIGhhcmQtY29kZWQgZmFsbGJhY2suICovXG4gIHJlYWRvbmx5IG1lcmdlOiAoaW5wdXQ6IE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PFQ+KSA9PiBUO1xuICAvKiogRnJlc2huZXNzIHdpbmRvdzsgZGVmYXVsdHMgdG8ge0BsaW5rIE1PREVMX01FVEFEQVRBX1RUTF9NU30gKG9uZSBkYXkpLiAqL1xuICByZWFkb25seSB0dGxNcz86IG51bWJlcjtcbiAgLyoqIFBhY2thZ2UgdmVyc2lvbiBzZWdtZW50IGluIHRoZSBjYWNoZSBwYXRoLiBEZWZhdWx0cyB0byB0aGlzIHBhY2thZ2UuICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKiBPdmVycmlkZSB0aGUgY2FjYWNoZSByb290IGRpcmVjdG9yeSAodGVzdHMpLiAqL1xuICByZWFkb25seSBjYWNoZURpcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEZvcmNlIGRpc2sgb24vb2ZmLiBEZWZhdWx0cyB0byBvZmYgaW5zaWRlIERhdGFicmlja3MgQXBwcywgb24gb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzaz86IGJvb2xlYW47XG4gIC8qKiBDbG9jayBvdmVycmlkZSBmb3IgdGVzdHMuICovXG4gIHJlYWRvbmx5IG5vdz86ICgpID0+IG51bWJlcjtcbn1cblxuLyoqIEFyZ3VtZW50cyBwYXNzZWQgdG8gYSBjYWNoZSBtZXJnZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PFQ+IHtcbiAgcmVhZG9ubHkgZnJlc2g6IFQgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHByZXZpb3VzOiBUIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBmYWxsYmFjazogVDtcbn1cblxuLyoqIE9uZSB2ZXJzaW9uZWQgbWV0YWRhdGEgY2FjaGUgKGNhY2FjaGUgbWVtb3J5ICsgb3B0aW9uYWwgZGlzaykuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhQ2FjaGU8VD4ge1xuICAvKiogQWJzb2x1dGUgY2FjYWNoZSByb290IGZvciB0aGlzIHBhY2thZ2UgdmVyc2lvbiAodW51c2VkIHdoZW4gZGlzayBpcyBvZmYpLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIGNhY2FjaGUgZGlzayBwZXJzaXN0ZW5jZSBpcyBlbmFibGVkIGZvciB0aGlzIGluc3RhbmNlLiAqL1xuICByZWFkb25seSBkaXNrRW5hYmxlZDogYm9vbGVhbjtcbiAgLyoqIFJldHVybiBhIGZyZXNoLW9yLWZhbGxiYWNrIHZhbHVlLCByZWZyZXNoaW5nIHdoZW4gc3RhbGUuICovXG4gIGdldCgpOiBQcm9taXNlPFQ+O1xuICAvKiogUmVhZCBtZW1vcnkgLyBkaXNrIHdpdGhvdXQgcmVmcmVzaGluZy4gKi9cbiAgcGVlaygpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuICAvKiogTXV0YXRlIHRoZSBjYWNoZWQgdmFsdWUgYW5kIHBlcnNpc3QgaXQuICovXG4gIHVwZGF0ZShtdXRhdG9yOiAoY3VycmVudDogVCkgPT4gVCk6IFByb21pc2U8VD47XG4gIC8qKiBGb3JjZSBhIHJlZnJlc2ggYXR0ZW1wdCBldmVuIHdoZW4gdGhlIGVudHJ5IGlzIHN0aWxsIGZyZXNoLiAqL1xuICByZWZyZXNoKCk6IFByb21pc2U8VD47XG59XG5cbmNvbnN0IGluZmxpZ2h0ID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG5cbi8qKiBEZWZhdWx0IGNhY2FjaGUgcm9vdCBmb3IgYSBwYWNrYWdlIHZlcnNpb24gdW5kZXIgdGhlIGRieC10b29scyBjYWNoZSBkaXIuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdE1ldGFkYXRhQ2FjaGVEaXIodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnkgPSBlbnZQYXRocyhcImRieC10b29sc1wiLCB7IHN1ZmZpeDogXCJcIiB9KS5jYWNoZTtcbiAgcmV0dXJuIHJlc29sdmUoY2FjaGVEaXJlY3RvcnksIFwibW9kZWwtZ2F0ZXdheVwiLCB2ZXJzaW9uKTtcbn1cblxuLyoqIFdoZXRoZXIgbWV0YWRhdGEgY2FjaGVzIHNob3VsZCBwZXJzaXN0IHRvIGRpc2sgaW4gdGhpcyBwcm9jZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGFkYXRhQ2FjaGVEaXNrRW5hYmxlZChlbnZpcm9ubWVudDogTm9kZUpTLlByb2Nlc3NFbnYgPSBwcm9jZXNzLmVudik6IGJvb2xlYW4ge1xuICByZXR1cm4gIWVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52KGVudmlyb25tZW50KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgb25lIGRhaWx5IGNhY2hlIGJhY2tlZCBieSBjYWNhY2hlIG1lbW9pemF0aW9uLCB3aXRoIG9wdGlvbmFsIGRpc2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXRhZGF0YUNhY2hlPFQ+KG9wdGlvbnM6IE1ldGFkYXRhQ2FjaGVPcHRpb25zPFQ+KTogTWV0YWRhdGFDYWNoZTxUPiB7XG4gIGNvbnN0IHR0bE1zID0gb3B0aW9ucy50dGxNcyA/PyBNT0RFTF9NRVRBREFUQV9UVExfTVM7XG4gIGNvbnN0IGRpc2tFbmFibGVkID0gb3B0aW9ucy5kaXNrID8/IG1ldGFkYXRhQ2FjaGVEaXNrRW5hYmxlZCgpO1xuICBjb25zdCBub3cgPSBvcHRpb25zLm5vdyA/PyBEYXRlLm5vdztcbiAgY29uc3QgcGF0aFByb21pc2UgPSByZXNvbHZlQ2FjaGVEaXIob3B0aW9ucyk7XG4gIGxldCBwYXRoID0gb3B0aW9ucy5jYWNoZURpcjtcblxuICBjb25zdCBmbGlnaHRLZXkgPSAoY2FjaGVQYXRoOiBzdHJpbmcsIHN1ZmZpeCA9IFwiXCIpOiBzdHJpbmcgPT5cbiAgICBgJHtjYWNoZVBhdGh9Ojoke29wdGlvbnMua2V5fSR7c3VmZml4fWA7XG5cbiAgLyoqIFByb2Nlc3MtbG9jYWwgc3RvcmUgdXNlZCB3aGVuIGRpc2sgaXMgb2ZmIChEYXRhYnJpY2tzIEFwcHMpLiAqL1xuICBjb25zdCBtZW1vcnlPbmx5ID0gbmV3IE1hcDxzdHJpbmcsIE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4+KCk7XG5cbiAgY29uc3QgcmVzb2x2ZVZhbHVlID0gKGlucHV0OiBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxUPik6IFQgPT4gb3B0aW9ucy5tZXJnZShpbnB1dCk7XG5cbiAgY29uc3QgaXNGcmVzaCA9IChyZWNvcmQ6IE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4gfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gICAgQm9vbGVhbihyZWNvcmQgJiYgbm93KCkgLSByZWNvcmQucmVmcmVzaGVkQXQgPCB0dGxNcyk7XG5cbiAgY29uc3QgY2FjaGVQYXRoID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgcGF0aCA/Pz0gYXdhaXQgcGF0aFByb21pc2U7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH07XG5cbiAgY29uc3QgcmVhZFJlY29yZCA9IGFzeW5jICgpOiBQcm9taXNlPE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICBpZiAoIWRpc2tFbmFibGVkKSByZXR1cm4gbWVtb3J5T25seS5nZXQob3B0aW9ucy5rZXkpO1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IGNhY2hlUGF0aCgpO1xuICAgIHRyeSB7XG4gICAgICAvLyBjYWNhY2hlIHJlYWRzIGl0cyBpbi1tZW1vcnkgbWVtbyBmaXJzdCB1bmxlc3MgbWVtb2l6ZSBpcyBmYWxzZVxuICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCBjYWNhY2hlLmdldChyZXNvbHZlZFBhdGgsIG9wdGlvbnMua2V5KTtcbiAgICAgIHJldHVybiBkZWNvZGVSZWNvcmQ8VD4oZW50cnkuZGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0NhY2hlTWlzcyhlcnJvcikpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBsb2dnZXIud2FybihcIm1ldGFkYXRhIGNhY2hlIGNhY2FjaGUgcmVhZCBmYWlsZWRcIiwge1xuICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICBwYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB3cml0ZVJlY29yZCA9IGFzeW5jIChyZWNvcmQ6IE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIWRpc2tFbmFibGVkKSB7XG4gICAgICBtZW1vcnlPbmx5LnNldChvcHRpb25zLmtleSwgcmVjb3JkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gYXdhaXQgY2FjaGVQYXRoKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNhY2FjaGUucHV0KHJlc29sdmVkUGF0aCwgb3B0aW9ucy5rZXksIGAke0pTT04uc3RyaW5naWZ5KHJlY29yZCl9XFxuYCwge1xuICAgICAgICBtZW1vaXplOiB0cnVlLFxuICAgICAgICBtZXRhZGF0YTogeyByZWZyZXNoZWRBdDogcmVjb3JkLnJlZnJlc2hlZEF0IH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oXCJtZXRhZGF0YSBjYWNoZSBjYWNhY2hlIHdyaXRlIGZhaWxlZFwiLCB7XG4gICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcGVyc2lzdCA9IGFzeW5jICh2YWx1ZTogVCwgcmVmcmVzaGVkQXQgPSBub3coKSk6IFByb21pc2U8VD4gPT4ge1xuICAgIGF3YWl0IHdyaXRlUmVjb3JkKHsgcmVmcmVzaGVkQXQsIHZhbHVlIH0pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICBjb25zdCByZWZyZXNoID0gYXN5bmMgKGZvcmNlOiBib29sZWFuKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gYXdhaXQgY2FjaGVQYXRoKCk7XG4gICAgcmV0dXJuIGNvYWxlc2NlKGZsaWdodEtleShyZXNvbHZlZFBhdGgpLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHJlYWRSZWNvcmQoKTtcbiAgICAgIGlmICghZm9yY2UgJiYgaXNGcmVzaChwcmV2aW91cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVWYWx1ZSh7XG4gICAgICAgICAgZnJlc2g6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwcmV2aW91czogcHJldmlvdXM/LnZhbHVlLFxuICAgICAgICAgIGZhbGxiYWNrOiBvcHRpb25zLmZhbGxiYWNrLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbGV0IGZyZXNoOiBUIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG9wdGlvbnMubG9hZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZyZXNoID0gYXdhaXQgb3B0aW9ucy5sb2FkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oXCJtZXRhZGF0YSBjYWNoZSByZWZyZXNoIGZhaWxlZDsga2VlcGluZyBsYXN0IGtub3duIGdvb2RcIiwge1xuICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgICAgZGlza0VuYWJsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSByZXNvbHZlVmFsdWUoe1xuICAgICAgICBmcmVzaCxcbiAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzPy52YWx1ZSxcbiAgICAgICAgZmFsbGJhY2s6IG9wdGlvbnMuZmFsbGJhY2ssXG4gICAgICB9KTtcbiAgICAgIGlmIChmcmVzaCAhPT0gdW5kZWZpbmVkIHx8ICFwcmV2aW91cykge1xuICAgICAgICBhd2FpdCBwZXJzaXN0KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGdldCBwYXRoKCkge1xuICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1ldGFkYXRhIGNhY2hlIHBhdGggaXMgbm90IHJlc29sdmVkIHVudGlsIHRoZSBmaXJzdCBjYWNoZSByZWFkXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSxcbiAgICBkaXNrRW5hYmxlZCxcbiAgICBnZXQ6ICgpID0+IHJlZnJlc2goZmFsc2UpLFxuICAgIHBlZWs6IGFzeW5jICgpID0+IChhd2FpdCByZWFkUmVjb3JkKCkpPy52YWx1ZSxcbiAgICByZWZyZXNoOiAoKSA9PiByZWZyZXNoKHRydWUpLFxuICAgIHVwZGF0ZTogYXN5bmMgKG11dGF0b3IpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IGNhY2hlUGF0aCgpO1xuICAgICAgcmV0dXJuIGNvYWxlc2NlKGZsaWdodEtleShyZXNvbHZlZFBhdGgsIFwiOnVwZGF0ZVwiKSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHJlYWRSZWNvcmQoKTtcbiAgICAgICAgY29uc3QgYmFzZWxpbmUgPSByZXNvbHZlVmFsdWUoe1xuICAgICAgICAgIGZyZXNoOiB1bmRlZmluZWQsXG4gICAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzPy52YWx1ZSxcbiAgICAgICAgICBmYWxsYmFjazogb3B0aW9ucy5mYWxsYmFjayxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwZXJzaXN0KG11dGF0b3IoYmFzZWxpbmUpKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDYWNoZURpcihvcHRpb25zOiB7XG4gIHJlYWRvbmx5IGNhY2hlRGlyPzogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChvcHRpb25zLmNhY2hlRGlyKSByZXR1cm4gb3B0aW9ucy5jYWNoZURpcjtcbiAgY29uc3QgdmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbiA/PyAoYXdhaXQgcGFja2FnZUlkZW50aXR5KCkpLnZlcnNpb247XG4gIHJldHVybiBkZWZhdWx0TWV0YWRhdGFDYWNoZURpcih2ZXJzaW9uKTtcbn1cblxuLyoqIFByZWZlciBhIG5vbi1lbXB0eSBmcmVzaCBhcnJheSwgZWxzZSBwcmV2aW91cywgZWxzZSBmYWxsYmFjay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVByZWZlckZyZXNoTGlzdDxUPihpbnB1dDogTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQ8cmVhZG9ubHkgVFtdPik6IFRbXSB7XG4gIGlmIChpbnB1dC5mcmVzaCAmJiBpbnB1dC5mcmVzaC5sZW5ndGggPiAwKSByZXR1cm4gWy4uLmlucHV0LmZyZXNoXTtcbiAgaWYgKGlucHV0LnByZXZpb3VzICYmIGlucHV0LnByZXZpb3VzLmxlbmd0aCA+IDApIHJldHVybiBbLi4uaW5wdXQucHJldmlvdXNdO1xuICByZXR1cm4gWy4uLmlucHV0LmZhbGxiYWNrXTtcbn1cblxuLyoqXG4gKiBTaGFsbG93LW1lcmdlIHJlY29yZCBjYXRhbG9ndWVzOiBmYWxsYmFjaywgdGhlbiBwcmV2aW91cywgdGhlbiBmcmVzaCBrZXlzLlxuICogRnJlc2ggdmFsdWVzIHdpbiBwZXIga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcmVmZXJGcmVzaFJlY29yZDxUPihcbiAgaW5wdXQ6IE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFQ+Pj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBUPiB7XG4gIHJldHVybiB7XG4gICAgLi4uaW5wdXQuZmFsbGJhY2ssXG4gICAgLi4uKGlucHV0LnByZXZpb3VzID8/IHt9KSxcbiAgICAuLi4oaW5wdXQuZnJlc2ggPz8ge30pLFxuICB9O1xufVxuXG4vKiogVGVzdCBoZWxwZXI6IHdpcGUgYSBjYWNhY2hlIHJvb3QgYW5kIGNsZWFyIGNhY2FjaGUgbWVtb2l6YXRpb24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzZXRNZXRhZGF0YUNhY2hlRGlyKGNhY2hlRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjYWNhY2hlLnJtLmFsbChjYWNoZURpcik7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGVtcHR5IC8gbWlzc2luZyBjYWNoZSBpcyBmaW5lXG4gIH1cbiAgY2FjYWNoZS5jbGVhck1lbW9pemVkKCk7XG4gIGZvciAoY29uc3Qga2V5IG9mIFsuLi5pbmZsaWdodC5rZXlzKCldKSB7XG4gICAgaWYgKGtleS5zdGFydHNXaXRoKGAke2NhY2hlRGlyfTo6YCkpIGluZmxpZ2h0LmRlbGV0ZShrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvYWxlc2NlPFQ+KGtleTogc3RyaW5nLCB3b3JrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGV4aXN0aW5nID0gaW5mbGlnaHQuZ2V0KGtleSk7XG4gIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nIGFzIFByb21pc2U8VD47XG4gIGNvbnN0IHBlbmRpbmcgPSB3b3JrKCkuZmluYWxseSgoKSA9PiB7XG4gICAgaWYgKGluZmxpZ2h0LmdldChrZXkpID09PSBwZW5kaW5nKSBpbmZsaWdodC5kZWxldGUoa2V5KTtcbiAgfSk7XG4gIGluZmxpZ2h0LnNldChrZXksIHBlbmRpbmcpO1xuICByZXR1cm4gcGVuZGluZztcbn1cblxuZnVuY3Rpb24gZGVjb2RlUmVjb3JkPFQ+KGRhdGE6IEJ1ZmZlcik6IE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZyhcInV0ZjhcIikpIGFzIHVua25vd247XG4gICAgaWYgKFxuICAgICAgIXBhcnNlZCB8fFxuICAgICAgdHlwZW9mIHBhcnNlZCAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgdHlwZW9mIChwYXJzZWQgYXMgTWV0YWRhdGFDYWNoZVJlY29yZDxUPikucmVmcmVzaGVkQXQgIT09IFwibnVtYmVyXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWQgYXMgTWV0YWRhdGFDYWNoZVJlY29yZDxUPjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NhY2hlTWlzcyhlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICBlcnJvciAmJlxuICAgIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwiY29kZVwiIGluIGVycm9yICYmXG4gICAgKGVycm9yIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlID09PSBcIkVOT0VOVFwiLFxuICApO1xufVxuXG4iXX0=
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSwwQ0FBMEMsQ0FBQztBQUM3RSxPQUFPLEtBQUssR0FBRyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xELE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxlQUFlLE1BQU0saUJBQWlCLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBT2xELE1BQU0sZ0JBQWdCLEdBQW9CO0lBQ3hDLFVBQVUsRUFBRSxlQUFlLENBQUMsSUFBSTtJQUNoQyxPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU87Q0FDakMsQ0FBQztBQTBERixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztBQUVyRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BQWU7SUFDckQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNuRSxPQUFPLE9BQU8sQ0FBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsTUFBTSxVQUFVLHdCQUF3QixDQUFDLGNBQWlDLE9BQU8sQ0FBQyxHQUFHO0lBQ25GLE9BQU8s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QU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQVksQ0FBQztRQUM1RCxJQUNFLENBQUMsTUFBTTtZQUNQLE9BQU8sTUFBTSxLQUFLLFFBQVE7WUFDMUIsT0FBUSxNQUFpQyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQ2xFLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxNQUFnQyxDQUFDO0lBQzFDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWM7SUFDakMsT0FBTyxPQUFPLENBQ1osS0FBSztRQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsTUFBTSxJQUFJLEtBQUs7UUFDZCxLQUEyQixDQUFDLElBQUksS0FBSyxRQUFRLENBQy9DLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZ25vc3RpYyBkYWlseSBtZXRhZGF0YSBjYWNoZSBvbiB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY2FjYWNoZSB8IGNhY2FjaGV9LlxuICpcbiAqIFVzZXMgY2FjYWNoZSdzIGJ1aWx0LWluIG1lbW9yeSBtZW1vaXphdGlvbiAoYG1lbW9pemU6IHRydWVgIG9uIHB1dDsgZ2V0cyByZWFkXG4gKiB0aGUgaW4tbWVtb3J5IGxheWVyIGJ5IGRlZmF1bHQpIHdpdGggY29udGVudC1hZGRyZXNzZWQgZGlzayB1bmRlclxuICogYGVudi1wYXRocyhcImRieC10b29sc1wiKS5jYWNoZS9tb2RlbC1nYXRld2F5Lzx2ZXJzaW9uPi9gLiBEaXNrIHBlcnNpc3RlbmNlIGlzXG4gKiBkaXNhYmxlZCBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCAoe0BsaW5rIGVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52fSk7XG4gKiB0aG9zZSBwcm9jZXNzZXMga2VlcCBhIHByb2Nlc3MtbG9jYWwgTWFwIG9ubHkuXG4gKlxuICogRWFjaCBjYWNoZSBvd25zIGEga2V5LCBoYXJkLWNvZGVkIGZhbGxiYWNrLCBvcHRpb25hbCBuZXR3b3JrIGxvYWRlciwgYW5kIGFcbiAqIG1lcmdlciB0aGF0IGNvbWJpbmVzIGZyZXNoIC8gcHJldmlvdXMgLyBmYWxsYmFjayB2YWx1ZXMuIEZyZXNobmVzcyBpcyB0aGVcbiAqIGVudmVsb3BlIGByZWZyZXNoZWRBdGAgd2luZG93IChkZWZhdWx0IG9uZSBkYXkpLCBub3QgY2FjYWNoZSdzIHNob3J0IExSVSBUVEwuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCAqIGFzIGVudmlyb25tZW50VXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZW52aXJvbm1lbnQtdXRpbHNcIjtcbmltcG9ydCAqIGFzIGxvZyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9sb2dcIjtcbmltcG9ydCBjYWNhY2hlIGZyb20gXCJjYWNhY2hlXCI7XG5pbXBvcnQgZW52UGF0aHMgZnJvbSBcImVudi1wYXRoc1wiO1xuXG5pbXBvcnQgcGFja2FnZU1hbmlmZXN0IGZyb20gXCIuLi9wYWNrYWdlLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUyB9IGZyb20gXCIuL19tZXRhZGF0YS1jb250cmFjdC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibW9kZWwvbWV0YWRhdGEtY2FjaGVcIik7XG5cbmludGVyZmFjZSBQYWNrYWdlSWRlbnRpdHkge1xuICByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuY29uc3QgUEFDS0FHRV9JREVOVElUWTogUGFja2FnZUlkZW50aXR5ID0ge1xuICBpZGVudGlmaWVyOiBwYWNrYWdlTWFuaWZlc3QubmFtZSxcbiAgdmVyc2lvbjogcGFja2FnZU1hbmlmZXN0LnZlcnNpb24sXG59O1xuXG4vKiogRW52ZWxvcGUgc3RvcmVkIGFzIEpTT04gYnl0ZXMgaW4gY2FjYWNoZSBmb3IgZXZlcnkga2V5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHtcbiAgcmVhZG9ubHkgcmVmcmVzaGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgdmFsdWU6IFQ7XG59XG5cbi8qKiBGYWN0b3J5IGlucHV0cyBmb3Igb25lIG5hbWVkIG1ldGFkYXRhIGNhY2hlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlT3B0aW9uczxUPiB7XG4gIC8qKiBTdGFibGUgY2FjYWNoZSBrZXkuICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAvKiogSGFyZC1jb2RlZCAvIGNvbW1pdHRlZCBiYXNlbGluZSB1c2VkIHdoZW4gc3RvcmUgYW5kIGxvYWQgYm90aCBtaXNzLiAqL1xuICByZWFkb25seSBmYWxsYmFjazogVDtcbiAgLyoqXG4gICAqIFJlZnJlc2ggc291cmNlLiBXaGVuIG9taXR0ZWQgdGhlIGNhY2hlIG9ubHkgc2VydmVzIHN0b3JlICsgZmFsbGJhY2sgYW5kXG4gICAqIHtAbGluayBNZXRhZGF0YUNhY2hlLnVwZGF0ZX0gbXV0YXRpb25zIChmb3IgZXhhbXBsZSBlcnJvci1sZWFybmVkIHZhbHVlcykuXG4gICAqL1xuICByZWFkb25seSBsb2FkPzogKCkgPT4gUHJvbWlzZTxUPjtcbiAgLyoqIENvbWJpbmUgYSBmcmVzaCBsb2FkLCBwcmlvciBzdG9yZSB2YWx1ZSwgYW5kIHRoZSBoYXJkLWNvZGVkIGZhbGxiYWNrLiAqL1xuICByZWFkb25seSBtZXJnZTogKGlucHV0OiBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxUPikgPT4gVDtcbiAgLyoqIEZyZXNobmVzcyB3aW5kb3c7IGRlZmF1bHRzIHRvIHtAbGluayBNT0RFTF9NRVRBREFUQV9UVExfTVN9IChvbmUgZGF5KS4gKi9cbiAgcmVhZG9ubHkgdHRsTXM/OiBudW1iZXI7XG4gIC8qKiBQYWNrYWdlIHZlcnNpb24gc2VnbWVudCBpbiB0aGUgY2FjaGUgcGF0aC4gRGVmYXVsdHMgdG8gdGhpcyBwYWNrYWdlLiAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuICAvKiogT3ZlcnJpZGUgdGhlIGNhY2FjaGUgcm9vdCBkaXJlY3RvcnkgKHRlc3RzKS4gKi9cbiAgcmVhZG9ubHkgY2FjaGVEaXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGb3JjZSBkaXNrIG9uL29mZi4gRGVmYXVsdHMgdG8gb2ZmIGluc2lkZSBEYXRhYnJpY2tzIEFwcHMsIG9uIG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IGRpc2s/OiBib29sZWFuO1xuICAvKiogQ2xvY2sgb3ZlcnJpZGUgZm9yIHRlc3RzLiAqL1xuICByZWFkb25seSBub3c/OiAoKSA9PiBudW1iZXI7XG59XG5cbi8qKiBBcmd1bWVudHMgcGFzc2VkIHRvIGEgY2FjaGUgbWVyZ2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxUPiB7XG4gIHJlYWRvbmx5IGZyZXNoOiBUIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBwcmV2aW91czogVCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZmFsbGJhY2s6IFQ7XG59XG5cbi8qKiBPbmUgdmVyc2lvbmVkIG1ldGFkYXRhIGNhY2hlIChjYWNhY2hlIG1lbW9yeSArIG9wdGlvbmFsIGRpc2spLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlPFQ+IHtcbiAgLyoqIEFic29sdXRlIGNhY2FjaGUgcm9vdCBmb3IgdGhpcyBwYWNrYWdlIHZlcnNpb24gKHVudXNlZCB3aGVuIGRpc2sgaXMgb2ZmKS4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKiogV2hldGhlciBjYWNhY2hlIGRpc2sgcGVyc2lzdGVuY2UgaXMgZW5hYmxlZCBmb3IgdGhpcyBpbnN0YW5jZS4gKi9cbiAgcmVhZG9ubHkgZGlza0VuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKiBSZXR1cm4gYSBmcmVzaC1vci1mYWxsYmFjayB2YWx1ZSwgcmVmcmVzaGluZyB3aGVuIHN0YWxlLiAqL1xuICBnZXQoKTogUHJvbWlzZTxUPjtcbiAgLyoqIFJlYWQgbWVtb3J5IC8gZGlzayB3aXRob3V0IHJlZnJlc2hpbmcuICovXG4gIHBlZWsoKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgLyoqIE11dGF0ZSB0aGUgY2FjaGVkIHZhbHVlIGFuZCBwZXJzaXN0IGl0LiAqL1xuICB1cGRhdGUobXV0YXRvcjogKGN1cnJlbnQ6IFQpID0+IFQpOiBQcm9taXNlPFQ+O1xuICAvKiogRm9yY2UgYSByZWZyZXNoIGF0dGVtcHQgZXZlbiB3aGVuIHRoZSBlbnRyeSBpcyBzdGlsbCBmcmVzaC4gKi9cbiAgcmVmcmVzaCgpOiBQcm9taXNlPFQ+O1xufVxuXG5jb25zdCBpbmZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuXG4vKiogRGVmYXVsdCBjYWNhY2hlIHJvb3QgZm9yIGEgcGFja2FnZSB2ZXJzaW9uIHVuZGVyIHRoZSBkYngtdG9vbHMgY2FjaGUgZGlyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRNZXRhZGF0YUNhY2hlRGlyKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5ID0gZW52UGF0aHMoXCJkYngtdG9vbHNcIiwgeyBzdWZmaXg6IFwiXCIgfSkuY2FjaGU7XG4gIHJldHVybiByZXNvbHZlKGNhY2hlRGlyZWN0b3J5LCBcIm1vZGVsLWdhdGV3YXlcIiwgdmVyc2lvbik7XG59XG5cbi8qKiBXaGV0aGVyIG1ldGFkYXRhIGNhY2hlcyBzaG91bGQgcGVyc2lzdCB0byBkaXNrIGluIHRoaXMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRhZGF0YUNhY2hlRGlza0VuYWJsZWQoZW52aXJvbm1lbnQ6IE5vZGVKUy5Qcm9jZXNzRW52ID0gcHJvY2Vzcy5lbnYpOiBib29sZWFuIHtcbiAgcmV0dXJuICFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudihlbnZpcm9ubWVudCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIG9uZSBkYWlseSBjYWNoZSBiYWNrZWQgYnkgY2FjYWNoZSBtZW1vaXphdGlvbiwgd2l0aCBvcHRpb25hbCBkaXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWV0YWRhdGFDYWNoZTxUPihvcHRpb25zOiBNZXRhZGF0YUNhY2hlT3B0aW9uczxUPik6IE1ldGFkYXRhQ2FjaGU8VD4ge1xuICBjb25zdCB0dGxNcyA9IG9wdGlvbnMudHRsTXMgPz8gTU9ERUxfTUVUQURBVEFfVFRMX01TO1xuICBjb25zdCBkaXNrRW5hYmxlZCA9IG9wdGlvbnMuZGlzayA/PyBtZXRhZGF0YUNhY2hlRGlza0VuYWJsZWQoKTtcbiAgY29uc3Qgbm93ID0gb3B0aW9ucy5ub3cgPz8gRGF0ZS5ub3c7XG4gIGNvbnN0IHBhdGhQcm9taXNlID0gcmVzb2x2ZUNhY2hlRGlyKG9wdGlvbnMpO1xuICBsZXQgcGF0aCA9IG9wdGlvbnMuY2FjaGVEaXI7XG5cbiAgY29uc3QgZmxpZ2h0S2V5ID0gKGNhY2hlUGF0aDogc3RyaW5nLCBzdWZmaXggPSBcIlwiKTogc3RyaW5nID0+XG4gICAgYCR7Y2FjaGVQYXRofTo6JHtvcHRpb25zLmtleX0ke3N1ZmZpeH1gO1xuXG4gIC8qKiBQcm9jZXNzLWxvY2FsIHN0b3JlIHVzZWQgd2hlbiBkaXNrIGlzIG9mZiAoRGF0YWJyaWNrcyBBcHBzKS4gKi9cbiAgY29uc3QgbWVtb3J5T25seSA9IG5ldyBNYXA8c3RyaW5nLCBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+PigpO1xuXG4gIGNvbnN0IHJlc29sdmVWYWx1ZSA9IChpbnB1dDogTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQ8VD4pOiBUID0+IG9wdGlvbnMubWVyZ2UoaW5wdXQpO1xuXG4gIGNvbnN0IGlzRnJlc2ggPSAocmVjb3JkOiBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICAgIEJvb2xlYW4ocmVjb3JkICYmIG5vdygpIC0gcmVjb3JkLnJlZnJlc2hlZEF0IDwgdHRsTXMpO1xuXG4gIGNvbnN0IGNhY2hlUGF0aCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIHBhdGggPz89IGF3YWl0IHBhdGhQcm9taXNlO1xuICAgIHJldHVybiBwYXRoO1xuICB9O1xuXG4gIGNvbnN0IHJlYWRSZWNvcmQgPSBhc3luYyAoKTogUHJvbWlzZTxNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgaWYgKCFkaXNrRW5hYmxlZCkgcmV0dXJuIG1lbW9yeU9ubHkuZ2V0KG9wdGlvbnMua2V5KTtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCBjYWNoZVBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgLy8gY2FjYWNoZSByZWFkcyBpdHMgaW4tbWVtb3J5IG1lbW8gZmlyc3QgdW5sZXNzIG1lbW9pemUgaXMgZmFsc2VcbiAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgY2FjYWNoZS5nZXQocmVzb2x2ZWRQYXRoLCBvcHRpb25zLmtleSk7XG4gICAgICByZXR1cm4gZGVjb2RlUmVjb3JkPFQ+KGVudHJ5LmRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNDYWNoZU1pc3MoZXJyb3IpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgbG9nZ2VyLndhcm4oXCJtZXRhZGF0YSBjYWNoZSBjYWNhY2hlIHJlYWQgZmFpbGVkXCIsIHtcbiAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgd3JpdGVSZWNvcmQgPSBhc3luYyAocmVjb3JkOiBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFkaXNrRW5hYmxlZCkge1xuICAgICAgbWVtb3J5T25seS5zZXQob3B0aW9ucy5rZXksIHJlY29yZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IGNhY2hlUGF0aCgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYWNhY2hlLnB1dChyZXNvbHZlZFBhdGgsIG9wdGlvbnMua2V5LCBgJHtKU09OLnN0cmluZ2lmeShyZWNvcmQpfVxcbmAsIHtcbiAgICAgICAgbWVtb2l6ZTogdHJ1ZSxcbiAgICAgICAgbWV0YWRhdGE6IHsgcmVmcmVzaGVkQXQ6IHJlY29yZC5yZWZyZXNoZWRBdCB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwibWV0YWRhdGEgY2FjaGUgY2FjYWNoZSB3cml0ZSBmYWlsZWRcIiwge1xuICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICBwYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHBlcnNpc3QgPSBhc3luYyAodmFsdWU6IFQsIHJlZnJlc2hlZEF0ID0gbm93KCkpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBhd2FpdCB3cml0ZVJlY29yZCh7IHJlZnJlc2hlZEF0LCB2YWx1ZSB9KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgY29uc3QgcmVmcmVzaCA9IGFzeW5jIChmb3JjZTogYm9vbGVhbik6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IGNhY2hlUGF0aCgpO1xuICAgIHJldHVybiBjb2FsZXNjZShmbGlnaHRLZXkocmVzb2x2ZWRQYXRoKSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCByZWFkUmVjb3JkKCk7XG4gICAgICBpZiAoIWZvcmNlICYmIGlzRnJlc2gocHJldmlvdXMpKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVmFsdWUoe1xuICAgICAgICAgIGZyZXNoOiB1bmRlZmluZWQsXG4gICAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzPy52YWx1ZSxcbiAgICAgICAgICBmYWxsYmFjazogb3B0aW9ucy5mYWxsYmFjayxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBmcmVzaDogVCB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvcHRpb25zLmxvYWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmcmVzaCA9IGF3YWl0IG9wdGlvbnMubG9hZCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwibWV0YWRhdGEgY2FjaGUgcmVmcmVzaCBmYWlsZWQ7IGtlZXBpbmcgbGFzdCBrbm93biBnb29kXCIsIHtcbiAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgICAgIGRpc2tFbmFibGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZVZhbHVlKHtcbiAgICAgICAgZnJlc2gsXG4gICAgICAgIHByZXZpb3VzOiBwcmV2aW91cz8udmFsdWUsXG4gICAgICAgIGZhbGxiYWNrOiBvcHRpb25zLmZhbGxiYWNrLFxuICAgICAgfSk7XG4gICAgICBpZiAoZnJlc2ggIT09IHVuZGVmaW5lZCB8fCAhcHJldmlvdXMpIHtcbiAgICAgICAgYXdhaXQgcGVyc2lzdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQgcGF0aCgpIHtcbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtZXRhZGF0YSBjYWNoZSBwYXRoIGlzIG5vdCByZXNvbHZlZCB1bnRpbCB0aGUgZmlyc3QgY2FjaGUgcmVhZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH0sXG4gICAgZGlza0VuYWJsZWQsXG4gICAgZ2V0OiAoKSA9PiByZWZyZXNoKGZhbHNlKSxcbiAgICBwZWVrOiBhc3luYyAoKSA9PiAoYXdhaXQgcmVhZFJlY29yZCgpKT8udmFsdWUsXG4gICAgcmVmcmVzaDogKCkgPT4gcmVmcmVzaCh0cnVlKSxcbiAgICB1cGRhdGU6IGFzeW5jIChtdXRhdG9yKSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCBjYWNoZVBhdGgoKTtcbiAgICAgIHJldHVybiBjb2FsZXNjZShmbGlnaHRLZXkocmVzb2x2ZWRQYXRoLCBcIjp1cGRhdGVcIiksIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCByZWFkUmVjb3JkKCk7XG4gICAgICAgIGNvbnN0IGJhc2VsaW5lID0gcmVzb2x2ZVZhbHVlKHtcbiAgICAgICAgICBmcmVzaDogdW5kZWZpbmVkLFxuICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cz8udmFsdWUsXG4gICAgICAgICAgZmFsbGJhY2s6IG9wdGlvbnMuZmFsbGJhY2ssXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGVyc2lzdChtdXRhdG9yKGJhc2VsaW5lKSk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2FjaGVEaXIob3B0aW9uczoge1xuICByZWFkb25seSBjYWNoZURpcj86IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAob3B0aW9ucy5jYWNoZURpcikgcmV0dXJuIG9wdGlvbnMuY2FjaGVEaXI7XG4gIGNvbnN0IHZlcnNpb24gPSBvcHRpb25zLnZlcnNpb24gPz8gUEFDS0FHRV9JREVOVElUWS52ZXJzaW9uO1xuICByZXR1cm4gZGVmYXVsdE1ldGFkYXRhQ2FjaGVEaXIodmVyc2lvbik7XG59XG5cbi8qKiBQcmVmZXIgYSBub24tZW1wdHkgZnJlc2ggYXJyYXksIGVsc2UgcHJldmlvdXMsIGVsc2UgZmFsbGJhY2suICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcmVmZXJGcmVzaExpc3Q8VD4oaW5wdXQ6IE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PHJlYWRvbmx5IFRbXT4pOiBUW10ge1xuICBpZiAoaW5wdXQuZnJlc2ggJiYgaW5wdXQuZnJlc2gubGVuZ3RoID4gMCkgcmV0dXJuIFsuLi5pbnB1dC5mcmVzaF07XG4gIGlmIChpbnB1dC5wcmV2aW91cyAmJiBpbnB1dC5wcmV2aW91cy5sZW5ndGggPiAwKSByZXR1cm4gWy4uLmlucHV0LnByZXZpb3VzXTtcbiAgcmV0dXJuIFsuLi5pbnB1dC5mYWxsYmFja107XG59XG5cbi8qKlxuICogU2hhbGxvdy1tZXJnZSByZWNvcmQgY2F0YWxvZ3VlczogZmFsbGJhY2ssIHRoZW4gcHJldmlvdXMsIHRoZW4gZnJlc2gga2V5cy5cbiAqIEZyZXNoIHZhbHVlcyB3aW4gcGVyIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQ8VD4oXG4gIGlucHV0OiBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBUPj4+LFxuKTogUmVjb3JkPHN0cmluZywgVD4ge1xuICByZXR1cm4ge1xuICAgIC4uLmlucHV0LmZhbGxiYWNrLFxuICAgIC4uLihpbnB1dC5wcmV2aW91cyA/PyB7fSksXG4gICAgLi4uKGlucHV0LmZyZXNoID8/IHt9KSxcbiAgfTtcbn1cblxuLyoqIFRlc3QgaGVscGVyOiB3aXBlIGEgY2FjYWNoZSByb290IGFuZCBjbGVhciBjYWNhY2hlIG1lbW9pemF0aW9uLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc2V0TWV0YWRhdGFDYWNoZURpcihjYWNoZURpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2FjYWNoZS5ybS5hbGwoY2FjaGVEaXIpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBlbXB0eSAvIG1pc3NpbmcgY2FjaGUgaXMgZmluZVxuICB9XG4gIGNhY2FjaGUuY2xlYXJNZW1vaXplZCgpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBbLi4uaW5mbGlnaHQua2V5cygpXSkge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHtjYWNoZURpcn06OmApKSBpbmZsaWdodC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2FsZXNjZTxUPihrZXk6IHN0cmluZywgd29yazogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCBleGlzdGluZyA9IGluZmxpZ2h0LmdldChrZXkpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZyBhcyBQcm9taXNlPFQ+O1xuICBjb25zdCBwZW5kaW5nID0gd29yaygpLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmIChpbmZsaWdodC5nZXQoa2V5KSA9PT0gcGVuZGluZykgaW5mbGlnaHQuZGVsZXRlKGtleSk7XG4gIH0pO1xuICBpbmZsaWdodC5zZXQoa2V5LCBwZW5kaW5nKTtcbiAgcmV0dXJuIHBlbmRpbmc7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVJlY29yZDxUPihkYXRhOiBCdWZmZXIpOiBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoXCJ1dGY4XCIpKSBhcyB1bmtub3duO1xuICAgIGlmIChcbiAgICAgICFwYXJzZWQgfHxcbiAgICAgIHR5cGVvZiBwYXJzZWQgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgIHR5cGVvZiAocGFyc2VkIGFzIE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4pLnJlZnJlc2hlZEF0ICE9PSBcIm51bWJlclwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkIGFzIE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDYWNoZU1pc3MoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgZXJyb3IgJiZcbiAgICB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcImNvZGVcIiBpbiBlcnJvciAmJlxuICAgIChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFTk9FTlRcIixcbiAgKTtcbn1cbiJdfQ==
@@ -1,10 +1,8 @@
1
- import type { ModelCapabilities, ModelMetadata, ModelRateLimits, ModelStatus, ServingEndpointSummary } from "@dbx-tools/shared-model/contracts";
1
+ import type { ModelCapabilities, ModelMetadata, ModelRateLimits, ServingEndpointSummary } from "@dbx-tools/shared-model/contracts";
2
2
  import { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, type ModelCapabilityCatalogue } from "./_metadata-contract.ts";
3
3
  import { type ReasoningLevel, type ReasoningModelCatalogue } from "./reasoning-translation.ts";
4
4
  export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, };
5
5
  interface MetadataIndex {
6
- readonly retiredNames: readonly string[];
7
- readonly retiredKeys: ReadonlySet<string>;
8
6
  readonly capabilities: {
9
7
  readonly [Key in keyof ModelCapabilityCatalogue]: ReadonlySet<string>;
10
8
  };
@@ -22,8 +20,7 @@ export declare function refreshModelMetadata(): Promise<MetadataIndex>;
22
20
  export declare function hydrateModelMetadata(): Promise<MetadataIndex>;
23
21
  /** Absolute cacache root used by the documentation / learned caches. */
24
22
  export declare function modelMetadataCachePath(): string;
25
- /** Return the committed retired-model names. The array is cached and immutable. */
26
- export declare function retiredModelNames(): readonly string[];
23
+ export { modelStatusFor, retiredModelNames } from "./_retirement.ts";
27
24
  /** Return the committed reasoning-effort catalogue. Cached per process. */
28
25
  export declare function reasoningModelCatalogue(): ReasoningModelCatalogue;
29
26
  /** Return error-learned reasoning ladders persisted in the metadata cache. */
@@ -43,8 +40,6 @@ export declare function rememberReasoningLevels(model: string, levels: readonly
43
40
  * nothing). The raw error body is never written to disk.
44
41
  */
45
42
  export declare function learnReasoningLevelsFromError(model: string, body: unknown): Promise<ReasoningLevel[]>;
46
- /** Resolve whether any supplied identity is listed in the retirement snapshot. */
47
- export declare function modelStatusFor(...models: readonly (string | ServingEndpointSummary)[]): ModelStatus;
48
43
  /** Resolve documented model capabilities from a name or endpoint summary. */
49
44
  export declare function modelCapabilitiesFor(model: string | ServingEndpointSummary): ModelCapabilities;
50
45
  /** Resolve published ITPM, OTPM, and QPH limits from a model identity. */