@cartanova/qgrid-cli 2.2.1 → 2.3.2
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/bundle/dist/application/qgrid/conv-routing.js +2 -6
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +74 -43
- package/bundle/dist/application/qgrid/token-subscriber.js +14 -1
- package/bundle/dist/application/qgrid/tool-emulation.js +25 -20
- package/bundle/dist/application/request-log/request-log.model.js +54 -8
- package/bundle/dist/sonamu.config.js +11 -2
- package/bundle/dist/testing/global.js +5 -2
- package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +30 -0
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +215 -0
- package/bundle/dist/utils/providers/anthropic/claude-session.js +220 -0
- package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +177 -0
- package/bundle/dist/utils/providers/common/model-cost.js +35 -18
- package/bundle/dist/utils/providers/openai/openai-refresh.js +21 -9
- package/bundle/src/application/qgrid/conv-routing.test.ts +85 -0
- package/bundle/src/application/qgrid/conv-routing.ts +3 -2
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +110 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +112 -64
- package/bundle/src/application/qgrid/token-subscriber.ts +23 -1
- package/bundle/src/application/qgrid/tool-emulation.test.ts +46 -0
- package/bundle/src/application/qgrid/tool-emulation.ts +15 -3
- package/bundle/src/application/request-log/request-log.model.ts +98 -13
- package/bundle/src/sonamu.config.ts +13 -2
- package/bundle/src/testing/global.ts +16 -2
- package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +38 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +564 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +365 -0
- package/bundle/src/utils/providers/anthropic/claude-session.test.ts +263 -0
- package/bundle/src/utils/providers/anthropic/claude-session.ts +327 -0
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.test.ts +373 -0
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +344 -0
- package/bundle/src/utils/providers/common/model-cost.test.ts +39 -0
- package/bundle/src/utils/providers/common/model-cost.ts +107 -19
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +13 -2
- package/bundle/src/utils/providers/openai/openai-refresh.ts +34 -9
- package/package.json +1 -1
|
@@ -7,6 +7,35 @@ import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers
|
|
|
7
7
|
import { BadRequestException, BaseModelClass, NotFoundException, api, asArray, exhaustive } from "sonamu";
|
|
8
8
|
//#region src/application/request-log/request-log.model.ts
|
|
9
9
|
const MICRO_USD = 1e6;
|
|
10
|
+
function isAnthropicUsageRow(row) {
|
|
11
|
+
return row.token_name?.startsWith("anthropic/") === true || row.model_name?.startsWith("claude-") === true || row.model_name?.startsWith("anthropic/claude-") === true;
|
|
12
|
+
}
|
|
13
|
+
function canonicalModelName(modelName) {
|
|
14
|
+
return modelName.includes("/") ? modelName.split("/").pop() : modelName;
|
|
15
|
+
}
|
|
16
|
+
function normalizedUsageForCost(row) {
|
|
17
|
+
const cacheRead = Number(row.cache_read_tokens ?? 0);
|
|
18
|
+
const cacheCreation = Number(row.cache_creation_tokens ?? 0);
|
|
19
|
+
const storedInput = Number(row.input_tokens ?? 0);
|
|
20
|
+
const legacyAnthropicSplitInput = isAnthropicUsageRow(row) && storedInput < cacheRead + cacheCreation;
|
|
21
|
+
return {
|
|
22
|
+
model: row.model_name ? canonicalModelName(row.model_name) : null,
|
|
23
|
+
inputTokens: legacyAnthropicSplitInput ? storedInput + cacheRead + cacheCreation : storedInput,
|
|
24
|
+
outputTokens: Number(row.output_tokens ?? 0),
|
|
25
|
+
cachedInputTokens: cacheRead,
|
|
26
|
+
cacheCreationInputTokens: cacheCreation
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function normalizeLegacyAnthropicRow(row) {
|
|
30
|
+
const usage = normalizedUsageForCost(row);
|
|
31
|
+
if (usage.inputTokens === Number(row.input_tokens ?? 0)) return row;
|
|
32
|
+
const normalized = {
|
|
33
|
+
...row,
|
|
34
|
+
input_tokens: usage.inputTokens
|
|
35
|
+
};
|
|
36
|
+
if (usage.model) normalized.cost_usd = Math.round(calculateCostUsd(usage.model, usage) * MICRO_USD);
|
|
37
|
+
return normalized;
|
|
38
|
+
}
|
|
10
39
|
var RequestLogModelClass = class extends BaseModelClass {
|
|
11
40
|
constructor() {
|
|
12
41
|
super("RequestLog", requestLogSubsetQueries, requestLogLoaderQueries);
|
|
@@ -49,7 +78,7 @@ var RequestLogModelClass = class extends BaseModelClass {
|
|
|
49
78
|
else throw new BadRequestException(SD("error.unknownSearchField")(params.search));
|
|
50
79
|
if (params.orderBy) if (params.orderBy === "id-desc") qb.orderBy("request_logs.id", "desc");
|
|
51
80
|
else exhaustive(params.orderBy);
|
|
52
|
-
const enhancers = this.createEnhancers({ A: (row) => (
|
|
81
|
+
const enhancers = this.createEnhancers({ A: (row) => normalizeLegacyAnthropicRow(row) });
|
|
53
82
|
return this.executeSubsetQuery({
|
|
54
83
|
subset,
|
|
55
84
|
qb,
|
|
@@ -122,11 +151,20 @@ var RequestLogModelClass = class extends BaseModelClass {
|
|
|
122
151
|
if (params.input_tokens !== void 0 && params.output_tokens !== void 0) {
|
|
123
152
|
const [row] = await this.getDB("r")("request_logs").select("model_name").where("id", requestLogId).limit(1);
|
|
124
153
|
if (row?.model_name) {
|
|
125
|
-
const model =
|
|
154
|
+
const model = canonicalModelName(row.model_name);
|
|
155
|
+
const usage = normalizedUsageForCost({
|
|
156
|
+
token_name: params.token_name,
|
|
157
|
+
model_name: row.model_name,
|
|
158
|
+
input_tokens: params.input_tokens,
|
|
159
|
+
output_tokens: params.output_tokens,
|
|
160
|
+
cache_read_tokens: params.cache_read_tokens ?? 0,
|
|
161
|
+
cache_creation_tokens: params.cache_creation_tokens ?? 0
|
|
162
|
+
});
|
|
126
163
|
update.cost_usd = Math.round(calculateCostUsd(model, {
|
|
127
|
-
inputTokens:
|
|
128
|
-
outputTokens:
|
|
129
|
-
cachedInputTokens:
|
|
164
|
+
inputTokens: usage.inputTokens,
|
|
165
|
+
outputTokens: usage.outputTokens,
|
|
166
|
+
cachedInputTokens: usage.cachedInputTokens,
|
|
167
|
+
cacheCreationInputTokens: usage.cacheCreationInputTokens
|
|
130
168
|
}) * 1e6);
|
|
131
169
|
}
|
|
132
170
|
}
|
|
@@ -173,8 +211,16 @@ var RequestLogModelClass = class extends BaseModelClass {
|
|
|
173
211
|
async totalCost(params = {}) {
|
|
174
212
|
const qb = this.getDB("r")("request_logs");
|
|
175
213
|
if (params.token_name) qb.where("token_name", params.token_name);
|
|
176
|
-
|
|
177
|
-
|
|
214
|
+
return (await qb.select("model_name", "input_tokens", "output_tokens", "cache_read_tokens", "cache_creation_tokens", "cost_usd")).reduce((sum, row) => {
|
|
215
|
+
const usage = normalizedUsageForCost(row);
|
|
216
|
+
if (!usage.model) return sum + Math.max(Number(row.cost_usd ?? 0), 0) / MICRO_USD;
|
|
217
|
+
return sum + calculateCostUsd(usage.model, {
|
|
218
|
+
inputTokens: usage.inputTokens,
|
|
219
|
+
outputTokens: usage.outputTokens,
|
|
220
|
+
cachedInputTokens: usage.cachedInputTokens,
|
|
221
|
+
cacheCreationInputTokens: usage.cacheCreationInputTokens
|
|
222
|
+
});
|
|
223
|
+
}, 0);
|
|
178
224
|
}
|
|
179
225
|
async distinctProjectNames() {
|
|
180
226
|
return (await this.getPuri("r").from("request_logs").distinct("project_name").where("project_name", "!=", null).orderBy("project_name", "asc").select({ project_name: "project_name" })).map((r) => r.project_name);
|
|
@@ -229,4 +275,4 @@ const RequestLogModel = new RequestLogModelClass();
|
|
|
229
275
|
//#endregion
|
|
230
276
|
export { MICRO_USD, RequestLogModel };
|
|
231
277
|
|
|
232
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIGV4aGF1c3RpdmUsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dTdWJzZXRLZXksIHR5cGUgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMsIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dMaXN0UGFyYW1zLCB0eXBlIFJlcXVlc3RMb2dTYXZlUGFyYW1zIH0gZnJvbSBcIi4vcmVxdWVzdC1sb2cudHlwZXNcIjtcblxuLy8gY29zdF91c2TripQg7KCV7IiYIG1pY3JvLVVTROuhnCDsoIDsnqUuIOyLpOygnCBVU0QgPSBjb3N0X3VzZCAvIE1JQ1JPX1VTRC5cbmV4cG9ydCBjb25zdCBNSUNST19VU0QgPSAxXzAwMF8wMDA7XG5cbi8qXG4gIFJlcXVlc3RMb2cgTW9kZWxcbiovXG5jbGFzcyBSZXF1ZXN0TG9nTW9kZWxDbGFzcyBleHRlbmRzIEJhc2VNb2RlbENsYXNzPFxuICBSZXF1ZXN0TG9nU3Vic2V0S2V5LFxuICBSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzLFxuICB0eXBlb2YgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlJlcXVlc3RMb2dcIiwgcmVxdWVzdExvZ1N1YnNldFF1ZXJpZXMsIHJlcXVlc3RMb2dMb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiUmVxdWVzdExvZ1wiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZ1tUXT4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIGlkLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcbiAgICBpZiAoIXJvd3NbMF0pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmVudGl0eU5vdEZvdW5kXCIpKFwiUmVxdWVzdExvZ1wiLCBpZCkpO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZTxUIGV4dGVuZHMgUmVxdWVzdExvZ1N1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGxpc3RQYXJhbXM6IFJlcXVlc3RMb2dMaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIC4uLmxpc3RQYXJhbXMsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvd3NbMF0gPz8gbnVsbDtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiUmVxdWVzdExvZ3NcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgUmVxdWVzdExvZ1N1YnNldEtleSwgTFAgZXh0ZW5kcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcz4oXG4gICAgc3Vic2V0OiBULFxuICAgIHJhd1BhcmFtcz86IExQLFxuICApOiBQcm9taXNlPExpc3RSZXN1bHQ8TFAsIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcImlkLWRlc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWIsIG9uU3Vic2V0OiBfIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcblxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnRva2VuX25hbWUpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIiwgcGFyYW1zLnRva2VuX25hbWUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucHJvamVjdF9uYW1lX2lzX251bGwpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnByb2plY3RfbmFtZVwiLCBudWxsKTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWVfaXNfbm90X251bGwpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnByb2plY3RfbmFtZVwiLCBcIiE9XCIsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnByb2plY3RfbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIHBhcmFtcy5wcm9qZWN0X25hbWUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubW9kZWxfbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MubW9kZWxfbmFtZVwiLCBwYXJhbXMubW9kZWxfbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiaWRcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5pZFwiLCBOdW1iZXIocGFyYW1zLmtleXdvcmQpKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJ0b2tlbl9uYW1lXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJ1c2VyX3Byb21wdFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnVzZXJfcHJvbXB0XCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci51bmtub3duU2VhcmNoRmllbGRcIikocGFyYW1zLnNlYXJjaCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG9yZGVyQnlcbiAgICBpZiAocGFyYW1zLm9yZGVyQnkpIHtcbiAgICAgIC8vIGRlZmF1bHQgb3JkZXJCeVxuICAgICAgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcImlkLWRlc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwicmVxdWVzdF9sb2dzLmlkXCIsIFwiZGVzY1wiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aGF1c3RpdmUocGFyYW1zLm9yZGVyQnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+ICh7XG4gICAgICAgIC4uLnJvdyxcbiAgICAgICAgLy8g7ISc67iM7IWL67OE66GcIHZpcnR1YWwg7ZWE65OcIOqzhOyCsOuhnOyngSDstpTqsIBcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zLFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHNhdmUoc3BhOiBSZXF1ZXN0TG9nU2F2ZVBhcmFtc1tdKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyByZWdpc3RlclxuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwgc3ApO1xuICAgIH0pO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcInJlcXVlc3RfbG9nc1wiKTtcblxuICAgICAgcmV0dXJuIGlkcztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSdW4gTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGNyZWF0ZVJ1bihwYXJhbXM6IHtcbiAgICB1c2VyX3Byb21wdDogc3RyaW5nO1xuICAgIHN5c3RlbV9wcm9tcHQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIG1vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGVmZm9ydD86IHN0cmluZyB8IG51bGw7XG4gICAgcHJvamVjdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBoaXN0b3J5PzogdW5rbm93bjtcbiAgfSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCB7XG4gICAgICB1c2VyX3Byb21wdDogcGFyYW1zLnVzZXJfcHJvbXB0LFxuICAgICAgc3lzdGVtX3Byb21wdDogcGFyYW1zLnN5c3RlbV9wcm9tcHQgPz8gbnVsbCxcbiAgICAgIG1vZGVsX25hbWU6IHBhcmFtcy5tb2RlbF9uYW1lID8/IG51bGwsXG4gICAgICBlZmZvcnQ6IHBhcmFtcy5lZmZvcnQgPz8gbnVsbCxcbiAgICAgIHByb2plY3RfbmFtZTogcGFyYW1zLnByb2plY3RfbmFtZSA/PyBudWxsLFxuICAgICAgc3RhdHVzOiBcInJ1bm5pbmdcIixcbiAgICAgIHJlc3BvbnNlOiBcIlwiLFxuICAgICAgaW5wdXRfdG9rZW5zOiAwLFxuICAgICAgb3V0cHV0X3Rva2VuczogMCxcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiAwLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiAwLFxuICAgICAgZHVyYXRpb25fbXM6IDAsXG4gICAgICB0b29sX2NhbGxfY291bnQ6IDAsXG4gICAgICAuLi4ocGFyYW1zLmhpc3RvcnkgIT09IHVuZGVmaW5lZCA/IHsgaGlzdG9yeTogcGFyYW1zLmhpc3RvcnkgYXMgeyB0eXBlOiBzdHJpbmcgfVtdIH0gOiB7fSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkOiBudW1iZXIsIHN0ZXA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dfc3RlcHNcIiwgeyByZXF1ZXN0X2xvZ19pZDogcmVxdWVzdExvZ0lkLCAuLi5zdGVwIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dfc3RlcHNcIik7XG4gICAgICBpZiAoc3RlcC50eXBlID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgICAgIGF3YWl0IHRyeC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKS5pbmNyZW1lbnQoXCJ0b29sX2NhbGxfY291bnRcIiwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFJ1bihcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgcmVzcG9uc2U/OiBzdHJpbmc7XG4gICAgICB0b2tlbl9uYW1lPzogc3RyaW5nO1xuICAgICAgaW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgb3V0cHV0X3Rva2Vucz86IG51bWJlcjtcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zPzogbnVtYmVyO1xuICAgICAgZHVyYXRpb25fbXM/OiBudW1iZXI7XG4gICAgICBoaXN0b3J5PzogdW5rbm93bjtcbiAgICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB0b29sX2NhbGxfY291bnQ/OiBudW1iZXI7XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHBhcmFtcy5zdGF0dXMgPT09IFwic3VjY2VlZGVkXCIgJiYgIXBhcmFtcy50b2tlbl9uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0b2tlbk5hbWUgaXMgcmVxdWlyZWQgZm9yIHN1Y2NlZWRlZCBydW5zXCIpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBpZDogcmVxdWVzdExvZ0lkLCBzdGF0dXM6IHBhcmFtcy5zdGF0dXMgfTtcbiAgICBjb25zdCBmaWVsZHMgPSBbXG4gICAgICBcInJlc3BvbnNlXCIsXG4gICAgICBcInRva2VuX25hbWVcIixcbiAgICAgIFwiaW5wdXRfdG9rZW5zXCIsXG4gICAgICBcIm91dHB1dF90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgICBcImR1cmF0aW9uX21zXCIsXG4gICAgICBcImVycm9yX21lc3NhZ2VcIixcbiAgICAgIFwidG9vbF9jYWxsX2NvdW50XCIsXG4gICAgXSBhcyBjb25zdDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChwYXJhbXNba2V5XSAhPT0gdW5kZWZpbmVkKSB1cGRhdGVba2V5XSA9IHBhcmFtc1trZXldO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmhpc3RvcnkgIT09IHVuZGVmaW5lZCkgdXBkYXRlLmhpc3RvcnkgPSBwYXJhbXMuaGlzdG9yeTtcblxuICAgIGlmIChwYXJhbXMuaW5wdXRfdG9rZW5zICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLm91dHB1dF90b2tlbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwiclwiKTtcbiAgICAgIGNvbnN0IFtyb3ddID0gYXdhaXQgZGIoXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgICAgLnNlbGVjdChcIm1vZGVsX25hbWVcIilcbiAgICAgICAgLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgICAubGltaXQoMSk7XG4gICAgICBpZiAocm93Py5tb2RlbF9uYW1lKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gcm93Lm1vZGVsX25hbWUuaW5jbHVkZXMoXCIvXCIpXG4gICAgICAgICAgPyByb3cubW9kZWxfbmFtZS5zcGxpdChcIi9cIikucG9wKCkhXG4gICAgICAgICAgOiByb3cubW9kZWxfbmFtZTtcbiAgICAgICAgdXBkYXRlLmNvc3RfdXNkID0gTWF0aC5yb3VuZChcbiAgICAgICAgICBjYWxjdWxhdGVDb3N0VXNkKG1vZGVsLCB7XG4gICAgICAgICAgICBpbnB1dFRva2VuczogcGFyYW1zLmlucHV0X3Rva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogcGFyYW1zLm91dHB1dF90b2tlbnMsXG4gICAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcGFyYW1zLmNhY2hlX3JlYWRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgfSkgKiAxXzAwMF8wMDAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCB1cGRhdGUpO1xuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBhZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkOiBudW1iZXIpOiBQcm9taXNlPHtcbiAgICBpbnB1dF90b2tlbnM6IG51bWJlcjtcbiAgICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gICAgY2FjaGVfcmVhZF90b2tlbnM6IG51bWJlcjtcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IG51bWJlcjtcbiAgICBkdXJhdGlvbl9tczogbnVtYmVyO1xuICB9PiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IGRiKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKVxuICAgICAgLnN1bSh7XG4gICAgICAgIGlucHV0X3Rva2VuczogXCJpbnB1dF90b2tlbnNcIixcbiAgICAgICAgb3V0cHV0X3Rva2VuczogXCJvdXRwdXRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgICAgZHVyYXRpb25fbXM6IFwiZHVyYXRpb25fbXNcIixcbiAgICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dF90b2tlbnM6IE51bWJlcihyb3c/LmlucHV0X3Rva2VucyA/PyAwKSxcbiAgICAgIG91dHB1dF90b2tlbnM6IE51bWJlcihyb3c/Lm91dHB1dF90b2tlbnMgPz8gMCksXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogTnVtYmVyKHJvdz8uY2FjaGVfcmVhZF90b2tlbnMgPz8gMCksXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IE51bWJlcihyb3c/LmNhY2hlX2NyZWF0aW9uX3Rva2VucyA/PyAwKSxcbiAgICAgIGR1cmF0aW9uX21zOiBOdW1iZXIocm93Py5kdXJhdGlvbl9tcyA/PyAwKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmluZFN0YWxlUnVubmluZ0lkcyh0aHJlc2hvbGRNczogbnVtYmVyLCBsaW1pdDogbnVtYmVyID0gMTApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwiclwiKTtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gdGhyZXNob2xkTXMpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkYihcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdChcImlkXCIpXG4gICAgICAud2hlcmUoXCJzdGF0dXNcIiwgXCJydW5uaW5nXCIpXG4gICAgICAud2hlcmUoXCJjcmVhdGVkX2F0XCIsIFwiPFwiLCB0aHJlc2hvbGQpXG4gICAgICAubGltaXQobGltaXQpO1xuICAgIHJldHVybiByb3dzLm1hcCgocjogeyBpZDogbnVtYmVyIH0pID0+IHIuaWQpO1xuICB9XG5cbiAgYXN5bmMgZ2V0TmV4dFN0ZXBJbmRleChyZXF1ZXN0TG9nSWQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IGRiKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC5tYXgoXCJzdGVwX2luZGV4IGFzIG1heFN0ZXBcIik7XG4gICAgcmV0dXJuICgocm93IGFzIHsgbWF4U3RlcDogbnVtYmVyIHwgbnVsbCB9KT8ubWF4U3RlcCA/PyAtMSkgKyAxO1xuICB9XG5cbiAgYXN5bmMgY29tcGxldGVUb29sQ2FsbChcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICB0b29sQ2FsbElkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiB7IHRvb2xfcmVzdWx0Pzogc3RyaW5nOyB0b29sX2R1cmF0aW9uX21zPzogbnVtYmVyOyBlcnJvcj86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdHJ4XG4gICAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgICAud2hlcmUoXCJ0b29sX2NhbGxfaWRcIiwgdG9vbENhbGxJZClcbiAgICAgICAgLndoZXJlKFwidHlwZVwiLCBcInRvb2xfY2FsbFwiKVxuICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICAuLi4ocGFyYW1zLnRvb2xfcmVzdWx0ICE9PSB1bmRlZmluZWQgPyB7IHRvb2xfcmVzdWx0OiBwYXJhbXMudG9vbF9yZXN1bHQgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ocGFyYW1zLnRvb2xfZHVyYXRpb25fbXMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IHRvb2xfZHVyYXRpb25fbXM6IHBhcmFtcy50b29sX2R1cmF0aW9uX21zIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLihwYXJhbXMuZXJyb3IgIT09IHVuZGVmaW5lZCA/IHsgZXJyb3I6IHBhcmFtcy5lcnJvciB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU29uYW11IGZpbmRNYW5564qUIHN1YnNldCDsoITssrQg7Lus65+8KHRleHQg7Y+s7ZWoKeydhCDtjpjsuZjtlbTshJwgYWdncmVnYXRl7JeUIOuEiOustCDrrLTqsbDsm4Ag4oaSIHJhdyBzdW0g7IKs7JqpLlxuICBhc3luYyB0b3RhbENvc3QocGFyYW1zOiB7IHRva2VuX25hbWU/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBxYiA9IHRoaXMuZ2V0REIoXCJyXCIpKFwicmVxdWVzdF9sb2dzXCIpO1xuICAgIGlmIChwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJ0b2tlbl9uYW1lXCIsIHBhcmFtcy50b2tlbl9uYW1lKTtcbiAgICB9XG4gICAgLy8ga25leOuKlCBwZ+yXkOyEnCBudW1lcmljIGFnZ3JlZ2F0ZeulvCBzdHJpbmfsnLzroZwg67CY7ZmYLlxuICAgIGNvbnN0IHJvdyA9IChhd2FpdCBxYi5zdW0oeyBzdW06IFwiY29zdF91c2RcIiB9KS5maXJzdCgpKSBhcyB7IHN1bTogc3RyaW5nIHwgbnVsbCB9IHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBOdW1iZXIocm93Py5zdW0gPz8gMCkgLyBNSUNST19VU0Q7XG4gIH1cblxuICBhc3luYyBkaXN0aW5jdFByb2plY3ROYW1lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuZGlzdGluY3QoXCJwcm9qZWN0X25hbWVcIilcbiAgICAgIC53aGVyZShcInByb2plY3RfbmFtZVwiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcInByb2plY3RfbmFtZVwiLCBcImFzY1wiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIHByb2plY3RfbmFtZTogXCJwcm9qZWN0X25hbWVcIixcbiAgICAgIH0pO1xuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci5wcm9qZWN0X25hbWUhKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGF3YWl0IHRyeFxuICAgICAgICAudGFibGUoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgICAud2hlcmVJbihcInJlcXVlc3RfbG9nX3N0ZXBzLnJlcXVlc3RfbG9nX2lkXCIsIGlkcylcbiAgICAgICAgLmRlbGV0ZSgpO1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInJlcXVlc3RfbG9nc1wiKS53aGVyZUluKFwicmVxdWVzdF9sb2dzLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWRzLmxlbmd0aDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ01vZGVsID0gbmV3IFJlcXVlc3RMb2dNb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBaUJBLE1BQWEsWUFBWTtBQUt6QixJQUFNLHVCQUFOLGNBQW1DLGVBS2pDO0NBQ0EsY0FBYztBQUNaLFFBQU0sY0FBYyx5QkFBeUIsd0JBQXdCOztDQUd2RSxNQUNNLFNBQ0osUUFDQSxJQUNxQztFQUNyQyxNQUFNLEVBQUUsU0FBUyxNQUFNLEtBQUssU0FBUyxRQUFRO0dBQzNDO0dBQ0EsS0FBSztHQUNMLE1B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
|
|
278
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIGV4aGF1c3RpdmUsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dTdWJzZXRLZXksIHR5cGUgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMsIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dMaXN0UGFyYW1zLCB0eXBlIFJlcXVlc3RMb2dTYXZlUGFyYW1zIH0gZnJvbSBcIi4vcmVxdWVzdC1sb2cudHlwZXNcIjtcblxuLy8gY29zdF91c2TripQg7KCV7IiYIG1pY3JvLVVTROuhnCDsoIDsnqUuIOyLpOygnCBVU0QgPSBjb3N0X3VzZCAvIE1JQ1JPX1VTRC5cbmV4cG9ydCBjb25zdCBNSUNST19VU0QgPSAxXzAwMF8wMDA7XG5cbnR5cGUgUmVxdWVzdExvZ1VzYWdlUm93ID0ge1xuICB0b2tlbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjb3N0X3VzZD86IG51bWJlciB8IG51bGw7XG59O1xuXG5mdW5jdGlvbiBpc0FudGhyb3BpY1VzYWdlUm93KHJvdzogUGljazxSZXF1ZXN0TG9nVXNhZ2VSb3csIFwidG9rZW5fbmFtZVwiIHwgXCJtb2RlbF9uYW1lXCI+KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgcm93LnRva2VuX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJjbGF1ZGUtXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvY2xhdWRlLVwiKSA9PT0gdHJ1ZVxuICApO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxNb2RlbE5hbWUobW9kZWxOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZWxOYW1lLmluY2x1ZGVzKFwiL1wiKSA/IG1vZGVsTmFtZS5zcGxpdChcIi9cIikucG9wKCkhIDogbW9kZWxOYW1lO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdzogUmVxdWVzdExvZ1VzYWdlUm93KToge1xuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcbiAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogbnVtYmVyO1xufSB7XG4gIGNvbnN0IGNhY2hlUmVhZCA9IE51bWJlcihyb3cuY2FjaGVfcmVhZF90b2tlbnMgPz8gMCk7XG4gIGNvbnN0IGNhY2hlQ3JlYXRpb24gPSBOdW1iZXIocm93LmNhY2hlX2NyZWF0aW9uX3Rva2VucyA/PyAwKTtcbiAgY29uc3Qgc3RvcmVkSW5wdXQgPSBOdW1iZXIocm93LmlucHV0X3Rva2VucyA/PyAwKTtcbiAgY29uc3QgbGVnYWN5QW50aHJvcGljU3BsaXRJbnB1dCA9XG4gICAgaXNBbnRocm9waWNVc2FnZVJvdyhyb3cpICYmIHN0b3JlZElucHV0IDwgY2FjaGVSZWFkICsgY2FjaGVDcmVhdGlvbjtcbiAgcmV0dXJuIHtcbiAgICBtb2RlbDogcm93Lm1vZGVsX25hbWUgPyBjYW5vbmljYWxNb2RlbE5hbWUocm93Lm1vZGVsX25hbWUpIDogbnVsbCxcbiAgICBpbnB1dFRva2VuczogbGVnYWN5QW50aHJvcGljU3BsaXRJbnB1dCA/IHN0b3JlZElucHV0ICsgY2FjaGVSZWFkICsgY2FjaGVDcmVhdGlvbiA6IHN0b3JlZElucHV0LFxuICAgIG91dHB1dFRva2VuczogTnVtYmVyKHJvdy5vdXRwdXRfdG9rZW5zID8/IDApLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiBjYWNoZVJlYWQsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiBjYWNoZUNyZWF0aW9uLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMZWdhY3lBbnRocm9waWNSb3c8VCBleHRlbmRzIFJlcXVlc3RMb2dVc2FnZVJvdz4ocm93OiBUKTogVCB7XG4gIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdChyb3cpO1xuICBpZiAodXNhZ2UuaW5wdXRUb2tlbnMgPT09IE51bWJlcihyb3cuaW5wdXRfdG9rZW5zID8/IDApKSByZXR1cm4gcm93O1xuICBjb25zdCBub3JtYWxpemVkID0geyAuLi5yb3csIGlucHV0X3Rva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMgfTtcbiAgaWYgKHVzYWdlLm1vZGVsKSB7XG4gICAgbm9ybWFsaXplZC5jb3N0X3VzZCA9IE1hdGgucm91bmQoY2FsY3VsYXRlQ29zdFVzZCh1c2FnZS5tb2RlbCwgdXNhZ2UpICogTUlDUk9fVVNEKTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLypcbiAgUmVxdWVzdExvZyBNb2RlbFxuKi9cbmNsYXNzIFJlcXVlc3RMb2dNb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFJlcXVlc3RMb2dTdWJzZXRLZXksXG4gIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nLFxuICB0eXBlb2YgcmVxdWVzdExvZ1N1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiByZXF1ZXN0TG9nTG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiUmVxdWVzdExvZ1wiLCByZXF1ZXN0TG9nU3Vic2V0UXVlcmllcywgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nXCIgfSlcbiAgYXN5bmMgZmluZEJ5SWQ8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgaWQsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJSZXF1ZXN0TG9nXCIsIGlkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3NbMF07XG4gIH1cblxuICBhc3luYyBmaW5kT25lPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogUmVxdWVzdExvZ0xpc3RQYXJhbXMsXG4gICk6IFByb21pc2U8UmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0gfCBudWxsPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgLi4ubGlzdFBhcmFtcyxcbiAgICAgIG51bTogMSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nc1wiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5LCBMUCBleHRlbmRzIFJlcXVlc3RMb2dMaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwiaWQtZGVzY1wiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFJlcXVlc3RMb2dMaXN0UGFyYW1zO1xuXG4gICAgY29uc3QgeyBxYiwgb25TdWJzZXQ6IF8gfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuXG4gICAgaWYgKHBhcmFtcy5pZCkge1xuICAgICAgcWIud2hlcmVJbihcInJlcXVlc3RfbG9ncy5pZFwiLCBhc0FycmF5KHBhcmFtcy5pZCkpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBwYXJhbXMudG9rZW5fbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWVfaXNfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnByb2plY3RfbmFtZV9pc19ub3RfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbCk7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMucHJvamVjdF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5wcm9qZWN0X25hbWVcIiwgcGFyYW1zLnByb2plY3RfbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5tb2RlbF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsIHBhcmFtcy5tb2RlbF9uYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJpZFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLmlkXCIsIE51bWJlcihwYXJhbXMua2V5d29yZCkpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInRva2VuX25hbWVcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy50b2tlbl9uYW1lXCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInVzZXJfcHJvbXB0XCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudXNlcl9wcm9tcHRcIiwgXCJsaWtlXCIsIGAlJHtwYXJhbXMua2V5d29yZH0lYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLnVua25vd25TZWFyY2hGaWVsZFwiKShwYXJhbXMuc2VhcmNoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gb3JkZXJCeVxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgLy8gZGVmYXVsdCBvcmRlckJ5XG4gICAgICBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwiaWQtZGVzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgXCJkZXNjXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhoYXVzdGl2ZShwYXJhbXMub3JkZXJCeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoe1xuICAgICAgQTogKHJvdykgPT4gbm9ybWFsaXplTGVnYWN5QW50aHJvcGljUm93KHJvdyksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXMsXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgc2F2ZShzcGE6IFJlcXVlc3RMb2dTYXZlUGFyYW1zW10pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHJlZ2lzdGVyXG4gICAgc3BhLmZvckVhY2goKHNwKSA9PiB7XG4gICAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCBzcCk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuXG4gICAgICByZXR1cm4gaWRzO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJ1biBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgY3JlYXRlUnVuKHBhcmFtczoge1xuICAgIHVzZXJfcHJvbXB0OiBzdHJpbmc7XG4gICAgc3lzdGVtX3Byb21wdD86IHN0cmluZyB8IG51bGw7XG4gICAgbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgZWZmb3J0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBwcm9qZWN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGhpc3Rvcnk/OiB1bmtub3duO1xuICB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dzXCIsIHtcbiAgICAgIHVzZXJfcHJvbXB0OiBwYXJhbXMudXNlcl9wcm9tcHQsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBwYXJhbXMuc3lzdGVtX3Byb21wdCA/PyBudWxsLFxuICAgICAgbW9kZWxfbmFtZTogcGFyYW1zLm1vZGVsX25hbWUgPz8gbnVsbCxcbiAgICAgIGVmZm9ydDogcGFyYW1zLmVmZm9ydCA/PyBudWxsLFxuICAgICAgcHJvamVjdF9uYW1lOiBwYXJhbXMucHJvamVjdF9uYW1lID8/IG51bGwsXG4gICAgICBzdGF0dXM6IFwicnVubmluZ1wiLFxuICAgICAgcmVzcG9uc2U6IFwiXCIsXG4gICAgICBpbnB1dF90b2tlbnM6IDAsXG4gICAgICBvdXRwdXRfdG9rZW5zOiAwLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IDAsXG4gICAgICBkdXJhdGlvbl9tczogMCxcbiAgICAgIHRvb2xfY2FsbF9jb3VudDogMCxcbiAgICAgIC4uLihwYXJhbXMuaGlzdG9yeSAhPT0gdW5kZWZpbmVkID8geyBoaXN0b3J5OiBwYXJhbXMuaGlzdG9yeSBhcyB7IHR5cGU6IHN0cmluZyB9W10gfSA6IHt9KSxcbiAgICB9KTtcbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcInJlcXVlc3RfbG9nc1wiKTtcbiAgICAgIHJldHVybiBpZHNbMF0hO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQ6IG51bWJlciwgc3RlcDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiLCB7IHJlcXVlc3RfbG9nX2lkOiByZXF1ZXN0TG9nSWQsIC4uLnN0ZXAgfSk7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKTtcbiAgICAgIGlmIChzdGVwLnR5cGUgPT09IFwidG9vbF9jYWxsXCIpIHtcbiAgICAgICAgYXdhaXQgdHJ4LmZyb20oXCJyZXF1ZXN0X2xvZ3NcIikud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpLmluY3JlbWVudChcInRvb2xfY2FsbF9jb3VudFwiLCAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZHNbMF0hO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoUnVuKFxuICAgIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICAgIHBhcmFtczoge1xuICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICByZXNwb25zZT86IHN0cmluZztcbiAgICAgIHRva2VuX25hbWU/OiBzdHJpbmc7XG4gICAgICBpbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgICBvdXRwdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfcmVhZF90b2tlbnM/OiBudW1iZXI7XG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM/OiBudW1iZXI7XG4gICAgICBkdXJhdGlvbl9tcz86IG51bWJlcjtcbiAgICAgIGhpc3Rvcnk/OiB1bmtub3duO1xuICAgICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAgIHRvb2xfY2FsbF9jb3VudD86IG51bWJlcjtcbiAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocGFyYW1zLnN0YXR1cyA9PT0gXCJzdWNjZWVkZWRcIiAmJiAhcGFyYW1zLnRva2VuX25hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRva2VuTmFtZSBpcyByZXF1aXJlZCBmb3Igc3VjY2VlZGVkIHJ1bnNcIik7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGlkOiByZXF1ZXN0TG9nSWQsIHN0YXR1czogcGFyYW1zLnN0YXR1cyB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IFtcbiAgICAgIFwicmVzcG9uc2VcIixcbiAgICAgIFwidG9rZW5fbmFtZVwiLFxuICAgICAgXCJpbnB1dF90b2tlbnNcIixcbiAgICAgIFwib3V0cHV0X3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgIFwiZHVyYXRpb25fbXNcIixcbiAgICAgIFwiZXJyb3JfbWVzc2FnZVwiLFxuICAgICAgXCJ0b29sX2NhbGxfY291bnRcIixcbiAgICBdIGFzIGNvbnN0O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGZpZWxkcykge1xuICAgICAgaWYgKHBhcmFtc1trZXldICE9PSB1bmRlZmluZWQpIHVwZGF0ZVtrZXldID0gcGFyYW1zW2tleV07XG4gICAgfVxuICAgIGlmIChwYXJhbXMuaGlzdG9yeSAhPT0gdW5kZWZpbmVkKSB1cGRhdGUuaGlzdG9yeSA9IHBhcmFtcy5oaXN0b3J5O1xuXG4gICAgaWYgKHBhcmFtcy5pbnB1dF90b2tlbnMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMub3V0cHV0X3Rva2VucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJyXCIpO1xuICAgICAgY29uc3QgW3Jvd10gPSBhd2FpdCBkYihcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgICAuc2VsZWN0KFwibW9kZWxfbmFtZVwiKVxuICAgICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAgIC5saW1pdCgxKTtcbiAgICAgIGlmIChyb3c/Lm1vZGVsX25hbWUpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBjYW5vbmljYWxNb2RlbE5hbWUocm93Lm1vZGVsX25hbWUpO1xuICAgICAgICBjb25zdCB1c2FnZSA9IG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qoe1xuICAgICAgICAgIHRva2VuX25hbWU6IHBhcmFtcy50b2tlbl9uYW1lLFxuICAgICAgICAgIG1vZGVsX25hbWU6IHJvdy5tb2RlbF9uYW1lLFxuICAgICAgICAgIGlucHV0X3Rva2VuczogcGFyYW1zLmlucHV0X3Rva2VucyxcbiAgICAgICAgICBvdXRwdXRfdG9rZW5zOiBwYXJhbXMub3V0cHV0X3Rva2VucyxcbiAgICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogcGFyYW1zLmNhY2hlX3JlYWRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBwYXJhbXMuY2FjaGVfY3JlYXRpb25fdG9rZW5zID8/IDAsXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUuY29zdF91c2QgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QobW9kZWwsIHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMsXG4gICAgICAgICAgfSkgKiAxXzAwMF8wMDAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCB1cGRhdGUpO1xuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBhZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkOiBudW1iZXIpOiBQcm9taXNlPHtcbiAgICBpbnB1dF90b2tlbnM6IG51bWJlcjtcbiAgICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gICAgY2FjaGVfcmVhZF90b2tlbnM6IG51bWJlcjtcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IG51bWJlcjtcbiAgICBkdXJhdGlvbl9tczogbnVtYmVyO1xuICB9PiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IGRiKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKVxuICAgICAgLnN1bSh7XG4gICAgICAgIGlucHV0X3Rva2VuczogXCJpbnB1dF90b2tlbnNcIixcbiAgICAgICAgb3V0cHV0X3Rva2VuczogXCJvdXRwdXRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgICAgZHVyYXRpb25fbXM6IFwiZHVyYXRpb25fbXNcIixcbiAgICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dF90b2tlbnM6IE51bWJlcihyb3c/LmlucHV0X3Rva2VucyA/PyAwKSxcbiAgICAgIG91dHB1dF90b2tlbnM6IE51bWJlcihyb3c/Lm91dHB1dF90b2tlbnMgPz8gMCksXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogTnVtYmVyKHJvdz8uY2FjaGVfcmVhZF90b2tlbnMgPz8gMCksXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IE51bWJlcihyb3c/LmNhY2hlX2NyZWF0aW9uX3Rva2VucyA/PyAwKSxcbiAgICAgIGR1cmF0aW9uX21zOiBOdW1iZXIocm93Py5kdXJhdGlvbl9tcyA/PyAwKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmluZFN0YWxlUnVubmluZ0lkcyh0aHJlc2hvbGRNczogbnVtYmVyLCBsaW1pdDogbnVtYmVyID0gMTApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwiclwiKTtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gdGhyZXNob2xkTXMpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkYihcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdChcImlkXCIpXG4gICAgICAud2hlcmUoXCJzdGF0dXNcIiwgXCJydW5uaW5nXCIpXG4gICAgICAud2hlcmUoXCJjcmVhdGVkX2F0XCIsIFwiPFwiLCB0aHJlc2hvbGQpXG4gICAgICAubGltaXQobGltaXQpO1xuICAgIHJldHVybiByb3dzLm1hcCgocjogeyBpZDogbnVtYmVyIH0pID0+IHIuaWQpO1xuICB9XG5cbiAgYXN5bmMgZ2V0TmV4dFN0ZXBJbmRleChyZXF1ZXN0TG9nSWQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IGRiKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC5tYXgoXCJzdGVwX2luZGV4IGFzIG1heFN0ZXBcIik7XG4gICAgcmV0dXJuICgocm93IGFzIHsgbWF4U3RlcDogbnVtYmVyIHwgbnVsbCB9KT8ubWF4U3RlcCA/PyAtMSkgKyAxO1xuICB9XG5cbiAgYXN5bmMgY29tcGxldGVUb29sQ2FsbChcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICB0b29sQ2FsbElkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiB7IHRvb2xfcmVzdWx0Pzogc3RyaW5nOyB0b29sX2R1cmF0aW9uX21zPzogbnVtYmVyOyBlcnJvcj86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdHJ4XG4gICAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgICAud2hlcmUoXCJ0b29sX2NhbGxfaWRcIiwgdG9vbENhbGxJZClcbiAgICAgICAgLndoZXJlKFwidHlwZVwiLCBcInRvb2xfY2FsbFwiKVxuICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICAuLi4ocGFyYW1zLnRvb2xfcmVzdWx0ICE9PSB1bmRlZmluZWQgPyB7IHRvb2xfcmVzdWx0OiBwYXJhbXMudG9vbF9yZXN1bHQgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ocGFyYW1zLnRvb2xfZHVyYXRpb25fbXMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IHRvb2xfZHVyYXRpb25fbXM6IHBhcmFtcy50b29sX2R1cmF0aW9uX21zIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLihwYXJhbXMuZXJyb3IgIT09IHVuZGVmaW5lZCA/IHsgZXJyb3I6IHBhcmFtcy5lcnJvciB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU29uYW11IGZpbmRNYW5564qUIHN1YnNldCDsoITssrQg7Lus65+8KHRleHQg7Y+s7ZWoKeydhCDtjpjsuZjtlbTshJwgYWdncmVnYXRl7JeUIOuEiOustCDrrLTqsbDsm4Ag4oaSIHJhdyBzdW0g7IKs7JqpLlxuICBhc3luYyB0b3RhbENvc3QocGFyYW1zOiB7IHRva2VuX25hbWU/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBxYiA9IHRoaXMuZ2V0REIoXCJyXCIpKFwicmVxdWVzdF9sb2dzXCIpO1xuICAgIGlmIChwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJ0b2tlbl9uYW1lXCIsIHBhcmFtcy50b2tlbl9uYW1lKTtcbiAgICB9XG4gICAgLy8g6riw7KG0IGNvc3RfdXNkIOyXkOuKlCDqs7zqsbAgQW50aHJvcGljIGNhY2hlIOqzhOyCsCDrsoTqt7jroZwg7J2M7IiY6rCAIOyggOyepeuQnCByb3cg6rCAIOyeiOydhCDsiJgg7J6I64ukLlxuICAgIC8vIO2ZlOuptCDsp5Hqs4TripQg7KCA7J6l6rCSIHN1bSDsnbQg7JWE64uI6528IO2YhOyerCDqs4TsgrDsi53snLzroZwgdXNhZ2Ug66W8IOyerOqzhOyCsO2VtCDqs7zqsbAg66Gc6re464+EIOymieyLnCDrs7TsoJXtlZzri6QuXG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCBxYi5zZWxlY3QoXG4gICAgICBcIm1vZGVsX25hbWVcIixcbiAgICAgIFwiaW5wdXRfdG9rZW5zXCIsXG4gICAgICBcIm91dHB1dF90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgICBcImNvc3RfdXNkXCIsXG4gICAgKSkgYXMgQXJyYXk8e1xuICAgICAgbW9kZWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICAgICAgb3V0cHV0X3Rva2VuczogbnVtYmVyO1xuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IG51bWJlcjtcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICAgICAgY29zdF91c2Q6IG51bWJlciB8IG51bGw7XG4gICAgfT47XG5cbiAgICByZXR1cm4gcm93cy5yZWR1Y2UoKHN1bSwgcm93KSA9PiB7XG4gICAgICBjb25zdCB1c2FnZSA9IG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qocm93KTtcbiAgICAgIGlmICghdXNhZ2UubW9kZWwpIHJldHVybiBzdW0gKyBNYXRoLm1heChOdW1iZXIocm93LmNvc3RfdXNkID8/IDApLCAwKSAvIE1JQ1JPX1VTRDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHN1bSArXG4gICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QodXNhZ2UubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGFzeW5jIGRpc3RpbmN0UHJvamVjdE5hbWVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5kaXN0aW5jdChcInByb2plY3RfbmFtZVwiKVxuICAgICAgLndoZXJlKFwicHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbClcbiAgICAgIC5vcmRlckJ5KFwicHJvamVjdF9uYW1lXCIsIFwiYXNjXCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgcHJvamVjdF9uYW1lOiBcInByb2plY3RfbmFtZVwiLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyKSA9PiByLnByb2plY3RfbmFtZSEpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGRlbChpZHM6IG51bWJlcltdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgYXdhaXQgdHJ4XG4gICAgICAgIC50YWJsZShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAgIC53aGVyZUluKFwicmVxdWVzdF9sb2dfc3RlcHMucmVxdWVzdF9sb2dfaWRcIiwgaWRzKVxuICAgICAgICAuZGVsZXRlKCk7XG4gICAgICByZXR1cm4gdHJ4LnRhYmxlKFwicmVxdWVzdF9sb2dzXCIpLndoZXJlSW4oXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nTW9kZWwgPSBuZXcgUmVxdWVzdExvZ01vZGVsQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFpQkEsTUFBYSxZQUFZO0FBWXpCLFNBQVMsb0JBQW9CLEtBQXFFO0FBQ2hHLFFBQ0UsSUFBSSxZQUFZLFdBQVcsYUFBYSxLQUFLLFFBQzdDLElBQUksWUFBWSxXQUFXLFVBQVUsS0FBSyxRQUMxQyxJQUFJLFlBQVksV0FBVyxvQkFBb0IsS0FBSzs7QUFJeEQsU0FBUyxtQkFBbUIsV0FBMkI7QUFDckQsUUFBTyxVQUFVLFNBQVMsSUFBSSxHQUFHLFVBQVUsTUFBTSxJQUFJLENBQUMsS0FBSyxHQUFJOztBQUdqRSxTQUFTLHVCQUF1QixLQU05QjtDQUNBLE1BQU0sWUFBWSxPQUFPLElBQUkscUJBQXFCLEVBQUU7Q0FDcEQsTUFBTSxnQkFBZ0IsT0FBTyxJQUFJLHlCQUF5QixFQUFFO0NBQzVELE1BQU0sY0FBYyxPQUFPLElBQUksZ0JBQWdCLEVBQUU7Q0FDakQsTUFBTSw0QkFDSixvQkFBb0IsSUFBSSxJQUFJLGNBQWMsWUFBWTtBQUN4RCxRQUFPO0VBQ0wsT0FBTyxJQUFJLGFBQWEsbUJBQW1CLElBQUksV0FBVyxHQUFHO0VBQzdELGFBQWEsNEJBQTRCLGNBQWMsWUFBWSxnQkFBZ0I7RUFDbkYsY0FBYyxPQUFPLElBQUksaUJBQWlCLEVBQUU7RUFDNUMsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMzQjs7QUFHSCxTQUFTLDRCQUEwRCxLQUFXO0NBQzVFLE1BQU0s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
|
|
@@ -4,6 +4,7 @@ import { TokenModel } from "./application/token/token.model.js";
|
|
|
4
4
|
import { QgridFrame } from "./application/qgrid/qgrid.frame.js";
|
|
5
5
|
import { TokenSubscriber } from "./application/qgrid/token-subscriber.js";
|
|
6
6
|
import { ensureTokensTrigger } from "./application/qgrid/token-trigger-setup.js";
|
|
7
|
+
import { AnthropicDispatcher } from "./utils/providers/anthropic/anthropic-dispatcher.js";
|
|
7
8
|
import { OpenAIDispatcher } from "./utils/providers/openai/openai-dispatcher.js";
|
|
8
9
|
import { getConsoleSink, getLogger } from "@logtape/logtape";
|
|
9
10
|
import { CachePresets, defineConfig } from "sonamu";
|
|
@@ -160,7 +161,14 @@ var sonamu_config_default = defineConfig({
|
|
|
160
161
|
} catch (e) {
|
|
161
162
|
log.warn(`openai dispatcher failed: ${e.message}`);
|
|
162
163
|
}
|
|
163
|
-
|
|
164
|
+
try {
|
|
165
|
+
const anthropicDispatcher = new AnthropicDispatcher();
|
|
166
|
+
await anthropicDispatcher.start();
|
|
167
|
+
QgridDispatcher.anthropicDispatcher = anthropicDispatcher;
|
|
168
|
+
} catch (e) {
|
|
169
|
+
log.warn(`anthropic dispatcher failed: ${e.message}`);
|
|
170
|
+
}
|
|
171
|
+
const anthropicCount = QgridDispatcher.anthropicDispatcher?.tokenCount ?? 0;
|
|
164
172
|
const openaiReady = QgridDispatcher.openaiDispatcher?.readyWorkerCount ?? 0;
|
|
165
173
|
const openaiTotal = QgridDispatcher.openaiDispatcher?.workerCount ?? 0;
|
|
166
174
|
log.info(`listening on http://${host}:${port}`);
|
|
@@ -171,6 +179,7 @@ var sonamu_config_default = defineConfig({
|
|
|
171
179
|
onShutdown: async () => {
|
|
172
180
|
const log = getLogger(["qgrid", "startup"]);
|
|
173
181
|
if (QgridDispatcher.openaiDispatcher) await QgridDispatcher.openaiDispatcher.stop();
|
|
182
|
+
if (QgridDispatcher.anthropicDispatcher) await QgridDispatcher.anthropicDispatcher.stop();
|
|
174
183
|
if (QgridDispatcher.subscriber) await QgridDispatcher.subscriber.stop();
|
|
175
184
|
log.info("graceful shutdown");
|
|
176
185
|
},
|
|
@@ -187,4 +196,4 @@ var sonamu_config_default = defineConfig({
|
|
|
187
196
|
//#endregion
|
|
188
197
|
export { sonamu_config_default as default };
|
|
189
198
|
|
|
190
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCB7IENhY2hlUHJlc2V0cywgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInNvbmFtdVwiO1xuaW1wb3J0IHsgZHJpdmVycyBhcyBjYWNoZURyaXZlcnMsIHN0b3JlIH0gZnJvbSBcInNvbmFtdS9jYWNoZVwiO1xuXG5pbXBvcnQgeyBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBRZ3JpZEZyYW1lIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZnJhbWVcIjtcbmltcG9ydCB7IFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGVuc3VyZVRva2Vuc1RyaWdnZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi10cmlnZ2VyLXNldHVwXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5cbmRvdGVudi5jb25maWcoeyBwYXRoOiBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLi8uZW52XCIpIH0pO1xuXG5jb25zdCBob3N0ID0gcHJvY2Vzcy5lbnYuSE9TVCA/PyBcImxvY2FsaG9zdFwiO1xuY29uc3QgcG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUID8/IDQ0OTAwKTtcblxuY29uc3QgY29ubkNvbmZpZyA9IHtcbiAgaG9zdDogcHJvY2Vzcy5lbnYuUUdSSURfREJfSE9TVCA/PyBcImxvY2FsaG9zdFwiLFxuICBwb3J0OiBOdW1iZXIocHJvY2Vzcy5lbnYuUUdSSURfREJfUE9SVCA/PyA1NDMyKSxcbiAgdXNlcjogcHJvY2Vzcy5lbnYuUUdSSURfREJfVVNFUiA/PyBcInBvc3RncmVzXCIsXG4gIHBhc3N3b3JkOiBwcm9jZXNzLmVudi5RR1JJRF9EQl9QQVNTV09SRCA/PyBcInBvc3RncmVzXCIsXG4gIGRhdGFiYXNlOiBwcm9jZXNzLmVudi5RR1JJRF9EQl9OQU1FID8/IFwicWdyaWRcIixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHByb2plY3ROYW1lOiBwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgPz8gXCJRZ3JpZFwiLFxuICBkYXRhYmFzZToge1xuICAgIG5hbWU6IFwicWdyaWRcIixcbiAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi5jb25uQ29uZmlnLFxuICAgICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgICAgIGtlZXBBbGl2ZUluaXRpYWxEZWxheU1pbGxpczogMTAwMDAsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZW52aXJvbm1lbnRzOiB7XG4gICAgICBmaXh0dXJlOiB7XG4gICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICAuLi5jb25uQ29uZmlnLFxuICAgICAgICAgIGRhdGFiYXNlOiBwcm9jZXNzLmVudi5RR1JJRF9EQl9OQU1FLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBhcGk6IHtcbiAgICBkaXI6IFwiYXBpXCIsXG4gICAgdGltZXpvbmU6IFwiQXNpYS9TZW91bFwiLFxuICAgIHJvdXRlOiB7XG4gICAgICBwcmVmaXg6IFwiL2FwaVwiLFxuICAgIH0sXG4gIH0sXG4gIGkxOG46IHtcbiAgICBkZWZhdWx0TG9jYWxlOiBcImtvXCIsXG4gICAgc3VwcG9ydGVkTG9jYWxlczogW1wia29cIiwgXCJlblwiXSxcbiAgfSxcbiAgc3luYzoge1xuICAgIHRhcmdldHM6IFtcIndlYlwiXSxcbiAgfSxcbiAgdGVzdDoge1xuICAgIHBhcmFsbGVsOiB0cnVlLFxuICAgIG1heFdvcmtlcnM6IDQsXG4gICAgZGV2UnVubmVyOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgfSxcbiAgbG9nZ2luZzoge1xuICAgIHNpbmtzOiB7XG4gICAgICBjb25zb2xlOiBnZXRDb25zb2xlU2luayh7XG4gICAgICAgIGZvcm1hdHRlcjogZ2V0UHJldHR5Rm9ybWF0dGVyKHtcbiAgICAgICAgICB0aW1lc3RhbXA6IFwidGltZVwiLFxuICAgICAgICAgIGNhdGVnb3J5V2lkdGg6IDIwLFxuICAgICAgICAgIGNhdGVnb3J5VHJ1bmNhdGU6IFwibWlkZGxlXCIsXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgfSxcbiAgICBsb2dnZXJzOiBbXG4gICAgICAvLyBxZ3JpZCDroZzqt7ggKOyalOyyrSDrtoTrsLAsIG9hdXRoL3VzYWdlIEFQSSlcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInFncmlkXCJdLCBzaW5rczogW1wiY29uc29sZVwiXSwgbG93ZXN0TGV2ZWw6IFwiaW5mb1wiIH0sXG4gICAgICAvLyBzb25hbXUg66Gc6re464qUIHdhcm5pbmcg7J207IOB66eMXG4gICAgICB7IGNhdGVnb3J5OiBbXCJzb25hbXVcIl0sIHNpbmtzOiBbXCJjb25zb2xlXCJdLCBsb3dlc3RMZXZlbDogXCJ3YXJuaW5nXCIgfSxcbiAgICAgIC8vIGZhc3RpZnkg66Gc6re4IOywqOuLqFxuICAgICAgeyBjYXRlZ29yeTogW1wiZmFzdGlmeVwiXSwgc2lua3M6IFtdLCBsb3dlc3RMZXZlbDogXCJmYXRhbFwiIH0sXG4gICAgXSxcbiAgfSxcbiAgc2VydmVyOiB7XG4gICAgbGlzdGVuOiB7IHBvcnQsIGhvc3QgfSxcbiAgICBwbHVnaW5zOiB7XG4gICAgICBmb3JtYm9keTogdHJ1ZSxcbiAgICAgIHFzOiB0cnVlLFxuICAgICAgc3NlOiB0cnVlLFxuICAgICAgbXVsdGlwYXJ0OiB7IGxpbWl0czogeyBmaWxlU2l6ZTogMTAyNCAqIDEwMjQgKiAzMCB9IH0sXG4gICAgICBzdGF0aWM6IHtcbiAgICAgICAgcm9vdDogcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLy4uL1wiLCBcInB1YmxpY1wiKSxcbiAgICAgICAgcHJlZml4OiBcIi9hcGkvcHVibGljXCIsXG4gICAgICB9LFxuICAgICAgY3VzdG9tOiAoc2VydmVyKSA9PiB7XG4gICAgICAgIC8vIE9BdXRoIOy9nOuwsSDigJQgQW50aHJvcGlj7J20IC9jYWxsYmFja+ycvOuhnCDrpqzri6TsnbTroIntirhcbiAgICAgICAgc2VydmVyLmdldChcIi9jYWxsYmFja1wiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGNvZGUsIHN0YXRlIH0gPSByZXF1ZXN0LnF1ZXJ5IGFzIHsgY29kZT86IHN0cmluZzsgc3RhdGU/OiBzdHJpbmcgfTtcbiAgICAgICAgICBpZiAoIWNvZGUgfHwgIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1taXNzaW5nX3BhcmFtc1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IFFncmlkRnJhbWUuaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlLCBzdGF0ZSwgcmVwbHkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcbiAgICAgICAgICAgICAgYC8/b2F1dGg9ZXJyb3ImcmVhc29uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KChlIGFzIEVycm9yKS5tZXNzYWdlKX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE9wZW5BSSBPQXV0aCDripQgY29kZXggYXBwLXNlcnZlciDqsIAg7J6Q7LK0IGNhbGxiYWNrIOyEnOuyhOulvCDsmKzrprxcbiAgICAgICAgLy8gaGFuZGxlT3BlbkFJQ2FsbGJhY2sg67aI7ZWE7JqUIOKAlCBvYXV0aENvbXBsZXRlT3BlbkFJIEFQSSDroZwg7JmE66OMIO2ZleyduFxuICAgICAgfSxcbiAgICB9LFxuICAgIGFwaUNvbmZpZzoge1xuICAgICAgY29udGV4dFByb3ZpZGVyOiAoZGVmYXVsdENvbnRleHQsIHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5kZWZhdWx0Q29udGV4dCxcbiAgICAgICAgICBpcDogcmVxdWVzdC5pcCxcbiAgICAgICAgICBib2R5OiByZXF1ZXN0LmJvZHksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgZ3VhcmRIYW5kbGVyOiAoKSA9PiB7fSxcbiAgICAgIGNhY2hlQ29udHJvbEhhbmRsZXI6IChyZXEpID0+IHtcbiAgICAgICAgc3dpdGNoIChyZXEudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJhc3NldHNcIjpcbiAgICAgICAgICAgIC8vIEhhc2gg7Y+s7ZWo65CcIO2MjOydvDog7JiB6rWsIOy6kOyLnFxuICAgICAgICAgICAgaWYgKHJlcS5wYXRoLm1hdGNoKC8tW2EtZjAtOV0rXFwuLykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5pbW11dGFibGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmxvbmdMaXZlZDtcblxuICAgICAgICAgIGNhc2UgXCJhcGlcIjpcbiAgICAgICAgICAgIC8vIEdFVCDsmpTssq3rp4wg7LqQ7IuxIOqzoOugpFxuICAgICAgICAgICAgaWYgKHJlcS5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICAgICAgLy8g7Yq57KCVIOqyveuhnOuKlCDsp6fsnYAg7LqQ7IucXG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS9zdGF0aWMtZGF0YVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc2hvcnRMaXZlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVxLnBhdGguc3RhcnRzV2l0aChcIi9hcGkvdGVybXNcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm1lZGl1bUxpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDquLDrs7g6IOy6kOyLnCDsl4bsnYxcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubm9DYWNoZTtcblxuICAgICAgICAgIGNhc2UgXCJzc3JcIjpcbiAgICAgICAgICAgIC8vIFNTUiDtjpjsnbTsp4A6IDEw7LSIIOy6kOyLnFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zc3I7XG5cbiAgICAgICAgICBjYXNlIFwiY3NyXCI6XG4gICAgICAgICAgICAvLyBDU1IgZmFsbGJhY2sgKGluZGV4Lmh0bWwpOiAx67aEIOy6kOyLnFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgY2FjaGU6IHtcbiAgICAgIGRlZmF1bHQ6IFwibWFpblwiLFxuICAgICAgc3RvcmVzOiB7XG4gICAgICAgIG1haW46IHN0b3JlKCkudXNlTDFMYXllcihjYWNoZURyaXZlcnMubWVtb3J5KHsgbWF4U2l6ZTogXCI1MG1iXCIgfSkpLFxuICAgICAgfSxcbiAgICAgIHR0bDogXCI1bVwiLFxuICAgICAgcHJlZml4OiBcIlwiLFxuICAgIH0sXG4gICAgbGlmZWN5Y2xlOiB7XG4gICAgICBvblN0YXJ0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qga25leCA9IFRva2VuTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgICAgICAgIGNvbnN0IG1pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLi9zcmMvbWlncmF0aW9uc1wiKTtcbiAgICAgICAgICBjb25zdCBbYmF0Y2gsIG1pZ3JhdGlvbnNdID0gYXdhaXQga25leC5taWdyYXRlLmxhdGVzdCh7IGRpcmVjdG9yeTogbWlncmF0aW9uc0RpciB9KTtcbiAgICAgICAgICBpZiAobWlncmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2cuaW5mbyhgbWlncmF0aW9uOiAke21pZ3JhdGlvbnMubGVuZ3RofSBhcHBsaWVkIChiYXRjaCAke2JhdGNofSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2cud2FybihgbWlncmF0aW9uIHNraXBwZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJpZ2dlclJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVUb2tlbnNUcmlnZ2VyKGNvbm5Db25maWcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlclJlYWR5ID0gZmFsc2U7XG4gICAgICAgICAgbG9nLndhcm4oYHRyaWdnZXIgc2V0dXAgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IG5ldyBUb2tlblN1YnNjcmliZXIoY29ubkNvbmZpZywgUWdyaWREaXNwYXRjaGVyKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBhd2FpdCBzdWJzY3JpYmVyLnN0YXJ0KCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvcGVuYWlEaXNwYXRjaGVyID0gbmV3IE9wZW5BSURpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIgPSBvcGVuYWlEaXNwYXRjaGVyO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLndhcm4oYG9wZW5haSBkaXNwYXRjaGVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFsbFRva2VucyA9IFsuLi5RZ3JpZERpc3BhdGNoZXIudG9rZW5zLnZhbHVlcygpXTtcbiAgICAgICAgY29uc3QgYW50aHJvcGljQ291bnQgPSBhbGxUb2tlbnMuZmlsdGVyKCh0KSA9PiB0LnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG9wZW5haVJlYWR5ID0gUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LnJlYWR5V29ya2VyQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3Qgb3BlbmFpVG90YWwgPSBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ud29ya2VyQ291bnQgPz8gMDtcblxuICAgICAgICBsb2cuaW5mbyhgbGlzdGVuaW5nIG9uIGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKTtcbiAgICAgICAgbG9nLmluZm8oYGFudGhyb3BpYzogJHthbnRocm9waWNDb3VudH0gdG9rZW5zIHJlYWR5YCk7XG4gICAgICAgIGxvZy5pbmZvKGBvcGVuYWk6ICR7b3BlbmFpUmVhZHl9LyR7b3BlbmFpVG90YWx9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgc3Vic2NyaWJlcjogJHtzdGFydGVkID8gXCJMSVNURU4gYWN0aXZlXCIgOiBcImRlZ3JhZGVkXCJ9JHt0cmlnZ2VyUmVhZHkgPyBcIlwiIDogXCIsIHRyaWdnZXIgZmFpbGVkXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvblNodXRkb3duOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5pbmZvKFwiZ3JhY2VmdWwgc2h1dGRvd25cIik7XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKGVycm9yLCBfcmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgZ2V0TG9nZ2VyKFtcInFncmlkXCJdKS5lcnJvcihgJHtlcnJvcn1gKTtcbiAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCkuc2VuZCh7XG4gICAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQWdCQSxPQUFPLE9B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
|
|
199
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCB7IENhY2hlUHJlc2V0cywgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInNvbmFtdVwiO1xuaW1wb3J0IHsgZHJpdmVycyBhcyBjYWNoZURyaXZlcnMsIHN0b3JlIH0gZnJvbSBcInNvbmFtdS9jYWNoZVwiO1xuXG5pbXBvcnQgeyBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBRZ3JpZEZyYW1lIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZnJhbWVcIjtcbmltcG9ydCB7IFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGVuc3VyZVRva2Vuc1RyaWdnZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi10cmlnZ2VyLXNldHVwXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IEFudGhyb3BpY0Rpc3BhdGNoZXIgfSBmcm9tIFwiLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBPcGVuQUlEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuXG5kb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi4vLmVudlwiKSB9KTtcblxuY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIjtcbmNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCA/PyA0NDkwMCk7XG5cbmNvbnN0IGNvbm5Db25maWcgPSB7XG4gIGhvc3Q6IHByb2Nlc3MuZW52LlFHUklEX0RCX0hPU1QgPz8gXCJsb2NhbGhvc3RcIixcbiAgcG9ydDogTnVtYmVyKHByb2Nlc3MuZW52LlFHUklEX0RCX1BPUlQgPz8gNTQzMiksXG4gIHVzZXI6IHByb2Nlc3MuZW52LlFHUklEX0RCX1VTRVIgPz8gXCJwb3N0Z3Jlc1wiLFxuICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuUUdSSURfREJfUEFTU1dPUkQgPz8gXCJwb3N0Z3Jlc1wiLFxuICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuUUdSSURfREJfTkFNRSA/PyBcInFncmlkXCIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBwcm9qZWN0TmFtZTogcHJvY2Vzcy5lbnYuUFJPSkVDVF9OQU1FID8/IFwiUWdyaWRcIixcbiAgZGF0YWJhc2U6IHtcbiAgICBuYW1lOiBcInFncmlkXCIsXG4gICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgLi4uY29ubkNvbmZpZyxcbiAgICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXlNaWxsaXM6IDEwMDAwLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGVudmlyb25tZW50czoge1xuICAgICAgZml4dHVyZToge1xuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgLi4uY29ubkNvbmZpZyxcbiAgICAgICAgICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuUUdSSURfREJfTkFNRSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgZGlyOiBcImFwaVwiLFxuICAgIHRpbWV6b25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICByb3V0ZToge1xuICAgICAgcHJlZml4OiBcIi9hcGlcIixcbiAgICB9LFxuICB9LFxuICBpMThuOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJrb1wiLFxuICAgIHN1cHBvcnRlZExvY2FsZXM6IFtcImtvXCIsIFwiZW5cIl0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBbXCJ3ZWJcIl0sXG4gIH0sXG4gIHRlc3Q6IHtcbiAgICBwYXJhbGxlbDogdHJ1ZSxcbiAgICBtYXhXb3JrZXJzOiA0LFxuICAgIGRldlJ1bm5lcjogeyBlbmFibGVkOiB0cnVlIH0sXG4gIH0sXG4gIGxvZ2dpbmc6IHtcbiAgICBzaW5rczoge1xuICAgICAgY29uc29sZTogZ2V0Q29uc29sZVNpbmsoe1xuICAgICAgICBmb3JtYXR0ZXI6IGdldFByZXR0eUZvcm1hdHRlcih7XG4gICAgICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgICAgICBjYXRlZ29yeVdpZHRoOiAyMCxcbiAgICAgICAgICBjYXRlZ29yeVRydW5jYXRlOiBcIm1pZGRsZVwiLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgbG9nZ2VyczogW1xuICAgICAgLy8gcWdyaWQg66Gc6re4ICjsmpTssq0g67aE67CwLCBvYXV0aC91c2FnZSBBUEkpXG4gICAgICB7IGNhdGVnb3J5OiBbXCJxZ3JpZFwiXSwgc2lua3M6IFtcImNvbnNvbGVcIl0sIGxvd2VzdExldmVsOiBcImluZm9cIiB9LFxuICAgICAgLy8gc29uYW11IOuhnOq3uOuKlCB3YXJuaW5nIOydtOyDgeunjFxuICAgICAgeyBjYXRlZ29yeTogW1wic29uYW11XCJdLCBzaW5rczogW1wiY29uc29sZVwiXSwgbG93ZXN0TGV2ZWw6IFwid2FybmluZ1wiIH0sXG4gICAgICAvLyBmYXN0aWZ5IOuhnOq3uCDssKjri6hcbiAgICAgIHsgY2F0ZWdvcnk6IFtcImZhc3RpZnlcIl0sIHNpbmtzOiBbXSwgbG93ZXN0TGV2ZWw6IFwiZmF0YWxcIiB9LFxuICAgIF0sXG4gIH0sXG4gIHNlcnZlcjoge1xuICAgIGxpc3RlbjogeyBwb3J0LCBob3N0IH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgZm9ybWJvZHk6IHRydWUsXG4gICAgICBxczogdHJ1ZSxcbiAgICAgIHNzZTogdHJ1ZSxcbiAgICAgIG11bHRpcGFydDogeyBsaW1pdHM6IHsgZmlsZVNpemU6IDEwMjQgKiAxMDI0ICogMzAgfSB9LFxuICAgICAgc3RhdGljOiB7XG4gICAgICAgIHJvb3Q6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi8uLi9cIiwgXCJwdWJsaWNcIiksXG4gICAgICAgIHByZWZpeDogXCIvYXBpL3B1YmxpY1wiLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbTogKHNlcnZlcikgPT4ge1xuICAgICAgICAvLyBPQXV0aCDsvZzrsLEg4oCUIEFudGhyb3BpY+ydtCAvY2FsbGJhY2vsnLzroZwg66as64uk7J2066CJ7Yq4XG4gICAgICAgIHNlcnZlci5nZXQoXCIvY2FsbGJhY2tcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBzdGF0ZSB9ID0gcmVxdWVzdC5xdWVyeSBhcyB7IGNvZGU/OiBzdHJpbmc7IHN0YXRlPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKCFjb2RlIHx8ICFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249bWlzc2luZ19wYXJhbXNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBRZ3JpZEZyYW1lLmhhbmRsZU9BdXRoQ2FsbGJhY2soY29kZSwgc3RhdGUsIHJlcGx5KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXG4gICAgICAgICAgICAgIGAvP29hdXRoPWVycm9yJnJlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudCgoZSBhcyBFcnJvcikubWVzc2FnZSl9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBPcGVuQUkgT0F1dGgg64qUIGNvZGV4IGFwcC1zZXJ2ZXIg6rCAIOyekOyytCBjYWxsYmFjayDshJzrsoTrpbwg7Jis66a8XG4gICAgICAgIC8vIGhhbmRsZU9wZW5BSUNhbGxiYWNrIOu2iO2VhOyalCDigJQgb2F1dGhDb21wbGV0ZU9wZW5BSSBBUEkg66GcIOyZhOujjCDtmZXsnbhcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhcGlDb25maWc6IHtcbiAgICAgIGNvbnRleHRQcm92aWRlcjogKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVmYXVsdENvbnRleHQsXG4gICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgYm9keTogcmVxdWVzdC5ib2R5LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGd1YXJkSGFuZGxlcjogKCkgPT4ge30sXG4gICAgICBjYWNoZUNvbnRyb2xIYW5kbGVyOiAocmVxKSA9PiB7XG4gICAgICAgIHN3aXRjaCAocmVxLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiYXNzZXRzXCI6XG4gICAgICAgICAgICAvLyBIYXNoIO2PrO2VqOuQnCDtjIzsnbw6IOyYgeq1rCDsupDsi5xcbiAgICAgICAgICAgIGlmIChyZXEucGF0aC5tYXRjaCgvLVthLWYwLTldK1xcLi8pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5sb25nTGl2ZWQ7XG5cbiAgICAgICAgICBjYXNlIFwiYXBpXCI6XG4gICAgICAgICAgICAvLyBHRVQg7JqU7LKt66eMIOy6kOyLsSDqs6DroKRcbiAgICAgICAgICAgIGlmIChyZXEubWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgICAgIC8vIO2KueyglSDqsr3roZzripQg7Ken7J2AIOy6kOyLnFxuICAgICAgICAgICAgICBpZiAocmVxLnBhdGguc3RhcnRzV2l0aChcIi9hcGkvc3RhdGljLWRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3Rlcm1zXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5tZWRpdW1MaXZlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6riw67O4OiDsupDsi5wg7JeG7J2MXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm5vQ2FjaGU7XG5cbiAgICAgICAgICBjYXNlIFwic3NyXCI6XG4gICAgICAgICAgICAvLyBTU1Ig7Y6Y7J207KeAOiAxMOy0iCDsupDsi5xcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc3NyO1xuXG4gICAgICAgICAgY2FzZSBcImNzclwiOlxuICAgICAgICAgICAgLy8gQ1NSIGZhbGxiYWNrIChpbmRleC5odG1sKTogMeu2hCDsupDsi5xcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc2hvcnRMaXZlZDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIGNhY2hlOiB7XG4gICAgICBkZWZhdWx0OiBcIm1haW5cIixcbiAgICAgIHN0b3Jlczoge1xuICAgICAgICBtYWluOiBzdG9yZSgpLnVzZUwxTGF5ZXIoY2FjaGVEcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6IFwiNTBtYlwiIH0pKSxcbiAgICAgIH0sXG4gICAgICB0dGw6IFwiNW1cIixcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICB9LFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25TdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGtuZXggPSBUb2tlbk1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgICBjb25zdCBtaWdyYXRpb25zRGlyID0gcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi4vc3JjL21pZ3JhdGlvbnNcIik7XG4gICAgICAgICAgY29uc3QgW2JhdGNoLCBtaWdyYXRpb25zXSA9IGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QoeyBkaXJlY3Rvcnk6IG1pZ3JhdGlvbnNEaXIgfSk7XG4gICAgICAgICAgaWYgKG1pZ3JhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nLmluZm8oYG1pZ3JhdGlvbjogJHttaWdyYXRpb25zLmxlbmd0aH0gYXBwbGllZCAoYmF0Y2ggJHtiYXRjaH0pYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLndhcm4oYG1pZ3JhdGlvbiBza2lwcGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRyaWdnZXJSZWFkeSA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlVG9rZW5zVHJpZ2dlcihjb25uQ29uZmlnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJSZWFkeSA9IGZhbHNlO1xuICAgICAgICAgIGxvZy53YXJuKGB0cmlnZ2VyIHNldHVwIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXIgPSBuZXcgVG9rZW5TdWJzY3JpYmVyKGNvbm5Db25maWcsIFFncmlkRGlzcGF0Y2hlcik7XG4gICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcblxuICAgICAgICBjb25zdCBzdGFydGVkID0gYXdhaXQgc3Vic2NyaWJlci5zdGFydCgpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3BlbmFpRGlzcGF0Y2hlciA9IG5ldyBPcGVuQUlEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyID0gb3BlbmFpRGlzcGF0Y2hlcjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZy53YXJuKGBvcGVuYWkgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFudGhyb3BpY0Rpc3BhdGNoZXIgPSBuZXcgQW50aHJvcGljRGlzcGF0Y2hlcigpO1xuICAgICAgICAgIGF3YWl0IGFudGhyb3BpY0Rpc3BhdGNoZXIuc3RhcnQoKTtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlciA9IGFudGhyb3BpY0Rpc3BhdGNoZXI7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2cud2FybihgYW50aHJvcGljIGRpc3BhdGNoZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYW50aHJvcGljQ291bnQgPSBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8udG9rZW5Db3VudCA/PyAwO1xuICAgICAgICBjb25zdCBvcGVuYWlSZWFkeSA9IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5yZWFkeVdvcmtlckNvdW50ID8/IDA7XG4gICAgICAgIGNvbnN0IG9wZW5haVRvdGFsID0gUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LndvcmtlckNvdW50ID8/IDA7XG5cbiAgICAgICAgbG9nLmluZm8oYGxpc3RlbmluZyBvbiBodHRwOi8vJHtob3N0fToke3BvcnR9YCk7XG4gICAgICAgIGxvZy5pbmZvKGBhbnRocm9waWM6ICR7YW50aHJvcGljQ291bnR9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhgb3BlbmFpOiAke29wZW5haVJlYWR5fS8ke29wZW5haVRvdGFsfSB0b2tlbnMgcmVhZHlgKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYHN1YnNjcmliZXI6ICR7c3RhcnRlZCA/IFwiTElTVEVOIGFjdGl2ZVwiIDogXCJkZWdyYWRlZFwifSR7dHJpZ2dlclJlYWR5ID8gXCJcIiA6IFwiLCB0cmlnZ2VyIGZhaWxlZFwifWAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25TaHV0ZG93bjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oXCJncmFjZWZ1bCBzaHV0ZG93blwiKTtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZXJyb3IsIF9yZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBnZXRMb2dnZXIoW1wicWdyaWRcIl0pLmVycm9yKGAke2Vycm9yfWApO1xuICAgICAgICByZXBseS5zdGF0dXMoNTAwKS5zZW5kKHtcbiAgICAgICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQWlCQSxPQUFPLE9BQU8sRUFBRSxNQUFNLEtBQUssS0FBSyxPQUFPLEtBQUssU0FBUyxVQUFVLEVBQUUsQ0FBQztBQUVsRSxNQUFNLE9BQU8sUUFBUSxJQUFJLFFBQVE7QUFDakMsTUFBTSxPQUFPLE9BQU8sUUFBUSxJQUFJLFFBQVEsTUFBTTtBQUU5QyxNQUFNLGFBQWE7Q0FDakIsTUFBTSxRQUFRLElBQUksaUJBQWlCO0NBQ25DLE1BQU0sT0FBTyxRQUFRLElBQUksaUJBQWlCLEtBQUs7Q0FDL0MsTUFBTSxRQUFRLElBQUksaUJBQWlCO0NBQ25DLFVBQVUsUUFBUSxJQUFJLHFCQUFxQjtDQUMzQyxVQUFVLFFBQVEsSUFBSSxpQkFBaUI7Q0FDeEM7QUFFRCxJQUFBLHdCQUFlLGFBQWE7Q0FDMUIsYUFBYSxRQUFRLElBQUksZ0JBQWdCO0NBQ3pDLFVBQVU7RUFDUixNQUFNO0VBQ04sZ0JBQWdCLEVBQ2QsWUFBWTtHQUNWLEdBQUc7R0FDSCxXQUFXO0dBQ1gsNkJBQTZCO0dBQzlCLEVBQ0Y7RUFDRCxjQUFjLEVBQ1os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
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import dotenv from "dotenv";
|
|
3
|
-
import { setup } from "sonamu/test";
|
|
4
3
|
//#region src/testing/global.ts
|
|
5
4
|
dotenv.config();
|
|
5
|
+
async function setup() {
|
|
6
|
+
const { setup: sonamuSetup } = await import(new URL("../../node_modules/sonamu/dist/testing/global-setup.js", import.meta.url).href);
|
|
7
|
+
return sonamuSetup();
|
|
8
|
+
}
|
|
6
9
|
//#endregion
|
|
7
10
|
export { setup };
|
|
8
11
|
|
|
9
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2dsb2JhbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcblxuZG90ZW52LmNvbmZpZygpO1xuXG50eXBlIFNvbmFtdUdsb2JhbFNldHVwTW9kdWxlID0ge1xuICBzZXR1cDogKCkgPT4gUHJvbWlzZTwoKCkgPT4gUHJvbWlzZTx2b2lkPikgfCB2b2lkPjtcbn07XG5cbi8vIHNvbmFtdS90ZXN0IOydmCBiYXJyZWwgZXhwb3J0IOuKlCBib290c3RyYXAuanMg66W8IO2VqOq7mCDroZzrk5ztlZjqs6AsIGJvb3RzdHJhcC5qcyDripQgdG9wLWxldmVsIOyXkOyEnFxuLy8gdml0ZXN0IOulvCBpbXBvcnQg7ZWc64ukLiBWaXRlc3QgNCBnbG9iYWxTZXR1cCDsu6jthY3siqTtirjsl5DshJzripQg7J20IGltcG9ydCDqsIAgaW50ZXJuYWwgc3RhdGUg7JeQ65+s66W8XG4vLyDrp4zrk6TquLAg65WM66y47JeQIGdsb2JhbC1zZXR1cC5qcyDrp4wg7KeB7KCRIOuhnOuTnO2VnOuLpC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cCgpOiBQcm9taXNlPCgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHZvaWQ+IHtcbiAgY29uc3QgZ2xvYmFsU2V0dXBVcmwgPSBuZXcgVVJMKFxuICAgIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3NvbmFtdS9kaXN0L3Rlc3RpbmcvZ2xvYmFsLXNldHVwLmpzXCIsXG4gICAgaW1wb3J0Lm1ldGEudXJsLFxuICApO1xuICBjb25zdCB7IHNldHVwOiBzb25hbXVTZXR1cCB9ID0gKGF3YWl0IGltcG9ydChnbG9iYWxTZXR1cFVybC5ocmVmKSkgYXMgU29uYW11R2xvYmFsU2V0dXBNb2R1bGU7XG5cbiAgcmV0dXJuIHNvbmFtdVNldHVwKCk7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQUVBLE9BQU8sUUFBUTtBQVNmLGVBQXNCLFFBQStDO0NBS25FLE1BQU0sRUFBRSxPQUFPLGdCQUFpQixNQUFNLE9BSmYsSUFBSSxJQUN6QiwwREFDQSxPQUFPLEtBQUssSUFDYixDQUMyRDtBQUU1RCxRQUFPLGFBQWEifQ==
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import "../../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
//#region src/utils/providers/anthropic/anthropic-constants.ts
|
|
3
|
+
/**
|
|
4
|
+
* Anthropic(Claude) provider 상수.
|
|
5
|
+
*
|
|
6
|
+
* 기존 qgrid.dispatcher.ts 의 executeClaude 플래그/env 와 정합을 맞추되, 멀티턴용으로 조정한다:
|
|
7
|
+
* - `--no-session-persistence` 제거 (멀티턴 필수).
|
|
8
|
+
* - `--input-format stream-json` 추가 (stdin 으로 입력 어댑터 JSONL 흘림).
|
|
9
|
+
* - `--session-id` / `--resume` 로 세션 소유.
|
|
10
|
+
*/
|
|
11
|
+
const ANTHROPIC_DEFAULT_MODEL = "claude-sonnet-4-6";
|
|
12
|
+
const ANTHROPIC_DEFAULT_EFFORT = "high";
|
|
13
|
+
function canonicalAnthropicModel(model) {
|
|
14
|
+
const raw = model || "claude-sonnet-4-6";
|
|
15
|
+
return raw.includes("/") ? raw.split("/").pop() : raw;
|
|
16
|
+
}
|
|
17
|
+
const ANTHROPIC_CLAUDE_CWD = "/tmp/qgrid-anthropic";
|
|
18
|
+
const ANTHROPIC_CONFIG_DIR_BASE = "/tmp/qgrid-anthropic-config";
|
|
19
|
+
function anthropicConfigDir(tokenId) {
|
|
20
|
+
return `${ANTHROPIC_CONFIG_DIR_BASE}/${tokenId}`;
|
|
21
|
+
}
|
|
22
|
+
const ANTHROPIC_DISALLOWED_TOOLS = [
|
|
23
|
+
"Monitor",
|
|
24
|
+
"PushNotification",
|
|
25
|
+
"RemoteTrigger"
|
|
26
|
+
];
|
|
27
|
+
//#endregion
|
|
28
|
+
export { ANTHROPIC_CLAUDE_CWD, ANTHROPIC_CONFIG_DIR_BASE, ANTHROPIC_DEFAULT_EFFORT, ANTHROPIC_DEFAULT_MODEL, ANTHROPIC_DISALLOWED_TOOLS, anthropicConfigDir, canonicalAnthropicModel };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWNvbnN0YW50cy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtY29uc3RhbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQW50aHJvcGljKENsYXVkZSkgcHJvdmlkZXIg7IOB7IiYLlxuICpcbiAqIOq4sOyhtCBxZ3JpZC5kaXNwYXRjaGVyLnRzIOydmCBleGVjdXRlQ2xhdWRlIO2UjOuemOq3uC9lbnYg7JmAIOygle2VqeydhCDrp57stpTrkJgsIOupgO2LsO2EtOyaqeycvOuhnCDsobDsoJXtlZzri6Q6XG4gKiAgLSBgLS1uby1zZXNzaW9uLXBlcnNpc3RlbmNlYCDsoJzqsbAgKOupgO2LsO2EtCDtlYTsiJgpLlxuICogIC0gYC0taW5wdXQtZm9ybWF0IHN0cmVhbS1qc29uYCDstpTqsIAgKHN0ZGluIOycvOuhnCDsnoXroKUg7Ja064yR7YSwIEpTT05MIO2dmOumvCkuXG4gKiAgLSBgLS1zZXNzaW9uLWlkYCAvIGAtLXJlc3VtZWAg66GcIOyEuOyFmCDshozsnKAuXG4gKi9cblxuLy8gQ0MgLS1tb2RlbCDtlIzrnpjqt7jqsIAg67Cb64qUIG9mZmljaWFsIG1vZGVsIGlkIChhbGlhcyBcInNvbm5ldFwiIOqwgCDslYTri4jrnbwg7KCV7ZmV7ZWcIOyLneuzhOyekOuhnCDqs6DsoJUpLlxuLy8gY2xhdWRlLWFwaSDsiqTtgqwg7ZmV7J24OiBTb25uZXQgNC42IG9mZmljaWFsIGlkID0gXCJjbGF1ZGUtc29ubmV0LTQtNlwiICjrgqDsp5wgc3VmZml4IOyXhuydjCkuXG4vLyBtb2RlbC1jb3N0IO2FjOydtOu4lOyXkOuPhCBcImNsYXVkZS1zb25uZXQtNC02XCIg7YKkIOyhtOyerC4gKG93bmVyIOyngOyLnClcbmV4cG9ydCBjb25zdCBBTlRIUk9QSUNfREVGQVVMVF9NT0RFTCA9IFwiY2xhdWRlLXNvbm5ldC00LTZcIjtcbmV4cG9ydCBjb25zdCBBTlRIUk9QSUNfREVGQVVMVF9FRkZPUlQgPSBcImhpZ2hcIjtcblxuLy8gbW9kZWwgaWQg66W8IGNhbm9uaWNhbChwcm92aWRlciBwcmVmaXgg7JeG64qUIENMSS9jb3N0IO2CpCkg66GcIOygleq3nO2ZlO2VnOuLpC5cbi8vIGFpLXNkayDripQgJ2FudGhyb3BpYy9jbGF1ZGUtKicg7ZiV7YOc66GcIOuztOuCtOuKlOuNsCwgcHJlZml4IOqwgCBjb21wYXRpYmlsaXR5S2V5L2NhbGN1bGF0ZUNvc3RVc2Qg7JeQXG4vLyDsg4jrqbQg7Zi47ZmY7YKk6rCAIOqwiOumrOqxsOuCmCBjb3N0IOqwgCBkZWZhdWx0IOuLqOqwgOuhnCDsmKTqs4TsgrDrkJzri6QuIOuvuOyngOygleydtOuptCBkZWZhdWx0LlxuZXhwb3J0IGZ1bmN0aW9uIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKG1vZGVsPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmF3ID0gbW9kZWwgfHwgQU5USFJPUElDX0RFRkFVTFRfTU9ERUw7XG4gIHJldHVybiByYXcuaW5jbHVkZXMoXCIvXCIpID8gcmF3LnNwbGl0KFwiL1wiKS5wb3AoKSEgOiByYXc7XG59XG5cbi8vIHByb2plY3Qgc2NvcGUgY3dkIChzZXR0aW5ncy5qc29uIOqyqeumrCkuIO2GoO2BsOuzhCDqsqnrpqzripQgQ0xBVURFX0NPTkZJR19ESVIg66GcIO2VnOuLpC5cbmV4cG9ydCBjb25zdCBBTlRIUk9QSUNfQ0xBVURFX0NXRCA9IFwiL3RtcC9xZ3JpZC1hbnRocm9waWNcIjtcblxuLy8gcGVyLXRva2VuIENMQVVERV9DT05GSUdfRElSIOydmCDrsqDsnbTsiqQuIOyLpOygnCDqsr3roZzripQgYCR7QkFTRX0vJHt0b2tlbklkfWAgKFIxMCDqsqnrpqwpLlxuZXhwb3J0IGNvbnN0IEFOVEhST1BJQ19DT05GSUdfRElSX0JBU0UgPSBcIi90bXAvcWdyaWQtYW50aHJvcGljLWNvbmZpZ1wiO1xuXG4vLyDthqDtgbDrs4QgQ0xBVURFX0NPTkZJR19ESVIg6rK966GcIOq3nOy5mShSMTAg6rKp66asIOqzhOyVvSkuIHRva2VuSWQg67OE66GcIOu2hOumrOuQmOyWtCwg6rCZ7J2AIGNsYXVkZSBzZXNzaW9uLWlkXG4vLyDrnbzrj4Qg64uk66W4IO2GoO2BsOydtOuptCDri6TrpbggY29uZmlnIGRpciDihpIgdHJhbnNjcmlwdCDqsIAg7ISe7J207KeAIOyViuuKlOuLpC4g67aA7IiY7Zqo6rO8IOyXhuuKlCDsiJzsiJgg7ZWo7IiY6528XG4vLyDqsqnrpqwg6rOE7JW97J2EIOuLqOychCDthYzsiqTtirjroZwg6rOg7KCV7ZWgIOyImCDsnojri6QoVTYgUjEwIOq1rOyhsCDqsoDspp0pLiDsi6TsoJwgZGlyIOyDneyEseydgCBlbnN1cmVDb25maWdEaXIg6rCAIO2VnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBhbnRocm9waWNDb25maWdEaXIodG9rZW5JZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0FOVEhST1BJQ19DT05GSUdfRElSX0JBU0V9LyR7dG9rZW5JZH1gO1xufVxuXG4vLyBDQyDqsIAg7J6Q64+ZIO2ZnOyEse2ZlO2VmOuKlCBkZWZlcnJlZCDrj4Tqtawg4oCUIO2GoO2BsCDstZzsoIHtmZQg7JyE7ZW0IOywqOuLqCjquLDsobQgZXhlY3V0ZUNsYXVkZSDsmYAg64+Z7J28KS5cbmV4cG9ydCBjb25zdCBBTlRIUk9QSUNfRElTQUxMT1dFRF9UT09MUyA9IFtcIk1vbml0b3JcIiwgXCJQdXNoTm90aWZpY2F0aW9uXCIsIFwiUmVtb3RlVHJpZ2dlclwiXSBhcyBjb25zdDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQVlBLE1BQWEsMEJBQTBCO0FBQ3ZDLE1BQWEsMkJBQTJCO0FBS3hDLFNBQWdCLHdCQUF3QixPQUF3QjtDQUM5RCxNQUFNLE1BQU0sU0FBQTtBQUNaLFFBQU8sSUFBSSxTQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBSTs7QUFJckQsTUFBYSx1QkFBdUI7QUFHcEMsTUFBYSw0QkFBNEI7QUFLekMsU0FBZ0IsbUJBQW1CLFNBQXlCO0FBQzFELFFBQU8sR0FBRywwQkFBMEIsR0FBRzs7QUFJekMsTUFBYSw2QkFBNkI7Q0FBQztDQUFXO0NBQW9CO0NBQWdCIn0=
|