@brainfish-ai/devdoc 0.1.46 → 0.1.47
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.
|
@@ -342,6 +342,17 @@ async function deploy(options) {
|
|
|
342
342
|
logger_1.logger.info('Bundling content...');
|
|
343
343
|
const files = await collectFiles(projectRoot);
|
|
344
344
|
logger_1.logger.success(`✓ Found ${files.length} content files`);
|
|
345
|
+
// Collect theme.json
|
|
346
|
+
const themeJson = collectThemeJson(projectRoot);
|
|
347
|
+
if (themeJson) {
|
|
348
|
+
logger_1.logger.success('✓ Found theme.json');
|
|
349
|
+
}
|
|
350
|
+
// Collect OpenAPI specs based on docs.json navigation
|
|
351
|
+
const openApiSpecs = await collectOpenApiSpecs(projectRoot, config);
|
|
352
|
+
const specCount = Object.keys(openApiSpecs).length;
|
|
353
|
+
if (specCount > 0) {
|
|
354
|
+
logger_1.logger.success(`✓ Found ${specCount} OpenAPI spec(s)`);
|
|
355
|
+
}
|
|
345
356
|
// Collect binary assets
|
|
346
357
|
const assets = await collectAssets(projectRoot);
|
|
347
358
|
if (assets.length > 0) {
|
|
@@ -388,6 +399,8 @@ async function deploy(options) {
|
|
|
388
399
|
name: config.name || 'My Documentation',
|
|
389
400
|
slug: existingSlug,
|
|
390
401
|
docsJson: config,
|
|
402
|
+
themeJson,
|
|
403
|
+
openApiSpecs,
|
|
391
404
|
files,
|
|
392
405
|
apiKey, // Also send in body as fallback
|
|
393
406
|
}),
|
|
@@ -444,6 +457,81 @@ async function deploy(options) {
|
|
|
444
457
|
process.exit(1);
|
|
445
458
|
}
|
|
446
459
|
}
|
|
460
|
+
/**
|
|
461
|
+
* Collect OpenAPI specs based on docs.json navigation tabs
|
|
462
|
+
*/
|
|
463
|
+
async function collectOpenApiSpecs(projectRoot, docsJson) {
|
|
464
|
+
const specs = {};
|
|
465
|
+
// Get navigation from docs.json - could be object with tabs or array
|
|
466
|
+
const navigation = docsJson.navigation;
|
|
467
|
+
if (!navigation)
|
|
468
|
+
return specs;
|
|
469
|
+
// Handle both { tabs: [...] } and direct array formats
|
|
470
|
+
const tabs = Array.isArray(navigation) ? navigation : (navigation.tabs || []);
|
|
471
|
+
for (const item of tabs) {
|
|
472
|
+
// Check if this is an OpenAPI tab
|
|
473
|
+
if (item.type === 'openapi') {
|
|
474
|
+
// Spec can be directly on tab or nested in versions array
|
|
475
|
+
const versions = item.versions;
|
|
476
|
+
if (versions && Array.isArray(versions)) {
|
|
477
|
+
// Handle versioned specs
|
|
478
|
+
for (const version of versions) {
|
|
479
|
+
if (version.spec) {
|
|
480
|
+
await loadSpec(projectRoot, version.spec, specs);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
else if (item.spec) {
|
|
485
|
+
// Handle direct spec reference
|
|
486
|
+
await loadSpec(projectRoot, item.spec, specs);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return specs;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Load a single OpenAPI spec into the specs map
|
|
494
|
+
*/
|
|
495
|
+
async function loadSpec(projectRoot, specPath, specs) {
|
|
496
|
+
// Resolve the spec path relative to project root
|
|
497
|
+
let fullSpecPath = path_1.default.join(projectRoot, specPath);
|
|
498
|
+
// Handle relative paths like ./facebook/openapi.json
|
|
499
|
+
if (specPath.startsWith('./')) {
|
|
500
|
+
fullSpecPath = path_1.default.join(projectRoot, specPath.slice(2));
|
|
501
|
+
}
|
|
502
|
+
if (fs_extra_1.default.existsSync(fullSpecPath)) {
|
|
503
|
+
try {
|
|
504
|
+
const specContent = fs_extra_1.default.readFileSync(fullSpecPath, 'utf-8');
|
|
505
|
+
const specData = JSON.parse(specContent);
|
|
506
|
+
specs[specPath] = specData;
|
|
507
|
+
logger_1.logger.info(` → ${specPath}`);
|
|
508
|
+
}
|
|
509
|
+
catch (error) {
|
|
510
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
511
|
+
logger_1.logger.warn(`Failed to parse OpenAPI spec ${specPath}: ${message}`);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
logger_1.logger.warn(`OpenAPI spec file not found: ${specPath}`);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Collect theme.json if it exists
|
|
520
|
+
*/
|
|
521
|
+
function collectThemeJson(projectRoot) {
|
|
522
|
+
const themePath = path_1.default.join(projectRoot, 'theme.json');
|
|
523
|
+
if (fs_extra_1.default.existsSync(themePath)) {
|
|
524
|
+
try {
|
|
525
|
+
const themeContent = fs_extra_1.default.readFileSync(themePath, 'utf-8');
|
|
526
|
+
return JSON.parse(themeContent);
|
|
527
|
+
}
|
|
528
|
+
catch (error) {
|
|
529
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
530
|
+
logger_1.logger.warn(`Failed to parse theme.json: ${message}`);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
return undefined;
|
|
534
|
+
}
|
|
447
535
|
/**
|
|
448
536
|
* Collect all MDX and content files from the project
|
|
449
537
|
*/
|
|
@@ -594,19 +682,25 @@ async function uploadAssets(assets, apiUrl, slug, apiKey) {
|
|
|
594
682
|
process.stdout.write(` ${fileName}: `);
|
|
595
683
|
try {
|
|
596
684
|
const result = await uploadAssetWithProgress(asset, apiUrl, slug, apiKey, (progress, loaded, total) => {
|
|
685
|
+
if (process.stdout.isTTY) {
|
|
686
|
+
process.stdout.clearLine(0);
|
|
687
|
+
process.stdout.cursorTo(0);
|
|
688
|
+
process.stdout.write(` ${fileName}: ${createProgressBar(progress)} ${formatSize(loaded)}/${formatSize(total)}`);
|
|
689
|
+
}
|
|
690
|
+
});
|
|
691
|
+
if (process.stdout.isTTY) {
|
|
597
692
|
process.stdout.clearLine(0);
|
|
598
693
|
process.stdout.cursorTo(0);
|
|
599
|
-
|
|
600
|
-
});
|
|
601
|
-
process.stdout.clearLine(0);
|
|
602
|
-
process.stdout.cursorTo(0);
|
|
694
|
+
}
|
|
603
695
|
console.log(` ${logger_1.logger.green('✓')} ${fileName} (${formatSize(asset.size)})`);
|
|
604
696
|
results.push({ file: fileName, success: true, url: result.url });
|
|
605
697
|
}
|
|
606
698
|
catch (error) {
|
|
607
699
|
const message = error instanceof Error ? error.message : String(error);
|
|
608
|
-
process.stdout.
|
|
609
|
-
|
|
700
|
+
if (process.stdout.isTTY) {
|
|
701
|
+
process.stdout.clearLine(0);
|
|
702
|
+
process.stdout.cursorTo(0);
|
|
703
|
+
}
|
|
610
704
|
console.log(` ${logger_1.logger.red('✗')} ${fileName}: ${message}`);
|
|
611
705
|
results.push({ file: fileName, success: false, error: message });
|
|
612
706
|
}
|
|
@@ -704,4 +798,4 @@ function createProgressBar(progress, width = 30) {
|
|
|
704
798
|
const percentage = Math.round(progress * 100);
|
|
705
799
|
return `[${bar}] ${percentage}%`;
|
|
706
800
|
}
|
|
707
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9kZXBsb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnUUEsd0JBNFJDO0FBNWhCRCxnREFBdUI7QUFDdkIsd0RBQXlCO0FBQ3pCLHlDQUF5RDtBQUN6RCwrQ0FBMkM7QUFDM0MsK0NBQWlEO0FBRWpELHVCQUF1QjtBQUN2QixNQUFNLGNBQWMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtBQUV2QywrQ0FBK0M7QUFDL0MsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU07SUFDaEQsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNO0lBQ3ZCLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUN0QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUN6QyxNQUFNO0NBQ1AsQ0FBQTtBQUVELG9DQUFvQztBQUNwQyxNQUFNLFVBQVUsR0FBMkI7SUFDekMsU0FBUztJQUNULE1BQU0sRUFBRSxXQUFXO0lBQ25CLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLFNBQVM7SUFDVCxNQUFNLEVBQUUsV0FBVztJQUNuQixPQUFPLEVBQUUsWUFBWTtJQUNyQixNQUFNLEVBQUUsaUJBQWlCO0lBQ3pCLFFBQVE7SUFDUixNQUFNLEVBQUUsWUFBWTtJQUNwQixNQUFNLEVBQUUsV0FBVztJQUNuQixNQUFNLEVBQUUsV0FBVztJQUNuQixRQUFRO0lBQ1IsT0FBTyxFQUFFLFdB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QUMsQ0FBQTtJQUNsRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQTtJQUM3QyxPQUFPLElBQUksR0FBRyxLQUFLLFVBQVUsR0FBRyxDQUFBO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHsgbG9hZENvbmZpZywgdmFsaWRhdGVDb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInXG5pbXBvcnQgeyBERUZBVUxUX0FQSV9VUkwgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnXG5cbi8vIE1heCBhc3NldCBzaXplOiAyNU1CXG5jb25zdCBNQVhfQVNTRVRfU0laRSA9IDI1ICogMTAyNCAqIDEwMjRcblxuLy8gQmluYXJ5IGFzc2V0IGV4dGVuc2lvbnMgdG8gdXBsb2FkIHNlcGFyYXRlbHlcbmNvbnN0IEJJTkFSWV9FWFRFTlNJT05TID0gW1xuICAnLnBuZycsICcuanBnJywgJy5qcGVnJywgJy5naWYnLCAnLndlYnAnLCAnLmljbycsXG4gICcubXA0JywgJy53ZWJtJywgJy5tb3YnLFxuICAnLm1wMycsICcud2F2JywgJy5vZ2cnLFxuICAnLndvZmYnLCAnLndvZmYyJywgJy50dGYnLCAnLm90ZicsICcuZW90JyxcbiAgJy5wZGYnLFxuXVxuXG4vLyBNYXAgZmlsZSBleHRlbnNpb25zIHRvIE1JTUUgdHlwZXNcbmNvbnN0IE1JTUVfVFlQRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIC8vIEltYWdlc1xuICAnLnBuZyc6ICdpbWFnZS9wbmcnLFxuICAnLmpwZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmdpZic6ICdpbWFnZS9naWYnLFxuICAnLndlYnAnOiAnaW1hZ2Uvd2VicCcsXG4gICcuaWNvJzogJ2ltYWdlL3gtaWNvbicsXG4gICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAvLyBWaWRlb3NcbiAgJy5tcDQnOiAndmlkZW8vbXA0JyxcbiAgJy53ZWJtJzogJ3ZpZGVvL3dlYm0nLFxuICAnLm1vdic6ICd2aWRlby9xdWlja3RpbWUnLFxuICAvLyBBdWRpb1xuICAnLm1wMyc6ICdhdWRpby9tcGVnJyxcbiAgJy53YXYnOiAnYXVkaW8vd2F2JyxcbiAgJy5vZ2cnOiAnYXVkaW8vb2dnJyxcbiAgLy8gRm9udHNcbiAgJy53b2ZmJzogJ2ZvbnQvd29mZicsXG4gICcud29mZjInOiAnZm9udC93b2ZmMicsXG4gICcudHRmJzogJ2ZvbnQvdHRmJyxcbiAgJy5vdGYnOiAnZm9udC9vdGYnLFxuICAnLmVvdCc6ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsXG4gIC8vIERvY3VtZW50c1xuICAnLnBkZic6ICdhcHBsaWNhdGlvbi9wZGYnLFxufVxuXG4vKipcbiAqIEdldCBNSU1FIHR5cGUgZnJvbSBmaWxlIGV4dGVuc2lvblxuICovXG5mdW5jdGlvbiBnZXRNaW1lVHlwZShmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpXG4gIHJldHVybiBNSU1FX1RZUEVTW2V4dF0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbn1cblxuaW50ZXJmYWNlIERlcGxveU9wdGlvbnMge1xuICB1cmw/OiBzdHJpbmdcbiAgYXBpS2V5Pzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBQcm9qZWN0RmlsZSB7XG4gIHBhdGg6IHN0cmluZ1xuICBjb250ZW50OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIEFzc2V0RmlsZSB7XG4gIHBhdGg6IHN0cmluZ1xuICBmdWxsUGF0aDogc3RyaW5nXG4gIHNpemU6IG51bWJlclxufVxuXG5pbnRlcmZhY2UgRGV2RG9jQ29uZmlnIHtcbiAgcHJvamVjdElkPzogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgc2x1Zz86IHN0cmluZ1xuICBzdWJkb21haW4/OiBzdHJpbmdcbiAgYXBpS2V5Pzogc3RyaW5nXG4gIHVybD86IHN0cmluZ1xuICBsYXN0RGVwbG95ZWQ/OiBzdHJpbmdcbiAgY3JlYXRlZEF0Pzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBSZWdpc3RlclJlc3BvbnNlIHtcbiAgc3VjY2VzczogYm9vbGVhblxuICBwcm9qZWN0SWQ6IHN0cmluZ1xuICBzbHVnOiBzdHJpbmdcbiAgc3ViZG9tYWluOiBzdHJpbmdcbiAgYXBpS2V5OiBzdHJpbmdcbiAgdXJsOiBzdHJpbmdcbiAgZXJyb3I/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIENoZWNrU3ViZG9tYWluUmVzcG9uc2Uge1xuICBhdmFpbGFibGU6IGJvb2xlYW5cbiAgZXJyb3I/OiBzdHJpbmdcbiAgc3VnZ2VzdGlvbj86IHN0cmluZ1xufVxuXG4vLyBTaW1wbGUgcHJvbXB0IGhlbHBlciB1c2luZyByZWFkbGluZVxuYXN5bmMgZnVuY3Rpb24gcHJvbXB0KHF1ZXN0aW9uOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHJlYWRsaW5lID0gYXdhaXQgaW1wb3J0KCdyZWFkbGluZScpXG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRIaW50ID0gZGVmYXVsdFZhbHVlID8gYCAoJHtkZWZhdWx0VmFsdWV9KWAgOiAnJ1xuICAgIHJsLnF1ZXN0aW9uKGAke3F1ZXN0aW9ufSR7ZGVmYXVsdEhpbnR9OiBgLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpXG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkgfHwgZGVmYXVsdFZhbHVlIHx8ICcnKVxuICAgIH0pXG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2sgc3ViZG9tYWluIGF2YWlsYWJpbGl0eSB2aWEgQVBJXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrU3ViZG9tYWluQXZhaWxhYmlsaXR5KFxuICBzdWJkb21haW46IHN0cmluZyxcbiAgYXBpVXJsOiBzdHJpbmdcbik6IFByb21pc2U8Q2hlY2tTdWJkb21haW5SZXNwb25zZT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS9hcGkvc3ViZG9tYWlucy9jaGVja2AsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc3ViZG9tYWluIH0pLFxuICAgIH0pXG4gICAgXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENoZWNrU3ViZG9tYWluUmVzcG9uc2VcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIEFQSSBpcyB1bmF2YWlsYWJsZSwgYXNzdW1lIGF2YWlsYWJsZSAod2lsbCBmYWlsIGF0IHJlZ2lzdHJhdGlvbiBpZiBub3QpXG4gICAgcmV0dXJuIHsgYXZhaWxhYmxlOiB0cnVlIH1cbiAgfVxufVxuXG4vKipcbiAqIEJhc2ljIHN1YmRvbWFpbiBmb3JtYXQgdmFsaWRhdGlvblxuICovXG5mdW5jdGlvbiBpc1ZhbGlkU3ViZG9tYWluRm9ybWF0KHN1YmRvbWFpbjogc3RyaW5nKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gIGlmICghc3ViZG9tYWluKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBpcyByZXF1aXJlZCcgfVxuICB9XG4gIFxuICBpZiAoc3ViZG9tYWluLmxlbmd0aCA8IDMpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3QgYmUgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzJyB9XG4gIH1cbiAgXG4gIGlmIChzdWJkb21haW4ubGVuZ3RoID4gNjMpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3QgYmUgNjMgY2hhcmFjdGVycyBvciBsZXNzJyB9XG4gIH1cbiAgXG4gIGlmICghL15bYS16MC05XShbYS16MC05LV0qW2EtejAtOV0pPyQvLnRlc3Qoc3ViZG9tYWluKSkge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gbXVzdCBzdGFydCBhbmQgZW5kIHdpdGggYWxwaGFudW1lcmljLCBjYW4gY29udGFpbiBoeXBoZW5zJyB9XG4gIH1cbiAgXG4gIGlmICgvLS0vLnRlc3Qoc3ViZG9tYWluKSkge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gY2Fubm90IGNvbnRhaW4gY29uc2VjdXRpdmUgaHlwaGVucycgfVxuICB9XG4gIFxuICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9XG59XG5cbmludGVyZmFjZSBEb21haW5Db25maWcge1xuICBjdXN0b21Eb21haW46IHN0cmluZ1xuICBzZW8/OiB7XG4gICAgY2Fub25pY2FsPzogc3RyaW5nXG4gIH1cbn1cblxuaW50ZXJmYWNlIERvbWFpblN0YXR1c1Jlc3BvbnNlIHtcbiAgaGFzQ3VzdG9tRG9tYWluOiBib29sZWFuXG4gIGRvbWFpbj86IHN0cmluZ1xuICBzdGF0dXM/OiBzdHJpbmdcbiAgY3VzdG9tVXJsPzogc3RyaW5nXG4gIG1lc3NhZ2U/OiBzdHJpbmdcbiAgbmV4dFN0ZXA/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBDaGVjayBmb3IgZG9tYWluLmpzb24gYW5kIGRpc3BsYXkgY3VzdG9tIGRvbWFpbiBzdGF0dXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tDdXN0b21Eb21haW5TdGF0dXMoXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIGFwaVVybDogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIENoZWNrIGlmIGRvbWFpbi5qc29uIGV4aXN0c1xuICBjb25zdCBkb21haW5Db25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCAnZG9tYWluLmpzb24nKVxuICBcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRvbWFpbkNvbmZpZ1BhdGgpKSB7XG4gICAgcmV0dXJuIC8vIE5vIGRvbWFpbi5qc29uLCBub3RoaW5nIHRvIGRvXG4gIH1cbiAgXG4gIGxldCBkb21haW5Db25maWc6IERvbWFpbkNvbmZpZ1xuICB0cnkge1xuICAgIGRvbWFpbkNvbmZpZyA9IGZzLnJlYWRKc29uU3luYyhkb21haW5Db25maWdQYXRoKSBhcyBEb21haW5Db25maWdcbiAgfSBjYXRjaCB7XG4gICAgbG9nZ2VyLndhcm4oJ0ZvdW5kIGRvbWFpbi5qc29uIGJ1dCBmYWlsZWQgdG8gcGFyc2UgaXQnKVxuICAgIHJldHVyblxuICB9XG4gIFxuICBpZiAoIWRvbWFpbkNvbmZpZy5jdXN0b21Eb21haW4pIHtcbiAgICByZXR1cm5cbiAgfVxuICBcbiAgY29uc29sZS5sb2coJycpXG4gIGxvZ2dlci5pbmZvKGBDdXN0b20gZG9tYWluIGNvbmZpZ3VyZWQ6ICR7ZG9tYWluQ29uZmlnLmN1c3RvbURvbWFpbn1gKVxuICBcbiAgLy8gQ2hlY2sgZG9tYWluIHN0YXR1cyB2aWEgQVBJXG4gIGlmICghYXBpS2V5KSB7XG4gICAgbG9nZ2VyLmluZm8oJ1J1biBcImRldmRvYyBkb21haW4gc3RhdHVzXCIgdG8gY2hlY2sgRE5TIGNvbmZpZ3VyYXRpb24nKVxuICAgIHJldHVyblxuICB9XG4gIFxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS9hcGkvZG9tYWlucy9zdGF0dXNgLCB7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHthcGlLZXl9YCxcbiAgICAgIH0sXG4gICAgfSlcbiAgICBcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgXG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIERvbWFpblN0YXR1c1Jlc3BvbnNlXG4gICAgXG4gICAgaWYgKCFzdGF0dXMuaGFzQ3VzdG9tRG9tYWluKSB7XG4gICAgICAvLyBEb21haW4gaW4gY29uZmlnIGJ1dCBub3QgcmVnaXN0ZXJlZCB5ZXRcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgbG9nZ2VyLmluZm8oJ0N1c3RvbSBkb21haW4gbm90IHlldCByZWdpc3RlcmVkLicpXG4gICAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGRvbWFpbiBhZGQgJyArIGRvbWFpbkNvbmZpZy5jdXN0b21Eb21haW4gKyAnXCIgdG8gc2V0IGl0IHVwJylcbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5zdGF0dXMgPT09ICdhY3RpdmUnKSB7XG4gICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgIGNvbnNvbGUubG9nKGAgIEFsc28gbGl2ZSBhdDogJHtsb2dnZXIuY3lhbihzdGF0dXMuY3VzdG9tVXJsIHx8IGBodHRwczovLyR7c3RhdHVzLmRvbWFpbn1gKX1gKVxuICAgIH0gZWxzZSBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgIGxvZ2dlci53YXJuKCdDdXN0b20gZG9tYWluIHBlbmRpbmcgRE5TIGNvbmZpZ3VyYXRpb24nKVxuICAgICAgbG9nZ2VyLmluZm8oJ1J1biBcImRldmRvYyBkb21haW4gc3RhdHVzXCIgZm9yIEROUyBzZXR1cCBpbnN0cnVjdGlvbnMnKVxuICAgIH0gZWxzZSBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gJ2Ruc192ZXJpZmllZCcgfHwgc3RhdHVzLnN0YXR1cyA9PT0gJ3NzbF9wcm92aXNpb25pbmcnKSB7XG4gICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgIGxvZ2dlci5pbmZvKCdDdXN0b20gZG9tYWluIEROUyB2ZXJpZmllZCwgU1NMIGNlcnRpZmljYXRlIHByb3Zpc2lvbmluZy4uLicpXG4gICAgfVxuICAgIFxuICB9IGNhdGNoIHtcbiAgICAvLyBJZ25vcmUgZXJyb3JzLCBkb21haW4gc3RhdHVzIGlzIGluZm9ybWF0aW9uYWxcbiAgfVxufVxuXG4vKipcbiAqIERlcGxveSBkb2N1bWVudGF0aW9uIHRvIERldkRvYyBwbGF0Zm9ybVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVwbG95KG9wdGlvbnM6IERlcGxveU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9jZXNzLmN3ZCgpXG4gIGNvbnN0IGFwaVVybCA9IG9wdGlvbnMudXJsIHx8IHByb2Nlc3MuZW52LkRFVkRPQ19BUElfVVJMIHx8IERFRkFVTFRfQVBJX1VSTFxuICBcbiAgbG9nZ2VyLmluZm8oJ0RlcGxveWluZyB0byBEZXZEb2MuLi5cXG4nKVxuICBcbiAgLy8gQ2hlY2sgZm9yIGRvY3MuanNvblxuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCAnZG9jcy5qc29uJylcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdkb2NzLmpzb24gbm90IGZvdW5kIGluIGN1cnJlbnQgZGlyZWN0b3J5JylcbiAgICBsb2dnZXIuaW5mbygnTWFrZSBzdXJlIHlvdSBhcmUgaW4gYSBEZXZEb2MgZG9jdW1lbnRhdGlvbiBwcm9qZWN0IGRpcmVjdG9yeScpXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbiAgXG4gIC8vIExvYWQgYW5kIHZhbGlkYXRlIGNvbmZpZ3VyYXRpb25cbiAgbGV0IGNvbmZpZzogUmV0dXJuVHlwZTx0eXBlb2YgbG9hZENvbmZpZz4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIFQ+ID8gVCA6IG5ldmVyXG4gIHRyeSB7XG4gICAgY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhwcm9qZWN0Um9vdClcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVDb25maWcoY29uZmlnKVxuICAgIFxuICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdJbnZhbGlkIGRvY3MuanNvbiBjb25maWd1cmF0aW9uOicpXG4gICAgICB2YWxpZGF0aW9uLmVycm9ycy5mb3JFYWNoKGVyciA9PiBsb2dnZXIuZXJyb3IoYCAgLSAke2Vycn1gKSlcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cbiAgICBcbiAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTIENvbmZpZ3VyYXRpb24gdmFsaWQ6ICR7Y29uZmlnLm5hbWUgfHwgJ1VudGl0bGVkJ31gKVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGNvbmZpZ3VyYXRpb246ICR7bWVzc2FnZX1gKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG4gIFxuICAvLyBDaGVjayBmb3IgZXhpc3RpbmcgcHJvamVjdCBjb25maWdcbiAgY29uc3QgZGV2ZG9jQ29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJy5kZXZkb2MuanNvbicpXG4gIGxldCBkZXZkb2NDb25maWc6IERldkRvY0NvbmZpZyB8IG51bGwgPSBudWxsXG4gIGxldCBleGlzdGluZ1NsdWc6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIGxldCBleGlzdGluZ0FwaUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IGV4aXN0aW5nU3ViZG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGV2ZG9jQ29uZmlnUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgZGV2ZG9jQ29uZmlnID0gZnMucmVhZEpzb25TeW5jKGRldmRvY0NvbmZpZ1BhdGgpIGFzIERldkRvY0NvbmZpZ1xuICAgICAgZXhpc3RpbmdTbHVnID0gZGV2ZG9jQ29uZmlnLnNsdWcgfHwgbnVsbFxuICAgICAgZXhpc3RpbmdBcGlLZXkgPSBkZXZkb2NDb25maWcuYXBpS2V5IHx8IG51bGxcbiAgICAgIGV4aXN0aW5nU3ViZG9tYWluID0gZGV2ZG9jQ29uZmlnLnN1YmRvbWFpbiB8fCBudWxsXG4gICAgICBpZiAoZXhpc3RpbmdTbHVnICYmIGV4aXN0aW5nQXBpS2V5KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBEZXBsb3lpbmcgcHJvamVjdDogJHtleGlzdGluZ1NsdWd9YClcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElnbm9yZSBlcnJvcnMgcmVhZGluZyAuZGV2ZG9jLmpzb25cbiAgICB9XG4gIH1cbiAgXG4gIC8vIEdldCBBUEkga2V5IGZyb20gb3B0aW9ucywgZW52IHZhciwgb3IgLmRldmRvYy5qc29uXG4gIGxldCBhcGlLZXkgPSBvcHRpb25zLmFwaUtleSB8fCBwcm9jZXNzLmVudi5ERVZET0NfQVBJX0tFWSB8fCBleGlzdGluZ0FwaUtleVxuICBcbiAgLy8gSWYgbm8gQVBJIGtleSwgdGhpcyBpcyBhIGZpcnN0IGRlcGxveSAtIG5lZWQgdG8gcmVnaXN0ZXIgdGhlIHN1YmRvbWFpbiBmaXJzdFxuICBpZiAoIWFwaUtleSkge1xuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgc3ViZG9tYWluIGZyb20gaW5pdFxuICAgIGlmICghZXhpc3RpbmdTdWJkb21haW4pIHtcbiAgICAgIGxvZ2dlci5lcnJvcignTm8gcHJvamVjdCBjb25maWd1cmF0aW9uIGZvdW5kLicpXG4gICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgIGxvZ2dlci5pbmZvKCdSdW4gXCJkZXZkb2MgaW5pdFwiIGZpcnN0IHRvIGNvbmZpZ3VyZSB5b3VyIHByb2plY3QnKVxuICAgICAgbG9nZ2VyLmluZm8oJ09yIHByb3ZpZGUgYW4gQVBJIGtleSB2aWEgLS1hcGkta2V5IGZsYWcgb3IgREVWRE9DX0FQSV9LRVkgZW52IHZhcicpXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9XG4gICAgXG4gICAgbGV0IHN1YmRvbWFpblRvUmVnaXN0ZXIgPSBleGlzdGluZ1N1YmRvbWFpblxuICAgIGxldCByZWdpc3RlcmVkID0gZmFsc2VcbiAgICBcbiAgICAvLyBMb29wIHVudGlsIHdlIHN1Y2Nlc3NmdWxseSByZWdpc3RlciBhIHN1YmRvbWFpblxuICAgIHdoaWxlICghcmVnaXN0ZXJlZCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFJlZ2lzdGVyaW5nIHN1YmRvbWFpbiAke3N1YmRvbWFpblRvUmVnaXN0ZXJ9LmRldmRvYy5zaC4uLmApXG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9wcm9qZWN0cy9yZWdpc3RlcmAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgbmFtZTogZGV2ZG9jQ29uZmlnPy5uYW1lIHx8IGNvbmZpZy5uYW1lIHx8ICdNeSBEb2N1bWVudGF0aW9uJyxcbiAgICAgICAgICAgIHNsdWc6IHN1YmRvbWFpblRvUmVnaXN0ZXIsXG4gICAgICAgICAgICBzdWJkb21haW46IHN1YmRvbWFpblRvUmVnaXN0ZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pXG4gICAgICAgIFxuICAgICAgICBpZiAoIXJlZ2lzdGVyUmVzcG9uc2Uub2spIHtcbiAgICAgICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByZWdpc3RlclJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBlcnJvcjogJ1Vua25vd24gZXJyb3InIH0pKSBhcyB7IGVycm9yPzogc3RyaW5nOyBkZXRhaWxzPzogc3RyaW5nIH1cbiAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvckRhdGEuZXJyb3IgfHwgYEhUVFAgJHtyZWdpc3RlclJlc3BvbnNlLnN0YXR1c31gXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gSWYgc3ViZG9tYWluIGlzIHRha2VuLCBhc2sgZm9yIGEgbmV3IG9uZVxuICAgICAgICAgIGlmIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykgfHwgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdhbHJlYWR5IHRha2VuJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFN1YmRvbWFpbiBcIiR7c3ViZG9tYWluVG9SZWdpc3Rlcn1cIiBpcyBubyBsb25nZXIgYXZhaWxhYmxlLmApXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEdldCBzdWdnZXN0aW9uIGZyb20gQVBJXG4gICAgICAgICAgICBjb25zdCBhdmFpbGFiaWxpdHkgPSBhd2FpdCBjaGVja1N1YmRvbWFpbkF2YWlsYWJpbGl0eShzdWJkb21haW5Ub1JlZ2lzdGVyLCBhcGlVcmwpXG4gICAgICAgICAgICBjb25zdCBzdWdnZXN0aW9uID0gYXZhaWxhYmlsaXR5LnN1Z2dlc3Rpb24gfHwgYCR7c3ViZG9tYWluVG9SZWdpc3Rlcn0tZG9jc2BcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgU3VnZ2VzdGlvbjogJHtzdWdnZXN0aW9ufS5kZXZkb2Muc2hgKVxuICAgICAgICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFByb21wdCBmb3IgbmV3IHN1YmRvbWFpblxuICAgICAgICAgICAgbGV0IG5ld1N1YmRvbWFpbiA9IGF3YWl0IHByb21wdCgnRW50ZXIgYSBuZXcgc3ViZG9tYWluJywgc3VnZ2VzdGlvbilcbiAgICAgICAgICAgIG5ld1N1YmRvbWFpbiA9IG5ld1N1YmRvbWFpbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJylcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgZm9ybWF0XG4gICAgICAgICAgICBjb25zdCBmb3JtYXRDaGVjayA9IGlzVmFsaWRTdWJkb21haW5Gb3JtYXQobmV3U3ViZG9tYWluKVxuICAgICAgICAgICAgaWYgKCFmb3JtYXRDaGVjay52YWxpZCkge1xuICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZm9ybWF0Q2hlY2suZXJyb3IhKVxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBzdWJkb21haW5Ub1JlZ2lzdGVyID0gbmV3U3ViZG9tYWluXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyUmVzdWx0ID0gYXdhaXQgcmVnaXN0ZXJSZXNwb25zZS5qc29uKCkgYXMgUmVnaXN0ZXJSZXNwb25zZVxuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGxvY2FsIGNvbmZpZyB3aXRoIEFQSSBrZXlcbiAgICAgICAgYXBpS2V5ID0gcmVnaXN0ZXJSZXN1bHQuYXBpS2V5XG4gICAgICAgIGV4aXN0aW5nU2x1ZyA9IHJlZ2lzdGVyUmVzdWx0LnNsdWdcbiAgICAgICAgZXhpc3RpbmdTdWJkb21haW4gPSByZWdpc3RlclJlc3VsdC5zdWJkb21haW5cbiAgICAgICAgXG4gICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgY29uZmlnXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRDb25maWc6IERldkRvY0NvbmZpZyA9IHtcbiAgICAgICAgICAuLi5kZXZkb2NDb25maWcsXG4gICAgICAgICAgcHJvamVjdElkOiByZWdpc3RlclJlc3VsdC5wcm9qZWN0SWQsXG4gICAgICAgICAgc2x1ZzogcmVnaXN0ZXJSZXN1bHQuc2x1ZyxcbiAgICAgICAgICBzdWJkb21haW46IHJlZ2lzdGVyUmVzdWx0LnN1YmRvbWFpbixcbiAgICAgICAgICBhcGlLZXk6IHJlZ2lzdGVyUmVzdWx0LmFwaUtleSxcbiAgICAgICAgICB1cmw6IHJlZ2lzdGVyUmVzdWx0LnVybCxcbiAgICAgICAgfVxuICAgICAgICBmcy53cml0ZUpzb25TeW5jKGRldmRvY0NvbmZpZ1BhdGgsIHVwZGF0ZWRDb25maWcsIHsgc3BhY2VzOiAyIH0pXG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTIFN1YmRvbWFpbiAke3JlZ2lzdGVyUmVzdWx0LnN1YmRvbWFpbn0uZGV2ZG9jLnNoIHJlZ2lzdGVyZWQhYClcbiAgICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICAgIHJlZ2lzdGVyZWQgPSB0cnVlXG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byByZWdpc3RlciBzdWJkb21haW46ICR7bWVzc2FnZX1gKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8vIENvbGxlY3QgYWxsIGNvbnRlbnQgZmlsZXNcbiAgbG9nZ2VyLmluZm8oJ0J1bmRsaW5nIGNvbnRlbnQuLi4nKVxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGNvbGxlY3RGaWxlcyhwcm9qZWN0Um9vdClcbiAgbG9nZ2VyLnN1Y2Nlc3MoYOKckyBGb3VuZCAke2ZpbGVzLmxlbmd0aH0gY29udGVudCBmaWxlc2ApXG4gIFxuICAvLyBDb2xsZWN0IGJpbmFyeSBhc3NldHNcbiAgY29uc3QgYXNzZXRzID0gYXdhaXQgY29sbGVjdEFzc2V0cyhwcm9qZWN0Um9vdClcbiAgaWYgKGFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdG90YWxBc3NldFNpemUgPSBhc3NldHMucmVkdWNlKChzdW0sIGEpID0+IHN1bSArIGEuc2l6ZSwgMClcbiAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTIEZvdW5kICR7YXNzZXRzLmxlbmd0aH0gYXNzZXRzICgke2Zvcm1hdFNpemUodG90YWxBc3NldFNpemUpfSlgKVxuICB9XG4gIFxuICAvLyBDYWxjdWxhdGUgYnVuZGxlIHNpemVcbiAgY29uc3QgdG90YWxTaXplID0gZmlsZXMucmVkdWNlKChzdW0sIGYpID0+IHN1bSArIGYuY29udGVudC5sZW5ndGgsIDApXG4gIGNvbnN0IHNpemVLQiA9ICh0b3RhbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpXG4gIGxvZ2dlci5pbmZvKGBDb250ZW50IGJ1bmRsZTogJHtzaXplS0J9IEtCYClcbiAgXG4gIC8vIFVwbG9hZCBiaW5hcnkgYXNzZXRzIGZpcnN0ICh3aXRoIHByb2dyZXNzKVxuICBpZiAoYXNzZXRzLmxlbmd0aCA+IDAgJiYgZXhpc3RpbmdTbHVnICYmIGFwaUtleSkge1xuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGxvZ2dlci5pbmZvKCdVcGxvYWRpbmcgYXNzZXRzLi4uJylcbiAgICBcbiAgICBjb25zdCBhc3NldFJlc3VsdHMgPSBhd2FpdCB1cGxvYWRBc3NldHMoYXNzZXRzLCBhcGlVcmwsIGV4aXN0aW5nU2x1ZywgYXBpS2V5KVxuICAgIGNvbnN0IHN1Y2Nlc3NDb3VudCA9IGFzc2V0UmVzdWx0cy5maWx0ZXIociA9PiByLnN1Y2Nlc3MpLmxlbmd0aFxuICAgIGNvbnN0IGZhaWxDb3VudCA9IGFzc2V0UmVzdWx0cy5maWx0ZXIociA9PiAhci5zdWNjZXNzKS5sZW5ndGhcbiAgICBcbiAgICBpZiAoZmFpbENvdW50ID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYCR7c3VjY2Vzc0NvdW50fSBhc3NldHMgdXBsb2FkZWQsICR7ZmFpbENvdW50fSBmYWlsZWRgKVxuICAgIH0gZWxzZSBpZiAoc3VjY2Vzc0NvdW50ID4gMCkge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYOKckyAke3N1Y2Nlc3NDb3VudH0gYXNzZXRzIHVwbG9hZGVkYClcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXNzZXRzLmxlbmd0aCA+IDAgJiYgIWV4aXN0aW5nU2x1Zykge1xuICAgIGxvZ2dlci5pbmZvKCdBc3NldHMgd2lsbCBiZSB1cGxvYWRlZCBvbiBuZXh0IGRlcGxveSAoYWZ0ZXIgcHJvamVjdCByZWdpc3RyYXRpb24pJylcbiAgfVxuICBcbiAgLy8gRGVwbG95IGNvbnRlbnQgdG8gQVBJXG4gIGNvbnNvbGUubG9nKCcnKVxuICBsb2dnZXIuaW5mbygnVXBsb2FkaW5nIGNvbnRlbnQuLi4nKVxuICBcbiAgdHJ5IHtcbiAgICBpbnRlcmZhY2UgRGVwbG95UmVzcG9uc2Uge1xuICAgICAgc3VjY2VzczogYm9vbGVhblxuICAgICAgc2x1Zzogc3RyaW5nXG4gICAgICB1cmw6IHN0cmluZ1xuICAgICAgYmxvYlVybDogc3RyaW5nXG4gICAgICBpc1VwZGF0ZTogYm9vbGVhblxuICAgICAgZmlsZXNDb3VudDogbnVtYmVyXG4gICAgICBhcGlLZXk/OiBzdHJpbmdcbiAgICAgIGVycm9yPzogc3RyaW5nXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgQVBJIGtleSBoZWFkZXIgZm9yIHVwZGF0ZXNcbiAgICBpZiAoYXBpS2V5KSB7XG4gICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7YXBpS2V5fWBcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9kZXBsb3lgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICByZWRpcmVjdDogJ2ZvbGxvdycsIC8vIEZvbGxvdyByZWRpcmVjdHNcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbmFtZTogY29uZmlnLm5hbWUgfHwgJ015IERvY3VtZW50YXRpb24nLFxuICAgICAgICBzbHVnOiBleGlzdGluZ1NsdWcsXG4gICAgICAgIGRvY3NKc29uOiBjb25maWcsXG4gICAgICAgIGZpbGVzLFxuICAgICAgICBhcGlLZXksIC8vIEFsc28gc2VuZCBpbiBib2R5IGFzIGZhbGxiYWNrXG4gICAgICB9KSxcbiAgICB9KVxuICAgIFxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBlcnJvcjogJ1Vua25vd24gZXJyb3InIH0pKSBhcyB7IGVycm9yPzogc3RyaW5nOyBkZXRhaWxzPzogc3RyaW5nIH1cbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yRGF0YS5lcnJvciB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gXG4gICAgICBjb25zdCBkZXRhaWxzID0gZXJyb3JEYXRhLmRldGFpbHMgPyBgXFxuICAgRGV0YWlsczogJHtlcnJvckRhdGEuZGV0YWlsc31gIDogJydcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJvck1lc3NhZ2V9JHtkZXRhaWxzfWApXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBEZXBsb3lSZXNwb25zZVxuICAgIFxuICAgIC8vIFNhdmUgcHJvamVjdCBjb25maWcgZm9yIGZ1dHVyZSB1cGRhdGVzXG4gICAgY29uc3QgbmV3RGV2RG9jQ29uZmlnOiBEZXZEb2NDb25maWcgPSB7XG4gICAgICBzbHVnOiByZXN1bHQuc2x1ZyxcbiAgICAgIHVybDogcmVzdWx0LnVybCxcbiAgICAgIGxhc3REZXBsb3llZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH1cbiAgICBcbiAgICAvLyBTYXZlIEFQSSBrZXkgKGZyb20gcmVzcG9uc2UgZm9yIG5ldyBwcm9qZWN0cywgb3IgZXhpc3RpbmcgZm9yIHVwZGF0ZXMpXG4gICAgaWYgKHJlc3VsdC5hcGlLZXkpIHtcbiAgICAgIG5ld0RldkRvY0NvbmZpZy5hcGlLZXkgPSByZXN1bHQuYXBpS2V5XG4gICAgfSBlbHNlIGlmIChhcGlLZXkpIHtcbiAgICAgIG5ld0RldkRvY0NvbmZpZy5hcGlLZXkgPSBhcGlLZXlcbiAgICB9XG4gICAgXG4gICAgZnMud3JpdGVKc29uU3luYyhkZXZkb2NDb25maWdQYXRoLCBuZXdEZXZEb2NDb25maWcsIHsgc3BhY2VzOiAyIH0pXG4gICAgXG4gICAgLy8gU3VjY2VzcyBtZXNzYWdlXG4gICAgY29uc29sZS5sb2coJycpXG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ0RlcGxveW1lbnQgc3VjY2Vzc2Z1bCEnKVxuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGNvbnNvbGUubG9nKGAgIFlvdXIgZG9jcyBhcmUgbGl2ZSBhdDpgKVxuICAgIGNvbnNvbGUubG9nKGAgICR7bG9nZ2VyLmN5YW4ocmVzdWx0LnVybCl9YClcbiAgICBjb25zb2xlLmxvZygnJylcbiAgICBcbiAgICBpZiAocmVzdWx0LmlzVXBkYXRlKSB7XG4gICAgICBsb2dnZXIuaW5mbygnUHJvamVjdCB1cGRhdGVkIHdpdGggbmV3IGNvbnRlbnQnKVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuaW5mbyhgUHJvamVjdCBzbHVnOiAke3Jlc3VsdC5zbHVnfWApXG4gICAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGRlcGxveVwiIGFnYWluIHRvIHVwZGF0ZScpXG4gICAgICBcbiAgICAgIC8vIFNob3cgQVBJIGtleSB3YXJuaW5nIGZvciBuZXcgcHJvamVjdHNcbiAgICAgIGlmIChyZXN1bHQuYXBpS2V5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICBsb2dnZXIud2Fybign4pqg77iPICBTYXZlIHlvdXIgQVBJIGtleSBmb3IgQ0kvQ0QgZGVwbG95bWVudHM6JylcbiAgICAgICAgY29uc29sZS5sb2coYCAgICAke3Jlc3VsdC5hcGlLZXl9YClcbiAgICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICAgIGxvZ2dlci5pbmZvKCdBUEkga2V5IHNhdmVkIHRvIC5kZXZkb2MuanNvbiAoYWRkIHRvIC5naXRpZ25vcmUhKScpXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciBkb21haW4uanNvbiBhbmQgc2hvdyBjdXN0b20gZG9tYWluIHN0YXR1c1xuICAgIGF3YWl0IGNoZWNrQ3VzdG9tRG9tYWluU3RhdHVzKHByb2plY3RSb290LCBhcGlVcmwsIGFwaUtleSB8fCByZXN1bHQuYXBpS2V5IHx8ICcnKVxuICAgIFxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICBsb2dnZXIuZXJyb3IoYERlcGxveW1lbnQgZmFpbGVkOiAke21lc3NhZ2V9YClcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgYWxsIE1EWCBhbmQgY29udGVudCBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RGaWxlcyhwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxQcm9qZWN0RmlsZVtdPiB7XG4gIGNvbnN0IGZpbGVzOiBQcm9qZWN0RmlsZVtdID0gW11cbiAgXG4gIC8vIFNjYW4gYWxsIGRpcmVjdG9yaWVzIGluIHByb2plY3Qgcm9vdCAobm90IGp1c3QgaGFyZGNvZGVkIGxpc3QpXG4gIGNvbnN0IGl0ZW1zID0gZnMucmVhZGRpclN5bmMocHJvamVjdFJvb3QpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAvLyBTa2lwIGNvbW1vbiBkaXJlY3RvcmllcyB0aGF0IHNob3VsZG4ndCBiZSBzY2FubmVkXG4gICAgaWYgKFtcbiAgICAgICdub2RlX21vZHVsZXMnLCBcbiAgICAgICdkaXN0JywgXG4gICAgICAnLm5leHQnLCBcbiAgICAgICcuZ2l0JywgXG4gICAgICAncHVibGljJyxcbiAgICAgICcuZGV2ZG9jJyxcbiAgICAgICcuY2xhdWRlJyxcbiAgICAgICcuY3Vyc29yJyxcbiAgICBdLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgaXRlbSlcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpXG4gICAgXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgLy8gU2tpcCBhc3NldHMgZm9sZGVyIGZvciBNRFggc2Nhbm5pbmcgKGhhbmRsZWQgc2VwYXJhdGVseSlcbiAgICAgIGlmIChpdGVtID09PSAnYXNzZXRzJykgY29udGludWVcbiAgICAgIGF3YWl0IHNjYW5EaXJlY3RvcnkoZnVsbFBhdGgsIHByb2plY3RSb290LCBmaWxlcylcbiAgICB9IGVsc2UgaWYgKGl0ZW0uZW5kc1dpdGgoJy5tZHgnKSB8fCBpdGVtLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgLy8gSW5jbHVkZSByb290LWxldmVsIE1EWCBmaWxlc1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0Zi04JylcbiAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBpdGVtLCBjb250ZW50IH0pXG4gICAgfSBlbHNlIGlmIChpdGVtID09PSAnZG9jcy5qc29uJyB8fCBpdGVtID09PSAndGhlbWUuanNvbicgfHwgaXRlbSA9PT0gJ2RvbWFpbi5qc29uJyB8fCBpdGVtID09PSAnY3VzdG9tLmNzcycpIHtcbiAgICAgIC8vIEluY2x1ZGUgY29uZmlnIGZpbGVzXG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmLTgnKVxuICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGl0ZW0sIGNvbnRlbnQgfSlcbiAgICB9XG4gIH1cbiAgXG4gIC8vIEluY2x1ZGUgdGV4dC1iYXNlZCBhc3NldHMgZnJvbSBhc3NldHMgZm9sZGVyIChTVkcsIEpTT04pXG4gIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2Fzc2V0cycpXG4gIGlmIChmcy5leGlzdHNTeW5jKGFzc2V0c0RpcikpIHtcbiAgICBhd2FpdCBzY2FuUHVibGljQXNzZXRzKGFzc2V0c0RpciwgcHJvamVjdFJvb3QsIGZpbGVzKVxuICB9XG4gIFxuICByZXR1cm4gZmlsZXNcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBzY2FuIGEgZGlyZWN0b3J5IGZvciBNRFggZmlsZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2NhbkRpcmVjdG9yeShcbiAgZGlyOiBzdHJpbmcsXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIGZpbGVzOiBQcm9qZWN0RmlsZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAvLyBTa2lwIGNvbW1vbiBkaXJlY3Rvcmllc1xuICAgIGlmIChbJ25vZGVfbW9kdWxlcycsICdkaXN0JywgJy5uZXh0JywgJy5naXQnLCAncHVibGljJ10uaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgaXRlbSlcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpXG4gICAgXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgYXdhaXQgc2NhbkRpcmVjdG9yeShmdWxsUGF0aCwgcHJvamVjdFJvb3QsIGZpbGVzKVxuICAgIH0gZWxzZSBpZiAoaXRlbS5lbmRzV2l0aCgnLm1keCcpIHx8IGl0ZW0uZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBmdWxsUGF0aClcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsICd1dGYtOCcpXG4gICAgICBcbiAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNjYW4gcHVibGljIGFzc2V0cyAoU1ZHLCBKU09OLCBDU1MpIC0gdGV4dC1iYXNlZCBvbmx5IGZvciBjb250ZW50IGJ1bmRsZVxuICovXG5hc3luYyBmdW5jdGlvbiBzY2FuUHVibGljQXNzZXRzKFxuICBkaXI6IHN0cmluZyxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgZmlsZXM6IFByb2plY3RGaWxlW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpdGVtcyA9IGZzLnJlYWRkaXJTeW5jKGRpcilcbiAgXG4gIC8vIFRleHQtYmFzZWQgZmlsZSBleHRlbnNpb25zIHRvIGluY2x1ZGUgaW4gY29udGVudCBidW5kbGVcbiAgY29uc3QgVEVYVF9FWFRFTlNJT05TID0gWycuc3ZnJywgJy5qc29uJywgJy5jc3MnXVxuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBpdGVtKVxuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aClcbiAgICBcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCBzY2FuUHVibGljQXNzZXRzKGZ1bGxQYXRoLCBwcm9qZWN0Um9vdCwgZmlsZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpdGVtKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoVEVYVF9FWFRFTlNJT05TLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgLy8gT25seSBpbmNsdWRlIHRleHQtYmFzZWQgYXNzZXRzIGluIGNvbnRlbnQgYnVuZGxlXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGZ1bGxQYXRoKVxuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmLTgnKVxuICAgICAgICBcbiAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBiaW5hcnkgYXNzZXRzIGZyb20gYXNzZXRzIGZvbGRlclxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QXNzZXRzKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPEFzc2V0RmlsZVtdPiB7XG4gIGNvbnN0IGFzc2V0czogQXNzZXRGaWxlW10gPSBbXVxuICBcbiAgLy8gQ2hlY2sgYXNzZXRzIGZvbGRlclxuICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdhc3NldHMnKVxuICBpZiAoZnMuZXhpc3RzU3luYyhhc3NldHNEaXIpKSB7XG4gICAgYXdhaXQgc2NhbkJpbmFyeUFzc2V0cyhhc3NldHNEaXIsIHByb2plY3RSb290LCBhc3NldHMpXG4gIH1cbiAgXG4gIHJldHVybiBhc3NldHNcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBzY2FuIGZvciBiaW5hcnkgYXNzZXRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjYW5CaW5hcnlBc3NldHMoXG4gIGRpcjogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBhc3NldHM6IEFzc2V0RmlsZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGl0ZW0pXG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGxQYXRoKVxuICAgIFxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGF3YWl0IHNjYW5CaW5hcnlBc3NldHMoZnVsbFBhdGgsIHByb2plY3RSb290LCBhc3NldHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpdGVtKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoQklOQVJZX0VYVEVOU0lPTlMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICAvLyBDaGVjayBzaXplIGxpbWl0XG4gICAgICAgIGlmIChzdGF0LnNpemUgPiBNQVhfQVNTRVRfU0laRSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBTa2lwcGluZyAke2l0ZW19OiBleGNlZWRzIDI1TUIgbGltaXQgKCR7Zm9ybWF0U2l6ZShzdGF0LnNpemUpfSlgKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGZ1bGxQYXRoKVxuICAgICAgICBhc3NldHMucHVzaCh7XG4gICAgICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGZ1bGxQYXRoLFxuICAgICAgICAgIHNpemU6IHN0YXQuc2l6ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVcGxvYWQgYXNzZXRzIHdpdGggcHJvZ3Jlc3MgdHJhY2tpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBsb2FkQXNzZXRzKFxuICBhc3NldHM6IEFzc2V0RmlsZVtdLFxuICBhcGlVcmw6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxBcnJheTx7IGZpbGU6IHN0cmluZzsgc3VjY2VzczogYm9vbGVhbjsgdXJsPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9Pj4ge1xuICBjb25zdCByZXN1bHRzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgc3VjY2VzczogYm9vbGVhbjsgdXJsPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9PiA9IFtdXG4gIFxuICBmb3IgKGNvbnN0IGFzc2V0IG9mIGFzc2V0cykge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShhc3NldC5wYXRoKVxuICAgIFxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7ZmlsZU5hbWV9OiBgKVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGxvYWRBc3NldFdpdGhQcm9ncmVzcyhcbiAgICAgICAgYXNzZXQsXG4gICAgICAgIGFwaVVybCxcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgYXBpS2V5LFxuICAgICAgICAocHJvZ3Jlc3MsIGxvYWRlZCwgdG90YWwpID0+IHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoMClcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC5jdXJzb3JUbygwKVxuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7ZmlsZU5hbWV9OiAke2NyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzKX0gJHtmb3JtYXRTaXplKGxvYWRlZCl9LyR7Zm9ybWF0U2l6ZSh0b3RhbCl9YClcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgXG4gICAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoMClcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LmN1cnNvclRvKDApXG4gICAgICBjb25zb2xlLmxvZyhgICAke2xvZ2dlci5ncmVlbign4pyTJyl9ICR7ZmlsZU5hbWV9ICgke2Zvcm1hdFNpemUoYXNzZXQuc2l6ZSl9KWApXG4gICAgICBcbiAgICAgIHJlc3VsdHMucHVzaCh7IGZpbGU6IGZpbGVOYW1lLCBzdWNjZXNzOiB0cnVlLCB1cmw6IHJlc3VsdC51cmwgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgXG4gICAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoMClcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LmN1cnNvclRvKDApXG4gICAgICBjb25zb2xlLmxvZyhgICAke2xvZ2dlci5yZWQoJ+KclycpfSAke2ZpbGVOYW1lfTogJHttZXNzYWdlfWApXG4gICAgICBcbiAgICAgIHJlc3VsdHMucHVzaCh7IGZpbGU6IGZpbGVOYW1lLCBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1lc3NhZ2UgfSlcbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiByZXN1bHRzXG59XG5cbi8qKlxuICogVXBsb2FkIGEgc2luZ2xlIGFzc2V0IHdpdGggcHJvZ3Jlc3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBsb2FkQXNzZXRXaXRoUHJvZ3Jlc3MoXG4gIGFzc2V0OiBBc3NldEZpbGUsXG4gIGFwaVVybDogc3RyaW5nLFxuICBzbHVnOiBzdHJpbmcsXG4gIGFwaUtleTogc3RyaW5nLFxuICBvblByb2dyZXNzOiAocHJvZ3Jlc3M6IG51bWJlciwgbG9hZGVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpID0+IHZvaWRcbik6IFByb21pc2U8eyB1cmw6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGZpbGVCdWZmZXIgPSBmcy5yZWFkRmlsZVN5bmMoYXNzZXQuZnVsbFBhdGgpXG4gIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShhc3NldC5wYXRoKVxuICBjb25zdCBtaW1lVHlwZSA9IGdldE1pbWVUeXBlKGFzc2V0LmZ1bGxQYXRoKVxuICBcbiAgLy8gQnVpbGQgbXVsdGlwYXJ0IGZvcm0gZGF0YVxuICBjb25zdCBib3VuZGFyeSA9IGAtLS0tRGV2RG9jRGVwbG95JHtEYXRlLm5vdygpfWBcbiAgY29uc3QgQ1JMRiA9ICdcXHJcXG4nXG4gIFxuICBjb25zdCBoZWFkZXIgPSBbXG4gICAgYC0tJHtib3VuZGFyeX1gLFxuICAgIGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJmaWxlXCI7IGZpbGVuYW1lPVwiJHtmaWxlTmFtZX1cImAsXG4gICAgYENvbnRlbnQtVHlwZTogJHttaW1lVHlwZX1gLFxuICAgICcnLFxuICAgICcnXG4gIF0uam9pbihDUkxGKVxuICBcbiAgY29uc3Qgc2x1Z1BhcnQgPSBbXG4gICAgJycsXG4gICAgYC0tJHtib3VuZGFyeX1gLFxuICAgIGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJzbHVnXCJgLFxuICAgICcnLFxuICAgIHNsdWcsXG4gICAgJydcbiAgXS5qb2luKENSTEYpXG4gIFxuICBjb25zdCBwYXRoUGFydCA9IFtcbiAgICBgLS0ke2JvdW5kYXJ5fWAsXG4gICAgYENvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cInBhdGhcImAsXG4gICAgJycsXG4gICAgYXNzZXQucGF0aC5yZXBsYWNlKC9eYXNzZXRzXFwvLywgJycpLCAvLyBSZW1vdmUgYXNzZXRzLyBwcmVmaXhcbiAgICAnJ1xuICBdLmpvaW4oQ1JMRilcbiAgXG4gIGNvbnN0IGZvb3RlciA9IGAke0NSTEZ9LS0ke2JvdW5kYXJ5fS0tJHtDUkxGfWBcbiAgXG4gIGNvbnN0IGhlYWRlckJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGhlYWRlcilcbiAgY29uc3Qgc2x1Z0J1ZmZlciA9IEJ1ZmZlci5mcm9tKHNsdWdQYXJ0KVxuICBjb25zdCBwYXRoQnVmZmVyID0gQnVmZmVyLmZyb20ocGF0aFBhcnQpXG4gIGNvbnN0IGZvb3RlckJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGZvb3RlcilcbiAgXG4gIGNvbnN0IHRvdGFsU2l6ZSA9IGhlYWRlckJ1ZmZlci5sZW5ndGggKyBmaWxlQnVmZmVyLmxlbmd0aCArIHNsdWdCdWZmZXIubGVuZ3RoICsgcGF0aEJ1ZmZlci5sZW5ndGggKyBmb290ZXJCdWZmZXIubGVuZ3RoXG4gIGNvbnN0IGJvZHkgPSBCdWZmZXIuY29uY2F0KFtoZWFkZXJCdWZmZXIsIGZpbGVCdWZmZXIsIHNsdWdCdWZmZXIsIHBhdGhCdWZmZXIsIGZvb3RlckJ1ZmZlcl0pXG4gIFxuICAvLyBTaW11bGF0ZSBwcm9ncmVzc1xuICBsZXQgdXBsb2FkZWQgPSAwXG4gIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguY2VpbCh0b3RhbFNpemUgLyAyMClcbiAgXG4gIGNvbnN0IHByb2dyZXNzSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHVwbG9hZGVkIDwgdG90YWxTaXplICogMC45KSB7XG4gICAgICB1cGxvYWRlZCA9IE1hdGgubWluKHVwbG9hZGVkICsgY2h1bmtTaXplLCB0b3RhbFNpemUgKiAwLjkpXG4gICAgICBvblByb2dyZXNzKHVwbG9hZGVkIC8gdG90YWxTaXplLCB1cGxvYWRlZCwgdG90YWxTaXplKVxuICAgIH1cbiAgfSwgNTApXG4gIFxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS9hcGkvYXNzZXRzL3VwbG9hZGAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogYG11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSR7Ym91bmRhcnl9YCxcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7YXBpS2V5fWAsXG4gICAgICB9LFxuICAgICAgYm9keSxcbiAgICB9KVxuICAgIFxuICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NJbnRlcnZhbClcbiAgICBvblByb2dyZXNzKDEsIHRvdGFsU2l6ZSwgdG90YWxTaXplKVxuICAgIFxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IGVycm9yOiAnVXBsb2FkIGZhaWxlZCcgfSkpIGFzIHsgZXJyb3I/OiBzdHJpbmcgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyB7IHVybDogc3RyaW5nIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc0ludGVydmFsKVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXQgZmlsZSBzaXplIGZvciBkaXNwbGF5XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFNpemUoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChieXRlcyA8IDEwMjQpIHJldHVybiBgJHtieXRlc30gQmBcbiAgaWYgKGJ5dGVzIDwgMTAyNCAqIDEwMjQpIHJldHVybiBgJHsoYnl0ZXMgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQmBcbiAgcmV0dXJuIGAkeyhieXRlcyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IE1CYFxufVxuXG4vKipcbiAqIENyZWF0ZSBhIHByb2dyZXNzIGJhciBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gY3JlYXRlUHJvZ3Jlc3NCYXIocHJvZ3Jlc3M6IG51bWJlciwgd2lkdGg6IG51bWJlciA9IDMwKTogc3RyaW5nIHtcbiAgY29uc3QgZmlsbGVkID0gTWF0aC5yb3VuZCh3aWR0aCAqIHByb2dyZXNzKVxuICBjb25zdCBlbXB0eSA9IHdpZHRoIC0gZmlsbGVkXG4gIGNvbnN0IGJhciA9ICfilognLnJlcGVhdChmaWxsZWQpICsgJ+KWkScucmVwZWF0KGVtcHR5KVxuICBjb25zdCBwZXJjZW50YWdlID0gTWF0aC5yb3VuZChwcm9ncmVzcyAqIDEwMClcbiAgcmV0dXJuIGBbJHtiYXJ9XSAke3BlcmNlbnRhZ2V9JWBcbn1cbiJdfQ==
|
|
801
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9kZXBsb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvUUEsd0JBMlNDO0FBL2lCRCxnREFBdUI7QUFDdkIsd0RBQXlCO0FBQ3pCLHlDQUF5RDtBQUN6RCwrQ0FBMkM7QUFDM0MsK0NBQWlEO0FBRWpELHVCQUF1QjtBQUN2QixNQUFNLGNBQWMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtBQUV2QywrQ0FBK0M7QUFDL0MsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU07SUFDaEQsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNO0lBQ3ZCLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUN0QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUN6QyxNQUFNO0NBQ1AsQ0FBQTtBQUVELG9DQUFvQztBQUNwQyxNQUFNLFVBQVUsR0FBMkI7SUFDekMsU0FBUztJQUNULE1BQU0sRUFBRSxXQUFXO0lBQ25CLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLFNBQVM7SUFDVCxNQUFNLEVBQUUsV0FBVztJQUNuQixPQUFPLEVBQUUsWUFBWTtJQUNyQixNQUFNLEVBQUUsaUJBQWlCO0lBQ3pCLFFBQVE7SUFDUixNQUFNLEVBQUUsWUFBWTtJQUNwQixNQUFNLEVBQUUsV0FBVztJQUNuQixNQUFNLEVBQUUsV0FBVztJQUNuQixRQUFRO0lBQ1IsT0FBTyxFQUFFLFdB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QUFDLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRTtJQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQTtJQUMzQyxNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFBO0lBQzVCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQTtJQUM3QyxPQUFPLElBQUksR0FBRyxLQUFLLFVBQVUsR0FBRyxDQUFBO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHsgbG9hZENvbmZpZywgdmFsaWRhdGVDb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInXG5pbXBvcnQgeyBERUZBVUxUX0FQSV9VUkwgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnXG5cbi8vIE1heCBhc3NldCBzaXplOiAyNU1CXG5jb25zdCBNQVhfQVNTRVRfU0laRSA9IDI1ICogMTAyNCAqIDEwMjRcblxuLy8gQmluYXJ5IGFzc2V0IGV4dGVuc2lvbnMgdG8gdXBsb2FkIHNlcGFyYXRlbHlcbmNvbnN0IEJJTkFSWV9FWFRFTlNJT05TID0gW1xuICAnLnBuZycsICcuanBnJywgJy5qcGVnJywgJy5naWYnLCAnLndlYnAnLCAnLmljbycsXG4gICcubXA0JywgJy53ZWJtJywgJy5tb3YnLFxuICAnLm1wMycsICcud2F2JywgJy5vZ2cnLFxuICAnLndvZmYnLCAnLndvZmYyJywgJy50dGYnLCAnLm90ZicsICcuZW90JyxcbiAgJy5wZGYnLFxuXVxuXG4vLyBNYXAgZmlsZSBleHRlbnNpb25zIHRvIE1JTUUgdHlwZXNcbmNvbnN0IE1JTUVfVFlQRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIC8vIEltYWdlc1xuICAnLnBuZyc6ICdpbWFnZS9wbmcnLFxuICAnLmpwZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmdpZic6ICdpbWFnZS9naWYnLFxuICAnLndlYnAnOiAnaW1hZ2Uvd2VicCcsXG4gICcuaWNvJzogJ2ltYWdlL3gtaWNvbicsXG4gICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAvLyBWaWRlb3NcbiAgJy5tcDQnOiAndmlkZW8vbXA0JyxcbiAgJy53ZWJtJzogJ3ZpZGVvL3dlYm0nLFxuICAnLm1vdic6ICd2aWRlby9xdWlja3RpbWUnLFxuICAvLyBBdWRpb1xuICAnLm1wMyc6ICdhdWRpby9tcGVnJyxcbiAgJy53YXYnOiAnYXVkaW8vd2F2JyxcbiAgJy5vZ2cnOiAnYXVkaW8vb2dnJyxcbiAgLy8gRm9udHNcbiAgJy53b2ZmJzogJ2ZvbnQvd29mZicsXG4gICcud29mZjInOiAnZm9udC93b2ZmMicsXG4gICcudHRmJzogJ2ZvbnQvdHRmJyxcbiAgJy5vdGYnOiAnZm9udC9vdGYnLFxuICAnLmVvdCc6ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsXG4gIC8vIERvY3VtZW50c1xuICAnLnBkZic6ICdhcHBsaWNhdGlvbi9wZGYnLFxufVxuXG4vKipcbiAqIEdldCBNSU1FIHR5cGUgZnJvbSBmaWxlIGV4dGVuc2lvblxuICovXG5mdW5jdGlvbiBnZXRNaW1lVHlwZShmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpXG4gIHJldHVybiBNSU1FX1RZUEVTW2V4dF0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbn1cblxuaW50ZXJmYWNlIERlcGxveU9wdGlvbnMge1xuICB1cmw/OiBzdHJpbmdcbiAgYXBpS2V5Pzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBQcm9qZWN0RmlsZSB7XG4gIHBhdGg6IHN0cmluZ1xuICBjb250ZW50OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIE9wZW5BcGlTcGVjIHtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5pbnRlcmZhY2UgQXNzZXRGaWxlIHtcbiAgcGF0aDogc3RyaW5nXG4gIGZ1bGxQYXRoOiBzdHJpbmdcbiAgc2l6ZTogbnVtYmVyXG59XG5cbmludGVyZmFjZSBEZXZEb2NDb25maWcge1xuICBwcm9qZWN0SWQ/OiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBzbHVnPzogc3RyaW5nXG4gIHN1YmRvbWFpbj86IHN0cmluZ1xuICBhcGlLZXk/OiBzdHJpbmdcbiAgdXJsPzogc3RyaW5nXG4gIGxhc3REZXBsb3llZD86IHN0cmluZ1xuICBjcmVhdGVkQXQ/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIFJlZ2lzdGVyUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBib29sZWFuXG4gIHByb2plY3RJZDogc3RyaW5nXG4gIHNsdWc6IHN0cmluZ1xuICBzdWJkb21haW46IHN0cmluZ1xuICBhcGlLZXk6IHN0cmluZ1xuICB1cmw6IHN0cmluZ1xuICBlcnJvcj86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgQ2hlY2tTdWJkb21haW5SZXNwb25zZSB7XG4gIGF2YWlsYWJsZTogYm9vbGVhblxuICBlcnJvcj86IHN0cmluZ1xuICBzdWdnZXN0aW9uPzogc3RyaW5nXG59XG5cbi8vIFNpbXBsZSBwcm9tcHQgaGVscGVyIHVzaW5nIHJlYWRsaW5lXG5hc3luYyBmdW5jdGlvbiBwcm9tcHQocXVlc3Rpb246IHN0cmluZywgZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVhZGxpbmUgPSBhd2FpdCBpbXBvcnQoJ3JlYWRsaW5lJylcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdEhpbnQgPSBkZWZhdWx0VmFsdWUgPyBgICgke2RlZmF1bHRWYWx1ZX0pYCA6ICcnXG4gICAgcmwucXVlc3Rpb24oYCR7cXVlc3Rpb259JHtkZWZhdWx0SGludH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKClcbiAgICAgIHJlc29sdmUoYW5zd2VyLnRyaW0oKSB8fCBkZWZhdWx0VmFsdWUgfHwgJycpXG4gICAgfSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDaGVjayBzdWJkb21haW4gYXZhaWxhYmlsaXR5IHZpYSBBUElcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tTdWJkb21haW5BdmFpbGFiaWxpdHkoXG4gIHN1YmRvbWFpbjogc3RyaW5nLFxuICBhcGlVcmw6IHN0cmluZ1xuKTogUHJvbWlzZTxDaGVja1N1YmRvbWFpblJlc3BvbnNlPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9zdWJkb21haW5zL2NoZWNrYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzdWJkb21haW4gfSksXG4gICAgfSlcbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2hlY2tTdWJkb21haW5SZXNwb25zZVxuICAgIHJldHVybiByZXN1bHRcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgQVBJIGlzIHVuYXZhaWxhYmxlLCBhc3N1bWUgYXZhaWxhYmxlICh3aWxsIGZhaWwgYXQgcmVnaXN0cmF0aW9uIGlmIG5vdClcbiAgICByZXR1cm4geyBhdmFpbGFibGU6IHRydWUgfVxuICB9XG59XG5cbi8qKlxuICogQmFzaWMgc3ViZG9tYWluIGZvcm1hdCB2YWxpZGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTdWJkb21haW5Gb3JtYXQoc3ViZG9tYWluOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgaWYgKCFzdWJkb21haW4pIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIGlzIHJlcXVpcmVkJyB9XG4gIH1cbiAgXG4gIGlmIChzdWJkb21haW4ubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnMnIH1cbiAgfVxuICBcbiAgaWYgKHN1YmRvbWFpbi5sZW5ndGggPiA2Mykge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gbXVzdCBiZSA2MyBjaGFyYWN0ZXJzIG9yIGxlc3MnIH1cbiAgfVxuICBcbiAgaWYgKCEvXlthLXowLTldKFthLXowLTktXSpbYS16MC05XSk/JC8udGVzdChzdWJkb21haW4pKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBtdXN0IHN0YXJ0IGFuZCBlbmQgd2l0aCBhbHBoYW51bWVyaWMsIGNhbiBjb250YWluIGh5cGhlbnMnIH1cbiAgfVxuICBcbiAgaWYgKC8tLS8udGVzdChzdWJkb21haW4pKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBjYW5ub3QgY29udGFpbiBjb25zZWN1dGl2ZSBoeXBoZW5zJyB9XG4gIH1cbiAgXG4gIHJldHVybiB7IHZhbGlkOiB0cnVlIH1cbn1cblxuaW50ZXJmYWNlIERvbWFpbkNvbmZpZyB7XG4gIGN1c3RvbURvbWFpbjogc3RyaW5nXG4gIHNlbz86IHtcbiAgICBjYW5vbmljYWw/OiBzdHJpbmdcbiAgfVxufVxuXG5pbnRlcmZhY2UgRG9tYWluU3RhdHVzUmVzcG9uc2Uge1xuICBoYXNDdXN0b21Eb21haW46IGJvb2xlYW5cbiAgZG9tYWluPzogc3RyaW5nXG4gIHN0YXR1cz86IHN0cmluZ1xuICBjdXN0b21Vcmw/OiBzdHJpbmdcbiAgbWVzc2FnZT86IHN0cmluZ1xuICBuZXh0U3RlcD86IHN0cmluZ1xufVxuXG4vKipcbiAqIENoZWNrIGZvciBkb21haW4uanNvbiBhbmQgZGlzcGxheSBjdXN0b20gZG9tYWluIHN0YXR1c1xuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0N1c3RvbURvbWFpblN0YXR1cyhcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgYXBpVXJsOiBzdHJpbmcsXG4gIGFwaUtleTogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQ2hlY2sgaWYgZG9tYWluLmpzb24gZXhpc3RzXG4gIGNvbnN0IGRvbWFpbkNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdkb21haW4uanNvbicpXG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZG9tYWluQ29uZmlnUGF0aCkpIHtcbiAgICByZXR1cm4gLy8gTm8gZG9tYWluLmpzb24sIG5vdGhpbmcgdG8gZG9cbiAgfVxuICBcbiAgbGV0IGRvbWFpbkNvbmZpZzogRG9tYWluQ29uZmlnXG4gIHRyeSB7XG4gICAgZG9tYWluQ29uZmlnID0gZnMucmVhZEpzb25TeW5jKGRvbWFpbkNvbmZpZ1BhdGgpIGFzIERvbWFpbkNvbmZpZ1xuICB9IGNhdGNoIHtcbiAgICBsb2dnZXIud2FybignRm91bmQgZG9tYWluLmpzb24gYnV0IGZhaWxlZCB0byBwYXJzZSBpdCcpXG4gICAgcmV0dXJuXG4gIH1cbiAgXG4gIGlmICghZG9tYWluQ29uZmlnLmN1c3RvbURvbWFpbikge1xuICAgIHJldHVyblxuICB9XG4gIFxuICBjb25zb2xlLmxvZygnJylcbiAgbG9nZ2VyLmluZm8oYEN1c3RvbSBkb21haW4gY29uZmlndXJlZDogJHtkb21haW5Db25maWcuY3VzdG9tRG9tYWlufWApXG4gIFxuICAvLyBDaGVjayBkb21haW4gc3RhdHVzIHZpYSBBUElcbiAgaWYgKCFhcGlLZXkpIHtcbiAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGRvbWFpbiBzdGF0dXNcIiB0byBjaGVjayBETlMgY29uZmlndXJhdGlvbicpXG4gICAgcmV0dXJuXG4gIH1cbiAgXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9kb21haW5zL3N0YXR1c2AsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgfSxcbiAgICB9KVxuICAgIFxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRG9tYWluU3RhdHVzUmVzcG9uc2VcbiAgICBcbiAgICBpZiAoIXN0YXR1cy5oYXNDdXN0b21Eb21haW4pIHtcbiAgICAgIC8vIERvbWFpbiBpbiBjb25maWcgYnV0IG5vdCByZWdpc3RlcmVkIHlldFxuICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICBsb2dnZXIuaW5mbygnQ3VzdG9tIGRvbWFpbiBub3QgeWV0IHJlZ2lzdGVyZWQuJylcbiAgICAgIGxvZ2dlci5pbmZvKCdSdW4gXCJkZXZkb2MgZG9tYWluIGFkZCAnICsgZG9tYWluQ29uZmlnLmN1c3RvbURvbWFpbiArICdcIiB0byBzZXQgaXQgdXAnKVxuICAgIH0gZWxzZSBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgY29uc29sZS5sb2coYCAgQWxzbyBsaXZlIGF0OiAke2xvZ2dlci5jeWFuKHN0YXR1cy5jdXN0b21VcmwgfHwgYGh0dHBzOi8vJHtzdGF0dXMuZG9tYWlufWApfWApXG4gICAgfSBlbHNlIGlmIChzdGF0dXMuc3RhdHVzID09PSAncGVuZGluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgbG9nZ2VyLndhcm4oJ0N1c3RvbSBkb21haW4gcGVuZGluZyBETlMgY29uZmlndXJhdGlvbicpXG4gICAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGRvbWFpbiBzdGF0dXNcIiBmb3IgRE5TIHNldHVwIGluc3RydWN0aW9ucycpXG4gICAgfSBlbHNlIGlmIChzdGF0dXMuc3RhdHVzID09PSAnZG5zX3ZlcmlmaWVkJyB8fCBzdGF0dXMuc3RhdHVzID09PSAnc3NsX3Byb3Zpc2lvbmluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgbG9nZ2VyLmluZm8oJ0N1c3RvbSBkb21haW4gRE5TIHZlcmlmaWVkLCBTU0wgY2VydGlmaWNhdGUgcHJvdmlzaW9uaW5nLi4uJylcbiAgICB9XG4gICAgXG4gIH0gY2F0Y2gge1xuICAgIC8vIElnbm9yZSBlcnJvcnMsIGRvbWFpbiBzdGF0dXMgaXMgaW5mb3JtYXRpb25hbFxuICB9XG59XG5cbi8qKlxuICogRGVwbG95IGRvY3VtZW50YXRpb24gdG8gRGV2RG9jIHBsYXRmb3JtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXBsb3kob3B0aW9uczogRGVwbG95T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IHByb2Nlc3MuY3dkKClcbiAgY29uc3QgYXBpVXJsID0gb3B0aW9ucy51cmwgfHwgcHJvY2Vzcy5lbnYuREVWRE9DX0FQSV9VUkwgfHwgREVGQVVMVF9BUElfVVJMXG4gIFxuICBsb2dnZXIuaW5mbygnRGVwbG95aW5nIHRvIERldkRvYy4uLlxcbicpXG4gIFxuICAvLyBDaGVjayBmb3IgZG9jcy5qc29uXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdkb2NzLmpzb24nKVxuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ2RvY3MuanNvbiBub3QgZm91bmQgaW4gY3VycmVudCBkaXJlY3RvcnknKVxuICAgIGxvZ2dlci5pbmZvKCdNYWtlIHN1cmUgeW91IGFyZSBpbiBhIERldkRvYyBkb2N1bWVudGF0aW9uIHByb2plY3QgZGlyZWN0b3J5JylcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuICBcbiAgLy8gTG9hZCBhbmQgdmFsaWRhdGUgY29uZmlndXJhdGlvblxuICBsZXQgY29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkQ29uZmlnPiBleHRlbmRzIFByb21pc2U8aW5mZXIgVD4gPyBUIDogbmV2ZXJcbiAgdHJ5IHtcbiAgICBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHByb2plY3RSb290KVxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZUNvbmZpZyhjb25maWcpXG4gICAgXG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ludmFsaWQgZG9jcy5qc29uIGNvbmZpZ3VyYXRpb246JylcbiAgICAgIHZhbGlkYXRpb24uZXJyb3JzLmZvckVhY2goZXJyID0+IGxvZ2dlci5lcnJvcihgICAtICR7ZXJyfWApKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgQ29uZmlndXJhdGlvbiB2YWxpZDogJHtjb25maWcubmFtZSB8fCAnVW50aXRsZWQnfWApXG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgY29uZmlndXJhdGlvbjogJHttZXNzYWdlfWApXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbiAgXG4gIC8vIENoZWNrIGZvciBleGlzdGluZyBwcm9qZWN0IGNvbmZpZ1xuICBjb25zdCBkZXZkb2NDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCAnLmRldmRvYy5qc29uJylcbiAgbGV0IGRldmRvY0NvbmZpZzogRGV2RG9jQ29uZmlnIHwgbnVsbCA9IG51bGxcbiAgbGV0IGV4aXN0aW5nU2x1Zzogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IGV4aXN0aW5nQXBpS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBsZXQgZXhpc3RpbmdTdWJkb21haW46IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyhkZXZkb2NDb25maWdQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBkZXZkb2NDb25maWcgPSBmcy5yZWFkSnNvblN5bmMoZGV2ZG9jQ29uZmlnUGF0aCkgYXMgRGV2RG9jQ29uZmlnXG4gICAgICBleGlzdGluZ1NsdWcgPSBkZXZkb2NDb25maWcuc2x1ZyB8fCBudWxsXG4gICAgICBleGlzdGluZ0FwaUtleSA9IGRldmRvY0NvbmZpZy5hcGlLZXkgfHwgbnVsbFxuICAgICAgZXhpc3RpbmdTdWJkb21haW4gPSBkZXZkb2NDb25maWcuc3ViZG9tYWluIHx8IG51bGxcbiAgICAgIGlmIChleGlzdGluZ1NsdWcgJiYgZXhpc3RpbmdBcGlLZXkpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYERlcGxveWluZyBwcm9qZWN0OiAke2V4aXN0aW5nU2x1Z31gKVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JlIGVycm9ycyByZWFkaW5nIC5kZXZkb2MuanNvblxuICAgIH1cbiAgfVxuICBcbiAgLy8gR2V0IEFQSSBrZXkgZnJvbSBvcHRpb25zLCBlbnYgdmFyLCBvciAuZGV2ZG9jLmpzb25cbiAgbGV0IGFwaUtleSA9IG9wdGlvbnMuYXBpS2V5IHx8IHByb2Nlc3MuZW52LkRFVkRPQ19BUElfS0VZIHx8IGV4aXN0aW5nQXBpS2V5XG4gIFxuICAvLyBJZiBubyBBUEkga2V5LCB0aGlzIGlzIGEgZmlyc3QgZGVwbG95IC0gbmVlZCB0byByZWdpc3RlciB0aGUgc3ViZG9tYWluIGZpcnN0XG4gIGlmICghYXBpS2V5KSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBzdWJkb21haW4gZnJvbSBpbml0XG4gICAgaWYgKCFleGlzdGluZ1N1YmRvbWFpbikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdObyBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gZm91bmQuJylcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgbG9nZ2VyLmluZm8oJ1J1biBcImRldmRvYyBpbml0XCIgZmlyc3QgdG8gY29uZmlndXJlIHlvdXIgcHJvamVjdCcpXG4gICAgICBsb2dnZXIuaW5mbygnT3IgcHJvdmlkZSBhbiBBUEkga2V5IHZpYSAtLWFwaS1rZXkgZmxhZyBvciBERVZET0NfQVBJX0tFWSBlbnYgdmFyJylcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cbiAgICBcbiAgICBsZXQgc3ViZG9tYWluVG9SZWdpc3RlciA9IGV4aXN0aW5nU3ViZG9tYWluXG4gICAgbGV0IHJlZ2lzdGVyZWQgPSBmYWxzZVxuICAgIFxuICAgIC8vIExvb3AgdW50aWwgd2Ugc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyIGEgc3ViZG9tYWluXG4gICAgd2hpbGUgKCFyZWdpc3RlcmVkKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgUmVnaXN0ZXJpbmcgc3ViZG9tYWluICR7c3ViZG9tYWluVG9SZWdpc3Rlcn0uZGV2ZG9jLnNoLi4uYClcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL3Byb2plY3RzL3JlZ2lzdGVyYCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBuYW1lOiBkZXZkb2NDb25maWc/Lm5hbWUgfHwgY29uZmlnLm5hbWUgfHwgJ015IERvY3VtZW50YXRpb24nLFxuICAgICAgICAgICAgc2x1Zzogc3ViZG9tYWluVG9SZWdpc3RlcixcbiAgICAgICAgICAgIHN1YmRvbWFpbjogc3ViZG9tYWluVG9SZWdpc3RlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIGlmICghcmVnaXN0ZXJSZXNwb25zZS5vaykge1xuICAgICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlZ2lzdGVyUmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IGVycm9yOiAnVW5rbm93biBlcnJvcicgfSkpIGFzIHsgZXJyb3I/OiBzdHJpbmc7IGRldGFpbHM/OiBzdHJpbmcgfVxuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yRGF0YS5lcnJvciB8fCBgSFRUUCAke3JlZ2lzdGVyUmVzcG9uc2Uuc3RhdHVzfWBcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBJZiBzdWJkb21haW4gaXMgdGFrZW4sIGFzayBmb3IgYSBuZXcgb25lXG4gICAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSB8fCBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgdGFrZW4nKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICAgICAgICBsb2dnZXIud2FybihgU3ViZG9tYWluIFwiJHtzdWJkb21haW5Ub1JlZ2lzdGVyfVwiIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuYClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHN1Z2dlc3Rpb24gZnJvbSBBUElcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJpbGl0eSA9IGF3YWl0IGNoZWNrU3ViZG9tYWluQXZhaWxhYmlsaXR5KHN1YmRvbWFpblRvUmVnaXN0ZXIsIGFwaVVybClcbiAgICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb24gPSBhdmFpbGFiaWxpdHkuc3VnZ2VzdGlvbiB8fCBgJHtzdWJkb21haW5Ub1JlZ2lzdGVyfS1kb2NzYFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBTdWdnZXN0aW9uOiAke3N1Z2dlc3Rpb259LmRldmRvYy5zaGApXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gUHJvbXB0IGZvciBuZXcgc3ViZG9tYWluXG4gICAgICAgICAgICBsZXQgbmV3U3ViZG9tYWluID0gYXdhaXQgcHJvbXB0KCdFbnRlciBhIG5ldyBzdWJkb21haW4nLCBzdWdnZXN0aW9uKVxuICAgICAgICAgICAgbmV3U3ViZG9tYWluID0gbmV3U3ViZG9tYWluLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSBmb3JtYXRcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdENoZWNrID0gaXNWYWxpZFN1YmRvbWFpbkZvcm1hdChuZXdTdWJkb21haW4pXG4gICAgICAgICAgICBpZiAoIWZvcm1hdENoZWNrLnZhbGlkKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihmb3JtYXRDaGVjay5lcnJvciEpXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHN1YmRvbWFpblRvUmVnaXN0ZXIgPSBuZXdTdWJkb21haW5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJSZXN1bHQgPSBhd2FpdCByZWdpc3RlclJlc3BvbnNlLmpzb24oKSBhcyBSZWdpc3RlclJlc3BvbnNlXG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgbG9jYWwgY29uZmlnIHdpdGggQVBJIGtleVxuICAgICAgICBhcGlLZXkgPSByZWdpc3RlclJlc3VsdC5hcGlLZXlcbiAgICAgICAgZXhpc3RpbmdTbHVnID0gcmVnaXN0ZXJSZXN1bHQuc2x1Z1xuICAgICAgICBleGlzdGluZ1N1YmRvbWFpbiA9IHJlZ2lzdGVyUmVzdWx0LnN1YmRvbWFpblxuICAgICAgICBcbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBjb25maWdcbiAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZzogRGV2RG9jQ29uZmlnID0ge1xuICAgICAgICAgIC4uLmRldmRvY0NvbmZpZyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IHJlZ2lzdGVyUmVzdWx0LnByb2plY3RJZCxcbiAgICAgICAgICBzbHVnOiByZWdpc3RlclJlc3VsdC5zbHVnLFxuICAgICAgICAgIHN1YmRvbWFpbjogcmVnaXN0ZXJSZXN1bHQuc3ViZG9tYWluLFxuICAgICAgICAgIGFwaUtleTogcmVnaXN0ZXJSZXN1bHQuYXBpS2V5LFxuICAgICAgICAgIHVybDogcmVnaXN0ZXJSZXN1bHQudXJsLFxuICAgICAgICB9XG4gICAgICAgIGZzLndyaXRlSnNvblN5bmMoZGV2ZG9jQ29uZmlnUGF0aCwgdXBkYXRlZENvbmZpZywgeyBzcGFjZXM6IDIgfSlcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgU3ViZG9tYWluICR7cmVnaXN0ZXJSZXN1bHQuc3ViZG9tYWlufS5kZXZkb2Muc2ggcmVnaXN0ZXJlZCFgKVxuICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgcmVnaXN0ZXJlZCA9IHRydWVcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlZ2lzdGVyIHN1YmRvbWFpbjogJHttZXNzYWdlfWApXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLy8gQ29sbGVjdCBhbGwgY29udGVudCBmaWxlc1xuICBsb2dnZXIuaW5mbygnQnVuZGxpbmcgY29udGVudC4uLicpXG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgY29sbGVjdEZpbGVzKHByb2plY3RSb290KVxuICBsb2dnZXIuc3VjY2Vzcyhg4pyTIEZvdW5kICR7ZmlsZXMubGVuZ3RofSBjb250ZW50IGZpbGVzYClcbiAgXG4gIC8vIENvbGxlY3QgdGhlbWUuanNvblxuICBjb25zdCB0aGVtZUpzb24gPSBjb2xsZWN0VGhlbWVKc29uKHByb2plY3RSb290KVxuICBpZiAodGhlbWVKc29uKSB7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ+KckyBGb3VuZCB0aGVtZS5qc29uJylcbiAgfVxuICBcbiAgLy8gQ29sbGVjdCBPcGVuQVBJIHNwZWNzIGJhc2VkIG9uIGRvY3MuanNvbiBuYXZpZ2F0aW9uXG4gIGNvbnN0IG9wZW5BcGlTcGVjcyA9IGF3YWl0IGNvbGxlY3RPcGVuQXBpU3BlY3MocHJvamVjdFJvb3QsIGNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgY29uc3Qgc3BlY0NvdW50ID0gT2JqZWN0LmtleXMob3BlbkFwaVNwZWNzKS5sZW5ndGhcbiAgaWYgKHNwZWNDb3VudCA+IDApIHtcbiAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTIEZvdW5kICR7c3BlY0NvdW50fSBPcGVuQVBJIHNwZWMocylgKVxuICB9XG4gIFxuICAvLyBDb2xsZWN0IGJpbmFyeSBhc3NldHNcbiAgY29uc3QgYXNzZXRzID0gYXdhaXQgY29sbGVjdEFzc2V0cyhwcm9qZWN0Um9vdClcbiAgaWYgKGFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdG90YWxBc3NldFNpemUgPSBhc3NldHMucmVkdWNlKChzdW0sIGEpID0+IHN1bSArIGEuc2l6ZSwgMClcbiAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTIEZvdW5kICR7YXNzZXRzLmxlbmd0aH0gYXNzZXRzICgke2Zvcm1hdFNpemUodG90YWxBc3NldFNpemUpfSlgKVxuICB9XG4gIFxuICAvLyBDYWxjdWxhdGUgYnVuZGxlIHNpemVcbiAgY29uc3QgdG90YWxTaXplID0gZmlsZXMucmVkdWNlKChzdW0sIGYpID0+IHN1bSArIGYuY29udGVudC5sZW5ndGgsIDApXG4gIGNvbnN0IHNpemVLQiA9ICh0b3RhbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpXG4gIGxvZ2dlci5pbmZvKGBDb250ZW50IGJ1bmRsZTogJHtzaXplS0J9IEtCYClcbiAgXG4gIC8vIFVwbG9hZCBiaW5hcnkgYXNzZXRzIGZpcnN0ICh3aXRoIHByb2dyZXNzKVxuICBpZiAoYXNzZXRzLmxlbmd0aCA+IDAgJiYgZXhpc3RpbmdTbHVnICYmIGFwaUtleSkge1xuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGxvZ2dlci5pbmZvKCdVcGxvYWRpbmcgYXNzZXRzLi4uJylcbiAgICBcbiAgICBjb25zdCBhc3NldFJlc3VsdHMgPSBhd2FpdCB1cGxvYWRBc3NldHMoYXNzZXRzLCBhcGlVcmwsIGV4aXN0aW5nU2x1ZywgYXBpS2V5KVxuICAgIGNvbnN0IHN1Y2Nlc3NDb3VudCA9IGFzc2V0UmVzdWx0cy5maWx0ZXIociA9PiByLnN1Y2Nlc3MpLmxlbmd0aFxuICAgIGNvbnN0IGZhaWxDb3VudCA9IGFzc2V0UmVzdWx0cy5maWx0ZXIociA9PiAhci5zdWNjZXNzKS5sZW5ndGhcbiAgICBcbiAgICBpZiAoZmFpbENvdW50ID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYCR7c3VjY2Vzc0NvdW50fSBhc3NldHMgdXBsb2FkZWQsICR7ZmFpbENvdW50fSBmYWlsZWRgKVxuICAgIH0gZWxzZSBpZiAoc3VjY2Vzc0NvdW50ID4gMCkge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYOKckyAke3N1Y2Nlc3NDb3VudH0gYXNzZXRzIHVwbG9hZGVkYClcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXNzZXRzLmxlbmd0aCA+IDAgJiYgIWV4aXN0aW5nU2x1Zykge1xuICAgIGxvZ2dlci5pbmZvKCdBc3NldHMgd2lsbCBiZSB1cGxvYWRlZCBvbiBuZXh0IGRlcGxveSAoYWZ0ZXIgcHJvamVjdCByZWdpc3RyYXRpb24pJylcbiAgfVxuICBcbiAgLy8gRGVwbG95IGNvbnRlbnQgdG8gQVBJXG4gIGNvbnNvbGUubG9nKCcnKVxuICBsb2dnZXIuaW5mbygnVXBsb2FkaW5nIGNvbnRlbnQuLi4nKVxuICBcbiAgdHJ5IHtcbiAgICBpbnRlcmZhY2UgRGVwbG95UmVzcG9uc2Uge1xuICAgICAgc3VjY2VzczogYm9vbGVhblxuICAgICAgc2x1Zzogc3RyaW5nXG4gICAgICB1cmw6IHN0cmluZ1xuICAgICAgYmxvYlVybDogc3RyaW5nXG4gICAgICBpc1VwZGF0ZTogYm9vbGVhblxuICAgICAgZmlsZXNDb3VudDogbnVtYmVyXG4gICAgICBhcGlLZXk/OiBzdHJpbmdcbiAgICAgIGVycm9yPzogc3RyaW5nXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgQVBJIGtleSBoZWFkZXIgZm9yIHVwZGF0ZXNcbiAgICBpZiAoYXBpS2V5KSB7XG4gICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7YXBpS2V5fWBcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9kZXBsb3lgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICByZWRpcmVjdDogJ2ZvbGxvdycsIC8vIEZvbGxvdyByZWRpcmVjdHNcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbmFtZTogY29uZmlnLm5hbWUgfHwgJ015IERvY3VtZW50YXRpb24nLFxuICAgICAgICBzbHVnOiBleGlzdGluZ1NsdWcsXG4gICAgICAgIGRvY3NKc29uOiBjb25maWcsXG4gICAgICAgIHRoZW1lSnNvbixcbiAgICAgICAgb3BlbkFwaVNwZWNzLFxuICAgICAgICBmaWxlcyxcbiAgICAgICAgYXBpS2V5LCAvLyBBbHNvIHNlbmQgaW4gYm9keSBhcyBmYWxsYmFja1xuICAgICAgfSksXG4gICAgfSlcbiAgICBcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZXJyb3I6ICdVbmtub3duIGVycm9yJyB9KSkgYXMgeyBlcnJvcj86IHN0cmluZzsgZGV0YWlscz86IHN0cmluZyB9XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvckRhdGEuZXJyb3IgfHwgYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9YFxuICAgICAgY29uc3QgZGV0YWlscyA9IGVycm9yRGF0YS5kZXRhaWxzID8gYFxcbiAgIERldGFpbHM6ICR7ZXJyb3JEYXRhLmRldGFpbHN9YCA6ICcnXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3JNZXNzYWdlfSR7ZGV0YWlsc31gKVxuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRGVwbG95UmVzcG9uc2VcbiAgICBcbiAgICAvLyBTYXZlIHByb2plY3QgY29uZmlnIGZvciBmdXR1cmUgdXBkYXRlc1xuICAgIGNvbnN0IG5ld0RldkRvY0NvbmZpZzogRGV2RG9jQ29uZmlnID0ge1xuICAgICAgc2x1ZzogcmVzdWx0LnNsdWcsXG4gICAgICB1cmw6IHJlc3VsdC51cmwsXG4gICAgICBsYXN0RGVwbG95ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9XG4gICAgXG4gICAgLy8gU2F2ZSBBUEkga2V5IChmcm9tIHJlc3BvbnNlIGZvciBuZXcgcHJvamVjdHMsIG9yIGV4aXN0aW5nIGZvciB1cGRhdGVzKVxuICAgIGlmIChyZXN1bHQuYXBpS2V5KSB7XG4gICAgICBuZXdEZXZEb2NDb25maWcuYXBpS2V5ID0gcmVzdWx0LmFwaUtleVxuICAgIH0gZWxzZSBpZiAoYXBpS2V5KSB7XG4gICAgICBuZXdEZXZEb2NDb25maWcuYXBpS2V5ID0gYXBpS2V5XG4gICAgfVxuICAgIFxuICAgIGZzLndyaXRlSnNvblN5bmMoZGV2ZG9jQ29uZmlnUGF0aCwgbmV3RGV2RG9jQ29uZmlnLCB7IHNwYWNlczogMiB9KVxuICAgIFxuICAgIC8vIFN1Y2Nlc3MgbWVzc2FnZVxuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGxvZ2dlci5zdWNjZXNzKCdEZXBsb3ltZW50IHN1Y2Nlc3NmdWwhJylcbiAgICBjb25zb2xlLmxvZygnJylcbiAgICBjb25zb2xlLmxvZyhgICBZb3VyIGRvY3MgYXJlIGxpdmUgYXQ6YClcbiAgICBjb25zb2xlLmxvZyhgICAke2xvZ2dlci5jeWFuKHJlc3VsdC51cmwpfWApXG4gICAgY29uc29sZS5sb2coJycpXG4gICAgXG4gICAgaWYgKHJlc3VsdC5pc1VwZGF0ZSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ1Byb2plY3QgdXBkYXRlZCB3aXRoIG5ldyBjb250ZW50JylcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oYFByb2plY3Qgc2x1ZzogJHtyZXN1bHQuc2x1Z31gKVxuICAgICAgbG9nZ2VyLmluZm8oJ1J1biBcImRldmRvYyBkZXBsb3lcIiBhZ2FpbiB0byB1cGRhdGUnKVxuICAgICAgXG4gICAgICAvLyBTaG93IEFQSSBrZXkgd2FybmluZyBmb3IgbmV3IHByb2plY3RzXG4gICAgICBpZiAocmVzdWx0LmFwaUtleSkge1xuICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgbG9nZ2VyLndhcm4oJ+KaoO+4jyAgU2F2ZSB5b3VyIEFQSSBrZXkgZm9yIENJL0NEIGRlcGxveW1lbnRzOicpXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtyZXN1bHQuYXBpS2V5fWApXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICBsb2dnZXIuaW5mbygnQVBJIGtleSBzYXZlZCB0byAuZGV2ZG9jLmpzb24gKGFkZCB0byAuZ2l0aWdub3JlISknKVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgZG9tYWluLmpzb24gYW5kIHNob3cgY3VzdG9tIGRvbWFpbiBzdGF0dXNcbiAgICBhd2FpdCBjaGVja0N1c3RvbURvbWFpblN0YXR1cyhwcm9qZWN0Um9vdCwgYXBpVXJsLCBhcGlLZXkgfHwgcmVzdWx0LmFwaUtleSB8fCAnJylcbiAgICBcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgbG9nZ2VyLmVycm9yKGBEZXBsb3ltZW50IGZhaWxlZDogJHttZXNzYWdlfWApXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IE9wZW5BUEkgc3BlY3MgYmFzZWQgb24gZG9jcy5qc29uIG5hdmlnYXRpb24gdGFic1xuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0T3BlbkFwaVNwZWNzKFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBkb2NzSnNvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgT3BlbkFwaVNwZWM+PiB7XG4gIGNvbnN0IHNwZWNzOiBSZWNvcmQ8c3RyaW5nLCBPcGVuQXBpU3BlYz4gPSB7fVxuICBcbiAgLy8gR2V0IG5hdmlnYXRpb24gZnJvbSBkb2NzLmpzb24gLSBjb3VsZCBiZSBvYmplY3Qgd2l0aCB0YWJzIG9yIGFycmF5XG4gIGNvbnN0IG5hdmlnYXRpb24gPSBkb2NzSnNvbi5uYXZpZ2F0aW9uIGFzIHsgdGFicz86IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9IHwgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkXG4gIGlmICghbmF2aWdhdGlvbikgcmV0dXJuIHNwZWNzXG4gIFxuICAvLyBIYW5kbGUgYm90aCB7IHRhYnM6IFsuLi5dIH0gYW5kIGRpcmVjdCBhcnJheSBmb3JtYXRzXG4gIGNvbnN0IHRhYnMgPSBBcnJheS5pc0FycmF5KG5hdmlnYXRpb24pID8gbmF2aWdhdGlvbiA6IChuYXZpZ2F0aW9uLnRhYnMgfHwgW10pXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGFicykge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gT3BlbkFQSSB0YWJcbiAgICBpZiAoaXRlbS50eXBlID09PSAnb3BlbmFwaScpIHtcbiAgICAgIC8vIFNwZWMgY2FuIGJlIGRpcmVjdGx5IG9uIHRhYiBvciBuZXN0ZWQgaW4gdmVyc2lvbnMgYXJyYXlcbiAgICAgIGNvbnN0IHZlcnNpb25zID0gaXRlbS52ZXJzaW9ucyBhcyBBcnJheTx7IHNwZWM6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0+IHwgdW5kZWZpbmVkXG4gICAgICBcbiAgICAgIGlmICh2ZXJzaW9ucyAmJiBBcnJheS5pc0FycmF5KHZlcnNpb25zKSkge1xuICAgICAgICAvLyBIYW5kbGUgdmVyc2lvbmVkIHNwZWNzXG4gICAgICAgIGZvciAoY29uc3QgdmVyc2lvbiBvZiB2ZXJzaW9ucykge1xuICAgICAgICAgIGlmICh2ZXJzaW9uLnNwZWMpIHtcbiAgICAgICAgICAgIGF3YWl0IGxvYWRTcGVjKHByb2plY3RSb290LCB2ZXJzaW9uLnNwZWMsIHNwZWNzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpdGVtLnNwZWMpIHtcbiAgICAgICAgLy8gSGFuZGxlIGRpcmVjdCBzcGVjIHJlZmVyZW5jZVxuICAgICAgICBhd2FpdCBsb2FkU3BlYyhwcm9qZWN0Um9vdCwgaXRlbS5zcGVjIGFzIHN0cmluZywgc3BlY3MpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gc3BlY3Ncbn1cblxuLyoqXG4gKiBMb2FkIGEgc2luZ2xlIE9wZW5BUEkgc3BlYyBpbnRvIHRoZSBzcGVjcyBtYXBcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFNwZWMoXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIHNwZWNQYXRoOiBzdHJpbmcsXG4gIHNwZWNzOiBSZWNvcmQ8c3RyaW5nLCBPcGVuQXBpU3BlYz5cbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBSZXNvbHZlIHRoZSBzcGVjIHBhdGggcmVsYXRpdmUgdG8gcHJvamVjdCByb290XG4gIGxldCBmdWxsU3BlY1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsIHNwZWNQYXRoKVxuICBcbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhzIGxpa2UgLi9mYWNlYm9vay9vcGVuYXBpLmpzb25cbiAgaWYgKHNwZWNQYXRoLnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICBmdWxsU3BlY1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsIHNwZWNQYXRoLnNsaWNlKDIpKVxuICB9XG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyhmdWxsU3BlY1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNwZWNDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxTcGVjUGF0aCwgJ3V0Zi04JylcbiAgICAgIGNvbnN0IHNwZWNEYXRhID0gSlNPTi5wYXJzZShzcGVjQ29udGVudCkgYXMgT3BlbkFwaVNwZWNcbiAgICAgIHNwZWNzW3NwZWNQYXRoXSA9IHNwZWNEYXRhXG4gICAgICBsb2dnZXIuaW5mbyhgICDihpIgJHtzcGVjUGF0aH1gKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHBhcnNlIE9wZW5BUEkgc3BlYyAke3NwZWNQYXRofTogJHttZXNzYWdlfWApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZ2dlci53YXJuKGBPcGVuQVBJIHNwZWMgZmlsZSBub3QgZm91bmQ6ICR7c3BlY1BhdGh9YClcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgdGhlbWUuanNvbiBpZiBpdCBleGlzdHNcbiAqL1xuZnVuY3Rpb24gY29sbGVjdFRoZW1lSnNvbihwcm9qZWN0Um9vdDogc3RyaW5nKTogb2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGhlbWVQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCAndGhlbWUuanNvbicpXG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyh0aGVtZVBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRoZW1lQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0aGVtZVBhdGgsICd1dGYtOCcpXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGVtZUNvbnRlbnQpIGFzIG9iamVjdFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHBhcnNlIHRoZW1lLmpzb246ICR7bWVzc2FnZX1gKVxuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIENvbGxlY3QgYWxsIE1EWCBhbmQgY29udGVudCBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RGaWxlcyhwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxQcm9qZWN0RmlsZVtdPiB7XG4gIGNvbnN0IGZpbGVzOiBQcm9qZWN0RmlsZVtdID0gW11cbiAgXG4gIC8vIFNjYW4gYWxsIGRpcmVjdG9yaWVzIGluIHByb2plY3Qgcm9vdCAobm90IGp1c3QgaGFyZGNvZGVkIGxpc3QpXG4gIGNvbnN0IGl0ZW1zID0gZnMucmVhZGRpclN5bmMocHJvamVjdFJvb3QpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAvLyBTa2lwIGNvbW1vbiBkaXJlY3RvcmllcyB0aGF0IHNob3VsZG4ndCBiZSBzY2FubmVkXG4gICAgaWYgKFtcbiAgICAgICdub2RlX21vZHVsZXMnLCBcbiAgICAgICdkaXN0JywgXG4gICAgICAnLm5leHQnLCBcbiAgICAgICcuZ2l0JywgXG4gICAgICAncHVibGljJyxcbiAgICAgICcuZGV2ZG9jJyxcbiAgICAgICcuY2xhdWRlJyxcbiAgICAgICcuY3Vyc29yJyxcbiAgICBdLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgaXRlbSlcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpXG4gICAgXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgLy8gU2tpcCBhc3NldHMgZm9sZGVyIGZvciBNRFggc2Nhbm5pbmcgKGhhbmRsZWQgc2VwYXJhdGVseSlcbiAgICAgIGlmIChpdGVtID09PSAnYXNzZXRzJykgY29udGludWVcbiAgICAgIGF3YWl0IHNjYW5EaXJlY3RvcnkoZnVsbFBhdGgsIHByb2plY3RSb290LCBmaWxlcylcbiAgICB9IGVsc2UgaWYgKGl0ZW0uZW5kc1dpdGgoJy5tZHgnKSB8fCBpdGVtLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgLy8gSW5jbHVkZSByb290LWxldmVsIE1EWCBmaWxlc1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0Zi04JylcbiAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBpdGVtLCBjb250ZW50IH0pXG4gICAgfSBlbHNlIGlmIChpdGVtID09PSAnZG9jcy5qc29uJyB8fCBpdGVtID09PSAndGhlbWUuanNvbicgfHwgaXRlbSA9PT0gJ2RvbWFpbi5qc29uJyB8fCBpdGVtID09PSAnY3VzdG9tLmNzcycpIHtcbiAgICAgIC8vIEluY2x1ZGUgY29uZmlnIGZpbGVzXG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmLTgnKVxuICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGl0ZW0sIGNvbnRlbnQgfSlcbiAgICB9XG4gIH1cbiAgXG4gIC8vIEluY2x1ZGUgdGV4dC1iYXNlZCBhc3NldHMgZnJvbSBhc3NldHMgZm9sZGVyIChTVkcsIEpTT04pXG4gIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2Fzc2V0cycpXG4gIGlmIChmcy5leGlzdHNTeW5jKGFzc2V0c0RpcikpIHtcbiAgICBhd2FpdCBzY2FuUHVibGljQXNzZXRzKGFzc2V0c0RpciwgcHJvamVjdFJvb3QsIGZpbGVzKVxuICB9XG4gIFxuICByZXR1cm4gZmlsZXNcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBzY2FuIGEgZGlyZWN0b3J5IGZvciBNRFggZmlsZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2NhbkRpcmVjdG9yeShcbiAgZGlyOiBzdHJpbmcsXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIGZpbGVzOiBQcm9qZWN0RmlsZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAvLyBTa2lwIGNvbW1vbiBkaXJlY3Rvcmllc1xuICAgIGlmIChbJ25vZGVfbW9kdWxlcycsICdkaXN0JywgJy5uZXh0JywgJy5naXQnLCAncHVibGljJ10uaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgaXRlbSlcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpXG4gICAgXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgYXdhaXQgc2NhbkRpcmVjdG9yeShmdWxsUGF0aCwgcHJvamVjdFJvb3QsIGZpbGVzKVxuICAgIH0gZWxzZSBpZiAoaXRlbS5lbmRzV2l0aCgnLm1keCcpIHx8IGl0ZW0uZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBmdWxsUGF0aClcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsICd1dGYtOCcpXG4gICAgICBcbiAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNjYW4gcHVibGljIGFzc2V0cyAoU1ZHLCBKU09OLCBDU1MpIC0gdGV4dC1iYXNlZCBvbmx5IGZvciBjb250ZW50IGJ1bmRsZVxuICovXG5hc3luYyBmdW5jdGlvbiBzY2FuUHVibGljQXNzZXRzKFxuICBkaXI6IHN0cmluZyxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgZmlsZXM6IFByb2plY3RGaWxlW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpdGVtcyA9IGZzLnJlYWRkaXJTeW5jKGRpcilcbiAgXG4gIC8vIFRleHQtYmFzZWQgZmlsZSBleHRlbnNpb25zIHRvIGluY2x1ZGUgaW4gY29udGVudCBidW5kbGVcbiAgY29uc3QgVEVYVF9FWFRFTlNJT05TID0gWycuc3ZnJywgJy5qc29uJywgJy5jc3MnXVxuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBpdGVtKVxuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aClcbiAgICBcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCBzY2FuUHVibGljQXNzZXRzKGZ1bGxQYXRoLCBwcm9qZWN0Um9vdCwgZmlsZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpdGVtKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoVEVYVF9FWFRFTlNJT05TLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgLy8gT25seSBpbmNsdWRlIHRleHQtYmFzZWQgYXNzZXRzIGluIGNvbnRlbnQgYnVuZGxlXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGZ1bGxQYXRoKVxuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmLTgnKVxuICAgICAgICBcbiAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBiaW5hcnkgYXNzZXRzIGZyb20gYXNzZXRzIGZvbGRlclxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QXNzZXRzKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPEFzc2V0RmlsZVtdPiB7XG4gIGNvbnN0IGFzc2V0czogQXNzZXRGaWxlW10gPSBbXVxuICBcbiAgLy8gQ2hlY2sgYXNzZXRzIGZvbGRlclxuICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdhc3NldHMnKVxuICBpZiAoZnMuZXhpc3RzU3luYyhhc3NldHNEaXIpKSB7XG4gICAgYXdhaXQgc2NhbkJpbmFyeUFzc2V0cyhhc3NldHNEaXIsIHByb2plY3RSb290LCBhc3NldHMpXG4gIH1cbiAgXG4gIHJldHVybiBhc3NldHNcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBzY2FuIGZvciBiaW5hcnkgYXNzZXRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjYW5CaW5hcnlBc3NldHMoXG4gIGRpcjogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBhc3NldHM6IEFzc2V0RmlsZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGl0ZW0pXG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGxQYXRoKVxuICAgIFxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGF3YWl0IHNjYW5CaW5hcnlBc3NldHMoZnVsbFBhdGgsIHByb2plY3RSb290LCBhc3NldHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpdGVtKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoQklOQVJZX0VYVEVOU0lPTlMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICAvLyBDaGVjayBzaXplIGxpbWl0XG4gICAgICAgIGlmIChzdGF0LnNpemUgPiBNQVhfQVNTRVRfU0laRSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBTa2lwcGluZyAke2l0ZW19OiBleGNlZWRzIDI1TUIgbGltaXQgKCR7Zm9ybWF0U2l6ZShzdGF0LnNpemUpfSlgKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGZ1bGxQYXRoKVxuICAgICAgICBhc3NldHMucHVzaCh7XG4gICAgICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGZ1bGxQYXRoLFxuICAgICAgICAgIHNpemU6IHN0YXQuc2l6ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVcGxvYWQgYXNzZXRzIHdpdGggcHJvZ3Jlc3MgdHJhY2tpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBsb2FkQXNzZXRzKFxuICBhc3NldHM6IEFzc2V0RmlsZVtdLFxuICBhcGlVcmw6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxBcnJheTx7IGZpbGU6IHN0cmluZzsgc3VjY2VzczogYm9vbGVhbjsgdXJsPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9Pj4ge1xuICBjb25zdCByZXN1bHRzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgc3VjY2VzczogYm9vbGVhbjsgdXJsPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9PiA9IFtdXG4gIFxuICBmb3IgKGNvbnN0IGFzc2V0IG9mIGFzc2V0cykge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShhc3NldC5wYXRoKVxuICAgIFxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7ZmlsZU5hbWV9OiBgKVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGxvYWRBc3NldFdpdGhQcm9ncmVzcyhcbiAgICAgICAgYXNzZXQsXG4gICAgICAgIGFwaVVybCxcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgYXBpS2V5LFxuICAgICAgICAocHJvZ3Jlc3MsIGxvYWRlZCwgdG90YWwpID0+IHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQuY3Vyc29yVG8oMClcbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7ZmlsZU5hbWV9OiAke2NyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzKX0gJHtmb3JtYXRTaXplKGxvYWRlZCl9LyR7Zm9ybWF0U2l6ZSh0b3RhbCl9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIFxuICAgICAgaWYgKHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICBwcm9jZXNzLnN0ZG91dC5jdXJzb3JUbygwKVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIuZ3JlZW4oJ+KckycpfSAke2ZpbGVOYW1lfSAoJHtmb3JtYXRTaXplKGFzc2V0LnNpemUpfSlgKVxuICAgICAgXG4gICAgICByZXN1bHRzLnB1c2goeyBmaWxlOiBmaWxlTmFtZSwgc3VjY2VzczogdHJ1ZSwgdXJsOiByZXN1bHQudXJsIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIFxuICAgICAgaWYgKHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICBwcm9jZXNzLnN0ZG91dC5jdXJzb3JUbygwKVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIucmVkKCfinJcnKX0gJHtmaWxlTmFtZX06ICR7bWVzc2FnZX1gKVxuICAgICAgXG4gICAgICByZXN1bHRzLnB1c2goeyBmaWxlOiBmaWxlTmFtZSwgc3VjY2VzczogZmFsc2UsIGVycm9yOiBtZXNzYWdlIH0pXG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gcmVzdWx0c1xufVxuXG4vKipcbiAqIFVwbG9hZCBhIHNpbmdsZSBhc3NldCB3aXRoIHByb2dyZXNzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZEFzc2V0V2l0aFByb2dyZXNzKFxuICBhc3NldDogQXNzZXRGaWxlLFxuICBhcGlVcmw6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZyxcbiAgb25Qcm9ncmVzczogKHByb2dyZXNzOiBudW1iZXIsIGxvYWRlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PiB2b2lkXG4pOiBQcm9taXNlPHsgdXJsOiBzdHJpbmcgfT4ge1xuICBjb25zdCBmaWxlQnVmZmVyID0gZnMucmVhZEZpbGVTeW5jKGFzc2V0LmZ1bGxQYXRoKVxuICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoYXNzZXQucGF0aClcbiAgY29uc3QgbWltZVR5cGUgPSBnZXRNaW1lVHlwZShhc3NldC5mdWxsUGF0aClcbiAgXG4gIC8vIEJ1aWxkIG11bHRpcGFydCBmb3JtIGRhdGFcbiAgY29uc3QgYm91bmRhcnkgPSBgLS0tLURldkRvY0RlcGxveSR7RGF0ZS5ub3coKX1gXG4gIGNvbnN0IENSTEYgPSAnXFxyXFxuJ1xuICBcbiAgY29uc3QgaGVhZGVyID0gW1xuICAgIGAtLSR7Ym91bmRhcnl9YCxcbiAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiZmlsZVwiOyBmaWxlbmFtZT1cIiR7ZmlsZU5hbWV9XCJgLFxuICAgIGBDb250ZW50LVR5cGU6ICR7bWltZVR5cGV9YCxcbiAgICAnJyxcbiAgICAnJ1xuICBdLmpvaW4oQ1JMRilcbiAgXG4gIGNvbnN0IHNsdWdQYXJ0ID0gW1xuICAgICcnLFxuICAgIGAtLSR7Ym91bmRhcnl9YCxcbiAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwic2x1Z1wiYCxcbiAgICAnJyxcbiAgICBzbHVnLFxuICAgICcnXG4gIF0uam9pbihDUkxGKVxuICBcbiAgY29uc3QgcGF0aFBhcnQgPSBbXG4gICAgYC0tJHtib3VuZGFyeX1gLFxuICAgIGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJwYXRoXCJgLFxuICAgICcnLFxuICAgIGFzc2V0LnBhdGgucmVwbGFjZSgvXmFzc2V0c1xcLy8sICcnKSwgLy8gUmVtb3ZlIGFzc2V0cy8gcHJlZml4XG4gICAgJydcbiAgXS5qb2luKENSTEYpXG4gIFxuICBjb25zdCBmb290ZXIgPSBgJHtDUkxGfS0tJHtib3VuZGFyeX0tLSR7Q1JMRn1gXG4gIFxuICBjb25zdCBoZWFkZXJCdWZmZXIgPSBCdWZmZXIuZnJvbShoZWFkZXIpXG4gIGNvbnN0IHNsdWdCdWZmZXIgPSBCdWZmZXIuZnJvbShzbHVnUGFydClcbiAgY29uc3QgcGF0aEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHBhdGhQYXJ0KVxuICBjb25zdCBmb290ZXJCdWZmZXIgPSBCdWZmZXIuZnJvbShmb290ZXIpXG4gIFxuICBjb25zdCB0b3RhbFNpemUgPSBoZWFkZXJCdWZmZXIubGVuZ3RoICsgZmlsZUJ1ZmZlci5sZW5ndGggKyBzbHVnQnVmZmVyLmxlbmd0aCArIHBhdGhCdWZmZXIubGVuZ3RoICsgZm9vdGVyQnVmZmVyLmxlbmd0aFxuICBjb25zdCBib2R5ID0gQnVmZmVyLmNvbmNhdChbaGVhZGVyQnVmZmVyLCBmaWxlQnVmZmVyLCBzbHVnQnVmZmVyLCBwYXRoQnVmZmVyLCBmb290ZXJCdWZmZXJdKVxuICBcbiAgLy8gU2ltdWxhdGUgcHJvZ3Jlc3NcbiAgbGV0IHVwbG9hZGVkID0gMFxuICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmNlaWwodG90YWxTaXplIC8gMjApXG4gIFxuICBjb25zdCBwcm9ncmVzc0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh1cGxvYWRlZCA8IHRvdGFsU2l6ZSAqIDAuOSkge1xuICAgICAgdXBsb2FkZWQgPSBNYXRoLm1pbih1cGxvYWRlZCArIGNodW5rU2l6ZSwgdG90YWxTaXplICogMC45KVxuICAgICAgb25Qcm9ncmVzcyh1cGxvYWRlZCAvIHRvdGFsU2l6ZSwgdXBsb2FkZWQsIHRvdGFsU2l6ZSlcbiAgICB9XG4gIH0sIDUwKVxuICBcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL2Fzc2V0cy91cGxvYWRgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0ke2JvdW5kYXJ5fWAsXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHksXG4gICAgfSlcbiAgICBcbiAgICBjbGVhckludGVydmFsKHByb2dyZXNzSW50ZXJ2YWwpXG4gICAgb25Qcm9ncmVzcygxLCB0b3RhbFNpemUsIHRvdGFsU2l6ZSlcbiAgICBcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBlcnJvcjogJ1VwbG9hZCBmYWlsZWQnIH0pKSBhcyB7IGVycm9yPzogc3RyaW5nIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgeyB1cmw6IHN0cmluZyB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NJbnRlcnZhbClcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbi8qKlxuICogRm9ybWF0IGZpbGUgc2l6ZSBmb3IgZGlzcGxheVxuICovXG5mdW5jdGlvbiBmb3JtYXRTaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMgPCAxMDI0KSByZXR1cm4gYCR7Ynl0ZXN9IEJgXG4gIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0KSByZXR1cm4gYCR7KGJ5dGVzIC8gMTAyNCkudG9GaXhlZCgxKX0gS0JgXG4gIHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpfSBNQmBcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBwcm9ncmVzcyBiYXIgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgPSAzMCk6IHN0cmluZyB7XG4gIGNvbnN0IGZpbGxlZCA9IE1hdGgucm91bmQod2lkdGggKiBwcm9ncmVzcylcbiAgY29uc3QgZW1wdHkgPSB3aWR0aCAtIGZpbGxlZFxuICBjb25zdCBiYXIgPSAn4paIJy5yZXBlYXQoZmlsbGVkKSArICfilpEnLnJlcGVhdChlbXB0eSlcbiAgY29uc3QgcGVyY2VudGFnZSA9IE1hdGgucm91bmQocHJvZ3Jlc3MgKiAxMDApXG4gIHJldHVybiBgWyR7YmFyfV0gJHtwZXJjZW50YWdlfSVgXG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -385,43 +385,91 @@ function getOpenApiSpec(specPath) {
|
|
|
385
385
|
status: 404
|
|
386
386
|
});
|
|
387
387
|
}
|
|
388
|
+
// Parse query params for tab selection
|
|
389
|
+
const { searchParams } = new URL(request.url);
|
|
390
|
+
const requestedTabId = searchParams.get('tab');
|
|
391
|
+
const requestedVersion = searchParams.get('version');
|
|
388
392
|
// Parse docs.json from project content
|
|
389
393
|
const docsConfig = JSON.parse(projectContent.docsJson);
|
|
394
|
+
// Parse theme.json if available
|
|
395
|
+
let themeConfig = null;
|
|
396
|
+
if (projectContent.themeJson) {
|
|
397
|
+
try {
|
|
398
|
+
themeConfig = JSON.parse(projectContent.themeJson);
|
|
399
|
+
} catch (e) {
|
|
400
|
+
console.error('[Collections] Failed to parse theme.json:', e);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
390
403
|
// Build navigation tabs and doc groups from config
|
|
391
404
|
// Multi-tenant projects are always in production mode (deployed), so devMode=false
|
|
392
405
|
const navigationTabs = buildNavigationTabs(docsConfig, false);
|
|
393
406
|
const docGroups = buildDocGroupsFromBlob(docsConfig, projectContent);
|
|
394
|
-
//
|
|
395
|
-
|
|
407
|
+
// Find the OpenAPI tab for loading the correct spec
|
|
408
|
+
let openapiTab;
|
|
409
|
+
if (requestedTabId) {
|
|
410
|
+
openapiTab = navigationTabs.find((t)=>t.type === 'openapi' && t.id === requestedTabId);
|
|
411
|
+
}
|
|
412
|
+
// Fallback to first OpenAPI tab if no specific tab requested
|
|
413
|
+
if (!openapiTab) {
|
|
414
|
+
openapiTab = navigationTabs.find((t)=>t.type === 'openapi');
|
|
415
|
+
}
|
|
416
|
+
// Get API versions from the tab
|
|
417
|
+
const apiVersions = openapiTab?.versions || [];
|
|
418
|
+
// Determine which spec to load
|
|
419
|
+
let specPath = null;
|
|
420
|
+
let selectedVersion = null;
|
|
421
|
+
if (apiVersions.length > 0) {
|
|
422
|
+
const versionConfig = requestedVersion ? apiVersions.find((v)=>v.version === requestedVersion) : apiVersions.find((v)=>v.default) || apiVersions[0];
|
|
423
|
+
if (versionConfig) {
|
|
424
|
+
specPath = versionConfig.spec;
|
|
425
|
+
selectedVersion = versionConfig.version;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
// Load OpenAPI spec from blob storage if available
|
|
429
|
+
let collection = null;
|
|
430
|
+
if (specPath && projectContent.openApiSpecs && projectContent.openApiSpecs[specPath]) {
|
|
431
|
+
try {
|
|
432
|
+
const specString = projectContent.openApiSpecs[specPath];
|
|
433
|
+
const spec = JSON.parse(specString);
|
|
434
|
+
// Convert to BrainfishCollection using our parser
|
|
435
|
+
const collections = await importOpenAPISpec(spec);
|
|
436
|
+
collection = collections[0] || null;
|
|
437
|
+
} catch (e) {
|
|
438
|
+
console.error('[Collections] Failed to parse OpenAPI spec:', e);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
// Build the response
|
|
442
|
+
const response = {
|
|
396
443
|
id: projectSlug,
|
|
397
|
-
name: docsConfig.name || 'Documentation',
|
|
398
|
-
description: 'Documentation',
|
|
399
|
-
folders: [],
|
|
400
|
-
requests: [],
|
|
401
|
-
auth: {
|
|
444
|
+
name: collection?.name || docsConfig.name || 'Documentation',
|
|
445
|
+
description: collection?.description || 'Documentation',
|
|
446
|
+
folders: collection?.folders || [],
|
|
447
|
+
requests: collection?.requests || [],
|
|
448
|
+
auth: collection?.auth || {
|
|
402
449
|
authType: 'none',
|
|
403
450
|
authActive: true
|
|
404
451
|
},
|
|
405
|
-
headers: [],
|
|
406
|
-
variables: [],
|
|
452
|
+
headers: collection?.headers || [],
|
|
453
|
+
variables: collection?.variables || [],
|
|
407
454
|
apiSummary: null,
|
|
408
455
|
docGroups,
|
|
409
456
|
navigationTabs,
|
|
410
457
|
changelogReleases: [],
|
|
411
458
|
docsName: docsConfig.name || null,
|
|
412
|
-
docsFavicon:
|
|
413
|
-
docsLogo: null,
|
|
414
|
-
docsHeader: null,
|
|
415
|
-
docsNavbar: null,
|
|
416
|
-
docsColors: null,
|
|
417
|
-
defaultTheme: null,
|
|
459
|
+
docsFavicon: docsConfig.favicon || null,
|
|
460
|
+
docsLogo: themeConfig?.logo || null,
|
|
461
|
+
docsHeader: themeConfig?.header || null,
|
|
462
|
+
docsNavbar: themeConfig?.navbar || null,
|
|
463
|
+
docsColors: themeConfig?.colors || null,
|
|
464
|
+
defaultTheme: themeConfig?.defaultTheme || null,
|
|
418
465
|
customCss: null,
|
|
419
|
-
apiVersions
|
|
420
|
-
selectedApiVersion:
|
|
466
|
+
apiVersions,
|
|
467
|
+
selectedApiVersion: selectedVersion,
|
|
421
468
|
notice: docsConfig.notice || null,
|
|
422
469
|
isMultiTenant: true,
|
|
423
470
|
projectSlug
|
|
424
|
-
}
|
|
471
|
+
};
|
|
472
|
+
return NextResponse.json(response, {
|
|
425
473
|
headers: {
|
|
426
474
|
'Content-Type': 'application/json',
|
|
427
475
|
'Cache-Control': 'public, max-age=60'
|
|
@@ -20,7 +20,7 @@ import { getProjectUrl, isValidSlug } from '@/lib/multi-tenant/context';
|
|
|
20
20
|
try {
|
|
21
21
|
const body = await request.json();
|
|
22
22
|
// Validate request body
|
|
23
|
-
const { name, slug: existingSlug, docsJson, files } = body;
|
|
23
|
+
const { name, slug: existingSlug, docsJson, themeJson, openApiSpecs, files } = body;
|
|
24
24
|
if (!name || typeof name !== 'string') {
|
|
25
25
|
return NextResponse.json({
|
|
26
26
|
error: 'Missing or invalid project name'
|
|
@@ -126,9 +126,9 @@ import { getProjectUrl, isValidSlug } from '@/lib/multi-tenant/context';
|
|
|
126
126
|
// Store or update content
|
|
127
127
|
let result;
|
|
128
128
|
if (isUpdate) {
|
|
129
|
-
result = await updateProjectContent(slug, docsJson, validFiles);
|
|
129
|
+
result = await updateProjectContent(slug, docsJson, validFiles, themeJson, openApiSpecs);
|
|
130
130
|
} else {
|
|
131
|
-
result = await storeProjectContent(slug, name, docsJson, validFiles);
|
|
131
|
+
result = await storeProjectContent(slug, name, docsJson, validFiles, themeJson, openApiSpecs);
|
|
132
132
|
// Store the API key for new projects
|
|
133
133
|
if (apiKey) {
|
|
134
134
|
await storeProjectApiKey(slug, apiKey);
|
|
@@ -30,12 +30,17 @@ function _getFileBlobPath(slug, filePath) {
|
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
32
|
* Store project content in Vercel Blob (or local filesystem in dev)
|
|
33
|
-
*/ export async function storeProjectContent(slug, name, docsJson, files) {
|
|
33
|
+
*/ export async function storeProjectContent(slug, name, docsJson, files, themeJson, openApiSpecs) {
|
|
34
34
|
const now = new Date().toISOString();
|
|
35
35
|
const content = {
|
|
36
36
|
slug,
|
|
37
37
|
name,
|
|
38
38
|
docsJson: JSON.stringify(docsJson),
|
|
39
|
+
themeJson: themeJson ? JSON.stringify(themeJson) : undefined,
|
|
40
|
+
openApiSpecs: openApiSpecs ? Object.fromEntries(Object.entries(openApiSpecs).map(([k, v])=>[
|
|
41
|
+
k,
|
|
42
|
+
JSON.stringify(v)
|
|
43
|
+
])) : undefined,
|
|
39
44
|
files,
|
|
40
45
|
createdAt: now,
|
|
41
46
|
updatedAt: now
|
|
@@ -87,7 +92,7 @@ function _getFileBlobPath(slug, filePath) {
|
|
|
87
92
|
}
|
|
88
93
|
/**
|
|
89
94
|
* Update existing project content
|
|
90
|
-
*/ export async function updateProjectContent(slug, docsJson, files) {
|
|
95
|
+
*/ export async function updateProjectContent(slug, docsJson, files, themeJson, openApiSpecs) {
|
|
91
96
|
// Get existing content to preserve createdAt
|
|
92
97
|
const existing = await getProjectContent(slug);
|
|
93
98
|
const now = new Date().toISOString();
|
|
@@ -95,6 +100,11 @@ function _getFileBlobPath(slug, filePath) {
|
|
|
95
100
|
slug,
|
|
96
101
|
name: existing?.name || slug,
|
|
97
102
|
docsJson: JSON.stringify(docsJson),
|
|
103
|
+
themeJson: themeJson ? JSON.stringify(themeJson) : undefined,
|
|
104
|
+
openApiSpecs: openApiSpecs ? Object.fromEntries(Object.entries(openApiSpecs).map(([k, v])=>[
|
|
105
|
+
k,
|
|
106
|
+
JSON.stringify(v)
|
|
107
|
+
])) : undefined,
|
|
98
108
|
files,
|
|
99
109
|
createdAt: existing?.createdAt || now,
|
|
100
110
|
updatedAt: now
|