@dbx-tools/appkit-web-search 0.9.132 → 0.9.136
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/index.ts +2 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +2 -2
- package/lib/src/fetch.d.ts +31 -0
- package/lib/src/fetch.js +93 -19
- package/lib/src/plugin.d.ts +5 -0
- package/lib/src/plugin.js +6 -2
- package/lib/src/runtime.d.ts +5 -1
- package/lib/src/runtime.js +17 -5
- package/lib/src/search.js +79 -32
- package/package.json +7 -7
- package/src/fetch.ts +151 -22
- package/src/plugin.ts +18 -1
- package/src/runtime.ts +20 -3
- package/src/search.ts +97 -33
package/lib/src/search.js
CHANGED
|
@@ -167,23 +167,22 @@ async function postServing(ctx, url, body, runtime, cacheKey, signal, writeProgr
|
|
|
167
167
|
if (!response.ok) {
|
|
168
168
|
const responseBody = await response.text();
|
|
169
169
|
const model = object.isRecord(body) && typeof body.model === "string" ? body.model : undefined;
|
|
170
|
-
|
|
171
|
-
model,
|
|
172
|
-
api: url.endsWith("/responses") ? "responses" : "chat",
|
|
173
|
-
url,
|
|
174
|
-
status: response.status,
|
|
175
|
-
responseBody,
|
|
176
|
-
});
|
|
177
|
-
if (response.status === 400 &&
|
|
170
|
+
const crossRegionDisabled = response.status === 400 &&
|
|
178
171
|
model &&
|
|
179
172
|
policy.modelFamily(model) === policy.ModelFamily.Gemini &&
|
|
180
|
-
GEMINI_CROSS_REGION_DISABLED.test(responseBody)
|
|
173
|
+
GEMINI_CROSS_REGION_DISABLED.test(responseBody);
|
|
174
|
+
if (crossRegionDisabled) {
|
|
181
175
|
const expiresAt = Date.now() + GEMINI_CROSS_REGION_COOLDOWN_MS;
|
|
182
176
|
runtime.familyCooldowns.set(policy.ModelFamily.Gemini, expiresAt);
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
177
|
+
runtime.availableFamilies.delete(policy.ModelFamily.Gemini);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
logger.error("serving-request-rejected", {
|
|
181
|
+
model,
|
|
182
|
+
api: url.endsWith("/responses") ? "responses" : "chat",
|
|
183
|
+
url,
|
|
184
|
+
status: response.status,
|
|
185
|
+
responseBody,
|
|
187
186
|
});
|
|
188
187
|
}
|
|
189
188
|
// Load-shedding and server faults are worth another attempt; a 4xx is
|
|
@@ -199,7 +198,7 @@ async function postServing(ctx, url, body, runtime, cacheKey, signal, writeProgr
|
|
|
199
198
|
response.headers.get("content-type")?.includes("text/event-stream")
|
|
200
199
|
? readStreamingResponse(response, writeProgress)
|
|
201
200
|
: response.json();
|
|
202
|
-
}, signal);
|
|
201
|
+
}, signal, false);
|
|
203
202
|
return object.isRecord(payload) ? payload : {};
|
|
204
203
|
}
|
|
205
204
|
/** Consume an OpenAI Responses SSE stream and retain its completed response. */
|
|
@@ -372,28 +371,76 @@ export async function runWebSearch(request, runtimeOrConfig, ctx, signal, writeP
|
|
|
372
371
|
`disabled. Deploy a supported endpoint, set model or ${MODEL_ENV}, or enable the ` +
|
|
373
372
|
"fallback (WEB_SEARCH_SCRAPE_FALLBACK=1).");
|
|
374
373
|
}
|
|
374
|
+
return runSelectedWebSearch(request, runtime, ctx, endpoint, signal, writeProgress);
|
|
375
|
+
}
|
|
376
|
+
/** Run one selected family after its first request establishes availability. */
|
|
377
|
+
async function runSelectedWebSearch(request, runtime, ctx, endpoint, signal, writeProgress) {
|
|
378
|
+
const family = endpointFamily(endpoint);
|
|
379
|
+
if (!family || runtime.availableFamilies.has(family)) {
|
|
380
|
+
try {
|
|
381
|
+
return await runNativeWebSearch(request, runtime, ctx, endpoint, signal, writeProgress);
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
return runSearchFallback(request, runtime, ctx, endpoint, error, signal, writeProgress);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
const activeProbe = runtime.familyProbes.get(family);
|
|
388
|
+
if (activeProbe) {
|
|
389
|
+
signal?.throwIfAborted();
|
|
390
|
+
await activeProbe;
|
|
391
|
+
signal?.throwIfAborted();
|
|
392
|
+
return runWebSearch(request, runtime, ctx, signal, writeProgress);
|
|
393
|
+
}
|
|
394
|
+
let releaseProbe;
|
|
395
|
+
const probe = new Promise((resolve) => {
|
|
396
|
+
releaseProbe = resolve;
|
|
397
|
+
});
|
|
398
|
+
runtime.familyProbes.set(family, probe);
|
|
399
|
+
if (runtime.availableFamilies.has(family) || activeFamilyCooldowns(runtime).has(family)) {
|
|
400
|
+
runtime.familyProbes.delete(family);
|
|
401
|
+
releaseProbe();
|
|
402
|
+
return runWebSearch(request, runtime, ctx, signal, writeProgress);
|
|
403
|
+
}
|
|
404
|
+
let failure;
|
|
375
405
|
try {
|
|
376
|
-
|
|
406
|
+
const result = await runNativeWebSearch(request, runtime, ctx, endpoint, signal, writeProgress);
|
|
407
|
+
runtime.availableFamilies.add(family);
|
|
408
|
+
return result;
|
|
377
409
|
}
|
|
378
410
|
catch (error) {
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
411
|
+
failure = error;
|
|
412
|
+
}
|
|
413
|
+
finally {
|
|
414
|
+
if (runtime.familyProbes.get(family) === probe)
|
|
415
|
+
runtime.familyProbes.delete(family);
|
|
416
|
+
releaseProbe();
|
|
417
|
+
}
|
|
418
|
+
return runSearchFallback(request, runtime, ctx, endpoint, failure, signal, writeProgress);
|
|
419
|
+
}
|
|
420
|
+
/** Resolve a cached family failure to another model or the scrape fallback. */
|
|
421
|
+
async function runSearchFallback(request, runtime, ctx, endpoint, error, signal, writeProgress) {
|
|
422
|
+
if (endpointFamily(endpoint) !== policy.ModelFamily.Gemini ||
|
|
423
|
+
!activeFamilyCooldowns(runtime).has(policy.ModelFamily.Gemini)) {
|
|
424
|
+
throw error;
|
|
425
|
+
}
|
|
426
|
+
const fallback = await resolveWebSearchModel(ctx, runtime, request.model);
|
|
427
|
+
if (!fallback) {
|
|
428
|
+
if (runtime.config.scrapeFallback) {
|
|
429
|
+
logger.warn("web-search-model-fallback", {
|
|
430
|
+
failedModel: endpoint.name,
|
|
431
|
+
fallback: "scrape",
|
|
432
|
+
reason: "cross-region-disabled",
|
|
433
|
+
});
|
|
434
|
+
return runScrapeSearch(request, runtime, signal);
|
|
390
435
|
}
|
|
391
|
-
|
|
392
|
-
failedModel: endpoint.name,
|
|
393
|
-
fallbackModel: fallback.name,
|
|
394
|
-
});
|
|
395
|
-
return runNativeWebSearch(request, runtime, ctx, fallback, signal, writeProgress);
|
|
436
|
+
throw error;
|
|
396
437
|
}
|
|
438
|
+
logger.warn("web-search-model-fallback", {
|
|
439
|
+
failedModel: endpoint.name,
|
|
440
|
+
fallbackModel: fallback.name,
|
|
441
|
+
reason: "cross-region-disabled",
|
|
442
|
+
});
|
|
443
|
+
return runSelectedWebSearch(request, runtime, ctx, fallback, signal, writeProgress);
|
|
397
444
|
}
|
|
398
445
|
/** Execute one native provider request against an already-selected endpoint. */
|
|
399
446
|
async function runNativeWebSearch(request, runtime, ctx, endpoint, signal, writeProgress) {
|
|
@@ -432,4 +479,4 @@ async function runNativeWebSearch(request, runtime, ctx, endpoint, signal, write
|
|
|
432
479
|
});
|
|
433
480
|
return { query: request.query, answer, citations: trimmed, model: modelId };
|
|
434
481
|
}
|
|
435
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQWdDLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEdBR25CLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJOUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDakMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsWUFBWSxDQUFDO0FBRTlDOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDNUQsTUFBTSw0QkFBNEIsR0FBRyxzQ0FBc0MsQ0FBQztBQUU1RSwrRUFBK0U7QUFDL0UsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFaEMsb0VBQW9FO0FBQ3BFLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBZ0JoQzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCO0lBQzNDLE1BQU0sR0FBRyxHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUQsTUFBTSxhQUFhLEdBQUcsUUFBUSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztJQUN2RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQ2xDLEdBQXFCLEVBQ3JCLE9BQXlCLEVBQ3pCLFNBQTZCO0lBRTdCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDM0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUU7UUFDakUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ25FLENBQUMsQ0FBQztJQUNILE9BQU8sdUJBQXVCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMvRixDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsU0FBNEMsRUFDNUMsU0FBNkIsRUFDN0IsTUFBc0MsRUFDdEMscUJBQXNELElBQUksR0FBRyxFQUFFO0lBRS9ELDhEQUE4RDtJQUM5RCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDNUMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8saUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRTtRQUNuQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNO1FBQ2pDLEtBQUssRUFBRSxDQUFDO1FBQ1IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxjQUFjO0tBQ2pDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDaEIsSUFBSSxNQUFNO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDMUIsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRTtRQUNoQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHO1FBQzlCLEtBQUssRUFBRSxFQUFFO1FBQ1QsU0FBUyxFQUFFLE1BQU0sQ0FBQyxjQUFjO0tBQ2pDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVuQyxNQUFNLFNBQVMsR0FBRyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQztJQUM1QyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUs7WUFDMUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hCLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixLQUFLLEVBQUUsQ0FBQztnQkFDUixTQUFTLEVBQUUsTUFBTSxDQUFDLGNBQWM7YUFDakMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVE7WUFDakIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDeEQsSUFBSSxPQUFPO1lBQUUsT0FBTyxPQUFPLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTFCLEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNDLElBQ0UsTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTTtZQUNsRCxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQy9DLENBQUM7WUFDRCxTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUU7WUFDcEMsTUFBTTtZQUNOLEtBQUssRUFBRSxDQUFDO1lBQ1IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxjQUFjO1NBQ2pDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUM7UUFDaEIsSUFBSSxPQUFPO1lBQUUsT0FBTyxPQUFPLENBQUM7SUFDOUIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELHlEQUF5RDtBQUN6RCxTQUFTLGNBQWMsQ0FBQyxRQUFnQztJQUN0RCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQVMscUJBQXFCLENBQzVCLE9BQXlCLEVBQ3pCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBRWhCLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDMUQsSUFBSSxTQUFTLElBQUksR0FBRztZQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFDRCxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILEtBQUssVUFBVSxXQUFXLENBQ3hCLEdBQXFCLEVBQ3JCLEdBQVcsRUFDWCxJQUFhLEVBQ2IsT0FBeUIsRUFDekIsUUFBc0MsRUFDdEMsTUFBb0IsRUFDcEIsYUFBOEI7SUFFOUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUMzQixNQUFNLE9BQU8sR0FBRyxNQUFNLFdBQVcsQ0FDL0IsT0FBTyxFQUNQLGlCQUFpQixFQUNqQixjQUFjLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFDcEUsS0FBSyxFQUFFLGFBQWEsRUFBb0IsRUFBRTtRQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDaEMsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ1AsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLGNBQWMsRUFBRSxrQkFBa0I7YUFDbkM7WUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNwRCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sWUFBWSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNDLE1BQU0sS0FBSyxHQUNULE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ25GLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUU7Z0JBQ3ZDLEtBQUs7Z0JBQ0wsR0FBRyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTTtnQkFDdEQsR0FBRztnQkFDSCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07Z0JBQ3ZCLFlBQVk7YUFDYixDQUFDLENBQUM7WUFDSCxJQUNFLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRztnQkFDdkIsS0FBSztnQkFDTCxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTTtnQkFDdkQsNEJBQTRCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUMvQyxDQUFDO2dCQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRywrQkFBK0IsQ0FBQztnQkFDL0QsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2xFLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7b0JBQ3hDLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU07b0JBQ2pDLE1BQU0sRUFBRSx1QkFBdUI7b0JBQy9CLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUU7aUJBQzdDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxzRUFBc0U7WUFDdEUseURBQXlEO1lBQ3pELE1BQU0sU0FBUyxHQUNiLFFBQVEsQ0FBQyxNQUFNLElBQUksbUJBQW1CLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQztZQUNwRixNQUFNLE9BQU8sR0FBRywrREFBK0QsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2xHLE1BQU0sU0FBUztnQkFDYixDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUN4RSxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE9BQU8sYUFBYTtZQUNsQixRQUFRLENBQUMsSUFBSTtZQUNiLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztZQUNuRSxDQUFDLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQztZQUNoRCxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUMsRUFDRCxNQUFNLENBQ1AsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakQsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixLQUFLLFVBQVUscUJBQXFCLENBQ2xDLFFBQWtCLEVBQ2xCLGFBQTZCO0lBRTdCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNsQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDaEIsSUFBSSxTQUE4QyxDQUFDO0lBQ25ELE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxLQUFhLEVBQUUsRUFBRTtRQUN0QyxNQUFNLElBQUksR0FBRyxLQUFLO2FBQ2YsS0FBSyxDQUFDLElBQUksQ0FBQzthQUNYLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMxQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQVksQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDdEUsTUFBTSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbEQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLG9CQUFvQixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDM0UsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxjQUFjLENBQUMsdUNBQXVDLEVBQUU7Z0JBQ2hFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFO2FBQ3RDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixTQUFTLENBQUM7UUFDUixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsT0FBTyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckIsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksSUFBSTtZQUFFLE1BQU07SUFDbEIsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtRQUFFLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLElBQUksQ0FBQyxTQUFTO1FBQUUsTUFBTSxJQUFJLGNBQWMsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0lBQzVGLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsS0FBSyxVQUFVLHFCQUFxQixDQUNsQyxLQUE4QixFQUM5QixhQUE2QjtJQUU3QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssMkJBQTJCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPO0lBQ3ZGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNsRixJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU87SUFDaEQsTUFBTSxLQUFLLEdBQUcsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzFFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUMzQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQW1CLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7UUFDOUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNQLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssUUFBUTtRQUMvQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2YsQ0FBQyxDQUFDLFVBQVUsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLElBQUksS0FBSyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUM7SUFDdEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxhQUFhLENBQUM7UUFDbEIsSUFBSSxFQUFFLGFBQWE7UUFDbkIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsT0FBTyxFQUFFLEtBQUssSUFBSSxTQUFTO1FBQzNCLE9BQU87S0FDUixDQUFDLENBQUM7SUFDSCxNQUFNLGFBQWEsQ0FBQztRQUNsQixJQUFJLEVBQUUsYUFBYTtRQUNuQixNQUFNLEVBQUUsUUFBUTtRQUNoQixPQUFPLEVBQUUsUUFBUTtRQUNqQixPQUFPO1FBQ1AsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLFdBQVcsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQzFFLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDUixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsaUZBQWlGO0FBRWpGOztHQUVHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxPQUFnQztJQUk1RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ25FLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixNQUFNLFNBQVMsR0FBd0IsRUFBRSxDQUFDO0lBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDL0IsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFBRSxTQUFTO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUs7WUFBRSxTQUFTO1FBQ3JCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUFFLFNBQVM7WUFDckMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEQsSUFBSSxJQUFJO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RSxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7b0JBQUUsU0FBUztnQkFDM0MsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7b0JBQUUsU0FBUztnQkFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEQsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2RixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsZUFBZSxDQUFDLE9BQWdDO0lBSXZELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM5RixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdELE1BQU0sU0FBUyxHQUF3QixFQUFFLENBQUM7SUFDMUMsZ0ZBQWdGO0lBQ2hGLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDL0IsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFVLEVBQUUsS0FBYSxFQUFRLEVBQUU7UUFDaEQsSUFBSSxLQUFLLEdBQUcsd0JBQXdCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDcEUsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0UsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNELElBQUksR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7Z0JBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakUsQ0FBQztJQUNILENBQUMsQ0FBQztJQUNGLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQ2hDLE9BQXlCLEVBQ3pCLGVBQXNDLEVBQ3RDLEdBQXFCLEVBQ3JCLE1BQW9CLEVBQ3BCLGFBQThCO0lBRTlCLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUxRSxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN0Qix5REFBeUQ7UUFDekQsSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN6RSxPQUFPLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixDQUN2QyxxQ0FBcUMsRUFDckMsa0ZBQWtGO1lBQ2hGLHVEQUF1RCxTQUFTLGtCQUFrQjtZQUNsRiwwQ0FBMEMsQ0FDN0MsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sa0JBQWtCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQ0UsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTTtZQUN0RCxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUM5RCxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDNUUsT0FBTyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsRUFBRTtZQUMvQyxXQUFXLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDMUIsYUFBYSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1NBQzdCLENBQUMsQ0FBQztRQUNILE9BQU8sa0JBQWtCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNwRixDQUFDO0FBQ0gsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixLQUFLLFVBQVUsa0JBQWtCLENBQy9CLE9BQXlCLEVBQ3pCLE9BQXlCLEVBQ3pCLEdBQXFCLEVBQ3JCLFFBQWdDLEVBQ2hDLE1BQW9CLEVBQ3BCLGFBQThCO0lBRTlCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDM0IsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztJQUM5QixNQUFNLFFBQVEsR0FBRywwQkFBMEIsQ0FDekMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUMvRCxDQUFDO0lBQ0YsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDdkMsNEJBQTRCLEVBQzVCLFNBQVMsT0FBTyxvQ0FBb0MsQ0FDckQsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRWhFLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRyxNQUFNLElBQUksR0FDUixJQUFJLENBQUMsR0FBRyxLQUFLLFdBQVc7UUFDdEIsQ0FBQyxDQUFDO1lBQ0UsR0FBRyxJQUFJLENBQUMsT0FBTztZQUNmLEtBQUssRUFBRSxPQUFPO1lBQ2QsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUMzQztRQUNILENBQUMsQ0FBQztZQUNFLEdBQUcsSUFBSSxDQUFDLE9BQU87WUFDZixLQUFLLEVBQUUsT0FBTztZQUNkLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3JELENBQUM7SUFFUixNQUFNLE9BQU8sR0FBRyxNQUFNLFdBQVcsQ0FDL0IsR0FBRyxFQUNILEdBQUcsRUFDSCxJQUFJLEVBQ0osT0FBTyxFQUNQLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQzNELE1BQU0sRUFDTixhQUFhLENBQ2QsQ0FBQztJQUVGLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQ3pCLElBQUksQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7UUFDdkIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUTtRQUNSLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtRQUMzQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDekIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZWIgc2VhcmNoIGJhY2tlZCBieSB0aGUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wuXG4gKlxuICogVW5saWtlIGEgc2NyYXBpbmcgY2xpZW50LCB0aGUgc2VhcmNoIHJ1bnMgKmluc2lkZSogYSBtb2RlbCBjYWxsOiB3ZSBQT1NUIHRoZVxuICogcXVlcnkgdG8gdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnQgd2l0aCB0aGUgcHJvdmlkZXIncyB3ZWItc2VhcmNoXG4gKiB0b29sIHNwZWMgYXR0YWNoZWQsIGFuZCB0aGUgbW9kZWwgc2VhcmNoZXMgdGhlIHdlYiBhbmQgd3JpdGVzIHRoZSBhbnN3ZXIuXG4gKiB7QGxpbmsgcnVuV2ViU2VhcmNofTpcbiAqXG4gKiAgIDEuIFJlc29sdmVzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIElOREVQRU5ERU5UTFkgb2YgdGhlIGNhbGxpbmdcbiAqICAgICAgYWdlbnQncyBjaGF0IG1vZGVsICh0aGUgYWdlbnQgbWF5IHJ1biBvbiBhIG1vZGVsIHdpdGhvdXQgd2ViIHNlYXJjaCkuXG4gKiAgICAgIEEgcGlubmVkIGBtb2RlbGAgKHJlcXVlc3Qgb3IgY29uZmlnKSBpcyBmdXp6eS1tYXRjaGVkOyBvdGhlcndpc2UgdGhlXG4gKiAgICAgIGNvbmZpZ3VyZWQgZmFsbGJhY2sgb3JkZXIgKEdlbWluaSwgdGhlbiBHUFQpIGlzIHdhbGtlZCB0byB0aGUgZmlyc3RcbiAqICAgICAgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IHRoYXQgZXhpc3RzLiBBbiBleHBsaWNpdCBidXQgdW5zdXBwb3J0ZWRcbiAqICAgICAgbW9kZWwgaXMgYSBoYXJkIGVycm9yLCBub3QgYSBzaWxlbnQgZmFsbGJhY2suXG4gKiAgIDIuIFBPU1RzIHRvIHRoZSBwcm92aWRlcidzIFJFU1Qgc3VyZmFjZSAoYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgXG4gKiAgICAgIGZvciBPcGVuQUksIGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2AgZm9yIEdlbWluaSkgd2l0aCB0aGVcbiAqICAgICAgbWFwcGVkIHRvb2wgc3BlYywgYXV0aGVudGljYXRlZCBhcyB0aGUgT0JPIGNhbGxlci5cbiAqICAgMy4gUmV0dXJucyB0aGUgc3ludGhlc2l6ZWQgYW5zd2VyIHBsdXMgdGhlIGNpdGVkIHNvdXJjZXMsIHdpdGggY2l0YXRpb25zXG4gKiAgICAgIHNpbGVudGx5IGZpbHRlcmVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgVVJMIGFsbG93LWxpc3QuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L3Rvb2wtcHJvdmlkZXJcIjtcbmltcG9ydCB7IGludm9rZSwgcG9saWN5LCByZXNvbHZlLCBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IG9wZW5haUNoYXQsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgTU9ERUxfRU5WLCB0eXBlIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NhbGxTZXR0aW5ncywgd2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IHN1cHBvcnRzV2ViU2VhcmNoLCB3ZWJTZWFyY2hQcm92aWRlckZvckZhbWlseSwgd2ViU2VhcmNoVG9vbFNwZWMgfSBmcm9tIFwiLi9wcm92aWRlci50c1wiO1xuaW1wb3J0IHtcbiAgZXhlY3V0ZVJlYWQsXG4gIHRvV2ViU2VhcmNoUnVudGltZSxcbiAgdHlwZSBXZWJTZWFyY2hSdW50aW1lLFxuICB0eXBlIFdlYlNlYXJjaFJ1bnRpbWVJbnB1dCxcbn0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBXZWJTZWFyY2hDaXRhdGlvbiwgV2ViU2VhcmNoUmVxdWVzdCwgV2ViU2VhcmNoUmVzdWx0IH0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgeyBydW5TY3JhcGVTZWFyY2ggfSBmcm9tIFwiLi9zY3JhcGUudHNcIjtcblxudHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gbW9kZWxDYXRhbG9nLldvcmtzcGFjZUNsaWVudExpa2UgJiBpbnZva2UuQXV0aGVudGljYXRpbmdDbGllbnRMaWtlO1xudHlwZSBQcm9ncmVzc1dyaXRlciA9IE5vbk51bGxhYmxlPEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZVByb2dyZXNzXCJdPjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoL3NlYXJjaFwiKTtcbmNvbnN0IHsgbG9va3VwTW9kZWxzIH0gPSByZXNvbHZlO1xuY29uc3QgeyBsaXN0U2VydmluZ0VuZHBvaW50cyB9ID0gbW9kZWxDYXRhbG9nO1xuXG4vKipcbiAqIEhvdyBkZWVwIHRoZSBncm91bmRpbmctbWV0YWRhdGEgd2FsayBkZXNjZW5kcy4gR2VtaW5pIG5lc3RzIGl0cyBzb3VyY2VzIGFcbiAqIGhhbmRmdWwgb2YgbGV2ZWxzIGRvd24gYW5kIHRoZSBzaGFwZSB2YXJpZXMgYnkgbW9kZWwgdmVyc2lvbiwgc28gdGhlIHdhbGtcbiAqIGlzIGdlbmVyaWM7IHRoZSBib3VuZCBpcyB3aGF0IGtlZXBzIGEgcGF0aG9sb2dpY2FsIHBheWxvYWQgZnJvbSB0dXJuaW5nIGl0XG4gKiBpbnRvIGEgZnVsbCB0cmF2ZXJzYWwgb2YgdGhlIHJlc3BvbnNlLlxuICovXG5jb25zdCBNQVhfR1JPVU5ESU5HX1dBTEtfREVQVEggPSA2O1xuY29uc3QgR0VNSU5JX0NST1NTX1JFR0lPTl9DT09MRE9XTl9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5jb25zdCBHRU1JTklfQ1JPU1NfUkVHSU9OX0RJU0FCTEVEID0gL2Nyb3NzLXJlZ2lvbiBwcm9jZXNzaW5nIGlzIGRpc2FibGVkL2k7XG5cbi8qKiBMb3dlc3QgSFRUUCBzdGF0dXMgdHJlYXRlZCBhcyBhIHNlcnZlci1zaWRlIChyZXRyeWFibGUpIHNlcnZpbmcgZmFpbHVyZS4gKi9cbmNvbnN0IFNFUlZFUl9FUlJPUl9TVEFUVVMgPSA1MDA7XG5cbi8qKiBTdGF0dXMgTW9kZWwgU2VydmluZyB1c2VzIHRvIHNoZWQgbG9hZDsgcmV0cnlhYmxlIGxpa2UgYSA1eHguICovXG5jb25zdCBSQVRFX0xJTUlURURfU1RBVFVTID0gNDI5O1xuXG4vKiogQ29udGV4dCBhIHNlYXJjaCBuZWVkcyBmcm9tIHRoZSBjYWxsZXI6IHRoZSBPQk8gY2xpZW50ICsgd29ya3NwYWNlIGhvc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlYXJjaENvbnRleHQge1xuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFRydXN0ZWQgaWRlbnRpdHkgb2YgdGhlIGNyZWRlbnRpYWwgY2FycmllZCBieSBgY2xpZW50YC4gKi9cbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIE1vZGVsLXNlbGVjdGlvbiBmaWVsZHMgdXNlZCB0byByYW5rIG9uZSB3ZWItc2VhcmNoIGVuZHBvaW50LiAqL1xuZXhwb3J0IHR5cGUgV2ViU2VhcmNoTW9kZWxTZWxlY3Rpb25PcHRpb25zID0gUGljazxcbiAgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcsXG4gIFwibW9kZWxcIiB8IFwibW9kZWxGYWxsYmFja3NcIiB8IFwiZnV6enlcIiB8IFwiZnV6enlUaHJlc2hvbGRcIlxuPjtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCArIGhvc3QgZnJvbSB0aGUgYWN0aXZlIEFwcEtpdCBleGVjdXRpb25cbiAqIGNvbnRleHQuIEluc2lkZSBgYWdlbnQuc3RyZWFtYCdzIGBhc1VzZXIocmVxKWAgc2NvcGUgdGhpcyBoaXRzIHRoZSBzZXJ2aW5nXG4gKiBlbmRwb2ludCBhcyB0aGUgcmVxdWVzdGluZyB1c2VyOyBvdXRzaWRlIGEgdXNlciBjb250ZXh0IEFwcEtpdCBmYWxscyBiYWNrIHRvXG4gKiB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoQ29udGV4dCgpOiBQcm9taXNlPFdlYlNlYXJjaENvbnRleHQ+IHtcbiAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGN0eC5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgY2FjaGVJZGVudGl0eSA9IFwidXNlcklkXCIgaW4gY3R4ID8gY3R4LnVzZXJJZCA6IGN0eC5zZXJ2aWNlVXNlcklkO1xuICByZXR1cm4geyBjbGllbnQ6IGN0eC5jbGllbnQsIGhvc3QsIGNhY2hlSWRlbnRpdHkgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIGFnYWluc3QgdGhlIExJVkUgd29ya3NwYWNlIGNhdGFsb2d1ZSAtIHNvXG4gKiB3ZSBuZXZlciByZXR1cm4gYW4gZW5kcG9pbnQgaWQgdGhhdCBpc24ndCBhY3R1YWxseSBkZXBsb3llZCAodGhlIFwiZW5kcG9pbnRcbiAqIGRvZXMgbm90IGV4aXN0XCIgZmFpbHVyZSBhIGhhcmRjb2RlZCBmYWxsYmFjayBpZCB3b3VsZCBjYXVzZSkuIFJldXNlc1xuICogYEBkYngtdG9vbHMvbW9kZWxgJ3MgZXhpc3RpbmcgY2F0YWxvZ3VlICsgcmFua2VyIHJhdGhlciB0aGFuIGEgY3VzdG9tXG4gKiBsb29rdXA6IHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gbGlzdHMgdGhlIGVuZHBvaW50cyAoY2FjaGVkKSwgYW5kIHdlXG4gKiByZXN0cmljdCB0aGUgY2FuZGlkYXRlIHNldCB0aHJvdWdoIG1vZGVsLW93bmVkIGNhcGFiaWxpdHkgbWV0YWRhdGEgYmVmb3JlXG4gKiB7QGxpbmsgbG9va3VwTW9kZWxzfSByYW5rcyB3aXRoaW4gaXQuXG4gKlxuICogVGhlIGhpZ2hlc3QtcmFua2VkIEdlbWluaSBtb2RlbCB3aW5zLiBXaXRob3V0IEdlbWluaSwgYSBHUFQgcmVxdWVzdCBtYXRjaGluZ1xuICogdGhlIGNhbGxpbmcvY29uZmlndXJlZCBtb2RlbCB3aW5zLCBmb2xsb3dlZCBieSB0aGUgaGlnaGVzdC1yYW5rZWQgR1BUIG1vZGVsXG4gKiBhbmQgdGhlbiBhbnkgYWRkaXRpb25hbCBjb25maWd1cmVkIHNlYXJjaGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoTW9kZWwoXG4gIGN0eDogV2ViU2VhcmNoQ29udGV4dCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsPiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhjdHguY2xpZW50LCBjdHguaG9zdCwge1xuICAgIC4uLihjdHguY2FjaGVJZGVudGl0eSA/IHsgY2FjaGVJZGVudGl0eTogY3R4LmNhY2hlSWRlbnRpdHkgfSA6IHt9KSxcbiAgfSk7XG4gIHJldHVybiBzZWxlY3RXZWJTZWFyY2hFbmRwb2ludChlbmRwb2ludHMsIHJlcXVlc3RlZCwgY29uZmlnLCBhY3RpdmVGYW1pbHlDb29sZG93bnMocnVudGltZSkpO1xufVxuXG4vKiogU2VsZWN0IG9uZSBkZXBsb3llZCB3ZWItc2VhcmNoIGVuZHBvaW50IHVzaW5nIGZhbWlseSBhbmQgY2FwYWJpbGl0eSBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0V2ViU2VhcmNoRW5kcG9pbnQoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICByZXF1ZXN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBXZWJTZWFyY2hNb2RlbFNlbGVjdGlvbk9wdGlvbnMsXG4gIHN1cHByZXNzZWRGYW1pbGllczogUmVhZG9ubHlTZXQ8cG9saWN5Lk1vZGVsRmFtaWx5PiA9IG5ldyBTZXQoKSxcbik6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsIHtcbiAgLy8gT25seSBkZXBsb3llZCwgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50cyBhcmUgY2FuZGlkYXRlcy5cbiAgY29uc3QgY2FwYWJsZSA9IGVuZHBvaW50cy5maWx0ZXIoKGVuZHBvaW50KSA9PiB7XG4gICAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpO1xuICAgIHJldHVybiBzdXBwb3J0c1dlYlNlYXJjaChlbmRwb2ludCkgJiYgKCFmYW1pbHkgfHwgIXN1cHByZXNzZWRGYW1pbGllcy5oYXMoZmFtaWx5KSk7XG4gIH0pO1xuICBjb25zdCBnZW1pbmkgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSxcbiAgICBsaW1pdDogMSxcbiAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgfSlbMF0/LmVuZHBvaW50O1xuICBpZiAoZ2VtaW5pKSByZXR1cm4gZ2VtaW5pO1xuICBjb25zdCBncHQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCxcbiAgICBsaW1pdDogNTAsXG4gICAgdGhyZXNob2xkOiBjb25maWcuZnV6enlUaHJlc2hvbGQsXG4gIH0pLm1hcCgoeyBlbmRwb2ludCB9KSA9PiBlbmRwb2ludCk7XG5cbiAgY29uc3QgcHJlZmVycmVkID0gcmVxdWVzdGVkID8/IGNvbmZpZy5tb2RlbDtcbiAgaWYgKHByZWZlcnJlZCAmJiBwb2xpY3kubW9kZWxGYW1pbHkocHJlZmVycmVkKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBjb25maWcuZnV6enlcbiAgICAgID8gbG9va3VwTW9kZWxzKGdwdCwge1xuICAgICAgICAgIHNlYXJjaDogcHJlZmVycmVkLFxuICAgICAgICAgIGxpbWl0OiAxLFxuICAgICAgICAgIHRocmVzaG9sZDogY29uZmlnLmZ1enp5VGhyZXNob2xkLFxuICAgICAgICB9KVswXT8uZW5kcG9pbnRcbiAgICAgIDogZ3B0LmZpbmQoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lID09PSBwcmVmZXJyZWQpO1xuICAgIGlmIChtYXRjaGVkKSByZXR1cm4gbWF0Y2hlZDtcbiAgfVxuICBpZiAoZ3B0WzBdKSByZXR1cm4gZ3B0WzBdO1xuXG4gIGZvciAoY29uc3Qgc2VhcmNoIG9mIGNvbmZpZy5tb2RlbEZhbGxiYWNrcykge1xuICAgIGlmIChcbiAgICAgIHNlYXJjaC50b0xvd2VyQ2FzZSgpID09PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgICBzZWFyY2gudG9Mb3dlckNhc2UoKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdFxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgICAgc2VhcmNoLFxuICAgICAgbGltaXQ6IDEsXG4gICAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgICB9KVswXT8uZW5kcG9pbnQ7XG4gICAgaWYgKG1hdGNoZWQpIHJldHVybiBtYXRjaGVkO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBSZXR1cm4gb25lIGVuZHBvaW50J3MgbW9kZWwtb3duZWQgZmFtaWx5IGlkZW50aXR5LiAqL1xuZnVuY3Rpb24gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBwb2xpY3kuTW9kZWxGYW1pbHkgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcG9saWN5Lm1vZGVsRmFtaWx5KGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUgPz8gZW5kcG9pbnQubmFtZSk7XG59XG5cbi8qKiBEcm9wIGV4cGlyZWQgZmFtaWx5IGNvb2xkb3ducyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50bHkgc3VwcHJlc3NlZCBzZXQuICovXG5mdW5jdGlvbiBhY3RpdmVGYW1pbHlDb29sZG93bnMoXG4gIHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsXG4gIG5vdyA9IERhdGUubm93KCksXG4pOiBSZWFkb25seVNldDxwb2xpY3kuTW9kZWxGYW1pbHk+IHtcbiAgZm9yIChjb25zdCBbZmFtaWx5LCBleHBpcmVzQXRdIG9mIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zKSB7XG4gICAgaWYgKGV4cGlyZXNBdCA8PSBub3cpIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmRlbGV0ZShmYW1pbHkpO1xuICB9XG4gIHJldHVybiBuZXcgU2V0KHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmtleXMoKSk7XG59XG5cbi8qKlxuICogUE9TVCBhIHNlcnZpbmcgcmVxdWVzdCBhcyB0aGUgT0JPIGNhbGxlciBhbmQgcmV0dXJuIHRoZSBwYXJzZWQgSlNPTiBib2R5LlxuICpcbiAqIEF1dGggaGVhZGVycyBhcmUgbWludGVkIHBlciBjYWxsIGZyb20gdGhlIE9CTyBjbGllbnQncyBTREsgY29uZmlnLCB3aGljaFxuICogcmVmcmVzaGVzIHRoZSB0b2tlbiB3aGVuIGl0IGlzIGNsb3NlIHRvIGV4cGlyeSwgc28gdGhlIHJlcXVlc3QgY2FycmllcyB0aGVcbiAqIHJlcXVlc3RpbmcgdXNlcidzIGlkZW50aXR5LlxuICpcbiAqIFRoaXMgaXMgdGhlIG9uZSBEYXRhYnJpY2tzIGNhbGwgaW4gdGhlIHJlcG8gdGhhdCBkb2VzIG5vdCBnbyB0aHJvdWdoXG4gKiBgYXBpQ2xpZW50LnJlcXVlc3RgICsgYGRhdGFicmlja3MudG9Db250ZXh0YCAod2hpY2ggZG9lcyBmb3J3YXJkXG4gKiBjYW5jZWxsYXRpb24pLiBSZXRyeSBjbGFzc2lmaWNhdGlvbiBoZXJlIGhhcyB0byBkaXN0aW5ndWlzaCBhIGxvYWQtc2hlZCBvclxuICogc2VydmVyIGZhdWx0IGZyb20gdGhpcyByZXF1ZXN0J3Mgb3duIDR4eCwgYW5kIGBmZXRjaGAgZXhwb3NlcyB0aGUgSFRUUCBzdGF0dXNcbiAqIGRpcmVjdGx5OyB0aGUgU0RLIHJhaXNlcyBhbiBgQXBpRXJyb3JgIHRoYXQgY2FycmllcyB0aGUgc3RhdHVzIHVuZGVyXG4gKiBpbmNvbnNpc3RlbnQga2V5cywgd2hpY2ggaXMgZ3Vlc3N3b3JrIGJ5IGNvbXBhcmlzb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RTZXJ2aW5nKFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHVybDogc3RyaW5nLFxuICBib2R5OiB1bmtub3duLFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjYWNoZUtleTogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBleGVjdXRlUmVhZChcbiAgICBydW50aW1lLFxuICAgIFwic2VydmluZy1yZXF1ZXN0XCIsXG4gICAgdG9DYWxsU2V0dGluZ3Mod2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzLCBjb25maWcudGltZW91dE1zLCBjYWNoZUtleSksXG4gICAgYXN5bmMgKGV4ZWN1dGVTaWduYWwpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4oYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGN0eC5jbGllbnQpKSxcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgLi4uKGV4ZWN1dGVTaWduYWwgPyB7IHNpZ25hbDogZXhlY3V0ZVNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgY29uc3QgbW9kZWwgPVxuICAgICAgICAgIG9iamVjdC5pc1JlY29yZChib2R5KSAmJiB0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IGJvZHkubW9kZWwgOiB1bmRlZmluZWQ7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcInNlcnZpbmctcmVxdWVzdC1yZWplY3RlZFwiLCB7XG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgYXBpOiB1cmwuZW5kc1dpdGgoXCIvcmVzcG9uc2VzXCIpID8gXCJyZXNwb25zZXNcIiA6IFwiY2hhdFwiLFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICByZXNwb25zZUJvZHksXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDAgJiZcbiAgICAgICAgICBtb2RlbCAmJlxuICAgICAgICAgIHBvbGljeS5tb2RlbEZhbWlseShtb2RlbCkgPT09IHBvbGljeS5Nb2RlbEZhbWlseS5HZW1pbmkgJiZcbiAgICAgICAgICBHRU1JTklfQ1JPU1NfUkVHSU9OX0RJU0FCTEVELnRlc3QocmVzcG9uc2VCb2R5KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgR0VNSU5JX0NST1NTX1JFR0lPTl9DT09MRE9XTl9NUztcbiAgICAgICAgICBydW50aW1lLmZhbWlseUNvb2xkb3ducy5zZXQocG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSwgZXhwaXJlc0F0KTtcbiAgICAgICAgICBsb2dnZXIud2FybihcInByb3ZpZGVyLWZhbWlseS1zdXBwcmVzc2VkXCIsIHtcbiAgICAgICAgICAgIGZhbWlseTogcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSxcbiAgICAgICAgICAgIHJlYXNvbjogXCJjcm9zcy1yZWdpb24tZGlzYWJsZWRcIixcbiAgICAgICAgICAgIGV4cGlyZXNBdDogbmV3IERhdGUoZXhwaXJlc0F0KS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIExvYWQtc2hlZGRpbmcgYW5kIHNlcnZlciBmYXVsdHMgYXJlIHdvcnRoIGFub3RoZXIgYXR0ZW1wdDsgYSA0eHggaXNcbiAgICAgICAgLy8gdGhpcyByZXF1ZXN0J3Mgb3duIHByb2JsZW0sIHNvIGl0IG11c3Qgbm90IGJlIHJldHJpZWQuXG4gICAgICAgIGNvbnN0IHJldHJ5YWJsZSA9XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IFNFUlZFUl9FUlJPUl9TVEFUVVMgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSBSQVRFX0xJTUlURURfU1RBVFVTO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYHdlYi1zZWFyY2g6IE1vZGVsIFNlcnZpbmcgcmVqZWN0ZWQgdGhlIHNlYXJjaCByZXF1ZXN0IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgO1xuICAgICAgICB0aHJvdyByZXRyeWFibGVcbiAgICAgICAgICA/IG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgeyBjb250ZXh0OiB7IHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzIH0gfSlcbiAgICAgICAgICA6IG5ldyBFeGVjdXRpb25FcnJvcihtZXNzYWdlLCB7IGNvbnRleHQ6IHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMgfSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cml0ZVByb2dyZXNzICYmXG4gICAgICAgIHJlc3BvbnNlLmJvZHkgJiZcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik/LmluY2x1ZGVzKFwidGV4dC9ldmVudC1zdHJlYW1cIilcbiAgICAgICAgPyByZWFkU3RyZWFtaW5nUmVzcG9uc2UocmVzcG9uc2UsIHdyaXRlUHJvZ3Jlc3MpXG4gICAgICAgIDogcmVzcG9uc2UuanNvbigpO1xuICAgIH0sXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHBheWxvYWQpID8gcGF5bG9hZCA6IHt9O1xufVxuXG4vKiogQ29uc3VtZSBhbiBPcGVuQUkgUmVzcG9uc2VzIFNTRSBzdHJlYW0gYW5kIHJldGFpbiBpdHMgY29tcGxldGVkIHJlc3BvbnNlLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFN0cmVhbWluZ1Jlc3BvbnNlKFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIHdyaXRlUHJvZ3Jlc3M6IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5IS5nZXRSZWFkZXIoKTtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICBsZXQgYnVmZmVyID0gXCJcIjtcbiAgbGV0IGNvbXBsZXRlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbnN1bWUgPSBhc3luYyAoZnJhbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBmcmFtZVxuICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoNSkudHJpbVN0YXJ0KCkpXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBpZiAoIWRhdGEgfHwgZGF0YSA9PT0gXCJbRE9ORV1cIikgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0gSlNPTi5wYXJzZShkYXRhKSBhcyB1bmtub3duO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKGV2ZW50KSB8fCB0eXBlb2YgZXZlbnQudHlwZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuO1xuICAgIGF3YWl0IGVtaXRXZWJTZWFyY2hQcm9ncmVzcyhldmVudCwgd3JpdGVQcm9ncmVzcyk7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IFwicmVzcG9uc2UuY29tcGxldGVkXCIgJiYgb2JqZWN0LmlzUmVjb3JkKGV2ZW50LnJlc3BvbnNlKSkge1xuICAgICAgY29tcGxldGVkID0gZXZlbnQucmVzcG9uc2U7XG4gICAgfVxuICAgIGlmIChldmVudC50eXBlID09PSBcInJlc3BvbnNlLmZhaWxlZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJ3ZWItc2VhcmNoOiBzdHJlYW1pbmcgcmVzcG9uc2UgZmFpbGVkXCIsIHtcbiAgICAgICAgY29udGV4dDogeyByZXNwb25zZTogZXZlbnQucmVzcG9uc2UgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiAhZG9uZSB9KTtcbiAgICBidWZmZXIgPSBidWZmZXIucmVwbGFjZUFsbChcIlxcclxcblwiLCBcIlxcblwiKTtcbiAgICBsZXQgYm91bmRhcnkgPSBidWZmZXIuaW5kZXhPZihcIlxcblxcblwiKTtcbiAgICB3aGlsZSAoYm91bmRhcnkgPj0gMCkge1xuICAgICAgYXdhaXQgY29uc3VtZShidWZmZXIuc2xpY2UoMCwgYm91bmRhcnkpKTtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShib3VuZGFyeSArIDIpO1xuICAgICAgYm91bmRhcnkgPSBidWZmZXIuaW5kZXhPZihcIlxcblxcblwiKTtcbiAgICB9XG4gICAgaWYgKGRvbmUpIGJyZWFrO1xuICB9XG4gIGlmIChidWZmZXIudHJpbSgpKSBhd2FpdCBjb25zdW1lKGJ1ZmZlcik7XG4gIGlmICghY29tcGxldGVkKSB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJ3ZWItc2VhcmNoOiBzdHJlYW1pbmcgcmVzcG9uc2UgZGlkIG5vdCBjb21wbGV0ZVwiKTtcbiAgcmV0dXJuIGNvbXBsZXRlZDtcbn1cblxuLyoqIFB1Ymxpc2ggbmF0aXZlIHdlYi1zZWFyY2ggbGlmZWN5Y2xlIGV2ZW50cyBhcyBjb21tb24gdG9vbCBwcm9ncmVzcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVtaXRXZWJTZWFyY2hQcm9ncmVzcyhcbiAgZXZlbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB3cml0ZVByb2dyZXNzOiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZXZlbnQudHlwZSAhPT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5kb25lXCIgfHwgIW9iamVjdC5pc1JlY29yZChldmVudC5pdGVtKSkgcmV0dXJuO1xuICBjb25zdCBhY3Rpb24gPSBvYmplY3QuaXNSZWNvcmQoZXZlbnQuaXRlbS5hY3Rpb24pID8gZXZlbnQuaXRlbS5hY3Rpb24gOiB1bmRlZmluZWQ7XG4gIGlmICghYWN0aW9uIHx8IGFjdGlvbi50eXBlICE9PSBcInNlYXJjaFwiKSByZXR1cm47XG4gIGNvbnN0IHF1ZXJ5ID0gdHlwZW9mIGFjdGlvbi5xdWVyeSA9PT0gXCJzdHJpbmdcIiA/IGFjdGlvbi5xdWVyeSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcXVlcmllcyA9IEFycmF5LmlzQXJyYXkoYWN0aW9uLnF1ZXJpZXMpXG4gICAgPyBhY3Rpb24ucXVlcmllcy5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIilcbiAgICA6IFtdO1xuICBjb25zdCBncm91cElkID1cbiAgICB0eXBlb2YgZXZlbnQuaXRlbS5pZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBldmVudC5pdGVtLmlkXG4gICAgICA6IGBzZWFyY2gtJHtTdHJpbmcoZXZlbnQuc2VxdWVuY2VfbnVtYmVyID8/IHF1ZXJ5ID8/IFwidW5rbm93blwiKX1gO1xuICBjb25zdCByZXN1bHRDb3VudCA9IHF1ZXJpZXMubGVuZ3RoID4gMCA/IHF1ZXJpZXMubGVuZ3RoIDogcXVlcnkgPyAxIDogMDtcbiAgYXdhaXQgd3JpdGVQcm9ncmVzcyh7XG4gICAgdHlwZTogXCJ0b29sX3N0YXR1c1wiLFxuICAgIHN0YXR1czogXCJzZWFyY2hcIixcbiAgICBtZXNzYWdlOiBxdWVyeSA/PyBcInRoZSB3ZWJcIixcbiAgICBncm91cElkLFxuICB9KTtcbiAgYXdhaXQgd3JpdGVQcm9ncmVzcyh7XG4gICAgdHlwZTogXCJ0b29sX3N0YXR1c1wiLFxuICAgIHN0YXR1czogXCJyZXN1bHRcIixcbiAgICBtZXNzYWdlOiBcIlJlc3VsdFwiLFxuICAgIGdyb3VwSWQsXG4gICAgLi4uKHJlc3VsdENvdW50ID4gMFxuICAgICAgPyB7IGRldGFpbDogYCR7cmVzdWx0Q291bnR9ICR7cmVzdWx0Q291bnQgPT09IDEgPyBcInJlc3VsdFwiIDogXCJyZXN1bHRzXCJ9YCB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNwb25zZSBleHRyYWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEV4dHJhY3QgYW5zd2VyIHRleHQgYW5kIGNpdGF0aW9ucyBmcm9tIGFuIE9wZW5BSSBSZXNwb25zZXMgQVBJIHBheWxvYWQuXG4gKi9cbmZ1bmN0aW9uIGZyb21SZXNwb25zZXNQYXlsb2FkKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KToge1xuICBhbnN3ZXI6IHN0cmluZztcbiAgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdO1xufSB7XG4gIGNvbnN0IG91dHB1dCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5vdXRwdXQpID8gcGF5bG9hZC5vdXRwdXQgOiBbXTtcbiAgY29uc3QgdGV4dHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBvdXRwdXQpIHtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChpdGVtKSkgY29udGludWU7XG4gICAgY29uc3QgcGFydHMgPSBvcGVuYWlDaGF0LmNoYXRDb250ZW50UGFydHMoaXRlbS5jb250ZW50KTtcbiAgICBpZiAoIXBhcnRzKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnQpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRleHQgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShwYXJ0LnRleHQpO1xuICAgICAgaWYgKHRleHQpIHRleHRzLnB1c2godGV4dCk7XG4gICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IEFycmF5LmlzQXJyYXkocGFydC5hbm5vdGF0aW9ucykgPyBwYXJ0LmFubm90YXRpb25zIDogW107XG4gICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvYmplY3QuaXNSZWNvcmQoYW5ub3RhdGlvbikpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB1cmwgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShhbm5vdGF0aW9uLnVybCk7XG4gICAgICAgIGlmICghdXJsIHx8IHNlZW4uaGFzKHVybCkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZCh1cmwpO1xuICAgICAgICBjb25zdCB0aXRsZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KGFubm90YXRpb24udGl0bGUpO1xuICAgICAgICBjaXRhdGlvbnMucHVzaCh7IHVybCwgLi4uKHRpdGxlID8geyB0aXRsZSB9IDoge30pIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBhbnN3ZXIgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShwYXlsb2FkLm91dHB1dF90ZXh0KSB8fCB0ZXh0cy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgcmV0dXJuIHsgYW5zd2VyLCBjaXRhdGlvbnMgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGFuc3dlciB0ZXh0ICsgY2l0YXRpb25zIGZyb20gYSBDaGF0IENvbXBsZXRpb25zIHBheWxvYWQgKEdlbWluaSB2aWFcbiAqIGBnb29nbGVfc2VhcmNoYCkuIFRoZSBhbnN3ZXIgaXMgYGNob2ljZXNbMF0ubWVzc2FnZS5jb250ZW50YDsgZ3JvdW5kaW5nXG4gKiBzb3VyY2VzLCB3aGVuIHByZXNlbnQsIHN1cmZhY2UgdW5kZXIgYGNob2ljZXNbMF0ubWVzc2FnZWAgZ3JvdW5kaW5nXG4gKiBtZXRhZGF0YSAoYmVzdC1lZmZvcnQgLSBzaGFwZXMgdmFyeSwgc28gd2Ugc2NhbiBmb3IgdXJsLWJlYXJpbmcgZW50cmllcykuXG4gKi9cbmZ1bmN0aW9uIGZyb21DaGF0UGF5bG9hZChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHtcbiAgYW5zd2VyOiBzdHJpbmc7XG4gIGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXTtcbn0ge1xuICBjb25zdCBjaG9pY2VzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLmNob2ljZXMpID8gcGF5bG9hZC5jaG9pY2VzIDogW107XG4gIGNvbnN0IGZpcnN0ID0gY2hvaWNlc1swXTtcbiAgY29uc3QgbWVzc2FnZSA9IG9iamVjdC5pc1JlY29yZChmaXJzdCkgJiYgb2JqZWN0LmlzUmVjb3JkKGZpcnN0Lm1lc3NhZ2UpID8gZmlyc3QubWVzc2FnZSA6IHt9O1xuICBjb25zdCBhbnN3ZXIgPSBvcGVuYWlDaGF0LmNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCk7XG4gIGNvbnN0IGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXSA9IFtdO1xuICAvLyBCZXN0LWVmZm9ydCBncm91bmRpbmcgZXh0cmFjdGlvbjogd2FsayBhbnkgbmVzdGVkIG9iamVjdCBmb3Ige3VyaXx1cmwsdGl0bGV9LlxuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHZpc2l0ID0gKHY6IHVua25vd24sIGRlcHRoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoZGVwdGggPiBNQVhfR1JPVU5ESU5HX1dBTEtfREVQVEggfHwgIW9iamVjdC5pc1JlY29yZCh2KSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHYudXJsKSB8fCBzdHJpbmdVdGlscy50cmltVG9FbXB0eSh2LnVyaSk7XG4gICAgaWYgKHVybCAmJiAhc2Vlbi5oYXModXJsKSkge1xuICAgICAgc2Vlbi5hZGQodXJsKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkodi50aXRsZSk7XG4gICAgICBjaXRhdGlvbnMucHVzaCh7IHVybCwgLi4uKHRpdGxlID8geyB0aXRsZSB9IDoge30pIH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbCBvZiBPYmplY3QudmFsdWVzKHYpKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB2YWwuZm9yRWFjaCgoeCkgPT4gdmlzaXQoeCwgZGVwdGggKyAxKSk7XG4gICAgICBlbHNlIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikgdmlzaXQodmFsLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgfTtcbiAgdmlzaXQobWVzc2FnZS5ncm91bmRpbmdfbWV0YWRhdGEgPz8gbWVzc2FnZS5ncm91bmRpbmdNZXRhZGF0YSwgMCk7XG4gIHJldHVybiB7IGFuc3dlciwgY2l0YXRpb25zIH07XG59XG5cbi8qKlxuICogUnVuIGEgd2ViIHNlYXJjaC4gUHJlZmVycyB0aGUgRGF0YWJyaWNrcyBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIG9uIGFcbiAqIGRlcGxveWVkIEdQVC9HZW1pbmkgZW5kcG9pbnQgKHN5bnRoZXNpemVkIGFuc3dlciArIGNpdGF0aW9ucyk7IHdoZW4gdGhlXG4gKiB3b3Jrc3BhY2UgaGFzIG5vIHN1Y2ggZW5kcG9pbnQgQU5EIHRoZSBzY3JhcGUgZmFsbGJhY2sgaXMgZW5hYmxlZCwgZmFsbHNcbiAqIGJhY2sgdG8gYSBEdWNrRHVja0dvIHNjcmFwZSBzbyB0aGUgdG9vbCBzdGlsbCByZXR1cm5zIHJlc3VsdHMgaW5zdGVhZCBvZlxuICogZXJyb3JpbmcuIENpdGF0aW9ucyBhcmUgZmlsdGVyZWQgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBVUkwgYWxsb3ctbGlzdC5cbiAqXG4gKiBgc2lnbmFsYCBjYW5jZWxzIHRoZSB3aG9sZSBjYWxsLCBpbmNsdWRpbmcgdGhlIGluLWZsaWdodCBzZXJ2aW5nIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XZWJTZWFyY2goXG4gIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gIHJ1bnRpbWVPckNvbmZpZzogV2ViU2VhcmNoUnVudGltZUlucHV0LFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICB3cml0ZVByb2dyZXNzPzogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD4ge1xuICBjb25zdCBydW50aW1lID0gdG9XZWJTZWFyY2hSdW50aW1lKHJ1bnRpbWVPckNvbmZpZyk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBlbmRwb2ludCA9IGF3YWl0IHJlc29sdmVXZWJTZWFyY2hNb2RlbChjdHgsIHJ1bnRpbWUsIHJlcXVlc3QubW9kZWwpO1xuXG4gIGlmIChlbmRwb2ludCA9PT0gbnVsbCkge1xuICAgIC8vIE5vIG5hdGl2ZSB3ZWItc2VhcmNoIG1vZGVsIGRlcGxveWVkIGluIHRoaXMgd29ya3NwYWNlLlxuICAgIGlmIChjb25maWcuc2NyYXBlRmFsbGJhY2spIHtcbiAgICAgIGxvZ2dlci5pbmZvKFwibm8tbmF0aXZlLW1vZGVsOnNjcmFwZS1mYWxsYmFja1wiLCB7IHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5IH0pO1xuICAgICAgcmV0dXJuIHJ1blNjcmFwZVNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBzaWduYWwpO1xuICAgIH1cbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIFwiV2ViLXNlYXJjaC1jYXBhYmxlIHNlcnZpbmcgZW5kcG9pbnRcIixcbiAgICAgIFwiTm8gR1BUL0dlbWluaSBlbmRwb2ludCBpcyBkZXBsb3llZCBpbiB0aGlzIHdvcmtzcGFjZSBhbmQgdGhlIHNjcmFwZSBmYWxsYmFjayBpcyBcIiArXG4gICAgICAgIGBkaXNhYmxlZC4gRGVwbG95IGEgc3VwcG9ydGVkIGVuZHBvaW50LCBzZXQgbW9kZWwgb3IgJHtNT0RFTF9FTlZ9LCBvciBlbmFibGUgdGhlIGAgK1xuICAgICAgICBcImZhbGxiYWNrIChXRUJfU0VBUkNIX1NDUkFQRV9GQUxMQkFDSz0xKS5cIixcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcnVuTmF0aXZlV2ViU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZW5kcG9pbnQsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKFxuICAgICAgZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpICE9PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgICAhYWN0aXZlRmFtaWx5Q29vbGRvd25zKHJ1bnRpbWUpLmhhcyhwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pKVxuICAgICkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGZhbGxiYWNrID0gYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaE1vZGVsKGN0eCwgcnVudGltZSwgcmVxdWVzdC5tb2RlbCk7XG4gICAgaWYgKCFmYWxsYmFjaykge1xuICAgICAgaWYgKGNvbmZpZy5zY3JhcGVGYWxsYmFjaykge1xuICAgICAgICBsb2dnZXIuaW5mbyhcImdlbWluaS11bmF2YWlsYWJsZTpzY3JhcGUtZmFsbGJhY2tcIiwgeyBxdWVyeTogcmVxdWVzdC5xdWVyeSB9KTtcbiAgICAgICAgcmV0dXJuIHJ1blNjcmFwZVNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBzaWduYWwpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwiZ2VtaW5pLXVuYXZhaWxhYmxlOm1vZGVsLWZhbGxiYWNrXCIsIHtcbiAgICAgIGZhaWxlZE1vZGVsOiBlbmRwb2ludC5uYW1lLFxuICAgICAgZmFsbGJhY2tNb2RlbDogZmFsbGJhY2submFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcnVuTmF0aXZlV2ViU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZmFsbGJhY2ssIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH1cbn1cblxuLyoqIEV4ZWN1dGUgb25lIG5hdGl2ZSBwcm92aWRlciByZXF1ZXN0IGFnYWluc3QgYW4gYWxyZWFkeS1zZWxlY3RlZCBlbmRwb2ludC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bk5hdGl2ZVdlYlNlYXJjaChcbiAgcmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgY3R4OiBXZWJTZWFyY2hDb250ZXh0LFxuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBtb2RlbElkID0gZW5kcG9pbnQubmFtZTtcbiAgY29uc3QgcHJvdmlkZXIgPSB3ZWJTZWFyY2hQcm92aWRlckZvckZhbWlseShcbiAgICBwb2xpY3kubW9kZWxGYW1pbHkoZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSA/PyBlbmRwb2ludC5uYW1lKSxcbiAgKTtcbiAgaWYgKCFwcm92aWRlcikge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgXCJOYXRpdmUgd2ViLXNlYXJjaCBwcm92aWRlclwiLFxuICAgICAgYE1vZGVsICR7bW9kZWxJZH0gaGFzIG5vIHN1cHBvcnRlZCBwcm92aWRlciBmYW1pbHkuYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IHNwZWMgPSB3ZWJTZWFyY2hUb29sU3BlYyhwcm92aWRlciwgY29uZmlnLndlYlNlYXJjaFRvb2xzKTtcblxuICBjb25zdCB1cmwgPVxuICAgIHNwZWMuYXBpID09PSBcInJlc3BvbnNlc1wiID8gaW52b2tlLnJlc3BvbnNlc1VybChjdHguaG9zdCkgOiBpbnZva2UuY2hhdENvbXBsZXRpb25zVXJsKGN0eC5ob3N0KTtcbiAgY29uc3QgYm9keSA9XG4gICAgc3BlYy5hcGkgPT09IFwicmVzcG9uc2VzXCJcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnNwZWMucmVxdWVzdCxcbiAgICAgICAgICBtb2RlbDogbW9kZWxJZCxcbiAgICAgICAgICBpbnB1dDogW3sgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IHJlcXVlc3QucXVlcnkgfV0sXG4gICAgICAgICAgLi4uKHdyaXRlUHJvZ3Jlc3MgPyB7IHN0cmVhbTogdHJ1ZSB9IDoge30pLFxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICAuLi5zcGVjLnJlcXVlc3QsXG4gICAgICAgICAgbW9kZWw6IG1vZGVsSWQsXG4gICAgICAgICAgbWVzc2FnZXM6IFt7IHJvbGU6IFwidXNlclwiLCBjb250ZW50OiByZXF1ZXN0LnF1ZXJ5IH1dLFxuICAgICAgICB9O1xuXG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBwb3N0U2VydmluZyhcbiAgICBjdHgsXG4gICAgdXJsLFxuICAgIGJvZHksXG4gICAgcnVudGltZSxcbiAgICBbXCJ3ZWItc2VhcmNoXCIsIFwic2VydmluZ1wiLCBzcGVjLmFwaSwgbW9kZWxJZCwgcmVxdWVzdC5xdWVyeV0sXG4gICAgc2lnbmFsLFxuICAgIHdyaXRlUHJvZ3Jlc3MsXG4gICk7XG5cbiAgY29uc3QgeyBhbnN3ZXIsIGNpdGF0aW9ucyB9ID1cbiAgICBzcGVjLmFwaSA9PT0gXCJyZXNwb25zZXNcIiA/IGZyb21SZXNwb25zZXNQYXlsb2FkKHBheWxvYWQpIDogZnJvbUNoYXRQYXlsb2FkKHBheWxvYWQpO1xuXG4gIGNvbnN0IHBlcm1pdHRlZCA9IGNpdGF0aW9ucy5maWx0ZXIoKGMpID0+IGNvbmZpZy5hbGxvd0xpc3QuYWxsb3dzKGMudXJsKSk7XG4gIGNvbnN0IGRyb3BwZWQgPSBjaXRhdGlvbnMubGVuZ3RoIC0gcGVybWl0dGVkLmxlbmd0aDtcbiAgY29uc3QgdHJpbW1lZCA9IHBlcm1pdHRlZC5zbGljZSgwLCBjb25maWcubWF4Q2l0YXRpb25zKTtcbiAgbG9nZ2VyLmRlYnVnKFwic2VhcmNoZWRcIiwge1xuICAgIHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5LFxuICAgIG1vZGVsOiBtb2RlbElkLFxuICAgIHByb3ZpZGVyLFxuICAgIGNpdGF0aW9uczogY2l0YXRpb25zLmxlbmd0aCxcbiAgICAuLi4oZHJvcHBlZCA+IDAgPyB7IGZpbHRlcmVkOiBkcm9wcGVkIH0gOiB7fSksXG4gICAgcmV0dXJuZWQ6IHRyaW1tZWQubGVuZ3RoLFxuICB9KTtcblxuICByZXR1cm4geyBxdWVyeTogcmVxdWVzdC5xdWVyeSwgYW5zd2VyLCBjaXRhdGlvbnM6IHRyaW1tZWQsIG1vZGVsOiBtb2RlbElkIH07XG59XG4iXX0=
|
|
482
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQWdDLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEdBR25CLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJOUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDakMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsWUFBWSxDQUFDO0FBRTlDOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENB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Q0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7UUFDdkIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUTtRQUNSLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtRQUMzQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDekIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZWIgc2VhcmNoIGJhY2tlZCBieSB0aGUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wuXG4gKlxuICogVW5saWtlIGEgc2NyYXBpbmcgY2xpZW50LCB0aGUgc2VhcmNoIHJ1bnMgKmluc2lkZSogYSBtb2RlbCBjYWxsOiB3ZSBQT1NUIHRoZVxuICogcXVlcnkgdG8gdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnQgd2l0aCB0aGUgcHJvdmlkZXIncyB3ZWItc2VhcmNoXG4gKiB0b29sIHNwZWMgYXR0YWNoZWQsIGFuZCB0aGUgbW9kZWwgc2VhcmNoZXMgdGhlIHdlYiBhbmQgd3JpdGVzIHRoZSBhbnN3ZXIuXG4gKiB7QGxpbmsgcnVuV2ViU2VhcmNofTpcbiAqXG4gKiAgIDEuIFJlc29sdmVzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIElOREVQRU5ERU5UTFkgb2YgdGhlIGNhbGxpbmdcbiAqICAgICAgYWdlbnQncyBjaGF0IG1vZGVsICh0aGUgYWdlbnQgbWF5IHJ1biBvbiBhIG1vZGVsIHdpdGhvdXQgd2ViIHNlYXJjaCkuXG4gKiAgICAgIEEgcGlubmVkIGBtb2RlbGAgKHJlcXVlc3Qgb3IgY29uZmlnKSBpcyBmdXp6eS1tYXRjaGVkOyBvdGhlcndpc2UgdGhlXG4gKiAgICAgIGNvbmZpZ3VyZWQgZmFsbGJhY2sgb3JkZXIgKEdlbWluaSwgdGhlbiBHUFQpIGlzIHdhbGtlZCB0byB0aGUgZmlyc3RcbiAqICAgICAgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IHRoYXQgZXhpc3RzLiBBbiBleHBsaWNpdCBidXQgdW5zdXBwb3J0ZWRcbiAqICAgICAgbW9kZWwgaXMgYSBoYXJkIGVycm9yLCBub3QgYSBzaWxlbnQgZmFsbGJhY2suXG4gKiAgIDIuIFBPU1RzIHRvIHRoZSBwcm92aWRlcidzIFJFU1Qgc3VyZmFjZSAoYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgXG4gKiAgICAgIGZvciBPcGVuQUksIGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2AgZm9yIEdlbWluaSkgd2l0aCB0aGVcbiAqICAgICAgbWFwcGVkIHRvb2wgc3BlYywgYXV0aGVudGljYXRlZCBhcyB0aGUgT0JPIGNhbGxlci5cbiAqICAgMy4gUmV0dXJucyB0aGUgc3ludGhlc2l6ZWQgYW5zd2VyIHBsdXMgdGhlIGNpdGVkIHNvdXJjZXMsIHdpdGggY2l0YXRpb25zXG4gKiAgICAgIHNpbGVudGx5IGZpbHRlcmVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgVVJMIGFsbG93LWxpc3QuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L3Rvb2wtcHJvdmlkZXJcIjtcbmltcG9ydCB7IGludm9rZSwgcG9saWN5LCByZXNvbHZlLCBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IG9wZW5haUNoYXQsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgTU9ERUxfRU5WLCB0eXBlIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NhbGxTZXR0aW5ncywgd2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IHN1cHBvcnRzV2ViU2VhcmNoLCB3ZWJTZWFyY2hQcm92aWRlckZvckZhbWlseSwgd2ViU2VhcmNoVG9vbFNwZWMgfSBmcm9tIFwiLi9wcm92aWRlci50c1wiO1xuaW1wb3J0IHtcbiAgZXhlY3V0ZVJlYWQsXG4gIHRvV2ViU2VhcmNoUnVudGltZSxcbiAgdHlwZSBXZWJTZWFyY2hSdW50aW1lLFxuICB0eXBlIFdlYlNlYXJjaFJ1bnRpbWVJbnB1dCxcbn0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBXZWJTZWFyY2hDaXRhdGlvbiwgV2ViU2VhcmNoUmVxdWVzdCwgV2ViU2VhcmNoUmVzdWx0IH0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgeyBydW5TY3JhcGVTZWFyY2ggfSBmcm9tIFwiLi9zY3JhcGUudHNcIjtcblxudHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gbW9kZWxDYXRhbG9nLldvcmtzcGFjZUNsaWVudExpa2UgJiBpbnZva2UuQXV0aGVudGljYXRpbmdDbGllbnRMaWtlO1xudHlwZSBQcm9ncmVzc1dyaXRlciA9IE5vbk51bGxhYmxlPEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZVByb2dyZXNzXCJdPjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoL3NlYXJjaFwiKTtcbmNvbnN0IHsgbG9va3VwTW9kZWxzIH0gPSByZXNvbHZlO1xuY29uc3QgeyBsaXN0U2VydmluZ0VuZHBvaW50cyB9ID0gbW9kZWxDYXRhbG9nO1xuXG4vKipcbiAqIEhvdyBkZWVwIHRoZSBncm91bmRpbmctbWV0YWRhdGEgd2FsayBkZXNjZW5kcy4gR2VtaW5pIG5lc3RzIGl0cyBzb3VyY2VzIGFcbiAqIGhhbmRmdWwgb2YgbGV2ZWxzIGRvd24gYW5kIHRoZSBzaGFwZSB2YXJpZXMgYnkgbW9kZWwgdmVyc2lvbiwgc28gdGhlIHdhbGtcbiAqIGlzIGdlbmVyaWM7IHRoZSBib3VuZCBpcyB3aGF0IGtlZXBzIGEgcGF0aG9sb2dpY2FsIHBheWxvYWQgZnJvbSB0dXJuaW5nIGl0XG4gKiBpbnRvIGEgZnVsbCB0cmF2ZXJzYWwgb2YgdGhlIHJlc3BvbnNlLlxuICovXG5jb25zdCBNQVhfR1JPVU5ESU5HX1dBTEtfREVQVEggPSA2O1xuY29uc3QgR0VNSU5JX0NST1NTX1JFR0lPTl9DT09MRE9XTl9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5jb25zdCBHRU1JTklfQ1JPU1NfUkVHSU9OX0RJU0FCTEVEID0gL2Nyb3NzLXJlZ2lvbiBwcm9jZXNzaW5nIGlzIGRpc2FibGVkL2k7XG5cbi8qKiBMb3dlc3QgSFRUUCBzdGF0dXMgdHJlYXRlZCBhcyBhIHNlcnZlci1zaWRlIChyZXRyeWFibGUpIHNlcnZpbmcgZmFpbHVyZS4gKi9cbmNvbnN0IFNFUlZFUl9FUlJPUl9TVEFUVVMgPSA1MDA7XG5cbi8qKiBTdGF0dXMgTW9kZWwgU2VydmluZyB1c2VzIHRvIHNoZWQgbG9hZDsgcmV0cnlhYmxlIGxpa2UgYSA1eHguICovXG5jb25zdCBSQVRFX0xJTUlURURfU1RBVFVTID0gNDI5O1xuXG4vKiogQ29udGV4dCBhIHNlYXJjaCBuZWVkcyBmcm9tIHRoZSBjYWxsZXI6IHRoZSBPQk8gY2xpZW50ICsgd29ya3NwYWNlIGhvc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlYXJjaENvbnRleHQge1xuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFRydXN0ZWQgaWRlbnRpdHkgb2YgdGhlIGNyZWRlbnRpYWwgY2FycmllZCBieSBgY2xpZW50YC4gKi9cbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIE1vZGVsLXNlbGVjdGlvbiBmaWVsZHMgdXNlZCB0byByYW5rIG9uZSB3ZWItc2VhcmNoIGVuZHBvaW50LiAqL1xuZXhwb3J0IHR5cGUgV2ViU2VhcmNoTW9kZWxTZWxlY3Rpb25PcHRpb25zID0gUGljazxcbiAgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcsXG4gIFwibW9kZWxcIiB8IFwibW9kZWxGYWxsYmFja3NcIiB8IFwiZnV6enlcIiB8IFwiZnV6enlUaHJlc2hvbGRcIlxuPjtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCArIGhvc3QgZnJvbSB0aGUgYWN0aXZlIEFwcEtpdCBleGVjdXRpb25cbiAqIGNvbnRleHQuIEluc2lkZSBgYWdlbnQuc3RyZWFtYCdzIGBhc1VzZXIocmVxKWAgc2NvcGUgdGhpcyBoaXRzIHRoZSBzZXJ2aW5nXG4gKiBlbmRwb2ludCBhcyB0aGUgcmVxdWVzdGluZyB1c2VyOyBvdXRzaWRlIGEgdXNlciBjb250ZXh0IEFwcEtpdCBmYWxscyBiYWNrIHRvXG4gKiB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoQ29udGV4dCgpOiBQcm9taXNlPFdlYlNlYXJjaENvbnRleHQ+IHtcbiAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGN0eC5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgY2FjaGVJZGVudGl0eSA9IFwidXNlcklkXCIgaW4gY3R4ID8gY3R4LnVzZXJJZCA6IGN0eC5zZXJ2aWNlVXNlcklkO1xuICByZXR1cm4geyBjbGllbnQ6IGN0eC5jbGllbnQsIGhvc3QsIGNhY2hlSWRlbnRpdHkgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIGFnYWluc3QgdGhlIExJVkUgd29ya3NwYWNlIGNhdGFsb2d1ZSAtIHNvXG4gKiB3ZSBuZXZlciByZXR1cm4gYW4gZW5kcG9pbnQgaWQgdGhhdCBpc24ndCBhY3R1YWxseSBkZXBsb3llZCAodGhlIFwiZW5kcG9pbnRcbiAqIGRvZXMgbm90IGV4aXN0XCIgZmFpbHVyZSBhIGhhcmRjb2RlZCBmYWxsYmFjayBpZCB3b3VsZCBjYXVzZSkuIFJldXNlc1xuICogYEBkYngtdG9vbHMvbW9kZWxgJ3MgZXhpc3RpbmcgY2F0YWxvZ3VlICsgcmFua2VyIHJhdGhlciB0aGFuIGEgY3VzdG9tXG4gKiBsb29rdXA6IHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gbGlzdHMgdGhlIGVuZHBvaW50cyAoY2FjaGVkKSwgYW5kIHdlXG4gKiByZXN0cmljdCB0aGUgY2FuZGlkYXRlIHNldCB0aHJvdWdoIG1vZGVsLW93bmVkIGNhcGFiaWxpdHkgbWV0YWRhdGEgYmVmb3JlXG4gKiB7QGxpbmsgbG9va3VwTW9kZWxzfSByYW5rcyB3aXRoaW4gaXQuXG4gKlxuICogVGhlIGhpZ2hlc3QtcmFua2VkIEdlbWluaSBtb2RlbCB3aW5zLiBXaXRob3V0IEdlbWluaSwgYSBHUFQgcmVxdWVzdCBtYXRjaGluZ1xuICogdGhlIGNhbGxpbmcvY29uZmlndXJlZCBtb2RlbCB3aW5zLCBmb2xsb3dlZCBieSB0aGUgaGlnaGVzdC1yYW5rZWQgR1BUIG1vZGVsXG4gKiBhbmQgdGhlbiBhbnkgYWRkaXRpb25hbCBjb25maWd1cmVkIHNlYXJjaGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoTW9kZWwoXG4gIGN0eDogV2ViU2VhcmNoQ29udGV4dCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsPiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhjdHguY2xpZW50LCBjdHguaG9zdCwge1xuICAgIC4uLihjdHguY2FjaGVJZGVudGl0eSA/IHsgY2FjaGVJZGVudGl0eTogY3R4LmNhY2hlSWRlbnRpdHkgfSA6IHt9KSxcbiAgfSk7XG4gIHJldHVybiBzZWxlY3RXZWJTZWFyY2hFbmRwb2ludChlbmRwb2ludHMsIHJlcXVlc3RlZCwgY29uZmlnLCBhY3RpdmVGYW1pbHlDb29sZG93bnMocnVudGltZSkpO1xufVxuXG4vKiogU2VsZWN0IG9uZSBkZXBsb3llZCB3ZWItc2VhcmNoIGVuZHBvaW50IHVzaW5nIGZhbWlseSBhbmQgY2FwYWJpbGl0eSBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0V2ViU2VhcmNoRW5kcG9pbnQoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICByZXF1ZXN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBXZWJTZWFyY2hNb2RlbFNlbGVjdGlvbk9wdGlvbnMsXG4gIHN1cHByZXNzZWRGYW1pbGllczogUmVhZG9ubHlTZXQ8cG9saWN5Lk1vZGVsRmFtaWx5PiA9IG5ldyBTZXQoKSxcbik6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsIHtcbiAgLy8gT25seSBkZXBsb3llZCwgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50cyBhcmUgY2FuZGlkYXRlcy5cbiAgY29uc3QgY2FwYWJsZSA9IGVuZHBvaW50cy5maWx0ZXIoKGVuZHBvaW50KSA9PiB7XG4gICAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpO1xuICAgIHJldHVybiBzdXBwb3J0c1dlYlNlYXJjaChlbmRwb2ludCkgJiYgKCFmYW1pbHkgfHwgIXN1cHByZXNzZWRGYW1pbGllcy5oYXMoZmFtaWx5KSk7XG4gIH0pO1xuICBjb25zdCBnZW1pbmkgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSxcbiAgICBsaW1pdDogMSxcbiAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgfSlbMF0/LmVuZHBvaW50O1xuICBpZiAoZ2VtaW5pKSByZXR1cm4gZ2VtaW5pO1xuICBjb25zdCBncHQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCxcbiAgICBsaW1pdDogNTAsXG4gICAgdGhyZXNob2xkOiBjb25maWcuZnV6enlUaHJlc2hvbGQsXG4gIH0pLm1hcCgoeyBlbmRwb2ludCB9KSA9PiBlbmRwb2ludCk7XG5cbiAgY29uc3QgcHJlZmVycmVkID0gcmVxdWVzdGVkID8/IGNvbmZpZy5tb2RlbDtcbiAgaWYgKHByZWZlcnJlZCAmJiBwb2xpY3kubW9kZWxGYW1pbHkocHJlZmVycmVkKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBjb25maWcuZnV6enlcbiAgICAgID8gbG9va3VwTW9kZWxzKGdwdCwge1xuICAgICAgICAgIHNlYXJjaDogcHJlZmVycmVkLFxuICAgICAgICAgIGxpbWl0OiAxLFxuICAgICAgICAgIHRocmVzaG9sZDogY29uZmlnLmZ1enp5VGhyZXNob2xkLFxuICAgICAgICB9KVswXT8uZW5kcG9pbnRcbiAgICAgIDogZ3B0LmZpbmQoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lID09PSBwcmVmZXJyZWQpO1xuICAgIGlmIChtYXRjaGVkKSByZXR1cm4gbWF0Y2hlZDtcbiAgfVxuICBpZiAoZ3B0WzBdKSByZXR1cm4gZ3B0WzBdO1xuXG4gIGZvciAoY29uc3Qgc2VhcmNoIG9mIGNvbmZpZy5tb2RlbEZhbGxiYWNrcykge1xuICAgIGlmIChcbiAgICAgIHNlYXJjaC50b0xvd2VyQ2FzZSgpID09PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgICBzZWFyY2gudG9Mb3dlckNhc2UoKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdFxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgICAgc2VhcmNoLFxuICAgICAgbGltaXQ6IDEsXG4gICAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgICB9KVswXT8uZW5kcG9pbnQ7XG4gICAgaWYgKG1hdGNoZWQpIHJldHVybiBtYXRjaGVkO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBSZXR1cm4gb25lIGVuZHBvaW50J3MgbW9kZWwtb3duZWQgZmFtaWx5IGlkZW50aXR5LiAqL1xuZnVuY3Rpb24gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBwb2xpY3kuTW9kZWxGYW1pbHkgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcG9saWN5Lm1vZGVsRmFtaWx5KGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUgPz8gZW5kcG9pbnQubmFtZSk7XG59XG5cbi8qKiBEcm9wIGV4cGlyZWQgZmFtaWx5IGNvb2xkb3ducyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50bHkgc3VwcHJlc3NlZCBzZXQuICovXG5mdW5jdGlvbiBhY3RpdmVGYW1pbHlDb29sZG93bnMoXG4gIHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsXG4gIG5vdyA9IERhdGUubm93KCksXG4pOiBSZWFkb25seVNldDxwb2xpY3kuTW9kZWxGYW1pbHk+IHtcbiAgZm9yIChjb25zdCBbZmFtaWx5LCBleHBpcmVzQXRdIG9mIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zKSB7XG4gICAgaWYgKGV4cGlyZXNBdCA8PSBub3cpIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmRlbGV0ZShmYW1pbHkpO1xuICB9XG4gIHJldHVybiBuZXcgU2V0KHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmtleXMoKSk7XG59XG5cbi8qKlxuICogUE9TVCBhIHNlcnZpbmcgcmVxdWVzdCBhcyB0aGUgT0JPIGNhbGxlciBhbmQgcmV0dXJuIHRoZSBwYXJzZWQgSlNPTiBib2R5LlxuICpcbiAqIEF1dGggaGVhZGVycyBhcmUgbWludGVkIHBlciBjYWxsIGZyb20gdGhlIE9CTyBjbGllbnQncyBTREsgY29uZmlnLCB3aGljaFxuICogcmVmcmVzaGVzIHRoZSB0b2tlbiB3aGVuIGl0IGlzIGNsb3NlIHRvIGV4cGlyeSwgc28gdGhlIHJlcXVlc3QgY2FycmllcyB0aGVcbiAqIHJlcXVlc3RpbmcgdXNlcidzIGlkZW50aXR5LlxuICpcbiAqIFRoaXMgaXMgdGhlIG9uZSBEYXRhYnJpY2tzIGNhbGwgaW4gdGhlIHJlcG8gdGhhdCBkb2VzIG5vdCBnbyB0aHJvdWdoXG4gKiBgYXBpQ2xpZW50LnJlcXVlc3RgICsgYGRhdGFicmlja3MudG9Db250ZXh0YCAod2hpY2ggZG9lcyBmb3J3YXJkXG4gKiBjYW5jZWxsYXRpb24pLiBSZXRyeSBjbGFzc2lmaWNhdGlvbiBoZXJlIGhhcyB0byBkaXN0aW5ndWlzaCBhIGxvYWQtc2hlZCBvclxuICogc2VydmVyIGZhdWx0IGZyb20gdGhpcyByZXF1ZXN0J3Mgb3duIDR4eCwgYW5kIGBmZXRjaGAgZXhwb3NlcyB0aGUgSFRUUCBzdGF0dXNcbiAqIGRpcmVjdGx5OyB0aGUgU0RLIHJhaXNlcyBhbiBgQXBpRXJyb3JgIHRoYXQgY2FycmllcyB0aGUgc3RhdHVzIHVuZGVyXG4gKiBpbmNvbnNpc3RlbnQga2V5cywgd2hpY2ggaXMgZ3Vlc3N3b3JrIGJ5IGNvbXBhcmlzb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RTZXJ2aW5nKFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHVybDogc3RyaW5nLFxuICBib2R5OiB1bmtub3duLFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjYWNoZUtleTogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBleGVjdXRlUmVhZChcbiAgICBydW50aW1lLFxuICAgIFwic2VydmluZy1yZXF1ZXN0XCIsXG4gICAgdG9DYWxsU2V0dGluZ3Mod2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzLCBjb25maWcudGltZW91dE1zLCBjYWNoZUtleSksXG4gICAgYXN5bmMgKGV4ZWN1dGVTaWduYWwpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4oYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGN0eC5jbGllbnQpKSxcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgLi4uKGV4ZWN1dGVTaWduYWwgPyB7IHNpZ25hbDogZXhlY3V0ZVNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgY29uc3QgbW9kZWwgPVxuICAgICAgICAgIG9iamVjdC5pc1JlY29yZChib2R5KSAmJiB0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IGJvZHkubW9kZWwgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGNyb3NzUmVnaW9uRGlzYWJsZWQgPVxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwICYmXG4gICAgICAgICAgbW9kZWwgJiZcbiAgICAgICAgICBwb2xpY3kubW9kZWxGYW1pbHkobW9kZWwpID09PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pICYmXG4gICAgICAgICAgR0VNSU5JX0NST1NTX1JFR0lPTl9ESVNBQkxFRC50ZXN0KHJlc3BvbnNlQm9keSk7XG4gICAgICAgIGlmIChjcm9zc1JlZ2lvbkRpc2FibGVkKSB7XG4gICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIEdFTUlOSV9DUk9TU19SRUdJT05fQ09PTERPV05fTVM7XG4gICAgICAgICAgcnVudGltZS5mYW1pbHlDb29sZG93bnMuc2V0KHBvbGljeS5Nb2RlbEZhbWlseS5HZW1pbmksIGV4cGlyZXNBdCk7XG4gICAgICAgICAgcnVudGltZS5hdmFpbGFibGVGYW1pbGllcy5kZWxldGUocG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFwic2VydmluZy1yZXF1ZXN0LXJlamVjdGVkXCIsIHtcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgYXBpOiB1cmwuZW5kc1dpdGgoXCIvcmVzcG9uc2VzXCIpID8gXCJyZXNwb25zZXNcIiA6IFwiY2hhdFwiLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICByZXNwb25zZUJvZHksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9hZC1zaGVkZGluZyBhbmQgc2VydmVyIGZhdWx0cyBhcmUgd29ydGggYW5vdGhlciBhdHRlbXB0OyBhIDR4eCBpc1xuICAgICAgICAvLyB0aGlzIHJlcXVlc3QncyBvd24gcHJvYmxlbSwgc28gaXQgbXVzdCBub3QgYmUgcmV0cmllZC5cbiAgICAgICAgY29uc3QgcmV0cnlhYmxlID1cbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPj0gU0VSVkVSX0VSUk9SX1NUQVRVUyB8fCByZXNwb25zZS5zdGF0dXMgPT09IFJBVEVfTElNSVRFRF9TVEFUVVM7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgd2ViLXNlYXJjaDogTW9kZWwgU2VydmluZyByZWplY3RlZCB0aGUgc2VhcmNoIHJlcXVlc3QgKEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9KWA7XG4gICAgICAgIHRocm93IHJldHJ5YWJsZVxuICAgICAgICAgID8gbmV3IENvbm5lY3Rpb25FcnJvcihtZXNzYWdlLCB7IGNvbnRleHQ6IHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMgfSB9KVxuICAgICAgICAgIDogbmV3IEV4ZWN1dGlvbkVycm9yKG1lc3NhZ2UsIHsgY29udGV4dDogeyBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyB9IH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyaXRlUHJvZ3Jlc3MgJiZcbiAgICAgICAgcmVzcG9uc2UuYm9keSAmJlxuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKT8uaW5jbHVkZXMoXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKVxuICAgICAgICA/IHJlYWRTdHJlYW1pbmdSZXNwb25zZShyZXNwb25zZSwgd3JpdGVQcm9ncmVzcylcbiAgICAgICAgOiByZXNwb25zZS5qc29uKCk7XG4gICAgfSxcbiAgICBzaWduYWwsXG4gICAgZmFsc2UsXG4gICk7XG4gIHJldHVybiBvYmplY3QuaXNSZWNvcmQocGF5bG9hZCkgPyBwYXlsb2FkIDoge307XG59XG5cbi8qKiBDb25zdW1lIGFuIE9wZW5BSSBSZXNwb25zZXMgU1NFIHN0cmVhbSBhbmQgcmV0YWluIGl0cyBjb21wbGV0ZWQgcmVzcG9uc2UuICovXG5hc3luYyBmdW5jdGlvbiByZWFkU3RyZWFtaW5nUmVzcG9uc2UoXG4gIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgd3JpdGVQcm9ncmVzczogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkhLmdldFJlYWRlcigpO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBidWZmZXIgPSBcIlwiO1xuICBsZXQgY29tcGxldGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgY29uc3VtZSA9IGFzeW5jIChmcmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IGZyYW1lXG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChcImRhdGE6XCIpKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSg1KS50cmltU3RhcnQoKSlcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIGlmICghZGF0YSB8fCBkYXRhID09PSBcIltET05FXVwiKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKGRhdGEpIGFzIHVua25vd247XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQoZXZlbnQpIHx8IHR5cGVvZiBldmVudC50eXBlICE9PSBcInN0cmluZ1wiKSByZXR1cm47XG4gICAgYXdhaXQgZW1pdFdlYlNlYXJjaFByb2dyZXNzKGV2ZW50LCB3cml0ZVByb2dyZXNzKTtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJyZXNwb25zZS5jb21wbGV0ZWRcIiAmJiBvYmplY3QuaXNSZWNvcmQoZXZlbnQucmVzcG9uc2UpKSB7XG4gICAgICBjb21wbGV0ZWQgPSBldmVudC5yZXNwb25zZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IFwicmVzcG9uc2UuZmFpbGVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIndlYi1zZWFyY2g6IHN0cmVhbWluZyByZXNwb25zZSBmYWlsZWRcIiwge1xuICAgICAgICBjb250ZXh0OiB7IHJlc3BvbnNlOiBldmVudC5yZXNwb25zZSB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06ICFkb25lIH0pO1xuICAgIGJ1ZmZlciA9IGJ1ZmZlci5yZXBsYWNlQWxsKFwiXFxyXFxuXCIsIFwiXFxuXCIpO1xuICAgIGxldCBib3VuZGFyeSA9IGJ1ZmZlci5pbmRleE9mKFwiXFxuXFxuXCIpO1xuICAgIHdoaWxlIChib3VuZGFyeSA+PSAwKSB7XG4gICAgICBhd2FpdCBjb25zdW1lKGJ1ZmZlci5zbGljZSgwLCBib3VuZGFyeSkpO1xuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKGJvdW5kYXJ5ICsgMik7XG4gICAgICBib3VuZGFyeSA9IGJ1ZmZlci5pbmRleE9mKFwiXFxuXFxuXCIpO1xuICAgIH1cbiAgICBpZiAoZG9uZSkgYnJlYWs7XG4gIH1cbiAgaWYgKGJ1ZmZlci50cmltKCkpIGF3YWl0IGNvbnN1bWUoYnVmZmVyKTtcbiAgaWYgKCFjb21wbGV0ZWQpIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIndlYi1zZWFyY2g6IHN0cmVhbWluZyByZXNwb25zZSBkaWQgbm90IGNvbXBsZXRlXCIpO1xuICByZXR1cm4gY29tcGxldGVkO1xufVxuXG4vKiogUHVibGlzaCBuYXRpdmUgd2ViLXNlYXJjaCBsaWZlY3ljbGUgZXZlbnRzIGFzIGNvbW1vbiB0b29sIHByb2dyZXNzLiAqL1xuYXN5bmMgZnVuY3Rpb24gZW1pdFdlYlNlYXJjaFByb2dyZXNzKFxuICBldmVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHdyaXRlUHJvZ3Jlc3M6IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChldmVudC50eXBlICE9PSBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiB8fCAhb2JqZWN0LmlzUmVjb3JkKGV2ZW50Lml0ZW0pKSByZXR1cm47XG4gIGNvbnN0IGFjdGlvbiA9IG9iamVjdC5pc1JlY29yZChldmVudC5pdGVtLmFjdGlvbikgPyBldmVudC5pdGVtLmFjdGlvbiA6IHVuZGVmaW5lZDtcbiAgaWYgKCFhY3Rpb24gfHwgYWN0aW9uLnR5cGUgIT09IFwic2VhcmNoXCIpIHJldHVybjtcbiAgY29uc3QgcXVlcnkgPSB0eXBlb2YgYWN0aW9uLnF1ZXJ5ID09PSBcInN0cmluZ1wiID8gYWN0aW9uLnF1ZXJ5IDogdW5kZWZpbmVkO1xuICBjb25zdCBxdWVyaWVzID0gQXJyYXkuaXNBcnJheShhY3Rpb24ucXVlcmllcylcbiAgICA/IGFjdGlvbi5xdWVyaWVzLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKVxuICAgIDogW107XG4gIGNvbnN0IGdyb3VwSWQgPVxuICAgIHR5cGVvZiBldmVudC5pdGVtLmlkID09PSBcInN0cmluZ1wiXG4gICAgICA/IGV2ZW50Lml0ZW0uaWRcbiAgICAgIDogYHNlYXJjaC0ke1N0cmluZyhldmVudC5zZXF1ZW5jZV9udW1iZXIgPz8gcXVlcnkgPz8gXCJ1bmtub3duXCIpfWA7XG4gIGNvbnN0IHJlc3VsdENvdW50ID0gcXVlcmllcy5sZW5ndGggPiAwID8gcXVlcmllcy5sZW5ndGggOiBxdWVyeSA/IDEgOiAwO1xuICBhd2FpdCB3cml0ZVByb2dyZXNzKHtcbiAgICB0eXBlOiBcInRvb2xfc3RhdHVzXCIsXG4gICAgc3RhdHVzOiBcInNlYXJjaFwiLFxuICAgIG1lc3NhZ2U6IHF1ZXJ5ID8/IFwidGhlIHdlYlwiLFxuICAgIGdyb3VwSWQsXG4gIH0pO1xuICBhd2FpdCB3cml0ZVByb2dyZXNzKHtcbiAgICB0eXBlOiBcInRvb2xfc3RhdHVzXCIsXG4gICAgc3RhdHVzOiBcInJlc3VsdFwiLFxuICAgIG1lc3NhZ2U6IFwiUmVzdWx0XCIsXG4gICAgZ3JvdXBJZCxcbiAgICAuLi4ocmVzdWx0Q291bnQgPiAwXG4gICAgICA/IHsgZGV0YWlsOiBgJHtyZXN1bHRDb3VudH0gJHtyZXN1bHRDb3VudCA9PT0gMSA/IFwicmVzdWx0XCIgOiBcInJlc3VsdHNcIn1gIH1cbiAgICAgIDoge30pLFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlc3BvbnNlIGV4dHJhY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRXh0cmFjdCBhbnN3ZXIgdGV4dCBhbmQgY2l0YXRpb25zIGZyb20gYW4gT3BlbkFJIFJlc3BvbnNlcyBBUEkgcGF5bG9hZC5cbiAqL1xuZnVuY3Rpb24gZnJvbVJlc3BvbnNlc1BheWxvYWQocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB7XG4gIGFuc3dlcjogc3RyaW5nO1xuICBjaXRhdGlvbnM6IFdlYlNlYXJjaENpdGF0aW9uW107XG59IHtcbiAgY29uc3Qgb3V0cHV0ID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLm91dHB1dCkgPyBwYXlsb2FkLm91dHB1dCA6IFtdO1xuICBjb25zdCB0ZXh0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIG91dHB1dCkge1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKGl0ZW0pKSBjb250aW51ZTtcbiAgICBjb25zdCBwYXJ0cyA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRQYXJ0cyhpdGVtLmNvbnRlbnQpO1xuICAgIGlmICghcGFydHMpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocGFydCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdGV4dCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHBhcnQudGV4dCk7XG4gICAgICBpZiAodGV4dCkgdGV4dHMucHVzaCh0ZXh0KTtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zID0gQXJyYXkuaXNBcnJheShwYXJ0LmFubm90YXRpb25zKSA/IHBhcnQuYW5ub3RhdGlvbnMgOiBbXTtcbiAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykge1xuICAgICAgICBpZiAoIW9iamVjdC5pc1JlY29yZChhbm5vdGF0aW9uKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHVybCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KGFubm90YXRpb24udXJsKTtcbiAgICAgICAgaWYgKCF1cmwgfHwgc2Vlbi5oYXModXJsKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHVybCk7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkoYW5ub3RhdGlvbi50aXRsZSk7XG4gICAgICAgIGNpdGF0aW9ucy5wdXNoKHsgdXJsLCAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSkgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGFuc3dlciA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHBheWxvYWQub3V0cHV0X3RleHQpIHx8IHRleHRzLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuICByZXR1cm4geyBhbnN3ZXIsIGNpdGF0aW9ucyB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgYW5zd2VyIHRleHQgKyBjaXRhdGlvbnMgZnJvbSBhIENoYXQgQ29tcGxldGlvbnMgcGF5bG9hZCAoR2VtaW5pIHZpYVxuICogYGdvb2dsZV9zZWFyY2hgKS4gVGhlIGFuc3dlciBpcyBgY2hvaWNlc1swXS5tZXNzYWdlLmNvbnRlbnRgOyBncm91bmRpbmdcbiAqIHNvdXJjZXMsIHdoZW4gcHJlc2VudCwgc3VyZmFjZSB1bmRlciBgY2hvaWNlc1swXS5tZXNzYWdlYCBncm91bmRpbmdcbiAqIG1ldGFkYXRhIChiZXN0LWVmZm9ydCAtIHNoYXBlcyB2YXJ5LCBzbyB3ZSBzY2FuIGZvciB1cmwtYmVhcmluZyBlbnRyaWVzKS5cbiAqL1xuZnVuY3Rpb24gZnJvbUNoYXRQYXlsb2FkKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KToge1xuICBhbnN3ZXI6IHN0cmluZztcbiAgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdO1xufSB7XG4gIGNvbnN0IGNob2ljZXMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQuY2hvaWNlcykgPyBwYXlsb2FkLmNob2ljZXMgOiBbXTtcbiAgY29uc3QgZmlyc3QgPSBjaG9pY2VzWzBdO1xuICBjb25zdCBtZXNzYWdlID0gb2JqZWN0LmlzUmVjb3JkKGZpcnN0KSAmJiBvYmplY3QuaXNSZWNvcmQoZmlyc3QubWVzc2FnZSkgPyBmaXJzdC5tZXNzYWdlIDoge307XG4gIGNvbnN0IGFuc3dlciA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRUb1RleHQobWVzc2FnZS5jb250ZW50KTtcbiAgY29uc3QgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdID0gW107XG4gIC8vIEJlc3QtZWZmb3J0IGdyb3VuZGluZyBleHRyYWN0aW9uOiB3YWxrIGFueSBuZXN0ZWQgb2JqZWN0IGZvciB7dXJpfHVybCx0aXRsZX0uXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgdmlzaXQgPSAodjogdW5rbm93biwgZGVwdGg6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChkZXB0aCA+IE1BWF9HUk9VTkRJTkdfV0FMS19ERVBUSCB8fCAhb2JqZWN0LmlzUmVjb3JkKHYpKSByZXR1cm47XG4gICAgY29uc3QgdXJsID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkodi51cmwpIHx8IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHYudXJpKTtcbiAgICBpZiAodXJsICYmICFzZWVuLmhhcyh1cmwpKSB7XG4gICAgICBzZWVuLmFkZCh1cmwpO1xuICAgICAgY29uc3QgdGl0bGUgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eSh2LnRpdGxlKTtcbiAgICAgIGNpdGF0aW9ucy5wdXNoKHsgdXJsLCAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSkgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsIG9mIE9iamVjdC52YWx1ZXModikpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHZhbC5mb3JFYWNoKCh4KSA9PiB2aXNpdCh4LCBkZXB0aCArIDEpKTtcbiAgICAgIGVsc2UgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiKSB2aXNpdCh2YWwsIGRlcHRoICsgMSk7XG4gICAgfVxuICB9O1xuICB2aXNpdChtZXNzYWdlLmdyb3VuZGluZ19tZXRhZGF0YSA/PyBtZXNzYWdlLmdyb3VuZGluZ01ldGFkYXRhLCAwKTtcbiAgcmV0dXJuIHsgYW5zd2VyLCBjaXRhdGlvbnMgfTtcbn1cblxuLyoqXG4gKiBSdW4gYSB3ZWIgc2VhcmNoLiBQcmVmZXJzIHRoZSBEYXRhYnJpY2tzIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wgb24gYVxuICogZGVwbG95ZWQgR1BUL0dlbWluaSBlbmRwb2ludCAoc3ludGhlc2l6ZWQgYW5zd2VyICsgY2l0YXRpb25zKTsgd2hlbiB0aGVcbiAqIHdvcmtzcGFjZSBoYXMgbm8gc3VjaCBlbmRwb2ludCBBTkQgdGhlIHNjcmFwZSBmYWxsYmFjayBpcyBlbmFibGVkLCBmYWxsc1xuICogYmFjayB0byBhIER1Y2tEdWNrR28gc2NyYXBlIHNvIHRoZSB0b29sIHN0aWxsIHJldHVybnMgcmVzdWx0cyBpbnN0ZWFkIG9mXG4gKiBlcnJvcmluZy4gQ2l0YXRpb25zIGFyZSBmaWx0ZXJlZCB0aHJvdWdoIHRoZSBjb25maWd1cmVkIFVSTCBhbGxvdy1saXN0LlxuICpcbiAqIGBzaWduYWxgIGNhbmNlbHMgdGhlIHdob2xlIGNhbGwsIGluY2x1ZGluZyB0aGUgaW4tZmxpZ2h0IHNlcnZpbmcgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldlYlNlYXJjaChcbiAgcmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCxcbiAgcnVudGltZU9yQ29uZmlnOiBXZWJTZWFyY2hSdW50aW1lSW5wdXQsXG4gIGN0eDogV2ViU2VhcmNoQ29udGV4dCxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiB7XG4gIGNvbnN0IHJ1bnRpbWUgPSB0b1dlYlNlYXJjaFJ1bnRpbWUocnVudGltZU9yQ29uZmlnKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IGVuZHBvaW50ID0gYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaE1vZGVsKGN0eCwgcnVudGltZSwgcmVxdWVzdC5tb2RlbCk7XG5cbiAgaWYgKGVuZHBvaW50ID09PSBudWxsKSB7XG4gICAgLy8gTm8gbmF0aXZlIHdlYi1zZWFyY2ggbW9kZWwgZGVwbG95ZWQgaW4gdGhpcyB3b3Jrc3BhY2UuXG4gICAgaWYgKGNvbmZpZy5zY3JhcGVGYWxsYmFjaykge1xuICAgICAgbG9nZ2VyLmluZm8oXCJuby1uYXRpdmUtbW9kZWw6c2NyYXBlLWZhbGxiYWNrXCIsIHsgcXVlcnk6IHJlcXVlc3QucXVlcnkgfSk7XG4gICAgICByZXR1cm4gcnVuU2NyYXBlU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIHNpZ25hbCk7XG4gICAgfVxuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgXCJXZWItc2VhcmNoLWNhcGFibGUgc2VydmluZyBlbmRwb2ludFwiLFxuICAgICAgXCJObyBHUFQvR2VtaW5pIGVuZHBvaW50IGlzIGRlcGxveWVkIGluIHRoaXMgd29ya3NwYWNlIGFuZCB0aGUgc2NyYXBlIGZhbGxiYWNrIGlzIFwiICtcbiAgICAgICAgYGRpc2FibGVkLiBEZXBsb3kgYSBzdXBwb3J0ZWQgZW5kcG9pbnQsIHNldCBtb2RlbCBvciAke01PREVMX0VOVn0sIG9yIGVuYWJsZSB0aGUgYCArXG4gICAgICAgIFwiZmFsbGJhY2sgKFdFQl9TRUFSQ0hfU0NSQVBFX0ZBTExCQUNLPTEpLlwiLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcnVuU2VsZWN0ZWRXZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBlbmRwb2ludCwgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbn1cblxuLyoqIFJ1biBvbmUgc2VsZWN0ZWQgZmFtaWx5IGFmdGVyIGl0cyBmaXJzdCByZXF1ZXN0IGVzdGFibGlzaGVzIGF2YWlsYWJpbGl0eS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlbGVjdGVkV2ViU2VhcmNoKFxuICByZXF1ZXN0OiBXZWJTZWFyY2hSZXF1ZXN0LFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgd3JpdGVQcm9ncmVzcz86IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+IHtcbiAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpO1xuICBpZiAoIWZhbWlseSB8fCBydW50aW1lLmF2YWlsYWJsZUZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBydW5OYXRpdmVXZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBlbmRwb2ludCwgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHJ1blNlYXJjaEZhbGxiYWNrKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZW5kcG9pbnQsIGVycm9yLCBzaWduYWwsIHdyaXRlUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZVByb2JlID0gcnVudGltZS5mYW1pbHlQcm9iZXMuZ2V0KGZhbWlseSk7XG4gIGlmIChhY3RpdmVQcm9iZSkge1xuICAgIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICBhd2FpdCBhY3RpdmVQcm9iZTtcbiAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgcmV0dXJuIHJ1bldlYlNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBjdHgsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH1cblxuICBsZXQgcmVsZWFzZVByb2JlITogKCkgPT4gdm9pZDtcbiAgY29uc3QgcHJvYmUgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlbGVhc2VQcm9iZSA9IHJlc29sdmU7XG4gIH0pO1xuICBydW50aW1lLmZhbWlseVByb2Jlcy5zZXQoZmFtaWx5LCBwcm9iZSk7XG5cbiAgaWYgKHJ1bnRpbWUuYXZhaWxhYmxlRmFtaWxpZXMuaGFzKGZhbWlseSkgfHwgYWN0aXZlRmFtaWx5Q29vbGRvd25zKHJ1bnRpbWUpLmhhcyhmYW1pbHkpKSB7XG4gICAgcnVudGltZS5mYW1pbHlQcm9iZXMuZGVsZXRlKGZhbWlseSk7XG4gICAgcmVsZWFzZVByb2JlKCk7XG4gICAgcmV0dXJuIHJ1bldlYlNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBjdHgsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH1cblxuICBsZXQgZmFpbHVyZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5OYXRpdmVXZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBlbmRwb2ludCwgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbiAgICBydW50aW1lLmF2YWlsYWJsZUZhbWlsaWVzLmFkZChmYW1pbHkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZmFpbHVyZSA9IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChydW50aW1lLmZhbWlseVByb2Jlcy5nZXQoZmFtaWx5KSA9PT0gcHJvYmUpIHJ1bnRpbWUuZmFtaWx5UHJvYmVzLmRlbGV0ZShmYW1pbHkpO1xuICAgIHJlbGVhc2VQcm9iZSgpO1xuICB9XG4gIHJldHVybiBydW5TZWFyY2hGYWxsYmFjayhyZXF1ZXN0LCBydW50aW1lLCBjdHgsIGVuZHBvaW50LCBmYWlsdXJlLCBzaWduYWwsIHdyaXRlUHJvZ3Jlc3MpO1xufVxuXG4vKiogUmVzb2x2ZSBhIGNhY2hlZCBmYW1pbHkgZmFpbHVyZSB0byBhbm90aGVyIG1vZGVsIG9yIHRoZSBzY3JhcGUgZmFsbGJhY2suICovXG5hc3luYyBmdW5jdGlvbiBydW5TZWFyY2hGYWxsYmFjayhcbiAgcmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgY3R4OiBXZWJTZWFyY2hDb250ZXh0LFxuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgZXJyb3I6IHVua25vd24sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICB3cml0ZVByb2dyZXNzPzogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD4ge1xuICBpZiAoXG4gICAgZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpICE9PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgIWFjdGl2ZUZhbWlseUNvb2xkb3ducyhydW50aW1lKS5oYXMocG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSlcbiAgKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgY29uc3QgZmFsbGJhY2sgPSBhd2FpdCByZXNvbHZlV2ViU2VhcmNoTW9kZWwoY3R4LCBydW50aW1lLCByZXF1ZXN0Lm1vZGVsKTtcbiAgaWYgKCFmYWxsYmFjaykge1xuICAgIGlmIChydW50aW1lLmNvbmZpZy5zY3JhcGVGYWxsYmFjaykge1xuICAgICAgbG9nZ2VyLndhcm4oXCJ3ZWItc2VhcmNoLW1vZGVsLWZhbGxiYWNrXCIsIHtcbiAgICAgICAgZmFpbGVkTW9kZWw6IGVuZHBvaW50Lm5hbWUsXG4gICAgICAgIGZhbGxiYWNrOiBcInNjcmFwZVwiLFxuICAgICAgICByZWFzb246IFwiY3Jvc3MtcmVnaW9uLWRpc2FibGVkXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBydW5TY3JhcGVTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgc2lnbmFsKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgbG9nZ2VyLndhcm4oXCJ3ZWItc2VhcmNoLW1vZGVsLWZhbGxiYWNrXCIsIHtcbiAgICBmYWlsZWRNb2RlbDogZW5kcG9pbnQubmFtZSxcbiAgICBmYWxsYmFja01vZGVsOiBmYWxsYmFjay5uYW1lLFxuICAgIHJlYXNvbjogXCJjcm9zcy1yZWdpb24tZGlzYWJsZWRcIixcbiAgfSk7XG4gIHJldHVybiBydW5TZWxlY3RlZFdlYlNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBjdHgsIGZhbGxiYWNrLCBzaWduYWwsIHdyaXRlUHJvZ3Jlc3MpO1xufVxuXG4vKiogRXhlY3V0ZSBvbmUgbmF0aXZlIHByb3ZpZGVyIHJlcXVlc3QgYWdhaW5zdCBhbiBhbHJlYWR5LXNlbGVjdGVkIGVuZHBvaW50LiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuTmF0aXZlV2ViU2VhcmNoKFxuICByZXF1ZXN0OiBXZWJTZWFyY2hSZXF1ZXN0LFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgd3JpdGVQcm9ncmVzcz86IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IG1vZGVsSWQgPSBlbmRwb2ludC5uYW1lO1xuICBjb25zdCBwcm92aWRlciA9IHdlYlNlYXJjaFByb3ZpZGVyRm9yRmFtaWx5KFxuICAgIHBvbGljeS5tb2RlbEZhbWlseShlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lID8/IGVuZHBvaW50Lm5hbWUpLFxuICApO1xuICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBcIk5hdGl2ZSB3ZWItc2VhcmNoIHByb3ZpZGVyXCIsXG4gICAgICBgTW9kZWwgJHttb2RlbElkfSBoYXMgbm8gc3VwcG9ydGVkIHByb3ZpZGVyIGZhbWlseS5gLFxuICAgICk7XG4gIH1cbiAgY29uc3Qgc3BlYyA9IHdlYlNlYXJjaFRvb2xTcGVjKHByb3ZpZGVyLCBjb25maWcud2ViU2VhcmNoVG9vbHMpO1xuXG4gIGNvbnN0IHVybCA9XG4gICAgc3BlYy5hcGkgPT09IFwicmVzcG9uc2VzXCIgPyBpbnZva2UucmVzcG9uc2VzVXJsKGN0eC5ob3N0KSA6IGludm9rZS5jaGF0Q29tcGxldGlvbnNVcmwoY3R4Lmhvc3QpO1xuICBjb25zdCBib2R5ID1cbiAgICBzcGVjLmFwaSA9PT0gXCJyZXNwb25zZXNcIlxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3BlYy5yZXF1ZXN0LFxuICAgICAgICAgIG1vZGVsOiBtb2RlbElkLFxuICAgICAgICAgIGlucHV0OiBbeyByb2xlOiBcInVzZXJcIiwgY29udGVudDogcmVxdWVzdC5xdWVyeSB9XSxcbiAgICAgICAgICAuLi4od3JpdGVQcm9ncmVzcyA/IHsgc3RyZWFtOiB0cnVlIH0gOiB7fSksXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgIC4uLnNwZWMucmVxdWVzdCxcbiAgICAgICAgICBtb2RlbDogbW9kZWxJZCxcbiAgICAgICAgICBtZXNzYWdlczogW3sgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IHJlcXVlc3QucXVlcnkgfV0sXG4gICAgICAgIH07XG5cbiAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHBvc3RTZXJ2aW5nKFxuICAgIGN0eCxcbiAgICB1cmwsXG4gICAgYm9keSxcbiAgICBydW50aW1lLFxuICAgIFtcIndlYi1zZWFyY2hcIiwgXCJzZXJ2aW5nXCIsIHNwZWMuYXBpLCBtb2RlbElkLCByZXF1ZXN0LnF1ZXJ5XSxcbiAgICBzaWduYWwsXG4gICAgd3JpdGVQcm9ncmVzcyxcbiAgKTtcblxuICBjb25zdCB7IGFuc3dlciwgY2l0YXRpb25zIH0gPVxuICAgIHNwZWMuYXBpID09PSBcInJlc3BvbnNlc1wiID8gZnJvbVJlc3BvbnNlc1BheWxvYWQocGF5bG9hZCkgOiBmcm9tQ2hhdFBheWxvYWQocGF5bG9hZCk7XG5cbiAgY29uc3QgcGVybWl0dGVkID0gY2l0YXRpb25zLmZpbHRlcigoYykgPT4gY29uZmlnLmFsbG93TGlzdC5hbGxvd3MoYy51cmwpKTtcbiAgY29uc3QgZHJvcHBlZCA9IGNpdGF0aW9ucy5sZW5ndGggLSBwZXJtaXR0ZWQubGVuZ3RoO1xuICBjb25zdCB0cmltbWVkID0gcGVybWl0dGVkLnNsaWNlKDAsIGNvbmZpZy5tYXhDaXRhdGlvbnMpO1xuICBsb2dnZXIuZGVidWcoXCJzZWFyY2hlZFwiLCB7XG4gICAgcXVlcnk6IHJlcXVlc3QucXVlcnksXG4gICAgbW9kZWw6IG1vZGVsSWQsXG4gICAgcHJvdmlkZXIsXG4gICAgY2l0YXRpb25zOiBjaXRhdGlvbnMubGVuZ3RoLFxuICAgIC4uLihkcm9wcGVkID4gMCA/IHsgZmlsdGVyZWQ6IGRyb3BwZWQgfSA6IHt9KSxcbiAgICByZXR1cm5lZDogdHJpbW1lZC5sZW5ndGgsXG4gIH0pO1xuXG4gIHJldHVybiB7IHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5LCBhbnN3ZXIsIGNpdGF0aW9uczogdHJpbW1lZCwgbW9kZWw6IG1vZGVsSWQgfTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -27,12 +27,12 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@databricks/appkit": "0.81.0",
|
|
30
|
-
"@dbx-tools/appkit": "^0.9.
|
|
31
|
-
"@dbx-tools/core": "^0.9.
|
|
32
|
-
"@dbx-tools/model": "^0.9.
|
|
33
|
-
"@dbx-tools/path": "^0.9.
|
|
34
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
35
|
-
"@dbx-tools/shared-model": "^0.9.
|
|
30
|
+
"@dbx-tools/appkit": "^0.9.136",
|
|
31
|
+
"@dbx-tools/core": "^0.9.136",
|
|
32
|
+
"@dbx-tools/model": "^0.9.136",
|
|
33
|
+
"@dbx-tools/path": "^0.9.136",
|
|
34
|
+
"@dbx-tools/shared-core": "^0.9.136",
|
|
35
|
+
"@dbx-tools/shared-model": "^0.9.136",
|
|
36
36
|
"@mastra/core": "1.71.0",
|
|
37
37
|
"cheerio": "^1.2.0",
|
|
38
38
|
"entities": "^4.5.0",
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"./package.json": "./package.json"
|
|
107
107
|
}
|
|
108
108
|
},
|
|
109
|
-
"version": "0.9.
|
|
109
|
+
"version": "0.9.136",
|
|
110
110
|
"types": "./lib/index.d.ts",
|
|
111
111
|
"dbxToolsConfig": {
|
|
112
112
|
"tags": [
|
package/src/fetch.ts
CHANGED
|
@@ -20,10 +20,43 @@ import { gotScraping } from "got-scraping";
|
|
|
20
20
|
import { assertFetchUrlAllowed } from "./_fetch-url.ts";
|
|
21
21
|
import { toCallSettings, webFetchExecuteDefaults } from "./defaults.ts";
|
|
22
22
|
import { decodeHtmlEntities, htmlToText } from "./html-text.ts";
|
|
23
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
executeRead,
|
|
25
|
+
toWebSearchRuntime,
|
|
26
|
+
type WebSearchRuntime,
|
|
27
|
+
type WebSearchRuntimeInput,
|
|
28
|
+
} from "./runtime.ts";
|
|
24
29
|
import type { WebFetchRequest, WebFetchResult } from "./schema.ts";
|
|
25
30
|
|
|
26
31
|
const logger = log.logger("web-search/fetch");
|
|
32
|
+
const DEFAULT_IMAGE_MAX_BYTES = 5 * 1024 * 1024;
|
|
33
|
+
const DEFAULT_ASSET_PAGE_MAX_LENGTH = 1_500_000;
|
|
34
|
+
|
|
35
|
+
/** Input for a policy-checked HTML fetch used by in-process asset discovery. */
|
|
36
|
+
export interface WebAssetPageFetchRequest {
|
|
37
|
+
/** Public HTTPS page URL. */
|
|
38
|
+
url: string;
|
|
39
|
+
/** Maximum returned markup length. Defaults to 1.5 million characters. */
|
|
40
|
+
maxLength?: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Input for a policy-checked binary image fetch. */
|
|
44
|
+
export interface WebImageFetchRequest {
|
|
45
|
+
/** Public HTTPS image URL. */
|
|
46
|
+
url: string;
|
|
47
|
+
/** Maximum accepted response size. Defaults to 5 MiB. */
|
|
48
|
+
maxBytes?: number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Binary image fetched through the web-search runtime's URL policy. */
|
|
52
|
+
export interface WebImageFetchResult {
|
|
53
|
+
/** Final URL after redirects. */
|
|
54
|
+
url: string;
|
|
55
|
+
/** Image media type returned by the server. */
|
|
56
|
+
contentType: string;
|
|
57
|
+
/** Fetched image bytes. */
|
|
58
|
+
data: Uint8Array;
|
|
59
|
+
}
|
|
27
60
|
|
|
28
61
|
/** The slice of a got-scraping response this module reads. */
|
|
29
62
|
interface FetchedPage {
|
|
@@ -46,38 +79,26 @@ function truncate(text: string, max: number): { content: string; truncated: bool
|
|
|
46
79
|
return { content: text.slice(0, max), truncated: true };
|
|
47
80
|
}
|
|
48
81
|
|
|
49
|
-
/**
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
* correctable failure the design calls for on the fetch path). The request's
|
|
54
|
-
* `maxLength` narrows (never widens) the plugin's `fetchMaxLength` cap.
|
|
55
|
-
* `signal` cancels the in-flight fetch.
|
|
56
|
-
*/
|
|
57
|
-
export async function runWebFetch(
|
|
58
|
-
request: WebFetchRequest,
|
|
59
|
-
runtimeOrConfig: WebSearchRuntimeInput,
|
|
82
|
+
/** Fetch and cache one raw page before caller-specific output reduction. */
|
|
83
|
+
async function fetchPage(
|
|
84
|
+
requestUrl: string,
|
|
85
|
+
runtime: WebSearchRuntime,
|
|
60
86
|
signal?: AbortSignal,
|
|
61
|
-
): Promise<
|
|
62
|
-
const runtime = toWebSearchRuntime(runtimeOrConfig);
|
|
87
|
+
): Promise<FetchedPage> {
|
|
63
88
|
const { config } = runtime;
|
|
64
|
-
await assertFetchUrlAllowed(
|
|
65
|
-
const cap = Math.min(request.maxLength ?? config.fetchMaxLength, config.fetchMaxLength);
|
|
66
|
-
|
|
67
|
-
// The response is cached before the format reduction, so the same page read
|
|
68
|
-
// as text and as html shares one network round trip.
|
|
89
|
+
await assertFetchUrlAllowed(requestUrl, config.allowList);
|
|
69
90
|
const page = await executeRead(
|
|
70
91
|
runtime,
|
|
71
92
|
"page-fetch",
|
|
72
93
|
toCallSettings(webFetchExecuteDefaults, config.timeoutMs, [
|
|
73
94
|
"web-search",
|
|
74
95
|
"fetch",
|
|
75
|
-
|
|
96
|
+
requestUrl,
|
|
76
97
|
...config.allowList.patterns,
|
|
77
98
|
]),
|
|
78
99
|
async (executeSignal): Promise<FetchedPage> => {
|
|
79
100
|
const response = await gotScraping({
|
|
80
|
-
url:
|
|
101
|
+
url: requestUrl,
|
|
81
102
|
// Bun's node:http2 reports default-port origins with :443 while
|
|
82
103
|
// http2-wrapper compares them against URL-normalized origins.
|
|
83
104
|
http2: false,
|
|
@@ -96,7 +117,7 @@ export async function runWebFetch(
|
|
|
96
117
|
...(executeSignal ? { signal: executeSignal } : {}),
|
|
97
118
|
});
|
|
98
119
|
return {
|
|
99
|
-
url: response.url ??
|
|
120
|
+
url: response.url ?? requestUrl,
|
|
100
121
|
statusCode: response.statusCode,
|
|
101
122
|
contentType: response.headers["content-type"],
|
|
102
123
|
body: typeof response.body === "string" ? response.body : String(response.body ?? ""),
|
|
@@ -105,6 +126,26 @@ export async function runWebFetch(
|
|
|
105
126
|
signal,
|
|
106
127
|
);
|
|
107
128
|
await assertFetchUrlAllowed(page.url, config.allowList);
|
|
129
|
+
return page;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Fetch a single URL and return its content in the requested format.
|
|
134
|
+
*
|
|
135
|
+
* Throws when the URL is not permitted by the allow-list (the visible,
|
|
136
|
+
* correctable failure the design calls for on the fetch path). The request's
|
|
137
|
+
* `maxLength` narrows (never widens) the plugin's `fetchMaxLength` cap.
|
|
138
|
+
* `signal` cancels the in-flight fetch.
|
|
139
|
+
*/
|
|
140
|
+
export async function runWebFetch(
|
|
141
|
+
request: WebFetchRequest,
|
|
142
|
+
runtimeOrConfig: WebSearchRuntimeInput,
|
|
143
|
+
signal?: AbortSignal,
|
|
144
|
+
): Promise<WebFetchResult> {
|
|
145
|
+
const runtime = toWebSearchRuntime(runtimeOrConfig);
|
|
146
|
+
const { config } = runtime;
|
|
147
|
+
const cap = Math.min(request.maxLength ?? config.fetchMaxLength, config.fetchMaxLength);
|
|
148
|
+
const page = await fetchPage(request.url, runtime, signal);
|
|
108
149
|
|
|
109
150
|
const isHtml = !page.contentType || /html|xml/i.test(page.contentType);
|
|
110
151
|
const rawContent = request.format === "html" || !isHtml ? page.body : htmlToText(page.body);
|
|
@@ -128,3 +169,91 @@ export async function runWebFetch(
|
|
|
128
169
|
truncated,
|
|
129
170
|
};
|
|
130
171
|
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Fetch bounded raw markup for deterministic in-process asset discovery.
|
|
175
|
+
*
|
|
176
|
+
* This does not widen the model-facing `web_fetch` cap.
|
|
177
|
+
*/
|
|
178
|
+
export async function runWebAssetPageFetch(
|
|
179
|
+
request: WebAssetPageFetchRequest,
|
|
180
|
+
runtimeOrConfig: WebSearchRuntimeInput,
|
|
181
|
+
signal?: AbortSignal,
|
|
182
|
+
): Promise<WebFetchResult> {
|
|
183
|
+
const runtime = toWebSearchRuntime(runtimeOrConfig);
|
|
184
|
+
const cap = Math.min(
|
|
185
|
+
Math.max(1, request.maxLength ?? DEFAULT_ASSET_PAGE_MAX_LENGTH),
|
|
186
|
+
DEFAULT_ASSET_PAGE_MAX_LENGTH,
|
|
187
|
+
);
|
|
188
|
+
const page = await fetchPage(request.url, runtime, signal);
|
|
189
|
+
const { content, truncated } = truncate(page.body, cap);
|
|
190
|
+
const title = extractTitle(page.body);
|
|
191
|
+
return {
|
|
192
|
+
url: page.url,
|
|
193
|
+
status: page.statusCode,
|
|
194
|
+
...(page.contentType ? { contentType: page.contentType } : {}),
|
|
195
|
+
...(title ? { title } : {}),
|
|
196
|
+
content,
|
|
197
|
+
truncated,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/** Fetch one public image while preserving URL policy, timeout, and redirect checks. */
|
|
202
|
+
export async function runWebImageFetch(
|
|
203
|
+
request: WebImageFetchRequest,
|
|
204
|
+
runtimeOrConfig: WebSearchRuntimeInput,
|
|
205
|
+
signal?: AbortSignal,
|
|
206
|
+
): Promise<WebImageFetchResult> {
|
|
207
|
+
const runtime = toWebSearchRuntime(runtimeOrConfig);
|
|
208
|
+
const { config } = runtime;
|
|
209
|
+
const maxBytes = Math.max(1, request.maxBytes ?? DEFAULT_IMAGE_MAX_BYTES);
|
|
210
|
+
await assertFetchUrlAllowed(request.url, config.allowList);
|
|
211
|
+
const page = await executeRead(
|
|
212
|
+
runtime,
|
|
213
|
+
"image-fetch",
|
|
214
|
+
{
|
|
215
|
+
default: {
|
|
216
|
+
cache: { enabled: false },
|
|
217
|
+
retry: { enabled: true, attempts: 2 },
|
|
218
|
+
timeout: config.timeoutMs,
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
async (executeSignal) => {
|
|
222
|
+
const response = await gotScraping({
|
|
223
|
+
url: request.url,
|
|
224
|
+
responseType: "buffer",
|
|
225
|
+
http2: false,
|
|
226
|
+
timeout: { request: config.timeoutMs },
|
|
227
|
+
throwHttpErrors: true,
|
|
228
|
+
followRedirect: true,
|
|
229
|
+
hooks: {
|
|
230
|
+
beforeRequest: [
|
|
231
|
+
async (options) => {
|
|
232
|
+
await assertFetchUrlAllowed(String(options.url), config.allowList);
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
},
|
|
236
|
+
...(executeSignal ? { signal: executeSignal } : {}),
|
|
237
|
+
});
|
|
238
|
+
const contentType = String(response.headers["content-type"] ?? "")
|
|
239
|
+
.split(";")[0]!
|
|
240
|
+
.trim()
|
|
241
|
+
.toLowerCase();
|
|
242
|
+
if (!contentType.startsWith("image/")) {
|
|
243
|
+
throw new TypeError(`Expected an image response, received ${contentType || "unknown"}`);
|
|
244
|
+
}
|
|
245
|
+
if (response.body.byteLength > maxBytes) {
|
|
246
|
+
throw new RangeError(`Image response exceeds ${maxBytes} bytes`);
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
url: response.url ?? request.url,
|
|
250
|
+
contentType,
|
|
251
|
+
data: new Uint8Array(response.body),
|
|
252
|
+
};
|
|
253
|
+
},
|
|
254
|
+
signal,
|
|
255
|
+
false,
|
|
256
|
+
);
|
|
257
|
+
await assertFetchUrlAllowed(page.url, config.allowList);
|
|
258
|
+
return page;
|
|
259
|
+
}
|