velocious 1.0.665 → 1.0.667
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -5
- package/build/background-jobs/adapter-client.js +22 -0
- package/build/background-jobs/adapter.js +15 -0
- package/build/background-jobs/client.js +206 -14
- package/build/background-jobs/enqueue-acknowledgement-timeout-error.js +50 -0
- package/build/background-jobs/job-semantics.js +30 -0
- package/build/background-jobs/job.js +26 -1
- package/build/background-jobs/local-adapter.js +36 -8
- package/build/background-jobs/local-store.js +410 -39
- package/build/background-jobs/main.js +69 -2
- package/build/background-jobs/platform-job.js +26 -1
- package/build/background-jobs/runtime.js +58 -0
- package/build/background-jobs/store.js +374 -6
- package/build/background-jobs/types.js +27 -2
- package/build/background-jobs/web/controller.js +1 -0
- package/build/configuration.js +7 -5
- package/build/database/drivers/mssql/column.js +2 -2
- package/build/database/drivers/mssql/table.js +19 -5
- package/build/database/pool/async-tracked-multi-connection.js +2 -1
- package/build/database/query/alter-table-base.js +8 -1
- package/build/database/record/attachments/store.js +2 -2
- package/build/frontend-model-controller.js +22 -2
- package/build/http-server/websocket-events-host.js +3 -1
- package/build/src/background-jobs/adapter-client.d.ts +17 -0
- package/build/src/background-jobs/adapter-client.d.ts.map +1 -1
- package/build/src/background-jobs/adapter-client.js +19 -1
- package/build/src/background-jobs/adapter.d.ts +15 -0
- package/build/src/background-jobs/adapter.d.ts.map +1 -1
- package/build/src/background-jobs/adapter.js +14 -1
- package/build/src/background-jobs/client.d.ts +17 -0
- package/build/src/background-jobs/client.d.ts.map +1 -1
- package/build/src/background-jobs/client.js +186 -15
- package/build/src/background-jobs/enqueue-acknowledgement-timeout-error.d.ts +81 -0
- package/build/src/background-jobs/enqueue-acknowledgement-timeout-error.d.ts.map +1 -0
- package/build/src/background-jobs/enqueue-acknowledgement-timeout-error.js +47 -0
- package/build/src/background-jobs/job-semantics.d.ts +18 -0
- package/build/src/background-jobs/job-semantics.d.ts.map +1 -1
- package/build/src/background-jobs/job-semantics.js +28 -1
- package/build/src/background-jobs/job.d.ts +15 -0
- package/build/src/background-jobs/job.d.ts.map +1 -1
- package/build/src/background-jobs/job.js +21 -2
- package/build/src/background-jobs/local-adapter.d.ts +23 -8
- package/build/src/background-jobs/local-adapter.d.ts.map +1 -1
- package/build/src/background-jobs/local-adapter.js +35 -9
- package/build/src/background-jobs/local-store.d.ts +120 -5
- package/build/src/background-jobs/local-store.d.ts.map +1 -1
- package/build/src/background-jobs/local-store.js +366 -40
- package/build/src/background-jobs/main.d.ts +24 -2
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +68 -3
- package/build/src/background-jobs/platform-job.d.ts +15 -0
- package/build/src/background-jobs/platform-job.d.ts.map +1 -1
- package/build/src/background-jobs/platform-job.js +19 -2
- package/build/src/background-jobs/runtime.d.ts +39 -0
- package/build/src/background-jobs/runtime.d.ts.map +1 -1
- package/build/src/background-jobs/runtime.js +49 -1
- package/build/src/background-jobs/store.d.ts +100 -1
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +334 -8
- package/build/src/background-jobs/types.d.ts +97 -4
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +28 -3
- package/build/src/background-jobs/web/controller.d.ts.map +1 -1
- package/build/src/background-jobs/web/controller.js +2 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +7 -5
- package/build/src/database/drivers/mssql/column.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/column.js +2 -2
- package/build/src/database/drivers/mssql/table.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/table.js +19 -5
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +3 -2
- package/build/src/database/query/alter-table-base.d.ts.map +1 -1
- package/build/src/database/query/alter-table-base.js +9 -2
- package/build/src/database/record/attachments/store.js +3 -3
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +18 -3
- package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
- package/build/src/http-server/websocket-events-host.js +4 -2
- package/build/src/testing/test-files-finder.d.ts +4 -1
- package/build/src/testing/test-files-finder.d.ts.map +1 -1
- package/build/src/testing/test-files-finder.js +8 -3
- package/build/testing/test-files-finder.js +6 -1
- package/package.json +1 -1
- package/scripts/test-browser.js +1 -0
- package/src/background-jobs/adapter-client.js +22 -0
- package/src/background-jobs/adapter.js +15 -0
- package/src/background-jobs/client.js +206 -14
- package/src/background-jobs/enqueue-acknowledgement-timeout-error.js +50 -0
- package/src/background-jobs/job-semantics.js +30 -0
- package/src/background-jobs/job.js +26 -1
- package/src/background-jobs/local-adapter.js +36 -8
- package/src/background-jobs/local-store.js +410 -39
- package/src/background-jobs/main.js +69 -2
- package/src/background-jobs/platform-job.js +26 -1
- package/src/background-jobs/runtime.js +58 -0
- package/src/background-jobs/store.js +374 -6
- package/src/background-jobs/types.js +27 -2
- package/src/background-jobs/web/controller.js +1 -0
- package/src/configuration.js +7 -5
- package/src/database/drivers/mssql/column.js +2 -2
- package/src/database/drivers/mssql/table.js +19 -5
- package/src/database/pool/async-tracked-multi-connection.js +2 -1
- package/src/database/query/alter-table-base.js +8 -1
- package/src/database/record/attachments/store.js +2 -2
- package/src/frontend-model-controller.js +22 -2
- package/src/http-server/websocket-events-host.js +3 -1
- package/src/testing/test-files-finder.js +6 -1
|
@@ -1,9 +1,74 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
import timeout from "awaitery/build/timeout.js";
|
|
2
|
+
import timeout, { TimeoutError } from "awaitery/build/timeout.js";
|
|
3
3
|
import configurationResolver from "../configuration-resolver.js";
|
|
4
|
+
import isPlainObject from "../utils/plain-object.js";
|
|
5
|
+
import BackgroundJobEnqueueAcknowledgementTimeoutError from "./enqueue-acknowledgement-timeout-error.js";
|
|
4
6
|
import BackgroundJobsSocketRequest from "./socket-request.js";
|
|
5
7
|
import { DEFAULT_GENERATION_HANDSHAKE_TIMEOUT_MS, validateGenerationHandshakeTimeoutMs } from "./generation-handshake-timeout-error.js";
|
|
8
|
+
import { BACKGROUND_JOB_ACTIVE_STATUSES, BACKGROUND_JOB_EXECUTION_MODES, BACKGROUND_JOB_STATUSES, BACKGROUND_JOB_TERMINAL_STATUSES } from "./job-semantics.js";
|
|
6
9
|
const DEFAULT_ENQUEUE_TIMEOUT_MS = 5000;
|
|
10
|
+
const BACKGROUND_JOB_WAKE_OUTCOMES = ["woken", "already_due", "handed_off", "not_found"];
|
|
11
|
+
const BACKGROUND_JOB_NULLABLE_NUMBER_FIELDS = [
|
|
12
|
+
"attempts",
|
|
13
|
+
"childPid",
|
|
14
|
+
"childReceivedAtMs",
|
|
15
|
+
"childStartedAtMs",
|
|
16
|
+
"completedAtMs",
|
|
17
|
+
"createdAtMs",
|
|
18
|
+
"failedAtMs",
|
|
19
|
+
"handedOffAtMs",
|
|
20
|
+
"maxConcurrency",
|
|
21
|
+
"maxRetries",
|
|
22
|
+
"orphanedAtMs",
|
|
23
|
+
"scheduleOrder",
|
|
24
|
+
"scheduledAtMs",
|
|
25
|
+
"timeoutMs"
|
|
26
|
+
];
|
|
27
|
+
const BACKGROUND_JOB_NULLABLE_STRING_FIELDS = ["childInstanceId", "concurrencyKey", "handoffId", "lastError", "scheduleKey", "workerId"];
|
|
28
|
+
/**
|
|
29
|
+
* Checks a required nullable number from a normalized wire row.
|
|
30
|
+
* @param {ReturnType<typeof JSON.parse>} value - Field value.
|
|
31
|
+
* @returns {boolean} - Whether the field is null or a finite number.
|
|
32
|
+
*/
|
|
33
|
+
function isNullableBackgroundJobNumber(value) {
|
|
34
|
+
return value === null || (typeof value === "number" && Number.isFinite(value));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Checks a required nullable string from a normalized wire row.
|
|
38
|
+
* @param {ReturnType<typeof JSON.parse>} value - Field value.
|
|
39
|
+
* @returns {boolean} - Whether the field is null or a string.
|
|
40
|
+
*/
|
|
41
|
+
function isNullableBackgroundJobString(value) {
|
|
42
|
+
return value === null || typeof value === "string";
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Checks that a transport job uses the normalized public camel-case shape.
|
|
46
|
+
* @param {ReturnType<typeof JSON.parse>} value - Transport value.
|
|
47
|
+
* @returns {value is import("./types.js").BackgroundJobRow} - Whether normalized.
|
|
48
|
+
*/
|
|
49
|
+
function isNormalizedBackgroundJob(value) {
|
|
50
|
+
if (!isPlainObject(value))
|
|
51
|
+
return false;
|
|
52
|
+
const job = value;
|
|
53
|
+
return typeof job.id === "string"
|
|
54
|
+
&& typeof job.jobName === "string"
|
|
55
|
+
&& Array.isArray(job.args)
|
|
56
|
+
&& BACKGROUND_JOB_EXECUTION_MODES.some((executionMode) => executionMode === job.executionMode)
|
|
57
|
+
&& typeof job.queue === "string"
|
|
58
|
+
&& BACKGROUND_JOB_STATUSES.some((status) => status === job.status)
|
|
59
|
+
&& BACKGROUND_JOB_NULLABLE_NUMBER_FIELDS.every((field) => isNullableBackgroundJobNumber(job[field]))
|
|
60
|
+
&& BACKGROUND_JOB_NULLABLE_STRING_FIELDS.every((field) => isNullableBackgroundJobString(job[field]));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Describes an unexpected protocol response without echoing its payload.
|
|
64
|
+
* @param {string} operation - Public operation name.
|
|
65
|
+
* @param {import("./types.js").BackgroundJobSocketMessage} message - Response.
|
|
66
|
+
* @returns {Error} - Protocol error.
|
|
67
|
+
*/
|
|
68
|
+
function unexpectedResponseError(operation, message) {
|
|
69
|
+
const responseType = message && typeof message.type === "string" ? message.type : "missing type";
|
|
70
|
+
return new Error(`Unexpected ${operation} response: ${responseType}`);
|
|
71
|
+
}
|
|
7
72
|
export default class BackgroundJobsClient {
|
|
8
73
|
/**
|
|
9
74
|
* Runs constructor.
|
|
@@ -51,17 +116,36 @@ export default class BackgroundJobsClient {
|
|
|
51
116
|
...(producerInvocationId ? { producerInvocationId } : {}),
|
|
52
117
|
...(producerProof ? { producerProof } : {})
|
|
53
118
|
};
|
|
54
|
-
|
|
119
|
+
/**
|
|
120
|
+
* Creates safe observations for one attempt without retaining request data.
|
|
121
|
+
* @param {object} args - Attempt identity.
|
|
122
|
+
* @param {"initial" | "owned_replay"} args.attemptKind - Initial attempt or owned replay.
|
|
123
|
+
* @param {number} args.attemptNumber - One-based attempt number.
|
|
124
|
+
* @returns {import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt} - Mutable attempt observations.
|
|
125
|
+
*/
|
|
126
|
+
const newAttemptObservation = ({ attemptKind, attemptNumber }) => ({
|
|
127
|
+
acknowledgementWaitElapsedMs: 0,
|
|
128
|
+
attemptElapsedMs: 0,
|
|
129
|
+
attemptKind,
|
|
130
|
+
attemptNumber,
|
|
131
|
+
explicitlyRejected: false,
|
|
132
|
+
generationFenced: false,
|
|
133
|
+
requestSent: false
|
|
134
|
+
});
|
|
55
135
|
/**
|
|
56
136
|
* Sends one enqueue attempt. An owned caller may replay this exact message
|
|
57
137
|
* once when transport acknowledgement remains ambiguous after send.
|
|
58
|
-
* @param {
|
|
138
|
+
* @param {import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt} attemptObservation - Mutable attempt observations.
|
|
139
|
+
* @param {Readonly<Array<import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt>>} previousAttempts - Earlier timed-out attempts.
|
|
59
140
|
* @returns {Promise<string>} - Job id.
|
|
60
141
|
*/
|
|
61
|
-
const enqueueAttempt = async (
|
|
142
|
+
const enqueueAttempt = async (attemptObservation, previousAttempts) => {
|
|
143
|
+
const attemptStartedAtMs = Date.now();
|
|
62
144
|
const request = await this._request();
|
|
63
145
|
const requestAbortController = new AbortController();
|
|
64
146
|
const timeoutErrorMessage = `Background job enqueue acknowledgement timed out after ${this.enqueueTimeoutMs}ms`;
|
|
147
|
+
/** @type {number | undefined} */
|
|
148
|
+
let requestSentAtMs;
|
|
65
149
|
/**
|
|
66
150
|
* Resolves the pre-send phase when the mutation has entered the socket.
|
|
67
151
|
* @type {() => void}
|
|
@@ -93,10 +177,9 @@ export default class BackgroundJobsClient {
|
|
|
93
177
|
signal: requestAbortController.signal,
|
|
94
178
|
onConnect: (jsonSocket) => {
|
|
95
179
|
jsonSocket.send(message);
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
180
|
+
attemptObservation.generationFenced = Boolean(request.generationId);
|
|
181
|
+
attemptObservation.requestSent = true;
|
|
182
|
+
requestSentAtMs = Date.now();
|
|
100
183
|
markRequestSent();
|
|
101
184
|
},
|
|
102
185
|
onMessage: ({ message, resolve, reject }) => {
|
|
@@ -105,23 +188,47 @@ export default class BackgroundJobsClient {
|
|
|
105
188
|
return;
|
|
106
189
|
}
|
|
107
190
|
if (message?.type === "enqueue-error") {
|
|
108
|
-
|
|
109
|
-
attemptAcknowledgement.explicitlyRejected = true;
|
|
191
|
+
attemptObservation.explicitlyRejected = true;
|
|
110
192
|
reject(new Error(message.error || "Failed to enqueue job"));
|
|
111
193
|
}
|
|
112
194
|
}
|
|
113
195
|
});
|
|
114
196
|
await withEnqueueTimeout(async () => await Promise.race([requestSent, requestPromise]));
|
|
115
|
-
|
|
197
|
+
try {
|
|
198
|
+
return await withEnqueueTimeout(async () => await requestPromise);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
if (!(error instanceof TimeoutError))
|
|
202
|
+
throw error;
|
|
203
|
+
if (requestSentAtMs === undefined)
|
|
204
|
+
throw new Error("Background job enqueue acknowledgement wait started before the request was sent", { cause: error });
|
|
205
|
+
const timedOutAtMs = Date.now();
|
|
206
|
+
// The fired timer proves its logical deadline even when the adjustable wall clock reports a shorter interval.
|
|
207
|
+
const acknowledgementWaitElapsedMs = Math.max(this.enqueueTimeoutMs, timedOutAtMs - requestSentAtMs);
|
|
208
|
+
attemptObservation.acknowledgementWaitElapsedMs = acknowledgementWaitElapsedMs;
|
|
209
|
+
attemptObservation.attemptElapsedMs = Math.max(acknowledgementWaitElapsedMs, timedOutAtMs - attemptStartedAtMs);
|
|
210
|
+
throw new BackgroundJobEnqueueAcknowledgementTimeoutError({
|
|
211
|
+
acknowledgementTimeoutMs: this.enqueueTimeoutMs,
|
|
212
|
+
attemptHistory: [...previousAttempts, attemptObservation],
|
|
213
|
+
cause: error,
|
|
214
|
+
generationId: request.generationId,
|
|
215
|
+
jobName,
|
|
216
|
+
producerInvocationId,
|
|
217
|
+
producerProofPresent: Boolean(producerProof)
|
|
218
|
+
});
|
|
219
|
+
}
|
|
116
220
|
};
|
|
221
|
+
const initialAttempt = newAttemptObservation({ attemptKind: "initial", attemptNumber: 1 });
|
|
117
222
|
try {
|
|
118
|
-
return await enqueueAttempt(
|
|
223
|
+
return await enqueueAttempt(initialAttempt, []);
|
|
119
224
|
}
|
|
120
225
|
catch (error) {
|
|
121
|
-
if (!producerInvocationId || !producerProof || !
|
|
226
|
+
if (!producerInvocationId || !producerProof || !initialAttempt.generationFenced || !initialAttempt.requestSent || initialAttempt.explicitlyRejected)
|
|
122
227
|
throw error;
|
|
228
|
+
const previousAttempts = error instanceof BackgroundJobEnqueueAcknowledgementTimeoutError ? error.attemptHistory : [];
|
|
229
|
+
const replayAttempt = newAttemptObservation({ attemptKind: "owned_replay", attemptNumber: 2 });
|
|
230
|
+
return await enqueueAttempt(replayAttempt, previousAttempts);
|
|
123
231
|
}
|
|
124
|
-
return await enqueueAttempt(undefined);
|
|
125
232
|
}
|
|
126
233
|
/**
|
|
127
234
|
* Atomically replaces the queued owner of a stable schedule key.
|
|
@@ -176,5 +283,69 @@ export default class BackgroundJobsClient {
|
|
|
176
283
|
}
|
|
177
284
|
});
|
|
178
285
|
}
|
|
286
|
+
/**
|
|
287
|
+
* Reads current stable ownership and optional terminal history.
|
|
288
|
+
* @param {{scheduleKey: string, includeLatestTerminal?: boolean}} args - Lookup request.
|
|
289
|
+
* @returns {Promise<import("./types.js").BackgroundJobScheduledLookupResult>} - Normalized stable schedule jobs.
|
|
290
|
+
*/
|
|
291
|
+
async getScheduledJob({ scheduleKey, includeLatestTerminal }) {
|
|
292
|
+
const request = await this._request();
|
|
293
|
+
return await request.run({
|
|
294
|
+
onConnect: (jsonSocket) => {
|
|
295
|
+
jsonSocket.send({ type: "get-scheduled-job", scheduleKey, includeLatestTerminal });
|
|
296
|
+
},
|
|
297
|
+
onMessage: ({ message, resolve, reject }) => {
|
|
298
|
+
if (message?.type === "scheduled-job") {
|
|
299
|
+
const { currentJob, latestTerminalJob } = message;
|
|
300
|
+
const currentJobValid = currentJob === null
|
|
301
|
+
|| (isNormalizedBackgroundJob(currentJob) && BACKGROUND_JOB_ACTIVE_STATUSES.some((status) => status === currentJob.status));
|
|
302
|
+
const latestTerminalJobValid = latestTerminalJob === null
|
|
303
|
+
|| (isNormalizedBackgroundJob(latestTerminalJob) && BACKGROUND_JOB_TERMINAL_STATUSES.some((status) => status === latestTerminalJob.status));
|
|
304
|
+
if (!currentJobValid || !latestTerminalJobValid) {
|
|
305
|
+
reject(new Error("Invalid getScheduledJob response: expected normalized public job values"));
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
resolve({ currentJob, latestTerminalJob });
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (message?.type === "get-scheduled-job-error") {
|
|
312
|
+
reject(new Error(message.error || "Failed to read scheduled job"));
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
reject(unexpectedResponseError("getScheduledJob", message));
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Expedites a future queued stable owner without changing job identity.
|
|
321
|
+
* @param {{scheduleKey: string}} args - Wake request.
|
|
322
|
+
* @returns {Promise<import("./types.js").BackgroundJobWakeResult>} - Wake result.
|
|
323
|
+
*/
|
|
324
|
+
async wakeScheduled({ scheduleKey }) {
|
|
325
|
+
const request = await this._request();
|
|
326
|
+
return await request.run({
|
|
327
|
+
onConnect: (jsonSocket) => {
|
|
328
|
+
jsonSocket.send({ type: "wake-scheduled", scheduleKey });
|
|
329
|
+
},
|
|
330
|
+
onMessage: ({ message, resolve, reject }) => {
|
|
331
|
+
if (message?.type === "schedule-woken") {
|
|
332
|
+
const outcome = message.outcome;
|
|
333
|
+
const knownOutcome = BACKGROUND_JOB_WAKE_OUTCOMES.includes(outcome);
|
|
334
|
+
const validJobId = outcome === "not_found" ? message.jobId === null : typeof message.jobId === "string" && message.jobId.length > 0;
|
|
335
|
+
if (!knownOutcome || !validJobId) {
|
|
336
|
+
reject(new Error("Invalid wakeScheduled response"));
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
resolve({ jobId: message.jobId, outcome });
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (message?.type === "wake-scheduled-error") {
|
|
343
|
+
reject(new Error(message.error || "Failed to wake scheduled job"));
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
reject(unexpectedResponseError("wakeScheduled", message));
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
}
|
|
179
350
|
}
|
|
180
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9jbGllbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8scUJBQXFCLE1BQU0sOEJBQThCLENBQUE7QUFDaEUsT0FBTywyQkFBMkIsTUFBTSxxQkFBcUIsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQTtBQUV2SSxNQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQTtBQUV2QyxNQUFNLENBQUMsT0FBTyxPQUFPLG9CQUFvQjtJQUN2Qzs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxnQkFBZ0IsR0FBRywwQkFBMEIsRUFBRSw0QkFBNEIsR0FBRyx1Q0FBdUMsRUFBRSxZQUFZLEVBQUMsR0FBRyxFQUFFO1FBQ25LLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLENBQUE7UUFDcEcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO1FBQ3hDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxvQ0FBb0MsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO1FBQ3RHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLENBQUE7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUE7UUFDckQsTUFBTSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsR0FBRyxhQUFhLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUM1RCxNQUFNLEVBQUMsWUFBWSxFQUFDLEdB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Q0FBQyxFQUFDLFdBQVcsRUFBQztRQUNqQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUVyQyxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN2QixTQUFTLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDeEIsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1lBQzFELENBQUM7WUFDRCxTQUFTLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFDLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxPQUFPLEVBQUUsSUFBSSxLQUFLLG9CQUFvQixFQUFFLENBQUM7b0JBQzNDLE9BQU8sQ0FBQyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQTtvQkFDekQsT0FBTTtnQkFDUixDQUFDO2dCQUVELElBQUksT0FBTyxFQUFFLElBQUksS0FBSyx3QkFBd0IsRUFBRSxDQUFDO29CQUMvQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUE7Z0JBQ3RFLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBjb25maWd1cmF0aW9uUmVzb2x2ZXIgZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb24tcmVzb2x2ZXIuanNcIlxuaW1wb3J0IEJhY2tncm91bmRKb2JzU29ja2V0UmVxdWVzdCBmcm9tIFwiLi9zb2NrZXQtcmVxdWVzdC5qc1wiXG5pbXBvcnQgeyBERUZBVUxUX0dFTkVSQVRJT05fSEFORFNIQUtFX1RJTUVPVVRfTVMsIHZhbGlkYXRlR2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcyB9IGZyb20gXCIuL2dlbmVyYXRpb24taGFuZHNoYWtlLXRpbWVvdXQtZXJyb3IuanNcIlxuXG5jb25zdCBERUZBVUxUX0VOUVVFVUVfVElNRU9VVF9NUyA9IDUwMDBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFja2dyb3VuZEpvYnNDbGllbnQge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbYXJncy5jb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5lbnF1ZXVlVGltZW91dE1zXSAtIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBhbiBlbnF1ZXVlIGFja25vd2xlZGdlbWVudCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNc10gLSBNYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgZ2VuZXJhdGlvbiBhY2tub3dsZWRnZW1lbnQgKGRlZmF1bHQ6IDQwMDApLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2VuZXJhdGlvbklkXSAtIEV4cGxpY2l0IHJlbGVhc2UgZ2VuZXJhdGlvbiBpZGVudGl0eS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBlbnF1ZXVlVGltZW91dE1zID0gREVGQVVMVF9FTlFVRVVFX1RJTUVPVVRfTVMsIGdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMgPSBERUZBVUxUX0dFTkVSQVRJT05fSEFORFNIQUtFX1RJTUVPVVRfTVMsIGdlbmVyYXRpb25JZH0gPSB7fSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvblByb21pc2UgPSBjb25maWd1cmF0aW9uID8gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZ3VyYXRpb24pIDogY29uZmlndXJhdGlvblJlc29sdmVyKClcbiAgICB0aGlzLmVucXVldWVUaW1lb3V0TXMgPSBlbnF1ZXVlVGltZW91dE1zXG4gICAgdGhpcy5nZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zID0gdmFsaWRhdGVHZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zKGdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMpXG4gICAgdGhpcy5leHBsaWNpdEdlbmVyYXRpb25JZCA9IGdlbmVyYXRpb25JZFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG9uZS1zaG90IGNsaWVudCBzb2NrZXQgcmVxdWVzdCBmcm9tIHRoZSByZXNvbHZlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCYWNrZ3JvdW5kSm9ic1NvY2tldFJlcXVlc3Q+fSAtIFNvY2tldCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgX3JlcXVlc3QoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvblByb21pc2VcbiAgICBjb25zdCB7aG9zdCwgcG9ydH0gPSBjb25maWd1cmF0aW9uLmdldEJhY2tncm91bmRKb2JzQ29uZmlnKClcbiAgICBjb25zdCB7Z2VuZXJhdGlvbklkfSA9IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZUJhY2tncm91bmRKb2JzR2VuZXJhdGlvbkNvbmZpZyh7XG4gICAgICBnZW5lcmF0aW9uSWQ6IHRoaXMuZXhwbGljaXRHZW5lcmF0aW9uSWQsXG4gICAgICBzb3VyY2VOYW1lOiBcIkJhY2tncm91bmRKb2JzQ2xpZW50XCJcbiAgICB9KVxuXG4gICAgcmV0dXJuIG5ldyBCYWNrZ3JvdW5kSm9ic1NvY2tldFJlcXVlc3Qoe2hvc3QsIHBvcnQsIHJvbGU6IFwiY2xpZW50XCIsIGdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXM6IHRoaXMuZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcywgZ2VuZXJhdGlvbklkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVucXVldWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iTmFtZSAtIEpvYiBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gW2FyZ3Mub3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnByb2R1Y2VySW52b2NhdGlvbklkXSAtIFN0YWJsZSBpZGVudGl0eSBmb3Igb25lIG93bmVkIGVucXVldWUgaW52b2NhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JQcm9kdWNlclByb29mfSBbYXJncy5wcm9kdWNlclByb29mXSAtIEV4YWN0IGludGVybmFsIHByb2R1Y2VyIGhhbmRvZmYuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSm9iIGlkLlxuICAgKi9cbiAgYXN5bmMgZW5xdWV1ZSh7am9iTmFtZSwgYXJncywgb3B0aW9ucywgcHJvZHVjZXJJbnZvY2F0aW9uSWQsIHByb2R1Y2VyUHJvb2Z9KSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgIHR5cGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImVucXVldWVcIiksXG4gICAgICBqb2JOYW1lLFxuICAgICAgYXJncyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICAuLi4ocHJvZHVjZXJJbnZvY2F0aW9uSWQgPyB7cHJvZHVjZXJJbnZvY2F0aW9uSWR9IDoge30pLFxuICAgICAgLi4uKHByb2R1Y2VyUHJvb2YgPyB7cHJvZHVjZXJQcm9vZn0gOiB7fSlcbiAgICB9XG4gICAgY29uc3QgYWNrbm93bGVkZ2VtZW50ID0ge2V4cGxpY2l0bHlSZWplY3RlZDogZmFsc2UsIGdlbmVyYXRpb25GZW5jZWQ6IGZhbHNlLCByZXF1ZXN0U2VudDogZmFsc2V9XG4gICAgLyoqXG4gICAgICogU2VuZHMgb25lIGVucXVldWUgYXR0ZW1wdC4gQW4gb3duZWQgY2FsbGVyIG1heSByZXBsYXkgdGhpcyBleGFjdCBtZXNzYWdlXG4gICAgICogb25jZSB3aGVuIHRyYW5zcG9ydCBhY2tub3dsZWRnZW1lbnQgcmVtYWlucyBhbWJpZ3VvdXMgYWZ0ZXIgc2VuZC5cbiAgICAgKiBAcGFyYW0ge3tleHBsaWNpdGx5UmVqZWN0ZWQ6IGJvb2xlYW4sIGdlbmVyYXRpb25GZW5jZWQ6IGJvb2xlYW4sIHJlcXVlc3RTZW50OiBib29sZWFufSB8IHVuZGVmaW5lZH0gYXR0ZW1wdEFja25vd2xlZGdlbWVudCAtIEZpcnN0LWF0dGVtcHQgb2JzZXJ2YXRpb25zLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSm9iIGlkLlxuICAgICAqL1xuICAgIGNvbnN0IGVucXVldWVBdHRlbXB0ID0gYXN5bmMgKGF0dGVtcHRBY2tub3dsZWRnZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCB0aGlzLl9yZXF1ZXN0KClcbiAgICAgIGNvbnN0IHJlcXVlc3RBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAgIGNvbnN0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBgQmFja2dyb3VuZCBqb2IgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgdGltZWQgb3V0IGFmdGVyICR7dGhpcy5lbnF1ZXVlVGltZW91dE1zfW1zYFxuICAgICAgLyoqXG4gICAgICAgKiBSZXNvbHZlcyB0aGUgcHJlLXNlbmQgcGhhc2Ugd2hlbiB0aGUgbXV0YXRpb24gaGFzIGVudGVyZWQgdGhlIHNvY2tldC5cbiAgICAgICAqIEB0eXBlIHsoKSA9PiB2b2lkfVxuICAgICAgICovXG4gICAgICBsZXQgbWFya1JlcXVlc3RTZW50ID0gKCkgPT4ge31cbiAgICAgIGNvbnN0IHJlcXVlc3RTZW50ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgbWFya1JlcXVlc3RTZW50ID0gKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9KVxuICAgICAgLyoqXG4gICAgICAgKiBBcHBsaWVzIHRoZSBjb25maWd1cmVkIGRlYWRsaW5lIGluZGVwZW5kZW50bHkgdG8gb25lIHJlcXVlc3QgcGhhc2UuXG4gICAgICAgKiBAdGVtcGxhdGUgVFxuICAgICAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIFBoYXNlIHdvcmsuXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBQaGFzZSByZXN1bHQuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHdpdGhFbnF1ZXVlVGltZW91dCA9IGFzeW5jIChjYWxsYmFjaykgPT4gYXdhaXQgdGltZW91dCh7XG4gICAgICAgIGVycm9yTWVzc2FnZTogdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdGltZW91dDogdGhpcy5lbnF1ZXVlVGltZW91dE1zXG4gICAgICB9LCBhc3luYyAoe2NvbnRyb2x9KSA9PiB7XG4gICAgICAgIGNvbnN0IGFib3J0UmVxdWVzdCA9ICgpID0+IHJlcXVlc3RBYm9ydENvbnRyb2xsZXIuYWJvcnQoY29udHJvbC5zaWduYWwucmVhc29uKVxuXG4gICAgICAgIGNvbnRyb2wuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydFJlcXVlc3QpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjb250cm9sLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRSZXF1ZXN0KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgY29uc3QgcmVxdWVzdFByb21pc2UgPSByZXF1ZXN0LnJ1bih7XG4gICAgICAgIHNpZ25hbDogcmVxdWVzdEFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAgICBqc29uU29ja2V0LnNlbmQobWVzc2FnZSlcbiAgICAgICAgICBpZiAoYXR0ZW1wdEFja25vd2xlZGdlbWVudCkge1xuICAgICAgICAgICAgYXR0ZW1wdEFja25vd2xlZGdlbWVudC5nZW5lcmF0aW9uRmVuY2VkID0gQm9vbGVhbihyZXF1ZXN0LmdlbmVyYXRpb25JZClcbiAgICAgICAgICAgIGF0dGVtcHRBY2tub3dsZWRnZW1lbnQucmVxdWVzdFNlbnQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcmtSZXF1ZXN0U2VudCgpXG4gICAgICAgIH0sXG4gICAgICAgIG9uTWVzc2FnZTogKHttZXNzYWdlLCByZXNvbHZlLCByZWplY3R9KSA9PiB7XG4gICAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZW5xdWV1ZWRcIikge1xuICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlLmpvYklkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZW5xdWV1ZS1lcnJvclwiKSB7XG4gICAgICAgICAgICBpZiAoYXR0ZW1wdEFja25vd2xlZGdlbWVudCkgYXR0ZW1wdEFja25vd2xlZGdlbWVudC5leHBsaWNpdGx5UmVqZWN0ZWQgPSB0cnVlXG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UuZXJyb3IgfHwgXCJGYWlsZWQgdG8gZW5xdWV1ZSBqb2JcIikpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB3aXRoRW5xdWV1ZVRpbWVvdXQoYXN5bmMgKCkgPT4gYXdhaXQgUHJvbWlzZS5yYWNlKFtyZXF1ZXN0U2VudCwgcmVxdWVzdFByb21pc2VdKSlcblxuICAgICAgcmV0dXJuIGF3YWl0IHdpdGhFbnF1ZXVlVGltZW91dChhc3luYyAoKSA9PiBhd2FpdCByZXF1ZXN0UHJvbWlzZSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGVucXVldWVBdHRlbXB0KGFja25vd2xlZGdlbWVudClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFwcm9kdWNlckludm9jYXRpb25JZCB8fCAhcHJvZHVjZXJQcm9vZiB8fCAhYWNrbm93bGVkZ2VtZW50LmdlbmVyYXRpb25GZW5jZWQgfHwgIWFja25vd2xlZGdlbWVudC5yZXF1ZXN0U2VudCB8fCBhY2tub3dsZWRnZW1lbnQuZXhwbGljaXRseVJlamVjdGVkKSB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlQXR0ZW1wdCh1bmRlZmluZWQpXG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSByZXBsYWNlcyB0aGUgcXVldWVkIG93bmVyIG9mIGEgc3RhYmxlIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iTmFtZSAtIEpvYiBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gW2FyZ3Mub3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUmVwbGFjZW1lbnRSZXN1bHQ+fSAtIFJlcGxhY2VtZW50IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHJlcGxhY2VTY2hlZHVsZWQoe3NjaGVkdWxlS2V5LCBqb2JOYW1lLCBhcmdzLCBvcHRpb25zfSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCB0aGlzLl9yZXF1ZXN0KClcblxuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0LnJ1bih7XG4gICAgICBvbkNvbm5lY3Q6IChqc29uU29ja2V0KSA9PiB7XG4gICAgICAgIGpzb25Tb2NrZXQuc2VuZCh7dHlwZTogXCJyZXBsYWNlLXNjaGVkdWxlZFwiLCBzY2hlZHVsZUtleSwgam9iTmFtZSwgYXJncywgb3B0aW9uc30pXG4gICAgICB9LFxuICAgICAgb25NZXNzYWdlOiAoe21lc3NhZ2UsIHJlc29sdmUsIHJlamVjdH0pID0+IHtcbiAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwic2NoZWR1bGUtcmVwbGFjZWRcIikge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgam9iSWQ6IG1lc3NhZ2Uuam9iSWQsXG4gICAgICAgICAgICBwcmV2aW91c0pvYklkOiBtZXNzYWdlLnByZXZpb3VzSm9iSWQsXG4gICAgICAgICAgICBwcmV2aW91c1N0YXR1czogbWVzc2FnZS5wcmV2aW91c1N0YXR1c1xuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJyZXBsYWNlLXNjaGVkdWxlZC1lcnJvclwiKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlLmVycm9yIHx8IFwiRmFpbGVkIHRvIHJlcGxhY2Ugc2NoZWR1bGVkIGpvYlwiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBvciBkZXRhY2hlcyB0aGUgY3VycmVudCBvd25lciBvZiBhIHN0YWJsZSBzY2hlZHVsZSBrZXkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYkNhbmNlbGxhdGlvblJlc3VsdD59IC0gQ2FuY2VsbGF0aW9uIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNhbmNlbFNjaGVkdWxlZCh7c2NoZWR1bGVLZXl9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucnVuKHtcbiAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAganNvblNvY2tldC5zZW5kKHt0eXBlOiBcImNhbmNlbC1zY2hlZHVsZWRcIiwgc2NoZWR1bGVLZXl9KVxuICAgICAgfSxcbiAgICAgIG9uTWVzc2FnZTogKHttZXNzYWdlLCByZXNvbHZlLCByZWplY3R9KSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlPy50eXBlID09PSBcInNjaGVkdWxlLWNhbmNlbGxlZFwiKSB7XG4gICAgICAgICAgcmVzb2x2ZSh7am9iSWQ6IG1lc3NhZ2Uuam9iSWQsIG91dGNvbWU6IG1lc3NhZ2Uub3V0Y29tZX0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJjYW5jZWwtc2NoZWR1bGVkLWVycm9yXCIpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UuZXJyb3IgfHwgXCJGYWlsZWQgdG8gY2FuY2VsIHNjaGVkdWxlZCBqb2JcIikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG4iXX0=
|
|
351
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9jbGllbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDakUsT0FBTyxxQkFBcUIsTUFBTSw4QkFBOEIsQ0FBQTtBQUNoRSxPQUFPLGFBQWEsTUFBTSwwQkFBMEIsQ0FBQTtBQUNwRCxPQUFPLCtDQUErQyxNQUFNLDRDQUE0QyxDQUFBO0FBQ3hHLE9BQU8sMkJBQTJCLE1BQU0scUJBQXFCLENBQUE7QUFDN0QsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0seUNBQXlDLENBQUE7QUFDdkksT0FBTyxFQUFFLDhCQUE4QixFQUFFLDhCQUE4QixFQUFFLHVCQUF1QixFQUFFLGdDQUFnQyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFOUosTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUE7QUFDdkMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0FBQ3hGLE1BQU0scUNBQXFDLEdBQUc7SUFDNUMsVUFBVTtJQUNWLFVBQVU7SUFDVixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixhQUFhO0lBQ2IsWUFBWTtJQUNaLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLGNBQWM7SUFDZCxlQUFlO0lBQ2YsZUFBZTtJQUNmLFdBQVc7Q0FDWixDQUFBO0FBQ0QsTUFBTSxxQ0FBcUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0FBRXhJOzs7O0dBSUc7QUFDSCxTQUFTLDZCQUE2QixDQUFDLEtBQUs7SUFDMUMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUNoRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsNkJBQTZCLENBQUMsS0FBSztJQUMxQyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFBO0FBQ3BELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxLQUFLO0lBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFdkMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFBO0lBRWpCLE9BQU8sT0FBTyxHQUFHLENBQUMsRUFBRSxLQUFLLFFBQVE7V0FDNUIsT0FBTyxHQUFHLENBQUMsT0FBTyxLQUFLLFFBQVE7V0FDL0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1dBQ3ZCLDhCQUE4QixDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxLQUFLLEdBQUcsQ0FBQyxhQUFhLENBQUM7V0FDM0YsT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVE7V0FDN0IsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQztXQUMvRCxxQ0FBcUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1dBQ2pHLHFDQUFxQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN4RyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxPQUFPO0lBQ2pELE1BQU0sWUFBWSxHQUFHLE9BQU8sSUFBSSxPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUE7SUFFaEcsT0FBTyxJQUFJLEtBQUssQ0FBQyxjQUFjLFNBQVMsY0FBYyxZQUFZLEVBQUUsQ0FBQyxDQUFBO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLG9CQUFvQjtJQUN2Qzs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxnQkFBZ0IsR0FBRywwQkFBMEIsRUFBRSw0QkFBNEIsR0FBRyx1Q0FBdUMsRUFBRSxZQUFZLEVBQUMsR0FBRyxFQUFFO1FBQ25LLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLENBQUE7UUFDcEcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO1FBQ3hDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxvQ0FBb0MsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO1FBQ3RHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLENBQUE7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUE7UUFDckQsTUFBTSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsR0FBRyxhQUFhLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUM1RCxNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsYUFBYSxDQUFDLHFDQUFxQyxDQUFDO1lBQ3pFLFlBQVksRUFBRSxJQUFJLENBQUMsb0JBQW9CO1lBQ3ZDLFVBQVUsRUFBRSxzQkFBc0I7U0FDbkMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxJQUFJLDJCQUEyQixDQUFDLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLDRCQUE0QixFQUFFLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFBO0lBQ3JKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFDO1FBQ3pFLE1BQU0sT0FBTyxHQUFHO1lBQ2QsSUFBSSxFQUFFLG9CQUFvQixDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RDLE9BQU87WUFDUCxJQUFJO1lBQ0osT0FBTztZQUNQLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBQyxvQkFBb0IsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkQsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzFDLENBQUE7UUFDRDs7Ozs7O1dBTUc7UUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsRUFBQyxXQUFXLEVBQUUsYUFBYSxFQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0QsNEJBQTRCLEVBQUUsQ0FBQztZQUMvQixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLFdBQVc7WUFDWCxhQUFhO1lBQ2Isa0JBQWtCLEVBQUUsS0FBSztZQUN6QixnQkFBZ0IsRUFBRSxLQUFLO1lBQ3ZCLFdBQVcsRUFBRSxLQUFLO1NBQ25CLENBQUMsQ0FBQTtRQUNGOzs7Ozs7V0FNRztRQUNILE1BQU0sY0FBYyxHQUFHLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFO1lBQ3BFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1lBQ3JDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1lBQ3JDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQTtZQUNwRCxNQUFNLG1CQUFtQixHQUFHLDBEQUEwRCxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQTtZQUMvRyxpQ0FBaUM7WUFDakMsSUFBSSxlQUFlLENBQUE7WUFDbkI7OztlQUdHO1lBQ0gsSUFBSSxlQUFlLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFBO1lBQzlCLE1BQU0sV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzFDLGVBQWUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDNUMsQ0FBQyxDQUFDLENBQUE7WUFDRjs7Ozs7ZUFLRztZQUNILE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsTUFBTSxPQUFPLENBQUM7Z0JBQzNELFlBQVksRUFBRSxtQkFBbUI7Z0JBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCO2FBQy9CLEVBQUUsS0FBSyxFQUFFLEVBQUMsT0FBTyxFQUFDLEVBQUUsRUFBRTtnQkFDckIsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBRTlFLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFBO2dCQUN0RCxJQUFJLENBQUM7b0JBQ0gsT0FBTyxNQUFNLFFBQVEsRUFBRSxDQUFBO2dCQUN6QixDQUFDO3dCQUFTLENBQUM7b0JBQ1QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUE7Z0JBQzNELENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQTtZQUNGLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ2pDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxNQUFNO2dCQUNyQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtvQkFDeEIsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtvQkFDeEIsa0JBQWtCLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtvQkFDbkUsa0JBQWtCLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtvQkFDckMsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtvQkFDNUIsZUFBZSxFQUFFLENBQUE7Z0JBQ25CLENBQUM7Z0JBQ0QsU0FBUyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBQyxFQUFFLEVBQUU7b0JBQ3hDLElBQUksT0FBTyxFQUFFLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQzt3QkFDakMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTt3QkFDdEIsT0FBTTtvQkFDUixDQUFDO29CQUVELElBQUksT0FBTyxFQUFFLElBQUksS0FBSyxlQUFlLEVBQUUsQ0FBQzt3QkFDdEMsa0JBQWtCLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFBO3dCQUM1QyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSx1QkFBdUIsQ0FBQyxDQUFDLENBQUE7b0JBQzdELENBQUM7Z0JBQ0gsQ0FBQzthQUNGLENBQUMsQ0FBQTtZQUVGLE1BQU0sa0JBQWtCLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBRXZGLElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sa0JBQWtCLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxDQUFBO1lBQ25FLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxZQUFZLENBQUM7b0JBQUUsTUFBTSxLQUFLLENBQUE7Z0JBQ2pELElBQUksZUFBZSxLQUFLLFNBQVM7b0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRkFBaUYsRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO2dCQUVySixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7Z0JBQy9CLDhHQUE4RztnQkFDOUcsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLEdBQUcsZUFBZSxDQUFDLENBQUE7Z0JBRXBHLGtCQUFrQixDQUFDLDRCQUE0QixHQUFHLDRCQUE0QixDQUFBO2dCQUM5RSxrQkFBa0IsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLDRCQUE0QixFQUFFLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxDQUFBO2dCQUUvRyxNQUFNLElBQUksK0NBQStDLENBQUM7b0JBQ3hELHdCQUF3QixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7b0JBQy9DLGNBQWMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7b0JBQ3pELEtBQUssRUFBRSxLQUFLO29CQUNaLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtvQkFDbEMsT0FBTztvQkFDUCxvQkFBb0I7b0JBQ3BCLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUM7aUJBQzdDLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDLENBQUE7UUFFRCxNQUFNLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUE7UUFFeEYsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLGNBQWMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDakQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxJQUFJLGNBQWMsQ0FBQyxrQkFBa0I7Z0JBQUUsTUFBTSxLQUFLLENBQUE7WUFFaEssTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLFlBQVksK0NBQStDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUNySCxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxFQUFDLFdBQVcsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUE7WUFFNUYsT0FBTyxNQUFNLGNBQWMsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDO1FBQzFELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBRXJDLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUN4QixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7WUFDbkYsQ0FBQztZQUNELFNBQVMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUMsRUFBRSxFQUFFO2dCQUN4QyxJQUFJLE9BQU8sRUFBRSxJQUFJLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztvQkFDMUMsT0FBTyxDQUFDO3dCQUNOLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSzt3QkFDcEIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO3dCQUNwQyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7cUJBQ3ZDLENBQUMsQ0FBQTtvQkFDRixPQUFNO2dCQUNSLENBQUM7Z0JBRUQsSUFBSSxPQUFPLEVBQUUsSUFBSSxLQUFLLHlCQUF5QixFQUFFLENBQUM7b0JBQ2hELE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLGlDQUFpQyxDQUFDLENBQUMsQ0FBQTtnQkFDdkUsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUMsV0FBVyxFQUFDO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBRXJDLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUN4QixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUE7WUFDMUQsQ0FBQztZQUNELFNBQVMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUMsRUFBRSxFQUFFO2dCQUN4QyxJQUFJLE9BQU8sRUFBRSxJQUFJLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztvQkFDM0MsT0FBTyxDQUFDLEVBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUMsQ0FBQyxDQUFBO29CQUN6RCxPQUFNO2dCQUNSLENBQUM7Z0JBRUQsSUFBSSxPQUFPLEVBQUUsSUFBSSxLQUFLLHdCQUF3QixFQUFFLENBQUM7b0JBQy9DLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLGdDQUFnQyxDQUFDLENBQUMsQ0FBQTtnQkFDdEUsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBQyxXQUFXLEVBQUUscUJBQXFCLEVBQUM7UUFDeEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7UUFFckMsT0FBTyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDdkIsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUU7Z0JBQ3hCLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFDLENBQUMsQ0FBQTtZQUNsRixDQUFDO1lBQ0QsU0FBUyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBQyxFQUFFLEVBQUU7Z0JBQ3hDLElBQUksT0FBTyxFQUFFLElBQUksS0FBSyxlQUFlLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxFQUFDLFVBQVUsRUFBRSxpQkFBaUIsRUFBQyxHQUFHLE9BQU8sQ0FBQTtvQkFDL0MsTUFBTSxlQUFlLEdBQUcsVUFBVSxLQUFLLElBQUk7MkJBQ3RDLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLElBQUksOEJBQThCLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7b0JBQzdILE1BQU0sc0JBQXNCLEdBQUcsaUJBQWlCLEtBQUssSUFBSTsyQkFDcEQsQ0FBQyx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxLQUFLLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7b0JBRTdJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO3dCQUNoRCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMseUVBQXlFLENBQUMsQ0FBQyxDQUFBO3dCQUM1RixPQUFNO29CQUNSLENBQUM7b0JBRUQsT0FBTyxDQUFDLEVBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFDLENBQUMsQ0FBQTtvQkFDeEMsT0FBTTtnQkFDUixDQUFDO2dCQUVELElBQUksT0FBTyxFQUFFLElBQUksS0FBSyx5QkFBeUIsRUFBRSxDQUFDO29CQUNoRCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSw4QkFBOEIsQ0FBQyxDQUFDLENBQUE7b0JBQ2xFLE9BQU07Z0JBQ1IsQ0FBQztnQkFFRCxNQUFNLENBQUMsdUJBQXVCLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtZQUM3RCxDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUMsV0FBVyxFQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBRXJDLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUN4QixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUE7WUFDeEQsQ0FBQztZQUNELFNBQVMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUMsRUFBRSxFQUFFO2dCQUN4QyxJQUFJLE9BQU8sRUFBRSxJQUFJLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztvQkFDdkMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQTtvQkFDL0IsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUNuRSxNQUFNLFVBQVUsR0FBRyxPQUFPLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7b0JBRW5JLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDakMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQTt3QkFDbkQsT0FBTTtvQkFDUixDQUFDO29CQUVELE9BQU8sQ0FBQyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7b0JBQ3hDLE9BQU07Z0JBQ1IsQ0FBQztnQkFFRCxJQUFJLE9BQU8sRUFBRSxJQUFJLEtBQUssc0JBQXNCLEVBQUUsQ0FBQztvQkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksOEJBQThCLENBQUMsQ0FBQyxDQUFBO29CQUNsRSxPQUFNO2dCQUNSLENBQUM7Z0JBRUQsTUFBTSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO1lBQzNELENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHRpbWVvdXQsIHsgVGltZW91dEVycm9yIH0gZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IGNvbmZpZ3VyYXRpb25SZXNvbHZlciBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi1yZXNvbHZlci5qc1wiXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tIFwiLi4vdXRpbHMvcGxhaW4tb2JqZWN0LmpzXCJcbmltcG9ydCBCYWNrZ3JvdW5kSm9iRW5xdWV1ZUFja25vd2xlZGdlbWVudFRpbWVvdXRFcnJvciBmcm9tIFwiLi9lbnF1ZXVlLWFja25vd2xlZGdlbWVudC10aW1lb3V0LWVycm9yLmpzXCJcbmltcG9ydCBCYWNrZ3JvdW5kSm9ic1NvY2tldFJlcXVlc3QgZnJvbSBcIi4vc29ja2V0LXJlcXVlc3QuanNcIlxuaW1wb3J0IHsgREVGQVVMVF9HRU5FUkFUSU9OX0hBTkRTSEFLRV9USU1FT1VUX01TLCB2YWxpZGF0ZUdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMgfSBmcm9tIFwiLi9nZW5lcmF0aW9uLWhhbmRzaGFrZS10aW1lb3V0LWVycm9yLmpzXCJcbmltcG9ydCB7IEJBQ0tHUk9VTkRfSk9CX0FDVElWRV9TVEFUVVNFUywgQkFDS0dST1VORF9KT0JfRVhFQ1VUSU9OX01PREVTLCBCQUNLR1JPVU5EX0pPQl9TVEFUVVNFUywgQkFDS0dST1VORF9KT0JfVEVSTUlOQUxfU1RBVFVTRVMgfSBmcm9tIFwiLi9qb2Itc2VtYW50aWNzLmpzXCJcblxuY29uc3QgREVGQVVMVF9FTlFVRVVFX1RJTUVPVVRfTVMgPSA1MDAwXG5jb25zdCBCQUNLR1JPVU5EX0pPQl9XQUtFX09VVENPTUVTID0gW1wid29rZW5cIiwgXCJhbHJlYWR5X2R1ZVwiLCBcImhhbmRlZF9vZmZcIiwgXCJub3RfZm91bmRcIl1cbmNvbnN0IEJBQ0tHUk9VTkRfSk9CX05VTExBQkxFX05VTUJFUl9GSUVMRFMgPSBbXG4gIFwiYXR0ZW1wdHNcIixcbiAgXCJjaGlsZFBpZFwiLFxuICBcImNoaWxkUmVjZWl2ZWRBdE1zXCIsXG4gIFwiY2hpbGRTdGFydGVkQXRNc1wiLFxuICBcImNvbXBsZXRlZEF0TXNcIixcbiAgXCJjcmVhdGVkQXRNc1wiLFxuICBcImZhaWxlZEF0TXNcIixcbiAgXCJoYW5kZWRPZmZBdE1zXCIsXG4gIFwibWF4Q29uY3VycmVuY3lcIixcbiAgXCJtYXhSZXRyaWVzXCIsXG4gIFwib3JwaGFuZWRBdE1zXCIsXG4gIFwic2NoZWR1bGVPcmRlclwiLFxuICBcInNjaGVkdWxlZEF0TXNcIixcbiAgXCJ0aW1lb3V0TXNcIlxuXVxuY29uc3QgQkFDS0dST1VORF9KT0JfTlVMTEFCTEVfU1RSSU5HX0ZJRUxEUyA9IFtcImNoaWxkSW5zdGFuY2VJZFwiLCBcImNvbmN1cnJlbmN5S2V5XCIsIFwiaGFuZG9mZklkXCIsIFwibGFzdEVycm9yXCIsIFwic2NoZWR1bGVLZXlcIiwgXCJ3b3JrZXJJZFwiXVxuXG4vKipcbiAqIENoZWNrcyBhIHJlcXVpcmVkIG51bGxhYmxlIG51bWJlciBmcm9tIGEgbm9ybWFsaXplZCB3aXJlIHJvdy5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gRmllbGQgdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBmaWVsZCBpcyBudWxsIG9yIGEgZmluaXRlIG51bWJlci5cbiAqL1xuZnVuY3Rpb24gaXNOdWxsYWJsZUJhY2tncm91bmRKb2JOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSlcbn1cblxuLyoqXG4gKiBDaGVja3MgYSByZXF1aXJlZCBudWxsYWJsZSBzdHJpbmcgZnJvbSBhIG5vcm1hbGl6ZWQgd2lyZSByb3cuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIEZpZWxkIHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgZmllbGQgaXMgbnVsbCBvciBhIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gaXNOdWxsYWJsZUJhY2tncm91bmRKb2JTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIlxufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGEgdHJhbnNwb3J0IGpvYiB1c2VzIHRoZSBub3JtYWxpemVkIHB1YmxpYyBjYW1lbC1jYXNlIHNoYXBlLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBUcmFuc3BvcnQgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUm93fSAtIFdoZXRoZXIgbm9ybWFsaXplZC5cbiAqL1xuZnVuY3Rpb24gaXNOb3JtYWxpemVkQmFja2dyb3VuZEpvYih2YWx1ZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBqb2IgPSB2YWx1ZVxuXG4gIHJldHVybiB0eXBlb2Ygam9iLmlkID09PSBcInN0cmluZ1wiXG4gICAgJiYgdHlwZW9mIGpvYi5qb2JOYW1lID09PSBcInN0cmluZ1wiXG4gICAgJiYgQXJyYXkuaXNBcnJheShqb2IuYXJncylcbiAgICAmJiBCQUNLR1JPVU5EX0pPQl9FWEVDVVRJT05fTU9ERVMuc29tZSgoZXhlY3V0aW9uTW9kZSkgPT4gZXhlY3V0aW9uTW9kZSA9PT0gam9iLmV4ZWN1dGlvbk1vZGUpXG4gICAgJiYgdHlwZW9mIGpvYi5xdWV1ZSA9PT0gXCJzdHJpbmdcIlxuICAgICYmIEJBQ0tHUk9VTkRfSk9CX1NUQVRVU0VTLnNvbWUoKHN0YXR1cykgPT4gc3RhdHVzID09PSBqb2Iuc3RhdHVzKVxuICAgICYmIEJBQ0tHUk9VTkRfSk9CX05VTExBQkxFX05VTUJFUl9GSUVMRFMuZXZlcnkoKGZpZWxkKSA9PiBpc051bGxhYmxlQmFja2dyb3VuZEpvYk51bWJlcihqb2JbZmllbGRdKSlcbiAgICAmJiBCQUNLR1JPVU5EX0pPQl9OVUxMQUJMRV9TVFJJTkdfRklFTERTLmV2ZXJ5KChmaWVsZCkgPT4gaXNOdWxsYWJsZUJhY2tncm91bmRKb2JTdHJpbmcoam9iW2ZpZWxkXSkpXG59XG5cbi8qKlxuICogRGVzY3JpYmVzIGFuIHVuZXhwZWN0ZWQgcHJvdG9jb2wgcmVzcG9uc2Ugd2l0aG91dCBlY2hvaW5nIGl0cyBwYXlsb2FkLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbiAtIFB1YmxpYyBvcGVyYXRpb24gbmFtZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iU29ja2V0TWVzc2FnZX0gbWVzc2FnZSAtIFJlc3BvbnNlLlxuICogQHJldHVybnMge0Vycm9yfSAtIFByb3RvY29sIGVycm9yLlxuICovXG5mdW5jdGlvbiB1bmV4cGVjdGVkUmVzcG9uc2VFcnJvcihvcGVyYXRpb24sIG1lc3NhZ2UpIHtcbiAgY29uc3QgcmVzcG9uc2VUeXBlID0gbWVzc2FnZSAmJiB0eXBlb2YgbWVzc2FnZS50eXBlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZS50eXBlIDogXCJtaXNzaW5nIHR5cGVcIlxuXG4gIHJldHVybiBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgJHtvcGVyYXRpb259IHJlc3BvbnNlOiAke3Jlc3BvbnNlVHlwZX1gKVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWNrZ3JvdW5kSm9ic0NsaWVudCB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmVucXVldWVUaW1lb3V0TXNdIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGFuIGVucXVldWUgYWNrbm93bGVkZ2VtZW50IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogNTAwMCkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5nZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zXSAtIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBnZW5lcmF0aW9uIGFja25vd2xlZGdlbWVudCAoZGVmYXVsdDogNDAwMCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5nZW5lcmF0aW9uSWRdIC0gRXhwbGljaXQgcmVsZWFzZSBnZW5lcmF0aW9uIGlkZW50aXR5LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGVucXVldWVUaW1lb3V0TXMgPSBERUZBVUxUX0VOUVVFVUVfVElNRU9VVF9NUywgZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcyA9IERFRkFVTFRfR0VORVJBVElPTl9IQU5EU0hBS0VfVElNRU9VVF9NUywgZ2VuZXJhdGlvbklkfSA9IHt9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uUHJvbWlzZSA9IGNvbmZpZ3VyYXRpb24gPyBQcm9taXNlLnJlc29sdmUoY29uZmlndXJhdGlvbikgOiBjb25maWd1cmF0aW9uUmVzb2x2ZXIoKVxuICAgIHRoaXMuZW5xdWV1ZVRpbWVvdXRNcyA9IGVucXVldWVUaW1lb3V0TXNcbiAgICB0aGlzLmdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMgPSB2YWxpZGF0ZUdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMoZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcylcbiAgICB0aGlzLmV4cGxpY2l0R2VuZXJhdGlvbklkID0gZ2VuZXJhdGlvbklkXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgb25lLXNob3QgY2xpZW50IHNvY2tldCByZXF1ZXN0IGZyb20gdGhlIHJlc29sdmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJhY2tncm91bmRKb2JzU29ja2V0UmVxdWVzdD59IC0gU29ja2V0IHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBfcmVxdWVzdCgpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uUHJvbWlzZVxuICAgIGNvbnN0IHtob3N0LCBwb3J0fSA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2dyb3VuZEpvYnNDb25maWcoKVxuICAgIGNvbnN0IHtnZW5lcmF0aW9uSWR9ID0gY29uZmlndXJhdGlvbi5yZXNvbHZlQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uQ29uZmlnKHtcbiAgICAgIGdlbmVyYXRpb25JZDogdGhpcy5leHBsaWNpdEdlbmVyYXRpb25JZCxcbiAgICAgIHNvdXJjZU5hbWU6IFwiQmFja2dyb3VuZEpvYnNDbGllbnRcIlxuICAgIH0pXG5cbiAgICByZXR1cm4gbmV3IEJhY2tncm91bmRKb2JzU29ja2V0UmVxdWVzdCh7aG9zdCwgcG9ydCwgcm9sZTogXCJjbGllbnRcIiwgZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNczogdGhpcy5nZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zLCBnZW5lcmF0aW9uSWR9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5xdWV1ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JOYW1lIC0gSm9iIG5hbWUuXG4gICAqIEBwYXJhbSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLmFyZ3MgLSBKb2IgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfSBbYXJncy5vcHRpb25zXSAtIEpvYiBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucHJvZHVjZXJJbnZvY2F0aW9uSWRdIC0gU3RhYmxlIGlkZW50aXR5IGZvciBvbmUgb3duZWQgZW5xdWV1ZSBpbnZvY2F0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYlByb2R1Y2VyUHJvb2Z9IFthcmdzLnByb2R1Y2VyUHJvb2ZdIC0gRXhhY3QgaW50ZXJuYWwgcHJvZHVjZXIgaGFuZG9mZi5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBKb2IgaWQuXG4gICAqL1xuICBhc3luYyBlbnF1ZXVlKHtqb2JOYW1lLCBhcmdzLCBvcHRpb25zLCBwcm9kdWNlckludm9jYXRpb25JZCwgcHJvZHVjZXJQcm9vZn0pIHtcbiAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgdHlwZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiZW5xdWV1ZVwiKSxcbiAgICAgIGpvYk5hbWUsXG4gICAgICBhcmdzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIC4uLihwcm9kdWNlckludm9jYXRpb25JZCA/IHtwcm9kdWNlckludm9jYXRpb25JZH0gOiB7fSksXG4gICAgICAuLi4ocHJvZHVjZXJQcm9vZiA/IHtwcm9kdWNlclByb29mfSA6IHt9KVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHNhZmUgb2JzZXJ2YXRpb25zIGZvciBvbmUgYXR0ZW1wdCB3aXRob3V0IHJldGFpbmluZyByZXF1ZXN0IGRhdGEuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBdHRlbXB0IGlkZW50aXR5LlxuICAgICAqIEBwYXJhbSB7XCJpbml0aWFsXCIgfCBcIm93bmVkX3JlcGxheVwifSBhcmdzLmF0dGVtcHRLaW5kIC0gSW5pdGlhbCBhdHRlbXB0IG9yIG93bmVkIHJlcGxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5hdHRlbXB0TnVtYmVyIC0gT25lLWJhc2VkIGF0dGVtcHQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2VucXVldWUtYWNrbm93bGVkZ2VtZW50LXRpbWVvdXQtZXJyb3IuanNcIikuQmFja2dyb3VuZEpvYkVucXVldWVBdHRlbXB0fSAtIE11dGFibGUgYXR0ZW1wdCBvYnNlcnZhdGlvbnMuXG4gICAgICovXG4gICAgY29uc3QgbmV3QXR0ZW1wdE9ic2VydmF0aW9uID0gKHthdHRlbXB0S2luZCwgYXR0ZW1wdE51bWJlcn0pID0+ICh7XG4gICAgICBhY2tub3dsZWRnZW1lbnRXYWl0RWxhcHNlZE1zOiAwLFxuICAgICAgYXR0ZW1wdEVsYXBzZWRNczogMCxcbiAgICAgIGF0dGVtcHRLaW5kLFxuICAgICAgYXR0ZW1wdE51bWJlcixcbiAgICAgIGV4cGxpY2l0bHlSZWplY3RlZDogZmFsc2UsXG4gICAgICBnZW5lcmF0aW9uRmVuY2VkOiBmYWxzZSxcbiAgICAgIHJlcXVlc3RTZW50OiBmYWxzZVxuICAgIH0pXG4gICAgLyoqXG4gICAgICogU2VuZHMgb25lIGVucXVldWUgYXR0ZW1wdC4gQW4gb3duZWQgY2FsbGVyIG1heSByZXBsYXkgdGhpcyBleGFjdCBtZXNzYWdlXG4gICAgICogb25jZSB3aGVuIHRyYW5zcG9ydCBhY2tub3dsZWRnZW1lbnQgcmVtYWlucyBhbWJpZ3VvdXMgYWZ0ZXIgc2VuZC5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZW5xdWV1ZS1hY2tub3dsZWRnZW1lbnQtdGltZW91dC1lcnJvci5qc1wiKS5CYWNrZ3JvdW5kSm9iRW5xdWV1ZUF0dGVtcHR9IGF0dGVtcHRPYnNlcnZhdGlvbiAtIE11dGFibGUgYXR0ZW1wdCBvYnNlcnZhdGlvbnMuXG4gICAgICogQHBhcmFtIHtSZWFkb25seTxBcnJheTxpbXBvcnQoXCIuL2VucXVldWUtYWNrbm93bGVkZ2VtZW50LXRpbWVvdXQtZXJyb3IuanNcIikuQmFja2dyb3VuZEpvYkVucXVldWVBdHRlbXB0Pj59IHByZXZpb3VzQXR0ZW1wdHMgLSBFYXJsaWVyIHRpbWVkLW91dCBhdHRlbXB0cy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEpvYiBpZC5cbiAgICAgKi9cbiAgICBjb25zdCBlbnF1ZXVlQXR0ZW1wdCA9IGFzeW5jIChhdHRlbXB0T2JzZXJ2YXRpb24sIHByZXZpb3VzQXR0ZW1wdHMpID0+IHtcbiAgICAgIGNvbnN0IGF0dGVtcHRTdGFydGVkQXRNcyA9IERhdGUubm93KClcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCB0aGlzLl9yZXF1ZXN0KClcbiAgICAgIGNvbnN0IHJlcXVlc3RBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAgIGNvbnN0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBgQmFja2dyb3VuZCBqb2IgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgdGltZWQgb3V0IGFmdGVyICR7dGhpcy5lbnF1ZXVlVGltZW91dE1zfW1zYFxuICAgICAgLyoqIEB0eXBlIHtudW1iZXIgfCB1bmRlZmluZWR9ICovXG4gICAgICBsZXQgcmVxdWVzdFNlbnRBdE1zXG4gICAgICAvKipcbiAgICAgICAqIFJlc29sdmVzIHRoZSBwcmUtc2VuZCBwaGFzZSB3aGVuIHRoZSBtdXRhdGlvbiBoYXMgZW50ZXJlZCB0aGUgc29ja2V0LlxuICAgICAgICogQHR5cGUgeygpID0+IHZvaWR9XG4gICAgICAgKi9cbiAgICAgIGxldCBtYXJrUmVxdWVzdFNlbnQgPSAoKSA9PiB7fVxuICAgICAgY29uc3QgcmVxdWVzdFNlbnQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBtYXJrUmVxdWVzdFNlbnQgPSAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH0pXG4gICAgICAvKipcbiAgICAgICAqIEFwcGxpZXMgdGhlIGNvbmZpZ3VyZWQgZGVhZGxpbmUgaW5kZXBlbmRlbnRseSB0byBvbmUgcmVxdWVzdCBwaGFzZS5cbiAgICAgICAqIEB0ZW1wbGF0ZSBUXG4gICAgICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gUGhhc2Ugd29yay5cbiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFBoYXNlIHJlc3VsdC5cbiAgICAgICAqL1xuICAgICAgY29uc3Qgd2l0aEVucXVldWVUaW1lb3V0ID0gYXN5bmMgKGNhbGxiYWNrKSA9PiBhd2FpdCB0aW1lb3V0KHtcbiAgICAgICAgZXJyb3JNZXNzYWdlOiB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmVucXVldWVUaW1lb3V0TXNcbiAgICAgIH0sIGFzeW5jICh7Y29udHJvbH0pID0+IHtcbiAgICAgICAgY29uc3QgYWJvcnRSZXF1ZXN0ID0gKCkgPT4gcmVxdWVzdEFib3J0Q29udHJvbGxlci5hYm9ydChjb250cm9sLnNpZ25hbC5yZWFzb24pXG5cbiAgICAgICAgY29udHJvbC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0UmVxdWVzdClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGNvbnRyb2wuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydFJlcXVlc3QpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBjb25zdCByZXF1ZXN0UHJvbWlzZSA9IHJlcXVlc3QucnVuKHtcbiAgICAgICAgc2lnbmFsOiByZXF1ZXN0QWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgb25Db25uZWN0OiAoanNvblNvY2tldCkgPT4ge1xuICAgICAgICAgIGpzb25Tb2NrZXQuc2VuZChtZXNzYWdlKVxuICAgICAgICAgIGF0dGVtcHRPYnNlcnZhdGlvbi5nZW5lcmF0aW9uRmVuY2VkID0gQm9vbGVhbihyZXF1ZXN0LmdlbmVyYXRpb25JZClcbiAgICAgICAgICBhdHRlbXB0T2JzZXJ2YXRpb24ucmVxdWVzdFNlbnQgPSB0cnVlXG4gICAgICAgICAgcmVxdWVzdFNlbnRBdE1zID0gRGF0ZS5ub3coKVxuICAgICAgICAgIG1hcmtSZXF1ZXN0U2VudCgpXG4gICAgICAgIH0sXG4gICAgICAgIG9uTWVzc2FnZTogKHttZXNzYWdlLCByZXNvbHZlLCByZWplY3R9KSA9PiB7XG4gICAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZW5xdWV1ZWRcIikge1xuICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlLmpvYklkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZW5xdWV1ZS1lcnJvclwiKSB7XG4gICAgICAgICAgICBhdHRlbXB0T2JzZXJ2YXRpb24uZXhwbGljaXRseVJlamVjdGVkID0gdHJ1ZVxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlLmVycm9yIHx8IFwiRmFpbGVkIHRvIGVucXVldWUgam9iXCIpKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgd2l0aEVucXVldWVUaW1lb3V0KGFzeW5jICgpID0+IGF3YWl0IFByb21pc2UucmFjZShbcmVxdWVzdFNlbnQsIHJlcXVlc3RQcm9taXNlXSkpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoRW5xdWV1ZVRpbWVvdXQoYXN5bmMgKCkgPT4gYXdhaXQgcmVxdWVzdFByb21pc2UpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikpIHRocm93IGVycm9yXG4gICAgICAgIGlmIChyZXF1ZXN0U2VudEF0TXMgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwiQmFja2dyb3VuZCBqb2IgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgd2FpdCBzdGFydGVkIGJlZm9yZSB0aGUgcmVxdWVzdCB3YXMgc2VudFwiLCB7Y2F1c2U6IGVycm9yfSlcblxuICAgICAgICBjb25zdCB0aW1lZE91dEF0TXMgPSBEYXRlLm5vdygpXG4gICAgICAgIC8vIFRoZSBmaXJlZCB0aW1lciBwcm92ZXMgaXRzIGxvZ2ljYWwgZGVhZGxpbmUgZXZlbiB3aGVuIHRoZSBhZGp1c3RhYmxlIHdhbGwgY2xvY2sgcmVwb3J0cyBhIHNob3J0ZXIgaW50ZXJ2YWwuXG4gICAgICAgIGNvbnN0IGFja25vd2xlZGdlbWVudFdhaXRFbGFwc2VkTXMgPSBNYXRoLm1heCh0aGlzLmVucXVldWVUaW1lb3V0TXMsIHRpbWVkT3V0QXRNcyAtIHJlcXVlc3RTZW50QXRNcylcblxuICAgICAgICBhdHRlbXB0T2JzZXJ2YXRpb24uYWNrbm93bGVkZ2VtZW50V2FpdEVsYXBzZWRNcyA9IGFja25vd2xlZGdlbWVudFdhaXRFbGFwc2VkTXNcbiAgICAgICAgYXR0ZW1wdE9ic2VydmF0aW9uLmF0dGVtcHRFbGFwc2VkTXMgPSBNYXRoLm1heChhY2tub3dsZWRnZW1lbnRXYWl0RWxhcHNlZE1zLCB0aW1lZE91dEF0TXMgLSBhdHRlbXB0U3RhcnRlZEF0TXMpXG5cbiAgICAgICAgdGhyb3cgbmV3IEJhY2tncm91bmRKb2JFbnF1ZXVlQWNrbm93bGVkZ2VtZW50VGltZW91dEVycm9yKHtcbiAgICAgICAgICBhY2tub3dsZWRnZW1lbnRUaW1lb3V0TXM6IHRoaXMuZW5xdWV1ZVRpbWVvdXRNcyxcbiAgICAgICAgICBhdHRlbXB0SGlzdG9yeTogWy4uLnByZXZpb3VzQXR0ZW1wdHMsIGF0dGVtcHRPYnNlcnZhdGlvbl0sXG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIGdlbmVyYXRpb25JZDogcmVxdWVzdC5nZW5lcmF0aW9uSWQsXG4gICAgICAgICAgam9iTmFtZSxcbiAgICAgICAgICBwcm9kdWNlckludm9jYXRpb25JZCxcbiAgICAgICAgICBwcm9kdWNlclByb29mUHJlc2VudDogQm9vbGVhbihwcm9kdWNlclByb29mKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxBdHRlbXB0ID0gbmV3QXR0ZW1wdE9ic2VydmF0aW9uKHthdHRlbXB0S2luZDogXCJpbml0aWFsXCIsIGF0dGVtcHROdW1iZXI6IDF9KVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlQXR0ZW1wdChpbml0aWFsQXR0ZW1wdCwgW10pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghcHJvZHVjZXJJbnZvY2F0aW9uSWQgfHwgIXByb2R1Y2VyUHJvb2YgfHwgIWluaXRpYWxBdHRlbXB0LmdlbmVyYXRpb25GZW5jZWQgfHwgIWluaXRpYWxBdHRlbXB0LnJlcXVlc3RTZW50IHx8IGluaXRpYWxBdHRlbXB0LmV4cGxpY2l0bHlSZWplY3RlZCkgdGhyb3cgZXJyb3JcblxuICAgICAgY29uc3QgcHJldmlvdXNBdHRlbXB0cyA9IGVycm9yIGluc3RhbmNlb2YgQmFja2dyb3VuZEpvYkVucXVldWVBY2tub3dsZWRnZW1lbnRUaW1lb3V0RXJyb3IgPyBlcnJvci5hdHRlbXB0SGlzdG9yeSA6IFtdXG4gICAgICBjb25zdCByZXBsYXlBdHRlbXB0ID0gbmV3QXR0ZW1wdE9ic2VydmF0aW9uKHthdHRlbXB0S2luZDogXCJvd25lZF9yZXBsYXlcIiwgYXR0ZW1wdE51bWJlcjogMn0pXG5cbiAgICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlQXR0ZW1wdChyZXBsYXlBdHRlbXB0LCBwcmV2aW91c0F0dGVtcHRzKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IHJlcGxhY2VzIHRoZSBxdWV1ZWQgb3duZXIgb2YgYSBzdGFibGUgc2NoZWR1bGUga2V5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNjaGVkdWxlS2V5IC0gU3RhYmxlIGxvZ2ljYWwgc2NoZWR1bGUga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JOYW1lIC0gSm9iIG5hbWUuXG4gICAqIEBwYXJhbSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLmFyZ3MgLSBKb2IgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfSBbYXJncy5vcHRpb25zXSAtIEpvYiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JSZXBsYWNlbWVudFJlc3VsdD59IC0gUmVwbGFjZW1lbnQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgcmVwbGFjZVNjaGVkdWxlZCh7c2NoZWR1bGVLZXksIGpvYk5hbWUsIGFyZ3MsIG9wdGlvbnN9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucnVuKHtcbiAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAganNvblNvY2tldC5zZW5kKHt0eXBlOiBcInJlcGxhY2Utc2NoZWR1bGVkXCIsIHNjaGVkdWxlS2V5LCBqb2JOYW1lLCBhcmdzLCBvcHRpb25zfSlcbiAgICAgIH0sXG4gICAgICBvbk1lc3NhZ2U6ICh7bWVzc2FnZSwgcmVzb2x2ZSwgcmVqZWN0fSkgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJzY2hlZHVsZS1yZXBsYWNlZFwiKSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBqb2JJZDogbWVzc2FnZS5qb2JJZCxcbiAgICAgICAgICAgIHByZXZpb3VzSm9iSWQ6IG1lc3NhZ2UucHJldmlvdXNKb2JJZCxcbiAgICAgICAgICAgIHByZXZpb3VzU3RhdHVzOiBtZXNzYWdlLnByZXZpb3VzU3RhdHVzXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlPy50eXBlID09PSBcInJlcGxhY2Utc2NoZWR1bGVkLWVycm9yXCIpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UuZXJyb3IgfHwgXCJGYWlsZWQgdG8gcmVwbGFjZSBzY2hlZHVsZWQgam9iXCIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIG9yIGRldGFjaGVzIHRoZSBjdXJyZW50IG93bmVyIG9mIGEgc3RhYmxlIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iQ2FuY2VsbGF0aW9uUmVzdWx0Pn0gLSBDYW5jZWxsYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2FuY2VsU2NoZWR1bGVkKHtzY2hlZHVsZUtleX0pIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgdGhpcy5fcmVxdWVzdCgpXG5cbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdC5ydW4oe1xuICAgICAgb25Db25uZWN0OiAoanNvblNvY2tldCkgPT4ge1xuICAgICAgICBqc29uU29ja2V0LnNlbmQoe3R5cGU6IFwiY2FuY2VsLXNjaGVkdWxlZFwiLCBzY2hlZHVsZUtleX0pXG4gICAgICB9LFxuICAgICAgb25NZXNzYWdlOiAoe21lc3NhZ2UsIHJlc29sdmUsIHJlamVjdH0pID0+IHtcbiAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwic2NoZWR1bGUtY2FuY2VsbGVkXCIpIHtcbiAgICAgICAgICByZXNvbHZlKHtqb2JJZDogbWVzc2FnZS5qb2JJZCwgb3V0Y29tZTogbWVzc2FnZS5vdXRjb21lfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlPy50eXBlID09PSBcImNhbmNlbC1zY2hlZHVsZWQtZXJyb3JcIikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvciB8fCBcIkZhaWxlZCB0byBjYW5jZWwgc2NoZWR1bGVkIGpvYlwiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgY3VycmVudCBzdGFibGUgb3duZXJzaGlwIGFuZCBvcHRpb25hbCB0ZXJtaW5hbCBoaXN0b3J5LlxuICAgKiBAcGFyYW0ge3tzY2hlZHVsZUtleTogc3RyaW5nLCBpbmNsdWRlTGF0ZXN0VGVybWluYWw/OiBib29sZWFufX0gYXJncyAtIExvb2t1cCByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JTY2hlZHVsZWRMb29rdXBSZXN1bHQ+fSAtIE5vcm1hbGl6ZWQgc3RhYmxlIHNjaGVkdWxlIGpvYnMuXG4gICAqL1xuICBhc3luYyBnZXRTY2hlZHVsZWRKb2Ioe3NjaGVkdWxlS2V5LCBpbmNsdWRlTGF0ZXN0VGVybWluYWx9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucnVuKHtcbiAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAganNvblNvY2tldC5zZW5kKHt0eXBlOiBcImdldC1zY2hlZHVsZWQtam9iXCIsIHNjaGVkdWxlS2V5LCBpbmNsdWRlTGF0ZXN0VGVybWluYWx9KVxuICAgICAgfSxcbiAgICAgIG9uTWVzc2FnZTogKHttZXNzYWdlLCByZXNvbHZlLCByZWplY3R9KSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlPy50eXBlID09PSBcInNjaGVkdWxlZC1qb2JcIikge1xuICAgICAgICAgIGNvbnN0IHtjdXJyZW50Sm9iLCBsYXRlc3RUZXJtaW5hbEpvYn0gPSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgY3VycmVudEpvYlZhbGlkID0gY3VycmVudEpvYiA9PT0gbnVsbFxuICAgICAgICAgICAgfHwgKGlzTm9ybWFsaXplZEJhY2tncm91bmRKb2IoY3VycmVudEpvYikgJiYgQkFDS0dST1VORF9KT0JfQUNUSVZFX1NUQVRVU0VTLnNvbWUoKHN0YXR1cykgPT4gc3RhdHVzID09PSBjdXJyZW50Sm9iLnN0YXR1cykpXG4gICAgICAgICAgY29uc3QgbGF0ZXN0VGVybWluYWxKb2JWYWxpZCA9IGxhdGVzdFRlcm1pbmFsSm9iID09PSBudWxsXG4gICAgICAgICAgICB8fCAoaXNOb3JtYWxpemVkQmFja2dyb3VuZEpvYihsYXRlc3RUZXJtaW5hbEpvYikgJiYgQkFDS0dST1VORF9KT0JfVEVSTUlOQUxfU1RBVFVTRVMuc29tZSgoc3RhdHVzKSA9PiBzdGF0dXMgPT09IGxhdGVzdFRlcm1pbmFsSm9iLnN0YXR1cykpXG5cbiAgICAgICAgICBpZiAoIWN1cnJlbnRKb2JWYWxpZCB8fCAhbGF0ZXN0VGVybWluYWxKb2JWYWxpZCkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgZ2V0U2NoZWR1bGVkSm9iIHJlc3BvbnNlOiBleHBlY3RlZCBub3JtYWxpemVkIHB1YmxpYyBqb2IgdmFsdWVzXCIpKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSh7Y3VycmVudEpvYiwgbGF0ZXN0VGVybWluYWxKb2J9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZ2V0LXNjaGVkdWxlZC1qb2ItZXJyb3JcIikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvciB8fCBcIkZhaWxlZCB0byByZWFkIHNjaGVkdWxlZCBqb2JcIikpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICByZWplY3QodW5leHBlY3RlZFJlc3BvbnNlRXJyb3IoXCJnZXRTY2hlZHVsZWRKb2JcIiwgbWVzc2FnZSkpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBlZGl0ZXMgYSBmdXR1cmUgcXVldWVkIHN0YWJsZSBvd25lciB3aXRob3V0IGNoYW5naW5nIGpvYiBpZGVudGl0eS5cbiAgICogQHBhcmFtIHt7c2NoZWR1bGVLZXk6IHN0cmluZ319IGFyZ3MgLSBXYWtlIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYldha2VSZXN1bHQ+fSAtIFdha2UgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2FrZVNjaGVkdWxlZCh7c2NoZWR1bGVLZXl9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucnVuKHtcbiAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAganNvblNvY2tldC5zZW5kKHt0eXBlOiBcIndha2Utc2NoZWR1bGVkXCIsIHNjaGVkdWxlS2V5fSlcbiAgICAgIH0sXG4gICAgICBvbk1lc3NhZ2U6ICh7bWVzc2FnZSwgcmVzb2x2ZSwgcmVqZWN0fSkgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJzY2hlZHVsZS13b2tlblwiKSB7XG4gICAgICAgICAgY29uc3Qgb3V0Y29tZSA9IG1lc3NhZ2Uub3V0Y29tZVxuICAgICAgICAgIGNvbnN0IGtub3duT3V0Y29tZSA9IEJBQ0tHUk9VTkRfSk9CX1dBS0VfT1VUQ09NRVMuaW5jbHVkZXMob3V0Y29tZSlcbiAgICAgICAgICBjb25zdCB2YWxpZEpvYklkID0gb3V0Y29tZSA9PT0gXCJub3RfZm91bmRcIiA/IG1lc3NhZ2Uuam9iSWQgPT09IG51bGwgOiB0eXBlb2YgbWVzc2FnZS5qb2JJZCA9PT0gXCJzdHJpbmdcIiAmJiBtZXNzYWdlLmpvYklkLmxlbmd0aCA+IDBcblxuICAgICAgICAgIGlmICgha25vd25PdXRjb21lIHx8ICF2YWxpZEpvYklkKSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCB3YWtlU2NoZWR1bGVkIHJlc3BvbnNlXCIpKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSh7am9iSWQ6IG1lc3NhZ2Uuam9iSWQsIG91dGNvbWV9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwid2FrZS1zY2hlZHVsZWQtZXJyb3JcIikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvciB8fCBcIkZhaWxlZCB0byB3YWtlIHNjaGVkdWxlZCBqb2JcIikpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICByZWplY3QodW5leHBlY3RlZFJlc3BvbnNlRXJyb3IoXCJ3YWtlU2NoZWR1bGVkXCIsIG1lc3NhZ2UpKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { TimeoutError } from "awaitery/build/timeout.js";
|
|
2
|
+
export type BackgroundJobEnqueueAttempt = {
|
|
3
|
+
/**
|
|
4
|
+
* - Time spent waiting for the acknowledgement after send.
|
|
5
|
+
*/
|
|
6
|
+
acknowledgementWaitElapsedMs: number;
|
|
7
|
+
/**
|
|
8
|
+
* - Total attempt time including connection and generation fencing.
|
|
9
|
+
*/
|
|
10
|
+
attemptElapsedMs: number;
|
|
11
|
+
/**
|
|
12
|
+
* - Initial attempt or the one eligible owned replay.
|
|
13
|
+
*/
|
|
14
|
+
attemptKind: "initial" | "owned_replay";
|
|
15
|
+
/**
|
|
16
|
+
* - One-based attempt number.
|
|
17
|
+
*/
|
|
18
|
+
attemptNumber: number;
|
|
19
|
+
/**
|
|
20
|
+
* - Whether the main explicitly rejected the enqueue.
|
|
21
|
+
*/
|
|
22
|
+
explicitlyRejected: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* - Whether the configured generation accepted the connection before send.
|
|
25
|
+
*/
|
|
26
|
+
generationFenced: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* - Whether the enqueue request entered the socket.
|
|
29
|
+
*/
|
|
30
|
+
requestSent: boolean;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* @typedef {object} BackgroundJobEnqueueAttempt
|
|
34
|
+
* @property {number} acknowledgementWaitElapsedMs - Time spent waiting for the acknowledgement after send.
|
|
35
|
+
* @property {number} attemptElapsedMs - Total attempt time including connection and generation fencing.
|
|
36
|
+
* @property {"initial" | "owned_replay"} attemptKind - Initial attempt or the one eligible owned replay.
|
|
37
|
+
* @property {number} attemptNumber - One-based attempt number.
|
|
38
|
+
* @property {boolean} explicitlyRejected - Whether the main explicitly rejected the enqueue.
|
|
39
|
+
* @property {boolean} generationFenced - Whether the configured generation accepted the connection before send.
|
|
40
|
+
* @property {boolean} requestSent - Whether the enqueue request entered the socket.
|
|
41
|
+
*/
|
|
42
|
+
/** Safe typed failure for an ambiguous post-send enqueue acknowledgement timeout. */
|
|
43
|
+
export default class BackgroundJobEnqueueAcknowledgementTimeoutError extends TimeoutError {
|
|
44
|
+
/** @type {"BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT"} */
|
|
45
|
+
code: "BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT";
|
|
46
|
+
acknowledgementTimeoutMs: number;
|
|
47
|
+
attemptHistory: readonly Readonly<{
|
|
48
|
+
acknowledgementWaitElapsedMs: number;
|
|
49
|
+
attemptElapsedMs: number;
|
|
50
|
+
attemptKind: "initial" | "owned_replay";
|
|
51
|
+
attemptNumber: number;
|
|
52
|
+
explicitlyRejected: boolean;
|
|
53
|
+
generationFenced: boolean;
|
|
54
|
+
requestSent: boolean;
|
|
55
|
+
}>[];
|
|
56
|
+
generationId: string | undefined;
|
|
57
|
+
jobName: string;
|
|
58
|
+
producerInvocationId: string | undefined;
|
|
59
|
+
producerProofPresent: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Builds an enqueue acknowledgement timeout error without request payload or connection details.
|
|
62
|
+
* @param {object} args - Safe timeout context.
|
|
63
|
+
* @param {number} args.acknowledgementTimeoutMs - Configured post-send acknowledgement deadline.
|
|
64
|
+
* @param {Array<BackgroundJobEnqueueAttempt>} args.attemptHistory - Safe observations for timed-out attempts.
|
|
65
|
+
* @param {TimeoutError} [args.cause] - Original Awaitery timeout.
|
|
66
|
+
* @param {string} [args.generationId] - Accepted release generation identity.
|
|
67
|
+
* @param {string} args.jobName - Resolved job class name.
|
|
68
|
+
* @param {string} [args.producerInvocationId] - Owned enqueue invocation identity.
|
|
69
|
+
* @param {boolean} args.producerProofPresent - Whether the request carried an internal producer proof.
|
|
70
|
+
*/
|
|
71
|
+
constructor({ acknowledgementTimeoutMs, attemptHistory, cause, generationId, jobName, producerInvocationId, producerProofPresent }: {
|
|
72
|
+
acknowledgementTimeoutMs: number;
|
|
73
|
+
attemptHistory: Array<BackgroundJobEnqueueAttempt>;
|
|
74
|
+
cause?: TimeoutError;
|
|
75
|
+
generationId?: string;
|
|
76
|
+
jobName: string;
|
|
77
|
+
producerInvocationId?: string;
|
|
78
|
+
producerProofPresent: boolean;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=enqueue-acknowledgement-timeout-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enqueue-acknowledgement-timeout-error.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/enqueue-acknowledgement-timeout-error.js"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAA;AAGnD,YAAkB,2BAA2B,GAC7C;;;;IAAmB,4BAA4B,EAApC,MAAM,CACjB;;;;IAAmB,gBAAgB,EAAxB,MAAM,CACjB;;;;IAAuC,WAAW,EAAvC,SAAS,GAAG,cAAc,CACrC;;;;IAAmB,aAAa,EAArB,MAAM,CACjB;;;;IAAoB,kBAAkB,EAA3B,OAAO,CAClB;;;;IAAoB,gBAAgB,EAAzB,OAAO,CAClB;;;;IAAoB,WAAW,EAApB,OAAO,CACpB;CAAA,CAAA;AATD;;;;;;;;;GASG;AAEH,qFAAqF;AACrF,MAAM,CAAC,OAAO,OAAO,+CAAgD,SAAQ,YAAY;IAgBrF,+DAA+D;IAC1D,IAAI,EADE,gDAAgD;IAEtD,wBAAwB;IACxB,cAAc;;;;;;;;;IASd,YAAY;IACZ,OAAO;IACP,oBAAoB;IACpB,oBAAoB;IA9B3B;;;;;;;;;;OAUG;IACH,YAAY,EAAC,wBAAwB,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAC,EAR7H;QAAqB,wBAAwB,EAArC,MAAM,CACd;QAAiD,cAAc,EAAvD,KAAK,CAAC,2BAA2B,CAAC,CAC1C;QAA4B,KAAK,AAAjC,CACA,EADQ,YAAY,CACpB;QAAsB,YAAY,AAAlC,CACA,EADQ,MAAM,CACd;QAAqB,OAAO,EAApB,MAAM,CACd;QAAsB,oBAAoB,AAA1C,CACA,EADQ,MAAM,CACd;QAAsB,oBAAoB,EAAlC,OAAO,CACjB;KAC+H,EAoB/H;CACF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { TimeoutError } from "awaitery/build/timeout.js";
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {object} BackgroundJobEnqueueAttempt
|
|
5
|
+
* @property {number} acknowledgementWaitElapsedMs - Time spent waiting for the acknowledgement after send.
|
|
6
|
+
* @property {number} attemptElapsedMs - Total attempt time including connection and generation fencing.
|
|
7
|
+
* @property {"initial" | "owned_replay"} attemptKind - Initial attempt or the one eligible owned replay.
|
|
8
|
+
* @property {number} attemptNumber - One-based attempt number.
|
|
9
|
+
* @property {boolean} explicitlyRejected - Whether the main explicitly rejected the enqueue.
|
|
10
|
+
* @property {boolean} generationFenced - Whether the configured generation accepted the connection before send.
|
|
11
|
+
* @property {boolean} requestSent - Whether the enqueue request entered the socket.
|
|
12
|
+
*/
|
|
13
|
+
/** Safe typed failure for an ambiguous post-send enqueue acknowledgement timeout. */
|
|
14
|
+
export default class BackgroundJobEnqueueAcknowledgementTimeoutError extends TimeoutError {
|
|
15
|
+
/**
|
|
16
|
+
* Builds an enqueue acknowledgement timeout error without request payload or connection details.
|
|
17
|
+
* @param {object} args - Safe timeout context.
|
|
18
|
+
* @param {number} args.acknowledgementTimeoutMs - Configured post-send acknowledgement deadline.
|
|
19
|
+
* @param {Array<BackgroundJobEnqueueAttempt>} args.attemptHistory - Safe observations for timed-out attempts.
|
|
20
|
+
* @param {TimeoutError} [args.cause] - Original Awaitery timeout.
|
|
21
|
+
* @param {string} [args.generationId] - Accepted release generation identity.
|
|
22
|
+
* @param {string} args.jobName - Resolved job class name.
|
|
23
|
+
* @param {string} [args.producerInvocationId] - Owned enqueue invocation identity.
|
|
24
|
+
* @param {boolean} args.producerProofPresent - Whether the request carried an internal producer proof.
|
|
25
|
+
*/
|
|
26
|
+
constructor({ acknowledgementTimeoutMs, attemptHistory, cause, generationId, jobName, producerInvocationId, producerProofPresent }) {
|
|
27
|
+
super(`Background job enqueue acknowledgement timed out after ${acknowledgementTimeoutMs}ms`, cause ? { cause } : undefined);
|
|
28
|
+
this.name = "BackgroundJobEnqueueAcknowledgementTimeoutError";
|
|
29
|
+
/** @type {"BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT"} */
|
|
30
|
+
this.code = "BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT";
|
|
31
|
+
this.acknowledgementTimeoutMs = acknowledgementTimeoutMs;
|
|
32
|
+
this.attemptHistory = Object.freeze(attemptHistory.map((attempt) => Object.freeze({
|
|
33
|
+
acknowledgementWaitElapsedMs: attempt.acknowledgementWaitElapsedMs,
|
|
34
|
+
attemptElapsedMs: attempt.attemptElapsedMs,
|
|
35
|
+
attemptKind: attempt.attemptKind,
|
|
36
|
+
attemptNumber: attempt.attemptNumber,
|
|
37
|
+
explicitlyRejected: attempt.explicitlyRejected,
|
|
38
|
+
generationFenced: attempt.generationFenced,
|
|
39
|
+
requestSent: attempt.requestSent
|
|
40
|
+
})));
|
|
41
|
+
this.generationId = generationId;
|
|
42
|
+
this.jobName = jobName;
|
|
43
|
+
this.producerInvocationId = producerInvocationId;
|
|
44
|
+
this.producerProofPresent = producerProofPresent;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5xdWV1ZS1hY2tub3dsZWRnZW1lbnQtdGltZW91dC1lcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZ3JvdW5kLWpvYnMvZW5xdWV1ZS1hY2tub3dsZWRnZW1lbnQtdGltZW91dC1lcnJvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJCQUEyQixDQUFBO0FBRXREOzs7Ozs7Ozs7R0FTRztBQUVILHFGQUFxRjtBQUNyRixNQUFNLENBQUMsT0FBTyxPQUFPLCtDQUFnRCxTQUFRLFlBQVk7SUFDdkY7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQVksRUFBQyx3QkFBd0IsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUM7UUFDOUgsS0FBSyxDQUFDLDBEQUEwRCx3QkFBd0IsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFMUgsSUFBSSxDQUFDLElBQUksR0FBRyxpREFBaUQsQ0FBQTtRQUM3RCwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLElBQUksR0FBRyxnREFBZ0QsQ0FBQTtRQUM1RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUE7UUFDeEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDaEYsNEJBQTRCLEVBQUUsT0FBTyxDQUFDLDRCQUE0QjtZQUNsRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztZQUNoQyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDcEMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUM5QyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ0osSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUE7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFBO1FBQ2hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQTtJQUNsRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtUaW1lb3V0RXJyb3J9IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iRW5xdWV1ZUF0dGVtcHRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhY2tub3dsZWRnZW1lbnRXYWl0RWxhcHNlZE1zIC0gVGltZSBzcGVudCB3YWl0aW5nIGZvciB0aGUgYWNrbm93bGVkZ2VtZW50IGFmdGVyIHNlbmQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYXR0ZW1wdEVsYXBzZWRNcyAtIFRvdGFsIGF0dGVtcHQgdGltZSBpbmNsdWRpbmcgY29ubmVjdGlvbiBhbmQgZ2VuZXJhdGlvbiBmZW5jaW5nLlxuICogQHByb3BlcnR5IHtcImluaXRpYWxcIiB8IFwib3duZWRfcmVwbGF5XCJ9IGF0dGVtcHRLaW5kIC0gSW5pdGlhbCBhdHRlbXB0IG9yIHRoZSBvbmUgZWxpZ2libGUgb3duZWQgcmVwbGF5LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGF0dGVtcHROdW1iZXIgLSBPbmUtYmFzZWQgYXR0ZW1wdCBudW1iZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGV4cGxpY2l0bHlSZWplY3RlZCAtIFdoZXRoZXIgdGhlIG1haW4gZXhwbGljaXRseSByZWplY3RlZCB0aGUgZW5xdWV1ZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ2VuZXJhdGlvbkZlbmNlZCAtIFdoZXRoZXIgdGhlIGNvbmZpZ3VyZWQgZ2VuZXJhdGlvbiBhY2NlcHRlZCB0aGUgY29ubmVjdGlvbiBiZWZvcmUgc2VuZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVxdWVzdFNlbnQgLSBXaGV0aGVyIHRoZSBlbnF1ZXVlIHJlcXVlc3QgZW50ZXJlZCB0aGUgc29ja2V0LlxuICovXG5cbi8qKiBTYWZlIHR5cGVkIGZhaWx1cmUgZm9yIGFuIGFtYmlndW91cyBwb3N0LXNlbmQgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgdGltZW91dC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhY2tncm91bmRKb2JFbnF1ZXVlQWNrbm93bGVkZ2VtZW50VGltZW91dEVycm9yIGV4dGVuZHMgVGltZW91dEVycm9yIHtcbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBlbnF1ZXVlIGFja25vd2xlZGdlbWVudCB0aW1lb3V0IGVycm9yIHdpdGhvdXQgcmVxdWVzdCBwYXlsb2FkIG9yIGNvbm5lY3Rpb24gZGV0YWlscy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTYWZlIHRpbWVvdXQgY29udGV4dC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYWNrbm93bGVkZ2VtZW50VGltZW91dE1zIC0gQ29uZmlndXJlZCBwb3N0LXNlbmQgYWNrbm93bGVkZ2VtZW50IGRlYWRsaW5lLlxuICAgKiBAcGFyYW0ge0FycmF5PEJhY2tncm91bmRKb2JFbnF1ZXVlQXR0ZW1wdD59IGFyZ3MuYXR0ZW1wdEhpc3RvcnkgLSBTYWZlIG9ic2VydmF0aW9ucyBmb3IgdGltZWQtb3V0IGF0dGVtcHRzLlxuICAgKiBAcGFyYW0ge1RpbWVvdXRFcnJvcn0gW2FyZ3MuY2F1c2VdIC0gT3JpZ2luYWwgQXdhaXRlcnkgdGltZW91dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdlbmVyYXRpb25JZF0gLSBBY2NlcHRlZCByZWxlYXNlIGdlbmVyYXRpb24gaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYk5hbWUgLSBSZXNvbHZlZCBqb2IgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnByb2R1Y2VySW52b2NhdGlvbklkXSAtIE93bmVkIGVucXVldWUgaW52b2NhdGlvbiBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBhcmdzLnByb2R1Y2VyUHJvb2ZQcmVzZW50IC0gV2hldGhlciB0aGUgcmVxdWVzdCBjYXJyaWVkIGFuIGludGVybmFsIHByb2R1Y2VyIHByb29mLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2Fja25vd2xlZGdlbWVudFRpbWVvdXRNcywgYXR0ZW1wdEhpc3RvcnksIGNhdXNlLCBnZW5lcmF0aW9uSWQsIGpvYk5hbWUsIHByb2R1Y2VySW52b2NhdGlvbklkLCBwcm9kdWNlclByb29mUHJlc2VudH0pIHtcbiAgICBzdXBlcihgQmFja2dyb3VuZCBqb2IgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgdGltZWQgb3V0IGFmdGVyICR7YWNrbm93bGVkZ2VtZW50VGltZW91dE1zfW1zYCwgY2F1c2UgPyB7Y2F1c2V9IDogdW5kZWZpbmVkKVxuXG4gICAgdGhpcy5uYW1lID0gXCJCYWNrZ3JvdW5kSm9iRW5xdWV1ZUFja25vd2xlZGdlbWVudFRpbWVvdXRFcnJvclwiXG4gICAgLyoqIEB0eXBlIHtcIkJBQ0tHUk9VTkRfSk9CX0VOUVVFVUVfQUNLTk9XTEVER0VNRU5UX1RJTUVPVVRcIn0gKi9cbiAgICB0aGlzLmNvZGUgPSBcIkJBQ0tHUk9VTkRfSk9CX0VOUVVFVUVfQUNLTk9XTEVER0VNRU5UX1RJTUVPVVRcIlxuICAgIHRoaXMuYWNrbm93bGVkZ2VtZW50VGltZW91dE1zID0gYWNrbm93bGVkZ2VtZW50VGltZW91dE1zXG4gICAgdGhpcy5hdHRlbXB0SGlzdG9yeSA9IE9iamVjdC5mcmVlemUoYXR0ZW1wdEhpc3RvcnkubWFwKChhdHRlbXB0KSA9PiBPYmplY3QuZnJlZXplKHtcbiAgICAgIGFja25vd2xlZGdlbWVudFdhaXRFbGFwc2VkTXM6IGF0dGVtcHQuYWNrbm93bGVkZ2VtZW50V2FpdEVsYXBzZWRNcyxcbiAgICAgIGF0dGVtcHRFbGFwc2VkTXM6IGF0dGVtcHQuYXR0ZW1wdEVsYXBzZWRNcyxcbiAgICAgIGF0dGVtcHRLaW5kOiBhdHRlbXB0LmF0dGVtcHRLaW5kLFxuICAgICAgYXR0ZW1wdE51bWJlcjogYXR0ZW1wdC5hdHRlbXB0TnVtYmVyLFxuICAgICAgZXhwbGljaXRseVJlamVjdGVkOiBhdHRlbXB0LmV4cGxpY2l0bHlSZWplY3RlZCxcbiAgICAgIGdlbmVyYXRpb25GZW5jZWQ6IGF0dGVtcHQuZ2VuZXJhdGlvbkZlbmNlZCxcbiAgICAgIHJlcXVlc3RTZW50OiBhdHRlbXB0LnJlcXVlc3RTZW50XG4gICAgfSkpKVxuICAgIHRoaXMuZ2VuZXJhdGlvbklkID0gZ2VuZXJhdGlvbklkXG4gICAgdGhpcy5qb2JOYW1lID0gam9iTmFtZVxuICAgIHRoaXMucHJvZHVjZXJJbnZvY2F0aW9uSWQgPSBwcm9kdWNlckludm9jYXRpb25JZFxuICAgIHRoaXMucHJvZHVjZXJQcm9vZlByZXNlbnQgPSBwcm9kdWNlclByb29mUHJlc2VudFxuICB9XG59XG4iXX0=
|
|
@@ -4,6 +4,24 @@ export declare const DEFAULT_BACKGROUND_JOB_QUEUE = "default";
|
|
|
4
4
|
export declare const QUEUE_CONCURRENCY_KEY_PREFIX = "queue:";
|
|
5
5
|
/** @type {import("./types.js").BackgroundJobExecutionMode[]} */
|
|
6
6
|
export declare const BACKGROUND_JOB_EXECUTION_MODES: import("./types.js").BackgroundJobExecutionMode[];
|
|
7
|
+
/** @type {import("./types.js").BackgroundJobActiveStatus[]} */
|
|
8
|
+
export declare const BACKGROUND_JOB_ACTIVE_STATUSES: import("./types.js").BackgroundJobActiveStatus[];
|
|
9
|
+
/** @type {import("./types.js").BackgroundJobTerminalStatus[]} */
|
|
10
|
+
export declare const BACKGROUND_JOB_TERMINAL_STATUSES: import("./types.js").BackgroundJobTerminalStatus[];
|
|
11
|
+
/** @type {import("./types.js").BackgroundJobStatus[]} */
|
|
12
|
+
export declare const BACKGROUND_JOB_STATUSES: import("./types.js").BackgroundJobStatus[];
|
|
13
|
+
/**
|
|
14
|
+
* Normalizes persisted or transported job status vocabulary.
|
|
15
|
+
* @param {string} value - Candidate status.
|
|
16
|
+
* @returns {import("./types.js").BackgroundJobStatus} - Known status.
|
|
17
|
+
*/
|
|
18
|
+
export declare function normalizeBackgroundJobStatus(value: string): import("./types.js").BackgroundJobStatus;
|
|
19
|
+
/**
|
|
20
|
+
* Validates a stable logical schedule key at every persistence boundary.
|
|
21
|
+
* @param {string} scheduleKey - Stable schedule key.
|
|
22
|
+
* @returns {string} - Validated key.
|
|
23
|
+
*/
|
|
24
|
+
export declare function normalizeBackgroundJobScheduleKey(scheduleKey: string): string;
|
|
7
25
|
/**
|
|
8
26
|
* Normalizes a job queue.
|
|
9
27
|
* @param {import("./types.js").BackgroundJobOptions} [options] - Job options.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-semantics.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/job-semantics.js"],"names":[],"mappings":"AAIA,eAAO,MAAM,qCAAqC,WAAW,CAAA;AAC7D,eAAO,MAAM,kCAAkC,KAAK,CAAA;AACpD,eAAO,MAAM,4BAA4B,YAAY,CAAA;AACrD,eAAO,MAAM,4BAA4B,WAAW,CAAA;AACpD,gEAAgE;AAChE,eAAO,MAAM,8BAA8B,EADhC,OAAO,YAAY,EAAE,0BAA0B,EAC6B,CAAA;
|
|
1
|
+
{"version":3,"file":"job-semantics.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/job-semantics.js"],"names":[],"mappings":"AAIA,eAAO,MAAM,qCAAqC,WAAW,CAAA;AAC7D,eAAO,MAAM,kCAAkC,KAAK,CAAA;AACpD,eAAO,MAAM,4BAA4B,YAAY,CAAA;AACrD,eAAO,MAAM,4BAA4B,WAAW,CAAA;AACpD,gEAAgE;AAChE,eAAO,MAAM,8BAA8B,EADhC,OAAO,YAAY,EAAE,0BAA0B,EAC6B,CAAA;AACvF,+DAA+D;AAC/D,eAAO,MAAM,8BAA8B,EADhC,OAAO,YAAY,EAAE,yBAAyB,EACa,CAAA;AACtE,iEAAiE;AACjE,eAAO,MAAM,gCAAgC,EADlC,OAAO,YAAY,EAAE,2BAA2B,EACqC,CAAA;AAChG,yDAAyD;AACzD,eAAO,MAAM,uBAAuB,EADzB,OAAO,YAAY,EAAE,mBAAmB,EAC4D,CAAA;AAE/G;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAHvC,MAGuC,GAFrC,OAAO,YAAY,EAAE,mBAAmB,CAQpD;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,WAAW,EAHlD,MAGkD,GAFhD,MAAM,CAMlB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,AAHhD,CACA,EADQ,OAAO,YAAY,EAAE,oBAGmB,GAFtC,MAAM,CAQlB;AAED;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CAAC,OAAO,GALhD,IAAI,CAAC,OAAO,YAAY,EAAE,oBAAoB,EAAE,eAAe,CAAC,GAAG;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAKrC,EAAE,oBAAoB,AAJnF,CACA,EADQ,OAAO,YAAY,EAAE,0BAI8F,EAAE,uBAAuB,AAHpJ,CACA,EADQ,OAAO,YAAY,EAAE,0BAA0B,EAG8H,GAF3K,OAAO,YAAY,EAAE,0BAA0B,CAsB3D;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,UAAU,EAHhD,MAAM,GAAG,IAAI,GAAG,SAGgC,GAF9C,MAAM,CAQlB;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAAC,aAAa,EAJtD,MAAM,GAAG,SAI6C,EAAE,oBAAoB,EAH5E,MAG4E,GAF1E,MAAM,CAOlB;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAJzC,MAIyC,EAAE,KAAK,EAHhD,MAGgD,GAF9C,MAAM,CAclB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAH5B,MAG4B,GAF1B,MAAM,CAQlB;AAED;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAAC,EAAC,OAAY,EAAE,KAAK,EAAE,MAAM,EAAC,EAL5E;IAAwD,OAAO,EAAvD,OAAO,YAAY,EAAE,oBAAoB,CACjD;IAAqB,KAAK,EAAlB,MAAM,CACd;IAA0E,MAAM,EAAxE,MAAM,CAAC,MAAM,EAAE;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC,CACnE;CAE4E,GAFlE,OAAO,YAAY,EAAE,gCAAgC,GAAG,IAAI,CA0BxE"}
|