@dbx-tools/shared-model 0.6.186 → 0.6.188
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 +5 -4
- package/index.ts +3 -3
- package/lib/index.d.ts +3 -3
- package/lib/index.js +3 -3
- package/lib/src/classify.js +48 -25
- package/lib/src/model.d.ts +28 -0
- package/lib/src/model.js +30 -1
- package/package.json +2 -3
- package/src/classify.ts +54 -26
- package/src/model.ts +32 -0
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ display.toModelDisplayName("x", "Claude 4.6 (Preview)"); // provided name wins
|
|
|
35
35
|
|
|
36
36
|
`ServingEndpointSummary.displayName` is the optional friendly label for the
|
|
37
37
|
picker; `name` stays the invoke id. A Databricks-provided name (a
|
|
38
|
-
`display_name`/`displayName`/`name` endpoint tag, or an external-model name
|
|
38
|
+
`display_name`/`displayName`/`name` endpoint tag, or an external-model name
|
|
39
39
|
extracted in [`@dbx-tools/model`](../../node/model)'s `serving.ts`) wins;
|
|
40
40
|
otherwise the pure helper strips leading vendor prefixes and title-cases via
|
|
41
41
|
`@dbx-tools/shared-core`'s tokenizer. It flows through `GET /models`
|
|
@@ -68,7 +68,8 @@ const ranked: RankedModel = model.RankedModelSchema.parse(response);
|
|
|
68
68
|
|
|
69
69
|
`model.ServingEndpointSummarySchema` describes the stable endpoint fields exposed
|
|
70
70
|
to clients: endpoint name, task, state, optional profile scores, classified
|
|
71
|
-
class, `supportsTools`,
|
|
71
|
+
class, `supportsTools`, provider service names, reasoning efforts, lifecycle
|
|
72
|
+
status, and embedding dimension. `requiresTools: true` filters
|
|
72
73
|
search/ranking to endpoints that can complete both a function call and the
|
|
73
74
|
subsequent `function_call_output` replay.
|
|
74
75
|
|
|
@@ -176,8 +177,8 @@ one-by-one (`openaiResponses.responsesToChat`) already can't leak them. Pass
|
|
|
176
177
|
|
|
177
178
|
## Modules
|
|
178
179
|
|
|
179
|
-
- `model` - `ModelClass`, zod schemas, and inferred types
|
|
180
|
-
endpoint summaries, lookup requests, and ranked results.
|
|
180
|
+
- `model` - `ModelClass`, `ReasoningEffort`, zod schemas, and inferred types
|
|
181
|
+
for profiles, endpoint summaries, lookup requests, and ranked results.
|
|
181
182
|
- `classify` - family parsing, version tuple parsing, endpoint classification,
|
|
182
183
|
and capability flags.
|
|
183
184
|
- `display` - human-readable endpoint labels.
|
package/index.ts
CHANGED
|
@@ -3,15 +3,15 @@
|
|
|
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/shared-model";
|
|
6
|
-
export const PACKAGE_VERSION = "0.6.
|
|
6
|
+
export const PACKAGE_VERSION = "0.6.188";
|
|
7
7
|
export * as classify from "./src/classify.ts";
|
|
8
8
|
export * as display from "./src/display.ts";
|
|
9
9
|
export * as model from "./src/model.ts";
|
|
10
10
|
export * as openaiChat from "./src/openai-chat.ts";
|
|
11
11
|
export * as openaiResponses from "./src/openai-responses.ts";
|
|
12
12
|
export type { EndpointCapabilities, FamilyClass } from "./src/classify.ts";
|
|
13
|
-
export { ModelClass, ModelClassSchema, ModelProfileSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
|
|
14
|
-
export type { ModelProfile, ServingEndpointSummary, ModelQuery, RankedModel } from "./src/model.ts";
|
|
13
|
+
export { ModelClass, ModelClassSchema, ModelProfileSchema, ReasoningEffort, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
|
|
14
|
+
export type { ModelProfile, ModelStatus, ServingEndpointSummary, ModelQuery, RankedModel } from "./src/model.ts";
|
|
15
15
|
export { UNSUPPORTED_CHAT_FIELDS } from "./src/openai-chat.ts";
|
|
16
16
|
export type { ChatRole, ChatContentPart, ChatToolCallFunction, ChatToolCall, ChatMessage, ChatContentToTextOptions } from "./src/openai-chat.ts";
|
|
17
17
|
export { REASONING_TYPES } from "./src/openai-responses.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-model";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.6.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.6.188";
|
|
3
3
|
export * as classify from "./src/classify.ts";
|
|
4
4
|
export * as display from "./src/display.ts";
|
|
5
5
|
export * as model from "./src/model.ts";
|
|
6
6
|
export * as openaiChat from "./src/openai-chat.ts";
|
|
7
7
|
export * as openaiResponses from "./src/openai-responses.ts";
|
|
8
8
|
export type { EndpointCapabilities, FamilyClass } from "./src/classify.ts";
|
|
9
|
-
export { ModelClass, ModelClassSchema, ModelProfileSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
|
|
10
|
-
export type { ModelProfile, ServingEndpointSummary, ModelQuery, RankedModel } from "./src/model.ts";
|
|
9
|
+
export { ModelClass, ModelClassSchema, ModelProfileSchema, ReasoningEffort, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
|
|
10
|
+
export type { ModelProfile, ModelStatus, ServingEndpointSummary, ModelQuery, RankedModel } from "./src/model.ts";
|
|
11
11
|
export { UNSUPPORTED_CHAT_FIELDS } from "./src/openai-chat.ts";
|
|
12
12
|
export type { ChatRole, ChatContentPart, ChatToolCallFunction, ChatToolCall, ChatMessage, ChatContentToTextOptions } from "./src/openai-chat.ts";
|
|
13
13
|
export { REASONING_TYPES } from "./src/openai-responses.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
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/shared-model";
|
|
5
|
-
export const PACKAGE_VERSION = "0.6.
|
|
5
|
+
export const PACKAGE_VERSION = "0.6.188";
|
|
6
6
|
export * as classify from "./src/classify.js";
|
|
7
7
|
export * as display from "./src/display.js";
|
|
8
8
|
export * as model from "./src/model.js";
|
|
9
9
|
export * as openaiChat from "./src/openai-chat.js";
|
|
10
10
|
export * as openaiResponses from "./src/openai-responses.js";
|
|
11
|
-
export { ModelClass, ModelClassSchema, ModelProfileSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.js";
|
|
11
|
+
export { ModelClass, ModelClassSchema, ModelProfileSchema, ReasoningEffort, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.js";
|
|
12
12
|
export { UNSUPPORTED_CHAT_FIELDS } from "./src/openai-chat.js";
|
|
13
13
|
export { REASONING_TYPES } from "./src/openai-responses.js";
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhOLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjYuMTg4XCI7XG5leHBvcnQgKiBhcyBjbGFzc2lmeSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCAqIGFzIGRpc3BsYXkgZnJvbSBcIi4vc3JjL2Rpc3BsYXkudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgb3BlbmFpQ2hhdCBmcm9tIFwiLi9zcmMvb3BlbmFpLWNoYXQudHNcIjtcbmV4cG9ydCAqIGFzIG9wZW5haVJlc3BvbnNlcyBmcm9tIFwiLi9zcmMvb3BlbmFpLXJlc3BvbnNlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFbmRwb2ludENhcGFiaWxpdGllcywgRmFtaWx5Q2xhc3MgfSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCB7IE1vZGVsQ2xhc3MsIE1vZGVsQ2xhc3NTY2hlbWEsIE1vZGVsUHJvZmlsZVNjaGVtYSwgUmVhc29uaW5nRWZmb3J0LCBSZWFzb25pbmdFZmZvcnRTY2hlbWEsIE1vZGVsU3RhdHVzU2NoZW1hLCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5U2NoZW1hLCBNb2RlbFF1ZXJ5U2NoZW1hLCBSYW5rZWRNb2RlbFNjaGVtYSB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbFByb2ZpbGUsIE1vZGVsU3RhdHVzLCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LCBNb2RlbFF1ZXJ5LCBSYW5rZWRNb2RlbCB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHsgVU5TVVBQT1JURURfQ0hBVF9GSUVMRFMgfSBmcm9tIFwiLi9zcmMvb3BlbmFpLWNoYXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhdFJvbGUsIENoYXRDb250ZW50UGFydCwgQ2hhdFRvb2xDYWxsRnVuY3Rpb24sIENoYXRUb29sQ2FsbCwgQ2hhdE1lc3NhZ2UsIENoYXRDb250ZW50VG9UZXh0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9vcGVuYWktY2hhdC50c1wiO1xuZXhwb3J0IHsgUkVBU09OSU5HX1RZUEVTIH0gZnJvbSBcIi4vc3JjL29wZW5haS1yZXNwb25zZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvciwgUmVzcG9uc2VzQ2l0YXRpb24sIFJlc3BvbnNlc091dHB1dCB9IGZyb20gXCIuL3NyYy9vcGVuYWktcmVzcG9uc2VzLnRzXCI7XG4iXX0=
|
package/lib/src/classify.js
CHANGED
|
@@ -30,6 +30,26 @@ import { ModelClass } from "./model.js";
|
|
|
30
30
|
const CHAT_TASK = "llm/v1/chat";
|
|
31
31
|
/** Task hint Databricks stamps on embedding endpoints. */
|
|
32
32
|
const EMBEDDING_TASK = "llm/v1/embeddings";
|
|
33
|
+
function parsedFamily(name) {
|
|
34
|
+
const tokens = name.toLowerCase().match(/[a-z0-9]+/g) ?? [];
|
|
35
|
+
const familyToken = tokens.find((token) => {
|
|
36
|
+
return (token === "claude" ||
|
|
37
|
+
token === "gemini" ||
|
|
38
|
+
token === "gemma" ||
|
|
39
|
+
token === "glm" ||
|
|
40
|
+
token === "gpt" ||
|
|
41
|
+
token === "llama" ||
|
|
42
|
+
token === "qwen" ||
|
|
43
|
+
/^qwen\d/.test(token));
|
|
44
|
+
});
|
|
45
|
+
if (!familyToken)
|
|
46
|
+
return undefined;
|
|
47
|
+
const family = (familyToken.startsWith("qwen") ? "qwen" : familyToken);
|
|
48
|
+
return {
|
|
49
|
+
family,
|
|
50
|
+
parts: new Set(tokens),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
33
53
|
/**
|
|
34
54
|
* Provider families verified against Databricks Responses/Open Responses with
|
|
35
55
|
* both a forced function call and a stateless `function_call_output` replay.
|
|
@@ -41,14 +61,12 @@ const EMBEDDING_TASK = "llm/v1/embeddings";
|
|
|
41
61
|
* passthrough entirely.
|
|
42
62
|
*/
|
|
43
63
|
export function supportsToolsByFamily(name) {
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
64
|
+
const parsed = parsedFamily(name);
|
|
65
|
+
if (!parsed || parsed.family === "gemini")
|
|
66
|
+
return false;
|
|
67
|
+
if (parsed.family === "gpt" && parsed.parts.has("oss"))
|
|
46
68
|
return false;
|
|
47
|
-
return
|
|
48
|
-
n.includes("gpt") ||
|
|
49
|
-
n.includes("qwen") ||
|
|
50
|
-
n.includes("glm") ||
|
|
51
|
-
n.includes("llama"));
|
|
69
|
+
return ["claude", "gpt", "qwen", "glm", "llama"].includes(parsed.family);
|
|
52
70
|
}
|
|
53
71
|
/**
|
|
54
72
|
* Derive an endpoint's capabilities from its Databricks task hint and its
|
|
@@ -127,48 +145,53 @@ function versionScore(name) {
|
|
|
127
145
|
*/
|
|
128
146
|
export function classifyByFamily(name) {
|
|
129
147
|
const n = name.toLowerCase();
|
|
148
|
+
const parsed = parsedFamily(n);
|
|
149
|
+
if (!parsed)
|
|
150
|
+
return null;
|
|
151
|
+
const { family, parts } = parsed;
|
|
152
|
+
const has = (part) => parts.has(part);
|
|
130
153
|
const at = (cls) => ({ class: cls, rank: versionScore(n) });
|
|
131
154
|
// Anthropic Claude
|
|
132
|
-
if (
|
|
155
|
+
if (family === "claude" && has("opus"))
|
|
133
156
|
return at(ModelClass.ChatThinking);
|
|
134
|
-
if (
|
|
157
|
+
if (family === "claude" && has("sonnet"))
|
|
135
158
|
return at(ModelClass.ChatBalanced);
|
|
136
|
-
if (
|
|
159
|
+
if (family === "claude" && has("haiku"))
|
|
137
160
|
return at(ModelClass.ChatFast);
|
|
138
161
|
// OpenAI open-weights (check before the generic gpt branch)
|
|
139
|
-
if (
|
|
140
|
-
return at(
|
|
162
|
+
if (family === "gpt" && has("oss")) {
|
|
163
|
+
return at(has("120b") ? ModelClass.ChatBalanced : ModelClass.ChatFast);
|
|
141
164
|
}
|
|
142
165
|
// OpenAI GPT family
|
|
143
|
-
if (
|
|
144
|
-
if (
|
|
166
|
+
if (family === "gpt") {
|
|
167
|
+
if (has("pro"))
|
|
145
168
|
return at(ModelClass.ChatThinking);
|
|
146
|
-
if (
|
|
169
|
+
if (has("mini") || has("nano"))
|
|
147
170
|
return at(ModelClass.ChatFast);
|
|
148
171
|
return at(ModelClass.ChatBalanced);
|
|
149
172
|
}
|
|
150
173
|
// Google Gemini / Gemma
|
|
151
|
-
if (
|
|
152
|
-
if (
|
|
174
|
+
if (family === "gemini") {
|
|
175
|
+
if (has("flash") && has("lite"))
|
|
153
176
|
return at(ModelClass.ChatFast);
|
|
154
|
-
if (
|
|
177
|
+
if (has("pro"))
|
|
155
178
|
return at(ModelClass.ChatThinking);
|
|
156
179
|
return at(ModelClass.ChatBalanced);
|
|
157
180
|
}
|
|
158
|
-
if (
|
|
181
|
+
if (family === "gemma")
|
|
159
182
|
return at(ModelClass.ChatFast);
|
|
160
183
|
// Meta Llama
|
|
161
|
-
if (
|
|
162
|
-
if (
|
|
184
|
+
if (family === "llama") {
|
|
185
|
+
if (has("maverick") || has("405b"))
|
|
163
186
|
return at(ModelClass.ChatThinking);
|
|
164
|
-
if (
|
|
187
|
+
if (has("70b"))
|
|
165
188
|
return at(ModelClass.ChatBalanced);
|
|
166
|
-
if (
|
|
189
|
+
if (has("8b") || has("1b"))
|
|
167
190
|
return at(ModelClass.ChatFast);
|
|
168
191
|
return at(ModelClass.ChatBalanced);
|
|
169
192
|
}
|
|
170
193
|
// Alibaba Qwen
|
|
171
|
-
if (
|
|
194
|
+
if (family === "qwen")
|
|
172
195
|
return at(ModelClass.ChatBalanced);
|
|
173
196
|
return null;
|
|
174
197
|
}
|
|
@@ -279,4 +302,4 @@ export function classifyEndpoints(endpoints) {
|
|
|
279
302
|
[ModelClass.Embedding]: embeddings,
|
|
280
303
|
};
|
|
281
304
|
}
|
|
282
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3NpZnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xhc3NpZnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBK0IsTUFBTSxZQUFZLENBQUM7QUFFckUsZ0VBQWdFO0FBQ2hFLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQztBQUVoQywwREFBMEQ7QUFDMUQsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUM7QUFZM0M7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBQVk7SUFDaEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2hFLE9BQU8sQ0FDTCxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNwQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNsQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUNwQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxRQUFnQztJQUNuRSxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsSUFBSSxRQUFRLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDOUYsOEVBQThFO0lBQzlFLDhDQUE4QztJQUM5QyxNQUFNLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJ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QUFDLEVBQUUsQ0FBQztRQUM1RixDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUYsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BGLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVU7S0FDbkMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZGVsLWNsYXNzIGNsYXNzaWZpY2F0aW9uIGZvciBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzLlxuICpcbiAqIENoYXQgY2FwYWJpbGl0eSBiYW5kcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBsaXZlIHdvcmtzcGFjZSBjYXRhbG9ndWVcbiAqIHJhdGhlciB0aGFuIGEgaGFuZC1tYWludGFpbmVkIHRhYmxlLiBEYXRhYnJpY2tzIHB1Ymxpc2hlc1xuICogcGVyLWVuZHBvaW50IGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgc2NvcmVzICh0aGUgQUkgUGxheWdyb3VuZFxuICogYmFycykgb24gdGhlIHNlcnZpbmcgbGlzdDsge0BsaW5rIGNsYXNzaWZ5RW5kcG9pbnRzfSBidWNrZXRzIHNjb3JlZFxuICogY2hhdCBtb2RlbHMgaW50byB0aGUgY2hhdCB7QGxpbmsgTW9kZWxDbGFzc30gYmFuZHMgYnkgdGhlICpyZWxhdGl2ZSpcbiAqIGRpc3RyaWJ1dGlvbiBvZiB0aG9zZSBzY29yZXMgKHF1YW50aWxlcywgbm90IGZpeGVkIGN1dC1vZmZzKSBzbyBhXG4gKiBicmFuZC1uZXcgbW9kZWwgdGhhdCBsYW5kcyBvdXRzaWRlIHRvZGF5J3Mgc2NvcmUgcmFuZ2Ugc3RpbGwgc2xvdHMgaW5cbiAqIG5leHQgdG8gaXRzIHBlZXJzLiBFbWJlZGRpbmcgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiYClcbiAqIGFyZSBidWNrZXRlZCBpbnRvIHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ30gYnkgdGFzaywgaW5kZXBlbmRlbnQgb2ZcbiAqIGFueSBzY29yZS5cbiAqXG4gKiBVbnNjb3JlZC1idXQtcmVjb2duaXphYmxlIGNoYXQgZW5kcG9pbnRzIGFyZSBzdGlsbCBwbGFjZWQgYnkgYSBzbWFsbFxuICogZmFtaWx5IGhldXJpc3RpYyAoe0BsaW5rIGNsYXNzaWZ5QnlGYW1pbHl9KSBzbyBhIHdvcmtzcGFjZSB3aG9zZVxuICogbW9kZWxzIHByZWRhdGUgRm91bmRhdGlvbiBNb2RlbCBBUEkgc2NvcmluZyBrZWVwcyB3b3JraW5nLiBUaGVcbiAqIG9mZmxpbmUgZmFsbGJhY2sgZmxvb3IgLSB0aGUgaGFyZC1jb2RlZCBtb2RlbCBsaXN0IHJlYWNoZWQgZm9yIHdoZW5cbiAqIHRoZSBsaXZlIGNhdGFsb2d1ZSBjYW4ndCBiZSByZWFkIGF0IGFsbCAtIGlzIGEgc2VydmVyIGNvbmNlcm4gYW5kXG4gKiBsaXZlcyBpbiBgQGRieC10b29scy9tb2RlbGAsIG5vdCBoZXJlOiBhIGJyb3dzZXIgY2xpZW50IG5ldmVyIHRhbGtzXG4gKiB0byBEYXRhYnJpY2tzIGRpcmVjdGx5LCBzbyBpdCBoYXMgbm90aGluZyB0byBmYWxsIGJhY2sgdG8uXG4gKlxuICogUHVyZSAobm8gTm9kZS1vbmx5IGltcG9ydHMpLCBzbyBhIGNsaWVudCBjYW4gY2xhc3NpZnkgYSBgL21vZGVsc2BcbiAqIHJlc3BvbnNlIHdpdGhvdXQgc2VydmVyIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgTW9kZWxDbGFzcywgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcblxuLyoqIFRhc2sgaGludCBEYXRhYnJpY2tzIHN0YW1wcyBvbiBjaGF0IGNvbXBsZXRpb24gZW5kcG9pbnRzLiAqL1xuY29uc3QgQ0hBVF9UQVNLID0gXCJsbG0vdjEvY2hhdFwiO1xuXG4vKiogVGFzayBoaW50IERhdGFicmlja3Mgc3RhbXBzIG9uIGVtYmVkZGluZyBlbmRwb2ludHMuICovXG5jb25zdCBFTUJFRERJTkdfVEFTSyA9IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcblxuLyoqIFdoYXQgYW4gZW5kcG9pbnQgY2FuIGJlIGFza2VkIHRvIGRvLCBhcyBkZXJpdmVkIGJ5IHtAbGluayBlbmRwb2ludENhcGFiaWxpdGllc30uICovXG5leHBvcnQgaW50ZXJmYWNlIEVuZHBvaW50Q2FwYWJpbGl0aWVzIHtcbiAgLyoqIE9wZW5BSSBjaGF0L2NvbXBsZXRpb25zICsgUmVzcG9uc2VzOiB0aGUgc3VyZmFjZSBhIGNoYXQgYWdlbnQgbmVlZHMuICovXG4gIGNoYXQ6IGJvb2xlYW47XG4gIC8qKiBFbWJlZGRpbmcgKHZlY3RvcikgZW5kcG9pbnQuICovXG4gIGVtYmVkZGluZzogYm9vbGVhbjtcbiAgLyoqIENvbXBsZXRlIGZ1bmN0aW9uLXRvb2wgcm91bmQtdHJpcCAoY2FsbCBwbHVzIGZ1bmN0aW9uX2NhbGxfb3V0cHV0IHJlcGxheSkuICovXG4gIHRvb2xzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3ZpZGVyIGZhbWlsaWVzIHZlcmlmaWVkIGFnYWluc3QgRGF0YWJyaWNrcyBSZXNwb25zZXMvT3BlbiBSZXNwb25zZXMgd2l0aFxuICogYm90aCBhIGZvcmNlZCBmdW5jdGlvbiBjYWxsIGFuZCBhIHN0YXRlbGVzcyBgZnVuY3Rpb25fY2FsbF9vdXRwdXRgIHJlcGxheS5cbiAqXG4gKiBEYXRhYnJpY2tzJyBlbmRwb2ludCBsaXN0L09wZW5BUEkgY3VycmVudGx5IGV4cG9zZXMgbm8gdG9vbHMgY2FwYWJpbGl0eSBiaXQuXG4gKiBLZWVwIHRoaXMgY29uc2VydmF0aXZlOiBhbiB1bmtub3duIGNoYXQgZmFtaWx5IGlzIG5vdCBhZ2VudC1zYWZlIHVudGlsIGl0IGlzXG4gKiB2ZXJpZmllZC4gR2VtaW5pIGlzIGV4Y2x1ZGVkIGJlY2F1c2UgaXQgZW1pdHMgYSBjYWxsIGJ1dCBPcGVuIFJlc3BvbnNlc1xuICogY2Fubm90IHJlcGxheSB0aGUgcmVxdWlyZWQgdGhvdWdodCBzaWduYXR1cmU7IEdQVC1PU1MgcmVqZWN0cyBSZXNwb25zZXNcbiAqIHBhc3N0aHJvdWdoIGVudGlyZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNUb29sc0J5RmFtaWx5KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBuID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBpZiAobi5pbmNsdWRlcyhcImdlbWluaVwiKSB8fCBuLmluY2x1ZGVzKFwiZ3B0LW9zc1wiKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKFxuICAgIG4uaW5jbHVkZXMoXCJjbGF1ZGVcIikgfHxcbiAgICBuLmluY2x1ZGVzKFwiZ3B0XCIpIHx8XG4gICAgbi5pbmNsdWRlcyhcInF3ZW5cIikgfHxcbiAgICBuLmluY2x1ZGVzKFwiZ2xtXCIpIHx8XG4gICAgbi5pbmNsdWRlcyhcImxsYW1hXCIpXG4gICk7XG59XG5cbi8qKlxuICogRGVyaXZlIGFuIGVuZHBvaW50J3MgY2FwYWJpbGl0aWVzIGZyb20gaXRzIERhdGFicmlja3MgdGFzayBoaW50IGFuZCBpdHNcbiAqIGNsYXNzaWZpZWQge0BsaW5rIE1vZGVsQ2xhc3N9LCBzbyBjb25zdW1lcnMgZmlsdGVyIG9uIGNhcGFiaWxpdHkgaW5zdGVhZCBvZlxuICogcmUtZGVyaXZpbmcgaXQgZnJvbSByYXcgYHRhc2tgIC8gYGNsYXNzYCBzdHJpbmdzLlxuICpcbiAqIEVpdGhlciBzaWduYWwgYWxvbmUgaXMgZW5vdWdoOiB0aGUgdGFzayBoaW50IGlzIGF1dGhvcml0YXRpdmUgd2hlbiBwcmVzZW50LFxuICogYW5kIHRoZSBjbGFzcyBjb3ZlcnMgZW5kcG9pbnRzIERhdGFicmlja3MgbGVmdCB1bnRhc2tlZCBidXQgdGhlIGNsYXNzaWZpZXJcbiAqIHJlY29nbml6ZWQuIEVtYmVkZGluZyB3aW5zIG92ZXIgY2hhdCB3aGVuIGJvdGggcG9pbnQgYXQgaXQsIHNpbmNlIHRoZSB0d28gYXJlXG4gKiBub3QgaW50ZXJjaGFuZ2VhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBFbmRwb2ludENhcGFiaWxpdGllcyB7XG4gIGNvbnN0IGVtYmVkZGluZyA9IGVuZHBvaW50LnRhc2sgPT09IEVNQkVERElOR19UQVNLIHx8IGVuZHBvaW50LmNsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZztcbiAgLy8gRXZlcnkgbm9uLWVtYmVkZGluZyBjbGFzcyBpcyBhIGNoYXQgYmFuZCwgc28gXCJjbGFzc2lmaWVkIGJ1dCBub3QgZW1iZWRkaW5nXCJcbiAgLy8gaXMgdGhlIGNsYXNzLXNpZGUgdGVzdCBmb3IgY2hhdCBjYXBhYmlsaXR5LlxuICBjb25zdCBjaGF0ID0gIWVtYmVkZGluZyAmJiAoZW5kcG9pbnQudGFzayA9PT0gQ0hBVF9UQVNLIHx8IGVuZHBvaW50LmNsYXNzICE9PSB1bmRlZmluZWQpO1xuICBjb25zdCB0b29scyA9IGNoYXQgJiYgKGVuZHBvaW50LnN1cHBvcnRzVG9vbHMgPz8gc3VwcG9ydHNUb29sc0J5RmFtaWx5KGVuZHBvaW50Lm5hbWUpKTtcbiAgcmV0dXJuIHsgY2hhdCwgZW1iZWRkaW5nLCB0b29scyB9O1xufVxuXG4vKiogRmFtaWx5LWhldXJpc3RpYyBjbGFzc2lmaWNhdGlvbiBvZiBhIHNpbmdsZSBlbmRwb2ludCBuYW1lLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYW1pbHlDbGFzcyB7XG4gIC8qKiBDaGF0IGNhcGFiaWxpdHkgYmFuZCB0aGUgZmFtaWx5IG1hcHMgdG8gKG5ldmVyIGVtYmVkZGluZykuICovXG4gIGNsYXNzOiBNb2RlbENsYXNzO1xuICAvKiogSW50cmEtZmFtaWx5IG9yZGVyaW5nIGhpbnQgKGhpZ2hlciBpcyBuZXdlciAvIG1vcmUgY2FwYWJsZSkuICovXG4gIHJhbms6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBOdW1lcmljIGBbbWFqb3IsIG1pbm9yLCBwYXRjaF1gIHZlcnNpb24gcGFyc2VkIGZyb20gYW4gZW5kcG9pbnRcbiAqIG5hbWUsIHVzZWQgdG8gb3JkZXIgc2libGluZ3Mgd2l0aGluIGEgZmFtaWx5L3RpZXIuIFN0YXJ0cyBhdCB0aGVcbiAqIGZpcnN0IGRpZ2l0IGluIHRoZSBuYW1lLCB0aGVuIHJlYWRzIHN1Y2Nlc3NpdmUgc2VwYXJhdG9yLWRlbGltaXRlZCxcbiAqIGRpZ2l0LXByZWZpeGVkIGNodW5rcyBhcyB0aGUgdGhyZWUgY29tcG9uZW50cyAobWlzc2luZyBvbmVzIGRlZmF1bHRcbiAqIHRvIGAwYCk6XG4gKlxuICogICAtIGBkYXRhYnJpY2tzLWNsYXVkZS1vcHVzLTQtOGAgICAtPiBgWzQsIDgsIDBdYFxuICogICAtIGBkYXRhYnJpY2tzLWNsYXVkZS1vcHVzLTQtMTBgICAtPiBgWzQsIDEwLCAwXWAgKHNvcnRzIGFib3ZlIDQtOClcbiAqICAgLSBgZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMy03MGJgLT4gYFszLCAzLCA3MF1gXG4gKiAgIC0gYGRhdGFicmlja3MtYmdlLWxhcmdlLWVuYCAgICAgIC0+IGBbMCwgMCwgMF1gIChubyBkaWdpdHMpXG4gKlxuICogQ29tcG9uZW50LXdpc2UgY29tcGFyaXNvbiAobm90IGEgZGVjaW1hbCBjb2xsYXBzZSkgc28gYDQuMTBgIGJlYXRzXG4gKiBgNC44YCAtIHRoZSBidWcgYSBgbWFqb3IgKyBtaW5vci8xMGAgc2NvcmUgd291bGQgaGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvblR1cGxlKG5hbWU6IHN0cmluZyk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gIGNvbnN0IHN0YXJ0ID0gbmFtZS5zZWFyY2goL1xcZC8pO1xuICBpZiAoc3RhcnQgPCAwKSByZXR1cm4gWzAsIDAsIDBdO1xuICBjb25zdCBudW1zID0gbmFtZVxuICAgIC5zbGljZShzdGFydClcbiAgICAuc3BsaXQoL1teYS16MC05XSsvaSlcbiAgICAubWFwKChjaHVuaykgPT4gY2h1bmsubWF0Y2goL15cXGQrLyk/LlswXSlcbiAgICAuZmlsdGVyKChkaWdpdHMpOiBkaWdpdHMgaXMgc3RyaW5nID0+IGRpZ2l0cyAhPT0gdW5kZWZpbmVkKVxuICAgIC5tYXAoTnVtYmVyKTtcbiAgcmV0dXJuIFtudW1zWzBdID8/IDAsIG51bXNbMV0gPz8gMCwgbnVtc1syXSA/PyAwXTtcbn1cblxuLyoqIENvbXBhcmUgdHdvIHZlcnNpb24gdHVwbGVzIHNvIHRoZSBoaWdoZXIgdmVyc2lvbiBzb3J0cyBmaXJzdCAoZGVzY2VuZGluZykuICovXG5mdW5jdGlvbiBjb21wYXJlVmVyc2lvbkRlc2MoYTogcmVhZG9ubHkgbnVtYmVyW10sIGI6IHJlYWRvbmx5IG51bWJlcltdKTogbnVtYmVyIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICBjb25zdCBkaWZmID0gKGJbaV0gPz8gMCkgLSAoYVtpXSA/PyAwKTtcbiAgICBpZiAoZGlmZiAhPT0gMCkgcmV0dXJuIGRpZmY7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICogTW9ub3RvbmljIHZlcnNpb24ga2V5IGZvciBvcmRlcmluZyBzaWJsaW5ncyB3aXRoaW4gYSBmYW1pbHkvdGllclxuICogKGUuZy4gYG9wdXMtNC04YCBvdmVyIGBvcHVzLTQtN2ApLiBFbmNvZGVzIHRoZSB7QGxpbmsgdmVyc2lvblR1cGxlfVxuICogYXMgYSBzaW5nbGUgbnVtYmVyIHNvIGNhbGxlcnMgdGhhdCBuZWVkIGEgc2NhbGFyIHJhbmsgKHRoZSBmYW1pbHlcbiAqIGhldXJpc3RpYywgdGhlIHN0YXRpYyBmYWxsYmFjayBvcmRlcmluZykga2VlcCB3b3JraW5nOyB0aGUgZW5jb2RpbmdcbiAqIHByZXNlcnZlcyBjb21wb25lbnQgb3JkZXIgd2l0aG91dCB0aGUgZGVjaW1hbC1jb2xsYXBzZSBidWcuXG4gKi9cbmZ1bmN0aW9uIHZlcnNpb25TY29yZShuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSB2ZXJzaW9uVHVwbGUobmFtZSk7XG4gIHJldHVybiBtYWpvciAqIDFfMDAwXzAwMCArIG1pbm9yICogMV8wMDAgKyBwYXRjaDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBjaGF0IGNhcGFiaWxpdHkgYmFuZCBmb3IgYW4gZW5kcG9pbnQgd2UgaGF2ZSBubyBsaXZlXG4gKiBzY29yZSBmb3IsIGtleWVkIG9mZiBwcm92aWRlciBmYW1pbHkgYW5kIHRoZSB3ZWxsLWtub3duIHZhcmlhbnQgd29yZHNcbiAqIGluIHRoZSBuYW1lIChgb3B1c2AvYHNvbm5ldGAvYGhhaWt1YCwgYHByb2AvYG1pbmlgL2BuYW5vYCxcbiAqIGBmbGFzaGAvYGZsYXNoLWxpdGVgLCBMbGFtYSBwYXJhbWV0ZXIgc2l6ZXMsIGV0YykuIFJldHVybnMgYG51bGxgIGZvclxuICogbmFtZXMgd2UgZG9uJ3QgcmVjb2duaXplIHNvIHVua25vd24gY3VzdG9tIGVuZHBvaW50cyBhcmUgbmV2ZXJcbiAqIGF1dG8tc2VsZWN0ZWQgYXMgYSBkZWZhdWx0LiBUaGUgYWNjb21wYW55aW5nIGByYW5rYCBvcmRlcnMgc2libGluZ3NcbiAqIHdpdGhpbiBhIGNsYXNzLiBPbmx5IGV2ZXIgcmV0dXJucyBhIGNoYXQgYmFuZCAtIGVtYmVkZGluZyBlbmRwb2ludHNcbiAqIGFyZSBjbGFzc2lmaWVkIGJ5IHRhc2ssIG5vdCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlCeUZhbWlseShuYW1lOiBzdHJpbmcpOiBGYW1pbHlDbGFzcyB8IG51bGwge1xuICBjb25zdCBuID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBhdCA9IChjbHM6IE1vZGVsQ2xhc3MpOiBGYW1pbHlDbGFzcyA9PiAoeyBjbGFzczogY2xzLCByYW5rOiB2ZXJzaW9uU2NvcmUobikgfSk7XG5cbiAgLy8gQW50aHJvcGljIENsYXVkZVxuICBpZiAobi5pbmNsdWRlcyhcIm9wdXNcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gIGlmIChuLmluY2x1ZGVzKFwic29ubmV0XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICBpZiAobi5pbmNsdWRlcyhcImhhaWt1XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG5cbiAgLy8gT3BlbkFJIG9wZW4td2VpZ2h0cyAoY2hlY2sgYmVmb3JlIHRoZSBnZW5lcmljIGdwdCBicmFuY2gpXG4gIGlmIChuLmluY2x1ZGVzKFwiZ3B0LW9zc1wiKSkge1xuICAgIHJldHVybiBhdChuLmluY2x1ZGVzKFwiMTIwYlwiKSA/IE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkIDogTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gIH1cbiAgLy8gT3BlbkFJIEdQVCBmYW1pbHlcbiAgaWYgKG4uaW5jbHVkZXMoXCJncHRcIikpIHtcbiAgICBpZiAobi5pbmNsdWRlcyhcInByb1wiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIm1pbmlcIikgfHwgbi5pbmNsdWRlcyhcIm5hbm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRGYXN0KTtcbiAgICByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICB9XG5cbiAgLy8gR29vZ2xlIEdlbWluaSAvIEdlbW1hXG4gIGlmIChuLmluY2x1ZGVzKFwiZ2VtaW5pXCIpKSB7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJmbGFzaC1saXRlXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJwcm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gICAgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgfVxuICBpZiAobi5pbmNsdWRlcyhcImdlbW1hXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG5cbiAgLy8gTWV0YSBMbGFtYVxuICBpZiAobi5pbmNsdWRlcyhcImxsYW1hXCIpKSB7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJtYXZlcmlja1wiKSB8fCBuLmluY2x1ZGVzKFwiNDA1YlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIjcwYlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIjhiXCIpIHx8IG4uaW5jbHVkZXMoXCIxYlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICAgIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCk7XG4gIH1cblxuICAvLyBBbGliYWJhIFF3ZW5cbiAgaWYgKG4uaW5jbHVkZXMoXCJxd2VuXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogTGluZWFyLWludGVycG9sYXRlZCBxdWFudGlsZSBvZiBhbiBhc2NlbmRpbmctc29ydGVkIG51bWVyaWMgYXJyYXkuICovXG5mdW5jdGlvbiBxdWFudGlsZShzb3J0ZWRBc2M6IHJlYWRvbmx5IG51bWJlcltdLCBwOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoc29ydGVkQXNjLmxlbmd0aCA9PT0gMCkgcmV0dXJuIE51bWJlci5OYU47XG4gIGNvbnN0IGlkeCA9IChzb3J0ZWRBc2MubGVuZ3RoIC0gMSkgKiBwO1xuICBjb25zdCBsbyA9IE1hdGguZmxvb3IoaWR4KTtcbiAgY29uc3QgaGkgPSBNYXRoLmNlaWwoaWR4KTtcbiAgaWYgKGxvID09PSBoaSkgcmV0dXJuIHNvcnRlZEFzY1tsb10hO1xuICByZXR1cm4gc29ydGVkQXNjW2xvXSEgKyAoc29ydGVkQXNjW2hpXSEgLSBzb3J0ZWRBc2NbbG9dISkgKiAoaWR4IC0gbG8pO1xufVxuXG4vKiogSW50ZXJuYWwgc29ydGFibGUgd3JhcHBlciBjYXJyeWluZyB0aGUgb3JkZXJpbmcga2V5cyBmb3IgYSBidWNrZXQgZW50cnkuICovXG5pbnRlcmZhY2UgUmFua2VkIHtcbiAgZXA6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnk7XG4gIC8qKiBRdWFsaXR5IChzY29yZWQpIG9yIGZhbWlseSB2ZXJzaW9uICh1bnNjb3JlZCkgLSBoaWdoZXIgZmlyc3QuICovXG4gIHNvcnQ6IG51bWJlcjtcbiAgLyoqIFNjb3JlZCBlbmRwb2ludHMgcmFuayBhaGVhZCBvZiBmYW1pbHktb25seSBndWVzc2VzLiAqL1xuICBzY29yZWQ6IGJvb2xlYW47XG4gIHRpZUNvc3Q6IG51bWJlcjtcbiAgdGllU3BlZWQ6IG51bWJlcjtcbiAgLyoqIFBhcnNlZCBuYW1lIHZlcnNpb24sIHRoZSBmaW5hbCB0aWUtYnJlYWtlciAobmV3ZXIgc2libGluZyBmaXJzdCkuICovXG4gIHZlcnNpb246IHJlYWRvbmx5IG51bWJlcltdO1xufVxuXG5mdW5jdGlvbiByYW5rT3JkZXIoYTogUmFua2VkLCBiOiBSYW5rZWQpOiBudW1iZXIge1xuICBpZiAoYS5zY29yZWQgIT09IGIuc2NvcmVkKSByZXR1cm4gYS5zY29yZWQgPyAtMSA6IDE7XG4gIGlmIChiLnNvcnQgIT09IGEuc29ydCkgcmV0dXJuIGIuc29ydCAtIGEuc29ydDtcbiAgaWYgKGEudGllQ29zdCAhPT0gYi50aWVDb3N0KSByZXR1cm4gYS50aWVDb3N0IC0gYi50aWVDb3N0O1xuICBpZiAoYi50aWVTcGVlZCAhPT0gYS50aWVTcGVlZCkgcmV0dXJuIGIudGllU3BlZWQgLSBhLnRpZVNwZWVkO1xuICAvLyBTYW1lIHNjb3JlZC1uZXNzLCBxdWFsaXR5LCBjb3N0LCBhbmQgc3BlZWQgKGUuZy4gc2V2ZXJhbCBDbGF1ZGVcbiAgLy8gT3B1cyBwb2ludCByZWxlYXNlcyk6IHByZWZlciB0aGUgbmV3ZXIgcGFyc2VkIHZlcnNpb24gc29cbiAgLy8gYG9wdXMtNC04YCBiZWF0cyBgb3B1cy00LTdgLlxuICByZXR1cm4gY29tcGFyZVZlcnNpb25EZXNjKGEudmVyc2lvbiwgYi52ZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBCdWNrZXQgbGl2ZSBlbmRwb2ludHMgaW50byB7QGxpbmsgTW9kZWxDbGFzc31lcywgcmFua2VkIGJlc3QtZmlyc3RcbiAqIHdpdGhpbiBlYWNoIGNoYXQgYmFuZC5cbiAqXG4gKiBFbWJlZGRpbmcgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiYCkgZ28gaW50b1xuICoge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfSBieSB0YXNrLCBpbiBsaXN0aW5nIG9yZGVyICh0aGV5IGNhcnJ5IG5vXG4gKiBjYXBhYmlsaXR5IHNjb3JlIHRvIHJhbmsgb24pLlxuICpcbiAqIENoYXQgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvY2hhdFwiYCkgc3BsaXQgaW50byB0aGUgdGhyZWUgY2hhdFxuICogYmFuZHMuIFNjb3JlZCBlbmRwb2ludHMgKHRob3NlIGNhcnJ5aW5nIGEgYHByb2ZpbGUucXVhbGl0eWApIGRyaXZlXG4gKiB0aGUgYmFuZGluZzogdGhlIG9ic2VydmVkIHF1YWxpdHkgZGlzdHJpYnV0aW9uIGlzIHNwbGl0IGF0IGl0cyAxLzNcbiAqIGFuZCAyLzMgcXVhbnRpbGVzLCBzbyB0aGUgdG9wIHRoaXJkIGlzIHtAbGluayBNb2RlbENsYXNzLkNoYXRUaGlua2luZ30sXG4gKiB0aGUgYm90dG9tIHRoaXJkIHtAbGluayBNb2RlbENsYXNzLkNoYXRGYXN0fSwgYW5kIHRoZSBtaWRkbGVcbiAqIHtAbGluayBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZH0uIEJlY2F1c2UgdGhlIHRocmVzaG9sZHMgY29tZSBmcm9tIHRoZVxuICogZGF0YSwgdGhlIHNwbGl0IGFkYXB0cyBhcyBEYXRhYnJpY2tzIGFkZHMgb3IgcmVzY29yZXMgbW9kZWxzIC1cbiAqIG5vdGhpbmcgaXMgcGlubmVkIHRvIGEgZml4ZWQgc2NvcmUgYmFuZC5cbiAqXG4gKiBVbnNjb3JlZCBjaGF0IGVuZHBvaW50cyBhcmUgcGxhY2VkIGJ5IHtAbGluayBjbGFzc2lmeUJ5RmFtaWx5fSBhbmRcbiAqIHJhbmtlZCBhZnRlciB0aGUgc2NvcmVkIG9uZXMgaW4gdGhlaXIgYmFuZDsgdW5yZWNvZ25pemVkLCB1bnNjb3JlZFxuICogZW5kcG9pbnRzIChlLmcuIGN1c3RvbSBleHRlcm5hbCBtb2RlbHMpIGFyZSBvbWl0dGVkIGVudGlyZWx5IHNvIHRoZXlcbiAqIGFyZSBuZXZlciBwaWNrZWQgYXMgYW4gYXV0b21hdGljIGRlZmF1bHQuXG4gKlxuICogV2l0aGluIGEgY2hhdCBiYW5kLCBzY29yZWQgbW9kZWxzIHNvcnQgYnkgYHF1YWxpdHlgIGRlc2MsIHRoZW4gYGNvc3RgXG4gKiBhc2MsIHRoZW4gYHNwZWVkYCBkZXNjLCB0aGVuIHBhcnNlZCBuYW1lIHZlcnNpb24gZGVzYzsgZmFtaWx5LW9ubHlcbiAqIG1vZGVscyBzb3J0IGJ5IHZlcnNpb24gcmFuayB0aGVuIHBhcnNlZCB2ZXJzaW9uLiBUaGUgdmVyc2lvblxuICogdGllLWJyZWFrICh7QGxpbmsgdmVyc2lvblR1cGxlfSkgaXMgd2hhdCBzZXBhcmF0ZXMgcG9pbnQgcmVsZWFzZXNcbiAqIHRoYXQgc2hhcmUgYSBzY29yZSBwcm9maWxlIChlLmcuIGBvcHVzLTQtOGAgYWhlYWQgb2YgYG9wdXMtNC03YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUVuZHBvaW50cyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBSZWNvcmQ8TW9kZWxDbGFzcywgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IGNoYXQgPSBlbmRwb2ludHMuZmlsdGVyKChlKSA9PiBlLnRhc2sgPT09IENIQVRfVEFTSyk7XG4gIGNvbnN0IHF1YWxpdGllcyA9IGNoYXRcbiAgICAubWFwKChlKSA9PiBlLnByb2ZpbGU/LnF1YWxpdHkpXG4gICAgLmZpbHRlcigocSk6IHEgaXMgbnVtYmVyID0+IE51bWJlci5pc0Zpbml0ZShxKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICBjb25zdCBsb3cgPSBxdWFudGlsZShxdWFsaXRpZXMsIDEgLyAzKTtcbiAgY29uc3QgaGlnaCA9IHF1YW50aWxlKHF1YWxpdGllcywgMiAvIDMpO1xuXG4gIGNvbnN0IGJ1Y2tldHM6IFJlY29yZDxNb2RlbENsYXNzLCBSYW5rZWRbXT4gPSB7XG4gICAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTogW10sXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXTogW10sXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOiBbXSxcbiAgICBbTW9kZWxDbGFzcy5FbWJlZGRpbmddOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IGVwIG9mIGNoYXQpIHtcbiAgICBjb25zdCBxID0gZXAucHJvZmlsZT8ucXVhbGl0eTtcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHEpKSB7XG4gICAgICBjb25zdCBxdWFsaXR5ID0gcSBhcyBudW1iZXI7XG4gICAgICBjb25zdCBjbHMgPVxuICAgICAgICBxdWFsaXR5ID49IGhpZ2hcbiAgICAgICAgICA/IE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXG4gICAgICAgICAgOiBxdWFsaXR5IDw9IGxvd1xuICAgICAgICAgICAgPyBNb2RlbENsYXNzLkNoYXRGYXN0XG4gICAgICAgICAgICA6IE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkO1xuICAgICAgYnVja2V0c1tjbHNdLnB1c2goe1xuICAgICAgICBlcCxcbiAgICAgICAgc29ydDogcXVhbGl0eSxcbiAgICAgICAgc2NvcmVkOiB0cnVlLFxuICAgICAgICB0aWVDb3N0OiBlcC5wcm9maWxlPy5jb3N0ID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgdGllU3BlZWQ6IGVwLnByb2ZpbGU/LnNwZWVkID8/IDAsXG4gICAgICAgIHZlcnNpb246IHZlcnNpb25UdXBsZShlcC5uYW1lKSxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGZhbWlseSA9IGNsYXNzaWZ5QnlGYW1pbHkoZXAubmFtZSk7XG4gICAgaWYgKCFmYW1pbHkpIGNvbnRpbnVlO1xuICAgIGJ1Y2tldHNbZmFtaWx5LmNsYXNzXS5wdXNoKHtcbiAgICAgIGVwLFxuICAgICAgc29ydDogZmFtaWx5LnJhbmssXG4gICAgICBzY29yZWQ6IGZhbHNlLFxuICAgICAgdGllQ29zdDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgdGllU3BlZWQ6IDAsXG4gICAgICB2ZXJzaW9uOiB2ZXJzaW9uVHVwbGUoZXAubmFtZSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBFbWJlZGRpbmdzIGFyZSBidWNrZXRlZCBieSB0YXNrIGluIGxpc3Rpbmcgb3JkZXIgLSBubyBzY29yZSB0byByYW5rLlxuICBjb25zdCBlbWJlZGRpbmdzID0gZW5kcG9pbnRzLmZpbHRlcigoZSkgPT4gZS50YXNrID09PSBFTUJFRERJTkdfVEFTSyk7XG5cbiAgcmV0dXJuIHtcbiAgICBbTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmddOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXS5zb3J0KHJhbmtPcmRlcikubWFwKCh4KSA9PiB4LmVwKSxcbiAgICBbTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWRdOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXS5zb3J0KHJhbmtPcmRlcikubWFwKCh4KSA9PiB4LmVwKSxcbiAgICBbTW9kZWxDbGFzcy5DaGF0RmFzdF06IGJ1Y2tldHNbTW9kZWxDbGFzcy5DaGF0RmFzdF0uc29ydChyYW5rT3JkZXIpLm1hcCgoeCkgPT4geC5lcCksXG4gICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogZW1iZWRkaW5ncyxcbiAgfTtcbn1cbiJdfQ==
|
|
305
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3NpZnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xhc3NpZnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBK0IsTUFBTSxZQUFZLENBQUM7QUFFckUsZ0VBQWdFO0FBQ2hFLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQztBQUVoQywwREFBMEQ7QUFDMUQsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUM7QUFTM0MsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1RCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDeEMsT0FBTyxDQUNMLEtBQUssS0FBSyxRQUFRO1lBQ2xCLEtBQUssS0FBSyxRQUFRO1lBQ2xCLEtBQUssS0FBSyxPQUFPO1lBQ2pCLEtBQUssS0FBSyxLQUFLO1lBQ2YsS0FBSyxLQUFLLEtBQUs7WUFDZixLQUFLLEtBQUssT0FBTztZQUNqQixLQUFLLEtBQUssTUFBTTtZQUNoQixTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUN0QixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsV0FBVztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ25DLE1BQU0sTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQWdCLENBQUM7SUFDdEYsT0FBTztRQUNMLE1BQU07UUFDTixLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDO0tBQ3ZCLENBQUM7QUFDSixDQUFDO0FBWUQ7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T0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BGLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVU7S0FDbkMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZGVsLWNsYXNzIGNsYXNzaWZpY2F0aW9uIGZvciBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzLlxuICpcbiAqIENoYXQgY2FwYWJpbGl0eSBiYW5kcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBsaXZlIHdvcmtzcGFjZSBjYXRhbG9ndWVcbiAqIHJhdGhlciB0aGFuIGEgaGFuZC1tYWludGFpbmVkIHRhYmxlLiBEYXRhYnJpY2tzIHB1Ymxpc2hlc1xuICogcGVyLWVuZHBvaW50IGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgc2NvcmVzICh0aGUgQUkgUGxheWdyb3VuZFxuICogYmFycykgb24gdGhlIHNlcnZpbmcgbGlzdDsge0BsaW5rIGNsYXNzaWZ5RW5kcG9pbnRzfSBidWNrZXRzIHNjb3JlZFxuICogY2hhdCBtb2RlbHMgaW50byB0aGUgY2hhdCB7QGxpbmsgTW9kZWxDbGFzc30gYmFuZHMgYnkgdGhlICpyZWxhdGl2ZSpcbiAqIGRpc3RyaWJ1dGlvbiBvZiB0aG9zZSBzY29yZXMgKHF1YW50aWxlcywgbm90IGZpeGVkIGN1dC1vZmZzKSBzbyBhXG4gKiBicmFuZC1uZXcgbW9kZWwgdGhhdCBsYW5kcyBvdXRzaWRlIHRvZGF5J3Mgc2NvcmUgcmFuZ2Ugc3RpbGwgc2xvdHMgaW5cbiAqIG5leHQgdG8gaXRzIHBlZXJzLiBFbWJlZGRpbmcgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiYClcbiAqIGFyZSBidWNrZXRlZCBpbnRvIHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ30gYnkgdGFzaywgaW5kZXBlbmRlbnQgb2ZcbiAqIGFueSBzY29yZS5cbiAqXG4gKiBVbnNjb3JlZC1idXQtcmVjb2duaXphYmxlIGNoYXQgZW5kcG9pbnRzIGFyZSBzdGlsbCBwbGFjZWQgYnkgYSBzbWFsbFxuICogZmFtaWx5IGhldXJpc3RpYyAoe0BsaW5rIGNsYXNzaWZ5QnlGYW1pbHl9KSBzbyBhIHdvcmtzcGFjZSB3aG9zZVxuICogbW9kZWxzIHByZWRhdGUgRm91bmRhdGlvbiBNb2RlbCBBUEkgc2NvcmluZyBrZWVwcyB3b3JraW5nLiBUaGVcbiAqIG9mZmxpbmUgZmFsbGJhY2sgZmxvb3IgLSB0aGUgaGFyZC1jb2RlZCBtb2RlbCBsaXN0IHJlYWNoZWQgZm9yIHdoZW5cbiAqIHRoZSBsaXZlIGNhdGFsb2d1ZSBjYW4ndCBiZSByZWFkIGF0IGFsbCAtIGlzIGEgc2VydmVyIGNvbmNlcm4gYW5kXG4gKiBsaXZlcyBpbiBgQGRieC10b29scy9tb2RlbGAsIG5vdCBoZXJlOiBhIGJyb3dzZXIgY2xpZW50IG5ldmVyIHRhbGtzXG4gKiB0byBEYXRhYnJpY2tzIGRpcmVjdGx5LCBzbyBpdCBoYXMgbm90aGluZyB0byBmYWxsIGJhY2sgdG8uXG4gKlxuICogUHVyZSAobm8gTm9kZS1vbmx5IGltcG9ydHMpLCBzbyBhIGNsaWVudCBjYW4gY2xhc3NpZnkgYSBgL21vZGVsc2BcbiAqIHJlc3BvbnNlIHdpdGhvdXQgc2VydmVyIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgTW9kZWxDbGFzcywgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcblxuLyoqIFRhc2sgaGludCBEYXRhYnJpY2tzIHN0YW1wcyBvbiBjaGF0IGNvbXBsZXRpb24gZW5kcG9pbnRzLiAqL1xuY29uc3QgQ0hBVF9UQVNLID0gXCJsbG0vdjEvY2hhdFwiO1xuXG4vKiogVGFzayBoaW50IERhdGFicmlja3Mgc3RhbXBzIG9uIGVtYmVkZGluZyBlbmRwb2ludHMuICovXG5jb25zdCBFTUJFRERJTkdfVEFTSyA9IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcblxudHlwZSBNb2RlbEZhbWlseSA9IFwiY2xhdWRlXCIgfCBcImdlbWluaVwiIHwgXCJnZW1tYVwiIHwgXCJnbG1cIiB8IFwiZ3B0XCIgfCBcImxsYW1hXCIgfCBcInF3ZW5cIjtcblxuaW50ZXJmYWNlIFBhcnNlZEZhbWlseSB7XG4gIGZhbWlseTogTW9kZWxGYW1pbHk7XG4gIHBhcnRzOiBSZWFkb25seVNldDxzdHJpbmc+O1xufVxuXG5mdW5jdGlvbiBwYXJzZWRGYW1pbHkobmFtZTogc3RyaW5nKTogUGFyc2VkRmFtaWx5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gbmFtZS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9bYS16MC05XSsvZykgPz8gW107XG4gIGNvbnN0IGZhbWlseVRva2VuID0gdG9rZW5zLmZpbmQoKHRva2VuKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRva2VuID09PSBcImNsYXVkZVwiIHx8XG4gICAgICB0b2tlbiA9PT0gXCJnZW1pbmlcIiB8fFxuICAgICAgdG9rZW4gPT09IFwiZ2VtbWFcIiB8fFxuICAgICAgdG9rZW4gPT09IFwiZ2xtXCIgfHxcbiAgICAgIHRva2VuID09PSBcImdwdFwiIHx8XG4gICAgICB0b2tlbiA9PT0gXCJsbGFtYVwiIHx8XG4gICAgICB0b2tlbiA9PT0gXCJxd2VuXCIgfHxcbiAgICAgIC9ecXdlblxcZC8udGVzdCh0b2tlbilcbiAgICApO1xuICB9KTtcbiAgaWYgKCFmYW1pbHlUb2tlbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZmFtaWx5ID0gKGZhbWlseVRva2VuLnN0YXJ0c1dpdGgoXCJxd2VuXCIpID8gXCJxd2VuXCIgOiBmYW1pbHlUb2tlbikgYXMgTW9kZWxGYW1pbHk7XG4gIHJldHVybiB7XG4gICAgZmFtaWx5LFxuICAgIHBhcnRzOiBuZXcgU2V0KHRva2VucyksXG4gIH07XG59XG5cbi8qKiBXaGF0IGFuIGVuZHBvaW50IGNhbiBiZSBhc2tlZCB0byBkbywgYXMgZGVyaXZlZCBieSB7QGxpbmsgZW5kcG9pbnRDYXBhYmlsaXRpZXN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmRwb2ludENhcGFiaWxpdGllcyB7XG4gIC8qKiBPcGVuQUkgY2hhdC9jb21wbGV0aW9ucyArIFJlc3BvbnNlczogdGhlIHN1cmZhY2UgYSBjaGF0IGFnZW50IG5lZWRzLiAqL1xuICBjaGF0OiBib29sZWFuO1xuICAvKiogRW1iZWRkaW5nICh2ZWN0b3IpIGVuZHBvaW50LiAqL1xuICBlbWJlZGRpbmc6IGJvb2xlYW47XG4gIC8qKiBDb21wbGV0ZSBmdW5jdGlvbi10b29sIHJvdW5kLXRyaXAgKGNhbGwgcGx1cyBmdW5jdGlvbl9jYWxsX291dHB1dCByZXBsYXkpLiAqL1xuICB0b29sczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm92aWRlciBmYW1pbGllcyB2ZXJpZmllZCBhZ2FpbnN0IERhdGFicmlja3MgUmVzcG9uc2VzL09wZW4gUmVzcG9uc2VzIHdpdGhcbiAqIGJvdGggYSBmb3JjZWQgZnVuY3Rpb24gY2FsbCBhbmQgYSBzdGF0ZWxlc3MgYGZ1bmN0aW9uX2NhbGxfb3V0cHV0YCByZXBsYXkuXG4gKlxuICogRGF0YWJyaWNrcycgZW5kcG9pbnQgbGlzdC9PcGVuQVBJIGN1cnJlbnRseSBleHBvc2VzIG5vIHRvb2xzIGNhcGFiaWxpdHkgYml0LlxuICogS2VlcCB0aGlzIGNvbnNlcnZhdGl2ZTogYW4gdW5rbm93biBjaGF0IGZhbWlseSBpcyBub3QgYWdlbnQtc2FmZSB1bnRpbCBpdCBpc1xuICogdmVyaWZpZWQuIEdlbWluaSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IGVtaXRzIGEgY2FsbCBidXQgT3BlbiBSZXNwb25zZXNcbiAqIGNhbm5vdCByZXBsYXkgdGhlIHJlcXVpcmVkIHRob3VnaHQgc2lnbmF0dXJlOyBHUFQtT1NTIHJlamVjdHMgUmVzcG9uc2VzXG4gKiBwYXNzdGhyb3VnaCBlbnRpcmVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzVG9vbHNCeUZhbWlseShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VkRmFtaWx5KG5hbWUpO1xuICBpZiAoIXBhcnNlZCB8fCBwYXJzZWQuZmFtaWx5ID09PSBcImdlbWluaVwiKSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXJzZWQuZmFtaWx5ID09PSBcImdwdFwiICYmIHBhcnNlZC5wYXJ0cy5oYXMoXCJvc3NcIikpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFtcImNsYXVkZVwiLCBcImdwdFwiLCBcInF3ZW5cIiwgXCJnbG1cIiwgXCJsbGFtYVwiXS5pbmNsdWRlcyhwYXJzZWQuZmFtaWx5KTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYW4gZW5kcG9pbnQncyBjYXBhYmlsaXRpZXMgZnJvbSBpdHMgRGF0YWJyaWNrcyB0YXNrIGhpbnQgYW5kIGl0c1xuICogY2xhc3NpZmllZCB7QGxpbmsgTW9kZWxDbGFzc30sIHNvIGNvbnN1bWVycyBmaWx0ZXIgb24gY2FwYWJpbGl0eSBpbnN0ZWFkIG9mXG4gKiByZS1kZXJpdmluZyBpdCBmcm9tIHJhdyBgdGFza2AgLyBgY2xhc3NgIHN0cmluZ3MuXG4gKlxuICogRWl0aGVyIHNpZ25hbCBhbG9uZSBpcyBlbm91Z2g6IHRoZSB0YXNrIGhpbnQgaXMgYXV0aG9yaXRhdGl2ZSB3aGVuIHByZXNlbnQsXG4gKiBhbmQgdGhlIGNsYXNzIGNvdmVycyBlbmRwb2ludHMgRGF0YWJyaWNrcyBsZWZ0IHVudGFza2VkIGJ1dCB0aGUgY2xhc3NpZmllclxuICogcmVjb2duaXplZC4gRW1iZWRkaW5nIHdpbnMgb3ZlciBjaGF0IHdoZW4gYm90aCBwb2ludCBhdCBpdCwgc2luY2UgdGhlIHR3byBhcmVcbiAqIG5vdCBpbnRlcmNoYW5nZWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IEVuZHBvaW50Q2FwYWJpbGl0aWVzIHtcbiAgY29uc3QgZW1iZWRkaW5nID0gZW5kcG9pbnQudGFzayA9PT0gRU1CRURESU5HX1RBU0sgfHwgZW5kcG9pbnQuY2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nO1xuICAvLyBFdmVyeSBub24tZW1iZWRkaW5nIGNsYXNzIGlzIGEgY2hhdCBiYW5kLCBzbyBcImNsYXNzaWZpZWQgYnV0IG5vdCBlbWJlZGRpbmdcIlxuICAvLyBpcyB0aGUgY2xhc3Mtc2lkZSB0ZXN0IGZvciBjaGF0IGNhcGFiaWxpdHkuXG4gIGNvbnN0IGNoYXQgPSAhZW1iZWRkaW5nICYmIChlbmRwb2ludC50YXNrID09PSBDSEFUX1RBU0sgfHwgZW5kcG9pbnQuY2xhc3MgIT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHRvb2xzID0gY2hhdCAmJiAoZW5kcG9pbnQuc3VwcG9ydHNUb29scyA/PyBzdXBwb3J0c1Rvb2xzQnlGYW1pbHkoZW5kcG9pbnQubmFtZSkpO1xuICByZXR1cm4geyBjaGF0LCBlbWJlZGRpbmcsIHRvb2xzIH07XG59XG5cbi8qKiBGYW1pbHktaGV1cmlzdGljIGNsYXNzaWZpY2F0aW9uIG9mIGEgc2luZ2xlIGVuZHBvaW50IG5hbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhbWlseUNsYXNzIHtcbiAgLyoqIENoYXQgY2FwYWJpbGl0eSBiYW5kIHRoZSBmYW1pbHkgbWFwcyB0byAobmV2ZXIgZW1iZWRkaW5nKS4gKi9cbiAgY2xhc3M6IE1vZGVsQ2xhc3M7XG4gIC8qKiBJbnRyYS1mYW1pbHkgb3JkZXJpbmcgaGludCAoaGlnaGVyIGlzIG5ld2VyIC8gbW9yZSBjYXBhYmxlKS4gKi9cbiAgcmFuazogbnVtYmVyO1xufVxuXG4vKipcbiAqIE51bWVyaWMgYFttYWpvciwgbWlub3IsIHBhdGNoXWAgdmVyc2lvbiBwYXJzZWQgZnJvbSBhbiBlbmRwb2ludFxuICogbmFtZSwgdXNlZCB0byBvcmRlciBzaWJsaW5ncyB3aXRoaW4gYSBmYW1pbHkvdGllci4gU3RhcnRzIGF0IHRoZVxuICogZmlyc3QgZGlnaXQgaW4gdGhlIG5hbWUsIHRoZW4gcmVhZHMgc3VjY2Vzc2l2ZSBzZXBhcmF0b3ItZGVsaW1pdGVkLFxuICogZGlnaXQtcHJlZml4ZWQgY2h1bmtzIGFzIHRoZSB0aHJlZSBjb21wb25lbnRzIChtaXNzaW5nIG9uZXMgZGVmYXVsdFxuICogdG8gYDBgKTpcbiAqXG4gKiAgIC0gYGRhdGFicmlja3MtY2xhdWRlLW9wdXMtNC04YCAgIC0+IGBbNCwgOCwgMF1gXG4gKiAgIC0gYGRhdGFicmlja3MtY2xhdWRlLW9wdXMtNC0xMGAgIC0+IGBbNCwgMTAsIDBdYCAoc29ydHMgYWJvdmUgNC04KVxuICogICAtIGBkYXRhYnJpY2tzLW1ldGEtbGxhbWEtMy0zLTcwYmAtPiBgWzMsIDMsIDcwXWBcbiAqICAgLSBgZGF0YWJyaWNrcy1iZ2UtbGFyZ2UtZW5gICAgICAgLT4gYFswLCAwLCAwXWAgKG5vIGRpZ2l0cylcbiAqXG4gKiBDb21wb25lbnQtd2lzZSBjb21wYXJpc29uIChub3QgYSBkZWNpbWFsIGNvbGxhcHNlKSBzbyBgNC4xMGAgYmVhdHNcbiAqIGA0LjhgIC0gdGhlIGJ1ZyBhIGBtYWpvciArIG1pbm9yLzEwYCBzY29yZSB3b3VsZCBoaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJzaW9uVHVwbGUobmFtZTogc3RyaW5nKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3Qgc3RhcnQgPSBuYW1lLnNlYXJjaCgvXFxkLyk7XG4gIGlmIChzdGFydCA8IDApIHJldHVybiBbMCwgMCwgMF07XG4gIGNvbnN0IG51bXMgPSBuYW1lXG4gICAgLnNsaWNlKHN0YXJ0KVxuICAgIC5zcGxpdCgvW15hLXowLTldKy9pKVxuICAgIC5tYXAoKGNodW5rKSA9PiBjaHVuay5tYXRjaCgvXlxcZCsvKT8uWzBdKVxuICAgIC5maWx0ZXIoKGRpZ2l0cyk6IGRpZ2l0cyBpcyBzdHJpbmcgPT4gZGlnaXRzICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcChOdW1iZXIpO1xuICByZXR1cm4gW251bXNbMF0gPz8gMCwgbnVtc1sxXSA/PyAwLCBudW1zWzJdID8/IDBdO1xufVxuXG4vKiogQ29tcGFyZSB0d28gdmVyc2lvbiB0dXBsZXMgc28gdGhlIGhpZ2hlciB2ZXJzaW9uIHNvcnRzIGZpcnN0IChkZXNjZW5kaW5nKS4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uRGVzYyhhOiByZWFkb25seSBudW1iZXJbXSwgYjogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXIge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIGNvbnN0IGRpZmYgPSAoYltpXSA/PyAwKSAtIChhW2ldID8/IDApO1xuICAgIGlmIChkaWZmICE9PSAwKSByZXR1cm4gZGlmZjtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLyoqXG4gKiBNb25vdG9uaWMgdmVyc2lvbiBrZXkgZm9yIG9yZGVyaW5nIHNpYmxpbmdzIHdpdGhpbiBhIGZhbWlseS90aWVyXG4gKiAoZS5nLiBgb3B1cy00LThgIG92ZXIgYG9wdXMtNC03YCkuIEVuY29kZXMgdGhlIHtAbGluayB2ZXJzaW9uVHVwbGV9XG4gKiBhcyBhIHNpbmdsZSBudW1iZXIgc28gY2FsbGVycyB0aGF0IG5lZWQgYSBzY2FsYXIgcmFuayAodGhlIGZhbWlseVxuICogaGV1cmlzdGljLCB0aGUgc3RhdGljIGZhbGxiYWNrIG9yZGVyaW5nKSBrZWVwIHdvcmtpbmc7IHRoZSBlbmNvZGluZ1xuICogcHJlc2VydmVzIGNvbXBvbmVudCBvcmRlciB3aXRob3V0IHRoZSBkZWNpbWFsLWNvbGxhcHNlIGJ1Zy5cbiAqL1xuZnVuY3Rpb24gdmVyc2lvblNjb3JlKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvciwgbWlub3IsIHBhdGNoXSA9IHZlcnNpb25UdXBsZShuYW1lKTtcbiAgcmV0dXJuIG1ham9yICogMV8wMDBfMDAwICsgbWlub3IgKiAxXzAwMCArIHBhdGNoO1xufVxuXG4vKipcbiAqIEJlc3QtZWZmb3J0IGNoYXQgY2FwYWJpbGl0eSBiYW5kIGZvciBhbiBlbmRwb2ludCB3ZSBoYXZlIG5vIGxpdmVcbiAqIHNjb3JlIGZvciwga2V5ZWQgb2ZmIHByb3ZpZGVyIGZhbWlseSBhbmQgdGhlIHdlbGwta25vd24gdmFyaWFudCB3b3Jkc1xuICogaW4gdGhlIG5hbWUgKGBvcHVzYC9gc29ubmV0YC9gaGFpa3VgLCBgcHJvYC9gbWluaWAvYG5hbm9gLFxuICogYGZsYXNoYC9gZmxhc2gtbGl0ZWAsIExsYW1hIHBhcmFtZXRlciBzaXplcywgZXRjKS4gUmV0dXJucyBgbnVsbGAgZm9yXG4gKiBuYW1lcyB3ZSBkb24ndCByZWNvZ25pemUgc28gdW5rbm93biBjdXN0b20gZW5kcG9pbnRzIGFyZSBuZXZlclxuICogYXV0by1zZWxlY3RlZCBhcyBhIGRlZmF1bHQuIFRoZSBhY2NvbXBhbnlpbmcgYHJhbmtgIG9yZGVycyBzaWJsaW5nc1xuICogd2l0aGluIGEgY2xhc3MuIE9ubHkgZXZlciByZXR1cm5zIGEgY2hhdCBiYW5kIC0gZW1iZWRkaW5nIGVuZHBvaW50c1xuICogYXJlIGNsYXNzaWZpZWQgYnkgdGFzaywgbm90IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUJ5RmFtaWx5KG5hbWU6IHN0cmluZyk6IEZhbWlseUNsYXNzIHwgbnVsbCB7XG4gIGNvbnN0IG4gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlZEZhbWlseShuKTtcbiAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICBjb25zdCB7IGZhbWlseSwgcGFydHMgfSA9IHBhcnNlZDtcbiAgY29uc3QgaGFzID0gKHBhcnQ6IHN0cmluZyk6IGJvb2xlYW4gPT4gcGFydHMuaGFzKHBhcnQpO1xuICBjb25zdCBhdCA9IChjbHM6IE1vZGVsQ2xhc3MpOiBGYW1pbHlDbGFzcyA9PiAoeyBjbGFzczogY2xzLCByYW5rOiB2ZXJzaW9uU2NvcmUobikgfSk7XG5cbiAgLy8gQW50aHJvcGljIENsYXVkZVxuICBpZiAoZmFtaWx5ID09PSBcImNsYXVkZVwiICYmIGhhcyhcIm9wdXNcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gIGlmIChmYW1pbHkgPT09IFwiY2xhdWRlXCIgJiYgaGFzKFwic29ubmV0XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICBpZiAoZmFtaWx5ID09PSBcImNsYXVkZVwiICYmIGhhcyhcImhhaWt1XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG5cbiAgLy8gT3BlbkFJIG9wZW4td2VpZ2h0cyAoY2hlY2sgYmVmb3JlIHRoZSBnZW5lcmljIGdwdCBicmFuY2gpXG4gIGlmIChmYW1pbHkgPT09IFwiZ3B0XCIgJiYgaGFzKFwib3NzXCIpKSB7XG4gICAgcmV0dXJuIGF0KGhhcyhcIjEyMGJcIikgPyBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCA6IE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICB9XG4gIC8vIE9wZW5BSSBHUFQgZmFtaWx5XG4gIGlmIChmYW1pbHkgPT09IFwiZ3B0XCIpIHtcbiAgICBpZiAoaGFzKFwicHJvXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmcpO1xuICAgIGlmIChoYXMoXCJtaW5pXCIpIHx8IGhhcyhcIm5hbm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRGYXN0KTtcbiAgICByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICB9XG5cbiAgLy8gR29vZ2xlIEdlbWluaSAvIEdlbW1hXG4gIGlmIChmYW1pbHkgPT09IFwiZ2VtaW5pXCIpIHtcbiAgICBpZiAoaGFzKFwiZmxhc2hcIikgJiYgaGFzKFwibGl0ZVwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICAgIGlmIChoYXMoXCJwcm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gICAgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgfVxuICBpZiAoZmFtaWx5ID09PSBcImdlbW1hXCIpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRGYXN0KTtcblxuICAvLyBNZXRhIExsYW1hXG4gIGlmIChmYW1pbHkgPT09IFwibGxhbWFcIikge1xuICAgIGlmIChoYXMoXCJtYXZlcmlja1wiKSB8fCBoYXMoXCI0MDViXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmcpO1xuICAgIGlmIChoYXMoXCI3MGJcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCk7XG4gICAgaWYgKGhhcyhcIjhiXCIpIHx8IGhhcyhcIjFiXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gICAgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgfVxuXG4gIC8vIEFsaWJhYmEgUXdlblxuICBpZiAoZmFtaWx5ID09PSBcInF3ZW5cIikgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIExpbmVhci1pbnRlcnBvbGF0ZWQgcXVhbnRpbGUgb2YgYW4gYXNjZW5kaW5nLXNvcnRlZCBudW1lcmljIGFycmF5LiAqL1xuZnVuY3Rpb24gcXVhbnRpbGUoc29ydGVkQXNjOiByZWFkb25seSBudW1iZXJbXSwgcDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHNvcnRlZEFzYy5sZW5ndGggPT09IDApIHJldHVybiBOdW1iZXIuTmFOO1xuICBjb25zdCBpZHggPSAoc29ydGVkQXNjLmxlbmd0aCAtIDEpICogcDtcbiAgY29uc3QgbG8gPSBNYXRoLmZsb29yKGlkeCk7XG4gIGNvbnN0IGhpID0gTWF0aC5jZWlsKGlkeCk7XG4gIGlmIChsbyA9PT0gaGkpIHJldHVybiBzb3J0ZWRBc2NbbG9dITtcbiAgcmV0dXJuIHNvcnRlZEFzY1tsb10hICsgKHNvcnRlZEFzY1toaV0hIC0gc29ydGVkQXNjW2xvXSEpICogKGlkeCAtIGxvKTtcbn1cblxuLyoqIEludGVybmFsIHNvcnRhYmxlIHdyYXBwZXIgY2FycnlpbmcgdGhlIG9yZGVyaW5nIGtleXMgZm9yIGEgYnVja2V0IGVudHJ5LiAqL1xuaW50ZXJmYWNlIFJhbmtlZCB7XG4gIGVwOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5O1xuICAvKiogUXVhbGl0eSAoc2NvcmVkKSBvciBmYW1pbHkgdmVyc2lvbiAodW5zY29yZWQpIC0gaGlnaGVyIGZpcnN0LiAqL1xuICBzb3J0OiBudW1iZXI7XG4gIC8qKiBTY29yZWQgZW5kcG9pbnRzIHJhbmsgYWhlYWQgb2YgZmFtaWx5LW9ubHkgZ3Vlc3Nlcy4gKi9cbiAgc2NvcmVkOiBib29sZWFuO1xuICB0aWVDb3N0OiBudW1iZXI7XG4gIHRpZVNwZWVkOiBudW1iZXI7XG4gIC8qKiBQYXJzZWQgbmFtZSB2ZXJzaW9uLCB0aGUgZmluYWwgdGllLWJyZWFrZXIgKG5ld2VyIHNpYmxpbmcgZmlyc3QpLiAqL1xuICB2ZXJzaW9uOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuZnVuY3Rpb24gcmFua09yZGVyKGE6IFJhbmtlZCwgYjogUmFua2VkKTogbnVtYmVyIHtcbiAgaWYgKGEuc2NvcmVkICE9PSBiLnNjb3JlZCkgcmV0dXJuIGEuc2NvcmVkID8gLTEgOiAxO1xuICBpZiAoYi5zb3J0ICE9PSBhLnNvcnQpIHJldHVybiBiLnNvcnQgLSBhLnNvcnQ7XG4gIGlmIChhLnRpZUNvc3QgIT09IGIudGllQ29zdCkgcmV0dXJuIGEudGllQ29zdCAtIGIudGllQ29zdDtcbiAgaWYgKGIudGllU3BlZWQgIT09IGEudGllU3BlZWQpIHJldHVybiBiLnRpZVNwZWVkIC0gYS50aWVTcGVlZDtcbiAgLy8gU2FtZSBzY29yZWQtbmVzcywgcXVhbGl0eSwgY29zdCwgYW5kIHNwZWVkIChlLmcuIHNldmVyYWwgQ2xhdWRlXG4gIC8vIE9wdXMgcG9pbnQgcmVsZWFzZXMpOiBwcmVmZXIgdGhlIG5ld2VyIHBhcnNlZCB2ZXJzaW9uIHNvXG4gIC8vIGBvcHVzLTQtOGAgYmVhdHMgYG9wdXMtNC03YC5cbiAgcmV0dXJuIGNvbXBhcmVWZXJzaW9uRGVzYyhhLnZlcnNpb24sIGIudmVyc2lvbik7XG59XG5cbi8qKlxuICogQnVja2V0IGxpdmUgZW5kcG9pbnRzIGludG8ge0BsaW5rIE1vZGVsQ2xhc3N9ZXMsIHJhbmtlZCBiZXN0LWZpcnN0XG4gKiB3aXRoaW4gZWFjaCBjaGF0IGJhbmQuXG4gKlxuICogRW1iZWRkaW5nIGVuZHBvaW50cyAoYHRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcImApIGdvIGludG9cbiAqIHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ30gYnkgdGFzaywgaW4gbGlzdGluZyBvcmRlciAodGhleSBjYXJyeSBub1xuICogY2FwYWJpbGl0eSBzY29yZSB0byByYW5rIG9uKS5cbiAqXG4gKiBDaGF0IGVuZHBvaW50cyAoYHRhc2sgPT09IFwibGxtL3YxL2NoYXRcImApIHNwbGl0IGludG8gdGhlIHRocmVlIGNoYXRcbiAqIGJhbmRzLiBTY29yZWQgZW5kcG9pbnRzICh0aG9zZSBjYXJyeWluZyBhIGBwcm9maWxlLnF1YWxpdHlgKSBkcml2ZVxuICogdGhlIGJhbmRpbmc6IHRoZSBvYnNlcnZlZCBxdWFsaXR5IGRpc3RyaWJ1dGlvbiBpcyBzcGxpdCBhdCBpdHMgMS8zXG4gKiBhbmQgMi8zIHF1YW50aWxlcywgc28gdGhlIHRvcCB0aGlyZCBpcyB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmd9LFxuICogdGhlIGJvdHRvbSB0aGlyZCB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0RmFzdH0sIGFuZCB0aGUgbWlkZGxlXG4gKiB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWR9LiBCZWNhdXNlIHRoZSB0aHJlc2hvbGRzIGNvbWUgZnJvbSB0aGVcbiAqIGRhdGEsIHRoZSBzcGxpdCBhZGFwdHMgYXMgRGF0YWJyaWNrcyBhZGRzIG9yIHJlc2NvcmVzIG1vZGVscyAtXG4gKiBub3RoaW5nIGlzIHBpbm5lZCB0byBhIGZpeGVkIHNjb3JlIGJhbmQuXG4gKlxuICogVW5zY29yZWQgY2hhdCBlbmRwb2ludHMgYXJlIHBsYWNlZCBieSB7QGxpbmsgY2xhc3NpZnlCeUZhbWlseX0gYW5kXG4gKiByYW5rZWQgYWZ0ZXIgdGhlIHNjb3JlZCBvbmVzIGluIHRoZWlyIGJhbmQ7IHVucmVjb2duaXplZCwgdW5zY29yZWRcbiAqIGVuZHBvaW50cyAoZS5nLiBjdXN0b20gZXh0ZXJuYWwgbW9kZWxzKSBhcmUgb21pdHRlZCBlbnRpcmVseSBzbyB0aGV5XG4gKiBhcmUgbmV2ZXIgcGlja2VkIGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0LlxuICpcbiAqIFdpdGhpbiBhIGNoYXQgYmFuZCwgc2NvcmVkIG1vZGVscyBzb3J0IGJ5IGBxdWFsaXR5YCBkZXNjLCB0aGVuIGBjb3N0YFxuICogYXNjLCB0aGVuIGBzcGVlZGAgZGVzYywgdGhlbiBwYXJzZWQgbmFtZSB2ZXJzaW9uIGRlc2M7IGZhbWlseS1vbmx5XG4gKiBtb2RlbHMgc29ydCBieSB2ZXJzaW9uIHJhbmsgdGhlbiBwYXJzZWQgdmVyc2lvbi4gVGhlIHZlcnNpb25cbiAqIHRpZS1icmVhayAoe0BsaW5rIHZlcnNpb25UdXBsZX0pIGlzIHdoYXQgc2VwYXJhdGVzIHBvaW50IHJlbGVhc2VzXG4gKiB0aGF0IHNoYXJlIGEgc2NvcmUgcHJvZmlsZSAoZS5nLiBgb3B1cy00LThgIGFoZWFkIG9mIGBvcHVzLTQtN2ApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlFbmRwb2ludHMoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuKTogUmVjb3JkPE1vZGVsQ2xhc3MsIFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICBjb25zdCBjaGF0ID0gZW5kcG9pbnRzLmZpbHRlcigoZSkgPT4gZS50YXNrID09PSBDSEFUX1RBU0spO1xuICBjb25zdCBxdWFsaXRpZXMgPSBjaGF0XG4gICAgLm1hcCgoZSkgPT4gZS5wcm9maWxlPy5xdWFsaXR5KVxuICAgIC5maWx0ZXIoKHEpOiBxIGlzIG51bWJlciA9PiBOdW1iZXIuaXNGaW5pdGUocSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgY29uc3QgbG93ID0gcXVhbnRpbGUocXVhbGl0aWVzLCAxIC8gMyk7XG4gIGNvbnN0IGhpZ2ggPSBxdWFudGlsZShxdWFsaXRpZXMsIDIgLyAzKTtcblxuICBjb25zdCBidWNrZXRzOiBSZWNvcmQ8TW9kZWxDbGFzcywgUmFua2VkW10+ID0ge1xuICAgIFtNb2RlbENsYXNzLkNoYXRUaGlua2luZ106IFtdLFxuICAgIFtNb2RlbENsYXNzLkNoYXRCYWxhbmNlZF06IFtdLFxuICAgIFtNb2RlbENsYXNzLkNoYXRGYXN0XTogW10sXG4gICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogW10sXG4gIH07XG5cbiAgZm9yIChjb25zdCBlcCBvZiBjaGF0KSB7XG4gICAgY29uc3QgcSA9IGVwLnByb2ZpbGU/LnF1YWxpdHk7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShxKSkge1xuICAgICAgY29uc3QgcXVhbGl0eSA9IHEgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgY2xzID1cbiAgICAgICAgcXVhbGl0eSA+PSBoaWdoXG4gICAgICAgICAgPyBNb2RlbENsYXNzLkNoYXRUaGlua2luZ1xuICAgICAgICAgIDogcXVhbGl0eSA8PSBsb3dcbiAgICAgICAgICAgID8gTW9kZWxDbGFzcy5DaGF0RmFzdFxuICAgICAgICAgICAgOiBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZDtcbiAgICAgIGJ1Y2tldHNbY2xzXS5wdXNoKHtcbiAgICAgICAgZXAsXG4gICAgICAgIHNvcnQ6IHF1YWxpdHksXG4gICAgICAgIHNjb3JlZDogdHJ1ZSxcbiAgICAgICAgdGllQ29zdDogZXAucHJvZmlsZT8uY29zdCA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgICAgIHRpZVNwZWVkOiBlcC5wcm9maWxlPy5zcGVlZCA/PyAwLFxuICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uVHVwbGUoZXAubmFtZSksXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBmYW1pbHkgPSBjbGFzc2lmeUJ5RmFtaWx5KGVwLm5hbWUpO1xuICAgIGlmICghZmFtaWx5KSBjb250aW51ZTtcbiAgICBidWNrZXRzW2ZhbWlseS5jbGFzc10ucHVzaCh7XG4gICAgICBlcCxcbiAgICAgIHNvcnQ6IGZhbWlseS5yYW5rLFxuICAgICAgc2NvcmVkOiBmYWxzZSxcbiAgICAgIHRpZUNvc3Q6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgIHRpZVNwZWVkOiAwLFxuICAgICAgdmVyc2lvbjogdmVyc2lvblR1cGxlKGVwLm5hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gRW1iZWRkaW5ncyBhcmUgYnVja2V0ZWQgYnkgdGFzayBpbiBsaXN0aW5nIG9yZGVyIC0gbm8gc2NvcmUgdG8gcmFuay5cbiAgY29uc3QgZW1iZWRkaW5ncyA9IGVuZHBvaW50cy5maWx0ZXIoKGUpID0+IGUudGFzayA9PT0gRU1CRURESU5HX1RBU0spO1xuXG4gIHJldHVybiB7XG4gICAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTogYnVja2V0c1tNb2RlbENsYXNzLkNoYXRUaGlua2luZ10uc29ydChyYW5rT3JkZXIpLm1hcCgoeCkgPT4geC5lcCksXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXTogYnVja2V0c1tNb2RlbENsYXNzLkNoYXRCYWxhbmNlZF0uc29ydChyYW5rT3JkZXIpLm1hcCgoeCkgPT4geC5lcCksXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdEZhc3RdLnNvcnQocmFua09yZGVyKS5tYXAoKHgpID0+IHguZXApLFxuICAgIFtNb2RlbENsYXNzLkVtYmVkZGluZ106IGVtYmVkZGluZ3MsXG4gIH07XG59XG4iXX0=
|
package/lib/src/model.d.ts
CHANGED
|
@@ -43,6 +43,22 @@ export declare const ModelProfileSchema: z.ZodObject<{
|
|
|
43
43
|
cost: z.ZodOptional<z.ZodNumber>;
|
|
44
44
|
}, z.core.$strip>;
|
|
45
45
|
export type ModelProfile = z.infer<typeof ModelProfileSchema>;
|
|
46
|
+
/** Reasoning effort accepted by a Databricks model endpoint. */
|
|
47
|
+
export declare enum ReasoningEffort {
|
|
48
|
+
None = "none",
|
|
49
|
+
Minimal = "minimal",
|
|
50
|
+
Low = "low",
|
|
51
|
+
Medium = "medium",
|
|
52
|
+
High = "high",
|
|
53
|
+
Xhigh = "xhigh",
|
|
54
|
+
Max = "max"
|
|
55
|
+
}
|
|
56
|
+
export declare const ReasoningEffortSchema: z.ZodEnum<typeof ReasoningEffort>;
|
|
57
|
+
/** Lifecycle flags associated with one discovered model. */
|
|
58
|
+
export declare const ModelStatusSchema: z.ZodObject<{
|
|
59
|
+
deprecated: z.ZodDefault<z.ZodBoolean>;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
export type ModelStatus = z.infer<typeof ModelStatusSchema>;
|
|
46
62
|
/**
|
|
47
63
|
* Minimal descriptor for a Databricks Model Serving endpoint - a
|
|
48
64
|
* stable subset of the SDK type so cache hits and `/models` responses
|
|
@@ -61,6 +77,12 @@ export declare const ServingEndpointSummarySchema: z.ZodObject<{
|
|
|
61
77
|
cost: z.ZodOptional<z.ZodNumber>;
|
|
62
78
|
}, z.core.$strip>>;
|
|
63
79
|
class: z.ZodOptional<z.ZodEnum<typeof ModelClass>>;
|
|
80
|
+
serviceNames: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
81
|
+
modelServiceName: z.ZodOptional<z.ZodString>;
|
|
82
|
+
reasoningEfforts: z.ZodOptional<z.ZodArray<z.ZodEnum<typeof ReasoningEffort>>>;
|
|
83
|
+
status: z.ZodOptional<z.ZodObject<{
|
|
84
|
+
deprecated: z.ZodDefault<z.ZodBoolean>;
|
|
85
|
+
}, z.core.$strip>>;
|
|
64
86
|
dimension: z.ZodOptional<z.ZodNumber>;
|
|
65
87
|
}, z.core.$strip>;
|
|
66
88
|
export type ServingEndpointSummary = z.infer<typeof ServingEndpointSummarySchema>;
|
|
@@ -102,6 +124,12 @@ export declare const RankedModelSchema: z.ZodObject<{
|
|
|
102
124
|
cost: z.ZodOptional<z.ZodNumber>;
|
|
103
125
|
}, z.core.$strip>>;
|
|
104
126
|
class: z.ZodOptional<z.ZodEnum<typeof ModelClass>>;
|
|
127
|
+
serviceNames: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
128
|
+
modelServiceName: z.ZodOptional<z.ZodString>;
|
|
129
|
+
reasoningEfforts: z.ZodOptional<z.ZodArray<z.ZodEnum<typeof ReasoningEffort>>>;
|
|
130
|
+
status: z.ZodOptional<z.ZodObject<{
|
|
131
|
+
deprecated: z.ZodDefault<z.ZodBoolean>;
|
|
132
|
+
}, z.core.$strip>>;
|
|
105
133
|
dimension: z.ZodOptional<z.ZodNumber>;
|
|
106
134
|
}, z.core.$strip>;
|
|
107
135
|
modelClass: z.ZodEnum<typeof ModelClass>;
|
package/lib/src/model.js
CHANGED
|
@@ -53,6 +53,22 @@ export const ModelProfileSchema = z.object({
|
|
|
53
53
|
speed: z.number().optional().describe("Relative throughput score; higher is faster."),
|
|
54
54
|
cost: z.number().optional().describe("Relative price score; lower is cheaper."),
|
|
55
55
|
});
|
|
56
|
+
/** Reasoning effort accepted by a Databricks model endpoint. */
|
|
57
|
+
export var ReasoningEffort;
|
|
58
|
+
(function (ReasoningEffort) {
|
|
59
|
+
ReasoningEffort["None"] = "none";
|
|
60
|
+
ReasoningEffort["Minimal"] = "minimal";
|
|
61
|
+
ReasoningEffort["Low"] = "low";
|
|
62
|
+
ReasoningEffort["Medium"] = "medium";
|
|
63
|
+
ReasoningEffort["High"] = "high";
|
|
64
|
+
ReasoningEffort["Xhigh"] = "xhigh";
|
|
65
|
+
ReasoningEffort["Max"] = "max";
|
|
66
|
+
})(ReasoningEffort || (ReasoningEffort = {}));
|
|
67
|
+
export const ReasoningEffortSchema = z.enum(ReasoningEffort);
|
|
68
|
+
/** Lifecycle flags associated with one discovered model. */
|
|
69
|
+
export const ModelStatusSchema = z.object({
|
|
70
|
+
deprecated: z.boolean().default(false),
|
|
71
|
+
});
|
|
56
72
|
/**
|
|
57
73
|
* Minimal descriptor for a Databricks Model Serving endpoint - a
|
|
58
74
|
* stable subset of the SDK type so cache hits and `/models` responses
|
|
@@ -75,6 +91,19 @@ export const ServingEndpointSummarySchema = z.object({
|
|
|
75
91
|
.describe("Whether this endpoint supports a complete function-tool round-trip (call plus function_call_output replay). Derived from verified provider-family policy when Databricks exposes no capability attribute."),
|
|
76
92
|
profile: ModelProfileSchema.optional().describe("Foundation Model API quality/speed/cost scores when the endpoint is a scored pay-per-token model; absent otherwise."),
|
|
77
93
|
class: ModelClassSchema.optional().describe("Class the endpoint was classified into; absent when the classifier doesn't recognize it."),
|
|
94
|
+
serviceNames: z
|
|
95
|
+
.record(z.string(), z.string())
|
|
96
|
+
.optional()
|
|
97
|
+
.describe("Provider-specific model service names derived from Databricks metadata."),
|
|
98
|
+
modelServiceName: z
|
|
99
|
+
.string()
|
|
100
|
+
.optional()
|
|
101
|
+
.describe("Preferred first-party model service name for Databricks AI Gateway calls."),
|
|
102
|
+
reasoningEfforts: z
|
|
103
|
+
.array(ReasoningEffortSchema)
|
|
104
|
+
.optional()
|
|
105
|
+
.describe("Reasoning effort levels accepted by the endpoint."),
|
|
106
|
+
status: ModelStatusSchema.optional().describe("Lifecycle status derived from model metadata."),
|
|
78
107
|
dimension: z
|
|
79
108
|
.number()
|
|
80
109
|
.optional()
|
|
@@ -128,4 +157,4 @@ export const RankedModelSchema = z.object({
|
|
|
128
157
|
.optional()
|
|
129
158
|
.describe("Fuzzy-match distance (0 = exact .. 1 = worst) when the query carried a search; absent for class-only ranking."),
|
|
130
159
|
});
|
|
131
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFOLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQiw0Q0FBOEIsQ0FBQTtJQUM5Qiw0Q0FBOEIsQ0FBQTtJQUM5QixvQ0FBc0IsQ0FBQTtJQUN0QixxQ0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFFRCxNQUFNLHNCQUFzQixHQUErQjtJQUN6RCxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFDdkIsZ0ZBQWdGO0lBQ2xGLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUN2QiwrRUFBK0U7SUFDakYsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQ25CLGdHQUFnRztJQUNsRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFDcEIsNkZBQTZGO0NBQ2hHLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FDekQsd0JBQXlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFrQjtLQUNoRSxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUNsQixPQUFPLElBQUksVUFBVSxNQUFNLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0tBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2pCLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3pDLE9BQU8sRUFBRSxDQUFDLENB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LCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdpcmUtZm9ybWF0IHR5cGVzIGZvciB0aGUgbW9kZWwgdG9vbGtpdDogdGhlIG1vZGVsIGNsYXNzIHRheG9ub215LFxuICogdGhlIEZvdW5kYXRpb24gTW9kZWwgQVBJIHNjb3JlIHByb2ZpbGUsIHRoZSBtaW5pbWFsIHNlcnZpbmctZW5kcG9pbnRcbiAqIGRlc2NyaXB0b3IsIGFuZCB0aGUgbW9kZWwtbG9va3VwIHJlcXVlc3QgLyByYW5rZWQtcmVzdWx0IGNvbnRyYWN0LlxuICogUHVyZSB0eXBlcyBhbmQgem9kIHNjaGVtYXMgLSBubyBOb2RlLW9ubHkgaW1wb3J0cyAtIHNvIGEgYnJvd3NlclxuICogY2xpZW50IChvciBhbiBhZ2VudCB0b29sJ3MgYGlucHV0U2NoZW1hYCkgY2FuIHZhbGlkYXRlIGEgbG9va3VwXG4gKiByZXF1ZXN0IGFuZCB0eXBlIGEgcmFua2VkIHJlc3BvbnNlIHdpdGhvdXQgZHJhZ2dpbmcgaW4gc2VydmVyXG4gKiBkZXBlbmRlbmNpZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8qKlxuICogQ2xhc3Mgb2YgYSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgLSBpdHMgbW9kYWxpdHkgcGx1cyxcbiAqIGZvciBjaGF0IG1vZGVscywgYSBjYXBhYmlsaXR5IGJhbmQuIENoYXQgZW5kcG9pbnRzIHNwbGl0IGJ5IG1lYXN1cmVkXG4gKiBgcXVhbGl0eWAgaW50byBhIHRocmVlLXJ1bmcgbGFkZGVyOyBlbWJlZGRpbmdzIGFyZSBhIHNlcGFyYXRlXG4gKiBtb2RhbGl0eSwgbm90IGEgcnVuZyBvbiB0aGF0IGxhZGRlci5cbiAqXG4gKiBTdHJpbmcgZW51bSBzbyB0aGUgdmFsdWUgaXMgdGhlIHNsdWcgdXNlZCBpbiBjYWNoZSBrZXlzLCBsb2dzLCBxdWVyeVxuICogc3RyaW5ncywgYW5kIHNlcmlhbGl6ZWQgY29uZmlncyAtIGFuZCBpcyB3aGF0IGEgY2xpZW50IHNlbmRzIHRvXG4gKiByZXF1ZXN0IGEgY2xhc3MuXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGVsQ2xhc3Mge1xuICBDaGF0VGhpbmtpbmcgPSBcImNoYXQtdGhpbmtpbmdcIixcbiAgQ2hhdEJhbGFuY2VkID0gXCJjaGF0LWJhbGFuY2VkXCIsXG4gIENoYXRGYXN0ID0gXCJjaGF0LWZhc3RcIixcbiAgRW1iZWRkaW5nID0gXCJlbWJlZGRpbmdcIixcbn1cblxuY29uc3QgTW9kZWxDbGFzc0Rlc2NyaXB0aW9uczogUmVjb3JkPE1vZGVsQ2xhc3MsIHN0cmluZz4gPSB7XG4gIFtNb2RlbENsYXNzLkNoYXRUaGlua2luZ106XG4gICAgXCJNb3N0IGNhcGFibGUgcmVhc29uaW5nIGZvciBoYXJkLCBtdWx0aS1zdGVwIHRhc2tzOyBzbG93ZXN0IGFuZCBtb3N0IGV4cGVuc2l2ZS5cIixcbiAgW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXTpcbiAgICBcIkdvb2QgZGVmYXVsdCBmb3IgbW9zdCBjaGF0IGFuZCBhZ2VudCB3b3JrOyBiYWxhbmNlcyBxdWFsaXR5LCBzcGVlZCwgYW5kIGNvc3QuXCIsXG4gIFtNb2RlbENsYXNzLkNoYXRGYXN0XTpcbiAgICBcIkZhc3Rlc3QgYW5kIGNoZWFwZXN0OyBiZXN0IGZvciBzaW1wbGUgdGFza3MgbGlrZSBjbGFzc2lmaWNhdGlvbiwgcm91dGluZywgYW5kIHNob3J0IHN1bW1hcmllcy5cIixcbiAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTpcbiAgICBcIlByb2R1Y2VzIHRleHQgZW1iZWRkaW5ncyAodmVjdG9ycyksIG5vdCBjaGF0IHJlcGxpZXM7IG5vdCBpbnRlcmNoYW5nZWFibGUgd2l0aCBjaGF0IG1vZGVscy5cIixcbn07XG5cbmV4cG9ydCBjb25zdCBNb2RlbENsYXNzU2NoZW1hID0gei5lbnVtKE1vZGVsQ2xhc3MpLmRlc2NyaWJlKFxuICBgRW5kcG9pbnQgY2xhc3Mgc2x1ZzogJHsoT2JqZWN0LnZhbHVlcyhNb2RlbENsYXNzKSBhcyBNb2RlbENsYXNzW10pXG4gICAgLm1hcCgobW9kZWxDbGFzcykgPT4ge1xuICAgICAgcmV0dXJuIGAnJHttb2RlbENsYXNzfScgKCR7TW9kZWxDbGFzc0Rlc2NyaXB0aW9uc1ttb2RlbENsYXNzXX0pYDtcbiAgICB9KVxuICAgIC5qb2luKFwiLCBcIil9LmAsXG4pO1xuXG4vKipcbiAqIEZvdW5kYXRpb24gTW9kZWwgQVBJIHF1YWxpdHkgLyBzcGVlZCAvIGNvc3Qgc2NvcmVzIERhdGFicmlja3NcbiAqIHB1Ymxpc2hlcyBwZXIgcGF5LXBlci10b2tlbiBlbmRwb2ludCAodGhlIGJhcnMgc2hvd24gaW4gdGhlIEFJXG4gKiBQbGF5Z3JvdW5kKS4gU3VyZmFjZWQgZnJvbSB0aGUgc2VydmluZyBsaXN0IHVuZGVyXG4gKiBgY29uZmlnLnNlcnZlZF9lbnRpdGllc1tdLmZvdW5kYXRpb25fbW9kZWwuYWlfZ2F0ZXdheV9tb2RlbF9wcm9maWxlYFxuICogc28gdGhlIGNsYXNzIGNsYXNzaWZpZXIgY2FuIHJhbmsgbW9kZWxzIGZyb20gbGl2ZSwgd29ya3NwYWNlLWxvY2FsXG4gKiBudW1iZXJzIGluc3RlYWQgb2YgYSBoYW5kLW1haW50YWluZWQgdGFibGUuIFNjYWxlcyBhcmUgcmVsYXRpdmUgYW5kXG4gKiB1bml0bGVzczsgYWxsIGF4ZXMgYXJlIGFic2VudCBmb3IgY3VzdG9tIG9yIGJyYW5kLW5ldyBlbmRwb2ludHMgdGhhdFxuICogaGF2ZSBubyBwcm9maWxlIHlldC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vZGVsUHJvZmlsZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgcXVhbGl0eTogei5udW1iZXIoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiUmVsYXRpdmUgcXVhbGl0eSBzY29yZTsgaGlnaGVyIGlzIGJldHRlci5cIiksXG4gIHNwZWVkOiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJSZWxhdGl2ZSB0aHJvdWdocHV0IHNjb3JlOyBoaWdoZXIgaXMgZmFzdGVyLlwiKSxcbiAgY29zdDogei5udW1iZXIoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiUmVsYXRpdmUgcHJpY2Ugc2NvcmU7IGxvd2VyIGlzIGNoZWFwZXIuXCIpLFxufSk7XG5leHBvcnQgdHlwZSBNb2RlbFByb2ZpbGUgPSB6LmluZmVyPHR5cGVvZiBNb2RlbFByb2ZpbGVTY2hlbWE+O1xuXG4vKipcbiAqIE1pbmltYWwgZGVzY3JpcHRvciBmb3IgYSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgLSBhXG4gKiBzdGFibGUgc3Vic2V0IG9mIHRoZSBTREsgdHlwZSBzbyBjYWNoZSBoaXRzIGFuZCBgL21vZGVsc2AgcmVzcG9uc2VzXG4gKiBuZXZlciBleHBvc2UgU0RLIGludGVybmFscy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHpcbiAgICAuc3RyaW5nKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIkVuZHBvaW50IG5hbWUgYXMgbGlzdGVkIGJ5IHRoZSBNb2RlbCBTZXJ2aW5nIFJFU1QgQVBJOyB0aGUgaWQgdXNlZCB0byBpbnZva2UgdGhlIG1vZGVsLlwiLFxuICAgICksXG4gIGRpc3BsYXlOYW1lOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIkh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgZW5kcG9pbnQ6IGEgRGF0YWJyaWNrcy1wcm92aWRlZCBuYW1lIHdoZW4gcHJlc2VudCAoYSBkaXNwbGF5LW5hbWUgdGFnIG9yIGV4dGVybmFsLW1vZGVsIG5hbWUpLCBlbHNlIGEgdGl0bGUtY2FzZWQgcmVuZGVyaW5nIG9mIGBuYW1lYCB3aXRoIHZlbmRvciBwcmVmaXhlcyBzdHJpcHBlZC4gYG5hbWVgIHJlbWFpbnMgdGhlIGludm9rZSBpZC5cIixcbiAgICApLFxuICB0YXNrOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJUYXNrIGhpbnQsIGUuZy4gJ2xsbS92MS9jaGF0JyBvciAnbGxtL3YxL2VtYmVkZGluZ3MnLlwiKSxcbiAgc3RhdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkRlcGxveW1lbnQgc3RhdGUsIGUuZy4gcmVhZHksIHVwZGF0aW5nLCBvciBmYWlsZWQuXCIpLFxuICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRnJlZS1mb3JtIGVuZHBvaW50IGRlc2NyaXB0aW9uOyBpbmZvcm1hdGlvbmFsLlwiKSxcbiAgc3VwcG9ydHNUb29sczogelxuICAgIC5ib29sZWFuKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiV2hldGhlciB0aGlzIGVuZHBvaW50IHN1cHBvcnRzIGEgY29tcGxldGUgZnVuY3Rpb24tdG9vbCByb3VuZC10cmlwIChjYWxsIHBsdXMgZnVuY3Rpb25fY2FsbF9vdXRwdXQgcmVwbGF5KS4gRGVyaXZlZCBmcm9tIHZlcmlmaWVkIHByb3ZpZGVyLWZhbWlseSBwb2xpY3kgd2hlbiBEYXRhYnJpY2tzIGV4cG9zZXMgbm8gY2FwYWJpbGl0eSBhdHRyaWJ1dGUuXCIsXG4gICAgKSxcbiAgcHJvZmlsZTogTW9kZWxQcm9maWxlU2NoZW1hLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgXCJGb3VuZGF0aW9uIE1vZGVsIEFQSSBxdWFsaXR5L3NwZWVkL2Nvc3Qgc2NvcmVzIHdoZW4gdGhlIGVuZHBvaW50IGlzIGEgc2NvcmVkIHBheS1wZXItdG9rZW4gbW9kZWw7IGFic2VudCBvdGhlcndpc2UuXCIsXG4gICksXG4gIGNsYXNzOiBNb2RlbENsYXNzU2NoZW1hLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgXCJDbGFzcyB0aGUgZW5kcG9pbnQgd2FzIGNsYXNzaWZpZWQgaW50bzsgYWJzZW50IHdoZW4gdGhlIGNsYXNzaWZpZXIgZG9lc24ndCByZWNvZ25pemUgaXQuXCIsXG4gICksXG4gIGRpbWVuc2lvbjogelxuICAgIC5udW1iZXIoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJFbWJlZGRpbmcgdmVjdG9yIGxlbmd0aCwgbWVhc3VyZWQgYnkgYSBiZXN0LWVmZm9ydCBzZXJ2ZXItc2lkZSBwaW5nLiBPbmx5IHNldCBmb3IgZW1iZWRkaW5nIGVuZHBvaW50cywgYW5kIG9ubHkgd2hlbiB0aGUgcHJvYmUgc3VjY2VlZGVkLlwiLFxuICAgICksXG59KTtcbmV4cG9ydCB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPSB6LmluZmVyPHR5cGVvZiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5U2NoZW1hPjtcblxuLyoqXG4gKiBBIG1vZGVsLWxvb2t1cCByZXF1ZXN0OiBzZWFyY2ggc3RyaW5nLCBjYXBhYmlsaXR5IGNlaWxpbmcsIGJvdGgsIG9yXG4gKiBub3RoaW5nLiBUaGlzIGlzIHRoZSBjYWxsZXItZmFjaW5nIHF1ZXJ5IHRoZSBgQGRieC10b29scy9tb2RlbGBcbiAqIHJhbmtlciByZWFkcyAtIHNoYXBlZCBhcyBhIHpvZCBzY2hlbWEgKHdpdGggcGVyLWZpZWxkIGRlc2NyaXB0aW9ucylcbiAqIHNvIGFuIGFnZW50IHRvb2wgY2FuIGFkb3B0IGl0IGRpcmVjdGx5IGFzIGl0cyBgaW5wdXRTY2hlbWFgIGFuZCBhXG4gKiBicm93c2VyIGNsaWVudCBjYW4gdmFsaWRhdGUgYXJncyBiZWZvcmUgY2FsbGluZyB0aGUgbW9kZWwgc2VydmljZS5cbiAqXG4gKiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbDogYW4gZW1wdHkgcXVlcnkgcmFua3MgdGhlIGxpdmUgY2F0YWxvZ3VlIGJ5XG4gKiBjbGFzcyBhbG9uZS4gVGhlIFwidGhpcyBjbGFzcyBhbmQgYmVsb3dcIiBjZWlsaW5nIHNlbWFudGljcyBhbmQgdGhlXG4gKiBtYXRjaC10aGVuLWNsYXNzIG9yZGVyaW5nIGxpdmUgaW4gdGhlIHNlcnZpY2UsIG5vdCBoZXJlIC0gdGhpc1xuICogc3VyZmFjZSBpcyBkZWNsYXJhdGl2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vZGVsUXVlcnlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHNlYXJjaDogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJMb29zZSBuYW1lIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCBlbmRwb2ludCBuYW1lcywgZS5nLiAnY2xhdWRlIHNvbm5ldCcuIE9taXQgdG8gcmFuayBieSBjbGFzcyBhbG9uZS5cIixcbiAgICApLFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzU2NoZW1hLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgXCJDYXBhYmlsaXR5IGNlaWxpbmc6IGEgY2hhdCBjbGFzcyByZXN0cmljdHMgdG8gdGhhdCBiYW5kIGFuZCB0aGUgbGVzcy1jYXBhYmxlIGNoYXQgYmFuZHMgYmVsb3cgaXQ7ICdlbWJlZGRpbmcnIHJlc3RyaWN0cyB0byBlbWJlZGRpbmcgZW5kcG9pbnRzLiBPbWl0IHRvIGNvbnNpZGVyIGV2ZXJ5IGNoYXQgYmFuZC5cIixcbiAgKSxcbiAgcmVxdWlyZXNUb29sczogelxuICAgIC5ib29sZWFuKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiV2hlbiB0cnVlLCBjb25zaWRlciBvbmx5IGVuZHBvaW50cyB0aGF0IHN1cHBvcnQgYSBjb21wbGV0ZSBmdW5jdGlvbi10b29sIHJvdW5kLXRyaXAuXCIsXG4gICAgKSxcbiAgbGltaXQ6IHpcbiAgICAubnVtYmVyKClcbiAgICAuaW50KClcbiAgICAucG9zaXRpdmUoKVxuICAgIC5tYXgoNTApXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJNYXhpbXVtIG51bWJlciBvZiByYW5rZWQgcmVzdWx0cyB0byByZXR1cm4uXCIpLFxuICB0aHJlc2hvbGQ6IHpcbiAgICAubnVtYmVyKClcbiAgICAubWluKDApXG4gICAgLm1heCgxKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiRnV6enktbWF0Y2ggZGlzdGFuY2UgY3V0b2ZmICgwID0gZXhhY3QsIDEgPSBtYXRjaCBhbnl0aGluZykuIERlZmF1bHQgMC40LlwiKSxcbn0pO1xuZXhwb3J0IHR5cGUgTW9kZWxRdWVyeSA9IHouaW5mZXI8dHlwZW9mIE1vZGVsUXVlcnlTY2hlbWE+O1xuXG4vKipcbiAqIE9uZSByYW5rZWQgbG9va3VwIHJlc3VsdC4gQmFja3MgYW4gYWdlbnQgdG9vbCdzIGBvdXRwdXRTY2hlbWFgIGFuZCBhXG4gKiBgL21vZGVsc2AgcmFua2VkIHJlc3BvbnNlLlxuICovXG5leHBvcnQgY29uc3QgUmFua2VkTW9kZWxTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5U2NoZW1hLmRlc2NyaWJlKFwiVGhlIG1hdGNoZWQgc2VydmluZyBlbmRwb2ludC5cIiksXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3NTY2hlbWEuZGVzY3JpYmUoXCJDbGFzcyB0aGUgZW5kcG9pbnQgd2FzIGNsYXNzaWZpZWQgaW50by5cIiksXG4gIHNjb3JlOiB6XG4gICAgLm51bWJlcigpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIkZ1enp5LW1hdGNoIGRpc3RhbmNlICgwID0gZXhhY3QgLi4gMSA9IHdvcnN0KSB3aGVuIHRoZSBxdWVyeSBjYXJyaWVkIGEgc2VhcmNoOyBhYnNlbnQgZm9yIGNsYXNzLW9ubHkgcmFua2luZy5cIixcbiAgICApLFxufSk7XG5leHBvcnQgdHlwZSBSYW5rZWRNb2RlbCA9IHouaW5mZXI8dHlwZW9mIFJhbmtlZE1vZGVsU2NoZW1hPjtcbiJdfQ==
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFOLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQiw0Q0FBOEIsQ0FBQTtJQUM5Qiw0Q0FBOEIsQ0FBQTtJQUM5QixvQ0FBc0IsQ0FBQTtJQUN0QixxQ0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFFRCxNQUFNLHNCQUFzQixHQUErQjtJQUN6RCxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFDdkIsZ0ZBQWdGO0lBQ2xGLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUN2QiwrRUFBK0U7SUFDakYsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQ25CLGdHQUFnRztJQUNsRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFDcEIsNkZBQTZGO0NBQ2hHLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FDekQsd0JBQXlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFrQjtLQUNoRSxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUNsQixPQUFPLElBQUksVUFBVSxNQUFNLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0tBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2pCLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3pDLE9BQU8sRUFBRSxDQUFDLENB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Z0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLE1BQU0sRUFBRSxDQUFDO1NBQ04sTUFBTSxFQUFFO1NBQ1IsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUNQLHFHQUFxRyxDQUN0RztJQUNILFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQzlDLG1MQUFtTCxDQUNwTDtJQUNELGFBQWEsRUFBRSxDQUFDO1NBQ2IsT0FBTyxFQUFFO1NBQ1QsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUNQLHNGQUFzRixDQUN2RjtJQUNILEtBQUssRUFBRSxDQUFDO1NBQ0wsTUFBTSxFQUFFO1NBQ1IsR0FBRyxFQUFFO1NBQ0wsUUFBUSxFQUFFO1NBQ1YsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNQLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyw2Q0FBNkMsQ0FBQztJQUMxRCxTQUFTLEVBQUUsQ0FBQztTQUNULE1BQU0sRUFBRTtTQUNSLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDTixHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ04sUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLDJFQUEyRSxDQUFDO0NBQ3pGLENBQUMsQ0FBQztBQUdIOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDeEMsUUFBUSxFQUFFLDRCQUE0QixDQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQztJQUNoRixVQUFVLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLHlDQUF5QyxDQUFDO0lBQ2hGLEtBQUssRUFBRSxDQUFDO1NBQ0wsTUFBTSxFQUFFO1NBQ1IsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUNQLCtHQUErRyxDQUNoSDtDQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2lyZS1mb3JtYXQgdHlwZXMgZm9yIHRoZSBtb2RlbCB0b29sa2l0OiB0aGUgbW9kZWwgY2xhc3MgdGF4b25vbXksXG4gKiB0aGUgRm91bmRhdGlvbiBNb2RlbCBBUEkgc2NvcmUgcHJvZmlsZSwgdGhlIG1pbmltYWwgc2VydmluZy1lbmRwb2ludFxuICogZGVzY3JpcHRvciwgYW5kIHRoZSBtb2RlbC1sb29rdXAgcmVxdWVzdCAvIHJhbmtlZC1yZXN1bHQgY29udHJhY3QuXG4gKiBQdXJlIHR5cGVzIGFuZCB6b2Qgc2NoZW1hcyAtIG5vIE5vZGUtb25seSBpbXBvcnRzIC0gc28gYSBicm93c2VyXG4gKiBjbGllbnQgKG9yIGFuIGFnZW50IHRvb2wncyBgaW5wdXRTY2hlbWFgKSBjYW4gdmFsaWRhdGUgYSBsb29rdXBcbiAqIHJlcXVlc3QgYW5kIHR5cGUgYSByYW5rZWQgcmVzcG9uc2Ugd2l0aG91dCBkcmFnZ2luZyBpbiBzZXJ2ZXJcbiAqIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLyoqXG4gKiBDbGFzcyBvZiBhIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBlbmRwb2ludCAtIGl0cyBtb2RhbGl0eSBwbHVzLFxuICogZm9yIGNoYXQgbW9kZWxzLCBhIGNhcGFiaWxpdHkgYmFuZC4gQ2hhdCBlbmRwb2ludHMgc3BsaXQgYnkgbWVhc3VyZWRcbiAqIGBxdWFsaXR5YCBpbnRvIGEgdGhyZWUtcnVuZyBsYWRkZXI7IGVtYmVkZGluZ3MgYXJlIGEgc2VwYXJhdGVcbiAqIG1vZGFsaXR5LCBub3QgYSBydW5nIG9uIHRoYXQgbGFkZGVyLlxuICpcbiAqIFN0cmluZyBlbnVtIHNvIHRoZSB2YWx1ZSBpcyB0aGUgc2x1ZyB1c2VkIGluIGNhY2hlIGtleXMsIGxvZ3MsIHF1ZXJ5XG4gKiBzdHJpbmdzLCBhbmQgc2VyaWFsaXplZCBjb25maWdzIC0gYW5kIGlzIHdoYXQgYSBjbGllbnQgc2VuZHMgdG9cbiAqIHJlcXVlc3QgYSBjbGFzcy5cbiAqL1xuZXhwb3J0IGVudW0gTW9kZWxDbGFzcyB7XG4gIENoYXRUaGlua2luZyA9IFwiY2hhdC10aGlua2luZ1wiLFxuICBDaGF0QmFsYW5jZWQgPSBcImNoYXQtYmFsYW5jZWRcIixcbiAgQ2hhdEZhc3QgPSBcImNoYXQtZmFzdFwiLFxuICBFbWJlZGRpbmcgPSBcImVtYmVkZGluZ1wiLFxufVxuXG5jb25zdCBNb2RlbENsYXNzRGVzY3JpcHRpb25zOiBSZWNvcmQ8TW9kZWxDbGFzcywgc3RyaW5nPiA9IHtcbiAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTpcbiAgICBcIk1vc3QgY2FwYWJsZSByZWFzb25pbmcgZm9yIGhhcmQsIG11bHRpLXN0ZXAgdGFza3M7IHNsb3dlc3QgYW5kIG1vc3QgZXhwZW5zaXZlLlwiLFxuICBbTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWRdOlxuICAgIFwiR29vZCBkZWZhdWx0IGZvciBtb3N0IGNoYXQgYW5kIGFnZW50IHdvcms7IGJhbGFuY2VzIHF1YWxpdHksIHNwZWVkLCBhbmQgY29zdC5cIixcbiAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOlxuICAgIFwiRmFzdGVzdCBhbmQgY2hlYXBlc3Q7IGJlc3QgZm9yIHNpbXBsZSB0YXNrcyBsaWtlIGNsYXNzaWZpY2F0aW9uLCByb3V0aW5nLCBhbmQgc2hvcnQgc3VtbWFyaWVzLlwiLFxuICBbTW9kZWxDbGFzcy5FbWJlZGRpbmddOlxuICAgIFwiUHJvZHVjZXMgdGV4dCBlbWJlZGRpbmdzICh2ZWN0b3JzKSwgbm90IGNoYXQgcmVwbGllczsgbm90IGludGVyY2hhbmdlYWJsZSB3aXRoIGNoYXQgbW9kZWxzLlwiLFxufTtcblxuZXhwb3J0IGNvbnN0IE1vZGVsQ2xhc3NTY2hlbWEgPSB6LmVudW0oTW9kZWxDbGFzcykuZGVzY3JpYmUoXG4gIGBFbmRwb2ludCBjbGFzcyBzbHVnOiAkeyhPYmplY3QudmFsdWVzKE1vZGVsQ2xhc3MpIGFzIE1vZGVsQ2xhc3NbXSlcbiAgICAubWFwKChtb2RlbENsYXNzKSA9PiB7XG4gICAgICByZXR1cm4gYCcke21vZGVsQ2xhc3N9JyAoJHtNb2RlbENsYXNzRGVzY3JpcHRpb25zW21vZGVsQ2xhc3NdfSlgO1xuICAgIH0pXG4gICAgLmpvaW4oXCIsIFwiKX0uYCxcbik7XG5cbi8qKlxuICogRm91bmRhdGlvbiBNb2RlbCBBUEkgcXVhbGl0eSAvIHNwZWVkIC8gY29zdCBzY29yZXMgRGF0YWJyaWNrc1xuICogcHVibGlzaGVzIHBlciBwYXktcGVyLXRva2VuIGVuZHBvaW50ICh0aGUgYmFycyBzaG93biBpbiB0aGUgQUlcbiAqIFBsYXlncm91bmQpLiBTdXJmYWNlZCBmcm9tIHRoZSBzZXJ2aW5nIGxpc3QgdW5kZXJcbiAqIGBjb25maWcuc2VydmVkX2VudGl0aWVzW10uZm91bmRhdGlvbl9tb2RlbC5haV9nYXRld2F5X21vZGVsX3Byb2ZpbGVgXG4gKiBzbyB0aGUgY2xhc3MgY2xhc3NpZmllciBjYW4gcmFuayBtb2RlbHMgZnJvbSBsaXZlLCB3b3Jrc3BhY2UtbG9jYWxcbiAqIG51bWJlcnMgaW5zdGVhZCBvZiBhIGhhbmQtbWFpbnRhaW5lZCB0YWJsZS4gU2NhbGVzIGFyZSByZWxhdGl2ZSBhbmRcbiAqIHVuaXRsZXNzOyBhbGwgYXhlcyBhcmUgYWJzZW50IGZvciBjdXN0b20gb3IgYnJhbmQtbmV3IGVuZHBvaW50cyB0aGF0XG4gKiBoYXZlIG5vIHByb2ZpbGUgeWV0LlxuICovXG5leHBvcnQgY29uc3QgTW9kZWxQcm9maWxlU2NoZW1hID0gei5vYmplY3Qoe1xuICBxdWFsaXR5OiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJSZWxhdGl2ZSBxdWFsaXR5IHNjb3JlOyBoaWdoZXIgaXMgYmV0dGVyLlwiKSxcbiAgc3BlZWQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlJlbGF0aXZlIHRocm91Z2hwdXQgc2NvcmU7IGhpZ2hlciBpcyBmYXN0ZXIuXCIpLFxuICBjb3N0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJSZWxhdGl2ZSBwcmljZSBzY29yZTsgbG93ZXIgaXMgY2hlYXBlci5cIiksXG59KTtcbmV4cG9ydCB0eXBlIE1vZGVsUHJvZmlsZSA9IHouaW5mZXI8dHlwZW9mIE1vZGVsUHJvZmlsZVNjaGVtYT47XG5cbi8qKiBSZWFzb25pbmcgZWZmb3J0IGFjY2VwdGVkIGJ5IGEgRGF0YWJyaWNrcyBtb2RlbCBlbmRwb2ludC4gKi9cbmV4cG9ydCBlbnVtIFJlYXNvbmluZ0VmZm9ydCB7XG4gIE5vbmUgPSBcIm5vbmVcIixcbiAgTWluaW1hbCA9IFwibWluaW1hbFwiLFxuICBMb3cgPSBcImxvd1wiLFxuICBNZWRpdW0gPSBcIm1lZGl1bVwiLFxuICBIaWdoID0gXCJoaWdoXCIsXG4gIFhoaWdoID0gXCJ4aGlnaFwiLFxuICBNYXggPSBcIm1heFwiLFxufVxuXG5leHBvcnQgY29uc3QgUmVhc29uaW5nRWZmb3J0U2NoZW1hID0gei5lbnVtKFJlYXNvbmluZ0VmZm9ydCk7XG5cbi8qKiBMaWZlY3ljbGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIG9uZSBkaXNjb3ZlcmVkIG1vZGVsLiAqL1xuZXhwb3J0IGNvbnN0IE1vZGVsU3RhdHVzU2NoZW1hID0gei5vYmplY3Qoe1xuICBkZXByZWNhdGVkOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbn0pO1xuZXhwb3J0IHR5cGUgTW9kZWxTdGF0dXMgPSB6LmluZmVyPHR5cGVvZiBNb2RlbFN0YXR1c1NjaGVtYT47XG5cbi8qKlxuICogTWluaW1hbCBkZXNjcmlwdG9yIGZvciBhIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBlbmRwb2ludCAtIGFcbiAqIHN0YWJsZSBzdWJzZXQgb2YgdGhlIFNESyB0eXBlIHNvIGNhY2hlIGhpdHMgYW5kIGAvbW9kZWxzYCByZXNwb25zZXNcbiAqIG5ldmVyIGV4cG9zZSBTREsgaW50ZXJuYWxzLlxuICovXG5leHBvcnQgY29uc3QgU2VydmluZ0VuZHBvaW50U3VtbWFyeVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiRW5kcG9pbnQgbmFtZSBhcyBsaXN0ZWQgYnkgdGhlIE1vZGVsIFNlcnZpbmcgUkVTVCBBUEk7IHRoZSBpZCB1c2VkIHRvIGludm9rZSB0aGUgbW9kZWwuXCIsXG4gICAgKSxcbiAgZGlzcGxheU5hbWU6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiSHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBlbmRwb2ludDogYSBEYXRhYnJpY2tzLXByb3ZpZGVkIG5hbWUgd2hlbiBwcmVzZW50IChhIGRpc3BsYXktbmFtZSB0YWcgb3IgZXh0ZXJuYWwtbW9kZWwgbmFtZSksIGVsc2UgYSB0aXRsZS1jYXNlZCByZW5kZXJpbmcgb2YgYG5hbWVgIHdpdGggdmVuZG9yIHByZWZpeGVzIHN0cmlwcGVkLiBgbmFtZWAgcmVtYWlucyB0aGUgaW52b2tlIGlkLlwiLFxuICAgICksXG4gIHRhc2s6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlRhc2sgaGludCwgZS5nLiAnbGxtL3YxL2NoYXQnIG9yICdsbG0vdjEvZW1iZWRkaW5ncycuXCIpLFxuICBzdGF0ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRGVwbG95bWVudCBzdGF0ZSwgZS5nLiByZWFkeSwgdXBkYXRpbmcsIG9yIGZhaWxlZC5cIiksXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJGcmVlLWZvcm0gZW5kcG9pbnQgZGVzY3JpcHRpb247IGluZm9ybWF0aW9uYWwuXCIpLFxuICBzdXBwb3J0c1Rvb2xzOiB6XG4gICAgLmJvb2xlYW4oKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJXaGV0aGVyIHRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYSBjb21wbGV0ZSBmdW5jdGlvbi10b29sIHJvdW5kLXRyaXAgKGNhbGwgcGx1cyBmdW5jdGlvbl9jYWxsX291dHB1dCByZXBsYXkpLiBEZXJpdmVkIGZyb20gdmVyaWZpZWQgcHJvdmlkZXItZmFtaWx5IHBvbGljeSB3aGVuIERhdGFicmlja3MgZXhwb3NlcyBubyBjYXBhYmlsaXR5IGF0dHJpYnV0ZS5cIixcbiAgICApLFxuICBwcm9maWxlOiBNb2RlbFByb2ZpbGVTY2hlbWEub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICBcIkZvdW5kYXRpb24gTW9kZWwgQVBJIHF1YWxpdHkvc3BlZWQvY29zdCBzY29yZXMgd2hlbiB0aGUgZW5kcG9pbnQgaXMgYSBzY29yZWQgcGF5LXBlci10b2tlbiBtb2RlbDsgYWJzZW50IG90aGVyd2lzZS5cIixcbiAgKSxcbiAgY2xhc3M6IE1vZGVsQ2xhc3NTY2hlbWEub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICBcIkNsYXNzIHRoZSBlbmRwb2ludCB3YXMgY2xhc3NpZmllZCBpbnRvOyBhYnNlbnQgd2hlbiB0aGUgY2xhc3NpZmllciBkb2Vzbid0IHJlY29nbml6ZSBpdC5cIixcbiAgKSxcbiAgc2VydmljZU5hbWVzOiB6XG4gICAgLnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiUHJvdmlkZXItc3BlY2lmaWMgbW9kZWwgc2VydmljZSBuYW1lcyBkZXJpdmVkIGZyb20gRGF0YWJyaWNrcyBtZXRhZGF0YS5cIiksXG4gIG1vZGVsU2VydmljZU5hbWU6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIlByZWZlcnJlZCBmaXJzdC1wYXJ0eSBtb2RlbCBzZXJ2aWNlIG5hbWUgZm9yIERhdGFicmlja3MgQUkgR2F0ZXdheSBjYWxscy5cIiksXG4gIHJlYXNvbmluZ0VmZm9ydHM6IHpcbiAgICAuYXJyYXkoUmVhc29uaW5nRWZmb3J0U2NoZW1hKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiUmVhc29uaW5nIGVmZm9ydCBsZXZlbHMgYWNjZXB0ZWQgYnkgdGhlIGVuZHBvaW50LlwiKSxcbiAgc3RhdHVzOiBNb2RlbFN0YXR1c1NjaGVtYS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiTGlmZWN5Y2xlIHN0YXR1cyBkZXJpdmVkIGZyb20gbW9kZWwgbWV0YWRhdGEuXCIpLFxuICBkaW1lbnNpb246IHpcbiAgICAubnVtYmVyKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiRW1iZWRkaW5nIHZlY3RvciBsZW5ndGgsIG1lYXN1cmVkIGJ5IGEgYmVzdC1lZmZvcnQgc2VydmVyLXNpZGUgcGluZy4gT25seSBzZXQgZm9yIGVtYmVkZGluZyBlbmRwb2ludHMsIGFuZCBvbmx5IHdoZW4gdGhlIHByb2JlIHN1Y2NlZWRlZC5cIixcbiAgICApLFxufSk7XG5leHBvcnQgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0gei5pbmZlcjx0eXBlb2YgU2VydmluZ0VuZHBvaW50U3VtbWFyeVNjaGVtYT47XG5cbi8qKlxuICogQSBtb2RlbC1sb29rdXAgcmVxdWVzdDogc2VhcmNoIHN0cmluZywgY2FwYWJpbGl0eSBjZWlsaW5nLCBib3RoLCBvclxuICogbm90aGluZy4gVGhpcyBpcyB0aGUgY2FsbGVyLWZhY2luZyBxdWVyeSB0aGUgYEBkYngtdG9vbHMvbW9kZWxgXG4gKiByYW5rZXIgcmVhZHMgLSBzaGFwZWQgYXMgYSB6b2Qgc2NoZW1hICh3aXRoIHBlci1maWVsZCBkZXNjcmlwdGlvbnMpXG4gKiBzbyBhbiBhZ2VudCB0b29sIGNhbiBhZG9wdCBpdCBkaXJlY3RseSBhcyBpdHMgYGlucHV0U2NoZW1hYCBhbmQgYVxuICogYnJvd3NlciBjbGllbnQgY2FuIHZhbGlkYXRlIGFyZ3MgYmVmb3JlIGNhbGxpbmcgdGhlIG1vZGVsIHNlcnZpY2UuXG4gKlxuICogRXZlcnkgZmllbGQgaXMgb3B0aW9uYWw6IGFuIGVtcHR5IHF1ZXJ5IHJhbmtzIHRoZSBsaXZlIGNhdGFsb2d1ZSBieVxuICogY2xhc3MgYWxvbmUuIFRoZSBcInRoaXMgY2xhc3MgYW5kIGJlbG93XCIgY2VpbGluZyBzZW1hbnRpY3MgYW5kIHRoZVxuICogbWF0Y2gtdGhlbi1jbGFzcyBvcmRlcmluZyBsaXZlIGluIHRoZSBzZXJ2aWNlLCBub3QgaGVyZSAtIHRoaXNcbiAqIHN1cmZhY2UgaXMgZGVjbGFyYXRpdmUuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2RlbFF1ZXJ5U2NoZW1hID0gei5vYmplY3Qoe1xuICBzZWFyY2g6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiTG9vc2UgbmFtZSBmdXp6eS1tYXRjaGVkIGFnYWluc3QgZW5kcG9pbnQgbmFtZXMsIGUuZy4gJ2NsYXVkZSBzb25uZXQnLiBPbWl0IHRvIHJhbmsgYnkgY2xhc3MgYWxvbmUuXCIsXG4gICAgKSxcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzc1NjaGVtYS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgIFwiQ2FwYWJpbGl0eSBjZWlsaW5nOiBhIGNoYXQgY2xhc3MgcmVzdHJpY3RzIHRvIHRoYXQgYmFuZCBhbmQgdGhlIGxlc3MtY2FwYWJsZSBjaGF0IGJhbmRzIGJlbG93IGl0OyAnZW1iZWRkaW5nJyByZXN0cmljdHMgdG8gZW1iZWRkaW5nIGVuZHBvaW50cy4gT21pdCB0byBjb25zaWRlciBldmVyeSBjaGF0IGJhbmQuXCIsXG4gICksXG4gIHJlcXVpcmVzVG9vbHM6IHpcbiAgICAuYm9vbGVhbigpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIldoZW4gdHJ1ZSwgY29uc2lkZXIgb25seSBlbmRwb2ludHMgdGhhdCBzdXBwb3J0IGEgY29tcGxldGUgZnVuY3Rpb24tdG9vbCByb3VuZC10cmlwLlwiLFxuICAgICksXG4gIGxpbWl0OiB6XG4gICAgLm51bWJlcigpXG4gICAgLmludCgpXG4gICAgLnBvc2l0aXZlKClcbiAgICAubWF4KDUwKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiTWF4aW11bSBudW1iZXIgb2YgcmFua2VkIHJlc3VsdHMgdG8gcmV0dXJuLlwiKSxcbiAgdGhyZXNob2xkOiB6XG4gICAgLm51bWJlcigpXG4gICAgLm1pbigwKVxuICAgIC5tYXgoMSlcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIkZ1enp5LW1hdGNoIGRpc3RhbmNlIGN1dG9mZiAoMCA9IGV4YWN0LCAxID0gbWF0Y2ggYW55dGhpbmcpLiBEZWZhdWx0IDAuNC5cIiksXG59KTtcbmV4cG9ydCB0eXBlIE1vZGVsUXVlcnkgPSB6LmluZmVyPHR5cGVvZiBNb2RlbFF1ZXJ5U2NoZW1hPjtcblxuLyoqXG4gKiBPbmUgcmFua2VkIGxvb2t1cCByZXN1bHQuIEJhY2tzIGFuIGFnZW50IHRvb2wncyBgb3V0cHV0U2NoZW1hYCBhbmQgYVxuICogYC9tb2RlbHNgIHJhbmtlZCByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJhbmtlZE1vZGVsU2NoZW1hID0gei5vYmplY3Qoe1xuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeVNjaGVtYS5kZXNjcmliZShcIlRoZSBtYXRjaGVkIHNlcnZpbmcgZW5kcG9pbnQuXCIpLFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzU2NoZW1hLmRlc2NyaWJlKFwiQ2xhc3MgdGhlIGVuZHBvaW50IHdhcyBjbGFzc2lmaWVkIGludG8uXCIpLFxuICBzY29yZTogelxuICAgIC5udW1iZXIoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJGdXp6eS1tYXRjaCBkaXN0YW5jZSAoMCA9IGV4YWN0IC4uIDEgPSB3b3JzdCkgd2hlbiB0aGUgcXVlcnkgY2FycmllZCBhIHNlYXJjaDsgYWJzZW50IGZvciBjbGFzcy1vbmx5IHJhbmtpbmcuXCIsXG4gICAgKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmFua2VkTW9kZWwgPSB6LmluZmVyPHR5cGVvZiBSYW5rZWRNb2RlbFNjaGVtYT47XG4iXX0=
|
package/package.json
CHANGED
|
@@ -18,13 +18,12 @@
|
|
|
18
18
|
"projen": "projen"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@dbx-tools/test-polyglot": "0.6.186",
|
|
22
21
|
"@types/bun": "1.3.14",
|
|
23
22
|
"@types/node": "^24.6.0",
|
|
24
23
|
"typescript": "^5.9.3"
|
|
25
24
|
},
|
|
26
25
|
"dependencies": {
|
|
27
|
-
"@dbx-tools/shared-core": "0.6.
|
|
26
|
+
"@dbx-tools/shared-core": "0.6.188",
|
|
28
27
|
"zod": "4.3.6"
|
|
29
28
|
},
|
|
30
29
|
"main": "./lib/index.js",
|
|
@@ -41,7 +40,7 @@
|
|
|
41
40
|
"./package.json": "./package.json"
|
|
42
41
|
}
|
|
43
42
|
},
|
|
44
|
-
"version": "0.6.
|
|
43
|
+
"version": "0.6.188",
|
|
45
44
|
"types": "./lib/index.d.ts",
|
|
46
45
|
"type": "module",
|
|
47
46
|
"exports": {
|
package/src/classify.ts
CHANGED
|
@@ -34,6 +34,35 @@ const CHAT_TASK = "llm/v1/chat";
|
|
|
34
34
|
/** Task hint Databricks stamps on embedding endpoints. */
|
|
35
35
|
const EMBEDDING_TASK = "llm/v1/embeddings";
|
|
36
36
|
|
|
37
|
+
type ModelFamily = "claude" | "gemini" | "gemma" | "glm" | "gpt" | "llama" | "qwen";
|
|
38
|
+
|
|
39
|
+
interface ParsedFamily {
|
|
40
|
+
family: ModelFamily;
|
|
41
|
+
parts: ReadonlySet<string>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function parsedFamily(name: string): ParsedFamily | undefined {
|
|
45
|
+
const tokens = name.toLowerCase().match(/[a-z0-9]+/g) ?? [];
|
|
46
|
+
const familyToken = tokens.find((token) => {
|
|
47
|
+
return (
|
|
48
|
+
token === "claude" ||
|
|
49
|
+
token === "gemini" ||
|
|
50
|
+
token === "gemma" ||
|
|
51
|
+
token === "glm" ||
|
|
52
|
+
token === "gpt" ||
|
|
53
|
+
token === "llama" ||
|
|
54
|
+
token === "qwen" ||
|
|
55
|
+
/^qwen\d/.test(token)
|
|
56
|
+
);
|
|
57
|
+
});
|
|
58
|
+
if (!familyToken) return undefined;
|
|
59
|
+
const family = (familyToken.startsWith("qwen") ? "qwen" : familyToken) as ModelFamily;
|
|
60
|
+
return {
|
|
61
|
+
family,
|
|
62
|
+
parts: new Set(tokens),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
37
66
|
/** What an endpoint can be asked to do, as derived by {@link endpointCapabilities}. */
|
|
38
67
|
export interface EndpointCapabilities {
|
|
39
68
|
/** OpenAI chat/completions + Responses: the surface a chat agent needs. */
|
|
@@ -55,15 +84,10 @@ export interface EndpointCapabilities {
|
|
|
55
84
|
* passthrough entirely.
|
|
56
85
|
*/
|
|
57
86
|
export function supportsToolsByFamily(name: string): boolean {
|
|
58
|
-
const
|
|
59
|
-
if (
|
|
60
|
-
return
|
|
61
|
-
|
|
62
|
-
n.includes("gpt") ||
|
|
63
|
-
n.includes("qwen") ||
|
|
64
|
-
n.includes("glm") ||
|
|
65
|
-
n.includes("llama")
|
|
66
|
-
);
|
|
87
|
+
const parsed = parsedFamily(name);
|
|
88
|
+
if (!parsed || parsed.family === "gemini") return false;
|
|
89
|
+
if (parsed.family === "gpt" && parsed.parts.has("oss")) return false;
|
|
90
|
+
return ["claude", "gpt", "qwen", "glm", "llama"].includes(parsed.family);
|
|
67
91
|
}
|
|
68
92
|
|
|
69
93
|
/**
|
|
@@ -153,42 +177,46 @@ function versionScore(name: string): number {
|
|
|
153
177
|
*/
|
|
154
178
|
export function classifyByFamily(name: string): FamilyClass | null {
|
|
155
179
|
const n = name.toLowerCase();
|
|
180
|
+
const parsed = parsedFamily(n);
|
|
181
|
+
if (!parsed) return null;
|
|
182
|
+
const { family, parts } = parsed;
|
|
183
|
+
const has = (part: string): boolean => parts.has(part);
|
|
156
184
|
const at = (cls: ModelClass): FamilyClass => ({ class: cls, rank: versionScore(n) });
|
|
157
185
|
|
|
158
186
|
// Anthropic Claude
|
|
159
|
-
if (
|
|
160
|
-
if (
|
|
161
|
-
if (
|
|
187
|
+
if (family === "claude" && has("opus")) return at(ModelClass.ChatThinking);
|
|
188
|
+
if (family === "claude" && has("sonnet")) return at(ModelClass.ChatBalanced);
|
|
189
|
+
if (family === "claude" && has("haiku")) return at(ModelClass.ChatFast);
|
|
162
190
|
|
|
163
191
|
// OpenAI open-weights (check before the generic gpt branch)
|
|
164
|
-
if (
|
|
165
|
-
return at(
|
|
192
|
+
if (family === "gpt" && has("oss")) {
|
|
193
|
+
return at(has("120b") ? ModelClass.ChatBalanced : ModelClass.ChatFast);
|
|
166
194
|
}
|
|
167
195
|
// OpenAI GPT family
|
|
168
|
-
if (
|
|
169
|
-
if (
|
|
170
|
-
if (
|
|
196
|
+
if (family === "gpt") {
|
|
197
|
+
if (has("pro")) return at(ModelClass.ChatThinking);
|
|
198
|
+
if (has("mini") || has("nano")) return at(ModelClass.ChatFast);
|
|
171
199
|
return at(ModelClass.ChatBalanced);
|
|
172
200
|
}
|
|
173
201
|
|
|
174
202
|
// Google Gemini / Gemma
|
|
175
|
-
if (
|
|
176
|
-
if (
|
|
177
|
-
if (
|
|
203
|
+
if (family === "gemini") {
|
|
204
|
+
if (has("flash") && has("lite")) return at(ModelClass.ChatFast);
|
|
205
|
+
if (has("pro")) return at(ModelClass.ChatThinking);
|
|
178
206
|
return at(ModelClass.ChatBalanced);
|
|
179
207
|
}
|
|
180
|
-
if (
|
|
208
|
+
if (family === "gemma") return at(ModelClass.ChatFast);
|
|
181
209
|
|
|
182
210
|
// Meta Llama
|
|
183
|
-
if (
|
|
184
|
-
if (
|
|
185
|
-
if (
|
|
186
|
-
if (
|
|
211
|
+
if (family === "llama") {
|
|
212
|
+
if (has("maverick") || has("405b")) return at(ModelClass.ChatThinking);
|
|
213
|
+
if (has("70b")) return at(ModelClass.ChatBalanced);
|
|
214
|
+
if (has("8b") || has("1b")) return at(ModelClass.ChatFast);
|
|
187
215
|
return at(ModelClass.ChatBalanced);
|
|
188
216
|
}
|
|
189
217
|
|
|
190
218
|
// Alibaba Qwen
|
|
191
|
-
if (
|
|
219
|
+
if (family === "qwen") return at(ModelClass.ChatBalanced);
|
|
192
220
|
|
|
193
221
|
return null;
|
|
194
222
|
}
|
package/src/model.ts
CHANGED
|
@@ -65,6 +65,25 @@ export const ModelProfileSchema = z.object({
|
|
|
65
65
|
});
|
|
66
66
|
export type ModelProfile = z.infer<typeof ModelProfileSchema>;
|
|
67
67
|
|
|
68
|
+
/** Reasoning effort accepted by a Databricks model endpoint. */
|
|
69
|
+
export enum ReasoningEffort {
|
|
70
|
+
None = "none",
|
|
71
|
+
Minimal = "minimal",
|
|
72
|
+
Low = "low",
|
|
73
|
+
Medium = "medium",
|
|
74
|
+
High = "high",
|
|
75
|
+
Xhigh = "xhigh",
|
|
76
|
+
Max = "max",
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export const ReasoningEffortSchema = z.enum(ReasoningEffort);
|
|
80
|
+
|
|
81
|
+
/** Lifecycle flags associated with one discovered model. */
|
|
82
|
+
export const ModelStatusSchema = z.object({
|
|
83
|
+
deprecated: z.boolean().default(false),
|
|
84
|
+
});
|
|
85
|
+
export type ModelStatus = z.infer<typeof ModelStatusSchema>;
|
|
86
|
+
|
|
68
87
|
/**
|
|
69
88
|
* Minimal descriptor for a Databricks Model Serving endpoint - a
|
|
70
89
|
* stable subset of the SDK type so cache hits and `/models` responses
|
|
@@ -97,6 +116,19 @@ export const ServingEndpointSummarySchema = z.object({
|
|
|
97
116
|
class: ModelClassSchema.optional().describe(
|
|
98
117
|
"Class the endpoint was classified into; absent when the classifier doesn't recognize it.",
|
|
99
118
|
),
|
|
119
|
+
serviceNames: z
|
|
120
|
+
.record(z.string(), z.string())
|
|
121
|
+
.optional()
|
|
122
|
+
.describe("Provider-specific model service names derived from Databricks metadata."),
|
|
123
|
+
modelServiceName: z
|
|
124
|
+
.string()
|
|
125
|
+
.optional()
|
|
126
|
+
.describe("Preferred first-party model service name for Databricks AI Gateway calls."),
|
|
127
|
+
reasoningEfforts: z
|
|
128
|
+
.array(ReasoningEffortSchema)
|
|
129
|
+
.optional()
|
|
130
|
+
.describe("Reasoning effort levels accepted by the endpoint."),
|
|
131
|
+
status: ModelStatusSchema.optional().describe("Lifecycle status derived from model metadata."),
|
|
100
132
|
dimension: z
|
|
101
133
|
.number()
|
|
102
134
|
.optional()
|