@brainfish-ai/devdoc 0.1.51 → 0.1.52

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.
@@ -386,6 +386,85 @@ async function deploy(options) {
386
386
  else if (assets.length > 0 && !existingSlug) {
387
387
  logger_1.logger.info('Assets will be uploaded on next deploy (after project registration)');
388
388
  }
389
+ // Upload ALL OpenAPI specs to blob storage (multi-tenant support)
390
+ const openApiSpecUrls = {};
391
+ if (specCount > 0 && existingSlug && apiKey) {
392
+ console.log('');
393
+ logger_1.logger.info('Uploading OpenAPI specs to blob storage...');
394
+ for (const [specPath, spec] of Object.entries(openApiSpecs)) {
395
+ const specFileName = specPath.replace(/\//g, '_').replace(/\.json$/, '');
396
+ process.stdout.write(` ${specPath}: `);
397
+ try {
398
+ const specContent = JSON.stringify(spec);
399
+ const specBlob = new Blob([specContent], { type: 'application/json' });
400
+ const formData = new FormData();
401
+ formData.append('slug', existingSlug);
402
+ formData.append('fileName', specFileName);
403
+ formData.append('type', 'openapi');
404
+ formData.append('file', specBlob, `${specFileName}.json`);
405
+ const response = await fetch(`${apiUrl}/api/upload/spec`, {
406
+ method: 'POST',
407
+ headers: {
408
+ 'Authorization': `Bearer ${apiKey}`,
409
+ },
410
+ body: formData,
411
+ });
412
+ if (!response.ok) {
413
+ const errorData = await response.json().catch(() => ({ error: 'Unknown error' }));
414
+ throw new Error(errorData.error || `HTTP ${response.status}`);
415
+ }
416
+ const result = await response.json();
417
+ openApiSpecUrls[specPath] = result.url;
418
+ console.log(`${logger_1.logger.green('✓')} uploaded`);
419
+ }
420
+ catch (error) {
421
+ const message = error instanceof Error ? error.message : String(error);
422
+ console.log(`${logger_1.logger.red('✗')} ${message}`);
423
+ }
424
+ }
425
+ }
426
+ else if (specCount > 0 && !existingSlug) {
427
+ logger_1.logger.info('OpenAPI specs will be uploaded on next deploy (after project registration)');
428
+ }
429
+ // Upload ALL GraphQL schemas to blob storage (multi-tenant support)
430
+ const graphqlSchemaUrls = {};
431
+ if (schemaCount > 0 && existingSlug && apiKey) {
432
+ console.log('');
433
+ logger_1.logger.info('Uploading GraphQL schemas to blob storage...');
434
+ for (const [schemaPath, schemaContent] of Object.entries(graphqlSchemas)) {
435
+ const schemaFileName = schemaPath.replace(/\//g, '_').replace(/\.graphql$/, '');
436
+ process.stdout.write(` ${schemaPath}: `);
437
+ try {
438
+ const schemaBlob = new Blob([schemaContent], { type: 'text/plain' });
439
+ const formData = new FormData();
440
+ formData.append('slug', existingSlug);
441
+ formData.append('fileName', schemaFileName);
442
+ formData.append('type', 'graphql');
443
+ formData.append('file', schemaBlob, `${schemaFileName}.graphql`);
444
+ const response = await fetch(`${apiUrl}/api/upload/spec`, {
445
+ method: 'POST',
446
+ headers: {
447
+ 'Authorization': `Bearer ${apiKey}`,
448
+ },
449
+ body: formData,
450
+ });
451
+ if (!response.ok) {
452
+ const errorData = await response.json().catch(() => ({ error: 'Unknown error' }));
453
+ throw new Error(errorData.error || `HTTP ${response.status}`);
454
+ }
455
+ const result = await response.json();
456
+ graphqlSchemaUrls[schemaPath] = result.url;
457
+ console.log(`${logger_1.logger.green('✓')} uploaded`);
458
+ }
459
+ catch (error) {
460
+ const message = error instanceof Error ? error.message : String(error);
461
+ console.log(`${logger_1.logger.red('✗')} ${message}`);
462
+ }
463
+ }
464
+ }
465
+ else if (schemaCount > 0 && !existingSlug) {
466
+ logger_1.logger.info('GraphQL schemas will be uploaded on next deploy (after project registration)');
467
+ }
389
468
  // Deploy content to API
390
469
  console.log('');
391
470
  logger_1.logger.info('Uploading content...');
@@ -406,8 +485,9 @@ async function deploy(options) {
406
485
  slug: existingSlug,
407
486
  docsJson: config,
408
487
  themeJson,
409
- openApiSpecs,
410
- graphqlSchemas,
488
+ // Only send URLs - specs/schemas are stored in blob storage
489
+ openApiSpecUrls,
490
+ graphqlSchemaUrls,
411
491
  files,
412
492
  apiKey, // Also send in body as fallback
413
493
  }),
@@ -872,4 +952,4 @@ function createProgressBar(progress, width = 30) {
872
952
  const percentage = Math.round(progress * 100);
873
953
  return `[${bar}] ${percentage}%`;
874
954
  }
875
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9kZXBsb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvUUEsd0JBbVRDO0FBdmpCRCxnREFBdUI7QUFDdkIsd0RBQXlCO0FBQ3pCLHlDQUF5RDtBQUN6RCwrQ0FBMkM7QUFDM0MsK0NBQWlEO0FBRWpELHVCQUF1QjtBQUN2QixNQUFNLGNBQWMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtBQUV2QywrQ0FBK0M7QUFDL0MsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNO0lBQ3hELE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTTtJQUN2QixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDdEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDekMsTUFBTTtDQUNQLENBQUE7QUFFRCxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLEdBQTJCO0lBQ3pDLFNBQVM7SUFDVCxNQUFNLEVBQUUsV0FBVztJQUNuQixNQUFNLEVBQUUsWUFBWTtJQUNwQixPQUFPLEVBQUUsWUFBWTtJQUNyQixNQUFNLEVBQUUsV0FBVztJQUNuQixPQUFPLEVBQUUsWUFBWTtJQUNyQixNQUFNLEVBQUUsY0FBYztJQUN0QixNQUFNLEVBQUUsZUFBZTtJQUN2QixTQUFTO0lBQ1QsTUFBTSxFQUFFLFdBQVc7SUFDbkIsT0FBTyxFQUFFLFlBQVk7SUFDckIsTUFBTSxFQUFFLGlCQUFpQjtJQUN6QixRQUFRO0lBQ1IsTUFBTSxFQUFFLFlBQVk7SUFDcEIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsUUFBUTtJQUNSLE9B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Z0IsQ0FBQyxDQUFBO1FBQy9CLE1BQU0sS0FBSyxDQUFBO0lBQ2IsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQWE7SUFDL0IsSUFBSSxLQUFLLEdBQUcsSUFBSTtRQUFFLE9BQU8sR0FBRyxLQUFLLElBQUksQ0FBQTtJQUNyQyxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSTtRQUFFLE9BQU8sR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUNqRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtBQUNuRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRTtJQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQTtJQUMzQyxNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFBO0lBQzVCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQTtJQUM3QyxPQUFPLElBQUksR0FBRyxLQUFLLFVBQVUsR0FBRyxDQUFBO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHsgbG9hZENvbmZpZywgdmFsaWRhdGVDb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInXG5pbXBvcnQgeyBERUZBVUxUX0FQSV9VUkwgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnXG5cbi8vIE1heCBhc3NldCBzaXplOiAyNU1CXG5jb25zdCBNQVhfQVNTRVRfU0laRSA9IDI1ICogMTAyNCAqIDEwMjRcblxuLy8gQmluYXJ5IGFzc2V0IGV4dGVuc2lvbnMgdG8gdXBsb2FkIHNlcGFyYXRlbHlcbmNvbnN0IEJJTkFSWV9FWFRFTlNJT05TID0gW1xuICAnLnBuZycsICcuanBnJywgJy5qcGVnJywgJy5naWYnLCAnLndlYnAnLCAnLmljbycsICcuc3ZnJyxcbiAgJy5tcDQnLCAnLndlYm0nLCAnLm1vdicsXG4gICcubXAzJywgJy53YXYnLCAnLm9nZycsXG4gICcud29mZicsICcud29mZjInLCAnLnR0ZicsICcub3RmJywgJy5lb3QnLFxuICAnLnBkZicsXG5dXG5cbi8vIE1hcCBmaWxlIGV4dGVuc2lvbnMgdG8gTUlNRSB0eXBlc1xuY29uc3QgTUlNRV9UWVBFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgLy8gSW1hZ2VzXG4gICcucG5nJzogJ2ltYWdlL3BuZycsXG4gICcuanBnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmpwZWcnOiAnaW1hZ2UvanBlZycsXG4gICcuZ2lmJzogJ2ltYWdlL2dpZicsXG4gICcud2VicCc6ICdpbWFnZS93ZWJwJyxcbiAgJy5pY28nOiAnaW1hZ2UveC1pY29uJyxcbiAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcsXG4gIC8vIFZpZGVvc1xuICAnLm1wNCc6ICd2aWRlby9tcDQnLFxuICAnLndlYm0nOiAndmlkZW8vd2VibScsXG4gICcubW92JzogJ3ZpZGVvL3F1aWNrdGltZScsXG4gIC8vIEF1ZGlvXG4gICcubXAzJzogJ2F1ZGlvL21wZWcnLFxuICAnLndhdic6ICdhdWRpby93YXYnLFxuICAnLm9nZyc6ICdhdWRpby9vZ2cnLFxuICAvLyBGb250c1xuICAnLndvZmYnOiAnZm9udC93b2ZmJyxcbiAgJy53b2ZmMic6ICdmb250L3dvZmYyJyxcbiAgJy50dGYnOiAnZm9udC90dGYnLFxuICAnLm90Zic6ICdmb250L290ZicsXG4gICcuZW90JzogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0JyxcbiAgLy8gRG9jdW1lbnRzXG4gICcucGRmJzogJ2FwcGxpY2F0aW9uL3BkZicsXG59XG5cbi8qKlxuICogR2V0IE1JTUUgdHlwZSBmcm9tIGZpbGUgZXh0ZW5zaW9uXG4gKi9cbmZ1bmN0aW9uIGdldE1pbWVUeXBlKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIE1JTUVfVFlQRVNbZXh0XSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xufVxuXG5pbnRlcmZhY2UgRGVwbG95T3B0aW9ucyB7XG4gIHVybD86IHN0cmluZ1xuICBhcGlLZXk/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIFByb2plY3RGaWxlIHtcbiAgcGF0aDogc3RyaW5nXG4gIGNvbnRlbnQ6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgT3BlbkFwaVNwZWMge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmludGVyZmFjZSBBc3NldEZpbGUge1xuICBwYXRoOiBzdHJpbmdcbiAgZnVsbFBhdGg6IHN0cmluZ1xuICBzaXplOiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIERldkRvY0NvbmZpZyB7XG4gIHByb2plY3RJZD86IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIHNsdWc/OiBzdHJpbmdcbiAgc3ViZG9tYWluPzogc3RyaW5nXG4gIGFwaUtleT86IHN0cmluZ1xuICB1cmw/OiBzdHJpbmdcbiAgbGFzdERlcGxveWVkPzogc3RyaW5nXG4gIGNyZWF0ZWRBdD86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgUmVnaXN0ZXJSZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW5cbiAgcHJvamVjdElkOiBzdHJpbmdcbiAgc2x1Zzogc3RyaW5nXG4gIHN1YmRvbWFpbjogc3RyaW5nXG4gIGFwaUtleTogc3RyaW5nXG4gIHVybDogc3RyaW5nXG4gIGVycm9yPzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBDaGVja1N1YmRvbWFpblJlc3BvbnNlIHtcbiAgYXZhaWxhYmxlOiBib29sZWFuXG4gIGVycm9yPzogc3RyaW5nXG4gIHN1Z2dlc3Rpb24/OiBzdHJpbmdcbn1cblxuLy8gU2ltcGxlIHByb21wdCBoZWxwZXIgdXNpbmcgcmVhZGxpbmVcbmFzeW5jIGZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKVxuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgfSlcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0SGludCA9IGRlZmF1bHRWYWx1ZSA/IGAgKCR7ZGVmYXVsdFZhbHVlfSlgIDogJydcbiAgICBybC5xdWVzdGlvbihgJHtxdWVzdGlvbn0ke2RlZmF1bHRIaW50fTogYCwgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKVxuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpIHx8IGRlZmF1bHRWYWx1ZSB8fCAnJylcbiAgICB9KVxuICB9KVxufVxuXG4vKipcbiAqIENoZWNrIHN1YmRvbWFpbiBhdmFpbGFiaWxpdHkgdmlhIEFQSVxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja1N1YmRvbWFpbkF2YWlsYWJpbGl0eShcbiAgc3ViZG9tYWluOiBzdHJpbmcsXG4gIGFwaVVybDogc3RyaW5nXG4pOiBQcm9taXNlPENoZWNrU3ViZG9tYWluUmVzcG9uc2U+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL3N1YmRvbWFpbnMvY2hlY2tgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHN1YmRvbWFpbiB9KSxcbiAgICB9KVxuICAgIFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBDaGVja1N1YmRvbWFpblJlc3BvbnNlXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9IGNhdGNoIHtcbiAgICAvLyBJZiBBUEkgaXMgdW5hdmFpbGFibGUsIGFzc3VtZSBhdmFpbGFibGUgKHdpbGwgZmFpbCBhdCByZWdpc3RyYXRpb24gaWYgbm90KVxuICAgIHJldHVybiB7IGF2YWlsYWJsZTogdHJ1ZSB9XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNpYyBzdWJkb21haW4gZm9ybWF0IHZhbGlkYXRpb25cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN1YmRvbWFpbkZvcm1hdChzdWJkb21haW46IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICBpZiAoIXN1YmRvbWFpbikge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gaXMgcmVxdWlyZWQnIH1cbiAgfVxuICBcbiAgaWYgKHN1YmRvbWFpbi5sZW5ndGggPCAzKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBtdXN0IGJlIGF0IGxlYXN0IDMgY2hhcmFjdGVycycgfVxuICB9XG4gIFxuICBpZiAoc3ViZG9tYWluLmxlbmd0aCA+IDYzKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBtdXN0IGJlIDYzIGNoYXJhY3RlcnMgb3IgbGVzcycgfVxuICB9XG4gIFxuICBpZiAoIS9eW2EtejAtOV0oW2EtejAtOS1dKlthLXowLTldKT8kLy50ZXN0KHN1YmRvbWFpbikpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIGFscGhhbnVtZXJpYywgY2FuIGNvbnRhaW4gaHlwaGVucycgfVxuICB9XG4gIFxuICBpZiAoLy0tLy50ZXN0KHN1YmRvbWFpbikpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIGNhbm5vdCBjb250YWluIGNvbnNlY3V0aXZlIGh5cGhlbnMnIH1cbiAgfVxuICBcbiAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfVxufVxuXG5pbnRlcmZhY2UgRG9tYWluQ29uZmlnIHtcbiAgY3VzdG9tRG9tYWluOiBzdHJpbmdcbiAgc2VvPzoge1xuICAgIGNhbm9uaWNhbD86IHN0cmluZ1xuICB9XG59XG5cbmludGVyZmFjZSBEb21haW5TdGF0dXNSZXNwb25zZSB7XG4gIGhhc0N1c3RvbURvbWFpbjogYm9vbGVhblxuICBkb21haW4/OiBzdHJpbmdcbiAgc3RhdHVzPzogc3RyaW5nXG4gIGN1c3RvbVVybD86IHN0cmluZ1xuICBtZXNzYWdlPzogc3RyaW5nXG4gIG5leHRTdGVwPzogc3RyaW5nXG59XG5cbi8qKlxuICogQ2hlY2sgZm9yIGRvbWFpbi5qc29uIGFuZCBkaXNwbGF5IGN1c3RvbSBkb21haW4gc3RhdHVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrQ3VzdG9tRG9tYWluU3RhdHVzKFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBhcGlVcmw6IHN0cmluZyxcbiAgYXBpS2V5OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBDaGVjayBpZiBkb21haW4uanNvbiBleGlzdHNcbiAgY29uc3QgZG9tYWluQ29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2RvbWFpbi5qc29uJylcbiAgXG4gIGlmICghZnMuZXhpc3RzU3luYyhkb21haW5Db25maWdQYXRoKSkge1xuICAgIHJldHVybiAvLyBObyBkb21haW4uanNvbiwgbm90aGluZyB0byBkb1xuICB9XG4gIFxuICBsZXQgZG9tYWluQ29uZmlnOiBEb21haW5Db25maWdcbiAgdHJ5IHtcbiAgICBkb21haW5Db25maWcgPSBmcy5yZWFkSnNvblN5bmMoZG9tYWluQ29uZmlnUGF0aCkgYXMgRG9tYWluQ29uZmlnXG4gIH0gY2F0Y2gge1xuICAgIGxvZ2dlci53YXJuKCdGb3VuZCBkb21haW4uanNvbiBidXQgZmFpbGVkIHRvIHBhcnNlIGl0JylcbiAgICByZXR1cm5cbiAgfVxuICBcbiAgaWYgKCFkb21haW5Db25maWcuY3VzdG9tRG9tYWluKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgXG4gIGNvbnNvbGUubG9nKCcnKVxuICBsb2dnZXIuaW5mbyhgQ3VzdG9tIGRvbWFpbiBjb25maWd1cmVkOiAke2RvbWFpbkNvbmZpZy5jdXN0b21Eb21haW59YClcbiAgXG4gIC8vIENoZWNrIGRvbWFpbiBzdGF0dXMgdmlhIEFQSVxuICBpZiAoIWFwaUtleSkge1xuICAgIGxvZ2dlci5pbmZvKCdSdW4gXCJkZXZkb2MgZG9tYWluIHN0YXR1c1wiIHRvIGNoZWNrIEROUyBjb25maWd1cmF0aW9uJylcbiAgICByZXR1cm5cbiAgfVxuICBcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL2RvbWFpbnMvc3RhdHVzYCwge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7YXBpS2V5fWAsXG4gICAgICB9LFxuICAgIH0pXG4gICAgXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBEb21haW5TdGF0dXNSZXNwb25zZVxuICAgIFxuICAgIGlmICghc3RhdHVzLmhhc0N1c3RvbURvbWFpbikge1xuICAgICAgLy8gRG9tYWluIGluIGNvbmZpZyBidXQgbm90IHJlZ2lzdGVyZWQgeWV0XG4gICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgIGxvZ2dlci5pbmZvKCdDdXN0b20gZG9tYWluIG5vdCB5ZXQgcmVnaXN0ZXJlZC4nKVxuICAgICAgbG9nZ2VyLmluZm8oJ1J1biBcImRldmRvYyBkb21haW4gYWRkICcgKyBkb21haW5Db25maWcuY3VzdG9tRG9tYWluICsgJ1wiIHRvIHNldCBpdCB1cCcpXG4gICAgfSBlbHNlIGlmIChzdGF0dXMuc3RhdHVzID09PSAnYWN0aXZlJykge1xuICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICBjb25zb2xlLmxvZyhgICBBbHNvIGxpdmUgYXQ6ICR7bG9nZ2VyLmN5YW4oc3RhdHVzLmN1c3RvbVVybCB8fCBgaHR0cHM6Ly8ke3N0YXR1cy5kb21haW59YCl9YClcbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5zdGF0dXMgPT09ICdwZW5kaW5nJykge1xuICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICBsb2dnZXIud2FybignQ3VzdG9tIGRvbWFpbiBwZW5kaW5nIEROUyBjb25maWd1cmF0aW9uJylcbiAgICAgIGxvZ2dlci5pbmZvKCdSdW4gXCJkZXZkb2MgZG9tYWluIHN0YXR1c1wiIGZvciBETlMgc2V0dXAgaW5zdHJ1Y3Rpb25zJylcbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5zdGF0dXMgPT09ICdkbnNfdmVyaWZpZWQnIHx8IHN0YXR1cy5zdGF0dXMgPT09ICdzc2xfcHJvdmlzaW9uaW5nJykge1xuICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICBsb2dnZXIuaW5mbygnQ3VzdG9tIGRvbWFpbiBETlMgdmVyaWZpZWQsIFNTTCBjZXJ0aWZpY2F0ZSBwcm92aXNpb25pbmcuLi4nKVxuICAgIH1cbiAgICBcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWdub3JlIGVycm9ycywgZG9tYWluIHN0YXR1cyBpcyBpbmZvcm1hdGlvbmFsXG4gIH1cbn1cblxuLyoqXG4gKiBEZXBsb3kgZG9jdW1lbnRhdGlvbiB0byBEZXZEb2MgcGxhdGZvcm1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcGxveShvcHRpb25zOiBEZXBsb3lPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gcHJvY2Vzcy5jd2QoKVxuICBjb25zdCBhcGlVcmwgPSBvcHRpb25zLnVybCB8fCBwcm9jZXNzLmVudi5ERVZET0NfQVBJX1VSTCB8fCBERUZBVUxUX0FQSV9VUkxcbiAgXG4gIGxvZ2dlci5pbmZvKCdEZXBsb3lpbmcgdG8gRGV2RG9jLi4uXFxuJylcbiAgXG4gIC8vIENoZWNrIGZvciBkb2NzLmpzb25cbiAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2RvY3MuanNvbicpXG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgIGxvZ2dlci5lcnJvcignZG9jcy5qc29uIG5vdCBmb3VuZCBpbiBjdXJyZW50IGRpcmVjdG9yeScpXG4gICAgbG9nZ2VyLmluZm8oJ01ha2Ugc3VyZSB5b3UgYXJlIGluIGEgRGV2RG9jIGRvY3VtZW50YXRpb24gcHJvamVjdCBkaXJlY3RvcnknKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG4gIFxuICAvLyBMb2FkIGFuZCB2YWxpZGF0ZSBjb25maWd1cmF0aW9uXG4gIGxldCBjb25maWc6IFJldHVyblR5cGU8dHlwZW9mIGxvYWRDb25maWc+IGV4dGVuZHMgUHJvbWlzZTxpbmZlciBUPiA/IFQgOiBuZXZlclxuICB0cnkge1xuICAgIGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcocHJvamVjdFJvb3QpXG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlQ29uZmlnKGNvbmZpZylcbiAgICBcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignSW52YWxpZCBkb2NzLmpzb24gY29uZmlndXJhdGlvbjonKVxuICAgICAgdmFsaWRhdGlvbi5lcnJvcnMuZm9yRWFjaChlcnIgPT4gbG9nZ2VyLmVycm9yKGAgIC0gJHtlcnJ9YCkpXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLnN1Y2Nlc3MoYOKckyBDb25maWd1cmF0aW9uIHZhbGlkOiAke2NvbmZpZy5uYW1lIHx8ICdVbnRpdGxlZCd9YClcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBjb25maWd1cmF0aW9uOiAke21lc3NhZ2V9YClcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuICBcbiAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIHByb2plY3QgY29uZmlnXG4gIGNvbnN0IGRldmRvY0NvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICcuZGV2ZG9jLmpzb24nKVxuICBsZXQgZGV2ZG9jQ29uZmlnOiBEZXZEb2NDb25maWcgfCBudWxsID0gbnVsbFxuICBsZXQgZXhpc3RpbmdTbHVnOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBsZXQgZXhpc3RpbmdBcGlLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIGxldCBleGlzdGluZ1N1YmRvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKGRldmRvY0NvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRldmRvY0NvbmZpZyA9IGZzLnJlYWRKc29uU3luYyhkZXZkb2NDb25maWdQYXRoKSBhcyBEZXZEb2NDb25maWdcbiAgICAgIGV4aXN0aW5nU2x1ZyA9IGRldmRvY0NvbmZpZy5zbHVnIHx8IG51bGxcbiAgICAgIGV4aXN0aW5nQXBpS2V5ID0gZGV2ZG9jQ29uZmlnLmFwaUtleSB8fCBudWxsXG4gICAgICBleGlzdGluZ1N1YmRvbWFpbiA9IGRldmRvY0NvbmZpZy5zdWJkb21haW4gfHwgbnVsbFxuICAgICAgaWYgKGV4aXN0aW5nU2x1ZyAmJiBleGlzdGluZ0FwaUtleSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgRGVwbG95aW5nIHByb2plY3Q6ICR7ZXhpc3RpbmdTbHVnfWApXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3JzIHJlYWRpbmcgLmRldmRvYy5qc29uXG4gICAgfVxuICB9XG4gIFxuICAvLyBHZXQgQVBJIGtleSBmcm9tIG9wdGlvbnMsIGVudiB2YXIsIG9yIC5kZXZkb2MuanNvblxuICBsZXQgYXBpS2V5ID0gb3B0aW9ucy5hcGlLZXkgfHwgcHJvY2Vzcy5lbnYuREVWRE9DX0FQSV9LRVkgfHwgZXhpc3RpbmdBcGlLZXlcbiAgXG4gIC8vIElmIG5vIEFQSSBrZXksIHRoaXMgaXMgYSBmaXJzdCBkZXBsb3kgLSBuZWVkIHRvIHJlZ2lzdGVyIHRoZSBzdWJkb21haW4gZmlyc3RcbiAgaWYgKCFhcGlLZXkpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHN1YmRvbWFpbiBmcm9tIGluaXRcbiAgICBpZiAoIWV4aXN0aW5nU3ViZG9tYWluKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ05vIHByb2plY3QgY29uZmlndXJhdGlvbiBmb3VuZC4nKVxuICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGluaXRcIiBmaXJzdCB0byBjb25maWd1cmUgeW91ciBwcm9qZWN0JylcbiAgICAgIGxvZ2dlci5pbmZvKCdPciBwcm92aWRlIGFuIEFQSSBrZXkgdmlhIC0tYXBpLWtleSBmbGFnIG9yIERFVkRPQ19BUElfS0VZIGVudiB2YXInKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuICAgIFxuICAgIGxldCBzdWJkb21haW5Ub1JlZ2lzdGVyID0gZXhpc3RpbmdTdWJkb21haW5cbiAgICBsZXQgcmVnaXN0ZXJlZCA9IGZhbHNlXG4gICAgXG4gICAgLy8gTG9vcCB1bnRpbCB3ZSBzdWNjZXNzZnVsbHkgcmVnaXN0ZXIgYSBzdWJkb21haW5cbiAgICB3aGlsZSAoIXJlZ2lzdGVyZWQpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBSZWdpc3RlcmluZyBzdWJkb21haW4gJHtzdWJkb21haW5Ub1JlZ2lzdGVyfS5kZXZkb2Muc2guLi5gKVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWdpc3RlclJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS9hcGkvcHJvamVjdHMvcmVnaXN0ZXJgLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG5hbWU6IGRldmRvY0NvbmZpZz8ubmFtZSB8fCBjb25maWcubmFtZSB8fCAnTXkgRG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICBzbHVnOiBzdWJkb21haW5Ub1JlZ2lzdGVyLFxuICAgICAgICAgICAgc3ViZG9tYWluOiBzdWJkb21haW5Ub1JlZ2lzdGVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgaWYgKCFyZWdpc3RlclJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcmVnaXN0ZXJSZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZXJyb3I6ICdVbmtub3duIGVycm9yJyB9KSkgYXMgeyBlcnJvcj86IHN0cmluZzsgZGV0YWlscz86IHN0cmluZyB9XG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3JEYXRhLmVycm9yIHx8IGBIVFRQICR7cmVnaXN0ZXJSZXNwb25zZS5zdGF0dXN9YFxuICAgICAgICAgIFxuICAgICAgICAgIC8vIElmIHN1YmRvbWFpbiBpcyB0YWtlbiwgYXNrIGZvciBhIG5ldyBvbmVcbiAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0cycpIHx8IGVycm9yTWVzc2FnZS5pbmNsdWRlcygnYWxyZWFkeSB0YWtlbicpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBTdWJkb21haW4gXCIke3N1YmRvbWFpblRvUmVnaXN0ZXJ9XCIgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS5gKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBHZXQgc3VnZ2VzdGlvbiBmcm9tIEFQSVxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmlsaXR5ID0gYXdhaXQgY2hlY2tTdWJkb21haW5BdmFpbGFiaWxpdHkoc3ViZG9tYWluVG9SZWdpc3RlciwgYXBpVXJsKVxuICAgICAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGF2YWlsYWJpbGl0eS5zdWdnZXN0aW9uIHx8IGAke3N1YmRvbWFpblRvUmVnaXN0ZXJ9LWRvY3NgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFN1Z2dlc3Rpb246ICR7c3VnZ2VzdGlvbn0uZGV2ZG9jLnNoYClcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBQcm9tcHQgZm9yIG5ldyBzdWJkb21haW5cbiAgICAgICAgICAgIGxldCBuZXdTdWJkb21haW4gPSBhd2FpdCBwcm9tcHQoJ0VudGVyIGEgbmV3IHN1YmRvbWFpbicsIHN1Z2dlc3Rpb24pXG4gICAgICAgICAgICBuZXdTdWJkb21haW4gPSBuZXdTdWJkb21haW4udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFZhbGlkYXRlIGZvcm1hdFxuICAgICAgICAgICAgY29uc3QgZm9ybWF0Q2hlY2sgPSBpc1ZhbGlkU3ViZG9tYWluRm9ybWF0KG5ld1N1YmRvbWFpbilcbiAgICAgICAgICAgIGlmICghZm9ybWF0Q2hlY2sudmFsaWQpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGZvcm1hdENoZWNrLmVycm9yISlcbiAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgc3ViZG9tYWluVG9SZWdpc3RlciA9IG5ld1N1YmRvbWFpblxuICAgICAgICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCByZWdpc3RlclJlc3VsdCA9IGF3YWl0IHJlZ2lzdGVyUmVzcG9uc2UuanNvbigpIGFzIFJlZ2lzdGVyUmVzcG9uc2VcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBsb2NhbCBjb25maWcgd2l0aCBBUEkga2V5XG4gICAgICAgIGFwaUtleSA9IHJlZ2lzdGVyUmVzdWx0LmFwaUtleVxuICAgICAgICBleGlzdGluZ1NsdWcgPSByZWdpc3RlclJlc3VsdC5zbHVnXG4gICAgICAgIGV4aXN0aW5nU3ViZG9tYWluID0gcmVnaXN0ZXJSZXN1bHQuc3ViZG9tYWluXG4gICAgICAgIFxuICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGNvbmZpZ1xuICAgICAgICBjb25zdCB1cGRhdGVkQ29uZmlnOiBEZXZEb2NDb25maWcgPSB7XG4gICAgICAgICAgLi4uZGV2ZG9jQ29uZmlnLFxuICAgICAgICAgIHByb2plY3RJZDogcmVnaXN0ZXJSZXN1bHQucHJvamVjdElkLFxuICAgICAgICAgIHNsdWc6IHJlZ2lzdGVyUmVzdWx0LnNsdWcsXG4gICAgICAgICAgc3ViZG9tYWluOiByZWdpc3RlclJlc3VsdC5zdWJkb21haW4sXG4gICAgICAgICAgYXBpS2V5OiByZWdpc3RlclJlc3VsdC5hcGlLZXksXG4gICAgICAgICAgdXJsOiByZWdpc3RlclJlc3VsdC51cmwsXG4gICAgICAgIH1cbiAgICAgICAgZnMud3JpdGVKc29uU3luYyhkZXZkb2NDb25maWdQYXRoLCB1cGRhdGVkQ29uZmlnLCB7IHNwYWNlczogMiB9KVxuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYOKckyBTdWJkb21haW4gJHtyZWdpc3RlclJlc3VsdC5zdWJkb21haW59LmRldmRvYy5zaCByZWdpc3RlcmVkIWApXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICByZWdpc3RlcmVkID0gdHJ1ZVxuICAgICAgICBcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVnaXN0ZXIgc3ViZG9tYWluOiAke21lc3NhZ2V9YClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvLyBDb2xsZWN0IGFsbCBjb250ZW50IGZpbGVzXG4gIGxvZ2dlci5pbmZvKCdCdW5kbGluZyBjb250ZW50Li4uJylcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBjb2xsZWN0RmlsZXMocHJvamVjdFJvb3QpXG4gIGxvZ2dlci5zdWNjZXNzKGDinJMgRm91bmQgJHtmaWxlcy5sZW5ndGh9IGNvbnRlbnQgZmlsZXNgKVxuICBcbiAgLy8gQ29sbGVjdCB0aGVtZS5qc29uXG4gIGNvbnN0IHRoZW1lSnNvbiA9IGNvbGxlY3RUaGVtZUpzb24ocHJvamVjdFJvb3QpXG4gIGlmICh0aGVtZUpzb24pIHtcbiAgICBsb2dnZXIuc3VjY2Vzcygn4pyTIEZvdW5kIHRoZW1lLmpzb24nKVxuICB9XG4gIFxuICAvLyBDb2xsZWN0IE9wZW5BUEkgc3BlY3MgYmFzZWQgb24gZG9jcy5qc29uIG5hdmlnYXRpb25cbiAgY29uc3Qgb3BlbkFwaVNwZWNzID0gYXdhaXQgY29sbGVjdE9wZW5BcGlTcGVjcyhwcm9qZWN0Um9vdCwgY29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICBjb25zdCBzcGVjQ291bnQgPSBPYmplY3Qua2V5cyhvcGVuQXBpU3BlY3MpLmxlbmd0aFxuICBpZiAoc3BlY0NvdW50ID4gMCkge1xuICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgRm91bmQgJHtzcGVjQ291bnR9IE9wZW5BUEkgc3BlYyhzKWApXG4gIH1cbiAgXG4gIC8vIENvbGxlY3QgR3JhcGhRTCBzY2hlbWFzIGJhc2VkIG9uIGRvY3MuanNvbiBuYXZpZ2F0aW9uXG4gIGNvbnN0IGdyYXBocWxTY2hlbWFzID0gYXdhaXQgY29sbGVjdEdyYXBoUUxTY2hlbWFzKHByb2plY3RSb290LCBjb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gIGNvbnN0IHNjaGVtYUNvdW50ID0gT2JqZWN0LmtleXMoZ3JhcGhxbFNjaGVtYXMpLmxlbmd0aFxuICBpZiAoc2NoZW1hQ291bnQgPiAwKSB7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoYOKckyBGb3VuZCAke3NjaGVtYUNvdW50fSBHcmFwaFFMIHNjaGVtYShzKWApXG4gIH1cbiAgXG4gIC8vIENvbGxlY3QgYmluYXJ5IGFzc2V0c1xuICBjb25zdCBhc3NldHMgPSBhd2FpdCBjb2xsZWN0QXNzZXRzKHByb2plY3RSb290KVxuICBpZiAoYXNzZXRzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB0b3RhbEFzc2V0U2l6ZSA9IGFzc2V0cy5yZWR1Y2UoKHN1bSwgYSkgPT4gc3VtICsgYS5zaXplLCAwKVxuICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgRm91bmQgJHthc3NldHMubGVuZ3RofSBhc3NldHMgKCR7Zm9ybWF0U2l6ZSh0b3RhbEFzc2V0U2l6ZSl9KWApXG4gIH1cbiAgXG4gIC8vIENhbGN1bGF0ZSBidW5kbGUgc2l6ZVxuICBjb25zdCB0b3RhbFNpemUgPSBmaWxlcy5yZWR1Y2UoKHN1bSwgZikgPT4gc3VtICsgZi5jb250ZW50Lmxlbmd0aCwgMClcbiAgY29uc3Qgc2l6ZUtCID0gKHRvdGFsU2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSlcbiAgbG9nZ2VyLmluZm8oYENvbnRlbnQgYnVuZGxlOiAke3NpemVLQn0gS0JgKVxuICBcbiAgLy8gVXBsb2FkIGJpbmFyeSBhc3NldHMgZmlyc3QgKHdpdGggcHJvZ3Jlc3MpXG4gIGlmIChhc3NldHMubGVuZ3RoID4gMCAmJiBleGlzdGluZ1NsdWcgJiYgYXBpS2V5KSB7XG4gICAgY29uc29sZS5sb2coJycpXG4gICAgbG9nZ2VyLmluZm8oJ1VwbG9hZGluZyBhc3NldHMuLi4nKVxuICAgIFxuICAgIGNvbnN0IGFzc2V0UmVzdWx0cyA9IGF3YWl0IHVwbG9hZEFzc2V0cyhhc3NldHMsIGFwaVVybCwgZXhpc3RpbmdTbHVnLCBhcGlLZXkpXG4gICAgY29uc3Qgc3VjY2Vzc0NvdW50ID0gYXNzZXRSZXN1bHRzLmZpbHRlcihyID0+IHIuc3VjY2VzcykubGVuZ3RoXG4gICAgY29uc3QgZmFpbENvdW50ID0gYXNzZXRSZXN1bHRzLmZpbHRlcihyID0+ICFyLnN1Y2Nlc3MpLmxlbmd0aFxuICAgIFxuICAgIGlmIChmYWlsQ291bnQgPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgJHtzdWNjZXNzQ291bnR9IGFzc2V0cyB1cGxvYWRlZCwgJHtmYWlsQ291bnR9IGZhaWxlZGApXG4gICAgfSBlbHNlIGlmIChzdWNjZXNzQ291bnQgPiAwKSB7XG4gICAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTICR7c3VjY2Vzc0NvdW50fSBhc3NldHMgdXBsb2FkZWRgKVxuICAgIH1cbiAgfSBlbHNlIGlmIChhc3NldHMubGVuZ3RoID4gMCAmJiAhZXhpc3RpbmdTbHVnKSB7XG4gICAgbG9nZ2VyLmluZm8oJ0Fzc2V0cyB3aWxsIGJlIHVwbG9hZGVkIG9uIG5leHQgZGVwbG95IChhZnRlciBwcm9qZWN0IHJlZ2lzdHJhdGlvbiknKVxuICB9XG4gIFxuICAvLyBEZXBsb3kgY29udGVudCB0byBBUElcbiAgY29uc29sZS5sb2coJycpXG4gIGxvZ2dlci5pbmZvKCdVcGxvYWRpbmcgY29udGVudC4uLicpXG4gIFxuICB0cnkge1xuICAgIGludGVyZmFjZSBEZXBsb3lSZXNwb25zZSB7XG4gICAgICBzdWNjZXNzOiBib29sZWFuXG4gICAgICBzbHVnOiBzdHJpbmdcbiAgICAgIHVybDogc3RyaW5nXG4gICAgICBibG9iVXJsOiBzdHJpbmdcbiAgICAgIGlzVXBkYXRlOiBib29sZWFuXG4gICAgICBmaWxlc0NvdW50OiBudW1iZXJcbiAgICAgIGFwaUtleT86IHN0cmluZ1xuICAgICAgZXJyb3I/OiBzdHJpbmdcbiAgICB9XG4gICAgXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBBUEkga2V5IGhlYWRlciBmb3IgdXBkYXRlc1xuICAgIGlmIChhcGlLZXkpIHtcbiAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHthcGlLZXl9YFxuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL2RlcGxveWAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gRm9sbG93IHJlZGlyZWN0c1xuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiBjb25maWcubmFtZSB8fCAnTXkgRG9jdW1lbnRhdGlvbicsXG4gICAgICAgIHNsdWc6IGV4aXN0aW5nU2x1ZyxcbiAgICAgICAgZG9jc0pzb246IGNvbmZpZyxcbiAgICAgICAgdGhlbWVKc29uLFxuICAgICAgICBvcGVuQXBpU3BlY3MsXG4gICAgICAgIGdyYXBocWxTY2hlbWFzLFxuICAgICAgICBmaWxlcyxcbiAgICAgICAgYXBpS2V5LCAvLyBBbHNvIHNlbmQgaW4gYm9keSBhcyBmYWxsYmFja1xuICAgICAgfSksXG4gICAgfSlcbiAgICBcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZXJyb3I6ICdVbmtub3duIGVycm9yJyB9KSkgYXMgeyBlcnJvcj86IHN0cmluZzsgZGV0YWlscz86IHN0cmluZyB9XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvckRhdGEuZXJyb3IgfHwgYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9YFxuICAgICAgY29uc3QgZGV0YWlscyA9IGVycm9yRGF0YS5kZXRhaWxzID8gYFxcbiAgIERldGFpbHM6ICR7ZXJyb3JEYXRhLmRldGFpbHN9YCA6ICcnXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3JNZXNzYWdlfSR7ZGV0YWlsc31gKVxuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRGVwbG95UmVzcG9uc2VcbiAgICBcbiAgICAvLyBTYXZlIHByb2plY3QgY29uZmlnIGZvciBmdXR1cmUgdXBkYXRlc1xuICAgIGNvbnN0IG5ld0RldkRvY0NvbmZpZzogRGV2RG9jQ29uZmlnID0ge1xuICAgICAgc2x1ZzogcmVzdWx0LnNsdWcsXG4gICAgICB1cmw6IHJlc3VsdC51cmwsXG4gICAgICBsYXN0RGVwbG95ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9XG4gICAgXG4gICAgLy8gU2F2ZSBBUEkga2V5IChmcm9tIHJlc3BvbnNlIGZvciBuZXcgcHJvamVjdHMsIG9yIGV4aXN0aW5nIGZvciB1cGRhdGVzKVxuICAgIGlmIChyZXN1bHQuYXBpS2V5KSB7XG4gICAgICBuZXdEZXZEb2NDb25maWcuYXBpS2V5ID0gcmVzdWx0LmFwaUtleVxuICAgIH0gZWxzZSBpZiAoYXBpS2V5KSB7XG4gICAgICBuZXdEZXZEb2NDb25maWcuYXBpS2V5ID0gYXBpS2V5XG4gICAgfVxuICAgIFxuICAgIGZzLndyaXRlSnNvblN5bmMoZGV2ZG9jQ29uZmlnUGF0aCwgbmV3RGV2RG9jQ29uZmlnLCB7IHNwYWNlczogMiB9KVxuICAgIFxuICAgIC8vIFN1Y2Nlc3MgbWVzc2FnZVxuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGxvZ2dlci5zdWNjZXNzKCdEZXBsb3ltZW50IHN1Y2Nlc3NmdWwhJylcbiAgICBjb25zb2xlLmxvZygnJylcbiAgICBjb25zb2xlLmxvZyhgICBZb3VyIGRvY3MgYXJlIGxpdmUgYXQ6YClcbiAgICBjb25zb2xlLmxvZyhgICAke2xvZ2dlci5jeWFuKHJlc3VsdC51cmwpfWApXG4gICAgY29uc29sZS5sb2coJycpXG4gICAgXG4gICAgaWYgKHJlc3VsdC5pc1VwZGF0ZSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ1Byb2plY3QgdXBkYXRlZCB3aXRoIG5ldyBjb250ZW50JylcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oYFByb2plY3Qgc2x1ZzogJHtyZXN1bHQuc2x1Z31gKVxuICAgICAgbG9nZ2VyLmluZm8oJ1J1biBcImRldmRvYyBkZXBsb3lcIiBhZ2FpbiB0byB1cGRhdGUnKVxuICAgICAgXG4gICAgICAvLyBTaG93IEFQSSBrZXkgd2FybmluZyBmb3IgbmV3IHByb2plY3RzXG4gICAgICBpZiAocmVzdWx0LmFwaUtleSkge1xuICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgbG9nZ2VyLndhcm4oJ+KaoO+4jyAgU2F2ZSB5b3VyIEFQSSBrZXkgZm9yIENJL0NEIGRlcGxveW1lbnRzOicpXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtyZXN1bHQuYXBpS2V5fWApXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICBsb2dnZXIuaW5mbygnQVBJIGtleSBzYXZlZCB0byAuZGV2ZG9jLmpzb24gKGFkZCB0byAuZ2l0aWdub3JlISknKVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgZG9tYWluLmpzb24gYW5kIHNob3cgY3VzdG9tIGRvbWFpbiBzdGF0dXNcbiAgICBhd2FpdCBjaGVja0N1c3RvbURvbWFpblN0YXR1cyhwcm9qZWN0Um9vdCwgYXBpVXJsLCBhcGlLZXkgfHwgcmVzdWx0LmFwaUtleSB8fCAnJylcbiAgICBcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgbG9nZ2VyLmVycm9yKGBEZXBsb3ltZW50IGZhaWxlZDogJHttZXNzYWdlfWApXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IE9wZW5BUEkgc3BlY3MgYmFzZWQgb24gZG9jcy5qc29uIG5hdmlnYXRpb24gdGFic1xuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0T3BlbkFwaVNwZWNzKFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBkb2NzSnNvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgT3BlbkFwaVNwZWM+PiB7XG4gIGNvbnN0IHNwZWNzOiBSZWNvcmQ8c3RyaW5nLCBPcGVuQXBpU3BlYz4gPSB7fVxuICBcbiAgLy8gR2V0IG5hdmlnYXRpb24gZnJvbSBkb2NzLmpzb24gLSBjb3VsZCBiZSBvYmplY3Qgd2l0aCB0YWJzIG9yIGFycmF5XG4gIGNvbnN0IG5hdmlnYXRpb24gPSBkb2NzSnNvbi5uYXZpZ2F0aW9uIGFzIHsgdGFicz86IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9IHwgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkXG4gIGlmICghbmF2aWdhdGlvbikgcmV0dXJuIHNwZWNzXG4gIFxuICAvLyBIYW5kbGUgYm90aCB7IHRhYnM6IFsuLi5dIH0gYW5kIGRpcmVjdCBhcnJheSBmb3JtYXRzXG4gIGNvbnN0IHRhYnMgPSBBcnJheS5pc0FycmF5KG5hdmlnYXRpb24pID8gbmF2aWdhdGlvbiA6IChuYXZpZ2F0aW9uLnRhYnMgfHwgW10pXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGFicykge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gT3BlbkFQSSB0YWJcbiAgICBpZiAoaXRlbS50eXBlID09PSAnb3BlbmFwaScpIHtcbiAgICAgIC8vIFNwZWMgY2FuIGJlIGRpcmVjdGx5IG9uIHRhYiBvciBuZXN0ZWQgaW4gdmVyc2lvbnMgYXJyYXlcbiAgICAgIGNvbnN0IHZlcnNpb25zID0gaXRlbS52ZXJzaW9ucyBhcyBBcnJheTx7IHNwZWM6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0+IHwgdW5kZWZpbmVkXG4gICAgICBcbiAgICAgIGlmICh2ZXJzaW9ucyAmJiBBcnJheS5pc0FycmF5KHZlcnNpb25zKSkge1xuICAgICAgICAvLyBIYW5kbGUgdmVyc2lvbmVkIHNwZWNzXG4gICAgICAgIGZvciAoY29uc3QgdmVyc2lvbiBvZiB2ZXJzaW9ucykge1xuICAgICAgICAgIGlmICh2ZXJzaW9uLnNwZWMpIHtcbiAgICAgICAgICAgIGF3YWl0IGxvYWRTcGVjKHByb2plY3RSb290LCB2ZXJzaW9uLnNwZWMsIHNwZWNzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpdGVtLnNwZWMpIHtcbiAgICAgICAgLy8gSGFuZGxlIGRpcmVjdCBzcGVjIHJlZmVyZW5jZVxuICAgICAgICBhd2FpdCBsb2FkU3BlYyhwcm9qZWN0Um9vdCwgaXRlbS5zcGVjIGFzIHN0cmluZywgc3BlY3MpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gc3BlY3Ncbn1cblxuLyoqXG4gKiBMb2FkIGEgc2luZ2xlIE9wZW5BUEkgc3BlYyBpbnRvIHRoZSBzcGVjcyBtYXBcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFNwZWMoXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIHNwZWNQYXRoOiBzdHJpbmcsXG4gIHNwZWNzOiBSZWNvcmQ8c3RyaW5nLCBPcGVuQXBpU3BlYz5cbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBSZXNvbHZlIHRoZSBzcGVjIHBhdGggcmVsYXRpdmUgdG8gcHJvamVjdCByb290XG4gIGxldCBmdWxsU3BlY1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsIHNwZWNQYXRoKVxuICBcbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhzIGxpa2UgLi9mYWNlYm9vay9vcGVuYXBpLmpzb25cbiAgaWYgKHNwZWNQYXRoLnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICBmdWxsU3BlY1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsIHNwZWNQYXRoLnNsaWNlKDIpKVxuICB9XG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyhmdWxsU3BlY1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNwZWNDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxTcGVjUGF0aCwgJ3V0Zi04JylcbiAgICAgIGNvbnN0IHNwZWNEYXRhID0gSlNPTi5wYXJzZShzcGVjQ29udGVudCkgYXMgT3BlbkFwaVNwZWNcbiAgICAgIHNwZWNzW3NwZWNQYXRoXSA9IHNwZWNEYXRhXG4gICAgICBsb2dnZXIuaW5mbyhgICDihpIgJHtzcGVjUGF0aH1gKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHBhcnNlIE9wZW5BUEkgc3BlYyAke3NwZWNQYXRofTogJHttZXNzYWdlfWApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZ2dlci53YXJuKGBPcGVuQVBJIHNwZWMgZmlsZSBub3QgZm91bmQ6ICR7c3BlY1BhdGh9YClcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgR3JhcGhRTCBzY2hlbWFzIGJhc2VkIG9uIGRvY3MuanNvbiBuYXZpZ2F0aW9uIHRhYnNcbiAqIFNpbWlsYXIgdG8gY29sbGVjdE9wZW5BcGlTcGVjcyBidXQgZm9yIEdyYXBoUUwgU0RMIGZpbGVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RHcmFwaFFMU2NoZW1hcyhcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgZG9jc0pzb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3Qgc2NoZW1hczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIFxuICAvLyBHZXQgbmF2aWdhdGlvbiBmcm9tIGRvY3MuanNvbiAtIGNvdWxkIGJlIG9iamVjdCB3aXRoIHRhYnMgb3IgYXJyYXlcbiAgY29uc3QgbmF2aWdhdGlvbiA9IGRvY3NKc29uLm5hdmlnYXRpb24gYXMgeyB0YWJzPzogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IH0gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWRcbiAgaWYgKCFuYXZpZ2F0aW9uKSByZXR1cm4gc2NoZW1hc1xuICBcbiAgLy8gSGFuZGxlIGJvdGggeyB0YWJzOiBbLi4uXSB9IGFuZCBkaXJlY3QgYXJyYXkgZm9ybWF0c1xuICBjb25zdCB0YWJzID0gQXJyYXkuaXNBcnJheShuYXZpZ2F0aW9uKSA/IG5hdmlnYXRpb24gOiAobmF2aWdhdGlvbi50YWJzIHx8IFtdKVxuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIHRhYnMpIHtcbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgR3JhcGhRTCB0YWJcbiAgICBpZiAoaXRlbS50eXBlID09PSAnZ3JhcGhxbCcpIHtcbiAgICAgIC8vIFNjaGVtYSBjYW4gYmUgZGlyZWN0bHkgb24gdGFiIG9yIG5lc3RlZCBpbiBzY2hlbWFzIGFycmF5XG4gICAgICBjb25zdCBuZXN0ZWRTY2hlbWFzID0gaXRlbS5zY2hlbWFzIGFzIEFycmF5PHsgc2NoZW1hOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfT4gfCB1bmRlZmluZWRcbiAgICAgIFxuICAgICAgaWYgKG5lc3RlZFNjaGVtYXMgJiYgQXJyYXkuaXNBcnJheShuZXN0ZWRTY2hlbWFzKSkge1xuICAgICAgICAvLyBIYW5kbGUgbXVsdGlwbGUgc2NoZW1hc1xuICAgICAgICBmb3IgKGNvbnN0IHNjaGVtYUNvbmZpZyBvZiBuZXN0ZWRTY2hlbWFzKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYUNvbmZpZy5zY2hlbWEpIHtcbiAgICAgICAgICAgIGF3YWl0IGxvYWRHcmFwaFFMU2NoZW1hKHByb2plY3RSb290LCBzY2hlbWFDb25maWcuc2NoZW1hLCBzY2hlbWFzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpdGVtLnNjaGVtYSkge1xuICAgICAgICAvLyBIYW5kbGUgZGlyZWN0IHNjaGVtYSByZWZlcmVuY2VcbiAgICAgICAgYXdhaXQgbG9hZEdyYXBoUUxTY2hlbWEocHJvamVjdFJvb3QsIGl0ZW0uc2NoZW1hIGFzIHN0cmluZywgc2NoZW1hcylcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBzY2hlbWFzXG59XG5cbi8qKlxuICogTG9hZCBhIHNpbmdsZSBHcmFwaFFMIHNjaGVtYSBpbnRvIHRoZSBzY2hlbWFzIG1hcFxuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkR3JhcGhRTFNjaGVtYShcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgc2NoZW1hUGF0aDogc3RyaW5nLFxuICBzY2hlbWFzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gUmVzb2x2ZSB0aGUgc2NoZW1hIHBhdGggcmVsYXRpdmUgdG8gcHJvamVjdCByb290XG4gIGxldCBmdWxsU2NoZW1hUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgc2NoZW1hUGF0aClcbiAgXG4gIC8vIEhhbmRsZSByZWxhdGl2ZSBwYXRocyBsaWtlIC4vYXBpLXJlZmVyZW5jZS9zY2hlbWEuZ3JhcGhxbFxuICBpZiAoc2NoZW1hUGF0aC5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgZnVsbFNjaGVtYVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsIHNjaGVtYVBhdGguc2xpY2UoMikpXG4gIH1cbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKGZ1bGxTY2hlbWFQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzY2hlbWFDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxTY2hlbWFQYXRoLCAndXRmLTgnKVxuICAgICAgLy8gU3RvcmUgdGhlIHJhdyBTREwgY29udGVudCAobm90IHBhcnNlZClcbiAgICAgIHNjaGVtYXNbc2NoZW1hUGF0aF0gPSBzY2hlbWFDb250ZW50XG4gICAgICBsb2dnZXIuaW5mbyhgICDihpIgJHtzY2hlbWFQYXRofWApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gcmVhZCBHcmFwaFFMIHNjaGVtYSAke3NjaGVtYVBhdGh9OiAke21lc3NhZ2V9YClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLndhcm4oYEdyYXBoUUwgc2NoZW1hIGZpbGUgbm90IGZvdW5kOiAke3NjaGVtYVBhdGh9YClcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgdGhlbWUuanNvbiBpZiBpdCBleGlzdHNcbiAqL1xuZnVuY3Rpb24gY29sbGVjdFRoZW1lSnNvbihwcm9qZWN0Um9vdDogc3RyaW5nKTogb2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGhlbWVQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCAndGhlbWUuanNvbicpXG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyh0aGVtZVBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRoZW1lQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0aGVtZVBhdGgsICd1dGYtOCcpXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGVtZUNvbnRlbnQpIGFzIG9iamVjdFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHBhcnNlIHRoZW1lLmpzb246ICR7bWVzc2FnZX1gKVxuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIENvbGxlY3QgYWxsIE1EWCBhbmQgY29udGVudCBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RGaWxlcyhwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxQcm9qZWN0RmlsZVtdPiB7XG4gIGNvbnN0IGZpbGVzOiBQcm9qZWN0RmlsZVtdID0gW11cbiAgXG4gIC8vIFNjYW4gYWxsIGRpcmVjdG9yaWVzIGluIHByb2plY3Qgcm9vdCAobm90IGp1c3QgaGFyZGNvZGVkIGxpc3QpXG4gIGNvbnN0IGl0ZW1zID0gZnMucmVhZGRpclN5bmMocHJvamVjdFJvb3QpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAvLyBTa2lwIGNvbW1vbiBkaXJlY3RvcmllcyB0aGF0IHNob3VsZG4ndCBiZSBzY2FubmVkXG4gICAgaWYgKFtcbiAgICAgICdub2RlX21vZHVsZXMnLCBcbiAgICAgICdkaXN0JywgXG4gICAgICAnLm5leHQnLCBcbiAgICAgICcuZ2l0JywgXG4gICAgICAncHVibGljJyxcbiAgICAgICcuZGV2ZG9jJyxcbiAgICAgICcuY2xhdWRlJyxcbiAgICAgICcuY3Vyc29yJyxcbiAgICBdLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgaXRlbSlcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpXG4gICAgXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgLy8gU2tpcCBhc3NldHMgZm9sZGVyIGZvciBNRFggc2Nhbm5pbmcgKGhhbmRsZWQgc2VwYXJhdGVseSlcbiAgICAgIGlmIChpdGVtID09PSAnYXNzZXRzJykgY29udGludWVcbiAgICAgIGF3YWl0IHNjYW5EaXJlY3RvcnkoZnVsbFBhdGgsIHByb2plY3RSb290LCBmaWxlcylcbiAgICB9IGVsc2UgaWYgKGl0ZW0uZW5kc1dpdGgoJy5tZHgnKSB8fCBpdGVtLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgLy8gSW5jbHVkZSByb290LWxldmVsIGNvbnRlbnQgZmlsZXMgKE1EWCwgTUQpXG4gICAgICAvLyBOb3RlOiBHcmFwaFFMIHNjaGVtYXMgYXJlIGNvbGxlY3RlZCBzZXBhcmF0ZWx5IHZpYSBjb2xsZWN0R3JhcGhRTFNjaGVtYXMoKVxuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0Zi04JylcbiAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBpdGVtLCBjb250ZW50IH0pXG4gICAgfSBlbHNlIGlmIChpdGVtID09PSAnZG9jcy5qc29uJyB8fCBpdGVtID09PSAndGhlbWUuanNvbicgfHwgaXRlbSA9PT0gJ2RvbWFpbi5qc29uJyB8fCBpdGVtID09PSAnY3VzdG9tLmNzcycpIHtcbiAgICAgIC8vIEluY2x1ZGUgY29uZmlnIGZpbGVzXG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmLTgnKVxuICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGl0ZW0sIGNvbnRlbnQgfSlcbiAgICB9XG4gIH1cbiAgXG4gIC8vIEluY2x1ZGUgdGV4dC1iYXNlZCBhc3NldHMgZnJvbSBhc3NldHMgZm9sZGVyIChTVkcsIEpTT04pXG4gIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2Fzc2V0cycpXG4gIGlmIChmcy5leGlzdHNTeW5jKGFzc2V0c0RpcikpIHtcbiAgICBhd2FpdCBzY2FuUHVibGljQXNzZXRzKGFzc2V0c0RpciwgcHJvamVjdFJvb3QsIGZpbGVzKVxuICB9XG4gIFxuICByZXR1cm4gZmlsZXNcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBzY2FuIGEgZGlyZWN0b3J5IGZvciBjb250ZW50IGZpbGVzIChNRFgsIE1ELCBHcmFwaFFMIHNjaGVtYXMpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjYW5EaXJlY3RvcnkoXG4gIGRpcjogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBmaWxlczogUHJvamVjdEZpbGVbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGl0ZW1zID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICBcbiAgLy8gQ29udGVudCBmaWxlIGV4dGVuc2lvbnMgdG8gaW5jbHVkZVxuICAvLyBOb3RlOiBHcmFwaFFMIHNjaGVtYXMgKC5ncmFwaHFsLCAuZ3FsKSBhcmUgY29sbGVjdGVkIHNlcGFyYXRlbHkgdmlhIGNvbGxlY3RHcmFwaFFMU2NoZW1hcygpXG4gIGNvbnN0IENPTlRFTlRfRVhURU5TSU9OUyA9IFsnLm1keCcsICcubWQnXVxuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgLy8gU2tpcCBjb21tb24gZGlyZWN0b3JpZXNcbiAgICBpZiAoWydub2RlX21vZHVsZXMnLCAnZGlzdCcsICcubmV4dCcsICcuZ2l0JywgJ3B1YmxpYyddLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGl0ZW0pXG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGxQYXRoKVxuICAgIFxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGF3YWl0IHNjYW5EaXJlY3RvcnkoZnVsbFBhdGgsIHByb2plY3RSb290LCBmaWxlcylcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGl0ZW0pLnRvTG93ZXJDYXNlKClcbiAgICAgIGlmIChDT05URU5UX0VYVEVOU0lPTlMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBmdWxsUGF0aClcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0Zi04JylcbiAgICAgICAgXG4gICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgIHBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNjYW4gcHVibGljIGFzc2V0cyAoU1ZHLCBKU09OLCBDU1MpIC0gdGV4dC1iYXNlZCBvbmx5IGZvciBjb250ZW50IGJ1bmRsZVxuICovXG5hc3luYyBmdW5jdGlvbiBzY2FuUHVibGljQXNzZXRzKFxuICBkaXI6IHN0cmluZyxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgZmlsZXM6IFByb2plY3RGaWxlW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpdGVtcyA9IGZzLnJlYWRkaXJTeW5jKGRpcilcbiAgXG4gIC8vIFRleHQtYmFzZWQgZmlsZSBleHRlbnNpb25zIHRvIGluY2x1ZGUgaW4gY29udGVudCBidW5kbGVcbiAgLy8gTm90ZTogU1ZHIGlzIG5vdyB1cGxvYWRlZCBhcyBiaW5hcnkgYXNzZXQgZm9yIGJldHRlciBibG9iIHN0b3JhZ2Ugc2VydmluZ1xuICBjb25zdCBURVhUX0VYVEVOU0lPTlMgPSBbJy5qc29uJywgJy5jc3MnXVxuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBpdGVtKVxuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aClcbiAgICBcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCBzY2FuUHVibGljQXNzZXRzKGZ1bGxQYXRoLCBwcm9qZWN0Um9vdCwgZmlsZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpdGVtKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoVEVYVF9FWFRFTlNJT05TLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgLy8gT25seSBpbmNsdWRlIHRleHQtYmFzZWQgYXNzZXRzIGluIGNvbnRlbnQgYnVuZGxlXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGZ1bGxQYXRoKVxuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmLTgnKVxuICAgICAgICBcbiAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBiaW5hcnkgYXNzZXRzIGZyb20gYXNzZXRzIGZvbGRlclxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QXNzZXRzKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPEFzc2V0RmlsZVtdPiB7XG4gIGNvbnN0IGFzc2V0czogQXNzZXRGaWxlW10gPSBbXVxuICBcbiAgLy8gQ2hlY2sgYXNzZXRzIGZvbGRlclxuICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdhc3NldHMnKVxuICBpZiAoZnMuZXhpc3RzU3luYyhhc3NldHNEaXIpKSB7XG4gICAgYXdhaXQgc2NhbkJpbmFyeUFzc2V0cyhhc3NldHNEaXIsIHByb2plY3RSb290LCBhc3NldHMpXG4gIH1cbiAgXG4gIHJldHVybiBhc3NldHNcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBzY2FuIGZvciBiaW5hcnkgYXNzZXRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjYW5CaW5hcnlBc3NldHMoXG4gIGRpcjogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBhc3NldHM6IEFzc2V0RmlsZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGl0ZW0pXG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGxQYXRoKVxuICAgIFxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGF3YWl0IHNjYW5CaW5hcnlBc3NldHMoZnVsbFBhdGgsIHByb2plY3RSb290LCBhc3NldHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpdGVtKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoQklOQVJZX0VYVEVOU0lPTlMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICAvLyBDaGVjayBzaXplIGxpbWl0XG4gICAgICAgIGlmIChzdGF0LnNpemUgPiBNQVhfQVNTRVRfU0laRSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBTa2lwcGluZyAke2l0ZW19OiBleGNlZWRzIDI1TUIgbGltaXQgKCR7Zm9ybWF0U2l6ZShzdGF0LnNpemUpfSlgKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGZ1bGxQYXRoKVxuICAgICAgICBhc3NldHMucHVzaCh7XG4gICAgICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGZ1bGxQYXRoLFxuICAgICAgICAgIHNpemU6IHN0YXQuc2l6ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVcGxvYWQgYXNzZXRzIHdpdGggcHJvZ3Jlc3MgdHJhY2tpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBsb2FkQXNzZXRzKFxuICBhc3NldHM6IEFzc2V0RmlsZVtdLFxuICBhcGlVcmw6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxBcnJheTx7IGZpbGU6IHN0cmluZzsgc3VjY2VzczogYm9vbGVhbjsgdXJsPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9Pj4ge1xuICBjb25zdCByZXN1bHRzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgc3VjY2VzczogYm9vbGVhbjsgdXJsPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9PiA9IFtdXG4gIFxuICBmb3IgKGNvbnN0IGFzc2V0IG9mIGFzc2V0cykge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShhc3NldC5wYXRoKVxuICAgIFxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7ZmlsZU5hbWV9OiBgKVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGxvYWRBc3NldFdpdGhQcm9ncmVzcyhcbiAgICAgICAgYXNzZXQsXG4gICAgICAgIGFwaVVybCxcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgYXBpS2V5LFxuICAgICAgICAocHJvZ3Jlc3MsIGxvYWRlZCwgdG90YWwpID0+IHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQuY3Vyc29yVG8oMClcbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7ZmlsZU5hbWV9OiAke2NyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzKX0gJHtmb3JtYXRTaXplKGxvYWRlZCl9LyR7Zm9ybWF0U2l6ZSh0b3RhbCl9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIFxuICAgICAgaWYgKHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICBwcm9jZXNzLnN0ZG91dC5jdXJzb3JUbygwKVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIuZ3JlZW4oJ+KckycpfSAke2ZpbGVOYW1lfSAoJHtmb3JtYXRTaXplKGFzc2V0LnNpemUpfSlgKVxuICAgICAgXG4gICAgICByZXN1bHRzLnB1c2goeyBmaWxlOiBmaWxlTmFtZSwgc3VjY2VzczogdHJ1ZSwgdXJsOiByZXN1bHQudXJsIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIFxuICAgICAgaWYgKHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICBwcm9jZXNzLnN0ZG91dC5jdXJzb3JUbygwKVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIucmVkKCfinJcnKX0gJHtmaWxlTmFtZX06ICR7bWVzc2FnZX1gKVxuICAgICAgXG4gICAgICByZXN1bHRzLnB1c2goeyBmaWxlOiBmaWxlTmFtZSwgc3VjY2VzczogZmFsc2UsIGVycm9yOiBtZXNzYWdlIH0pXG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gcmVzdWx0c1xufVxuXG4vKipcbiAqIFVwbG9hZCBhIHNpbmdsZSBhc3NldCB3aXRoIHByb2dyZXNzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZEFzc2V0V2l0aFByb2dyZXNzKFxuICBhc3NldDogQXNzZXRGaWxlLFxuICBhcGlVcmw6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZyxcbiAgb25Qcm9ncmVzczogKHByb2dyZXNzOiBudW1iZXIsIGxvYWRlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PiB2b2lkXG4pOiBQcm9taXNlPHsgdXJsOiBzdHJpbmcgfT4ge1xuICBjb25zdCBmaWxlQnVmZmVyID0gZnMucmVhZEZpbGVTeW5jKGFzc2V0LmZ1bGxQYXRoKVxuICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoYXNzZXQucGF0aClcbiAgY29uc3QgbWltZVR5cGUgPSBnZXRNaW1lVHlwZShhc3NldC5mdWxsUGF0aClcbiAgXG4gIC8vIEJ1aWxkIG11bHRpcGFydCBmb3JtIGRhdGFcbiAgY29uc3QgYm91bmRhcnkgPSBgLS0tLURldkRvY0RlcGxveSR7RGF0ZS5ub3coKX1gXG4gIGNvbnN0IENSTEYgPSAnXFxyXFxuJ1xuICBcbiAgY29uc3QgaGVhZGVyID0gW1xuICAgIGAtLSR7Ym91bmRhcnl9YCxcbiAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiZmlsZVwiOyBmaWxlbmFtZT1cIiR7ZmlsZU5hbWV9XCJgLFxuICAgIGBDb250ZW50LVR5cGU6ICR7bWltZVR5cGV9YCxcbiAgICAnJyxcbiAgICAnJ1xuICBdLmpvaW4oQ1JMRilcbiAgXG4gIGNvbnN0IHNsdWdQYXJ0ID0gW1xuICAgICcnLFxuICAgIGAtLSR7Ym91bmRhcnl9YCxcbiAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwic2x1Z1wiYCxcbiAgICAnJyxcbiAgICBzbHVnLFxuICAgICcnXG4gIF0uam9pbihDUkxGKVxuICBcbiAgY29uc3QgcGF0aFBhcnQgPSBbXG4gICAgYC0tJHtib3VuZGFyeX1gLFxuICAgIGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJwYXRoXCJgLFxuICAgICcnLFxuICAgIGFzc2V0LnBhdGgucmVwbGFjZSgvXmFzc2V0c1xcLy8sICcnKSwgLy8gUmVtb3ZlIGFzc2V0cy8gcHJlZml4XG4gICAgJydcbiAgXS5qb2luKENSTEYpXG4gIFxuICBjb25zdCBmb290ZXIgPSBgJHtDUkxGfS0tJHtib3VuZGFyeX0tLSR7Q1JMRn1gXG4gIFxuICBjb25zdCBoZWFkZXJCdWZmZXIgPSBCdWZmZXIuZnJvbShoZWFkZXIpXG4gIGNvbnN0IHNsdWdCdWZmZXIgPSBCdWZmZXIuZnJvbShzbHVnUGFydClcbiAgY29uc3QgcGF0aEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHBhdGhQYXJ0KVxuICBjb25zdCBmb290ZXJCdWZmZXIgPSBCdWZmZXIuZnJvbShmb290ZXIpXG4gIFxuICBjb25zdCB0b3RhbFNpemUgPSBoZWFkZXJCdWZmZXIubGVuZ3RoICsgZmlsZUJ1ZmZlci5sZW5ndGggKyBzbHVnQnVmZmVyLmxlbmd0aCArIHBhdGhCdWZmZXIubGVuZ3RoICsgZm9vdGVyQnVmZmVyLmxlbmd0aFxuICBjb25zdCBib2R5ID0gQnVmZmVyLmNvbmNhdChbaGVhZGVyQnVmZmVyLCBmaWxlQnVmZmVyLCBzbHVnQnVmZmVyLCBwYXRoQnVmZmVyLCBmb290ZXJCdWZmZXJdKVxuICBcbiAgLy8gU2ltdWxhdGUgcHJvZ3Jlc3NcbiAgbGV0IHVwbG9hZGVkID0gMFxuICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmNlaWwodG90YWxTaXplIC8gMjApXG4gIFxuICBjb25zdCBwcm9ncmVzc0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh1cGxvYWRlZCA8IHRvdGFsU2l6ZSAqIDAuOSkge1xuICAgICAgdXBsb2FkZWQgPSBNYXRoLm1pbih1cGxvYWRlZCArIGNodW5rU2l6ZSwgdG90YWxTaXplICogMC45KVxuICAgICAgb25Qcm9ncmVzcyh1cGxvYWRlZCAvIHRvdGFsU2l6ZSwgdXBsb2FkZWQsIHRvdGFsU2l6ZSlcbiAgICB9XG4gIH0sIDUwKVxuICBcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL2Fzc2V0cy91cGxvYWRgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0ke2JvdW5kYXJ5fWAsXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHksXG4gICAgfSlcbiAgICBcbiAgICBjbGVhckludGVydmFsKHByb2dyZXNzSW50ZXJ2YWwpXG4gICAgb25Qcm9ncmVzcygxLCB0b3RhbFNpemUsIHRvdGFsU2l6ZSlcbiAgICBcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBlcnJvcjogJ1VwbG9hZCBmYWlsZWQnIH0pKSBhcyB7IGVycm9yPzogc3RyaW5nIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgeyB1cmw6IHN0cmluZyB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NJbnRlcnZhbClcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbi8qKlxuICogRm9ybWF0IGZpbGUgc2l6ZSBmb3IgZGlzcGxheVxuICovXG5mdW5jdGlvbiBmb3JtYXRTaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMgPCAxMDI0KSByZXR1cm4gYCR7Ynl0ZXN9IEJgXG4gIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0KSByZXR1cm4gYCR7KGJ5dGVzIC8gMTAyNCkudG9GaXhlZCgxKX0gS0JgXG4gIHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpfSBNQmBcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBwcm9ncmVzcyBiYXIgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgPSAzMCk6IHN0cmluZyB7XG4gIGNvbnN0IGZpbGxlZCA9IE1hdGgucm91bmQod2lkdGggKiBwcm9ncmVzcylcbiAgY29uc3QgZW1wdHkgPSB3aWR0aCAtIGZpbGxlZFxuICBjb25zdCBiYXIgPSAn4paIJy5yZXBlYXQoZmlsbGVkKSArICfilpEnLnJlcGVhdChlbXB0eSlcbiAgY29uc3QgcGVyY2VudGFnZSA9IE1hdGgucm91bmQocHJvZ3Jlc3MgKiAxMDApXG4gIHJldHVybiBgWyR7YmFyfV0gJHtwZXJjZW50YWdlfSVgXG59XG4iXX0=
955
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9kZXBsb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvUUEsd0JBK1lDO0FBbnBCRCxnREFBdUI7QUFDdkIsd0RBQXlCO0FBQ3pCLHlDQUF5RDtBQUN6RCwrQ0FBMkM7QUFDM0MsK0NBQWlEO0FBRWpELHVCQUF1QjtBQUN2QixNQUFNLGNBQWMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtBQUV2QywrQ0FBK0M7QUFDL0MsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNO0lBQ3hELE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTTtJQUN2QixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDdEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDekMsTUFBTTtDQUNQLENBQUE7QUFFRCxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLEdBQTJCO0lBQ3pDLFNBQVM7SUFDVCxNQUFNLEVBQUUsV0FBVztJQUNuQixNQUFNLEVBQUUsWUFBWTtJQUNwQixPQUFPLEVBQUUsWUFBWTtJQUNyQixNQUFNLEVBQUUsV0FBVztJQUNuQixPQUFPLEVBQUUsWUFBWTtJQUNyQixNQUFNLEVBQUUsY0FBYztJQUN0QixNQUFNLEVBQUUsZUFBZTtJQUN2QixTQUFTO0lBQ1QsTUFBTSxFQUFFLFdBQVc7SUFDbkIsT0FBTyxFQUFFLFlBQVk7SUFDckIsTUFBTSxFQUFFLGlCQUFpQjtJQUN6QixRQUFRO0lBQ1IsTUFBTSxFQUFFLFlBQVk7SUFDcEIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsUUFBUTtJQUNSLE9B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QztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUMvQixNQUFNLEtBQUssQ0FBQTtJQUNiLENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxLQUFhO0lBQy9CLElBQUksS0FBSyxHQUFHLElBQUk7UUFBRSxPQUFPLEdBQUcsS0FBSyxJQUFJLENBQUE7SUFDckMsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUk7UUFBRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7SUFDakUsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7QUFDbkQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxRQUFnQixFQUFFLFFBQWdCLEVBQUU7SUFDN0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUE7SUFDM0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQTtJQUM1QixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDbEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUE7SUFDN0MsT0FBTyxJQUFJLEdBQUcsS0FBSyxVQUFVLEdBQUcsQ0FBQTtBQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCB7IGxvYWRDb25maWcsIHZhbGlkYXRlQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29uZmlnJ1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJ1xuaW1wb3J0IHsgREVGQVVMVF9BUElfVVJMIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJ1xuXG4vLyBNYXggYXNzZXQgc2l6ZTogMjVNQlxuY29uc3QgTUFYX0FTU0VUX1NJWkUgPSAyNSAqIDEwMjQgKiAxMDI0XG5cbi8vIEJpbmFyeSBhc3NldCBleHRlbnNpb25zIHRvIHVwbG9hZCBzZXBhcmF0ZWx5XG5jb25zdCBCSU5BUllfRVhURU5TSU9OUyA9IFtcbiAgJy5wbmcnLCAnLmpwZycsICcuanBlZycsICcuZ2lmJywgJy53ZWJwJywgJy5pY28nLCAnLnN2ZycsXG4gICcubXA0JywgJy53ZWJtJywgJy5tb3YnLFxuICAnLm1wMycsICcud2F2JywgJy5vZ2cnLFxuICAnLndvZmYnLCAnLndvZmYyJywgJy50dGYnLCAnLm90ZicsICcuZW90JyxcbiAgJy5wZGYnLFxuXVxuXG4vLyBNYXAgZmlsZSBleHRlbnNpb25zIHRvIE1JTUUgdHlwZXNcbmNvbnN0IE1JTUVfVFlQRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIC8vIEltYWdlc1xuICAnLnBuZyc6ICdpbWFnZS9wbmcnLFxuICAnLmpwZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmdpZic6ICdpbWFnZS9naWYnLFxuICAnLndlYnAnOiAnaW1hZ2Uvd2VicCcsXG4gICcuaWNvJzogJ2ltYWdlL3gtaWNvbicsXG4gICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAvLyBWaWRlb3NcbiAgJy5tcDQnOiAndmlkZW8vbXA0JyxcbiAgJy53ZWJtJzogJ3ZpZGVvL3dlYm0nLFxuICAnLm1vdic6ICd2aWRlby9xdWlja3RpbWUnLFxuICAvLyBBdWRpb1xuICAnLm1wMyc6ICdhdWRpby9tcGVnJyxcbiAgJy53YXYnOiAnYXVkaW8vd2F2JyxcbiAgJy5vZ2cnOiAnYXVkaW8vb2dnJyxcbiAgLy8gRm9udHNcbiAgJy53b2ZmJzogJ2ZvbnQvd29mZicsXG4gICcud29mZjInOiAnZm9udC93b2ZmMicsXG4gICcudHRmJzogJ2ZvbnQvdHRmJyxcbiAgJy5vdGYnOiAnZm9udC9vdGYnLFxuICAnLmVvdCc6ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsXG4gIC8vIERvY3VtZW50c1xuICAnLnBkZic6ICdhcHBsaWNhdGlvbi9wZGYnLFxufVxuXG4vKipcbiAqIEdldCBNSU1FIHR5cGUgZnJvbSBmaWxlIGV4dGVuc2lvblxuICovXG5mdW5jdGlvbiBnZXRNaW1lVHlwZShmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpXG4gIHJldHVybiBNSU1FX1RZUEVTW2V4dF0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbn1cblxuaW50ZXJmYWNlIERlcGxveU9wdGlvbnMge1xuICB1cmw/OiBzdHJpbmdcbiAgYXBpS2V5Pzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBQcm9qZWN0RmlsZSB7XG4gIHBhdGg6IHN0cmluZ1xuICBjb250ZW50OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIE9wZW5BcGlTcGVjIHtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5pbnRlcmZhY2UgQXNzZXRGaWxlIHtcbiAgcGF0aDogc3RyaW5nXG4gIGZ1bGxQYXRoOiBzdHJpbmdcbiAgc2l6ZTogbnVtYmVyXG59XG5cbmludGVyZmFjZSBEZXZEb2NDb25maWcge1xuICBwcm9qZWN0SWQ/OiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBzbHVnPzogc3RyaW5nXG4gIHN1YmRvbWFpbj86IHN0cmluZ1xuICBhcGlLZXk/OiBzdHJpbmdcbiAgdXJsPzogc3RyaW5nXG4gIGxhc3REZXBsb3llZD86IHN0cmluZ1xuICBjcmVhdGVkQXQ/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIFJlZ2lzdGVyUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBib29sZWFuXG4gIHByb2plY3RJZDogc3RyaW5nXG4gIHNsdWc6IHN0cmluZ1xuICBzdWJkb21haW46IHN0cmluZ1xuICBhcGlLZXk6IHN0cmluZ1xuICB1cmw6IHN0cmluZ1xuICBlcnJvcj86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgQ2hlY2tTdWJkb21haW5SZXNwb25zZSB7XG4gIGF2YWlsYWJsZTogYm9vbGVhblxuICBlcnJvcj86IHN0cmluZ1xuICBzdWdnZXN0aW9uPzogc3RyaW5nXG59XG5cbi8vIFNpbXBsZSBwcm9tcHQgaGVscGVyIHVzaW5nIHJlYWRsaW5lXG5hc3luYyBmdW5jdGlvbiBwcm9tcHQocXVlc3Rpb246IHN0cmluZywgZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVhZGxpbmUgPSBhd2FpdCBpbXBvcnQoJ3JlYWRsaW5lJylcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdEhpbnQgPSBkZWZhdWx0VmFsdWUgPyBgICgke2RlZmF1bHRWYWx1ZX0pYCA6ICcnXG4gICAgcmwucXVlc3Rpb24oYCR7cXVlc3Rpb259JHtkZWZhdWx0SGludH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKClcbiAgICAgIHJlc29sdmUoYW5zd2VyLnRyaW0oKSB8fCBkZWZhdWx0VmFsdWUgfHwgJycpXG4gICAgfSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDaGVjayBzdWJkb21haW4gYXZhaWxhYmlsaXR5IHZpYSBBUElcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tTdWJkb21haW5BdmFpbGFiaWxpdHkoXG4gIHN1YmRvbWFpbjogc3RyaW5nLFxuICBhcGlVcmw6IHN0cmluZ1xuKTogUHJvbWlzZTxDaGVja1N1YmRvbWFpblJlc3BvbnNlPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9zdWJkb21haW5zL2NoZWNrYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzdWJkb21haW4gfSksXG4gICAgfSlcbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2hlY2tTdWJkb21haW5SZXNwb25zZVxuICAgIHJldHVybiByZXN1bHRcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgQVBJIGlzIHVuYXZhaWxhYmxlLCBhc3N1bWUgYXZhaWxhYmxlICh3aWxsIGZhaWwgYXQgcmVnaXN0cmF0aW9uIGlmIG5vdClcbiAgICByZXR1cm4geyBhdmFpbGFibGU6IHRydWUgfVxuICB9XG59XG5cbi8qKlxuICogQmFzaWMgc3ViZG9tYWluIGZvcm1hdCB2YWxpZGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTdWJkb21haW5Gb3JtYXQoc3ViZG9tYWluOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgaWYgKCFzdWJkb21haW4pIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIGlzIHJlcXVpcmVkJyB9XG4gIH1cbiAgXG4gIGlmIChzdWJkb21haW4ubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnMnIH1cbiAgfVxuICBcbiAgaWYgKHN1YmRvbWFpbi5sZW5ndGggPiA2Mykge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gbXVzdCBiZSA2MyBjaGFyYWN0ZXJzIG9yIGxlc3MnIH1cbiAgfVxuICBcbiAgaWYgKCEvXlthLXowLTldKFthLXowLTktXSpbYS16MC05XSk/JC8udGVzdChzdWJkb21haW4pKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBtdXN0IHN0YXJ0IGFuZCBlbmQgd2l0aCBhbHBoYW51bWVyaWMsIGNhbiBjb250YWluIGh5cGhlbnMnIH1cbiAgfVxuICBcbiAgaWYgKC8tLS8udGVzdChzdWJkb21haW4pKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBjYW5ub3QgY29udGFpbiBjb25zZWN1dGl2ZSBoeXBoZW5zJyB9XG4gIH1cbiAgXG4gIHJldHVybiB7IHZhbGlkOiB0cnVlIH1cbn1cblxuaW50ZXJmYWNlIERvbWFpbkNvbmZpZyB7XG4gIGN1c3RvbURvbWFpbjogc3RyaW5nXG4gIHNlbz86IHtcbiAgICBjYW5vbmljYWw/OiBzdHJpbmdcbiAgfVxufVxuXG5pbnRlcmZhY2UgRG9tYWluU3RhdHVzUmVzcG9uc2Uge1xuICBoYXNDdXN0b21Eb21haW46IGJvb2xlYW5cbiAgZG9tYWluPzogc3RyaW5nXG4gIHN0YXR1cz86IHN0cmluZ1xuICBjdXN0b21Vcmw/OiBzdHJpbmdcbiAgbWVzc2FnZT86IHN0cmluZ1xuICBuZXh0U3RlcD86IHN0cmluZ1xufVxuXG4vKipcbiAqIENoZWNrIGZvciBkb21haW4uanNvbiBhbmQgZGlzcGxheSBjdXN0b20gZG9tYWluIHN0YXR1c1xuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0N1c3RvbURvbWFpblN0YXR1cyhcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgYXBpVXJsOiBzdHJpbmcsXG4gIGFwaUtleTogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQ2hlY2sgaWYgZG9tYWluLmpzb24gZXhpc3RzXG4gIGNvbnN0IGRvbWFpbkNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdkb21haW4uanNvbicpXG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZG9tYWluQ29uZmlnUGF0aCkpIHtcbiAgICByZXR1cm4gLy8gTm8gZG9tYWluLmpzb24sIG5vdGhpbmcgdG8gZG9cbiAgfVxuICBcbiAgbGV0IGRvbWFpbkNvbmZpZzogRG9tYWluQ29uZmlnXG4gIHRyeSB7XG4gICAgZG9tYWluQ29uZmlnID0gZnMucmVhZEpzb25TeW5jKGRvbWFpbkNvbmZpZ1BhdGgpIGFzIERvbWFpbkNvbmZpZ1xuICB9IGNhdGNoIHtcbiAgICBsb2dnZXIud2FybignRm91bmQgZG9tYWluLmpzb24gYnV0IGZhaWxlZCB0byBwYXJzZSBpdCcpXG4gICAgcmV0dXJuXG4gIH1cbiAgXG4gIGlmICghZG9tYWluQ29uZmlnLmN1c3RvbURvbWFpbikge1xuICAgIHJldHVyblxuICB9XG4gIFxuICBjb25zb2xlLmxvZygnJylcbiAgbG9nZ2VyLmluZm8oYEN1c3RvbSBkb21haW4gY29uZmlndXJlZDogJHtkb21haW5Db25maWcuY3VzdG9tRG9tYWlufWApXG4gIFxuICAvLyBDaGVjayBkb21haW4gc3RhdHVzIHZpYSBBUElcbiAgaWYgKCFhcGlLZXkpIHtcbiAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGRvbWFpbiBzdGF0dXNcIiB0byBjaGVjayBETlMgY29uZmlndXJhdGlvbicpXG4gICAgcmV0dXJuXG4gIH1cbiAgXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9kb21haW5zL3N0YXR1c2AsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgfSxcbiAgICB9KVxuICAgIFxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRG9tYWluU3RhdHVzUmVzcG9uc2VcbiAgICBcbiAgICBpZiAoIXN0YXR1cy5oYXNDdXN0b21Eb21haW4pIHtcbiAgICAgIC8vIERvbWFpbiBpbiBjb25maWcgYnV0IG5vdCByZWdpc3RlcmVkIHlldFxuICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICBsb2dnZXIuaW5mbygnQ3VzdG9tIGRvbWFpbiBub3QgeWV0IHJlZ2lzdGVyZWQuJylcbiAgICAgIGxvZ2dlci5pbmZvKCdSdW4gXCJkZXZkb2MgZG9tYWluIGFkZCAnICsgZG9tYWluQ29uZmlnLmN1c3RvbURvbWFpbiArICdcIiB0byBzZXQgaXQgdXAnKVxuICAgIH0gZWxzZSBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgY29uc29sZS5sb2coYCAgQWxzbyBsaXZlIGF0OiAke2xvZ2dlci5jeWFuKHN0YXR1cy5jdXN0b21VcmwgfHwgYGh0dHBzOi8vJHtzdGF0dXMuZG9tYWlufWApfWApXG4gICAgfSBlbHNlIGlmIChzdGF0dXMuc3RhdHVzID09PSAncGVuZGluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgbG9nZ2VyLndhcm4oJ0N1c3RvbSBkb21haW4gcGVuZGluZyBETlMgY29uZmlndXJhdGlvbicpXG4gICAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGRvbWFpbiBzdGF0dXNcIiBmb3IgRE5TIHNldHVwIGluc3RydWN0aW9ucycpXG4gICAgfSBlbHNlIGlmIChzdGF0dXMuc3RhdHVzID09PSAnZG5zX3ZlcmlmaWVkJyB8fCBzdGF0dXMuc3RhdHVzID09PSAnc3NsX3Byb3Zpc2lvbmluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgbG9nZ2VyLmluZm8oJ0N1c3RvbSBkb21haW4gRE5TIHZlcmlmaWVkLCBTU0wgY2VydGlmaWNhdGUgcHJvdmlzaW9uaW5nLi4uJylcbiAgICB9XG4gICAgXG4gIH0gY2F0Y2gge1xuICAgIC8vIElnbm9yZSBlcnJvcnMsIGRvbWFpbiBzdGF0dXMgaXMgaW5mb3JtYXRpb25hbFxuICB9XG59XG5cbi8qKlxuICogRGVwbG95IGRvY3VtZW50YXRpb24gdG8gRGV2RG9jIHBsYXRmb3JtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXBsb3kob3B0aW9uczogRGVwbG95T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IHByb2Nlc3MuY3dkKClcbiAgY29uc3QgYXBpVXJsID0gb3B0aW9ucy51cmwgfHwgcHJvY2Vzcy5lbnYuREVWRE9DX0FQSV9VUkwgfHwgREVGQVVMVF9BUElfVVJMXG4gIFxuICBsb2dnZXIuaW5mbygnRGVwbG95aW5nIHRvIERldkRvYy4uLlxcbicpXG4gIFxuICAvLyBDaGVjayBmb3IgZG9jcy5qc29uXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdkb2NzLmpzb24nKVxuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ2RvY3MuanNvbiBub3QgZm91bmQgaW4gY3VycmVudCBkaXJlY3RvcnknKVxuICAgIGxvZ2dlci5pbmZvKCdNYWtlIHN1cmUgeW91IGFyZSBpbiBhIERldkRvYyBkb2N1bWVudGF0aW9uIHByb2plY3QgZGlyZWN0b3J5JylcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuICBcbiAgLy8gTG9hZCBhbmQgdmFsaWRhdGUgY29uZmlndXJhdGlvblxuICBsZXQgY29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkQ29uZmlnPiBleHRlbmRzIFByb21pc2U8aW5mZXIgVD4gPyBUIDogbmV2ZXJcbiAgdHJ5IHtcbiAgICBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHByb2plY3RSb290KVxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZUNvbmZpZyhjb25maWcpXG4gICAgXG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ludmFsaWQgZG9jcy5qc29uIGNvbmZpZ3VyYXRpb246JylcbiAgICAgIHZhbGlkYXRpb24uZXJyb3JzLmZvckVhY2goZXJyID0+IGxvZ2dlci5lcnJvcihgICAtICR7ZXJyfWApKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgQ29uZmlndXJhdGlvbiB2YWxpZDogJHtjb25maWcubmFtZSB8fCAnVW50aXRsZWQnfWApXG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgY29uZmlndXJhdGlvbjogJHttZXNzYWdlfWApXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbiAgXG4gIC8vIENoZWNrIGZvciBleGlzdGluZyBwcm9qZWN0IGNvbmZpZ1xuICBjb25zdCBkZXZkb2NDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCAnLmRldmRvYy5qc29uJylcbiAgbGV0IGRldmRvY0NvbmZpZzogRGV2RG9jQ29uZmlnIHwgbnVsbCA9IG51bGxcbiAgbGV0IGV4aXN0aW5nU2x1Zzogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IGV4aXN0aW5nQXBpS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBsZXQgZXhpc3RpbmdTdWJkb21haW46IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyhkZXZkb2NDb25maWdQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBkZXZkb2NDb25maWcgPSBmcy5yZWFkSnNvblN5bmMoZGV2ZG9jQ29uZmlnUGF0aCkgYXMgRGV2RG9jQ29uZmlnXG4gICAgICBleGlzdGluZ1NsdWcgPSBkZXZkb2NDb25maWcuc2x1ZyB8fCBudWxsXG4gICAgICBleGlzdGluZ0FwaUtleSA9IGRldmRvY0NvbmZpZy5hcGlLZXkgfHwgbnVsbFxuICAgICAgZXhpc3RpbmdTdWJkb21haW4gPSBkZXZkb2NDb25maWcuc3ViZG9tYWluIHx8IG51bGxcbiAgICAgIGlmIChleGlzdGluZ1NsdWcgJiYgZXhpc3RpbmdBcGlLZXkpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYERlcGxveWluZyBwcm9qZWN0OiAke2V4aXN0aW5nU2x1Z31gKVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JlIGVycm9ycyByZWFkaW5nIC5kZXZkb2MuanNvblxuICAgIH1cbiAgfVxuICBcbiAgLy8gR2V0IEFQSSBrZXkgZnJvbSBvcHRpb25zLCBlbnYgdmFyLCBvciAuZGV2ZG9jLmpzb25cbiAgbGV0IGFwaUtleSA9IG9wdGlvbnMuYXBpS2V5IHx8IHByb2Nlc3MuZW52LkRFVkRPQ19BUElfS0VZIHx8IGV4aXN0aW5nQXBpS2V5XG4gIFxuICAvLyBJZiBubyBBUEkga2V5LCB0aGlzIGlzIGEgZmlyc3QgZGVwbG95IC0gbmVlZCB0byByZWdpc3RlciB0aGUgc3ViZG9tYWluIGZpcnN0XG4gIGlmICghYXBpS2V5KSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBzdWJkb21haW4gZnJvbSBpbml0XG4gICAgaWYgKCFleGlzdGluZ1N1YmRvbWFpbikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdObyBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gZm91bmQuJylcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgbG9nZ2VyLmluZm8oJ1J1biBcImRldmRvYyBpbml0XCIgZmlyc3QgdG8gY29uZmlndXJlIHlvdXIgcHJvamVjdCcpXG4gICAgICBsb2dnZXIuaW5mbygnT3IgcHJvdmlkZSBhbiBBUEkga2V5IHZpYSAtLWFwaS1rZXkgZmxhZyBvciBERVZET0NfQVBJX0tFWSBlbnYgdmFyJylcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cbiAgICBcbiAgICBsZXQgc3ViZG9tYWluVG9SZWdpc3RlciA9IGV4aXN0aW5nU3ViZG9tYWluXG4gICAgbGV0IHJlZ2lzdGVyZWQgPSBmYWxzZVxuICAgIFxuICAgIC8vIExvb3AgdW50aWwgd2Ugc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyIGEgc3ViZG9tYWluXG4gICAgd2hpbGUgKCFyZWdpc3RlcmVkKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgUmVnaXN0ZXJpbmcgc3ViZG9tYWluICR7c3ViZG9tYWluVG9SZWdpc3Rlcn0uZGV2ZG9jLnNoLi4uYClcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL3Byb2plY3RzL3JlZ2lzdGVyYCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBuYW1lOiBkZXZkb2NDb25maWc/Lm5hbWUgfHwgY29uZmlnLm5hbWUgfHwgJ015IERvY3VtZW50YXRpb24nLFxuICAgICAgICAgICAgc2x1Zzogc3ViZG9tYWluVG9SZWdpc3RlcixcbiAgICAgICAgICAgIHN1YmRvbWFpbjogc3ViZG9tYWluVG9SZWdpc3RlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIGlmICghcmVnaXN0ZXJSZXNwb25zZS5vaykge1xuICAgICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlZ2lzdGVyUmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IGVycm9yOiAnVW5rbm93biBlcnJvcicgfSkpIGFzIHsgZXJyb3I/OiBzdHJpbmc7IGRldGFpbHM/OiBzdHJpbmcgfVxuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yRGF0YS5lcnJvciB8fCBgSFRUUCAke3JlZ2lzdGVyUmVzcG9uc2Uuc3RhdHVzfWBcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBJZiBzdWJkb21haW4gaXMgdGFrZW4sIGFzayBmb3IgYSBuZXcgb25lXG4gICAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSB8fCBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgdGFrZW4nKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICAgICAgICBsb2dnZXIud2FybihgU3ViZG9tYWluIFwiJHtzdWJkb21haW5Ub1JlZ2lzdGVyfVwiIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuYClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHN1Z2dlc3Rpb24gZnJvbSBBUElcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJpbGl0eSA9IGF3YWl0IGNoZWNrU3ViZG9tYWluQXZhaWxhYmlsaXR5KHN1YmRvbWFpblRvUmVnaXN0ZXIsIGFwaVVybClcbiAgICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb24gPSBhdmFpbGFiaWxpdHkuc3VnZ2VzdGlvbiB8fCBgJHtzdWJkb21haW5Ub1JlZ2lzdGVyfS1kb2NzYFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBTdWdnZXN0aW9uOiAke3N1Z2dlc3Rpb259LmRldmRvYy5zaGApXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gUHJvbXB0IGZvciBuZXcgc3ViZG9tYWluXG4gICAgICAgICAgICBsZXQgbmV3U3ViZG9tYWluID0gYXdhaXQgcHJvbXB0KCdFbnRlciBhIG5ldyBzdWJkb21haW4nLCBzdWdnZXN0aW9uKVxuICAgICAgICAgICAgbmV3U3ViZG9tYWluID0gbmV3U3ViZG9tYWluLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSBmb3JtYXRcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdENoZWNrID0gaXNWYWxpZFN1YmRvbWFpbkZvcm1hdChuZXdTdWJkb21haW4pXG4gICAgICAgICAgICBpZiAoIWZvcm1hdENoZWNrLnZhbGlkKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihmb3JtYXRDaGVjay5lcnJvciEpXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHN1YmRvbWFpblRvUmVnaXN0ZXIgPSBuZXdTdWJkb21haW5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJSZXN1bHQgPSBhd2FpdCByZWdpc3RlclJlc3BvbnNlLmpzb24oKSBhcyBSZWdpc3RlclJlc3BvbnNlXG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgbG9jYWwgY29uZmlnIHdpdGggQVBJIGtleVxuICAgICAgICBhcGlLZXkgPSByZWdpc3RlclJlc3VsdC5hcGlLZXlcbiAgICAgICAgZXhpc3RpbmdTbHVnID0gcmVnaXN0ZXJSZXN1bHQuc2x1Z1xuICAgICAgICBleGlzdGluZ1N1YmRvbWFpbiA9IHJlZ2lzdGVyUmVzdWx0LnN1YmRvbWFpblxuICAgICAgICBcbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBjb25maWdcbiAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZzogRGV2RG9jQ29uZmlnID0ge1xuICAgICAgICAgIC4uLmRldmRvY0NvbmZpZyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IHJlZ2lzdGVyUmVzdWx0LnByb2plY3RJZCxcbiAgICAgICAgICBzbHVnOiByZWdpc3RlclJlc3VsdC5zbHVnLFxuICAgICAgICAgIHN1YmRvbWFpbjogcmVnaXN0ZXJSZXN1bHQuc3ViZG9tYWluLFxuICAgICAgICAgIGFwaUtleTogcmVnaXN0ZXJSZXN1bHQuYXBpS2V5LFxuICAgICAgICAgIHVybDogcmVnaXN0ZXJSZXN1bHQudXJsLFxuICAgICAgICB9XG4gICAgICAgIGZzLndyaXRlSnNvblN5bmMoZGV2ZG9jQ29uZmlnUGF0aCwgdXBkYXRlZENvbmZpZywgeyBzcGFjZXM6IDIgfSlcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgU3ViZG9tYWluICR7cmVnaXN0ZXJSZXN1bHQuc3ViZG9tYWlufS5kZXZkb2Muc2ggcmVnaXN0ZXJlZCFgKVxuICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgcmVnaXN0ZXJlZCA9IHRydWVcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlZ2lzdGVyIHN1YmRvbWFpbjogJHttZXNzYWdlfWApXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLy8gQ29sbGVjdCBhbGwgY29udGVudCBmaWxlc1xuICBsb2dnZXIuaW5mbygnQnVuZGxpbmcgY29udGVudC4uLicpXG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgY29sbGVjdEZpbGVzKHByb2plY3RSb290KVxuICBsb2dnZXIuc3VjY2Vzcyhg4pyTIEZvdW5kICR7ZmlsZXMubGVuZ3RofSBjb250ZW50IGZpbGVzYClcbiAgXG4gIC8vIENvbGxlY3QgdGhlbWUuanNvblxuICBjb25zdCB0aGVtZUpzb24gPSBjb2xsZWN0VGhlbWVKc29uKHByb2plY3RSb290KVxuICBpZiAodGhlbWVKc29uKSB7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ+KckyBGb3VuZCB0aGVtZS5qc29uJylcbiAgfVxuICBcbiAgLy8gQ29sbGVjdCBPcGVuQVBJIHNwZWNzIGJhc2VkIG9uIGRvY3MuanNvbiBuYXZpZ2F0aW9uXG4gIGNvbnN0IG9wZW5BcGlTcGVjcyA9IGF3YWl0IGNvbGxlY3RPcGVuQXBpU3BlY3MocHJvamVjdFJvb3QsIGNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgY29uc3Qgc3BlY0NvdW50ID0gT2JqZWN0LmtleXMob3BlbkFwaVNwZWNzKS5sZW5ndGhcbiAgaWYgKHNwZWNDb3VudCA+IDApIHtcbiAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTIEZvdW5kICR7c3BlY0NvdW50fSBPcGVuQVBJIHNwZWMocylgKVxuICB9XG4gIFxuICAvLyBDb2xsZWN0IEdyYXBoUUwgc2NoZW1hcyBiYXNlZCBvbiBkb2NzLmpzb24gbmF2aWdhdGlvblxuICBjb25zdCBncmFwaHFsU2NoZW1hcyA9IGF3YWl0IGNvbGxlY3RHcmFwaFFMU2NoZW1hcyhwcm9qZWN0Um9vdCwgY29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICBjb25zdCBzY2hlbWFDb3VudCA9IE9iamVjdC5rZXlzKGdyYXBocWxTY2hlbWFzKS5sZW5ndGhcbiAgaWYgKHNjaGVtYUNvdW50ID4gMCkge1xuICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgRm91bmQgJHtzY2hlbWFDb3VudH0gR3JhcGhRTCBzY2hlbWEocylgKVxuICB9XG4gIFxuICAvLyBDb2xsZWN0IGJpbmFyeSBhc3NldHNcbiAgY29uc3QgYXNzZXRzID0gYXdhaXQgY29sbGVjdEFzc2V0cyhwcm9qZWN0Um9vdClcbiAgaWYgKGFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdG90YWxBc3NldFNpemUgPSBhc3NldHMucmVkdWNlKChzdW0sIGEpID0+IHN1bSArIGEuc2l6ZSwgMClcbiAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTIEZvdW5kICR7YXNzZXRzLmxlbmd0aH0gYXNzZXRzICgke2Zvcm1hdFNpemUodG90YWxBc3NldFNpemUpfSlgKVxuICB9XG4gIFxuICAvLyBDYWxjdWxhdGUgYnVuZGxlIHNpemVcbiAgY29uc3QgdG90YWxTaXplID0gZmlsZXMucmVkdWNlKChzdW0sIGYpID0+IHN1bSArIGYuY29udGVudC5sZW5ndGgsIDApXG4gIGNvbnN0IHNpemVLQiA9ICh0b3RhbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpXG4gIGxvZ2dlci5pbmZvKGBDb250ZW50IGJ1bmRsZTogJHtzaXplS0J9IEtCYClcbiAgXG4gIC8vIFVwbG9hZCBiaW5hcnkgYXNzZXRzIGZpcnN0ICh3aXRoIHByb2dyZXNzKVxuICBpZiAoYXNzZXRzLmxlbmd0aCA+IDAgJiYgZXhpc3RpbmdTbHVnICYmIGFwaUtleSkge1xuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGxvZ2dlci5pbmZvKCdVcGxvYWRpbmcgYXNzZXRzLi4uJylcbiAgICBcbiAgICBjb25zdCBhc3NldFJlc3VsdHMgPSBhd2FpdCB1cGxvYWRBc3NldHMoYXNzZXRzLCBhcGlVcmwsIGV4aXN0aW5nU2x1ZywgYXBpS2V5KVxuICAgIGNvbnN0IHN1Y2Nlc3NDb3VudCA9IGFzc2V0UmVzdWx0cy5maWx0ZXIociA9PiByLnN1Y2Nlc3MpLmxlbmd0aFxuICAgIGNvbnN0IGZhaWxDb3VudCA9IGFzc2V0UmVzdWx0cy5maWx0ZXIociA9PiAhci5zdWNjZXNzKS5sZW5ndGhcbiAgICBcbiAgICBpZiAoZmFpbENvdW50ID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYCR7c3VjY2Vzc0NvdW50fSBhc3NldHMgdXBsb2FkZWQsICR7ZmFpbENvdW50fSBmYWlsZWRgKVxuICAgIH0gZWxzZSBpZiAoc3VjY2Vzc0NvdW50ID4gMCkge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYOKckyAke3N1Y2Nlc3NDb3VudH0gYXNzZXRzIHVwbG9hZGVkYClcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXNzZXRzLmxlbmd0aCA+IDAgJiYgIWV4aXN0aW5nU2x1Zykge1xuICAgIGxvZ2dlci5pbmZvKCdBc3NldHMgd2lsbCBiZSB1cGxvYWRlZCBvbiBuZXh0IGRlcGxveSAoYWZ0ZXIgcHJvamVjdCByZWdpc3RyYXRpb24pJylcbiAgfVxuICBcbiAgLy8gVXBsb2FkIEFMTCBPcGVuQVBJIHNwZWNzIHRvIGJsb2Igc3RvcmFnZSAobXVsdGktdGVuYW50IHN1cHBvcnQpXG4gIGNvbnN0IG9wZW5BcGlTcGVjVXJsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGlmIChzcGVjQ291bnQgPiAwICYmIGV4aXN0aW5nU2x1ZyAmJiBhcGlLZXkpIHtcbiAgICBjb25zb2xlLmxvZygnJylcbiAgICBsb2dnZXIuaW5mbygnVXBsb2FkaW5nIE9wZW5BUEkgc3BlY3MgdG8gYmxvYiBzdG9yYWdlLi4uJylcbiAgICBcbiAgICBmb3IgKGNvbnN0IFtzcGVjUGF0aCwgc3BlY10gb2YgT2JqZWN0LmVudHJpZXMob3BlbkFwaVNwZWNzKSkge1xuICAgICAgY29uc3Qgc3BlY0ZpbGVOYW1lID0gc3BlY1BhdGgucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvXFwuanNvbiQvLCAnJylcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7c3BlY1BhdGh9OiBgKVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzcGVjQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNwZWMpXG4gICAgICAgIGNvbnN0IHNwZWNCbG9iID0gbmV3IEJsb2IoW3NwZWNDb250ZW50XSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSlcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdzbHVnJywgZXhpc3RpbmdTbHVnKVxuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGVOYW1lJywgc3BlY0ZpbGVOYW1lKVxuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3R5cGUnLCAnb3BlbmFwaScpXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIHNwZWNCbG9iLCBgJHtzcGVjRmlsZU5hbWV9Lmpzb25gKVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS91cGxvYWQvc3BlY2AsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHthcGlLZXl9YCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IGZvcm1EYXRhLFxuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBlcnJvcjogJ1Vua25vd24gZXJyb3InIH0pKSBhcyB7IGVycm9yPzogc3RyaW5nIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JEYXRhLmVycm9yIHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyB7IHVybDogc3RyaW5nIH1cbiAgICAgICAgb3BlbkFwaVNwZWNVcmxzW3NwZWNQYXRoXSA9IHJlc3VsdC51cmxcbiAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nKGAke2xvZ2dlci5ncmVlbign4pyTJyl9IHVwbG9hZGVkYClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgY29uc29sZS5sb2coYCR7bG9nZ2VyLnJlZCgn4pyXJyl9ICR7bWVzc2FnZX1gKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChzcGVjQ291bnQgPiAwICYmICFleGlzdGluZ1NsdWcpIHtcbiAgICBsb2dnZXIuaW5mbygnT3BlbkFQSSBzcGVjcyB3aWxsIGJlIHVwbG9hZGVkIG9uIG5leHQgZGVwbG95IChhZnRlciBwcm9qZWN0IHJlZ2lzdHJhdGlvbiknKVxuICB9XG4gIFxuICAvLyBVcGxvYWQgQUxMIEdyYXBoUUwgc2NoZW1hcyB0byBibG9iIHN0b3JhZ2UgKG11bHRpLXRlbmFudCBzdXBwb3J0KVxuICBjb25zdCBncmFwaHFsU2NoZW1hVXJsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGlmIChzY2hlbWFDb3VudCA+IDAgJiYgZXhpc3RpbmdTbHVnICYmIGFwaUtleSkge1xuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGxvZ2dlci5pbmZvKCdVcGxvYWRpbmcgR3JhcGhRTCBzY2hlbWFzIHRvIGJsb2Igc3RvcmFnZS4uLicpXG4gICAgXG4gICAgZm9yIChjb25zdCBbc2NoZW1hUGF0aCwgc2NoZW1hQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZ3JhcGhxbFNjaGVtYXMpKSB7XG4gICAgICBjb25zdCBzY2hlbWFGaWxlTmFtZSA9IHNjaGVtYVBhdGgucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvXFwuZ3JhcGhxbCQvLCAnJylcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7c2NoZW1hUGF0aH06IGApXG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYUJsb2IgPSBuZXcgQmxvYihbc2NoZW1hQ29udGVudF0sIHsgdHlwZTogJ3RleHQvcGxhaW4nIH0pXG4gICAgICAgIFxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnc2x1ZycsIGV4aXN0aW5nU2x1ZylcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlTmFtZScsIHNjaGVtYUZpbGVOYW1lKVxuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3R5cGUnLCAnZ3JhcGhxbCcpXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIHNjaGVtYUJsb2IsIGAke3NjaGVtYUZpbGVOYW1lfS5ncmFwaHFsYClcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS9hcGkvdXBsb2FkL3NwZWNgLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7YXBpS2V5fWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZXJyb3I6ICdVbmtub3duIGVycm9yJyB9KSkgYXMgeyBlcnJvcj86IHN0cmluZyB9XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yRGF0YS5lcnJvciB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgeyB1cmw6IHN0cmluZyB9XG4gICAgICAgIGdyYXBocWxTY2hlbWFVcmxzW3NjaGVtYVBhdGhdID0gcmVzdWx0LnVybFxuICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coYCR7bG9nZ2VyLmdyZWVuKCfinJMnKX0gdXBsb2FkZWRgKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICBjb25zb2xlLmxvZyhgJHtsb2dnZXIucmVkKCfinJcnKX0gJHttZXNzYWdlfWApXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHNjaGVtYUNvdW50ID4gMCAmJiAhZXhpc3RpbmdTbHVnKSB7XG4gICAgbG9nZ2VyLmluZm8oJ0dyYXBoUUwgc2NoZW1hcyB3aWxsIGJlIHVwbG9hZGVkIG9uIG5leHQgZGVwbG95IChhZnRlciBwcm9qZWN0IHJlZ2lzdHJhdGlvbiknKVxuICB9XG4gIFxuICAvLyBEZXBsb3kgY29udGVudCB0byBBUElcbiAgY29uc29sZS5sb2coJycpXG4gIGxvZ2dlci5pbmZvKCdVcGxvYWRpbmcgY29udGVudC4uLicpXG4gIFxuICB0cnkge1xuICAgIGludGVyZmFjZSBEZXBsb3lSZXNwb25zZSB7XG4gICAgICBzdWNjZXNzOiBib29sZWFuXG4gICAgICBzbHVnOiBzdHJpbmdcbiAgICAgIHVybDogc3RyaW5nXG4gICAgICBibG9iVXJsOiBzdHJpbmdcbiAgICAgIGlzVXBkYXRlOiBib29sZWFuXG4gICAgICBmaWxlc0NvdW50OiBudW1iZXJcbiAgICAgIGFwaUtleT86IHN0cmluZ1xuICAgICAgZXJyb3I/OiBzdHJpbmdcbiAgICB9XG4gICAgXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBBUEkga2V5IGhlYWRlciBmb3IgdXBkYXRlc1xuICAgIGlmIChhcGlLZXkpIHtcbiAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHthcGlLZXl9YFxuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL2RlcGxveWAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gRm9sbG93IHJlZGlyZWN0c1xuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiBjb25maWcubmFtZSB8fCAnTXkgRG9jdW1lbnRhdGlvbicsXG4gICAgICAgIHNsdWc6IGV4aXN0aW5nU2x1ZyxcbiAgICAgICAgZG9jc0pzb246IGNvbmZpZyxcbiAgICAgICAgdGhlbWVKc29uLFxuICAgICAgICAvLyBPbmx5IHNlbmQgVVJMcyAtIHNwZWNzL3NjaGVtYXMgYXJlIHN0b3JlZCBpbiBibG9iIHN0b3JhZ2VcbiAgICAgICAgb3BlbkFwaVNwZWNVcmxzLFxuICAgICAgICBncmFwaHFsU2NoZW1hVXJscyxcbiAgICAgICAgZmlsZXMsXG4gICAgICAgIGFwaUtleSwgLy8gQWxzbyBzZW5kIGluIGJvZHkgYXMgZmFsbGJhY2tcbiAgICAgIH0pLFxuICAgIH0pXG4gICAgXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IGVycm9yOiAnVW5rbm93biBlcnJvcicgfSkpIGFzIHsgZXJyb3I/OiBzdHJpbmc7IGRldGFpbHM/OiBzdHJpbmcgfVxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3JEYXRhLmVycm9yIHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWBcbiAgICAgIGNvbnN0IGRldGFpbHMgPSBlcnJvckRhdGEuZGV0YWlscyA/IGBcXG4gICBEZXRhaWxzOiAke2Vycm9yRGF0YS5kZXRhaWxzfWAgOiAnJ1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yTWVzc2FnZX0ke2RldGFpbHN9YClcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIERlcGxveVJlc3BvbnNlXG4gICAgXG4gICAgLy8gU2F2ZSBwcm9qZWN0IGNvbmZpZyBmb3IgZnV0dXJlIHVwZGF0ZXNcbiAgICBjb25zdCBuZXdEZXZEb2NDb25maWc6IERldkRvY0NvbmZpZyA9IHtcbiAgICAgIHNsdWc6IHJlc3VsdC5zbHVnLFxuICAgICAgdXJsOiByZXN1bHQudXJsLFxuICAgICAgbGFzdERlcGxveWVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfVxuICAgIFxuICAgIC8vIFNhdmUgQVBJIGtleSAoZnJvbSByZXNwb25zZSBmb3IgbmV3IHByb2plY3RzLCBvciBleGlzdGluZyBmb3IgdXBkYXRlcylcbiAgICBpZiAocmVzdWx0LmFwaUtleSkge1xuICAgICAgbmV3RGV2RG9jQ29uZmlnLmFwaUtleSA9IHJlc3VsdC5hcGlLZXlcbiAgICB9IGVsc2UgaWYgKGFwaUtleSkge1xuICAgICAgbmV3RGV2RG9jQ29uZmlnLmFwaUtleSA9IGFwaUtleVxuICAgIH1cbiAgICBcbiAgICBmcy53cml0ZUpzb25TeW5jKGRldmRvY0NvbmZpZ1BhdGgsIG5ld0RldkRvY0NvbmZpZywgeyBzcGFjZXM6IDIgfSlcbiAgICBcbiAgICAvLyBTdWNjZXNzIG1lc3NhZ2VcbiAgICBjb25zb2xlLmxvZygnJylcbiAgICBsb2dnZXIuc3VjY2VzcygnRGVwbG95bWVudCBzdWNjZXNzZnVsIScpXG4gICAgY29uc29sZS5sb2coJycpXG4gICAgY29uc29sZS5sb2coYCAgWW91ciBkb2NzIGFyZSBsaXZlIGF0OmApXG4gICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIuY3lhbihyZXN1bHQudXJsKX1gKVxuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIFxuICAgIGlmIChyZXN1bHQuaXNVcGRhdGUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdQcm9qZWN0IHVwZGF0ZWQgd2l0aCBuZXcgY29udGVudCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBQcm9qZWN0IHNsdWc6ICR7cmVzdWx0LnNsdWd9YClcbiAgICAgIGxvZ2dlci5pbmZvKCdSdW4gXCJkZXZkb2MgZGVwbG95XCIgYWdhaW4gdG8gdXBkYXRlJylcbiAgICAgIFxuICAgICAgLy8gU2hvdyBBUEkga2V5IHdhcm5pbmcgZm9yIG5ldyBwcm9qZWN0c1xuICAgICAgaWYgKHJlc3VsdC5hcGlLZXkpIHtcbiAgICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICAgIGxvZ2dlci53YXJuKCfimqDvuI8gIFNhdmUgeW91ciBBUEkga2V5IGZvciBDSS9DRCBkZXBsb3ltZW50czonKVxuICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7cmVzdWx0LmFwaUtleX1gKVxuICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0FQSSBrZXkgc2F2ZWQgdG8gLmRldmRvYy5qc29uIChhZGQgdG8gLmdpdGlnbm9yZSEpJylcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIGRvbWFpbi5qc29uIGFuZCBzaG93IGN1c3RvbSBkb21haW4gc3RhdHVzXG4gICAgYXdhaXQgY2hlY2tDdXN0b21Eb21haW5TdGF0dXMocHJvamVjdFJvb3QsIGFwaVVybCwgYXBpS2V5IHx8IHJlc3VsdC5hcGlLZXkgfHwgJycpXG4gICAgXG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgIGxvZ2dlci5lcnJvcihgRGVwbG95bWVudCBmYWlsZWQ6ICR7bWVzc2FnZX1gKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBPcGVuQVBJIHNwZWNzIGJhc2VkIG9uIGRvY3MuanNvbiBuYXZpZ2F0aW9uIHRhYnNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdE9wZW5BcGlTcGVjcyhcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgZG9jc0pzb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIE9wZW5BcGlTcGVjPj4ge1xuICBjb25zdCBzcGVjczogUmVjb3JkPHN0cmluZywgT3BlbkFwaVNwZWM+ID0ge31cbiAgXG4gIC8vIEdldCBuYXZpZ2F0aW9uIGZyb20gZG9jcy5qc29uIC0gY291bGQgYmUgb2JqZWN0IHdpdGggdGFicyBvciBhcnJheVxuICBjb25zdCBuYXZpZ2F0aW9uID0gZG9jc0pzb24ubmF2aWdhdGlvbiBhcyB7IHRhYnM/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfSB8IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IHVuZGVmaW5lZFxuICBpZiAoIW5hdmlnYXRpb24pIHJldHVybiBzcGVjc1xuICBcbiAgLy8gSGFuZGxlIGJvdGggeyB0YWJzOiBbLi4uXSB9IGFuZCBkaXJlY3QgYXJyYXkgZm9ybWF0c1xuICBjb25zdCB0YWJzID0gQXJyYXkuaXNBcnJheShuYXZpZ2F0aW9uKSA/IG5hdmlnYXRpb24gOiAobmF2aWdhdGlvbi50YWJzIHx8IFtdKVxuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIHRhYnMpIHtcbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIE9wZW5BUEkgdGFiXG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ29wZW5hcGknKSB7XG4gICAgICAvLyBTcGVjIGNhbiBiZSBkaXJlY3RseSBvbiB0YWIgb3IgbmVzdGVkIGluIHZlcnNpb25zIGFycmF5XG4gICAgICBjb25zdCB2ZXJzaW9ucyA9IGl0ZW0udmVyc2lvbnMgYXMgQXJyYXk8eyBzcGVjOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9PiB8IHVuZGVmaW5lZFxuICAgICAgXG4gICAgICBpZiAodmVyc2lvbnMgJiYgQXJyYXkuaXNBcnJheSh2ZXJzaW9ucykpIHtcbiAgICAgICAgLy8gSGFuZGxlIHZlcnNpb25lZCBzcGVjc1xuICAgICAgICBmb3IgKGNvbnN0IHZlcnNpb24gb2YgdmVyc2lvbnMpIHtcbiAgICAgICAgICBpZiAodmVyc2lvbi5zcGVjKSB7XG4gICAgICAgICAgICBhd2FpdCBsb2FkU3BlYyhwcm9qZWN0Um9vdCwgdmVyc2lvbi5zcGVjLCBzcGVjcylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5zcGVjKSB7XG4gICAgICAgIC8vIEhhbmRsZSBkaXJlY3Qgc3BlYyByZWZlcmVuY2VcbiAgICAgICAgYXdhaXQgbG9hZFNwZWMocHJvamVjdFJvb3QsIGl0ZW0uc3BlYyBhcyBzdHJpbmcsIHNwZWNzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIHNwZWNzXG59XG5cbi8qKlxuICogTG9hZCBhIHNpbmdsZSBPcGVuQVBJIHNwZWMgaW50byB0aGUgc3BlY3MgbWFwXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRTcGVjKFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBzcGVjUGF0aDogc3RyaW5nLFxuICBzcGVjczogUmVjb3JkPHN0cmluZywgT3BlbkFwaVNwZWM+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gUmVzb2x2ZSB0aGUgc3BlYyBwYXRoIHJlbGF0aXZlIHRvIHByb2plY3Qgcm9vdFxuICBsZXQgZnVsbFNwZWNQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCBzcGVjUGF0aClcbiAgXG4gIC8vIEhhbmRsZSByZWxhdGl2ZSBwYXRocyBsaWtlIC4vZmFjZWJvb2svb3BlbmFwaS5qc29uXG4gIGlmIChzcGVjUGF0aC5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgZnVsbFNwZWNQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCBzcGVjUGF0aC5zbGljZSgyKSlcbiAgfVxuICBcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZnVsbFNwZWNQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzcGVjQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsU3BlY1BhdGgsICd1dGYtOCcpXG4gICAgICBjb25zdCBzcGVjRGF0YSA9IEpTT04ucGFyc2Uoc3BlY0NvbnRlbnQpIGFzIE9wZW5BcGlTcGVjXG4gICAgICBzcGVjc1tzcGVjUGF0aF0gPSBzcGVjRGF0YVxuICAgICAgbG9nZ2VyLmluZm8oYCAg4oaSICR7c3BlY1BhdGh9YClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBPcGVuQVBJIHNwZWMgJHtzcGVjUGF0aH06ICR7bWVzc2FnZX1gKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIud2FybihgT3BlbkFQSSBzcGVjIGZpbGUgbm90IGZvdW5kOiAke3NwZWNQYXRofWApXG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IEdyYXBoUUwgc2NoZW1hcyBiYXNlZCBvbiBkb2NzLmpzb24gbmF2aWdhdGlvbiB0YWJzXG4gKiBTaW1pbGFyIHRvIGNvbGxlY3RPcGVuQXBpU3BlY3MgYnV0IGZvciBHcmFwaFFMIFNETCBmaWxlc1xuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0R3JhcGhRTFNjaGVtYXMoXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIGRvY3NKc29uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IHNjaGVtYXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBcbiAgLy8gR2V0IG5hdmlnYXRpb24gZnJvbSBkb2NzLmpzb24gLSBjb3VsZCBiZSBvYmplY3Qgd2l0aCB0YWJzIG9yIGFycmF5XG4gIGNvbnN0IG5hdmlnYXRpb24gPSBkb2NzSnNvbi5uYXZpZ2F0aW9uIGFzIHsgdGFicz86IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9IHwgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkXG4gIGlmICghbmF2aWdhdGlvbikgcmV0dXJuIHNjaGVtYXNcbiAgXG4gIC8vIEhhbmRsZSBib3RoIHsgdGFiczogWy4uLl0gfSBhbmQgZGlyZWN0IGFycmF5IGZvcm1hdHNcbiAgY29uc3QgdGFicyA9IEFycmF5LmlzQXJyYXkobmF2aWdhdGlvbikgPyBuYXZpZ2F0aW9uIDogKG5hdmlnYXRpb24udGFicyB8fCBbXSlcbiAgXG4gIGZvciAoY29uc3QgaXRlbSBvZiB0YWJzKSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIEdyYXBoUUwgdGFiXG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2dyYXBocWwnKSB7XG4gICAgICAvLyBTY2hlbWEgY2FuIGJlIGRpcmVjdGx5IG9uIHRhYiBvciBuZXN0ZWQgaW4gc2NoZW1hcyBhcnJheVxuICAgICAgY29uc3QgbmVzdGVkU2NoZW1hcyA9IGl0ZW0uc2NoZW1hcyBhcyBBcnJheTx7IHNjaGVtYTogc3RyaW5nOyBuYW1lPzogc3RyaW5nIH0+IHwgdW5kZWZpbmVkXG4gICAgICBcbiAgICAgIGlmIChuZXN0ZWRTY2hlbWFzICYmIEFycmF5LmlzQXJyYXkobmVzdGVkU2NoZW1hcykpIHtcbiAgICAgICAgLy8gSGFuZGxlIG11bHRpcGxlIHNjaGVtYXNcbiAgICAgICAgZm9yIChjb25zdCBzY2hlbWFDb25maWcgb2YgbmVzdGVkU2NoZW1hcykge1xuICAgICAgICAgIGlmIChzY2hlbWFDb25maWcuc2NoZW1hKSB7XG4gICAgICAgICAgICBhd2FpdCBsb2FkR3JhcGhRTFNjaGVtYShwcm9qZWN0Um9vdCwgc2NoZW1hQ29uZmlnLnNjaGVtYSwgc2NoZW1hcylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5zY2hlbWEpIHtcbiAgICAgICAgLy8gSGFuZGxlIGRpcmVjdCBzY2hlbWEgcmVmZXJlbmNlXG4gICAgICAgIGF3YWl0IGxvYWRHcmFwaFFMU2NoZW1hKHByb2plY3RSb290LCBpdGVtLnNjaGVtYSBhcyBzdHJpbmcsIHNjaGVtYXMpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gc2NoZW1hc1xufVxuXG4vKipcbiAqIExvYWQgYSBzaW5nbGUgR3JhcGhRTCBzY2hlbWEgaW50byB0aGUgc2NoZW1hcyBtYXBcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZEdyYXBoUUxTY2hlbWEoXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIHNjaGVtYVBhdGg6IHN0cmluZyxcbiAgc2NoZW1hczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFJlc29sdmUgdGhlIHNjaGVtYSBwYXRoIHJlbGF0aXZlIHRvIHByb2plY3Qgcm9vdFxuICBsZXQgZnVsbFNjaGVtYVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsIHNjaGVtYVBhdGgpXG4gIFxuICAvLyBIYW5kbGUgcmVsYXRpdmUgcGF0aHMgbGlrZSAuL2FwaS1yZWZlcmVuY2Uvc2NoZW1hLmdyYXBocWxcbiAgaWYgKHNjaGVtYVBhdGguc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIGZ1bGxTY2hlbWFQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCBzY2hlbWFQYXRoLnNsaWNlKDIpKVxuICB9XG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyhmdWxsU2NoZW1hUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2NoZW1hQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsU2NoZW1hUGF0aCwgJ3V0Zi04JylcbiAgICAgIC8vIFN0b3JlIHRoZSByYXcgU0RMIGNvbnRlbnQgKG5vdCBwYXJzZWQpXG4gICAgICBzY2hlbWFzW3NjaGVtYVBhdGhdID0gc2NoZW1hQ29udGVudFxuICAgICAgbG9nZ2VyLmluZm8oYCAg4oaSICR7c2NoZW1hUGF0aH1gKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHJlYWQgR3JhcGhRTCBzY2hlbWEgJHtzY2hlbWFQYXRofTogJHttZXNzYWdlfWApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZ2dlci53YXJuKGBHcmFwaFFMIHNjaGVtYSBmaWxlIG5vdCBmb3VuZDogJHtzY2hlbWFQYXRofWApXG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IHRoZW1lLmpzb24gaWYgaXQgZXhpc3RzXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RUaGVtZUpzb24ocHJvamVjdFJvb3Q6IHN0cmluZyk6IG9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRoZW1lUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ3RoZW1lLmpzb24nKVxuICBcbiAgaWYgKGZzLmV4aXN0c1N5bmModGhlbWVQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0aGVtZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGhlbWVQYXRoLCAndXRmLTgnKVxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhlbWVDb250ZW50KSBhcyBvYmplY3RcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSB0aGVtZS5qc29uOiAke21lc3NhZ2V9YClcbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGFsbCBNRFggYW5kIGNvbnRlbnQgZmlsZXMgZnJvbSB0aGUgcHJvamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0RmlsZXMocHJvamVjdFJvb3Q6IHN0cmluZyk6IFByb21pc2U8UHJvamVjdEZpbGVbXT4ge1xuICBjb25zdCBmaWxlczogUHJvamVjdEZpbGVbXSA9IFtdXG4gIFxuICAvLyBTY2FuIGFsbCBkaXJlY3RvcmllcyBpbiBwcm9qZWN0IHJvb3QgKG5vdCBqdXN0IGhhcmRjb2RlZCBsaXN0KVxuICBjb25zdCBpdGVtcyA9IGZzLnJlYWRkaXJTeW5jKHByb2plY3RSb290KVxuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgLy8gU2tpcCBjb21tb24gZGlyZWN0b3JpZXMgdGhhdCBzaG91bGRuJ3QgYmUgc2Nhbm5lZFxuICAgIGlmIChbXG4gICAgICAnbm9kZV9tb2R1bGVzJywgXG4gICAgICAnZGlzdCcsIFxuICAgICAgJy5uZXh0JywgXG4gICAgICAnLmdpdCcsIFxuICAgICAgJ3B1YmxpYycsXG4gICAgICAnLmRldmRvYycsXG4gICAgICAnLmNsYXVkZScsXG4gICAgICAnLmN1cnNvcicsXG4gICAgXS5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsIGl0ZW0pXG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGxQYXRoKVxuICAgIFxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIC8vIFNraXAgYXNzZXRzIGZvbGRlciBmb3IgTURYIHNjYW5uaW5nIChoYW5kbGVkIHNlcGFyYXRlbHkpXG4gICAgICBpZiAoaXRlbSA9PT0gJ2Fzc2V0cycpIGNvbnRpbnVlXG4gICAgICBhd2FpdCBzY2FuRGlyZWN0b3J5KGZ1bGxQYXRoLCBwcm9qZWN0Um9vdCwgZmlsZXMpXG4gICAgfSBlbHNlIGlmIChpdGVtLmVuZHNXaXRoKCcubWR4JykgfHwgaXRlbS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgIC8vIEluY2x1ZGUgcm9vdC1sZXZlbCBjb250ZW50IGZpbGVzIChNRFgsIE1EKVxuICAgICAgLy8gTm90ZTogR3JhcGhRTCBzY2hlbWFzIGFyZSBjb2xsZWN0ZWQgc2VwYXJhdGVseSB2aWEgY29sbGVjdEdyYXBoUUxTY2hlbWFzKClcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsICd1dGYtOCcpXG4gICAgICBmaWxlcy5wdXNoKHsgcGF0aDogaXRlbSwgY29udGVudCB9KVxuICAgIH0gZWxzZSBpZiAoaXRlbSA9PT0gJ2RvY3MuanNvbicgfHwgaXRlbSA9PT0gJ3RoZW1lLmpzb24nIHx8IGl0ZW0gPT09ICdkb21haW4uanNvbicgfHwgaXRlbSA9PT0gJ2N1c3RvbS5jc3MnKSB7XG4gICAgICAvLyBJbmNsdWRlIGNvbmZpZyBmaWxlc1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0Zi04JylcbiAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBpdGVtLCBjb250ZW50IH0pXG4gICAgfVxuICB9XG4gIFxuICAvLyBJbmNsdWRlIHRleHQtYmFzZWQgYXNzZXRzIGZyb20gYXNzZXRzIGZvbGRlciAoU1ZHLCBKU09OKVxuICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdhc3NldHMnKVxuICBpZiAoZnMuZXhpc3RzU3luYyhhc3NldHNEaXIpKSB7XG4gICAgYXdhaXQgc2NhblB1YmxpY0Fzc2V0cyhhc3NldHNEaXIsIHByb2plY3RSb290LCBmaWxlcylcbiAgfVxuICBcbiAgcmV0dXJuIGZpbGVzXG59XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgc2NhbiBhIGRpcmVjdG9yeSBmb3IgY29udGVudCBmaWxlcyAoTURYLCBNRCwgR3JhcGhRTCBzY2hlbWFzKVxuICovXG5hc3luYyBmdW5jdGlvbiBzY2FuRGlyZWN0b3J5KFxuICBkaXI6IHN0cmluZyxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgZmlsZXM6IFByb2plY3RGaWxlW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpdGVtcyA9IGZzLnJlYWRkaXJTeW5jKGRpcilcbiAgXG4gIC8vIENvbnRlbnQgZmlsZSBleHRlbnNpb25zIHRvIGluY2x1ZGVcbiAgLy8gTm90ZTogR3JhcGhRTCBzY2hlbWFzICguZ3JhcGhxbCwgLmdxbCkgYXJlIGNvbGxlY3RlZCBzZXBhcmF0ZWx5IHZpYSBjb2xsZWN0R3JhcGhRTFNjaGVtYXMoKVxuICBjb25zdCBDT05URU5UX0VYVEVOU0lPTlMgPSBbJy5tZHgnLCAnLm1kJ11cbiAgXG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIC8vIFNraXAgY29tbW9uIGRpcmVjdG9yaWVzXG4gICAgaWYgKFsnbm9kZV9tb2R1bGVzJywgJ2Rpc3QnLCAnLm5leHQnLCAnLmdpdCcsICdwdWJsaWMnXS5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBpdGVtKVxuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aClcbiAgICBcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCBzY2FuRGlyZWN0b3J5KGZ1bGxQYXRoLCBwcm9qZWN0Um9vdCwgZmlsZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpdGVtKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoQ09OVEVOVF9FWFRFTlNJT05TLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0Um9vdCwgZnVsbFBhdGgpXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsICd1dGYtOCcpXG4gICAgICAgIFxuICAgICAgICBmaWxlcy5wdXNoKHtcbiAgICAgICAgICBwYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTY2FuIHB1YmxpYyBhc3NldHMgKFNWRywgSlNPTiwgQ1NTKSAtIHRleHQtYmFzZWQgb25seSBmb3IgY29udGVudCBidW5kbGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2NhblB1YmxpY0Fzc2V0cyhcbiAgZGlyOiBzdHJpbmcsXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIGZpbGVzOiBQcm9qZWN0RmlsZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIFxuICAvLyBUZXh0LWJhc2VkIGZpbGUgZXh0ZW5zaW9ucyB0byBpbmNsdWRlIGluIGNvbnRlbnQgYnVuZGxlXG4gIC8vIE5vdGU6IFNWRyBpcyBub3cgdXBsb2FkZWQgYXMgYmluYXJ5IGFzc2V0IGZvciBiZXR0ZXIgYmxvYiBzdG9yYWdlIHNlcnZpbmdcbiAgY29uc3QgVEVYVF9FWFRFTlNJT05TID0gWycuanNvbicsICcuY3NzJ11cbiAgXG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgaXRlbSlcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpXG4gICAgXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgYXdhaXQgc2NhblB1YmxpY0Fzc2V0cyhmdWxsUGF0aCwgcHJvamVjdFJvb3QsIGZpbGVzKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoaXRlbSkudG9Mb3dlckNhc2UoKVxuICAgICAgaWYgKFRFWFRfRVhURU5TSU9OUy5pbmNsdWRlcyhleHQpKSB7XG4gICAgICAgIC8vIE9ubHkgaW5jbHVkZSB0ZXh0LWJhc2VkIGFzc2V0cyBpbiBjb250ZW50IGJ1bmRsZVxuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBmdWxsUGF0aClcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0Zi04JylcbiAgICAgICAgXG4gICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgIHBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgYmluYXJ5IGFzc2V0cyBmcm9tIGFzc2V0cyBmb2xkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFzc2V0cyhwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxBc3NldEZpbGVbXT4ge1xuICBjb25zdCBhc3NldHM6IEFzc2V0RmlsZVtdID0gW11cbiAgXG4gIC8vIENoZWNrIGFzc2V0cyBmb2xkZXJcbiAgY29uc3QgYXNzZXRzRGlyID0gcGF0aC5qb2luKHByb2plY3RSb290LCAnYXNzZXRzJylcbiAgaWYgKGZzLmV4aXN0c1N5bmMoYXNzZXRzRGlyKSkge1xuICAgIGF3YWl0IHNjYW5CaW5hcnlBc3NldHMoYXNzZXRzRGlyLCBwcm9qZWN0Um9vdCwgYXNzZXRzKVxuICB9XG4gIFxuICByZXR1cm4gYXNzZXRzXG59XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgc2NhbiBmb3IgYmluYXJ5IGFzc2V0c1xuICovXG5hc3luYyBmdW5jdGlvbiBzY2FuQmluYXJ5QXNzZXRzKFxuICBkaXI6IHN0cmluZyxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgYXNzZXRzOiBBc3NldEZpbGVbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGl0ZW1zID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBpdGVtKVxuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aClcbiAgICBcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCBzY2FuQmluYXJ5QXNzZXRzKGZ1bGxQYXRoLCBwcm9qZWN0Um9vdCwgYXNzZXRzKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoaXRlbSkudG9Mb3dlckNhc2UoKVxuICAgICAgaWYgKEJJTkFSWV9FWFRFTlNJT05TLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgLy8gQ2hlY2sgc2l6ZSBsaW1pdFxuICAgICAgICBpZiAoc3RhdC5zaXplID4gTUFYX0FTU0VUX1NJWkUpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgU2tpcHBpbmcgJHtpdGVtfTogZXhjZWVkcyAyNU1CIGxpbWl0ICgke2Zvcm1hdFNpemUoc3RhdC5zaXplKX0pYClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBmdWxsUGF0aClcbiAgICAgICAgYXNzZXRzLnB1c2goe1xuICAgICAgICAgIHBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICBmdWxsUGF0aCxcbiAgICAgICAgICBzaXplOiBzdGF0LnNpemUsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVXBsb2FkIGFzc2V0cyB3aXRoIHByb2dyZXNzIHRyYWNraW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZEFzc2V0cyhcbiAgYXNzZXRzOiBBc3NldEZpbGVbXSxcbiAgYXBpVXJsOiBzdHJpbmcsXG4gIHNsdWc6IHN0cmluZyxcbiAgYXBpS2V5OiBzdHJpbmdcbik6IFByb21pc2U8QXJyYXk8eyBmaWxlOiBzdHJpbmc7IHN1Y2Nlc3M6IGJvb2xlYW47IHVybD86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmcgfT4+IHtcbiAgY29uc3QgcmVzdWx0czogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IHN1Y2Nlc3M6IGJvb2xlYW47IHVybD86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmcgfT4gPSBbXVxuICBcbiAgZm9yIChjb25zdCBhc3NldCBvZiBhc3NldHMpIHtcbiAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoYXNzZXQucGF0aClcbiAgICBcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgICAke2ZpbGVOYW1lfTogYClcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXBsb2FkQXNzZXRXaXRoUHJvZ3Jlc3MoXG4gICAgICAgIGFzc2V0LFxuICAgICAgICBhcGlVcmwsXG4gICAgICAgIHNsdWcsXG4gICAgICAgIGFwaUtleSxcbiAgICAgICAgKHByb2dyZXNzLCBsb2FkZWQsIHRvdGFsKSA9PiB7XG4gICAgICAgICAgaWYgKHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoMClcbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LmN1cnNvclRvKDApXG4gICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgICAke2ZpbGVOYW1lfTogJHtjcmVhdGVQcm9ncmVzc0Jhcihwcm9ncmVzcyl9ICR7Zm9ybWF0U2l6ZShsb2FkZWQpfS8ke2Zvcm1hdFNpemUodG90YWwpfWApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBcbiAgICAgIGlmIChwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuICAgICAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoMClcbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQuY3Vyc29yVG8oMClcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGAgICR7bG9nZ2VyLmdyZWVuKCfinJMnKX0gJHtmaWxlTmFtZX0gKCR7Zm9ybWF0U2l6ZShhc3NldC5zaXplKX0pYClcbiAgICAgIFxuICAgICAgcmVzdWx0cy5wdXNoKHsgZmlsZTogZmlsZU5hbWUsIHN1Y2Nlc3M6IHRydWUsIHVybDogcmVzdWx0LnVybCB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICBcbiAgICAgIGlmIChwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuICAgICAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoMClcbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQuY3Vyc29yVG8oMClcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGAgICR7bG9nZ2VyLnJlZCgn4pyXJyl9ICR7ZmlsZU5hbWV9OiAke21lc3NhZ2V9YClcbiAgICAgIFxuICAgICAgcmVzdWx0cy5wdXNoKHsgZmlsZTogZmlsZU5hbWUsIHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogbWVzc2FnZSB9KVxuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIHJlc3VsdHNcbn1cblxuLyoqXG4gKiBVcGxvYWQgYSBzaW5nbGUgYXNzZXQgd2l0aCBwcm9ncmVzc1xuICovXG5hc3luYyBmdW5jdGlvbiB1cGxvYWRBc3NldFdpdGhQcm9ncmVzcyhcbiAgYXNzZXQ6IEFzc2V0RmlsZSxcbiAgYXBpVXJsOiBzdHJpbmcsXG4gIHNsdWc6IHN0cmluZyxcbiAgYXBpS2V5OiBzdHJpbmcsXG4gIG9uUHJvZ3Jlc3M6IChwcm9ncmVzczogbnVtYmVyLCBsb2FkZWQ6IG51bWJlciwgdG90YWw6IG51bWJlcikgPT4gdm9pZFxuKTogUHJvbWlzZTx7IHVybDogc3RyaW5nIH0+IHtcbiAgY29uc3QgZmlsZUJ1ZmZlciA9IGZzLnJlYWRGaWxlU3luYyhhc3NldC5mdWxsUGF0aClcbiAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGFzc2V0LnBhdGgpXG4gIGNvbnN0IG1pbWVUeXBlID0gZ2V0TWltZVR5cGUoYXNzZXQuZnVsbFBhdGgpXG4gIFxuICAvLyBCdWlsZCBtdWx0aXBhcnQgZm9ybSBkYXRhXG4gIGNvbnN0IGJvdW5kYXJ5ID0gYC0tLS1EZXZEb2NEZXBsb3kke0RhdGUubm93KCl9YFxuICBjb25zdCBDUkxGID0gJ1xcclxcbidcbiAgXG4gIGNvbnN0IGhlYWRlciA9IFtcbiAgICBgLS0ke2JvdW5kYXJ5fWAsXG4gICAgYENvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImZpbGVcIjsgZmlsZW5hbWU9XCIke2ZpbGVOYW1lfVwiYCxcbiAgICBgQ29udGVudC1UeXBlOiAke21pbWVUeXBlfWAsXG4gICAgJycsXG4gICAgJydcbiAgXS5qb2luKENSTEYpXG4gIFxuICBjb25zdCBzbHVnUGFydCA9IFtcbiAgICAnJyxcbiAgICBgLS0ke2JvdW5kYXJ5fWAsXG4gICAgYENvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cInNsdWdcImAsXG4gICAgJycsXG4gICAgc2x1ZyxcbiAgICAnJ1xuICBdLmpvaW4oQ1JMRilcbiAgXG4gIGNvbnN0IHBhdGhQYXJ0ID0gW1xuICAgIGAtLSR7Ym91bmRhcnl9YCxcbiAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwicGF0aFwiYCxcbiAgICAnJyxcbiAgICBhc3NldC5wYXRoLnJlcGxhY2UoL15hc3NldHNcXC8vLCAnJyksIC8vIFJlbW92ZSBhc3NldHMvIHByZWZpeFxuICAgICcnXG4gIF0uam9pbihDUkxGKVxuICBcbiAgY29uc3QgZm9vdGVyID0gYCR7Q1JMRn0tLSR7Ym91bmRhcnl9LS0ke0NSTEZ9YFxuICBcbiAgY29uc3QgaGVhZGVyQnVmZmVyID0gQnVmZmVyLmZyb20oaGVhZGVyKVxuICBjb25zdCBzbHVnQnVmZmVyID0gQnVmZmVyLmZyb20oc2x1Z1BhcnQpXG4gIGNvbnN0IHBhdGhCdWZmZXIgPSBCdWZmZXIuZnJvbShwYXRoUGFydClcbiAgY29uc3QgZm9vdGVyQnVmZmVyID0gQnVmZmVyLmZyb20oZm9vdGVyKVxuICBcbiAgY29uc3QgdG90YWxTaXplID0gaGVhZGVyQnVmZmVyLmxlbmd0aCArIGZpbGVCdWZmZXIubGVuZ3RoICsgc2x1Z0J1ZmZlci5sZW5ndGggKyBwYXRoQnVmZmVyLmxlbmd0aCArIGZvb3RlckJ1ZmZlci5sZW5ndGhcbiAgY29uc3QgYm9keSA9IEJ1ZmZlci5jb25jYXQoW2hlYWRlckJ1ZmZlciwgZmlsZUJ1ZmZlciwgc2x1Z0J1ZmZlciwgcGF0aEJ1ZmZlciwgZm9vdGVyQnVmZmVyXSlcbiAgXG4gIC8vIFNpbXVsYXRlIHByb2dyZXNzXG4gIGxldCB1cGxvYWRlZCA9IDBcbiAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5jZWlsKHRvdGFsU2l6ZSAvIDIwKVxuICBcbiAgY29uc3QgcHJvZ3Jlc3NJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAodXBsb2FkZWQgPCB0b3RhbFNpemUgKiAwLjkpIHtcbiAgICAgIHVwbG9hZGVkID0gTWF0aC5taW4odXBsb2FkZWQgKyBjaHVua1NpemUsIHRvdGFsU2l6ZSAqIDAuOSlcbiAgICAgIG9uUHJvZ3Jlc3ModXBsb2FkZWQgLyB0b3RhbFNpemUsIHVwbG9hZGVkLCB0b3RhbFNpemUpXG4gICAgfVxuICB9LCA1MClcbiAgXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9hc3NldHMvdXBsb2FkYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JHtib3VuZGFyeX1gLFxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHthcGlLZXl9YCxcbiAgICAgIH0sXG4gICAgICBib2R5LFxuICAgIH0pXG4gICAgXG4gICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc0ludGVydmFsKVxuICAgIG9uUHJvZ3Jlc3MoMSwgdG90YWxTaXplLCB0b3RhbFNpemUpXG4gICAgXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZXJyb3I6ICdVcGxvYWQgZmFpbGVkJyB9KSkgYXMgeyBlcnJvcj86IHN0cmluZyB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IuZXJyb3IgfHwgYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIHsgdXJsOiBzdHJpbmcgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjbGVhckludGVydmFsKHByb2dyZXNzSW50ZXJ2YWwpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdCBmaWxlIHNpemUgZm9yIGRpc3BsYXlcbiAqL1xuZnVuY3Rpb24gZm9ybWF0U2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGJ5dGVzIDwgMTAyNCkgcmV0dXJuIGAke2J5dGVzfSBCYFxuICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCYFxuICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgyKX0gTUJgXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcHJvZ3Jlc3MgYmFyIHN0cmluZ1xuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9ncmVzc0Jhcihwcm9ncmVzczogbnVtYmVyLCB3aWR0aDogbnVtYmVyID0gMzApOiBzdHJpbmcge1xuICBjb25zdCBmaWxsZWQgPSBNYXRoLnJvdW5kKHdpZHRoICogcHJvZ3Jlc3MpXG4gIGNvbnN0IGVtcHR5ID0gd2lkdGggLSBmaWxsZWRcbiAgY29uc3QgYmFyID0gJ+KWiCcucmVwZWF0KGZpbGxlZCkgKyAn4paRJy5yZXBlYXQoZW1wdHkpXG4gIGNvbnN0IHBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKHByb2dyZXNzICogMTAwKVxuICByZXR1cm4gYFske2Jhcn1dICR7cGVyY2VudGFnZX0lYFxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brainfish-ai/devdoc",
3
- "version": "0.1.51",
3
+ "version": "0.1.52",
4
4
  "description": "Documentation framework for developers. Write docs in MDX, preview locally, deploy to Brainfish.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -123,12 +123,22 @@ async function buildCombinedEndpointIndexFromBlob(collection, navigationTabs, pr
123
123
  if (tab.type === 'graphql' && tab.graphqlSchemas) {
124
124
  for (const schemaConfig of tab.graphqlSchemas){
125
125
  try {
126
- // Load GraphQL schema from dedicated graphqlSchemas map (like OpenAPI specs)
127
126
  const schemaPath = schemaConfig.schema;
128
- const schemaContent = projectContent.graphqlSchemas?.[schemaPath] || projectContent.graphqlSchemas?.[schemaPath.replace(/^\//, '')] // Try without leading slash
129
- ;
127
+ let schemaContent = null;
128
+ // Primary: fetch from blob storage URL (multi-tenant approach)
129
+ const schemaUrl = projectContent.graphqlSchemaUrls?.[schemaPath] || projectContent.graphqlSchemaUrls?.[schemaPath.replace(/^\//, '')];
130
+ if (schemaUrl) {
131
+ const response = await fetch(schemaUrl);
132
+ if (response.ok) {
133
+ schemaContent = await response.text();
134
+ } else {
135
+ console.error('[Collections] Failed to fetch GraphQL schema from URL:', schemaUrl, response.status);
136
+ }
137
+ } else {
138
+ schemaContent = projectContent.graphqlSchemas?.[schemaPath] || projectContent.graphqlSchemas?.[schemaPath.replace(/^\//, '')] || null;
139
+ }
130
140
  if (!schemaContent) {
131
- console.log('[Collections] GraphQL schema not found in blob:', schemaPath, 'Available:', Object.keys(projectContent.graphqlSchemas || {}));
141
+ console.log('[Collections] GraphQL schema not found in blob:', schemaPath, 'Available URLs:', Object.keys(projectContent.graphqlSchemaUrls || {}), 'Available inline:', Object.keys(projectContent.graphqlSchemas || {}));
132
142
  continue;
133
143
  }
134
144
  const graphqlCollection = await importGraphQLSchema(schemaContent, {
@@ -511,13 +521,27 @@ function getOpenApiSpec(specPath) {
511
521
  }
512
522
  // Load OpenAPI spec from blob storage if available
513
523
  let collection = null;
514
- if (specPath && projectContent.openApiSpecs && projectContent.openApiSpecs[specPath]) {
524
+ if (specPath) {
515
525
  try {
516
- const specString = projectContent.openApiSpecs[specPath];
517
- const spec = JSON.parse(specString);
518
- // Convert to BrainfishCollection using our parser
519
- const collections = await importOpenAPISpec(spec);
520
- collection = collections[0] || null;
526
+ let spec = null;
527
+ // Primary: fetch from blob storage URL (multi-tenant approach)
528
+ if (projectContent.openApiSpecUrls && projectContent.openApiSpecUrls[specPath]) {
529
+ const specUrl = projectContent.openApiSpecUrls[specPath];
530
+ const response = await fetch(specUrl);
531
+ if (response.ok) {
532
+ spec = await response.json();
533
+ } else {
534
+ console.error('[Collections] Failed to fetch spec from URL:', specUrl, response.status);
535
+ }
536
+ } else if (projectContent.openApiSpecs && projectContent.openApiSpecs[specPath]) {
537
+ const specString = projectContent.openApiSpecs[specPath];
538
+ spec = JSON.parse(specString);
539
+ }
540
+ if (spec) {
541
+ // Convert to BrainfishCollection using our parser
542
+ const collections = await importOpenAPISpec(spec);
543
+ collection = collections[0] || null;
544
+ }
521
545
  } catch (e) {
522
546
  console.error('[Collections] Failed to parse OpenAPI spec:', e);
523
547
  }
@@ -2,6 +2,10 @@ import { NextResponse } from 'next/server';
2
2
  import { storeProjectContent, updateProjectContent, projectExists, generateProjectSlug, generateApiKey, storeProjectApiKey, validateApiKey } from '@/lib/storage/blob';
3
3
  import { getProjectUrl, isValidSlug } from '@/lib/multi-tenant/context';
4
4
  import { purgeProjectCache } from '@/lib/cache/purge';
5
+ // Route segment config for large OpenAPI specs
6
+ export const maxDuration = 60 // Allow up to 60 seconds for large uploads
7
+ ;
8
+ export const dynamic = 'force-dynamic';
5
9
  /**
6
10
  * Deploy API - receives content from CLI and stores in Vercel Blob
7
11
  *
@@ -21,7 +25,8 @@ import { purgeProjectCache } from '@/lib/cache/purge';
21
25
  try {
22
26
  const body = await request.json();
23
27
  // Validate request body
24
- const { name, slug: existingSlug, docsJson, themeJson, openApiSpecs, graphqlSchemas, files } = body;
28
+ // Specs and schemas are stored in blob storage - only URLs are passed here
29
+ const { name, slug: existingSlug, docsJson, themeJson, openApiSpecUrls, graphqlSchemaUrls, files } = body;
25
30
  if (!name || typeof name !== 'string') {
26
31
  return NextResponse.json({
27
32
  error: 'Missing or invalid project name'
@@ -125,11 +130,13 @@ import { purgeProjectCache } from '@/lib/cache/purge';
125
130
  apiKey = generateApiKey();
126
131
  }
127
132
  // Store or update content
133
+ // Note: OpenAPI specs and GraphQL schemas are already in blob storage
134
+ // We only store URLs to reference them
128
135
  let result;
129
136
  if (isUpdate) {
130
- result = await updateProjectContent(slug, docsJson, validFiles, themeJson, openApiSpecs, graphqlSchemas);
137
+ result = await updateProjectContent(slug, docsJson, validFiles, themeJson, openApiSpecUrls, graphqlSchemaUrls);
131
138
  } else {
132
- result = await storeProjectContent(slug, name, docsJson, validFiles, themeJson, openApiSpecs, graphqlSchemas);
139
+ result = await storeProjectContent(slug, name, docsJson, validFiles, themeJson, openApiSpecUrls, graphqlSchemaUrls);
133
140
  // Store the API key for new projects
134
141
  if (apiKey) {
135
142
  await storeProjectApiKey(slug, apiKey);
@@ -0,0 +1,101 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { put } from '@vercel/blob';
3
+ import { validateApiKey } from '@/lib/storage/blob';
4
+ /**
5
+ * POST /api/upload/spec
6
+ *
7
+ * Upload OpenAPI specs or GraphQL schemas to blob storage using multipart form data.
8
+ * All specs/schemas are stored in blob storage for multi-tenant support.
9
+ *
10
+ * Headers:
11
+ * Authorization: Bearer <api_key>
12
+ *
13
+ * Form Data:
14
+ * slug: string - Project slug
15
+ * fileName: string - File name (without extension)
16
+ * type: 'openapi' | 'graphql' - Type of schema
17
+ * file: File - The spec/schema file content
18
+ *
19
+ * Response:
20
+ * { success: true, url: string, path: string, type: string }
21
+ */ export async function POST(request) {
22
+ try {
23
+ // Validate API key
24
+ const authHeader = request.headers.get('Authorization');
25
+ const apiKey = authHeader?.replace('Bearer ', '');
26
+ if (!apiKey) {
27
+ return NextResponse.json({
28
+ error: 'API key required'
29
+ }, {
30
+ status: 401
31
+ });
32
+ }
33
+ const projectSlug = await validateApiKey(apiKey);
34
+ if (!projectSlug) {
35
+ return NextResponse.json({
36
+ error: 'Invalid API key'
37
+ }, {
38
+ status: 403
39
+ });
40
+ }
41
+ // Parse multipart form data
42
+ const formData = await request.formData();
43
+ const slug = formData.get('slug');
44
+ const fileName = formData.get('fileName');
45
+ const type = formData.get('type') || 'openapi' // Default to openapi for backwards compatibility
46
+ ;
47
+ const file = formData.get('file');
48
+ if (!slug || !fileName || !file) {
49
+ return NextResponse.json({
50
+ error: 'Missing slug, fileName, or file'
51
+ }, {
52
+ status: 400
53
+ });
54
+ }
55
+ // Validate type
56
+ if (type !== 'openapi' && type !== 'graphql') {
57
+ return NextResponse.json({
58
+ error: 'Invalid type. Must be "openapi" or "graphql"'
59
+ }, {
60
+ status: 400
61
+ });
62
+ }
63
+ // Verify slug matches API key's project
64
+ if (slug !== projectSlug) {
65
+ return NextResponse.json({
66
+ error: 'API key does not match project slug'
67
+ }, {
68
+ status: 403
69
+ });
70
+ }
71
+ // Determine blob path and content type based on type
72
+ const isGraphQL = type === 'graphql';
73
+ const extension = isGraphQL ? 'graphql' : 'json';
74
+ const contentType = isGraphQL ? 'text/plain' : 'application/json';
75
+ const folder = isGraphQL ? 'schemas' : 'specs';
76
+ const blobPath = `projects/${slug}/${folder}/${fileName}.${extension}`;
77
+ const blob = await put(blobPath, file.stream(), {
78
+ access: 'public',
79
+ contentType,
80
+ addRandomSuffix: false
81
+ });
82
+ console.log(`[Upload Schema] Uploaded ${type} ${fileName} for ${slug}: ${blob.url}`);
83
+ return NextResponse.json({
84
+ success: true,
85
+ url: blob.url,
86
+ path: blobPath,
87
+ type
88
+ });
89
+ } catch (error) {
90
+ console.error('[Upload Schema] Error:', error);
91
+ const message = error instanceof Error ? error.message : String(error);
92
+ return NextResponse.json({
93
+ error: 'Failed to upload schema',
94
+ details: message
95
+ }, {
96
+ status: 500
97
+ });
98
+ }
99
+ }
100
+ // Allow longer duration for large uploads
101
+ export const maxDuration = 60;
@@ -30,18 +30,16 @@ 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, themeJson, openApiSpecs, graphqlSchemas) {
33
+ */ export async function storeProjectContent(slug, name, docsJson, files, themeJson, openApiSpecUrls, graphqlSchemaUrls) {
34
34
  const now = new Date().toISOString();
35
35
  const content = {
36
36
  slug,
37
37
  name,
38
38
  docsJson: JSON.stringify(docsJson),
39
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,
44
- graphqlSchemas,
40
+ // Only store URLs - specs/schemas are in blob storage
41
+ openApiSpecUrls,
42
+ graphqlSchemaUrls,
45
43
  files,
46
44
  createdAt: now,
47
45
  updatedAt: now
@@ -93,7 +91,7 @@ function _getFileBlobPath(slug, filePath) {
93
91
  }
94
92
  /**
95
93
  * Update existing project content
96
- */ export async function updateProjectContent(slug, docsJson, files, themeJson, openApiSpecs, graphqlSchemas) {
94
+ */ export async function updateProjectContent(slug, docsJson, files, themeJson, openApiSpecUrls, graphqlSchemaUrls) {
97
95
  // Get existing content to preserve createdAt
98
96
  const existing = await getProjectContent(slug);
99
97
  const now = new Date().toISOString();
@@ -102,11 +100,9 @@ function _getFileBlobPath(slug, filePath) {
102
100
  name: existing?.name || slug,
103
101
  docsJson: JSON.stringify(docsJson),
104
102
  themeJson: themeJson ? JSON.stringify(themeJson) : undefined,
105
- openApiSpecs: openApiSpecs ? Object.fromEntries(Object.entries(openApiSpecs).map(([k, v])=>[
106
- k,
107
- JSON.stringify(v)
108
- ])) : undefined,
109
- graphqlSchemas,
103
+ // Only store URLs - specs/schemas are in blob storage
104
+ openApiSpecUrls,
105
+ graphqlSchemaUrls,
110
106
  files,
111
107
  createdAt: existing?.createdAt || now,
112
108
  updatedAt: now