@dbx-tools/model 0.9.118 → 0.9.120

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -193,10 +193,12 @@ const raw = await modelCatalog.listServingEndpointsUncached(client);
193
193
  await modelCatalog.clearServingEndpointsCache(host);
194
194
  ```
195
195
 
196
- `listServingEndpoints()` uses AppKit's `CacheManager`, enriches endpoints with
197
- classification and embedding dimensions, and keys the cache by workspace host.
198
- `listServingEndpointsUncached()` is useful for simple scripts that only need the
199
- SDK response and do not want a cache dependency.
196
+ `listServingEndpoints()` uses the shared memory-first model project cache, enriches
197
+ endpoints with classification and embedding dimensions, and isolates entries by
198
+ workspace host and trusted credential identity. If a refresh fails, it can return
199
+ the last known-good value retained on disk. `listServingEndpointsUncached()` is
200
+ useful for simple scripts that only need the SDK response and do not want a cache
201
+ dependency.
200
202
 
201
203
  ## Fuzzy Resolve Endpoint Names
202
204
 
@@ -221,10 +223,10 @@ const resolved = await resolve.rankModelIdLive((force) => loadCatalogue(force),
221
223
  `rankModelIdLive()` matches the catalogue you already hold and, on a miss,
222
224
  reloads once with `force` before giving up, so a model deployed after your cache
223
225
  warmed still resolves without a restart. You supply the loader, so the caching
224
- policy stays yours: `listServingEndpoints` and its `CacheManager`, a plain field
225
- in a long-lived CLI, or a test double. `rankModelId()` is the pure form over a
226
- single snapshot; unlike `serving.resolveModelId` it breaks equal match scores by
227
- class and then version, so `"opus"` prefers `opus-5` over `opus-4-7`.
226
+ policy stays yours: `listServingEndpoints` and its shared project cache, a plain
227
+ field in a long-lived CLI, or a test double. `rankModelId()` is the pure form over
228
+ a single snapshot; unlike `serving.resolveModelId` it breaks equal match scores
229
+ by class and then version, so `"opus"` prefers `opus-5` over `opus-4-7`.
228
230
 
229
231
  ## Call An Endpoint Directly
230
232
 
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/model";
6
- export const PACKAGE_VERSION = "0.9.118";
6
+ export const PACKAGE_VERSION = "0.9.120";
7
7
  export * as bindings from "./src/bindings.ts";
8
8
  export * as classes from "./src/classes.ts";
9
9
  export * as classify from "./src/classify.ts";
@@ -21,7 +21,7 @@ export { FALLBACK_MODEL_IDS } from "./src/fallback.ts";
21
21
  export { INVOCATIONS_SUFFIX, SERVING_ENDPOINTS_PATH, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH, AI_GATEWAY_CODEX_RESPONSES_PATH, ANTHROPIC_BASE_PATH, ANTHROPIC_MESSAGES_PATH } from "./src/invoke.ts";
22
22
  export type { AuthenticatingClientLike } from "./src/invoke.ts";
23
23
  export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL } from "./src/metadata.ts";
24
- export type { MetadataCacheRecord, MetadataCacheOptions, MetadataCacheMergeInput, MetadataCache } from "./src/metadata-cache.ts";
24
+ export type { MetadataCacheOptions, MetadataCacheMergeInput, MetadataCache } from "./src/metadata-cache.ts";
25
25
  export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model-catalog.ts";
26
26
  export type { WorkspaceClientLike, ListServingEndpointsOptions } from "./src/model-catalog.ts";
27
27
  export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/model";
2
- export declare const PACKAGE_VERSION = "0.9.118";
2
+ export declare const PACKAGE_VERSION = "0.9.120";
3
3
  export * as bindings from "./src/bindings.ts";
4
4
  export * as classes from "./src/classes.ts";
5
5
  export * as classify from "./src/classify.ts";
@@ -17,7 +17,7 @@ export { FALLBACK_MODEL_IDS } from "./src/fallback.ts";
17
17
  export { INVOCATIONS_SUFFIX, SERVING_ENDPOINTS_PATH, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH, AI_GATEWAY_CODEX_RESPONSES_PATH, ANTHROPIC_BASE_PATH, ANTHROPIC_MESSAGES_PATH } from "./src/invoke.ts";
18
18
  export type { AuthenticatingClientLike } from "./src/invoke.ts";
19
19
  export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL } from "./src/metadata.ts";
20
- export type { MetadataCacheRecord, MetadataCacheOptions, MetadataCacheMergeInput, MetadataCache } from "./src/metadata-cache.ts";
20
+ export type { MetadataCacheOptions, MetadataCacheMergeInput, MetadataCache } from "./src/metadata-cache.ts";
21
21
  export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model-catalog.ts";
22
22
  export type { WorkspaceClientLike, ListServingEndpointsOptions } from "./src/model-catalog.ts";
23
23
  export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/model";
5
- export const PACKAGE_VERSION = "0.9.118";
5
+ export const PACKAGE_VERSION = "0.9.120";
6
6
  export * as bindings from "./src/bindings.js";
7
7
  export * as classes from "./src/classes.js";
8
8
  export * as classify from "./src/classify.js";
@@ -24,4 +24,4 @@ export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.js";
24
24
  export { ModelFamily } from "./src/policy.js";
25
25
  export { REASONING_LEVELS } from "./src/reasoning-translation.js";
26
26
  export * from "./exports.js";
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhOLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxMLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdsRSxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMThcIjtcbmV4cG9ydCAqIGFzIGJpbmRpbmdzIGZyb20gXCIuL3NyYy9iaW5kaW5ncy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NlcyBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NpZnkgZnJvbSBcIi4vc3JjL2NsYXNzaWZ5LnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBtZXRhZGF0YSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhQ2FjaGUgZnJvbSBcIi4vc3JjL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbENhdGFsb2cgZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2xpZW50IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIHBvbGljeSBmcm9tIFwiLi9zcmMvcG9saWN5LnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdUcmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgU0VSVklOR19FTkRQT0lOVFNfUEFUSCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCwgQUlfR0FURVdBWV9DT0RFWF9SRVNQT05TRVNfUEFUSCwgQU5USFJPUElDX0JBU0VfUEFUSCwgQU5USFJPUElDX01FU1NBR0VTX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUywgTU9ERUxfUkFURV9MSU1JVFNfVVJMLCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLCBSRVRJUkVEX01PREVMU19VUkwsIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZXRhZGF0YUNhY2hlUmVjb3JkLCBNZXRhZGF0YUNhY2hlT3B0aW9ucywgTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQsIE1ldGFkYXRhQ2FjaGUgfSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsQXV0aE9wdGlvbnMsIE1vZGVsQ2xpZW50T3B0aW9ucywgTW9kZWxDbGllbnRTdGF0dXMsIE1vZGVsUHJvdG9jb2wsIE1vZGVsUm91dGVJbnB1dCwgTW9kZWxSb3V0ZSwgTW9kZWxDbGllbnQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgeyBNb2RlbEZhbWlseSB9IGZyb20gXCIuL3NyYy9wb2xpY3kudHNcIjtcbmV4cG9ydCB7IFJFQVNPTklOR19MRVZFTFMgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlYXNvbmluZ0xldmVsLCBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSwgQWRhcHRlZFJlcXVlc3RSZWFzb25pbmcgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlbGVjdE1vZGVsSW5wdXQsIFNlYXJjaE1vZGVsc0lucHV0IH0gZnJvbSBcIi4vc3JjL3Jlc29sdmUudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4cG9ydHMudHNcIjtcbiJdfQ==
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhOLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxMLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdsRSxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMjBcIjtcbmV4cG9ydCAqIGFzIGJpbmRpbmdzIGZyb20gXCIuL3NyYy9iaW5kaW5ncy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NlcyBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NpZnkgZnJvbSBcIi4vc3JjL2NsYXNzaWZ5LnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBtZXRhZGF0YSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhQ2FjaGUgZnJvbSBcIi4vc3JjL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbENhdGFsb2cgZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2xpZW50IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIHBvbGljeSBmcm9tIFwiLi9zcmMvcG9saWN5LnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdUcmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgU0VSVklOR19FTkRQT0lOVFNfUEFUSCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCwgQUlfR0FURVdBWV9DT0RFWF9SRVNQT05TRVNfUEFUSCwgQU5USFJPUElDX0JBU0VfUEFUSCwgQU5USFJPUElDX01FU1NBR0VTX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUywgTU9ERUxfUkFURV9MSU1JVFNfVVJMLCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLCBSRVRJUkVEX01PREVMU19VUkwsIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZXRhZGF0YUNhY2hlT3B0aW9ucywgTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQsIE1ldGFkYXRhQ2FjaGUgfSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsQXV0aE9wdGlvbnMsIE1vZGVsQ2xpZW50T3B0aW9ucywgTW9kZWxDbGllbnRTdGF0dXMsIE1vZGVsUHJvdG9jb2wsIE1vZGVsUm91dGVJbnB1dCwgTW9kZWxSb3V0ZSwgTW9kZWxDbGllbnQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgeyBNb2RlbEZhbWlseSB9IGZyb20gXCIuL3NyYy9wb2xpY3kudHNcIjtcbmV4cG9ydCB7IFJFQVNPTklOR19MRVZFTFMgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlYXNvbmluZ0xldmVsLCBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSwgQWRhcHRlZFJlcXVlc3RSZWFzb25pbmcgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlbGVjdE1vZGVsSW5wdXQsIFNlYXJjaE1vZGVsc0lucHV0IH0gZnJvbSBcIi4vc3JjL3Jlc29sdmUudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4cG9ydHMudHNcIjtcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ /** Memory-first cache for endpoint catalogues, isolated for full invalidation. */
2
+ export declare const modelCatalogueCache: import("cacheable").Cacheable;
3
+ /** One memory-first project cache shared by every model metadata key. */
4
+ export declare const modelMetadataCache: import("cacheable").Cacheable;
@@ -0,0 +1,12 @@
1
+ import { projectCache } from "@dbx-tools/cache/cache";
2
+ /** Memory-first cache for endpoint catalogues, isolated for full invalidation. */
3
+ export const modelCatalogueCache = projectCache("model-catalog", {
4
+ maxEntries: 256,
5
+ useClone: false,
6
+ });
7
+ /** One memory-first project cache shared by every model metadata key. */
8
+ export const modelMetadataCache = projectCache("model-metadata", {
9
+ maxEntries: 256,
10
+ useClone: false,
11
+ });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFlBQVksQ0FBQyxlQUFlLEVBQUU7SUFDL0QsVUFBVSxFQUFFLEdBQUc7SUFDZixRQUFRLEVBQUUsS0FBSztDQUNoQixDQUFDLENBQUM7QUFFSCx5RUFBeUU7QUFDekUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFFO0lBQy9ELFVBQVUsRUFBRSxHQUFHO0lBQ2YsUUFBUSxFQUFFLEtBQUs7Q0FDaEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvamVjdENhY2hlIH0gZnJvbSBcIkBkYngtdG9vbHMvY2FjaGUvY2FjaGVcIjtcblxuLyoqIE1lbW9yeS1maXJzdCBjYWNoZSBmb3IgZW5kcG9pbnQgY2F0YWxvZ3VlcywgaXNvbGF0ZWQgZm9yIGZ1bGwgaW52YWxpZGF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsQ2F0YWxvZ3VlQ2FjaGUgPSBwcm9qZWN0Q2FjaGUoXCJtb2RlbC1jYXRhbG9nXCIsIHtcbiAgbWF4RW50cmllczogMjU2LFxuICB1c2VDbG9uZTogZmFsc2UsXG59KTtcblxuLyoqIE9uZSBtZW1vcnktZmlyc3QgcHJvamVjdCBjYWNoZSBzaGFyZWQgYnkgZXZlcnkgbW9kZWwgbWV0YWRhdGEga2V5LiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsTWV0YWRhdGFDYWNoZSA9IHByb2plY3RDYWNoZShcIm1vZGVsLW1ldGFkYXRhXCIsIHtcbiAgbWF4RW50cmllczogMjU2LFxuICB1c2VDbG9uZTogZmFsc2UsXG59KTtcbiJdfQ==
@@ -1,48 +1,21 @@
1
1
  /**
2
- * Agnostic daily metadata cache on {@link https://www.npmjs.com/package/cacache | cacache}.
3
- *
4
- * Uses cacache's built-in memory memoization (`memoize: true` on put; gets read
5
- * the in-memory layer by default) with content-addressed disk under
6
- * `env-paths("dbx-tools").cache/model-gateway/<version>/`. Disk persistence is
7
- * disabled inside a Databricks App ({@link environmentUtils.isDatabricksAppEnv});
8
- * those processes keep a process-local Map only.
9
- *
10
- * Each cache owns a key, hard-coded fallback, optional network loader, and a
11
- * merger that combines fresh / previous / fallback values. Freshness is the
12
- * envelope `refreshedAt` window (default one day), not cacache's short LRU TTL.
2
+ * Daily model metadata cache built on the shared memory-first cache package.
13
3
  *
14
4
  * @module
15
5
  */
16
- /** Envelope stored as JSON bytes in cacache for every key. */
17
- export interface MetadataCacheRecord<T> {
18
- readonly refreshedAt: number;
19
- readonly value: T;
20
- }
6
+ import { createCache } from "@dbx-tools/cache/cache";
21
7
  /** Factory inputs for one named metadata cache. */
22
8
  export interface MetadataCacheOptions<T> {
23
- /** Stable cacache key. */
9
+ /** Stable cache key. */
24
10
  readonly key: string;
25
11
  /** Hard-coded / committed baseline used when store and load both miss. */
26
12
  readonly fallback: T;
27
- /**
28
- * Refresh source. When omitted the cache only serves store + fallback and
29
- * {@link MetadataCache.update} mutations (for example error-learned values).
30
- */
13
+ /** Optional refresh source. */
31
14
  readonly load?: () => Promise<T>;
32
15
  /** Combine a fresh load, prior store value, and the hard-coded fallback. */
33
16
  readonly merge: (input: MetadataCacheMergeInput<T>) => T;
34
- /** Freshness window; defaults to {@link MODEL_METADATA_TTL_MS} (one day). */
17
+ /** Freshness window; defaults to one day. */
35
18
  readonly ttlMs?: number;
36
- /** Package version segment in the cache path. Defaults to this package. */
37
- readonly version?: string;
38
- /** Override the cacache root directory (tests). */
39
- readonly cacheDir?: string;
40
- /**
41
- * Force disk on/off. Defaults to off inside Databricks Apps, on otherwise.
42
- */
43
- readonly disk?: boolean;
44
- /** Clock override for tests. */
45
- readonly now?: () => number;
46
19
  }
47
20
  /** Arguments passed to a cache merger. */
48
21
  export interface MetadataCacheMergeInput<T> {
@@ -50,35 +23,20 @@ export interface MetadataCacheMergeInput<T> {
50
23
  readonly previous: T | undefined;
51
24
  readonly fallback: T;
52
25
  }
53
- /** One versioned metadata cache (cacache memory + optional disk). */
26
+ /** One namespaced view over the shared metadata cache. */
54
27
  export interface MetadataCache<T> {
55
- /** Absolute cacache root for this package version (unused when disk is off). */
56
- readonly path: string;
57
- /** Whether cacache disk persistence is enabled for this instance. */
58
- readonly diskEnabled: boolean;
59
28
  /** Return a fresh-or-fallback value, refreshing when stale. */
60
29
  get(): Promise<T>;
61
- /** Read memory / disk without refreshing. */
30
+ /** Read process memory without refreshing. */
62
31
  peek(): Promise<T | undefined>;
63
32
  /** Mutate the cached value and persist it. */
64
33
  update(mutator: (current: T) => T): Promise<T>;
65
34
  /** Force a refresh attempt even when the entry is still fresh. */
66
35
  refresh(): Promise<T>;
67
36
  }
68
- /** Default cacache root for a package version under the dbx-tools cache dir. */
69
- export declare function defaultMetadataCacheDir(version: string): string;
70
- /** Whether metadata caches should persist to disk in this process. */
71
- export declare function metadataCacheDiskEnabled(environment?: NodeJS.ProcessEnv): boolean;
72
- /**
73
- * Create one daily cache backed by cacache memoization, with optional disk.
74
- */
75
- export declare function createMetadataCache<T>(options: MetadataCacheOptions<T>): MetadataCache<T>;
37
+ /** Create one namespaced view over the shared model metadata cache. */
38
+ export declare function createMetadataCache<T>(options: MetadataCacheOptions<T>, cache?: ReturnType<typeof createCache>): MetadataCache<T>;
76
39
  /** Prefer a non-empty fresh array, else previous, else fallback. */
77
40
  export declare function mergePreferFreshList<T>(input: MetadataCacheMergeInput<readonly T[]>): T[];
78
- /**
79
- * Shallow-merge record catalogues: fallback, then previous, then fresh keys.
80
- * Fresh values win per key.
81
- */
41
+ /** Shallow-merge record catalogues: fallback, then previous, then fresh keys. */
82
42
  export declare function mergePreferFreshRecord<T>(input: MetadataCacheMergeInput<Readonly<Record<string, T>>>): Record<string, T>;
83
- /** Test helper: wipe a cacache root and clear cacache memoization. */
84
- export declare function resetMetadataCacheDir(cacheDir: string): Promise<void>;
@@ -1,169 +1,64 @@
1
1
  /**
2
- * Agnostic daily metadata cache on {@link https://www.npmjs.com/package/cacache | cacache}.
3
- *
4
- * Uses cacache's built-in memory memoization (`memoize: true` on put; gets read
5
- * the in-memory layer by default) with content-addressed disk under
6
- * `env-paths("dbx-tools").cache/model-gateway/<version>/`. Disk persistence is
7
- * disabled inside a Databricks App ({@link environmentUtils.isDatabricksAppEnv});
8
- * those processes keep a process-local Map only.
9
- *
10
- * Each cache owns a key, hard-coded fallback, optional network loader, and a
11
- * merger that combines fresh / previous / fallback values. Freshness is the
12
- * envelope `refreshedAt` window (default one day), not cacache's short LRU TTL.
2
+ * Daily model metadata cache built on the shared memory-first cache package.
13
3
  *
14
4
  * @module
15
5
  */
16
- import { resolve } from "node:path";
17
- import * as environmentUtils from "@dbx-tools/shared-core/environment-utils";
6
+ import { getOrSet } from "@dbx-tools/cache/cache";
7
+ import * as errorUtils from "@dbx-tools/shared-core/error-utils";
18
8
  import * as log from "@dbx-tools/shared-core/log";
19
- import cacache from "cacache";
20
- import envPaths from "env-paths";
21
- import packageManifest from "../package.json" with { type: "json" };
9
+ import { modelMetadataCache } from "./_cache.js";
22
10
  import { MODEL_METADATA_TTL_MS } from "./_metadata-contract.js";
23
11
  const logger = log.logger("model/metadata-cache");
24
- const PACKAGE_IDENTITY = {
25
- identifier: packageManifest.name,
26
- version: packageManifest.version,
27
- };
28
- const inflight = new Map();
29
- /** Default cacache root for a package version under the dbx-tools cache dir. */
30
- export function defaultMetadataCacheDir(version) {
31
- const cacheDirectory = envPaths("dbx-tools", { suffix: "" }).cache;
32
- return resolve(cacheDirectory, "model-gateway", version);
33
- }
34
- /** Whether metadata caches should persist to disk in this process. */
35
- export function metadataCacheDiskEnabled(environment = process.env) {
36
- return !environmentUtils.isDatabricksAppEnv(environment);
37
- }
38
- /**
39
- * Create one daily cache backed by cacache memoization, with optional disk.
40
- */
41
- export function createMetadataCache(options) {
12
+ /** Create one namespaced view over the shared model metadata cache. */
13
+ export function createMetadataCache(options, cache = modelMetadataCache) {
42
14
  const ttlMs = options.ttlMs ?? MODEL_METADATA_TTL_MS;
43
- const diskEnabled = options.disk ?? metadataCacheDiskEnabled();
44
- const now = options.now ?? Date.now;
45
- const pathPromise = resolveCacheDir(options);
46
- let path = options.cacheDir;
47
- const flightKey = (cachePath, suffix = "") => `${cachePath}::${options.key}${suffix}`;
48
- /** Process-local store used when disk is off (Databricks Apps). */
49
- const memoryOnly = new Map();
50
- const resolveValue = (input) => options.merge(input);
51
- const isFresh = (record) => Boolean(record && now() - record.refreshedAt < ttlMs);
52
- const cachePath = async () => {
53
- path ??= await pathPromise;
54
- return path;
55
- };
56
- const readRecord = async () => {
57
- if (!diskEnabled)
58
- return memoryOnly.get(options.key);
59
- const resolvedPath = await cachePath();
60
- try {
61
- // cacache reads its in-memory memo first unless memoize is false
62
- const entry = await cacache.get(resolvedPath, options.key);
63
- return decodeRecord(entry.data);
64
- }
65
- catch (error) {
66
- if (isCacheMiss(error))
67
- return undefined;
68
- logger.warn("metadata cache cacache read failed", {
69
- key: options.key,
70
- path: resolvedPath,
71
- error,
72
- });
73
- return undefined;
74
- }
75
- };
76
- const writeRecord = async (record) => {
77
- if (!diskEnabled) {
78
- memoryOnly.set(options.key, record);
79
- return;
80
- }
81
- const resolvedPath = await cachePath();
82
- try {
83
- await cacache.put(resolvedPath, options.key, `${JSON.stringify(record)}\n`, {
84
- memoize: true,
85
- metadata: { refreshedAt: record.refreshedAt },
86
- });
87
- }
88
- catch (error) {
89
- logger.warn("metadata cache cacache write failed", {
90
- key: options.key,
91
- path: resolvedPath,
92
- error,
93
- });
94
- }
95
- };
96
- const persist = async (value, refreshedAt = now()) => {
97
- await writeRecord({ refreshedAt, value });
15
+ const valueKey = `model-metadata:value:${options.key}`;
16
+ const refreshKey = `model-metadata:refresh:${options.key}`;
17
+ const read = () => cache.get(valueKey);
18
+ const persist = async (value) => {
19
+ await cache.set(valueKey, value);
98
20
  return value;
99
21
  };
22
+ const resolveValue = (fresh, previous) => options.merge({ fresh, previous, fallback: options.fallback });
100
23
  const refresh = async (force) => {
101
- const resolvedPath = await cachePath();
102
- return coalesce(flightKey(resolvedPath), async () => {
103
- const previous = await readRecord();
104
- if (!force && isFresh(previous)) {
105
- return resolveValue({
106
- fresh: undefined,
107
- previous: previous?.value,
108
- fallback: options.fallback,
109
- });
110
- }
24
+ if (force)
25
+ await cache.delete(refreshKey);
26
+ let staleRefreshFailed = false;
27
+ await getOrSet(cache, refreshKey, async () => {
28
+ const previous = await read();
111
29
  let fresh;
112
30
  if (options.load) {
113
31
  try {
114
32
  fresh = await options.load();
115
33
  }
116
34
  catch (error) {
117
- logger.warn("metadata cache refresh failed; keeping last known good", {
35
+ logger.warn("metadata cache refresh failed; using cached or committed value", {
118
36
  key: options.key,
119
- error,
120
- path: resolvedPath,
121
- diskEnabled,
37
+ error: errorUtils.toError(error),
122
38
  });
39
+ staleRefreshFailed = previous !== undefined;
123
40
  }
124
41
  }
125
- const value = resolveValue({
126
- fresh,
127
- previous: previous?.value,
128
- fallback: options.fallback,
129
- });
130
- if (fresh !== undefined || !previous) {
131
- await persist(value);
132
- }
133
- return value;
134
- });
42
+ const resolved = resolveValue(fresh, previous);
43
+ if (fresh !== undefined || previous === undefined)
44
+ await persist(resolved);
45
+ return true;
46
+ }, { ttl: ttlMs, throwErrors: true });
47
+ if (staleRefreshFailed)
48
+ await cache.delete(refreshKey);
49
+ return resolveValue(undefined, await read());
135
50
  };
136
51
  return {
137
- get path() {
138
- if (!path) {
139
- throw new Error("metadata cache path is not resolved until the first cache read");
140
- }
141
- return path;
142
- },
143
- diskEnabled,
144
52
  get: () => refresh(false),
145
- peek: async () => (await readRecord())?.value,
53
+ peek: read,
146
54
  refresh: () => refresh(true),
147
55
  update: async (mutator) => {
148
- const resolvedPath = await cachePath();
149
- return coalesce(flightKey(resolvedPath, ":update"), async () => {
150
- const previous = await readRecord();
151
- const baseline = resolveValue({
152
- fresh: undefined,
153
- previous: previous?.value,
154
- fallback: options.fallback,
155
- });
156
- return persist(mutator(baseline));
157
- });
56
+ const value = await persist(mutator(resolveValue(undefined, await read())));
57
+ await cache.set(refreshKey, true, { ttl: ttlMs });
58
+ return value;
158
59
  },
159
60
  };
160
61
  }
161
- async function resolveCacheDir(options) {
162
- if (options.cacheDir)
163
- return options.cacheDir;
164
- const version = options.version ?? PACKAGE_IDENTITY.version;
165
- return defaultMetadataCacheDir(version);
166
- }
167
62
  /** Prefer a non-empty fresh array, else previous, else fallback. */
168
63
  export function mergePreferFreshList(input) {
169
64
  if (input.fresh && input.fresh.length > 0)
@@ -172,10 +67,7 @@ export function mergePreferFreshList(input) {
172
67
  return [...input.previous];
173
68
  return [...input.fallback];
174
69
  }
175
- /**
176
- * Shallow-merge record catalogues: fallback, then previous, then fresh keys.
177
- * Fresh values win per key.
178
- */
70
+ /** Shallow-merge record catalogues: fallback, then previous, then fresh keys. */
179
71
  export function mergePreferFreshRecord(input) {
180
72
  return {
181
73
  ...input.fallback,
@@ -183,49 +75,4 @@ export function mergePreferFreshRecord(input) {
183
75
  ...(input.fresh ?? {}),
184
76
  };
185
77
  }
186
- /** Test helper: wipe a cacache root and clear cacache memoization. */
187
- export async function resetMetadataCacheDir(cacheDir) {
188
- try {
189
- await cacache.rm.all(cacheDir);
190
- }
191
- catch {
192
- // empty / missing cache is fine
193
- }
194
- cacache.clearMemoized();
195
- for (const key of [...inflight.keys()]) {
196
- if (key.startsWith(`${cacheDir}::`))
197
- inflight.delete(key);
198
- }
199
- }
200
- function coalesce(key, work) {
201
- const existing = inflight.get(key);
202
- if (existing)
203
- return existing;
204
- const pending = work().finally(() => {
205
- if (inflight.get(key) === pending)
206
- inflight.delete(key);
207
- });
208
- inflight.set(key, pending);
209
- return pending;
210
- }
211
- function decodeRecord(data) {
212
- try {
213
- const parsed = JSON.parse(data.toString("utf8"));
214
- if (!parsed ||
215
- typeof parsed !== "object" ||
216
- typeof parsed.refreshedAt !== "number") {
217
- return undefined;
218
- }
219
- return parsed;
220
- }
221
- catch {
222
- return undefined;
223
- }
224
- }
225
- function isCacheMiss(error) {
226
- return Boolean(error &&
227
- typeof error === "object" &&
228
- "code" in error &&
229
- error.code === "ENOENT");
230
- }
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==
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBZSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEtBQUssVUFBVSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sS0FBSyxHQUFHLE1BQU0sNEJBQTRCLENBQUM7QUFFbEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQW1DbEQsdUVBQXVFO0FBQ3ZFLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsT0FBZ0MsRUFDaEMsUUFBd0Msa0JBQWtCO0lBRTFELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUkscUJBQXFCLENBQUM7SUFDckQsTUFBTSxRQUFRLEdBQUcsd0JBQXdCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2RCxNQUFNLFVBQVUsR0FBRywwQkFBMEIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTNELE1BQU0sSUFBSSxHQUFHLEdBQTJCLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFJLFFBQVEsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxLQUFRLEVBQWMsRUFBRTtRQUM3QyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFvQixFQUFFLFFBQXVCLEVBQUssRUFBRSxDQUN4RSxPQUFPLENB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Q0FDcEMsS0FBMkQ7SUFFM0QsT0FBTztRQUNMLEdBQUcsS0FBSyxDQUFDLFFBQVE7UUFDakIsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztLQUN2QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGFpbHkgbW9kZWwgbWV0YWRhdGEgY2FjaGUgYnVpbHQgb24gdGhlIHNoYXJlZCBtZW1vcnktZmlyc3QgY2FjaGUgcGFja2FnZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlQ2FjaGUsIGdldE9yU2V0IH0gZnJvbSBcIkBkYngtdG9vbHMvY2FjaGUvY2FjaGVcIjtcbmltcG9ydCAqIGFzIGVycm9yVXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZXJyb3ItdXRpbHNcIjtcbmltcG9ydCAqIGFzIGxvZyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9sb2dcIjtcblxuaW1wb3J0IHsgbW9kZWxNZXRhZGF0YUNhY2hlIH0gZnJvbSBcIi4vX2NhY2hlLnRzXCI7XG5pbXBvcnQgeyBNT0RFTF9NRVRBREFUQV9UVExfTVMgfSBmcm9tIFwiLi9fbWV0YWRhdGEtY29udHJhY3QudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1vZGVsL21ldGFkYXRhLWNhY2hlXCIpO1xuXG4vKiogRmFjdG9yeSBpbnB1dHMgZm9yIG9uZSBuYW1lZCBtZXRhZGF0YSBjYWNoZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFDYWNoZU9wdGlvbnM8VD4ge1xuICAvKiogU3RhYmxlIGNhY2hlIGtleS4gKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIC8qKiBIYXJkLWNvZGVkIC8gY29tbWl0dGVkIGJhc2VsaW5lIHVzZWQgd2hlbiBzdG9yZSBhbmQgbG9hZCBib3RoIG1pc3MuICovXG4gIHJlYWRvbmx5IGZhbGxiYWNrOiBUO1xuICAvKiogT3B0aW9uYWwgcmVmcmVzaCBzb3VyY2UuICovXG4gIHJlYWRvbmx5IGxvYWQ/OiAoKSA9PiBQcm9taXNlPFQ+O1xuICAvKiogQ29tYmluZSBhIGZyZXNoIGxvYWQsIHByaW9yIHN0b3JlIHZhbHVlLCBhbmQgdGhlIGhhcmQtY29kZWQgZmFsbGJhY2suICovXG4gIHJlYWRvbmx5IG1lcmdlOiAoaW5wdXQ6IE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PFQ+KSA9PiBUO1xuICAvKiogRnJlc2huZXNzIHdpbmRvdzsgZGVmYXVsdHMgdG8gb25lIGRheS4gKi9cbiAgcmVhZG9ubHkgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBBcmd1bWVudHMgcGFzc2VkIHRvIGEgY2FjaGUgbWVyZ2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxUPiB7XG4gIHJlYWRvbmx5IGZyZXNoOiBUIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBwcmV2aW91czogVCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZmFsbGJhY2s6IFQ7XG59XG5cbi8qKiBPbmUgbmFtZXNwYWNlZCB2aWV3IG92ZXIgdGhlIHNoYXJlZCBtZXRhZGF0YSBjYWNoZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFDYWNoZTxUPiB7XG4gIC8qKiBSZXR1cm4gYSBmcmVzaC1vci1mYWxsYmFjayB2YWx1ZSwgcmVmcmVzaGluZyB3aGVuIHN0YWxlLiAqL1xuICBnZXQoKTogUHJvbWlzZTxUPjtcbiAgLyoqIFJlYWQgcHJvY2VzcyBtZW1vcnkgd2l0aG91dCByZWZyZXNoaW5nLiAqL1xuICBwZWVrKCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG4gIC8qKiBNdXRhdGUgdGhlIGNhY2hlZCB2YWx1ZSBhbmQgcGVyc2lzdCBpdC4gKi9cbiAgdXBkYXRlKG11dGF0b3I6IChjdXJyZW50OiBUKSA9PiBUKTogUHJvbWlzZTxUPjtcbiAgLyoqIEZvcmNlIGEgcmVmcmVzaCBhdHRlbXB0IGV2ZW4gd2hlbiB0aGUgZW50cnkgaXMgc3RpbGwgZnJlc2guICovXG4gIHJlZnJlc2goKTogUHJvbWlzZTxUPjtcbn1cblxuLyoqIENyZWF0ZSBvbmUgbmFtZXNwYWNlZCB2aWV3IG92ZXIgdGhlIHNoYXJlZCBtb2RlbCBtZXRhZGF0YSBjYWNoZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXRhZGF0YUNhY2hlPFQ+KFxuICBvcHRpb25zOiBNZXRhZGF0YUNhY2hlT3B0aW9uczxUPixcbiAgY2FjaGU6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNhY2hlPiA9IG1vZGVsTWV0YWRhdGFDYWNoZSxcbik6IE1ldGFkYXRhQ2FjaGU8VD4ge1xuICBjb25zdCB0dGxNcyA9IG9wdGlvbnMudHRsTXMgPz8gTU9ERUxfTUVUQURBVEFfVFRMX01TO1xuICBjb25zdCB2YWx1ZUtleSA9IGBtb2RlbC1tZXRhZGF0YTp2YWx1ZToke29wdGlvbnMua2V5fWA7XG4gIGNvbnN0IHJlZnJlc2hLZXkgPSBgbW9kZWwtbWV0YWRhdGE6cmVmcmVzaDoke29wdGlvbnMua2V5fWA7XG5cbiAgY29uc3QgcmVhZCA9ICgpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+ID0+IGNhY2hlLmdldDxUPih2YWx1ZUtleSk7XG4gIGNvbnN0IHBlcnNpc3QgPSBhc3luYyAodmFsdWU6IFQpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBhd2FpdCBjYWNoZS5zZXQodmFsdWVLZXksIHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIGNvbnN0IHJlc29sdmVWYWx1ZSA9IChmcmVzaDogVCB8IHVuZGVmaW5lZCwgcHJldmlvdXM6IFQgfCB1bmRlZmluZWQpOiBUID0+XG4gICAgb3B0aW9ucy5tZXJnZSh7IGZyZXNoLCBwcmV2aW91cywgZmFsbGJhY2s6IG9wdGlvbnMuZmFsbGJhY2sgfSk7XG5cbiAgY29uc3QgcmVmcmVzaCA9IGFzeW5jIChmb3JjZTogYm9vbGVhbik6IFByb21pc2U8VD4gPT4ge1xuICAgIGlmIChmb3JjZSkgYXdhaXQgY2FjaGUuZGVsZXRlKHJlZnJlc2hLZXkpO1xuICAgIGxldCBzdGFsZVJlZnJlc2hGYWlsZWQgPSBmYWxzZTtcbiAgICBhd2FpdCBnZXRPclNldChcbiAgICAgIGNhY2hlLFxuICAgICAgcmVmcmVzaEtleSxcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCByZWFkKCk7XG4gICAgICAgIGxldCBmcmVzaDogVCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG9wdGlvbnMubG9hZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmcmVzaCA9IGF3YWl0IG9wdGlvbnMubG9hZCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIm1ldGFkYXRhIGNhY2hlIHJlZnJlc2ggZmFpbGVkOyB1c2luZyBjYWNoZWQgb3IgY29tbWl0dGVkIHZhbHVlXCIsIHtcbiAgICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0YWxlUmVmcmVzaEZhaWxlZCA9IHByZXZpb3VzICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVZhbHVlKGZyZXNoLCBwcmV2aW91cyk7XG4gICAgICAgIGlmIChmcmVzaCAhPT0gdW5kZWZpbmVkIHx8IHByZXZpb3VzID09PSB1bmRlZmluZWQpIGF3YWl0IHBlcnNpc3QocmVzb2x2ZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICB7IHR0bDogdHRsTXMsIHRocm93RXJyb3JzOiB0cnVlIH0sXG4gICAgKTtcbiAgICBpZiAoc3RhbGVSZWZyZXNoRmFpbGVkKSBhd2FpdCBjYWNoZS5kZWxldGUocmVmcmVzaEtleSk7XG4gICAgcmV0dXJuIHJlc29sdmVWYWx1ZSh1bmRlZmluZWQsIGF3YWl0IHJlYWQoKSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQ6ICgpID0+IHJlZnJlc2goZmFsc2UpLFxuICAgIHBlZWs6IHJlYWQsXG4gICAgcmVmcmVzaDogKCkgPT4gcmVmcmVzaCh0cnVlKSxcbiAgICB1cGRhdGU6IGFzeW5jIChtdXRhdG9yKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBlcnNpc3QobXV0YXRvcihyZXNvbHZlVmFsdWUodW5kZWZpbmVkLCBhd2FpdCByZWFkKCkpKSk7XG4gICAgICBhd2FpdCBjYWNoZS5zZXQocmVmcmVzaEtleSwgdHJ1ZSwgeyB0dGw6IHR0bE1zIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKiBQcmVmZXIgYSBub24tZW1wdHkgZnJlc2ggYXJyYXksIGVsc2UgcHJldmlvdXMsIGVsc2UgZmFsbGJhY2suICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcmVmZXJGcmVzaExpc3Q8VD4oaW5wdXQ6IE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PHJlYWRvbmx5IFRbXT4pOiBUW10ge1xuICBpZiAoaW5wdXQuZnJlc2ggJiYgaW5wdXQuZnJlc2gubGVuZ3RoID4gMCkgcmV0dXJuIFsuLi5pbnB1dC5mcmVzaF07XG4gIGlmIChpbnB1dC5wcmV2aW91cyAmJiBpbnB1dC5wcmV2aW91cy5sZW5ndGggPiAwKSByZXR1cm4gWy4uLmlucHV0LnByZXZpb3VzXTtcbiAgcmV0dXJuIFsuLi5pbnB1dC5mYWxsYmFja107XG59XG5cbi8qKiBTaGFsbG93LW1lcmdlIHJlY29yZCBjYXRhbG9ndWVzOiBmYWxsYmFjaywgdGhlbiBwcmV2aW91cywgdGhlbiBmcmVzaCBrZXlzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQ8VD4oXG4gIGlucHV0OiBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBUPj4+LFxuKTogUmVjb3JkPHN0cmluZywgVD4ge1xuICByZXR1cm4ge1xuICAgIC4uLmlucHV0LmZhbGxiYWNrLFxuICAgIC4uLihpbnB1dC5wcmV2aW91cyA/PyB7fSksXG4gICAgLi4uKGlucHV0LmZyZXNoID8/IHt9KSxcbiAgfTtcbn1cbiJdfQ==
@@ -16,14 +16,12 @@ interface MetadataIndex {
16
16
  * Safe to call on gateway startup. Concurrent callers share one refresh.
17
17
  */
18
18
  export declare function refreshModelMetadata(): Promise<MetadataIndex>;
19
- /** Load cacache / memory entries without forcing a network refresh. */
19
+ /** Load shared cache entries without forcing a network refresh. */
20
20
  export declare function hydrateModelMetadata(): Promise<MetadataIndex>;
21
- /** Absolute cacache root used by the documentation / learned caches. */
22
- export declare function modelMetadataCachePath(): string;
23
21
  export { modelStatusFor, retiredModelNames } from "./_retirement.ts";
24
22
  /** Return the committed reasoning-effort catalogue. Cached per process. */
25
23
  export declare function reasoningModelCatalogue(): ReasoningModelCatalogue;
26
- /** Return error-learned reasoning ladders persisted in the metadata cache. */
24
+ /** Return error-learned reasoning ladders from the shared model cache. */
27
25
  export declare function learnedReasoningCatalogue(): ReasoningModelCatalogue;
28
26
  /**
29
27
  * Store levels learned from an upstream error and persist them write-through.
@@ -37,7 +35,7 @@ export declare function rememberReasoningLevels(model: string, levels: readonly
37
35
  *
38
36
  * Accepts the same nested Databricks envelopes as {@link parseReasoningLevels}.
39
37
  * Returns the levels that were stored (or the current lookup when parse yields
40
- * nothing). The raw error body is never written to disk.
38
+ * nothing). The raw error body is never cached.
41
39
  */
42
40
  export declare function learnReasoningLevelsFromError(model: string, body: unknown): Promise<ReasoningLevel[]>;
43
41
  /** Resolve documented model capabilities from a name or endpoint summary. */