@dbx-tools/appkit-model-gateway 0.9.61 → 0.9.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.ts 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.61";
6
+ export const PACKAGE_VERSION = "0.9.65";
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";
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.61";
2
+ export declare const PACKAGE_VERSION = "0.9.65";
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";
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.61";
5
+ export const PACKAGE_VERSION = "0.9.65";
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";
@@ -18,4 +18,4 @@ export { ModelGatewayError, ModelGateway } from "./src/gateway.js";
18
18
  export { ModelGatewayPlugin, modelGateway } from "./src/plugin.js";
19
19
  export { DatabricksModelRegistry } from "./src/registry.js";
20
20
  export { UnsupportedGatewayFeatureError } from "./src/router.js";
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbW9kZWwtZ2F0ZXdheVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjYxXCI7XG5leHBvcnQgKiBhcyBnYXRld2F5IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHByb3RvY29sc0RlY29kZSBmcm9tIFwiLi9zcmMvcHJvdG9jb2xzL2RlY29kZS50c1wiO1xuZXhwb3J0ICogYXMgcHJvdG9jb2xzRW5jb2RlIGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdBZGFwdCBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5leHBvcnQgKiBhcyByZWdpc3RyeSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlciBmcm9tIFwiLi9zcmMvcm91dGVyLnRzXCI7XG5leHBvcnQgKiBhcyByb3V0ZXMgZnJvbSBcIi4vc3JjL3JvdXRlcy50c1wiO1xuZXhwb3J0ICogYXMgdHJhbnNsYXRpb24gZnJvbSBcIi4vc3JjL3RyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc3BvcnQgZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5RXJyb3IsIE1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2F0ZXdheS50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5UGx1Z2luLCBtb2RlbEdhdGV3YXkgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgRGVjb2RlZEdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3Byb3RvY29scy9kZWNvZGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29tcGxldGVkR2VuZXJhdGlvbiB9IGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFkYXB0ZWRJbmZlcmVuY2VCb2R5IH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zLCBNb2RlbFJlZ2lzdHJ5LCBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHsgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yIH0gZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzVHJhbnNwb3J0UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbiJdfQ==
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbW9kZWwtZ2F0ZXdheVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjY1XCI7XG5leHBvcnQgKiBhcyBnYXRld2F5IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHByb3RvY29sc0RlY29kZSBmcm9tIFwiLi9zcmMvcHJvdG9jb2xzL2RlY29kZS50c1wiO1xuZXhwb3J0ICogYXMgcHJvdG9jb2xzRW5jb2RlIGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdBZGFwdCBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5leHBvcnQgKiBhcyByZWdpc3RyeSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlciBmcm9tIFwiLi9zcmMvcm91dGVyLnRzXCI7XG5leHBvcnQgKiBhcyByb3V0ZXMgZnJvbSBcIi4vc3JjL3JvdXRlcy50c1wiO1xuZXhwb3J0ICogYXMgdHJhbnNsYXRpb24gZnJvbSBcIi4vc3JjL3RyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc3BvcnQgZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5RXJyb3IsIE1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2F0ZXdheS50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5UGx1Z2luLCBtb2RlbEdhdGV3YXkgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgRGVjb2RlZEdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3Byb3RvY29scy9kZWNvZGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29tcGxldGVkR2VuZXJhdGlvbiB9IGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFkYXB0ZWRJbmZlcmVuY2VCb2R5IH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zLCBNb2RlbFJlZ2lzdHJ5LCBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHsgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yIH0gZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzVHJhbnNwb3J0UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbiJdfQ==
@@ -3,12 +3,15 @@
3
3
  *
4
4
  * @module
5
5
  */
6
+ import { type ModelClass as ModelClassType } from "@dbx-tools/shared-model";
6
7
  import type { ClientProtocol, ModelCapabilityOverride, ModelListResponse } from "@dbx-tools/shared-model-gateway";
7
8
  import { type ModelRegistry } from "./registry.ts";
8
9
  /** Model gateway runtime configuration. */
9
10
  export interface ModelGatewayOptions {
10
11
  readonly cacheTtlMs?: number;
11
12
  readonly overrides?: readonly ModelCapabilityOverride[];
13
+ readonly model?: string;
14
+ readonly modelClass?: ModelClassType;
12
15
  }
13
16
  /** Error carrying an HTTP status and protocol-safe message. */
14
17
  export declare class ModelGatewayError extends Error {
@@ -18,6 +21,8 @@ export declare class ModelGatewayError extends Error {
18
21
  /** AppKit-scoped model gateway with dynamic model discovery and streaming inference. */
19
22
  export declare class ModelGateway {
20
23
  private readonly registry;
24
+ private readonly model?;
25
+ private readonly modelClass?;
21
26
  constructor(options?: ModelGatewayOptions, registry?: ModelRegistry);
22
27
  /** Return the live OpenAI model list, including Codex metadata when requested. */
23
28
  models(originator?: string, search?: string): Promise<ModelListResponse>;
@@ -29,3 +34,11 @@ export declare class ModelGateway {
29
34
  }
30
35
  /** Remove an explicit null temperature while preserving omitted and numeric values. */
31
36
  export declare function sanitizeInferenceBody(body: Readonly<Record<string, unknown>>): Readonly<Record<string, unknown>>;
37
+ /** Resolve request, header, configured, and protocol model-selection inputs. */
38
+ export declare function gatewayModelSelection(body: Readonly<Record<string, unknown>>, headers: Headers, defaults?: {
39
+ readonly model?: string;
40
+ readonly modelClass?: ModelClassType;
41
+ }, protocol?: ClientProtocol): {
42
+ readonly model?: string;
43
+ readonly modelClass?: ModelClassType;
44
+ };
@@ -4,7 +4,7 @@
4
4
  * @module
5
5
  */
6
6
  import { log } from "@dbx-tools/shared-core";
7
- import { ModelClass } from "@dbx-tools/shared-model";
7
+ import { ModelClass, ModelClassSchema, } from "@dbx-tools/shared-model";
8
8
  import { listModelsPayload } from "./models.js";
9
9
  import { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./reasoning-adapt.js";
10
10
  import { DatabricksModelRegistry, } from "./registry.js";
@@ -24,12 +24,16 @@ export class ModelGatewayError extends Error {
24
24
  /** AppKit-scoped model gateway with dynamic model discovery and streaming inference. */
25
25
  export class ModelGateway {
26
26
  registry;
27
+ model;
28
+ modelClass;
27
29
  constructor(options = {}, registry) {
28
30
  const registryOptions = {
29
31
  ...(options.cacheTtlMs !== undefined ? { ttlMs: options.cacheTtlMs } : {}),
30
32
  ...(options.overrides ? { overrides: options.overrides } : {}),
31
33
  };
32
34
  this.registry = registry ?? new DatabricksModelRegistry(registryOptions);
35
+ this.model = options.model;
36
+ this.modelClass = options.modelClass;
33
37
  }
34
38
  /** Return the live OpenAI model list, including Codex metadata when requested. */
35
39
  async models(originator, search) {
@@ -43,20 +47,29 @@ export class ModelGateway {
43
47
  /** Resolve and execute one inference request. */
44
48
  async inference(protocol, body, headers, signal) {
45
49
  const sanitizedBody = sanitizeInferenceBody(body);
46
- const requestedModel = requiredModel(sanitizedBody.model);
50
+ const selection = gatewayModelSelection(sanitizedBody, headers, {
51
+ model: this.model,
52
+ modelClass: this.modelClass,
53
+ }, protocol);
47
54
  logger.debug("resolving request", {
48
55
  clientProtocol: protocol,
49
- model: requestedModel,
56
+ model: selection.model,
57
+ modelClass: selection.modelClass,
50
58
  originator: headers.get("originator") ?? undefined,
51
59
  stream: sanitizedBody.stream === true,
52
60
  });
53
61
  const features = requestedFeatures(sanitizedBody);
54
- const target = await this.registry.resolve(requestedModel, {
62
+ const target = await this.registry.resolve(selection.model, {
55
63
  ...(protocol === "openai-embeddings" ? { modelClass: ModelClass.Embedding } : {}),
64
+ ...(selection.modelClass ? { modelClass: selection.modelClass } : {}),
56
65
  ...(features.tools ? { requiresTools: true } : {}),
57
66
  });
58
- if (!target)
59
- throw new ModelGatewayError(404, `Model not found: ${requestedModel}`);
67
+ if (!target) {
68
+ throw new ModelGatewayError(404, selection.model
69
+ ? `Model not found: ${selection.model}`
70
+ : "No model matches the requested class");
71
+ }
72
+ const requestedModel = selection.model ?? target.id;
60
73
  const route = resolveRoute({
61
74
  clientProtocol: protocol,
62
75
  requestedModel,
@@ -114,11 +127,28 @@ export function sanitizeInferenceBody(body) {
114
127
  delete sanitized.temperature;
115
128
  return sanitized;
116
129
  }
117
- function requiredModel(value) {
118
- if (typeof value !== "string" || !value.trim()) {
119
- throw new ModelGatewayError(400, "Request body must include a non-empty model");
130
+ /** Resolve request, header, configured, and protocol model-selection inputs. */
131
+ export function gatewayModelSelection(body, headers, defaults = {}, protocol) {
132
+ const model = typeof body.model === "string" && body.model.trim() ? body.model.trim() : undefined;
133
+ const header = headers.get("x-dbx-tools-model-class")?.trim();
134
+ const parsedClass = header ? ModelClassSchema.safeParse(header) : undefined;
135
+ if (parsedClass && !parsedClass.success) {
136
+ throw new ModelGatewayError(400, `Invalid model class: ${header}`);
137
+ }
138
+ if (model && parsedClass?.data) {
139
+ throw new ModelGatewayError(400, "Model and model class are mutually exclusive");
120
140
  }
121
- return value.trim();
141
+ if (model)
142
+ return { model };
143
+ if (parsedClass?.data)
144
+ return { modelClass: parsedClass.data };
145
+ if (defaults.model)
146
+ return { model: defaults.model };
147
+ if (defaults.modelClass)
148
+ return { modelClass: defaults.modelClass };
149
+ if (protocol === "openai-embeddings")
150
+ return { modelClass: ModelClass.Embedding };
151
+ return {};
122
152
  }
123
153
  function logResponse(upstreamProtocol, model, response) {
124
154
  const details = {
@@ -132,4 +162,4 @@ function logResponse(upstreamProtocol, model, response) {
132
162
  else
133
163
  logger.warn("upstream request failed", details);
134
164
  }
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBUXJELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RixPQUFPLEVBQ0wsdUJBQXVCLEdBR3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQVFsRCwrREFBK0Q7QUFDL0QsTUFBTSxPQUFPLGlCQUFrQixTQUFRLEtBQUs7SUFFL0I7SUFEWCxZQUNXLE1BQWMsRUFDdkIsT0FBZTtRQUVmLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUhOLFdBQU0sR0FBTixNQUFNLENBQVE7UUFJdkIsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUFFRCx3RkFBd0Y7QUFDeEYsTUFBTSxPQUFPLFlBQVk7SUFDTixRQUFRLENBQWdCO0lBRXpDLFlBQVksVUFBK0IsRUFBRSxFQUFFLFFBQXdCO1FBQ3JFLE1BQU0sZUFBZSxHQUF5QjtZQUM1QyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxT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LEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUMvQyxNQUFNLElBQUksaUJBQWlCLENBQUMsR0FBRyxFQUFFLDZDQUE2QyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxnQkFBd0IsRUFBRSxLQUFhLEVBQUUsUUFBa0I7SUFDOUUsTUFBTSxPQUFPLEdBQUc7UUFDZCxXQUFXLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1FBQ2pELEtBQUs7UUFDTCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDdkIsZ0JBQWdCO0tBQ2pCLENBQUM7SUFDRixJQUFJLFFBQVEsQ0FBQyxFQUFFO1FBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQzs7UUFDdkQsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcm90b2NvbC1pbmRlcGVuZGVudCBnYXRld2F5IHNlcnZpY2UgdXNlZCBieSBwbHVnaW4gYW5kIHN0YW5kYWxvbmUgcm91dGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgTW9kZWxDbGFzcyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuICBDbGllbnRQcm90b2NvbCxcbiAgR2F0ZXdheVJvdXRlLFxuICBNb2RlbENhcGFiaWxpdHlPdmVycmlkZSxcbiAgTW9kZWxMaXN0UmVzcG9uc2UsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmltcG9ydCB7IGxpc3RNb2RlbHNQYXlsb2FkIH0gZnJvbSBcIi4vbW9kZWxzLnRzXCI7XG5pbXBvcnQgeyBhZGFwdEluZmVyZW5jZVJlYXNvbmluZywgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5IH0gZnJvbSBcIi4vcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5pbXBvcnQge1xuICBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnlPcHRpb25zLFxufSBmcm9tIFwiLi9yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgaXNDb2RleE9yaWdpbmF0b3IsIHJlcXVlc3RlZEZlYXR1cmVzLCByZXNvbHZlUm91dGUgfSBmcm9tIFwiLi9yb3V0ZXIudHNcIjtcbmltcG9ydCB7IHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vdHJhbnNsYXRpb24udHNcIjtcbmltcG9ydCB7IGZldGNoRGF0YWJyaWNrcywgZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyB9IGZyb20gXCIuL3RyYW5zcG9ydC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0L21vZGVsLWdhdGV3YXlcIik7XG5cbi8qKiBNb2RlbCBnYXRld2F5IHJ1bnRpbWUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxHYXRld2F5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNhY2hlVHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG59XG5cbi8qKiBFcnJvciBjYXJyeWluZyBhbiBIVFRQIHN0YXR1cyBhbmQgcHJvdG9jb2wtc2FmZSBtZXNzYWdlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBzdGF0dXM6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiTW9kZWxHYXRld2F5RXJyb3JcIjtcbiAgfVxufVxuXG4vKiogQXBwS2l0LXNjb3BlZCBtb2RlbCBnYXRld2F5IHdpdGggZHluYW1pYyBtb2RlbCBkaXNjb3ZlcnkgYW5kIHN0cmVhbWluZyBpbmZlcmVuY2UuICovXG5leHBvcnQgY2xhc3MgTW9kZWxHYXRld2F5IHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeTogTW9kZWxSZWdpc3RyeTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb2RlbEdhdGV3YXlPcHRpb25zID0ge30sIHJlZ2lzdHJ5PzogTW9kZWxSZWdpc3RyeSkge1xuICAgIGNvbnN0IHJlZ2lzdHJ5T3B0aW9uczogTW9kZWxSZWdpc3RyeU9wdGlvbnMgPSB7XG4gICAgICAuLi4ob3B0aW9ucy5jYWNoZVR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bE1zOiBvcHRpb25zLmNhY2hlVHRsTXMgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLm92ZXJyaWRlcyA/IHsgb3ZlcnJpZGVzOiBvcHRpb25zLm92ZXJyaWRlcyB9IDoge30pLFxuICAgIH07XG4gICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5ID8/IG5ldyBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeShyZWdpc3RyeU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgbGl2ZSBPcGVuQUkgbW9kZWwgbGlzdCwgaW5jbHVkaW5nIENvZGV4IG1ldGFkYXRhIHdoZW4gcmVxdWVzdGVkLiAqL1xuICBhc3luYyBtb2RlbHMob3JpZ2luYXRvcj86IHN0cmluZywgc2VhcmNoPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbExpc3RSZXNwb25zZT4ge1xuICAgIGNvbnN0IGNvZGV4ID0gaXNDb2RleE9yaWdpbmF0b3Iob3JpZ2luYXRvcik7XG4gICAgbG9nZ2VyLmRlYnVnKFwibGlzdGluZyBtb2RlbHNcIiwgeyBjb2RleCwgc2VhcmNoIH0pO1xuICAgIGNvbnN0IHF1ZXJ5ID0gc2VhcmNoPy50cmltKCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IHF1ZXJ5ID8gYXdhaXQgdGhpcy5yZWdpc3RyeS5zZWFyY2gocXVlcnkpIDogYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibGlzdGVkIG1vZGVsc1wiLCB7IGNvZGV4LCBjb3VudDogdGFyZ2V0cy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIGxpc3RNb2RlbHNQYXlsb2FkKHRhcmdldHMsIGNvZGV4LCBxdWVyeSAhPT0gdW5kZWZpbmVkICYmIHF1ZXJ5Lmxlbmd0aCA+IDApO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgYW5kIGV4ZWN1dGUgb25lIGluZmVyZW5jZSByZXF1ZXN0LiAqL1xuICBhc3luYyBpbmZlcmVuY2UoXG4gICAgcHJvdG9jb2w6IENsaWVudFByb3RvY29sLFxuICAgIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICBoZWFkZXJzOiBIZWFkZXJzLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRCb2R5ID0gc2FuaXRpemVJbmZlcmVuY2VCb2R5KGJvZHkpO1xuICAgIGNvbnN0IHJlcXVlc3RlZE1vZGVsID0gcmVxdWlyZWRNb2RlbChzYW5pdGl6ZWRCb2R5Lm1vZGVsKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZpbmcgcmVxdWVzdFwiLCB7XG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBtb2RlbDogcmVxdWVzdGVkTW9kZWwsXG4gICAgICBvcmlnaW5hdG9yOiBoZWFkZXJzLmdldChcIm9yaWdpbmF0b3JcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiBzYW5pdGl6ZWRCb2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHJlcXVlc3RlZEZlYXR1cmVzKHNhbml0aXplZEJvZHkpO1xuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMucmVnaXN0cnkucmVzb2x2ZShyZXF1ZXN0ZWRNb2RlbCwge1xuICAgICAgLi4uKHByb3RvY29sID09PSBcIm9wZW5haS1lbWJlZGRpbmdzXCIgPyB7IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH0gOiB7fSksXG4gICAgICAuLi4oZmVhdHVyZXMudG9vbHMgPyB7IHJlcXVpcmVzVG9vbHM6IHRydWUgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBpZiAoIXRhcmdldCkgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwNCwgYE1vZGVsIG5vdCBmb3VuZDogJHtyZXF1ZXN0ZWRNb2RlbH1gKTtcbiAgICBjb25zdCByb3V0ZSA9IHJlc29sdmVSb3V0ZSh7XG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICByZXF1ZXN0ZWRNb2RlbCxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIHRhcmdldCxcbiAgICB9KTtcbiAgICBsb2dnZXIuZGVidWcoXCJyb3V0ZWRcIiwge1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wsXG4gICAgfSk7XG5cbiAgICBjb25zdCBhZGFwdGVkID0gYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcodGFyZ2V0LmlkLCBzYW5pdGl6ZWRCb2R5KTtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIGFkYXB0ZWQuYm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICBjb25zdCByZXRyeUJvZHkgPSBhd2FpdCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkoe1xuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIGJvZHk6IHNhbml0aXplZEJvZHksXG4gICAgICByZXNwb25zZSxcbiAgICAgIHByZXZpb3VzV2lyZUVmZm9ydDogYWRhcHRlZC53aXJlRWZmb3J0LFxuICAgIH0pO1xuICAgIGlmIChyZXRyeUJvZHkpIHtcbiAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuZm9yd2FyZChyb3V0ZSwgcmV0cnlCb2R5LCBoZWFkZXJzLCBzaWduYWwpO1xuICAgIH1cblxuICAgIGxvZ1Jlc3BvbnNlKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wsIHRhcmdldC5pZCwgcmVzcG9uc2UpO1xuICAgIGlmIChyb3V0ZS51cHN0cmVhbVByb3RvY29sID09PSBcImFpLXNka1wiKSB7XG4gICAgICByZXNwb25zZS5oZWFkZXJzLnNldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIsIHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgICBjb25zdCBmb3J3YXJkZWQgPSBnYXRld2F5UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuICAgIGZvcndhcmRlZC5zZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiLCByb3V0ZS51cHN0cmVhbVByb3RvY29sKTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgIGhlYWRlcnM6IGZvcndhcmRlZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWZyZXNoIHRoZSBhY3RpdmUgcHJpbmNpcGFsJ3MgbW9kZWwgY2F0YWxvZ3VlLiAqL1xuICByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlZnJlc2hpbmcgbW9kZWwgY2F0YWxvZ3VlXCIpO1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZm9yd2FyZChcbiAgICByb3V0ZTogR2F0ZXdheVJvdXRlLFxuICAgIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICBoZWFkZXJzOiBIZWFkZXJzLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJhaS1zZGtcIikge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0KHJvdXRlLCBib2R5LCBzaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gZmV0Y2hEYXRhYnJpY2tzKHsgcm91dGUsIGJvZHksIGhlYWRlcnMsIHNpZ25hbCB9KTtcbiAgfVxufVxuXG4vKiogUmVtb3ZlIGFuIGV4cGxpY2l0IG51bGwgdGVtcGVyYXR1cmUgd2hpbGUgcHJlc2VydmluZyBvbWl0dGVkIGFuZCBudW1lcmljIHZhbHVlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUluZmVyZW5jZUJvZHkoXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGlmIChib2R5LnRlbXBlcmF0dXJlICE9PSBudWxsKSByZXR1cm4gYm9keTtcbiAgY29uc3Qgc2FuaXRpemVkID0geyAuLi5ib2R5IH07XG4gIGRlbGV0ZSBzYW5pdGl6ZWQudGVtcGVyYXR1cmU7XG4gIHJldHVybiBzYW5pdGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVkTW9kZWwodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8ICF2YWx1ZS50cmltKCkpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBcIlJlcXVlc3QgYm9keSBtdXN0IGluY2x1ZGUgYSBub24tZW1wdHkgbW9kZWxcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gbG9nUmVzcG9uc2UodXBzdHJlYW1Qcm90b2NvbDogc3RyaW5nLCBtb2RlbDogc3RyaW5nLCByZXNwb25zZTogUmVzcG9uc2UpOiB2b2lkIHtcbiAgY29uc3QgZGV0YWlscyA9IHtcbiAgICBjb250ZW50VHlwZTogcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIiksXG4gICAgbW9kZWwsXG4gICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgdXBzdHJlYW1Qcm90b2NvbCxcbiAgfTtcbiAgaWYgKHJlc3BvbnNlLm9rKSBsb2dnZXIuZGVidWcoXCJ1cHN0cmVhbSByZXNwb25zZVwiLCBkZXRhaWxzKTtcbiAgZWxzZSBsb2dnZXIud2FybihcInVwc3RyZWFtIHJlcXVlc3QgZmFpbGVkXCIsIGRldGFpbHMpO1xufVxuIl19
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FFakIsTUFBTSx5QkFBeUIsQ0FBQztBQVFqQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUYsT0FBTyxFQUNMLHVCQUF1QixHQUd4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFVbEQsK0RBQStEO0FBQy9ELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxLQUFLO0lBRS9CO0lBRFgsWUFDVyxNQUFjLEVBQ3ZCLE9BQWU7UUFFZixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFITixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBSXZCLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sT0FBTyxZQUFZO0lBQ04sUUFBUSxDQUFnQjtJQUN4QixLQUFLLENBQVU7SUFDZixVQUFVLENBQWtCO0lBRTdDLFlBQVksVUFBK0IsRUFBRSxFQUFFLFFBQXdCO1FBQ3JFLE1BQU0sZUFB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QUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByb3RvY29sLWluZGVwZW5kZW50IGdhdGV3YXkgc2VydmljZSB1c2VkIGJ5IHBsdWdpbiBhbmQgc3RhbmRhbG9uZSByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBNb2RlbENsYXNzLFxuICBNb2RlbENsYXNzU2NoZW1hLFxuICB0eXBlIE1vZGVsQ2xhc3MgYXMgTW9kZWxDbGFzc1R5cGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuICBDbGllbnRQcm90b2NvbCxcbiAgR2F0ZXdheVJvdXRlLFxuICBNb2RlbENhcGFiaWxpdHlPdmVycmlkZSxcbiAgTW9kZWxMaXN0UmVzcG9uc2UsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmltcG9ydCB7IGxpc3RNb2RlbHNQYXlsb2FkIH0gZnJvbSBcIi4vbW9kZWxzLnRzXCI7XG5pbXBvcnQgeyBhZGFwdEluZmVyZW5jZVJlYXNvbmluZywgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5IH0gZnJvbSBcIi4vcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5pbXBvcnQge1xuICBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnlPcHRpb25zLFxufSBmcm9tIFwiLi9yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgaXNDb2RleE9yaWdpbmF0b3IsIHJlcXVlc3RlZEZlYXR1cmVzLCByZXNvbHZlUm91dGUgfSBmcm9tIFwiLi9yb3V0ZXIudHNcIjtcbmltcG9ydCB7IHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vdHJhbnNsYXRpb24udHNcIjtcbmltcG9ydCB7IGZldGNoRGF0YWJyaWNrcywgZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyB9IGZyb20gXCIuL3RyYW5zcG9ydC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0L21vZGVsLWdhdGV3YXlcIik7XG5cbi8qKiBNb2RlbCBnYXRld2F5IHJ1bnRpbWUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxHYXRld2F5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNhY2hlVHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG4gIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGU7XG59XG5cbi8qKiBFcnJvciBjYXJyeWluZyBhbiBIVFRQIHN0YXR1cyBhbmQgcHJvdG9jb2wtc2FmZSBtZXNzYWdlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBzdGF0dXM6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiTW9kZWxHYXRld2F5RXJyb3JcIjtcbiAgfVxufVxuXG4vKiogQXBwS2l0LXNjb3BlZCBtb2RlbCBnYXRld2F5IHdpdGggZHluYW1pYyBtb2RlbCBkaXNjb3ZlcnkgYW5kIHN0cmVhbWluZyBpbmZlcmVuY2UuICovXG5leHBvcnQgY2xhc3MgTW9kZWxHYXRld2F5IHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeTogTW9kZWxSZWdpc3RyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RlbD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGU7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyA9IHt9LCByZWdpc3RyeT86IE1vZGVsUmVnaXN0cnkpIHtcbiAgICBjb25zdCByZWdpc3RyeU9wdGlvbnM6IE1vZGVsUmVnaXN0cnlPcHRpb25zID0ge1xuICAgICAgLi4uKG9wdGlvbnMuY2FjaGVUdGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGxNczogb3B0aW9ucy5jYWNoZVR0bE1zIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5vdmVycmlkZXMgPyB7IG92ZXJyaWRlczogb3B0aW9ucy5vdmVycmlkZXMgfSA6IHt9KSxcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeSA/PyBuZXcgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkocmVnaXN0cnlPcHRpb25zKTtcbiAgICB0aGlzLm1vZGVsID0gb3B0aW9ucy5tb2RlbDtcbiAgICB0aGlzLm1vZGVsQ2xhc3MgPSBvcHRpb25zLm1vZGVsQ2xhc3M7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBsaXZlIE9wZW5BSSBtb2RlbCBsaXN0LCBpbmNsdWRpbmcgQ29kZXggbWV0YWRhdGEgd2hlbiByZXF1ZXN0ZWQuICovXG4gIGFzeW5jIG1vZGVscyhvcmlnaW5hdG9yPzogc3RyaW5nLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsTGlzdFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29kZXggPSBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0aW5nIG1vZGVsc1wiLCB7IGNvZGV4LCBzZWFyY2ggfSk7XG4gICAgY29uc3QgcXVlcnkgPSBzZWFyY2g/LnRyaW0oKTtcbiAgICBjb25zdCB0YXJnZXRzID0gcXVlcnkgPyBhd2FpdCB0aGlzLnJlZ2lzdHJ5LnNlYXJjaChxdWVyeSkgOiBhd2FpdCB0aGlzLnJlZ2lzdHJ5Lmxpc3QoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWQgbW9kZWxzXCIsIHsgY29kZXgsIGNvdW50OiB0YXJnZXRzLmxlbmd0aCB9KTtcbiAgICByZXR1cm4gbGlzdE1vZGVsc1BheWxvYWQodGFyZ2V0cywgY29kZXgsIHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgcXVlcnkubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBhbmQgZXhlY3V0ZSBvbmUgaW5mZXJlbmNlIHJlcXVlc3QuICovXG4gIGFzeW5jIGluZmVyZW5jZShcbiAgICBwcm90b2NvbDogQ2xpZW50UHJvdG9jb2wsXG4gICAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgIGhlYWRlcnM6IEhlYWRlcnMsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHNhbml0aXplZEJvZHkgPSBzYW5pdGl6ZUluZmVyZW5jZUJvZHkoYm9keSk7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ2F0ZXdheU1vZGVsU2VsZWN0aW9uKFxuICAgICAgc2FuaXRpemVkQm9keSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB7XG4gICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLm1vZGVsQ2xhc3MsXG4gICAgICB9LFxuICAgICAgcHJvdG9jb2wsXG4gICAgKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZpbmcgcmVxdWVzdFwiLCB7XG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBtb2RlbDogc2VsZWN0aW9uLm1vZGVsLFxuICAgICAgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MsXG4gICAgICBvcmlnaW5hdG9yOiBoZWFkZXJzLmdldChcIm9yaWdpbmF0b3JcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiBzYW5pdGl6ZWRCb2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHJlcXVlc3RlZEZlYXR1cmVzKHNhbml0aXplZEJvZHkpO1xuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMucmVnaXN0cnkucmVzb2x2ZShzZWxlY3Rpb24ubW9kZWwsIHtcbiAgICAgIC4uLihwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiID8geyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9IDoge30pLFxuICAgICAgLi4uKHNlbGVjdGlvbi5tb2RlbENsYXNzID8geyBtb2RlbENsYXNzOiBzZWxlY3Rpb24ubW9kZWxDbGFzcyB9IDoge30pLFxuICAgICAgLi4uKGZlYXR1cmVzLnRvb2xzID8geyByZXF1aXJlc1Rvb2xzOiB0cnVlIH0gOiB7fSksXG4gICAgfSk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcihcbiAgICAgICAgNDA0LFxuICAgICAgICBzZWxlY3Rpb24ubW9kZWxcbiAgICAgICAgICA/IGBNb2RlbCBub3QgZm91bmQ6ICR7c2VsZWN0aW9uLm1vZGVsfWBcbiAgICAgICAgICA6IFwiTm8gbW9kZWwgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIGNsYXNzXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ZWRNb2RlbCA9IHNlbGVjdGlvbi5tb2RlbCA/PyB0YXJnZXQuaWQ7XG4gICAgY29uc3Qgcm91dGUgPSByZXNvbHZlUm91dGUoe1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgcmVxdWVzdGVkTW9kZWwsXG4gICAgICBvcmlnaW5hdG9yOiBoZWFkZXJzLmdldChcIm9yaWdpbmF0b3JcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgZmVhdHVyZXMsXG4gICAgICB0YXJnZXQsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicm91dGVkXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICB1cHN0cmVhbVByb3RvY29sOiByb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYWRhcHRlZCA9IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nKHRhcmdldC5pZCwgc2FuaXRpemVkQm9keSk7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3J3YXJkKHJvdXRlLCBhZGFwdGVkLmJvZHksIGhlYWRlcnMsIHNpZ25hbCk7XG4gICAgY29uc3QgcmV0cnlCb2R5ID0gYXdhaXQgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5KHtcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICBib2R5OiBzYW5pdGl6ZWRCb2R5LFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBwcmV2aW91c1dpcmVFZmZvcnQ6IGFkYXB0ZWQud2lyZUVmZm9ydCxcbiAgICB9KTtcbiAgICBpZiAocmV0cnlCb2R5KSB7XG4gICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIHJldHJ5Qm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICB9XG5cbiAgICBsb2dSZXNwb25zZShyb3V0ZS51cHN0cmVhbVByb3RvY29sLCB0YXJnZXQuaWQsIHJlc3BvbnNlKTtcbiAgICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJhaS1zZGtcIikge1xuICAgICAgcmVzcG9uc2UuaGVhZGVycy5zZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiLCByb3V0ZS51cHN0cmVhbVByb3RvY29sKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gICAgY29uc3QgZm9yd2FyZGVkID0gZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKTtcbiAgICBmb3J3YXJkZWQuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBmb3J3YXJkZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVmcmVzaCB0aGUgYWN0aXZlIHByaW5jaXBhbCdzIG1vZGVsIGNhdGFsb2d1ZS4gKi9cbiAgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoaW5nIG1vZGVsIGNhdGFsb2d1ZVwiKTtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5yZWZyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZvcndhcmQoXG4gICAgcm91dGU6IEdhdGV3YXlSb3V0ZSxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdChyb3V0ZSwgYm9keSwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoRGF0YWJyaWNrcyh7IHJvdXRlLCBib2R5LCBoZWFkZXJzLCBzaWduYWwgfSk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBhbiBleHBsaWNpdCBudWxsIHRlbXBlcmF0dXJlIHdoaWxlIHByZXNlcnZpbmcgb21pdHRlZCBhbmQgbnVtZXJpYyB2YWx1ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVJbmZlcmVuY2VCb2R5KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoYm9keS50ZW1wZXJhdHVyZSAhPT0gbnVsbCkgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uYm9keSB9O1xuICBkZWxldGUgc2FuaXRpemVkLnRlbXBlcmF0dXJlO1xuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKiogUmVzb2x2ZSByZXF1ZXN0LCBoZWFkZXIsIGNvbmZpZ3VyZWQsIGFuZCBwcm90b2NvbCBtb2RlbC1zZWxlY3Rpb24gaW5wdXRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGV3YXlNb2RlbFNlbGVjdGlvbihcbiAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICBoZWFkZXJzOiBIZWFkZXJzLFxuICBkZWZhdWx0czogeyByZWFkb25seSBtb2RlbD86IHN0cmluZzsgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlIH0gPSB7fSxcbiAgcHJvdG9jb2w/OiBDbGllbnRQcm90b2NvbCxcbik6IHsgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7IHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZSB9IHtcbiAgY29uc3QgbW9kZWwgPSB0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiAmJiBib2R5Lm1vZGVsLnRyaW0oKSA/IGJvZHkubW9kZWwudHJpbSgpIDogdW5kZWZpbmVkO1xuICBjb25zdCBoZWFkZXIgPSBoZWFkZXJzLmdldChcIngtZGJ4LXRvb2xzLW1vZGVsLWNsYXNzXCIpPy50cmltKCk7XG4gIGNvbnN0IHBhcnNlZENsYXNzID0gaGVhZGVyID8gTW9kZWxDbGFzc1NjaGVtYS5zYWZlUGFyc2UoaGVhZGVyKSA6IHVuZGVmaW5lZDtcbiAgaWYgKHBhcnNlZENsYXNzICYmICFwYXJzZWRDbGFzcy5zdWNjZXNzKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgYEludmFsaWQgbW9kZWwgY2xhc3M6ICR7aGVhZGVyfWApO1xuICB9XG4gIGlmIChtb2RlbCAmJiBwYXJzZWRDbGFzcz8uZGF0YSkge1xuICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwiTW9kZWwgYW5kIG1vZGVsIGNsYXNzIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIik7XG4gIH1cbiAgaWYgKG1vZGVsKSByZXR1cm4geyBtb2RlbCB9O1xuICBpZiAocGFyc2VkQ2xhc3M/LmRhdGEpIHJldHVybiB7IG1vZGVsQ2xhc3M6IHBhcnNlZENsYXNzLmRhdGEgfTtcbiAgaWYgKGRlZmF1bHRzLm1vZGVsKSByZXR1cm4geyBtb2RlbDogZGVmYXVsdHMubW9kZWwgfTtcbiAgaWYgKGRlZmF1bHRzLm1vZGVsQ2xhc3MpIHJldHVybiB7IG1vZGVsQ2xhc3M6IGRlZmF1bHRzLm1vZGVsQ2xhc3MgfTtcbiAgaWYgKHByb3RvY29sID09PSBcIm9wZW5haS1lbWJlZGRpbmdzXCIpIHJldHVybiB7IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH07XG4gIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gbG9nUmVzcG9uc2UodXBzdHJlYW1Qcm90b2NvbDogc3RyaW5nLCBtb2RlbDogc3RyaW5nLCByZXNwb25zZTogUmVzcG9uc2UpOiB2b2lkIHtcbiAgY29uc3QgZGV0YWlscyA9IHtcbiAgICBjb250ZW50VHlwZTogcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIiksXG4gICAgbW9kZWwsXG4gICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgdXBzdHJlYW1Qcm90b2NvbCxcbiAgfTtcbiAgaWYgKHJlc3BvbnNlLm9rKSBsb2dnZXIuZGVidWcoXCJ1cHN0cmVhbSByZXNwb25zZVwiLCBkZXRhaWxzKTtcbiAgZWxzZSBsb2dnZXIud2FybihcInVwc3RyZWFtIHJlcXVlc3QgZmFpbGVkXCIsIGRldGFpbHMpO1xufVxuIl19
package/lib/src/plugin.js CHANGED
@@ -16,6 +16,8 @@ export class ModelGatewayPlugin extends Plugin {
16
16
  this.gateway = new ModelGateway({
17
17
  ...(config.cacheTtlMs !== undefined ? { cacheTtlMs: config.cacheTtlMs } : {}),
18
18
  ...(config.overrides ? { overrides: config.overrides } : {}),
19
+ ...(config.model ? { model: config.model } : {}),
20
+ ...(config.modelClass ? { modelClass: config.modelClass } : {}),
19
21
  });
20
22
  }
21
23
  injectRoutes(router) {
@@ -67,4 +69,4 @@ export class ModelGatewayPlugin extends Plugin {
67
69
  }
68
70
  /** AppKit plugin factory for the Databricks model gateway. */
69
71
  export const modelGateway = toPlugin(ModelGatewayPlugin);
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLGNBQWMsRUFDZCxNQUFNLEVBQ04sUUFBUSxHQUdULE1BQU0sb0JBQW9CLENBQUM7QUFJNUIsT0FBTyxFQUFFLFlBQVksRUFBNEIsTUFBTSxjQUFjLENBQUM7QUFDdEUsT0FBTyxRQUFRLE1BQU0saUJBQWlCLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBS3BFLCtFQUErRTtBQUMvRSxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsTUFBZ0M7SUFDdEUsTUFBTSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQWlCLFFBQVEsQ0FBQyxDQUFDO0lBRTFDLE9BQU8sQ0FBZTtJQUV2QyxZQUFZLFNBQW1DLEVBQUU7UUFDL0MsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQztZQUM5QixHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM3RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVEsWUFBWSxDQUFDLE1BQWtCO1FBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsTUFBTSxFQUFFLEtBQUs7WUFDYixJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDNUQsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxZQUFZO1lBQ2xCLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztTQUMvRCxDQUFDLENBQUM7UUFDSCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25DLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsYUFBYSxDQUFDO1lBQzFELENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQztZQUNsRCxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLENBQUM7WUFDbEQsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUM7U0FDN0MsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ2pCLElBQUk7Z0JBQ0osTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSTtnQkFDSixPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDO2FBQzVFLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBd0IsRUFBRSxRQUEwQjtRQUMvRCxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLEtBQUssQ0FBQyxTQUFTLENBQ2IsUUFBd0IsRUFDeEIsT0FBd0IsRUFDeEIsUUFBMEI7UUFFMUIsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVRLE9BQU87UUFDZCxPQUFPO1lBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQztJQUNKLENBQUM7O0FBR0gsOERBQThEO0FBQzlELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IG1vZGVsLWdhdGV3YXkgcGx1Z2luLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBkZWZpbmVNYW5pZmVzdCxcbiAgUGx1Z2luLFxuICB0b1BsdWdpbixcbiAgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLFxuICB0eXBlIElBcHBSb3V0ZXIsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgQ2xpZW50UHJvdG9jb2wgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBNb2RlbEdhdGV3YXksIHR5cGUgTW9kZWxHYXRld2F5T3B0aW9ucyB9IGZyb20gXCIuL2dhdGV3YXkudHNcIjtcbmltcG9ydCBtYW5pZmVzdCBmcm9tIFwiLi9tYW5pZmVzdC5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgeyBzZW5kSGVhbHRoLCBzZW5kSW5mZXJlbmNlLCBzZW5kTW9kZWxzIH0gZnJvbSBcIi4vcm91dGVzLnRzXCI7XG5cbi8qKiBBcHBLaXQgY29uZmlndXJhdGlvbiBmb3IgdGhlIG1vZGVsLWdhdGV3YXkgcGx1Z2luLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEdhdGV3YXlQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnLCBNb2RlbEdhdGV3YXlPcHRpb25zIHt9XG5cbi8qKiBBcHBLaXQgcGx1Z2luIGV4cG9zaW5nIGR5bmFtaWMgbW9kZWwgZGlzY292ZXJ5IGFuZCBjb21wYXRpYmlsaXR5IHJvdXRlcy4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXlQbHVnaW4gZXh0ZW5kcyBQbHVnaW48TW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IGRlZmluZU1hbmlmZXN0PFwibW9kZWxHYXRld2F5XCI+KG1hbmlmZXN0KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGdhdGV3YXk6IE1vZGVsR2F0ZXdheTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICB0aGlzLmdhdGV3YXkgPSBuZXcgTW9kZWxHYXRld2F5KHtcbiAgICAgIC4uLihjb25maWcuY2FjaGVUdGxNcyAhPT0gdW5kZWZpbmVkID8geyBjYWNoZVR0bE1zOiBjb25maWcuY2FjaGVUdGxNcyB9IDoge30pLFxuICAgICAgLi4uKGNvbmZpZy5vdmVycmlkZXMgPyB7IG92ZXJyaWRlczogY29uZmlnLm92ZXJyaWRlcyB9IDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5qZWN0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImhlYWx0aFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogXCIvaGVhbHRoelwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4gc2VuZEhlYWx0aChyZXNwb25zZSksXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwibW9kZWxzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBcIi92MS9tb2RlbHNcIixcbiAgICAgIGhhbmRsZXI6IChyZXF1ZXN0LCByZXNwb25zZSkgPT4gdGhpcy5tb2RlbHMocmVxdWVzdCwgcmVzcG9uc2UpLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHBhdGgsIHByb3RvY29sXSBvZiBbXG4gICAgICBbXCJjaGF0Q29tcGxldGlvbnNcIiwgXCIvdjEvY2hhdC9jb21wbGV0aW9uc1wiLCBcIm9wZW5haS1jaGF0XCJdLFxuICAgICAgW1wicmVzcG9uc2VzXCIsIFwiL3YxL3Jlc3BvbnNlc1wiLCBcIm9wZW5haS1yZXNwb25zZXNcIl0sXG4gICAgICBbXCJtZXNzYWdlc1wiLCBcIi92MS9tZXNzYWdlc1wiLCBcImFudGhyb3BpYy1tZXNzYWdlc1wiXSxcbiAgICAgIFtcImVtYmVkZGluZ3NcIiwgXCIvdjEvZW1iZWRkaW5nc1wiLCBcIm9wZW5haS1lbWJlZGRpbmdzXCJdLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGhhbmRsZXI6IChyZXF1ZXN0LCByZXNwb25zZSkgPT4gdGhpcy5pbmZlcmVuY2UocHJvdG9jb2wsIHJlcXVlc3QsIHJlc3BvbnNlKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZW5kIHRoZSBhY3RpdmUgcHJpbmNpcGFsJ3MgbW9kZWwgY2F0YWxvZ3VlLiAqL1xuICBhc3luYyBtb2RlbHMocmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0LCByZXNwb25zZTogZXhwcmVzcy5SZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHNlbmRNb2RlbHModGhpcy5nYXRld2F5LCByZXF1ZXN0LCByZXNwb25zZSk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBvbmUgY29tcGF0aWJpbGl0eSByZXF1ZXN0IGluIHRoZSBhY3RpdmUgQXBwS2l0IGlkZW50aXR5IHNjb3BlLiAqL1xuICBhc3luYyBpbmZlcmVuY2UoXG4gICAgcHJvdG9jb2w6IENsaWVudFByb3RvY29sLFxuICAgIHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXNwb25zZTogZXhwcmVzcy5SZXNwb25zZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc2VuZEluZmVyZW5jZSh0aGlzLmdhdGV3YXksIHByb3RvY29sLCByZXF1ZXN0LCByZXNwb25zZSk7XG4gIH1cblxuICAvKiogUmVmcmVzaCB0aGUgYWN0aXZlIHByaW5jaXBhbCdzIG1vZGVsIGNhdGFsb2d1ZS4gKi9cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdhdGV3YXkucmVmcmVzaCgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZXhwb3J0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiB0aGlzLm1vZGVscyxcbiAgICAgIGluZmVyZW5jZTogdGhpcy5pbmZlcmVuY2UsXG4gICAgICByZWZyZXNoOiB0aGlzLnJlZnJlc2gsXG4gICAgfTtcbiAgfVxufVxuXG4vKiogQXBwS2l0IHBsdWdpbiBmYWN0b3J5IGZvciB0aGUgRGF0YWJyaWNrcyBtb2RlbCBnYXRld2F5LiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsR2F0ZXdheSA9IHRvUGx1Z2luKE1vZGVsR2F0ZXdheVBsdWdpbik7XG4iXX0=
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLGNBQWMsRUFDZCxNQUFNLEVBQ04sUUFBUSxHQUdULE1BQU0sb0JBQW9CLENBQUM7QUFJNUIsT0FBTyxFQUFFLFlBQVksRUFBNEIsTUFBTSxjQUFjLENBQUM7QUFDdEUsT0FBTyxRQUFRLE1BQU0saUJBQWlCLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBS3BFLCtFQUErRTtBQUMvRSxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsTUFBZ0M7SUFDdEUsTUFBTSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQWlCLFFBQVEsQ0FBQyxDQUFDO0lBRTFDLE9BQU8sQ0FBZTtJQUV2QyxZQUFZLFNBQW1DLEVBQUU7UUFDL0MsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQztZQUM5QixHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2hFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUSxZQUFZLENBQUMsTUFBa0I7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxVQUFVO1lBQ2hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUM1RCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE1BQU0sRUFBRSxLQUFLO1lBQ2IsSUFBSSxFQUFFLFlBQVk7WUFDbEIsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1NBQy9ELENBQUMsQ0FBQztRQUNILEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkMsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxhQUFhLENBQUM7WUFDMUQsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixDQUFDO1lBQ2xELENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsQ0FBQztZQUNsRCxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsQ0FBQztTQUM3QyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDakIsSUFBSTtnQkFDSixNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJO2dCQUNKLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUM7YUFDNUUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUF3QixFQUFFLFFBQTBCO1FBQy9ELE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsS0FBSyxDQUFDLFNBQVMsQ0FDYixRQUF3QixFQUN4QixPQUF3QixFQUN4QixRQUEwQjtRQUUxQixNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRVEsT0FBTztRQUNkLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDO0lBQ0osQ0FBQzs7QUFHSCw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgbW9kZWwtZ2F0ZXdheSBwbHVnaW4uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGRlZmluZU1hbmlmZXN0LFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICB0eXBlIEJhc2VQbHVnaW5Db25maWcsXG4gIHR5cGUgSUFwcFJvdXRlcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBDbGllbnRQcm90b2NvbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQgdHlwZSBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5cbmltcG9ydCB7IE1vZGVsR2F0ZXdheSwgdHlwZSBNb2RlbEdhdGV3YXlPcHRpb25zIH0gZnJvbSBcIi4vZ2F0ZXdheS50c1wiO1xuaW1wb3J0IG1hbmlmZXN0IGZyb20gXCIuL21hbmlmZXN0Lmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7IHNlbmRIZWFsdGgsIHNlbmRJbmZlcmVuY2UsIHNlbmRNb2RlbHMgfSBmcm9tIFwiLi9yb3V0ZXMudHNcIjtcblxuLyoqIEFwcEtpdCBjb25maWd1cmF0aW9uIGZvciB0aGUgbW9kZWwtZ2F0ZXdheSBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcsIE1vZGVsR2F0ZXdheU9wdGlvbnMge31cblxuLyoqIEFwcEtpdCBwbHVnaW4gZXhwb3NpbmcgZHluYW1pYyBtb2RlbCBkaXNjb3ZlcnkgYW5kIGNvbXBhdGliaWxpdHkgcm91dGVzLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheVBsdWdpbiBleHRlbmRzIFBsdWdpbjxNb2RlbEdhdGV3YXlQbHVnaW5Db25maWc+IHtcbiAgc3RhdGljIG1hbmlmZXN0ID0gZGVmaW5lTWFuaWZlc3Q8XCJtb2RlbEdhdGV3YXlcIj4obWFuaWZlc3QpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2F0ZXdheTogTW9kZWxHYXRld2F5O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogTW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuICAgIHRoaXMuZ2F0ZXdheSA9IG5ldyBNb2RlbEdhdGV3YXkoe1xuICAgICAgLi4uKGNvbmZpZy5jYWNoZVR0bE1zICE9PSB1bmRlZmluZWQgPyB7IGNhY2hlVHRsTXM6IGNvbmZpZy5jYWNoZVR0bE1zIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLm92ZXJyaWRlcyA/IHsgb3ZlcnJpZGVzOiBjb25maWcub3ZlcnJpZGVzIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLm1vZGVsID8geyBtb2RlbDogY29uZmlnLm1vZGVsIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLm1vZGVsQ2xhc3MgPyB7IG1vZGVsQ2xhc3M6IGNvbmZpZy5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBpbmplY3RSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiaGVhbHRoXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBcIi9oZWFsdGh6XCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoX3JlcXVlc3QsIHJlc3BvbnNlKSA9PiBzZW5kSGVhbHRoKHJlc3BvbnNlKSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJtb2RlbHNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IFwiL3YxL21vZGVsc1wiLFxuICAgICAgaGFuZGxlcjogKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB0aGlzLm1vZGVscyhyZXF1ZXN0LCByZXNwb25zZSksXG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgcGF0aCwgcHJvdG9jb2xdIG9mIFtcbiAgICAgIFtcImNoYXRDb21wbGV0aW9uc1wiLCBcIi92MS9jaGF0L2NvbXBsZXRpb25zXCIsIFwib3BlbmFpLWNoYXRcIl0sXG4gICAgICBbXCJyZXNwb25zZXNcIiwgXCIvdjEvcmVzcG9uc2VzXCIsIFwib3BlbmFpLXJlc3BvbnNlc1wiXSxcbiAgICAgIFtcIm1lc3NhZ2VzXCIsIFwiL3YxL21lc3NhZ2VzXCIsIFwiYW50aHJvcGljLW1lc3NhZ2VzXCJdLFxuICAgICAgW1wiZW1iZWRkaW5nc1wiLCBcIi92MS9lbWJlZGRpbmdzXCIsIFwib3BlbmFpLWVtYmVkZGluZ3NcIl0sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgaGFuZGxlcjogKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB0aGlzLmluZmVyZW5jZShwcm90b2NvbCwgcmVxdWVzdCwgcmVzcG9uc2UpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlbmQgdGhlIGFjdGl2ZSBwcmluY2lwYWwncyBtb2RlbCBjYXRhbG9ndWUuICovXG4gIGFzeW5jIG1vZGVscyhyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QsIHJlc3BvbnNlOiBleHByZXNzLlJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc2VuZE1vZGVscyh0aGlzLmdhdGV3YXksIHJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIG9uZSBjb21wYXRpYmlsaXR5IHJlcXVlc3QgaW4gdGhlIGFjdGl2ZSBBcHBLaXQgaWRlbnRpdHkgc2NvcGUuICovXG4gIGFzeW5jIGluZmVyZW5jZShcbiAgICBwcm90b2NvbDogQ2xpZW50UHJvdG9jb2wsXG4gICAgcmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlc3BvbnNlOiBleHByZXNzLlJlc3BvbnNlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzZW5kSW5mZXJlbmNlKHRoaXMuZ2F0ZXdheSwgcHJvdG9jb2wsIHJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKiBSZWZyZXNoIHRoZSBhY3RpdmUgcHJpbmNpcGFsJ3MgbW9kZWwgY2F0YWxvZ3VlLiAqL1xuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZ2F0ZXdheS5yZWZyZXNoKCk7XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbHM6IHRoaXMubW9kZWxzLFxuICAgICAgaW5mZXJlbmNlOiB0aGlzLmluZmVyZW5jZSxcbiAgICAgIHJlZnJlc2g6IHRoaXMucmVmcmVzaCxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBBcHBLaXQgcGx1Z2luIGZhY3RvcnkgZm9yIHRoZSBEYXRhYnJpY2tzIG1vZGVsIGdhdGV3YXkuICovXG5leHBvcnQgY29uc3QgbW9kZWxHYXRld2F5ID0gdG9QbHVnaW4oTW9kZWxHYXRld2F5UGx1Z2luKTtcbiJdfQ==
@@ -12,7 +12,7 @@ export type ModelRegistryResolveOptions = Pick<ResolveModelInput, "modelClass" |
12
12
  export interface ModelRegistry {
13
13
  list(): Promise<ModelTarget[]>;
14
14
  search(query: string): Promise<ModelTarget[]>;
15
- resolve(model: string, options?: ModelRegistryResolveOptions): Promise<ModelTarget | undefined>;
15
+ resolve(model?: string, options?: ModelRegistryResolveOptions): Promise<ModelTarget | undefined>;
16
16
  refresh(): Promise<void>;
17
17
  }
18
18
  /** Configuration for {@link DatabricksModelRegistry}. */
@@ -29,7 +29,7 @@ export declare class DatabricksModelRegistry implements ModelRegistry {
29
29
  private readonly client;
30
30
  constructor(options?: ModelRegistryOptions);
31
31
  list(): Promise<ModelTarget[]>;
32
- resolve(model: string, options?: ModelRegistryResolveOptions): Promise<ModelTarget | undefined>;
32
+ resolve(model: string | undefined, options?: ModelRegistryResolveOptions): Promise<ModelTarget | undefined>;
33
33
  search(query: string): Promise<ModelTarget[]>;
34
34
  refresh(): Promise<void>;
35
35
  private target;
@@ -32,9 +32,11 @@ export class DatabricksModelRegistry {
32
32
  return targets;
33
33
  }
34
34
  async resolve(model, options = {}) {
35
- const requested = unqualifiedModel(model);
35
+ const requested = model === undefined ? undefined : unqualifiedModel(model);
36
36
  const targets = await this.list();
37
- const exact = targets.find((target) => target.aliases.some((alias) => alias.localeCompare(requested, undefined, { sensitivity: "accent" }) === 0));
37
+ const exact = requested === undefined
38
+ ? undefined
39
+ : targets.find((target) => target.aliases.some((alias) => alias.localeCompare(requested, undefined, { sensitivity: "accent" }) === 0));
38
40
  if (exact && matchesResolveOptions(exact, options)) {
39
41
  logger.debug("resolved exact model", { requested, resolved: exact.id });
40
42
  return exact;
@@ -43,7 +45,7 @@ export class DatabricksModelRegistry {
43
45
  .map((target) => target.endpoint)
44
46
  .filter((endpoint) => endpoint !== undefined);
45
47
  const resolved = modelResolve.resolveModel(endpoints, {
46
- explicit: requested,
48
+ ...(requested !== undefined ? { explicit: requested } : {}),
47
49
  ...options,
48
50
  });
49
51
  const target = targets.find((candidate) => candidate.id === resolved.modelId);
@@ -175,4 +177,4 @@ function matchesResolveOptions(target, options) {
175
177
  return target.capabilities.chat;
176
178
  return true;
177
179
  }
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixNQUFNLEVBQ04sT0FBTyxJQUFJLFlBQVksR0FFeEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsR0FHWCxNQUFNLG1DQUFtQyxDQUFDO0FBTzNDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQTJCM0Qsb0VBQW9FO0FBQ3BFLE1BQU0sT0FBTyx1QkFBdUI7SUFDakIsS0FBSyxDQUFTO0lBQ2QsU0FBUyxDQUFxQztJQUM5QyxNQUFNLENBQThCO0lBRXJELFlBQVksVUFBZ0MsRUFBRTtRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RSxN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QkFBdUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxPQUFPLGFBQWEsVUFBVSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsTUFBbUIsRUFBRSxPQUFvQztJQUN0RixJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO0lBQ3ZGLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUN0RSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlcXVlc3Qtc2NvcGVkIERhdGFicmlja3MgbW9kZWwgZGlzY292ZXJ5IGZvciB0aGUgQXBwS2l0IGdhdGV3YXkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQsIHR5cGUgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgbWV0YWRhdGEsXG4gIG1vZGVsQ2F0YWxvZyxcbiAgcG9saWN5LFxuICByZXNvbHZlIGFzIG1vZGVsUmVzb2x2ZSxcbiAgdHlwZSBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTW9kZWxDbGFzcyxcbiAgdHlwZSBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzLFxuICBNb2RlbENhcGFiaWxpdHlPdmVycmlkZSxcbiAgTW9kZWxUYXJnZXQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmNvbnN0IERFRkFVTFRfQ0FDSEVfVFRMX01TID0gNjBfMDAwO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC9tb2RlbC1nYXRld2F5L3JlZ2lzdHJ5XCIpO1xuXG4vKiogUmVzb2x1dGlvbiBjb250cm9scyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbW9kZWwgcG9saWN5IG93bmVyLiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zID0gUGljazxSZXNvbHZlTW9kZWxJbnB1dCwgXCJtb2RlbENsYXNzXCIgfCBcInJlcXVpcmVzVG9vbHNcIj47XG5cbi8qKiBEeW5hbWljIG1vZGVsIGNhdGFsb2d1ZSB1c2VkIGJ5IHJlcXVlc3Qgcm91dGluZyBhbmQgbW9kZWwtbGlzdCByZXNwb25zZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnkge1xuICBsaXN0KCk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT47XG4gIHNlYXJjaChxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPjtcbiAgcmVzb2x2ZShtb2RlbDogc3RyaW5nLCBvcHRpb25zPzogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zKTogUHJvbWlzZTxNb2RlbFRhcmdldCB8IHVuZGVmaW5lZD47XG4gIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIHtAbGluayBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeX0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnlPcHRpb25zIHtcbiAgcmVhZG9ubHkgdHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG4gIC8qKiBEaXNjb3ZlciBtb2RlbHMgd2l0aCB0aGlzIGNsaWVudCBpbnN0ZWFkIG9mIHRoZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG4gIHJlYWRvbmx5IGNsaWVudD86IFdvcmtzcGFjZUNsaWVudDtcbn1cblxuaW50ZXJmYWNlIFJlZ2lzdHJ5Q29udGV4dCB7XG4gIHJlYWRvbmx5IGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlkZW50aXR5Pzogc3RyaW5nO1xufVxuXG4vKiogTW9kZWwgcmVnaXN0cnkgYmFja2VkIGJ5IHRoZSBhY3RpdmUgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xuZXhwb3J0IGNsYXNzIERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5IGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHRsTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBvdmVycmlkZXM6IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9kZWxSZWdpc3RyeU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMudHRsTXMgPSBwb3NpdGl2ZVR0bChvcHRpb25zLnR0bE1zKTtcbiAgICB0aGlzLm92ZXJyaWRlcyA9IG9wdGlvbnMub3ZlcnJpZGVzID8/IFtdO1xuICAgIHRoaXMuY2xpZW50ID0gb3B0aW9ucy5jbGllbnQ7XG4gIH1cblxuICBhc3luYyBsaXN0KCk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmNvbnRleHQoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsb2FkaW5nIGNhdGFsb2d1ZVwiLCB7IGhvc3Q6IGNvbnRleHQuaG9zdCwgdHRsTXM6IHRoaXMudHRsTXMgfSk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbW9kZWxDYXRhbG9nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKFxuICAgICAgY29udGV4dC5jbGllbnQsXG4gICAgICBjb250ZXh0Lmhvc3QsXG4gICAgICBjYXRhbG9ndWVPcHRpb25zKGNvbnRleHQsIHRoaXMudHRsTXMpLFxuICAgICk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGVuZHBvaW50cy5tYXAoKGVuZHBvaW50KSA9PiB0aGlzLnRhcmdldChlbmRwb2ludCkpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxvYWRlZCBjYXRhbG9ndWVcIiwge1xuICAgICAgZW5kcG9pbnRDb3VudDogZW5kcG9pbnRzLmxlbmd0aCxcbiAgICAgIGhvc3Q6IGNvbnRleHQuaG9zdCxcbiAgICAgIHRhcmdldENvdW50OiB0YXJnZXRzLmxlbmd0aCxcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0cztcbiAgfVxuXG4gIGFzeW5jIHJlc29sdmUoXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxNb2RlbFRhcmdldCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IHVucXVhbGlmaWVkTW9kZWwobW9kZWwpO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBleGFjdCA9IHRhcmdldHMuZmluZCgodGFyZ2V0KSA9PlxuICAgICAgdGFyZ2V0LmFsaWFzZXMuc29tZShcbiAgICAgICAgKGFsaWFzKSA9PiBhbGlhcy5sb2NhbGVDb21wYXJlKHJlcXVlc3RlZCwgdW5kZWZpbmVkLCB7IHNlbnNpdGl2aXR5OiBcImFjY2VudFwiIH0pID09PSAwLFxuICAgICAgKSxcbiAgICApO1xuICAgIGlmIChleGFjdCAmJiBtYXRjaGVzUmVzb2x2ZU9wdGlvbnMoZXhhY3QsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBleGFjdCBtb2RlbFwiLCB7IHJlcXVlc3RlZCwgcmVzb2x2ZWQ6IGV4YWN0LmlkIH0pO1xuICAgICAgcmV0dXJuIGV4YWN0O1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50cyA9IHRhcmdldHNcbiAgICAgIC5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LmVuZHBvaW50KVxuICAgICAgLmZpbHRlcigoZW5kcG9pbnQpOiBlbmRwb2ludCBpcyBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0+IGVuZHBvaW50ICE9PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHJlc29sdmVkID0gbW9kZWxSZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHtcbiAgICAgIGV4cGxpY2l0OiByZXF1ZXN0ZWQsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHJlc29sdmVkLm1vZGVsSWQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmVkIGZ1enp5IG1vZGVsXCIsIHtcbiAgICAgIHJlcXVlc3RlZCxcbiAgICAgIHJlc29sdmVkOiB0YXJnZXQ/LmlkLFxuICAgICAgc291cmNlOiByZXNvbHZlZC5zb3VyY2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIGFzeW5jIHNlYXJjaChxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPiB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGJ5SWQgPSBuZXcgTWFwKHRhcmdldHMubWFwKCh0YXJnZXQpID0+IFt0YXJnZXQuaWQsIHRhcmdldF0pKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSB0YXJnZXRzXG4gICAgICAubWFwKCh0YXJnZXQpID0+IHRhcmdldC5lbmRwb2ludClcbiAgICAgIC5maWx0ZXIoKGVuZHBvaW50KTogZW5kcG9pbnQgaXMgU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9PiBlbmRwb2ludCAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByYW5rZWQgPSBbXG4gICAgICAuLi5tb2RlbFJlc29sdmUubG9va3VwTW9kZWxzKGVuZHBvaW50cywgeyBzZWFyY2g6IHF1ZXJ5IH0pLFxuICAgICAgLi4ubW9kZWxSZXNvbHZlLmxvb2t1cE1vZGVscyhlbmRwb2ludHMsIHtcbiAgICAgICAgc2VhcmNoOiBxdWVyeSxcbiAgICAgICAgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcsXG4gICAgICB9KSxcbiAgICBdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiAobGVmdC5zY29yZSA/PyAwKSAtIChyaWdodC5zY29yZSA/PyAwKSk7XG4gICAgcmV0dXJuIHJhbmtlZFxuICAgICAgLm1hcCgoeyBlbmRwb2ludCB9KSA9PiBieUlkLmdldChlbmRwb2ludC5uYW1lKSlcbiAgICAgIC5maWx0ZXIoKHRhcmdldCk6IHRhcmdldCBpcyBNb2RlbFRhcmdldCA9PiB0YXJnZXQgIT09IHVuZGVmaW5lZClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh0YXJnZXQsIGluZGV4LCBhbGwpID0+IGFsbC5maW5kSW5kZXgoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSB0YXJnZXQuaWQpID09PSBpbmRleCxcbiAgICAgICk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmNvbnRleHQoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJjbGVhcmluZyBjYXRhbG9ndWVcIiwgeyBob3N0OiBjb250ZXh0Lmhvc3QgfSk7XG4gICAgaWYgKGNvbnRleHQuaWRlbnRpdHkpIHtcbiAgICAgIGF3YWl0IG1vZGVsQ2F0YWxvZy5jbGVhclNlcnZpbmdFbmRwb2ludHNDYWNoZShjb250ZXh0Lmhvc3QsIGNvbnRleHQuaWRlbnRpdHkpO1xuICAgIH1cbiAgICBhd2FpdCBtb2RlbENhdGFsb2cubGlzdFNlcnZpbmdFbmRwb2ludHMoXG4gICAgICBjb250ZXh0LmNsaWVudCxcbiAgICAgIGNvbnRleHQuaG9zdCxcbiAgICAgIGNhdGFsb2d1ZU9wdGlvbnMoY29udGV4dCwgdGhpcy50dGxNcyksXG4gICAgKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoZWQgY2F0YWxvZ3VlXCIsIHsgaG9zdDogY29udGV4dC5ob3N0IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0YXJnZXQoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbFRhcmdldCB7XG4gICAgY29uc3QgcHVibGlzaGVkID0gbWV0YWRhdGEubW9kZWxDYXBhYmlsaXRpZXNGb3IoZW5kcG9pbnQpO1xuICAgIGNvbnN0IGZhbWlseSA9IGVuZHBvaW50LmZhbWlseT8udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBvcGVuQWlGYW1pbHkgPSBmYW1pbHkgPT09IFwiZ3B0XCIgfHwgZmFtaWx5ID09PSBcIm9wZW5haVwiIHx8IGVuZHBvaW50Lm5hbWUuaW5jbHVkZXMoXCJjb2RleFwiKTtcbiAgICBjb25zdCBtb2RlbFNlcnZpY2VOYW1lID0gbm9ybWFsaXplZE1vZGVsU2VydmljZU5hbWUoZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSk7XG4gICAgY29uc3QgZW1iZWRkaW5ncyA9XG4gICAgICBlbmRwb2ludC5jbGFzcyA9PT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcgfHwgZW5kcG9pbnQudGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiO1xuICAgIGNvbnN0IGNhcGFiaWxpdGllczogTW9kZWxDYXBhYmlsaXRpZXMgPSB7XG4gICAgICByZXNwb25zZXM6ICFlbWJlZGRpbmdzICYmIChvcGVuQWlGYW1pbHkgfHwgcHVibGlzaGVkLnJlc3BvbnNlcyksXG4gICAgICBvcGVuUmVzcG9uc2VzOiAhZW1iZWRkaW5ncyAmJiAhb3BlbkFpRmFtaWx5LFxuICAgICAgY2hhdDogIWVtYmVkZGluZ3MsXG4gICAgICBhbnRocm9waWM6IGZhbWlseSA9PT0gXCJjbGF1ZGVcIixcbiAgICAgIGVtYmVkZGluZ3MsXG4gICAgICBhaUdhdGV3YXlDb2RleDpcbiAgICAgICAgIWVtYmVkZGluZ3MgJiYgQm9vbGVhbihtb2RlbFNlcnZpY2VOYW1lKSAmJiBmYW1pbHkgIT09IFwiY2xhdWRlXCIgJiYgZmFtaWx5ICE9PSBcImdlbWluaVwiLFxuICAgICAgdG9vbHM6IGVuZHBvaW50LnN1cHBvcnRzVG9vbHMgPT09IHRydWUsXG4gICAgICByZWFzb25pbmc6IHBvbGljeS5tb2RlbFJlYXNvbmluZ0VmZm9ydHMoZW5kcG9pbnQubmFtZSkubGVuZ3RoID4gMCxcbiAgICAgIHN0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsVG9vbHM6IGVuZHBvaW50LnN1cHBvcnRzVG9vbHMgPT09IHRydWUsXG4gICAgICBjdXN0b21Ub29sczogcHVibGlzaGVkLmFwcGx5UGF0Y2ggfHwgZW5kcG9pbnQubmFtZS5pbmNsdWRlcyhcImNvZGV4XCIpLFxuICAgICAgc3RydWN0dXJlZE91dHB1dDogdHJ1ZSxcbiAgICAgIHdlYlNlYXJjaDogcHVibGlzaGVkLndlYlNlYXJjaCxcbiAgICB9O1xuICAgIGNvbnN0IGFsaWFzZXMgPSBuZXcgU2V0KFxuICAgICAgW1xuICAgICAgICBlbmRwb2ludC5uYW1lLFxuICAgICAgICBlbmRwb2ludC5kaXNwbGF5TmFtZSxcbiAgICAgICAgZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAgICAgbW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhlbmRwb2ludC5zZXJ2aWNlTmFtZXMgPz8ge30pLFxuICAgICAgXS5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odmFsdWU/LnRyaW0oKSkpLFxuICAgICk7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLm92ZXJyaWRlcy5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgY2FuZGlkYXRlLm1vZGVsID09PSBlbmRwb2ludC5uYW1lIHx8XG4gICAgICAgIFsuLi5hbGlhc2VzXS5zb21lKChhbGlhcykgPT4gYWxpYXMgPT09IGNhbmRpZGF0ZS5tb2RlbCksXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGVuZHBvaW50Lm5hbWUsXG4gICAgICBhbGlhc2VzOiBbLi4uYWxpYXNlc10sXG4gICAgICBkaXNwbGF5TmFtZTogZW5kcG9pbnQuZGlzcGxheU5hbWUgPz8gZW5kcG9pbnQubmFtZSxcbiAgICAgIC4uLihlbmRwb2ludC5mYW1pbHkgPyB7IGZhbWlseTogZW5kcG9pbnQuZmFtaWx5IH0gOiB7fSksXG4gICAgICAuLi4obW9kZWxTZXJ2aWNlTmFtZSA/IHsgbW9kZWxTZXJ2aWNlTmFtZSB9IDoge30pLFxuICAgICAgZW5kcG9pbnQsXG4gICAgICBjYXBhYmlsaXRpZXM6IHsgLi4uY2FwYWJpbGl0aWVzLCAuLi5vdmVycmlkZT8uY2FwYWJpbGl0aWVzIH0sXG4gICAgICByZWFzb25pbmdFZmZvcnRzOiBlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzID8/IFtdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbnRleHQoKTogUHJvbWlzZTxSZWdpc3RyeUNvbnRleHQ+IHtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgdGhpcy5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiB7IGNsaWVudDogdGhpcy5jbGllbnQsIGhvc3QgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5Q29udGV4dCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZU9wdGlvbnMoY29udGV4dDogUmVnaXN0cnlDb250ZXh0LCB0dGxNczogbnVtYmVyKTogTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICB0dGxNcyxcbiAgICAuLi4oY29udGV4dC5pZGVudGl0eSA/IHsgY2FjaGVJZGVudGl0eTogY29udGV4dC5pZGVudGl0eSB9IDoge30pLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWdpc3RyeUNvbnRleHQoKTogUHJvbWlzZTxSZWdpc3RyeUNvbnRleHQ+IHtcbiAgY29uc3QgY29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICByZXR1cm4ge1xuICAgIGNsaWVudDogY29udGV4dC5jbGllbnQsXG4gICAgaG9zdCxcbiAgICBpZGVudGl0eTogXCJ1c2VySWRcIiBpbiBjb250ZXh0ID8gY29udGV4dC51c2VySWQgOiBjb250ZXh0LnNlcnZpY2VVc2VySWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVucXVhbGlmaWVkTW9kZWwobW9kZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBtb2RlbC50cmltKCkucmVwbGFjZSgvXig/OmRieHxkYXRhYnJpY2tzKVxcLy9pLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpdmVUdGwodmFsdWUgPSBERUZBVUxUX0NBQ0hFX1RUTF9NUyk6IG51bWJlciB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTW9kZWwgcmVnaXN0cnkgdHRsTXMgbXVzdCBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVkTW9kZWxTZXJ2aWNlTmFtZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHZhbHVlPy50cmltKCkucmVwbGFjZSgvXmRhdGFicmlja3NcXC8vLCBcIlwiKTtcbiAgaWYgKCFub3JtYWxpemVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKFwic3lzdGVtLmFpLmRhdGFicmlja3MtXCIpKSB7XG4gICAgcmV0dXJuIGBzeXN0ZW0uYWkuJHtub3JtYWxpemVkLnNsaWNlKFwic3lzdGVtLmFpLmRhdGFicmlja3MtXCIubGVuZ3RoKX1gO1xuICB9XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJkYXRhYnJpY2tzLVwiKSkge1xuICAgIHJldHVybiBgc3lzdGVtLmFpLiR7bm9ybWFsaXplZC5zbGljZShcImRhdGFicmlja3MtXCIubGVuZ3RoKX1gO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzUmVzb2x2ZU9wdGlvbnModGFyZ2V0OiBNb2RlbFRhcmdldCwgb3B0aW9uczogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zKTogYm9vbGVhbiB7XG4gIGlmIChvcHRpb25zLnJlcXVpcmVzVG9vbHMgJiYgIXRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMpIHJldHVybiBmYWxzZTtcbiAgaWYgKG9wdGlvbnMubW9kZWxDbGFzcyA9PT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcpIHJldHVybiB0YXJnZXQuY2FwYWJpbGl0aWVzLmVtYmVkZGluZ3M7XG4gIGlmIChvcHRpb25zLm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdDtcbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixNQUFNLEVBQ04sT0FBTyxJQUFJLFlBQVksR0FFeEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsR0FHWCxNQUFNLG1DQUFtQyxDQUFDO0FBTzNDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQTJCM0Qsb0VBQW9FO0FBQ3BFLE1BQU0sT0FBTyx1QkFBdUI7SUFDakIsS0FBSyxDQUFTO0lBQ2QsU0FBUyxDQUFxQztJQUM5QyxNQUFNLENBQThCO0lBRXJELFlBQVksVUFBZ0MsRUFBRTtRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RSxN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SSxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2xDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7UUFDbkQsT0FBTyxhQUFhLFVBQVUsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDekMsT0FBTyxhQUFhLFVBQVUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLE1BQW1CLEVBQUUsT0FBb0M7SUFDdEYsSUFBSSxPQUFPLENBQUMsYUFBYSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEUsSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztJQUN2RixJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUztRQUFFLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDdEUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXF1ZXN0LXNjb3BlZCBEYXRhYnJpY2tzIG1vZGVsIGRpc2NvdmVyeSBmb3IgdGhlIEFwcEtpdCBnYXRld2F5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0LCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIG1ldGFkYXRhLFxuICBtb2RlbENhdGFsb2csXG4gIHBvbGljeSxcbiAgcmVzb2x2ZSBhcyBtb2RlbFJlc29sdmUsXG4gIHR5cGUgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zLFxufSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIHR5cGUgUmVzb2x2ZU1vZGVsSW5wdXQsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuaW1wb3J0IHR5cGUge1xuICBNb2RlbENhcGFiaWxpdGllcyxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsVGFyZ2V0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG5jb25zdCBERUZBVUxUX0NBQ0hFX1RUTF9NUyA9IDYwXzAwMDtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS9yZWdpc3RyeVwiKTtcblxuLyoqIFJlc29sdXRpb24gY29udHJvbHMgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsIHBvbGljeSBvd25lci4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyA9IFBpY2s8UmVzb2x2ZU1vZGVsSW5wdXQsIFwibW9kZWxDbGFzc1wiIHwgXCJyZXF1aXJlc1Rvb2xzXCI+O1xuXG4vKiogRHluYW1pYyBtb2RlbCBjYXRhbG9ndWUgdXNlZCBieSByZXF1ZXN0IHJvdXRpbmcgYW5kIG1vZGVsLWxpc3QgcmVzcG9uc2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5IHtcbiAgbGlzdCgpOiBQcm9taXNlPE1vZGVsVGFyZ2V0W10+O1xuICBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT47XG4gIHJlc29sdmUobW9kZWw/OiBzdHJpbmcsIG9wdGlvbnM/OiBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMpOiBQcm9taXNlPE1vZGVsVGFyZ2V0IHwgdW5kZWZpbmVkPjtcbiAgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3Ige0BsaW5rIERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSZWdpc3RyeU9wdGlvbnMge1xuICByZWFkb25seSB0dGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogcmVhZG9ubHkgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGVbXTtcbiAgLyoqIERpc2NvdmVyIG1vZGVscyB3aXRoIHRoaXMgY2xpZW50IGluc3RlYWQgb2YgdGhlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbiAgcmVhZG9ubHkgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50O1xufVxuXG5pbnRlcmZhY2UgUmVnaXN0cnlDb250ZXh0IHtcbiAgcmVhZG9ubHkgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgaWRlbnRpdHk/OiBzdHJpbmc7XG59XG5cbi8qKiBNb2RlbCByZWdpc3RyeSBiYWNrZWQgYnkgdGhlIGFjdGl2ZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG5leHBvcnQgY2xhc3MgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkgaW1wbGVtZW50cyBNb2RlbFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0dGxNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJyaWRlczogcmVhZG9ubHkgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGVbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy50dGxNcyA9IHBvc2l0aXZlVHRsKG9wdGlvbnMudHRsTXMpO1xuICAgIHRoaXMub3ZlcnJpZGVzID0gb3B0aW9ucy5vdmVycmlkZXMgPz8gW107XG4gICAgdGhpcy5jbGllbnQgPSBvcHRpb25zLmNsaWVudDtcbiAgfVxuXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY29udGV4dCgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxvYWRpbmcgY2F0YWxvZ3VlXCIsIHsgaG9zdDogY29udGV4dC5ob3N0LCB0dGxNczogdGhpcy50dGxNcyB9KTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBtb2RlbENhdGFsb2cubGlzdFNlcnZpbmdFbmRwb2ludHMoXG4gICAgICBjb250ZXh0LmNsaWVudCxcbiAgICAgIGNvbnRleHQuaG9zdCxcbiAgICAgIGNhdGFsb2d1ZU9wdGlvbnMoY29udGV4dCwgdGhpcy50dGxNcyksXG4gICAgKTtcbiAgICBjb25zdCB0YXJnZXRzID0gZW5kcG9pbnRzLm1hcCgoZW5kcG9pbnQpID0+IHRoaXMudGFyZ2V0KGVuZHBvaW50KSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibG9hZGVkIGNhdGFsb2d1ZVwiLCB7XG4gICAgICBlbmRwb2ludENvdW50OiBlbmRwb2ludHMubGVuZ3RoLFxuICAgICAgaG9zdDogY29udGV4dC5ob3N0LFxuICAgICAgdGFyZ2V0Q291bnQ6IHRhcmdldHMubGVuZ3RoLFxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXRzO1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZShcbiAgICBtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPE1vZGVsVGFyZ2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcmVxdWVzdGVkID0gbW9kZWwgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHVucXVhbGlmaWVkTW9kZWwobW9kZWwpO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBleGFjdCA9XG4gICAgICByZXF1ZXN0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IHRhcmdldHMuZmluZCgodGFyZ2V0KSA9PlxuICAgICAgICAgICAgdGFyZ2V0LmFsaWFzZXMuc29tZShcbiAgICAgICAgICAgICAgKGFsaWFzKSA9PiBhbGlhcy5sb2NhbGVDb21wYXJlKHJlcXVlc3RlZCwgdW5kZWZpbmVkLCB7IHNlbnNpdGl2aXR5OiBcImFjY2VudFwiIH0pID09PSAwLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgIGlmIChleGFjdCAmJiBtYXRjaGVzUmVzb2x2ZU9wdGlvbnMoZXhhY3QsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBleGFjdCBtb2RlbFwiLCB7IHJlcXVlc3RlZCwgcmVzb2x2ZWQ6IGV4YWN0LmlkIH0pO1xuICAgICAgcmV0dXJuIGV4YWN0O1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50cyA9IHRhcmdldHNcbiAgICAgIC5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LmVuZHBvaW50KVxuICAgICAgLmZpbHRlcigoZW5kcG9pbnQpOiBlbmRwb2ludCBpcyBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0+IGVuZHBvaW50ICE9PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHJlc29sdmVkID0gbW9kZWxSZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHtcbiAgICAgIC4uLihyZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHsgZXhwbGljaXQ6IHJlcXVlc3RlZCB9IDoge30pLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSByZXNvbHZlZC5tb2RlbElkKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBmdXp6eSBtb2RlbFwiLCB7XG4gICAgICByZXF1ZXN0ZWQsXG4gICAgICByZXNvbHZlZDogdGFyZ2V0Py5pZCxcbiAgICAgIHNvdXJjZTogcmVzb2x2ZWQuc291cmNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBieUlkID0gbmV3IE1hcCh0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiBbdGFyZ2V0LmlkLCB0YXJnZXRdKSk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gdGFyZ2V0c1xuICAgICAgLm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQpXG4gICAgICAuZmlsdGVyKChlbmRwb2ludCk6IGVuZHBvaW50IGlzIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPT4gZW5kcG9pbnQgIT09IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcmFua2VkID0gW1xuICAgICAgLi4ubW9kZWxSZXNvbHZlLmxvb2t1cE1vZGVscyhlbmRwb2ludHMsIHsgc2VhcmNoOiBxdWVyeSB9KSxcbiAgICAgIC4uLm1vZGVsUmVzb2x2ZS5sb29rdXBNb2RlbHMoZW5kcG9pbnRzLCB7XG4gICAgICAgIHNlYXJjaDogcXVlcnksXG4gICAgICAgIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nLFxuICAgICAgfSksXG4gICAgXS5zb3J0KChsZWZ0LCByaWdodCkgPT4gKGxlZnQuc2NvcmUgPz8gMCkgLSAocmlnaHQuc2NvcmUgPz8gMCkpO1xuICAgIHJldHVybiByYW5rZWRcbiAgICAgIC5tYXAoKHsgZW5kcG9pbnQgfSkgPT4gYnlJZC5nZXQoZW5kcG9pbnQubmFtZSkpXG4gICAgICAuZmlsdGVyKCh0YXJnZXQpOiB0YXJnZXQgaXMgTW9kZWxUYXJnZXQgPT4gdGFyZ2V0ICE9PSB1bmRlZmluZWQpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAodGFyZ2V0LCBpbmRleCwgYWxsKSA9PiBhbGwuZmluZEluZGV4KChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gdGFyZ2V0LmlkKSA9PT0gaW5kZXgsXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jb250ZXh0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY2xlYXJpbmcgY2F0YWxvZ3VlXCIsIHsgaG9zdDogY29udGV4dC5ob3N0IH0pO1xuICAgIGlmIChjb250ZXh0LmlkZW50aXR5KSB7XG4gICAgICBhd2FpdCBtb2RlbENhdGFsb2cuY2xlYXJTZXJ2aW5nRW5kcG9pbnRzQ2FjaGUoY29udGV4dC5ob3N0LCBjb250ZXh0LmlkZW50aXR5KTtcbiAgICB9XG4gICAgYXdhaXQgbW9kZWxDYXRhbG9nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKFxuICAgICAgY29udGV4dC5jbGllbnQsXG4gICAgICBjb250ZXh0Lmhvc3QsXG4gICAgICBjYXRhbG9ndWVPcHRpb25zKGNvbnRleHQsIHRoaXMudHRsTXMpLFxuICAgICk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVmcmVzaGVkIGNhdGFsb2d1ZVwiLCB7IGhvc3Q6IGNvbnRleHQuaG9zdCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdGFyZ2V0KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogTW9kZWxUYXJnZXQge1xuICAgIGNvbnN0IHB1Ymxpc2hlZCA9IG1ldGFkYXRhLm1vZGVsQ2FwYWJpbGl0aWVzRm9yKGVuZHBvaW50KTtcbiAgICBjb25zdCBmYW1pbHkgPSBlbmRwb2ludC5mYW1pbHk/LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgb3BlbkFpRmFtaWx5ID0gZmFtaWx5ID09PSBcImdwdFwiIHx8IGZhbWlseSA9PT0gXCJvcGVuYWlcIiB8fCBlbmRwb2ludC5uYW1lLmluY2x1ZGVzKFwiY29kZXhcIik7XG4gICAgY29uc3QgbW9kZWxTZXJ2aWNlTmFtZSA9IG5vcm1hbGl6ZWRNb2RlbFNlcnZpY2VOYW1lKGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUpO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPVxuICAgICAgZW5kcG9pbnQuY2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIHx8IGVuZHBvaW50LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcbiAgICBjb25zdCBjYXBhYmlsaXRpZXM6IE1vZGVsQ2FwYWJpbGl0aWVzID0ge1xuICAgICAgcmVzcG9uc2VzOiAhZW1iZWRkaW5ncyAmJiAob3BlbkFpRmFtaWx5IHx8IHB1Ymxpc2hlZC5yZXNwb25zZXMpLFxuICAgICAgb3BlblJlc3BvbnNlczogIWVtYmVkZGluZ3MgJiYgIW9wZW5BaUZhbWlseSxcbiAgICAgIGNoYXQ6ICFlbWJlZGRpbmdzLFxuICAgICAgYW50aHJvcGljOiBmYW1pbHkgPT09IFwiY2xhdWRlXCIsXG4gICAgICBlbWJlZGRpbmdzLFxuICAgICAgYWlHYXRld2F5Q29kZXg6XG4gICAgICAgICFlbWJlZGRpbmdzICYmIEJvb2xlYW4obW9kZWxTZXJ2aWNlTmFtZSkgJiYgZmFtaWx5ICE9PSBcImNsYXVkZVwiICYmIGZhbWlseSAhPT0gXCJnZW1pbmlcIixcbiAgICAgIHRvb2xzOiBlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID09PSB0cnVlLFxuICAgICAgcmVhc29uaW5nOiBwb2xpY3kubW9kZWxSZWFzb25pbmdFZmZvcnRzKGVuZHBvaW50Lm5hbWUpLmxlbmd0aCA+IDAsXG4gICAgICBzdHJlYW1pbmc6IHRydWUsXG4gICAgICBwYXJhbGxlbFRvb2xzOiBlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID09PSB0cnVlLFxuICAgICAgY3VzdG9tVG9vbHM6IHB1Ymxpc2hlZC5hcHBseVBhdGNoIHx8IGVuZHBvaW50Lm5hbWUuaW5jbHVkZXMoXCJjb2RleFwiKSxcbiAgICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHRydWUsXG4gICAgICB3ZWJTZWFyY2g6IHB1Ymxpc2hlZC53ZWJTZWFyY2gsXG4gICAgfTtcbiAgICBjb25zdCBhbGlhc2VzID0gbmV3IFNldChcbiAgICAgIFtcbiAgICAgICAgZW5kcG9pbnQubmFtZSxcbiAgICAgICAgZW5kcG9pbnQuZGlzcGxheU5hbWUsXG4gICAgICAgIGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUsXG4gICAgICAgIG1vZGVsU2VydmljZU5hbWUsXG4gICAgICAgIC4uLk9iamVjdC52YWx1ZXMoZW5kcG9pbnQuc2VydmljZU5hbWVzID8/IHt9KSxcbiAgICAgIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlPy50cmltKCkpKSxcbiAgICApO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5vdmVycmlkZXMuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+XG4gICAgICAgIGNhbmRpZGF0ZS5tb2RlbCA9PT0gZW5kcG9pbnQubmFtZSB8fFxuICAgICAgICBbLi4uYWxpYXNlc10uc29tZSgoYWxpYXMpID0+IGFsaWFzID09PSBjYW5kaWRhdGUubW9kZWwpLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBlbmRwb2ludC5uYW1lLFxuICAgICAgYWxpYXNlczogWy4uLmFsaWFzZXNdLFxuICAgICAgZGlzcGxheU5hbWU6IGVuZHBvaW50LmRpc3BsYXlOYW1lID8/IGVuZHBvaW50Lm5hbWUsXG4gICAgICAuLi4oZW5kcG9pbnQuZmFtaWx5ID8geyBmYW1pbHk6IGVuZHBvaW50LmZhbWlseSB9IDoge30pLFxuICAgICAgLi4uKG1vZGVsU2VydmljZU5hbWUgPyB7IG1vZGVsU2VydmljZU5hbWUgfSA6IHt9KSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgY2FwYWJpbGl0aWVzOiB7IC4uLmNhcGFiaWxpdGllcywgLi4ub3ZlcnJpZGU/LmNhcGFiaWxpdGllcyB9LFxuICAgICAgcmVhc29uaW5nRWZmb3J0czogZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0cyA/PyBbXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250ZXh0KCk6IFByb21pc2U8UmVnaXN0cnlDb250ZXh0PiB7XG4gICAgaWYgKHRoaXMuY2xpZW50KSB7XG4gICAgICBjb25zdCBob3N0ID0gKGF3YWl0IHRoaXMuY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgICByZXR1cm4geyBjbGllbnQ6IHRoaXMuY2xpZW50LCBob3N0IH07XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyeUNvbnRleHQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVPcHRpb25zKGNvbnRleHQ6IFJlZ2lzdHJ5Q29udGV4dCwgdHRsTXM6IG51bWJlcik6IExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgdHRsTXMsXG4gICAgLi4uKGNvbnRleHQuaWRlbnRpdHkgPyB7IGNhY2hlSWRlbnRpdHk6IGNvbnRleHQuaWRlbnRpdHkgfSA6IHt9KSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVnaXN0cnlDb250ZXh0KCk6IFByb21pc2U8UmVnaXN0cnlDb250ZXh0PiB7XG4gIGNvbnN0IGNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGhvc3QgPSAoYXdhaXQgY29udGV4dC5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnQ6IGNvbnRleHQuY2xpZW50LFxuICAgIGhvc3QsXG4gICAgaWRlbnRpdHk6IFwidXNlcklkXCIgaW4gY29udGV4dCA/IGNvbnRleHQudXNlcklkIDogY29udGV4dC5zZXJ2aWNlVXNlcklkLFxuICB9O1xufVxuXG5mdW5jdGlvbiB1bnF1YWxpZmllZE1vZGVsKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZWwudHJpbSgpLnJlcGxhY2UoL14oPzpkYnh8ZGF0YWJyaWNrcylcXC8vaSwgXCJcIik7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aXZlVHRsKHZhbHVlID0gREVGQVVMVF9DQUNIRV9UVExfTVMpOiBudW1iZXIge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1vZGVsIHJlZ2lzdHJ5IHR0bE1zIG11c3QgYmUgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyXCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplZE1vZGVsU2VydmljZU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZT8udHJpbSgpLnJlcGxhY2UoL15kYXRhYnJpY2tzXFwvLywgXCJcIik7XG4gIGlmICghbm9ybWFsaXplZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcInN5c3RlbS5haS5kYXRhYnJpY2tzLVwiKSkge1xuICAgIHJldHVybiBgc3lzdGVtLmFpLiR7bm9ybWFsaXplZC5zbGljZShcInN5c3RlbS5haS5kYXRhYnJpY2tzLVwiLmxlbmd0aCl9YDtcbiAgfVxuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKFwiZGF0YWJyaWNrcy1cIikpIHtcbiAgICByZXR1cm4gYHN5c3RlbS5haS4ke25vcm1hbGl6ZWQuc2xpY2UoXCJkYXRhYnJpY2tzLVwiLmxlbmd0aCl9YDtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlc1Jlc29sdmVPcHRpb25zKHRhcmdldDogTW9kZWxUYXJnZXQsIG9wdGlvbnM6IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBpZiAob3B0aW9ucy5yZXF1aXJlc1Rvb2xzICYmICF0YXJnZXQuY2FwYWJpbGl0aWVzLnRvb2xzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChvcHRpb25zLm1vZGVsQ2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nKSByZXR1cm4gdGFyZ2V0LmNhcGFiaWxpdGllcy5lbWJlZGRpbmdzO1xuICBpZiAob3B0aW9ucy5tb2RlbENsYXNzICE9PSB1bmRlZmluZWQpIHJldHVybiB0YXJnZXQuY2FwYWJpbGl0aWVzLmNoYXQ7XG4gIHJldHVybiB0cnVlO1xufVxuIl19
package/package.json CHANGED
@@ -31,11 +31,11 @@
31
31
  "@ai-sdk/open-responses": "^2.0.58",
32
32
  "@ai-sdk/openai-compatible": "^3.0.62",
33
33
  "@databricks/appkit": "0.81.0",
34
- "@dbx-tools/databricks": "^0.9.61",
35
- "@dbx-tools/model": "^0.9.61",
36
- "@dbx-tools/shared-core": "^0.9.61",
37
- "@dbx-tools/shared-model": "^0.9.61",
38
- "@dbx-tools/shared-model-gateway": "^0.9.61",
34
+ "@dbx-tools/databricks": "^0.9.65",
35
+ "@dbx-tools/model": "^0.9.65",
36
+ "@dbx-tools/shared-core": "^0.9.65",
37
+ "@dbx-tools/shared-model": "^0.9.65",
38
+ "@dbx-tools/shared-model-gateway": "^0.9.65",
39
39
  "ai": "^7.0.0",
40
40
  "zod": "4.3.6"
41
41
  },
@@ -89,7 +89,7 @@
89
89
  "./package.json": "./package.json"
90
90
  }
91
91
  },
92
- "version": "0.9.61",
92
+ "version": "0.9.65",
93
93
  "types": "./lib/index.d.ts",
94
94
  "dbxToolsConfig": {
95
95
  "tags": [
package/src/gateway.ts CHANGED
@@ -5,7 +5,11 @@
5
5
  */
6
6
 
7
7
  import { log } from "@dbx-tools/shared-core";
8
- import { ModelClass } from "@dbx-tools/shared-model";
8
+ import {
9
+ ModelClass,
10
+ ModelClassSchema,
11
+ type ModelClass as ModelClassType,
12
+ } from "@dbx-tools/shared-model";
9
13
  import type {
10
14
  ClientProtocol,
11
15
  GatewayRoute,
@@ -30,6 +34,8 @@ const logger = log.logger("appkit/model-gateway");
30
34
  export interface ModelGatewayOptions {
31
35
  readonly cacheTtlMs?: number;
32
36
  readonly overrides?: readonly ModelCapabilityOverride[];
37
+ readonly model?: string;
38
+ readonly modelClass?: ModelClassType;
33
39
  }
34
40
 
35
41
  /** Error carrying an HTTP status and protocol-safe message. */
@@ -46,6 +52,8 @@ export class ModelGatewayError extends Error {
46
52
  /** AppKit-scoped model gateway with dynamic model discovery and streaming inference. */
47
53
  export class ModelGateway {
48
54
  private readonly registry: ModelRegistry;
55
+ private readonly model?: string;
56
+ private readonly modelClass?: ModelClassType;
49
57
 
50
58
  constructor(options: ModelGatewayOptions = {}, registry?: ModelRegistry) {
51
59
  const registryOptions: ModelRegistryOptions = {
@@ -53,6 +61,8 @@ export class ModelGateway {
53
61
  ...(options.overrides ? { overrides: options.overrides } : {}),
54
62
  };
55
63
  this.registry = registry ?? new DatabricksModelRegistry(registryOptions);
64
+ this.model = options.model;
65
+ this.modelClass = options.modelClass;
56
66
  }
57
67
 
58
68
  /** Return the live OpenAI model list, including Codex metadata when requested. */
@@ -73,19 +83,37 @@ export class ModelGateway {
73
83
  signal: AbortSignal,
74
84
  ): Promise<Response> {
75
85
  const sanitizedBody = sanitizeInferenceBody(body);
76
- const requestedModel = requiredModel(sanitizedBody.model);
86
+ const selection = gatewayModelSelection(
87
+ sanitizedBody,
88
+ headers,
89
+ {
90
+ model: this.model,
91
+ modelClass: this.modelClass,
92
+ },
93
+ protocol,
94
+ );
77
95
  logger.debug("resolving request", {
78
96
  clientProtocol: protocol,
79
- model: requestedModel,
97
+ model: selection.model,
98
+ modelClass: selection.modelClass,
80
99
  originator: headers.get("originator") ?? undefined,
81
100
  stream: sanitizedBody.stream === true,
82
101
  });
83
102
  const features = requestedFeatures(sanitizedBody);
84
- const target = await this.registry.resolve(requestedModel, {
103
+ const target = await this.registry.resolve(selection.model, {
85
104
  ...(protocol === "openai-embeddings" ? { modelClass: ModelClass.Embedding } : {}),
105
+ ...(selection.modelClass ? { modelClass: selection.modelClass } : {}),
86
106
  ...(features.tools ? { requiresTools: true } : {}),
87
107
  });
88
- if (!target) throw new ModelGatewayError(404, `Model not found: ${requestedModel}`);
108
+ if (!target) {
109
+ throw new ModelGatewayError(
110
+ 404,
111
+ selection.model
112
+ ? `Model not found: ${selection.model}`
113
+ : "No model matches the requested class",
114
+ );
115
+ }
116
+ const requestedModel = selection.model ?? target.id;
89
117
  const route = resolveRoute({
90
118
  clientProtocol: protocol,
91
119
  requestedModel,
@@ -155,11 +183,28 @@ export function sanitizeInferenceBody(
155
183
  return sanitized;
156
184
  }
157
185
 
158
- function requiredModel(value: unknown): string {
159
- if (typeof value !== "string" || !value.trim()) {
160
- throw new ModelGatewayError(400, "Request body must include a non-empty model");
186
+ /** Resolve request, header, configured, and protocol model-selection inputs. */
187
+ export function gatewayModelSelection(
188
+ body: Readonly<Record<string, unknown>>,
189
+ headers: Headers,
190
+ defaults: { readonly model?: string; readonly modelClass?: ModelClassType } = {},
191
+ protocol?: ClientProtocol,
192
+ ): { readonly model?: string; readonly modelClass?: ModelClassType } {
193
+ const model = typeof body.model === "string" && body.model.trim() ? body.model.trim() : undefined;
194
+ const header = headers.get("x-dbx-tools-model-class")?.trim();
195
+ const parsedClass = header ? ModelClassSchema.safeParse(header) : undefined;
196
+ if (parsedClass && !parsedClass.success) {
197
+ throw new ModelGatewayError(400, `Invalid model class: ${header}`);
198
+ }
199
+ if (model && parsedClass?.data) {
200
+ throw new ModelGatewayError(400, "Model and model class are mutually exclusive");
161
201
  }
162
- return value.trim();
202
+ if (model) return { model };
203
+ if (parsedClass?.data) return { modelClass: parsedClass.data };
204
+ if (defaults.model) return { model: defaults.model };
205
+ if (defaults.modelClass) return { modelClass: defaults.modelClass };
206
+ if (protocol === "openai-embeddings") return { modelClass: ModelClass.Embedding };
207
+ return {};
163
208
  }
164
209
 
165
210
  function logResponse(upstreamProtocol: string, model: string, response: Response): void {
package/src/plugin.ts CHANGED
@@ -32,6 +32,8 @@ export class ModelGatewayPlugin extends Plugin<ModelGatewayPluginConfig> {
32
32
  this.gateway = new ModelGateway({
33
33
  ...(config.cacheTtlMs !== undefined ? { cacheTtlMs: config.cacheTtlMs } : {}),
34
34
  ...(config.overrides ? { overrides: config.overrides } : {}),
35
+ ...(config.model ? { model: config.model } : {}),
36
+ ...(config.modelClass ? { modelClass: config.modelClass } : {}),
35
37
  });
36
38
  }
37
39
 
package/src/registry.ts CHANGED
@@ -34,7 +34,7 @@ export type ModelRegistryResolveOptions = Pick<ResolveModelInput, "modelClass" |
34
34
  export interface ModelRegistry {
35
35
  list(): Promise<ModelTarget[]>;
36
36
  search(query: string): Promise<ModelTarget[]>;
37
- resolve(model: string, options?: ModelRegistryResolveOptions): Promise<ModelTarget | undefined>;
37
+ resolve(model?: string, options?: ModelRegistryResolveOptions): Promise<ModelTarget | undefined>;
38
38
  refresh(): Promise<void>;
39
39
  }
40
40
 
@@ -82,16 +82,19 @@ export class DatabricksModelRegistry implements ModelRegistry {
82
82
  }
83
83
 
84
84
  async resolve(
85
- model: string,
85
+ model: string | undefined,
86
86
  options: ModelRegistryResolveOptions = {},
87
87
  ): Promise<ModelTarget | undefined> {
88
- const requested = unqualifiedModel(model);
88
+ const requested = model === undefined ? undefined : unqualifiedModel(model);
89
89
  const targets = await this.list();
90
- const exact = targets.find((target) =>
91
- target.aliases.some(
92
- (alias) => alias.localeCompare(requested, undefined, { sensitivity: "accent" }) === 0,
93
- ),
94
- );
90
+ const exact =
91
+ requested === undefined
92
+ ? undefined
93
+ : targets.find((target) =>
94
+ target.aliases.some(
95
+ (alias) => alias.localeCompare(requested, undefined, { sensitivity: "accent" }) === 0,
96
+ ),
97
+ );
95
98
  if (exact && matchesResolveOptions(exact, options)) {
96
99
  logger.debug("resolved exact model", { requested, resolved: exact.id });
97
100
  return exact;
@@ -101,7 +104,7 @@ export class DatabricksModelRegistry implements ModelRegistry {
101
104
  .map((target) => target.endpoint)
102
105
  .filter((endpoint): endpoint is ServingEndpointSummary => endpoint !== undefined);
103
106
  const resolved = modelResolve.resolveModel(endpoints, {
104
- explicit: requested,
107
+ ...(requested !== undefined ? { explicit: requested } : {}),
105
108
  ...options,
106
109
  });
107
110
  const target = targets.find((candidate) => candidate.id === resolved.modelId);