@dollhousemcp/mcp-server 2.0.12-rc.9 → 2.0.13

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.
Files changed (69) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +4 -4
  3. package/README.md.backup +5 -5
  4. package/README.npm.md +4 -4
  5. package/dist/di/Container.d.ts +14 -0
  6. package/dist/di/Container.d.ts.map +1 -1
  7. package/dist/di/Container.js +43 -26
  8. package/dist/elements/agents/AgentManager.d.ts +11 -4
  9. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  10. package/dist/elements/agents/AgentManager.js +38 -11
  11. package/dist/elements/base/BaseElementManager.d.ts +10 -0
  12. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  13. package/dist/elements/base/BaseElementManager.js +26 -1
  14. package/dist/elements/ensembles/EnsembleManager.d.ts +1 -0
  15. package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
  16. package/dist/elements/ensembles/EnsembleManager.js +13 -2
  17. package/dist/elements/templates/Template.d.ts +33 -1
  18. package/dist/elements/templates/Template.d.ts.map +1 -1
  19. package/dist/elements/templates/Template.js +74 -15
  20. package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
  21. package/dist/elements/templates/TemplateManager.js +8 -1
  22. package/dist/generated/version.d.ts +2 -2
  23. package/dist/generated/version.d.ts.map +1 -1
  24. package/dist/generated/version.js +3 -3
  25. package/dist/handlers/element-crud/createElement.js +2 -2
  26. package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
  27. package/dist/handlers/mcp-aql/SchemaDispatcher.js +8 -1
  28. package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts +3 -0
  29. package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
  30. package/dist/handlers/strategies/EnsembleActivationStrategy.js +48 -9
  31. package/dist/index.js +19 -13
  32. package/dist/portfolio/DefaultElementProvider.d.ts +8 -0
  33. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  34. package/dist/portfolio/DefaultElementProvider.js +43 -1
  35. package/dist/security/contentValidator.d.ts +15 -0
  36. package/dist/security/contentValidator.d.ts.map +1 -1
  37. package/dist/security/contentValidator.js +40 -2
  38. package/dist/utils/TemplateRenderer.d.ts +9 -0
  39. package/dist/utils/TemplateRenderer.d.ts.map +1 -1
  40. package/dist/utils/TemplateRenderer.js +21 -1
  41. package/dist/web/console/IngestRoutes.d.ts.map +1 -1
  42. package/dist/web/console/IngestRoutes.js +193 -59
  43. package/dist/web/console/SessionNames.d.ts +18 -5
  44. package/dist/web/console/SessionNames.d.ts.map +1 -1
  45. package/dist/web/console/SessionNames.js +63 -8
  46. package/dist/web/console/StaleProcessRecovery.d.ts.map +1 -1
  47. package/dist/web/console/StaleProcessRecovery.js +5 -4
  48. package/dist/web/console/UnifiedConsole.js +3 -3
  49. package/dist/web/console/consoleToken.js +3 -3
  50. package/dist/web/portDiscovery.d.ts +1 -1
  51. package/dist/web/portDiscovery.d.ts.map +1 -1
  52. package/dist/web/portDiscovery.js +2 -2
  53. package/dist/web/public/app.js +65 -11
  54. package/dist/web/public/index.html +2 -0
  55. package/dist/web/public/logs.js +24 -2
  56. package/dist/web/public/metrics.js +22 -4
  57. package/dist/web/public/sessions.js +55 -8
  58. package/dist/web/public/setup.js +11 -2
  59. package/dist/web/public/styles.css +12 -0
  60. package/dist/web/routes/permissionRoutes.js +2 -2
  61. package/dist/web/routes/setupRoutes.d.ts +67 -1
  62. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  63. package/dist/web/routes/setupRoutes.js +298 -6
  64. package/dist/web/routes.d.ts.map +1 -1
  65. package/dist/web/routes.js +4 -2
  66. package/dist/web/server.d.ts.map +1 -1
  67. package/dist/web/server.js +14 -5
  68. package/package.json +5 -3
  69. package/server.json +2 -2
@@ -20,12 +20,13 @@ import { createApiRoutes, createGatewayApiRoutes } from './routes.js';
20
20
  import { createLogRoutes } from './routes/logRoutes.js';
21
21
  import { createMetricsRoutes } from './routes/metricsRoutes.js';
22
22
  import { createHealthRoutes } from './routes/healthRoutes.js';
23
- import { createSetupRoutes } from './routes/setupRoutes.js';
23
+ import { createSetupRoutes, repairNvmLauncherOnStartup } from './routes/setupRoutes.js';
24
24
  import { createTotpRoutes } from './routes/totpRoutes.js';
25
25
  import { createTokenRoutes } from './routes/tokenRoutes.js';
26
26
  import { logger } from '../utils/logger.js';
27
27
  import { env } from '../config/env.js';
28
28
  import { createAuthMiddleware } from './middleware/authMiddleware.js';
29
+ import { PACKAGE_VERSION } from '../generated/version.js';
29
30
  /**
30
31
  * Public path prefixes that never require authentication (#1780).
31
32
  * These endpoints return safe metadata or act as health probes — requiring
@@ -41,6 +42,8 @@ const PUBLIC_PATH_PREFIXES = [
41
42
  ];
42
43
  /** Placeholder in index.html that is replaced with the current console token. */
43
44
  const TOKEN_META_PLACEHOLDER = '{{CONSOLE_TOKEN}}';
45
+ /** Placeholder in index.html that is replaced with the running server version. */
46
+ const VERSION_META_PLACEHOLDER = '{{DOLLHOUSE_VERSION}}';
44
47
  const __dirname = dirname(fileURLToPath(import.meta.url));
45
48
  /**
46
49
  * Default port for standalone `startWebServer` calls. Reads from the
@@ -209,6 +212,10 @@ export async function startWebServer(options) {
209
212
  app.post('/api/setup/license/verify', setupJsonParser, verifyLicenseHandler);
210
213
  app.post('/api/setup/license/resend', setupJsonParser, resendVerificationHandler);
211
214
  logger.info('[WebUI] Setup routes mounted at /api/setup');
215
+ // Fire-and-forget NVM launcher repair: recreates the wrapper if deleted and
216
+ // patches any pre-existing configs that still use bare `npx`. No-ops when
217
+ // NVM is absent or on Windows. Never delays server startup.
218
+ repairNvmLauncherOnStartup().catch(err => logger.warn(`[Setup] NVM startup repair threw unexpectedly: ${err instanceof Error ? err.message : String(err)}`));
212
219
  // API routes — use MCP-AQL gateway when handler is available (Issue #796)
213
220
  if (options.mcpAqlHandler) {
214
221
  app.use('/api', createGatewayApiRoutes(options.mcpAqlHandler, options.portfolioDir));
@@ -289,7 +296,9 @@ export async function startWebServer(options) {
289
296
  .replaceAll("'", ''')
290
297
  .replaceAll('<', '&lt;')
291
298
  .replaceAll('>', '&gt;');
292
- cachedIndexHtml = template.replaceAll(TOKEN_META_PLACEHOLDER, escapedToken);
299
+ cachedIndexHtml = template
300
+ .replaceAll(TOKEN_META_PLACEHOLDER, escapedToken)
301
+ .replaceAll(VERSION_META_PLACEHOLDER, PACKAGE_VERSION);
293
302
  cachedTokenValue = tokenValue;
294
303
  return cachedIndexHtml;
295
304
  };
@@ -453,10 +462,10 @@ async function startFallbackServer(options, port) {
453
462
  // Reuse cached token store — two instances on the same file can race on writes.
454
463
  if (!cachedTokenStore) {
455
464
  const { ConsoleTokenStore: TokenStore } = await import('./console/consoleToken.js');
456
- const { pickRandomPuppetName } = await import('./console/SessionNames.js');
465
+ const { pickRandomTokenName } = await import('./console/SessionNames.js');
457
466
  cachedTokenStore = new TokenStore(env.DOLLHOUSE_CONSOLE_TOKEN_FILE);
458
467
  try {
459
- await cachedTokenStore.ensureInitialized(pickRandomPuppetName());
468
+ await cachedTokenStore.ensureInitialized(pickRandomTokenName());
460
469
  }
461
470
  catch (err) {
462
471
  logger.warn('[WebUI] Failed to init token store for browser open', err);
@@ -506,4 +515,4 @@ export async function openPortfolioBrowser(options) {
506
515
  ...(browserResult.error ? { warning: `Browser could not be opened automatically: ${browserResult.error}. Open ${url} manually.` } : {}),
507
516
  };
508
517
  }
509
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQTRCLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUt2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV0RTs7Ozs7R0FLRztBQUNILE1BQU0sb0JB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QUFFLENBQUM7SUFDMUQsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdELEdBQUcsR0FBRyxHQUFHLE9BQU8sZUFBZSxFQUFFLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDO0lBRXJDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixNQUFNLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFL0MsT0FBTztRQUNMLEdBQUc7UUFDSCxjQUFjO1FBQ2QsYUFBYSxFQUFFLGFBQWEsQ0FBQyxPQUFPO1FBQ3BDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSw4Q0FBOEMsYUFBYSxDQUFDLEtBQUssVUFBVSxHQUFHLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDeEksQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERvbGxob3VzZU1DUCBXZWIgVUkgU2VydmVyXG4gKlxuICogTGlnaHR3ZWlnaHQgRXhwcmVzcyBzZXJ2ZXIgZm9yIGJyb3dzaW5nIHBvcnRmb2xpbyBlbGVtZW50cyBpbiBhIGJyb3dzZXIuXG4gKiBCb3VuZCB0byAxMjcuMC4wLjEgb25seSAobG9jYWxob3N0KS4gUmVhZC1vbmx5IGZvciBWMS5cbiAqXG4gKiBDYW4gYmUgc3RhcnRlZCBzdGFuZGFsb25lIChgLS13ZWJgIGZsYWcpIG9yIGZyb20gd2l0aGluIHRoZSBNQ1Agc2VydmVyXG4gKiBwcm9jZXNzIHZpYSBgb3BlblBvcnRmb2xpb0Jyb3dzZXIoKWAuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXItdjItcmVmYWN0b3IvaXNzdWVzLzcwNFxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXItdjItcmVmYWN0b3IvaXNzdWVzLzc3NFxuICovXG5cbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgam9pbiwgZGlybmFtZSwgZXh0bmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgZXhlY0ZpbGUgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcGxhdGZvcm0gfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCByZWFkRmlsZSBhcyByZWFkRmlsZUZzIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVBcGlSb3V0ZXMsIGNyZWF0ZUdhdGV3YXlBcGlSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dSb3V0ZXMsIHR5cGUgTG9nUm91dGVzUmVzdWx0IH0gZnJvbSAnLi9yb3V0ZXMvbG9nUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZU1ldHJpY3NSb3V0ZXMsIHR5cGUgTWV0cmljc1JvdXRlc1Jlc3VsdCB9IGZyb20gJy4vcm91dGVzL21ldHJpY3NSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlSGVhbHRoUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvaGVhbHRoUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNldHVwUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvc2V0dXBSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlVG90cFJvdXRlcyB9IGZyb20gJy4vcm91dGVzL3RvdHBSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlVG9rZW5Sb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy90b2tlblJvdXRlcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vY29uZmlnL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IE1DUEFRTEhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlMb2dTaW5rIH0gZnJvbSAnLi4vbG9nZ2luZy9zaW5rcy9NZW1vcnlMb2dTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TWV0cmljc1NpbmsgfSBmcm9tICcuLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgQ29uc29sZVRva2VuU3RvcmUgfSBmcm9tICcuL2NvbnNvbGUvY29uc29sZVRva2VuLmpzJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhNaWRkbGV3YXJlIH0gZnJvbSAnLi9taWRkbGV3YXJlL2F1dGhNaWRkbGV3YXJlLmpzJztcblxuLyoqXG4gKiBQdWJsaWMgcGF0aCBwcmVmaXhlcyB0aGF0IG5ldmVyIHJlcXVpcmUgYXV0aGVudGljYXRpb24gKCMxNzgwKS5cbiAqIFRoZXNlIGVuZHBvaW50cyByZXR1cm4gc2FmZSBtZXRhZGF0YSBvciBhY3QgYXMgaGVhbHRoIHByb2JlcyDigJQgcmVxdWlyaW5nXG4gKiB0b2tlbnMgb24gdGhlbSB3b3VsZCBicmVhayBtb25pdG9yaW5nIGFuZCBjbGllbnQgZGV0ZWN0aW9uIHdpdGhvdXQgYWRkaW5nXG4gKiByZWFsIHNlY3VyaXR5IHZhbHVlLlxuICovXG5jb25zdCBQVUJMSUNfUEFUSF9QUkVGSVhFUyA9IFtcbiAgJy9hcGkvaGVhbHRoJyxcbiAgJy9hcGkvc2V0dXAvdmVyc2lvbicsXG4gICcvYXBpL3NldHVwL21jcGInLFxuICAnL2FwaS9zZXR1cC9kZXRlY3QnLFxuICAnL2FwaS9zZXR1cC9saWNlbnNlJyxcbl07XG5cbi8qKiBQbGFjZWhvbGRlciBpbiBpbmRleC5odG1sIHRoYXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgY3VycmVudCBjb25zb2xlIHRva2VuLiAqL1xuY29uc3QgVE9LRU5fTUVUQV9QTEFDRUhPTERFUiA9ICd7e0NPTlNPTEVfVE9LRU59fSc7XG5cbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbi8qKlxuICogRGVmYXVsdCBwb3J0IGZvciBzdGFuZGFsb25lIGBzdGFydFdlYlNlcnZlcmAgY2FsbHMuIFJlYWRzIGZyb20gdGhlXG4gKiBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgIGVudiB2YXIgc28gdGhlcmUgaXMgYSBzaW5nbGUgc291cmNlIG9mXG4gKiB0cnV0aCAoc2VlIGBzcmMvY29uZmlnL2Vudi50c2ApLiBDYWxsZXJzIHBhc3NpbmcgYW4gZXhwbGljaXQgYHBvcnRgIGluXG4gKiBgV2ViU2VydmVyT3B0aW9uc2Agb3ZlcnJpZGUgdGhpcyBkZWZhdWx0LlxuICovXG5jb25zdCBERUZBVUxUX1BPUlQgPSBlbnYuRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlQ7XG5jb25zdCBDT05TT0xFX0hPU1QgPSAnZG9sbGhvdXNlLmxvY2FsaG9zdCc7XG5jb25zdCBBTExPV0VEX1BBR0VfRVhURU5TSU9OUyA9IG5ldyBTZXQoWycuaHRtbCcsICcuaHRtJ10pO1xuLyoqIE1heCBKU09OIGJvZHkgZm9yIHNldHVwIHJvdXRlcyAoaW5zdGFsbC9vcGVuLWNvbmZpZykuIEluZ2VzdCByb3V0ZXMgdXNlIHRoZWlyIG93biAxbWIgbGltaXQuICovXG5jb25zdCBTRVRVUF9CT0RZX0xJTUlUID0gJzFrYic7XG5cbi8qKiBUcmFjayB3aGV0aGVyIHRoZSB3ZWIgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZyBpbi1wcm9jZXNzLiAqL1xubGV0IHNlcnZlclJ1bm5pbmcgPSBmYWxzZTtcbmxldCBzZXJ2ZXJQb3J0ID0gREVGQVVMVF9QT1JUO1xuLyoqIEFjdGl2ZSBIVFRQIHNlcnZlciBpbnN0YW5jZSDigJQgdHJhY2tlZCBzbyBfcmVzZXRTZXJ2ZXJTdGF0ZSBjYW4gY2xvc2UgaXQuICovXG5sZXQgYWN0aXZlSHR0cFNlcnZlcjogaW1wb3J0KCdub2RlOmh0dHAnKS5TZXJ2ZXIgfCBudWxsID0gbnVsbDtcbi8qKiBDYWNoZWQgdG9rZW4gc3RvcmUgZm9yIG9wZW5Qb3J0Zm9saW9Ccm93c2VyIOKAlCBwcmV2ZW50cyBkdXBsaWNhdGUgaW5zdGFuY2VzIG9uIHRoZSBzYW1lIGZpbGUuICovXG5sZXQgY2FjaGVkVG9rZW5TdG9yZTogQ29uc29sZVRva2VuU3RvcmUgfCBudWxsID0gbnVsbDtcblxuLyoqIENoZWNrIHdoZXRoZXIgdGhlIHdlYiBzZXJ2ZXIgaGFzIGJlZW4gc3RhcnRlZCBpbiB0aGlzIHByb2Nlc3MuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXZWJTZXJ2ZXJSdW5uaW5nKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2VydmVyUnVubmluZztcbn1cblxuLyoqXG4gKiBSZXNldCBtb2R1bGUtbGV2ZWwgc2VydmVyIHN0YXRlLiBFeHBvcnRlZCBmb3IgdGVzdGluZyBvbmx5IOKAlFxuICogYWxsb3dzIHRlc3RzIHRvIGV4ZXJjaXNlIHN0YXJ0V2ViU2VydmVyL2JpbmRBbmRMaXN0ZW4gd2l0aG91dFxuICogaW50ZXJmZXJlbmNlIGZyb20gcHJpb3IgcnVucyBpbiB0aGUgc2FtZSBwcm9jZXNzLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRTZXJ2ZXJTdGF0ZSgpOiB2b2lkIHtcbiAgaWYgKGFjdGl2ZUh0dHBTZXJ2ZXIpIHtcbiAgICBhY3RpdmVIdHRwU2VydmVyLmNsb3NlKCk7XG4gICAgYWN0aXZlSHR0cFNlcnZlciA9IG51bGw7XG4gIH1cbiAgc2VydmVyUnVubmluZyA9IGZhbHNlO1xuICBzZXJ2ZXJQb3J0ID0gREVGQVVMVF9QT1JUO1xuICBjYWNoZWRUb2tlblN0b3JlID0gbnVsbDtcbn1cblxuLyoqXG4gKiBHcmFjZWZ1bGx5IHNodXQgZG93biB0aGUgSFRUUCBzZXJ2ZXIgKCMxODU2KS5cbiAqIENsb3NlcyB0aGUgYWN0aXZlIHNlcnZlciBhbmQgcmVzZXRzIG1vZHVsZSBzdGF0ZSBzbyB0aGUgcG9ydCBpcyBmcmVlZFxuICogaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gbGluZ2VyaW5nIHVudGlsIHByb2Nlc3MgZXhpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNodXRkb3duV2ViU2VydmVyKCk6IHZvaWQge1xuICBpZiAoYWN0aXZlSHR0cFNlcnZlcikge1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIuY2xvc2UoKTtcbiAgICBhY3RpdmVIdHRwU2VydmVyID0gbnVsbDtcbiAgICBzZXJ2ZXJSdW5uaW5nID0gZmFsc2U7XG4gICAgbG9nZ2VyLmluZm8oYFtXZWJVSV0gSFRUUCBzZXJ2ZXIgY2xvc2VkIG9uIHBvcnQgJHtzZXJ2ZXJQb3J0fWApO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgdGhlIHdlYiBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU2VydmVyT3B0aW9ucyB7XG4gIC8qKiBQb3J0IHRvIGJpbmQgdG8gKGRlZmF1bHRzIHRvIGBET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVGAsIHNlZSBgc3JjL2NvbmZpZy9lbnYudHNgKSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogUGF0aCB0byB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAoZS5nLiwgfi8uZG9sbGhvdXNlL3BvcnRmb2xpbykgKi9cbiAgcG9ydGZvbGlvRGlyOiBzdHJpbmc7XG4gIC8qKiBPcGVuIHRoZSBicm93c2VyIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgc3RhcnRpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBvcGVuQnJvd3Nlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBNQ1BBUUxIYW5kbGVyIGZvciByb3V0aW5nIHRocm91Z2ggdGhlIE1DUC1BUUwgcGlwZWxpbmUuXG4gICAqIFdoZW4gcHJvdmlkZWQsIEFQSSByb3V0ZXMgdXNlIHRoZSBnYXRld2F5ICh2YWxpZGF0ZWQsIGNhY2hlZCwgZ2F0ZWtlZXBlci1jaGVja2VkKS5cbiAgICogV2hlbiBhYnNlbnQsIGZhbGxzIGJhY2sgdG8gZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzIChsZWdhY3kgYmVoYXZpb3IpLlxuICAgKiBJc3N1ZSAjNzk2OiBXZWIgTUNQLUFRTCBHYXRld2F5LlxuICAgKi9cbiAgbWNwQXFsSGFuZGxlcj86IE1DUEFRTEhhbmRsZXI7XG4gIC8qKiBNZW1vcnlMb2dTaW5rIGZvciBsb2cgcm91dGVzIChvcHRpb25hbCDigJQgbG9ncyB0YWIgZGlzYWJsZWQgaWYgbm90IHByb3ZpZGVkKSAqL1xuICBtZW1vcnlTaW5rPzogTWVtb3J5TG9nU2luaztcbiAgLyoqIE1lbW9yeU1ldHJpY3NTaW5rIGZvciBtZXRyaWNzIHJvdXRlcyAob3B0aW9uYWwg4oCUIG1ldHJpY3MgdGFiIGRpc2FibGVkIGlmIG5vdCBwcm92aWRlZCkgKi9cbiAgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaztcbiAgLyoqIEFkZGl0aW9uYWwgcm91dGVycyB0byBtb3VudCBiZWZvcmUgdGhlIFNQQSBmYWxsYmFjayAoZS5nLiwgaW5nZXN0IHJvdXRlcykgKi9cbiAgYWRkaXRpb25hbFJvdXRlcnM/OiBpbXBvcnQoJ2V4cHJlc3MnKS5Sb3V0ZXJbXTtcbiAgLyoqXG4gICAqIENvbnNvbGUgdG9rZW4gc3RvcmUgKCMxNzgwKS4gV2hlbiBwcm92aWRlZCwgdGhlIHNlcnZlciB3aWxsOlxuICAgKiAgIDEuIE1vdW50IEJlYXJlciB0b2tlbiBhdXRoIG1pZGRsZXdhcmUgYmVmb3JlIHByb3RlY3RlZCByb3V0ZXJzLlxuICAgKiAgIDIuIEluamVjdCB0aGUgcHJpbWFyeSB0b2tlbiBpbnRvIGluZGV4Lmh0bWwgc28gdGhlIGJyb3dzZXIgY2xpZW50XG4gICAqICAgICAgY2FuIGF0dGFjaCBpdCB0byBmZXRjaCBjYWxscyBhbmQgRXZlbnRTb3VyY2UgVVJMcy5cbiAgICogICAzLiBBcHBlbmQgdGhlIHRva2VuIGZpbGUgbG9jYXRpb24gdG8gdGhlIHN0YXJ0dXAgYmFubmVyLlxuICAgKiBBdXRoIGVuZm9yY2VtZW50IGlzIHN0aWxsIGdhdGVkIG9uIERPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVEIOKAlCB0aGVcbiAgICogbWlkZGxld2FyZSBpcyBhIHBhc3MtdGhyb3VnaCB3aGVuIHRoZSBmbGFnIGlzIGZhbHNlICh0aGUgUGhhc2UgMSBkZWZhdWx0KS5cbiAgICovXG4gIHRva2VuU3RvcmU/OiBDb25zb2xlVG9rZW5TdG9yZTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBiaW5kIHRoZSBIVFRQIHNlcnZlciB0byBhIHBvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmluZFJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGVycm9yPzogJ0VBRERSSU5VU0UnIHwgJ09USEVSJztcbiAgZGV0YWlsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBzdGFydGluZyB0aGUgd2ViIHNlcnZlciwgaW5jbHVkaW5nIGhvb2tzIGZvciBESSB3aXJpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU2VydmVyUmVzdWx0IHtcbiAgLyoqIEV4cHJlc3MgYXBwIGluc3RhbmNlIOKAlCBmb3IgbW91bnRpbmcgYWRkaXRpb25hbCByb3V0ZXMgKGUuZy4sIGluZ2VzdCByb3V0ZXMpICovXG4gIGFwcD86IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3M7XG4gIC8qKiBMb2cgYnJvYWRjYXN0IGZ1bmN0aW9uIOKAlCBjYWxsIHdpdGggZWFjaCBlbnRyeSB0byBwdXNoIHRvIFNTRSBjbGllbnRzICovXG4gIGxvZ0Jyb2FkY2FzdD86IChlbnRyeTogaW1wb3J0KCcuLi9sb2dnaW5nL3R5cGVzLmpzJykuVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkO1xuICAvKiogTWV0cmljcyBzbmFwc2hvdCBmdW5jdGlvbiDigJQgY2FsbCB3aXRoIGVhY2ggc25hcHNob3QgdG8gcHVzaCB0byBTU0UgY2xpZW50cyAqL1xuICBtZXRyaWNzT25TbmFwc2hvdD86IChzbmFwc2hvdDogaW1wb3J0KCcuLi9tZXRyaWNzL3R5cGVzLmpzJykuTWV0cmljU25hcHNob3QpID0+IHZvaWQ7XG4gIC8qKiBSZXN1bHQgb2YgdGhlIHBvcnQgYmluZGluZyBhdHRlbXB0ICovXG4gIGJpbmRSZXN1bHQ/OiBCaW5kUmVzdWx0O1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhdHRlbXB0aW5nIHRvIG9wZW4gdGhlIGJyb3dzZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJvd3Nlck9wZW5SZXN1bHQge1xuICAvKiogVGhlIFVSTCB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgb24gKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgcnVubmluZyAodHJ1ZSkgb3IganVzdCBzdGFydGVkIChmYWxzZSkgKi9cbiAgYWxyZWFkeVJ1bm5pbmc6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBicm93c2VyIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkICovXG4gIGJyb3dzZXJPcGVuZWQ6IGJvb2xlYW47XG4gIC8qKiBXYXJuaW5nIG1lc3NhZ2UgaWYgdGhlIGJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCAqL1xuICB3YXJuaW5nPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wZW4gYSBVUkwgaW4gdGhlIHN5c3RlbSdzIGRlZmF1bHQgYnJvd3Nlci5cbiAqXG4gKiBQbGF0Zm9ybS1hd2FyZTpcbiAqIC0gbWFjT1M6IGBvcGVuYFxuICogLSBMaW51eDogYHhkZy1vcGVuYFxuICogLSBXaW5kb3dzOiBgc3RhcnRgXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgdG8gb3BlblxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIGJyb3dzZXIgb3BlbmVkLCBmYWxzZSB3aXRoIGVycm9yIG1lc3NhZ2UgaWYgbm90XG4gKi9cbmZ1bmN0aW9uIG9wZW5JbkJyb3dzZXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBwbGF0ID0gcGxhdGZvcm0oKTtcbiAgICBjb25zdCBjbWQgPSBwbGF0ID09PSAnZGFyd2luJyA/ICdvcGVuJ1xuICAgICAgOiBwbGF0ID09PSAnd2luMzInID8gJ3N0YXJ0J1xuICAgICAgOiAneGRnLW9wZW4nO1xuXG4gICAgLy8gU2VjdXJpdHk6IHVzZSBleGVjRmlsZSB3aXRoIFVSTCBhcyBhcmd1bWVudCBhcnJheSwgbm90IHN0cmluZyBpbnRlcnBvbGF0aW9uXG4gICAgY29uc3QgdXJsU3RyID0gU3RyaW5nKHVybCk7XG4gICAgLy8gQWNjZXB0IGxvY2FsaG9zdCwgMTI3LjAuMC4xLCBhbmQgKi5sb2NhbGhvc3Qgc3ViZG9tYWlucyAoUkZDIDY3NjEpXG4gICAgaWYgKCEvXmh0dHBzPzpcXC9cXC8obG9jYWxob3N0fDEyN1xcLjBcXC4wXFwuMXxbXFx3LV0rXFwubG9jYWxob3N0KVs6L10vLnRlc3QodXJsU3RyKSkge1xuICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VSTCBtdXN0IGJlIGEgbG9jYWxob3N0IEhUVFAgVVJMJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXhlY0ZpbGUoY21kLCBbdXJsU3RyXSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihgW1dlYlVJXSBDb3VsZCBub3QgYXV0by1vcGVuIGJyb3dzZXI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YXJ0IHRoZSBwb3J0Zm9saW8gd2ViIHNlcnZlci5cbiAqXG4gKiBCaW5kcyB0byAxMjcuMC4wLjEgb25seSAobG9jYWxob3N0KS4gU2VydmVzIHRoZSBwb3J0Zm9saW8gYnJvd3NlclxuICogZnJvbnRlbmQgYW5kIEFQSSByb3V0ZXMgZm9yIHJlYWRpbmcgZWxlbWVudHMuXG4gKlxuICogSWRlbXBvdGVudDogaWYgdGhlIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcsIG9wdGlvbmFsbHkgb3BlbnMgdGhlXG4gKiBicm93c2VyIHdpdGhvdXQgc3RhcnRpbmcgYSBzZWNvbmQgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBTZXJ2ZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgSG9va3MgZm9yIERJIHdpcmluZyAobG9nIGJyb2FkY2FzdCwgbWV0cmljcyBvblNuYXBzaG90KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRXZWJTZXJ2ZXIob3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyk6IFByb21pc2U8V2ViU2VydmVyUmVzdWx0PiB7XG4gIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgfHwgREVGQVVMVF9QT1JUO1xuICBjb25zdCByZXN1bHQ6IFdlYlNlcnZlclJlc3VsdCA9IHt9O1xuXG4gIGlmIChzZXJ2ZXJSdW5uaW5nKSB7XG4gICAgaWYgKG9wdGlvbnMub3BlbkJyb3dzZXIpIHtcbiAgICAgIG9wZW5JbkJyb3dzZXIoYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtzZXJ2ZXJQb3J0fWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuICByZXN1bHQuYXBwID0gYXBwO1xuICBhcHAuZGlzYWJsZSgneC1wb3dlcmVkLWJ5Jyk7XG5cbiAgLy8gU2VjdXJpdHkgaGVhZGVyc1xuICBhcHAudXNlKChfcmVxLCByZXMsIG5leHQpID0+IHtcbiAgICByZXMuc2V0SGVhZGVyKCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKTtcbiAgICByZXMuc2V0SGVhZGVyKCdYLUZyYW1lLU9wdGlvbnMnLCAnREVOWScpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1gtWFNTLVByb3RlY3Rpb24nLCAnMTsgbW9kZT1ibG9jaycpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1JlZmVycmVyLVBvbGljeScsICduby1yZWZlcnJlcicpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsIGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gKTtcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsIFtcbiAgICAgIFwiZGVmYXVsdC1zcmMgJ3NlbGYnXCIsXG4gICAgICBcInNjcmlwdC1zcmMgJ3NlbGYnIGNkbi5qc2RlbGl2ci5uZXQgY2RuanMuY2xvdWRmbGFyZS5jb21cIixcbiAgICAgIFwic3R5bGUtc3JjICdzZWxmJyAndW5zYWZlLWlubGluZScgY2RuanMuY2xvdWRmbGFyZS5jb20gY2RuLmpzZGVsaXZyLm5ldFwiLFxuICAgICAgXCJpbWctc3JjICdzZWxmJyBkYXRhOlwiLFxuICAgICAgXCJjb25uZWN0LXNyYyAnc2VsZicgcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbVwiLFxuICAgICAgXCJmb250LXNyYyAnc2VsZidcIixcbiAgICBdLmpvaW4oJzsgJykpO1xuICAgIG5leHQoKTtcbiAgfSk7XG5cbiAgLy8gQ29uc29sZSB0b2tlbiBhdXRoZW50aWNhdGlvbiBtaWRkbGV3YXJlICgjMTc4MCkuIE1vdW50ZWQgYmVmb3JlIGFueSAvYXBpXG4gIC8vIHJvdXRlcyBzbyBldmVyeSBwcm90ZWN0ZWQgZW5kcG9pbnQgZ29lcyB0aHJvdWdoIGl0LiBXaGVuIHRoZSBmZWF0dXJlIGZsYWdcbiAgLy8gRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQgaXMgZmFsc2UgKFBoYXNlIDEgZGVmYXVsdCkgdGhpcyBpcyBhIHBhc3MtdGhyb3VnaC5cbiAgLy8gUHVibGljIGVuZHBvaW50cyBpbiBQVUJMSUNfUEFUSF9QUkVGSVhFUyBhbHdheXMgYnlwYXNzIGF1dGggcmVnYXJkbGVzcyBvZiBmbGFnLlxuICBpZiAob3B0aW9ucy50b2tlblN0b3JlKSB7XG4gICAgY29uc3QgYXV0aE1pZGRsZXdhcmUgPSBjcmVhdGVBdXRoTWlkZGxld2FyZSh7XG4gICAgICBzdG9yZTogb3B0aW9ucy50b2tlblN0b3JlLFxuICAgICAgZW5hYmxlZDogZW52LkRPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVELFxuICAgICAgcHVibGljUGF0aFByZWZpeGVzOiBQVUJMSUNfUEFUSF9QUkVGSVhFUyxcbiAgICAgIGxhYmVsOiAnYXBpJyxcbiAgICB9KTtcbiAgICBhcHAudXNlKCcvYXBpJywgYXV0aE1pZGRsZXdhcmUpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYFtXZWJVSV0gQ29uc29sZSBhdXRoIG1pZGRsZXdhcmUgbW91bnRlZCAke2Vudi5ET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCA/ICdFTkZPUkNJTkcnIDogJ3Bhc3MtdGhyb3VnaCAoZmxhZyBvZmYpJ31gLFxuICAgICk7XG5cbiAgICAvLyBUT1RQIGVucm9sbG1lbnQgcm91dGVzICgjMTc5NCkuIE1vdW50ZWQgQUZURVIgdGhlIC9hcGkgYXV0aCBtaWRkbGV3YXJlXG4gICAgLy8gYmVjYXVzZSB0aGUgcm91dGVyIGFkZHMgaXRzIG93biBhbHdheXMtb24gYXV0aCBndWFyZCDigJQgdGhlIGdsb2JhbCBhdXRoXG4gICAgLy8gbWlkZGxld2FyZSBhdCAvYXBpIGlzIGEgcGFzcy10aHJvdWdoIGR1cmluZyBQaGFzZSAxIHJvbGxvdXQsIGJ1dCB0aGVcbiAgICAvLyBUT1RQIHJvdXRlciBlbmZvcmNlcyByZWdhcmRsZXNzIG9mIERPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVEIHNvIGFuXG4gICAgLy8gYXR0YWNrZXIgd2l0aCBsb2NhbCBwb3J0IGFjY2VzcyBjYW5ub3QgcHJlLWVucm9sbCBhIHNlY29uZCBmYWN0b3IgYW5kXG4gICAgLy8gbG9jayB0aGUgbGVnaXRpbWF0ZSB1c2VyIG91dC5cbiAgICBhcHAudXNlKCcvYXBpL2NvbnNvbGUvdG90cCcsIGNyZWF0ZVRvdHBSb3V0ZXMoeyBzdG9yZTogb3B0aW9ucy50b2tlblN0b3JlIH0pKTtcbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBUT1RQIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvY29uc29sZS90b3RwIChhbHdheXMtb24gYXV0aCknKTtcblxuICAgIC8vIFRva2VuIG1hbmFnZW1lbnQgcm91dGVzICgjMTc5NSkuIE1vdW50ZWQgYWxvbmdzaWRlIHRoZSBUT1RQIHJvdXRlciB3aXRoXG4gICAgLy8gdGhlIHNhbWUgYWx3YXlzLW9uIGF1dGggcGF0dGVybi4gQ3VycmVudGx5IGhvc3RzIHRoZSByb3RhdGlvbiBlbmRwb2ludDtcbiAgICAvLyBmdXR1cmUgdG9rZW4gbWFuYWdlbWVudCBvcGVyYXRpb25zIChsaXN0LCByZXZva2UpIGdvIGhlcmUgdG9vLlxuICAgIGFwcC51c2UoJy9hcGkvY29uc29sZS90b2tlbicsIGNyZWF0ZVRva2VuUm91dGVzKHsgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSB9KSk7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gVG9rZW4gcm91dGVzIG1vdW50ZWQgYXQgL2FwaS9jb25zb2xlL3Rva2VuIChhbHdheXMtb24gYXV0aCknKTtcbiAgfVxuXG4gIC8vIFNldHVwIHJvdXRlczogYXV0by1pbnN0YWxsIERvbGxob3VzZU1DUCB0byBNQ1AgY2xpZW50cyAobW91bnQgQkVGT1JFIEFQSSByb3V0ZXMpXG4gIC8vIEJvZHkgbGltaXQgc2NvcGVkIHRvIHNldHVwIHJvdXRlcyBvbmx5IOKAlCBpbmdlc3Qgcm91dGVzIG5lZWQgMW1iIGZvciBmb2xsb3dlciBsb2cgZm9yd2FyZGluZ1xuICBjb25zdCBzZXR1cEpzb25QYXJzZXIgPSBleHByZXNzLmpzb24oeyBsaW1pdDogU0VUVVBfQk9EWV9MSU1JVCwgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICBjb25zdCB7IGluc3RhbGxIYW5kbGVyLCBvcGVuQ29uZmlnSGFuZGxlciwgdmVyc2lvbkhhbmRsZXIsIG1jcGJSZWRpcmVjdEhhbmRsZXIsIGRldGVjdEhhbmRsZXIsIGdldExpY2Vuc2VIYW5kbGVyLCBzZXRMaWNlbnNlSGFuZGxlciwgdmVyaWZ5TGljZW5zZUhhbmRsZXIsIHJlc2VuZFZlcmlmaWNhdGlvbkhhbmRsZXIgfSA9IGNyZWF0ZVNldHVwUm91dGVzKCk7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL2luc3RhbGwnLCBzZXR1cEpzb25QYXJzZXIsIGluc3RhbGxIYW5kbGVyKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvb3Blbi1jb25maWcnLCBzZXR1cEpzb25QYXJzZXIsIG9wZW5Db25maWdIYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC92ZXJzaW9uJywgdmVyc2lvbkhhbmRsZXIpO1xuICBhcHAuZ2V0KCcvYXBpL3NldHVwL21jcGInLCBtY3BiUmVkaXJlY3RIYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC9kZXRlY3QnLCBkZXRlY3RIYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC9saWNlbnNlJywgZ2V0TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlJywgc2V0dXBKc29uUGFyc2VyLCBzZXRMaWNlbnNlSGFuZGxlcik7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL2xpY2Vuc2UvdmVyaWZ5Jywgc2V0dXBKc29uUGFyc2VyLCB2ZXJpZnlMaWNlbnNlSGFuZGxlcik7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL2xpY2Vuc2UvcmVzZW5kJywgc2V0dXBKc29uUGFyc2VyLCByZXNlbmRWZXJpZmljYXRpb25IYW5kbGVyKTtcbiAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gU2V0dXAgcm91dGVzIG1vdW50ZWQgYXQgL2FwaS9zZXR1cCcpO1xuXG4gIC8vIEFQSSByb3V0ZXMg4oCUIHVzZSBNQ1AtQVFMIGdhdGV3YXkgd2hlbiBoYW5kbGVyIGlzIGF2YWlsYWJsZSAoSXNzdWUgIzc5NilcbiAgaWYgKG9wdGlvbnMubWNwQXFsSGFuZGxlcikge1xuICAgIGFwcC51c2UoJy9hcGknLCBjcmVhdGVHYXRld2F5QXBpUm91dGVzKG9wdGlvbnMubWNwQXFsSGFuZGxlciwgb3B0aW9ucy5wb3J0Zm9saW9EaXIpKTtcblxuICAgIC8vIFBlcm1pc3Npb24gZXZhbHVhdGlvbiByb3V0ZXMgKFBPU1QgL2V2YWx1YXRlX3Blcm1pc3Npb24sIEdFVCAvcGVybWlzc2lvbnMvc3RhdHVzKVxuICAgIGNvbnN0IHsgcmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoJy4vcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMuanMnKTtcbiAgICBjb25zdCBwZXJtUm91dGVyID0gKGF3YWl0IGltcG9ydCgnZXhwcmVzcycpKS5Sb3V0ZXIoKTtcbiAgICByZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXMocGVybVJvdXRlciwgb3B0aW9ucy5tY3BBcWxIYW5kbGVyKTtcbiAgICBhcHAudXNlKCcvYXBpJywgcGVybVJvdXRlcik7XG5cbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBBUEkgcm91dGVzIHVzaW5nIE1DUC1BUUwgR2F0ZXdheSArIHBlcm1pc3Npb24gcm91dGVzJyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwLnVzZSgnL2FwaScsIGNyZWF0ZUFwaVJvdXRlcyhvcHRpb25zLnBvcnRmb2xpb0RpcikpO1xuICAgIGxvZ2dlci53YXJuKCdbV2ViVUldIEFQSSByb3V0ZXMgdXNpbmcgZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzIChubyBNQ1AtQVFMIGhhbmRsZXIgYXZhaWxhYmxlKScpO1xuICB9XG5cbiAgLy8gQ29uc29sZSByb3V0ZXM6IGxvZ3MsIG1ldHJpY3MsIGhlYWx0aCDigJQgZXh0cmFjdGVkIHRvIGtlZXAgY29nbml0aXZlXG4gIC8vIGNvbXBsZXhpdHkgb2Ygc3RhcnRXZWJTZXJ2ZXIgbWFuYWdlYWJsZS5cbiAgbW91bnRDb25zb2xlUm91dGVzKGFwcCwgb3B0aW9ucywgcmVzdWx0KTtcblxuICAvLyBTZXJ2ZSB+Ly5kb2xsaG91c2UvcGFnZXMvIGF0IC9wYWdlcy8g4oCUIGRhc2hib2FyZHMsIGdlbmVyYXRlZCBjb250ZW50LCBzdGFjayB2aWV3c1xuICBjb25zdCBwYWdlc0RpciA9IGpvaW4oZGlybmFtZShvcHRpb25zLnBvcnRmb2xpb0RpciksICdwYWdlcycpO1xuICBta2RpcihwYWdlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSkuY2F0Y2goZXJyID0+IHtcbiAgICBsb2dnZXIud2FybihgW1dlYlVJXSBDb3VsZCBub3QgY3JlYXRlIHBhZ2VzIGRpcmVjdG9yeTogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9KTtcbiAgYXBwLnVzZSgnL3BhZ2VzJywgZXhwcmVzcy5zdGF0aWMocGFnZXNEaXIpKTtcblxuICAvKipcbiAgICogR0VUIC9hcGkvcGFnZXNcbiAgICogTGlzdHMgYXZhaWxhYmxlIEhUTUwgcGFnZXMgaW4gfi8uZG9sbGhvdXNlL3BhZ2VzLy5cbiAgICogUmV0dXJucyBwYWdlIG5hbWVzIGFuZCB0aGVpciBVUkxzIGZvciB0aGUgbWFuYWdlbWVudCBjb25zb2xlLlxuICAgKi9cbiAgYXBwLmdldCgnL2FwaS9wYWdlcycsIGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKHBhZ2VzRGlyKTtcbiAgICAgIGNvbnN0IHBhZ2VzID0gZmlsZXNcbiAgICAgICAgLmZpbHRlcihmID0+ICFmLnN0YXJ0c1dpdGgoJy4nKSAmJiBBTExPV0VEX1BBR0VfRVhURU5TSU9OUy5oYXMoZXh0bmFtZShmKSkpXG4gICAgICAgIC5tYXAoZiA9PiAoeyBuYW1lOiBmLCB1cmw6IGAvcGFnZXMvJHtmfWAgfSkpO1xuICAgICAgcmVzLmpzb24oeyBwYWdlcywgZGlyZWN0b3J5OiBwYWdlc0RpciB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlcy5qc29uKHsgcGFnZXM6IFtdLCBkaXJlY3Rvcnk6IHBhZ2VzRGlyIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkaXRpb25hbCByb3V0ZXJzIChlLmcuLCB1bmlmaWVkIGNvbnNvbGUgaW5nZXN0IHJvdXRlcykg4oCUIG11c3QgbW91bnQgYmVmb3JlIFNQQSBmYWxsYmFja1xuICBvcHRpb25zLmFkZGl0aW9uYWxSb3V0ZXJzPy5mb3JFYWNoKHJvdXRlciA9PiBhcHAudXNlKHJvdXRlcikpO1xuXG4gIC8vIFN0YXRpYyBmcm9udGVuZCBmaWxlc1xuICBjb25zdCBwdWJsaWNEaXIgPSBqb2luKF9fZGlybmFtZSwgJ3B1YmxpYycpO1xuICAvLyBTZXJ2ZSBzdGF0aWMgYXNzZXRzIGJ1dCBza2lwIGluZGV4Lmh0bWwg4oCUIHRoZSBTUEEgZmFsbGJhY2sgYmVsb3dcbiAgLy8gaGFuZGxlcyBpdCB3aXRoIHRva2VuIGluamVjdGlvbiAocmVwbGFjZXMge3tDT05TT0xFX1RPS0VOfX0gaW4gdGhlXG4gIC8vIG1ldGEgdGFnKS4gV2l0aG91dCB0aGlzLCBleHByZXNzLnN0YXRpYyBzZXJ2ZXMgdGhlIHJhdyB0ZW1wbGF0ZVxuICAvLyBhbmQgdGhlIGJyb3dzZXIgbmV2ZXIgZ2V0cyB0aGUgYXV0aCB0b2tlbiAoIzE3ODApLlxuICBjb25zdCBpc0RlYnVnID0gQm9vbGVhbihwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcgfHwgcHJvY2Vzcy5lbnYuRU5BQkxFX0RFQlVHKTtcbiAgYXBwLnVzZShleHByZXNzLnN0YXRpYyhwdWJsaWNEaXIsIHtcbiAgICBpbmRleDogZmFsc2UsXG4gICAgLy8gSW4gZGVidWcgbW9kZSwgZGlzYWJsZSBjYWNoaW5nIG9uIGFsbCBzdGF0aWMgYXNzZXRzIChKUywgQ1NTKSBzb1xuICAgIC8vIFVJIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBvbiBub3JtYWwgcmVsb2FkIHdpdGhvdXQgQ21kK1NoaWZ0K1IuXG4gICAgLi4uKGlzRGVidWcgPyB7IGV0YWc6IGZhbHNlLCBsYXN0TW9kaWZpZWQ6IGZhbHNlLCBtYXhBZ2U6IDAgfSA6IHt9KSxcbiAgfSkpO1xuXG4gIC8vIFNQQSBmYWxsYmFjayB3aXRoIGNvbnNvbGUgdG9rZW4gaW5qZWN0aW9uICgjMTc4MCkuXG4gIC8vIFJlYWRzIGluZGV4Lmh0bWwgb24gZmlyc3QgcmVxdWVzdCwgc3Vic3RpdHV0ZXMgdGhlIHt7Q09OU09MRV9UT0tFTn19IHBsYWNlaG9sZGVyXG4gIC8vIHdpdGggdGhlIGN1cnJlbnQgdG9rZW4gdmFsdWUsIGFuZCBjYWNoZXMgdGhlIHJlbmRlcmVkIHN0cmluZy4gVGhlIGNhY2hlIGlzXG4gIC8vIGF1dG8taW52YWxpZGF0ZWQgd2hlbiB0aGUgcHJpbWFyeSB0b2tlbiBjaGFuZ2VzIChyb3RhdGlvbiksIHNvIGEgcGFnZSByZWxvYWRcbiAgLy8gYWZ0ZXIgcm90YXRpb24gcGlja3MgdXAgdGhlIG5ldyB0b2tlbiB3aXRob3V0IGEgc2VydmVyIHJlc3RhcnQuXG4gIGxldCBjYWNoZWRJbmRleEh0bWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgY2FjaGVkVG9rZW5WYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IGluZGV4SHRtbFBhdGggPSBqb2luKHB1YmxpY0RpciwgJ2luZGV4Lmh0bWwnKTtcblxuICBjb25zdCByZW5kZXJJbmRleEh0bWwgPSBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBjb25zdCB0b2tlblZhbHVlID0gb3B0aW9ucy50b2tlblN0b3JlPy5nZXRQcmltYXJ5VG9rZW5WYWx1ZSgpID8/ICcnO1xuICAgIC8vIEF1dG8taW52YWxpZGF0ZSBjYWNoZSB3aGVuIHRoZSB0b2tlbiBjaGFuZ2VzIChyb3RhdGlvbikuXG4gICAgLy8gSW4gZGVidWcgbW9kZSwgYWx3YXlzIHJlLXJlYWQgZnJvbSBkaXNrIHNvIFVJIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBvbiByZWxvYWQuXG4gICAgaWYgKCFpc0RlYnVnICYmIGNhY2hlZEluZGV4SHRtbCAhPT0gbnVsbCAmJiBjYWNoZWRUb2tlblZhbHVlID09PSB0b2tlblZhbHVlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkSW5kZXhIdG1sO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHJlYWRGaWxlRnMoaW5kZXhIdG1sUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBEZWZlbnNpdmUgSFRNTCBhdHRyaWJ1dGUgZXNjYXBlLiBUb2tlbnMgYXJlIHN0cmljdCA2NC1jaGFyIGxvd2VyY2FzZSBoZXhcbiAgICAvLyB0b2RheSBzbyBubyBlc2NhcGluZyBpcyBhY3R1YWxseSBuZWVkZWQsIGJ1dCBpZiB0aGUgdG9rZW4gZm9ybWF0IGV2ZXJcbiAgICAvLyBjaGFuZ2VzIHRoaXMgcHJldmVudHMgYW4gSFRNTC1pbmplY3Rpb24gcmVncmVzc2lvbiBmcm9tIGxhbmRpbmcgc2lsZW50bHkuXG4gICAgY29uc3QgZXNjYXBlZFRva2VuID0gdG9rZW5WYWx1ZVxuICAgICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJ1wiJywgJyZxdW90OycpXG4gICAgICAucmVwbGFjZUFsbChcIidcIiwgJyYjMzk7JylcbiAgICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpO1xuICAgIGNhY2hlZEluZGV4SHRtbCA9IHRlbXBsYXRlLnJlcGxhY2VBbGwoVE9LRU5fTUVUQV9QTEFDRUhPTERFUiwgZXNjYXBlZFRva2VuKTtcbiAgICBjYWNoZWRUb2tlblZhbHVlID0gdG9rZW5WYWx1ZTtcbiAgICByZXR1cm4gY2FjaGVkSW5kZXhIdG1sO1xuICB9O1xuXG4gIGFwcC5nZXQoJy97KnBhdGh9JywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSByZXEucGF0aC5ub3JtYWxpemUoJ05GQycpO1xuICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKCcvYXBpLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgQVBJIHJvdXRlIG5vdCBmb3VuZDogJHtub3JtYWxpemVkUGF0aH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCgnL3BhZ2VzLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgUGFnZSBub3QgZm91bmQ6ICR7bm9ybWFsaXplZFBhdGh9YCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJJbmRleEh0bWwoKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIC8vIEluIGRlYnVnIG1vZGUsIHByZXZlbnQgYnJvd3NlciBjYWNoaW5nIHNvIFVJIGNoYW5nZXMgYXJlIHBpY2tlZCB1cFxuICAgICAgLy8gaW1tZWRpYXRlbHkuIEluIHByb2R1Y3Rpb24sIGFsbG93IHNob3J0IGNhY2hpbmcgZm9yIHBlcmZvcm1hbmNlLlxuICAgICAgY29uc3QgaXNEZWJ1ZyA9IEJvb2xlYW4ocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0RFQlVHIHx8IHByb2Nlc3MuZW52LkVOQUJMRV9ERUJVRyk7XG4gICAgICByZXMuc2V0SGVhZGVyKCdDYWNoZS1Db250cm9sJywgaXNEZWJ1Z1xuICAgICAgICA/ICduby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSdcbiAgICAgICAgOiAncHJpdmF0ZSwgbWF4LWFnZT02MCcpO1xuICAgICAgcmVzLnNlbmQoaHRtbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtXZWJVSV0gRmFpbGVkIHRvIHJlbmRlciBpbmRleC5odG1sOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCgnRmFpbGVkIHRvIGxvYWQgY29uc29sZScpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gR2xvYmFsIGVycm9yIGhhbmRsZXIg4oCUIGNhdGNoIEV4cHJlc3MgZXJyb3JzIGFuZCByb3V0ZSB0byBsb2dnZXIgaW5zdGVhZCBvZiB0ZXJtaW5hbC5cbiAgLy8gV2l0aG91dCB0aGlzLCBFeHByZXNzIGR1bXBzIHN0YWNrIHRyYWNlcyB0byBzdGRlcnIgKHZpc2libGUgaW4gLS13ZWIgdGVybWluYWwpLlxuICAvLyBBbGwgZXJyb3JzIHN0aWxsIGFwcGVhciBpbiB0aGUgbWFuYWdlbWVudCBjb25zb2xlJ3MgTG9ncyB0YWIgdmlhIE1lbW9yeUxvZ1NpbmsuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXBwLnVzZSgoZXJyOiBFcnJvciwgX3JlcTogaW1wb3J0KCdleHByZXNzJykuUmVxdWVzdCwgcmVzOiBpbXBvcnQoJ2V4cHJlc3MnKS5SZXNwb25zZSwgX25leHQ6IGltcG9ydCgnZXhwcmVzcycpLk5leHRGdW5jdGlvbikgPT4ge1xuICAgIGNvbnN0IHN0YXR1cyA9IChlcnIgYXMgYW55KS5zdGF0dXMgfHwgKGVyciBhcyBhbnkpLnN0YXR1c0NvZGUgfHwgNTAwO1xuICAgIGxvZ2dlci53YXJuKGBbV2ViVUldICR7ZXJyLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICByZXMuc3RhdHVzKHN0YXR1cykuanNvbih7IGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEJpbmQgdG8gbG9jYWxob3N0IG9ubHkg4oCUIGhhbmRsZSBwb3J0IGNvbmZsaWN0cyBncmFjZWZ1bGx5LlxuICAvLyBFeHRyYWN0ZWQgdG8gYSBoZWxwZXIgdG8ga2VlcCBzdGFydFdlYlNlcnZlcidzIGNvZ25pdGl2ZSBjb21wbGV4aXR5IG1hbmFnZWFibGUuXG4gIHJlc3VsdC5iaW5kUmVzdWx0ID0gYXdhaXQgYmluZEFuZExpc3RlbihhcHAsIHBvcnQsIG9wdGlvbnMpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTW91bnQgdGhlIGxvZ3MsIG1ldHJpY3MsIGFuZCBoZWFsdGggcm91dGVzLiBUaGVzZSBhcmUgb25seSBtb3VudGVkIHdoZW4gdGhlXG4gKiBjb3JyZXNwb25kaW5nIHNpbmtzIGFyZSBwcm92aWRlZCAobWVtb3J5IGxvZyBzaW5rIGZvciBsb2dzK2hlYWx0aCwgbWV0cmljc1xuICogc2luayBmb3IgdGhlIG1ldHJpY3MgdGFiKS4gRXh0cmFjdGVkIGZyb20gc3RhcnRXZWJTZXJ2ZXIgdG8gY2FwIHRoZSBtYWluXG4gKiBmdW5jdGlvbidzIGNvZ25pdGl2ZSBjb21wbGV4aXR5LlxuICovXG5mdW5jdGlvbiBtb3VudENvbnNvbGVSb3V0ZXMoXG4gIGFwcDogaW1wb3J0KCdleHByZXNzJykuRXhwcmVzcyxcbiAgb3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyxcbiAgcmVzdWx0OiBXZWJTZXJ2ZXJSZXN1bHQsXG4pOiB2b2lkIHtcbiAgbGV0IGxvZ1JvdXRlczogTG9nUm91dGVzUmVzdWx0IHwgdW5kZWZpbmVkO1xuICBsZXQgbWV0cmljc1JvdXRlczogTWV0cmljc1JvdXRlc1Jlc3VsdCB8IHVuZGVmaW5lZDtcblxuICBpZiAob3B0aW9ucy5tZW1vcnlTaW5rKSB7XG4gICAgbG9nUm91dGVzID0gY3JlYXRlTG9nUm91dGVzKG9wdGlvbnMubWVtb3J5U2luayk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGxvZ1JvdXRlcy5yb3V0ZXIpO1xuICAgIHJlc3VsdC5sb2dCcm9hZGNhc3QgPSBsb2dSb3V0ZXMuYnJvYWRjYXN0O1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIExvZyB2aWV3ZXIgcm91dGVzIG1vdW50ZWQgYXQgL2FwaS9sb2dzJyk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5tZXRyaWNzU2luaykge1xuICAgIG1ldHJpY3NSb3V0ZXMgPSBjcmVhdGVNZXRyaWNzUm91dGVzKG9wdGlvbnMubWV0cmljc1NpbmspO1xuICAgIGFwcC51c2UoJy9hcGknLCBtZXRyaWNzUm91dGVzLnJvdXRlcik7XG4gICAgcmVzdWx0Lm1ldHJpY3NPblNuYXBzaG90ID0gbWV0cmljc1JvdXRlcy5vblNuYXBzaG90O1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIE1ldHJpY3Mgcm91dGVzIG1vdW50ZWQgYXQgL2FwaS9tZXRyaWNzJyk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5tZW1vcnlTaW5rKSB7XG4gICAgY29uc3QgaGVhbHRoUm91dGVyID0gY3JlYXRlSGVhbHRoUm91dGVzKHtcbiAgICAgIG1lbW9yeVNpbms6IG9wdGlvbnMubWVtb3J5U2luayxcbiAgICAgIG1ldHJpY3NTaW5rOiBvcHRpb25zLm1ldHJpY3NTaW5rLFxuICAgICAgbG9nQ2xpZW50Q291bnQ6IGxvZ1JvdXRlcyA/IGxvZ1JvdXRlcy5jbGllbnRDb3VudCA6ICgpID0+IDAsXG4gICAgICBtZXRyaWNzQ2xpZW50Q291bnQ6IG1ldHJpY3NSb3V0ZXMgPyBtZXRyaWNzUm91dGVzLmNsaWVudENvdW50IDogKCkgPT4gMCxcbiAgICB9KTtcbiAgICBhcHAudXNlKCcvYXBpJywgaGVhbHRoUm91dGVyKTtcbiAgfVxufVxuXG4vKipcbiAqIFByaW50IHRoZSBzdGFydHVwIGJhbm5lciB0byBzdGRlcnIuXG4gKlxuICogTk9URTogVXNlIHN0ZGVyciBmb3IgdGVybWluYWwgb3V0cHV0LCBub3Qgc3Rkb3V0LiBJbiBNQ1Agc3RkaW8gbW9kZSwgc3Rkb3V0XG4gKiBpcyByZXNlcnZlZCBmb3IgSlNPTi1SUEMgbWVzc2FnZXMg4oCUIGFueSBub24tSlNPTiBvdXRwdXQgY29ycnVwdHMgdGhlIHByb3RvY29sLlxuICogc3RkZXJyIGlzIHNhZmUgZm9yIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2VzIGluIGJvdGggTUNQIGFuZCBzdGFuZGFsb25lIG1vZGVzLlxuICovXG5mdW5jdGlvbiBwcmludFN0YXJ0dXBCYW5uZXIocG9ydDogbnVtYmVyLCB0b2tlblN0b3JlOiBDb25zb2xlVG9rZW5TdG9yZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBjb25zdCB1cmwgPSBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YDtcbiAgY29uc3QgZmFsbGJhY2tVcmwgPSBgaHR0cDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgbG9nZ2VyLmluZm8oYFtXZWJVSV0gTWFuYWdlbWVudCBjb25zb2xlIHJ1bm5pbmcgYXQgJHt1cmx9YCk7XG4gIGNvbnNvbGUuZXJyb3IoYFxcbiAgRG9sbGhvdXNlTUNQIE1hbmFnZW1lbnQgQ29uc29sZVxcbiAgJHt1cmx9XFxuICAke2ZhbGxiYWNrVXJsfSAoZmFsbGJhY2spXFxuYCk7XG4gIGlmICh0b2tlblN0b3JlKSB7XG4gICAgY29uc29sZS5lcnJvcihgICBTZXNzaW9uIHRva2VuOiAke3Rva2VuU3RvcmUuZ2V0RmlsZVBhdGgoKX1cXG5gKTtcbiAgfVxuICBjb25zb2xlLmVycm9yKGAgIFR5cGUgXCJxXCIgb3IgXCJxdWl0XCIgdG8gZXhpdC5cXG5gKTtcbn1cblxuLy8gU3RhbGUgcHJvY2VzcyByZWNvdmVyeSDigJQgZXh0cmFjdGVkIHRvIFN0YWxlUHJvY2Vzc1JlY292ZXJ5LnRzIGZvciBpbmRlcGVuZGVudCB0ZXN0aW5nICgjMTg1MCkuXG5pbXBvcnQgeyByZWNvdmVyU3RhbGVQb3J0IH0gZnJvbSAnLi9jb25zb2xlL1N0YWxlUHJvY2Vzc1JlY292ZXJ5LmpzJztcbmV4cG9ydCB7IGZpbmRQaWRPblBvcnQsIGtpbGxTdGFsZVByb2Nlc3MsIHJlY292ZXJTdGFsZVBvcnQgfSBmcm9tICcuL2NvbnNvbGUvU3RhbGVQcm9jZXNzUmVjb3ZlcnkuanMnO1xuXG4vKipcbiAqIEF0dGVtcHQgYSBzaW5nbGUgcG9ydCBiaW5kLiBSZXR1cm5zIGEgQmluZFJlc3VsdCB3aXRob3V0IGFueSByZWNvdmVyeSBsb2dpYy5cbiAqL1xuZnVuY3Rpb24gYXR0ZW1wdEJpbmQoXG4gIGFwcDogaW1wb3J0KCdleHByZXNzJykuRXhwcmVzcyxcbiAgcG9ydDogbnVtYmVyLFxuICBvcHRpb25zOiBXZWJTZXJ2ZXJPcHRpb25zLFxuKTogUHJvbWlzZTxCaW5kUmVzdWx0PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxCaW5kUmVzdWx0PigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGh0dHBTZXJ2ZXIgPSBhcHAubGlzdGVuKHBvcnQsICcxMjcuMC4wLjEnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXJSdW5uaW5nID0gdHJ1ZTtcbiAgICAgIHNlcnZlclBvcnQgPSBwb3J0O1xuICAgICAgYWN0aXZlSHR0cFNlcnZlciA9IGh0dHBTZXJ2ZXI7XG4gICAgICBwcmludFN0YXJ0dXBCYW5uZXIocG9ydCwgb3B0aW9ucy50b2tlblN0b3JlKTtcbiAgICAgIGlmIChvcHRpb25zLm9wZW5Ccm93c2VyKSB7XG4gICAgICAgIG9wZW5JbkJyb3dzZXIoYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fWApO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgfSk7XG4gICAgaHR0cFNlcnZlci5vbignZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdFQUREUklOVVNFJywgZGV0YWlsOiBgUG9ydCAke3BvcnR9IGFscmVhZHkgaW4gdXNlYCB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW1dlYlVJXSBGYWlsZWQgdG8gYmluZCBwb3J0ICR7cG9ydH06ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdPVEhFUicsIGRldGFpbDogZXJyLm1lc3NhZ2UgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEJpbmQgdGhlIEV4cHJlc3MgYXBwIHRvIDEyNy4wLjAuMTpwb3J0LiBPbiBFQUREUklOVVNFLCBhdHRlbXB0IHRvIGZpbmRcbiAqIGFuZCBraWxsIHRoZSBzdGFsZSBEb2xsaG91c2VNQ1AgcHJvY2VzcyBob2xkaW5nIHRoZSBwb3J0LCB0aGVuIHJldHJ5IG9uY2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJpbmRBbmRMaXN0ZW4oXG4gIGFwcDogaW1wb3J0KCdleHByZXNzJykuRXhwcmVzcyxcbiAgcG9ydDogbnVtYmVyLFxuICBvcHRpb25zOiBXZWJTZXJ2ZXJPcHRpb25zLFxuKTogUHJvbWlzZTxCaW5kUmVzdWx0PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF0dGVtcHRCaW5kKGFwcCwgcG9ydCwgb3B0aW9ucyk7XG4gIGlmIChyZXN1bHQuc3VjY2VzcyB8fCByZXN1bHQuZXJyb3IgIT09ICdFQUREUklOVVNFJykgcmV0dXJuIHJlc3VsdDtcblxuICAvLyBQb3J0IG9jY3VwaWVkIOKAlCBhdHRlbXB0IHN0YWxlIHByb2Nlc3MgcmVjb3ZlcnkgYW5kIHJldHJ5XG4gIGlmIChhd2FpdCByZWNvdmVyU3RhbGVQb3J0KHBvcnQpKSB7XG4gICAgY29uc3QgcmV0cnlSZXN1bHQgPSBhd2FpdCBhdHRlbXB0QmluZChhcHAsIHBvcnQsIG9wdGlvbnMpO1xuICAgIGlmIChyZXRyeVJlc3VsdC5zdWNjZXNzKSByZXR1cm4gcmV0cnlSZXN1bHQ7XG4gIH1cblxuICAvLyBTdGlsbCBjYW4ndCBiaW5kIOKAlCBmYWxsIHRocm91Z2ggd2l0aCB3YXJuaW5nXG4gIGxvZ2dlci53YXJuKGBbV2ViVUldIFBvcnQgJHtwb3J0fSBhbHJlYWR5IGluIHVzZSDigJQgYW5vdGhlciBwcm9jZXNzIGhvbGRzIHRoaXMgcG9ydGApO1xuICBjb25zb2xlLmVycm9yKGBcXG4gIERvbGxob3VzZU1DUCBNYW5hZ2VtZW50IENvbnNvbGUgKGV4aXN0aW5nIGluc3RhbmNlKVxcbiAgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9XFxuYCk7XG4gIGlmIChvcHRpb25zLm9wZW5Ccm93c2VyKSB7XG4gICAgb3BlbkluQnJvd3NlcihgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBPcGVuIHRoZSBwb3J0Zm9saW8gYnJvd3NlciBmcm9tIHdpdGhpbiB0aGUgTUNQIHNlcnZlciBwcm9jZXNzLlxuICpcbiAqIFN0YXJ0cyB0aGUgd2ViIHNlcnZlciBpZiBub3QgYWxyZWFkeSBydW5uaW5nLCB0aGVuIG9wZW5zIHRoZSBzeXN0ZW1cbiAqIGJyb3dzZXIgdG8gdGhlIHBvcnRmb2xpbyBVSS4gUmV0dXJucyBhIHJlc3VsdCBvYmplY3QgaW5kaWNhdGluZ1xuICogd2hldGhlciB0aGUgc2VydmVyIHN0YXJ0ZWQgYW5kIHRoZSBicm93c2VyIG9wZW5lZCBzdWNjZXNzZnVsbHkuXG4gKlxuICogQ2FsbGVkIGJ5IHRoZSBgb3Blbl9wb3J0Zm9saW9fYnJvd3NlcmAgTUNQLUFRTCBvcGVyYXRpb24gKElzc3VlICM3NzQpLlxuICpcbiAqIEBwYXJhbSBwb3J0Zm9saW9EaXIgLSBQYXRoIHRvIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5IChlLmcuLCB+Ly5kb2xsaG91c2UvcG9ydGZvbGlvKVxuICogQHBhcmFtIHBvcnQgLSBQb3J0IHRvIGJpbmQgdG8gKGRlZmF1bHRzIHRvIGBET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVGApXG4gKiBAcmV0dXJucyBSZXN1bHQgd2l0aCBVUkwsIHNlcnZlciBzdGF0dXMsIGFuZCBicm93c2VyIG9wZW4gc3RhdHVzXG4gKi9cbi8qKlxuICogT3B0aW9ucyBmb3Igb3BlbmluZyB0aGUgcG9ydGZvbGlvIGJyb3dzZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkJyb3dzZXJPcHRpb25zIHtcbiAgcG9ydGZvbGlvRGlyOiBzdHJpbmc7XG4gIHBvcnQ/OiBudW1iZXI7XG4gIG1jcEFxbEhhbmRsZXI/OiBNQ1BBUUxIYW5kbGVyO1xuICB0YWI/OiBzdHJpbmc7XG4gIHVybFBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIG1lbW9yeVNpbms/OiBNZW1vcnlMb2dTaW5rO1xuICBtZXRyaWNzU2luaz86IE1lbW9yeU1ldHJpY3NTaW5rO1xufVxuXG4vKipcbiAqIFNlbGYtcHJvdmlzaW9uIHNpbmtzLCB0b2tlbiBzdG9yZSwgYW5kIGluZ2VzdCByb3V0ZXMsIHRoZW4gc3RhcnQgdGhlIHdlYlxuICogc2VydmVyLiBFeHRyYWN0ZWQgZnJvbSBvcGVuUG9ydGZvbGlvQnJvd3NlciB0byBrZWVwIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gKiBtYW5hZ2VhYmxlIChTb25hckNsb3VkIFMzNzc2KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhcnRGYWxsYmFja1NlcnZlcihvcHRpb25zOiBPcGVuQnJvd3Nlck9wdGlvbnMsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgbWVtb3J5U2luayA9IG9wdGlvbnMubWVtb3J5U2luaztcbiAgbGV0IG1ldHJpY3NTaW5rID0gb3B0aW9ucy5tZXRyaWNzU2luaztcblxuICBpZiAoIW1lbW9yeVNpbmspIHtcbiAgICBjb25zdCB7IE1lbW9yeUxvZ1Npbms6IExvZ1NpbmsgfSA9IGF3YWl0IGltcG9ydCgnLi4vbG9nZ2luZy9zaW5rcy9NZW1vcnlMb2dTaW5rLmpzJyk7XG4gICAgbWVtb3J5U2luayA9IG5ldyBMb2dTaW5rKHsgYXBwQ2FwYWNpdHk6IDEwMDAwLCBzZWN1cml0eUNhcGFjaXR5OiA1MDAwLCBwZXJmQ2FwYWNpdHk6IDIwMDAsIHRlbGVtZXRyeUNhcGFjaXR5OiAxMDAwIH0pO1xuICB9XG4gIGlmICghbWV0cmljc1NpbmspIHtcbiAgICBjb25zdCB7IE1lbW9yeU1ldHJpY3NTaW5rOiBNZXRyaWNzU2luayB9ID0gYXdhaXQgaW1wb3J0KCcuLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJyk7XG4gICAgbWV0cmljc1NpbmsgPSBuZXcgTWV0cmljc1NpbmsoMjQwKTtcbiAgfVxuXG4gIC8vIFJldXNlIGNhY2hlZCB0b2tlbiBzdG9yZSDigJQgdHdvIGluc3RhbmNlcyBvbiB0aGUgc2FtZSBmaWxlIGNhbiByYWNlIG9uIHdyaXRlcy5cbiAgaWYgKCFjYWNoZWRUb2tlblN0b3JlKSB7XG4gICAgY29uc3QgeyBDb25zb2xlVG9rZW5TdG9yZTogVG9rZW5TdG9yZSB9ID0gYXdhaXQgaW1wb3J0KCcuL2NvbnNvbGUvY29uc29sZVRva2VuLmpzJyk7XG4gICAgY29uc3QgeyBwaWNrUmFuZG9tUHVwcGV0TmFtZSB9ID0gYXdhaXQgaW1wb3J0KCcuL2NvbnNvbGUvU2Vzc2lvbk5hbWVzLmpzJyk7XG4gICAgY2FjaGVkVG9rZW5TdG9yZSA9IG5ldyBUb2tlblN0b3JlKGVudi5ET0xMSE9VU0VfQ09OU09MRV9UT0tFTl9GSUxFKTtcbiAgICB0cnkgeyBhd2FpdCBjYWNoZWRUb2tlblN0b3JlLmVuc3VyZUluaXRpYWxpemVkKHBpY2tSYW5kb21QdXBwZXROYW1lKCkpOyB9XG4gICAgY2F0Y2ggKGVycikgeyBsb2dnZXIud2FybignW1dlYlVJXSBGYWlsZWQgdG8gaW5pdCB0b2tlbiBzdG9yZSBmb3IgYnJvd3NlciBvcGVuJywgZXJyKTsgfVxuICB9XG5cbiAgLy8gbG9nQnJvYWRjYXN0IGlzIGRlZmVycmVkIOKAlCB3aXJlZCBhZnRlciBzdGFydFdlYlNlcnZlciByZXR1cm5zIHRoZSByZWFsIGJyb2FkY2FzdCBmbi5cbiAgbGV0IGxpdmVCcm9hZGNhc3Q6ICgoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgY3JlYXRlSW5nZXN0Um91dGVzIH0gPSBhd2FpdCBpbXBvcnQoJy4vY29uc29sZS9Jbmdlc3RSb3V0ZXMuanMnKTtcbiAgY29uc3QgaW5nZXN0UmVzdWx0ID0gY3JlYXRlSW5nZXN0Um91dGVzKHtcbiAgICBsb2dCcm9hZGNhc3Q6IChlbnRyeSkgPT4gbGl2ZUJyb2FkY2FzdD8uKGVudHJ5KSxcbiAgfSk7XG4gIGluZ2VzdFJlc3VsdC5yZWdpc3RlckNvbnNvbGVTZXNzaW9uKCk7XG5cbiAgY29uc3Qgd2ViUmVzdWx0ID0gYXdhaXQgc3RhcnRXZWJTZXJ2ZXIoe1xuICAgIHBvcnRmb2xpb0Rpcjogb3B0aW9ucy5wb3J0Zm9saW9EaXIsXG4gICAgcG9ydCxcbiAgICBvcGVuQnJvd3NlcjogZmFsc2UsXG4gICAgbWNwQXFsSGFuZGxlcjogb3B0aW9ucy5tY3BBcWxIYW5kbGVyLFxuICAgIG1lbW9yeVNpbmssXG4gICAgbWV0cmljc1NpbmssXG4gICAgdG9rZW5TdG9yZTogY2FjaGVkVG9rZW5TdG9yZSxcbiAgICBhZGRpdGlvbmFsUm91dGVyczogW2luZ2VzdFJlc3VsdC5yb3V0ZXJdLFxuICB9KTtcblxuICBsaXZlQnJvYWRjYXN0ID0gd2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5Qb3J0Zm9saW9Ccm93c2VyKG9wdGlvbnM6IE9wZW5Ccm93c2VyT3B0aW9ucyk6IFByb21pc2U8QnJvd3Nlck9wZW5SZXN1bHQ+IHtcbiAgY29uc3QgdGFyZ2V0UG9ydCA9IG9wdGlvbnMucG9ydCB8fCBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IGJhc2VVcmwgPSBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3RhcmdldFBvcnR9YDtcblxuICAvLyBCdWlsZCBVUkwgd2l0aCBvcHRpb25hbCB0YWIgaGFzaCBhbmQgcXVlcnkgcGFyYW1ldGVyc1xuICBsZXQgdXJsID0gYmFzZVVybDtcbiAgaWYgKG9wdGlvbnMudGFiKSB7XG4gICAgY29uc3QgcXMgPSBvcHRpb25zLnVybFBhcmFtcyA/IG5ldyBVUkxTZWFyY2hQYXJhbXMob3B0aW9ucy51cmxQYXJhbXMpLnRvU3RyaW5nKCkgOiAnJztcbiAgICB1cmwgPSBgJHtiYXNlVXJsfS8jJHtvcHRpb25zLnRhYn0ke3FzID8gJz8nICsgcXMgOiAnJ31gO1xuICB9IGVsc2UgaWYgKG9wdGlvbnMudXJsUGFyYW1zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMudXJsUGFyYW1zKS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKG9wdGlvbnMudXJsUGFyYW1zKS50b1N0cmluZygpO1xuICAgIHVybCA9IGAke2Jhc2VVcmx9LyNwb3J0Zm9saW8/JHtxc31gO1xuICB9XG5cbiAgY29uc3QgYWxyZWFkeVJ1bm5pbmcgPSBzZXJ2ZXJSdW5uaW5nO1xuXG4gIGlmICghc2VydmVyUnVubmluZykge1xuICAgIGF3YWl0IHN0YXJ0RmFsbGJhY2tTZXJ2ZXIob3B0aW9ucywgdGFyZ2V0UG9ydCk7XG4gIH1cblxuICBjb25zdCBicm93c2VyUmVzdWx0ID0gYXdhaXQgb3BlbkluQnJvd3Nlcih1cmwpO1xuXG4gIHJldHVybiB7XG4gICAgdXJsLFxuICAgIGFscmVhZHlSdW5uaW5nLFxuICAgIGJyb3dzZXJPcGVuZWQ6IGJyb3dzZXJSZXN1bHQuc3VjY2VzcyxcbiAgICAuLi4oYnJvd3NlclJlc3VsdC5lcnJvciA/IHsgd2FybmluZzogYEJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5OiAke2Jyb3dzZXJSZXN1bHQuZXJyb3J9LiBPcGVuICR7dXJsfSBtYW51YWxseS5gIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
518
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQTRCLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUt2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUs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TyxFQUFFLDhDQUE4QyxhQUFhLENBQUMsS0FBSyxVQUFVLEdBQUcsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUN4SSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRG9sbGhvdXNlTUNQIFdlYiBVSSBTZXJ2ZXJcbiAqXG4gKiBMaWdodHdlaWdodCBFeHByZXNzIHNlcnZlciBmb3IgYnJvd3NpbmcgcG9ydGZvbGlvIGVsZW1lbnRzIGluIGEgYnJvd3Nlci5cbiAqIEJvdW5kIHRvIDEyNy4wLjAuMSBvbmx5IChsb2NhbGhvc3QpLiBSZWFkLW9ubHkgZm9yIFYxLlxuICpcbiAqIENhbiBiZSBzdGFydGVkIHN0YW5kYWxvbmUgKGAtLXdlYmAgZmxhZykgb3IgZnJvbSB3aXRoaW4gdGhlIE1DUCBzZXJ2ZXJcbiAqIHByb2Nlc3MgdmlhIGBvcGVuUG9ydGZvbGlvQnJvd3NlcigpYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvbWNwLXNlcnZlci12Mi1yZWZhY3Rvci9pc3N1ZXMvNzA0XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvbWNwLXNlcnZlci12Mi1yZWZhY3Rvci9pc3N1ZXMvNzc0XG4gKi9cblxuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lLCBleHRuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBwbGF0Zm9ybSB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgbWtkaXIsIHJlYWRkaXIsIHJlYWRGaWxlIGFzIHJlYWRGaWxlRnMgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGNyZWF0ZUFwaVJvdXRlcywgY3JlYXRlR2F0ZXdheUFwaVJvdXRlcyB9IGZyb20gJy4vcm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ1JvdXRlcywgdHlwZSBMb2dSb3V0ZXNSZXN1bHQgfSBmcm9tICcuL3JvdXRlcy9sb2dSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTWV0cmljc1JvdXRlcywgdHlwZSBNZXRyaWNzUm91dGVzUmVzdWx0IH0gZnJvbSAnLi9yb3V0ZXMvbWV0cmljc1JvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVIZWFsdGhSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy9oZWFsdGhSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2V0dXBSb3V0ZXMsIHJlcGFpck52bUxhdW5jaGVyT25TdGFydHVwIH0gZnJvbSAnLi9yb3V0ZXMvc2V0dXBSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlVG90cFJvdXRlcyB9IGZyb20gJy4vcm91dGVzL3RvdHBSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlVG9rZW5Sb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy90b2tlblJvdXRlcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vY29uZmlnL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IE1DUEFRTEhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlMb2dTaW5rIH0gZnJvbSAnLi4vbG9nZ2luZy9zaW5rcy9NZW1vcnlMb2dTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TWV0cmljc1NpbmsgfSBmcm9tICcuLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgQ29uc29sZVRva2VuU3RvcmUgfSBmcm9tICcuL2NvbnNvbGUvY29uc29sZVRva2VuLmpzJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhNaWRkbGV3YXJlIH0gZnJvbSAnLi9taWRkbGV3YXJlL2F1dGhNaWRkbGV3YXJlLmpzJztcbmltcG9ydCB7IFBBQ0tBR0VfVkVSU0lPTiB9IGZyb20gJy4uL2dlbmVyYXRlZC92ZXJzaW9uLmpzJztcblxuLyoqXG4gKiBQdWJsaWMgcGF0aCBwcmVmaXhlcyB0aGF0IG5ldmVyIHJlcXVpcmUgYXV0aGVudGljYXRpb24gKCMxNzgwKS5cbiAqIFRoZXNlIGVuZHBvaW50cyByZXR1cm4gc2FmZSBtZXRhZGF0YSBvciBhY3QgYXMgaGVhbHRoIHByb2JlcyDigJQgcmVxdWlyaW5nXG4gKiB0b2tlbnMgb24gdGhlbSB3b3VsZCBicmVhayBtb25pdG9yaW5nIGFuZCBjbGllbnQgZGV0ZWN0aW9uIHdpdGhvdXQgYWRkaW5nXG4gKiByZWFsIHNlY3VyaXR5IHZhbHVlLlxuICovXG5jb25zdCBQVUJMSUNfUEFUSF9QUkVGSVhFUyA9IFtcbiAgJy9hcGkvaGVhbHRoJyxcbiAgJy9hcGkvc2V0dXAvdmVyc2lvbicsXG4gICcvYXBpL3NldHVwL21jcGInLFxuICAnL2FwaS9zZXR1cC9kZXRlY3QnLFxuICAnL2FwaS9zZXR1cC9saWNlbnNlJyxcbl07XG5cbi8qKiBQbGFjZWhvbGRlciBpbiBpbmRleC5odG1sIHRoYXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgY3VycmVudCBjb25zb2xlIHRva2VuLiAqL1xuY29uc3QgVE9LRU5fTUVUQV9QTEFDRUhPTERFUiA9ICd7e0NPTlNPTEVfVE9LRU59fSc7XG4vKiogUGxhY2Vob2xkZXIgaW4gaW5kZXguaHRtbCB0aGF0IGlzIHJlcGxhY2VkIHdpdGggdGhlIHJ1bm5pbmcgc2VydmVyIHZlcnNpb24uICovXG5jb25zdCBWRVJTSU9OX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfVkVSU0lPTn19JztcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuLyoqXG4gKiBEZWZhdWx0IHBvcnQgZm9yIHN0YW5kYWxvbmUgYHN0YXJ0V2ViU2VydmVyYCBjYWxscy4gUmVhZHMgZnJvbSB0aGVcbiAqIGBET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVGAgZW52IHZhciBzbyB0aGVyZSBpcyBhIHNpbmdsZSBzb3VyY2Ugb2ZcbiAqIHRydXRoIChzZWUgYHNyYy9jb25maWcvZW52LnRzYCkuIENhbGxlcnMgcGFzc2luZyBhbiBleHBsaWNpdCBgcG9ydGAgaW5cbiAqIGBXZWJTZXJ2ZXJPcHRpb25zYCBvdmVycmlkZSB0aGlzIGRlZmF1bHQuXG4gKi9cbmNvbnN0IERFRkFVTFRfUE9SVCA9IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVDtcbmNvbnN0IENPTlNPTEVfSE9TVCA9ICdkb2xsaG91c2UubG9jYWxob3N0JztcbmNvbnN0IEFMTE9XRURfUEFHRV9FWFRFTlNJT05TID0gbmV3IFNldChbJy5odG1sJywgJy5odG0nXSk7XG4vKiogTWF4IEpTT04gYm9keSBmb3Igc2V0dXAgcm91dGVzIChpbnN0YWxsL29wZW4tY29uZmlnKS4gSW5nZXN0IHJvdXRlcyB1c2UgdGhlaXIgb3duIDFtYiBsaW1pdC4gKi9cbmNvbnN0IFNFVFVQX0JPRFlfTElNSVQgPSAnMWtiJztcblxuLyoqIFRyYWNrIHdoZXRoZXIgdGhlIHdlYiBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nIGluLXByb2Nlc3MuICovXG5sZXQgc2VydmVyUnVubmluZyA9IGZhbHNlO1xubGV0IHNlcnZlclBvcnQgPSBERUZBVUxUX1BPUlQ7XG4vKiogQWN0aXZlIEhUVFAgc2VydmVyIGluc3RhbmNlIOKAlCB0cmFja2VkIHNvIF9yZXNldFNlcnZlclN0YXRlIGNhbiBjbG9zZSBpdC4gKi9cbmxldCBhY3RpdmVIdHRwU2VydmVyOiBpbXBvcnQoJ25vZGU6aHR0cCcpLlNlcnZlciB8IG51bGwgPSBudWxsO1xuLyoqIENhY2hlZCB0b2tlbiBzdG9yZSBmb3Igb3BlblBvcnRmb2xpb0Jyb3dzZXIg4oCUIHByZXZlbnRzIGR1cGxpY2F0ZSBpbnN0YW5jZXMgb24gdGhlIHNhbWUgZmlsZS4gKi9cbmxldCBjYWNoZWRUb2tlblN0b3JlOiBDb25zb2xlVG9rZW5TdG9yZSB8IG51bGwgPSBudWxsO1xuXG4vKiogQ2hlY2sgd2hldGhlciB0aGUgd2ViIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIGluIHRoaXMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYlNlcnZlclJ1bm5pbmcoKTogYm9vbGVhbiB7XG4gIHJldHVybiBzZXJ2ZXJSdW5uaW5nO1xufVxuXG4vKipcbiAqIFJlc2V0IG1vZHVsZS1sZXZlbCBzZXJ2ZXIgc3RhdGUuIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHkg4oCUXG4gKiBhbGxvd3MgdGVzdHMgdG8gZXhlcmNpc2Ugc3RhcnRXZWJTZXJ2ZXIvYmluZEFuZExpc3RlbiB3aXRob3V0XG4gKiBpbnRlcmZlcmVuY2UgZnJvbSBwcmlvciBydW5zIGluIHRoZSBzYW1lIHByb2Nlc3MuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFNlcnZlclN0YXRlKCk6IHZvaWQge1xuICBpZiAoYWN0aXZlSHR0cFNlcnZlcikge1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIuY2xvc2UoKTtcbiAgICBhY3RpdmVIdHRwU2VydmVyID0gbnVsbDtcbiAgfVxuICBzZXJ2ZXJSdW5uaW5nID0gZmFsc2U7XG4gIHNlcnZlclBvcnQgPSBERUZBVUxUX1BPUlQ7XG4gIGNhY2hlZFRva2VuU3RvcmUgPSBudWxsO1xufVxuXG4vKipcbiAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBIVFRQIHNlcnZlciAoIzE4NTYpLlxuICogQ2xvc2VzIHRoZSBhY3RpdmUgc2VydmVyIGFuZCByZXNldHMgbW9kdWxlIHN0YXRlIHNvIHRoZSBwb3J0IGlzIGZyZWVkXG4gKiBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBsaW5nZXJpbmcgdW50aWwgcHJvY2VzcyBleGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2h1dGRvd25XZWJTZXJ2ZXIoKTogdm9pZCB7XG4gIGlmIChhY3RpdmVIdHRwU2VydmVyKSB7XG4gICAgYWN0aXZlSHR0cFNlcnZlci5jbG9zZSgpO1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIgPSBudWxsO1xuICAgIHNlcnZlclJ1bm5pbmcgPSBmYWxzZTtcbiAgICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBIVFRQIHNlcnZlciBjbG9zZWQgb24gcG9ydCAke3NlcnZlclBvcnR9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyB0aGUgd2ViIHNlcnZlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZXJ2ZXJPcHRpb25zIHtcbiAgLyoqIFBvcnQgdG8gYmluZCB0byAoZGVmYXVsdHMgdG8gYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYCwgc2VlIGBzcmMvY29uZmlnL2Vudi50c2ApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBQYXRoIHRvIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5IChlLmcuLCB+Ly5kb2xsaG91c2UvcG9ydGZvbGlvKSAqL1xuICBwb3J0Zm9saW9EaXI6IHN0cmluZztcbiAgLyoqIE9wZW4gdGhlIGJyb3dzZXIgYXV0b21hdGljYWxseSBhZnRlciBzdGFydGluZyAoZGVmYXVsdDogZmFsc2UpICovXG4gIG9wZW5Ccm93c2VyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE1DUEFRTEhhbmRsZXIgZm9yIHJvdXRpbmcgdGhyb3VnaCB0aGUgTUNQLUFRTCBwaXBlbGluZS5cbiAgICogV2hlbiBwcm92aWRlZCwgQVBJIHJvdXRlcyB1c2UgdGhlIGdhdGV3YXkgKHZhbGlkYXRlZCwgY2FjaGVkLCBnYXRla2VlcGVyLWNoZWNrZWQpLlxuICAgKiBXaGVuIGFic2VudCwgZmFsbHMgYmFjayB0byBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MgKGxlZ2FjeSBiZWhhdmlvcikuXG4gICAqIElzc3VlICM3OTY6IFdlYiBNQ1AtQVFMIEdhdGV3YXkuXG4gICAqL1xuICBtY3BBcWxIYW5kbGVyPzogTUNQQVFMSGFuZGxlcjtcbiAgLyoqIE1lbW9yeUxvZ1NpbmsgZm9yIGxvZyByb3V0ZXMgKG9wdGlvbmFsIOKAlCBsb2dzIHRhYiBkaXNhYmxlZCBpZiBub3QgcHJvdmlkZWQpICovXG4gIG1lbW9yeVNpbms/OiBNZW1vcnlMb2dTaW5rO1xuICAvKiogTWVtb3J5TWV0cmljc1NpbmsgZm9yIG1ldHJpY3Mgcm91dGVzIChvcHRpb25hbCDigJQgbWV0cmljcyB0YWIgZGlzYWJsZWQgaWYgbm90IHByb3ZpZGVkKSAqL1xuICBtZXRyaWNzU2luaz86IE1lbW9yeU1ldHJpY3NTaW5rO1xuICAvKiogQWRkaXRpb25hbCByb3V0ZXJzIHRvIG1vdW50IGJlZm9yZSB0aGUgU1BBIGZhbGxiYWNrIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhZGRpdGlvbmFsUm91dGVycz86IGltcG9ydCgnZXhwcmVzcycpLlJvdXRlcltdO1xuICAvKipcbiAgICogQ29uc29sZSB0b2tlbiBzdG9yZSAoIzE3ODApLiBXaGVuIHByb3ZpZGVkLCB0aGUgc2VydmVyIHdpbGw6XG4gICAqICAgMS4gTW91bnQgQmVhcmVyIHRva2VuIGF1dGggbWlkZGxld2FyZSBiZWZvcmUgcHJvdGVjdGVkIHJvdXRlcnMuXG4gICAqICAgMi4gSW5qZWN0IHRoZSBwcmltYXJ5IHRva2VuIGludG8gaW5kZXguaHRtbCBzbyB0aGUgYnJvd3NlciBjbGllbnRcbiAgICogICAgICBjYW4gYXR0YWNoIGl0IHRvIGZldGNoIGNhbGxzIGFuZCBFdmVudFNvdXJjZSBVUkxzLlxuICAgKiAgIDMuIEFwcGVuZCB0aGUgdG9rZW4gZmlsZSBsb2NhdGlvbiB0byB0aGUgc3RhcnR1cCBiYW5uZXIuXG4gICAqIEF1dGggZW5mb3JjZW1lbnQgaXMgc3RpbGwgZ2F0ZWQgb24gRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQg4oCUIHRoZVxuICAgKiBtaWRkbGV3YXJlIGlzIGEgcGFzcy10aHJvdWdoIHdoZW4gdGhlIGZsYWcgaXMgZmFsc2UgKHRoZSBQaGFzZSAxIGRlZmF1bHQpLlxuICAgKi9cbiAgdG9rZW5TdG9yZT86IENvbnNvbGVUb2tlblN0b3JlO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhdHRlbXB0aW5nIHRvIGJpbmQgdGhlIEhUVFAgc2VydmVyIHRvIGEgcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZXJyb3I/OiAnRUFERFJJTlVTRScgfCAnT1RIRVInO1xuICBkZXRhaWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHN0YXJ0aW5nIHRoZSB3ZWIgc2VydmVyLCBpbmNsdWRpbmcgaG9va3MgZm9yIERJIHdpcmluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZXJ2ZXJSZXN1bHQge1xuICAvKiogRXhwcmVzcyBhcHAgaW5zdGFuY2Ug4oCUIGZvciBtb3VudGluZyBhZGRpdGlvbmFsIHJvdXRlcyAoZS5nLiwgaW5nZXN0IHJvdXRlcykgKi9cbiAgYXBwPzogaW1wb3J0KCdleHByZXNzJykuRXhwcmVzcztcbiAgLyoqIExvZyBicm9hZGNhc3QgZnVuY3Rpb24g4oCUIGNhbGwgd2l0aCBlYWNoIGVudHJ5IHRvIHB1c2ggdG8gU1NFIGNsaWVudHMgKi9cbiAgbG9nQnJvYWRjYXN0PzogKGVudHJ5OiBpbXBvcnQoJy4uL2xvZ2dpbmcvdHlwZXMuanMnKS5VbmlmaWVkTG9nRW50cnkpID0+IHZvaWQ7XG4gIC8qKiBNZXRyaWNzIHNuYXBzaG90IGZ1bmN0aW9uIOKAlCBjYWxsIHdpdGggZWFjaCBzbmFwc2hvdCB0byBwdXNoIHRvIFNTRSBjbGllbnRzICovXG4gIG1ldHJpY3NPblNuYXBzaG90PzogKHNuYXBzaG90OiBpbXBvcnQoJy4uL21ldHJpY3MvdHlwZXMuanMnKS5NZXRyaWNTbmFwc2hvdCkgPT4gdm9pZDtcbiAgLyoqIFJlc3VsdCBvZiB0aGUgcG9ydCBiaW5kaW5nIGF0dGVtcHQgKi9cbiAgYmluZFJlc3VsdD86IEJpbmRSZXN1bHQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGF0dGVtcHRpbmcgdG8gb3BlbiB0aGUgYnJvd3Nlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcm93c2VyT3BlblJlc3VsdCB7XG4gIC8qKiBUaGUgVVJMIHRoZSBzZXJ2ZXIgaXMgcnVubmluZyBvbiAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhlIHNlcnZlciB3YXMgYWxyZWFkeSBydW5uaW5nICh0cnVlKSBvciBqdXN0IHN0YXJ0ZWQgKGZhbHNlKSAqL1xuICBhbHJlYWR5UnVubmluZzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGJyb3dzZXIgd2FzIHN1Y2Nlc3NmdWxseSBvcGVuZWQgKi9cbiAgYnJvd3Nlck9wZW5lZDogYm9vbGVhbjtcbiAgLyoqIFdhcm5pbmcgbWVzc2FnZSBpZiB0aGUgYnJvd3NlciBjb3VsZCBub3QgYmUgb3BlbmVkICovXG4gIHdhcm5pbmc/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3BlbiBhIFVSTCBpbiB0aGUgc3lzdGVtJ3MgZGVmYXVsdCBicm93c2VyLlxuICpcbiAqIFBsYXRmb3JtLWF3YXJlOlxuICogLSBtYWNPUzogYG9wZW5gXG4gKiAtIExpbnV4OiBgeGRnLW9wZW5gXG4gKiAtIFdpbmRvd3M6IGBzdGFydGBcbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBvcGVuXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgYnJvd3NlciBvcGVuZWQsIGZhbHNlIHdpdGggZXJyb3IgbWVzc2FnZSBpZiBub3RcbiAqL1xuZnVuY3Rpb24gb3BlbkluQnJvd3Nlcih1cmw6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHBsYXQgPSBwbGF0Zm9ybSgpO1xuICAgIGNvbnN0IGNtZCA9IHBsYXQgPT09ICdkYXJ3aW4nID8gJ29wZW4nXG4gICAgICA6IHBsYXQgPT09ICd3aW4zMicgPyAnc3RhcnQnXG4gICAgICA6ICd4ZGctb3Blbic7XG5cbiAgICAvLyBTZWN1cml0eTogdXNlIGV4ZWNGaWxlIHdpdGggVVJMIGFzIGFyZ3VtZW50IGFycmF5LCBub3Qgc3RyaW5nIGludGVycG9sYXRpb25cbiAgICBjb25zdCB1cmxTdHIgPSBTdHJpbmcodXJsKTtcbiAgICAvLyBBY2NlcHQgbG9jYWxob3N0LCAxMjcuMC4wLjEsIGFuZCAqLmxvY2FsaG9zdCBzdWJkb21haW5zIChSRkMgNjc2MSlcbiAgICBpZiAoIS9eaHR0cHM/OlxcL1xcLyhsb2NhbGhvc3R8MTI3XFwuMFxcLjBcXC4xfFtcXHctXStcXC5sb2NhbGhvc3QpWzovXS8udGVzdCh1cmxTdHIpKSB7XG4gICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnVVJMIG11c3QgYmUgYSBsb2NhbGhvc3QgSFRUUCBVUkwnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBleGVjRmlsZShjbWQsIFt1cmxTdHJdLCAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbV2ViVUldIENvdWxkIG5vdCBhdXRvLW9wZW4gYnJvd3NlcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIHBvcnRmb2xpbyB3ZWIgc2VydmVyLlxuICpcbiAqIEJpbmRzIHRvIDEyNy4wLjAuMSBvbmx5IChsb2NhbGhvc3QpLiBTZXJ2ZXMgdGhlIHBvcnRmb2xpbyBicm93c2VyXG4gKiBmcm9udGVuZCBhbmQgQVBJIHJvdXRlcyBmb3IgcmVhZGluZyBlbGVtZW50cy5cbiAqXG4gKiBJZGVtcG90ZW50OiBpZiB0aGUgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZywgb3B0aW9uYWxseSBvcGVucyB0aGVcbiAqIGJyb3dzZXIgd2l0aG91dCBzdGFydGluZyBhIHNlY29uZCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNlcnZlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBIb29rcyBmb3IgREkgd2lyaW5nIChsb2cgYnJvYWRjYXN0LCBtZXRyaWNzIG9uU25hcHNob3QpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFdlYlNlcnZlcihvcHRpb25zOiBXZWJTZXJ2ZXJPcHRpb25zKTogUHJvbWlzZTxXZWJTZXJ2ZXJSZXN1bHQ+IHtcbiAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCB8fCBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IHJlc3VsdDogV2ViU2VydmVyUmVzdWx0ID0ge307XG5cbiAgaWYgKHNlcnZlclJ1bm5pbmcpIHtcbiAgICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgICAgb3BlbkluQnJvd3NlcihgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3NlcnZlclBvcnR9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBjb25zdCBhcHAgPSBleHByZXNzKCk7XG4gIHJlc3VsdC5hcHAgPSBhcHA7XG4gIGFwcC5kaXNhYmxlKCd4LXBvd2VyZWQtYnknKTtcblxuICAvLyBTZWN1cml0eSBoZWFkZXJzXG4gIGFwcC51c2UoKF9yZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIHJlcy5zZXRIZWFkZXIoJ1gtQ29udGVudC1UeXBlLU9wdGlvbnMnLCAnbm9zbmlmZicpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1gtRnJhbWUtT3B0aW9ucycsICdERU5ZJyk7XG4gICAgcmVzLnNldEhlYWRlcignWC1YU1MtUHJvdGVjdGlvbicsICcxOyBtb2RlPWJsb2NrJyk7XG4gICAgcmVzLnNldEhlYWRlcignUmVmZXJyZXItUG9saWN5JywgJ25vLXJlZmVycmVyJyk7XG4gICAgcmVzLnNldEhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fWApO1xuICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtU2VjdXJpdHktUG9saWN5JywgW1xuICAgICAgXCJkZWZhdWx0LXNyYyAnc2VsZidcIixcbiAgICAgIFwic2NyaXB0LXNyYyAnc2VsZicgY2RuLmpzZGVsaXZyLm5ldCBjZG5qcy5jbG91ZGZsYXJlLmNvbVwiLFxuICAgICAgXCJzdHlsZS1zcmMgJ3NlbGYnICd1bnNhZmUtaW5saW5lJyBjZG5qcy5jbG91ZGZsYXJlLmNvbSBjZG4uanNkZWxpdnIubmV0XCIsXG4gICAgICBcImltZy1zcmMgJ3NlbGYnIGRhdGE6XCIsXG4gICAgICBcImNvbm5lY3Qtc3JjICdzZWxmJyByYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tXCIsXG4gICAgICBcImZvbnQtc3JjICdzZWxmJ1wiLFxuICAgIF0uam9pbignOyAnKSk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBDb25zb2xlIHRva2VuIGF1dGhlbnRpY2F0aW9uIG1pZGRsZXdhcmUgKCMxNzgwKS4gTW91bnRlZCBiZWZvcmUgYW55IC9hcGlcbiAgLy8gcm91dGVzIHNvIGV2ZXJ5IHByb3RlY3RlZCBlbmRwb2ludCBnb2VzIHRocm91Z2ggaXQuIFdoZW4gdGhlIGZlYXR1cmUgZmxhZ1xuICAvLyBET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCBpcyBmYWxzZSAoUGhhc2UgMSBkZWZhdWx0KSB0aGlzIGlzIGEgcGFzcy10aHJvdWdoLlxuICAvLyBQdWJsaWMgZW5kcG9pbnRzIGluIFBVQkxJQ19QQVRIX1BSRUZJWEVTIGFsd2F5cyBieXBhc3MgYXV0aCByZWdhcmRsZXNzIG9mIGZsYWcuXG4gIGlmIChvcHRpb25zLnRva2VuU3RvcmUpIHtcbiAgICBjb25zdCBhdXRoTWlkZGxld2FyZSA9IGNyZWF0ZUF1dGhNaWRkbGV3YXJlKHtcbiAgICAgIHN0b3JlOiBvcHRpb25zLnRva2VuU3RvcmUsXG4gICAgICBlbmFibGVkOiBlbnYuRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQsXG4gICAgICBwdWJsaWNQYXRoUHJlZml4ZXM6IFBVQkxJQ19QQVRIX1BSRUZJWEVTLFxuICAgICAgbGFiZWw6ICdhcGknLFxuICAgIH0pO1xuICAgIGFwcC51c2UoJy9hcGknLCBhdXRoTWlkZGxld2FyZSk7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgW1dlYlVJXSBDb25zb2xlIGF1dGggbWlkZGxld2FyZSBtb3VudGVkICR7ZW52LkRPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVEID8gJ0VORk9SQ0lORycgOiAncGFzcy10aHJvdWdoIChmbGFnIG9mZiknfWAsXG4gICAgKTtcblxuICAgIC8vIFRPVFAgZW5yb2xsbWVudCByb3V0ZXMgKCMxNzk0KS4gTW91bnRlZCBBRlRFUiB0aGUgL2FwaSBhdXRoIG1pZGRsZXdhcmVcbiAgICAvLyBiZWNhdXNlIHRoZSByb3V0ZXIgYWRkcyBpdHMgb3duIGFsd2F5cy1vbiBhdXRoIGd1YXJkIOKAlCB0aGUgZ2xvYmFsIGF1dGhcbiAgICAvLyBtaWRkbGV3YXJlIGF0IC9hcGkgaXMgYSBwYXNzLXRocm91Z2ggZHVyaW5nIFBoYXNlIDEgcm9sbG91dCwgYnV0IHRoZVxuICAgIC8vIFRPVFAgcm91dGVyIGVuZm9yY2VzIHJlZ2FyZGxlc3Mgb2YgRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQgc28gYW5cbiAgICAvLyBhdHRhY2tlciB3aXRoIGxvY2FsIHBvcnQgYWNjZXNzIGNhbm5vdCBwcmUtZW5yb2xsIGEgc2Vjb25kIGZhY3RvciBhbmRcbiAgICAvLyBsb2NrIHRoZSBsZWdpdGltYXRlIHVzZXIgb3V0LlxuICAgIGFwcC51c2UoJy9hcGkvY29uc29sZS90b3RwJywgY3JlYXRlVG90cFJvdXRlcyh7IHN0b3JlOiBvcHRpb25zLnRva2VuU3RvcmUgfSkpO1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIFRPVFAgcm91dGVzIG1vdW50ZWQgYXQgL2FwaS9jb25zb2xlL3RvdHAgKGFsd2F5cy1vbiBhdXRoKScpO1xuXG4gICAgLy8gVG9rZW4gbWFuYWdlbWVudCByb3V0ZXMgKCMxNzk1KS4gTW91bnRlZCBhbG9uZ3NpZGUgdGhlIFRPVFAgcm91dGVyIHdpdGhcbiAgICAvLyB0aGUgc2FtZSBhbHdheXMtb24gYXV0aCBwYXR0ZXJuLiBDdXJyZW50bHkgaG9zdHMgdGhlIHJvdGF0aW9uIGVuZHBvaW50O1xuICAgIC8vIGZ1dHVyZSB0b2tlbiBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgKGxpc3QsIHJldm9rZSkgZ28gaGVyZSB0b28uXG4gICAgYXBwLnVzZSgnL2FwaS9jb25zb2xlL3Rva2VuJywgY3JlYXRlVG9rZW5Sb3V0ZXMoeyBzdG9yZTogb3B0aW9ucy50b2tlblN0b3JlIH0pKTtcbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBUb2tlbiByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL2NvbnNvbGUvdG9rZW4gKGFsd2F5cy1vbiBhdXRoKScpO1xuICB9XG5cbiAgLy8gU2V0dXAgcm91dGVzOiBhdXRvLWluc3RhbGwgRG9sbGhvdXNlTUNQIHRvIE1DUCBjbGllbnRzIChtb3VudCBCRUZPUkUgQVBJIHJvdXRlcylcbiAgLy8gQm9keSBsaW1pdCBzY29wZWQgdG8gc2V0dXAgcm91dGVzIG9ubHkg4oCUIGluZ2VzdCByb3V0ZXMgbmVlZCAxbWIgZm9yIGZvbGxvd2VyIGxvZyBmb3J3YXJkaW5nXG4gIGNvbnN0IHNldHVwSnNvblBhcnNlciA9IGV4cHJlc3MuanNvbih7IGxpbWl0OiBTRVRVUF9CT0RZX0xJTUlULCB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gIGNvbnN0IHsgaW5zdGFsbEhhbmRsZXIsIG9wZW5Db25maWdIYW5kbGVyLCB2ZXJzaW9uSGFuZGxlciwgbWNwYlJlZGlyZWN0SGFuZGxlciwgZGV0ZWN0SGFuZGxlciwgZ2V0TGljZW5zZUhhbmRsZXIsIHNldExpY2Vuc2VIYW5kbGVyLCB2ZXJpZnlMaWNlbnNlSGFuZGxlciwgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlciB9ID0gY3JlYXRlU2V0dXBSb3V0ZXMoKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvaW5zdGFsbCcsIHNldHVwSnNvblBhcnNlciwgaW5zdGFsbEhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9vcGVuLWNvbmZpZycsIHNldHVwSnNvblBhcnNlciwgb3BlbkNvbmZpZ0hhbmRsZXIpO1xuICBhcHAuZ2V0KCcvYXBpL3NldHVwL3ZlcnNpb24nLCB2ZXJzaW9uSGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvbWNwYicsIG1jcGJSZWRpcmVjdEhhbmRsZXIpO1xuICBhcHAuZ2V0KCcvYXBpL3NldHVwL2RldGVjdCcsIGRldGVjdEhhbmRsZXIpO1xuICBhcHAuZ2V0KCcvYXBpL3NldHVwL2xpY2Vuc2UnLCBnZXRMaWNlbnNlSGFuZGxlcik7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL2xpY2Vuc2UnLCBzZXR1cEpzb25QYXJzZXIsIHNldExpY2Vuc2VIYW5kbGVyKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvbGljZW5zZS92ZXJpZnknLCBzZXR1cEpzb25QYXJzZXIsIHZlcmlmeUxpY2Vuc2VIYW5kbGVyKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvbGljZW5zZS9yZXNlbmQnLCBzZXR1cEpzb25QYXJzZXIsIHJlc2VuZFZlcmlmaWNhdGlvbkhhbmRsZXIpO1xuICBsb2dnZXIuaW5mbygnW1dlYlVJXSBTZXR1cCByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL3NldHVwJyk7XG5cbiAgLy8gRmlyZS1hbmQtZm9yZ2V0IE5WTSBsYXVuY2hlciByZXBhaXI6IHJlY3JlYXRlcyB0aGUgd3JhcHBlciBpZiBkZWxldGVkIGFuZFxuICAvLyBwYXRjaGVzIGFueSBwcmUtZXhpc3RpbmcgY29uZmlncyB0aGF0IHN0aWxsIHVzZSBiYXJlIGBucHhgLiBOby1vcHMgd2hlblxuICAvLyBOVk0gaXMgYWJzZW50IG9yIG9uIFdpbmRvd3MuIE5ldmVyIGRlbGF5cyBzZXJ2ZXIgc3RhcnR1cC5cbiAgcmVwYWlyTnZtTGF1bmNoZXJPblN0YXJ0dXAoKS5jYXRjaChlcnIgPT5cbiAgICBsb2dnZXIud2FybihgW1NldHVwXSBOVk0gc3RhcnR1cCByZXBhaXIgdGhyZXcgdW5leHBlY3RlZGx5OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKVxuICApO1xuXG4gIC8vIEFQSSByb3V0ZXMg4oCUIHVzZSBNQ1AtQVFMIGdhdGV3YXkgd2hlbiBoYW5kbGVyIGlzIGF2YWlsYWJsZSAoSXNzdWUgIzc5NilcbiAgaWYgKG9wdGlvbnMubWNwQXFsSGFuZGxlcikge1xuICAgIGFwcC51c2UoJy9hcGknLCBjcmVhdGVHYXRld2F5QXBpUm91dGVzKG9wdGlvbnMubWNwQXFsSGFuZGxlciwgb3B0aW9ucy5wb3J0Zm9saW9EaXIpKTtcblxuICAgIC8vIFBlcm1pc3Npb24gZXZhbHVhdGlvbiByb3V0ZXMgKFBPU1QgL2V2YWx1YXRlX3Blcm1pc3Npb24sIEdFVCAvcGVybWlzc2lvbnMvc3RhdHVzKVxuICAgIGNvbnN0IHsgcmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoJy4vcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMuanMnKTtcbiAgICBjb25zdCBwZXJtUm91dGVyID0gKGF3YWl0IGltcG9ydCgnZXhwcmVzcycpKS5Sb3V0ZXIoKTtcbiAgICByZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXMocGVybVJvdXRlciwgb3B0aW9ucy5tY3BBcWxIYW5kbGVyKTtcbiAgICBhcHAudXNlKCcvYXBpJywgcGVybVJvdXRlcik7XG5cbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBBUEkgcm91dGVzIHVzaW5nIE1DUC1BUUwgR2F0ZXdheSArIHBlcm1pc3Npb24gcm91dGVzJyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwLnVzZSgnL2FwaScsIGNyZWF0ZUFwaVJvdXRlcyhvcHRpb25zLnBvcnRmb2xpb0RpcikpO1xuICAgIGxvZ2dlci53YXJuKCdbV2ViVUldIEFQSSByb3V0ZXMgdXNpbmcgZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzIChubyBNQ1AtQVFMIGhhbmRsZXIgYXZhaWxhYmxlKScpO1xuICB9XG5cbiAgLy8gQ29uc29sZSByb3V0ZXM6IGxvZ3MsIG1ldHJpY3MsIGhlYWx0aCDigJQgZXh0cmFjdGVkIHRvIGtlZXAgY29nbml0aXZlXG4gIC8vIGNvbXBsZXhpdHkgb2Ygc3RhcnRXZWJTZXJ2ZXIgbWFuYWdlYWJsZS5cbiAgbW91bnRDb25zb2xlUm91dGVzKGFwcCwgb3B0aW9ucywgcmVzdWx0KTtcblxuICAvLyBTZXJ2ZSB+Ly5kb2xsaG91c2UvcGFnZXMvIGF0IC9wYWdlcy8g4oCUIGRhc2hib2FyZHMsIGdlbmVyYXRlZCBjb250ZW50LCBzdGFjayB2aWV3c1xuICBjb25zdCBwYWdlc0RpciA9IGpvaW4oZGlybmFtZShvcHRpb25zLnBvcnRmb2xpb0RpciksICdwYWdlcycpO1xuICBta2RpcihwYWdlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSkuY2F0Y2goZXJyID0+IHtcbiAgICBsb2dnZXIud2FybihgW1dlYlVJXSBDb3VsZCBub3QgY3JlYXRlIHBhZ2VzIGRpcmVjdG9yeTogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9KTtcbiAgYXBwLnVzZSgnL3BhZ2VzJywgZXhwcmVzcy5zdGF0aWMocGFnZXNEaXIpKTtcblxuICAvKipcbiAgICogR0VUIC9hcGkvcGFnZXNcbiAgICogTGlzdHMgYXZhaWxhYmxlIEhUTUwgcGFnZXMgaW4gfi8uZG9sbGhvdXNlL3BhZ2VzLy5cbiAgICogUmV0dXJucyBwYWdlIG5hbWVzIGFuZCB0aGVpciBVUkxzIGZvciB0aGUgbWFuYWdlbWVudCBjb25zb2xlLlxuICAgKi9cbiAgYXBwLmdldCgnL2FwaS9wYWdlcycsIGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKHBhZ2VzRGlyKTtcbiAgICAgIGNvbnN0IHBhZ2VzID0gZmlsZXNcbiAgICAgICAgLmZpbHRlcihmID0+ICFmLnN0YXJ0c1dpdGgoJy4nKSAmJiBBTExPV0VEX1BBR0VfRVhURU5TSU9OUy5oYXMoZXh0bmFtZShmKSkpXG4gICAgICAgIC5tYXAoZiA9PiAoeyBuYW1lOiBmLCB1cmw6IGAvcGFnZXMvJHtmfWAgfSkpO1xuICAgICAgcmVzLmpzb24oeyBwYWdlcywgZGlyZWN0b3J5OiBwYWdlc0RpciB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlcy5qc29uKHsgcGFnZXM6IFtdLCBkaXJlY3Rvcnk6IHBhZ2VzRGlyIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkaXRpb25hbCByb3V0ZXJzIChlLmcuLCB1bmlmaWVkIGNvbnNvbGUgaW5nZXN0IHJvdXRlcykg4oCUIG11c3QgbW91bnQgYmVmb3JlIFNQQSBmYWxsYmFja1xuICBvcHRpb25zLmFkZGl0aW9uYWxSb3V0ZXJzPy5mb3JFYWNoKHJvdXRlciA9PiBhcHAudXNlKHJvdXRlcikpO1xuXG4gIC8vIFN0YXRpYyBmcm9udGVuZCBmaWxlc1xuICBjb25zdCBwdWJsaWNEaXIgPSBqb2luKF9fZGlybmFtZSwgJ3B1YmxpYycpO1xuICAvLyBTZXJ2ZSBzdGF0aWMgYXNzZXRzIGJ1dCBza2lwIGluZGV4Lmh0bWwg4oCUIHRoZSBTUEEgZmFsbGJhY2sgYmVsb3dcbiAgLy8gaGFuZGxlcyBpdCB3aXRoIHRva2VuIGluamVjdGlvbiAocmVwbGFjZXMge3tDT05TT0xFX1RPS0VOfX0gaW4gdGhlXG4gIC8vIG1ldGEgdGFnKS4gV2l0aG91dCB0aGlzLCBleHByZXNzLnN0YXRpYyBzZXJ2ZXMgdGhlIHJhdyB0ZW1wbGF0ZVxuICAvLyBhbmQgdGhlIGJyb3dzZXIgbmV2ZXIgZ2V0cyB0aGUgYXV0aCB0b2tlbiAoIzE3ODApLlxuICBjb25zdCBpc0RlYnVnID0gQm9vbGVhbihwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcgfHwgcHJvY2Vzcy5lbnYuRU5BQkxFX0RFQlVHKTtcbiAgYXBwLnVzZShleHByZXNzLnN0YXRpYyhwdWJsaWNEaXIsIHtcbiAgICBpbmRleDogZmFsc2UsXG4gICAgLy8gSW4gZGVidWcgbW9kZSwgZGlzYWJsZSBjYWNoaW5nIG9uIGFsbCBzdGF0aWMgYXNzZXRzIChKUywgQ1NTKSBzb1xuICAgIC8vIFVJIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBvbiBub3JtYWwgcmVsb2FkIHdpdGhvdXQgQ21kK1NoaWZ0K1IuXG4gICAgLi4uKGlzRGVidWcgPyB7IGV0YWc6IGZhbHNlLCBsYXN0TW9kaWZpZWQ6IGZhbHNlLCBtYXhBZ2U6IDAgfSA6IHt9KSxcbiAgfSkpO1xuXG4gIC8vIFNQQSBmYWxsYmFjayB3aXRoIGNvbnNvbGUgdG9rZW4gaW5qZWN0aW9uICgjMTc4MCkuXG4gIC8vIFJlYWRzIGluZGV4Lmh0bWwgb24gZmlyc3QgcmVxdWVzdCwgc3Vic3RpdHV0ZXMgdGhlIHt7Q09OU09MRV9UT0tFTn19IHBsYWNlaG9sZGVyXG4gIC8vIHdpdGggdGhlIGN1cnJlbnQgdG9rZW4gdmFsdWUsIGFuZCBjYWNoZXMgdGhlIHJlbmRlcmVkIHN0cmluZy4gVGhlIGNhY2hlIGlzXG4gIC8vIGF1dG8taW52YWxpZGF0ZWQgd2hlbiB0aGUgcHJpbWFyeSB0b2tlbiBjaGFuZ2VzIChyb3RhdGlvbiksIHNvIGEgcGFnZSByZWxvYWRcbiAgLy8gYWZ0ZXIgcm90YXRpb24gcGlja3MgdXAgdGhlIG5ldyB0b2tlbiB3aXRob3V0IGEgc2VydmVyIHJlc3RhcnQuXG4gIGxldCBjYWNoZWRJbmRleEh0bWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgY2FjaGVkVG9rZW5WYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IGluZGV4SHRtbFBhdGggPSBqb2luKHB1YmxpY0RpciwgJ2luZGV4Lmh0bWwnKTtcblxuICBjb25zdCByZW5kZXJJbmRleEh0bWwgPSBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBjb25zdCB0b2tlblZhbHVlID0gb3B0aW9ucy50b2tlblN0b3JlPy5nZXRQcmltYXJ5VG9rZW5WYWx1ZSgpID8/ICcnO1xuICAgIC8vIEF1dG8taW52YWxpZGF0ZSBjYWNoZSB3aGVuIHRoZSB0b2tlbiBjaGFuZ2VzIChyb3RhdGlvbikuXG4gICAgLy8gSW4gZGVidWcgbW9kZSwgYWx3YXlzIHJlLXJlYWQgZnJvbSBkaXNrIHNvIFVJIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBvbiByZWxvYWQuXG4gICAgaWYgKCFpc0RlYnVnICYmIGNhY2hlZEluZGV4SHRtbCAhPT0gbnVsbCAmJiBjYWNoZWRUb2tlblZhbHVlID09PSB0b2tlblZhbHVlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkSW5kZXhIdG1sO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHJlYWRGaWxlRnMoaW5kZXhIdG1sUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBEZWZlbnNpdmUgSFRNTCBhdHRyaWJ1dGUgZXNjYXBlLiBUb2tlbnMgYXJlIHN0cmljdCA2NC1jaGFyIGxvd2VyY2FzZSBoZXhcbiAgICAvLyB0b2RheSBzbyBubyBlc2NhcGluZyBpcyBhY3R1YWxseSBuZWVkZWQsIGJ1dCBpZiB0aGUgdG9rZW4gZm9ybWF0IGV2ZXJcbiAgICAvLyBjaGFuZ2VzIHRoaXMgcHJldmVudHMgYW4gSFRNTC1pbmplY3Rpb24gcmVncmVzc2lvbiBmcm9tIGxhbmRpbmcgc2lsZW50bHkuXG4gICAgY29uc3QgZXNjYXBlZFRva2VuID0gdG9rZW5WYWx1ZVxuICAgICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJ1wiJywgJyZxdW90OycpXG4gICAgICAucmVwbGFjZUFsbChcIidcIiwgJyYjMzk7JylcbiAgICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpO1xuICAgIGNhY2hlZEluZGV4SHRtbCA9IHRlbXBsYXRlXG4gICAgICAucmVwbGFjZUFsbChUT0tFTl9NRVRBX1BMQUNFSE9MREVSLCBlc2NhcGVkVG9rZW4pXG4gICAgICAucmVwbGFjZUFsbChWRVJTSU9OX01FVEFfUExBQ0VIT0xERVIsIFBBQ0tBR0VfVkVSU0lPTik7XG4gICAgY2FjaGVkVG9rZW5WYWx1ZSA9IHRva2VuVmFsdWU7XG4gICAgcmV0dXJuIGNhY2hlZEluZGV4SHRtbDtcbiAgfTtcblxuICBhcHAuZ2V0KCcveypwYXRofScsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcmVxLnBhdGgubm9ybWFsaXplKCdORkMnKTtcbiAgICBpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCgnL2FwaS8nKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYEFQSSByb3V0ZSBub3QgZm91bmQ6ICR7bm9ybWFsaXplZFBhdGh9YCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoJy9wYWdlcy8nKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYFBhZ2Ugbm90IGZvdW5kOiAke25vcm1hbGl6ZWRQYXRofWAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVuZGVySW5kZXhIdG1sKCk7XG4gICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICAvLyBJbiBkZWJ1ZyBtb2RlLCBwcmV2ZW50IGJyb3dzZXIgY2FjaGluZyBzbyBVSSBjaGFuZ2VzIGFyZSBwaWNrZWQgdXBcbiAgICAgIC8vIGltbWVkaWF0ZWx5LiBJbiBwcm9kdWN0aW9uLCBhbGxvdyBzaG9ydCBjYWNoaW5nIGZvciBwZXJmb3JtYW5jZS5cbiAgICAgIGNvbnN0IGlzRGVidWcgPSBCb29sZWFuKHByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRyB8fCBwcm9jZXNzLmVudi5FTkFCTEVfREVCVUcpO1xuICAgICAgcmVzLnNldEhlYWRlcignQ2FjaGUtQ29udHJvbCcsIGlzRGVidWdcbiAgICAgICAgPyAnbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUnXG4gICAgICAgIDogJ3ByaXZhdGUsIG1heC1hZ2U9NjAnKTtcbiAgICAgIHJlcy5zZW5kKGh0bWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUldIEZhaWxlZCB0byByZW5kZXIgaW5kZXguaHRtbDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoJ0ZhaWxlZCB0byBsb2FkIGNvbnNvbGUnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEdsb2JhbCBlcnJvciBoYW5kbGVyIOKAlCBjYXRjaCBFeHByZXNzIGVycm9ycyBhbmQgcm91dGUgdG8gbG9nZ2VyIGluc3RlYWQgb2YgdGVybWluYWwuXG4gIC8vIFdpdGhvdXQgdGhpcywgRXhwcmVzcyBkdW1wcyBzdGFjayB0cmFjZXMgdG8gc3RkZXJyICh2aXNpYmxlIGluIC0td2ViIHRlcm1pbmFsKS5cbiAgLy8gQWxsIGVycm9ycyBzdGlsbCBhcHBlYXIgaW4gdGhlIG1hbmFnZW1lbnQgY29uc29sZSdzIExvZ3MgdGFiIHZpYSBNZW1vcnlMb2dTaW5rLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFwcC51c2UoKGVycjogRXJyb3IsIF9yZXE6IGltcG9ydCgnZXhwcmVzcycpLlJlcXVlc3QsIHJlczogaW1wb3J0KCdleHByZXNzJykuUmVzcG9uc2UsIF9uZXh0OiBpbXBvcnQoJ2V4cHJlc3MnKS5OZXh0RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyIGFzIGFueSkuc3RhdHVzIHx8IChlcnIgYXMgYW55KS5zdGF0dXNDb2RlIHx8IDUwMDtcbiAgICBsb2dnZXIud2FybihgW1dlYlVJXSAke2Vyci5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgcmVzLnN0YXR1cyhzdGF0dXMpLmpzb24oeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBCaW5kIHRvIGxvY2FsaG9zdCBvbmx5IOKAlCBoYW5kbGUgcG9ydCBjb25mbGljdHMgZ3JhY2VmdWxseS5cbiAgLy8gRXh0cmFjdGVkIHRvIGEgaGVscGVyIHRvIGtlZXAgc3RhcnRXZWJTZXJ2ZXIncyBjb2duaXRpdmUgY29tcGxleGl0eSBtYW5hZ2VhYmxlLlxuICByZXN1bHQuYmluZFJlc3VsdCA9IGF3YWl0IGJpbmRBbmRMaXN0ZW4oYXBwLCBwb3J0LCBvcHRpb25zKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE1vdW50IHRoZSBsb2dzLCBtZXRyaWNzLCBhbmQgaGVhbHRoIHJvdXRlcy4gVGhlc2UgYXJlIG9ubHkgbW91bnRlZCB3aGVuIHRoZVxuICogY29ycmVzcG9uZGluZyBzaW5rcyBhcmUgcHJvdmlkZWQgKG1lbW9yeSBsb2cgc2luayBmb3IgbG9ncytoZWFsdGgsIG1ldHJpY3NcbiAqIHNpbmsgZm9yIHRoZSBtZXRyaWNzIHRhYikuIEV4dHJhY3RlZCBmcm9tIHN0YXJ0V2ViU2VydmVyIHRvIGNhcCB0aGUgbWFpblxuICogZnVuY3Rpb24ncyBjb2duaXRpdmUgY29tcGxleGl0eS5cbiAqL1xuZnVuY3Rpb24gbW91bnRDb25zb2xlUm91dGVzKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMsXG4gIHJlc3VsdDogV2ViU2VydmVyUmVzdWx0LFxuKTogdm9pZCB7XG4gIGxldCBsb2dSb3V0ZXM6IExvZ1JvdXRlc1Jlc3VsdCB8IHVuZGVmaW5lZDtcbiAgbGV0IG1ldHJpY3NSb3V0ZXM6IE1ldHJpY3NSb3V0ZXNSZXN1bHQgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKG9wdGlvbnMubWVtb3J5U2luaykge1xuICAgIGxvZ1JvdXRlcyA9IGNyZWF0ZUxvZ1JvdXRlcyhvcHRpb25zLm1lbW9yeVNpbmspO1xuICAgIGFwcC51c2UoJy9hcGknLCBsb2dSb3V0ZXMucm91dGVyKTtcbiAgICByZXN1bHQubG9nQnJvYWRjYXN0ID0gbG9nUm91dGVzLmJyb2FkY2FzdDtcbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBMb2cgdmlld2VyIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvbG9ncycpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMubWV0cmljc1NpbmspIHtcbiAgICBtZXRyaWNzUm91dGVzID0gY3JlYXRlTWV0cmljc1JvdXRlcyhvcHRpb25zLm1ldHJpY3NTaW5rKTtcbiAgICBhcHAudXNlKCcvYXBpJywgbWV0cmljc1JvdXRlcy5yb3V0ZXIpO1xuICAgIHJlc3VsdC5tZXRyaWNzT25TbmFwc2hvdCA9IG1ldHJpY3NSb3V0ZXMub25TbmFwc2hvdDtcbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBNZXRyaWNzIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvbWV0cmljcycpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMubWVtb3J5U2luaykge1xuICAgIGNvbnN0IGhlYWx0aFJvdXRlciA9IGNyZWF0ZUhlYWx0aFJvdXRlcyh7XG4gICAgICBtZW1vcnlTaW5rOiBvcHRpb25zLm1lbW9yeVNpbmssXG4gICAgICBtZXRyaWNzU2luazogb3B0aW9ucy5tZXRyaWNzU2luayxcbiAgICAgIGxvZ0NsaWVudENvdW50OiBsb2dSb3V0ZXMgPyBsb2dSb3V0ZXMuY2xpZW50Q291bnQgOiAoKSA9PiAwLFxuICAgICAgbWV0cmljc0NsaWVudENvdW50OiBtZXRyaWNzUm91dGVzID8gbWV0cmljc1JvdXRlcy5jbGllbnRDb3VudCA6ICgpID0+IDAsXG4gICAgfSk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGhlYWx0aFJvdXRlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmludCB0aGUgc3RhcnR1cCBiYW5uZXIgdG8gc3RkZXJyLlxuICpcbiAqIE5PVEU6IFVzZSBzdGRlcnIgZm9yIHRlcm1pbmFsIG91dHB1dCwgbm90IHN0ZG91dC4gSW4gTUNQIHN0ZGlvIG1vZGUsIHN0ZG91dFxuICogaXMgcmVzZXJ2ZWQgZm9yIEpTT04tUlBDIG1lc3NhZ2VzIOKAlCBhbnkgbm9uLUpTT04gb3V0cHV0IGNvcnJ1cHRzIHRoZSBwcm90b2NvbC5cbiAqIHN0ZGVyciBpcyBzYWZlIGZvciBodW1hbi1yZWFkYWJsZSBtZXNzYWdlcyBpbiBib3RoIE1DUCBhbmQgc3RhbmRhbG9uZSBtb2Rlcy5cbiAqL1xuZnVuY3Rpb24gcHJpbnRTdGFydHVwQmFubmVyKHBvcnQ6IG51bWJlciwgdG9rZW5TdG9yZTogQ29uc29sZVRva2VuU3RvcmUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdXJsID0gYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fWA7XG4gIGNvbnN0IGZhbGxiYWNrVXJsID0gYGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIGxvZ2dlci5pbmZvKGBbV2ViVUldIE1hbmFnZW1lbnQgY29uc29sZSBydW5uaW5nIGF0ICR7dXJsfWApO1xuICBjb25zb2xlLmVycm9yKGBcXG4gIERvbGxob3VzZU1DUCBNYW5hZ2VtZW50IENvbnNvbGVcXG4gICR7dXJsfVxcbiAgJHtmYWxsYmFja1VybH0gKGZhbGxiYWNrKVxcbmApO1xuICBpZiAodG9rZW5TdG9yZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgU2Vzc2lvbiB0b2tlbjogJHt0b2tlblN0b3JlLmdldEZpbGVQYXRoKCl9XFxuYCk7XG4gIH1cbiAgY29uc29sZS5lcnJvcihgICBUeXBlIFwicVwiIG9yIFwicXVpdFwiIHRvIGV4aXQuXFxuYCk7XG59XG5cbi8vIFN0YWxlIHByb2Nlc3MgcmVjb3Zlcnkg4oCUIGV4dHJhY3RlZCB0byBTdGFsZVByb2Nlc3NSZWNvdmVyeS50cyBmb3IgaW5kZXBlbmRlbnQgdGVzdGluZyAoIzE4NTApLlxuaW1wb3J0IHsgcmVjb3ZlclN0YWxlUG9ydCB9IGZyb20gJy4vY29uc29sZS9TdGFsZVByb2Nlc3NSZWNvdmVyeS5qcyc7XG5leHBvcnQgeyBmaW5kUGlkT25Qb3J0LCBraWxsU3RhbGVQcm9jZXNzLCByZWNvdmVyU3RhbGVQb3J0IH0gZnJvbSAnLi9jb25zb2xlL1N0YWxlUHJvY2Vzc1JlY292ZXJ5LmpzJztcblxuLyoqXG4gKiBBdHRlbXB0IGEgc2luZ2xlIHBvcnQgYmluZC4gUmV0dXJucyBhIEJpbmRSZXN1bHQgd2l0aG91dCBhbnkgcmVjb3ZlcnkgbG9naWMuXG4gKi9cbmZ1bmN0aW9uIGF0dGVtcHRCaW5kKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIHBvcnQ6IG51bWJlcixcbiAgb3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyxcbik6IFByb21pc2U8QmluZFJlc3VsdD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8QmluZFJlc3VsdD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBodHRwU2VydmVyID0gYXBwLmxpc3Rlbihwb3J0LCAnMTI3LjAuMC4xJywgKCkgPT4ge1xuICAgICAgc2VydmVyUnVubmluZyA9IHRydWU7XG4gICAgICBzZXJ2ZXJQb3J0ID0gcG9ydDtcbiAgICAgIGFjdGl2ZUh0dHBTZXJ2ZXIgPSBodHRwU2VydmVyO1xuICAgICAgcHJpbnRTdGFydHVwQmFubmVyKHBvcnQsIG9wdGlvbnMudG9rZW5TdG9yZSk7XG4gICAgICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgICAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIGh0dHBTZXJ2ZXIub24oJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnRUFERFJJTlVTRScsIGRldGFpbDogYFBvcnQgJHtwb3J0fSBhbHJlYWR5IGluIHVzZWAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtXZWJVSV0gRmFpbGVkIHRvIGJpbmQgcG9ydCAke3BvcnR9OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnT1RIRVInLCBkZXRhaWw6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCaW5kIHRoZSBFeHByZXNzIGFwcCB0byAxMjcuMC4wLjE6cG9ydC4gT24gRUFERFJJTlVTRSwgYXR0ZW1wdCB0byBmaW5kXG4gKiBhbmQga2lsbCB0aGUgc3RhbGUgRG9sbGhvdXNlTUNQIHByb2Nlc3MgaG9sZGluZyB0aGUgcG9ydCwgdGhlbiByZXRyeSBvbmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBiaW5kQW5kTGlzdGVuKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIHBvcnQ6IG51bWJlcixcbiAgb3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyxcbik6IFByb21pc2U8QmluZFJlc3VsdD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdHRlbXB0QmluZChhcHAsIHBvcnQsIG9wdGlvbnMpO1xuICBpZiAocmVzdWx0LnN1Y2Nlc3MgfHwgcmVzdWx0LmVycm9yICE9PSAnRUFERFJJTlVTRScpIHJldHVybiByZXN1bHQ7XG5cbiAgLy8gUG9ydCBvY2N1cGllZCDigJQgYXR0ZW1wdCBzdGFsZSBwcm9jZXNzIHJlY292ZXJ5IGFuZCByZXRyeVxuICBpZiAoYXdhaXQgcmVjb3ZlclN0YWxlUG9ydChwb3J0KSkge1xuICAgIGNvbnN0IHJldHJ5UmVzdWx0ID0gYXdhaXQgYXR0ZW1wdEJpbmQoYXBwLCBwb3J0LCBvcHRpb25zKTtcbiAgICBpZiAocmV0cnlSZXN1bHQuc3VjY2VzcykgcmV0dXJuIHJldHJ5UmVzdWx0O1xuICB9XG5cbiAgLy8gU3RpbGwgY2FuJ3QgYmluZCDigJQgZmFsbCB0aHJvdWdoIHdpdGggd2FybmluZ1xuICBsb2dnZXIud2FybihgW1dlYlVJXSBQb3J0ICR7cG9ydH0gYWxyZWFkeSBpbiB1c2Ug4oCUIGFub3RoZXIgcHJvY2VzcyBob2xkcyB0aGlzIHBvcnRgKTtcbiAgY29uc29sZS5lcnJvcihgXFxuICBEb2xsaG91c2VNQ1AgTWFuYWdlbWVudCBDb25zb2xlIChleGlzdGluZyBpbnN0YW5jZSlcXG4gIGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fVxcbmApO1xuICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgIG9wZW5JbkJyb3dzZXIoYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fWApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogT3BlbiB0aGUgcG9ydGZvbGlvIGJyb3dzZXIgZnJvbSB3aXRoaW4gdGhlIE1DUCBzZXJ2ZXIgcHJvY2Vzcy5cbiAqXG4gKiBTdGFydHMgdGhlIHdlYiBzZXJ2ZXIgaWYgbm90IGFscmVhZHkgcnVubmluZywgdGhlbiBvcGVucyB0aGUgc3lzdGVtXG4gKiBicm93c2VyIHRvIHRoZSBwb3J0Zm9saW8gVUkuIFJldHVybnMgYSByZXN1bHQgb2JqZWN0IGluZGljYXRpbmdcbiAqIHdoZXRoZXIgdGhlIHNlcnZlciBzdGFydGVkIGFuZCB0aGUgYnJvd3NlciBvcGVuZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIENhbGxlZCBieSB0aGUgYG9wZW5fcG9ydGZvbGlvX2Jyb3dzZXJgIE1DUC1BUUwgb3BlcmF0aW9uIChJc3N1ZSAjNzc0KS5cbiAqXG4gKiBAcGFyYW0gcG9ydGZvbGlvRGlyIC0gUGF0aCB0byB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAoZS5nLiwgfi8uZG9sbGhvdXNlL3BvcnRmb2xpbylcbiAqIEBwYXJhbSBwb3J0IC0gUG9ydCB0byBiaW5kIHRvIChkZWZhdWx0cyB0byBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgKVxuICogQHJldHVybnMgUmVzdWx0IHdpdGggVVJMLCBzZXJ2ZXIgc3RhdHVzLCBhbmQgYnJvd3NlciBvcGVuIHN0YXR1c1xuICovXG4vKipcbiAqIE9wdGlvbnMgZm9yIG9wZW5pbmcgdGhlIHBvcnRmb2xpbyBicm93c2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5Ccm93c2VyT3B0aW9ucyB7XG4gIHBvcnRmb2xpb0Rpcjogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBtY3BBcWxIYW5kbGVyPzogTUNQQVFMSGFuZGxlcjtcbiAgdGFiPzogc3RyaW5nO1xuICB1cmxQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBtZW1vcnlTaW5rPzogTWVtb3J5TG9nU2luaztcbiAgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaztcbn1cblxuLyoqXG4gKiBTZWxmLXByb3Zpc2lvbiBzaW5rcywgdG9rZW4gc3RvcmUsIGFuZCBpbmdlc3Qgcm91dGVzLCB0aGVuIHN0YXJ0IHRoZSB3ZWJcbiAqIHNlcnZlci4gRXh0cmFjdGVkIGZyb20gb3BlblBvcnRmb2xpb0Jyb3dzZXIgdG8ga2VlcCBjb2duaXRpdmUgY29tcGxleGl0eVxuICogbWFuYWdlYWJsZSAoU29uYXJDbG91ZCBTMzc3NikuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0RmFsbGJhY2tTZXJ2ZXIob3B0aW9uczogT3BlbkJyb3dzZXJPcHRpb25zLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG1lbW9yeVNpbmsgPSBvcHRpb25zLm1lbW9yeVNpbms7XG4gIGxldCBtZXRyaWNzU2luayA9IG9wdGlvbnMubWV0cmljc1Npbms7XG5cbiAgaWYgKCFtZW1vcnlTaW5rKSB7XG4gICAgY29uc3QgeyBNZW1vcnlMb2dTaW5rOiBMb2dTaW5rIH0gPSBhd2FpdCBpbXBvcnQoJy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcycpO1xuICAgIG1lbW9yeVNpbmsgPSBuZXcgTG9nU2luayh7IGFwcENhcGFjaXR5OiAxMDAwMCwgc2VjdXJpdHlDYXBhY2l0eTogNTAwMCwgcGVyZkNhcGFjaXR5OiAyMDAwLCB0ZWxlbWV0cnlDYXBhY2l0eTogMTAwMCB9KTtcbiAgfVxuICBpZiAoIW1ldHJpY3NTaW5rKSB7XG4gICAgY29uc3QgeyBNZW1vcnlNZXRyaWNzU2luazogTWV0cmljc1NpbmsgfSA9IGF3YWl0IGltcG9ydCgnLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcycpO1xuICAgIG1ldHJpY3NTaW5rID0gbmV3IE1ldHJpY3NTaW5rKDI0MCk7XG4gIH1cblxuICAvLyBSZXVzZSBjYWNoZWQgdG9rZW4gc3RvcmUg4oCUIHR3byBpbnN0YW5jZXMgb24gdGhlIHNhbWUgZmlsZSBjYW4gcmFjZSBvbiB3cml0ZXMuXG4gIGlmICghY2FjaGVkVG9rZW5TdG9yZSkge1xuICAgIGNvbnN0IHsgQ29uc29sZVRva2VuU3RvcmU6IFRva2VuU3RvcmUgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlL2NvbnNvbGVUb2tlbi5qcycpO1xuICAgIGNvbnN0IHsgcGlja1JhbmRvbVRva2VuTmFtZSB9ID0gYXdhaXQgaW1wb3J0KCcuL2NvbnNvbGUvU2Vzc2lvbk5hbWVzLmpzJyk7XG4gICAgY2FjaGVkVG9rZW5TdG9yZSA9IG5ldyBUb2tlblN0b3JlKGVudi5ET0xMSE9VU0VfQ09OU09MRV9UT0tFTl9GSUxFKTtcbiAgICB0cnkgeyBhd2FpdCBjYWNoZWRUb2tlblN0b3JlLmVuc3VyZUluaXRpYWxpemVkKHBpY2tSYW5kb21Ub2tlbk5hbWUoKSk7IH1cbiAgICBjYXRjaCAoZXJyKSB7IGxvZ2dlci53YXJuKCdbV2ViVUldIEZhaWxlZCB0byBpbml0IHRva2VuIHN0b3JlIGZvciBicm93c2VyIG9wZW4nLCBlcnIpOyB9XG4gIH1cblxuICAvLyBsb2dCcm9hZGNhc3QgaXMgZGVmZXJyZWQg4oCUIHdpcmVkIGFmdGVyIHN0YXJ0V2ViU2VydmVyIHJldHVybnMgdGhlIHJlYWwgYnJvYWRjYXN0IGZuLlxuICBsZXQgbGl2ZUJyb2FkY2FzdDogKChlbnRyeTogaW1wb3J0KCcuLi9sb2dnaW5nL3R5cGVzLmpzJykuVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgeyBjcmVhdGVJbmdlc3RSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlL0luZ2VzdFJvdXRlcy5qcycpO1xuICBjb25zdCBpbmdlc3RSZXN1bHQgPSBjcmVhdGVJbmdlc3RSb3V0ZXMoe1xuICAgIGxvZ0Jyb2FkY2FzdDogKGVudHJ5KSA9PiBsaXZlQnJvYWRjYXN0Py4oZW50cnkpLFxuICB9KTtcbiAgaW5nZXN0UmVzdWx0LnJlZ2lzdGVyQ29uc29sZVNlc3Npb24oKTtcblxuICBjb25zdCB3ZWJSZXN1bHQgPSBhd2FpdCBzdGFydFdlYlNlcnZlcih7XG4gICAgcG9ydGZvbGlvRGlyOiBvcHRpb25zLnBvcnRmb2xpb0RpcixcbiAgICBwb3J0LFxuICAgIG9wZW5Ccm93c2VyOiBmYWxzZSxcbiAgICBtY3BBcWxIYW5kbGVyOiBvcHRpb25zLm1jcEFxbEhhbmRsZXIsXG4gICAgbWVtb3J5U2luayxcbiAgICBtZXRyaWNzU2luayxcbiAgICB0b2tlblN0b3JlOiBjYWNoZWRUb2tlblN0b3JlLFxuICAgIGFkZGl0aW9uYWxSb3V0ZXJzOiBbaW5nZXN0UmVzdWx0LnJvdXRlcl0sXG4gIH0pO1xuXG4gIGxpdmVCcm9hZGNhc3QgPSB3ZWJSZXN1bHQubG9nQnJvYWRjYXN0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlblBvcnRmb2xpb0Jyb3dzZXIob3B0aW9uczogT3BlbkJyb3dzZXJPcHRpb25zKTogUHJvbWlzZTxCcm93c2VyT3BlblJlc3VsdD4ge1xuICBjb25zdCB0YXJnZXRQb3J0ID0gb3B0aW9ucy5wb3J0IHx8IERFRkFVTFRfUE9SVDtcbiAgY29uc3QgYmFzZVVybCA9IGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7dGFyZ2V0UG9ydH1gO1xuXG4gIC8vIEJ1aWxkIFVSTCB3aXRoIG9wdGlvbmFsIHRhYiBoYXNoIGFuZCBxdWVyeSBwYXJhbWV0ZXJzXG4gIGxldCB1cmwgPSBiYXNlVXJsO1xuICBpZiAob3B0aW9ucy50YWIpIHtcbiAgICBjb25zdCBxcyA9IG9wdGlvbnMudXJsUGFyYW1zID8gbmV3IFVSTFNlYXJjaFBhcmFtcyhvcHRpb25zLnVybFBhcmFtcykudG9TdHJpbmcoKSA6ICcnO1xuICAgIHVybCA9IGAke2Jhc2VVcmx9LyMke29wdGlvbnMudGFifSR7cXMgPyAnPycgKyBxcyA6ICcnfWA7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy51cmxQYXJhbXMgJiYgT2JqZWN0LmtleXMob3B0aW9ucy51cmxQYXJhbXMpLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBxcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMob3B0aW9ucy51cmxQYXJhbXMpLnRvU3RyaW5nKCk7XG4gICAgdXJsID0gYCR7YmFzZVVybH0vI3BvcnRmb2xpbz8ke3FzfWA7XG4gIH1cblxuICBjb25zdCBhbHJlYWR5UnVubmluZyA9IHNlcnZlclJ1bm5pbmc7XG5cbiAgaWYgKCFzZXJ2ZXJSdW5uaW5nKSB7XG4gICAgYXdhaXQgc3RhcnRGYWxsYmFja1NlcnZlcihvcHRpb25zLCB0YXJnZXRQb3J0KTtcbiAgfVxuXG4gIGNvbnN0IGJyb3dzZXJSZXN1bHQgPSBhd2FpdCBvcGVuSW5Ccm93c2VyKHVybCk7XG5cbiAgcmV0dXJuIHtcbiAgICB1cmwsXG4gICAgYWxyZWFkeVJ1bm5pbmcsXG4gICAgYnJvd3Nlck9wZW5lZDogYnJvd3NlclJlc3VsdC5zdWNjZXNzLFxuICAgIC4uLihicm93c2VyUmVzdWx0LmVycm9yID8geyB3YXJuaW5nOiBgQnJvd3NlciBjb3VsZCBub3QgYmUgb3BlbmVkIGF1dG9tYXRpY2FsbHk6ICR7YnJvd3NlclJlc3VsdC5lcnJvcn0uIE9wZW4gJHt1cmx9IG1hbnVhbGx5LmAgfSA6IHt9KSxcbiAgfTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "2.0.12-rc.9",
3
+ "version": "2.0.13",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -10,7 +10,7 @@
10
10
  "dollhouse-console-token": "dist/cli/console-token.js"
11
11
  },
12
12
  "scripts": {
13
- "prebuild": "npm run build:safety && node scripts/generate-version.js",
13
+ "prebuild": "npm run build:safety && node scripts/generate-version.js && node scripts/generate-hashes.mjs",
14
14
  "build:safety": "cd packages/safety && npm install && npm run build",
15
15
  "build": "tsc",
16
16
  "postbuild": "node -e \"const fs=require('fs'),p=require('path');function rm(d){if(fs.existsSync(d)){for(const e of fs.readdirSync(d)){const f=p.join(d,e);fs.statSync(f).isDirectory()?rm(f):fs.unlinkSync(f)}fs.rmdirSync(d)}}function cpR(s,d){fs.mkdirSync(d,{recursive:true});for(const e of fs.readdirSync(s)){const sp=p.join(s,e),dp=p.join(d,e);fs.statSync(sp).isDirectory()?cpR(sp,dp):fs.copyFileSync(sp,dp)}}cpR('src/seed-elements','dist/seed-elements');rm('dist/web/public');cpR('src/web/public','dist/web/public')\"",
@@ -219,6 +219,8 @@
219
219
  },
220
220
  "@istanbuljs/load-nyc-config": {
221
221
  "js-yaml": "3.14.2"
222
- }
222
+ },
223
+ "hono": "4.12.12",
224
+ "@hono/node-server": "1.19.13"
223
225
  }
224
226
  }
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.DollhouseMCP/mcp-server",
4
4
  "title": "DollhouseMCP",
5
5
  "description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
6
- "version": "2.0.12-rc.9",
6
+ "version": "2.0.13",
7
7
  "homepage": "https://dollhousemcp.com",
8
8
  "repository": {
9
9
  "type": "git",
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "registryType": "npm",
31
31
  "identifier": "@dollhousemcp/mcp-server",
32
- "version": "2.0.12-rc.9",
32
+ "version": "2.0.13",
33
33
  "transport": {
34
34
  "type": "stdio"
35
35
  }