@dbx-tools/appkit-model-gateway 0.9.175 → 0.9.177
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 +77 -0
- package/index.ts +4 -1
- package/lib/index.d.ts +4 -1
- package/lib/index.js +4 -2
- package/lib/src/gateway.d.ts +13 -1
- package/lib/src/gateway.js +98 -15
- package/lib/src/models.d.ts +3 -3
- package/lib/src/models.js +100 -6
- package/lib/src/plugin.js +2 -10
- package/lib/src/registry.js +3 -1
- package/lib/src/router.js +27 -5
- package/lib/src/routes.js +5 -2
- package/lib/src/smart-router.d.ts +159 -0
- package/lib/src/smart-router.js +700 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -7
- package/src/gateway.ts +152 -14
- package/src/models.ts +128 -5
- package/src/plugin.ts +1 -9
- package/src/registry.ts +2 -0
- package/src/router.ts +29 -4
- package/src/routes.ts +4 -1
- package/src/smart-router.ts +938 -0
package/README.md
CHANGED
|
@@ -51,6 +51,65 @@ The gateway supports:
|
|
|
51
51
|
- OpenAI-compatible embeddings.
|
|
52
52
|
- Codex model discovery and Responses traffic.
|
|
53
53
|
|
|
54
|
+
## Use Smart Router
|
|
55
|
+
|
|
56
|
+
Select the virtual `smart-router` model from any supported chat protocol:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"model": "smart-router",
|
|
61
|
+
"input": "Refactor the authorization layer across the repository"
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Before returning `GET /v1/models`, the gateway makes one memoized
|
|
66
|
+
`task_v3` capability request to Databricks
|
|
67
|
+
`/ai-gateway/routing/v1/routes:select`. The virtual model is listed only when
|
|
68
|
+
that request succeeds for the active identity and live `system.ai.*`
|
|
69
|
+
candidates. Positive probes are shared for five minutes and concurrent probes
|
|
70
|
+
coalesce into one request. Stale values are returned immediately while
|
|
71
|
+
`@dbx-tools/cache` `refreshAfterWrite` coalesces one access-triggered background
|
|
72
|
+
refresh. An explicit inference request skips this synthetic preflight because
|
|
73
|
+
its real route selection is already the availability check.
|
|
74
|
+
|
|
75
|
+
For inference, the gateway extracts bounded task context from Responses input,
|
|
76
|
+
Chat Completions or Anthropic messages, plain text, or generic JSON objects. It
|
|
77
|
+
excludes credentials, tool schemas, and tool arguments. OpenAI-shaped requests
|
|
78
|
+
use the `codex` Smart Router harness policy; Anthropic Messages uses `claude`.
|
|
79
|
+
The selected route must match one of the offered, protocol-compatible live
|
|
80
|
+
models. There is no local tier classifier or fallback selector.
|
|
81
|
+
|
|
82
|
+
The same `smart-router` id works with Responses, Chat Completions, Anthropic
|
|
83
|
+
Messages, and Codex-compatible Responses traffic. Embeddings require an
|
|
84
|
+
explicit model. Explicit concrete models and model-class headers continue to
|
|
85
|
+
win.
|
|
86
|
+
|
|
87
|
+
Smart Router selections are pinned for the logical user turn. The default store
|
|
88
|
+
uses AppKit `CacheManager`, so configured Lakebase/PostgreSQL persistence is
|
|
89
|
+
reused across app replicas. Supply `smartRouterStore` to use another storage
|
|
90
|
+
implementation with the same `get`/`set` contract, including a SQLite-backed
|
|
91
|
+
adapter. Only the selected model and bounded route metadata are stored; prompts
|
|
92
|
+
and responses are not.
|
|
93
|
+
|
|
94
|
+
This state is a TTL route pin, not conversation history. The gateway does not
|
|
95
|
+
read Mastra `PostgresStore`: supported chat requests already carry the portable
|
|
96
|
+
transcript, and coupling routing to Mastra would exclude other chat clients.
|
|
97
|
+
AppKit cache persistence is also preferable to a gateway-owned file or a second
|
|
98
|
+
expiring table because it already handles process-local reuse, project-scoped
|
|
99
|
+
disk fallback, and configured Lakebase/PostgreSQL storage. A consumer can still
|
|
100
|
+
inject a different store when its deployment needs another backend.
|
|
101
|
+
|
|
102
|
+
Response headers expose the selected concrete model, returned route model,
|
|
103
|
+
harness, cache source, and any `task_v3` task tier, served tier, or profiler
|
|
104
|
+
status without rewriting the upstream response body's model identity.
|
|
105
|
+
|
|
106
|
+
Select a model without starting the server by passing a JSON or text file, or
|
|
107
|
+
`-` for standard input:
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
dbx model-gateway --profile PROFILE --select-model-from request.json
|
|
111
|
+
```
|
|
112
|
+
|
|
54
113
|
## Discover models
|
|
55
114
|
|
|
56
115
|
```ts
|
|
@@ -92,6 +151,13 @@ discovered value.
|
|
|
92
151
|
`Originator: codex`. Codex slugs prefer fully qualified Databricks model service
|
|
93
152
|
names.
|
|
94
153
|
|
|
154
|
+
Codex merges provider models with its bundled catalogue. The gateway reserves a
|
|
155
|
+
separate provider priority range so bundled recommendations remain together,
|
|
156
|
+
then places Smart Router before the Databricks model list. Codex-specific model
|
|
157
|
+
ordering puts GPT models first and newer family versions before older versions.
|
|
158
|
+
Databricks GPT labels include the `Databricks` prefix so they remain distinct
|
|
159
|
+
from bundled GPT models after Codex applies its compact label formatting.
|
|
160
|
+
|
|
95
161
|
Point a Codex provider at:
|
|
96
162
|
|
|
97
163
|
```text
|
|
@@ -106,6 +172,16 @@ Use `wire_api = "responses"` and `supports_websockets = false`.
|
|
|
106
172
|
`system.ai.*` AI Gateway services for non-exact eligible requests. An exact
|
|
107
173
|
serving endpoint or `system.ai.*` name still wins.
|
|
108
174
|
|
|
175
|
+
Smart Router defaults to `smartRouter: "auto"` and is advertised only after its
|
|
176
|
+
capability probe succeeds. Set `smartRouter: "true"` to make model discovery
|
|
177
|
+
fail when the router is unavailable, or `smartRouter: "false"` to disable it.
|
|
178
|
+
Configure `smartRouterTimeoutMs`,
|
|
179
|
+
`smartRouterContextTokenBudget`, `smartRouterProbeTtlMs`,
|
|
180
|
+
`smartRouterProbeRefreshIntervalMs`, and `smartRouterRouteTtlSeconds` to tune
|
|
181
|
+
transport, context, request-driven probe expiry, background probe refresh, and
|
|
182
|
+
turn-pinning behavior. A failed real selection immediately invalidates the
|
|
183
|
+
positive probe.
|
|
184
|
+
|
|
109
185
|
Use `overrides` when workspace metadata must be corrected for a specific model.
|
|
110
186
|
For example, disable an advertised capability that the selected gateway route
|
|
111
187
|
cannot use:
|
|
@@ -131,4 +207,5 @@ Overrides affect routing and the OpenAI and Codex model catalogues.
|
|
|
131
207
|
- `gateway` handles protocol-neutral gateway requests.
|
|
132
208
|
- `registry` discovers and resolves workspace models.
|
|
133
209
|
- `router` selects a compatible route from model capabilities.
|
|
210
|
+
- `smartRouter` builds task context, probes availability, and calls `task_v3`.
|
|
134
211
|
- `transport` sends requests to Databricks model APIs.
|
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/appkit-model-gateway";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.177";
|
|
7
7
|
export * as gateway from "./src/gateway.ts";
|
|
8
8
|
export * as models from "./src/models.ts";
|
|
9
9
|
export * as plugin from "./src/plugin.ts";
|
|
@@ -11,6 +11,7 @@ export * as reasoningAdapt from "./src/reasoning-adapt.ts";
|
|
|
11
11
|
export * as registry from "./src/registry.ts";
|
|
12
12
|
export * as router from "./src/router.ts";
|
|
13
13
|
export * as routes from "./src/routes.ts";
|
|
14
|
+
export * as smartRouter from "./src/smart-router.ts";
|
|
14
15
|
export * as translation from "./src/translation.ts";
|
|
15
16
|
export * as transport from "./src/transport.ts";
|
|
16
17
|
export { ModelGatewayError, ModelGateway, sanitizeInferenceBody, adaptInferenceTemperature, gatewayModelSelection } from "./src/gateway.ts";
|
|
@@ -24,6 +25,8 @@ export { DatabricksModelRegistry } from "./src/registry.ts";
|
|
|
24
25
|
export type { ModelRegistryResolveOptions, ModelRegistry, ModelRegistryOptions } from "./src/registry.ts";
|
|
25
26
|
export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures, isCodexOriginator } from "./src/router.ts";
|
|
26
27
|
export { sendHealth, sendModels, sendInference } from "./src/routes.ts";
|
|
28
|
+
export { SMART_ROUTER_DEFAULT_SETTINGS, SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey } from "./src/smart-router.ts";
|
|
29
|
+
export type { SmartRouterSettings, SmartRouterCandidate, SmartRouterSelection, SmartRouterStore, SmartRouterProbeRecord, SmartRouterProbeStore, SmartRouterResult, SmartRouterContext, SmartRouterSelectOptions } from "./src/smart-router.ts";
|
|
27
30
|
export { translateGatewayRequest } from "./src/translation.ts";
|
|
28
31
|
export { fetchDatabricks, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.ts";
|
|
29
32
|
export type { DatabricksTransportRequest } from "./src/transport.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-model-gateway";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.177";
|
|
3
3
|
export * as gateway from "./src/gateway.ts";
|
|
4
4
|
export * as models from "./src/models.ts";
|
|
5
5
|
export * as plugin from "./src/plugin.ts";
|
|
@@ -7,6 +7,7 @@ export * as reasoningAdapt from "./src/reasoning-adapt.ts";
|
|
|
7
7
|
export * as registry from "./src/registry.ts";
|
|
8
8
|
export * as router from "./src/router.ts";
|
|
9
9
|
export * as routes from "./src/routes.ts";
|
|
10
|
+
export * as smartRouter from "./src/smart-router.ts";
|
|
10
11
|
export * as translation from "./src/translation.ts";
|
|
11
12
|
export * as transport from "./src/transport.ts";
|
|
12
13
|
export { ModelGatewayError, ModelGateway, sanitizeInferenceBody, adaptInferenceTemperature, gatewayModelSelection } from "./src/gateway.ts";
|
|
@@ -20,6 +21,8 @@ export { DatabricksModelRegistry } from "./src/registry.ts";
|
|
|
20
21
|
export type { ModelRegistryResolveOptions, ModelRegistry, ModelRegistryOptions } from "./src/registry.ts";
|
|
21
22
|
export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures, isCodexOriginator } from "./src/router.ts";
|
|
22
23
|
export { sendHealth, sendModels, sendInference } from "./src/routes.ts";
|
|
24
|
+
export { SMART_ROUTER_DEFAULT_SETTINGS, SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey } from "./src/smart-router.ts";
|
|
25
|
+
export type { SmartRouterSettings, SmartRouterCandidate, SmartRouterSelection, SmartRouterStore, SmartRouterProbeRecord, SmartRouterProbeStore, SmartRouterResult, SmartRouterContext, SmartRouterSelectOptions } from "./src/smart-router.ts";
|
|
23
26
|
export { translateGatewayRequest } from "./src/translation.ts";
|
|
24
27
|
export { fetchDatabricks, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.ts";
|
|
25
28
|
export type { DatabricksTransportRequest } from "./src/transport.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/appkit-model-gateway";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.177";
|
|
6
6
|
export * as gateway from "./src/gateway.js";
|
|
7
7
|
export * as models from "./src/models.js";
|
|
8
8
|
export * as plugin from "./src/plugin.js";
|
|
@@ -10,6 +10,7 @@ export * as reasoningAdapt from "./src/reasoning-adapt.js";
|
|
|
10
10
|
export * as registry from "./src/registry.js";
|
|
11
11
|
export * as router from "./src/router.js";
|
|
12
12
|
export * as routes from "./src/routes.js";
|
|
13
|
+
export * as smartRouter from "./src/smart-router.js";
|
|
13
14
|
export * as translation from "./src/translation.js";
|
|
14
15
|
export * as transport from "./src/transport.js";
|
|
15
16
|
export { ModelGatewayError, ModelGateway, sanitizeInferenceBody, adaptInferenceTemperature, gatewayModelSelection } from "./src/gateway.js";
|
|
@@ -19,6 +20,7 @@ export { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./src/reas
|
|
|
19
20
|
export { DatabricksModelRegistry } from "./src/registry.js";
|
|
20
21
|
export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures, isCodexOriginator } from "./src/router.js";
|
|
21
22
|
export { sendHealth, sendModels, sendInference } from "./src/routes.js";
|
|
23
|
+
export { SMART_ROUTER_DEFAULT_SETTINGS, SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey } from "./src/smart-router.js";
|
|
22
24
|
export { translateGatewayRequest } from "./src/translation.js";
|
|
23
25
|
export { fetchDatabricks, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.js";
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVJLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFaEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JILE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSwyQkFBMkIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXZSLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsMkJBQTJCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1vZGVsLWdhdGV3YXlcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xNzdcIjtcbmV4cG9ydCAqIGFzIGdhdGV3YXkgZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVscyBmcm9tIFwiLi9zcmMvbW9kZWxzLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcmVhc29uaW5nQWRhcHQgZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0ICogYXMgcmVnaXN0cnkgZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgKiBhcyByb3V0ZXIgZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0ICogYXMgcm91dGVzIGZyb20gXCIuL3NyYy9yb3V0ZXMudHNcIjtcbmV4cG9ydCAqIGFzIHNtYXJ0Um91dGVyIGZyb20gXCIuL3NyYy9zbWFydC1yb3V0ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHRyYW5zbGF0aW9uIGZyb20gXCIuL3NyYy90cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgdHJhbnNwb3J0IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbmV4cG9ydCB7IE1vZGVsR2F0ZXdheUVycm9yLCBNb2RlbEdhdGV3YXksIHNhbml0aXplSW5mZXJlbmNlQm9keSwgYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZSwgZ2F0ZXdheU1vZGVsU2VsZWN0aW9uIH0gZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgeyBsaXN0TW9kZWxzUGF5bG9hZCwgY29kZXhNb2RlbFNsdWcgfSBmcm9tIFwiLi9zcmMvbW9kZWxzLnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlQbHVnaW4sIG1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHsgYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcsIGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSB9IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWRhcHRlZEluZmVyZW5jZUJvZHkgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSB9IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMsIE1vZGVsUmVnaXN0cnksIE1vZGVsUmVnaXN0cnlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgeyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IsIHJlc29sdmVSb3V0ZSwgcmVxdWVzdGVkRmVhdHVyZXMsIGlzQ29kZXhPcmlnaW5hdG9yIH0gZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0IHsgc2VuZEhlYWx0aCwgc2VuZE1vZGVscywgc2VuZEluZmVyZW5jZSB9IGZyb20gXCIuL3NyYy9yb3V0ZXMudHNcIjtcbmV4cG9ydCB7IFNNQVJUX1JPVVRFUl9ERUZBVUxUX1NFVFRJTkdTLCBTbWFydFJvdXRlclByb2JlUmVjb3JkU2NoZW1hLCBTbWFydFJvdXRlckVycm9yLCBBcHBLaXRTbWFydFJvdXRlclN0b3JlLCBBcHBLaXRTbWFydFJvdXRlclByb2JlU3RvcmUsIFNtYXJ0Um91dGVyU2VydmljZSwgc21hcnRSb3V0ZXJDYW5kaWRhdGVzLCBTbWFydFJvdXRlckNvbnRleHRCdWlsZGVyLCBTbWFydE1vZGVsUm91dGVyLCBzbWFydFJvdXRlclR1cm5LZXkgfSBmcm9tIFwiLi9zcmMvc21hcnQtcm91dGVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNtYXJ0Um91dGVyU2V0dGluZ3MsIFNtYXJ0Um91dGVyQ2FuZGlkYXRlLCBTbWFydFJvdXRlclNlbGVjdGlvbiwgU21hcnRSb3V0ZXJTdG9yZSwgU21hcnRSb3V0ZXJQcm9iZVJlY29yZCwgU21hcnRSb3V0ZXJQcm9iZVN0b3JlLCBTbWFydFJvdXRlclJlc3VsdCwgU21hcnRSb3V0ZXJDb250ZXh0LCBTbWFydFJvdXRlclNlbGVjdE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc21hcnQtcm91dGVyLnRzXCI7XG5leHBvcnQgeyB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBkaXJlY3REYXRhYnJpY2tzUmVxdWVzdEJvZHksIGdhdGV3YXlSZXNwb25zZUhlYWRlcnMgfSBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuIl19
|
package/lib/src/gateway.d.ts
CHANGED
|
@@ -4,11 +4,20 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
import { type ServingEndpointSummary, type ModelClass as ModelClassType } from "@dbx-tools/shared-model";
|
|
7
|
-
import type { ClientProtocol, ModelCapabilityOverride, ModelListResponse } from "@dbx-tools/shared-model-gateway";
|
|
7
|
+
import type { ClientProtocol, ModelCapabilityOverride, ModelListResponse, SmartRouterMode } from "@dbx-tools/shared-model-gateway";
|
|
8
8
|
import { type ModelRegistry } from "./registry.ts";
|
|
9
|
+
import { type SmartRouterService, type SmartRouterStore } from "./smart-router.ts";
|
|
9
10
|
/** Model gateway runtime configuration. */
|
|
10
11
|
export interface ModelGatewayOptions {
|
|
11
12
|
readonly cacheTtlMs?: number;
|
|
13
|
+
readonly smartRouter?: SmartRouterMode;
|
|
14
|
+
readonly smartRouterContextTokenBudget?: number;
|
|
15
|
+
readonly smartRouterProbeRefreshIntervalMs?: number;
|
|
16
|
+
readonly smartRouterProbeTtlMs?: number;
|
|
17
|
+
readonly smartRouterRouteTtlSeconds?: number;
|
|
18
|
+
readonly smartRouterTimeoutMs?: number;
|
|
19
|
+
readonly smartRouterService?: SmartRouterService;
|
|
20
|
+
readonly smartRouterStore?: SmartRouterStore;
|
|
12
21
|
readonly overrides?: readonly ModelCapabilityOverride[];
|
|
13
22
|
readonly model?: string;
|
|
14
23
|
readonly modelClass?: ModelClassType;
|
|
@@ -22,6 +31,8 @@ export declare class ModelGatewayError extends Error {
|
|
|
22
31
|
/** AppKit-scoped model gateway with dynamic model discovery and streaming inference. */
|
|
23
32
|
export declare class ModelGateway {
|
|
24
33
|
private readonly registry;
|
|
34
|
+
private readonly smartRouter?;
|
|
35
|
+
private readonly smartRouterMode;
|
|
25
36
|
private readonly model?;
|
|
26
37
|
private readonly modelClass?;
|
|
27
38
|
private readonly preferSystemModels;
|
|
@@ -43,6 +54,7 @@ export declare function gatewayModelSelection(body: Readonly<Record<string, unkn
|
|
|
43
54
|
readonly model?: string;
|
|
44
55
|
readonly modelClass?: ModelClassType;
|
|
45
56
|
}, protocol?: ClientProtocol): {
|
|
57
|
+
readonly smartRouter?: boolean;
|
|
46
58
|
readonly model?: string;
|
|
47
59
|
readonly modelClass?: ModelClassType;
|
|
48
60
|
};
|
package/lib/src/gateway.js
CHANGED
|
@@ -3,13 +3,15 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { log } from "@dbx-tools/shared-core";
|
|
7
6
|
import { modelTemperatureSupportFor } from "@dbx-tools/model";
|
|
7
|
+
import { log } from "@dbx-tools/shared-core";
|
|
8
8
|
import { ModelClass, ModelClassSchema, } from "@dbx-tools/shared-model";
|
|
9
|
+
import { MODEL_GATEWAY_DEFAULTS, SMART_ROUTER_HARNESS_HEADER, SMART_ROUTER_MODEL_ID, SMART_ROUTER_PROFILER_STATUS_HEADER, SMART_ROUTER_ROUTE_MODEL_HEADER, SMART_ROUTER_SELECTED_MODEL_HEADER, SMART_ROUTER_SERVED_TIER_HEADER, SMART_ROUTER_SOURCE_HEADER, SMART_ROUTER_TASK_TIER_HEADER, isSmartRouterModelId, } from "@dbx-tools/shared-model-gateway";
|
|
9
10
|
import { listModelsPayload } from "./models.js";
|
|
10
11
|
import { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./reasoning-adapt.js";
|
|
11
12
|
import { DatabricksModelRegistry, } from "./registry.js";
|
|
12
13
|
import { isCodexOriginator, requestedFeatures, resolveRoute } from "./router.js";
|
|
14
|
+
import { SmartModelRouter, } from "./smart-router.js";
|
|
13
15
|
import { translateGatewayRequest } from "./translation.js";
|
|
14
16
|
import { fetchDatabricks, gatewayResponseHeaders } from "./transport.js";
|
|
15
17
|
const logger = log.logger("appkit/model-gateway");
|
|
@@ -27,6 +29,8 @@ export class ModelGatewayError extends Error {
|
|
|
27
29
|
/** AppKit-scoped model gateway with dynamic model discovery and streaming inference. */
|
|
28
30
|
export class ModelGateway {
|
|
29
31
|
registry;
|
|
32
|
+
smartRouter;
|
|
33
|
+
smartRouterMode;
|
|
30
34
|
model;
|
|
31
35
|
modelClass;
|
|
32
36
|
preferSystemModels;
|
|
@@ -39,18 +43,42 @@ export class ModelGateway {
|
|
|
39
43
|
: {}),
|
|
40
44
|
};
|
|
41
45
|
this.registry = registry ?? new DatabricksModelRegistry(registryOptions);
|
|
46
|
+
this.smartRouterMode = options.smartRouter ?? MODEL_GATEWAY_DEFAULTS.smartRouter;
|
|
47
|
+
if (this.smartRouterMode !== "false") {
|
|
48
|
+
this.smartRouter = new SmartModelRouter({
|
|
49
|
+
contextTokenBudget: options.smartRouterContextTokenBudget ??
|
|
50
|
+
MODEL_GATEWAY_DEFAULTS.smartRouterContextTokenBudget,
|
|
51
|
+
probeRefreshIntervalMs: options.smartRouterProbeRefreshIntervalMs ??
|
|
52
|
+
MODEL_GATEWAY_DEFAULTS.smartRouterProbeRefreshIntervalMs,
|
|
53
|
+
probeTtlMs: options.smartRouterProbeTtlMs ?? MODEL_GATEWAY_DEFAULTS.smartRouterProbeTtlMs,
|
|
54
|
+
routeTtlSeconds: options.smartRouterRouteTtlSeconds ?? MODEL_GATEWAY_DEFAULTS.smartRouterRouteTtlSeconds,
|
|
55
|
+
routerName: "task_v3",
|
|
56
|
+
timeoutMs: options.smartRouterTimeoutMs ?? MODEL_GATEWAY_DEFAULTS.smartRouterTimeoutMs,
|
|
57
|
+
}, options.smartRouterService, options.smartRouterStore);
|
|
58
|
+
}
|
|
42
59
|
this.model = options.model;
|
|
43
60
|
this.modelClass = options.modelClass;
|
|
44
|
-
this.preferSystemModels =
|
|
61
|
+
this.preferSystemModels =
|
|
62
|
+
options.preferSystemModels ?? MODEL_GATEWAY_DEFAULTS.preferSystemModels;
|
|
45
63
|
}
|
|
46
64
|
/** Return the live OpenAI model list, including Codex metadata when requested. */
|
|
47
65
|
async models(originator, search) {
|
|
48
66
|
const codex = isCodexOriginator(originator);
|
|
49
67
|
logger.debug("listing models", { codex, search });
|
|
50
68
|
const query = search?.trim();
|
|
51
|
-
const
|
|
69
|
+
const smartRouterSearch = query !== undefined && SMART_ROUTER_MODEL_ID.includes(query.toLowerCase());
|
|
70
|
+
const targets = query && !smartRouterSearch ? await this.registry.search(query) : await this.registry.list();
|
|
71
|
+
const smartRouterTargets = this.smartRouterMode === "true" && query && !smartRouterSearch
|
|
72
|
+
? await this.registry.list()
|
|
73
|
+
: targets;
|
|
74
|
+
const shouldProbeSmartRouter = Boolean(this.smartRouter) && (this.smartRouterMode === "true" || !query || smartRouterSearch);
|
|
75
|
+
const smartRouterEnabled = shouldProbeSmartRouter && (await this.smartRouter.isEnabled(smartRouterTargets));
|
|
76
|
+
if (this.smartRouterMode === "true" && !smartRouterEnabled) {
|
|
77
|
+
throw new ModelGatewayError(503, "Databricks Smart Router is required but unavailable for the active workspace identity");
|
|
78
|
+
}
|
|
52
79
|
logger.debug("listed models", { codex, count: targets.length });
|
|
53
|
-
|
|
80
|
+
const payload = listModelsPayload(targets, codex, query !== undefined && query.length > 0, this.preferSystemModels, smartRouterEnabled && (!query || smartRouterSearch));
|
|
81
|
+
return smartRouterSearch ? onlySmartRouter(payload) : payload;
|
|
54
82
|
}
|
|
55
83
|
/** Resolve and execute one inference request. */
|
|
56
84
|
async inference(protocol, body, headers, signal) {
|
|
@@ -60,6 +88,7 @@ export class ModelGateway {
|
|
|
60
88
|
modelClass: this.modelClass,
|
|
61
89
|
}, protocol);
|
|
62
90
|
logger.debug("resolving request", {
|
|
91
|
+
smartRouter: selection.smartRouter === true,
|
|
63
92
|
clientProtocol: protocol,
|
|
64
93
|
model: selection.model,
|
|
65
94
|
modelClass: selection.modelClass,
|
|
@@ -67,11 +96,29 @@ export class ModelGateway {
|
|
|
67
96
|
stream: sanitizedBody.stream === true,
|
|
68
97
|
});
|
|
69
98
|
const features = requestedFeatures(sanitizedBody);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
99
|
+
if (selection.smartRouter && protocol === "openai-embeddings") {
|
|
100
|
+
throw new ModelGatewayError(400, "Model smart-router is available only for chat requests");
|
|
101
|
+
}
|
|
102
|
+
const smartRouter = selection.smartRouter && this.smartRouter
|
|
103
|
+
? await this.smartRouter.resolve({
|
|
104
|
+
protocol: protocol,
|
|
105
|
+
body: sanitizedBody,
|
|
106
|
+
headers,
|
|
107
|
+
features,
|
|
108
|
+
targets: await this.registry.list(),
|
|
109
|
+
preferSystemModels: this.preferSystemModels,
|
|
110
|
+
signal,
|
|
111
|
+
})
|
|
112
|
+
: undefined;
|
|
113
|
+
if (selection.smartRouter && !smartRouter) {
|
|
114
|
+
throw new ModelGatewayError(404, "Databricks Smart Router is disabled");
|
|
115
|
+
}
|
|
116
|
+
const target = smartRouter?.target ??
|
|
117
|
+
(await this.registry.resolve(selection.model, {
|
|
118
|
+
...(protocol === "openai-embeddings" ? { modelClass: ModelClass.Embedding } : {}),
|
|
119
|
+
...(selection.modelClass ? { modelClass: selection.modelClass } : {}),
|
|
120
|
+
...(features.tools ? { requiresTools: true } : {}),
|
|
121
|
+
}));
|
|
75
122
|
if (!target) {
|
|
76
123
|
throw new ModelGatewayError(404, selection.model
|
|
77
124
|
? `Model not found: ${selection.model}`
|
|
@@ -79,7 +126,7 @@ export class ModelGateway {
|
|
|
79
126
|
}
|
|
80
127
|
const route = resolveRoute({
|
|
81
128
|
clientProtocol: protocol,
|
|
82
|
-
...(selection.model ? { requestedModel: selection.model } : {}),
|
|
129
|
+
...(!smartRouter && selection.model ? { requestedModel: selection.model } : {}),
|
|
83
130
|
originator: headers.get("originator") ?? undefined,
|
|
84
131
|
preferSystemModels: this.preferSystemModels,
|
|
85
132
|
features,
|
|
@@ -90,7 +137,7 @@ export class ModelGateway {
|
|
|
90
137
|
model: target.id,
|
|
91
138
|
upstreamProtocol: route.upstreamProtocol,
|
|
92
139
|
});
|
|
93
|
-
const temperatureBody = adaptInferenceTemperature(target.endpoint ?? target.id, sanitizedBody);
|
|
140
|
+
const temperatureBody = adaptInferenceTemperature(target.endpoint ?? target.id, smartRouter?.body ?? sanitizedBody);
|
|
94
141
|
const adapted = adaptInferenceReasoning(target.id, temperatureBody);
|
|
95
142
|
let response = await this.forward(route, adapted.body, headers, signal);
|
|
96
143
|
const retryBody = await learnAndAdaptReasoningRetry({
|
|
@@ -106,10 +153,15 @@ export class ModelGateway {
|
|
|
106
153
|
logResponse(route.upstreamProtocol, target.id, response);
|
|
107
154
|
if (route.upstreamProtocol === "ai-sdk") {
|
|
108
155
|
response.headers.set("x-dbx-tools-upstream", route.upstreamProtocol);
|
|
156
|
+
if (smartRouter) {
|
|
157
|
+
applySmartRouterObservationHeaders(response.headers, smartRouter.observation);
|
|
158
|
+
}
|
|
109
159
|
return response;
|
|
110
160
|
}
|
|
111
161
|
const forwarded = gatewayResponseHeaders(response.headers);
|
|
112
162
|
forwarded.set("x-dbx-tools-upstream", route.upstreamProtocol);
|
|
163
|
+
if (smartRouter)
|
|
164
|
+
applySmartRouterObservationHeaders(forwarded, smartRouter.observation);
|
|
113
165
|
return new Response(response.body, {
|
|
114
166
|
status: response.status,
|
|
115
167
|
statusText: response.statusText,
|
|
@@ -169,17 +221,48 @@ export function gatewayModelSelection(body, headers, defaults = {}, protocol) {
|
|
|
169
221
|
throw new ModelGatewayError(400, "Model and model class are mutually exclusive");
|
|
170
222
|
}
|
|
171
223
|
if (model)
|
|
172
|
-
return { model };
|
|
224
|
+
return isSmartRouterModelId(model) ? { smartRouter: true } : { model };
|
|
173
225
|
if (parsedClass?.data)
|
|
174
226
|
return { modelClass: parsedClass.data };
|
|
175
|
-
if (defaults.model)
|
|
176
|
-
return { model: defaults.model };
|
|
227
|
+
if (defaults.model) {
|
|
228
|
+
return isSmartRouterModelId(defaults.model) ? { smartRouter: true } : { model: defaults.model };
|
|
229
|
+
}
|
|
177
230
|
if (defaults.modelClass)
|
|
178
231
|
return { modelClass: defaults.modelClass };
|
|
179
232
|
if (protocol === "openai-embeddings")
|
|
180
233
|
return { modelClass: ModelClass.Embedding };
|
|
181
234
|
return {};
|
|
182
235
|
}
|
|
236
|
+
function applySmartRouterObservationHeaders(headers, observation) {
|
|
237
|
+
headers.set(SMART_ROUTER_SELECTED_MODEL_HEADER, observation.selectedModel);
|
|
238
|
+
headers.set(SMART_ROUTER_ROUTE_MODEL_HEADER, observation.routeModel);
|
|
239
|
+
headers.set(SMART_ROUTER_HARNESS_HEADER, observation.harness);
|
|
240
|
+
headers.set(SMART_ROUTER_SOURCE_HEADER, observation.source);
|
|
241
|
+
const taskTier = stringParam(observation.params, "task_tier");
|
|
242
|
+
const servedTier = stringParam(observation.params, "served_tier");
|
|
243
|
+
const profilerStatus = stringParam(observation.params, "profiler_status");
|
|
244
|
+
if (taskTier)
|
|
245
|
+
headers.set(SMART_ROUTER_TASK_TIER_HEADER, taskTier);
|
|
246
|
+
if (servedTier)
|
|
247
|
+
headers.set(SMART_ROUTER_SERVED_TIER_HEADER, servedTier);
|
|
248
|
+
if (profilerStatus)
|
|
249
|
+
headers.set(SMART_ROUTER_PROFILER_STATUS_HEADER, profilerStatus);
|
|
250
|
+
}
|
|
251
|
+
function stringParam(params, key) {
|
|
252
|
+
const value = params?.[key];
|
|
253
|
+
return typeof value === "string" && value ? value : undefined;
|
|
254
|
+
}
|
|
255
|
+
function onlySmartRouter(payload) {
|
|
256
|
+
if ("models" in payload) {
|
|
257
|
+
return {
|
|
258
|
+
models: payload.models.filter((model) => model.slug.toLowerCase().endsWith(`/${SMART_ROUTER_MODEL_ID}`)),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
object: "list",
|
|
263
|
+
data: payload.data.filter((model) => model.id === SMART_ROUTER_MODEL_ID),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
183
266
|
function logResponse(upstreamProtocol, model, response) {
|
|
184
267
|
const details = {
|
|
185
268
|
contentType: response.headers.get("content-type"),
|
|
@@ -192,4 +275,4 @@ function logResponse(upstreamProtocol, model, response) {
|
|
|
192
275
|
else
|
|
193
276
|
logger.warn("upstream request failed", details);
|
|
194
277
|
}
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUQsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FHakIsTUFBTSx5QkFBeUIsQ0FBQztBQVFqQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUYsT0FBTyxFQUNMLHVCQUF1QixHQUd4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDbEQsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUM7QUFDckMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUM7QUFXckMsK0RBQStEO0FBQy9ELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxLQUFLO0lBRS9CO0lBRFgsWUFDVyxNQUFjLEVBQ3ZCLE9BQWU7UUFFZixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFITixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBSXZCLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBRUQsd0ZBQXdGO0FBQ3hG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RUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckQsSUFBSSxRQUFRLENBQUMsVUFBVTtRQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BFLElBQUksUUFBUSxLQUFLLG1CQUFtQjtRQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xGLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLGdCQUF3QixFQUFFLEtBQWEsRUFBRSxRQUFrQjtJQUM5RSxNQUFNLE9BQU8sR0FBRztRQUNkLFdBQVcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7UUFDakQsS0FBSztRQUNMLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN2QixnQkFBZ0I7S0FDakIsQ0FBQztJQUNGLElBQUksUUFBUSxDQUFDLEVBQUU7UUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDOztRQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByb3RvY29sLWluZGVwZW5kZW50IGdhdGV3YXkgc2VydmljZSB1c2VkIGJ5IHBsdWdpbiBhbmQgc3RhbmRhbG9uZSByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbFRlbXBlcmF0dXJlU3VwcG9ydEZvciB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQge1xuICBNb2RlbENsYXNzLFxuICBNb2RlbENsYXNzU2NoZW1hLFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIHR5cGUgTW9kZWxDbGFzcyBhcyBNb2RlbENsYXNzVHlwZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudFByb3RvY29sLFxuICBHYXRld2F5Um91dGUsXG4gIE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlLFxuICBNb2RlbExpc3RSZXNwb25zZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuaW1wb3J0IHsgbGlzdE1vZGVsc1BheWxvYWQgfSBmcm9tIFwiLi9tb2RlbHMudHNcIjtcbmltcG9ydCB7IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nLCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkgfSBmcm9tIFwiLi9yZWFzb25pbmctYWRhcHQudHNcIjtcbmltcG9ydCB7XG4gIERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnksXG4gIHR5cGUgTW9kZWxSZWdpc3RyeU9wdGlvbnMsXG59IGZyb20gXCIuL3JlZ2lzdHJ5LnRzXCI7XG5pbXBvcnQgeyBpc0NvZGV4T3JpZ2luYXRvciwgcmVxdWVzdGVkRmVhdHVyZXMsIHJlc29sdmVSb3V0ZSB9IGZyb20gXCIuL3JvdXRlci50c1wiO1xuaW1wb3J0IHsgdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3QgfSBmcm9tIFwiLi90cmFuc2xhdGlvbi50c1wiO1xuaW1wb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBnYXRld2F5UmVzcG9uc2VIZWFkZXJzIH0gZnJvbSBcIi4vdHJhbnNwb3J0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheVwiKTtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUlOID0gMDtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUFYID0gMjtcblxuLyoqIE1vZGVsIGdhdGV3YXkgcnVudGltZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEdhdGV3YXlPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2FjaGVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogcmVhZG9ubHkgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGVbXTtcbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbiAgcmVhZG9ubHkgcHJlZmVyU3lzdGVtTW9kZWxzPzogYm9vbGVhbjtcbn1cblxuLyoqIEVycm9yIGNhcnJ5aW5nIGFuIEhUVFAgc3RhdHVzIGFuZCBwcm90b2NvbC1zYWZlIG1lc3NhZ2UuICovXG5leHBvcnQgY2xhc3MgTW9kZWxHYXRld2F5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJNb2RlbEdhdGV3YXlFcnJvclwiO1xuICB9XG59XG5cbi8qKiBBcHBLaXQtc2NvcGVkIG1vZGVsIGdhdGV3YXkgd2l0aCBkeW5hbWljIG1vZGVsIGRpc2NvdmVyeSBhbmQgc3RyZWFtaW5nIGluZmVyZW5jZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXkge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5OiBNb2RlbFJlZ2lzdHJ5O1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyA9IHt9LCByZWdpc3RyeT86IE1vZGVsUmVnaXN0cnkpIHtcbiAgICBjb25zdCByZWdpc3RyeU9wdGlvbnM6IE1vZGVsUmVnaXN0cnlPcHRpb25zID0ge1xuICAgICAgLi4uKG9wdGlvbnMuY2FjaGVUdGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGxNczogb3B0aW9ucy5jYWNoZVR0bE1zIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5vdmVycmlkZXMgPyB7IG92ZXJyaWRlczogb3B0aW9ucy5vdmVycmlkZXMgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLnByZWZlclN5c3RlbU1vZGVscyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBwcmVmZXJTeXN0ZW1Nb2RlbHM6IG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnkgPz8gbmV3IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5KHJlZ2lzdHJ5T3B0aW9ucyk7XG4gICAgdGhpcy5tb2RlbCA9IG9wdGlvbnMubW9kZWw7XG4gICAgdGhpcy5tb2RlbENsYXNzID0gb3B0aW9ucy5tb2RlbENsYXNzO1xuICAgIHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzID0gb3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPz8gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBsaXZlIE9wZW5BSSBtb2RlbCBsaXN0LCBpbmNsdWRpbmcgQ29kZXggbWV0YWRhdGEgd2hlbiByZXF1ZXN0ZWQuICovXG4gIGFzeW5jIG1vZGVscyhvcmlnaW5hdG9yPzogc3RyaW5nLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsTGlzdFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29kZXggPSBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0aW5nIG1vZGVsc1wiLCB7IGNvZGV4LCBzZWFyY2ggfSk7XG4gICAgY29uc3QgcXVlcnkgPSBzZWFyY2g/LnRyaW0oKTtcbiAgICBjb25zdCB0YXJnZXRzID0gcXVlcnkgPyBhd2FpdCB0aGlzLnJlZ2lzdHJ5LnNlYXJjaChxdWVyeSkgOiBhd2FpdCB0aGlzLnJlZ2lzdHJ5Lmxpc3QoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWQgbW9kZWxzXCIsIHsgY29kZXgsIGNvdW50OiB0YXJnZXRzLmxlbmd0aCB9KTtcbiAgICByZXR1cm4gbGlzdE1vZGVsc1BheWxvYWQoXG4gICAgICB0YXJnZXRzLFxuICAgICAgY29kZXgsXG4gICAgICBxdWVyeSAhPT0gdW5kZWZpbmVkICYmIHF1ZXJ5Lmxlbmd0aCA+IDAsXG4gICAgICB0aGlzLnByZWZlclN5c3RlbU1vZGVscyxcbiAgICApO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgYW5kIGV4ZWN1dGUgb25lIGluZmVyZW5jZSByZXF1ZXN0LiAqL1xuICBhc3luYyBpbmZlcmVuY2UoXG4gICAgcHJvdG9jb2w6IENsaWVudFByb3RvY29sLFxuICAgIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICBoZWFkZXJzOiBIZWFkZXJzLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRCb2R5ID0gc2FuaXRpemVJbmZlcmVuY2VCb2R5KGJvZHkpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdhdGV3YXlNb2RlbFNlbGVjdGlvbihcbiAgICAgIHNhbml0aXplZEJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAge1xuICAgICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5tb2RlbENsYXNzLFxuICAgICAgfSxcbiAgICAgIHByb3RvY29sLFxuICAgICk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2aW5nIHJlcXVlc3RcIiwge1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgbW9kZWw6IHNlbGVjdGlvbi5tb2RlbCxcbiAgICAgIG1vZGVsQ2xhc3M6IHNlbGVjdGlvbi5tb2RlbENsYXNzLFxuICAgICAgb3JpZ2luYXRvcjogaGVhZGVycy5nZXQoXCJvcmlnaW5hdG9yXCIpID8/IHVuZGVmaW5lZCxcbiAgICAgIHN0cmVhbTogc2FuaXRpemVkQm9keS5zdHJlYW0gPT09IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgZmVhdHVyZXMgPSByZXF1ZXN0ZWRGZWF0dXJlcyhzYW5pdGl6ZWRCb2R5KTtcbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUoc2VsZWN0aW9uLm1vZGVsLCB7XG4gICAgICAuLi4ocHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIiA/IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSA6IHt9KSxcbiAgICAgIC4uLihzZWxlY3Rpb24ubW9kZWxDbGFzcyA/IHsgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAgIC4uLihmZWF0dXJlcy50b29scyA/IHsgcmVxdWlyZXNUb29sczogdHJ1ZSB9IDoge30pLFxuICAgIH0pO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoXG4gICAgICAgIDQwNCxcbiAgICAgICAgc2VsZWN0aW9uLm1vZGVsXG4gICAgICAgICAgPyBgTW9kZWwgbm90IGZvdW5kOiAke3NlbGVjdGlvbi5tb2RlbH1gXG4gICAgICAgICAgOiBcIk5vIG1vZGVsIG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBjbGFzc1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgcm91dGUgPSByZXNvbHZlUm91dGUoe1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgLi4uKHNlbGVjdGlvbi5tb2RlbCA/IHsgcmVxdWVzdGVkTW9kZWw6IHNlbGVjdGlvbi5tb2RlbCB9IDoge30pLFxuICAgICAgb3JpZ2luYXRvcjogaGVhZGVycy5nZXQoXCJvcmlnaW5hdG9yXCIpID8/IHVuZGVmaW5lZCxcbiAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIHRhcmdldCxcbiAgICB9KTtcbiAgICBsb2dnZXIuZGVidWcoXCJyb3V0ZWRcIiwge1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wsXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZW1wZXJhdHVyZUJvZHkgPSBhZGFwdEluZmVyZW5jZVRlbXBlcmF0dXJlKFxuICAgICAgdGFyZ2V0LmVuZHBvaW50ID8/IHRhcmdldC5pZCxcbiAgICAgIHNhbml0aXplZEJvZHksXG4gICAgKTtcbiAgICBjb25zdCBhZGFwdGVkID0gYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcodGFyZ2V0LmlkLCB0ZW1wZXJhdHVyZUJvZHkpO1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZm9yd2FyZChyb3V0ZSwgYWRhcHRlZC5ib2R5LCBoZWFkZXJzLCBzaWduYWwpO1xuICAgIGNvbnN0IHJldHJ5Qm9keSA9IGF3YWl0IGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSh7XG4gICAgICBtb2RlbDogdGFyZ2V0LmlkLFxuICAgICAgYm9keTogdGVtcGVyYXR1cmVCb2R5LFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBwcmV2aW91c1dpcmVFZmZvcnQ6IGFkYXB0ZWQud2lyZUVmZm9ydCxcbiAgICB9KTtcbiAgICBpZiAocmV0cnlCb2R5KSB7XG4gICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIHJldHJ5Qm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICB9XG5cbiAgICBsb2dSZXNwb25zZShyb3V0ZS51cHN0cmVhbVByb3RvY29sLCB0YXJnZXQuaWQsIHJlc3BvbnNlKTtcbiAgICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJhaS1zZGtcIikge1xuICAgICAgcmVzcG9uc2UuaGVhZGVycy5zZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiLCByb3V0ZS51cHN0cmVhbVByb3RvY29sKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gICAgY29uc3QgZm9yd2FyZGVkID0gZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKTtcbiAgICBmb3J3YXJkZWQuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBmb3J3YXJkZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVmcmVzaCB0aGUgYWN0aXZlIHByaW5jaXBhbCdzIG1vZGVsIGNhdGFsb2d1ZS4gKi9cbiAgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoaW5nIG1vZGVsIGNhdGFsb2d1ZVwiKTtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5yZWZyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZvcndhcmQoXG4gICAgcm91dGU6IEdhdGV3YXlSb3V0ZSxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdChyb3V0ZSwgYm9keSwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoRGF0YWJyaWNrcyh7IHJvdXRlLCBib2R5LCBoZWFkZXJzLCBzaWduYWwgfSk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBudWxsIHRlbXBlcmF0dXJlIGFuZCByZWplY3QgZXhwbGljaXQgbm9ubnVtZXJpYyB2YWx1ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVJbmZlcmVuY2VCb2R5KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSkgcmV0dXJuIGJvZHk7XG4gIGlmIChib2R5LnRlbXBlcmF0dXJlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5LnRlbXBlcmF0dXJlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNGaW5pdGUoYm9keS50ZW1wZXJhdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwidGVtcGVyYXR1cmUgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIsIG51bGwsIG9yIG9taXR0ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBib2R5O1xuICB9XG4gIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uYm9keSB9O1xuICBkZWxldGUgc2FuaXRpemVkLnRlbXBlcmF0dXJlO1xuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKiogQXBwbHkgcHVibGlzaGVkIERhdGFicmlja3MgdGVtcGVyYXR1cmUgc3VwcG9ydCBhbmQgcmFuZ2UgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYXB0SW5mZXJlbmNlVGVtcGVyYXR1cmUoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSB8fCB0eXBlb2YgYm9keS50ZW1wZXJhdHVyZSAhPT0gXCJudW1iZXJcIikgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IHN1cHBvcnRlZCA9IG1vZGVsVGVtcGVyYXR1cmVTdXBwb3J0Rm9yKG1vZGVsKTtcbiAgaWYgKHN1cHBvcnRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYm9keTtcbiAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICBjb25zdCBhZGFwdGVkID0geyAuLi5ib2R5IH07XG4gICAgZGVsZXRlIGFkYXB0ZWQudGVtcGVyYXR1cmU7XG4gICAgcmV0dXJuIGFkYXB0ZWQ7XG4gIH1cbiAgY29uc3QgdGVtcGVyYXR1cmUgPSBNYXRoLm1pbihcbiAgICBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01BWCxcbiAgICBNYXRoLm1heChEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01JTiwgYm9keS50ZW1wZXJhdHVyZSksXG4gICk7XG4gIHJldHVybiB0ZW1wZXJhdHVyZSA9PT0gYm9keS50ZW1wZXJhdHVyZSA/IGJvZHkgOiB7IC4uLmJvZHksIHRlbXBlcmF0dXJlIH07XG59XG5cbi8qKiBSZXNvbHZlIHJlcXVlc3QsIGhlYWRlciwgY29uZmlndXJlZCwgYW5kIHByb3RvY29sIG1vZGVsLXNlbGVjdGlvbiBpbnB1dHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0ZXdheU1vZGVsU2VsZWN0aW9uKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIGRlZmF1bHRzOiB7IHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nOyByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGUgfSA9IHt9LFxuICBwcm90b2NvbD86IENsaWVudFByb3RvY29sLFxuKTogeyByZWFkb25seSBtb2RlbD86IHN0cmluZzsgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlIH0ge1xuICBjb25zdCBtb2RlbCA9IHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiICYmIGJvZHkubW9kZWwudHJpbSgpID8gYm9keS5tb2RlbC50cmltKCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnMuZ2V0KFwieC1kYngtdG9vbHMtbW9kZWwtY2xhc3NcIik/LnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkQ2xhc3MgPSBoZWFkZXIgPyBNb2RlbENsYXNzU2NoZW1hLnNhZmVQYXJzZShoZWFkZXIpIDogdW5kZWZpbmVkO1xuICBpZiAocGFyc2VkQ2xhc3MgJiYgIXBhcnNlZENsYXNzLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBgSW52YWxpZCBtb2RlbCBjbGFzczogJHtoZWFkZXJ9YCk7XG4gIH1cbiAgaWYgKG1vZGVsICYmIHBhcnNlZENsYXNzPy5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBhbmQgbW9kZWwgY2xhc3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKTtcbiAgfVxuICBpZiAobW9kZWwpIHJldHVybiB7IG1vZGVsIH07XG4gIGlmIChwYXJzZWRDbGFzcz8uZGF0YSkgcmV0dXJuIHsgbW9kZWxDbGFzczogcGFyc2VkQ2xhc3MuZGF0YSB9O1xuICBpZiAoZGVmYXVsdHMubW9kZWwpIHJldHVybiB7IG1vZGVsOiBkZWZhdWx0cy5tb2RlbCB9O1xuICBpZiAoZGVmYXVsdHMubW9kZWxDbGFzcykgcmV0dXJuIHsgbW9kZWxDbGFzczogZGVmYXVsdHMubW9kZWxDbGFzcyB9O1xuICBpZiAocHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikgcmV0dXJuIHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfTtcbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBsb2dSZXNwb25zZSh1cHN0cmVhbVByb3RvY29sOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcsIHJlc3BvbnNlOiBSZXNwb25zZSk6IHZvaWQge1xuICBjb25zdCBkZXRhaWxzID0ge1xuICAgIGNvbnRlbnRUeXBlOiByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSxcbiAgICBtb2RlbCxcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB1cHN0cmVhbVByb3RvY29sLFxuICB9O1xuICBpZiAocmVzcG9uc2Uub2spIGxvZ2dlci5kZWJ1ZyhcInVwc3RyZWFtIHJlc3BvbnNlXCIsIGRldGFpbHMpO1xuICBlbHNlIGxvZ2dlci53YXJuKFwidXBzdHJlYW0gcmVxdWVzdCBmYWlsZWRcIiwgZGV0YWlscyk7XG59XG4iXX0=
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FHakIsTUFBTSx5QkFBeUIsQ0FBQztBQVNqQyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUMzQixxQkFBcUIsRUFDckIsbUNBQW1DLEVBQ25DLCtCQUErQixFQUMvQixrQ0FBa0MsRUFDbEMsK0JBQStCLEVBQy9CLDBCQUEwQixFQUMxQiw2QkFBNkIsRUFDN0Isb0JBQW9CLEdBQ3JCLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVGLE9BQU8sRUFDTCx1QkFBdUIsR0FHeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRixPQUFPLEVBQ0wsZ0JBQWdCLEdBR2pCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUNsRCxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQztBQUNyQyxNQUFNLDBCQUEwQixHQUFHLENBQUMs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QUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBMEI7SUFDakQsSUFBSSxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEIsT0FBTztZQUNMLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUkscUJBQXFCLEVBQUUsQ0FBQyxDQUMvRDtTQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNO1FBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLHFCQUFxQixDQUFDO0tBQ3pFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsZ0JBQXdCLEVBQUUsS0FBYSxFQUFFLFFBQWtCO0lBQzlFLE1BQU0sT0FBTyxHQUFHO1FBQ2QsV0FBVyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztRQUNqRCxLQUFLO1FBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLGdCQUFnQjtLQUNqQixDQUFDO0lBQ0YsSUFBSSxRQUFRLENBQUMsRUFBRTtRQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7O1FBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvdG9jb2wtaW5kZXBlbmRlbnQgZ2F0ZXdheSBzZXJ2aWNlIHVzZWQgYnkgcGx1Z2luIGFuZCBzdGFuZGFsb25lIHJvdXRlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIE1vZGVsQ2xhc3NTY2hlbWEsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgdHlwZSBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NUeXBlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ2xpZW50UHJvdG9jb2wsXG4gIEdhdGV3YXlSb3V0ZSxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsTGlzdFJlc3BvbnNlLFxuICBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuICBTbWFydFJvdXRlck1vZGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQge1xuICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLFxuICBTTUFSVF9ST1VURVJfSEFSTkVTU19IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9NT0RFTF9JRCxcbiAgU01BUlRfUk9VVEVSX1BST0ZJTEVSX1NUQVRVU19IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9ST1VURV9NT0RFTF9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TRVJWRURfVElFUl9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TT1VSQ0VfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfVEFTS19USUVSX0hFQURFUixcbiAgaXNTbWFydFJvdXRlck1vZGVsSWQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmltcG9ydCB7IGxpc3RNb2RlbHNQYXlsb2FkIH0gZnJvbSBcIi4vbW9kZWxzLnRzXCI7XG5pbXBvcnQgeyBhZGFwdEluZmVyZW5jZVJlYXNvbmluZywgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5IH0gZnJvbSBcIi4vcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5pbXBvcnQge1xuICBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnlPcHRpb25zLFxufSBmcm9tIFwiLi9yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgaXNDb2RleE9yaWdpbmF0b3IsIHJlcXVlc3RlZEZlYXR1cmVzLCByZXNvbHZlUm91dGUgfSBmcm9tIFwiLi9yb3V0ZXIudHNcIjtcbmltcG9ydCB7XG4gIFNtYXJ0TW9kZWxSb3V0ZXIsXG4gIHR5cGUgU21hcnRSb3V0ZXJTZXJ2aWNlLFxuICB0eXBlIFNtYXJ0Um91dGVyU3RvcmUsXG59IGZyb20gXCIuL3NtYXJ0LXJvdXRlci50c1wiO1xuaW1wb3J0IHsgdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3QgfSBmcm9tIFwiLi90cmFuc2xhdGlvbi50c1wiO1xuaW1wb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBnYXRld2F5UmVzcG9uc2VIZWFkZXJzIH0gZnJvbSBcIi4vdHJhbnNwb3J0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheVwiKTtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUlOID0gMDtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUFYID0gMjtcblxuLyoqIE1vZGVsIGdhdGV3YXkgcnVudGltZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEdhdGV3YXlPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2FjaGVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydFJvdXRlck1vZGU7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0PzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclByb2JlUmVmcmVzaEludGVydmFsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyUHJvYmVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXJSb3V0ZVR0bFNlY29uZHM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyVGltZW91dE1zPzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclNlcnZpY2U/OiBTbWFydFJvdXRlclNlcnZpY2U7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyU3RvcmU/OiBTbWFydFJvdXRlclN0b3JlO1xuICByZWFkb25seSBvdmVycmlkZXM/OiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuICByZWFkb25seSBtb2RlbD86IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlO1xuICByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuO1xufVxuXG4vKiogRXJyb3IgY2FycnlpbmcgYW4gSFRUUCBzdGF0dXMgYW5kIHByb3RvY29sLXNhZmUgbWVzc2FnZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1vZGVsR2F0ZXdheUVycm9yXCI7XG4gIH1cbn1cblxuLyoqIEFwcEtpdC1zY29wZWQgbW9kZWwgZ2F0ZXdheSB3aXRoIGR5bmFtaWMgbW9kZWwgZGlzY292ZXJ5IGFuZCBzdHJlYW1pbmcgaW5mZXJlbmNlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnk6IE1vZGVsUmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydE1vZGVsUm91dGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNtYXJ0Um91dGVyTW9kZTogU21hcnRSb3V0ZXJNb2RlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyA9IHt9LCByZWdpc3RyeT86IE1vZGVsUmVnaXN0cnkpIHtcbiAgICBjb25zdCByZWdpc3RyeU9wdGlvbnM6IE1vZGVsUmVnaXN0cnlPcHRpb25zID0ge1xuICAgICAgLi4uKG9wdGlvbnMuY2FjaGVUdGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGxNczogb3B0aW9ucy5jYWNoZVR0bE1zIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5vdmVycmlkZXMgPyB7IG92ZXJyaWRlczogb3B0aW9ucy5vdmVycmlkZXMgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLnByZWZlclN5c3RlbU1vZGVscyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBwcmVmZXJTeXN0ZW1Nb2RlbHM6IG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnkgPz8gbmV3IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5KHJlZ2lzdHJ5T3B0aW9ucyk7XG4gICAgdGhpcy5zbWFydFJvdXRlck1vZGUgPSBvcHRpb25zLnNtYXJ0Um91dGVyID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXI7XG4gICAgaWYgKHRoaXMuc21hcnRSb3V0ZXJNb2RlICE9PSBcImZhbHNlXCIpIHtcbiAgICAgIHRoaXMuc21hcnRSb3V0ZXIgPSBuZXcgU21hcnRNb2RlbFJvdXRlcihcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRleHRUb2tlbkJ1ZGdldDpcbiAgICAgICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJDb250ZXh0VG9rZW5CdWRnZXQgPz9cbiAgICAgICAgICAgIE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJDb250ZXh0VG9rZW5CdWRnZXQsXG4gICAgICAgICAgcHJvYmVSZWZyZXNoSW50ZXJ2YWxNczpcbiAgICAgICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJQcm9iZVJlZnJlc2hJbnRlcnZhbE1zID8/XG4gICAgICAgICAgICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUHJvYmVSZWZyZXNoSW50ZXJ2YWxNcyxcbiAgICAgICAgICBwcm9iZVR0bE1zOiBvcHRpb25zLnNtYXJ0Um91dGVyUHJvYmVUdGxNcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUHJvYmVUdGxNcyxcbiAgICAgICAgICByb3V0ZVR0bFNlY29uZHM6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJSb3V0ZVR0bFNlY29uZHMsXG4gICAgICAgICAgcm91dGVyTmFtZTogXCJ0YXNrX3YzXCIsXG4gICAgICAgICAgdGltZW91dE1zOiBvcHRpb25zLnNtYXJ0Um91dGVyVGltZW91dE1zID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJUaW1lb3V0TXMsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJTZXJ2aWNlLFxuICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyU3RvcmUsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLm1vZGVsID0gb3B0aW9ucy5tb2RlbDtcbiAgICB0aGlzLm1vZGVsQ2xhc3MgPSBvcHRpb25zLm1vZGVsQ2xhc3M7XG4gICAgdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPVxuICAgICAgb3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPz8gTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5wcmVmZXJTeXN0ZW1Nb2RlbHM7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBsaXZlIE9wZW5BSSBtb2RlbCBsaXN0LCBpbmNsdWRpbmcgQ29kZXggbWV0YWRhdGEgd2hlbiByZXF1ZXN0ZWQuICovXG4gIGFzeW5jIG1vZGVscyhvcmlnaW5hdG9yPzogc3RyaW5nLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsTGlzdFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29kZXggPSBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0aW5nIG1vZGVsc1wiLCB7IGNvZGV4LCBzZWFyY2ggfSk7XG4gICAgY29uc3QgcXVlcnkgPSBzZWFyY2g/LnRyaW0oKTtcbiAgICBjb25zdCBzbWFydFJvdXRlclNlYXJjaCA9XG4gICAgICBxdWVyeSAhPT0gdW5kZWZpbmVkICYmIFNNQVJUX1JPVVRFUl9NT0RFTF9JRC5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjb25zdCB0YXJnZXRzID1cbiAgICAgIHF1ZXJ5ICYmICFzbWFydFJvdXRlclNlYXJjaCA/IGF3YWl0IHRoaXMucmVnaXN0cnkuc2VhcmNoKHF1ZXJ5KSA6IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpO1xuICAgIGNvbnN0IHNtYXJ0Um91dGVyVGFyZ2V0cyA9XG4gICAgICB0aGlzLnNtYXJ0Um91dGVyTW9kZSA9PT0gXCJ0cnVlXCIgJiYgcXVlcnkgJiYgIXNtYXJ0Um91dGVyU2VhcmNoXG4gICAgICAgID8gYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KClcbiAgICAgICAgOiB0YXJnZXRzO1xuICAgIGNvbnN0IHNob3VsZFByb2JlU21hcnRSb3V0ZXIgPVxuICAgICAgQm9vbGVhbih0aGlzLnNtYXJ0Um91dGVyKSAmJiAodGhpcy5zbWFydFJvdXRlck1vZGUgPT09IFwidHJ1ZVwiIHx8ICFxdWVyeSB8fCBzbWFydFJvdXRlclNlYXJjaCk7XG4gICAgY29uc3Qgc21hcnRSb3V0ZXJFbmFibGVkID1cbiAgICAgIHNob3VsZFByb2JlU21hcnRSb3V0ZXIgJiYgKGF3YWl0IHRoaXMuc21hcnRSb3V0ZXIhLmlzRW5hYmxlZChzbWFydFJvdXRlclRhcmdldHMpKTtcbiAgICBpZiAodGhpcy5zbWFydFJvdXRlck1vZGUgPT09IFwidHJ1ZVwiICYmICFzbWFydFJvdXRlckVuYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcihcbiAgICAgICAgNTAzLFxuICAgICAgICBcIkRhdGFicmlja3MgU21hcnQgUm91dGVyIGlzIHJlcXVpcmVkIGJ1dCB1bmF2YWlsYWJsZSBmb3IgdGhlIGFjdGl2ZSB3b3Jrc3BhY2UgaWRlbnRpdHlcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZCBtb2RlbHNcIiwgeyBjb2RleCwgY291bnQ6IHRhcmdldHMubGVuZ3RoIH0pO1xuICAgIGNvbnN0IHBheWxvYWQgPSBsaXN0TW9kZWxzUGF5bG9hZChcbiAgICAgIHRhcmdldHMsXG4gICAgICBjb2RleCxcbiAgICAgIHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgcXVlcnkubGVuZ3RoID4gMCxcbiAgICAgIHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgc21hcnRSb3V0ZXJFbmFibGVkICYmICghcXVlcnkgfHwgc21hcnRSb3V0ZXJTZWFyY2gpLFxuICAgICk7XG4gICAgcmV0dXJuIHNtYXJ0Um91dGVyU2VhcmNoID8gb25seVNtYXJ0Um91dGVyKHBheWxvYWQpIDogcGF5bG9hZDtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGFuZCBleGVjdXRlIG9uZSBpbmZlcmVuY2UgcmVxdWVzdC4gKi9cbiAgYXN5bmMgaW5mZXJlbmNlKFxuICAgIHByb3RvY29sOiBDbGllbnRQcm90b2NvbCxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkQm9keSA9IHNhbml0aXplSW5mZXJlbmNlQm9keShib2R5KTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBnYXRld2F5TW9kZWxTZWxlY3Rpb24oXG4gICAgICBzYW5pdGl6ZWRCb2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIHtcbiAgICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMubW9kZWxDbGFzcyxcbiAgICAgIH0sXG4gICAgICBwcm90b2NvbCxcbiAgICApO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmluZyByZXF1ZXN0XCIsIHtcbiAgICAgIHNtYXJ0Um91dGVyOiBzZWxlY3Rpb24uc21hcnRSb3V0ZXIgPT09IHRydWUsXG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBtb2RlbDogc2VsZWN0aW9uLm1vZGVsLFxuICAgICAgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MsXG4gICAgICBvcmlnaW5hdG9yOiBoZWFkZXJzLmdldChcIm9yaWdpbmF0b3JcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiBzYW5pdGl6ZWRCb2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHJlcXVlc3RlZEZlYXR1cmVzKHNhbml0aXplZEJvZHkpO1xuICAgIGlmIChzZWxlY3Rpb24uc21hcnRSb3V0ZXIgJiYgcHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBzbWFydC1yb3V0ZXIgaXMgYXZhaWxhYmxlIG9ubHkgZm9yIGNoYXQgcmVxdWVzdHNcIik7XG4gICAgfVxuICAgIGNvbnN0IHNtYXJ0Um91dGVyID1cbiAgICAgIHNlbGVjdGlvbi5zbWFydFJvdXRlciAmJiB0aGlzLnNtYXJ0Um91dGVyXG4gICAgICAgID8gYXdhaXQgdGhpcy5zbWFydFJvdXRlci5yZXNvbHZlKHtcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCBhcyBFeGNsdWRlPENsaWVudFByb3RvY29sLCBcIm9wZW5haS1lbWJlZGRpbmdzXCI+LFxuICAgICAgICAgICAgYm9keTogc2FuaXRpemVkQm9keSxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBmZWF0dXJlcyxcbiAgICAgICAgICAgIHRhcmdldHM6IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpLFxuICAgICAgICAgICAgcHJlZmVyU3lzdGVtTW9kZWxzOiB0aGlzLnByZWZlclN5c3RlbU1vZGVscyxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoc2VsZWN0aW9uLnNtYXJ0Um91dGVyICYmICFzbWFydFJvdXRlcikge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwNCwgXCJEYXRhYnJpY2tzIFNtYXJ0IFJvdXRlciBpcyBkaXNhYmxlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgIHNtYXJ0Um91dGVyPy50YXJnZXQgPz9cbiAgICAgIChhd2FpdCB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUoc2VsZWN0aW9uLm1vZGVsLCB7XG4gICAgICAgIC4uLihwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiID8geyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9IDoge30pLFxuICAgICAgICAuLi4oc2VsZWN0aW9uLm1vZGVsQ2xhc3MgPyB7IG1vZGVsQ2xhc3M6IHNlbGVjdGlvbi5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgICAgIC4uLihmZWF0dXJlcy50b29scyA/IHsgcmVxdWlyZXNUb29sczogdHJ1ZSB9IDoge30pLFxuICAgICAgfSkpO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoXG4gICAgICAgIDQwNCxcbiAgICAgICAgc2VsZWN0aW9uLm1vZGVsXG4gICAgICAgICAgPyBgTW9kZWwgbm90IGZvdW5kOiAke3NlbGVjdGlvbi5tb2RlbH1gXG4gICAgICAgICAgOiBcIk5vIG1vZGVsIG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBjbGFzc1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgcm91dGUgPSByZXNvbHZlUm91dGUoe1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgLi4uKCFzbWFydFJvdXRlciAmJiBzZWxlY3Rpb24ubW9kZWwgPyB7IHJlcXVlc3RlZE1vZGVsOiBzZWxlY3Rpb24ubW9kZWwgfSA6IHt9KSxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHM6IHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgZmVhdHVyZXMsXG4gICAgICB0YXJnZXQsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicm91dGVkXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICB1cHN0cmVhbVByb3RvY29sOiByb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGVyYXR1cmVCb2R5ID0gYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZShcbiAgICAgIHRhcmdldC5lbmRwb2ludCA/PyB0YXJnZXQuaWQsXG4gICAgICBzbWFydFJvdXRlcj8uYm9keSA/PyBzYW5pdGl6ZWRCb2R5LFxuICAgICk7XG4gICAgY29uc3QgYWRhcHRlZCA9IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nKHRhcmdldC5pZCwgdGVtcGVyYXR1cmVCb2R5KTtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIGFkYXB0ZWQuYm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICBjb25zdCByZXRyeUJvZHkgPSBhd2FpdCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkoe1xuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIGJvZHk6IHRlbXBlcmF0dXJlQm9keSxcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgcHJldmlvdXNXaXJlRWZmb3J0OiBhZGFwdGVkLndpcmVFZmZvcnQsXG4gICAgfSk7XG4gICAgaWYgKHJldHJ5Qm9keSkge1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3J3YXJkKHJvdXRlLCByZXRyeUJvZHksIGhlYWRlcnMsIHNpZ25hbCk7XG4gICAgfVxuXG4gICAgbG9nUmVzcG9uc2Uocm91dGUudXBzdHJlYW1Qcm90b2NvbCwgdGFyZ2V0LmlkLCByZXNwb25zZSk7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgICBpZiAoc21hcnRSb3V0ZXIpIHtcbiAgICAgICAgYXBwbHlTbWFydFJvdXRlck9ic2VydmF0aW9uSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzLCBzbWFydFJvdXRlci5vYnNlcnZhdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIGNvbnN0IGZvcndhcmRlZCA9IGdhdGV3YXlSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gICAgZm9yd2FyZGVkLnNldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIsIHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wpO1xuICAgIGlmIChzbWFydFJvdXRlcikgYXBwbHlTbWFydFJvdXRlck9ic2VydmF0aW9uSGVhZGVycyhmb3J3YXJkZWQsIHNtYXJ0Um91dGVyLm9ic2VydmF0aW9uKTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgIGhlYWRlcnM6IGZvcndhcmRlZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWZyZXNoIHRoZSBhY3RpdmUgcHJpbmNpcGFsJ3MgbW9kZWwgY2F0YWxvZ3VlLiAqL1xuICByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlZnJlc2hpbmcgbW9kZWwgY2F0YWxvZ3VlXCIpO1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZm9yd2FyZChcbiAgICByb3V0ZTogR2F0ZXdheVJvdXRlLFxuICAgIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICBoZWFkZXJzOiBIZWFkZXJzLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJhaS1zZGtcIikge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0KHJvdXRlLCBib2R5LCBzaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gZmV0Y2hEYXRhYnJpY2tzKHsgcm91dGUsIGJvZHksIGhlYWRlcnMsIHNpZ25hbCB9KTtcbiAgfVxufVxuXG4vKiogUmVtb3ZlIG51bGwgdGVtcGVyYXR1cmUgYW5kIHJlamVjdCBleHBsaWNpdCBub25udW1lcmljIHZhbHVlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUluZmVyZW5jZUJvZHkoXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihib2R5LCBcInRlbXBlcmF0dXJlXCIpKSByZXR1cm4gYm9keTtcbiAgaWYgKGJvZHkudGVtcGVyYXR1cmUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGJvZHkudGVtcGVyYXR1cmUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0Zpbml0ZShib2R5LnRlbXBlcmF0dXJlKSkge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJ0ZW1wZXJhdHVyZSBtdXN0IGJlIGEgZmluaXRlIG51bWJlciwgbnVsbCwgb3Igb21pdHRlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cbiAgY29uc3Qgc2FuaXRpemVkID0geyAuLi5ib2R5IH07XG4gIGRlbGV0ZSBzYW5pdGl6ZWQudGVtcGVyYXR1cmU7XG4gIHJldHVybiBzYW5pdGl6ZWQ7XG59XG5cbi8qKiBBcHBseSBwdWJsaXNoZWQgRGF0YWJyaWNrcyB0ZW1wZXJhdHVyZSBzdXBwb3J0IGFuZCByYW5nZSBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZShcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihib2R5LCBcInRlbXBlcmF0dXJlXCIpIHx8IHR5cGVvZiBib2R5LnRlbXBlcmF0dXJlICE9PSBcIm51bWJlclwiKSByZXR1cm4gYm9keTtcbiAgY29uc3Qgc3VwcG9ydGVkID0gbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IobW9kZWwpO1xuICBpZiAoc3VwcG9ydGVkID09PSB1bmRlZmluZWQpIHJldHVybiBib2R5O1xuICBpZiAoIXN1cHBvcnRlZCkge1xuICAgIGNvbnN0IGFkYXB0ZWQgPSB7IC4uLmJvZHkgfTtcbiAgICBkZWxldGUgYWRhcHRlZC50ZW1wZXJhdHVyZTtcbiAgICByZXR1cm4gYWRhcHRlZDtcbiAgfVxuICBjb25zdCB0ZW1wZXJhdHVyZSA9IE1hdGgubWluKFxuICAgIERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUFYLFxuICAgIE1hdGgubWF4KERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUlOLCBib2R5LnRlbXBlcmF0dXJlKSxcbiAgKTtcbiAgcmV0dXJuIHRlbXBlcmF0dXJlID09PSBib2R5LnRlbXBlcmF0dXJlID8gYm9keSA6IHsgLi4uYm9keSwgdGVtcGVyYXR1cmUgfTtcbn1cblxuLyoqIFJlc29sdmUgcmVxdWVzdCwgaGVhZGVyLCBjb25maWd1cmVkLCBhbmQgcHJvdG9jb2wgbW9kZWwtc2VsZWN0aW9uIGlucHV0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnYXRld2F5TW9kZWxTZWxlY3Rpb24oXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgaGVhZGVyczogSGVhZGVycyxcbiAgZGVmYXVsdHM6IHsgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7IHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZSB9ID0ge30sXG4gIHByb3RvY29sPzogQ2xpZW50UHJvdG9jb2wsXG4pOiB7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbn0ge1xuICBjb25zdCBtb2RlbCA9IHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiICYmIGJvZHkubW9kZWwudHJpbSgpID8gYm9keS5tb2RlbC50cmltKCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnMuZ2V0KFwieC1kYngtdG9vbHMtbW9kZWwtY2xhc3NcIik/LnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkQ2xhc3MgPSBoZWFkZXIgPyBNb2RlbENsYXNzU2NoZW1hLnNhZmVQYXJzZShoZWFkZXIpIDogdW5kZWZpbmVkO1xuICBpZiAocGFyc2VkQ2xhc3MgJiYgIXBhcnNlZENsYXNzLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBgSW52YWxpZCBtb2RlbCBjbGFzczogJHtoZWFkZXJ9YCk7XG4gIH1cbiAgaWYgKG1vZGVsICYmIHBhcnNlZENsYXNzPy5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBhbmQgbW9kZWwgY2xhc3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKTtcbiAgfVxuICBpZiAobW9kZWwpIHJldHVybiBpc1NtYXJ0Um91dGVyTW9kZWxJZChtb2RlbCkgPyB7IHNtYXJ0Um91dGVyOiB0cnVlIH0gOiB7IG1vZGVsIH07XG4gIGlmIChwYXJzZWRDbGFzcz8uZGF0YSkgcmV0dXJuIHsgbW9kZWxDbGFzczogcGFyc2VkQ2xhc3MuZGF0YSB9O1xuICBpZiAoZGVmYXVsdHMubW9kZWwpIHtcbiAgICByZXR1cm4gaXNTbWFydFJvdXRlck1vZGVsSWQoZGVmYXVsdHMubW9kZWwpID8geyBzbWFydFJvdXRlcjogdHJ1ZSB9IDogeyBtb2RlbDogZGVmYXVsdHMubW9kZWwgfTtcbiAgfVxuICBpZiAoZGVmYXVsdHMubW9kZWxDbGFzcykgcmV0dXJuIHsgbW9kZWxDbGFzczogZGVmYXVsdHMubW9kZWxDbGFzcyB9O1xuICBpZiAocHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikgcmV0dXJuIHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfTtcbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBhcHBseVNtYXJ0Um91dGVyT2JzZXJ2YXRpb25IZWFkZXJzKFxuICBoZWFkZXJzOiBIZWFkZXJzLFxuICBvYnNlcnZhdGlvbjogU21hcnRSb3V0ZXJPYnNlcnZhdGlvbixcbik6IHZvaWQge1xuICBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfU0VMRUNURURfTU9ERUxfSEVBREVSLCBvYnNlcnZhdGlvbi5zZWxlY3RlZE1vZGVsKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1JPVVRFX01PREVMX0hFQURFUiwgb2JzZXJ2YXRpb24ucm91dGVNb2RlbCk7XG4gIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9IQVJORVNTX0hFQURFUiwgb2JzZXJ2YXRpb24uaGFybmVzcyk7XG4gIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9TT1VSQ0VfSEVBREVSLCBvYnNlcnZhdGlvbi5zb3VyY2UpO1xuICBjb25zdCB0YXNrVGllciA9IHN0cmluZ1BhcmFtKG9ic2VydmF0aW9uLnBhcmFtcywgXCJ0YXNrX3RpZXJcIik7XG4gIGNvbnN0IHNlcnZlZFRpZXIgPSBzdHJpbmdQYXJhbShvYnNlcnZhdGlvbi5wYXJhbXMsIFwic2VydmVkX3RpZXJcIik7XG4gIGNvbnN0IHByb2ZpbGVyU3RhdHVzID0gc3RyaW5nUGFyYW0ob2JzZXJ2YXRpb24ucGFyYW1zLCBcInByb2ZpbGVyX3N0YXR1c1wiKTtcbiAgaWYgKHRhc2tUaWVyKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfVEFTS19USUVSX0hFQURFUiwgdGFza1RpZXIpO1xuICBpZiAoc2VydmVkVGllcikgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1NFUlZFRF9USUVSX0hFQURFUiwgc2VydmVkVGllcik7XG4gIGlmIChwcm9maWxlclN0YXR1cykgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1BST0ZJTEVSX1NUQVRVU19IRUFERVIsIHByb2ZpbGVyU3RhdHVzKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nUGFyYW0oXG4gIHBhcmFtczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zPy5ba2V5XTtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBvbmx5U21hcnRSb3V0ZXIocGF5bG9hZDogTW9kZWxMaXN0UmVzcG9uc2UpOiBNb2RlbExpc3RSZXNwb25zZSB7XG4gIGlmIChcIm1vZGVsc1wiIGluIHBheWxvYWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiBwYXlsb2FkLm1vZGVscy5maWx0ZXIoKG1vZGVsKSA9PlxuICAgICAgICBtb2RlbC5zbHVnLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoYC8ke1NNQVJUX1JPVVRFUl9NT0RFTF9JRH1gKSxcbiAgICAgICksXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG9iamVjdDogXCJsaXN0XCIsXG4gICAgZGF0YTogcGF5bG9hZC5kYXRhLmZpbHRlcigobW9kZWwpID0+IG1vZGVsLmlkID09PSBTTUFSVF9ST1VURVJfTU9ERUxfSUQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBsb2dSZXNwb25zZSh1cHN0cmVhbVByb3RvY29sOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcsIHJlc3BvbnNlOiBSZXNwb25zZSk6IHZvaWQge1xuICBjb25zdCBkZXRhaWxzID0ge1xuICAgIGNvbnRlbnRUeXBlOiByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSxcbiAgICBtb2RlbCxcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB1cHN0cmVhbVByb3RvY29sLFxuICB9O1xuICBpZiAocmVzcG9uc2Uub2spIGxvZ2dlci5kZWJ1ZyhcInVwc3RyZWFtIHJlc3BvbnNlXCIsIGRldGFpbHMpO1xuICBlbHNlIGxvZ2dlci53YXJuKFwidXBzdHJlYW0gcmVxdWVzdCBmYWlsZWRcIiwgZGV0YWlscyk7XG59XG4iXX0=
|
package/lib/src/models.d.ts
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { CodexModelListResponse, ModelListResponse, ModelTarget, OpenAIModelListResponse } from "@dbx-tools/shared-model-gateway";
|
|
7
7
|
/** Build the combined OpenAI and optional Codex model catalogue. */
|
|
8
|
-
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: true, preserveOrder?: boolean, preferSystemModels?: boolean): CodexModelListResponse;
|
|
9
|
-
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: false, preserveOrder?: boolean, preferSystemModels?: boolean): OpenAIModelListResponse;
|
|
10
|
-
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: boolean, preserveOrder?: boolean, preferSystemModels?: boolean): ModelListResponse;
|
|
8
|
+
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: true, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): CodexModelListResponse;
|
|
9
|
+
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: false, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): OpenAIModelListResponse;
|
|
10
|
+
export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: boolean, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): ModelListResponse;
|
|
11
11
|
/** Codex `/v1/models` slug: the `system.ai.*` service when preferred, else the endpoint id. */
|
|
12
12
|
export declare function codexModelSlug(target: ModelTarget, preferSystemModels: boolean): string;
|