@dbx-tools/appkit-model-gateway 0.9.203 → 0.9.205
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/index.ts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +3 -3
- package/lib/src/gateway.d.ts +1 -1
- package/lib/src/gateway.js +14 -8
- package/lib/src/registry.d.ts +3 -0
- package/lib/src/registry.js +8 -2
- package/lib/src/router.d.ts +3 -2
- package/lib/src/router.js +7 -4
- package/lib/src/routes.js +3 -3
- package/package.json +8 -8
- package/src/gateway.ts +14 -7
- package/src/registry.ts +9 -1
- package/src/router.ts +6 -3
- package/src/routes.ts +2 -2
package/README.md
CHANGED
|
@@ -161,9 +161,10 @@ discovered value.
|
|
|
161
161
|
|
|
162
162
|
## Configure Codex
|
|
163
163
|
|
|
164
|
-
`GET /v1/models` includes Codex metadata when the request carries
|
|
165
|
-
`Originator
|
|
166
|
-
|
|
164
|
+
`GET /v1/models` includes Codex metadata when the request carries an
|
|
165
|
+
`Originator` header containing `codex` (case-insensitive), or a nonblank
|
|
166
|
+
`client_version` query parameter. Codex slugs prefer fully qualified Databricks
|
|
167
|
+
model service names.
|
|
167
168
|
|
|
168
169
|
Add `metadata=true` to either the standard or Codex request to include the
|
|
169
170
|
optional dbx-tools metadata object on each model. Its latency and rating fields
|
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-model-gateway";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.205";
|
|
7
7
|
export * as aIDecide from "./src/ai-decide.ts";
|
|
8
8
|
export * as gateway from "./src/gateway.ts";
|
|
9
9
|
export * as modelContext from "./src/model-context.ts";
|
|
@@ -32,7 +32,7 @@ export { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./src/reas
|
|
|
32
32
|
export type { AdaptedInferenceBody } from "./src/reasoning-adapt.ts";
|
|
33
33
|
export { DatabricksModelRegistry } from "./src/registry.ts";
|
|
34
34
|
export type { ModelRegistryResolveOptions, ModelRegistry, ModelRegistryOptions } from "./src/registry.ts";
|
|
35
|
-
export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures,
|
|
35
|
+
export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures, isCodexRequest } from "./src/router.ts";
|
|
36
36
|
export { sendHealth, sendModels, sendInference } from "./src/routes.ts";
|
|
37
37
|
export { SMART_ROUTER_DEFAULT_SETTINGS, SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey } from "./src/smart-router.ts";
|
|
38
38
|
export type { SmartRouterSettings, SmartRouterCandidate, SmartRouterSelection, SmartRouterStore, SmartRouterProbeRecord, SmartRouterProbeStore, SmartRouterResult, SmartRouterContext, SmartRouterSelectOptions } from "./src/smart-router.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-model-gateway";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.205";
|
|
3
3
|
export * as aIDecide from "./src/ai-decide.ts";
|
|
4
4
|
export * as gateway from "./src/gateway.ts";
|
|
5
5
|
export * as modelContext from "./src/model-context.ts";
|
|
@@ -28,7 +28,7 @@ export { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./src/reas
|
|
|
28
28
|
export type { AdaptedInferenceBody } from "./src/reasoning-adapt.ts";
|
|
29
29
|
export { DatabricksModelRegistry } from "./src/registry.ts";
|
|
30
30
|
export type { ModelRegistryResolveOptions, ModelRegistry, ModelRegistryOptions } from "./src/registry.ts";
|
|
31
|
-
export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures,
|
|
31
|
+
export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures, isCodexRequest } from "./src/router.ts";
|
|
32
32
|
export { sendHealth, sendModels, sendInference } from "./src/routes.ts";
|
|
33
33
|
export { SMART_ROUTER_DEFAULT_SETTINGS, SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey } from "./src/smart-router.ts";
|
|
34
34
|
export type { SmartRouterSettings, SmartRouterCandidate, SmartRouterSelection, SmartRouterStore, SmartRouterProbeRecord, SmartRouterProbeStore, SmartRouterResult, SmartRouterContext, SmartRouterSelectOptions } from "./src/smart-router.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-model-gateway";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.205";
|
|
6
6
|
export * as aIDecide from "./src/ai-decide.js";
|
|
7
7
|
export * as gateway from "./src/gateway.js";
|
|
8
8
|
export * as modelContext from "./src/model-context.js";
|
|
@@ -24,9 +24,9 @@ export { ModelGatewayPlugin, modelGateway } from "./src/plugin.js";
|
|
|
24
24
|
export { ProfileFallback, modelGatewayRateLimit } from "./src/profile-fallback.js";
|
|
25
25
|
export { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./src/reasoning-adapt.js";
|
|
26
26
|
export { DatabricksModelRegistry } from "./src/registry.js";
|
|
27
|
-
export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures,
|
|
27
|
+
export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures, isCodexRequest } from "./src/router.js";
|
|
28
28
|
export { sendHealth, sendModels, sendInference } from "./src/routes.js";
|
|
29
29
|
export { SMART_ROUTER_DEFAULT_SETTINGS, SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey } from "./src/smart-router.js";
|
|
30
30
|
export { translateGatewayRequest } from "./src/translation.js";
|
|
31
31
|
export { fetchDatabricks, fetchWorkspace, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.js";
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssZUFBZSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVJLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRW5GLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLDRCQUE0QixFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLDJCQUEyQixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdlIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsMkJBQTJCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1vZGVsLWdhdGV3YXlcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4yMDVcIjtcbmV4cG9ydCAqIGFzIGFJRGVjaWRlIGZyb20gXCIuL3NyYy9haS1kZWNpZGUudHNcIjtcbmV4cG9ydCAqIGFzIGdhdGV3YXkgZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ29udGV4dCBmcm9tIFwiLi9zcmMvbW9kZWwtY29udGV4dC50c1wiO1xuZXhwb3J0ICogYXMgbW9kZWxzIGZyb20gXCIuL3NyYy9tb2RlbHMudHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBwcm9maWxlRmFsbGJhY2sgZnJvbSBcIi4vc3JjL3Byb2ZpbGUtZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIHJlYXNvbmluZ0FkYXB0IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCAqIGFzIHJlZ2lzdHJ5IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0ICogYXMgcm91dGVyIGZyb20gXCIuL3NyYy9yb3V0ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlcyBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgKiBhcyBzbWFydFJvdXRlciBmcm9tIFwiLi9zcmMvc21hcnQtcm91dGVyLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvdHJhbnNsYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHRyYW5zcG9ydCBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG5leHBvcnQgeyBBaURlY2lkZVJvdXRlclNlcnZpY2UsIEFpRGVjaWRlUm91dGVyRXJyb3IgfSBmcm9tIFwiLi9zcmMvYWktZGVjaWRlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFpRGVjaWRlU2VsZWN0aW9uT3B0aW9ucywgQWlEZWNpZGVTZWxlY3Rpb24gfSBmcm9tIFwiLi9zcmMvYWktZGVjaWRlLnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlFcnJvciwgTW9kZWxHYXRld2F5LCBzYW5pdGl6ZUluZmVyZW5jZUJvZHksIGFkYXB0SW5mZXJlbmNlVGVtcGVyYXR1cmUsIGdhdGV3YXlNb2RlbFNlbGVjdGlvbiB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2F0ZXdheS50c1wiO1xuZXhwb3J0IHsgbm9ybWFsaXplTW9kZWxDb250ZXh0IH0gZnJvbSBcIi4vc3JjL21vZGVsLWNvbnRleHQudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxDb250ZXh0RXZlbnQsIE5vcm1hbGl6ZU1vZGVsQ29udGV4dE9wdGlvbnMsIE5vcm1hbGl6ZWRNb2RlbENvbnRleHQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY29udGV4dC50c1wiO1xuZXhwb3J0IHsgbGlzdE1vZGVsc1BheWxvYWQsIGNvZGV4TW9kZWxTbHVnIH0gZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5UGx1Z2luLCBtb2RlbEdhdGV3YXkgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB7IFByb2ZpbGVGYWxsYmFjaywgbW9kZWxHYXRld2F5UmF0ZUxpbWl0IH0gZnJvbSBcIi4vc3JjL3Byb2ZpbGUtZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5UHJvZmlsZSwgTW9kZWxHYXRld2F5UmF0ZUxpbWl0LCBQcm9maWxlRmFsbGJhY2tEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi9zcmMvcHJvZmlsZS1mYWxsYmFjay50c1wiO1xuZXhwb3J0IHsgYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcsIGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSB9IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWRhcHRlZEluZmVyZW5jZUJvZHkgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSB9IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMsIE1vZGVsUmVnaXN0cnksIE1vZGVsUmVnaXN0cnlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgeyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IsIHJlc29sdmVSb3V0ZSwgcmVxdWVzdGVkRmVhdHVyZXMsIGlzQ29kZXhSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0IHsgc2VuZEhlYWx0aCwgc2VuZE1vZGVscywgc2VuZEluZmVyZW5jZSB9IGZyb20gXCIuL3NyYy9yb3V0ZXMudHNcIjtcbmV4cG9ydCB7IFNNQVJUX1JPVVRFUl9ERUZBVUxUX1NFVFRJTkdTLCBTbWFydFJvdXRlclByb2JlUmVjb3JkU2NoZW1hLCBTbWFydFJvdXRlckVycm9yLCBBcHBLaXRTbWFydFJvdXRlclN0b3JlLCBBcHBLaXRTbWFydFJvdXRlclByb2JlU3RvcmUsIFNtYXJ0Um91dGVyU2VydmljZSwgc21hcnRSb3V0ZXJDYW5kaWRhdGVzLCBTbWFydFJvdXRlckNvbnRleHRCdWlsZGVyLCBTbWFydE1vZGVsUm91dGVyLCBzbWFydFJvdXRlclR1cm5LZXkgfSBmcm9tIFwiLi9zcmMvc21hcnQtcm91dGVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNtYXJ0Um91dGVyU2V0dGluZ3MsIFNtYXJ0Um91dGVyQ2FuZGlkYXRlLCBTbWFydFJvdXRlclNlbGVjdGlvbiwgU21hcnRSb3V0ZXJTdG9yZSwgU21hcnRSb3V0ZXJQcm9iZVJlY29yZCwgU21hcnRSb3V0ZXJQcm9iZVN0b3JlLCBTbWFydFJvdXRlclJlc3VsdCwgU21hcnRSb3V0ZXJDb250ZXh0LCBTbWFydFJvdXRlclNlbGVjdE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc21hcnQtcm91dGVyLnRzXCI7XG5leHBvcnQgeyB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBmZXRjaFdvcmtzcGFjZSwgZGlyZWN0RGF0YWJyaWNrc1JlcXVlc3RCb2R5LCBnYXRld2F5UmVzcG9uc2VIZWFkZXJzIH0gZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzVHJhbnNwb3J0UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbiJdfQ==
|
package/lib/src/gateway.d.ts
CHANGED
|
@@ -45,7 +45,7 @@ export declare class ModelGateway {
|
|
|
45
45
|
private readonly primaryProfile?;
|
|
46
46
|
constructor(options?: ModelGatewayOptions, registry?: ModelRegistry);
|
|
47
47
|
/** Return the live OpenAI model list, including Codex metadata when requested. */
|
|
48
|
-
models(
|
|
48
|
+
models(codex?: boolean, search?: string, modelSource?: ModelSource | "all", includeMetadata?: boolean): Promise<ModelListResponse>;
|
|
49
49
|
/** Resolve and execute one inference request. */
|
|
50
50
|
inference(protocol: ClientProtocol, body: Readonly<Record<string, unknown>>, headers: Headers, signal: AbortSignal): Promise<Response>;
|
|
51
51
|
/** Refresh the active principal's model catalogue. */
|
package/lib/src/gateway.js
CHANGED
|
@@ -12,7 +12,7 @@ import { listModelsPayload } from "./models.js";
|
|
|
12
12
|
import { ProfileFallback } from "./profile-fallback.js";
|
|
13
13
|
import { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./reasoning-adapt.js";
|
|
14
14
|
import { DatabricksModelRegistry, } from "./registry.js";
|
|
15
|
-
import {
|
|
15
|
+
import { requestedFeatures, resolveRoute } from "./router.js";
|
|
16
16
|
import { SmartModelRouter, } from "./smart-router.js";
|
|
17
17
|
import { translateGatewayRequest } from "./translation.js";
|
|
18
18
|
import { fetchDatabricks, gatewayResponseHeaders } from "./transport.js";
|
|
@@ -51,7 +51,14 @@ export class ModelGateway {
|
|
|
51
51
|
...(options.preferSystemModels !== undefined
|
|
52
52
|
? { preferSystemModels: options.preferSystemModels }
|
|
53
53
|
: {}),
|
|
54
|
-
...(this.primaryProfile
|
|
54
|
+
...(this.primaryProfile
|
|
55
|
+
? {
|
|
56
|
+
client: this.primaryProfile.client,
|
|
57
|
+
...(this.primaryProfile.profile
|
|
58
|
+
? { cacheIdentity: `profile:${this.primaryProfile.profile}` }
|
|
59
|
+
: {}),
|
|
60
|
+
}
|
|
61
|
+
: {}),
|
|
55
62
|
};
|
|
56
63
|
this.registry = registry ?? new DatabricksModelRegistry(registryOptions);
|
|
57
64
|
this.aiDecide = options.aiDecideService ?? new AiDecideRouterService();
|
|
@@ -74,8 +81,7 @@ export class ModelGateway {
|
|
|
74
81
|
options.preferSystemModels ?? MODEL_GATEWAY_DEFAULTS.preferSystemModels;
|
|
75
82
|
}
|
|
76
83
|
/** Return the live OpenAI model list, including Codex metadata when requested. */
|
|
77
|
-
async models(
|
|
78
|
-
const codex = isCodexOriginator(originator);
|
|
84
|
+
async models(codex = false, search, modelSource = "foundation", includeMetadata = false) {
|
|
79
85
|
logger.debug("listing models", { codex, search });
|
|
80
86
|
const query = search?.trim();
|
|
81
87
|
const smartRouterSearch = query !== undefined && SMART_ROUTER_MODEL_ID.includes(query.toLowerCase());
|
|
@@ -138,9 +144,9 @@ export class ModelGateway {
|
|
|
138
144
|
if (selection.smartRouter && !smartRouter) {
|
|
139
145
|
throw new ModelGatewayError(404, "Databricks Smart Router is disabled");
|
|
140
146
|
}
|
|
141
|
-
const
|
|
147
|
+
const aiDecideTargets = !smartRouter && selection.aiDecide ? await this.registry.list() : undefined;
|
|
142
148
|
const aiDecide = selection.aiDecide
|
|
143
|
-
? await this.aiDecide.select(sanitizedBody, (
|
|
149
|
+
? await this.aiDecide.select(sanitizedBody, (aiDecideTargets ?? [])
|
|
144
150
|
.map((candidate) => candidate.endpoint)
|
|
145
151
|
.filter((endpoint) => endpoint !== undefined), this.primaryProfile?.client, {
|
|
146
152
|
strategy: aiDecideStrategy(headers),
|
|
@@ -153,7 +159,7 @@ export class ModelGateway {
|
|
|
153
159
|
: undefined;
|
|
154
160
|
const target = smartRouter?.target ??
|
|
155
161
|
(aiDecide
|
|
156
|
-
?
|
|
162
|
+
? aiDecideTargets?.find((candidate) => candidate.id === aiDecide.endpoint.name)
|
|
157
163
|
: undefined) ??
|
|
158
164
|
(await this.registry.resolve(selection.model, {
|
|
159
165
|
...(protocol === "openai-embeddings" ? { modelClass: ModelClass.Embedding } : {}),
|
|
@@ -354,4 +360,4 @@ function logResponse(upstreamProtocol, model, response) {
|
|
|
354
360
|
else
|
|
355
361
|
logger.warn("upstream request failed", details);
|
|
356
362
|
}
|
|
357
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FJakIsTUFBTSx5QkFBeUIsQ0FBQztBQVVqQyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLGtCQUFrQixFQUNsQiwrQkFBK0IsRUFDL0IseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMsK0JBQStCLEVBQy9CLGtDQUFrQyxFQUNsQywrQkFBK0IsRUFDL0IsMEJBQTBCLEVBQzFCLDZCQUE2QixFQUM3QixpQkFBaUIsRUFDakIsb0JBQW9CLEdBQ3JCLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQTRCLE1BQU0sdUJBQXVCLENBQUM7QUFDbEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUYsT0FBTyxFQUNMLHVCQUF1QixHQUd4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pGLE9BQU8sRUFDTCxnQkFBZ0IsR0FHakIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxP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QUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLGdCQUFnQjtLQUNqQixDQUFDO0lBQ0YsSUFBSSxRQUFRLENBQUMsRUFBRTtRQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7O1FBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvdG9jb2wtaW5kZXBlbmRlbnQgZ2F0ZXdheSBzZXJ2aWNlIHVzZWQgYnkgcGx1Z2luIGFuZCBzdGFuZGFsb25lIHJvdXRlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIE1vZGVsQ2xhc3NTY2hlbWEsXG4gIHR5cGUgTW9kZWxTb3VyY2UsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgdHlwZSBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NUeXBlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWlEZWNpZGVPYnNlcnZhdGlvbixcbiAgQ2xpZW50UHJvdG9jb2wsXG4gIEdhdGV3YXlSb3V0ZSxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsTGlzdFJlc3BvbnNlLFxuICBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuICBTbWFydFJvdXRlck1vZGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQge1xuICBBSV9ERUNJREVfQ09ORklERU5DRV9IRUFERVIsXG4gIEFJX0RFQ0lERV9NT0RFTF9JRCxcbiAgQUlfREVDSURFX1NFTEVDVEVEX01PREVMX0hFQURFUixcbiAgQUlfREVDSURFX1NUUkFURUdZX0hFQURFUixcbiAgQWlEZWNpZGVTdHJhdGVneVNjaGVtYSxcbiAgTU9ERUxfR0FURVdBWV9ERUZBVUxUUyxcbiAgU01BUlRfUk9VVEVSX0hBUk5FU1NfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfTU9ERUxfSUQsXG4gIFNNQVJUX1JPVVRFUl9QUk9GSUxFUl9TVEFUVVNfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfUk9VVEVfTU9ERUxfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU0VMRUNURURfTU9ERUxfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU0VSVkVEX1RJRVJfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU09VUkNFX0hFQURFUixcbiAgU01BUlRfUk9VVEVSX1RBU0tfVElFUl9IRUFERVIsXG4gIGlzQWlEZWNpZGVNb2RlbElkLFxuICBpc1NtYXJ0Um91dGVyTW9kZWxJZCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuaW1wb3J0IHsgQWlEZWNpZGVSb3V0ZXJTZXJ2aWNlIH0gZnJvbSBcIi4vYWktZGVjaWRlLnRzXCI7XG5pbXBvcnQgeyBsaXN0TW9kZWxzUGF5bG9hZCB9IGZyb20gXCIuL21vZGVscy50c1wiO1xuaW1wb3J0IHsgUHJvZmlsZUZhbGxiYWNrLCB0eXBlIE1vZGVsR2F0ZXdheVByb2ZpbGUgfSBmcm9tIFwiLi9wcm9maWxlLWZhbGxiYWNrLnRzXCI7XG5pbXBvcnQgeyBhZGFwdEluZmVyZW5jZVJlYXNvbmluZywgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5IH0gZnJvbSBcIi4vcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5pbXBvcnQge1xuICBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnlPcHRpb25zLFxufSBmcm9tIFwiLi9yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgaXNDb2RleE9yaWdpbmF0b3IsIHJlcXVlc3RlZEZlYXR1cmVzLCByZXNvbHZlUm91dGUgfSBmcm9tIFwiLi9yb3V0ZXIudHNcIjtcbmltcG9ydCB7XG4gIFNtYXJ0TW9kZWxSb3V0ZXIsXG4gIHR5cGUgU21hcnRSb3V0ZXJTZXJ2aWNlLFxuICB0eXBlIFNtYXJ0Um91dGVyU3RvcmUsXG59IGZyb20gXCIuL3NtYXJ0LXJvdXRlci50c1wiO1xuaW1wb3J0IHsgdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3QgfSBmcm9tIFwiLi90cmFuc2xhdGlvbi50c1wiO1xuaW1wb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBnYXRld2F5UmVzcG9uc2VIZWFkZXJzIH0gZnJvbSBcIi4vdHJhbnNwb3J0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheVwiKTtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUlOID0gMDtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUFYID0gMjtcblxuLyoqIE1vZGVsIGdhdGV3YXkgcnVudGltZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEdhdGV3YXlPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2FjaGVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydFJvdXRlck1vZGU7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0PzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclByb2JlUmVmcmVzaEludGVydmFsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyUHJvYmVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXJSb3V0ZVR0bFNlY29uZHM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyVGltZW91dE1zPzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclNlcnZpY2U/OiBTbWFydFJvdXRlclNlcnZpY2U7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyU3RvcmU/OiBTbWFydFJvdXRlclN0b3JlO1xuICByZWFkb25seSBhaURlY2lkZVNlcnZpY2U/OiBBaURlY2lkZVJvdXRlclNlcnZpY2U7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG4gIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGU7XG4gIHJlYWRvbmx5IHByZWZlclN5c3RlbU1vZGVscz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHByb2ZpbGVzPzogcmVhZG9ubHkgTW9kZWxHYXRld2F5UHJvZmlsZVtdO1xufVxuXG4vKiogRXJyb3IgY2FycnlpbmcgYW4gSFRUUCBzdGF0dXMgYW5kIHByb3RvY29sLXNhZmUgbWVzc2FnZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1vZGVsR2F0ZXdheUVycm9yXCI7XG4gIH1cbn1cblxuLyoqIEFwcEtpdC1zY29wZWQgbW9kZWwgZ2F0ZXdheSB3aXRoIGR5bmFtaWMgbW9kZWwgZGlzY292ZXJ5IGFuZCBzdHJlYW1pbmcgaW5mZXJlbmNlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnk6IE1vZGVsUmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydE1vZGVsUm91dGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGFpRGVjaWRlOiBBaURlY2lkZVJvdXRlclNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgc21hcnRSb3V0ZXJNb2RlOiBTbWFydFJvdXRlck1vZGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZWZlclN5c3RlbU1vZGVsczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9maWxlRmFsbGJhY2s/OiBQcm9maWxlRmFsbGJhY2s7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJpbWFyeVByb2ZpbGU/OiBNb2RlbEdhdGV3YXlQcm9maWxlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vZGVsR2F0ZXdheU9wdGlvbnMgPSB7fSwgcmVnaXN0cnk/OiBNb2RlbFJlZ2lzdHJ5KSB7XG4gICAgdGhpcy5wcmltYXJ5UHJvZmlsZSA9IG9wdGlvbnMucHJvZmlsZXM/LlswXTtcbiAgICB0aGlzLnByb2ZpbGVGYWxsYmFjayA9XG4gICAgICBvcHRpb25zLnByb2ZpbGVzICYmIG9wdGlvbnMucHJvZmlsZXMubGVuZ3RoID4gMVxuICAgICAgICA/IG5ldyBQcm9maWxlRmFsbGJhY2sob3B0aW9ucy5wcm9maWxlcylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVnaXN0cnlPcHRpb25zOiBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgICAgIC4uLihvcHRpb25zLmNhY2hlVHRsTXMgIT09IHVuZGVmaW5lZCA/IHsgdHRsTXM6IG9wdGlvbnMuY2FjaGVUdGxNcyB9IDoge30pLFxuICAgICAgLi4uKG9wdGlvbnMub3ZlcnJpZGVzID8geyBvdmVycmlkZXM6IG9wdGlvbnMub3ZlcnJpZGVzIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgcHJlZmVyU3lzdGVtTW9kZWxzOiBvcHRpb25zLnByZWZlclN5c3RlbU1vZGVscyB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKHRoaXMucHJpbWFyeVByb2ZpbGUgPyB7IGNsaWVudDogdGhpcy5wcmltYXJ5UHJvZmlsZS5jbGllbnQgfSA6IHt9KSxcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeSA/PyBuZXcgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkocmVnaXN0cnlPcHRpb25zKTtcbiAgICB0aGlzLmFpRGVjaWRlID0gb3B0aW9ucy5haURlY2lkZVNlcnZpY2UgPz8gbmV3IEFpRGVjaWRlUm91dGVyU2VydmljZSgpO1xuICAgIHRoaXMuc21hcnRSb3V0ZXJNb2RlID0gb3B0aW9ucy5zbWFydFJvdXRlciA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyO1xuICAgIGlmICh0aGlzLnNtYXJ0Um91dGVyTW9kZSAhPT0gXCJmYWxzZVwiKSB7XG4gICAgICB0aGlzLnNtYXJ0Um91dGVyID0gbmV3IFNtYXJ0TW9kZWxSb3V0ZXIoXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZXh0VG9rZW5CdWRnZXQ6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0ID8/XG4gICAgICAgICAgICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0LFxuICAgICAgICAgIHByb2JlUmVmcmVzaEludGVydmFsTXM6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyUHJvYmVSZWZyZXNoSW50ZXJ2YWxNcyA/P1xuICAgICAgICAgICAgTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5zbWFydFJvdXRlclByb2JlUmVmcmVzaEludGVydmFsTXMsXG4gICAgICAgICAgcHJvYmVUdGxNczogb3B0aW9ucy5zbWFydFJvdXRlclByb2JlVHRsTXMgPz8gTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5zbWFydFJvdXRlclByb2JlVHRsTXMsXG4gICAgICAgICAgcm91dGVUdGxTZWNvbmRzOlxuICAgICAgICAgICAgb3B0aW9ucy5zbWFydFJvdXRlclJvdXRlVHRsU2Vjb25kcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzLFxuICAgICAgICAgIHJvdXRlck5hbWU6IFwidGFza192M1wiLFxuICAgICAgICAgIHRpbWVvdXRNczogb3B0aW9ucy5zbWFydFJvdXRlclRpbWVvdXRNcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyVGltZW91dE1zLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyU2VydmljZSxcbiAgICAgICAgb3B0aW9ucy5zbWFydFJvdXRlclN0b3JlLFxuICAgICAgICB0aGlzLnByaW1hcnlQcm9maWxlPy5jbGllbnQsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLm1vZGVsID0gb3B0aW9ucy5tb2RlbDtcbiAgICB0aGlzLm1vZGVsQ2xhc3MgPSBvcHRpb25zLm1vZGVsQ2xhc3M7XG4gICAgdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPVxuICAgICAgb3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPz8gTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5wcmVmZXJTeXN0ZW1Nb2RlbHM7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBsaXZlIE9wZW5BSSBtb2RlbCBsaXN0LCBpbmNsdWRpbmcgQ29kZXggbWV0YWRhdGEgd2hlbiByZXF1ZXN0ZWQuICovXG4gIGFzeW5jIG1vZGVscyhcbiAgICBvcmlnaW5hdG9yPzogc3RyaW5nLFxuICAgIHNlYXJjaD86IHN0cmluZyxcbiAgICBtb2RlbFNvdXJjZTogTW9kZWxTb3VyY2UgfCBcImFsbFwiID0gXCJmb3VuZGF0aW9uXCIsXG4gICAgaW5jbHVkZU1ldGFkYXRhID0gZmFsc2UsXG4gICk6IFByb21pc2U8TW9kZWxMaXN0UmVzcG9uc2U+IHtcbiAgICBjb25zdCBjb2RleCA9IGlzQ29kZXhPcmlnaW5hdG9yKG9yaWdpbmF0b3IpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RpbmcgbW9kZWxzXCIsIHsgY29kZXgsIHNlYXJjaCB9KTtcbiAgICBjb25zdCBxdWVyeSA9IHNlYXJjaD8udHJpbSgpO1xuICAgIGNvbnN0IHNtYXJ0Um91dGVyU2VhcmNoID1cbiAgICAgIHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgU01BUlRfUk9VVEVSX01PREVMX0lELmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpO1xuICAgIGNvbnN0IGFpRGVjaWRlU2VhcmNoID0gcXVlcnkgIT09IHVuZGVmaW5lZCAmJiBBSV9ERUNJREVfTU9ERUxfSUQuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSk7XG4gICAgY29uc3QgZGlzY292ZXJlZCA9XG4gICAgICBxdWVyeSAmJiAhc21hcnRSb3V0ZXJTZWFyY2ggJiYgIWFpRGVjaWRlU2VhcmNoXG4gICAgICAgID8gYXdhaXQgdGhpcy5yZWdpc3RyeS5zZWFyY2gocXVlcnkpXG4gICAgICAgIDogYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9XG4gICAgICBtb2RlbFNvdXJjZSA9PT0gXCJhbGxcIlxuICAgICAgICA/IGRpc2NvdmVyZWRcbiAgICAgICAgOiBkaXNjb3ZlcmVkLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQ/Lm1vZGVsU291cmNlID09PSBtb2RlbFNvdXJjZSk7XG4gICAgY29uc3Qgc21hcnRSb3V0ZXJUYXJnZXRzID1cbiAgICAgIHRoaXMuc21hcnRSb3V0ZXJNb2RlID09PSBcInRydWVcIiAmJiBxdWVyeSAmJiAhc21hcnRSb3V0ZXJTZWFyY2hcbiAgICAgICAgPyAoYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCkpLmZpbHRlcihcbiAgICAgICAgICAgICh0YXJnZXQpID0+IG1vZGVsU291cmNlID09PSBcImFsbFwiIHx8IHRhcmdldC5lbmRwb2ludD8ubW9kZWxTb3VyY2UgPT09IG1vZGVsU291cmNlLFxuICAgICAgICAgIClcbiAgICAgICAgOiB0YXJnZXRzO1xuICAgIGNvbnN0IHNob3VsZFByb2JlU21hcnRSb3V0ZXIgPVxuICAgICAgQm9vbGVhbih0aGlzLnNtYXJ0Um91dGVyKSAmJiAodGhpcy5zbWFydFJvdXRlck1vZGUgPT09IFwidHJ1ZVwiIHx8ICFxdWVyeSB8fCBzbWFydFJvdXRlclNlYXJjaCk7XG4gICAgY29uc3Qgc21hcnRSb3V0ZXJFbmFibGVkID1cbiAgICAgIHNob3VsZFByb2JlU21hcnRSb3V0ZXIgJiYgKGF3YWl0IHRoaXMuc21hcnRSb3V0ZXIhLmlzRW5hYmxlZChzbWFydFJvdXRlclRhcmdldHMpKTtcbiAgICBjb25zdCBhaURlY2lkZUVuYWJsZWQgPVxuICAgICAgKCFxdWVyeSB8fCBhaURlY2lkZVNlYXJjaCkgJiZcbiAgICAgIChhd2FpdCB0aGlzLmFpRGVjaWRlLmlzRW5hYmxlZChcbiAgICAgICAgdGFyZ2V0c1xuICAgICAgICAgIC5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LmVuZHBvaW50KVxuICAgICAgICAgIC5maWx0ZXIoKGVuZHBvaW50KTogZW5kcG9pbnQgaXMgU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9PiBlbmRwb2ludCAhPT0gdW5kZWZpbmVkKSxcbiAgICAgICAgdGhpcy5wcmltYXJ5UHJvZmlsZT8uY2xpZW50LFxuICAgICAgKSk7XG4gICAgaWYgKHRoaXMuc21hcnRSb3V0ZXJNb2RlID09PSBcInRydWVcIiAmJiAhc21hcnRSb3V0ZXJFbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoXG4gICAgICAgIDUwMyxcbiAgICAgICAgXCJEYXRhYnJpY2tzIFNtYXJ0IFJvdXRlciBpcyByZXF1aXJlZCBidXQgdW5hdmFpbGFibGUgZm9yIHRoZSBhY3RpdmUgd29ya3NwYWNlIGlkZW50aXR5XCIsXG4gICAgICApO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWQgbW9kZWxzXCIsIHsgY29kZXgsIGNvdW50OiB0YXJnZXRzLmxlbmd0aCB9KTtcbiAgICBjb25zdCBwYXlsb2FkID0gbGlzdE1vZGVsc1BheWxvYWQoXG4gICAgICB0YXJnZXRzLFxuICAgICAgY29kZXgsXG4gICAgICBxdWVyeSAhPT0gdW5kZWZpbmVkICYmIHF1ZXJ5Lmxlbmd0aCA+IDAsXG4gICAgICB0aGlzLnByZWZlclN5c3RlbU1vZGVscyxcbiAgICAgIHNtYXJ0Um91dGVyRW5hYmxlZCAmJiAoIXF1ZXJ5IHx8IHNtYXJ0Um91dGVyU2VhcmNoKSxcbiAgICAgIGFpRGVjaWRlRW5hYmxlZCAmJiAoIXF1ZXJ5IHx8IGFpRGVjaWRlU2VhcmNoKSxcbiAgICAgIGluY2x1ZGVNZXRhZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBzbWFydFJvdXRlclNlYXJjaCB8fCBhaURlY2lkZVNlYXJjaFxuICAgICAgPyBvbmx5VmlydHVhbE1vZGVsKHBheWxvYWQsIHNtYXJ0Um91dGVyU2VhcmNoID8gU01BUlRfUk9VVEVSX01PREVMX0lEIDogQUlfREVDSURFX01PREVMX0lEKVxuICAgICAgOiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgYW5kIGV4ZWN1dGUgb25lIGluZmVyZW5jZSByZXF1ZXN0LiAqL1xuICBhc3luYyBpbmZlcmVuY2UoXG4gICAgcHJvdG9jb2w6IENsaWVudFByb3RvY29sLFxuICAgIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICBoZWFkZXJzOiBIZWFkZXJzLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRCb2R5ID0gc2FuaXRpemVJbmZlcmVuY2VCb2R5KGJvZHkpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdhdGV3YXlNb2RlbFNlbGVjdGlvbihcbiAgICAgIHNhbml0aXplZEJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAge1xuICAgICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5tb2RlbENsYXNzLFxuICAgICAgfSxcbiAgICAgIHByb3RvY29sLFxuICAgICk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2aW5nIHJlcXVlc3RcIiwge1xuICAgICAgc21hcnRSb3V0ZXI6IHNlbGVjdGlvbi5zbWFydFJvdXRlciA9PT0gdHJ1ZSxcbiAgICAgIGFpRGVjaWRlOiBzZWxlY3Rpb24uYWlEZWNpZGUgPT09IHRydWUsXG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBtb2RlbDogc2VsZWN0aW9uLm1vZGVsLFxuICAgICAgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MsXG4gICAgICBvcmlnaW5hdG9yOiBoZWFkZXJzLmdldChcIm9yaWdpbmF0b3JcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiBzYW5pdGl6ZWRCb2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHJlcXVlc3RlZEZlYXR1cmVzKHNhbml0aXplZEJvZHkpO1xuICAgIGlmICgoc2VsZWN0aW9uLnNtYXJ0Um91dGVyIHx8IHNlbGVjdGlvbi5haURlY2lkZSkgJiYgcHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKFxuICAgICAgICA0MDAsXG4gICAgICAgIFwiVmlydHVhbCBtb2RlbCByb3V0ZXJzIGFyZSBhdmFpbGFibGUgb25seSBmb3IgY2hhdCByZXF1ZXN0c1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc21hcnRSb3V0ZXIgPVxuICAgICAgc2VsZWN0aW9uLnNtYXJ0Um91dGVyICYmIHRoaXMuc21hcnRSb3V0ZXJcbiAgICAgICAgPyBhd2FpdCB0aGlzLnNtYXJ0Um91dGVyLnJlc29sdmUoe1xuICAgICAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sIGFzIEV4Y2x1ZGU8Q2xpZW50UHJvdG9jb2wsIFwib3BlbmFpLWVtYmVkZGluZ3NcIj4sXG4gICAgICAgICAgICBib2R5OiBzYW5pdGl6ZWRCb2R5LFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGZlYXR1cmVzLFxuICAgICAgICAgICAgdGFyZ2V0czogYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCksXG4gICAgICAgICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHM6IHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChzZWxlY3Rpb24uc21hcnRSb3V0ZXIgJiYgIXNtYXJ0Um91dGVyKSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDA0LCBcIkRhdGFicmlja3MgU21hcnQgUm91dGVyIGlzIGRpc2FibGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCByZWdpc3RyeVRhcmdldHMgPSBzbWFydFJvdXRlciA/IHVuZGVmaW5lZCA6IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpO1xuICAgIGNvbnN0IGFpRGVjaWRlID0gc2VsZWN0aW9uLmFpRGVjaWRlXG4gICAgICA/IGF3YWl0IHRoaXMuYWlEZWNpZGUuc2VsZWN0KFxuICAgICAgICAgIHNhbml0aXplZEJvZHksXG4gICAgICAgICAgKHJlZ2lzdHJ5VGFyZ2V0cyA/PyBbXSlcbiAgICAgICAgICAgIC5tYXAoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmVuZHBvaW50KVxuICAgICAgICAgICAgLmZpbHRlcigoZW5kcG9pbnQpOiBlbmRwb2ludCBpcyBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0+IGVuZHBvaW50ICE9PSB1bmRlZmluZWQpLFxuICAgICAgICAgIHRoaXMucHJpbWFyeVByb2ZpbGU/LmNsaWVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdHJhdGVneTogYWlEZWNpZGVTdHJhdGVneShoZWFkZXJzKSxcbiAgICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgICAgLi4uKGZlYXR1cmVzLnRvb2xzID8geyByZXF1aXJlc1Rvb2xzOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihmZWF0dXJlcy5zdHJ1Y3R1cmVkT3V0cHV0ID8geyByZXF1aXJlc1N0cnVjdHVyZWRPdXRwdXQ6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgIHNtYXJ0Um91dGVyPy50YXJnZXQgPz9cbiAgICAgIChhaURlY2lkZVxuICAgICAgICA/IHJlZ2lzdHJ5VGFyZ2V0cz8uZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IGFpRGVjaWRlLmVuZHBvaW50Lm5hbWUpXG4gICAgICAgIDogdW5kZWZpbmVkKSA/P1xuICAgICAgKGF3YWl0IHRoaXMucmVnaXN0cnkucmVzb2x2ZShzZWxlY3Rpb24ubW9kZWwsIHtcbiAgICAgICAgLi4uKHByb3RvY29sID09PSBcIm9wZW5haS1lbWJlZGRpbmdzXCIgPyB7IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH0gOiB7fSksXG4gICAgICAgIC4uLihzZWxlY3Rpb24ubW9kZWxDbGFzcyA/IHsgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAgICAgLi4uKGZlYXR1cmVzLnRvb2xzID8geyByZXF1aXJlc1Rvb2xzOiB0cnVlIH0gOiB7fSksXG4gICAgICB9KSk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcihcbiAgICAgICAgNDA0LFxuICAgICAgICBzZWxlY3Rpb24ubW9kZWxcbiAgICAgICAgICA/IGBNb2RlbCBub3QgZm91bmQ6ICR7c2VsZWN0aW9uLm1vZGVsfWBcbiAgICAgICAgICA6IFwiTm8gbW9kZWwgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIGNsYXNzXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByb3V0ZSA9IHJlc29sdmVSb3V0ZSh7XG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICAuLi4oIXNtYXJ0Um91dGVyICYmICFhaURlY2lkZSAmJiBzZWxlY3Rpb24ubW9kZWwgPyB7IHJlcXVlc3RlZE1vZGVsOiBzZWxlY3Rpb24ubW9kZWwgfSA6IHt9KSxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHM6IHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgZmVhdHVyZXMsXG4gICAgICB0YXJnZXQsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicm91dGVkXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICB1cHN0cmVhbVByb3RvY29sOiByb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGVyYXR1cmVCb2R5ID0gYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZShcbiAgICAgIHRhcmdldC5lbmRwb2ludCA/PyB0YXJnZXQuaWQsXG4gICAgICBzbWFydFJvdXRlcj8uYm9keSA/PyBzYW5pdGl6ZWRCb2R5LFxuICAgICk7XG4gICAgY29uc3QgYWRhcHRlZCA9IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nKHRhcmdldC5pZCwgdGVtcGVyYXR1cmVCb2R5KTtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIGFkYXB0ZWQuYm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICBjb25zdCByZXRyeUJvZHkgPSBhd2FpdCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkoe1xuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIGJvZHk6IHRlbXBlcmF0dXJlQm9keSxcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgcHJldmlvdXNXaXJlRWZmb3J0OiBhZGFwdGVkLndpcmVFZmZvcnQsXG4gICAgfSk7XG4gICAgaWYgKHJldHJ5Qm9keSkge1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3J3YXJkKHJvdXRlLCByZXRyeUJvZHksIGhlYWRlcnMsIHNpZ25hbCk7XG4gICAgfVxuXG4gICAgbG9nUmVzcG9uc2Uocm91dGUudXBzdHJlYW1Qcm90b2NvbCwgdGFyZ2V0LmlkLCByZXNwb25zZSk7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgICBpZiAoc21hcnRSb3V0ZXIpIHtcbiAgICAgICAgYXBwbHlTbWFydFJvdXRlck9ic2VydmF0aW9uSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzLCBzbWFydFJvdXRlci5vYnNlcnZhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoYWlEZWNpZGUpIGFwcGx5QWlEZWNpZGVPYnNlcnZhdGlvbkhlYWRlcnMocmVzcG9uc2UuaGVhZGVycywgYWlEZWNpZGUub2JzZXJ2YXRpb24pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgICBjb25zdCBmb3J3YXJkZWQgPSBnYXRld2F5UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuICAgIGZvcndhcmRlZC5zZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiLCByb3V0ZS51cHN0cmVhbVByb3RvY29sKTtcbiAgICBpZiAoc21hcnRSb3V0ZXIpIGFwcGx5U21hcnRSb3V0ZXJPYnNlcnZhdGlvbkhlYWRlcnMoZm9yd2FyZGVkLCBzbWFydFJvdXRlci5vYnNlcnZhdGlvbik7XG4gICAgaWYgKGFpRGVjaWRlKSBhcHBseUFpRGVjaWRlT2JzZXJ2YXRpb25IZWFkZXJzKGZvcndhcmRlZCwgYWlEZWNpZGUub2JzZXJ2YXRpb24pO1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgaGVhZGVyczogZm9yd2FyZGVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZnJlc2ggdGhlIGFjdGl2ZSBwcmluY2lwYWwncyBtb2RlbCBjYXRhbG9ndWUuICovXG4gIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVmcmVzaGluZyBtb2RlbCBjYXRhbG9ndWVcIik7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmb3J3YXJkKFxuICAgIHJvdXRlOiBHYXRld2F5Um91dGUsXG4gICAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgIGhlYWRlcnM6IEhlYWRlcnMsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGlmIChyb3V0ZS51cHN0cmVhbVByb3RvY29sID09PSBcImFpLXNka1wiKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3Qocm91dGUsIGJvZHksIHNpZ25hbCwge1xuICAgICAgICAuLi4odGhpcy5wcmltYXJ5UHJvZmlsZSA/IHsgY2xpZW50OiB0aGlzLnByaW1hcnlQcm9maWxlLmNsaWVudCB9IDoge30pLFxuICAgICAgICAuLi4odGhpcy5wcm9maWxlRmFsbGJhY2tcbiAgICAgICAgICA/IHsgZmV0Y2g6IHRoaXMucHJvZmlsZUZhbGxiYWNrLmNyZWF0ZUZldGNoKHJvdXRlLnVwc3RyZWFtTW9kZWwpIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9maWxlRmFsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2ZpbGVGYWxsYmFjay5yZXF1ZXN0KHJvdXRlLnVwc3RyZWFtTW9kZWwsIHNpZ25hbCwgKHsgY2xpZW50IH0pID0+XG4gICAgICAgIGZldGNoRGF0YWJyaWNrcyh7IHJvdXRlLCBib2R5LCBoZWFkZXJzLCBzaWduYWwsIGNsaWVudCB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmZXRjaERhdGFicmlja3Moe1xuICAgICAgcm91dGUsXG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIHNpZ25hbCxcbiAgICAgIC4uLih0aGlzLnByaW1hcnlQcm9maWxlID8geyBjbGllbnQ6IHRoaXMucHJpbWFyeVByb2ZpbGUuY2xpZW50IH0gOiB7fSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBudWxsIHRlbXBlcmF0dXJlIGFuZCByZWplY3QgZXhwbGljaXQgbm9ubnVtZXJpYyB2YWx1ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVJbmZlcmVuY2VCb2R5KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSkgcmV0dXJuIGJvZHk7XG4gIGlmIChib2R5LnRlbXBlcmF0dXJlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5LnRlbXBlcmF0dXJlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNGaW5pdGUoYm9keS50ZW1wZXJhdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwidGVtcGVyYXR1cmUgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIsIG51bGwsIG9yIG9taXR0ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBib2R5O1xuICB9XG4gIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uYm9keSB9O1xuICBkZWxldGUgc2FuaXRpemVkLnRlbXBlcmF0dXJlO1xuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKiogQXBwbHkgcHVibGlzaGVkIERhdGFicmlja3MgdGVtcGVyYXR1cmUgc3VwcG9ydCBhbmQgcmFuZ2UgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYXB0SW5mZXJlbmNlVGVtcGVyYXR1cmUoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSB8fCB0eXBlb2YgYm9keS50ZW1wZXJhdHVyZSAhPT0gXCJudW1iZXJcIikgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IHN1cHBvcnRlZCA9IG1vZGVsVGVtcGVyYXR1cmVTdXBwb3J0Rm9yKG1vZGVsKTtcbiAgaWYgKHN1cHBvcnRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYm9keTtcbiAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICBjb25zdCBhZGFwdGVkID0geyAuLi5ib2R5IH07XG4gICAgZGVsZXRlIGFkYXB0ZWQudGVtcGVyYXR1cmU7XG4gICAgcmV0dXJuIGFkYXB0ZWQ7XG4gIH1cbiAgY29uc3QgdGVtcGVyYXR1cmUgPSBNYXRoLm1pbihcbiAgICBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01BWCxcbiAgICBNYXRoLm1heChEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01JTiwgYm9keS50ZW1wZXJhdHVyZSksXG4gICk7XG4gIHJldHVybiB0ZW1wZXJhdHVyZSA9PT0gYm9keS50ZW1wZXJhdHVyZSA/IGJvZHkgOiB7IC4uLmJvZHksIHRlbXBlcmF0dXJlIH07XG59XG5cbi8qKiBSZXNvbHZlIHJlcXVlc3QsIGhlYWRlciwgY29uZmlndXJlZCwgYW5kIHByb3RvY29sIG1vZGVsLXNlbGVjdGlvbiBpbnB1dHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0ZXdheU1vZGVsU2VsZWN0aW9uKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIGRlZmF1bHRzOiB7IHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nOyByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGUgfSA9IHt9LFxuICBwcm90b2NvbD86IENsaWVudFByb3RvY29sLFxuKToge1xuICByZWFkb25seSBzbWFydFJvdXRlcj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFpRGVjaWRlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbn0ge1xuICBjb25zdCBtb2RlbCA9IHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiICYmIGJvZHkubW9kZWwudHJpbSgpID8gYm9keS5tb2RlbC50cmltKCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnMuZ2V0KFwieC1kYngtdG9vbHMtbW9kZWwtY2xhc3NcIik/LnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkQ2xhc3MgPSBoZWFkZXIgPyBNb2RlbENsYXNzU2NoZW1hLnNhZmVQYXJzZShoZWFkZXIpIDogdW5kZWZpbmVkO1xuICBpZiAocGFyc2VkQ2xhc3MgJiYgIXBhcnNlZENsYXNzLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBgSW52YWxpZCBtb2RlbCBjbGFzczogJHtoZWFkZXJ9YCk7XG4gIH1cbiAgaWYgKG1vZGVsICYmIHBhcnNlZENsYXNzPy5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBhbmQgbW9kZWwgY2xhc3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKTtcbiAgfVxuICBpZiAobW9kZWwpIHtcbiAgICBpZiAoaXNTbWFydFJvdXRlck1vZGVsSWQobW9kZWwpKSByZXR1cm4geyBzbWFydFJvdXRlcjogdHJ1ZSB9O1xuICAgIGlmIChpc0FpRGVjaWRlTW9kZWxJZChtb2RlbCkpIHJldHVybiB7IGFpRGVjaWRlOiB0cnVlIH07XG4gICAgcmV0dXJuIHsgbW9kZWwgfTtcbiAgfVxuICBpZiAocGFyc2VkQ2xhc3M/LmRhdGEpIHJldHVybiB7IG1vZGVsQ2xhc3M6IHBhcnNlZENsYXNzLmRhdGEgfTtcbiAgaWYgKGRlZmF1bHRzLm1vZGVsKSB7XG4gICAgaWYgKGlzU21hcnRSb3V0ZXJNb2RlbElkKGRlZmF1bHRzLm1vZGVsKSkgcmV0dXJuIHsgc21hcnRSb3V0ZXI6IHRydWUgfTtcbiAgICBpZiAoaXNBaURlY2lkZU1vZGVsSWQoZGVmYXVsdHMubW9kZWwpKSByZXR1cm4geyBhaURlY2lkZTogdHJ1ZSB9O1xuICAgIHJldHVybiB7IG1vZGVsOiBkZWZhdWx0cy5tb2RlbCB9O1xuICB9XG4gIGlmIChkZWZhdWx0cy5tb2RlbENsYXNzKSByZXR1cm4geyBtb2RlbENsYXNzOiBkZWZhdWx0cy5tb2RlbENsYXNzIH07XG4gIGlmIChwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiKSByZXR1cm4geyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9O1xuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIGFwcGx5U21hcnRSb3V0ZXJPYnNlcnZhdGlvbkhlYWRlcnMoXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIG9ic2VydmF0aW9uOiBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuKTogdm9pZCB7XG4gIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsIG9ic2VydmF0aW9uLnNlbGVjdGVkTW9kZWwpO1xuICBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfUk9VVEVfTU9ERUxfSEVBREVSLCBvYnNlcnZhdGlvbi5yb3V0ZU1vZGVsKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX0hBUk5FU1NfSEVBREVSLCBvYnNlcnZhdGlvbi5oYXJuZXNzKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1NPVVJDRV9IRUFERVIsIG9ic2VydmF0aW9uLnNvdXJjZSk7XG4gIGNvbnN0IHRhc2tUaWVyID0gc3RyaW5nUGFyYW0ob2JzZXJ2YXRpb24ucGFyYW1zLCBcInRhc2tfdGllclwiKTtcbiAgY29uc3Qgc2VydmVkVGllciA9IHN0cmluZ1BhcmFtKG9ic2VydmF0aW9uLnBhcmFtcywgXCJzZXJ2ZWRfdGllclwiKTtcbiAgY29uc3QgcHJvZmlsZXJTdGF0dXMgPSBzdHJpbmdQYXJhbShvYnNlcnZhdGlvbi5wYXJhbXMsIFwicHJvZmlsZXJfc3RhdHVzXCIpO1xuICBpZiAodGFza1RpZXIpIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9UQVNLX1RJRVJfSEVBREVSLCB0YXNrVGllcik7XG4gIGlmIChzZXJ2ZWRUaWVyKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfU0VSVkVEX1RJRVJfSEVBREVSLCBzZXJ2ZWRUaWVyKTtcbiAgaWYgKHByb2ZpbGVyU3RhdHVzKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfUFJPRklMRVJfU1RBVFVTX0hFQURFUiwgcHJvZmlsZXJTdGF0dXMpO1xufVxuXG5mdW5jdGlvbiBhcHBseUFpRGVjaWRlT2JzZXJ2YXRpb25IZWFkZXJzKGhlYWRlcnM6IEhlYWRlcnMsIG9ic2VydmF0aW9uOiBBaURlY2lkZU9ic2VydmF0aW9uKTogdm9pZCB7XG4gIGhlYWRlcnMuc2V0KEFJX0RFQ0lERV9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsIG9ic2VydmF0aW9uLnNlbGVjdGVkTW9kZWwpO1xuICBoZWFkZXJzLnNldChBSV9ERUNJREVfU1RSQVRFR1lfSEVBREVSLCBvYnNlcnZhdGlvbi5zdHJhdGVneSk7XG4gIGlmIChvYnNlcnZhdGlvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBoZWFkZXJzLnNldChBSV9ERUNJREVfQ09ORklERU5DRV9IRUFERVIsIFN0cmluZyhvYnNlcnZhdGlvbi5jb25maWRlbmNlKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWlEZWNpZGVTdHJhdGVneShoZWFkZXJzOiBIZWFkZXJzKSB7XG4gIGNvbnN0IHZhbHVlID0gaGVhZGVycy5nZXQoQUlfREVDSURFX1NUUkFURUdZX0hFQURFUik/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gdmFsdWUgPyBBaURlY2lkZVN0cmF0ZWd5U2NoZW1hLnBhcnNlKHZhbHVlKSA6IFwiYmFsYW5jZWRcIjtcbn1cblxuZnVuY3Rpb24gc3RyaW5nUGFyYW0oXG4gIHBhcmFtczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zPy5ba2V5XTtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBvbmx5VmlydHVhbE1vZGVsKHBheWxvYWQ6IE1vZGVsTGlzdFJlc3BvbnNlLCBtb2RlbElkOiBzdHJpbmcpOiBNb2RlbExpc3RSZXNwb25zZSB7XG4gIGlmIChcIm1vZGVsc1wiIGluIHBheWxvYWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiBwYXlsb2FkLm1vZGVscy5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5zbHVnLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoYC8ke21vZGVsSWR9YCkpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBvYmplY3Q6IFwibGlzdFwiLFxuICAgIGRhdGE6IHBheWxvYWQuZGF0YS5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5pZCA9PT0gbW9kZWxJZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGxvZ1Jlc3BvbnNlKHVwc3RyZWFtUHJvdG9jb2w6IHN0cmluZywgbW9kZWw6IHN0cmluZywgcmVzcG9uc2U6IFJlc3BvbnNlKTogdm9pZCB7XG4gIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgY29udGVudFR5cGU6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpLFxuICAgIG1vZGVsLFxuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIHVwc3RyZWFtUHJvdG9jb2wsXG4gIH07XG4gIGlmIChyZXNwb25zZS5vaykgbG9nZ2VyLmRlYnVnKFwidXBzdHJlYW0gcmVzcG9uc2VcIiwgZGV0YWlscyk7XG4gIGVsc2UgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSByZXF1ZXN0IGZhaWxlZFwiLCBkZXRhaWxzKTtcbn1cbiJdfQ==
|
|
363
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FJakIsTUFBTSx5QkFBeUIsQ0FBQztBQVVqQyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLGtCQUFrQixFQUNsQiwrQkFBK0IsRUFDL0IseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMsK0JBQStCLEVBQy9CLGtDQUFrQyxFQUNsQywrQkFBK0IsRUFDL0IsMEJBQTBCLEVBQzFCLDZCQUE2QixFQUM3QixpQkFBaUIsRUFDakIsb0JBQW9CLEdBQ3JCLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQTRCLE1BQU0sdUJBQXVCLENBQUM7QUFDbEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUYsT0FBTyxFQUNMLHVCQUF1QixHQUd4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlELE9BQU8sRUFDTCxnQkFBZ0IsR0FHakIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFB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RUFBRSxLQUFhLEVBQUUsUUFBa0I7SUFDOUUsTUFBTSxPQUFPLEdBQUc7UUFDZCxXQUFXLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1FBQ2pELEtBQUs7UUFDTCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDdkIsZ0JBQWdCO0tBQ2pCLENBQUM7SUFDRixJQUFJLFFBQVEsQ0FBQyxFQUFFO1FBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQzs7UUFDdkQsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcm90b2NvbC1pbmRlcGVuZGVudCBnYXRld2F5IHNlcnZpY2UgdXNlZCBieSBwbHVnaW4gYW5kIHN0YW5kYWxvbmUgcm91dGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBtb2RlbFRlbXBlcmF0dXJlU3VwcG9ydEZvciB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTW9kZWxDbGFzcyxcbiAgTW9kZWxDbGFzc1NjaGVtYSxcbiAgdHlwZSBNb2RlbFNvdXJjZSxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICB0eXBlIE1vZGVsQ2xhc3MgYXMgTW9kZWxDbGFzc1R5cGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuICBBaURlY2lkZU9ic2VydmF0aW9uLFxuICBDbGllbnRQcm90b2NvbCxcbiAgR2F0ZXdheVJvdXRlLFxuICBNb2RlbENhcGFiaWxpdHlPdmVycmlkZSxcbiAgTW9kZWxMaXN0UmVzcG9uc2UsXG4gIFNtYXJ0Um91dGVyT2JzZXJ2YXRpb24sXG4gIFNtYXJ0Um91dGVyTW9kZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcbmltcG9ydCB7XG4gIEFJX0RFQ0lERV9DT05GSURFTkNFX0hFQURFUixcbiAgQUlfREVDSURFX01PREVMX0lELFxuICBBSV9ERUNJREVfU0VMRUNURURfTU9ERUxfSEVBREVSLFxuICBBSV9ERUNJREVfU1RSQVRFR1lfSEVBREVSLFxuICBBaURlY2lkZVN0cmF0ZWd5U2NoZW1hLFxuICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLFxuICBTTUFSVF9ST1VURVJfSEFSTkVTU19IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9NT0RFTF9JRCxcbiAgU01BUlRfUk9VVEVSX1BST0ZJTEVSX1NUQVRVU19IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9ST1VURV9NT0RFTF9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TRVJWRURfVElFUl9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TT1VSQ0VfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfVEFTS19USUVSX0hFQURFUixcbiAgaXNBaURlY2lkZU1vZGVsSWQsXG4gIGlzU21hcnRSb3V0ZXJNb2RlbElkLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG5pbXBvcnQgeyBBaURlY2lkZVJvdXRlclNlcnZpY2UgfSBmcm9tIFwiLi9haS1kZWNpZGUudHNcIjtcbmltcG9ydCB7IGxpc3RNb2RlbHNQYXlsb2FkIH0gZnJvbSBcIi4vbW9kZWxzLnRzXCI7XG5pbXBvcnQgeyBQcm9maWxlRmFsbGJhY2ssIHR5cGUgTW9kZWxHYXRld2F5UHJvZmlsZSB9IGZyb20gXCIuL3Byb2ZpbGUtZmFsbGJhY2sudHNcIjtcbmltcG9ydCB7IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nLCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkgfSBmcm9tIFwiLi9yZWFzb25pbmctYWRhcHQudHNcIjtcbmltcG9ydCB7XG4gIERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnksXG4gIHR5cGUgTW9kZWxSZWdpc3RyeU9wdGlvbnMsXG59IGZyb20gXCIuL3JlZ2lzdHJ5LnRzXCI7XG5pbXBvcnQgeyByZXF1ZXN0ZWRGZWF0dXJlcywgcmVzb2x2ZVJvdXRlIH0gZnJvbSBcIi4vcm91dGVyLnRzXCI7XG5pbXBvcnQge1xuICBTbWFydE1vZGVsUm91dGVyLFxuICB0eXBlIFNtYXJ0Um91dGVyU2VydmljZSxcbiAgdHlwZSBTbWFydFJvdXRlclN0b3JlLFxufSBmcm9tIFwiLi9zbWFydC1yb3V0ZXIudHNcIjtcbmltcG9ydCB7IHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vdHJhbnNsYXRpb24udHNcIjtcbmltcG9ydCB7IGZldGNoRGF0YWJyaWNrcywgZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyB9IGZyb20gXCIuL3RyYW5zcG9ydC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0L21vZGVsLWdhdGV3YXlcIik7XG5jb25zdCBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01JTiA9IDA7XG5jb25zdCBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01BWCA9IDI7XG5cbi8qKiBNb2RlbCBnYXRld2F5IHJ1bnRpbWUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxHYXRld2F5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNhY2hlVHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyPzogU21hcnRSb3V0ZXJNb2RlO1xuICByZWFkb25seSBzbWFydFJvdXRlckNvbnRleHRUb2tlbkJ1ZGdldD86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXJQcm9iZVJlZnJlc2hJbnRlcnZhbE1zPzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclByb2JlVHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzPzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclRpbWVvdXRNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXJTZXJ2aWNlPzogU21hcnRSb3V0ZXJTZXJ2aWNlO1xuICByZWFkb25seSBzbWFydFJvdXRlclN0b3JlPzogU21hcnRSb3V0ZXJTdG9yZTtcbiAgcmVhZG9ubHkgYWlEZWNpZGVTZXJ2aWNlPzogQWlEZWNpZGVSb3V0ZXJTZXJ2aWNlO1xuICByZWFkb25seSBvdmVycmlkZXM/OiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuICByZWFkb25seSBtb2RlbD86IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlO1xuICByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuO1xuICByZWFkb25seSBwcm9maWxlcz86IHJlYWRvbmx5IE1vZGVsR2F0ZXdheVByb2ZpbGVbXTtcbn1cblxuLyoqIEVycm9yIGNhcnJ5aW5nIGFuIEhUVFAgc3RhdHVzIGFuZCBwcm90b2NvbC1zYWZlIG1lc3NhZ2UuICovXG5leHBvcnQgY2xhc3MgTW9kZWxHYXRld2F5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJNb2RlbEdhdGV3YXlFcnJvclwiO1xuICB9XG59XG5cbi8qKiBBcHBLaXQtc2NvcGVkIG1vZGVsIGdhdGV3YXkgd2l0aCBkeW5hbWljIG1vZGVsIGRpc2NvdmVyeSBhbmQgc3RyZWFtaW5nIGluZmVyZW5jZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXkge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5OiBNb2RlbFJlZ2lzdHJ5O1xuICBwcml2YXRlIHJlYWRvbmx5IHNtYXJ0Um91dGVyPzogU21hcnRNb2RlbFJvdXRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBhaURlY2lkZTogQWlEZWNpZGVSb3V0ZXJTZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHNtYXJ0Um91dGVyTW9kZTogU21hcnRSb3V0ZXJNb2RlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvZmlsZUZhbGxiYWNrPzogUHJvZmlsZUZhbGxiYWNrO1xuICBwcml2YXRlIHJlYWRvbmx5IHByaW1hcnlQcm9maWxlPzogTW9kZWxHYXRld2F5UHJvZmlsZTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb2RlbEdhdGV3YXlPcHRpb25zID0ge30sIHJlZ2lzdHJ5PzogTW9kZWxSZWdpc3RyeSkge1xuICAgIHRoaXMucHJpbWFyeVByb2ZpbGUgPSBvcHRpb25zLnByb2ZpbGVzPy5bMF07XG4gICAgdGhpcy5wcm9maWxlRmFsbGJhY2sgPVxuICAgICAgb3B0aW9ucy5wcm9maWxlcyAmJiBvcHRpb25zLnByb2ZpbGVzLmxlbmd0aCA+IDFcbiAgICAgICAgPyBuZXcgUHJvZmlsZUZhbGxiYWNrKG9wdGlvbnMucHJvZmlsZXMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlZ2lzdHJ5T3B0aW9uczogTW9kZWxSZWdpc3RyeU9wdGlvbnMgPSB7XG4gICAgICAuLi4ob3B0aW9ucy5jYWNoZVR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bE1zOiBvcHRpb25zLmNhY2hlVHRsTXMgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLm92ZXJyaWRlcyA/IHsgb3ZlcnJpZGVzOiBvcHRpb25zLm92ZXJyaWRlcyB9IDoge30pLFxuICAgICAgLi4uKG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHByZWZlclN5c3RlbU1vZGVsczogb3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLih0aGlzLnByaW1hcnlQcm9maWxlXG4gICAgICAgID8ge1xuICAgICAgICAgICAgY2xpZW50OiB0aGlzLnByaW1hcnlQcm9maWxlLmNsaWVudCxcbiAgICAgICAgICAgIC4uLih0aGlzLnByaW1hcnlQcm9maWxlLnByb2ZpbGVcbiAgICAgICAgICAgICAgPyB7IGNhY2hlSWRlbnRpdHk6IGBwcm9maWxlOiR7dGhpcy5wcmltYXJ5UHJvZmlsZS5wcm9maWxlfWAgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH07XG4gICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5ID8/IG5ldyBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeShyZWdpc3RyeU9wdGlvbnMpO1xuICAgIHRoaXMuYWlEZWNpZGUgPSBvcHRpb25zLmFpRGVjaWRlU2VydmljZSA/PyBuZXcgQWlEZWNpZGVSb3V0ZXJTZXJ2aWNlKCk7XG4gICAgdGhpcy5zbWFydFJvdXRlck1vZGUgPSBvcHRpb25zLnNtYXJ0Um91dGVyID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXI7XG4gICAgaWYgKHRoaXMuc21hcnRSb3V0ZXJNb2RlICE9PSBcImZhbHNlXCIpIHtcbiAgICAgIHRoaXMuc21hcnRSb3V0ZXIgPSBuZXcgU21hcnRNb2RlbFJvdXRlcihcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRleHRUb2tlbkJ1ZGdldDpcbiAgICAgICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJDb250ZXh0VG9rZW5CdWRnZXQgPz9cbiAgICAgICAgICAgIE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJDb250ZXh0VG9rZW5CdWRnZXQsXG4gICAgICAgICAgcHJvYmVSZWZyZXNoSW50ZXJ2YWxNczpcbiAgICAgICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJQcm9iZVJlZnJlc2hJbnRlcnZhbE1zID8/XG4gICAgICAgICAgICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUHJvYmVSZWZyZXNoSW50ZXJ2YWxNcyxcbiAgICAgICAgICBwcm9iZVR0bE1zOiBvcHRpb25zLnNtYXJ0Um91dGVyUHJvYmVUdGxNcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUHJvYmVUdGxNcyxcbiAgICAgICAgICByb3V0ZVR0bFNlY29uZHM6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJSb3V0ZVR0bFNlY29uZHMsXG4gICAgICAgICAgcm91dGVyTmFtZTogXCJ0YXNrX3YzXCIsXG4gICAgICAgICAgdGltZW91dE1zOiBvcHRpb25zLnNtYXJ0Um91dGVyVGltZW91dE1zID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJUaW1lb3V0TXMsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJTZXJ2aWNlLFxuICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyU3RvcmUsXG4gICAgICAgIHRoaXMucHJpbWFyeVByb2ZpbGU/LmNsaWVudCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubW9kZWwgPSBvcHRpb25zLm1vZGVsO1xuICAgIHRoaXMubW9kZWxDbGFzcyA9IG9wdGlvbnMubW9kZWxDbGFzcztcbiAgICB0aGlzLnByZWZlclN5c3RlbU1vZGVscyA9XG4gICAgICBvcHRpb25zLnByZWZlclN5c3RlbU1vZGVscyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnByZWZlclN5c3RlbU1vZGVscztcbiAgfVxuXG4gIC8qKiBSZXR1cm4gdGhlIGxpdmUgT3BlbkFJIG1vZGVsIGxpc3QsIGluY2x1ZGluZyBDb2RleCBtZXRhZGF0YSB3aGVuIHJlcXVlc3RlZC4gKi9cbiAgYXN5bmMgbW9kZWxzKFxuICAgIGNvZGV4ID0gZmFsc2UsXG4gICAgc2VhcmNoPzogc3RyaW5nLFxuICAgIG1vZGVsU291cmNlOiBNb2RlbFNvdXJjZSB8IFwiYWxsXCIgPSBcImZvdW5kYXRpb25cIixcbiAgICBpbmNsdWRlTWV0YWRhdGEgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxNb2RlbExpc3RSZXNwb25zZT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RpbmcgbW9kZWxzXCIsIHsgY29kZXgsIHNlYXJjaCB9KTtcbiAgICBjb25zdCBxdWVyeSA9IHNlYXJjaD8udHJpbSgpO1xuICAgIGNvbnN0IHNtYXJ0Um91dGVyU2VhcmNoID1cbiAgICAgIHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgU01BUlRfUk9VVEVSX01PREVMX0lELmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpO1xuICAgIGNvbnN0IGFpRGVjaWRlU2VhcmNoID0gcXVlcnkgIT09IHVuZGVmaW5lZCAmJiBBSV9ERUNJREVfTU9ERUxfSUQuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSk7XG4gICAgY29uc3QgZGlzY292ZXJlZCA9XG4gICAgICBxdWVyeSAmJiAhc21hcnRSb3V0ZXJTZWFyY2ggJiYgIWFpRGVjaWRlU2VhcmNoXG4gICAgICAgID8gYXdhaXQgdGhpcy5yZWdpc3RyeS5zZWFyY2gocXVlcnkpXG4gICAgICAgIDogYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9XG4gICAgICBtb2RlbFNvdXJjZSA9PT0gXCJhbGxcIlxuICAgICAgICA/IGRpc2NvdmVyZWRcbiAgICAgICAgOiBkaXNjb3ZlcmVkLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQ/Lm1vZGVsU291cmNlID09PSBtb2RlbFNvdXJjZSk7XG4gICAgY29uc3Qgc21hcnRSb3V0ZXJUYXJnZXRzID1cbiAgICAgIHRoaXMuc21hcnRSb3V0ZXJNb2RlID09PSBcInRydWVcIiAmJiBxdWVyeSAmJiAhc21hcnRSb3V0ZXJTZWFyY2hcbiAgICAgICAgPyAoYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCkpLmZpbHRlcihcbiAgICAgICAgICAgICh0YXJnZXQpID0+IG1vZGVsU291cmNlID09PSBcImFsbFwiIHx8IHRhcmdldC5lbmRwb2ludD8ubW9kZWxTb3VyY2UgPT09IG1vZGVsU291cmNlLFxuICAgICAgICAgIClcbiAgICAgICAgOiB0YXJnZXRzO1xuICAgIGNvbnN0IHNob3VsZFByb2JlU21hcnRSb3V0ZXIgPVxuICAgICAgQm9vbGVhbih0aGlzLnNtYXJ0Um91dGVyKSAmJiAodGhpcy5zbWFydFJvdXRlck1vZGUgPT09IFwidHJ1ZVwiIHx8ICFxdWVyeSB8fCBzbWFydFJvdXRlclNlYXJjaCk7XG4gICAgY29uc3Qgc21hcnRSb3V0ZXJFbmFibGVkID1cbiAgICAgIHNob3VsZFByb2JlU21hcnRSb3V0ZXIgJiYgKGF3YWl0IHRoaXMuc21hcnRSb3V0ZXIhLmlzRW5hYmxlZChzbWFydFJvdXRlclRhcmdldHMpKTtcbiAgICBjb25zdCBhaURlY2lkZUVuYWJsZWQgPVxuICAgICAgKCFxdWVyeSB8fCBhaURlY2lkZVNlYXJjaCkgJiZcbiAgICAgIChhd2FpdCB0aGlzLmFpRGVjaWRlLmlzRW5hYmxlZChcbiAgICAgICAgdGFyZ2V0c1xuICAgICAgICAgIC5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LmVuZHBvaW50KVxuICAgICAgICAgIC5maWx0ZXIoKGVuZHBvaW50KTogZW5kcG9pbnQgaXMgU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9PiBlbmRwb2ludCAhPT0gdW5kZWZpbmVkKSxcbiAgICAgICAgdGhpcy5wcmltYXJ5UHJvZmlsZT8uY2xpZW50LFxuICAgICAgKSk7XG4gICAgaWYgKHRoaXMuc21hcnRSb3V0ZXJNb2RlID09PSBcInRydWVcIiAmJiAhc21hcnRSb3V0ZXJFbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoXG4gICAgICAgIDUwMyxcbiAgICAgICAgXCJEYXRhYnJpY2tzIFNtYXJ0IFJvdXRlciBpcyByZXF1aXJlZCBidXQgdW5hdmFpbGFibGUgZm9yIHRoZSBhY3RpdmUgd29ya3NwYWNlIGlkZW50aXR5XCIsXG4gICAgICApO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWQgbW9kZWxzXCIsIHsgY29kZXgsIGNvdW50OiB0YXJnZXRzLmxlbmd0aCB9KTtcbiAgICBjb25zdCBwYXlsb2FkID0gbGlzdE1vZGVsc1BheWxvYWQoXG4gICAgICB0YXJnZXRzLFxuICAgICAgY29kZXgsXG4gICAgICBxdWVyeSAhPT0gdW5kZWZpbmVkICYmIHF1ZXJ5Lmxlbmd0aCA+IDAsXG4gICAgICB0aGlzLnByZWZlclN5c3RlbU1vZGVscyxcbiAgICAgIHNtYXJ0Um91dGVyRW5hYmxlZCAmJiAoIXF1ZXJ5IHx8IHNtYXJ0Um91dGVyU2VhcmNoKSxcbiAgICAgIGFpRGVjaWRlRW5hYmxlZCAmJiAoIXF1ZXJ5IHx8IGFpRGVjaWRlU2VhcmNoKSxcbiAgICAgIGluY2x1ZGVNZXRhZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBzbWFydFJvdXRlclNlYXJjaCB8fCBhaURlY2lkZVNlYXJjaFxuICAgICAgPyBvbmx5VmlydHVhbE1vZGVsKHBheWxvYWQsIHNtYXJ0Um91dGVyU2VhcmNoID8gU01BUlRfUk9VVEVSX01PREVMX0lEIDogQUlfREVDSURFX01PREVMX0lEKVxuICAgICAgOiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgYW5kIGV4ZWN1dGUgb25lIGluZmVyZW5jZSByZXF1ZXN0LiAqL1xuICBhc3luYyBpbmZlcmVuY2UoXG4gICAgcHJvdG9jb2w6IENsaWVudFByb3RvY29sLFxuICAgIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICBoZWFkZXJzOiBIZWFkZXJzLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRCb2R5ID0gc2FuaXRpemVJbmZlcmVuY2VCb2R5KGJvZHkpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdhdGV3YXlNb2RlbFNlbGVjdGlvbihcbiAgICAgIHNhbml0aXplZEJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAge1xuICAgICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5tb2RlbENsYXNzLFxuICAgICAgfSxcbiAgICAgIHByb3RvY29sLFxuICAgICk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2aW5nIHJlcXVlc3RcIiwge1xuICAgICAgc21hcnRSb3V0ZXI6IHNlbGVjdGlvbi5zbWFydFJvdXRlciA9PT0gdHJ1ZSxcbiAgICAgIGFpRGVjaWRlOiBzZWxlY3Rpb24uYWlEZWNpZGUgPT09IHRydWUsXG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBtb2RlbDogc2VsZWN0aW9uLm1vZGVsLFxuICAgICAgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MsXG4gICAgICBvcmlnaW5hdG9yOiBoZWFkZXJzLmdldChcIm9yaWdpbmF0b3JcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiBzYW5pdGl6ZWRCb2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHJlcXVlc3RlZEZlYXR1cmVzKHNhbml0aXplZEJvZHkpO1xuICAgIGlmICgoc2VsZWN0aW9uLnNtYXJ0Um91dGVyIHx8IHNlbGVjdGlvbi5haURlY2lkZSkgJiYgcHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKFxuICAgICAgICA0MDAsXG4gICAgICAgIFwiVmlydHVhbCBtb2RlbCByb3V0ZXJzIGFyZSBhdmFpbGFibGUgb25seSBmb3IgY2hhdCByZXF1ZXN0c1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc21hcnRSb3V0ZXIgPVxuICAgICAgc2VsZWN0aW9uLnNtYXJ0Um91dGVyICYmIHRoaXMuc21hcnRSb3V0ZXJcbiAgICAgICAgPyBhd2FpdCB0aGlzLnNtYXJ0Um91dGVyLnJlc29sdmUoe1xuICAgICAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sIGFzIEV4Y2x1ZGU8Q2xpZW50UHJvdG9jb2wsIFwib3BlbmFpLWVtYmVkZGluZ3NcIj4sXG4gICAgICAgICAgICBib2R5OiBzYW5pdGl6ZWRCb2R5LFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGZlYXR1cmVzLFxuICAgICAgICAgICAgdGFyZ2V0czogYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCksXG4gICAgICAgICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHM6IHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChzZWxlY3Rpb24uc21hcnRSb3V0ZXIgJiYgIXNtYXJ0Um91dGVyKSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDA0LCBcIkRhdGFicmlja3MgU21hcnQgUm91dGVyIGlzIGRpc2FibGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCBhaURlY2lkZVRhcmdldHMgPVxuICAgICAgIXNtYXJ0Um91dGVyICYmIHNlbGVjdGlvbi5haURlY2lkZSA/IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFpRGVjaWRlID0gc2VsZWN0aW9uLmFpRGVjaWRlXG4gICAgICA/IGF3YWl0IHRoaXMuYWlEZWNpZGUuc2VsZWN0KFxuICAgICAgICAgIHNhbml0aXplZEJvZHksXG4gICAgICAgICAgKGFpRGVjaWRlVGFyZ2V0cyA/PyBbXSlcbiAgICAgICAgICAgIC5tYXAoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmVuZHBvaW50KVxuICAgICAgICAgICAgLmZpbHRlcigoZW5kcG9pbnQpOiBlbmRwb2ludCBpcyBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0+IGVuZHBvaW50ICE9PSB1bmRlZmluZWQpLFxuICAgICAgICAgIHRoaXMucHJpbWFyeVByb2ZpbGU/LmNsaWVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdHJhdGVneTogYWlEZWNpZGVTdHJhdGVneShoZWFkZXJzKSxcbiAgICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgICAgLi4uKGZlYXR1cmVzLnRvb2xzID8geyByZXF1aXJlc1Rvb2xzOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihmZWF0dXJlcy5zdHJ1Y3R1cmVkT3V0cHV0ID8geyByZXF1aXJlc1N0cnVjdHVyZWRPdXRwdXQ6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgIHNtYXJ0Um91dGVyPy50YXJnZXQgPz9cbiAgICAgIChhaURlY2lkZVxuICAgICAgICA/IGFpRGVjaWRlVGFyZ2V0cz8uZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IGFpRGVjaWRlLmVuZHBvaW50Lm5hbWUpXG4gICAgICAgIDogdW5kZWZpbmVkKSA/P1xuICAgICAgKGF3YWl0IHRoaXMucmVnaXN0cnkucmVzb2x2ZShzZWxlY3Rpb24ubW9kZWwsIHtcbiAgICAgICAgLi4uKHByb3RvY29sID09PSBcIm9wZW5haS1lbWJlZGRpbmdzXCIgPyB7IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH0gOiB7fSksXG4gICAgICAgIC4uLihzZWxlY3Rpb24ubW9kZWxDbGFzcyA/IHsgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAgICAgLi4uKGZlYXR1cmVzLnRvb2xzID8geyByZXF1aXJlc1Rvb2xzOiB0cnVlIH0gOiB7fSksXG4gICAgICB9KSk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcihcbiAgICAgICAgNDA0LFxuICAgICAgICBzZWxlY3Rpb24ubW9kZWxcbiAgICAgICAgICA/IGBNb2RlbCBub3QgZm91bmQ6ICR7c2VsZWN0aW9uLm1vZGVsfWBcbiAgICAgICAgICA6IFwiTm8gbW9kZWwgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIGNsYXNzXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByb3V0ZSA9IHJlc29sdmVSb3V0ZSh7XG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICAuLi4oIXNtYXJ0Um91dGVyICYmICFhaURlY2lkZSAmJiBzZWxlY3Rpb24ubW9kZWwgPyB7IHJlcXVlc3RlZE1vZGVsOiBzZWxlY3Rpb24ubW9kZWwgfSA6IHt9KSxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHM6IHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgZmVhdHVyZXMsXG4gICAgICB0YXJnZXQsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicm91dGVkXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICB1cHN0cmVhbVByb3RvY29sOiByb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGVyYXR1cmVCb2R5ID0gYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZShcbiAgICAgIHRhcmdldC5lbmRwb2ludCA/PyB0YXJnZXQuaWQsXG4gICAgICBzbWFydFJvdXRlcj8uYm9keSA/PyBzYW5pdGl6ZWRCb2R5LFxuICAgICk7XG4gICAgY29uc3QgYWRhcHRlZCA9IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nKHRhcmdldC5pZCwgdGVtcGVyYXR1cmVCb2R5KTtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIGFkYXB0ZWQuYm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICBjb25zdCByZXRyeUJvZHkgPSBhd2FpdCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkoe1xuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIGJvZHk6IHRlbXBlcmF0dXJlQm9keSxcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgcHJldmlvdXNXaXJlRWZmb3J0OiBhZGFwdGVkLndpcmVFZmZvcnQsXG4gICAgfSk7XG4gICAgaWYgKHJldHJ5Qm9keSkge1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3J3YXJkKHJvdXRlLCByZXRyeUJvZHksIGhlYWRlcnMsIHNpZ25hbCk7XG4gICAgfVxuXG4gICAgbG9nUmVzcG9uc2Uocm91dGUudXBzdHJlYW1Qcm90b2NvbCwgdGFyZ2V0LmlkLCByZXNwb25zZSk7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgICBpZiAoc21hcnRSb3V0ZXIpIHtcbiAgICAgICAgYXBwbHlTbWFydFJvdXRlck9ic2VydmF0aW9uSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzLCBzbWFydFJvdXRlci5vYnNlcnZhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoYWlEZWNpZGUpIGFwcGx5QWlEZWNpZGVPYnNlcnZhdGlvbkhlYWRlcnMocmVzcG9uc2UuaGVhZGVycywgYWlEZWNpZGUub2JzZXJ2YXRpb24pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgICBjb25zdCBmb3J3YXJkZWQgPSBnYXRld2F5UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuICAgIGZvcndhcmRlZC5zZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiLCByb3V0ZS51cHN0cmVhbVByb3RvY29sKTtcbiAgICBpZiAoc21hcnRSb3V0ZXIpIGFwcGx5U21hcnRSb3V0ZXJPYnNlcnZhdGlvbkhlYWRlcnMoZm9yd2FyZGVkLCBzbWFydFJvdXRlci5vYnNlcnZhdGlvbik7XG4gICAgaWYgKGFpRGVjaWRlKSBhcHBseUFpRGVjaWRlT2JzZXJ2YXRpb25IZWFkZXJzKGZvcndhcmRlZCwgYWlEZWNpZGUub2JzZXJ2YXRpb24pO1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgaGVhZGVyczogZm9yd2FyZGVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZnJlc2ggdGhlIGFjdGl2ZSBwcmluY2lwYWwncyBtb2RlbCBjYXRhbG9ndWUuICovXG4gIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVmcmVzaGluZyBtb2RlbCBjYXRhbG9ndWVcIik7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmb3J3YXJkKFxuICAgIHJvdXRlOiBHYXRld2F5Um91dGUsXG4gICAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgIGhlYWRlcnM6IEhlYWRlcnMsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGlmIChyb3V0ZS51cHN0cmVhbVByb3RvY29sID09PSBcImFpLXNka1wiKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3Qocm91dGUsIGJvZHksIHNpZ25hbCwge1xuICAgICAgICAuLi4odGhpcy5wcmltYXJ5UHJvZmlsZSA/IHsgY2xpZW50OiB0aGlzLnByaW1hcnlQcm9maWxlLmNsaWVudCB9IDoge30pLFxuICAgICAgICAuLi4odGhpcy5wcm9maWxlRmFsbGJhY2tcbiAgICAgICAgICA/IHsgZmV0Y2g6IHRoaXMucHJvZmlsZUZhbGxiYWNrLmNyZWF0ZUZldGNoKHJvdXRlLnVwc3RyZWFtTW9kZWwpIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9maWxlRmFsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2ZpbGVGYWxsYmFjay5yZXF1ZXN0KHJvdXRlLnVwc3RyZWFtTW9kZWwsIHNpZ25hbCwgKHsgY2xpZW50IH0pID0+XG4gICAgICAgIGZldGNoRGF0YWJyaWNrcyh7IHJvdXRlLCBib2R5LCBoZWFkZXJzLCBzaWduYWwsIGNsaWVudCB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmZXRjaERhdGFicmlja3Moe1xuICAgICAgcm91dGUsXG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIHNpZ25hbCxcbiAgICAgIC4uLih0aGlzLnByaW1hcnlQcm9maWxlID8geyBjbGllbnQ6IHRoaXMucHJpbWFyeVByb2ZpbGUuY2xpZW50IH0gOiB7fSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBudWxsIHRlbXBlcmF0dXJlIGFuZCByZWplY3QgZXhwbGljaXQgbm9ubnVtZXJpYyB2YWx1ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVJbmZlcmVuY2VCb2R5KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSkgcmV0dXJuIGJvZHk7XG4gIGlmIChib2R5LnRlbXBlcmF0dXJlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5LnRlbXBlcmF0dXJlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNGaW5pdGUoYm9keS50ZW1wZXJhdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwidGVtcGVyYXR1cmUgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIsIG51bGwsIG9yIG9taXR0ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBib2R5O1xuICB9XG4gIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uYm9keSB9O1xuICBkZWxldGUgc2FuaXRpemVkLnRlbXBlcmF0dXJlO1xuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKiogQXBwbHkgcHVibGlzaGVkIERhdGFicmlja3MgdGVtcGVyYXR1cmUgc3VwcG9ydCBhbmQgcmFuZ2UgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYXB0SW5mZXJlbmNlVGVtcGVyYXR1cmUoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSB8fCB0eXBlb2YgYm9keS50ZW1wZXJhdHVyZSAhPT0gXCJudW1iZXJcIikgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IHN1cHBvcnRlZCA9IG1vZGVsVGVtcGVyYXR1cmVTdXBwb3J0Rm9yKG1vZGVsKTtcbiAgaWYgKHN1cHBvcnRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYm9keTtcbiAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICBjb25zdCBhZGFwdGVkID0geyAuLi5ib2R5IH07XG4gICAgZGVsZXRlIGFkYXB0ZWQudGVtcGVyYXR1cmU7XG4gICAgcmV0dXJuIGFkYXB0ZWQ7XG4gIH1cbiAgY29uc3QgdGVtcGVyYXR1cmUgPSBNYXRoLm1pbihcbiAgICBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01BWCxcbiAgICBNYXRoLm1heChEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01JTiwgYm9keS50ZW1wZXJhdHVyZSksXG4gICk7XG4gIHJldHVybiB0ZW1wZXJhdHVyZSA9PT0gYm9keS50ZW1wZXJhdHVyZSA/IGJvZHkgOiB7IC4uLmJvZHksIHRlbXBlcmF0dXJlIH07XG59XG5cbi8qKiBSZXNvbHZlIHJlcXVlc3QsIGhlYWRlciwgY29uZmlndXJlZCwgYW5kIHByb3RvY29sIG1vZGVsLXNlbGVjdGlvbiBpbnB1dHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0ZXdheU1vZGVsU2VsZWN0aW9uKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIGRlZmF1bHRzOiB7IHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nOyByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGUgfSA9IHt9LFxuICBwcm90b2NvbD86IENsaWVudFByb3RvY29sLFxuKToge1xuICByZWFkb25seSBzbWFydFJvdXRlcj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFpRGVjaWRlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbn0ge1xuICBjb25zdCBtb2RlbCA9IHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiICYmIGJvZHkubW9kZWwudHJpbSgpID8gYm9keS5tb2RlbC50cmltKCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnMuZ2V0KFwieC1kYngtdG9vbHMtbW9kZWwtY2xhc3NcIik/LnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkQ2xhc3MgPSBoZWFkZXIgPyBNb2RlbENsYXNzU2NoZW1hLnNhZmVQYXJzZShoZWFkZXIpIDogdW5kZWZpbmVkO1xuICBpZiAocGFyc2VkQ2xhc3MgJiYgIXBhcnNlZENsYXNzLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBgSW52YWxpZCBtb2RlbCBjbGFzczogJHtoZWFkZXJ9YCk7XG4gIH1cbiAgaWYgKG1vZGVsICYmIHBhcnNlZENsYXNzPy5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBhbmQgbW9kZWwgY2xhc3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKTtcbiAgfVxuICBpZiAobW9kZWwpIHtcbiAgICBpZiAoaXNTbWFydFJvdXRlck1vZGVsSWQobW9kZWwpKSByZXR1cm4geyBzbWFydFJvdXRlcjogdHJ1ZSB9O1xuICAgIGlmIChpc0FpRGVjaWRlTW9kZWxJZChtb2RlbCkpIHJldHVybiB7IGFpRGVjaWRlOiB0cnVlIH07XG4gICAgcmV0dXJuIHsgbW9kZWwgfTtcbiAgfVxuICBpZiAocGFyc2VkQ2xhc3M/LmRhdGEpIHJldHVybiB7IG1vZGVsQ2xhc3M6IHBhcnNlZENsYXNzLmRhdGEgfTtcbiAgaWYgKGRlZmF1bHRzLm1vZGVsKSB7XG4gICAgaWYgKGlzU21hcnRSb3V0ZXJNb2RlbElkKGRlZmF1bHRzLm1vZGVsKSkgcmV0dXJuIHsgc21hcnRSb3V0ZXI6IHRydWUgfTtcbiAgICBpZiAoaXNBaURlY2lkZU1vZGVsSWQoZGVmYXVsdHMubW9kZWwpKSByZXR1cm4geyBhaURlY2lkZTogdHJ1ZSB9O1xuICAgIHJldHVybiB7IG1vZGVsOiBkZWZhdWx0cy5tb2RlbCB9O1xuICB9XG4gIGlmIChkZWZhdWx0cy5tb2RlbENsYXNzKSByZXR1cm4geyBtb2RlbENsYXNzOiBkZWZhdWx0cy5tb2RlbENsYXNzIH07XG4gIGlmIChwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiKSByZXR1cm4geyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9O1xuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIGFwcGx5U21hcnRSb3V0ZXJPYnNlcnZhdGlvbkhlYWRlcnMoXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIG9ic2VydmF0aW9uOiBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuKTogdm9pZCB7XG4gIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsIG9ic2VydmF0aW9uLnNlbGVjdGVkTW9kZWwpO1xuICBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfUk9VVEVfTU9ERUxfSEVBREVSLCBvYnNlcnZhdGlvbi5yb3V0ZU1vZGVsKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX0hBUk5FU1NfSEVBREVSLCBvYnNlcnZhdGlvbi5oYXJuZXNzKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1NPVVJDRV9IRUFERVIsIG9ic2VydmF0aW9uLnNvdXJjZSk7XG4gIGNvbnN0IHRhc2tUaWVyID0gc3RyaW5nUGFyYW0ob2JzZXJ2YXRpb24ucGFyYW1zLCBcInRhc2tfdGllclwiKTtcbiAgY29uc3Qgc2VydmVkVGllciA9IHN0cmluZ1BhcmFtKG9ic2VydmF0aW9uLnBhcmFtcywgXCJzZXJ2ZWRfdGllclwiKTtcbiAgY29uc3QgcHJvZmlsZXJTdGF0dXMgPSBzdHJpbmdQYXJhbShvYnNlcnZhdGlvbi5wYXJhbXMsIFwicHJvZmlsZXJfc3RhdHVzXCIpO1xuICBpZiAodGFza1RpZXIpIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9UQVNLX1RJRVJfSEVBREVSLCB0YXNrVGllcik7XG4gIGlmIChzZXJ2ZWRUaWVyKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfU0VSVkVEX1RJRVJfSEVBREVSLCBzZXJ2ZWRUaWVyKTtcbiAgaWYgKHByb2ZpbGVyU3RhdHVzKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfUFJPRklMRVJfU1RBVFVTX0hFQURFUiwgcHJvZmlsZXJTdGF0dXMpO1xufVxuXG5mdW5jdGlvbiBhcHBseUFpRGVjaWRlT2JzZXJ2YXRpb25IZWFkZXJzKGhlYWRlcnM6IEhlYWRlcnMsIG9ic2VydmF0aW9uOiBBaURlY2lkZU9ic2VydmF0aW9uKTogdm9pZCB7XG4gIGhlYWRlcnMuc2V0KEFJX0RFQ0lERV9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsIG9ic2VydmF0aW9uLnNlbGVjdGVkTW9kZWwpO1xuICBoZWFkZXJzLnNldChBSV9ERUNJREVfU1RSQVRFR1lfSEVBREVSLCBvYnNlcnZhdGlvbi5zdHJhdGVneSk7XG4gIGlmIChvYnNlcnZhdGlvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBoZWFkZXJzLnNldChBSV9ERUNJREVfQ09ORklERU5DRV9IRUFERVIsIFN0cmluZyhvYnNlcnZhdGlvbi5jb25maWRlbmNlKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWlEZWNpZGVTdHJhdGVneShoZWFkZXJzOiBIZWFkZXJzKSB7XG4gIGNvbnN0IHZhbHVlID0gaGVhZGVycy5nZXQoQUlfREVDSURFX1NUUkFURUdZX0hFQURFUik/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gdmFsdWUgPyBBaURlY2lkZVN0cmF0ZWd5U2NoZW1hLnBhcnNlKHZhbHVlKSA6IFwiYmFsYW5jZWRcIjtcbn1cblxuZnVuY3Rpb24gc3RyaW5nUGFyYW0oXG4gIHBhcmFtczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zPy5ba2V5XTtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBvbmx5VmlydHVhbE1vZGVsKHBheWxvYWQ6IE1vZGVsTGlzdFJlc3BvbnNlLCBtb2RlbElkOiBzdHJpbmcpOiBNb2RlbExpc3RSZXNwb25zZSB7XG4gIGlmIChcIm1vZGVsc1wiIGluIHBheWxvYWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiBwYXlsb2FkLm1vZGVscy5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5zbHVnLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoYC8ke21vZGVsSWR9YCkpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBvYmplY3Q6IFwibGlzdFwiLFxuICAgIGRhdGE6IHBheWxvYWQuZGF0YS5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5pZCA9PT0gbW9kZWxJZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGxvZ1Jlc3BvbnNlKHVwc3RyZWFtUHJvdG9jb2w6IHN0cmluZywgbW9kZWw6IHN0cmluZywgcmVzcG9uc2U6IFJlc3BvbnNlKTogdm9pZCB7XG4gIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgY29udGVudFR5cGU6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpLFxuICAgIG1vZGVsLFxuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIHVwc3RyZWFtUHJvdG9jb2wsXG4gIH07XG4gIGlmIChyZXNwb25zZS5vaykgbG9nZ2VyLmRlYnVnKFwidXBzdHJlYW0gcmVzcG9uc2VcIiwgZGV0YWlscyk7XG4gIGVsc2UgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSByZXF1ZXN0IGZhaWxlZFwiLCBkZXRhaWxzKTtcbn1cbiJdfQ==
|
package/lib/src/registry.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export interface ModelRegistryOptions {
|
|
|
22
22
|
readonly preferSystemModels?: boolean;
|
|
23
23
|
/** Discover models with this client instead of the AppKit execution context. */
|
|
24
24
|
readonly client?: WorkspaceClient;
|
|
25
|
+
/** Trusted credential identity used to isolate cached catalogues for an injected client. */
|
|
26
|
+
readonly cacheIdentity?: string;
|
|
25
27
|
}
|
|
26
28
|
/** Model registry backed by the active AppKit execution context. */
|
|
27
29
|
export declare class DatabricksModelRegistry implements ModelRegistry {
|
|
@@ -29,6 +31,7 @@ export declare class DatabricksModelRegistry implements ModelRegistry {
|
|
|
29
31
|
private readonly overrides;
|
|
30
32
|
private readonly preferSystemModels;
|
|
31
33
|
private readonly client;
|
|
34
|
+
private readonly cacheIdentity;
|
|
32
35
|
constructor(options?: ModelRegistryOptions);
|
|
33
36
|
list(): Promise<ModelTarget[]>;
|
|
34
37
|
resolve(model: string | undefined, options?: ModelRegistryResolveOptions): Promise<ModelTarget | undefined>;
|
package/lib/src/registry.js
CHANGED
|
@@ -15,11 +15,13 @@ export class DatabricksModelRegistry {
|
|
|
15
15
|
overrides;
|
|
16
16
|
preferSystemModels;
|
|
17
17
|
client;
|
|
18
|
+
cacheIdentity;
|
|
18
19
|
constructor(options = {}) {
|
|
19
20
|
this.ttlMs = positiveTtl(options.ttlMs);
|
|
20
21
|
this.overrides = options.overrides ?? [];
|
|
21
22
|
this.preferSystemModels = options.preferSystemModels ?? false;
|
|
22
23
|
this.client = options.client;
|
|
24
|
+
this.cacheIdentity = options.cacheIdentity;
|
|
23
25
|
}
|
|
24
26
|
async list() {
|
|
25
27
|
const context = await this.context();
|
|
@@ -141,7 +143,11 @@ export class DatabricksModelRegistry {
|
|
|
141
143
|
async context() {
|
|
142
144
|
if (this.client) {
|
|
143
145
|
const host = (await this.client.config.getHost()).toString();
|
|
144
|
-
return {
|
|
146
|
+
return {
|
|
147
|
+
client: this.client,
|
|
148
|
+
host,
|
|
149
|
+
...(this.cacheIdentity ? { identity: this.cacheIdentity } : {}),
|
|
150
|
+
};
|
|
145
151
|
}
|
|
146
152
|
return registryContext();
|
|
147
153
|
}
|
|
@@ -179,4 +185,4 @@ function matchesResolveOptions(target, options) {
|
|
|
179
185
|
return target.capabilities.chat;
|
|
180
186
|
return true;
|
|
181
187
|
}
|
|
182
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixNQUFNLEVBQ04sU0FBUyxHQUVWLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFDTCxVQUFVLEdBR1gsTUFBTSx5QkFBeUIsQ0FBQztBQU9qQyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUNwQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUM7QUE0QjNELG9FQUFvRTtBQUNwRSxNQUFNLE9BQU8sdUJBQXVCO0lBQ2pCLEtBQUssQ0FBUztJQUNkLFNBQVMsQ0FBcUM7SUFDOUMsa0JBQWtCLENBQVU7SUFDNUIsTUFBTSxDQUE4QjtJQUVyRCxZQUFZLFVBQWdDLEVBQUU7UUFDNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUM7UUFDOUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQy9CLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUs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QztJQUNoRSxPQUFPO1FBQ0wsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLElBQUk7UUFDSixRQUFRLEVBQUUsUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWE7S0FDdkUsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQWE7SUFDckMsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFLLEdBQUcsb0JBQW9CO0lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsTUFBbUIsRUFBRSxPQUFvQztJQUN0RixJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO0lBQ3ZGLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUN0RSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlcXVlc3Qtc2NvcGVkIERhdGFicmlja3MgbW9kZWwgZGlzY292ZXJ5IGZvciB0aGUgQXBwS2l0IGdhdGV3YXkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQsIHR5cGUgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgbWV0YWRhdGEsXG4gIG1vZGVsQ2F0YWxvZyxcbiAgcG9saWN5LFxuICBzZWxlY3Rpb24sXG4gIHR5cGUgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zLFxufSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIHR5cGUgUmVzb2x2ZU1vZGVsSW5wdXQsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzLFxuICBNb2RlbENhcGFiaWxpdHlPdmVycmlkZSxcbiAgTW9kZWxUYXJnZXQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmNvbnN0IERFRkFVTFRfQ0FDSEVfVFRMX01TID0gNjBfMDAwO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC9tb2RlbC1nYXRld2F5L3JlZ2lzdHJ5XCIpO1xuXG4vKiogUmVzb2x1dGlvbiBjb250cm9scyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbW9kZWwgcG9saWN5IG93bmVyLiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zID0gUGljazxSZXNvbHZlTW9kZWxJbnB1dCwgXCJtb2RlbENsYXNzXCIgfCBcInJlcXVpcmVzVG9vbHNcIj47XG5cbi8qKiBEeW5hbWljIG1vZGVsIGNhdGFsb2d1ZSB1c2VkIGJ5IHJlcXVlc3Qgcm91dGluZyBhbmQgbW9kZWwtbGlzdCByZXNwb25zZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnkge1xuICBsaXN0KCk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT47XG4gIHNlYXJjaChxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPjtcbiAgcmVzb2x2ZShtb2RlbD86IHN0cmluZywgb3B0aW9ucz86IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyk6IFByb21pc2U8TW9kZWxUYXJnZXQgfCB1bmRlZmluZWQ+O1xuICByZWZyZXNoKCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciB7QGxpbmsgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnl9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHR0bE1zPzogbnVtYmVyO1xuICByZWFkb25seSBvdmVycmlkZXM/OiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuICByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuO1xuICAvKiogRGlzY292ZXIgbW9kZWxzIHdpdGggdGhpcyBjbGllbnQgaW5zdGVhZCBvZiB0aGUgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xuICByZWFkb25seSBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQ7XG59XG5cbmludGVyZmFjZSBSZWdpc3RyeUNvbnRleHQge1xuICByZWFkb25seSBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBpZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIE1vZGVsIHJlZ2lzdHJ5IGJhY2tlZCBieSB0aGUgYWN0aXZlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSBpbXBsZW1lbnRzIE1vZGVsUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3ZlcnJpZGVzOiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZWZlclN5c3RlbU1vZGVsczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy50dGxNcyA9IHBvc2l0aXZlVHRsKG9wdGlvbnMudHRsTXMpO1xuICAgIHRoaXMub3ZlcnJpZGVzID0gb3B0aW9ucy5vdmVycmlkZXMgPz8gW107XG4gICAgdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPSBvcHRpb25zLnByZWZlclN5c3RlbU1vZGVscyA/PyBmYWxzZTtcbiAgICB0aGlzLmNsaWVudCA9IG9wdGlvbnMuY2xpZW50O1xuICB9XG5cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPE1vZGVsVGFyZ2V0W10+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jb250ZXh0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibG9hZGluZyBjYXRhbG9ndWVcIiwgeyBob3N0OiBjb250ZXh0Lmhvc3QsIHR0bE1zOiB0aGlzLnR0bE1zIH0pO1xuICAgIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IG1vZGVsQ2F0YWxvZy5saXN0U2VydmluZ0VuZHBvaW50cyhcbiAgICAgIGNvbnRleHQuY2xpZW50LFxuICAgICAgY29udGV4dC5ob3N0LFxuICAgICAgY2F0YWxvZ3VlT3B0aW9ucyhjb250ZXh0LCB0aGlzLnR0bE1zKSxcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldHMgPSBlbmRwb2ludHMubWFwKChlbmRwb2ludCkgPT4gdGhpcy50YXJnZXQoZW5kcG9pbnQpKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgY2F0YWxvZ3VlXCIsIHtcbiAgICAgIGVuZHBvaW50Q291bnQ6IGVuZHBvaW50cy5sZW5ndGgsXG4gICAgICBob3N0OiBjb250ZXh0Lmhvc3QsXG4gICAgICB0YXJnZXRDb3VudDogdGFyZ2V0cy5sZW5ndGgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldHM7XG4gIH1cblxuICBhc3luYyByZXNvbHZlKFxuICAgIG1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8TW9kZWxUYXJnZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSBtb2RlbCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdW5xdWFsaWZpZWRNb2RlbChtb2RlbCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGV4YWN0SWQgPVxuICAgICAgcmVxdWVzdGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiB0YXJnZXRzLmZpbmQoXG4gICAgICAgICAgICAodGFyZ2V0KSA9PlxuICAgICAgICAgICAgICB0YXJnZXQuaWQubG9jYWxlQ29tcGFyZShyZXF1ZXN0ZWQsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogXCJhY2NlbnRcIiB9KSA9PT0gMCxcbiAgICAgICAgICApO1xuICAgIGNvbnN0IGV4YWN0QWxpYXMgPVxuICAgICAgcmVxdWVzdGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiB0YXJnZXRzLmZpbmQoKHRhcmdldCkgPT5cbiAgICAgICAgICAgIHRhcmdldC5hbGlhc2VzLnNvbWUoXG4gICAgICAgICAgICAgIChhbGlhcykgPT4gYWxpYXMubG9jYWxlQ29tcGFyZShyZXF1ZXN0ZWQsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogXCJhY2NlbnRcIiB9KSA9PT0gMCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICBjb25zdCBleGFjdCA9IGV4YWN0SWQgPz8gZXhhY3RBbGlhcztcbiAgICBpZiAoZXhhY3QgJiYgbWF0Y2hlc1Jlc29sdmVPcHRpb25zKGV4YWN0LCBvcHRpb25zKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2ZWQgZXhhY3QgbW9kZWxcIiwgeyByZXF1ZXN0ZWQsIHJlc29sdmVkOiBleGFjdC5pZCB9KTtcbiAgICAgIHJldHVybiBleGFjdDtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludHMgPSB0YXJnZXRzXG4gICAgICAubWFwKCh0YXJnZXQpID0+IHRhcmdldC5lbmRwb2ludClcbiAgICAgIC5maWx0ZXIoKGVuZHBvaW50KTogZW5kcG9pbnQgaXMgU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9PiBlbmRwb2ludCAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZXNvbHZlZCA9IHNlbGVjdGlvbi5yZXNvbHZlTW9kZWwoXG4gICAgICBlbmRwb2ludHMsXG4gICAgICB7XG4gICAgICAgIC4uLihyZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHsgZXhwbGljaXQ6IHJlcXVlc3RlZCB9IDoge30pLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcHJlZmVyU3lzdGVtTW9kZWxzOiB0aGlzLnByZWZlclN5c3RlbU1vZGVscyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSByZXNvbHZlZC5tb2RlbElkKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBmdXp6eSBtb2RlbFwiLCB7XG4gICAgICByZXF1ZXN0ZWQsXG4gICAgICByZXNvbHZlZDogdGFyZ2V0Py5pZCxcbiAgICAgIHNvdXJjZTogcmVzb2x2ZWQuc291cmNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBieUlkID0gbmV3IE1hcCh0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiBbdGFyZ2V0LmlkLCB0YXJnZXRdKSk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gdGFyZ2V0c1xuICAgICAgLm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQpXG4gICAgICAuZmlsdGVyKChlbmRwb2ludCk6IGVuZHBvaW50IGlzIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPT4gZW5kcG9pbnQgIT09IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcmFua2VkID0gW1xuICAgICAgLi4uc2VsZWN0aW9uLmxvb2t1cE1vZGVscyhcbiAgICAgICAgZW5kcG9pbnRzLFxuICAgICAgICB7IHNlYXJjaDogcXVlcnkgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICAgLi4uc2VsZWN0aW9uLmxvb2t1cE1vZGVscyhcbiAgICAgICAgZW5kcG9pbnRzLFxuICAgICAgICB7XG4gICAgICAgICAgc2VhcmNoOiBxdWVyeSxcbiAgICAgICAgICBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgIF0uc29ydCgobGVmdCwgcmlnaHQpID0+IChsZWZ0LnNjb3JlID8/IDApIC0gKHJpZ2h0LnNjb3JlID8/IDApKTtcbiAgICByZXR1cm4gcmFua2VkXG4gICAgICAubWFwKCh7IGVuZHBvaW50IH0pID0+IGJ5SWQuZ2V0KGVuZHBvaW50Lm5hbWUpKVxuICAgICAgLmZpbHRlcigodGFyZ2V0KTogdGFyZ2V0IGlzIE1vZGVsVGFyZ2V0ID0+IHRhcmdldCAhPT0gdW5kZWZpbmVkKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHRhcmdldCwgaW5kZXgsIGFsbCkgPT4gYWxsLmZpbmRJbmRleCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHRhcmdldC5pZCkgPT09IGluZGV4LFxuICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY29udGV4dCgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNsZWFyaW5nIGNhdGFsb2d1ZVwiLCB7IGhvc3Q6IGNvbnRleHQuaG9zdCB9KTtcbiAgICBpZiAoY29udGV4dC5pZGVudGl0eSkge1xuICAgICAgYXdhaXQgbW9kZWxDYXRhbG9nLmNsZWFyU2VydmluZ0VuZHBvaW50c0NhY2hlKGNvbnRleHQuaG9zdCwgY29udGV4dC5pZGVudGl0eSk7XG4gICAgfVxuICAgIGF3YWl0IG1vZGVsQ2F0YWxvZy5saXN0U2VydmluZ0VuZHBvaW50cyhcbiAgICAgIGNvbnRleHQuY2xpZW50LFxuICAgICAgY29udGV4dC5ob3N0LFxuICAgICAgY2F0YWxvZ3VlT3B0aW9ucyhjb250ZXh0LCB0aGlzLnR0bE1zKSxcbiAgICApO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlZnJlc2hlZCBjYXRhbG9ndWVcIiwgeyBob3N0OiBjb250ZXh0Lmhvc3QgfSk7XG4gIH1cblxuICBwcml2YXRlIHRhcmdldChlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsVGFyZ2V0IHtcbiAgICBjb25zdCBwdWJsaXNoZWQgPSBtZXRhZGF0YS5tb2RlbENhcGFiaWxpdGllc0ZvcihlbmRwb2ludCk7XG4gICAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnQuZmFtaWx5Py50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG9wZW5BaUZhbWlseSA9IGZhbWlseSA9PT0gXCJncHRcIiB8fCBmYW1pbHkgPT09IFwib3BlbmFpXCIgfHwgZW5kcG9pbnQubmFtZS5pbmNsdWRlcyhcImNvZGV4XCIpO1xuICAgIGNvbnN0IG1vZGVsU2VydmljZU5hbWUgPSBwb2xpY3kubW9kZWxTZXJ2aWNlTmFtZShlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lKTtcbiAgICBjb25zdCBlbWJlZGRpbmdzID1cbiAgICAgIGVuZHBvaW50LmNsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZyB8fCBlbmRwb2ludC50YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCI7XG4gICAgY29uc3QgY2FwYWJpbGl0aWVzOiBNb2RlbENhcGFiaWxpdGllcyA9IHtcbiAgICAgIHJlc3BvbnNlczogIWVtYmVkZGluZ3MgJiYgKG9wZW5BaUZhbWlseSB8fCBwdWJsaXNoZWQucmVzcG9uc2VzKSxcbiAgICAgIG9wZW5SZXNwb25zZXM6ICFlbWJlZGRpbmdzICYmICFvcGVuQWlGYW1pbHksXG4gICAgICBjaGF0OiAhZW1iZWRkaW5ncyxcbiAgICAgIGFudGhyb3BpYzogZmFtaWx5ID09PSBcImNsYXVkZVwiLFxuICAgICAgZW1iZWRkaW5ncyxcbiAgICAgIGFpR2F0ZXdheUNvZGV4OlxuICAgICAgICAhZW1iZWRkaW5ncyAmJiBCb29sZWFuKG1vZGVsU2VydmljZU5hbWUpICYmIGZhbWlseSAhPT0gXCJjbGF1ZGVcIiAmJiBmYW1pbHkgIT09IFwiZ2VtaW5pXCIsXG4gICAgICB0b29sczogZW5kcG9pbnQuc3VwcG9ydHNUb29scyA9PT0gdHJ1ZSxcbiAgICAgIHJlYXNvbmluZzogQm9vbGVhbihlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzPy5sZW5ndGgpIHx8IHB1Ymxpc2hlZC5yZWFzb25pbmcsXG4gICAgICBzdHJlYW1pbmc6IHRydWUsXG4gICAgICBwYXJhbGxlbFRvb2xzOiBlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID09PSB0cnVlLFxuICAgICAgY3VzdG9tVG9vbHM6IHB1Ymxpc2hlZC5hcHBseVBhdGNoIHx8IGVuZHBvaW50Lm5hbWUuaW5jbHVkZXMoXCJjb2RleFwiKSxcbiAgICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHRydWUsXG4gICAgICB3ZWJTZWFyY2g6IHB1Ymxpc2hlZC53ZWJTZWFyY2gsXG4gICAgICBpbWFnZUlucHV0OiBwdWJsaXNoZWQuaW1hZ2VJbnB1dCxcbiAgICAgIGFwcGx5UGF0Y2g6IHB1Ymxpc2hlZC5hcHBseVBhdGNoLFxuICAgIH07XG4gICAgY29uc3QgYWxpYXNlcyA9IG5ldyBTZXQoXG4gICAgICBbXG4gICAgICAgIGVuZHBvaW50Lm5hbWUsXG4gICAgICAgIGVuZHBvaW50LmRpc3BsYXlOYW1lLFxuICAgICAgICBlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lLFxuICAgICAgICBtb2RlbFNlcnZpY2VOYW1lLFxuICAgICAgICAuLi5PYmplY3QudmFsdWVzKGVuZHBvaW50LnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gICAgICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZT8udHJpbSgpKSksXG4gICAgKTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMub3ZlcnJpZGVzLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICBjYW5kaWRhdGUubW9kZWwgPT09IGVuZHBvaW50Lm5hbWUgfHxcbiAgICAgICAgWy4uLmFsaWFzZXNdLnNvbWUoKGFsaWFzKSA9PiBhbGlhcyA9PT0gY2FuZGlkYXRlLm1vZGVsKSxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZW5kcG9pbnQubmFtZSxcbiAgICAgIGFsaWFzZXM6IFsuLi5hbGlhc2VzXSxcbiAgICAgIGRpc3BsYXlOYW1lOiBlbmRwb2ludC5kaXNwbGF5TmFtZSA/PyBlbmRwb2ludC5uYW1lLFxuICAgICAgLi4uKGVuZHBvaW50LmZhbWlseSA/IHsgZmFtaWx5OiBlbmRwb2ludC5mYW1pbHkgfSA6IHt9KSxcbiAgICAgIC4uLihtb2RlbFNlcnZpY2VOYW1lID8geyBtb2RlbFNlcnZpY2VOYW1lIH0gOiB7fSksXG4gICAgICBlbmRwb2ludCxcbiAgICAgIGNhcGFiaWxpdGllczogeyAuLi5jYXBhYmlsaXRpZXMsIC4uLm92ZXJyaWRlPy5jYXBhYmlsaXRpZXMgfSxcbiAgICAgIHJlYXNvbmluZ0VmZm9ydHM6IGVuZHBvaW50LnJlYXNvbmluZ0VmZm9ydHMgPz8gW10sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udGV4dCgpOiBQcm9taXNlPFJlZ2lzdHJ5Q29udGV4dD4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkge1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCB0aGlzLmNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgcmV0dXJuIHsgY2xpZW50OiB0aGlzLmNsaWVudCwgaG9zdCB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVnaXN0cnlDb250ZXh0KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2F0YWxvZ3VlT3B0aW9ucyhjb250ZXh0OiBSZWdpc3RyeUNvbnRleHQsIHR0bE1zOiBudW1iZXIpOiBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIHR0bE1zLFxuICAgIC4uLihjb250ZXh0LmlkZW50aXR5ID8geyBjYWNoZUlkZW50aXR5OiBjb250ZXh0LmlkZW50aXR5IH0gOiB7fSksXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZ2lzdHJ5Q29udGV4dCgpOiBQcm9taXNlPFJlZ2lzdHJ5Q29udGV4dD4ge1xuICBjb25zdCBjb250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIHJldHVybiB7XG4gICAgY2xpZW50OiBjb250ZXh0LmNsaWVudCxcbiAgICBob3N0LFxuICAgIGlkZW50aXR5OiBcInVzZXJJZFwiIGluIGNvbnRleHQgPyBjb250ZXh0LnVzZXJJZCA6IGNvbnRleHQuc2VydmljZVVzZXJJZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5xdWFsaWZpZWRNb2RlbChtb2RlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG1vZGVsLnRyaW0oKS5yZXBsYWNlKC9eKD86ZGJ4fGRhdGFicmlja3MpXFwvL2ksIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBwb3NpdGl2ZVR0bCh2YWx1ZSA9IERFRkFVTFRfQ0FDSEVfVFRMX01TKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNb2RlbCByZWdpc3RyeSB0dGxNcyBtdXN0IGJlIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlclwiKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNSZXNvbHZlT3B0aW9ucyh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBvcHRpb25zOiBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMpOiBib29sZWFuIHtcbiAgaWYgKG9wdGlvbnMucmVxdWlyZXNUb29scyAmJiAhdGFyZ2V0LmNhcGFiaWxpdGllcy50b29scykgcmV0dXJuIGZhbHNlO1xuICBpZiAob3B0aW9ucy5tb2RlbENsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZykgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuZW1iZWRkaW5ncztcbiAgaWYgKG9wdGlvbnMubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGFyZ2V0LmNhcGFiaWxpdGllcy5jaGF0O1xuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixNQUFNLEVBQ04sU0FBUyxHQUVWLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFDTCxVQUFVLEdBR1gsTUFBTSx5QkFBeUIsQ0FBQztBQU9qQyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUNwQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUM7QUE4QjNELG9FQUFvRTtBQUNwRSxNQUFNLE9BQU8sdUJBQXVCO0lBQ2pCLEtBQUssQ0FBUztJQUNkLFNBQVMsQ0FBcUM7SUFDOUMsa0JBQWtCLENBQVU7SUFDNUIsTUFBTSxDQUE4QjtJQUNwQyxhQUFhLENBQXFCO0lBRW5ELFlBQVksVUFBZ0MsRUFBRTtRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQztRQUM5RCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0lBQzdDLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8s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TSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDdEUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXF1ZXN0LXNjb3BlZCBEYXRhYnJpY2tzIG1vZGVsIGRpc2NvdmVyeSBmb3IgdGhlIEFwcEtpdCBnYXRld2F5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0LCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIG1ldGFkYXRhLFxuICBtb2RlbENhdGFsb2csXG4gIHBvbGljeSxcbiAgc2VsZWN0aW9uLFxuICB0eXBlIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBNb2RlbENsYXNzLFxuICB0eXBlIFJlc29sdmVNb2RlbElucHV0LFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuICBNb2RlbENhcGFiaWxpdGllcyxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsVGFyZ2V0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG5jb25zdCBERUZBVUxUX0NBQ0hFX1RUTF9NUyA9IDYwXzAwMDtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS9yZWdpc3RyeVwiKTtcblxuLyoqIFJlc29sdXRpb24gY29udHJvbHMgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsIHBvbGljeSBvd25lci4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyA9IFBpY2s8UmVzb2x2ZU1vZGVsSW5wdXQsIFwibW9kZWxDbGFzc1wiIHwgXCJyZXF1aXJlc1Rvb2xzXCI+O1xuXG4vKiogRHluYW1pYyBtb2RlbCBjYXRhbG9ndWUgdXNlZCBieSByZXF1ZXN0IHJvdXRpbmcgYW5kIG1vZGVsLWxpc3QgcmVzcG9uc2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5IHtcbiAgbGlzdCgpOiBQcm9taXNlPE1vZGVsVGFyZ2V0W10+O1xuICBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT47XG4gIHJlc29sdmUobW9kZWw/OiBzdHJpbmcsIG9wdGlvbnM/OiBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMpOiBQcm9taXNlPE1vZGVsVGFyZ2V0IHwgdW5kZWZpbmVkPjtcbiAgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3Ige0BsaW5rIERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSZWdpc3RyeU9wdGlvbnMge1xuICByZWFkb25seSB0dGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogcmVhZG9ubHkgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGVbXTtcbiAgcmVhZG9ubHkgcHJlZmVyU3lzdGVtTW9kZWxzPzogYm9vbGVhbjtcbiAgLyoqIERpc2NvdmVyIG1vZGVscyB3aXRoIHRoaXMgY2xpZW50IGluc3RlYWQgb2YgdGhlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbiAgcmVhZG9ubHkgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50O1xuICAvKiogVHJ1c3RlZCBjcmVkZW50aWFsIGlkZW50aXR5IHVzZWQgdG8gaXNvbGF0ZSBjYWNoZWQgY2F0YWxvZ3VlcyBmb3IgYW4gaW5qZWN0ZWQgY2xpZW50LiAqL1xuICByZWFkb25seSBjYWNoZUlkZW50aXR5Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVnaXN0cnlDb250ZXh0IHtcbiAgcmVhZG9ubHkgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgaWRlbnRpdHk/OiBzdHJpbmc7XG59XG5cbi8qKiBNb2RlbCByZWdpc3RyeSBiYWNrZWQgYnkgdGhlIGFjdGl2ZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG5leHBvcnQgY2xhc3MgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkgaW1wbGVtZW50cyBNb2RlbFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0dGxNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJyaWRlczogcmVhZG9ubHkgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGVbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGVJZGVudGl0eTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vZGVsUmVnaXN0cnlPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnR0bE1zID0gcG9zaXRpdmVUdGwob3B0aW9ucy50dGxNcyk7XG4gICAgdGhpcy5vdmVycmlkZXMgPSBvcHRpb25zLm92ZXJyaWRlcyA/PyBbXTtcbiAgICB0aGlzLnByZWZlclN5c3RlbU1vZGVscyA9IG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzID8/IGZhbHNlO1xuICAgIHRoaXMuY2xpZW50ID0gb3B0aW9ucy5jbGllbnQ7XG4gICAgdGhpcy5jYWNoZUlkZW50aXR5ID0gb3B0aW9ucy5jYWNoZUlkZW50aXR5O1xuICB9XG5cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPE1vZGVsVGFyZ2V0W10+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jb250ZXh0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibG9hZGluZyBjYXRhbG9ndWVcIiwgeyBob3N0OiBjb250ZXh0Lmhvc3QsIHR0bE1zOiB0aGlzLnR0bE1zIH0pO1xuICAgIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IG1vZGVsQ2F0YWxvZy5saXN0U2VydmluZ0VuZHBvaW50cyhcbiAgICAgIGNvbnRleHQuY2xpZW50LFxuICAgICAgY29udGV4dC5ob3N0LFxuICAgICAgY2F0YWxvZ3VlT3B0aW9ucyhjb250ZXh0LCB0aGlzLnR0bE1zKSxcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldHMgPSBlbmRwb2ludHMubWFwKChlbmRwb2ludCkgPT4gdGhpcy50YXJnZXQoZW5kcG9pbnQpKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgY2F0YWxvZ3VlXCIsIHtcbiAgICAgIGVuZHBvaW50Q291bnQ6IGVuZHBvaW50cy5sZW5ndGgsXG4gICAgICBob3N0OiBjb250ZXh0Lmhvc3QsXG4gICAgICB0YXJnZXRDb3VudDogdGFyZ2V0cy5sZW5ndGgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldHM7XG4gIH1cblxuICBhc3luYyByZXNvbHZlKFxuICAgIG1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8TW9kZWxUYXJnZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSBtb2RlbCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdW5xdWFsaWZpZWRNb2RlbChtb2RlbCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGV4YWN0SWQgPVxuICAgICAgcmVxdWVzdGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiB0YXJnZXRzLmZpbmQoXG4gICAgICAgICAgICAodGFyZ2V0KSA9PlxuICAgICAgICAgICAgICB0YXJnZXQuaWQubG9jYWxlQ29tcGFyZShyZXF1ZXN0ZWQsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogXCJhY2NlbnRcIiB9KSA9PT0gMCxcbiAgICAgICAgICApO1xuICAgIGNvbnN0IGV4YWN0QWxpYXMgPVxuICAgICAgcmVxdWVzdGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiB0YXJnZXRzLmZpbmQoKHRhcmdldCkgPT5cbiAgICAgICAgICAgIHRhcmdldC5hbGlhc2VzLnNvbWUoXG4gICAgICAgICAgICAgIChhbGlhcykgPT4gYWxpYXMubG9jYWxlQ29tcGFyZShyZXF1ZXN0ZWQsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogXCJhY2NlbnRcIiB9KSA9PT0gMCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICBjb25zdCBleGFjdCA9IGV4YWN0SWQgPz8gZXhhY3RBbGlhcztcbiAgICBpZiAoZXhhY3QgJiYgbWF0Y2hlc1Jlc29sdmVPcHRpb25zKGV4YWN0LCBvcHRpb25zKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2ZWQgZXhhY3QgbW9kZWxcIiwgeyByZXF1ZXN0ZWQsIHJlc29sdmVkOiBleGFjdC5pZCB9KTtcbiAgICAgIHJldHVybiBleGFjdDtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludHMgPSB0YXJnZXRzXG4gICAgICAubWFwKCh0YXJnZXQpID0+IHRhcmdldC5lbmRwb2ludClcbiAgICAgIC5maWx0ZXIoKGVuZHBvaW50KTogZW5kcG9pbnQgaXMgU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9PiBlbmRwb2ludCAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZXNvbHZlZCA9IHNlbGVjdGlvbi5yZXNvbHZlTW9kZWwoXG4gICAgICBlbmRwb2ludHMsXG4gICAgICB7XG4gICAgICAgIC4uLihyZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHsgZXhwbGljaXQ6IHJlcXVlc3RlZCB9IDoge30pLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcHJlZmVyU3lzdGVtTW9kZWxzOiB0aGlzLnByZWZlclN5c3RlbU1vZGVscyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSByZXNvbHZlZC5tb2RlbElkKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBmdXp6eSBtb2RlbFwiLCB7XG4gICAgICByZXF1ZXN0ZWQsXG4gICAgICByZXNvbHZlZDogdGFyZ2V0Py5pZCxcbiAgICAgIHNvdXJjZTogcmVzb2x2ZWQuc291cmNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBieUlkID0gbmV3IE1hcCh0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiBbdGFyZ2V0LmlkLCB0YXJnZXRdKSk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gdGFyZ2V0c1xuICAgICAgLm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQpXG4gICAgICAuZmlsdGVyKChlbmRwb2ludCk6IGVuZHBvaW50IGlzIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPT4gZW5kcG9pbnQgIT09IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcmFua2VkID0gW1xuICAgICAgLi4uc2VsZWN0aW9uLmxvb2t1cE1vZGVscyhcbiAgICAgICAgZW5kcG9pbnRzLFxuICAgICAgICB7IHNlYXJjaDogcXVlcnkgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICAgLi4uc2VsZWN0aW9uLmxvb2t1cE1vZGVscyhcbiAgICAgICAgZW5kcG9pbnRzLFxuICAgICAgICB7XG4gICAgICAgICAgc2VhcmNoOiBxdWVyeSxcbiAgICAgICAgICBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgIF0uc29ydCgobGVmdCwgcmlnaHQpID0+IChsZWZ0LnNjb3JlID8/IDApIC0gKHJpZ2h0LnNjb3JlID8/IDApKTtcbiAgICByZXR1cm4gcmFua2VkXG4gICAgICAubWFwKCh7IGVuZHBvaW50IH0pID0+IGJ5SWQuZ2V0KGVuZHBvaW50Lm5hbWUpKVxuICAgICAgLmZpbHRlcigodGFyZ2V0KTogdGFyZ2V0IGlzIE1vZGVsVGFyZ2V0ID0+IHRhcmdldCAhPT0gdW5kZWZpbmVkKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHRhcmdldCwgaW5kZXgsIGFsbCkgPT4gYWxsLmZpbmRJbmRleCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHRhcmdldC5pZCkgPT09IGluZGV4LFxuICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY29udGV4dCgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNsZWFyaW5nIGNhdGFsb2d1ZVwiLCB7IGhvc3Q6IGNvbnRleHQuaG9zdCB9KTtcbiAgICBpZiAoY29udGV4dC5pZGVudGl0eSkge1xuICAgICAgYXdhaXQgbW9kZWxDYXRhbG9nLmNsZWFyU2VydmluZ0VuZHBvaW50c0NhY2hlKGNvbnRleHQuaG9zdCwgY29udGV4dC5pZGVudGl0eSk7XG4gICAgfVxuICAgIGF3YWl0IG1vZGVsQ2F0YWxvZy5saXN0U2VydmluZ0VuZHBvaW50cyhcbiAgICAgIGNvbnRleHQuY2xpZW50LFxuICAgICAgY29udGV4dC5ob3N0LFxuICAgICAgY2F0YWxvZ3VlT3B0aW9ucyhjb250ZXh0LCB0aGlzLnR0bE1zKSxcbiAgICApO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlZnJlc2hlZCBjYXRhbG9ndWVcIiwgeyBob3N0OiBjb250ZXh0Lmhvc3QgfSk7XG4gIH1cblxuICBwcml2YXRlIHRhcmdldChlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsVGFyZ2V0IHtcbiAgICBjb25zdCBwdWJsaXNoZWQgPSBtZXRhZGF0YS5tb2RlbENhcGFiaWxpdGllc0ZvcihlbmRwb2ludCk7XG4gICAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnQuZmFtaWx5Py50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG9wZW5BaUZhbWlseSA9IGZhbWlseSA9PT0gXCJncHRcIiB8fCBmYW1pbHkgPT09IFwib3BlbmFpXCIgfHwgZW5kcG9pbnQubmFtZS5pbmNsdWRlcyhcImNvZGV4XCIpO1xuICAgIGNvbnN0IG1vZGVsU2VydmljZU5hbWUgPSBwb2xpY3kubW9kZWxTZXJ2aWNlTmFtZShlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lKTtcbiAgICBjb25zdCBlbWJlZGRpbmdzID1cbiAgICAgIGVuZHBvaW50LmNsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZyB8fCBlbmRwb2ludC50YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCI7XG4gICAgY29uc3QgY2FwYWJpbGl0aWVzOiBNb2RlbENhcGFiaWxpdGllcyA9IHtcbiAgICAgIHJlc3BvbnNlczogIWVtYmVkZGluZ3MgJiYgKG9wZW5BaUZhbWlseSB8fCBwdWJsaXNoZWQucmVzcG9uc2VzKSxcbiAgICAgIG9wZW5SZXNwb25zZXM6ICFlbWJlZGRpbmdzICYmICFvcGVuQWlGYW1pbHksXG4gICAgICBjaGF0OiAhZW1iZWRkaW5ncyxcbiAgICAgIGFudGhyb3BpYzogZmFtaWx5ID09PSBcImNsYXVkZVwiLFxuICAgICAgZW1iZWRkaW5ncyxcbiAgICAgIGFpR2F0ZXdheUNvZGV4OlxuICAgICAgICAhZW1iZWRkaW5ncyAmJiBCb29sZWFuKG1vZGVsU2VydmljZU5hbWUpICYmIGZhbWlseSAhPT0gXCJjbGF1ZGVcIiAmJiBmYW1pbHkgIT09IFwiZ2VtaW5pXCIsXG4gICAgICB0b29sczogZW5kcG9pbnQuc3VwcG9ydHNUb29scyA9PT0gdHJ1ZSxcbiAgICAgIHJlYXNvbmluZzogQm9vbGVhbihlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzPy5sZW5ndGgpIHx8IHB1Ymxpc2hlZC5yZWFzb25pbmcsXG4gICAgICBzdHJlYW1pbmc6IHRydWUsXG4gICAgICBwYXJhbGxlbFRvb2xzOiBlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID09PSB0cnVlLFxuICAgICAgY3VzdG9tVG9vbHM6IHB1Ymxpc2hlZC5hcHBseVBhdGNoIHx8IGVuZHBvaW50Lm5hbWUuaW5jbHVkZXMoXCJjb2RleFwiKSxcbiAgICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHRydWUsXG4gICAgICB3ZWJTZWFyY2g6IHB1Ymxpc2hlZC53ZWJTZWFyY2gsXG4gICAgICBpbWFnZUlucHV0OiBwdWJsaXNoZWQuaW1hZ2VJbnB1dCxcbiAgICAgIGFwcGx5UGF0Y2g6IHB1Ymxpc2hlZC5hcHBseVBhdGNoLFxuICAgIH07XG4gICAgY29uc3QgYWxpYXNlcyA9IG5ldyBTZXQoXG4gICAgICBbXG4gICAgICAgIGVuZHBvaW50Lm5hbWUsXG4gICAgICAgIGVuZHBvaW50LmRpc3BsYXlOYW1lLFxuICAgICAgICBlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lLFxuICAgICAgICBtb2RlbFNlcnZpY2VOYW1lLFxuICAgICAgICAuLi5PYmplY3QudmFsdWVzKGVuZHBvaW50LnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gICAgICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZT8udHJpbSgpKSksXG4gICAgKTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMub3ZlcnJpZGVzLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICBjYW5kaWRhdGUubW9kZWwgPT09IGVuZHBvaW50Lm5hbWUgfHxcbiAgICAgICAgWy4uLmFsaWFzZXNdLnNvbWUoKGFsaWFzKSA9PiBhbGlhcyA9PT0gY2FuZGlkYXRlLm1vZGVsKSxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZW5kcG9pbnQubmFtZSxcbiAgICAgIGFsaWFzZXM6IFsuLi5hbGlhc2VzXSxcbiAgICAgIGRpc3BsYXlOYW1lOiBlbmRwb2ludC5kaXNwbGF5TmFtZSA/PyBlbmRwb2ludC5uYW1lLFxuICAgICAgLi4uKGVuZHBvaW50LmZhbWlseSA/IHsgZmFtaWx5OiBlbmRwb2ludC5mYW1pbHkgfSA6IHt9KSxcbiAgICAgIC4uLihtb2RlbFNlcnZpY2VOYW1lID8geyBtb2RlbFNlcnZpY2VOYW1lIH0gOiB7fSksXG4gICAgICBlbmRwb2ludCxcbiAgICAgIGNhcGFiaWxpdGllczogeyAuLi5jYXBhYmlsaXRpZXMsIC4uLm92ZXJyaWRlPy5jYXBhYmlsaXRpZXMgfSxcbiAgICAgIHJlYXNvbmluZ0VmZm9ydHM6IGVuZHBvaW50LnJlYXNvbmluZ0VmZm9ydHMgPz8gW10sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udGV4dCgpOiBQcm9taXNlPFJlZ2lzdHJ5Q29udGV4dD4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkge1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCB0aGlzLmNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgLi4uKHRoaXMuY2FjaGVJZGVudGl0eSA/IHsgaWRlbnRpdHk6IHRoaXMuY2FjaGVJZGVudGl0eSB9IDoge30pLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5Q29udGV4dCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZU9wdGlvbnMoY29udGV4dDogUmVnaXN0cnlDb250ZXh0LCB0dGxNczogbnVtYmVyKTogTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICB0dGxNcyxcbiAgICAuLi4oY29udGV4dC5pZGVudGl0eSA/IHsgY2FjaGVJZGVudGl0eTogY29udGV4dC5pZGVudGl0eSB9IDoge30pLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWdpc3RyeUNvbnRleHQoKTogUHJvbWlzZTxSZWdpc3RyeUNvbnRleHQ+IHtcbiAgY29uc3QgY29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICByZXR1cm4ge1xuICAgIGNsaWVudDogY29udGV4dC5jbGllbnQsXG4gICAgaG9zdCxcbiAgICBpZGVudGl0eTogXCJ1c2VySWRcIiBpbiBjb250ZXh0ID8gY29udGV4dC51c2VySWQgOiBjb250ZXh0LnNlcnZpY2VVc2VySWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVucXVhbGlmaWVkTW9kZWwobW9kZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBtb2RlbC50cmltKCkucmVwbGFjZSgvXig/OmRieHxkYXRhYnJpY2tzKVxcLy9pLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpdmVUdGwodmFsdWUgPSBERUZBVUxUX0NBQ0hFX1RUTF9NUyk6IG51bWJlciB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTW9kZWwgcmVnaXN0cnkgdHRsTXMgbXVzdCBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzUmVzb2x2ZU9wdGlvbnModGFyZ2V0OiBNb2RlbFRhcmdldCwgb3B0aW9uczogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zKTogYm9vbGVhbiB7XG4gIGlmIChvcHRpb25zLnJlcXVpcmVzVG9vbHMgJiYgIXRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMpIHJldHVybiBmYWxzZTtcbiAgaWYgKG9wdGlvbnMubW9kZWxDbGFzcyA9PT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcpIHJldHVybiB0YXJnZXQuY2FwYWJpbGl0aWVzLmVtYmVkZGluZ3M7XG4gIGlmIChvcHRpb25zLm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdDtcbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
|
package/lib/src/router.d.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
+
import type express from "express";
|
|
6
7
|
import type { GatewayRoute, RequestedFeatures, ResolveRouteInput } from "@dbx-tools/shared-model-gateway";
|
|
7
8
|
/** Error returned when preserving a requested protocol feature is impossible. */
|
|
8
9
|
export declare class UnsupportedGatewayFeatureError extends Error {
|
|
@@ -14,5 +15,5 @@ export declare class UnsupportedGatewayFeatureError extends Error {
|
|
|
14
15
|
export declare function resolveRoute(input: ResolveRouteInput): GatewayRoute;
|
|
15
16
|
/** Detect route-affecting features from an OpenAI or Anthropic request body. */
|
|
16
17
|
export declare function requestedFeatures(body: Readonly<Record<string, unknown>>): RequestedFeatures;
|
|
17
|
-
/** Return whether
|
|
18
|
-
export declare function
|
|
18
|
+
/** Return whether a request selects Codex compatibility behavior. */
|
|
19
|
+
export declare function isCodexRequest(request: express.Request): boolean;
|
package/lib/src/router.js
CHANGED
|
@@ -85,9 +85,12 @@ export function requestedFeatures(body) {
|
|
|
85
85
|
applyPatch: toolNames.some((name) => /^apply[_-]?patch$/i.test(name)),
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
|
-
/** Return whether
|
|
89
|
-
export function
|
|
90
|
-
|
|
88
|
+
/** Return whether a request selects Codex compatibility behavior. */
|
|
89
|
+
export function isCodexRequest(request) {
|
|
90
|
+
if (request.header("originator")?.toLowerCase().includes("codex") === true)
|
|
91
|
+
return true;
|
|
92
|
+
const clientVersion = request.query.client_version;
|
|
93
|
+
return typeof clientVersion === "string" && clientVersion.trim().length > 0;
|
|
91
94
|
}
|
|
92
95
|
function directRoute(input, upstreamProtocol, upstreamModel) {
|
|
93
96
|
return {
|
|
@@ -151,4 +154,4 @@ function containsImageInput(value) {
|
|
|
151
154
|
return true;
|
|
152
155
|
return Object.entries(value).some(([key, nested]) => key !== "arguments" && key !== "input" && containsImageInput(nested));
|
|
153
156
|
}
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVNsRCxpRkFBaUY7QUFDakYsTUFBTSxPQUFPLDhCQUErQixTQUFRLEtBQUs7SUFHbEM7SUFGWixNQUFNLEdBQUcsR0FBRyxDQUFDO0lBRXRCLFlBQXFCLFFBQTJCO1FBQzlDLEtBQUssQ0FBQywwREFBMEQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFEcEUsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7UUFFOUMsSUFBSSxDQUFDLElBQUksR0FBRyxnQ0FBZ0MsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFFRCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUF3QjtJQUNuRCxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDbkQsSUFBSSxjQUFjLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksOEJBQThCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxJQUFJLGNBQWMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQ0Usb0JBQW9CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztZQUN0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QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1RSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDL0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLFdBQVcsSUFBSSxHQUFHLEtBQUssT0FBTyxJQUFJLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUN4RixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHVyZSBjYXBhYmlsaXR5LWRyaXZlbiByb3V0ZSBzZWxlY3Rpb24gZm9yIG1vZGVsLWdhdGV3YXkgcmVxdWVzdHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBvbGljeSB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBpc1JlY29yZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEdhdGV3YXlSb3V0ZSxcbiAgTW9kZWxUYXJnZXQsXG4gIFJlcXVlc3RlZEZlYXR1cmVzLFxuICBSZXNvbHZlUm91dGVJbnB1dCxcbiAgVXBzdHJlYW1Qcm90b2NvbCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuLyoqIEVycm9yIHJldHVybmVkIHdoZW4gcHJlc2VydmluZyBhIHJlcXVlc3RlZCBwcm90b2NvbCBmZWF0dXJlIGlzIGltcG9zc2libGUuICovXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGF0dXMgPSA0MDA7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgZmVhdHVyZXM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG4gICAgc3VwZXIoYFRoZSBzZWxlY3RlZCBtb2RlbCBjYW5ub3QgcHJlc2VydmUgcmVxdWVzdGVkIGZlYXR1cmVzOiAke2ZlYXR1cmVzLmpvaW4oXCIsIFwiKX1gKTtcbiAgICB0aGlzLm5hbWUgPSBcIlVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvclwiO1xuICB9XG59XG5cbi8qKiBTZWxlY3QgdGhlIGxvd2VzdC1vdmVyaGVhZCB1cHN0cmVhbSB0aGF0IHByZXNlcnZlcyB0aGUgY2xpZW50IGNvbnRyYWN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSb3V0ZShpbnB1dDogUmVzb2x2ZVJvdXRlSW5wdXQpOiBHYXRld2F5Um91dGUge1xuICBjb25zdCB7IGNsaWVudFByb3RvY29sLCBmZWF0dXJlcywgdGFyZ2V0IH0gPSBpbnB1dDtcbiAgaWYgKGNsaWVudFByb3RvY29sID09PSBcIm9wZW5haS1lbWJlZGRpbmdzXCIpIHtcbiAgICBpZiAoIXRhcmdldC5jYXBhYmlsaXRpZXMuZW1iZWRkaW5ncykge1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvcihbXCJlbWJlZGRpbmdzXCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtZW1iZWRkaW5nc1wiLCB0YXJnZXQuaWQpO1xuICB9XG4gIGlmIChjbGllbnRQcm90b2NvbCA9PT0gXCJvcGVuYWktcmVzcG9uc2VzXCIpIHtcbiAgICByZWplY3RTdGF0ZWZ1bFJlc3BvbnNlcyhmZWF0dXJlcyk7XG4gICAgaWYgKFxuICAgICAgY2FuVXNlQWlHYXRld2F5Q29kZXgodGFyZ2V0LCBmZWF0dXJlcykgJiZcbiAgICAgIHBvbGljeS5wcmVmZXJzU3lzdGVtTW9kZWxTZXJ2aWNlKFxuICAgICAgICBpbnB1dC5yZXF1ZXN0ZWRNb2RlbCxcbiAgICAgICAgdGFyZ2V0LmlkLFxuICAgICAgICB0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZSEsXG4gICAgICAgIGlucHV0LnByZWZlclN5c3RlbU1vZGVscyA9PT0gdHJ1ZSxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBkaXJlY3RSb3V0ZShpbnB1dCwgXCJkYXRhYnJpY2tzLWFpLWdhdGV3YXktY29kZXhcIiwgdGFyZ2V0Lm1vZGVsU2VydmljZU5hbWUhKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMucmVzcG9uc2VzICYmIHN1cHBvcnRzRGlyZWN0UmVzcG9uc2VzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1yZXNwb25zZXNcIiwgdGFyZ2V0LmlkKTtcbiAgICB9XG4gICAgaWYgKGNhblVzZUFpR2F0ZXdheUNvZGV4KHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1haS1nYXRld2F5LWNvZGV4XCIsIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lISk7XG4gICAgfVxuICAgIGlmICh0YXJnZXQuY2FwYWJpbGl0aWVzLm9wZW5SZXNwb25zZXMgJiYgc3VwcG9ydHNPcGVuUmVzcG9uc2VzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1vcGVuLXJlc3BvbnNlc1wiLCB0YXJnZXQuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlKGlucHV0KTtcbiAgfVxuXG4gIGlmIChjbGllbnRQcm90b2NvbCA9PT0gXCJvcGVuYWktY2hhdFwiKSB7XG4gICAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdCAmJiBzdXBwb3J0c1Rvb2xzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1jaGF0XCIsIHRhcmdldC5pZCk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkUm91dGUoaW5wdXQpO1xuICB9XG5cbiAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljICYmIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykpIHtcbiAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1hbnRocm9waWNcIiwgdGFyZ2V0LmlkKTtcbiAgfVxuICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlKGlucHV0KTtcbn1cblxuLyoqIERldGVjdCByb3V0ZS1hZmZlY3RpbmcgZmVhdHVyZXMgZnJvbSBhbiBPcGVuQUkgb3IgQW50aHJvcGljIHJlcXVlc3QgYm9keS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0ZWRGZWF0dXJlcyhib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBSZXF1ZXN0ZWRGZWF0dXJlcyB7XG4gIGNvbnN0IHRvb2xzID0gQXJyYXkuaXNBcnJheShib2R5LnRvb2xzKSA/IGJvZHkudG9vbHMgOiBbXTtcbiAgY29uc3QgdG9vbFJlY29yZHMgPSB0b29scy5maWx0ZXIoKHRvb2wpOiB0b29sIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IGlzUmVjb3JkKHRvb2wpKTtcbiAgY29uc3QgdG9vbFR5cGVzID0gdG9vbFJlY29yZHMubWFwKCh0b29sKSA9PiB0b29sLnR5cGUpO1xuICBjb25zdCB0b29sTmFtZXMgPSB0b29sUmVjb3Jkc1xuICAgIC5tYXAoKHRvb2wpID0+XG4gICAgICB0eXBlb2YgdG9vbC5uYW1lID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gdG9vbC5uYW1lXG4gICAgICAgIDogaXNSZWNvcmQodG9vbC5mdW5jdGlvbikgJiYgdHlwZW9mIHRvb2wuZnVuY3Rpb24ubmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gdG9vbC5mdW5jdGlvbi5uYW1lXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgKVxuICAgIC5maWx0ZXIoKG5hbWUpOiBuYW1lIGlzIHN0cmluZyA9PiBuYW1lICE9PSB1bmRlZmluZWQpO1xuICBjb25zdCB0ZXh0ID0gaXNSZWNvcmQoYm9keS50ZXh0KSA/IGJvZHkudGV4dCA6IHt9O1xuICBjb25zdCBmb3JtYXQgPSBpc1JlY29yZCh0ZXh0LmZvcm1hdCkgPyB0ZXh0LmZvcm1hdC50eXBlIDogdGV4dC5mb3JtYXQ7XG4gIGNvbnN0IG91dHB1dENvbmZpZyA9IGlzUmVjb3JkKGJvZHkub3V0cHV0X2NvbmZpZykgPyBib2R5Lm91dHB1dF9jb25maWcgOiB7fTtcbiAgcmV0dXJuIHtcbiAgICBiYWNrZ3JvdW5kOiBib2R5LmJhY2tncm91bmQgPT09IHRydWUsXG4gICAgY3VzdG9tVG9vbHM6IHRvb2xUeXBlcy5zb21lKCh0eXBlKSA9PiB0eXBlID09PSBcImN1c3RvbVwiKSxcbiAgICBwYXJhbGxlbFRvb2xzOiBib2R5LnBhcmFsbGVsX3Rvb2xfY2FsbHMgPT09IHRydWUsXG4gICAgcHJldmlvdXNSZXNwb25zZTpcbiAgICAgIHR5cGVvZiBib2R5LnByZXZpb3VzX3Jlc3BvbnNlX2lkID09PSBcInN0cmluZ1wiICYmIGJvZHkucHJldmlvdXNfcmVzcG9uc2VfaWQubGVuZ3RoID4gMCxcbiAgICByZWFzb25pbmc6XG4gICAgICBpc1JlY29yZChib2R5LnJlYXNvbmluZykgfHxcbiAgICAgIGJvZHkucmVhc29uaW5nX2VmZm9ydCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBpc1JlY29yZChib2R5LnRoaW5raW5nKSB8fFxuICAgICAgb3V0cHV0Q29uZmlnLmVmZm9ydCAhPT0gdW5kZWZpbmVkLFxuICAgIHN0b3JhZ2U6IGJvZHkuc3RvcmUgPT09IHRydWUsXG4gICAgc3RydWN0dXJlZE91dHB1dDogZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgZm9ybWF0ICE9PSBcInRleHRcIixcbiAgICB0b29sczogdG9vbHMubGVuZ3RoID4gMCxcbiAgICB1bnN1cHBvcnRlZE9wZW5SZXNwb25zZXNUb29sczogdG9vbFR5cGVzLnNvbWUoXG4gICAgICAodHlwZSkgPT4gdHlwZSAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGUgIT09IFwid2ViX3NlYXJjaFwiICYmIHR5cGUgIT09IFwid2ViX3NlYXJjaF9wcmV2aWV3XCIsXG4gICAgKSxcbiAgICB3ZWJTZWFyY2g6IHRvb2xUeXBlcy5zb21lKCh0eXBlKSA9PiB0eXBlID09PSBcIndlYl9zZWFyY2hcIiB8fCB0eXBlID09PSBcIndlYl9zZWFyY2hfcHJldmlld1wiKSxcbiAgICBpbWFnZUlucHV0OiBjb250YWluc0ltYWdlSW5wdXQoYm9keS5pbnB1dCkgfHwgY29udGFpbnNJbWFnZUlucHV0KGJvZHkubWVzc2FnZXMpLFxuICAgIGFwcGx5UGF0Y2g6IHRvb2xOYW1lcy5zb21lKChuYW1lKSA9PiAvXmFwcGx5W18tXT9wYXRjaCQvaS50ZXN0KG5hbWUpKSxcbiAgfTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGFuIE9yaWdpbmF0b3IgaGVhZGVyIHNlbGVjdHMgQ29kZXggY29tcGF0aWJpbGl0eSBiZWhhdmlvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9yaWdpbmF0b3I/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJjb2RleFwiKSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGlyZWN0Um91dGUoXG4gIGlucHV0OiBSZXNvbHZlUm91dGVJbnB1dCxcbiAgdXBzdHJlYW1Qcm90b2NvbDogRXhjbHVkZTxVcHN0cmVhbVByb3RvY29sLCBcImFpLXNka1wiPixcbiAgdXBzdHJlYW1Nb2RlbDogc3RyaW5nLFxuKTogR2F0ZXdheVJvdXRlIHtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnRQcm90b2NvbDogaW5wdXQuY2xpZW50UHJvdG9jb2wsXG4gICAgdXBzdHJlYW1Qcm90b2NvbCxcbiAgICB0YXJnZXQ6IGlucHV0LnRhcmdldCxcbiAgICB1cHN0cmVhbU1vZGVsLFxuICAgIHRyYW5zbGF0ZVJlcXVlc3Q6IGZhbHNlLFxuICAgIHRyYW5zbGF0ZVJlc3BvbnNlOiBmYWxzZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlZFJvdXRlKGlucHV0OiBSZXNvbHZlUm91dGVJbnB1dCk6IEdhdGV3YXlSb3V0ZSB7XG4gIHJldHVybiB7XG4gICAgY2xpZW50UHJvdG9jb2w6IGlucHV0LmNsaWVudFByb3RvY29sLFxuICAgIHVwc3RyZWFtUHJvdG9jb2w6IFwiYWktc2RrXCIsXG4gICAgdGFyZ2V0OiBpbnB1dC50YXJnZXQsXG4gICAgdXBzdHJlYW1Nb2RlbDogaW5wdXQudGFyZ2V0LmlkLFxuICAgIHRyYW5zbGF0ZVJlcXVlc3Q6IHRydWUsXG4gICAgdHJhbnNsYXRlUmVzcG9uc2U6IHRydWUsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzRGlyZWN0UmVzcG9uc2VzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykgJiZcbiAgICAoIWZlYXR1cmVzLmN1c3RvbVRvb2xzIHx8IHRhcmdldC5jYXBhYmlsaXRpZXMuY3VzdG9tVG9vbHMpICYmXG4gICAgKCFmZWF0dXJlcy5zdHJ1Y3R1cmVkT3V0cHV0IHx8IHRhcmdldC5jYXBhYmlsaXRpZXMuc3RydWN0dXJlZE91dHB1dClcbiAgKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNPcGVuUmVzcG9uc2VzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykgJiZcbiAgICAhZmVhdHVyZXMuY3VzdG9tVG9vbHMgJiZcbiAgICAhZmVhdHVyZXMucHJldmlvdXNSZXNwb25zZSAmJlxuICAgICFmZWF0dXJlcy5zdG9yYWdlICYmXG4gICAgIWZlYXR1cmVzLmJhY2tncm91bmQgJiZcbiAgICAhZmVhdHVyZXMudW5zdXBwb3J0ZWRPcGVuUmVzcG9uc2VzVG9vbHMgJiZcbiAgICAoIWZlYXR1cmVzLndlYlNlYXJjaCB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCkgJiZcbiAgICAoIWZlYXR1cmVzLnN0cnVjdHVyZWRPdXRwdXQgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJ1Y3R1cmVkT3V0cHV0KVxuICApO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c1Rvb2xzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgICghZmVhdHVyZXMudG9vbHMgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy50b29scykgJiZcbiAgICAoIWZlYXR1cmVzLnBhcmFsbGVsVG9vbHMgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5wYXJhbGxlbFRvb2xzKVxuICApO1xufVxuXG5mdW5jdGlvbiByZWplY3RTdGF0ZWZ1bFJlc3BvbnNlcyhmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXMpOiB2b2lkIHtcbiAgY29uc3QgdW5zdXBwb3J0ZWQgPSBbXG4gICAgLi4uKGZlYXR1cmVzLnByZXZpb3VzUmVzcG9uc2UgPyBbXCJwcmV2aW91c19yZXNwb25zZV9pZFwiXSA6IFtdKSxcbiAgICAuLi4oZmVhdHVyZXMuc3RvcmFnZSA/IFtcInN0b3JlXCJdIDogW10pLFxuICAgIC4uLihmZWF0dXJlcy5iYWNrZ3JvdW5kID8gW1wiYmFja2dyb3VuZFwiXSA6IFtdKSxcbiAgXTtcbiAgaWYgKHVuc3VwcG9ydGVkLmxlbmd0aCA+IDApIHRocm93IG5ldyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IodW5zdXBwb3J0ZWQpO1xufVxuXG5mdW5jdGlvbiBjYW5Vc2VBaUdhdGV3YXlDb2RleCh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXMpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBCb29sZWFuKHRhcmdldC5jYXBhYmlsaXRpZXMuYWlHYXRld2F5Q29kZXggJiYgdGFyZ2V0Lm1vZGVsU2VydmljZU5hbWUpICYmXG4gICAgc3VwcG9ydHNEaXJlY3RSZXNwb25zZXModGFyZ2V0LCBmZWF0dXJlcylcbiAgKTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNJbWFnZUlucHV0KHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLnNvbWUoY29udGFpbnNJbWFnZUlucHV0KTtcbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZS50eXBlID09PSBcInN0cmluZ1wiID8gdmFsdWUudHlwZS50b0xvd2VyQ2FzZSgpIDogXCJcIjtcbiAgaWYgKHR5cGUuaW5jbHVkZXMoXCJpbWFnZVwiKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh2YWx1ZSkuc29tZShcbiAgICAoW2tleSwgbmVzdGVkXSkgPT4ga2V5ICE9PSBcImFyZ3VtZW50c1wiICYmIGtleSAhPT0gXCJpbnB1dFwiICYmIGNvbnRhaW5zSW1hZ2VJbnB1dChuZXN0ZWQpLFxuICApO1xufVxuIl19
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVVsRCxpRkFBaUY7QUFDakYsTUFBTSxPQUFPLDhCQUErQixTQUFRLEtBQUs7SUFHbEM7SUFGWixNQUFNLEdBQUcsR0FBRyxDQUFDO0lBRXRCLFlBQXFCLFFBQTJCO1FBQzlDLEtBQUssQ0FBQywwREFBMEQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFEcEUsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7UUFFOUMsSUFBSSxDQUFDLElBQUksR0FBRyxnQ0FBZ0MsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFFRCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUF3QjtJQUNuRCxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDbkQsSUFBSSxjQUFjLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksOEJBQThCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxJQUFJLGNBQWMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQ0Usb0JBQW9CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztZQUN0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QU8sS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2hFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN4QyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUMvQixDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssV0FBVyxJQUFJLEdBQUcsS0FBSyxPQUFPLElBQUksa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQ3hGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdXJlIGNhcGFiaWxpdHktZHJpdmVuIHJvdXRlIHNlbGVjdGlvbiBmb3IgbW9kZWwtZ2F0ZXdheSByZXF1ZXN0cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgcG9saWN5IH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGlzUmVjb3JkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB0eXBlIHtcbiAgR2F0ZXdheVJvdXRlLFxuICBNb2RlbFRhcmdldCxcbiAgUmVxdWVzdGVkRmVhdHVyZXMsXG4gIFJlc29sdmVSb3V0ZUlucHV0LFxuICBVcHN0cmVhbVByb3RvY29sLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG4vKiogRXJyb3IgcmV0dXJuZWQgd2hlbiBwcmVzZXJ2aW5nIGEgcmVxdWVzdGVkIHByb3RvY29sIGZlYXR1cmUgaXMgaW1wb3NzaWJsZS4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1cyA9IDQwMDtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBmZWF0dXJlczogcmVhZG9ubHkgc3RyaW5nW10pIHtcbiAgICBzdXBlcihgVGhlIHNlbGVjdGVkIG1vZGVsIGNhbm5vdCBwcmVzZXJ2ZSByZXF1ZXN0ZWQgZmVhdHVyZXM6ICR7ZmVhdHVyZXMuam9pbihcIiwgXCIpfWApO1xuICAgIHRoaXMubmFtZSA9IFwiVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yXCI7XG4gIH1cbn1cblxuLyoqIFNlbGVjdCB0aGUgbG93ZXN0LW92ZXJoZWFkIHVwc3RyZWFtIHRoYXQgcHJlc2VydmVzIHRoZSBjbGllbnQgY29udHJhY3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJvdXRlKGlucHV0OiBSZXNvbHZlUm91dGVJbnB1dCk6IEdhdGV3YXlSb3V0ZSB7XG4gIGNvbnN0IHsgY2xpZW50UHJvdG9jb2wsIGZlYXR1cmVzLCB0YXJnZXQgfSA9IGlucHV0O1xuICBpZiAoY2xpZW50UHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikge1xuICAgIGlmICghdGFyZ2V0LmNhcGFiaWxpdGllcy5lbWJlZGRpbmdzKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yKFtcImVtYmVkZGluZ3NcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1lbWJlZGRpbmdzXCIsIHRhcmdldC5pZCk7XG4gIH1cbiAgaWYgKGNsaWVudFByb3RvY29sID09PSBcIm9wZW5haS1yZXNwb25zZXNcIikge1xuICAgIHJlamVjdFN0YXRlZnVsUmVzcG9uc2VzKGZlYXR1cmVzKTtcbiAgICBpZiAoXG4gICAgICBjYW5Vc2VBaUdhdGV3YXlDb2RleCh0YXJnZXQsIGZlYXR1cmVzKSAmJlxuICAgICAgcG9saWN5LnByZWZlcnNTeXN0ZW1Nb2RlbFNlcnZpY2UoXG4gICAgICAgIGlucHV0LnJlcXVlc3RlZE1vZGVsLFxuICAgICAgICB0YXJnZXQuaWQsXG4gICAgICAgIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lISxcbiAgICAgICAgaW5wdXQucHJlZmVyU3lzdGVtTW9kZWxzID09PSB0cnVlLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtYWktZ2F0ZXdheS1jb2RleFwiLCB0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZSEpO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0LmNhcGFiaWxpdGllcy5yZXNwb25zZXMgJiYgc3VwcG9ydHNEaXJlY3RSZXNwb25zZXModGFyZ2V0LCBmZWF0dXJlcykpIHtcbiAgICAgIHJldHVybiBkaXJlY3RSb3V0ZShpbnB1dCwgXCJkYXRhYnJpY2tzLXJlc3BvbnNlc1wiLCB0YXJnZXQuaWQpO1xuICAgIH1cbiAgICBpZiAoY2FuVXNlQWlHYXRld2F5Q29kZXgodGFyZ2V0LCBmZWF0dXJlcykpIHtcbiAgICAgIHJldHVybiBkaXJlY3RSb3V0ZShpbnB1dCwgXCJkYXRhYnJpY2tzLWFpLWdhdGV3YXktY29kZXhcIiwgdGFyZ2V0Lm1vZGVsU2VydmljZU5hbWUhKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMub3BlblJlc3BvbnNlcyAmJiBzdXBwb3J0c09wZW5SZXNwb25zZXModGFyZ2V0LCBmZWF0dXJlcykpIHtcbiAgICAgIHJldHVybiBkaXJlY3RSb3V0ZShpbnB1dCwgXCJkYXRhYnJpY2tzLW9wZW4tcmVzcG9uc2VzXCIsIHRhcmdldC5pZCk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkUm91dGUoaW5wdXQpO1xuICB9XG5cbiAgaWYgKGNsaWVudFByb3RvY29sID09PSBcIm9wZW5haS1jaGF0XCIpIHtcbiAgICBpZiAodGFyZ2V0LmNhcGFiaWxpdGllcy5jaGF0ICYmIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykpIHtcbiAgICAgIHJldHVybiBkaXJlY3RSb3V0ZShpbnB1dCwgXCJkYXRhYnJpY2tzLWNoYXRcIiwgdGFyZ2V0LmlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWRSb3V0ZShpbnB1dCk7XG4gIH1cblxuICBpZiAodGFyZ2V0LmNhcGFiaWxpdGllcy5hbnRocm9waWMgJiYgc3VwcG9ydHNUb29scyh0YXJnZXQsIGZlYXR1cmVzKSkge1xuICAgIHJldHVybiBkaXJlY3RSb3V0ZShpbnB1dCwgXCJkYXRhYnJpY2tzLWFudGhyb3BpY1wiLCB0YXJnZXQuaWQpO1xuICB9XG4gIHJldHVybiB0cmFuc2xhdGVkUm91dGUoaW5wdXQpO1xufVxuXG4vKiogRGV0ZWN0IHJvdXRlLWFmZmVjdGluZyBmZWF0dXJlcyBmcm9tIGFuIE9wZW5BSSBvciBBbnRocm9waWMgcmVxdWVzdCBib2R5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RlZEZlYXR1cmVzKGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IFJlcXVlc3RlZEZlYXR1cmVzIHtcbiAgY29uc3QgdG9vbHMgPSBBcnJheS5pc0FycmF5KGJvZHkudG9vbHMpID8gYm9keS50b29scyA6IFtdO1xuICBjb25zdCB0b29sUmVjb3JkcyA9IHRvb2xzLmZpbHRlcigodG9vbCk6IHRvb2wgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gaXNSZWNvcmQodG9vbCkpO1xuICBjb25zdCB0b29sVHlwZXMgPSB0b29sUmVjb3Jkcy5tYXAoKHRvb2wpID0+IHRvb2wudHlwZSk7XG4gIGNvbnN0IHRvb2xOYW1lcyA9IHRvb2xSZWNvcmRzXG4gICAgLm1hcCgodG9vbCkgPT5cbiAgICAgIHR5cGVvZiB0b29sLm5hbWUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyB0b29sLm5hbWVcbiAgICAgICAgOiBpc1JlY29yZCh0b29sLmZ1bmN0aW9uKSAmJiB0eXBlb2YgdG9vbC5mdW5jdGlvbi5uYW1lID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyB0b29sLmZ1bmN0aW9uLm5hbWVcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICApXG4gICAgLmZpbHRlcigobmFtZSk6IG5hbWUgaXMgc3RyaW5nID0+IG5hbWUgIT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHRleHQgPSBpc1JlY29yZChib2R5LnRleHQpID8gYm9keS50ZXh0IDoge307XG4gIGNvbnN0IGZvcm1hdCA9IGlzUmVjb3JkKHRleHQuZm9ybWF0KSA/IHRleHQuZm9ybWF0LnR5cGUgOiB0ZXh0LmZvcm1hdDtcbiAgY29uc3Qgb3V0cHV0Q29uZmlnID0gaXNSZWNvcmQoYm9keS5vdXRwdXRfY29uZmlnKSA/IGJvZHkub3V0cHV0X2NvbmZpZyA6IHt9O1xuICByZXR1cm4ge1xuICAgIGJhY2tncm91bmQ6IGJvZHkuYmFja2dyb3VuZCA9PT0gdHJ1ZSxcbiAgICBjdXN0b21Ub29sczogdG9vbFR5cGVzLnNvbWUoKHR5cGUpID0+IHR5cGUgPT09IFwiY3VzdG9tXCIpLFxuICAgIHBhcmFsbGVsVG9vbHM6IGJvZHkucGFyYWxsZWxfdG9vbF9jYWxscyA9PT0gdHJ1ZSxcbiAgICBwcmV2aW91c1Jlc3BvbnNlOlxuICAgICAgdHlwZW9mIGJvZHkucHJldmlvdXNfcmVzcG9uc2VfaWQgPT09IFwic3RyaW5nXCIgJiYgYm9keS5wcmV2aW91c19yZXNwb25zZV9pZC5sZW5ndGggPiAwLFxuICAgIHJlYXNvbmluZzpcbiAgICAgIGlzUmVjb3JkKGJvZHkucmVhc29uaW5nKSB8fFxuICAgICAgYm9keS5yZWFzb25pbmdfZWZmb3J0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIGlzUmVjb3JkKGJvZHkudGhpbmtpbmcpIHx8XG4gICAgICBvdXRwdXRDb25maWcuZWZmb3J0ICE9PSB1bmRlZmluZWQsXG4gICAgc3RvcmFnZTogYm9keS5zdG9yZSA9PT0gdHJ1ZSxcbiAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBmb3JtYXQgIT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgIT09IFwidGV4dFwiLFxuICAgIHRvb2xzOiB0b29scy5sZW5ndGggPiAwLFxuICAgIHVuc3VwcG9ydGVkT3BlblJlc3BvbnNlc1Rvb2xzOiB0b29sVHlwZXMuc29tZShcbiAgICAgICh0eXBlKSA9PiB0eXBlICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZSAhPT0gXCJ3ZWJfc2VhcmNoXCIgJiYgdHlwZSAhPT0gXCJ3ZWJfc2VhcmNoX3ByZXZpZXdcIixcbiAgICApLFxuICAgIHdlYlNlYXJjaDogdG9vbFR5cGVzLnNvbWUoKHR5cGUpID0+IHR5cGUgPT09IFwid2ViX3NlYXJjaFwiIHx8IHR5cGUgPT09IFwid2ViX3NlYXJjaF9wcmV2aWV3XCIpLFxuICAgIGltYWdlSW5wdXQ6IGNvbnRhaW5zSW1hZ2VJbnB1dChib2R5LmlucHV0KSB8fCBjb250YWluc0ltYWdlSW5wdXQoYm9keS5tZXNzYWdlcyksXG4gICAgYXBwbHlQYXRjaDogdG9vbE5hbWVzLnNvbWUoKG5hbWUpID0+IC9eYXBwbHlbXy1dP3BhdGNoJC9pLnRlc3QobmFtZSkpLFxuICB9O1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgYSByZXF1ZXN0IHNlbGVjdHMgQ29kZXggY29tcGF0aWJpbGl0eSBiZWhhdmlvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvZGV4UmVxdWVzdChyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpOiBib29sZWFuIHtcbiAgaWYgKHJlcXVlc3QuaGVhZGVyKFwib3JpZ2luYXRvclwiKT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImNvZGV4XCIpID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgY2xpZW50VmVyc2lvbiA9IHJlcXVlc3QucXVlcnkuY2xpZW50X3ZlcnNpb247XG4gIHJldHVybiB0eXBlb2YgY2xpZW50VmVyc2lvbiA9PT0gXCJzdHJpbmdcIiAmJiBjbGllbnRWZXJzaW9uLnRyaW0oKS5sZW5ndGggPiAwO1xufVxuXG5mdW5jdGlvbiBkaXJlY3RSb3V0ZShcbiAgaW5wdXQ6IFJlc29sdmVSb3V0ZUlucHV0LFxuICB1cHN0cmVhbVByb3RvY29sOiBFeGNsdWRlPFVwc3RyZWFtUHJvdG9jb2wsIFwiYWktc2RrXCI+LFxuICB1cHN0cmVhbU1vZGVsOiBzdHJpbmcsXG4pOiBHYXRld2F5Um91dGUge1xuICByZXR1cm4ge1xuICAgIGNsaWVudFByb3RvY29sOiBpbnB1dC5jbGllbnRQcm90b2NvbCxcbiAgICB1cHN0cmVhbVByb3RvY29sLFxuICAgIHRhcmdldDogaW5wdXQudGFyZ2V0LFxuICAgIHVwc3RyZWFtTW9kZWwsXG4gICAgdHJhbnNsYXRlUmVxdWVzdDogZmFsc2UsXG4gICAgdHJhbnNsYXRlUmVzcG9uc2U6IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVkUm91dGUoaW5wdXQ6IFJlc29sdmVSb3V0ZUlucHV0KTogR2F0ZXdheVJvdXRlIHtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnRQcm90b2NvbDogaW5wdXQuY2xpZW50UHJvdG9jb2wsXG4gICAgdXBzdHJlYW1Qcm90b2NvbDogXCJhaS1zZGtcIixcbiAgICB0YXJnZXQ6IGlucHV0LnRhcmdldCxcbiAgICB1cHN0cmVhbU1vZGVsOiBpbnB1dC50YXJnZXQuaWQsXG4gICAgdHJhbnNsYXRlUmVxdWVzdDogdHJ1ZSxcbiAgICB0cmFuc2xhdGVSZXNwb25zZTogdHJ1ZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNEaXJlY3RSZXNwb25zZXModGFyZ2V0OiBNb2RlbFRhcmdldCwgZmVhdHVyZXM6IFJlcXVlc3RlZEZlYXR1cmVzKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgc3VwcG9ydHNUb29scyh0YXJnZXQsIGZlYXR1cmVzKSAmJlxuICAgICghZmVhdHVyZXMuY3VzdG9tVG9vbHMgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5jdXN0b21Ub29scykgJiZcbiAgICAoIWZlYXR1cmVzLnN0cnVjdHVyZWRPdXRwdXQgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJ1Y3R1cmVkT3V0cHV0KVxuICApO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c09wZW5SZXNwb25zZXModGFyZ2V0OiBNb2RlbFRhcmdldCwgZmVhdHVyZXM6IFJlcXVlc3RlZEZlYXR1cmVzKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgc3VwcG9ydHNUb29scyh0YXJnZXQsIGZlYXR1cmVzKSAmJlxuICAgICFmZWF0dXJlcy5jdXN0b21Ub29scyAmJlxuICAgICFmZWF0dXJlcy5wcmV2aW91c1Jlc3BvbnNlICYmXG4gICAgIWZlYXR1cmVzLnN0b3JhZ2UgJiZcbiAgICAhZmVhdHVyZXMuYmFja2dyb3VuZCAmJlxuICAgICFmZWF0dXJlcy51bnN1cHBvcnRlZE9wZW5SZXNwb25zZXNUb29scyAmJlxuICAgICghZmVhdHVyZXMud2ViU2VhcmNoIHx8IHRhcmdldC5jYXBhYmlsaXRpZXMud2ViU2VhcmNoKSAmJlxuICAgICghZmVhdHVyZXMuc3RydWN0dXJlZE91dHB1dCB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLnN0cnVjdHVyZWRPdXRwdXQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzVG9vbHModGFyZ2V0OiBNb2RlbFRhcmdldCwgZmVhdHVyZXM6IFJlcXVlc3RlZEZlYXR1cmVzKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgKCFmZWF0dXJlcy50b29scyB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLnRvb2xzKSAmJlxuICAgICghZmVhdHVyZXMucGFyYWxsZWxUb29scyB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLnBhcmFsbGVsVG9vbHMpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlamVjdFN0YXRlZnVsUmVzcG9uc2VzKGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IHZvaWQge1xuICBjb25zdCB1bnN1cHBvcnRlZCA9IFtcbiAgICAuLi4oZmVhdHVyZXMucHJldmlvdXNSZXNwb25zZSA/IFtcInByZXZpb3VzX3Jlc3BvbnNlX2lkXCJdIDogW10pLFxuICAgIC4uLihmZWF0dXJlcy5zdG9yYWdlID8gW1wic3RvcmVcIl0gOiBbXSksXG4gICAgLi4uKGZlYXR1cmVzLmJhY2tncm91bmQgPyBbXCJiYWNrZ3JvdW5kXCJdIDogW10pLFxuICBdO1xuICBpZiAodW5zdXBwb3J0ZWQubGVuZ3RoID4gMCkgdGhyb3cgbmV3IFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvcih1bnN1cHBvcnRlZCk7XG59XG5cbmZ1bmN0aW9uIGNhblVzZUFpR2F0ZXdheUNvZGV4KHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIEJvb2xlYW4odGFyZ2V0LmNhcGFiaWxpdGllcy5haUdhdGV3YXlDb2RleCAmJiB0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZSkgJiZcbiAgICBzdXBwb3J0c0RpcmVjdFJlc3BvbnNlcyh0YXJnZXQsIGZlYXR1cmVzKVxuICApO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0ltYWdlSW5wdXQodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuc29tZShjb250YWluc0ltYWdlSW5wdXQpO1xuICBpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlLnR5cGUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS50eXBlLnRvTG93ZXJDYXNlKCkgOiBcIlwiO1xuICBpZiAodHlwZS5pbmNsdWRlcyhcImltYWdlXCIpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5zb21lKFxuICAgIChba2V5LCBuZXN0ZWRdKSA9PiBrZXkgIT09IFwiYXJndW1lbnRzXCIgJiYga2V5ICE9PSBcImlucHV0XCIgJiYgY29udGFpbnNJbWFnZUlucHV0KG5lc3RlZCksXG4gICk7XG59XG4iXX0=
|
package/lib/src/routes.js
CHANGED
|
@@ -8,7 +8,7 @@ import { pipeline } from "node:stream/promises";
|
|
|
8
8
|
import { log, toError } from "@dbx-tools/shared-core";
|
|
9
9
|
import { AiDecideRouterError } from "./ai-decide.js";
|
|
10
10
|
import { ModelGatewayError } from "./gateway.js";
|
|
11
|
-
import { UnsupportedGatewayFeatureError } from "./router.js";
|
|
11
|
+
import { isCodexRequest, UnsupportedGatewayFeatureError } from "./router.js";
|
|
12
12
|
import { SmartRouterError } from "./smart-router.js";
|
|
13
13
|
const logger = log.logger("appkit/model-gateway/http");
|
|
14
14
|
/** Send the lightweight compatibility health response. */
|
|
@@ -20,7 +20,7 @@ export async function sendModels(gateway, request, response) {
|
|
|
20
20
|
const startedAt = Date.now();
|
|
21
21
|
logger.debug("models request", requestContext(request));
|
|
22
22
|
try {
|
|
23
|
-
const payload = await gateway.models(request
|
|
23
|
+
const payload = await gateway.models(isCodexRequest(request), optionalSearch(request.query.search), optionalModelSource(request.query.model_source ?? request.query.modelSource), optionalBoolean(request.query.metadata, "metadata"));
|
|
24
24
|
response.json(payload);
|
|
25
25
|
logger.debug("models response", {
|
|
26
26
|
...requestContext(request),
|
|
@@ -174,4 +174,4 @@ function requestContext(request) {
|
|
|
174
174
|
requestId: request.header("x-request-id") ?? request.header("request-id"),
|
|
175
175
|
};
|
|
176
176
|
}
|
|
177
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUl0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQWdCLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9ELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7QUFFdkQsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxVQUFVLENBQUMsUUFBMEI7SUFDbkQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCwyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQzlCLE9BQXFCLEVBQ3JCLE9BQXdCLEVBQ3hCLFFBQTBCO0lBRTFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FDbEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFDNUIsY0FB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Z2F0ZXdheSBzZXJ2aWNlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHsgcGlwZWxpbmUgfSBmcm9tIFwibm9kZTpzdHJlYW0vcHJvbWlzZXNcIjtcbmltcG9ydCB7IGxvZywgdG9FcnJvciB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IENsaWVudFByb3RvY29sIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgQWlEZWNpZGVSb3V0ZXJFcnJvciB9IGZyb20gXCIuL2FpLWRlY2lkZS50c1wiO1xuaW1wb3J0IHsgTW9kZWxHYXRld2F5LCBNb2RlbEdhdGV3YXlFcnJvciB9IGZyb20gXCIuL2dhdGV3YXkudHNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvciB9IGZyb20gXCIuL3JvdXRlci50c1wiO1xuaW1wb3J0IHsgU21hcnRSb3V0ZXJFcnJvciB9IGZyb20gXCIuL3NtYXJ0LXJvdXRlci50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0L21vZGVsLWdhdGV3YXkvaHR0cFwiKTtcblxuLyoqIFNlbmQgdGhlIGxpZ2h0d2VpZ2h0IGNvbXBhdGliaWxpdHkgaGVhbHRoIHJlc3BvbnNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbmRIZWFsdGgocmVzcG9uc2U6IGV4cHJlc3MuUmVzcG9uc2UpOiB2b2lkIHtcbiAgcmVzcG9uc2UuanNvbih7IHJlYWR5OiB0cnVlIH0pO1xufVxuXG4vKiogU2VuZCB0aGUgYWN0aXZlIHByaW5jaXBhbCdzIGR5bmFtaWMgbW9kZWwgY2F0YWxvZ3VlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRNb2RlbHMoXG4gIGdhdGV3YXk6IE1vZGVsR2F0ZXdheSxcbiAgcmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0LFxuICByZXNwb25zZTogZXhwcmVzcy5SZXNwb25zZSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBsb2dnZXIuZGVidWcoXCJtb2RlbHMgcmVxdWVzdFwiLCByZXF1ZXN0Q29udGV4dChyZXF1ZXN0KSk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGdhdGV3YXkubW9kZWxzKFxuICAgICAgcmVxdWVzdC5oZWFkZXIoXCJvcmlnaW5hdG9yXCIpLFxuICAgICAgb3B0aW9uYWxTZWFyY2gocmVxdWVzdC5xdWVyeS5zZWFyY2gpLFxuICAgICAgb3B0aW9uYWxNb2RlbFNvdXJjZShyZXF1ZXN0LnF1ZXJ5Lm1vZGVsX3NvdXJjZSA/PyByZXF1ZXN0LnF1ZXJ5Lm1vZGVsU291cmNlKSxcbiAgICAgIG9wdGlvbmFsQm9vbGVhbihyZXF1ZXN0LnF1ZXJ5Lm1ldGFkYXRhLCBcIm1ldGFkYXRhXCIpLFxuICAgICk7XG4gICAgcmVzcG9uc2UuanNvbihwYXlsb2FkKTtcbiAgICBsb2dnZXIuZGVidWcoXCJtb2RlbHMgcmVzcG9uc2VcIiwge1xuICAgICAgLi4ucmVxdWVzdENvbnRleHQocmVxdWVzdCksXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1c0NvZGUsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKFwibW9kZWxzIHJlcXVlc3QgZmFpbGVkXCIsIHtcbiAgICAgIC4uLnJlcXVlc3RDb250ZXh0KHJlcXVlc3QpLFxuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyb3IpLFxuICAgIH0pO1xuICAgIHNlbmRFcnJvcihcIm9wZW5haS1yZXNwb25zZXNcIiwgcmVzcG9uc2UsIGVycm9yKTtcbiAgfVxufVxuXG4vKiogRXhlY3V0ZSBhbmQgc3RyZWFtIG9uZSBtb2RlbCByZXF1ZXN0IHRocm91Z2ggRXhwcmVzcyB3aXRoIGNhbmNlbGxhdGlvbi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kSW5mZXJlbmNlKFxuICBnYXRld2F5OiBNb2RlbEdhdGV3YXksXG4gIHByb3RvY29sOiBDbGllbnRQcm90b2NvbCxcbiAgcmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0LFxuICByZXNwb25zZTogZXhwcmVzcy5SZXNwb25zZSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBhYm9ydCA9ICgpID0+IHtcbiAgICBpZiAocmVzcG9uc2Uud3JpdGFibGVFbmRlZCkgcmV0dXJuO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNsaWVudCBkaXNjb25uZWN0ZWRcIiwge1xuICAgICAgLi4ucmVxdWVzdENvbnRleHQocmVxdWVzdCksXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICBwcm90b2NvbCxcbiAgICB9KTtcbiAgICBjb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcihcIk1vZGVsIGdhdGV3YXkgY2xpZW50IGRpc2Nvbm5lY3RlZFwiKSk7XG4gIH07XG4gIHJlcXVlc3Qub25jZShcImFib3J0ZWRcIiwgYWJvcnQpO1xuICByZXNwb25zZS5vbmNlKFwiY2xvc2VcIiwgYWJvcnQpO1xuICB0cnkge1xuICAgIGNvbnN0IGJvZHkgPSByZWNvcmQocmVxdWVzdC5ib2R5KTtcbiAgICBsb2dnZXIuZGVidWcoXCJpbmZlcmVuY2UgcmVxdWVzdFwiLCB7XG4gICAgICAuLi5yZXF1ZXN0Q29udGV4dChyZXF1ZXN0KSxcbiAgICAgIG1vZGVsOiB0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IGJvZHkubW9kZWwgOiB1bmRlZmluZWQsXG4gICAgICBwcm90b2NvbCxcbiAgICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPT09IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgdXBzdHJlYW0gPSBhd2FpdCBnYXRld2F5LmluZmVyZW5jZShcbiAgICAgIHByb3RvY29sLFxuICAgICAgYm9keSxcbiAgICAgIHJlcXVlc3RIZWFkZXJzKHJlcXVlc3QpLFxuICAgICAgY29udHJvbGxlci5zaWduYWwsXG4gICAgKTtcbiAgICByZXNwb25zZS5zdGF0dXModXBzdHJlYW0uc3RhdHVzKTtcbiAgICB1cHN0cmVhbS5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiByZXNwb25zZS5zZXRIZWFkZXIobmFtZSwgdmFsdWUpKTtcbiAgICBpZiAoIXVwc3RyZWFtLmJvZHkpIHtcbiAgICAgIHJlc3BvbnNlLmVuZCgpO1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiaW5mZXJlbmNlIHJlc3BvbnNlXCIsIHtcbiAgICAgICAgLi4ucmVxdWVzdENvbnRleHQocmVxdWVzdCksXG4gICAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIHN0YXR1czogdXBzdHJlYW0uc3RhdHVzLFxuICAgICAgICB1cHN0cmVhbVByb3RvY29sOiB1cHN0cmVhbS5oZWFkZXJzLmdldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHBpcGVsaW5lKFJlYWRhYmxlLmZyb21XZWIodXBzdHJlYW0uYm9keSBhcyBuZXZlciksIHJlc3BvbnNlKTtcbiAgICBsb2dnZXIuZGVidWcoXCJpbmZlcmVuY2Ugc3RyZWFtIGNvbXBsZXRlZFwiLCB7XG4gICAgICAuLi5yZXF1ZXN0Q29udGV4dChyZXF1ZXN0KSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIHByb3RvY29sLFxuICAgICAgc3RhdHVzOiB1cHN0cmVhbS5zdGF0dXMsXG4gICAgICB1cHN0cmVhbVByb3RvY29sOiB1cHN0cmVhbS5oZWFkZXJzLmdldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIpLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXNwb25zZS5kZXN0cm95KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZ2dlci5lcnJvcihcImluZmVyZW5jZSByZXF1ZXN0IGZhaWxlZFwiLCB7XG4gICAgICAuLi5yZXF1ZXN0Q29udGV4dChyZXF1ZXN0KSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIGVycm9yOiB0b0Vycm9yKGVycm9yKSxcbiAgICAgIHByb3RvY29sLFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5oZWFkZXJzU2VudCkge1xuICAgICAgcmVzcG9uc2UuZGVzdHJveShlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZW5kRXJyb3IocHJvdG9jb2wsIHJlc3BvbnNlLCBlcnJvcik7XG4gIH0gZmluYWxseSB7XG4gICAgcmVxdWVzdC5vZmYoXCJhYm9ydGVkXCIsIGFib3J0KTtcbiAgICByZXNwb25zZS5vZmYoXCJjbG9zZVwiLCBhYm9ydCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VuZEVycm9yKHByb3RvY29sOiBDbGllbnRQcm90b2NvbCwgcmVzcG9uc2U6IGV4cHJlc3MuUmVzcG9uc2UsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnN0IHN0YXR1cyA9XG4gICAgZXJyb3IgaW5zdGFuY2VvZiBNb2RlbEdhdGV3YXlFcnJvciB8fFxuICAgIGVycm9yIGluc3RhbmNlb2YgQWlEZWNpZGVSb3V0ZXJFcnJvciB8fFxuICAgIGVycm9yIGluc3RhbmNlb2YgU21hcnRSb3V0ZXJFcnJvciB8fFxuICAgIGVycm9yIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yXG4gICAgICA/IGVycm9yLnN0YXR1c1xuICAgICAgOiA1MDA7XG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiTW9kZWwgZ2F0ZXdheSByZXF1ZXN0IGZhaWxlZFwiO1xuICBpZiAocHJvdG9jb2wgPT09IFwiYW50aHJvcGljLW1lc3NhZ2VzXCIpIHtcbiAgICByZXNwb25zZS5zdGF0dXMoc3RhdHVzKS5qc29uKHtcbiAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgIGVycm9yOiB7IHR5cGU6IHN0YXR1cyA8IDUwMCA/IFwiaW52YWxpZF9yZXF1ZXN0X2Vycm9yXCIgOiBcImFwaV9lcnJvclwiLCBtZXNzYWdlIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlc3BvbnNlLnN0YXR1cyhzdGF0dXMpLmpzb24oe1xuICAgIGVycm9yOiB7XG4gICAgICBtZXNzYWdlLFxuICAgICAgdHlwZTogc3RhdHVzIDwgNTAwID8gXCJpbnZhbGlkX3JlcXVlc3RfZXJyb3JcIiA6IFwiYXBpX2Vycm9yXCIsXG4gICAgICBjb2RlOiBzdGF0dXMsXG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIZWFkZXJzKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCk6IEhlYWRlcnMge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgcmF3XSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0LmhlYWRlcnMpKSB7XG4gICAgaWYgKHR5cGVvZiByYXcgPT09IFwic3RyaW5nXCIpIGhlYWRlcnMuc2V0KG5hbWUsIHJhdyk7XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSBoZWFkZXJzLnNldChuYW1lLCByYXcuam9pbihcIiwgXCIpKTtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuZnVuY3Rpb24gcmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBcIlJlcXVlc3QgYm9keSBtdXN0IGJlIGEgSlNPTiBvYmplY3RcIik7XG59XG5cbmZ1bmN0aW9uIG9wdGlvbmFsU2VhcmNoKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBcInNlYXJjaCBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uYWxNb2RlbFNvdXJjZSh2YWx1ZTogdW5rbm93bik6IFwiZm91bmRhdGlvblwiIHwgXCJjdXN0b21cIiB8IFwiYWxsXCIge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFwiZm91bmRhdGlvblwiO1xuICBpZiAodmFsdWUgPT09IFwiZm91bmRhdGlvblwiIHx8IHZhbHVlID09PSBcImN1c3RvbVwiIHx8IHZhbHVlID09PSBcImFsbFwiKSByZXR1cm4gdmFsdWU7XG4gIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwibW9kZWxfc291cmNlIG11c3QgYmUgZm91bmRhdGlvbiwgY3VzdG9tLCBvciBhbGxcIik7XG59XG5cbmZ1bmN0aW9uIG9wdGlvbmFsQm9vbGVhbih2YWx1ZTogdW5rbm93biwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcImZhbHNlXCIpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG4gIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIGAke25hbWV9IG11c3QgYmUgdHJ1ZSBvciBmYWxzZWApO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0Q29udGV4dChyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICBwYXRoOiByZXF1ZXN0LnBhdGgsXG4gICAgcmVxdWVzdElkOiByZXF1ZXN0LmhlYWRlcihcIngtcmVxdWVzdC1pZFwiKSA/PyByZXF1ZXN0LmhlYWRlcihcInJlcXVlc3QtaWRcIiksXG4gIH07XG59XG4iXX0=
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUl0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQWdCLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFckQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBRXZELDBEQUEwRDtBQUMxRCxNQUFNLFVBQVUsVUFBVSxDQUFDLFFBQTBCO0lBQ25ELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsMkRBQTJEO0FBQzNELE1BQU0sQ0FBQyxLQUFLLFVBQVUsVUFBVSxDQUM5QixPQUFxQixFQUNyQixPQUF3QixFQUN4QixRQUEwQjtJQUUxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDN0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQ2xDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFDdkIsY0FB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Z2F0ZXdheSBzZXJ2aWNlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHsgcGlwZWxpbmUgfSBmcm9tIFwibm9kZTpzdHJlYW0vcHJvbWlzZXNcIjtcbmltcG9ydCB7IGxvZywgdG9FcnJvciB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IENsaWVudFByb3RvY29sIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgQWlEZWNpZGVSb3V0ZXJFcnJvciB9IGZyb20gXCIuL2FpLWRlY2lkZS50c1wiO1xuaW1wb3J0IHsgTW9kZWxHYXRld2F5LCBNb2RlbEdhdGV3YXlFcnJvciB9IGZyb20gXCIuL2dhdGV3YXkudHNcIjtcbmltcG9ydCB7IGlzQ29kZXhSZXF1ZXN0LCBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IgfSBmcm9tIFwiLi9yb3V0ZXIudHNcIjtcbmltcG9ydCB7IFNtYXJ0Um91dGVyRXJyb3IgfSBmcm9tIFwiLi9zbWFydC1yb3V0ZXIudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC9tb2RlbC1nYXRld2F5L2h0dHBcIik7XG5cbi8qKiBTZW5kIHRoZSBsaWdodHdlaWdodCBjb21wYXRpYmlsaXR5IGhlYWx0aCByZXNwb25zZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZW5kSGVhbHRoKHJlc3BvbnNlOiBleHByZXNzLlJlc3BvbnNlKTogdm9pZCB7XG4gIHJlc3BvbnNlLmpzb24oeyByZWFkeTogdHJ1ZSB9KTtcbn1cblxuLyoqIFNlbmQgdGhlIGFjdGl2ZSBwcmluY2lwYWwncyBkeW5hbWljIG1vZGVsIGNhdGFsb2d1ZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kTW9kZWxzKFxuICBnYXRld2F5OiBNb2RlbEdhdGV3YXksXG4gIHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCxcbiAgcmVzcG9uc2U6IGV4cHJlc3MuUmVzcG9uc2UsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgbG9nZ2VyLmRlYnVnKFwibW9kZWxzIHJlcXVlc3RcIiwgcmVxdWVzdENvbnRleHQocmVxdWVzdCkpO1xuICB0cnkge1xuICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBnYXRld2F5Lm1vZGVscyhcbiAgICAgIGlzQ29kZXhSZXF1ZXN0KHJlcXVlc3QpLFxuICAgICAgb3B0aW9uYWxTZWFyY2gocmVxdWVzdC5xdWVyeS5zZWFyY2gpLFxuICAgICAgb3B0aW9uYWxNb2RlbFNvdXJjZShyZXF1ZXN0LnF1ZXJ5Lm1vZGVsX3NvdXJjZSA/PyByZXF1ZXN0LnF1ZXJ5Lm1vZGVsU291cmNlKSxcbiAgICAgIG9wdGlvbmFsQm9vbGVhbihyZXF1ZXN0LnF1ZXJ5Lm1ldGFkYXRhLCBcIm1ldGFkYXRhXCIpLFxuICAgICk7XG4gICAgcmVzcG9uc2UuanNvbihwYXlsb2FkKTtcbiAgICBsb2dnZXIuZGVidWcoXCJtb2RlbHMgcmVzcG9uc2VcIiwge1xuICAgICAgLi4ucmVxdWVzdENvbnRleHQocmVxdWVzdCksXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1c0NvZGUsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKFwibW9kZWxzIHJlcXVlc3QgZmFpbGVkXCIsIHtcbiAgICAgIC4uLnJlcXVlc3RDb250ZXh0KHJlcXVlc3QpLFxuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyb3IpLFxuICAgIH0pO1xuICAgIHNlbmRFcnJvcihcIm9wZW5haS1yZXNwb25zZXNcIiwgcmVzcG9uc2UsIGVycm9yKTtcbiAgfVxufVxuXG4vKiogRXhlY3V0ZSBhbmQgc3RyZWFtIG9uZSBtb2RlbCByZXF1ZXN0IHRocm91Z2ggRXhwcmVzcyB3aXRoIGNhbmNlbGxhdGlvbi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kSW5mZXJlbmNlKFxuICBnYXRld2F5OiBNb2RlbEdhdGV3YXksXG4gIHByb3RvY29sOiBDbGllbnRQcm90b2NvbCxcbiAgcmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0LFxuICByZXNwb25zZTogZXhwcmVzcy5SZXNwb25zZSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBhYm9ydCA9ICgpID0+IHtcbiAgICBpZiAocmVzcG9uc2Uud3JpdGFibGVFbmRlZCkgcmV0dXJuO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNsaWVudCBkaXNjb25uZWN0ZWRcIiwge1xuICAgICAgLi4ucmVxdWVzdENvbnRleHQocmVxdWVzdCksXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICBwcm90b2NvbCxcbiAgICB9KTtcbiAgICBjb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcihcIk1vZGVsIGdhdGV3YXkgY2xpZW50IGRpc2Nvbm5lY3RlZFwiKSk7XG4gIH07XG4gIHJlcXVlc3Qub25jZShcImFib3J0ZWRcIiwgYWJvcnQpO1xuICByZXNwb25zZS5vbmNlKFwiY2xvc2VcIiwgYWJvcnQpO1xuICB0cnkge1xuICAgIGNvbnN0IGJvZHkgPSByZWNvcmQocmVxdWVzdC5ib2R5KTtcbiAgICBsb2dnZXIuZGVidWcoXCJpbmZlcmVuY2UgcmVxdWVzdFwiLCB7XG4gICAgICAuLi5yZXF1ZXN0Q29udGV4dChyZXF1ZXN0KSxcbiAgICAgIG1vZGVsOiB0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IGJvZHkubW9kZWwgOiB1bmRlZmluZWQsXG4gICAgICBwcm90b2NvbCxcbiAgICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPT09IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgdXBzdHJlYW0gPSBhd2FpdCBnYXRld2F5LmluZmVyZW5jZShcbiAgICAgIHByb3RvY29sLFxuICAgICAgYm9keSxcbiAgICAgIHJlcXVlc3RIZWFkZXJzKHJlcXVlc3QpLFxuICAgICAgY29udHJvbGxlci5zaWduYWwsXG4gICAgKTtcbiAgICByZXNwb25zZS5zdGF0dXModXBzdHJlYW0uc3RhdHVzKTtcbiAgICB1cHN0cmVhbS5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiByZXNwb25zZS5zZXRIZWFkZXIobmFtZSwgdmFsdWUpKTtcbiAgICBpZiAoIXVwc3RyZWFtLmJvZHkpIHtcbiAgICAgIHJlc3BvbnNlLmVuZCgpO1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiaW5mZXJlbmNlIHJlc3BvbnNlXCIsIHtcbiAgICAgICAgLi4ucmVxdWVzdENvbnRleHQocmVxdWVzdCksXG4gICAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIHN0YXR1czogdXBzdHJlYW0uc3RhdHVzLFxuICAgICAgICB1cHN0cmVhbVByb3RvY29sOiB1cHN0cmVhbS5oZWFkZXJzLmdldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHBpcGVsaW5lKFJlYWRhYmxlLmZyb21XZWIodXBzdHJlYW0uYm9keSBhcyBuZXZlciksIHJlc3BvbnNlKTtcbiAgICBsb2dnZXIuZGVidWcoXCJpbmZlcmVuY2Ugc3RyZWFtIGNvbXBsZXRlZFwiLCB7XG4gICAgICAuLi5yZXF1ZXN0Q29udGV4dChyZXF1ZXN0KSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIHByb3RvY29sLFxuICAgICAgc3RhdHVzOiB1cHN0cmVhbS5zdGF0dXMsXG4gICAgICB1cHN0cmVhbVByb3RvY29sOiB1cHN0cmVhbS5oZWFkZXJzLmdldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIpLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXNwb25zZS5kZXN0cm95KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZ2dlci5lcnJvcihcImluZmVyZW5jZSByZXF1ZXN0IGZhaWxlZFwiLCB7XG4gICAgICAuLi5yZXF1ZXN0Q29udGV4dChyZXF1ZXN0KSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIGVycm9yOiB0b0Vycm9yKGVycm9yKSxcbiAgICAgIHByb3RvY29sLFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5oZWFkZXJzU2VudCkge1xuICAgICAgcmVzcG9uc2UuZGVzdHJveShlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZW5kRXJyb3IocHJvdG9jb2wsIHJlc3BvbnNlLCBlcnJvcik7XG4gIH0gZmluYWxseSB7XG4gICAgcmVxdWVzdC5vZmYoXCJhYm9ydGVkXCIsIGFib3J0KTtcbiAgICByZXNwb25zZS5vZmYoXCJjbG9zZVwiLCBhYm9ydCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VuZEVycm9yKHByb3RvY29sOiBDbGllbnRQcm90b2NvbCwgcmVzcG9uc2U6IGV4cHJlc3MuUmVzcG9uc2UsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnN0IHN0YXR1cyA9XG4gICAgZXJyb3IgaW5zdGFuY2VvZiBNb2RlbEdhdGV3YXlFcnJvciB8fFxuICAgIGVycm9yIGluc3RhbmNlb2YgQWlEZWNpZGVSb3V0ZXJFcnJvciB8fFxuICAgIGVycm9yIGluc3RhbmNlb2YgU21hcnRSb3V0ZXJFcnJvciB8fFxuICAgIGVycm9yIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yXG4gICAgICA/IGVycm9yLnN0YXR1c1xuICAgICAgOiA1MDA7XG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiTW9kZWwgZ2F0ZXdheSByZXF1ZXN0IGZhaWxlZFwiO1xuICBpZiAocHJvdG9jb2wgPT09IFwiYW50aHJvcGljLW1lc3NhZ2VzXCIpIHtcbiAgICByZXNwb25zZS5zdGF0dXMoc3RhdHVzKS5qc29uKHtcbiAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgIGVycm9yOiB7IHR5cGU6IHN0YXR1cyA8IDUwMCA/IFwiaW52YWxpZF9yZXF1ZXN0X2Vycm9yXCIgOiBcImFwaV9lcnJvclwiLCBtZXNzYWdlIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlc3BvbnNlLnN0YXR1cyhzdGF0dXMpLmpzb24oe1xuICAgIGVycm9yOiB7XG4gICAgICBtZXNzYWdlLFxuICAgICAgdHlwZTogc3RhdHVzIDwgNTAwID8gXCJpbnZhbGlkX3JlcXVlc3RfZXJyb3JcIiA6IFwiYXBpX2Vycm9yXCIsXG4gICAgICBjb2RlOiBzdGF0dXMsXG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIZWFkZXJzKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCk6IEhlYWRlcnMge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgcmF3XSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0LmhlYWRlcnMpKSB7XG4gICAgaWYgKHR5cGVvZiByYXcgPT09IFwic3RyaW5nXCIpIGhlYWRlcnMuc2V0KG5hbWUsIHJhdyk7XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSBoZWFkZXJzLnNldChuYW1lLCByYXcuam9pbihcIiwgXCIpKTtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuZnVuY3Rpb24gcmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBcIlJlcXVlc3QgYm9keSBtdXN0IGJlIGEgSlNPTiBvYmplY3RcIik7XG59XG5cbmZ1bmN0aW9uIG9wdGlvbmFsU2VhcmNoKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBcInNlYXJjaCBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uYWxNb2RlbFNvdXJjZSh2YWx1ZTogdW5rbm93bik6IFwiZm91bmRhdGlvblwiIHwgXCJjdXN0b21cIiB8IFwiYWxsXCIge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFwiZm91bmRhdGlvblwiO1xuICBpZiAodmFsdWUgPT09IFwiZm91bmRhdGlvblwiIHx8IHZhbHVlID09PSBcImN1c3RvbVwiIHx8IHZhbHVlID09PSBcImFsbFwiKSByZXR1cm4gdmFsdWU7XG4gIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwibW9kZWxfc291cmNlIG11c3QgYmUgZm91bmRhdGlvbiwgY3VzdG9tLCBvciBhbGxcIik7XG59XG5cbmZ1bmN0aW9uIG9wdGlvbmFsQm9vbGVhbih2YWx1ZTogdW5rbm93biwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcImZhbHNlXCIpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG4gIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIGAke25hbWV9IG11c3QgYmUgdHJ1ZSBvciBmYWxzZWApO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0Q29udGV4dChyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICBwYXRoOiByZXF1ZXN0LnBhdGgsXG4gICAgcmVxdWVzdElkOiByZXF1ZXN0LmhlYWRlcihcIngtcmVxdWVzdC1pZFwiKSA/PyByZXF1ZXN0LmhlYWRlcihcInJlcXVlc3QtaWRcIiksXG4gIH07XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -27,13 +27,13 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@databricks/appkit": "0.81.0",
|
|
30
|
-
"@dbx-tools/cache": "0.9.
|
|
31
|
-
"@dbx-tools/databricks": "0.9.
|
|
32
|
-
"@dbx-tools/model": "0.9.
|
|
33
|
-
"@dbx-tools/model-protocol": "0.9.
|
|
34
|
-
"@dbx-tools/shared-core": "0.9.
|
|
35
|
-
"@dbx-tools/shared-model": "0.9.
|
|
36
|
-
"@dbx-tools/shared-model-gateway": "0.9.
|
|
30
|
+
"@dbx-tools/cache": "0.9.205",
|
|
31
|
+
"@dbx-tools/databricks": "0.9.205",
|
|
32
|
+
"@dbx-tools/model": "0.9.205",
|
|
33
|
+
"@dbx-tools/model-protocol": "0.9.205",
|
|
34
|
+
"@dbx-tools/shared-core": "0.9.205",
|
|
35
|
+
"@dbx-tools/shared-model": "0.9.205",
|
|
36
|
+
"@dbx-tools/shared-model-gateway": "0.9.205",
|
|
37
37
|
"ai": "^7.0.0",
|
|
38
38
|
"js-tiktoken": "^1.0.21",
|
|
39
39
|
"zod": "4.3.6"
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"./package.json": "./package.json"
|
|
53
53
|
}
|
|
54
54
|
},
|
|
55
|
-
"version": "0.9.
|
|
55
|
+
"version": "0.9.205",
|
|
56
56
|
"types": "./lib/index.d.ts",
|
|
57
57
|
"dbxToolsConfig": {
|
|
58
58
|
"tags": [
|
package/src/gateway.ts
CHANGED
|
@@ -50,7 +50,7 @@ import {
|
|
|
50
50
|
type ModelRegistry,
|
|
51
51
|
type ModelRegistryOptions,
|
|
52
52
|
} from "./registry.ts";
|
|
53
|
-
import {
|
|
53
|
+
import { requestedFeatures, resolveRoute } from "./router.ts";
|
|
54
54
|
import {
|
|
55
55
|
SmartModelRouter,
|
|
56
56
|
type SmartRouterService,
|
|
@@ -117,7 +117,14 @@ export class ModelGateway {
|
|
|
117
117
|
...(options.preferSystemModels !== undefined
|
|
118
118
|
? { preferSystemModels: options.preferSystemModels }
|
|
119
119
|
: {}),
|
|
120
|
-
...(this.primaryProfile
|
|
120
|
+
...(this.primaryProfile
|
|
121
|
+
? {
|
|
122
|
+
client: this.primaryProfile.client,
|
|
123
|
+
...(this.primaryProfile.profile
|
|
124
|
+
? { cacheIdentity: `profile:${this.primaryProfile.profile}` }
|
|
125
|
+
: {}),
|
|
126
|
+
}
|
|
127
|
+
: {}),
|
|
121
128
|
};
|
|
122
129
|
this.registry = registry ?? new DatabricksModelRegistry(registryOptions);
|
|
123
130
|
this.aiDecide = options.aiDecideService ?? new AiDecideRouterService();
|
|
@@ -150,12 +157,11 @@ export class ModelGateway {
|
|
|
150
157
|
|
|
151
158
|
/** Return the live OpenAI model list, including Codex metadata when requested. */
|
|
152
159
|
async models(
|
|
153
|
-
|
|
160
|
+
codex = false,
|
|
154
161
|
search?: string,
|
|
155
162
|
modelSource: ModelSource | "all" = "foundation",
|
|
156
163
|
includeMetadata = false,
|
|
157
164
|
): Promise<ModelListResponse> {
|
|
158
|
-
const codex = isCodexOriginator(originator);
|
|
159
165
|
logger.debug("listing models", { codex, search });
|
|
160
166
|
const query = search?.trim();
|
|
161
167
|
const smartRouterSearch =
|
|
@@ -256,11 +262,12 @@ export class ModelGateway {
|
|
|
256
262
|
if (selection.smartRouter && !smartRouter) {
|
|
257
263
|
throw new ModelGatewayError(404, "Databricks Smart Router is disabled");
|
|
258
264
|
}
|
|
259
|
-
const
|
|
265
|
+
const aiDecideTargets =
|
|
266
|
+
!smartRouter && selection.aiDecide ? await this.registry.list() : undefined;
|
|
260
267
|
const aiDecide = selection.aiDecide
|
|
261
268
|
? await this.aiDecide.select(
|
|
262
269
|
sanitizedBody,
|
|
263
|
-
(
|
|
270
|
+
(aiDecideTargets ?? [])
|
|
264
271
|
.map((candidate) => candidate.endpoint)
|
|
265
272
|
.filter((endpoint): endpoint is ServingEndpointSummary => endpoint !== undefined),
|
|
266
273
|
this.primaryProfile?.client,
|
|
@@ -277,7 +284,7 @@ export class ModelGateway {
|
|
|
277
284
|
const target =
|
|
278
285
|
smartRouter?.target ??
|
|
279
286
|
(aiDecide
|
|
280
|
-
?
|
|
287
|
+
? aiDecideTargets?.find((candidate) => candidate.id === aiDecide.endpoint.name)
|
|
281
288
|
: undefined) ??
|
|
282
289
|
(await this.registry.resolve(selection.model, {
|
|
283
290
|
...(protocol === "openai-embeddings" ? { modelClass: ModelClass.Embedding } : {}),
|
package/src/registry.ts
CHANGED
|
@@ -45,6 +45,8 @@ export interface ModelRegistryOptions {
|
|
|
45
45
|
readonly preferSystemModels?: boolean;
|
|
46
46
|
/** Discover models with this client instead of the AppKit execution context. */
|
|
47
47
|
readonly client?: WorkspaceClient;
|
|
48
|
+
/** Trusted credential identity used to isolate cached catalogues for an injected client. */
|
|
49
|
+
readonly cacheIdentity?: string;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
interface RegistryContext {
|
|
@@ -59,12 +61,14 @@ export class DatabricksModelRegistry implements ModelRegistry {
|
|
|
59
61
|
private readonly overrides: readonly ModelCapabilityOverride[];
|
|
60
62
|
private readonly preferSystemModels: boolean;
|
|
61
63
|
private readonly client: WorkspaceClient | undefined;
|
|
64
|
+
private readonly cacheIdentity: string | undefined;
|
|
62
65
|
|
|
63
66
|
constructor(options: ModelRegistryOptions = {}) {
|
|
64
67
|
this.ttlMs = positiveTtl(options.ttlMs);
|
|
65
68
|
this.overrides = options.overrides ?? [];
|
|
66
69
|
this.preferSystemModels = options.preferSystemModels ?? false;
|
|
67
70
|
this.client = options.client;
|
|
71
|
+
this.cacheIdentity = options.cacheIdentity;
|
|
68
72
|
}
|
|
69
73
|
|
|
70
74
|
async list(): Promise<ModelTarget[]> {
|
|
@@ -234,7 +238,11 @@ export class DatabricksModelRegistry implements ModelRegistry {
|
|
|
234
238
|
private async context(): Promise<RegistryContext> {
|
|
235
239
|
if (this.client) {
|
|
236
240
|
const host = (await this.client.config.getHost()).toString();
|
|
237
|
-
return {
|
|
241
|
+
return {
|
|
242
|
+
client: this.client,
|
|
243
|
+
host,
|
|
244
|
+
...(this.cacheIdentity ? { identity: this.cacheIdentity } : {}),
|
|
245
|
+
};
|
|
238
246
|
}
|
|
239
247
|
return registryContext();
|
|
240
248
|
}
|
package/src/router.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import { policy } from "@dbx-tools/model";
|
|
8
8
|
import { isRecord } from "@dbx-tools/shared-core";
|
|
9
|
+
import type express from "express";
|
|
9
10
|
import type {
|
|
10
11
|
GatewayRoute,
|
|
11
12
|
ModelTarget,
|
|
@@ -111,9 +112,11 @@ export function requestedFeatures(body: Readonly<Record<string, unknown>>): Requ
|
|
|
111
112
|
};
|
|
112
113
|
}
|
|
113
114
|
|
|
114
|
-
/** Return whether
|
|
115
|
-
export function
|
|
116
|
-
|
|
115
|
+
/** Return whether a request selects Codex compatibility behavior. */
|
|
116
|
+
export function isCodexRequest(request: express.Request): boolean {
|
|
117
|
+
if (request.header("originator")?.toLowerCase().includes("codex") === true) return true;
|
|
118
|
+
const clientVersion = request.query.client_version;
|
|
119
|
+
return typeof clientVersion === "string" && clientVersion.trim().length > 0;
|
|
117
120
|
}
|
|
118
121
|
|
|
119
122
|
function directRoute(
|
package/src/routes.ts
CHANGED
|
@@ -12,7 +12,7 @@ import type express from "express";
|
|
|
12
12
|
|
|
13
13
|
import { AiDecideRouterError } from "./ai-decide.ts";
|
|
14
14
|
import { ModelGateway, ModelGatewayError } from "./gateway.ts";
|
|
15
|
-
import { UnsupportedGatewayFeatureError } from "./router.ts";
|
|
15
|
+
import { isCodexRequest, UnsupportedGatewayFeatureError } from "./router.ts";
|
|
16
16
|
import { SmartRouterError } from "./smart-router.ts";
|
|
17
17
|
|
|
18
18
|
const logger = log.logger("appkit/model-gateway/http");
|
|
@@ -32,7 +32,7 @@ export async function sendModels(
|
|
|
32
32
|
logger.debug("models request", requestContext(request));
|
|
33
33
|
try {
|
|
34
34
|
const payload = await gateway.models(
|
|
35
|
-
request
|
|
35
|
+
isCodexRequest(request),
|
|
36
36
|
optionalSearch(request.query.search),
|
|
37
37
|
optionalModelSource(request.query.model_source ?? request.query.modelSource),
|
|
38
38
|
optionalBoolean(request.query.metadata, "metadata"),
|