@cartanova/qgrid-cli 2.10.2 → 2.10.3
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/monit/log-buffer.js +7 -11
- package/bundle/dist/application/monit/monit.frame.js +6 -11
- package/bundle/dist/application/qgrid/oauth.js +2 -2
- package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +2 -2
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +12 -36
- package/bundle/dist/application/qgrid/qgrid.frame.js +2 -2
- package/bundle/dist/application/qgrid/qgrid.types.js +2 -1
- package/bundle/dist/application/qgrid/token-subscriber.js +4 -7
- package/bundle/dist/application/qgrid/token-window-keepalive.js +3 -2
- package/bundle/dist/application/qgrid/tool-emulation-schema.js +4 -4
- package/bundle/dist/application/qgrid/tool-emulation.js +14 -2
- package/bundle/dist/application/request-log/request-log.model.js +7 -5
- package/bundle/dist/application/setting/setting.model.js +1 -1
- package/bundle/dist/sonamu.config.js +6 -6
- package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +53 -84
- package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +55 -0
- package/bundle/dist/utils/providers/anthropic/claude-session.js +11 -13
- package/bundle/dist/utils/providers/common/effort.js +1 -1
- package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +3 -3
- package/bundle/dist/utils/providers/common/thinking.js +12 -0
- package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +3 -2
- package/bundle/dist/utils/providers/openai/openai-direct-client.js +6 -16
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +89 -78
- package/bundle/src/application/monit/log-buffer.test.ts +3 -4
- package/bundle/src/application/monit/log-buffer.ts +13 -27
- package/bundle/src/application/monit/monit.frame.test.ts +7 -8
- package/bundle/src/application/monit/monit.frame.ts +9 -14
- package/bundle/src/application/qgrid/oauth.ts +1 -1
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +7 -0
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +1 -1
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +62 -1
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +25 -71
- package/bundle/src/application/qgrid/qgrid.frame.ts +4 -8
- package/bundle/src/application/qgrid/qgrid.types.ts +2 -0
- package/bundle/src/application/qgrid/token-subscriber.test.ts +8 -18
- package/bundle/src/application/qgrid/token-subscriber.ts +10 -20
- package/bundle/src/application/qgrid/token-window-keepalive.test.ts +2 -2
- package/bundle/src/application/qgrid/token-window-keepalive.ts +2 -1
- package/bundle/src/application/qgrid/tool-emulation-schema.test.ts +6 -3
- package/bundle/src/application/qgrid/tool-emulation-schema.ts +3 -3
- package/bundle/src/application/qgrid/tool-emulation.test.ts +8 -1
- package/bundle/src/application/qgrid/tool-emulation.ts +29 -0
- package/bundle/src/application/request-log/request-log.model.ts +5 -5
- package/bundle/src/application/setting/setting.model.ts +1 -1
- package/bundle/src/sonamu.config.ts +5 -5
- package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +3 -6
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +26 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +70 -148
- package/bundle/src/utils/providers/anthropic/anthropic-thinking.test.ts +36 -0
- package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +84 -0
- package/bundle/src/utils/providers/anthropic/claude-session.test.ts +74 -13
- package/bundle/src/utils/providers/anthropic/claude-session.ts +11 -20
- package/bundle/src/utils/providers/common/effort.ts +1 -1
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +4 -0
- package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -4
- package/bundle/src/utils/providers/common/thinking.ts +10 -0
- package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +7 -3
- package/bundle/src/utils/providers/openai/openai-direct-client.test.ts +3 -3
- package/bundle/src/utils/providers/openai/openai-direct-client.ts +20 -33
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +97 -6
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +113 -77
- package/bundle/web-dist/client/assets/{index-DtRTSTes.js → index-BIC1sQxw.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-BhVYDEzC.js → logs-zvdujZWn.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-BxN4JWqK.js → monit-CraVV3MQ.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-CBCqRp2o.js → routes-B3ZBoJ60.js} +1 -1
- package/bundle/web-dist/client/assets/{settings-hBTEC7Ki.js → settings-DwbzT5jo.js} +1 -1
- package/bundle/web-dist/client/assets/{show-BzYft5N4.js → show-ItTExdAh.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-PMybtI8X.js → tokens-BynKx8Vn.js} +1 -1
- package/bundle/web-dist/client/assets/{use-oauth-login-flow-C51_d6-6.js → use-oauth-login-flow-8xw6on5P.js} +1 -1
- package/bundle/web-dist/client/index.html +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +1 -1
- package/package.json +1 -1
- package/skills/qgrid/SKILL.md +1 -0
- package/skills/qgrid/references/ai-sdk-provider-contract.md +2 -1
- package/skills/qgrid/references/anthropic-claude-code-runtime.md +7 -4
- package/skills/qgrid/references/decision-rationale.md +9 -0
- package/skills/qgrid/references/openai-codex-runtime.md +6 -0
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +2 -0
- package/skills/qgrid/references/tool-calling-and-multiturn.md +18 -1
- package/skills/qgrid/references/verification-and-debugging.md +1 -1
|
@@ -3,12 +3,21 @@ import { QuotaThresholdExceededError } from "../../../application/qgrid/qgrid.ty
|
|
|
3
3
|
import { TokenModel } from "../../../application/token/token.model.js";
|
|
4
4
|
import { SmoothWeightedRoundRobin } from "../common/smooth-weighted-round-robin.js";
|
|
5
5
|
import { resolveOpenAIEffort } from "../common/effort.js";
|
|
6
|
+
import { ThinkingValidationError } from "../common/thinking.js";
|
|
6
7
|
import { OpenAIDirectClient } from "./openai-direct-client.js";
|
|
7
8
|
import { readOpenAIQuotaUsage } from "./openai-quota.js";
|
|
8
9
|
import { handleChatgptAuthTokensRefresh } from "./openai-refresh.js";
|
|
9
10
|
import { getLogger } from "@logtape/logtape";
|
|
10
11
|
//#region src/utils/providers/openai/openai-dispatcher.ts
|
|
11
12
|
const logger = getLogger(["qgrid", "openai-dispatcher"]);
|
|
13
|
+
const THINKING_OFF_MODELS = /* @__PURE__ */ new Set([
|
|
14
|
+
"gpt-6-sol",
|
|
15
|
+
"gpt-6-luna",
|
|
16
|
+
"gpt-5.6-sol",
|
|
17
|
+
"gpt-5.6-terra",
|
|
18
|
+
"gpt-5.6-luna",
|
|
19
|
+
"gpt-5.5"
|
|
20
|
+
]);
|
|
12
21
|
const DEFAULT_REQUEST_TIMEOUT_MS = 6e5;
|
|
13
22
|
const TRANSPARENT_IMAGE_TOOL = "generate_transparent_image";
|
|
14
23
|
var ImageGenerationError = class extends Error {
|
|
@@ -58,8 +67,9 @@ function inputItems(req) {
|
|
|
58
67
|
}];
|
|
59
68
|
}
|
|
60
69
|
function asReasoning(req) {
|
|
70
|
+
if (req.thinking === false) return { effort: "none" };
|
|
61
71
|
const summary = req.reasoningSummary && req.reasoningSummary !== "none" ? req.reasoningSummary : void 0;
|
|
62
|
-
const effort = resolveOpenAIEffort(req.model ?? "", req.effort);
|
|
72
|
+
const effort = resolveOpenAIEffort(req.model ?? "", req.effort) ?? (req.thinking === true ? "low" : void 0);
|
|
63
73
|
if (!effort && !summary) return void 0;
|
|
64
74
|
return {
|
|
65
75
|
...effort ? { effort } : {},
|
|
@@ -105,14 +115,6 @@ function requestOptions(req) {
|
|
|
105
115
|
} : true } : {}
|
|
106
116
|
};
|
|
107
117
|
}
|
|
108
|
-
/**
|
|
109
|
-
* Direct OpenAI dispatcher — Anthropic 과 동일한 stateless 실행 모델.
|
|
110
|
-
*
|
|
111
|
-
* 요청 = 토큰 선택(quota gate + weighted round-robin + cache affinity 선호) → HTTPS/WS
|
|
112
|
-
* 전송. permit/큐 같은 동시성 상한은 두지 않는다: 전송은 fetch 한 번이라 로컬 자원이
|
|
113
|
-
* 희소하지 않고, 상류 제한은 백엔드의 응답(429 등)이 진실이다. worker pool 시절의
|
|
114
|
-
* 큐 의미론(SERVER_BUSY, 큐 타임아웃)은 이 전환으로 제거됐다.
|
|
115
|
-
*/
|
|
116
118
|
var OpenAIDispatcher = class OpenAIDispatcher {
|
|
117
119
|
tokenMetadata = /* @__PURE__ */ new Map();
|
|
118
120
|
transportKind;
|
|
@@ -125,7 +127,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
125
127
|
clientFactory;
|
|
126
128
|
fetchImpl;
|
|
127
129
|
quotaBlocked = /* @__PURE__ */ new Set();
|
|
128
|
-
|
|
130
|
+
inFlight = 0;
|
|
129
131
|
constructor(transportKind = resolveOpenAITransportKind(), dependencies = {}) {
|
|
130
132
|
this.transportKind = transportKind;
|
|
131
133
|
this.clientFactory = dependencies.clientFactory ?? ((options) => new OpenAIDirectClient(options));
|
|
@@ -133,16 +135,15 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
133
135
|
}
|
|
134
136
|
async start() {
|
|
135
137
|
const { rows } = await TokenModel.findMany("A");
|
|
136
|
-
|
|
137
|
-
if (row.provider !== "openai") continue;
|
|
138
|
+
rows.filter((row) => row.provider === "openai").forEach((row) => {
|
|
138
139
|
this.setToken(row.id, row.name, row.credentials, row.quota_threshold, row.weight, row.active);
|
|
139
|
-
}
|
|
140
|
+
});
|
|
140
141
|
logger.info(`started direct OpenAI runtime with ${this.tokenMetadata.size} tokens`);
|
|
141
142
|
}
|
|
142
143
|
async stop() {
|
|
143
|
-
|
|
144
|
+
this.clients.forEach(({ client }) => client.close?.());
|
|
144
145
|
this.clients.clear();
|
|
145
|
-
|
|
146
|
+
this.retiredClients.forEach((entry) => entry.client.close?.());
|
|
146
147
|
this.retiredClients.clear();
|
|
147
148
|
this.tokenMetadata.clear();
|
|
148
149
|
this.rateLimitsCache.clear();
|
|
@@ -191,10 +192,14 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
191
192
|
}
|
|
192
193
|
}
|
|
193
194
|
async run(req, onDelta) {
|
|
195
|
+
if (req.thinking === false) {
|
|
196
|
+
const model = req.model ?? "";
|
|
197
|
+
if (!THINKING_OFF_MODELS.has(model)) throw new ThinkingValidationError(`thinking:false is unavailable for OpenAI model ${model || "<default>"}: ${model === "gpt-6-astra" || model === "gpt-6.1-sol" ? "the subscription backend requires thinking" : "thinking-off support has not been verified on the subscription backend"}`);
|
|
198
|
+
}
|
|
194
199
|
const signal = activeSignal(req.abortSignal, req.timeoutMs);
|
|
195
200
|
if (signal.aborted) throw abortError(signal);
|
|
196
201
|
const selection = await this.selectToken(req.preferredTokenId, req.requirePreferredToken ?? false, signal);
|
|
197
|
-
this.
|
|
202
|
+
this.inFlight++;
|
|
198
203
|
try {
|
|
199
204
|
if (signal.aborted) throw abortError(signal);
|
|
200
205
|
return await this.runDirect(selection, {
|
|
@@ -202,13 +207,16 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
202
207
|
abortSignal: signal
|
|
203
208
|
}, onDelta);
|
|
204
209
|
} finally {
|
|
205
|
-
this.
|
|
210
|
+
this.inFlight--;
|
|
206
211
|
}
|
|
207
212
|
}
|
|
208
213
|
async runDirect(selection, req, onDelta) {
|
|
209
214
|
const startedAt = Date.now();
|
|
210
215
|
let firstDeltaAt;
|
|
211
216
|
let text = "";
|
|
217
|
+
let outputMessageAccepted = false;
|
|
218
|
+
const messagePhases = /* @__PURE__ */ new Map();
|
|
219
|
+
const streamedMessageIds = /* @__PURE__ */ new Set();
|
|
212
220
|
let usage = {
|
|
213
221
|
totalTokens: 0,
|
|
214
222
|
inputTokens: 0,
|
|
@@ -227,50 +235,68 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
227
235
|
const metadata = selection.metadata;
|
|
228
236
|
const clientEntry = this.acquireClient(selection);
|
|
229
237
|
try {
|
|
230
|
-
for await (const event of clientEntry.client.responses(requestOptions(req), req.abortSignal))
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
})
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
238
|
+
for await (const event of clientEntry.client.responses(requestOptions(req), req.abortSignal)) {
|
|
239
|
+
if (req.stopAfterOutputMessage && event.type === "output-item" && event.item.type === "message" && typeof event.item.id === "string" && typeof event.item.phase === "string") messagePhases.set(event.item.id, event.item.phase);
|
|
240
|
+
if (event.type === "text-delta") {
|
|
241
|
+
if (outputMessageAccepted) continue;
|
|
242
|
+
if (req.stopAfterOutputMessage && event.itemId) {
|
|
243
|
+
if (messagePhases.get(event.itemId) !== "final_answer") continue;
|
|
244
|
+
streamedMessageIds.add(event.itemId);
|
|
245
|
+
}
|
|
246
|
+
firstDeltaAt ??= Date.now();
|
|
247
|
+
text += event.text;
|
|
248
|
+
onDelta?.(event.text);
|
|
249
|
+
} else if (event.type === "output-item" && event.completed && event.item.type === "message" && !outputMessageAccepted && req.stopAfterOutputMessage && Array.isArray(event.item.content)) {
|
|
250
|
+
const messageText = event.item.content.filter((part) => part?.type === "output_text" && typeof part.text === "string").map((part) => part.text).join("");
|
|
251
|
+
const phase = typeof event.item.phase === "string" ? event.item.phase : void 0;
|
|
252
|
+
if (messageText) outputMessageAccepted = req.stopAfterOutputMessage(messageText, phase);
|
|
253
|
+
if (typeof event.item.id === "string" && !streamedMessageIds.has(event.item.id) && (phase !== "commentary" || outputMessageAccepted) && messageText) {
|
|
254
|
+
firstDeltaAt ??= Date.now();
|
|
255
|
+
text += messageText;
|
|
256
|
+
onDelta?.(messageText);
|
|
257
|
+
streamedMessageIds.add(event.item.id);
|
|
258
|
+
}
|
|
259
|
+
} else if (event.type === "image") {
|
|
260
|
+
imageAttempted = true;
|
|
261
|
+
images.push({
|
|
262
|
+
data: event.base64,
|
|
263
|
+
mediaType: event.mimeType,
|
|
264
|
+
revisedPrompt: event.revisedPrompt ?? null,
|
|
265
|
+
...event.generation ? { generation: event.generation } : {}
|
|
266
|
+
});
|
|
267
|
+
} else if (event.type === "output-item" && event.item.type === "image_generation_call") imageAttempted = true;
|
|
268
|
+
else if (auto && event.type === "output-item" && event.item.type === "function_call") {
|
|
269
|
+
if (event.item.name !== TRANSPARENT_IMAGE_TOOL) throw new ImageGenerationError("incomplete", "Unexpected automatic image tool call");
|
|
270
|
+
transparentAttempted = true;
|
|
271
|
+
transparentCallIds.add(event.item.call_id);
|
|
272
|
+
if (!event.completed) continue;
|
|
273
|
+
const id = event.item.call_id;
|
|
274
|
+
let args;
|
|
275
|
+
try {
|
|
276
|
+
args = JSON.parse(String(event.item.arguments));
|
|
277
|
+
} catch {
|
|
278
|
+
throw new ImageGenerationError("incomplete", "Invalid transparent image arguments");
|
|
279
|
+
}
|
|
280
|
+
if (typeof id !== "string" || !id || !args || typeof args !== "object" || Array.isArray(args) || Object.keys(args).length !== 1 || !("prompt" in args) || typeof args.prompt !== "string" || !args.prompt.trim()) throw new ImageGenerationError("incomplete", "Invalid transparent image arguments");
|
|
281
|
+
if (transparentCalls.has(id) && transparentCalls.get(id) !== args.prompt) throw new ImageGenerationError("incomplete", "Conflicting transparent image tool calls");
|
|
282
|
+
transparentCalls.set(id, args.prompt);
|
|
283
|
+
} else if (event.type === "completed" && event.usage) {
|
|
284
|
+
driverCompleted = true;
|
|
285
|
+
servingModel = event.model ?? servingModel;
|
|
286
|
+
usage = {
|
|
287
|
+
totalTokens: event.usage.totalTokens,
|
|
288
|
+
inputTokens: event.usage.inputTokens,
|
|
289
|
+
outputTokens: event.usage.outputTokens,
|
|
290
|
+
cachedInputTokens: event.usage.cachedInputTokens,
|
|
291
|
+
reasoningOutputTokens: event.usage.reasoningTokens
|
|
292
|
+
};
|
|
293
|
+
} else if (event.type === "completed") {
|
|
294
|
+
driverCompleted = true;
|
|
295
|
+
servingModel = event.model ?? servingModel;
|
|
296
|
+
} else if (event.type === "error") {
|
|
297
|
+
if (req.imageGeneration) throw new ImageGenerationError("incomplete", event.error.message);
|
|
298
|
+
throw event.error;
|
|
254
299
|
}
|
|
255
|
-
if (typeof id !== "string" || !id || !args || typeof args !== "object" || Array.isArray(args) || Object.keys(args).length !== 1 || !("prompt" in args) || typeof args.prompt !== "string" || !args.prompt.trim()) throw new ImageGenerationError("incomplete", "Invalid transparent image arguments");
|
|
256
|
-
if (transparentCalls.has(id) && transparentCalls.get(id) !== args.prompt) throw new ImageGenerationError("incomplete", "Conflicting transparent image tool calls");
|
|
257
|
-
transparentCalls.set(id, args.prompt);
|
|
258
|
-
} else if (event.type === "completed" && event.usage) {
|
|
259
|
-
driverCompleted = true;
|
|
260
|
-
servingModel = event.model ?? servingModel;
|
|
261
|
-
usage = {
|
|
262
|
-
totalTokens: event.usage.totalTokens,
|
|
263
|
-
inputTokens: event.usage.inputTokens,
|
|
264
|
-
outputTokens: event.usage.outputTokens,
|
|
265
|
-
cachedInputTokens: event.usage.cachedInputTokens,
|
|
266
|
-
reasoningOutputTokens: event.usage.reasoningTokens
|
|
267
|
-
};
|
|
268
|
-
} else if (event.type === "completed") {
|
|
269
|
-
driverCompleted = true;
|
|
270
|
-
servingModel = event.model ?? servingModel;
|
|
271
|
-
} else if (event.type === "error") {
|
|
272
|
-
if (req.imageGeneration) throw new ImageGenerationError("incomplete", event.error.message);
|
|
273
|
-
throw event.error;
|
|
274
300
|
}
|
|
275
301
|
if (auto && transparentAttempted) {
|
|
276
302
|
if (!driverCompleted || transparentCalls.size !== 1 || transparentCallIds.size !== 1 || imageAttempted) throw new ImageGenerationError("incomplete", "Expected one completed transparent image call without another image tool");
|
|
@@ -363,7 +389,6 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
363
389
|
entry.client.close?.();
|
|
364
390
|
}
|
|
365
391
|
}
|
|
366
|
-
/** map 에서 떼어내고, 진행 중인 요청이 없을 때만 즉시 닫는다. */
|
|
367
392
|
retireClient(tokenId) {
|
|
368
393
|
const entry = this.clients.get(tokenId);
|
|
369
394
|
if (!entry) return;
|
|
@@ -372,12 +397,6 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
372
397
|
if (entry.inFlight === 0) entry.client.close?.();
|
|
373
398
|
else this.retiredClients.add(entry);
|
|
374
399
|
}
|
|
375
|
-
/**
|
|
376
|
-
* 토큰 선택 — quota gate 를 통과한 active 토큰 중에서 고른다. cache affinity 선호
|
|
377
|
-
* 토큰이 eligible 하면 그 판정만으로 즉시 결정하고(전체 sweep 생략, weighted 상태
|
|
378
|
-
* 비변경), 아니면 병렬 quota 판정 후 smooth weighted round-robin. 동시성 상한이
|
|
379
|
-
* 없으므로 "빈 자리" 개념도 없다 — 선택 즉시 실행이다.
|
|
380
|
-
*/
|
|
381
400
|
async selectToken(preferredTokenId, requirePreferredToken, signal) {
|
|
382
401
|
if (preferredTokenId !== void 0) {
|
|
383
402
|
const preferred = this.tokenMetadata.get(preferredTokenId);
|
|
@@ -526,18 +545,10 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
526
545
|
invalidateRateLimitsCache(id) {
|
|
527
546
|
this.rateLimitsCache.delete(id);
|
|
528
547
|
}
|
|
529
|
-
|
|
548
|
+
countActiveTokens() {
|
|
530
549
|
return [...this.tokenMetadata.values()].filter((t) => t.active).length;
|
|
531
550
|
}
|
|
532
|
-
|
|
533
|
-
return this.inFlightCount;
|
|
534
|
-
}
|
|
535
|
-
/**
|
|
536
|
-
* 토큰별 쿼터 스냅샷 — 신선한(rate limits TTL 내) 캐시만 읽고 절대 fetch 하지 않는다.
|
|
537
|
-
* monit vitals 는 로그 폴링에 편승하는 값이라 여기서 네트워크를 타면 안 된다.
|
|
538
|
-
* threshold 미설정 토큰은 쿼터 판정을 돌지 않아 usedPercent 가 null 로 남을 수 있다.
|
|
539
|
-
*/
|
|
540
|
-
get quotaByToken() {
|
|
551
|
+
getQuotaSnapshot() {
|
|
541
552
|
const now = Date.now();
|
|
542
553
|
return [...this.tokenMetadata.entries()].map(([id, t]) => {
|
|
543
554
|
const cached = this.rateLimitsCache.get(id);
|
|
@@ -555,4 +566,4 @@ var OpenAIDispatcher = class OpenAIDispatcher {
|
|
|
555
566
|
//#endregion
|
|
556
567
|
export { ImageGenerationError, OpenAIDispatcher };
|
|
557
568
|
|
|
558
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyByZXNvbHZlT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4uL2NvbW1vbi9lZmZvcnRcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIEdlbmVyYXRlZEltYWdlLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4gfSBmcm9tIFwiLi4vY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2JpblwiO1xuaW1wb3J0IHtcbiAgdHlwZSBKc29uVmFsdWUsXG4gIHR5cGUgT3BlbkFJUmVzcG9uc2VJdGVtLFxuICB0eXBlIE9wZW5BSVJlc3BvbnNlc09wdGlvbnMsXG59IGZyb20gXCIuL29wZW5haS1iYWNrZW5kLXByb3RvY29sXCI7XG5pbXBvcnQgeyBPcGVuQUlEaXJlY3RDbGllbnQsIHR5cGUgT3BlbkFJRGlyZWN0Q2xpZW50T3B0aW9ucyB9IGZyb20gXCIuL29wZW5haS1kaXJlY3QtY2xpZW50XCI7XG5pbXBvcnQgeyByZWFkT3BlbkFJUXVvdGFVc2FnZSwgdHlwZSBPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGEgfSBmcm9tIFwiLi9vcGVuYWktcXVvdGFcIjtcbmltcG9ydCB7IGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCB9IGZyb20gXCIuL29wZW5haS1yZWZyZXNoXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSVRyYW5zcG9ydEtpbmQsIHJlc29sdmVPcGVuQUlUcmFuc3BvcnRLaW5kIH0gZnJvbSBcIi4vb3BlbmFpLXRyYW5zcG9ydC1jb25maWdcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwib3BlbmFpLWRpc3BhdGNoZXJcIl0pO1xuLy8g6rWQ7LK065CcIGNvZGV4IHdvcmtlciDqsIAg6rCV7KCc7ZWY642YIHdhdGNoZG9nLiDtmLjstpzsnpDqsIAgdGltZW91dE1zIOulvCDsg53rnrXtlbTrj4Qg7JqU7LKt7J20XG4vLyDsmIHsm5Dtnogg66ek64us66as7KeAIOyViuuPhOuhnSBkaXJlY3QgdHJhbnNwb3J0IOuPhCDsnKDtlZztlZwg6riw67O4IOyDge2VnOydhCDsnKDsp4DtlZzri6QuXG5jb25zdCBERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9NUyA9IDYwMF8wMDA7XG5jb25zdCBUUkFOU1BBUkVOVF9JTUFHRV9UT09MID0gXCJnZW5lcmF0ZV90cmFuc3BhcmVudF9pbWFnZVwiO1xuXG5leHBvcnQgdHlwZSBJbWFnZUZhaWx1cmVLaW5kID0gXCJnYXRlXCIgfCBcIm5vdF9jYWxsZWRcIiB8IFwiaW5jb21wbGV0ZVwiO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VHZW5lcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IEltYWdlRmFpbHVyZUtpbmQsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkltYWdlR2VuZXJhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxudHlwZSBUb2tlbk1ldGFkYXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscztcbiAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgYWN0aXZlOiBib29sZWFuO1xuICBnZW5lcmF0aW9uOiBudW1iZXI7XG59O1xuXG50eXBlIFRva2VuU2VsZWN0aW9uID0geyB0b2tlbklkOiBudW1iZXI7IG1ldGFkYXRhOiBUb2tlbk1ldGFkYXRhIH07XG5cbmV4cG9ydCB0eXBlIE9wZW5BSURpcmVjdENsaWVudEZhY3RvcnkgPSAoXG4gIG9wdGlvbnM6IE9wZW5BSURpcmVjdENsaWVudE9wdGlvbnMsXG4gIHRva2VuSWQ6IG51bWJlcixcbikgPT4gUGljazxPcGVuQUlEaXJlY3RDbGllbnQsIFwicmVzcG9uc2VzXCI+ICYgeyBjbG9zZT86ICgpID0+IHZvaWQgfTtcblxudHlwZSBDbGllbnRFbnRyeSA9IHtcbiAgZ2VuZXJhdGlvbjogbnVtYmVyO1xuICBjbGllbnQ6IFBpY2s8T3BlbkFJRGlyZWN0Q2xpZW50LCBcInJlc3BvbnNlc1wiPiAmIHsgY2xvc2U/OiAoKSA9PiB2b2lkIH07XG4gIGluRmxpZ2h0OiBudW1iZXI7XG4gIHJldGlyZWQ6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSURpc3BhdGNoZXJEZXBlbmRlbmNpZXMge1xuICBjbGllbnRGYWN0b3J5PzogT3BlbkFJRGlyZWN0Q2xpZW50RmFjdG9yeTtcbiAgZmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG59XG5cbmZ1bmN0aW9uIGFib3J0RXJyb3Ioc2lnbmFsOiBBYm9ydFNpZ25hbCk6IEVycm9yIHtcbiAgY29uc3QgcmVhc29uID0gc2lnbmFsLnJlYXNvbjtcbiAgcmV0dXJuIHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uIDogbmV3IERPTUV4Y2VwdGlvbihcIkFib3J0ZWRcIiwgXCJBYm9ydEVycm9yXCIpO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVTaWduYWwoc2lnbmFsPzogQWJvcnRTaWduYWwsIHRpbWVvdXRNcz86IG51bWJlcik6IEFib3J0U2lnbmFsIHtcbiAgY29uc3QgdGltZW91dCA9IEFib3J0U2lnbmFsLnRpbWVvdXQodGltZW91dE1zID8/IERFRkFVTFRfUkVRVUVTVF9USU1FT1VUX01TKTtcbiAgcmV0dXJuIHNpZ25hbCA/IEFib3J0U2lnbmFsLmFueShbc2lnbmFsLCB0aW1lb3V0XSkgOiB0aW1lb3V0O1xufVxuXG5mdW5jdGlvbiBxdW90YU1lc3NhZ2UoZW50cmllczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+KTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlsID0gZW50cmllcy5tYXAoKGUpID0+IGAke2UubmFtZX0gKHRocmVzaG9sZCAke2UudGhyZXNob2xkfSUpYCkuam9pbihcIiwgXCIpO1xuICByZXR1cm4gZGV0YWlsXG4gICAgPyBgQWxsIG9wZW5haSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkOiAke2RldGFpbH1gXG4gICAgOiBcIkFsbCBvcGVuYWkgdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZFwiO1xufVxuXG5mdW5jdGlvbiBpbnB1dEl0ZW1zKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogT3BlbkFJUmVzcG9uc2VJdGVtW10ge1xuICBjb25zdCBoaXN0b3J5ID0gKHJlcS5jb2xkSGlzdG9yeSA/PyBbXSkgYXMgT3BlbkFJUmVzcG9uc2VJdGVtW107XG4gIGNvbnN0IGNvbnRlbnQ6IE9wZW5BSVJlc3BvbnNlSXRlbVtdID0gcmVxLmNvbGRJbnB1dC5tYXAoKGlucHV0KSA9PiB7XG4gICAgaWYgKGlucHV0LnR5cGUgPT09IFwidGV4dFwiKSByZXR1cm4geyB0eXBlOiBcImlucHV0X3RleHRcIiwgdGV4dDogaW5wdXQudGV4dCB9O1xuICAgIGlmIChpbnB1dC50eXBlID09PSBcImltYWdlXCIpIHJldHVybiB7IHR5cGU6IFwiaW5wdXRfaW1hZ2VcIiwgaW1hZ2VfdXJsOiBpbnB1dC51cmwgfTtcbiAgICBpZiAoaW5wdXQudHlwZSA9PT0gXCJsb2NhbEltYWdlXCIpIHJldHVybiB7IHR5cGU6IFwiaW5wdXRfaW1hZ2VcIiwgaW1hZ2VfdXJsOiBpbnB1dC5wYXRoIH07XG4gICAgcmV0dXJuIHsgdHlwZTogXCJpbnB1dF90ZXh0XCIsIHRleHQ6IGAke2lucHV0Lm5hbWV9OiAke2lucHV0LnBhdGh9YCB9O1xuICB9KTtcbiAgcmV0dXJuIFsuLi5oaXN0b3J5LCB7IHR5cGU6IFwibWVzc2FnZVwiLCByb2xlOiBcInVzZXJcIiwgY29udGVudCB9XTtcbn1cblxuZnVuY3Rpb24gYXNSZWFzb25pbmcocmVxOiBHZW5lcmF0ZVJlcXVlc3QpOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zW1wicmVhc29uaW5nXCJdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3VtbWFyeSA9XG4gICAgcmVxLnJlYXNvbmluZ1N1bW1hcnkgJiYgcmVxLnJlYXNvbmluZ1N1bW1hcnkgIT09IFwibm9uZVwiID8gcmVxLnJlYXNvbmluZ1N1bW1hcnkgOiB1bmRlZmluZWQ7XG4gIC8vIENvZGV4IOyWtO2cmMK366qo6424IOyDge2VnCDrsJbsnZggZWZmb3J0IOuKlCDsl6zquLDshJwg7KGw7Jqp7Z6IIOuyhOumsOuLpCjrsLHsl5Trk5wg6riw67O46rCSIOyggeyaqSkuXG4gIGNvbnN0IGVmZm9ydCA9IHJlc29sdmVPcGVuQUlFZmZvcnQocmVxLm1vZGVsID8/IFwiXCIsIHJlcS5lZmZvcnQpO1xuICBpZiAoIWVmZm9ydCAmJiAhc3VtbWFyeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICAuLi4oZWZmb3J0ID8geyBlZmZvcnQgfSA6IHt9KSxcbiAgICAuLi4oc3VtbWFyeVxuICAgICAgPyB7XG4gICAgICAgICAgc3VtbWFyeTogc3VtbWFyeSBhcyBOb25OdWxsYWJsZTxPcGVuQUlSZXNwb25zZXNPcHRpb25zW1wicmVhc29uaW5nXCJdPltcInN1bW1hcnlcIl0sXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0T3B0aW9ucyhyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnMge1xuICBjb25zdCB7IG91dHB1dEZvcm1hdCwgLi4uaW1hZ2VDb250cm9scyB9ID0gcmVxLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMgPz8ge307XG4gIGNvbnN0IGF1dG8gPSByZXEuaW1hZ2VHZW5lcmF0aW9uID09PSBcImF1dG9cIjtcbiAgaWYgKGF1dG8gJiYgcmVxLm91dHB1dFNjaGVtYSkge1xuICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgIFwiZ2F0ZVwiLFxuICAgICAgXCJBdXRvbWF0aWMgaW1hZ2UgZ2VuZXJhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHN0cnVjdHVyZWQgb3V0cHV0IG9yIGV4dGVybmFsIHRvb2xzXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1vZGVsOiByZXEubW9kZWwgPz8gXCJcIixcbiAgICAuLi4ocmVxLnN5c3RlbVByb21wdCA/IHsgaW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0IH0gOiB7fSksXG4gICAgLi4uKGF1dG9cbiAgICAgID8ge1xuICAgICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICAgcmVxLnN5c3RlbVByb21wdCxcbiAgICAgICAgICAgIFwiVXNlIGltYWdlX2dlbmVyYXRpb24gZm9yIG9yZGluYXJ5IGltYWdlIGdlbmVyYXRpb24gb3IgZWRpdGluZy4gVXNlIGdlbmVyYXRlX3RyYW5zcGFyZW50X2ltYWdlIG9ubHkgd2hlbiBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQgaXMgcmVxdWVzdGVkLiBUZXh0IHJlcGxpZXMgYXJlIGFsbG93ZWQgd2hlbiBubyBpbWFnZSBpcyBuZWVkZWQuIFVzZSBvbmx5IG9uZSBraW5kIG9mIGltYWdlIHRvb2wgcGVyIHJlc3BvbnNlLCBhbmQgYXQgbW9zdCBvbmUgZ2VuZXJhdGVfdHJhbnNwYXJlbnRfaW1hZ2UgY2FsbC5cIixcbiAgICAgICAgICBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbihcIlxcblxcblwiKSxcbiAgICAgICAgICBwYXJhbGxlbFRvb2xDYWxsczogZmFsc2UsXG4gICAgICAgICAgdG9vbHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgICBuYW1lOiBUUkFOU1BBUkVOVF9JTUFHRV9UT09MLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICBcIkdlbmVyYXRlIG9yIGVkaXQgYW4gaW1hZ2Ugd2l0aCBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQgdXNpbmcgdGhlIGNvbnZlcnNhdGlvbidzIHJlZmVyZW5jZSBpbWFnZXMuXCIsXG4gICAgICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgcHJvbXB0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgIFwiQ29tcGxldGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgdHJhbnNwYXJlbnQgaW1hZ2UgZ2VuZXJhdGlvbiBvciBlZGl0LlwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBbXCJwcm9tcHRcIl0sXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICBoaXN0b3J5OiBpbnB1dEl0ZW1zKHJlcSksXG4gICAgLi4uKGFzUmVhc29uaW5nKHJlcSkgPyB7IHJlYXNvbmluZzogYXNSZWFzb25pbmcocmVxKSB9IDoge30pLFxuICAgIC4uLihyZXEudmVyYm9zaXR5ID8geyB2ZXJib3NpdHk6IHJlcS52ZXJib3NpdHkgYXMgT3BlbkFJUmVzcG9uc2VzT3B0aW9uc1tcInZlcmJvc2l0eVwiXSB9IDoge30pLFxuICAgIC4uLihyZXEuc2VydmljZVRpZXJcbiAgICAgID8geyBzZXJ2aWNlVGllcjogcmVxLnNlcnZpY2VUaWVyID09PSBcImZhc3RcIiA/IFwicHJpb3JpdHlcIiA6IHJlcS5zZXJ2aWNlVGllciB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocmVxLnByb21wdENhY2hlS2V5ID8geyBwcm9tcHRDYWNoZUtleTogcmVxLnByb21wdENhY2hlS2V5IH0gOiB7fSksXG4gICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogeyBzY2hlbWE6IHJlcS5vdXRwdXRTY2hlbWEgYXMgSnNvblZhbHVlIH0gfSA6IHt9KSxcbiAgICAuLi4ocmVxLmltYWdlR2VuZXJhdGlvblxuICAgICAgPyB7XG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiByZXEuaW1hZ2VHZW5lcmF0aW9uT3B0aW9uc1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgLi4uaW1hZ2VDb250cm9scyxcbiAgICAgICAgICAgICAgICAuLi4oYXV0byA/IHsgYmFja2dyb3VuZDogXCJhdXRvXCIgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi4ob3V0cHV0Rm9ybWF0ID8geyBvdXRwdXRfZm9ybWF0OiBvdXRwdXRGb3JtYXQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEaXJlY3QgT3BlbkFJIGRpc3BhdGNoZXIg4oCUIEFudGhyb3BpYyDqs7wg64+Z7J287ZWcIHN0YXRlbGVzcyDsi6Ttlokg66qo6424LlxuICpcbiAqIOyalOyyrSA9IO2GoO2BsCDshKDtg50ocXVvdGEgZ2F0ZSArIHdlaWdodGVkIHJvdW5kLXJvYmluICsgY2FjaGUgYWZmaW5pdHkg7ISg7Zi4KSDihpIgSFRUUFMvV1NcbiAqIOyghOyGoS4gcGVybWl0L+2BkCDqsJnsnYAg64+Z7Iuc7ISxIOyDge2VnOydgCDrkZDsp4Ag7JWK64qU64ukOiDsoITshqHsnYAgZmV0Y2gg7ZWcIOuyiOydtOudvCDroZzsu6wg7J6Q7JuQ7J20XG4gKiDtnazshoztlZjsp4Ag7JWK6rOgLCDsg4HrpZgg7KCc7ZWc7J2AIOuwseyXlOuTnOydmCDsnZHri7UoNDI5IOuTsSnsnbQg7KeE7Iuk7J2064ukLiB3b3JrZXIgcG9vbCDsi5zsoIjsnZhcbiAqIO2BkCDsnZjrr7jroaAoU0VSVkVSX0JVU1ksIO2BkCDtg4DsnoTslYTsm4Mp7J2AIOydtCDsoITtmZjsnLzroZwg7KCc6rGw65CQ64ukLlxuICovXG5leHBvcnQgY2xhc3MgT3BlbkFJRGlzcGF0Y2hlciBpbXBsZW1lbnRzIFByb3ZpZGVyRGlzcGF0Y2hlciB7XG4gIHJlYWRvbmx5IHRva2VuTWV0YWRhdGEgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5NZXRhZGF0YT4oKTtcbiAgcmVhZG9ubHkgdHJhbnNwb3J0S2luZDogT3BlbkFJVHJhbnNwb3J0S2luZDtcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0c0NhY2hlID0gbmV3IE1hcDxudW1iZXIsIE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSAmIHsgZ2VuZXJhdGlvbjogbnVtYmVyIH0+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ1JhdGVMaW1pdHMgPSBuZXcgTWFwPFxuICAgIG51bWJlcixcbiAgICB7IHRva2VuOiBUb2tlbk1ldGFkYXRhOyBnZW5lcmF0aW9uOiBudW1iZXI7IHByb21pc2U6IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPiB9XG4gID4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnRzID0gbmV3IE1hcDxudW1iZXIsIENsaWVudEVudHJ5PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJldGlyZWRDbGllbnRzID0gbmV3IFNldDxDbGllbnRFbnRyeT4oKTtcbiAgc3RhdGljIHJlYWRvbmx5IFJBVEVfTElNSVRTX0NBQ0hFX1RUTCA9IDYwXzAwMDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudEZhY3Rvcnk6IE9wZW5BSURpcmVjdENsaWVudEZhY3Rvcnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmV0Y2hJbXBsOiB0eXBlb2YgZmV0Y2g7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVvdGFCbG9ja2VkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIHByaXZhdGUgaW5GbGlnaHRDb3VudCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdHJhbnNwb3J0S2luZDogT3BlbkFJVHJhbnNwb3J0S2luZCA9IHJlc29sdmVPcGVuQUlUcmFuc3BvcnRLaW5kKCksXG4gICAgZGVwZW5kZW5jaWVzOiBPcGVuQUlEaXNwYXRjaGVyRGVwZW5kZW5jaWVzID0ge30sXG4gICkge1xuICAgIHRoaXMudHJhbnNwb3J0S2luZCA9IHRyYW5zcG9ydEtpbmQ7XG4gICAgdGhpcy5jbGllbnRGYWN0b3J5ID1cbiAgICAgIGRlcGVuZGVuY2llcy5jbGllbnRGYWN0b3J5ID8/ICgob3B0aW9ucykgPT4gbmV3IE9wZW5BSURpcmVjdENsaWVudChvcHRpb25zKSk7XG4gICAgdGhpcy5mZXRjaEltcGwgPSBkZXBlbmRlbmNpZXMuZmV0Y2ggPz8gZmV0Y2g7XG4gIH1cblxuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE1hbnkoXCJBXCIpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGlmIChyb3cucHJvdmlkZXIgIT09IFwib3BlbmFpXCIpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5zZXRUb2tlbihcbiAgICAgICAgcm93LmlkLFxuICAgICAgICByb3cubmFtZSxcbiAgICAgICAgcm93LmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgICAgICByb3cucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICByb3cud2VpZ2h0LFxuICAgICAgICByb3cuYWN0aXZlLFxuICAgICAgKTtcbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYHN0YXJ0ZWQgZGlyZWN0IE9wZW5BSSBydW50aW1lIHdpdGggJHt0aGlzLnRva2VuTWV0YWRhdGEuc2l6ZX0gdG9rZW5zYCk7XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgeyBjbGllbnQgfSBvZiB0aGlzLmNsaWVudHMudmFsdWVzKCkpIGNsaWVudC5jbG9zZT8uKCk7XG4gICAgdGhpcy5jbGllbnRzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLnJldGlyZWRDbGllbnRzKSBlbnRyeS5jbGllbnQuY2xvc2U/LigpO1xuICAgIHRoaXMucmV0aXJlZENsaWVudHMuY2xlYXIoKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlbkFkZGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zZXRUb2tlbihpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQsIHRydWUpO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlblVwZGF0ZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvbGQgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICB0aGlzLnNldFRva2VuKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCwgb2xkPy5hY3RpdmUgPz8gdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZXRpcmVDbGllbnQoaWQpO1xuICAgIHRoaXMudG9rZW5NZXRhZGF0YS5kZWxldGUoaWQpO1xuICAgIHRoaXMuc2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICAgIHRoaXMuaW52YWxpZGF0ZVJhdGVMaW1pdHNDYWNoZShpZCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWQuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIG9uVG9rZW5EZWFjdGl2YXRlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAodG9rZW4pIHRva2VuLmFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgfVxuXG4gIG9uVG9rZW5BY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldChpZCk7XG4gICAgaWYgKHRva2VuKSB0b2tlbi5hY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgfVxuXG4gIGFzeW5jIHJlcGxhY2VUb2tlbnMoXG4gICAgcm93czogQXJyYXk8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscztcbiAgICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHdlaWdodDogbnVtYmVyO1xuICAgIH0+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpZHMgPSBuZXcgU2V0KHJvd3MubWFwKChyKSA9PiByLmlkKSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiB0aGlzLnRva2VuTWV0YWRhdGEua2V5cygpKSBpZiAoIWlkcy5oYXMoaWQpKSBhd2FpdCB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKVxuICAgICAgYXdhaXQgdGhpcy5vblRva2VuVXBkYXRlZChyb3cuaWQsIHJvdy5uYW1lLCByb3cuY3JlZGVudGlhbHMsIHJvdy5xdW90YVRocmVzaG9sZCwgcm93LndlaWdodCk7XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5ydW4ocmVxKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbilcbiAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgICAgXCJnYXRlXCIsXG4gICAgICAgIFwiaW1hZ2UgZ2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzdHJlYW1pbmcgcGF0aFwiLFxuICAgICAgKTtcbiAgICB0cnkge1xuICAgICAgY2Iub25Db21wbGV0ZShhd2FpdCB0aGlzLnJ1bihyZXEsIGNiLm9uRGVsdGEpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2Iub25FcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBnZW5lcmF0ZS9nZW5lcmF0ZVN0cmVhbSDqs7XthrUg7Iuk7ZaJIOKAlCDthqDtgbAg7ISg7YOd6rO8IGluLWZsaWdodCDsp5Hqs4Trpbwg7ZWcIOqzs+yXkCDrkZTri6QuXG4gIHByaXZhdGUgYXN5bmMgcnVuKFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIG9uRGVsdGE/OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgY29uc3Qgc2lnbmFsID0gYWN0aXZlU2lnbmFsKHJlcS5hYm9ydFNpZ25hbCwgcmVxLnRpbWVvdXRNcyk7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHNpZ25hbCk7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gYXdhaXQgdGhpcy5zZWxlY3RUb2tlbihcbiAgICAgIHJlcS5wcmVmZXJyZWRUb2tlbklkLFxuICAgICAgcmVxLnJlcXVpcmVQcmVmZXJyZWRUb2tlbiA/PyBmYWxzZSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIHRoaXMuaW5GbGlnaHRDb3VudCsrO1xuICAgIHRyeSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRocm93IGFib3J0RXJyb3Ioc2lnbmFsKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bkRpcmVjdChzZWxlY3Rpb24sIHsgLi4ucmVxLCBhYm9ydFNpZ25hbDogc2lnbmFsIH0sIG9uRGVsdGEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmluRmxpZ2h0Q291bnQtLTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkRpcmVjdChcbiAgICBzZWxlY3Rpb246IFRva2VuU2VsZWN0aW9uLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIG9uRGVsdGE/OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZmlyc3REZWx0YUF0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRleHQgPSBcIlwiO1xuICAgIGxldCB1c2FnZSA9IHtcbiAgICAgIHRvdGFsVG9rZW5zOiAwLFxuICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICBvdXRwdXRUb2tlbnM6IDAsXG4gICAgICBjYWNoZWRJbnB1dFRva2VuczogMCxcbiAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgICB9O1xuICAgIGNvbnN0IGltYWdlczogR2VuZXJhdGVkSW1hZ2VbXSA9IFtdO1xuICAgIGxldCBpbWFnZUF0dGVtcHRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGF1dG8gPSByZXEuaW1hZ2VHZW5lcmF0aW9uID09PSBcImF1dG9cIjtcbiAgICBjb25zdCB0cmFuc3BhcmVudENhbGxzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBjb25zdCB0cmFuc3BhcmVudENhbGxJZHMgPSBuZXcgU2V0PHVua25vd24+KCk7XG4gICAgbGV0IHRyYW5zcGFyZW50QXR0ZW1wdGVkID0gZmFsc2U7XG4gICAgbGV0IGRyaXZlckNvbXBsZXRlZCA9IGZhbHNlO1xuICAgIGxldCBzZXJ2aW5nTW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHNlbGVjdGlvbi5tZXRhZGF0YTtcbiAgICBjb25zdCBjbGllbnRFbnRyeSA9IHRoaXMuYWNxdWlyZUNsaWVudChzZWxlY3Rpb24pO1xuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIGNsaWVudEVudHJ5LmNsaWVudC5yZXNwb25zZXMoXG4gICAgICAgIHJlcXVlc3RPcHRpb25zKHJlcSksXG4gICAgICAgIHJlcS5hYm9ydFNpZ25hbCxcbiAgICAgICkpIHtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwidGV4dC1kZWx0YVwiKSB7XG4gICAgICAgICAgZmlyc3REZWx0YUF0ID8/PSBEYXRlLm5vdygpO1xuICAgICAgICAgIHRleHQgKz0gZXZlbnQudGV4dDtcbiAgICAgICAgICBvbkRlbHRhPy4oZXZlbnQudGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAgICAgaW1hZ2VBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgIGltYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IGV2ZW50LmJhc2U2NCxcbiAgICAgICAgICAgIG1lZGlhVHlwZTogZXZlbnQubWltZVR5cGUsXG4gICAgICAgICAgICByZXZpc2VkUHJvbXB0OiBldmVudC5yZXZpc2VkUHJvbXB0ID8/IG51bGwsXG4gICAgICAgICAgICAuLi4oZXZlbnQuZ2VuZXJhdGlvbiA/IHsgZ2VuZXJhdGlvbjogZXZlbnQuZ2VuZXJhdGlvbiB9IDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwib3V0cHV0LWl0ZW1cIiAmJiBldmVudC5pdGVtLnR5cGUgPT09IFwiaW1hZ2VfZ2VuZXJhdGlvbl9jYWxsXCIpIHtcbiAgICAgICAgICBpbWFnZUF0dGVtcHRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoYXV0byAmJiBldmVudC50eXBlID09PSBcIm91dHB1dC1pdGVtXCIgJiYgZXZlbnQuaXRlbS50eXBlID09PSBcImZ1bmN0aW9uX2NhbGxcIikge1xuICAgICAgICAgIGlmIChldmVudC5pdGVtLm5hbWUgIT09IFRSQU5TUEFSRU5UX0lNQUdFX1RPT0wpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJVbmV4cGVjdGVkIGF1dG9tYXRpYyBpbWFnZSB0b29sIGNhbGxcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyYW5zcGFyZW50QXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cmFuc3BhcmVudENhbGxJZHMuYWRkKGV2ZW50Lml0ZW0uY2FsbF9pZCk7XG4gICAgICAgICAgaWYgKCFldmVudC5jb21wbGV0ZWQpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGlkID0gZXZlbnQuaXRlbS5jYWxsX2lkO1xuICAgICAgICAgIGxldCBhcmdzOiB1bmtub3duO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhcmdzID0gSlNPTi5wYXJzZShTdHJpbmcoZXZlbnQuaXRlbS5hcmd1bWVudHMpKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJJbnZhbGlkIHRyYW5zcGFyZW50IGltYWdlIGFyZ3VtZW50c1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGlkICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICAhaWQgfHxcbiAgICAgICAgICAgICFhcmdzIHx8XG4gICAgICAgICAgICB0eXBlb2YgYXJncyAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShhcmdzKSB8fFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoYXJncykubGVuZ3RoICE9PSAxIHx8XG4gICAgICAgICAgICAhKFwicHJvbXB0XCIgaW4gYXJncykgfHxcbiAgICAgICAgICAgIHR5cGVvZiBhcmdzLnByb21wdCAhPT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgICAgIWFyZ3MucHJvbXB0LnRyaW0oKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcIkludmFsaWQgdHJhbnNwYXJlbnQgaW1hZ2UgYXJndW1lbnRzXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJhbnNwYXJlbnRDYWxscy5oYXMoaWQpICYmIHRyYW5zcGFyZW50Q2FsbHMuZ2V0KGlkKSAhPT0gYXJncy5wcm9tcHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgICAgICAgICAgXCJpbmNvbXBsZXRlXCIsXG4gICAgICAgICAgICAgIFwiQ29uZmxpY3RpbmcgdHJhbnNwYXJlbnQgaW1hZ2UgdG9vbCBjYWxsc1wiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJhbnNwYXJlbnRDYWxscy5zZXQoaWQsIGFyZ3MucHJvbXB0KTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBcImNvbXBsZXRlZFwiICYmIGV2ZW50LnVzYWdlKSB7XG4gICAgICAgICAgZHJpdmVyQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXJ2aW5nTW9kZWwgPSBldmVudC5tb2RlbCA/PyBzZXJ2aW5nTW9kZWw7XG4gICAgICAgICAgdXNhZ2UgPSB7XG4gICAgICAgICAgICB0b3RhbFRva2VuczogZXZlbnQudXNhZ2UudG90YWxUb2tlbnMsXG4gICAgICAgICAgICBpbnB1dFRva2VuczogZXZlbnQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBvdXRwdXRUb2tlbnM6IGV2ZW50LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiBldmVudC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICAgICAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogZXZlbnQudXNhZ2UucmVhc29uaW5nVG9rZW5zLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGRyaXZlckNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgc2VydmluZ01vZGVsID0gZXZlbnQubW9kZWwgPz8gc2VydmluZ01vZGVsO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBldmVudC5lcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB0aHJvdyBldmVudC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGF1dG8gJiYgdHJhbnNwYXJlbnRBdHRlbXB0ZWQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFkcml2ZXJDb21wbGV0ZWQgfHxcbiAgICAgICAgICB0cmFuc3BhcmVudENhbGxzLnNpemUgIT09IDEgfHxcbiAgICAgICAgICB0cmFuc3BhcmVudENhbGxJZHMuc2l6ZSAhPT0gMSB8fFxuICAgICAgICAgIGltYWdlQXR0ZW1wdGVkXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgICAgICAgIFwiaW5jb21wbGV0ZVwiLFxuICAgICAgICAgICAgXCJFeHBlY3RlZCBvbmUgY29tcGxldGVkIHRyYW5zcGFyZW50IGltYWdlIGNhbGwgd2l0aG91dCBhbm90aGVyIGltYWdlIHRvb2xcIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXEuYWJvcnRTaWduYWw/LmFib3J0ZWQpIHRocm93IGFib3J0RXJyb3IocmVxLmFib3J0U2lnbmFsKTtcbiAgICAgICAgY29uc3QgcHJvbXB0ID0gWy4uLnRyYW5zcGFyZW50Q2FsbHMudmFsdWVzKCldWzBdITtcbiAgICAgICAgbGV0IGltYWdlQ29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgY2xpZW50RW50cnkuY2xpZW50LnJlc3BvbnNlcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogcmVxLm1vZGVsID8/IFwiXCIsXG4gICAgICAgICAgICAuLi4ocmVxLnN5c3RlbVByb21wdCA/IHsgaW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0IH0gOiB7fSksXG4gICAgICAgICAgICBoaXN0b3J5OiBbXG4gICAgICAgICAgICAgIC4uLmlucHV0SXRlbXMocmVxKSxcbiAgICAgICAgICAgICAgeyB0eXBlOiBcIm1lc3NhZ2VcIiwgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IFt7IHR5cGU6IFwiaW5wdXRfdGV4dFwiLCB0ZXh0OiBwcm9tcHQgfV0gfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IHtcbiAgICAgICAgICAgICAgcXVhbGl0eTogcmVxLmltYWdlR2VuZXJhdGlvbk9wdGlvbnM/LnF1YWxpdHksXG4gICAgICAgICAgICAgIHNpemU6IHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zPy5zaXplLFxuICAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0OiBcInBuZ1wiLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxLmFib3J0U2lnbmFsLFxuICAgICAgICApKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiaW1hZ2VcIilcbiAgICAgICAgICAgIGltYWdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgZGF0YTogZXZlbnQuYmFzZTY0LFxuICAgICAgICAgICAgICBtZWRpYVR5cGU6IGV2ZW50Lm1pbWVUeXBlLFxuICAgICAgICAgICAgICByZXZpc2VkUHJvbXB0OiBldmVudC5yZXZpc2VkUHJvbXB0ID8/IG51bGwsXG4gICAgICAgICAgICAgIC4uLihldmVudC5nZW5lcmF0aW9uID8geyBnZW5lcmF0aW9uOiBldmVudC5nZW5lcmF0aW9uIH0gOiB7fSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBlbHNlIGlmIChldmVudC50eXBlID09PSBcImNvbXBsZXRlZFwiKSBpbWFnZUNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gXCJlcnJvclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBldmVudC5lcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBpbWFnZUF0dGVtcHRlZCA9IHRydWU7XG4gICAgICAgIGlmICghaW1hZ2VDb21wbGV0ZWQpXG4gICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICAgICAgXCJpbmNvbXBsZXRlXCIsXG4gICAgICAgICAgICBcIlRyYW5zcGFyZW50IGltYWdlIGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZVwiLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoYXV0byAmJiBpbWFnZUF0dGVtcHRlZCAmJiAhZHJpdmVyQ29tcGxldGVkKVxuICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJpbmNvbXBsZXRlXCIsIFwiSW1hZ2UgZ2VuZXJhdGlvbiByZXNwb25zZSBkaWQgbm90IGNvbXBsZXRlXCIpO1xuICAgICAgaWYgKHJlcS5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcihyZXEuYWJvcnRTaWduYWwpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnJlbGVhc2VDbGllbnQoY2xpZW50RW50cnkpO1xuICAgIH1cbiAgICBpZiAoKHJlcS5pbWFnZUdlbmVyYXRpb24gPT09IHRydWUgfHwgKGF1dG8gJiYgaW1hZ2VBdHRlbXB0ZWQpKSAmJiBpbWFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXG4gICAgICAgIGltYWdlQXR0ZW1wdGVkID8gXCJpbmNvbXBsZXRlXCIgOiBcIm5vdF9jYWxsZWRcIixcbiAgICAgICAgaW1hZ2VBdHRlbXB0ZWRcbiAgICAgICAgICA/IFwiaW1hZ2UgZ2VuZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlXCJcbiAgICAgICAgICA6IFwibW9kZWwgZGlkIG5vdCBjYWxsIGltYWdlIGdlbmVyYXRpb25cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0LFxuICAgICAgdG9rZW5OYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgdXNhZ2UsXG4gICAgICBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgdHRmdE1zOiBmaXJzdERlbHRhQXQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBmaXJzdERlbHRhQXQgLSBzdGFydGVkQXQsXG4gICAgICBtb2RlbDogc2VydmluZ01vZGVsLFxuICAgICAgLi4uKHNlcnZpbmdNb2RlbCAhPT0gcmVxLm1vZGVsID8geyByZXF1ZXN0ZWRNb2RlbDogcmVxLm1vZGVsIH0gOiB7fSksXG4gICAgICB0aHJlYWRDb29yZDogeyB3b3JrZXJJZDogc2VsZWN0aW9uLnRva2VuSWQsIHRocmVhZElkOiByZXEucHJvbXB0Q2FjaGVLZXkgPz8gXCJcIiwgZXBvY2g6IC0xIH0sXG4gICAgICAuLi4oaW1hZ2VzLmxlbmd0aCA/IHsgaW1hZ2VzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiDshLjrjIDqsIAg67CU64CQIGNsaWVudCDripQg7IKs7JqpIOykkeyduCDsmpTssq3snbQg64Gd64KcIOuSpOyXkCDri6vripTri6QuICovXG4gIHByaXZhdGUgYWNxdWlyZUNsaWVudChzZWxlY3Rpb246IFRva2VuU2VsZWN0aW9uKTogQ2xpZW50RW50cnkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gc2VsZWN0aW9uLm1ldGFkYXRhO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuY2xpZW50cy5nZXQoc2VsZWN0aW9uLnRva2VuSWQpO1xuICAgIGlmIChlbnRyeSAmJiBlbnRyeS5nZW5lcmF0aW9uICE9PSBtZXRhZGF0YS5nZW5lcmF0aW9uKSB7XG4gICAgICB0aGlzLnJldGlyZUNsaWVudChzZWxlY3Rpb24udG9rZW5JZCk7XG4gICAgICBlbnRyeSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRGYWN0b3J5KFxuICAgICAgICB7XG4gICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBtZXRhZGF0YS5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIGFjY291bnRJZDogbWV0YWRhdGEuY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJhbnNwb3J0S2luZDogdGhpcy50cmFuc3BvcnRLaW5kLFxuICAgICAgICAgIGZldGNoOiB0aGlzLmZldGNoSW1wbCxcbiAgICAgICAgICByZWZyZXNoQ3JlZGVudGlhbHM6ICgpID0+IHRoaXMucmVmcmVzaENyZWRlbnRpYWxzKHNlbGVjdGlvbi50b2tlbklkKSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0aW9uLnRva2VuSWQsXG4gICAgICApO1xuICAgICAgZW50cnkgPSB7IGdlbmVyYXRpb246IG1ldGFkYXRhLmdlbmVyYXRpb24sIGNsaWVudCwgaW5GbGlnaHQ6IDAsIHJldGlyZWQ6IGZhbHNlIH07XG4gICAgICB0aGlzLmNsaWVudHMuc2V0KHNlbGVjdGlvbi50b2tlbklkLCBlbnRyeSk7XG4gICAgfVxuICAgIGVudHJ5LmluRmxpZ2h0Kys7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgcHJpdmF0ZSByZWxlYXNlQ2xpZW50KGVudHJ5OiBDbGllbnRFbnRyeSk6IHZvaWQge1xuICAgIGVudHJ5LmluRmxpZ2h0ID0gTWF0aC5tYXgoMCwgZW50cnkuaW5GbGlnaHQgLSAxKTtcbiAgICBpZiAoZW50cnkucmV0aXJlZCAmJiBlbnRyeS5pbkZsaWdodCA9PT0gMCkge1xuICAgICAgdGhpcy5yZXRpcmVkQ2xpZW50cy5kZWxldGUoZW50cnkpO1xuICAgICAgZW50cnkuY2xpZW50LmNsb3NlPy4oKTtcbiAgICB9XG4gIH1cblxuICAvKiogbWFwIOyXkOyEnCDrlrzslrTrgrTqs6AsIOynhO2WiSDspJHsnbgg7JqU7LKt7J20IOyXhuydhCDrlYzrp4wg7KaJ7IucIOuLq+uKlOuLpC4gKi9cbiAgcHJpdmF0ZSByZXRpcmVDbGllbnQodG9rZW5JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmNsaWVudHMuZ2V0KHRva2VuSWQpO1xuICAgIGlmICghZW50cnkpIHJldHVybjtcbiAgICB0aGlzLmNsaWVudHMuZGVsZXRlKHRva2VuSWQpO1xuICAgIGVudHJ5LnJldGlyZWQgPSB0cnVlO1xuICAgIGlmIChlbnRyeS5pbkZsaWdodCA9PT0gMCkgZW50cnkuY2xpZW50LmNsb3NlPy4oKTtcbiAgICBlbHNlIHRoaXMucmV0aXJlZENsaWVudHMuYWRkKGVudHJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthqDtgbAg7ISg7YOdIOKAlCBxdW90YSBnYXRlIOulvCDthrXqs7ztlZwgYWN0aXZlIO2GoO2BsCDspJHsl5DshJwg6rOg66W464ukLiBjYWNoZSBhZmZpbml0eSDshKDtmLhcbiAgICog7Yag7YGw7J20IGVsaWdpYmxlIO2VmOuptCDqt7gg7YyQ7KCV66eM7Jy866GcIOymieyLnCDqsrDsoJXtlZjqs6Ao7KCE7LK0IHN3ZWVwIOyDneuetSwgd2VpZ2h0ZWQg7IOB7YOcXG4gICAqIOu5hOuzgOqyvSksIOyVhOuLiOuptCDrs5HroKwgcXVvdGEg7YyQ7KCVIO2bhCBzbW9vdGggd2VpZ2h0ZWQgcm91bmQtcm9iaW4uIOuPmeyLnOyEsSDsg4HtlZzsnbRcbiAgICog7JeG7Jy866+A66GcIFwi67mIIOyekOumrFwiIOqwnOuFkOuPhCDsl4bri6Qg4oCUIOyEoO2DnSDsponsi5wg7Iuk7ZaJ7J2064ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZWxlY3RUb2tlbihcbiAgICBwcmVmZXJyZWRUb2tlbklkOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgcmVxdWlyZVByZWZlcnJlZFRva2VuOiBib29sZWFuLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VG9rZW5TZWxlY3Rpb24+IHtcbiAgICBpZiAocHJlZmVycmVkVG9rZW5JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwcmVmZXJyZWQgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHByZWZlcnJlZFRva2VuSWQpO1xuICAgICAgaWYgKHByZWZlcnJlZD8uYWN0aXZlICYmIChhd2FpdCB0aGlzLmlzUXVvdGFFbGlnaWJsZShwcmVmZXJyZWRUb2tlbklkLCBwcmVmZXJyZWQsIHNpZ25hbCkpKSB7XG4gICAgICAgIHJldHVybiB7IHRva2VuSWQ6IHByZWZlcnJlZFRva2VuSWQsIG1ldGFkYXRhOiBwcmVmZXJyZWQgfTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXF1aXJlUHJlZmVycmVkVG9rZW4pIHtcbiAgICAgICAgaWYgKCFwcmVmZXJyZWQ/LmFjdGl2ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJlZmVycmVkIG9wZW5haSB0b2tlbiAke3ByZWZlcnJlZFRva2VuSWR9IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSBwcmVmZXJyZWQucXVvdGFUaHJlc2hvbGQ7XG4gICAgICAgIGlmICh0aHJlc2hvbGQgIT09IG51bGwgJiYgdGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKFxuICAgICAgICAgICAgcXVvdGFNZXNzYWdlKFt7IG5hbWU6IHByZWZlcnJlZC5uYW1lLCB0aHJlc2hvbGQgfV0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDthqDtgbDrs4QgcXVvdGEg7YyQ7KCV7J2AIOyEnOuhnCDrj4Xrpr3snbTrnbwg67OR66Cs66GcIOKAlCDsp4HroKwg64yA6riw64qUIOy9nOuTnCDsupDsi5zsl5DshJxcbiAgICAvLyDthqDtgbAg7IiYIMOXIOyhsO2ajCDsp4Dsl7Drp4ztgbwg7JqU7LKtIOyLnOyekeydhCDriqbstpjri6QuXG4gICAgY29uc3QgY2hlY2tzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBbLi4udGhpcy50b2tlbk1ldGFkYXRhLmVudHJpZXMoKV1cbiAgICAgICAgLmZpbHRlcigoWywgdG9rZW5dKSA9PiB0b2tlbi5hY3RpdmUpXG4gICAgICAgIC5tYXAoYXN5bmMgKFtpZCwgdG9rZW5dKSA9PiAoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIHRva2VuLFxuICAgICAgICAgIGVsaWdpYmxlOiBhd2FpdCB0aGlzLmlzUXVvdGFFbGlnaWJsZShpZCwgdG9rZW4sIHNpZ25hbCksXG4gICAgICAgIH0pKSxcbiAgICApO1xuICAgIGNvbnN0IGVsaWdpYmxlID0gbmV3IFNldChjaGVja3MuZmlsdGVyKChjKSA9PiBjLmVsaWdpYmxlKS5tYXAoKGMpID0+IGMuaWQpKTtcbiAgICBpZiAoZWxpZ2libGUuc2l6ZSA9PT0gMCkge1xuICAgICAgY29uc3Qgb3ZlciA9IGNoZWNrc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgIWMuZWxpZ2libGUgJiYgYy50b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gbnVsbCAmJiBjLnRva2VuLnF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQsXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoYykgPT4gKHsgbmFtZTogYy50b2tlbi5uYW1lLCB0aHJlc2hvbGQ6IGMudG9rZW4ucXVvdGFUaHJlc2hvbGQgYXMgbnVtYmVyIH0pKTtcbiAgICAgIGlmIChvdmVyLmxlbmd0aCkge1xuICAgICAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IG92ZXIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKHF1b3RhTWVzc2FnZShvdmVyKSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdG9yLnNlbGVjdChlbGlnaWJsZSk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBzZWxlY3RlZCAhPT0gbnVsbCA/IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoc2VsZWN0ZWQpIDogdW5kZWZpbmVkO1xuICAgIGlmIChzZWxlY3RlZCA9PT0gbnVsbCB8fCAhbWV0YWRhdGEpIHRocm93IG5ldyBFcnJvcihcIk5PX09QRU5BSV9XT1JLRVJTXCIpO1xuICAgIHJldHVybiB7IHRva2VuSWQ6IHNlbGVjdGVkLCBtZXRhZGF0YSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUb2tlbihcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgd2VpZ2h0OiBudW1iZXIsXG4gICAgYWN0aXZlOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvbGQgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAob2xkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG9sZCwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBjcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQsXG4gICAgICAgIHdlaWdodCxcbiAgICAgICAgYWN0aXZlLFxuICAgICAgICBnZW5lcmF0aW9uOiBvbGQuZ2VuZXJhdGlvbiArIDEsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBjcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQsXG4gICAgICAgIHdlaWdodCxcbiAgICAgICAgYWN0aXZlLFxuICAgICAgICBnZW5lcmF0aW9uOiAxLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZC5kZWxldGUoaWQpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UmF0ZUxpbWl0c0J5VG9rZW5JZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpO1xuICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcihgb3BlbmFpIHRva2VuICR7dG9rZW5JZH0gbm90IGZvdW5kYCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRva2VuLmdlbmVyYXRpb247XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5yYXRlTGltaXRzQ2FjaGUuZ2V0KHRva2VuSWQpO1xuICAgIGlmIChcbiAgICAgIGNhY2hlZCAmJlxuICAgICAgY2FjaGVkLmdlbmVyYXRpb24gPT09IHRva2VuLmdlbmVyYXRpb24gJiZcbiAgICAgIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBPcGVuQUlEaXNwYXRjaGVyLlJBVEVfTElNSVRTX0NBQ0hFX1RUTFxuICAgIClcbiAgICAgIHJldHVybiBjYWNoZWQ7XG5cbiAgICAvLyBzaW5nbGUtZmxpZ2h0OiDrj5nsi5zshLEg7IOB7ZWc7J20IOyXhuyWtOynhCDrkqTroZwgVFRMIOunjOujjCDsiJzqsIQg64+Z7IucIOyalOyyrSDsiJjrp4ztgbwg6rCZ7J2AXG4gICAgLy8g7KGw7ZqM6rCAIOuqsOumtCDsiJgg7J6I64ukIOKAlCDsp4Ttlokg7KSR7J24IGZldGNoIOulvCDqs7XsnKDtlZzri6QuIOy1nOy0iCDtmLjstpzsnpDsnZggYWJvcnQg66GcXG4gICAgLy8g6rO17JygIOyhsO2ajOqwgCDsi6TtjKjtlbTrj4Qg7IaM67mE7LKYKGlzUXVvdGFFbGlnaWJsZSnqsIAgZmFpbC1vcGVuIOycvOuhnCDsspjrpqztlZzri6QuXG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhdGVMaW1pdHMuZ2V0KHRva2VuSWQpO1xuICAgIGlmIChwZW5kaW5nPy50b2tlbiA9PT0gdG9rZW4gJiYgcGVuZGluZy5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uKSByZXR1cm4gcGVuZGluZy5wcm9taXNlO1xuICAgIGNvbnN0IGZldGNoUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkT3BlbkFJUXVvdGFVc2FnZSh7XG4gICAgICAgIGNyZWRlbnRpYWxzOiB0b2tlbi5jcmVkZW50aWFscyxcbiAgICAgICAgcmVmcmVzaENyZWRlbnRpYWxzOiAoKSA9PiB0aGlzLnJlZnJlc2hDcmVkZW50aWFscyh0b2tlbklkKSxcbiAgICAgICAgZmV0Y2g6IHRoaXMuZmV0Y2hJbXBsLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdC5raW5kID09PSBcImxvb2t1cF9mYWlsZWRcIikgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5yZWFzb24pO1xuICAgICAgaWYgKCFyZXN1bHQucmF3KSB0aHJvdyBuZXcgRXJyb3IoXCJPcGVuQUkgcXVvdGEgcmVzcG9uc2UgbWlzc2luZyByYXcgcmF0ZSBsaW1pdHNcIik7XG4gICAgICBjb25zdCBlbnRyeSA9IHsgZGF0YTogcmVzdWx0LnJhdywgY2FjaGVkQXQ6IERhdGUubm93KCksIGdlbmVyYXRpb24gfTtcbiAgICAgIGlmICh0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpID09PSB0b2tlbiAmJiB0b2tlbi5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uKSB7XG4gICAgICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLnNldCh0b2tlbklkLCBlbnRyeSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSkoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdSYXRlTGltaXRzLmdldCh0b2tlbklkKT8ucHJvbWlzZSA9PT0gZmV0Y2hQcm9taXNlKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1JhdGVMaW1pdHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZ1JhdGVMaW1pdHMuc2V0KHRva2VuSWQsIHsgdG9rZW4sIGdlbmVyYXRpb24sIHByb21pc2U6IGZldGNoUHJvbWlzZSB9KTtcbiAgICByZXR1cm4gZmV0Y2hQcm9taXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoQ3JlZGVudGlhbHModG9rZW5JZDogbnVtYmVyKSB7XG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSBwcmV2aW91cz8uZ2VuZXJhdGlvbjtcbiAgICBjb25zdCByZWZyZXNoZWQgPSBhd2FpdCBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2godG9rZW5JZCk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSB7XG4gICAgICBhY2Nlc3NUb2tlbjogcmVmcmVzaGVkLmFjY2Vzc1Rva2VuLFxuICAgICAgYWNjb3VudElkOiByZWZyZXNoZWQuY2hhdGdwdEFjY291bnRJZCxcbiAgICB9O1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpO1xuICAgIGlmICghY3VycmVudD8uYWN0aXZlKSB0aHJvdyBuZXcgRXJyb3IoYG9wZW5haSB0b2tlbiAke3Rva2VuSWR9IGlzIG5vIGxvbmdlciBhY3RpdmVgKTtcbiAgICAvLyBBIHN1YnNjcmliZXIgdXBkYXRlIG1heSBhbHJlYWR5IGNvbnRhaW4gbmV3ZXIgY3JlZGVudGlhbHMuIE5ldmVyIG92ZXJ3cml0ZSBpdFxuICAgIC8vIHdpdGggdGhlIHJlc3VsdCBvZiBhIHJlZnJlc2ggdGhhdCBzdGFydGVkIGFnYWluc3QgYW4gb2xkZXIgZ2VuZXJhdGlvbi5cbiAgICBpZiAoY3VycmVudCA9PT0gcHJldmlvdXMgJiYgY3VycmVudC5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uKSB7XG4gICAgICBjdXJyZW50LmNyZWRlbnRpYWxzID0geyAuLi5jdXJyZW50LmNyZWRlbnRpYWxzLCAuLi5jcmVkZW50aWFscyB9O1xuICAgICAgdGhpcy5yZXRpcmVDbGllbnQodG9rZW5JZCk7XG4gICAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUodG9rZW5JZCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhY2Nlc3NUb2tlbjogY3VycmVudC5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3VycmVudC5jcmVkZW50aWFscy5hY2NvdW50SWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaXNRdW90YUVsaWdpYmxlKFxuICAgIGlkOiBudW1iZXIsXG4gICAgdG9rZW46IFRva2VuTWV0YWRhdGEsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0b2tlbi5xdW90YVRocmVzaG9sZCA9PT0gbnVsbCB8fCB0b2tlbi5xdW90YVRocmVzaG9sZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gdG9rZW4uZ2VuZXJhdGlvbjtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkT3BlbkFJUXVvdGFVc2FnZShhc3luYyAoKSA9PiB0aGlzLmdldFJhdGVMaW1pdHNCeVRva2VuSWQoaWQsIHNpZ25hbCkpO1xuICAgIGlmICh0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKSAhPT0gdG9rZW4gfHwgdG9rZW4uZ2VuZXJhdGlvbiAhPT0gZ2VuZXJhdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyZXN1bHQua2luZCA9PT0gXCJsb29rdXBfZmFpbGVkXCIpIHtcbiAgICAgIHRoaXMucXVvdGFCbG9ja2VkLmRlbGV0ZShpZCk7XG4gICAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBsb29rdXBfZmFpbF9vcGVuXCIsIHtcbiAgICAgICAgdG9rZW5JZDogaWQsXG4gICAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgICAgbG9va3VwUmVhc29uOiByZXN1bHQucmVhc29uLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC51dGlsaXphdGlvblBjdCA+PSB0b2tlbi5xdW90YVRocmVzaG9sZCkge1xuICAgICAgaWYgKCF0aGlzLnF1b3RhQmxvY2tlZC5oYXMoaWQpKVxuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgcXVvdGFfdGhyZXNob2xkIGdhdGU6IG92ZXJfdGhyZXNob2xkICR7dG9rZW4ubmFtZX1bJHtpZH1dICgke3Jlc3VsdC51dGlsaXphdGlvblBjdH0lID49ICR7dG9rZW4ucXVvdGFUaHJlc2hvbGR9JSlgLFxuICAgICAgICApO1xuICAgICAgdGhpcy5xdW90YUJsb2NrZWQuYWRkKGlkKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVvdGFCbG9ja2VkLmRlbGV0ZShpZCkpXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYHF1b3RhX3RocmVzaG9sZCBnYXRlOiByZWNvdmVyZWQgJHt0b2tlbi5uYW1lfVske2lkfV0gKCR7cmVzdWx0LnV0aWxpemF0aW9uUGN0fSUgPCAke3Rva2VuLnF1b3RhVGhyZXNob2xkfSUpYCxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLmRlbGV0ZShpZCk7XG4gIH1cblxuICBnZXQgdG9rZW5Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbk1ldGFkYXRhLnZhbHVlcygpXS5maWx0ZXIoKHQpID0+IHQuYWN0aXZlKS5sZW5ndGg7XG4gIH1cbiAgZ2V0IGluRmxpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaW5GbGlnaHRDb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiDthqDtgbDrs4Qg7L+87YSwIOyKpOuDheyDtyDigJQg7Iug7ISg7ZWcKHJhdGUgbGltaXRzIFRUTCDrgrQpIOy6kOyLnOunjCDsnb3qs6Ag7KCI64yAIGZldGNoIO2VmOyngCDslYrripTri6QuXG4gICAqIG1vbml0IHZpdGFscyDripQg66Gc6re4IO2PtOungeyXkCDtjrjsirntlZjripQg6rCS7J206528IOyXrOq4sOyEnCDrhKTtirjsm4ztgazrpbwg7YOA66m0IOyViCDrkJzri6QuXG4gICAqIHRocmVzaG9sZCDrr7jshKTsoJUg7Yag7YGw7J2AIOy/vO2EsCDtjJDsoJXsnYQg64+M7KeAIOyViuyVhCB1c2VkUGVyY2VudCDqsIAgbnVsbCDroZwg64Ko7J2EIOyImCDsnojri6QuXG4gICAqL1xuICBnZXQgcXVvdGFCeVRva2VuKCk6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdXNlZFBlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gICAgdGhyZXNob2xkOiBudW1iZXIgfCBudWxsO1xuICAgIGJsb2NrZWQ6IGJvb2xlYW47XG4gICAgcmVzZXRzQXQ6IG51bWJlciB8IG51bGw7XG4gIH0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbk1ldGFkYXRhLmVudHJpZXMoKV1cbiAgICAgIC5tYXAoKFtpZCwgdF0pID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5yYXRlTGltaXRzQ2FjaGUuZ2V0KGlkKTtcbiAgICAgICAgY29uc3QgZnJlc2ggPVxuICAgICAgICAgIGNhY2hlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgY2FjaGVkLmdlbmVyYXRpb24gPT09IHQuZ2VuZXJhdGlvbiAmJlxuICAgICAgICAgIG5vdyAtIGNhY2hlZC5jYWNoZWRBdCA8IE9wZW5BSURpc3BhdGNoZXIuUkFURV9MSU1JVFNfQ0FDSEVfVFRMO1xuICAgICAgICBjb25zdCBwcmltYXJ5ID0gZnJlc2ggPyBjYWNoZWQuZGF0YS5yYXRlTGltaXRzPy5wcmltYXJ5IDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHQubmFtZSxcbiAgICAgICAgICB1c2VkUGVyY2VudDogcHJpbWFyeT8udXNlZFBlcmNlbnQgPz8gbnVsbCxcbiAgICAgICAgICB0aHJlc2hvbGQ6IHQucXVvdGFUaHJlc2hvbGQgPz8gbnVsbCxcbiAgICAgICAgICBibG9ja2VkOiB0aGlzLnF1b3RhQmxvY2tlZC5oYXMoaWQpLFxuICAgICAgICAgIC8vIHdoYW0g7J2YIHJlc2V0c0F0IOydgCB1bml4IOy0iCDri6jsnITri6QocWdyaWQuZnJhbWUgdW5peFNlY29uZHNUb0lzbyDsmYAg64+Z7J28IOq3nOyVvSkuXG4gICAgICAgICAgLy8g7IaM67mE7LKY6rCAIOuLqOychOulvCDstpTsuKHtlZjsp4Ag7JWK64+E66GdIOyXrOq4sOyEnCBtcyBlcG9jaCDsnLzroZwg7KCV6rec7ZmU7ZWc64ukLlxuICAgICAgICAgIHJlc2V0c0F0OlxuICAgICAgICAgICAgcHJpbWFyeT8ucmVzZXRzQXQgIT09IG51bGwgJiYgcHJpbWFyeT8ucmVzZXRzQXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHByaW1hcnkucmVzZXRzQXQgKiAxMDAwXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUF3QkEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLG1CQUFtQixDQUFDO0FBR3ZELE1BQU0sNkJBQTZCO0FBQ25DLE1BQU0seUJBQXlCO0FBSS9CLElBQWEsdUJBQWIsY0FBMEMsTUFBTTtDQUVuQztDQURYLFlBQ0UsTUFDQSxTQUNBO0VBQ0EsTUFBTSxPQUFPO0VBSEosS0FBQSxPQUFBO0VBSVQsS0FBSyxPQUFPO0NBQ2Q7QUFDRjtBQThCQSxTQUFTLFdBQVcsUUFBNEI7Q0FDOUMsTUFBTSxTQUFTLE9BQU87Q0FDdEIsT0FBTyxrQkFBa0IsUUFBUSxTQUFTLElBQUksYUFBYSxXQUFXLFlBQVk7QUFDcEY7QUFFQSxTQUFTLGFBQWEsUUFBc0IsV0FBaUM7Q0FDM0UsTUFBTSxVQUFVLFlBQVksUUFBUSxhQUFhLDBCQUEwQjtDQUMzRSxPQUFPLFNBQVMsWUFBWSxJQUFJLENBQUMsUUFBUSxPQUFPLENBQUMsSUFBSTtB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
|
|
569
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyByZXNvbHZlT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4uL2NvbW1vbi9lZmZvcnRcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIEdlbmVyYXRlZEltYWdlLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4gfSBmcm9tIFwiLi4vY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2JpblwiO1xuaW1wb3J0IHsgVGhpbmtpbmdWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vY29tbW9uL3RoaW5raW5nXCI7XG5pbXBvcnQge1xuICB0eXBlIEpzb25WYWx1ZSxcbiAgdHlwZSBPcGVuQUlSZXNwb25zZUl0ZW0sXG4gIHR5cGUgT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbn0gZnJvbSBcIi4vb3BlbmFpLWJhY2tlbmQtcHJvdG9jb2xcIjtcbmltcG9ydCB7IE9wZW5BSURpcmVjdENsaWVudCwgdHlwZSBPcGVuQUlEaXJlY3RDbGllbnRPcHRpb25zIH0gZnJvbSBcIi4vb3BlbmFpLWRpcmVjdC1jbGllbnRcIjtcbmltcG9ydCB7IHJlYWRPcGVuQUlRdW90YVVzYWdlLCB0eXBlIE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSB9IGZyb20gXCIuL29wZW5haS1xdW90YVwiO1xuaW1wb3J0IHsgaGFuZGxlQ2hhdGdwdEF1dGhUb2tlbnNSZWZyZXNoIH0gZnJvbSBcIi4vb3BlbmFpLXJlZnJlc2hcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJVHJhbnNwb3J0S2luZCwgcmVzb2x2ZU9wZW5BSVRyYW5zcG9ydEtpbmQgfSBmcm9tIFwiLi9vcGVuYWktdHJhbnNwb3J0LWNvbmZpZ1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvcGVuYWktZGlzcGF0Y2hlclwiXSk7XG4vLyBWZXJpZmllZCB3aXRoIHRoZSBzdWJzY3JpcHRpb24gUmVzcG9uc2VzIGJhY2tlbmQ7IHB1YmxpYyBBUEkgc3VwcG9ydCBpcyBub3Qgc3VmZmljaWVudC5cbmNvbnN0IFRISU5LSU5HX09GRl9NT0RFTFMgPSBuZXcgU2V0KFtcbiAgXCJncHQtNi1zb2xcIixcbiAgXCJncHQtNi1sdW5hXCIsXG4gIFwiZ3B0LTUuNi1zb2xcIixcbiAgXCJncHQtNS42LXRlcnJhXCIsXG4gIFwiZ3B0LTUuNi1sdW5hXCIsXG4gIFwiZ3B0LTUuNVwiLFxuXSk7XG5jb25zdCBERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9NUyA9IDYwMF8wMDA7XG5jb25zdCBUUkFOU1BBUkVOVF9JTUFHRV9UT09MID0gXCJnZW5lcmF0ZV90cmFuc3BhcmVudF9pbWFnZVwiO1xuXG5leHBvcnQgdHlwZSBJbWFnZUZhaWx1cmVLaW5kID0gXCJnYXRlXCIgfCBcIm5vdF9jYWxsZWRcIiB8IFwiaW5jb21wbGV0ZVwiO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VHZW5lcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IEltYWdlRmFpbHVyZUtpbmQsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkltYWdlR2VuZXJhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxudHlwZSBUb2tlbk1ldGFkYXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscztcbiAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgYWN0aXZlOiBib29sZWFuO1xuICBnZW5lcmF0aW9uOiBudW1iZXI7XG59O1xuXG50eXBlIFRva2VuU2VsZWN0aW9uID0geyB0b2tlbklkOiBudW1iZXI7IG1ldGFkYXRhOiBUb2tlbk1ldGFkYXRhIH07XG5cbmV4cG9ydCB0eXBlIE9wZW5BSURpcmVjdENsaWVudEZhY3RvcnkgPSAoXG4gIG9wdGlvbnM6IE9wZW5BSURpcmVjdENsaWVudE9wdGlvbnMsXG4gIHRva2VuSWQ6IG51bWJlcixcbikgPT4gUGljazxPcGVuQUlEaXJlY3RDbGllbnQsIFwicmVzcG9uc2VzXCI+ICYgeyBjbG9zZT86ICgpID0+IHZvaWQgfTtcblxudHlwZSBDbGllbnRFbnRyeSA9IHtcbiAgZ2VuZXJhdGlvbjogbnVtYmVyO1xuICBjbGllbnQ6IFBpY2s8T3BlbkFJRGlyZWN0Q2xpZW50LCBcInJlc3BvbnNlc1wiPiAmIHsgY2xvc2U/OiAoKSA9PiB2b2lkIH07XG4gIGluRmxpZ2h0OiBudW1iZXI7XG4gIHJldGlyZWQ6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSURpc3BhdGNoZXJEZXBlbmRlbmNpZXMge1xuICBjbGllbnRGYWN0b3J5PzogT3BlbkFJRGlyZWN0Q2xpZW50RmFjdG9yeTtcbiAgZmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG59XG5cbmZ1bmN0aW9uIGFib3J0RXJyb3Ioc2lnbmFsOiBBYm9ydFNpZ25hbCk6IEVycm9yIHtcbiAgY29uc3QgcmVhc29uID0gc2lnbmFsLnJlYXNvbjtcbiAgcmV0dXJuIHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uIDogbmV3IERPTUV4Y2VwdGlvbihcIkFib3J0ZWRcIiwgXCJBYm9ydEVycm9yXCIpO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVTaWduYWwoc2lnbmFsPzogQWJvcnRTaWduYWwsIHRpbWVvdXRNcz86IG51bWJlcik6IEFib3J0U2lnbmFsIHtcbiAgY29uc3QgdGltZW91dCA9IEFib3J0U2lnbmFsLnRpbWVvdXQodGltZW91dE1zID8/IERFRkFVTFRfUkVRVUVTVF9USU1FT1VUX01TKTtcbiAgcmV0dXJuIHNpZ25hbCA/IEFib3J0U2lnbmFsLmFueShbc2lnbmFsLCB0aW1lb3V0XSkgOiB0aW1lb3V0O1xufVxuXG5mdW5jdGlvbiBxdW90YU1lc3NhZ2UoZW50cmllczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+KTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlsID0gZW50cmllcy5tYXAoKGUpID0+IGAke2UubmFtZX0gKHRocmVzaG9sZCAke2UudGhyZXNob2xkfSUpYCkuam9pbihcIiwgXCIpO1xuICByZXR1cm4gZGV0YWlsXG4gICAgPyBgQWxsIG9wZW5haSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkOiAke2RldGFpbH1gXG4gICAgOiBcIkFsbCBvcGVuYWkgdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZFwiO1xufVxuXG5mdW5jdGlvbiBpbnB1dEl0ZW1zKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogT3BlbkFJUmVzcG9uc2VJdGVtW10ge1xuICBjb25zdCBoaXN0b3J5ID0gKHJlcS5jb2xkSGlzdG9yeSA/PyBbXSkgYXMgT3BlbkFJUmVzcG9uc2VJdGVtW107XG4gIGNvbnN0IGNvbnRlbnQ6IE9wZW5BSVJlc3BvbnNlSXRlbVtdID0gcmVxLmNvbGRJbnB1dC5tYXAoKGlucHV0KSA9PiB7XG4gICAgaWYgKGlucHV0LnR5cGUgPT09IFwidGV4dFwiKSByZXR1cm4geyB0eXBlOiBcImlucHV0X3RleHRcIiwgdGV4dDogaW5wdXQudGV4dCB9O1xuICAgIGlmIChpbnB1dC50eXBlID09PSBcImltYWdlXCIpIHJldHVybiB7IHR5cGU6IFwiaW5wdXRfaW1hZ2VcIiwgaW1hZ2VfdXJsOiBpbnB1dC51cmwgfTtcbiAgICBpZiAoaW5wdXQudHlwZSA9PT0gXCJsb2NhbEltYWdlXCIpIHJldHVybiB7IHR5cGU6IFwiaW5wdXRfaW1hZ2VcIiwgaW1hZ2VfdXJsOiBpbnB1dC5wYXRoIH07XG4gICAgcmV0dXJuIHsgdHlwZTogXCJpbnB1dF90ZXh0XCIsIHRleHQ6IGAke2lucHV0Lm5hbWV9OiAke2lucHV0LnBhdGh9YCB9O1xuICB9KTtcbiAgcmV0dXJuIFsuLi5oaXN0b3J5LCB7IHR5cGU6IFwibWVzc2FnZVwiLCByb2xlOiBcInVzZXJcIiwgY29udGVudCB9XTtcbn1cblxuZnVuY3Rpb24gYXNSZWFzb25pbmcocmVxOiBHZW5lcmF0ZVJlcXVlc3QpOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zW1wicmVhc29uaW5nXCJdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlcS50aGlua2luZyA9PT0gZmFsc2UpIHJldHVybiB7IGVmZm9ydDogXCJub25lXCIgfTtcbiAgY29uc3Qgc3VtbWFyeSA9XG4gICAgcmVxLnJlYXNvbmluZ1N1bW1hcnkgJiYgcmVxLnJlYXNvbmluZ1N1bW1hcnkgIT09IFwibm9uZVwiID8gcmVxLnJlYXNvbmluZ1N1bW1hcnkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGVmZm9ydCA9XG4gICAgcmVzb2x2ZU9wZW5BSUVmZm9ydChyZXEubW9kZWwgPz8gXCJcIiwgcmVxLmVmZm9ydCkgPz8gKHJlcS50aGlua2luZyA9PT0gdHJ1ZSA/IFwibG93XCIgOiB1bmRlZmluZWQpO1xuICBpZiAoIWVmZm9ydCAmJiAhc3VtbWFyeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICAuLi4oZWZmb3J0ID8geyBlZmZvcnQgfSA6IHt9KSxcbiAgICAuLi4oc3VtbWFyeVxuICAgICAgPyB7XG4gICAgICAgICAgc3VtbWFyeTogc3VtbWFyeSBhcyBOb25OdWxsYWJsZTxPcGVuQUlSZXNwb25zZXNPcHRpb25zW1wicmVhc29uaW5nXCJdPltcInN1bW1hcnlcIl0sXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0T3B0aW9ucyhyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnMge1xuICBjb25zdCB7IG91dHB1dEZvcm1hdCwgLi4uaW1hZ2VDb250cm9scyB9ID0gcmVxLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMgPz8ge307XG4gIGNvbnN0IGF1dG8gPSByZXEuaW1hZ2VHZW5lcmF0aW9uID09PSBcImF1dG9cIjtcbiAgaWYgKGF1dG8gJiYgcmVxLm91dHB1dFNjaGVtYSkge1xuICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgIFwiZ2F0ZVwiLFxuICAgICAgXCJBdXRvbWF0aWMgaW1hZ2UgZ2VuZXJhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHN0cnVjdHVyZWQgb3V0cHV0IG9yIGV4dGVybmFsIHRvb2xzXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1vZGVsOiByZXEubW9kZWwgPz8gXCJcIixcbiAgICAuLi4ocmVxLnN5c3RlbVByb21wdCA/IHsgaW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0IH0gOiB7fSksXG4gICAgLi4uKGF1dG9cbiAgICAgID8ge1xuICAgICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICAgcmVxLnN5c3RlbVByb21wdCxcbiAgICAgICAgICAgIFwiVXNlIGltYWdlX2dlbmVyYXRpb24gZm9yIG9yZGluYXJ5IGltYWdlIGdlbmVyYXRpb24gb3IgZWRpdGluZy4gVXNlIGdlbmVyYXRlX3RyYW5zcGFyZW50X2ltYWdlIG9ubHkgd2hlbiBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQgaXMgcmVxdWVzdGVkLiBUZXh0IHJlcGxpZXMgYXJlIGFsbG93ZWQgd2hlbiBubyBpbWFnZSBpcyBuZWVkZWQuIFVzZSBvbmx5IG9uZSBraW5kIG9mIGltYWdlIHRvb2wgcGVyIHJlc3BvbnNlLCBhbmQgYXQgbW9zdCBvbmUgZ2VuZXJhdGVfdHJhbnNwYXJlbnRfaW1hZ2UgY2FsbC5cIixcbiAgICAgICAgICBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbihcIlxcblxcblwiKSxcbiAgICAgICAgICBwYXJhbGxlbFRvb2xDYWxsczogZmFsc2UsXG4gICAgICAgICAgdG9vbHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgICBuYW1lOiBUUkFOU1BBUkVOVF9JTUFHRV9UT09MLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICBcIkdlbmVyYXRlIG9yIGVkaXQgYW4gaW1hZ2Ugd2l0aCBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQgdXNpbmcgdGhlIGNvbnZlcnNhdGlvbidzIHJlZmVyZW5jZSBpbWFnZXMuXCIsXG4gICAgICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgcHJvbXB0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgIFwiQ29tcGxldGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgdHJhbnNwYXJlbnQgaW1hZ2UgZ2VuZXJhdGlvbiBvciBlZGl0LlwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBbXCJwcm9tcHRcIl0sXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICBoaXN0b3J5OiBpbnB1dEl0ZW1zKHJlcSksXG4gICAgLi4uKGFzUmVhc29uaW5nKHJlcSkgPyB7IHJlYXNvbmluZzogYXNSZWFzb25pbmcocmVxKSB9IDoge30pLFxuICAgIC4uLihyZXEudmVyYm9zaXR5ID8geyB2ZXJib3NpdHk6IHJlcS52ZXJib3NpdHkgYXMgT3BlbkFJUmVzcG9uc2VzT3B0aW9uc1tcInZlcmJvc2l0eVwiXSB9IDoge30pLFxuICAgIC4uLihyZXEuc2VydmljZVRpZXJcbiAgICAgID8geyBzZXJ2aWNlVGllcjogcmVxLnNlcnZpY2VUaWVyID09PSBcImZhc3RcIiA/IFwicHJpb3JpdHlcIiA6IHJlcS5zZXJ2aWNlVGllciB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocmVxLnByb21wdENhY2hlS2V5ID8geyBwcm9tcHRDYWNoZUtleTogcmVxLnByb21wdENhY2hlS2V5IH0gOiB7fSksXG4gICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogeyBzY2hlbWE6IHJlcS5vdXRwdXRTY2hlbWEgYXMgSnNvblZhbHVlIH0gfSA6IHt9KSxcbiAgICAuLi4ocmVxLmltYWdlR2VuZXJhdGlvblxuICAgICAgPyB7XG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiByZXEuaW1hZ2VHZW5lcmF0aW9uT3B0aW9uc1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgLi4uaW1hZ2VDb250cm9scyxcbiAgICAgICAgICAgICAgICAuLi4oYXV0byA/IHsgYmFja2dyb3VuZDogXCJhdXRvXCIgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi4ob3V0cHV0Rm9ybWF0ID8geyBvdXRwdXRfZm9ybWF0OiBvdXRwdXRGb3JtYXQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuLy8gcXVvdGHsmYAgY2FjaGUgYWZmaW5pdHnroZwg7Yag7YGw7J2EIOyEoO2Dne2VtCBIVFRQUy9XU+uhnCDsoITshqHtlZzri6QuIOuhnOy7rCDrj5nsi5zshLEg7KCc7ZWc7J2AIOyXhuuLpC5cbmV4cG9ydCBjbGFzcyBPcGVuQUlEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgcmVhZG9ubHkgdG9rZW5NZXRhZGF0YSA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlbk1ldGFkYXRhPigpO1xuICByZWFkb25seSB0cmFuc3BvcnRLaW5kOiBPcGVuQUlUcmFuc3BvcnRLaW5kO1xuICByZWFkb25seSByYXRlTGltaXRzQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgT3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhICYgeyBnZW5lcmF0aW9uOiBudW1iZXIgfT4oKTtcbiAgcmVhZG9ubHkgcGVuZGluZ1JhdGVMaW1pdHMgPSBuZXcgTWFwPFxuICAgIG51bWJlcixcbiAgICB7IHRva2VuOiBUb2tlbk1ldGFkYXRhOyBnZW5lcmF0aW9uOiBudW1iZXI7IHByb21pc2U6IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPiB9XG4gID4oKTtcbiAgcmVhZG9ubHkgY2xpZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBDbGllbnRFbnRyeT4oKTtcbiAgcmVhZG9ubHkgcmV0aXJlZENsaWVudHMgPSBuZXcgU2V0PENsaWVudEVudHJ5PigpO1xuICBzdGF0aWMgcmVhZG9ubHkgUkFURV9MSU1JVFNfQ0FDSEVfVFRMID0gNjBfMDAwO1xuXG4gIHJlYWRvbmx5IHNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuICByZWFkb25seSBjbGllbnRGYWN0b3J5OiBPcGVuQUlEaXJlY3RDbGllbnRGYWN0b3J5O1xuICByZWFkb25seSBmZXRjaEltcGw6IHR5cGVvZiBmZXRjaDtcbiAgcmVhZG9ubHkgcXVvdGFCbG9ja2VkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGluRmxpZ2h0ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB0cmFuc3BvcnRLaW5kOiBPcGVuQUlUcmFuc3BvcnRLaW5kID0gcmVzb2x2ZU9wZW5BSVRyYW5zcG9ydEtpbmQoKSxcbiAgICBkZXBlbmRlbmNpZXM6IE9wZW5BSURpc3BhdGNoZXJEZXBlbmRlbmNpZXMgPSB7fSxcbiAgKSB7XG4gICAgdGhpcy50cmFuc3BvcnRLaW5kID0gdHJhbnNwb3J0S2luZDtcbiAgICB0aGlzLmNsaWVudEZhY3RvcnkgPVxuICAgICAgZGVwZW5kZW5jaWVzLmNsaWVudEZhY3RvcnkgPz8gKChvcHRpb25zKSA9PiBuZXcgT3BlbkFJRGlyZWN0Q2xpZW50KG9wdGlvbnMpKTtcbiAgICB0aGlzLmZldGNoSW1wbCA9IGRlcGVuZGVuY2llcy5mZXRjaCA/PyBmZXRjaDtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgcm93c1xuICAgICAgLmZpbHRlcigocm93KSA9PiByb3cucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpXG4gICAgICAuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0VG9rZW4oXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIHJvdy5jcmVkZW50aWFscyBhcyBPcGVuQUlDcmVkZW50aWFscyxcbiAgICAgICAgICByb3cucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgIHJvdy53ZWlnaHQsXG4gICAgICAgICAgcm93LmFjdGl2ZSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGBzdGFydGVkIGRpcmVjdCBPcGVuQUkgcnVudGltZSB3aXRoICR7dGhpcy50b2tlbk1ldGFkYXRhLnNpemV9IHRva2Vuc2ApO1xuICB9XG5cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsaWVudHMuZm9yRWFjaCgoeyBjbGllbnQgfSkgPT4gY2xpZW50LmNsb3NlPy4oKSk7XG4gICAgdGhpcy5jbGllbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5yZXRpcmVkQ2xpZW50cy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY2xpZW50LmNsb3NlPy4oKSk7XG4gICAgdGhpcy5yZXRpcmVkQ2xpZW50cy5jbGVhcigpO1xuICAgIHRoaXMudG9rZW5NZXRhZGF0YS5jbGVhcigpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWQuY2xlYXIoKTtcbiAgICB0aGlzLnNlbGVjdG9yLnJlc2V0U2NvcmVzKCk7XG4gIH1cblxuICBhc3luYyBvblRva2VuQWRkZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNldFRva2VuKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9sZCA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpO1xuICAgIHRoaXMuc2V0VG9rZW4oaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0LCBvbGQ/LmFjdGl2ZSA/PyB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIG9uVG9rZW5SZW1vdmVkKGlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJldGlyZUNsaWVudChpZCk7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5zZWxlY3Rvci5yZW1vdmVUb2tlbihpZCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZC5kZWxldGUoaWQpO1xuICB9XG5cbiAgb25Ub2tlbkRlYWN0aXZhdGVkKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpO1xuICAgIGlmICh0b2tlbikgdG9rZW4uYWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgb25Ub2tlbkFjdGl2YXRlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAodG9rZW4pIHRva2VuLmFjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgYXN5bmMgcmVwbGFjZVRva2VucyhcbiAgICByb3dzOiBBcnJheTx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzO1xuICAgICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgICAgd2VpZ2h0OiBudW1iZXI7XG4gICAgfT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHRoaXMudG9rZW5NZXRhZGF0YS5rZXlzKCkpIGlmICghaWRzLmhhcyhpZCkpIGF3YWl0IHRoaXMub25Ub2tlblJlbW92ZWQoaWQpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpXG4gICAgICBhd2FpdCB0aGlzLm9uVG9rZW5VcGRhdGVkKHJvdy5pZCwgcm93Lm5hbWUsIHJvdy5jcmVkZW50aWFscywgcm93LnF1b3RhVGhyZXNob2xkLCByb3cud2VpZ2h0KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bihyZXEpO1xuICB9XG5cbiAgYXN5bmMgZ2VuZXJhdGVTdHJlYW0ocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIGNiOiBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKVxuICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICBcImdhdGVcIixcbiAgICAgICAgXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHN0cmVhbWluZyBwYXRoXCIsXG4gICAgICApO1xuICAgIHRyeSB7XG4gICAgICBjYi5vbkNvbXBsZXRlKGF3YWl0IHRoaXMucnVuKHJlcSwgY2Iub25EZWx0YSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYi5vbkVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJ1bihyZXE6IEdlbmVyYXRlUmVxdWVzdCwgb25EZWx0YT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQpOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgaWYgKHJlcS50aGlua2luZyA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcmVxLm1vZGVsID8/IFwiXCI7XG4gICAgICBpZiAoIVRISU5LSU5HX09GRl9NT0RFTFMuaGFzKG1vZGVsKSkge1xuICAgICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICAgIG1vZGVsID09PSBcImdwdC02LWFzdHJhXCIgfHwgbW9kZWwgPT09IFwiZ3B0LTYuMS1zb2xcIlxuICAgICAgICAgICAgPyBcInRoZSBzdWJzY3JpcHRpb24gYmFja2VuZCByZXF1aXJlcyB0aGlua2luZ1wiXG4gICAgICAgICAgICA6IFwidGhpbmtpbmctb2ZmIHN1cHBvcnQgaGFzIG5vdCBiZWVuIHZlcmlmaWVkIG9uIHRoZSBzdWJzY3JpcHRpb24gYmFja2VuZFwiO1xuICAgICAgICB0aHJvdyBuZXcgVGhpbmtpbmdWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYHRoaW5raW5nOmZhbHNlIGlzIHVuYXZhaWxhYmxlIGZvciBPcGVuQUkgbW9kZWwgJHttb2RlbCB8fCBcIjxkZWZhdWx0PlwifTogJHtyZWFzb259YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2lnbmFsID0gYWN0aXZlU2lnbmFsKHJlcS5hYm9ydFNpZ25hbCwgcmVxLnRpbWVvdXRNcyk7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHNpZ25hbCk7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gYXdhaXQgdGhpcy5zZWxlY3RUb2tlbihcbiAgICAgIHJlcS5wcmVmZXJyZWRUb2tlbklkLFxuICAgICAgcmVxLnJlcXVpcmVQcmVmZXJyZWRUb2tlbiA/PyBmYWxzZSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIHRoaXMuaW5GbGlnaHQrKztcbiAgICB0cnkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHNpZ25hbCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5EaXJlY3Qoc2VsZWN0aW9uLCB7IC4uLnJlcSwgYWJvcnRTaWduYWw6IHNpZ25hbCB9LCBvbkRlbHRhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbkZsaWdodC0tO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJ1bkRpcmVjdChcbiAgICBzZWxlY3Rpb246IFRva2VuU2VsZWN0aW9uLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIG9uRGVsdGE/OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZmlyc3REZWx0YUF0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRleHQgPSBcIlwiO1xuICAgIGxldCBvdXRwdXRNZXNzYWdlQWNjZXB0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBtZXNzYWdlUGhhc2VzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBjb25zdCBzdHJlYW1lZE1lc3NhZ2VJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgdXNhZ2UgPSB7XG4gICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgIGlucHV0VG9rZW5zOiAwLFxuICAgICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IDAsXG4gICAgfTtcbiAgICBjb25zdCBpbWFnZXM6IEdlbmVyYXRlZEltYWdlW10gPSBbXTtcbiAgICBsZXQgaW1hZ2VBdHRlbXB0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBhdXRvID0gcmVxLmltYWdlR2VuZXJhdGlvbiA9PT0gXCJhdXRvXCI7XG4gICAgY29uc3QgdHJhbnNwYXJlbnRDYWxscyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgdHJhbnNwYXJlbnRDYWxsSWRzID0gbmV3IFNldDx1bmtub3duPigpO1xuICAgIGxldCB0cmFuc3BhcmVudEF0dGVtcHRlZCA9IGZhbHNlO1xuICAgIGxldCBkcml2ZXJDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICBsZXQgc2VydmluZ01vZGVsID0gcmVxLm1vZGVsID8/IFwiXCI7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBzZWxlY3Rpb24ubWV0YWRhdGE7XG4gICAgY29uc3QgY2xpZW50RW50cnkgPSB0aGlzLmFjcXVpcmVDbGllbnQoc2VsZWN0aW9uKTtcbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBjbGllbnRFbnRyeS5jbGllbnQucmVzcG9uc2VzKFxuICAgICAgICByZXF1ZXN0T3B0aW9ucyhyZXEpLFxuICAgICAgICByZXEuYWJvcnRTaWduYWwsXG4gICAgICApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXEuc3RvcEFmdGVyT3V0cHV0TWVzc2FnZSAmJlxuICAgICAgICAgIGV2ZW50LnR5cGUgPT09IFwib3V0cHV0LWl0ZW1cIiAmJlxuICAgICAgICAgIGV2ZW50Lml0ZW0udHlwZSA9PT0gXCJtZXNzYWdlXCIgJiZcbiAgICAgICAgICB0eXBlb2YgZXZlbnQuaXRlbS5pZCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgIHR5cGVvZiBldmVudC5pdGVtLnBoYXNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICkge1xuICAgICAgICAgIG1lc3NhZ2VQaGFzZXMuc2V0KGV2ZW50Lml0ZW0uaWQsIGV2ZW50Lml0ZW0ucGhhc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBcInRleHQtZGVsdGFcIikge1xuICAgICAgICAgIGlmIChvdXRwdXRNZXNzYWdlQWNjZXB0ZWQpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXEuc3RvcEFmdGVyT3V0cHV0TWVzc2FnZSAmJiBldmVudC5pdGVtSWQpIHtcbiAgICAgICAgICAgIC8vIEJ1ZmZlciBjb21tZW50YXJ5L3VuY2xhc3NpZmllZCBtZXNzYWdlcyB1bnRpbCB0aGVpciBjb21wbGV0ZWQgaXRlbS5cbiAgICAgICAgICAgIC8vIEtub3duIGZpbmFsIGFuc3dlcnMgcmV0YWluIGluY3JlbWVudGFsIHN0cmVhbWluZy5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlUGhhc2VzLmdldChldmVudC5pdGVtSWQpICE9PSBcImZpbmFsX2Fuc3dlclwiKSBjb250aW51ZTtcbiAgICAgICAgICAgIHN0cmVhbWVkTWVzc2FnZUlkcy5hZGQoZXZlbnQuaXRlbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmlyc3REZWx0YUF0ID8/PSBEYXRlLm5vdygpO1xuICAgICAgICAgIHRleHQgKz0gZXZlbnQudGV4dDtcbiAgICAgICAgICBvbkRlbHRhPy4oZXZlbnQudGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZXZlbnQudHlwZSA9PT0gXCJvdXRwdXQtaXRlbVwiICYmXG4gICAgICAgICAgZXZlbnQuY29tcGxldGVkICYmXG4gICAgICAgICAgZXZlbnQuaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJlxuICAgICAgICAgICFvdXRwdXRNZXNzYWdlQWNjZXB0ZWQgJiZcbiAgICAgICAgICByZXEuc3RvcEFmdGVyT3V0cHV0TWVzc2FnZSAmJlxuICAgICAgICAgIEFycmF5LmlzQXJyYXkoZXZlbnQuaXRlbS5jb250ZW50KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlVGV4dCA9IGV2ZW50Lml0ZW0uY29udGVudFxuICAgICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gcGFydD8udHlwZSA9PT0gXCJvdXRwdXRfdGV4dFwiICYmIHR5cGVvZiBwYXJ0LnRleHQgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBwYXJ0LnRleHQpXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICAgICAgICAvLyBBIHZhbGlkIGNsaWVudCB0b29sIHJlcXVlc3QgZW5kcyB0aGlzIGFwcGxpY2F0aW9uIHR1cm4uIExhdGVyIGFuc3dlcnMgY2Fubm90XG4gICAgICAgICAgLy8ga25vdyBpdHMgcmVzdWx0IHlldC4gTmV2ZXIgc3BsaXQvcmVwYWlyIG1hbGZvcm1lZCBKU09OIHdpdGhpbiBhIG1lc3NhZ2UuXG4gICAgICAgICAgY29uc3QgcGhhc2UgPSB0eXBlb2YgZXZlbnQuaXRlbS5waGFzZSA9PT0gXCJzdHJpbmdcIiA/IGV2ZW50Lml0ZW0ucGhhc2UgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG1lc3NhZ2VUZXh0KSBvdXRwdXRNZXNzYWdlQWNjZXB0ZWQgPSByZXEuc3RvcEFmdGVyT3V0cHV0TWVzc2FnZShtZXNzYWdlVGV4dCwgcGhhc2UpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBldmVudC5pdGVtLmlkID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAhc3RyZWFtZWRNZXNzYWdlSWRzLmhhcyhldmVudC5pdGVtLmlkKSAmJlxuICAgICAgICAgICAgKHBoYXNlICE9PSBcImNvbW1lbnRhcnlcIiB8fCBvdXRwdXRNZXNzYWdlQWNjZXB0ZWQpICYmXG4gICAgICAgICAgICBtZXNzYWdlVGV4dFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlyc3REZWx0YUF0ID8/PSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgdGV4dCArPSBtZXNzYWdlVGV4dDtcbiAgICAgICAgICAgIG9uRGVsdGE/LihtZXNzYWdlVGV4dCk7XG4gICAgICAgICAgICBzdHJlYW1lZE1lc3NhZ2VJZHMuYWRkKGV2ZW50Lml0ZW0uaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgICBpbWFnZUF0dGVtcHRlZCA9IHRydWU7XG4gICAgICAgICAgaW1hZ2VzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogZXZlbnQuYmFzZTY0LFxuICAgICAgICAgICAgbWVkaWFUeXBlOiBldmVudC5taW1lVHlwZSxcbiAgICAgICAgICAgIHJldmlzZWRQcm9tcHQ6IGV2ZW50LnJldmlzZWRQcm9tcHQgPz8gbnVsbCxcbiAgICAgICAgICAgIC4uLihldmVudC5nZW5lcmF0aW9uID8geyBnZW5lcmF0aW9uOiBldmVudC5nZW5lcmF0aW9uIH0gOiB7fSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gXCJvdXRwdXQtaXRlbVwiICYmIGV2ZW50Lml0ZW0udHlwZSA9PT0gXCJpbWFnZV9nZW5lcmF0aW9uX2NhbGxcIikge1xuICAgICAgICAgIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChhdXRvICYmIGV2ZW50LnR5cGUgPT09IFwib3V0cHV0LWl0ZW1cIiAmJiBldmVudC5pdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICAgICAgaWYgKGV2ZW50Lml0ZW0ubmFtZSAhPT0gVFJBTlNQQVJFTlRfSU1BR0VfVE9PTCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcIlVuZXhwZWN0ZWQgYXV0b21hdGljIGltYWdlIHRvb2wgY2FsbFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJhbnNwYXJlbnRBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRyYW5zcGFyZW50Q2FsbElkcy5hZGQoZXZlbnQuaXRlbS5jYWxsX2lkKTtcbiAgICAgICAgICBpZiAoIWV2ZW50LmNvbXBsZXRlZCkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgaWQgPSBldmVudC5pdGVtLmNhbGxfaWQ7XG4gICAgICAgICAgbGV0IGFyZ3M6IHVua25vd247XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFyZ3MgPSBKU09OLnBhcnNlKFN0cmluZyhldmVudC5pdGVtLmFyZ3VtZW50cykpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcIkludmFsaWQgdHJhbnNwYXJlbnQgaW1hZ2UgYXJndW1lbnRzXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgICFpZCB8fFxuICAgICAgICAgICAgIWFyZ3MgfHxcbiAgICAgICAgICAgIHR5cGVvZiBhcmdzICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGFyZ3MpIHx8XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGggIT09IDEgfHxcbiAgICAgICAgICAgICEoXCJwcm9tcHRcIiBpbiBhcmdzKSB8fFxuICAgICAgICAgICAgdHlwZW9mIGFyZ3MucHJvbXB0ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICAhYXJncy5wcm9tcHQudHJpbSgpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJpbmNvbXBsZXRlXCIsIFwiSW52YWxpZCB0cmFuc3BhcmVudCBpbWFnZSBhcmd1bWVudHNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmFuc3BhcmVudENhbGxzLmhhcyhpZCkgJiYgdHJhbnNwYXJlbnRDYWxscy5nZXQoaWQpICE9PSBhcmdzLnByb21wdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICAgICAgICBcImluY29tcGxldGVcIixcbiAgICAgICAgICAgICAgXCJDb25mbGljdGluZyB0cmFuc3BhcmVudCBpbWFnZSB0b29sIGNhbGxzXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cmFuc3BhcmVudENhbGxzLnNldChpZCwgYXJncy5wcm9tcHQpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwiY29tcGxldGVkXCIgJiYgZXZlbnQudXNhZ2UpIHtcbiAgICAgICAgICBkcml2ZXJDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgIHNlcnZpbmdNb2RlbCA9IGV2ZW50Lm1vZGVsID8/IHNlcnZpbmdNb2RlbDtcbiAgICAgICAgICB1c2FnZSA9IHtcbiAgICAgICAgICAgIHRvdGFsVG9rZW5zOiBldmVudC51c2FnZS50b3RhbFRva2VucyxcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiBldmVudC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogZXZlbnQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IGV2ZW50LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiBldmVudC51c2FnZS5yZWFzb25pbmdUb2tlbnMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgZHJpdmVyQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXJ2aW5nTW9kZWwgPSBldmVudC5tb2RlbCA/PyBzZXJ2aW5nTW9kZWw7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJpbmNvbXBsZXRlXCIsIGV2ZW50LmVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIHRocm93IGV2ZW50LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYXV0byAmJiB0cmFuc3BhcmVudEF0dGVtcHRlZCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWRyaXZlckNvbXBsZXRlZCB8fFxuICAgICAgICAgIHRyYW5zcGFyZW50Q2FsbHMuc2l6ZSAhPT0gMSB8fFxuICAgICAgICAgIHRyYW5zcGFyZW50Q2FsbElkcy5zaXplICE9PSAxIHx8XG4gICAgICAgICAgaW1hZ2VBdHRlbXB0ZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICAgICAgXCJpbmNvbXBsZXRlXCIsXG4gICAgICAgICAgICBcIkV4cGVjdGVkIG9uZSBjb21wbGV0ZWQgdHJhbnNwYXJlbnQgaW1hZ2UgY2FsbCB3aXRob3V0IGFub3RoZXIgaW1hZ2UgdG9vbFwiLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcS5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcihyZXEuYWJvcnRTaWduYWwpO1xuICAgICAgICBjb25zdCBwcm9tcHQgPSBbLi4udHJhbnNwYXJlbnRDYWxscy52YWx1ZXMoKV1bMF0hO1xuICAgICAgICBsZXQgaW1hZ2VDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBjbGllbnRFbnRyeS5jbGllbnQucmVzcG9uc2VzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiByZXEubW9kZWwgPz8gXCJcIixcbiAgICAgICAgICAgIC4uLihyZXEuc3lzdGVtUHJvbXB0ID8geyBpbnN0cnVjdGlvbnM6IHJlcS5zeXN0ZW1Qcm9tcHQgfSA6IHt9KSxcbiAgICAgICAgICAgIGhpc3Rvcnk6IFtcbiAgICAgICAgICAgICAgLi4uaW5wdXRJdGVtcyhyZXEpLFxuICAgICAgICAgICAgICB7IHR5cGU6IFwibWVzc2FnZVwiLCByb2xlOiBcInVzZXJcIiwgY29udGVudDogW3sgdHlwZTogXCJpbnB1dF90ZXh0XCIsIHRleHQ6IHByb21wdCB9XSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjoge1xuICAgICAgICAgICAgICBxdWFsaXR5OiByZXEuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucz8ucXVhbGl0eSxcbiAgICAgICAgICAgICAgc2l6ZTogcmVxLmltYWdlR2VuZXJhdGlvbk9wdGlvbnM/LnNpemUsXG4gICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQ6IFwicG5nXCIsXG4gICAgICAgICAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXEuYWJvcnRTaWduYWwsXG4gICAgICAgICkpIHtcbiAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJpbWFnZVwiKVxuICAgICAgICAgICAgaW1hZ2VzLnB1c2goe1xuICAgICAgICAgICAgICBkYXRhOiBldmVudC5iYXNlNjQsXG4gICAgICAgICAgICAgIG1lZGlhVHlwZTogZXZlbnQubWltZVR5cGUsXG4gICAgICAgICAgICAgIHJldmlzZWRQcm9tcHQ6IGV2ZW50LnJldmlzZWRQcm9tcHQgPz8gbnVsbCxcbiAgICAgICAgICAgICAgLi4uKGV2ZW50LmdlbmVyYXRpb24gPyB7IGdlbmVyYXRpb246IGV2ZW50LmdlbmVyYXRpb24gfSA6IHt9KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwiY29tcGxldGVkXCIpIGltYWdlQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICBlbHNlIGlmIChldmVudC50eXBlID09PSBcImVycm9yXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJpbmNvbXBsZXRlXCIsIGV2ZW50LmVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFpbWFnZUNvbXBsZXRlZClcbiAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXG4gICAgICAgICAgICBcImluY29tcGxldGVcIixcbiAgICAgICAgICAgIFwiVHJhbnNwYXJlbnQgaW1hZ2UgZ2VuZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlXCIsXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChhdXRvICYmIGltYWdlQXR0ZW1wdGVkICYmICFkcml2ZXJDb21wbGV0ZWQpXG4gICAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJJbWFnZSBnZW5lcmF0aW9uIHJlc3BvbnNlIGRpZCBub3QgY29tcGxldGVcIik7XG4gICAgICBpZiAocmVxLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHJlcS5hYm9ydFNpZ25hbCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucmVsZWFzZUNsaWVudChjbGllbnRFbnRyeSk7XG4gICAgfVxuICAgIGlmICgocmVxLmltYWdlR2VuZXJhdGlvbiA9PT0gdHJ1ZSB8fCAoYXV0byAmJiBpbWFnZUF0dGVtcHRlZCkpICYmIGltYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgICAgaW1hZ2VBdHRlbXB0ZWQgPyBcImluY29tcGxldGVcIiA6IFwibm90X2NhbGxlZFwiLFxuICAgICAgICBpbWFnZUF0dGVtcHRlZFxuICAgICAgICAgID8gXCJpbWFnZSBnZW5lcmF0aW9uIGRpZCBub3QgY29tcGxldGVcIlxuICAgICAgICAgIDogXCJtb2RlbCBkaWQgbm90IGNhbGwgaW1hZ2UgZ2VuZXJhdGlvblwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQsXG4gICAgICB0b2tlbk5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICB1c2FnZSxcbiAgICAgIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICB0dGZ0TXM6IGZpcnN0RGVsdGFBdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGZpcnN0RGVsdGFBdCAtIHN0YXJ0ZWRBdCxcbiAgICAgIG1vZGVsOiBzZXJ2aW5nTW9kZWwsXG4gICAgICAuLi4oc2VydmluZ01vZGVsICE9PSByZXEubW9kZWwgPyB7IHJlcXVlc3RlZE1vZGVsOiByZXEubW9kZWwgfSA6IHt9KSxcbiAgICAgIHRocmVhZENvb3JkOiB7IHdvcmtlcklkOiBzZWxlY3Rpb24udG9rZW5JZCwgdGhyZWFkSWQ6IHJlcS5wcm9tcHRDYWNoZUtleSA/PyBcIlwiLCBlcG9jaDogLTEgfSxcbiAgICAgIC4uLihpbWFnZXMubGVuZ3RoID8geyBpbWFnZXMgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIOyEuOuMgOqwgCDrsJTrgJAgY2xpZW50IOuKlCDsgqzsmqkg7KSR7J24IOyalOyyreydtCDrgZ3rgpwg65Kk7JeQIOuLq+uKlOuLpC4gKi9cbiAgYWNxdWlyZUNsaWVudChzZWxlY3Rpb246IFRva2VuU2VsZWN0aW9uKTogQ2xpZW50RW50cnkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gc2VsZWN0aW9uLm1ldGFkYXRhO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuY2xpZW50cy5nZXQoc2VsZWN0aW9uLnRva2VuSWQpO1xuICAgIGlmIChlbnRyeSAmJiBlbnRyeS5nZW5lcmF0aW9uICE9PSBtZXRhZGF0YS5nZW5lcmF0aW9uKSB7XG4gICAgICB0aGlzLnJldGlyZUNsaWVudChzZWxlY3Rpb24udG9rZW5JZCk7XG4gICAgICBlbnRyeSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRGYWN0b3J5KFxuICAgICAgICB7XG4gICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBtZXRhZGF0YS5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIGFjY291bnRJZDogbWV0YWRhdGEuY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJhbnNwb3J0S2luZDogdGhpcy50cmFuc3BvcnRLaW5kLFxuICAgICAgICAgIGZldGNoOiB0aGlzLmZldGNoSW1wbCxcbiAgICAgICAgICByZWZyZXNoQ3JlZGVudGlhbHM6ICgpID0+IHRoaXMucmVmcmVzaENyZWRlbnRpYWxzKHNlbGVjdGlvbi50b2tlbklkKSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0aW9uLnRva2VuSWQsXG4gICAgICApO1xuICAgICAgZW50cnkgPSB7IGdlbmVyYXRpb246IG1ldGFkYXRhLmdlbmVyYXRpb24sIGNsaWVudCwgaW5GbGlnaHQ6IDAsIHJldGlyZWQ6IGZhbHNlIH07XG4gICAgICB0aGlzLmNsaWVudHMuc2V0KHNlbGVjdGlvbi50b2tlbklkLCBlbnRyeSk7XG4gICAgfVxuICAgIGVudHJ5LmluRmxpZ2h0Kys7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgcmVsZWFzZUNsaWVudChlbnRyeTogQ2xpZW50RW50cnkpOiB2b2lkIHtcbiAgICBlbnRyeS5pbkZsaWdodCA9IE1hdGgubWF4KDAsIGVudHJ5LmluRmxpZ2h0IC0gMSk7XG4gICAgaWYgKGVudHJ5LnJldGlyZWQgJiYgZW50cnkuaW5GbGlnaHQgPT09IDApIHtcbiAgICAgIHRoaXMucmV0aXJlZENsaWVudHMuZGVsZXRlKGVudHJ5KTtcbiAgICAgIGVudHJ5LmNsaWVudC5jbG9zZT8uKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0aXJlQ2xpZW50KHRva2VuSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jbGllbnRzLmdldCh0b2tlbklkKTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgdGhpcy5jbGllbnRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICBlbnRyeS5yZXRpcmVkID0gdHJ1ZTtcbiAgICBpZiAoZW50cnkuaW5GbGlnaHQgPT09IDApIGVudHJ5LmNsaWVudC5jbG9zZT8uKCk7XG4gICAgZWxzZSB0aGlzLnJldGlyZWRDbGllbnRzLmFkZChlbnRyeSk7XG4gIH1cblxuICAvLyDshKDtmLgg7Yag7YGw7J20IHF1b3Rh66W8IO2GteqzvO2VmOuptCDri6Trpbgg7Yag7YGwIOyhsO2ajOyZgCB3ZWlnaHRlZCDsg4Htg5wg67OA6rK97J2EIOyDneuete2VnOuLpC5cbiAgYXN5bmMgc2VsZWN0VG9rZW4oXG4gICAgcHJlZmVycmVkVG9rZW5JZDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHJlcXVpcmVQcmVmZXJyZWRUb2tlbjogYm9vbGVhbixcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFRva2VuU2VsZWN0aW9uPiB7XG4gICAgaWYgKHByZWZlcnJlZFRva2VuSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcHJlZmVycmVkID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldChwcmVmZXJyZWRUb2tlbklkKTtcbiAgICAgIGlmIChwcmVmZXJyZWQ/LmFjdGl2ZSAmJiAoYXdhaXQgdGhpcy5pc1F1b3RhRWxpZ2libGUocHJlZmVycmVkVG9rZW5JZCwgcHJlZmVycmVkLCBzaWduYWwpKSkge1xuICAgICAgICByZXR1cm4geyB0b2tlbklkOiBwcmVmZXJyZWRUb2tlbklkLCBtZXRhZGF0YTogcHJlZmVycmVkIH07XG4gICAgICB9XG4gICAgICBpZiAocmVxdWlyZVByZWZlcnJlZFRva2VuKSB7XG4gICAgICAgIGlmICghcHJlZmVycmVkPy5hY3RpdmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByZWZlcnJlZCBvcGVuYWkgdG9rZW4gJHtwcmVmZXJyZWRUb2tlbklkfSBpcyBub3QgYXZhaWxhYmxlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhyZXNob2xkID0gcHJlZmVycmVkLnF1b3RhVGhyZXNob2xkO1xuICAgICAgICBpZiAodGhyZXNob2xkICE9PSBudWxsICYmIHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgICAgICAgIHF1b3RhTWVzc2FnZShbeyBuYW1lOiBwcmVmZXJyZWQubmFtZSwgdGhyZXNob2xkIH1dKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7L2c65OcIOy6kOyLnOyXkOyEnCDthqDtgbAg7IiY66eM7YG8IOyhsO2ajCDsp4Dsl7DsnbQg7IyT7J207KeAIOyViuuPhOuhnSDrs5HroKwg7YyQ7KCV7ZWc64ukLlxuICAgIGNvbnN0IGNoZWNrcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLnRoaXMudG9rZW5NZXRhZGF0YS5lbnRyaWVzKCldXG4gICAgICAgIC5maWx0ZXIoKFssIHRva2VuXSkgPT4gdG9rZW4uYWN0aXZlKVxuICAgICAgICAubWFwKGFzeW5jIChbaWQsIHRva2VuXSkgPT4gKHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBlbGlnaWJsZTogYXdhaXQgdGhpcy5pc1F1b3RhRWxpZ2libGUoaWQsIHRva2VuLCBzaWduYWwpLFxuICAgICAgICB9KSksXG4gICAgKTtcbiAgICBjb25zdCBlbGlnaWJsZSA9IG5ldyBTZXQoY2hlY2tzLmZpbHRlcigoYykgPT4gYy5lbGlnaWJsZSkubWFwKChjKSA9PiBjLmlkKSk7XG4gICAgaWYgKGVsaWdpYmxlLnNpemUgPT09IDApIHtcbiAgICAgIGNvbnN0IG92ZXIgPSBjaGVja3NcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoYykgPT5cbiAgICAgICAgICAgICFjLmVsaWdpYmxlICYmIGMudG9rZW4ucXVvdGFUaHJlc2hvbGQgIT09IG51bGwgJiYgYy50b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGMpID0+ICh7IG5hbWU6IGMudG9rZW4ubmFtZSwgdGhyZXNob2xkOiBjLnRva2VuLnF1b3RhVGhyZXNob2xkIGFzIG51bWJlciB9KSk7XG4gICAgICBpZiAob3Zlci5sZW5ndGgpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogYWxsX2V4Y2VlZGVkXCIsIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zOiBvdmVyLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihxdW90YU1lc3NhZ2Uob3ZlcikpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3Rvci5zZWxlY3QoZWxpZ2libGUpO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gc2VsZWN0ZWQgIT09IG51bGwgPyB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHNlbGVjdGVkKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoc2VsZWN0ZWQgPT09IG51bGwgfHwgIW1ldGFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICByZXR1cm4geyB0b2tlbklkOiBzZWxlY3RlZCwgbWV0YWRhdGEgfTtcbiAgfVxuXG4gIHNldFRva2VuKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICB3ZWlnaHQ6IG51bWJlcixcbiAgICBhY3RpdmU6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG9sZCA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpO1xuICAgIGlmIChvbGQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ob2xkLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZCxcbiAgICAgICAgd2VpZ2h0LFxuICAgICAgICBhY3RpdmUsXG4gICAgICAgIGdlbmVyYXRpb246IG9sZC5nZW5lcmF0aW9uICsgMSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRva2VuTWV0YWRhdGEuc2V0KGlkLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZCxcbiAgICAgICAgd2VpZ2h0LFxuICAgICAgICBhY3RpdmUsXG4gICAgICAgIGdlbmVyYXRpb246IDEsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3Rvci5zZXRUb2tlbihpZCwgd2VpZ2h0KTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkLmRlbGV0ZShpZCk7XG4gIH1cblxuICBhc3luYyBnZXRSYXRlTGltaXRzQnlUb2tlbklkKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGE+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKGBvcGVuYWkgdG9rZW4gJHt0b2tlbklkfSBub3QgZm91bmRgKTtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gdG9rZW4uZ2VuZXJhdGlvbjtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnJhdGVMaW1pdHNDYWNoZS5nZXQodG9rZW5JZCk7XG4gICAgaWYgKFxuICAgICAgY2FjaGVkICYmXG4gICAgICBjYWNoZWQuZ2VuZXJhdGlvbiA9PT0gdG9rZW4uZ2VuZXJhdGlvbiAmJlxuICAgICAgRGF0ZS5ub3coKSAtIGNhY2hlZC5jYWNoZWRBdCA8IE9wZW5BSURpc3BhdGNoZXIuUkFURV9MSU1JVFNfQ0FDSEVfVFRMXG4gICAgKVxuICAgICAgcmV0dXJuIGNhY2hlZDtcblxuICAgIC8vIFRUTCDrp4zro4wg7IucIOyhsO2ajOulvCDqs7XsnKDtlZzri6QuIOy1nOy0iCDtmLjstpzsnpDsnZggYWJvcnTroZwg7Iuk7Yyo7ZW064+EIGlzUXVvdGFFbGlnaWJsZeydgCBmYWlsLW9wZW7tlZzri6QuXG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhdGVMaW1pdHMuZ2V0KHRva2VuSWQpO1xuICAgIGlmIChwZW5kaW5nPy50b2tlbiA9PT0gdG9rZW4gJiYgcGVuZGluZy5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uKSByZXR1cm4gcGVuZGluZy5wcm9taXNlO1xuICAgIGNvbnN0IGZldGNoUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkT3BlbkFJUXVvdGFVc2FnZSh7XG4gICAgICAgIGNyZWRlbnRpYWxzOiB0b2tlbi5jcmVkZW50aWFscyxcbiAgICAgICAgcmVmcmVzaENyZWRlbnRpYWxzOiAoKSA9PiB0aGlzLnJlZnJlc2hDcmVkZW50aWFscyh0b2tlbklkKSxcbiAgICAgICAgZmV0Y2g6IHRoaXMuZmV0Y2hJbXBsLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdC5raW5kID09PSBcImxvb2t1cF9mYWlsZWRcIikgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5yZWFzb24pO1xuICAgICAgaWYgKCFyZXN1bHQucmF3KSB0aHJvdyBuZXcgRXJyb3IoXCJPcGVuQUkgcXVvdGEgcmVzcG9uc2UgbWlzc2luZyByYXcgcmF0ZSBsaW1pdHNcIik7XG4gICAgICBjb25zdCBlbnRyeSA9IHsgZGF0YTogcmVzdWx0LnJhdywgY2FjaGVkQXQ6IERhdGUubm93KCksIGdlbmVyYXRpb24gfTtcbiAgICAgIGlmICh0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpID09PSB0b2tlbiAmJiB0b2tlbi5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uKSB7XG4gICAgICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLnNldCh0b2tlbklkLCBlbnRyeSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSkoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdSYXRlTGltaXRzLmdldCh0b2tlbklkKT8ucHJvbWlzZSA9PT0gZmV0Y2hQcm9taXNlKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1JhdGVMaW1pdHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZ1JhdGVMaW1pdHMuc2V0KHRva2VuSWQsIHsgdG9rZW4sIGdlbmVyYXRpb24sIHByb21pc2U6IGZldGNoUHJvbWlzZSB9KTtcbiAgICByZXR1cm4gZmV0Y2hQcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaENyZWRlbnRpYWxzKHRva2VuSWQ6IG51bWJlcikge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKTtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gcHJldmlvdXM/LmdlbmVyYXRpb247XG4gICAgY29uc3QgcmVmcmVzaGVkID0gYXdhaXQgaGFuZGxlQ2hhdGdwdEF1dGhUb2tlbnNSZWZyZXNoKHRva2VuSWQpO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzID0ge1xuICAgICAgYWNjZXNzVG9rZW46IHJlZnJlc2hlZC5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogcmVmcmVzaGVkLmNoYXRncHRBY2NvdW50SWQsXG4gICAgfTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKTtcbiAgICBpZiAoIWN1cnJlbnQ/LmFjdGl2ZSkgdGhyb3cgbmV3IEVycm9yKGBvcGVuYWkgdG9rZW4gJHt0b2tlbklkfSBpcyBubyBsb25nZXIgYWN0aXZlYCk7XG4gICAgLy8gQSBzdWJzY3JpYmVyIHVwZGF0ZSBtYXkgYWxyZWFkeSBjb250YWluIG5ld2VyIGNyZWRlbnRpYWxzLiBOZXZlciBvdmVyd3JpdGUgaXRcbiAgICAvLyB3aXRoIHRoZSByZXN1bHQgb2YgYSByZWZyZXNoIHRoYXQgc3RhcnRlZCBhZ2FpbnN0IGFuIG9sZGVyIGdlbmVyYXRpb24uXG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzICYmIGN1cnJlbnQuZ2VuZXJhdGlvbiA9PT0gZ2VuZXJhdGlvbikge1xuICAgICAgY3VycmVudC5jcmVkZW50aWFscyA9IHsgLi4uY3VycmVudC5jcmVkZW50aWFscywgLi4uY3JlZGVudGlhbHMgfTtcbiAgICAgIHRoaXMucmV0aXJlQ2xpZW50KHRva2VuSWQpO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKHRva2VuSWQpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXNzVG9rZW46IGN1cnJlbnQuY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4sXG4gICAgICBhY2NvdW50SWQ6IGN1cnJlbnQuY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBpc1F1b3RhRWxpZ2libGUoaWQ6IG51bWJlciwgdG9rZW46IFRva2VuTWV0YWRhdGEsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRva2VuLnF1b3RhVGhyZXNob2xkID09PSBudWxsIHx8IHRva2VuLnF1b3RhVGhyZXNob2xkID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0b2tlbi5nZW5lcmF0aW9uO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRPcGVuQUlRdW90YVVzYWdlKGFzeW5jICgpID0+IHRoaXMuZ2V0UmF0ZUxpbWl0c0J5VG9rZW5JZChpZCwgc2lnbmFsKSk7XG4gICAgaWYgKHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpICE9PSB0b2tlbiB8fCB0b2tlbi5nZW5lcmF0aW9uICE9PSBnZW5lcmF0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHJlc3VsdC5raW5kID09PSBcImxvb2t1cF9mYWlsZWRcIikge1xuICAgICAgdGhpcy5xdW90YUJsb2NrZWQuZGVsZXRlKGlkKTtcbiAgICAgIGxvZ2dlci53YXJuKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IGxvb2t1cF9mYWlsX29wZW5cIiwge1xuICAgICAgICB0b2tlbklkOiBpZCxcbiAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICBsb29rdXBSZWFzb246IHJlc3VsdC5yZWFzb24sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnV0aWxpemF0aW9uUGN0ID49IHRva2VuLnF1b3RhVGhyZXNob2xkKSB7XG4gICAgICBpZiAoIXRoaXMucXVvdGFCbG9ja2VkLmhhcyhpZCkpXG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogb3Zlcl90aHJlc2hvbGQgJHt0b2tlbi5uYW1lfVske2lkfV0gKCR7cmVzdWx0LnV0aWxpemF0aW9uUGN0fSUgPj0gJHt0b2tlbi5xdW90YVRocmVzaG9sZH0lKWAsXG4gICAgICAgICk7XG4gICAgICB0aGlzLnF1b3RhQmxvY2tlZC5hZGQoaWQpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdW90YUJsb2NrZWQuZGVsZXRlKGlkKSlcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgcXVvdGFfdGhyZXNob2xkIGdhdGU6IHJlY292ZXJlZCAke3Rva2VuLm5hbWV9WyR7aWR9XSAoJHtyZXN1bHQudXRpbGl6YXRpb25QY3R9JSA8ICR7dG9rZW4ucXVvdGFUaHJlc2hvbGR9JSlgLFxuICAgICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLmRlbGV0ZShpZCk7XG4gIH1cblxuICBjb3VudEFjdGl2ZVRva2VucygpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbk1ldGFkYXRhLnZhbHVlcygpXS5maWx0ZXIoKHQpID0+IHQuYWN0aXZlKS5sZW5ndGg7XG4gIH1cblxuICAvLyDrqqjri4jthLDrp4Eg7Y+066eB7J2AIFRUTCDrgrQg7LqQ7Iuc66eMIOydveqzoCBmZXRjaO2VmOyngCDslYrripTri6QuIOuvuOyhsO2ajCDthqDtgbDsnYAgdXNlZFBlcmNlbnTqsIAgbnVsbOydtOuLpC5cbiAgZ2V0UXVvdGFTbmFwc2hvdCgpOiBBcnJheTx7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHVzZWRQZXJjZW50OiBudW1iZXIgfCBudWxsO1xuICAgIHRocmVzaG9sZDogbnVtYmVyIHwgbnVsbDtcbiAgICBibG9ja2VkOiBib29sZWFuO1xuICAgIHJlc2V0c0F0OiBudW1iZXIgfCBudWxsO1xuICB9PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5NZXRhZGF0YS5lbnRyaWVzKCldXG4gICAgICAubWFwKChbaWQsIHRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmF0ZUxpbWl0c0NhY2hlLmdldChpZCk7XG4gICAgICAgIGNvbnN0IGZyZXNoID1cbiAgICAgICAgICBjYWNoZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIGNhY2hlZC5nZW5lcmF0aW9uID09PSB0LmdlbmVyYXRpb24gJiZcbiAgICAgICAgICBub3cgLSBjYWNoZWQuY2FjaGVkQXQgPCBPcGVuQUlEaXNwYXRjaGVyLlJBVEVfTElNSVRTX0NBQ0hFX1RUTDtcbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGZyZXNoID8gY2FjaGVkLmRhdGEucmF0ZUxpbWl0cz8ucHJpbWFyeSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiB0Lm5hbWUsXG4gICAgICAgICAgdXNlZFBlcmNlbnQ6IHByaW1hcnk/LnVzZWRQZXJjZW50ID8/IG51bGwsXG4gICAgICAgICAgdGhyZXNob2xkOiB0LnF1b3RhVGhyZXNob2xkID8/IG51bGwsXG4gICAgICAgICAgYmxvY2tlZDogdGhpcy5xdW90YUJsb2NrZWQuaGFzKGlkKSxcbiAgICAgICAgICAvLyB3aGFt7J2YIFVuaXgg7LSI66W8IGVwb2NoIG1z66GcIOuzgO2ZmO2VnOuLpC5cbiAgICAgICAgICByZXNldHNBdDpcbiAgICAgICAgICAgIHByaW1hcnk/LnJlc2V0c0F0ICE9PSBudWxsICYmIHByaW1hcnk/LnJlc2V0c0F0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBwcmltYXJ5LnJlc2V0c0F0ICogMTAwMFxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQXlCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsbUJBQW1CLENBQUM7QUFFdkQsTUFBTSxzQ0FBc0IsSUFBSSxJQUFJO0NBQ2xDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGLENBQUM7QUFDRCxNQUFNLDZCQUE2QjtBQUNuQyxNQUFNLHlCQUF5QjtBQUkvQixJQUFhLHVCQUFiLGNBQTBDLE1BQU07Q0FFbkM7Q0FEWCxZQUNFLE1BQ0EsU0FDQTtFQUNBLE1BQU0sT0FBTztFQUhKLEtBQUEsT0FBQTtFQUlULEtBQUssT0FBTztDQUNkO0FBQ0Y7QUE4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
|
|
@@ -46,9 +46,8 @@ describe("MonitLogBuffer", () => {
|
|
|
46
46
|
const buffer = new MonitLogBuffer(3);
|
|
47
47
|
for (let i = 1; i <= 5; i++) buffer.push(record({ message: [`line ${i}`] }));
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
expect(
|
|
51
|
-
const { entries } = buffer.after(undefined, 10);
|
|
49
|
+
const { entries, nextCursor } = buffer.after(undefined, 10);
|
|
50
|
+
expect(nextCursor).toBe(5);
|
|
52
51
|
expect(entries.map((entry) => entry.seq)).toEqual([3, 4, 5]);
|
|
53
52
|
expect(entries.map((entry) => entry.text)).toEqual(["line 3", "line 4", "line 5"]);
|
|
54
53
|
});
|
|
@@ -90,7 +89,7 @@ describe("MonitLogBuffer", () => {
|
|
|
90
89
|
|
|
91
90
|
const chunk = buffer.after(999, 10);
|
|
92
91
|
expect(chunk.entries).toEqual([]);
|
|
93
|
-
expect(chunk.nextCursor).toBe(
|
|
92
|
+
expect(chunk.nextCursor).toBe(1);
|
|
94
93
|
expect(chunk.dropped).toBe(0);
|
|
95
94
|
});
|
|
96
95
|
|