@dbx-tools/model 0.9.129 → 0.9.132

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
@@ -1,14 +1,12 @@
1
1
  # @dbx-tools/model
2
2
 
3
- Workspace-aware Databricks Model Serving selection.
4
-
5
- Turn a loose model request such as `"claude sonnet"` or `"chat-fast"` into a
6
- concrete serving endpoint in the current workspace. The client lists
3
+ Resolve a loose model request such as `"claude sonnet"` or `"chat-fast"` to a
4
+ concrete Databricks Model Serving endpoint in the active workspace. The client lists
7
5
  `/serving-endpoints`, caches and enriches the
8
6
  catalogue, classifies endpoints by capability, fuzzy-matches names, and falls
9
7
  back to a small static floor when the live catalogue is unavailable.
10
8
 
11
- ## Quick Start
9
+ ## Quick start
12
10
 
13
11
  ```ts
14
12
  import { createModelClient } from "@dbx-tools/model";
@@ -18,10 +16,23 @@ const selected = await models.resolveModel({ explicit: "sonnet" });
18
16
  console.log(selected.modelId);
19
17
  ```
20
18
 
19
+ By default, non-exact requests route to workspace serving endpoints such as
20
+ `databricks-gpt-5-6-sol`. Opt in to route Responses requests through the matching
21
+ `system.ai.*` AI Gateway service instead:
22
+
23
+ ```ts
24
+ const models = await createModelClient({ preferSystemModels: true });
25
+ const route = await models.route({ explicit: "gpt-5-6-sol", protocol: "responses" });
26
+ // route.modelId === "system.ai.gpt-5-6-sol"
27
+ ```
28
+
29
+ An exact endpoint id or exact `system.ai.*` name always wins, regardless of this
30
+ preference.
31
+
21
32
  Browser-safe request/result schemas and endpoint classification types live in
22
- [`@dbx-tools/shared-model`](../../shared/model).
33
+ [@dbx-tools/shared-model](../../shared/model).
23
34
 
24
- Key features:
35
+ The package:
25
36
 
26
37
  - Lists Databricks Model Serving endpoints through the SDK and normalizes them
27
38
  into a stable summary shape with TypeScript-owned family and reasoning-effort
@@ -43,27 +54,27 @@ Key features:
43
54
  - Provides a small static fallback floor for local tools and degraded workspace
44
55
  access.
45
56
 
46
- ## Use With AppKit Model Serving
57
+ ## Use with AppKit Model Serving
47
58
 
48
- Native AppKit's Model Serving plugin is the right choice when you already know
49
- the endpoint alias you want. It gives you authenticated invoke/stream routes,
59
+ Use native AppKit's Model Serving plugin when you already know the endpoint
60
+ alias you want. It gives you authenticated invoke/stream routes,
50
61
  OBO execution, generated endpoint types, request-body filtering, and frontend
51
62
  hooks.
52
63
 
53
64
  Use this package before or beside that layer when the hard part is choosing the
54
65
  endpoint:
55
66
 
56
- - resolve loose human input such as `"sonnet"` or `"fast"` against the live
57
- workspace catalogue;
58
- - group endpoints into capability classes like `chat-thinking`, `chat-balanced`,
59
- `chat-fast`, and `embedding`;
60
- - enforce class ceilings so a caller can degrade to smaller models without
61
- escalating to a larger one;
62
- - build model pickers and debug routes from a cached, enriched endpoint list;
63
- - keep local agents and CLIs working with a static fallback when catalogue
67
+ - Resolve loose human input such as `"sonnet"` or `"fast"` against the live
68
+ workspace catalogue.
69
+ - Group endpoints into capability classes like `chat-thinking`, `chat-balanced`,
70
+ `chat-fast`, and `embedding`.
71
+ - Enforce class ceilings so a caller can degrade to smaller models without
72
+ escalating to a larger one.
73
+ - Build model pickers and debug routes from a cached, enriched endpoint list.
74
+ - Keep local agents and CLIs working with a static fallback when catalogue
64
75
  access is unavailable.
65
76
 
66
- ## Route Requests
77
+ ## Route requests
67
78
 
68
79
  ```ts
69
80
  import { createModelClient } from "@dbx-tools/model";
@@ -94,7 +105,7 @@ headers, exposes profiles, and returns the package's generated metadata. Its
94
105
  portable `@dbx-tools/model/python` entrypoint excludes the AppKit catalogue
95
106
  wrapper while reusing the same pure ranking and policy implementation.
96
107
 
97
- ## Select One Model
108
+ ## Select one model
98
109
 
99
110
  ```ts
100
111
  import { createWorkspaceClient } from "@databricks/appkit";
@@ -114,7 +125,7 @@ console.log(selected.modelId, selected.source);
114
125
  catalogue, applies fuzzy matching when an explicit string is present, then
115
126
  returns a single `modelId` plus a source label explaining why that endpoint won.
116
127
  Set `liveOnly: true` for an unpinned production default that must select the
117
- highest-ranked currently available endpoint and must not fall through to an
128
+ highest-ranked available endpoint and must not fall through to an
118
129
  offline static id when the catalogue has no match.
119
130
  With no explicit id or class, automatic selection prefers the highest-ranked
120
131
  live GPT family member, then falls back to the highest-ranked live chat model.
@@ -123,7 +134,7 @@ The `source` label is useful for logs and debug UIs. It distinguishes explicit
123
134
  matches from class-based selection, environment defaults, and fallback results,
124
135
  so operators can tell whether a request used the intended model policy.
125
136
 
126
- ## Build A Model Picker
137
+ ## Build a model picker
127
138
 
128
139
  ```ts
129
140
  import { resolve } from "@dbx-tools/model";
@@ -159,7 +170,7 @@ exact serving task, `dimension` or `minDimension`/`maxDimension` for embedding
159
170
  shape, `reasoningEffort` for supported reasoning levels, and `requiresTools`
160
171
  for complete tool-call support.
161
172
 
162
- ## Work With A Held Catalogue
173
+ ## Work with a held catalogue
163
174
 
164
175
  When you already have endpoint summaries, use the pure resolver functions from
165
176
  `resolve` and `modelCatalog` without another workspace call:
@@ -177,10 +188,10 @@ const picked = resolve.resolveModel(endpoints, {
177
188
  ```
178
189
 
179
190
  The class acts as a ceiling. `chat-balanced` may fall back to `chat-fast`, but
180
- will not escalate to `chat-thinking`. Embedding endpoints are considered only
191
+ does not escalate to `chat-thinking`. Embedding endpoints are considered only
181
192
  when the requested class is `embedding`.
182
193
 
183
- ## List And Cache Serving Endpoints
194
+ ## List and cache serving endpoints
184
195
 
185
196
  ```ts
186
197
  import { modelCatalog } from "@dbx-tools/model";
@@ -197,10 +208,10 @@ await modelCatalog.clearServingEndpointsCache(host);
197
208
  endpoints with classification and embedding dimensions, and isolates entries by
198
209
  workspace host and trusted credential identity. If a refresh fails, it can return
199
210
  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
211
+ useful for scripts that only need the SDK response and do not want a cache
201
212
  dependency.
202
213
 
203
- ## Fuzzy Resolve Endpoint Names
214
+ ## Fuzzy resolve endpoint names
204
215
 
205
216
  ```ts
206
217
  const matches = serving.searchServingEndpoints("claude sonnet", endpoints, {
@@ -214,7 +225,7 @@ Fuzzy matching is intentionally a server concern because it depends on the live
214
225
  workspace catalogue and may re-list on misses. Disable it in callers that require
215
226
  exact endpoint ids.
216
227
 
217
- ## Resolve Against A Catalogue That May Be Stale
228
+ ## Resolve against a catalogue that may be stale
218
229
 
219
230
  ```ts
220
231
  const resolved = await resolve.rankModelIdLive((force) => loadCatalogue(force), "opus");
@@ -225,10 +236,10 @@ reloads once with `force` before giving up, so a model deployed after your cache
225
236
  warmed still resolves without a restart. You supply the loader, so the caching
226
237
  policy stays yours: `listServingEndpoints` and its shared project cache, a plain
227
238
  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
239
+ a single snapshot. Unlike `serving.resolveModelId`, it breaks equal match scores
229
240
  by class and then version, so `"opus"` prefers `opus-5` over `opus-4-7`.
230
241
 
231
- ## Call An Endpoint Directly
242
+ ## Call an endpoint directly
232
243
 
233
244
  ```ts
234
245
  import { invoke } from "@dbx-tools/model";
@@ -258,7 +269,7 @@ tool-bearing Chat Completions, while keeping GPT-OSS on its supported Chat path.
258
269
  The TypeScript helper applies this policy so every Node consumer shares one version
259
270
  threshold without loading a native library.
260
271
 
261
- ## Read Published Model Metadata
272
+ ## Read published model metadata
262
273
 
263
274
  ```ts
264
275
  import { metadata } from "@dbx-tools/model";
@@ -270,11 +281,21 @@ const status = metadata.modelStatusFor("system.ai.gemini-2-5-pro");
270
281
 
271
282
  The package ships committed snapshots generated from Databricks documentation
272
283
  by `bun run --filter '@dbx-tools/model' metadata`. Runtime calls normalize endpoint, display,
273
- foundation-model, and provider identities into memoized sets and maps; they do
284
+ foundation-model, and provider identities into memoized sets and maps. They do
274
285
  not fetch documentation. `modelMetadataFor()` returns status, capabilities, and
275
286
  published limits together for a string or `ServingEndpointSummary`.
276
287
 
277
- ## Use Static Fallbacks
288
+ Native web-search capability starts with the documented model set. Later
289
+ versions in the same hosted foundation-model family inherit the capability by
290
+ `versionTuple`. GPT-OSS models never inherit native web search. Custom and
291
+ external endpoint names also don't inherit because digits in those names aren't
292
+ treated as model versions.
293
+
294
+ The model gateway can override a discovered capability for routing and model
295
+ catalogues. Use that gateway override to disable web search when a workspace
296
+ route doesn't support a capability that metadata would otherwise advertise.
297
+
298
+ ## Use static fallbacks
278
299
 
279
300
  ```ts
280
301
  import { classes, fallback } from "@dbx-tools/model";
@@ -286,7 +307,7 @@ const modelId = fallback.modelForClass(cls);
286
307
 
287
308
  The fallback floor gives agents and local scripts a stable answer when a
288
309
  workspace cannot list endpoints. Prefer live catalogue resolution for production
289
- policy decisions; fallbacks are a last resort.
310
+ policy decisions. Use fallbacks only when live resolution is unavailable.
290
311
 
291
312
  ## Modules
292
313
 
@@ -305,4 +326,4 @@ policy decisions; fallbacks are a last resort.
305
326
  - `fallback` - static fallback model ids per class.
306
327
 
307
328
  The AppKit-Mastra integration uses this package through
308
- [`@dbx-tools/appkit-mastra`](../appkit-mastra).
329
+ [@dbx-tools/appkit-mastra](../appkit-mastra).
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.129";
6
+ export const PACKAGE_VERSION = "0.9.132";
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";
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.129";
2
+ export declare const PACKAGE_VERSION = "0.9.132";
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";
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.129";
5
+ export const PACKAGE_VERSION = "0.9.132";
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhOLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxMLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdsRSxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMjlcIjtcbmV4cG9ydCAqIGFzIGJpbmRpbmdzIGZyb20gXCIuL3NyYy9iaW5kaW5ncy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NlcyBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NpZnkgZnJvbSBcIi4vc3JjL2NsYXNzaWZ5LnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBtZXRhZGF0YSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhQ2FjaGUgZnJvbSBcIi4vc3JjL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbENhdGFsb2cgZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2xpZW50IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIHBvbGljeSBmcm9tIFwiLi9zcmMvcG9saWN5LnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdUcmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgU0VSVklOR19FTkRQT0lOVFNfUEFUSCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCwgQUlfR0FURVdBWV9DT0RFWF9SRVNQT05TRVNfUEFUSCwgQU5USFJPUElDX0JBU0VfUEFUSCwgQU5USFJPUElDX01FU1NBR0VTX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUywgTU9ERUxfUkFURV9MSU1JVFNfVVJMLCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLCBSRVRJUkVEX01PREVMU19VUkwsIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZXRhZGF0YUNhY2hlT3B0aW9ucywgTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQsIE1ldGFkYXRhQ2FjaGUgfSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsQXV0aE9wdGlvbnMsIE1vZGVsQ2xpZW50T3B0aW9ucywgTW9kZWxDbGllbnRTdGF0dXMsIE1vZGVsUHJvdG9jb2wsIE1vZGVsUm91dGVJbnB1dCwgTW9kZWxSb3V0ZSwgTW9kZWxDbGllbnQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgeyBNb2RlbEZhbWlseSB9IGZyb20gXCIuL3NyYy9wb2xpY3kudHNcIjtcbmV4cG9ydCB7IFJFQVNPTklOR19MRVZFTFMgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlYXNvbmluZ0xldmVsLCBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSwgQWRhcHRlZFJlcXVlc3RSZWFzb25pbmcgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlbGVjdE1vZGVsSW5wdXQsIFNlYXJjaE1vZGVsc0lucHV0IH0gZnJvbSBcIi4vc3JjL3Jlc29sdmUudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4cG9ydHMudHNcIjtcbiJdfQ==
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhOLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxMLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdsRSxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMzJcIjtcbmV4cG9ydCAqIGFzIGJpbmRpbmdzIGZyb20gXCIuL3NyYy9iaW5kaW5ncy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NlcyBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NpZnkgZnJvbSBcIi4vc3JjL2NsYXNzaWZ5LnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBtZXRhZGF0YSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhQ2FjaGUgZnJvbSBcIi4vc3JjL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbENhdGFsb2cgZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2xpZW50IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIHBvbGljeSBmcm9tIFwiLi9zcmMvcG9saWN5LnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdUcmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgU0VSVklOR19FTkRQT0lOVFNfUEFUSCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCwgQUlfR0FURVdBWV9DT0RFWF9SRVNQT05TRVNfUEFUSCwgQU5USFJPUElDX0JBU0VfUEFUSCwgQU5USFJPUElDX01FU1NBR0VTX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUywgTU9ERUxfUkFURV9MSU1JVFNfVVJMLCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLCBSRVRJUkVEX01PREVMU19VUkwsIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZXRhZGF0YUNhY2hlT3B0aW9ucywgTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQsIE1ldGFkYXRhQ2FjaGUgfSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsQXV0aE9wdGlvbnMsIE1vZGVsQ2xpZW50T3B0aW9ucywgTW9kZWxDbGllbnRTdGF0dXMsIE1vZGVsUHJvdG9jb2wsIE1vZGVsUm91dGVJbnB1dCwgTW9kZWxSb3V0ZSwgTW9kZWxDbGllbnQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgeyBNb2RlbEZhbWlseSB9IGZyb20gXCIuL3NyYy9wb2xpY3kudHNcIjtcbmV4cG9ydCB7IFJFQVNPTklOR19MRVZFTFMgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlYXNvbmluZ0xldmVsLCBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSwgQWRhcHRlZFJlcXVlc3RSZWFzb25pbmcgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlbGVjdE1vZGVsSW5wdXQsIFNlYXJjaE1vZGVsc0lucHV0IH0gZnJvbSBcIi4vc3JjL3Jlc29sdmUudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4cG9ydHMudHNcIjtcbiJdfQ==
@@ -9,6 +9,7 @@ declare const ModelClass: {
9
9
  interface NativeRankingOptions {
10
10
  readonly includeDeprecated?: boolean;
11
11
  readonly modelClass?: ModelClass;
12
+ readonly preferSystemModels?: boolean;
12
13
  readonly task?: string;
13
14
  }
14
15
  /** Rank endpoint records through the TypeScript-owned model policy. */
@@ -29,6 +29,7 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
29
29
  const search = query.search?.trim();
30
30
  const requestedClass = options.modelClass ?? query.modelClass;
31
31
  const includeDeprecated = query.includeDeprecated ?? options.includeDeprecated ?? false;
32
+ const preferSystemModels = options.preferSystemModels ?? false;
32
33
  const eligible = requestedClass ? classesAtOrBelow(requestedClass) : CHAT_CLASS_ORDER;
33
34
  const candidates = [];
34
35
  if (search && requestedClass === undefined) {
@@ -56,28 +57,35 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
56
57
  }
57
58
  }
58
59
  }
59
- let ranked = !search && requestedClass === undefined
60
- ? preferLatestWithinLeadingFamily(candidates)
61
- : candidates;
62
- if (search) {
63
- const exact = candidates.find((candidate) => candidate.endpoint.name === search);
64
- if (exact) {
65
- ranked = [{ ...exact, score: 0 }];
66
- }
67
- else {
60
+ const exact = search
61
+ ? candidates.find((candidate) => candidate.endpoint.name === search)
62
+ : undefined;
63
+ let ranked;
64
+ if (exact) {
65
+ ranked = [{ ...exact, score: 0 }];
66
+ }
67
+ else {
68
+ const selectable = preferSystemModels
69
+ ? preferSystemCandidates(candidates)
70
+ : candidates.filter((candidate) => !isSystemModel(candidate.endpoint));
71
+ ranked =
72
+ !search && requestedClass === undefined
73
+ ? preferLatestWithinLeadingFamily(selectable, preferSystemModels)
74
+ : selectable;
75
+ if (search) {
68
76
  const threshold = query.threshold ?? DEFAULT_FUZZY_THRESHOLD;
69
77
  const searchTokens = tokenize(search);
70
- const tokenMatches = candidates
78
+ const tokenMatches = selectable
71
79
  .filter((candidate) => {
72
80
  const candidateTokens = new Set(searchableValues(candidate.endpoint).flatMap(tokenize));
73
81
  return (searchTokens.length > 0 && searchTokens.every((token) => candidateTokens.has(token)));
74
82
  })
75
83
  .map((candidate) => ({ ...candidate, score: 0 }));
76
84
  if (tokenMatches.length > 0) {
77
- ranked = tokenMatches.sort(compareRanked);
85
+ ranked = tokenMatches.sort((left, right) => compareRanked(left, right, preferSystemModels));
78
86
  }
79
87
  else {
80
- const fuse = new Fuse(candidates, {
88
+ const fuse = new Fuse(selectable, {
81
89
  keys: [
82
90
  "endpoint.name",
83
91
  "endpoint.displayName",
@@ -97,7 +105,7 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
97
105
  .search(normalizedSearch)
98
106
  .filter((result) => (result.score ?? 0) <= threshold)
99
107
  .map((result) => ({ ...result.item, score: result.score ?? 0 }))
100
- .sort(compareRanked)
108
+ .sort((left, right) => compareRanked(left, right, preferSystemModels))
101
109
  : [];
102
110
  }
103
111
  }
@@ -108,7 +116,7 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
108
116
  }));
109
117
  return query.limit === undefined ? restored : restored.slice(0, Math.max(0, query.limit));
110
118
  }
111
- function preferLatestWithinLeadingFamily(candidates) {
119
+ function preferLatestWithinLeadingFamily(candidates, preferSystemModels) {
112
120
  const leading = candidates[0];
113
121
  if (!leading)
114
122
  return [];
@@ -117,7 +125,7 @@ function preferLatestWithinLeadingFamily(candidates) {
117
125
  return [...candidates];
118
126
  const sameFamily = candidates
119
127
  .filter((candidate) => modelFamily(candidate.endpoint.name) === family)
120
- .sort(compareRanked);
128
+ .sort((left, right) => compareRanked(left, right, preferSystemModels));
121
129
  const selected = new Set(sameFamily.map((candidate) => candidate.endpoint.name));
122
130
  return [
123
131
  ...sameFamily,
@@ -215,10 +223,16 @@ export function normalizeEndpoints(endpoints) {
215
223
  return modelClass ? { ...summary, class: modelClass } : summary;
216
224
  });
217
225
  }
218
- function compareRanked(left, right) {
226
+ function compareRanked(left, right, preferSystemModels) {
219
227
  const score = Math.round((left.score ?? 0) * 1000) - Math.round((right.score ?? 0) * 1000);
220
228
  if (score !== 0)
221
229
  return score;
230
+ if (preferSystemModels) {
231
+ const leftSystem = isSystemModel(left.endpoint);
232
+ const rightSystem = isSystemModel(right.endpoint);
233
+ if (leftSystem !== rightSystem)
234
+ return leftSystem ? -1 : 1;
235
+ }
222
236
  const leftOss = isOpenWeightsGpt(left.endpoint.name);
223
237
  const rightOss = isOpenWeightsGpt(right.endpoint.name);
224
238
  if (leftOss !== rightOss)
@@ -235,6 +249,15 @@ function compareRanked(left, right) {
235
249
  return variant;
236
250
  return MODEL_CLASS_ORDER.indexOf(left.modelClass) - MODEL_CLASS_ORDER.indexOf(right.modelClass);
237
251
  }
252
+ function preferSystemCandidates(candidates) {
253
+ return [
254
+ ...candidates.filter((candidate) => isSystemModel(candidate.endpoint)),
255
+ ...candidates.filter((candidate) => !isSystemModel(candidate.endpoint)),
256
+ ];
257
+ }
258
+ function isSystemModel(endpoint) {
259
+ return endpoint.name.toLowerCase().startsWith("system.ai.");
260
+ }
238
261
  function modelVariantRank(name) {
239
262
  if (!/(?:^|[-_.])gpt(?:[-_.]|$)/i.test(name))
240
263
  return 2;
@@ -296,4 +319,4 @@ function finiteNumber(value) {
296
319
  function booleanValue(value) {
297
320
  return typeof value === "boolean" ? value : undefined;
298
321
  }
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JhbmtpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3JhbmtpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsVUFBVSxJQUFJLGdCQUFnQixHQUsvQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JGLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gscUJBQXFCLEVBQ3JCLGlCQUFpQixHQUNsQixNQUFNLGFBQWEsQ0FBQztBQUdyQixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztBQUVwQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsU0FBNEMsRUFDNUMsUUFBb0IsRUFBRSxFQUN0QixVQUFnQyxFQUFFO0lBRWxDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENB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eyBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MgYXMgTW9kZWxDbGFzc1ZhbHVlcyxcbiAgdHlwZSBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NUeXBlLFxuICB0eXBlIE1vZGVsUXVlcnksXG4gIHR5cGUgUmFua2VkTW9kZWwsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuaW1wb3J0IHsgdG9Nb2RlbERpc3BsYXlOYW1lIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2Rpc3BsYXlcIjtcbmltcG9ydCBGdXNlIGZyb20gXCJmdXNlLmpzXCI7XG5cbmltcG9ydCB7IG1vZGVsU3RhdHVzRm9yIH0gZnJvbSBcIi4vX3JldGlyZW1lbnQudHNcIjtcbmltcG9ydCB7IGNsYXNzZXNBdE9yQmVsb3csIENIQVRfQ0xBU1NfT1JERVIsIE1PREVMX0NMQVNTX09SREVSIH0gZnJvbSBcIi4vY2xhc3Nlcy50c1wiO1xuaW1wb3J0IHtcbiAgY2xhc3NpZnlFbmRwb2ludHMsXG4gIGVuZHBvaW50Q2FwYWJpbGl0aWVzLFxuICBzdXBwb3J0c1Rvb2xzQnlGYW1pbHksXG4gIHZlcnNpb25UdXBsZSxcbn0gZnJvbSBcIi4vY2xhc3NpZnkudHNcIjtcbmltcG9ydCB7XG4gIGlzT3BlbldlaWdodHNHcHQsXG4gIG1vZGVsRmFtaWx5LFxuICBtb2RlbFJlYXNvbmluZ0VmZm9ydHMsXG4gIG1vZGVsU2VydmljZU5hbWVzLFxufSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxudHlwZSBNb2RlbENsYXNzID0gTW9kZWxDbGFzc1R5cGU7XG5jb25zdCBNb2RlbENsYXNzID0gTW9kZWxDbGFzc1ZhbHVlcztcblxuY29uc3QgREVGQVVMVF9GVVpaWV9USFJFU0hPTEQgPSAwLjQ7XG5cbmludGVyZmFjZSBOYXRpdmVSYW5raW5nT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGluY2x1ZGVEZXByZWNhdGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG4gIHJlYWRvbmx5IHRhc2s/OiBzdHJpbmc7XG59XG5cbi8qKiBSYW5rIGVuZHBvaW50IHJlY29yZHMgdGhyb3VnaCB0aGUgVHlwZVNjcmlwdC1vd25lZCBtb2RlbCBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gcmFua0VuZHBvaW50cyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIHF1ZXJ5OiBNb2RlbFF1ZXJ5ID0ge30sXG4gIG9wdGlvbnM6IE5hdGl2ZVJhbmtpbmdPcHRpb25zID0ge30sXG4pOiBSYW5rZWRNb2RlbFtdIHtcbiAgY29uc3QgZmlsdGVyZWQgPSBlbmRwb2ludHMuZmlsdGVyKChlbmRwb2ludCkgPT4gbWF0Y2hlc01vZGVsUXVlcnkoZW5kcG9pbnQsIHF1ZXJ5KSk7XG4gIGNvbnN0IG9yaWdpbmFsQnlOYW1lID0gbmV3IE1hcChmaWx0ZXJlZC5tYXAoKGVuZHBvaW50KSA9PiBbZW5kcG9pbnQubmFtZSwgZW5kcG9pbnRdKSk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBmaWx0ZXJlZC5tYXAoKGVuZHBvaW50KSA9PiAoe1xuICAgIC4uLmVuZHBvaW50LFxuICAgIC4uLihvcHRpb25zLm1vZGVsQ2xhc3MgPyB7IGNsYXNzOiBvcHRpb25zLm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy50YXNrID8geyB0YXNrOiBvcHRpb25zLnRhc2sgfSA6IHt9KSxcbiAgfSkpO1xuICBjb25zdCBjbGFzc2lmaWVkID0gb3B0aW9ucy5tb2RlbENsYXNzXG4gICAgPyB7XG4gICAgICAgIFtNb2RlbENsYXNzLkNoYXRUaGlua2luZ106IFtdLFxuICAgICAgICBbTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWRdOiBbXSxcbiAgICAgICAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOiBbXSxcbiAgICAgICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogW10sXG4gICAgICAgIFtvcHRpb25zLm1vZGVsQ2xhc3NdOiBub3JtYWxpemVkLFxuICAgICAgfVxuICAgIDogY2xhc3NpZnlFbmRwb2ludHMobm9ybWFsaXplZCk7XG4gIGNvbnN0IHNlYXJjaCA9IHF1ZXJ5LnNlYXJjaD8udHJpbSgpO1xuICBjb25zdCByZXF1ZXN0ZWRDbGFzcyA9IG9wdGlvbnMubW9kZWxDbGFzcyA/PyBxdWVyeS5tb2RlbENsYXNzO1xuICBjb25zdCBpbmNsdWRlRGVwcmVjYXRlZCA9IHF1ZXJ5LmluY2x1ZGVEZXByZWNhdGVkID8/IG9wdGlvbnMuaW5jbHVkZURlcHJlY2F0ZWQgPz8gZmFsc2U7XG4gIGNvbnN0IGVsaWdpYmxlID0gcmVxdWVzdGVkQ2xhc3MgPyBjbGFzc2VzQXRPckJlbG93KHJlcXVlc3RlZENsYXNzKSA6IENIQVRfQ0xBU1NfT1JERVI7XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IFJhbmtlZE1vZGVsW10gPSBbXTtcbiAgaWYgKHNlYXJjaCAmJiByZXF1ZXN0ZWRDbGFzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xhc3NCeU5hbWUgPSBjbGFzc2lmeUVuZHBvaW50Q2xhc3Nlcyhub3JtYWxpemVkKTtcbiAgICBmb3IgKGNvbnN0IGVuZHBvaW50IG9mIG5vcm1hbGl6ZWQpIHtcbiAgICAgIGlmICghaW5jbHVkZURlcHJlY2F0ZWQgJiYgZW5kcG9pbnQuc3RhdHVzPy5kZXByZWNhdGVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGVuZHBvaW50Q2FwYWJpbGl0aWVzKGVuZHBvaW50KTtcbiAgICAgIGlmICghY2FwYWJpbGl0aWVzLmNoYXQgfHwgKHF1ZXJ5LnJlcXVpcmVzVG9vbHMgJiYgIWNhcGFiaWxpdGllcy50b29scykpIGNvbnRpbnVlO1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIG1vZGVsQ2xhc3M6IGNsYXNzQnlOYW1lLmdldChlbmRwb2ludC5uYW1lKSA/PyBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgZWxpZ2libGUpIHtcbiAgICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkge1xuICAgICAgICBpZiAoIWluY2x1ZGVEZXByZWNhdGVkICYmIGVuZHBvaW50LnN0YXR1cz8uZGVwcmVjYXRlZCkgY29udGludWU7XG4gICAgICAgIGlmIChxdWVyeS5yZXF1aXJlc1Rvb2xzICYmICFlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpIGNvbnRpbnVlO1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBlbmRwb2ludCwgbW9kZWxDbGFzcyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgcmFua2VkID1cbiAgICAhc2VhcmNoICYmIHJlcXVlc3RlZENsYXNzID09PSB1bmRlZmluZWRcbiAgICAgID8gcHJlZmVyTGF0ZXN0V2l0aGluTGVhZGluZ0ZhbWlseShjYW5kaWRhdGVzKVxuICAgICAgOiBjYW5kaWRhdGVzO1xuICBpZiAoc2VhcmNoKSB7XG4gICAgY29uc3QgZXhhY3QgPSBjYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmVuZHBvaW50Lm5hbWUgPT09IHNlYXJjaCk7XG4gICAgaWYgKGV4YWN0KSB7XG4gICAgICByYW5rZWQgPSBbeyAuLi5leGFjdCwgc2NvcmU6IDAgfV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHF1ZXJ5LnRocmVzaG9sZCA/PyBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRDtcbiAgICAgIGNvbnN0IHNlYXJjaFRva2VucyA9IHRva2VuaXplKHNlYXJjaCk7XG4gICAgICBjb25zdCB0b2tlbk1hdGNoZXMgPSBjYW5kaWRhdGVzXG4gICAgICAgIC5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZVRva2VucyA9IG5ldyBTZXQoc2VhcmNoYWJsZVZhbHVlcyhjYW5kaWRhdGUuZW5kcG9pbnQpLmZsYXRNYXAodG9rZW5pemUpKTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgc2VhcmNoVG9rZW5zLmxlbmd0aCA+IDAgJiYgc2VhcmNoVG9rZW5zLmV2ZXJ5KCh0b2tlbikgPT4gY2FuZGlkYXRlVG9rZW5zLmhhcyh0b2tlbikpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcCgoY2FuZGlkYXRlKSA9PiAoeyAuLi5jYW5kaWRhdGUsIHNjb3JlOiAwIH0pKTtcbiAgICAgIGlmICh0b2tlbk1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByYW5rZWQgPSB0b2tlbk1hdGNoZXMuc29ydChjb21wYXJlUmFua2VkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZ1c2UgPSBuZXcgRnVzZShjYW5kaWRhdGVzLCB7XG4gICAgICAgICAga2V5czogW1xuICAgICAgICAgICAgXCJlbmRwb2ludC5uYW1lXCIsXG4gICAgICAgICAgICBcImVuZHBvaW50LmRpc3BsYXlOYW1lXCIsXG4gICAgICAgICAgICBcImVuZHBvaW50LmZhbWlseVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lXCIsXG4gICAgICAgICAgICBcImVuZHBvaW50LnNlcnZpY2VOYW1lc1wiLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICAgIGlnbm9yZUxvY2F0aW9uOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVTY29yZTogdHJ1ZSxcbiAgICAgICAgICB1c2VFeHRlbmRlZFNlYXJjaDogdHJ1ZSxcbiAgICAgICAgICBpc0Nhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IHRva2VuaXplKHNlYXJjaCkuam9pbihcIiBcIik7XG4gICAgICAgIHJhbmtlZCA9IG5vcm1hbGl6ZWRTZWFyY2hcbiAgICAgICAgICA/IGZ1c2VcbiAgICAgICAgICAgICAgLnNlYXJjaChub3JtYWxpemVkU2VhcmNoKVxuICAgICAgICAgICAgICAuZmlsdGVyKChyZXN1bHQpID0+IChyZXN1bHQuc2NvcmUgPz8gMCkgPD0gdGhyZXNob2xkKVxuICAgICAgICAgICAgICAubWFwKChyZXN1bHQpID0+ICh7IC4uLnJlc3VsdC5pdGVtLCBzY29yZTogcmVzdWx0LnNjb3JlID8/IDAgfSkpXG4gICAgICAgICAgICAgIC5zb3J0KGNvbXBhcmVSYW5rZWQpXG4gICAgICAgICAgOiBbXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzdG9yZWQgPSByYW5rZWQubWFwKChyZXN1bHQpID0+ICh7XG4gICAgLi4ucmVzdWx0LFxuICAgIGVuZHBvaW50OiBvcmlnaW5hbEJ5TmFtZS5nZXQocmVzdWx0LmVuZHBvaW50Lm5hbWUpID8/IHJlc3VsdC5lbmRwb2ludCxcbiAgfSkpO1xuICByZXR1cm4gcXVlcnkubGltaXQgPT09IHVuZGVmaW5lZCA/IHJlc3RvcmVkIDogcmVzdG9yZWQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgcXVlcnkubGltaXQpKTtcbn1cblxuZnVuY3Rpb24gcHJlZmVyTGF0ZXN0V2l0aGluTGVhZGluZ0ZhbWlseShjYW5kaWRhdGVzOiByZWFkb25seSBSYW5rZWRNb2RlbFtdKTogUmFua2VkTW9kZWxbXSB7XG4gIGNvbnN0IGxlYWRpbmcgPSBjYW5kaWRhdGVzWzBdO1xuICBpZiAoIWxlYWRpbmcpIHJldHVybiBbXTtcbiAgY29uc3QgZmFtaWx5ID0gbW9kZWxGYW1pbHkobGVhZGluZy5lbmRwb2ludC5uYW1lKTtcbiAgaWYgKCFmYW1pbHkpIHJldHVybiBbLi4uY2FuZGlkYXRlc107XG4gIGNvbnN0IHNhbWVGYW1pbHkgPSBjYW5kaWRhdGVzXG4gICAgLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBtb2RlbEZhbWlseShjYW5kaWRhdGUuZW5kcG9pbnQubmFtZSkgPT09IGZhbWlseSlcbiAgICAuc29ydChjb21wYXJlUmFua2VkKTtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0KHNhbWVGYW1pbHkubWFwKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5lbmRwb2ludC5uYW1lKSk7XG4gIHJldHVybiBbXG4gICAgLi4uc2FtZUZhbWlseSxcbiAgICAuLi5jYW5kaWRhdGVzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiAhc2VsZWN0ZWQuaGFzKGNhbmRpZGF0ZS5lbmRwb2ludC5uYW1lKSksXG4gIF07XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNNb2RlbFF1ZXJ5KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LCBxdWVyeTogTW9kZWxRdWVyeSk6IGJvb2xlYW4ge1xuICBpZiAocXVlcnkubmFtZSAhPT0gdW5kZWZpbmVkICYmIGVuZHBvaW50Lm5hbWUgIT09IHF1ZXJ5Lm5hbWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKHF1ZXJ5LnRhc2sgIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC50YXNrICE9PSBxdWVyeS50YXNrKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICBxdWVyeS5yZWFzb25pbmdFZmZvcnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICFlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzPy5pbmNsdWRlcyhxdWVyeS5yZWFzb25pbmdFZmZvcnQpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXG4gICAgcXVlcnkuZGltZW5zaW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICBxdWVyeS5taW5EaW1lbnNpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgIHF1ZXJ5Lm1heERpbWVuc2lvbiAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGlmIChlbmRwb2ludC5kaW1lbnNpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChxdWVyeS5kaW1lbnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5kaW1lbnNpb24gIT09IHF1ZXJ5LmRpbWVuc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChxdWVyeS5taW5EaW1lbnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5kaW1lbnNpb24gPCBxdWVyeS5taW5EaW1lbnNpb24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAocXVlcnkubWF4RGltZW5zaW9uICE9PSB1bmRlZmluZWQgJiYgZW5kcG9pbnQuZGltZW5zaW9uID4gcXVlcnkubWF4RGltZW5zaW9uKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDbGFzc2lmeSBjaGF0IGFuZCBlbWJlZGRpbmcgZW5kcG9pbnRzIHRocm91Z2ggdGhlIFR5cGVTY3JpcHQtb3duZWQgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5RW5kcG9pbnRDbGFzc2VzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IFJlYWRvbmx5TWFwPHN0cmluZywgTW9kZWxDbGFzcz4ge1xuICBjb25zdCBjbGFzc2lmaWVkID0gY2xhc3NpZnlFbmRwb2ludHMoZW5kcG9pbnRzKTtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIE1vZGVsQ2xhc3M+KCk7XG4gIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBNT0RFTF9DTEFTU19PUkRFUikge1xuICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkgcmVzdWx0LnNldChlbmRwb2ludC5uYW1lLCBtb2RlbENsYXNzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogTm9ybWFsaXplIHNlcmlhbGl6ZWQgU0RLIGVuZHBvaW50IHJlY29yZHMgd2l0aG91dCBuYXRpdmUgYmluZGluZ3MuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRW5kcG9pbnRzKGVuZHBvaW50czogcmVhZG9ubHkgdW5rbm93bltdKTogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdIHtcbiAgY29uc3Qgc3VtbWFyaWVzID0gZW5kcG9pbnRzLmZsYXRNYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSByZWNvcmQodmFsdWUpO1xuICAgIGNvbnN0IG5hbWUgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW5kcG9pbnQubmFtZSk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gW107XG4gICAgY29uc3QgZW50aXRpZXMgPSBhcnJheVZhbHVlKHJlY29yZChlbmRwb2ludC5jb25maWcpLnNlcnZlZF9lbnRpdGllcykubWFwKHJlY29yZCk7XG4gICAgY29uc3QgaWRlbnRpdGllcyA9IFtcbiAgICAgIG5hbWUsXG4gICAgICAuLi5lbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+XG4gICAgICAgIFtcbiAgICAgICAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW50aXR5LmVudGl0eV9uYW1lKSxcbiAgICAgICAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5uYW1lKSxcbiAgICAgICAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVudGl0eS5leHRlcm5hbF9tb2RlbCkubmFtZSksXG4gICAgICAgIF0uZmlsdGVyKChpZGVudGl0eSk6IGlkZW50aXR5IGlzIHN0cmluZyA9PiBCb29sZWFuKGlkZW50aXR5KSksXG4gICAgICApLFxuICAgIF07XG4gICAgY29uc3QgbW9kZWxTZXJ2aWNlTmFtZSA9IGVudGl0aWVzXG4gICAgICAubWFwKFxuICAgICAgICAoZW50aXR5KSA9PlxuICAgICAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChyZWNvcmQoZW50aXR5LmZvdW5kYXRpb25fbW9kZWwpLm5hbWUpID8/XG4gICAgICAgICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGVudGl0eS5lbnRpdHlfbmFtZSksXG4gICAgICApXG4gICAgICAuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCBmb3VuZGF0aW9uTW9kZWxzID0gZW50aXRpZXMubWFwKChlbnRpdHkpID0+IHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkpO1xuICAgIGNvbnN0IGZhbWlseSA9XG4gICAgICBmb3VuZGF0aW9uTW9kZWxzXG4gICAgICAgIC5tYXAoKG1vZGVsKSA9PiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQobW9kZWwubW9kZWxfY2xhc3MpKVxuICAgICAgICAuZmluZChCb29sZWFuKSA/PyBpZGVudGl0aWVzLm1hcChtb2RlbEZhbWlseSkuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCByZWFzb25pbmdFZmZvcnRzID1cbiAgICAgIGlkZW50aXRpZXMubWFwKG1vZGVsUmVhc29uaW5nRWZmb3J0cykuc29ydCgobGVmdCwgcmlnaHQpID0+IHJpZ2h0Lmxlbmd0aCAtIGxlZnQubGVuZ3RoKVswXSA/P1xuICAgICAgW107XG4gICAgY29uc3QgcHJvZmlsZSA9IGVudGl0aWVzLm1hcChtb2RlbFByb2ZpbGUpLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgY2FwYWJpbGl0aWVzUmVjb3JkID0gcmVjb3JkKGVuZHBvaW50LmNhcGFiaWxpdGllcyk7XG4gICAgY29uc3QgZm91bmRhdGlvbkRlc2NyaXB0aW9uID0gZm91bmRhdGlvbk1vZGVsc1xuICAgICAgLm1hcCgobW9kZWwpID0+IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChtb2RlbC5kZXNjcmlwdGlvbikpXG4gICAgICAuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChlbmRwb2ludC5kZXNjcmlwdGlvbikgPz8gZm91bmRhdGlvbkRlc2NyaXB0aW9uO1xuICAgIGNvbnN0IHN1bW1hcnk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IHRvTW9kZWxEaXNwbGF5TmFtZShuYW1lLCBwcm92aWRlZERpc3BsYXlOYW1lKGVuZHBvaW50LCBlbnRpdGllcykpLFxuICAgICAgLi4uKGZhbWlseSA/IHsgZmFtaWx5IH0gOiB7fSksXG4gICAgICAuLi4oc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGVuZHBvaW50LnRhc2spXG4gICAgICAgID8geyB0YXNrOiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW5kcG9pbnQudGFzaykgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVuZHBvaW50LnN0YXRlKS5yZWFkeSlcbiAgICAgICAgPyB7IHN0YXRlOiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVuZHBvaW50LnN0YXRlKS5yZWFkeSkgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIHN1cHBvcnRzVG9vbHM6XG4gICAgICAgIGJvb2xlYW5WYWx1ZShjYXBhYmlsaXRpZXNSZWNvcmQuZnVuY3Rpb25fY2FsbGluZykgPz8gaWRlbnRpdGllcy5zb21lKHN1cHBvcnRzVG9vbHNCeUZhbWlseSksXG4gICAgICAuLi4ocHJvZmlsZSA/IHsgcHJvZmlsZSB9IDoge30pLFxuICAgICAgc2VydmljZU5hbWVzOiBPYmplY3QuYXNzaWduKHt9LCAuLi5pZGVudGl0aWVzLm1hcChtb2RlbFNlcnZpY2VOYW1lcykpLFxuICAgICAgLi4uKG1vZGVsU2VydmljZU5hbWUgPyB7IG1vZGVsU2VydmljZU5hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihyZWFzb25pbmdFZmZvcnRzLmxlbmd0aCA/IHsgcmVhc29uaW5nRWZmb3J0cyB9IDoge30pLFxuICAgICAgc3RhdHVzOiBtb2RlbFN0YXR1c0ZvciguLi5pZGVudGl0aWVzKSxcbiAgICB9O1xuICAgIHJldHVybiBbc3VtbWFyeV07XG4gIH0pO1xuICBjb25zdCBjbGFzc2VzID0gY2xhc3NpZnlFbmRwb2ludENsYXNzZXMoc3VtbWFyaWVzKTtcbiAgcmV0dXJuIHN1bW1hcmllcy5tYXAoKHN1bW1hcnkpID0+IHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gY2xhc3Nlcy5nZXQoc3VtbWFyeS5uYW1lKTtcbiAgICByZXR1cm4gbW9kZWxDbGFzcyA/IHsgLi4uc3VtbWFyeSwgY2xhc3M6IG1vZGVsQ2xhc3MgfSA6IHN1bW1hcnk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlUmFua2VkKGxlZnQ6IFJhbmtlZE1vZGVsLCByaWdodDogUmFua2VkTW9kZWwpOiBudW1iZXIge1xuICBjb25zdCBzY29yZSA9IE1hdGgucm91bmQoKGxlZnQuc2NvcmUgPz8gMCkgKiAxMDAwKSAtIE1hdGgucm91bmQoKHJpZ2h0LnNjb3JlID8/IDApICogMTAwMCk7XG4gIGlmIChzY29yZSAhPT0gMCkgcmV0dXJuIHNjb3JlO1xuICBjb25zdCBsZWZ0T3NzID0gaXNPcGVuV2VpZ2h0c0dwdChsZWZ0LmVuZHBvaW50Lm5hbWUpO1xuICBjb25zdCByaWdodE9zcyA9IGlzT3BlbldlaWdodHNHcHQocmlnaHQuZW5kcG9pbnQubmFtZSk7XG4gIGlmIChsZWZ0T3NzICE9PSByaWdodE9zcykgcmV0dXJuIGxlZnRPc3MgPyAxIDogLTE7XG4gIGNvbnN0IGxlZnRWZXJzaW9uID0gdmVyc2lvblR1cGxlKGxlZnQuZW5kcG9pbnQubmFtZSk7XG4gIGNvbnN0IHJpZ2h0VmVyc2lvbiA9IHZlcnNpb25UdXBsZShyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDM7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmlnaHRWZXJzaW9uW2luZGV4XSEgLSBsZWZ0VmVyc2lvbltpbmRleF0hO1xuICAgIGlmICh2ZXJzaW9uICE9PSAwKSByZXR1cm4gdmVyc2lvbjtcbiAgfVxuICBjb25zdCB2YXJpYW50ID0gbW9kZWxWYXJpYW50UmFuayhsZWZ0LmVuZHBvaW50Lm5hbWUpIC0gbW9kZWxWYXJpYW50UmFuayhyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgaWYgKHZhcmlhbnQgIT09IDApIHJldHVybiB2YXJpYW50O1xuICByZXR1cm4gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihsZWZ0Lm1vZGVsQ2xhc3MpIC0gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihyaWdodC5tb2RlbENsYXNzKTtcbn1cblxuZnVuY3Rpb24gbW9kZWxWYXJpYW50UmFuayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAoIS8oPzpefFstXy5dKWdwdCg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDI7XG4gIGlmICgvKD86XnxbLV8uXSlzb2woPzpbLV8uXXwkKS9pLnRlc3QobmFtZSkpIHJldHVybiAwO1xuICBpZiAoLyg/Ol58Wy1fLl0pbHVuYSg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDE7XG4gIHJldHVybiAyO1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvW2EtejAtOV0rL2cpID8/IFtdO1xufVxuXG5mdW5jdGlvbiBzZWFyY2hhYmxlVmFsdWVzKGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGVuZHBvaW50Lm5hbWUsXG4gICAgZW5kcG9pbnQuZGlzcGxheU5hbWUsXG4gICAgZW5kcG9pbnQuZmFtaWx5LFxuICAgIGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUsXG4gICAgLi4uT2JqZWN0LnZhbHVlcyhlbmRwb2ludC5zZXJ2aWNlTmFtZXMgPz8ge30pLFxuICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBtb2RlbFByb2ZpbGUoZW50aXR5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICBjb25zdCBzb3VyY2UgPSByZWNvcmQocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5haV9nYXRld2F5X21vZGVsX3Byb2ZpbGUpO1xuICBjb25zdCBxdWFsaXR5ID0gZmluaXRlTnVtYmVyKHNvdXJjZS5xdWFsaXR5KTtcbiAgY29uc3Qgc3BlZWQgPSBmaW5pdGVOdW1iZXIoc291cmNlLnNwZWVkKTtcbiAgY29uc3QgY29zdCA9IGZpbml0ZU51bWJlcihzb3VyY2UuY29zdCk7XG4gIGlmIChxdWFsaXR5ID09PSB1bmRlZmluZWQgJiYgc3BlZWQgPT09IHVuZGVmaW5lZCAmJiBjb3N0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgLi4uKHF1YWxpdHkgIT09IHVuZGVmaW5lZCA/IHsgcXVhbGl0eSB9IDoge30pLFxuICAgIC4uLihzcGVlZCAhPT0gdW5kZWZpbmVkID8geyBzcGVlZCB9IDoge30pLFxuICAgIC4uLihjb3N0ICE9PSB1bmRlZmluZWQgPyB7IGNvc3QgfSA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvdmlkZWREaXNwbGF5TmFtZShcbiAgZW5kcG9pbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBlbnRpdGllczogcmVhZG9ubHkgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgdGFnIG9mIGFycmF5VmFsdWUoZW5kcG9pbnQudGFncykubWFwKHJlY29yZCkpIHtcbiAgICBpZiAoIVtcImRpc3BsYXlfbmFtZVwiLCBcImRpc3BsYXlOYW1lXCIsIFwibmFtZVwiXS5pbmNsdWRlcyhTdHJpbmcodGFnLmtleSkpKSBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZCh0YWcudmFsdWUpO1xuICAgIGlmICh2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiAoXG4gICAgZW50aXRpZXNcbiAgICAgIC5tYXAoKGVudGl0eSkgPT4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkuZGlzcGxheV9uYW1lKSlcbiAgICAgIC5maW5kKEJvb2xlYW4pID8/XG4gICAgZW50aXRpZXNcbiAgICAgIC5tYXAoKGVudGl0eSkgPT4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHJlY29yZChlbnRpdHkuZXh0ZXJuYWxfbW9kZWwpLm5hbWUpKVxuICAgICAgLmZpbmQoQm9vbGVhbilcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSA/IHZhbHVlIDoge307XG59XG5cbmZ1bmN0aW9uIGFycmF5VmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xufVxuXG5mdW5jdGlvbiBmaW5pdGVOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYm9vbGVhblZhbHVlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG4iXX0=
322
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JhbmtpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3JhbmtpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsVUFBVSxJQUFJLGdCQUFnQixHQUsvQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JGLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gscUJBQXFCLEVBQ3JCLGlCQUFpQixHQUNsQixNQUFNLGFBQWEsQ0FBQztBQUdyQixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztBQUVwQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVNwQyx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsU0FBNEMsRUFDNUMsUUFBb0IsRUFBRSxFQUN0QixVQUFnQyxFQUFFO0lBRWxDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENB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LFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNqRixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDeEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG9iamVjdCwgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTW9kZWxDbGFzcyBhcyBNb2RlbENsYXNzVmFsdWVzLFxuICB0eXBlIE1vZGVsQ2xhc3MgYXMgTW9kZWxDbGFzc1R5cGUsXG4gIHR5cGUgTW9kZWxRdWVyeSxcbiAgdHlwZSBSYW5rZWRNb2RlbCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5pbXBvcnQgeyB0b01vZGVsRGlzcGxheU5hbWUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvZGlzcGxheVwiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IHsgbW9kZWxTdGF0dXNGb3IgfSBmcm9tIFwiLi9fcmV0aXJlbWVudC50c1wiO1xuaW1wb3J0IHsgY2xhc3Nlc0F0T3JCZWxvdywgQ0hBVF9DTEFTU19PUkRFUiwgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9jbGFzc2VzLnRzXCI7XG5pbXBvcnQge1xuICBjbGFzc2lmeUVuZHBvaW50cyxcbiAgZW5kcG9pbnRDYXBhYmlsaXRpZXMsXG4gIHN1cHBvcnRzVG9vbHNCeUZhbWlseSxcbiAgdmVyc2lvblR1cGxlLFxufSBmcm9tIFwiLi9jbGFzc2lmeS50c1wiO1xuaW1wb3J0IHtcbiAgaXNPcGVuV2VpZ2h0c0dwdCxcbiAgbW9kZWxGYW1pbHksXG4gIG1vZGVsUmVhc29uaW5nRWZmb3J0cyxcbiAgbW9kZWxTZXJ2aWNlTmFtZXMsXG59IGZyb20gXCIuL3BvbGljeS50c1wiO1xuXG50eXBlIE1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzVHlwZTtcbmNvbnN0IE1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzVmFsdWVzO1xuXG5jb25zdCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCA9IDAuNDtcblxuaW50ZXJmYWNlIE5hdGl2ZVJhbmtpbmdPcHRpb25zIHtcbiAgcmVhZG9ubHkgaW5jbHVkZURlcHJlY2F0ZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzcztcbiAgcmVhZG9ubHkgcHJlZmVyU3lzdGVtTW9kZWxzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGFzaz86IHN0cmluZztcbn1cblxuLyoqIFJhbmsgZW5kcG9pbnQgcmVjb3JkcyB0aHJvdWdoIHRoZSBUeXBlU2NyaXB0LW93bmVkIG1vZGVsIHBvbGljeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5rRW5kcG9pbnRzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgcXVlcnk6IE1vZGVsUXVlcnkgPSB7fSxcbiAgb3B0aW9uczogTmF0aXZlUmFua2luZ09wdGlvbnMgPSB7fSxcbik6IFJhbmtlZE1vZGVsW10ge1xuICBjb25zdCBmaWx0ZXJlZCA9IGVuZHBvaW50cy5maWx0ZXIoKGVuZHBvaW50KSA9PiBtYXRjaGVzTW9kZWxRdWVyeShlbmRwb2ludCwgcXVlcnkpKTtcbiAgY29uc3Qgb3JpZ2luYWxCeU5hbWUgPSBuZXcgTWFwKGZpbHRlcmVkLm1hcCgoZW5kcG9pbnQpID0+IFtlbmRwb2ludC5uYW1lLCBlbmRwb2ludF0pKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGZpbHRlcmVkLm1hcCgoZW5kcG9pbnQpID0+ICh7XG4gICAgLi4uZW5kcG9pbnQsXG4gICAgLi4uKG9wdGlvbnMubW9kZWxDbGFzcyA/IHsgY2xhc3M6IG9wdGlvbnMubW9kZWxDbGFzcyB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnRhc2sgPyB7IHRhc2s6IG9wdGlvbnMudGFzayB9IDoge30pLFxuICB9KSk7XG4gIGNvbnN0IGNsYXNzaWZpZWQgPSBvcHRpb25zLm1vZGVsQ2xhc3NcbiAgICA/IHtcbiAgICAgICAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTogW10sXG4gICAgICAgIFtNb2RlbENsYXNzLkNoYXRCYWxhbmNlZF06IFtdLFxuICAgICAgICBbTW9kZWxDbGFzcy5DaGF0RmFzdF06IFtdLFxuICAgICAgICBbTW9kZWxDbGFzcy5FbWJlZGRpbmddOiBbXSxcbiAgICAgICAgW29wdGlvbnMubW9kZWxDbGFzc106IG5vcm1hbGl6ZWQsXG4gICAgICB9XG4gICAgOiBjbGFzc2lmeUVuZHBvaW50cyhub3JtYWxpemVkKTtcbiAgY29uc3Qgc2VhcmNoID0gcXVlcnkuc2VhcmNoPy50cmltKCk7XG4gIGNvbnN0IHJlcXVlc3RlZENsYXNzID0gb3B0aW9ucy5tb2RlbENsYXNzID8/IHF1ZXJ5Lm1vZGVsQ2xhc3M7XG4gIGNvbnN0IGluY2x1ZGVEZXByZWNhdGVkID0gcXVlcnkuaW5jbHVkZURlcHJlY2F0ZWQgPz8gb3B0aW9ucy5pbmNsdWRlRGVwcmVjYXRlZCA/PyBmYWxzZTtcbiAgY29uc3QgcHJlZmVyU3lzdGVtTW9kZWxzID0gb3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPz8gZmFsc2U7XG4gIGNvbnN0IGVsaWdpYmxlID0gcmVxdWVzdGVkQ2xhc3MgPyBjbGFzc2VzQXRPckJlbG93KHJlcXVlc3RlZENsYXNzKSA6IENIQVRfQ0xBU1NfT1JERVI7XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IFJhbmtlZE1vZGVsW10gPSBbXTtcbiAgaWYgKHNlYXJjaCAmJiByZXF1ZXN0ZWRDbGFzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xhc3NCeU5hbWUgPSBjbGFzc2lmeUVuZHBvaW50Q2xhc3Nlcyhub3JtYWxpemVkKTtcbiAgICBmb3IgKGNvbnN0IGVuZHBvaW50IG9mIG5vcm1hbGl6ZWQpIHtcbiAgICAgIGlmICghaW5jbHVkZURlcHJlY2F0ZWQgJiYgZW5kcG9pbnQuc3RhdHVzPy5kZXByZWNhdGVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGVuZHBvaW50Q2FwYWJpbGl0aWVzKGVuZHBvaW50KTtcbiAgICAgIGlmICghY2FwYWJpbGl0aWVzLmNoYXQgfHwgKHF1ZXJ5LnJlcXVpcmVzVG9vbHMgJiYgIWNhcGFiaWxpdGllcy50b29scykpIGNvbnRpbnVlO1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIG1vZGVsQ2xhc3M6IGNsYXNzQnlOYW1lLmdldChlbmRwb2ludC5uYW1lKSA/PyBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgZWxpZ2libGUpIHtcbiAgICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkge1xuICAgICAgICBpZiAoIWluY2x1ZGVEZXByZWNhdGVkICYmIGVuZHBvaW50LnN0YXR1cz8uZGVwcmVjYXRlZCkgY29udGludWU7XG4gICAgICAgIGlmIChxdWVyeS5yZXF1aXJlc1Rvb2xzICYmICFlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpIGNvbnRpbnVlO1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBlbmRwb2ludCwgbW9kZWxDbGFzcyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBleGFjdCA9IHNlYXJjaFxuICAgID8gY2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5lbmRwb2ludC5uYW1lID09PSBzZWFyY2gpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGxldCByYW5rZWQ6IFJhbmtlZE1vZGVsW107XG4gIGlmIChleGFjdCkge1xuICAgIHJhbmtlZCA9IFt7IC4uLmV4YWN0LCBzY29yZTogMCB9XTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzZWxlY3RhYmxlID0gcHJlZmVyU3lzdGVtTW9kZWxzXG4gICAgICA/IHByZWZlclN5c3RlbUNhbmRpZGF0ZXMoY2FuZGlkYXRlcylcbiAgICAgIDogY2FuZGlkYXRlcy5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4gIWlzU3lzdGVtTW9kZWwoY2FuZGlkYXRlLmVuZHBvaW50KSk7XG4gICAgcmFua2VkID1cbiAgICAgICFzZWFyY2ggJiYgcmVxdWVzdGVkQ2xhc3MgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHByZWZlckxhdGVzdFdpdGhpbkxlYWRpbmdGYW1pbHkoc2VsZWN0YWJsZSwgcHJlZmVyU3lzdGVtTW9kZWxzKVxuICAgICAgICA6IHNlbGVjdGFibGU7XG4gICAgaWYgKHNlYXJjaCkge1xuICAgICAgY29uc3QgdGhyZXNob2xkID0gcXVlcnkudGhyZXNob2xkID8/IERFRkFVTFRfRlVaWllfVEhSRVNIT0xEO1xuICAgICAgY29uc3Qgc2VhcmNoVG9rZW5zID0gdG9rZW5pemUoc2VhcmNoKTtcbiAgICAgIGNvbnN0IHRva2VuTWF0Y2hlcyA9IHNlbGVjdGFibGVcbiAgICAgICAgLmZpbHRlcigoY2FuZGlkYXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2FuZGlkYXRlVG9rZW5zID0gbmV3IFNldChzZWFyY2hhYmxlVmFsdWVzKGNhbmRpZGF0ZS5lbmRwb2ludCkuZmxhdE1hcCh0b2tlbml6ZSkpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBzZWFyY2hUb2tlbnMubGVuZ3RoID4gMCAmJiBzZWFyY2hUb2tlbnMuZXZlcnkoKHRva2VuKSA9PiBjYW5kaWRhdGVUb2tlbnMuaGFzKHRva2VuKSlcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChjYW5kaWRhdGUpID0+ICh7IC4uLmNhbmRpZGF0ZSwgc2NvcmU6IDAgfSkpO1xuICAgICAgaWYgKHRva2VuTWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJhbmtlZCA9IHRva2VuTWF0Y2hlcy5zb3J0KChsZWZ0LCByaWdodCkgPT4gY29tcGFyZVJhbmtlZChsZWZ0LCByaWdodCwgcHJlZmVyU3lzdGVtTW9kZWxzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmdXNlID0gbmV3IEZ1c2Uoc2VsZWN0YWJsZSwge1xuICAgICAgICAgIGtleXM6IFtcbiAgICAgICAgICAgIFwiZW5kcG9pbnQubmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5kaXNwbGF5TmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5mYW1pbHlcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5zZXJ2aWNlTmFtZXNcIixcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgICBpZ25vcmVMb2NhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlU2NvcmU6IHRydWUsXG4gICAgICAgICAgdXNlRXh0ZW5kZWRTZWFyY2g6IHRydWUsXG4gICAgICAgICAgaXNDYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSB0b2tlbml6ZShzZWFyY2gpLmpvaW4oXCIgXCIpO1xuICAgICAgICByYW5rZWQgPSBub3JtYWxpemVkU2VhcmNoXG4gICAgICAgICAgPyBmdXNlXG4gICAgICAgICAgICAgIC5zZWFyY2gobm9ybWFsaXplZFNlYXJjaClcbiAgICAgICAgICAgICAgLmZpbHRlcigocmVzdWx0KSA9PiAocmVzdWx0LnNjb3JlID8/IDApIDw9IHRocmVzaG9sZClcbiAgICAgICAgICAgICAgLm1hcCgocmVzdWx0KSA9PiAoeyAuLi5yZXN1bHQuaXRlbSwgc2NvcmU6IHJlc3VsdC5zY29yZSA/PyAwIH0pKVxuICAgICAgICAgICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVSYW5rZWQobGVmdCwgcmlnaHQsIHByZWZlclN5c3RlbU1vZGVscykpXG4gICAgICAgICAgOiBbXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzdG9yZWQgPSByYW5rZWQubWFwKChyZXN1bHQpID0+ICh7XG4gICAgLi4ucmVzdWx0LFxuICAgIGVuZHBvaW50OiBvcmlnaW5hbEJ5TmFtZS5nZXQocmVzdWx0LmVuZHBvaW50Lm5hbWUpID8/IHJlc3VsdC5lbmRwb2ludCxcbiAgfSkpO1xuICByZXR1cm4gcXVlcnkubGltaXQgPT09IHVuZGVmaW5lZCA/IHJlc3RvcmVkIDogcmVzdG9yZWQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgcXVlcnkubGltaXQpKTtcbn1cblxuZnVuY3Rpb24gcHJlZmVyTGF0ZXN0V2l0aGluTGVhZGluZ0ZhbWlseShcbiAgY2FuZGlkYXRlczogcmVhZG9ubHkgUmFua2VkTW9kZWxbXSxcbiAgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuLFxuKTogUmFua2VkTW9kZWxbXSB7XG4gIGNvbnN0IGxlYWRpbmcgPSBjYW5kaWRhdGVzWzBdO1xuICBpZiAoIWxlYWRpbmcpIHJldHVybiBbXTtcbiAgY29uc3QgZmFtaWx5ID0gbW9kZWxGYW1pbHkobGVhZGluZy5lbmRwb2ludC5uYW1lKTtcbiAgaWYgKCFmYW1pbHkpIHJldHVybiBbLi4uY2FuZGlkYXRlc107XG4gIGNvbnN0IHNhbWVGYW1pbHkgPSBjYW5kaWRhdGVzXG4gICAgLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBtb2RlbEZhbWlseShjYW5kaWRhdGUuZW5kcG9pbnQubmFtZSkgPT09IGZhbWlseSlcbiAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVSYW5rZWQobGVmdCwgcmlnaHQsIHByZWZlclN5c3RlbU1vZGVscykpO1xuICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQoc2FtZUZhbWlseS5tYXAoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmVuZHBvaW50Lm5hbWUpKTtcbiAgcmV0dXJuIFtcbiAgICAuLi5zYW1lRmFtaWx5LFxuICAgIC4uLmNhbmRpZGF0ZXMuZmlsdGVyKChjYW5kaWRhdGUpID0+ICFzZWxlY3RlZC5oYXMoY2FuZGlkYXRlLmVuZHBvaW50Lm5hbWUpKSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlc01vZGVsUXVlcnkoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksIHF1ZXJ5OiBNb2RlbFF1ZXJ5KTogYm9vbGVhbiB7XG4gIGlmIChxdWVyeS5uYW1lICE9PSB1bmRlZmluZWQgJiYgZW5kcG9pbnQubmFtZSAhPT0gcXVlcnkubmFtZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAocXVlcnkudGFzayAhPT0gdW5kZWZpbmVkICYmIGVuZHBvaW50LnRhc2sgIT09IHF1ZXJ5LnRhc2spIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHF1ZXJ5LnJlYXNvbmluZ0VmZm9ydCAhPT0gdW5kZWZpbmVkICYmXG4gICAgIWVuZHBvaW50LnJlYXNvbmluZ0VmZm9ydHM/LmluY2x1ZGVzKHF1ZXJ5LnJlYXNvbmluZ0VmZm9ydClcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChcbiAgICBxdWVyeS5kaW1lbnNpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgIHF1ZXJ5Lm1pbkRpbWVuc2lvbiAhPT0gdW5kZWZpbmVkIHx8XG4gICAgcXVlcnkubWF4RGltZW5zaW9uICE9PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgaWYgKGVuZHBvaW50LmRpbWVuc2lvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHF1ZXJ5LmRpbWVuc2lvbiAhPT0gdW5kZWZpbmVkICYmIGVuZHBvaW50LmRpbWVuc2lvbiAhPT0gcXVlcnkuZGltZW5zaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHF1ZXJ5Lm1pbkRpbWVuc2lvbiAhPT0gdW5kZWZpbmVkICYmIGVuZHBvaW50LmRpbWVuc2lvbiA8IHF1ZXJ5Lm1pbkRpbWVuc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChxdWVyeS5tYXhEaW1lbnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5kaW1lbnNpb24gPiBxdWVyeS5tYXhEaW1lbnNpb24pIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIENsYXNzaWZ5IGNoYXQgYW5kIGVtYmVkZGluZyBlbmRwb2ludHMgdGhyb3VnaCB0aGUgVHlwZVNjcmlwdC1vd25lZCBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlFbmRwb2ludENsYXNzZXMoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuKTogUmVhZG9ubHlNYXA8c3RyaW5nLCBNb2RlbENsYXNzPiB7XG4gIGNvbnN0IGNsYXNzaWZpZWQgPSBjbGFzc2lmeUVuZHBvaW50cyhlbmRwb2ludHMpO1xuICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgTW9kZWxDbGFzcz4oKTtcbiAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIE1PREVMX0NMQVNTX09SREVSKSB7XG4gICAgZm9yIChjb25zdCBlbmRwb2ludCBvZiBjbGFzc2lmaWVkW21vZGVsQ2xhc3NdKSByZXN1bHQuc2V0KGVuZHBvaW50Lm5hbWUsIG1vZGVsQ2xhc3MpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBOb3JtYWxpemUgc2VyaWFsaXplZCBTREsgZW5kcG9pbnQgcmVjb3JkcyB3aXRob3V0IG5hdGl2ZSBiaW5kaW5ncy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVFbmRwb2ludHMoZW5kcG9pbnRzOiByZWFkb25seSB1bmtub3duW10pOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10ge1xuICBjb25zdCBzdW1tYXJpZXMgPSBlbmRwb2ludHMuZmxhdE1hcCgodmFsdWUpID0+IHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHJlY29yZCh2YWx1ZSk7XG4gICAgY29uc3QgbmFtZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChlbmRwb2ludC5uYW1lKTtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBbXTtcbiAgICBjb25zdCBlbnRpdGllcyA9IGFycmF5VmFsdWUocmVjb3JkKGVuZHBvaW50LmNvbmZpZykuc2VydmVkX2VudGl0aWVzKS5tYXAocmVjb3JkKTtcbiAgICBjb25zdCBpZGVudGl0aWVzID0gW1xuICAgICAgbmFtZSxcbiAgICAgIC4uLmVudGl0aWVzLmZsYXRNYXAoKGVudGl0eSkgPT5cbiAgICAgICAgW1xuICAgICAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChlbnRpdHkuZW50aXR5X25hbWUpLFxuICAgICAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChyZWNvcmQoZW50aXR5LmZvdW5kYXRpb25fbW9kZWwpLm5hbWUpLFxuICAgICAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChyZWNvcmQoZW50aXR5LmV4dGVybmFsX21vZGVsKS5uYW1lKSxcbiAgICAgICAgXS5maWx0ZXIoKGlkZW50aXR5KTogaWRlbnRpdHkgaXMgc3RyaW5nID0+IEJvb2xlYW4oaWRlbnRpdHkpKSxcbiAgICAgICksXG4gICAgXTtcbiAgICBjb25zdCBtb2RlbFNlcnZpY2VOYW1lID0gZW50aXRpZXNcbiAgICAgIC5tYXAoXG4gICAgICAgIChlbnRpdHkpID0+XG4gICAgICAgICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkubmFtZSkgPz9cbiAgICAgICAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW50aXR5LmVudGl0eV9uYW1lKSxcbiAgICAgIClcbiAgICAgIC5maW5kKEJvb2xlYW4pO1xuICAgIGNvbnN0IGZvdW5kYXRpb25Nb2RlbHMgPSBlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4gcmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKSk7XG4gICAgY29uc3QgZmFtaWx5ID1cbiAgICAgIGZvdW5kYXRpb25Nb2RlbHNcbiAgICAgICAgLm1hcCgobW9kZWwpID0+IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChtb2RlbC5tb2RlbF9jbGFzcykpXG4gICAgICAgIC5maW5kKEJvb2xlYW4pID8/IGlkZW50aXRpZXMubWFwKG1vZGVsRmFtaWx5KS5maW5kKEJvb2xlYW4pO1xuICAgIGNvbnN0IHJlYXNvbmluZ0VmZm9ydHMgPVxuICAgICAgaWRlbnRpdGllcy5tYXAobW9kZWxSZWFzb25pbmdFZmZvcnRzKS5zb3J0KChsZWZ0LCByaWdodCkgPT4gcmlnaHQubGVuZ3RoIC0gbGVmdC5sZW5ndGgpWzBdID8/XG4gICAgICBbXTtcbiAgICBjb25zdCBwcm9maWxlID0gZW50aXRpZXMubWFwKG1vZGVsUHJvZmlsZSkuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCBjYXBhYmlsaXRpZXNSZWNvcmQgPSByZWNvcmQoZW5kcG9pbnQuY2FwYWJpbGl0aWVzKTtcbiAgICBjb25zdCBmb3VuZGF0aW9uRGVzY3JpcHRpb24gPSBmb3VuZGF0aW9uTW9kZWxzXG4gICAgICAubWFwKChtb2RlbCkgPT4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG1vZGVsLmRlc2NyaXB0aW9uKSlcbiAgICAgIC5maW5kKEJvb2xlYW4pO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGVuZHBvaW50LmRlc2NyaXB0aW9uKSA/PyBmb3VuZGF0aW9uRGVzY3JpcHRpb247XG4gICAgY29uc3Qgc3VtbWFyeTogU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBkaXNwbGF5TmFtZTogdG9Nb2RlbERpc3BsYXlOYW1lKG5hbWUsIHByb3ZpZGVkRGlzcGxheU5hbWUoZW5kcG9pbnQsIGVudGl0aWVzKSksXG4gICAgICAuLi4oZmFtaWx5ID8geyBmYW1pbHkgfSA6IHt9KSxcbiAgICAgIC4uLihzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW5kcG9pbnQudGFzaylcbiAgICAgICAgPyB7IHRhc2s6IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChlbmRwb2ludC50YXNrKSB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChyZWNvcmQoZW5kcG9pbnQuc3RhdGUpLnJlYWR5KVxuICAgICAgICA/IHsgc3RhdGU6IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChyZWNvcmQoZW5kcG9pbnQuc3RhdGUpLnJlYWR5KSB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKGRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgc3VwcG9ydHNUb29sczpcbiAgICAgICAgYm9vbGVhblZhbHVlKGNhcGFiaWxpdGllc1JlY29yZC5mdW5jdGlvbl9jYWxsaW5nKSA/PyBpZGVudGl0aWVzLnNvbWUoc3VwcG9ydHNUb29sc0J5RmFtaWx5KSxcbiAgICAgIC4uLihwcm9maWxlID8geyBwcm9maWxlIH0gOiB7fSksXG4gICAgICBzZXJ2aWNlTmFtZXM6IE9iamVjdC5hc3NpZ24oe30sIC4uLmlkZW50aXRpZXMubWFwKG1vZGVsU2VydmljZU5hbWVzKSksXG4gICAgICAuLi4obW9kZWxTZXJ2aWNlTmFtZSA/IHsgbW9kZWxTZXJ2aWNlTmFtZSB9IDoge30pLFxuICAgICAgLi4uKHJlYXNvbmluZ0VmZm9ydHMubGVuZ3RoID8geyByZWFzb25pbmdFZmZvcnRzIH0gOiB7fSksXG4gICAgICBzdGF0dXM6IG1vZGVsU3RhdHVzRm9yKC4uLmlkZW50aXRpZXMpLFxuICAgIH07XG4gICAgcmV0dXJuIFtzdW1tYXJ5XTtcbiAgfSk7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc2lmeUVuZHBvaW50Q2xhc3NlcyhzdW1tYXJpZXMpO1xuICByZXR1cm4gc3VtbWFyaWVzLm1hcCgoc3VtbWFyeSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBjbGFzc2VzLmdldChzdW1tYXJ5Lm5hbWUpO1xuICAgIHJldHVybiBtb2RlbENsYXNzID8geyAuLi5zdW1tYXJ5LCBjbGFzczogbW9kZWxDbGFzcyB9IDogc3VtbWFyeTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVSYW5rZWQobGVmdDogUmFua2VkTW9kZWwsIHJpZ2h0OiBSYW5rZWRNb2RlbCwgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuKTogbnVtYmVyIHtcbiAgY29uc3Qgc2NvcmUgPSBNYXRoLnJvdW5kKChsZWZ0LnNjb3JlID8/IDApICogMTAwMCkgLSBNYXRoLnJvdW5kKChyaWdodC5zY29yZSA/PyAwKSAqIDEwMDApO1xuICBpZiAoc2NvcmUgIT09IDApIHJldHVybiBzY29yZTtcbiAgaWYgKHByZWZlclN5c3RlbU1vZGVscykge1xuICAgIGNvbnN0IGxlZnRTeXN0ZW0gPSBpc1N5c3RlbU1vZGVsKGxlZnQuZW5kcG9pbnQpO1xuICAgIGNvbnN0IHJpZ2h0U3lzdGVtID0gaXNTeXN0ZW1Nb2RlbChyaWdodC5lbmRwb2ludCk7XG4gICAgaWYgKGxlZnRTeXN0ZW0gIT09IHJpZ2h0U3lzdGVtKSByZXR1cm4gbGVmdFN5c3RlbSA/IC0xIDogMTtcbiAgfVxuICBjb25zdCBsZWZ0T3NzID0gaXNPcGVuV2VpZ2h0c0dwdChsZWZ0LmVuZHBvaW50Lm5hbWUpO1xuICBjb25zdCByaWdodE9zcyA9IGlzT3BlbldlaWdodHNHcHQocmlnaHQuZW5kcG9pbnQubmFtZSk7XG4gIGlmIChsZWZ0T3NzICE9PSByaWdodE9zcykgcmV0dXJuIGxlZnRPc3MgPyAxIDogLTE7XG4gIGNvbnN0IGxlZnRWZXJzaW9uID0gdmVyc2lvblR1cGxlKGxlZnQuZW5kcG9pbnQubmFtZSk7XG4gIGNvbnN0IHJpZ2h0VmVyc2lvbiA9IHZlcnNpb25UdXBsZShyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDM7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmlnaHRWZXJzaW9uW2luZGV4XSEgLSBsZWZ0VmVyc2lvbltpbmRleF0hO1xuICAgIGlmICh2ZXJzaW9uICE9PSAwKSByZXR1cm4gdmVyc2lvbjtcbiAgfVxuICBjb25zdCB2YXJpYW50ID0gbW9kZWxWYXJpYW50UmFuayhsZWZ0LmVuZHBvaW50Lm5hbWUpIC0gbW9kZWxWYXJpYW50UmFuayhyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgaWYgKHZhcmlhbnQgIT09IDApIHJldHVybiB2YXJpYW50O1xuICByZXR1cm4gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihsZWZ0Lm1vZGVsQ2xhc3MpIC0gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihyaWdodC5tb2RlbENsYXNzKTtcbn1cblxuZnVuY3Rpb24gcHJlZmVyU3lzdGVtQ2FuZGlkYXRlcyhjYW5kaWRhdGVzOiByZWFkb25seSBSYW5rZWRNb2RlbFtdKTogUmFua2VkTW9kZWxbXSB7XG4gIHJldHVybiBbXG4gICAgLi4uY2FuZGlkYXRlcy5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4gaXNTeXN0ZW1Nb2RlbChjYW5kaWRhdGUuZW5kcG9pbnQpKSxcbiAgICAuLi5jYW5kaWRhdGVzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiAhaXNTeXN0ZW1Nb2RlbChjYW5kaWRhdGUuZW5kcG9pbnQpKSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gaXNTeXN0ZW1Nb2RlbChlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW5kcG9pbnQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJzeXN0ZW0uYWkuXCIpO1xufVxuXG5mdW5jdGlvbiBtb2RlbFZhcmlhbnRSYW5rKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmICghLyg/Ol58Wy1fLl0pZ3B0KD86Wy1fLl18JCkvaS50ZXN0KG5hbWUpKSByZXR1cm4gMjtcbiAgaWYgKC8oPzpefFstXy5dKXNvbCg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDA7XG4gIGlmICgvKD86XnxbLV8uXSlsdW5hKD86Wy1fLl18JCkvaS50ZXN0KG5hbWUpKSByZXR1cm4gMTtcbiAgcmV0dXJuIDI7XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9bYS16MC05XSsvZykgPz8gW107XG59XG5cbmZ1bmN0aW9uIHNlYXJjaGFibGVWYWx1ZXMoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgZW5kcG9pbnQubmFtZSxcbiAgICBlbmRwb2ludC5kaXNwbGF5TmFtZSxcbiAgICBlbmRwb2ludC5mYW1pbHksXG4gICAgZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAuLi5PYmplY3QudmFsdWVzKGVuZHBvaW50LnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIG1vZGVsUHJvZmlsZShlbnRpdHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gIGNvbnN0IHNvdXJjZSA9IHJlY29yZChyZWNvcmQoZW50aXR5LmZvdW5kYXRpb25fbW9kZWwpLmFpX2dhdGV3YXlfbW9kZWxfcHJvZmlsZSk7XG4gIGNvbnN0IHF1YWxpdHkgPSBmaW5pdGVOdW1iZXIoc291cmNlLnF1YWxpdHkpO1xuICBjb25zdCBzcGVlZCA9IGZpbml0ZU51bWJlcihzb3VyY2Uuc3BlZWQpO1xuICBjb25zdCBjb3N0ID0gZmluaXRlTnVtYmVyKHNvdXJjZS5jb3N0KTtcbiAgaWYgKHF1YWxpdHkgPT09IHVuZGVmaW5lZCAmJiBzcGVlZCA9PT0gdW5kZWZpbmVkICYmIGNvc3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICAuLi4ocXVhbGl0eSAhPT0gdW5kZWZpbmVkID8geyBxdWFsaXR5IH0gOiB7fSksXG4gICAgLi4uKHNwZWVkICE9PSB1bmRlZmluZWQgPyB7IHNwZWVkIH0gOiB7fSksXG4gICAgLi4uKGNvc3QgIT09IHVuZGVmaW5lZCA/IHsgY29zdCB9IDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwcm92aWRlZERpc3BsYXlOYW1lKFxuICBlbmRwb2ludDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGVudGl0aWVzOiByZWFkb25seSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB0YWcgb2YgYXJyYXlWYWx1ZShlbmRwb2ludC50YWdzKS5tYXAocmVjb3JkKSkge1xuICAgIGlmICghW1wiZGlzcGxheV9uYW1lXCIsIFwiZGlzcGxheU5hbWVcIiwgXCJuYW1lXCJdLmluY2x1ZGVzKFN0cmluZyh0YWcua2V5KSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZhbHVlID0gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHRhZy52YWx1ZSk7XG4gICAgaWYgKHZhbHVlKSByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBlbnRpdGllc1xuICAgICAgLm1hcCgoZW50aXR5KSA9PiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5kaXNwbGF5X25hbWUpKVxuICAgICAgLmZpbmQoQm9vbGVhbikgPz9cbiAgICBlbnRpdGllc1xuICAgICAgLm1hcCgoZW50aXR5KSA9PiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVudGl0eS5leHRlcm5hbF9tb2RlbCkubmFtZSkpXG4gICAgICAuZmluZChCb29sZWFuKVxuICApO1xufVxuXG5mdW5jdGlvbiByZWNvcmQodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiBvYmplY3QuaXNSZWNvcmQodmFsdWUpID8gdmFsdWUgOiB7fTtcbn1cblxuZnVuY3Rpb24gYXJyYXlWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHVua25vd25bXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW107XG59XG5cbmZ1bmN0aW9uIGZpbml0ZU51bWJlcih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBib29sZWFuVmFsdWUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -1,7 +1,12 @@
1
1
  import type { ModelQuery, RankedModel, ResolvedModel, ResolvedModelSelection, ResolveModelInput, ResolveModelOptions, ServingEndpointSummary } from "@dbx-tools/shared-model/contracts";
2
+ /** In-process model-ranking policy controls. */
3
+ export interface ModelSelectionPolicyOptions {
4
+ /** Prefer Databricks system endpoints instead of excluding them from non-exact selection. */
5
+ readonly preferSystemModels?: boolean;
6
+ }
2
7
  /** Rank a catalogue against a model query, best-first. */
3
- export declare function lookupModels(endpoints: readonly ServingEndpointSummary[], query?: ModelQuery): RankedModel[];
8
+ export declare function lookupModels(endpoints: readonly ServingEndpointSummary[], query?: ModelQuery, policy?: ModelSelectionPolicyOptions): RankedModel[];
4
9
  /** Resolve the closest model id in one catalogue snapshot. */
5
- export declare function rankModelId(endpoints: readonly ServingEndpointSummary[], search: string, options?: ResolveModelOptions): ResolvedModel;
10
+ export declare function rankModelId(endpoints: readonly ServingEndpointSummary[], search: string, options?: ResolveModelOptions, policy?: ModelSelectionPolicyOptions): ResolvedModel;
6
11
  /** Resolve a single model id from a catalogue and caller intent. */
7
- export declare function resolveModel(endpoints: readonly ServingEndpointSummary[], input?: ResolveModelInput): ResolvedModelSelection;
12
+ export declare function resolveModel(endpoints: readonly ServingEndpointSummary[], input?: ResolveModelInput, policy?: ModelSelectionPolicyOptions): ResolvedModelSelection;