@dollhousemcp/mcp-server
Version:
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.
212 lines (207 loc) • 25.3 kB
JavaScript
/**
* DisplayConfigHandler - Manages runtime indicator display preferences
*
* Handles session-scoped tweaks to persona indicator formatting such as:
* - Enabling/disabling indicators
* - Style selection (full/minimal/compact/custom)
* - Visibility of version/author/category
* - Emoji and bracket choices
* - Custom format templates
*
* Uses dependency injection for all services:
* - PersonaManager for persona state and operations
* - InitializationService for setup tasks
* - PersonaIndicatorService for persona indicator formatting
*
* FIX: DMCP-SEC-006 - Security audit suppression
* This handler delegates configuration changes to PersonaIndicatorService.
* Audit logging happens in PersonaIndicatorService.updateConfig().
* @security-audit-suppress DMCP-SEC-006
*/
import { formatIndicator, validateCustomFormat, } from '../config/indicator-config.js';
import { SecureErrorHandler } from '../security/errorHandler.js';
import { SecurityMonitor } from '../security/securityMonitor.js';
const SAMPLE_PERSONA_METADATA = {
name: 'Example Persona',
version: '1.0',
author: '@username',
category: 'creative',
};
export class DisplayConfigHandler {
personaManager;
initService;
indicatorService;
constructor(personaManager, initService, indicatorService) {
this.personaManager = personaManager;
this.initService = initService;
this.indicatorService = indicatorService;
}
async ensureInitialized() {
await this.initService.ensureInitialized();
}
prefix(message) {
return `${this.indicatorService.getPersonaIndicator()}${message}`;
}
cloneConfig(config) {
return { ...config };
}
applyUpdates(baseConfig, updates) {
const updated = this.cloneConfig(baseConfig);
if (updates.enabled !== undefined)
updated.enabled = updates.enabled;
if (updates.style !== undefined)
updated.style = updates.style;
if (updates.showVersion !== undefined)
updated.showVersion = updates.showVersion;
if (updates.showAuthor !== undefined)
updated.showAuthor = updates.showAuthor;
if (updates.showCategory !== undefined)
updated.showCategory = updates.showCategory;
if (updates.emoji !== undefined)
updated.emoji = updates.emoji;
if (updates.bracketStyle !== undefined)
updated.bracketStyle = updates.bracketStyle;
if (updates.separator !== undefined)
updated.separator = updates.separator;
if (updates.showEmoji !== undefined)
updated.showEmoji = updates.showEmoji;
if (updates.showName !== undefined)
updated.showName = updates.showName;
if (updates.customFormat !== undefined) {
updated.customFormat = updates.customFormat;
}
return updated;
}
buildExampleIndicator(config) {
const activePersona = this.personaManager.getActivePersona();
if (activePersona) {
return formatIndicator(config, {
name: activePersona.metadata.name,
version: activePersona.metadata.version,
author: activePersona.metadata.author,
category: activePersona.metadata.category,
});
}
return formatIndicator(config, SAMPLE_PERSONA_METADATA);
}
formatConfigureSuccess(config, example) {
return `✅ Indicator configuration updated successfully!
Current settings:
- Enabled: ${config.enabled}
- Style: ${config.style}
- Show Version: ${config.showVersion}
- Show Author: ${config.showAuthor}
- Show Category: ${config.showCategory}
- Emoji: ${config.emoji}
- Brackets: ${config.bracketStyle}
${config.customFormat ? `- Custom Format: ${config.customFormat}\n` : ''}Example indicator: ${example || '(none - indicators disabled)'}
Note: Configuration is temporary for this session. To make permanent, set environment variables:
- DOLLHOUSE_INDICATOR_ENABLED=true/false
- DOLLHOUSE_INDICATOR_STYLE=full/minimal/compact/custom
- DOLLHOUSE_INDICATOR_FORMAT="custom format template"
- DOLLHOUSE_INDICATOR_SHOW_VERSION=true/false
- DOLLHOUSE_INDICATOR_SHOW_AUTHOR=true/false
- DOLLHOUSE_INDICATOR_SHOW_CATEGORY=true/false
- DOLLHOUSE_INDICATOR_EMOJI=🎭
- DOLLHOUSE_INDICATOR_BRACKETS=square/round/curly/angle/none`;
}
formatConfigReport(config, example) {
return `📊 Current Indicator Configuration:
Settings:
- Enabled: ${config.enabled}
- Style: ${config.style}
- Show Version: ${config.showVersion}
- Show Author: ${config.showAuthor}
- Show Category: ${config.showCategory}
- Emoji: ${config.emoji}
- Brackets: ${config.bracketStyle}
- Separator: "${config.separator}"
${config.customFormat ? `- Custom Format: ${config.customFormat}\n` : ''}
Available styles:
- full: [🎭 Persona Name v1.0 by @author]
- minimal: 🎭 Persona Name
- compact: [Persona Name v1.0]
- custom: Use your own format with placeholders
Example with current settings: ${example || '(none - indicators disabled)'}
Placeholders for custom format:
- {emoji} - The configured emoji
- {name} - Persona name
- {version} - Persona version
- {author} - Persona author
- {category} - Persona category`;
}
/**
* Configure indicator settings (runtime-only)
*/
async configureIndicator(config) {
await this.ensureInitialized();
try {
if (config.customFormat !== undefined) {
const validation = validateCustomFormat(config.customFormat);
if (!validation.valid) {
return {
content: [
{
type: 'text',
text: this.prefix(`❌ Invalid custom format: ${validation.error}`),
},
],
};
}
}
const baseConfig = this.personaManager.getIndicatorConfig();
const updatedConfig = this.applyUpdates(baseConfig, config);
this.personaManager.updateIndicatorConfig(updatedConfig);
this.indicatorService.updateConfig(updatedConfig);
// FIX: DMCP-SEC-006 - Add security audit logging for configuration changes
SecurityMonitor.logSecurityEvent({
type: 'CONFIG_UPDATED',
severity: 'LOW',
source: 'DisplayConfigHandler.configureIndicator',
details: `Display indicator configuration updated: ${Object.keys(config).join(', ')}`,
additionalData: {
updatedFields: Object.keys(config),
style: config.style,
enabled: config.enabled,
}
});
const exampleIndicator = this.buildExampleIndicator(updatedConfig);
return {
content: [
{
type: 'text',
text: this.prefix(this.formatConfigureSuccess(updatedConfig, exampleIndicator)),
},
],
};
}
catch (error) {
const sanitized = SecureErrorHandler.sanitizeError(error);
return {
content: [
{
type: 'text',
text: this.prefix(`❌ Error configuring indicator: ${sanitized.message}`),
},
],
};
}
}
/**
* Retrieve current indicator configuration and preview example
*/
async getIndicatorConfig() {
await this.ensureInitialized();
const currentConfig = this.personaManager.getIndicatorConfig();
const exampleIndicator = this.buildExampleIndicator(currentConfig);
return {
content: [
{
type: 'text',
text: this.prefix(this.formatConfigReport(currentConfig, exampleIndicator)),
},
],
};
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlzcGxheUNvbmZpZ0hhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGFuZGxlcnMvRGlzcGxheUNvbmZpZ0hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQ0wsZUFBZSxFQUNmLG9CQUFvQixHQUVyQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBSWpFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVqRSxNQUFNLHVCQUF1QixHQUFHO0lBQzlCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLEtBQUs7SUFDZCxNQUFNLEVBQUUsV0FBVztJQUNuQixRQUFRLEVBQUUsVUFBVTtDQUNyQixDQUFDO0FBRUYsTUFBTSxPQUFPLG9CQUFvQjtJQUVaO0lBQ0E7SUFDQTtJQUhuQixZQUNtQixjQUE4QixFQUM5QixXQUFrQyxFQUNsQyxnQkFBeUM7UUFGekMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUF1QjtRQUNsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO0lBQ3pELENBQUM7SUFFSSxLQUFLLENBQUMsaUJBQWlCO1FBQzdCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFTyxNQUFNLENBQUMsT0FBZTtRQUM1QixPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUF1QjtRQUN6QyxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sWUFBWSxDQUNsQixVQUEyQixFQUMzQixPQUFpQztRQUVqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTdDLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ3JFLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQy9ELElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ2pGLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQzlFLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQ3BGLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQy9ELElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQ3BGLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQzNFLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQzNFLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBRXhFLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTLEVB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QUFFLENBQUM7UUFFL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9ELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRW5FLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQWU7b0JBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztpQkFDNUU7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERpc3BsYXlDb25maWdIYW5kbGVyIC0gTWFuYWdlcyBydW50aW1lIGluZGljYXRvciBkaXNwbGF5IHByZWZlcmVuY2VzXG4gKlxuICogSGFuZGxlcyBzZXNzaW9uLXNjb3BlZCB0d2Vha3MgdG8gcGVyc29uYSBpbmRpY2F0b3IgZm9ybWF0dGluZyBzdWNoIGFzOlxuICogLSBFbmFibGluZy9kaXNhYmxpbmcgaW5kaWNhdG9yc1xuICogLSBTdHlsZSBzZWxlY3Rpb24gKGZ1bGwvbWluaW1hbC9jb21wYWN0L2N1c3RvbSlcbiAqIC0gVmlzaWJpbGl0eSBvZiB2ZXJzaW9uL2F1dGhvci9jYXRlZ29yeVxuICogLSBFbW9qaSBhbmQgYnJhY2tldCBjaG9pY2VzXG4gKiAtIEN1c3RvbSBmb3JtYXQgdGVtcGxhdGVzXG4gKlxuICogVXNlcyBkZXBlbmRlbmN5IGluamVjdGlvbiBmb3IgYWxsIHNlcnZpY2VzOlxuICogLSBQZXJzb25hTWFuYWdlciBmb3IgcGVyc29uYSBzdGF0ZSBhbmQgb3BlcmF0aW9uc1xuICogLSBJbml0aWFsaXphdGlvblNlcnZpY2UgZm9yIHNldHVwIHRhc2tzXG4gKiAtIFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlIGZvciBwZXJzb25hIGluZGljYXRvciBmb3JtYXR0aW5nXG4gKlxuICogRklYOiBETUNQLVNFQy0wMDYgLSBTZWN1cml0eSBhdWRpdCBzdXBwcmVzc2lvblxuICogVGhpcyBoYW5kbGVyIGRlbGVnYXRlcyBjb25maWd1cmF0aW9uIGNoYW5nZXMgdG8gUGVyc29uYUluZGljYXRvclNlcnZpY2UuXG4gKiBBdWRpdCBsb2dnaW5nIGhhcHBlbnMgaW4gUGVyc29uYUluZGljYXRvclNlcnZpY2UudXBkYXRlQ29uZmlnKCkuXG4gKiBAc2VjdXJpdHktYXVkaXQtc3VwcHJlc3MgRE1DUC1TRUMtMDA2XG4gKi9cblxuaW1wb3J0IHtcbiAgZm9ybWF0SW5kaWNhdG9yLFxuICB2YWxpZGF0ZUN1c3RvbUZvcm1hdCxcbiAgdHlwZSBJbmRpY2F0b3JDb25maWcsXG59IGZyb20gJy4uL2NvbmZpZy9pbmRpY2F0b3ItY29uZmlnLmpzJztcbmltcG9ydCB7IFNlY3VyZUVycm9ySGFuZGxlciB9IGZyb20gJy4uL3NlY3VyaXR5L2Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBQZXJzb25hTWFuYWdlciB9IGZyb20gJy4uL3BlcnNvbmEvUGVyc29uYU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvSW5pdGlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvUGVyc29uYUluZGljYXRvclNlcnZpY2UuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcblxuY29uc3QgU0FNUExFX1BFUlNPTkFfTUVUQURBVEEgPSB7XG4gIG5hbWU6ICdFeGFtcGxlIFBlcnNvbmEnLFxuICB2ZXJzaW9uOiAnMS4wJyxcbiAgYXV0aG9yOiAnQHVzZXJuYW1lJyxcbiAgY2F0ZWdvcnk6ICdjcmVhdGl2ZScsXG59O1xuXG5leHBvcnQgY2xhc3MgRGlzcGxheUNvbmZpZ0hhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcnNvbmFNYW5hZ2VyOiBQZXJzb25hTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluaXRTZXJ2aWNlOiBJbml0aWFsaXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JTZXJ2aWNlOiBQZXJzb25hSW5kaWNhdG9yU2VydmljZVxuICApIHt9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbml0aWFsaXplZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRTZXJ2aWNlLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gIH1cblxuICBwcml2YXRlIHByZWZpeChtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmluZGljYXRvclNlcnZpY2UuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7bWVzc2FnZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUNvbmZpZyhjb25maWc6IEluZGljYXRvckNvbmZpZyk6IEluZGljYXRvckNvbmZpZyB7XG4gICAgcmV0dXJuIHsgLi4uY29uZmlnIH07XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VXBkYXRlcyhcbiAgICBiYXNlQ29uZmlnOiBJbmRpY2F0b3JDb25maWcsXG4gICAgdXBkYXRlczogUGFydGlhbDxJbmRpY2F0b3JDb25maWc+XG4gICk6IEluZGljYXRvckNvbmZpZyB7XG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMuY2xvbmVDb25maWcoYmFzZUNvbmZpZyk7XG5cbiAgICBpZiAodXBkYXRlcy5lbmFibGVkICE9PSB1bmRlZmluZWQpIHVwZGF0ZWQuZW5hYmxlZCA9IHVwZGF0ZXMuZW5hYmxlZDtcbiAgICBpZiAodXBkYXRlcy5zdHlsZSAhPT0gdW5kZWZpbmVkKSB1cGRhdGVkLnN0eWxlID0gdXBkYXRlcy5zdHlsZTtcbiAgICBpZiAodXBkYXRlcy5zaG93VmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB1cGRhdGVkLnNob3dWZXJzaW9uID0gdXBkYXRlcy5zaG93VmVyc2lvbjtcbiAgICBpZiAodXBkYXRlcy5zaG93QXV0aG9yICE9PSB1bmRlZmluZWQpIHVwZGF0ZWQuc2hvd0F1dGhvciA9IHVwZGF0ZXMuc2hvd0F1dGhvcjtcbiAgICBpZiAodXBkYXRlcy5zaG93Q2F0ZWdvcnkgIT09IHVuZGVmaW5lZCkgdXBkYXRlZC5zaG93Q2F0ZWdvcnkgPSB1cGRhdGVzLnNob3dDYXRlZ29yeTtcbiAgICBpZiAodXBkYXRlcy5lbW9qaSAhPT0gdW5kZWZpbmVkKSB1cGRhdGVkLmVtb2ppID0gdXBkYXRlcy5lbW9qaTtcbiAgICBpZiAodXBkYXRlcy5icmFja2V0U3R5bGUgIT09IHVuZGVmaW5lZCkgdXBkYXRlZC5icmFja2V0U3R5bGUgPSB1cGRhdGVzLmJyYWNrZXRTdHlsZTtcbiAgICBpZiAodXBkYXRlcy5zZXBhcmF0b3IgIT09IHVuZGVmaW5lZCkgdXBkYXRlZC5zZXBhcmF0b3IgPSB1cGRhdGVzLnNlcGFyYXRvcjtcbiAgICBpZiAodXBkYXRlcy5zaG93RW1vamkgIT09IHVuZGVmaW5lZCkgdXBkYXRlZC5zaG93RW1vamkgPSB1cGRhdGVzLnNob3dFbW9qaTtcbiAgICBpZiAodXBkYXRlcy5zaG93TmFtZSAhPT0gdW5kZWZpbmVkKSB1cGRhdGVkLnNob3dOYW1lID0gdXBkYXRlcy5zaG93TmFtZTtcblxuICAgIGlmICh1cGRhdGVzLmN1c3RvbUZvcm1hdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cGRhdGVkLmN1c3RvbUZvcm1hdCA9IHVwZGF0ZXMuY3VzdG9tRm9ybWF0O1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEV4YW1wbGVJbmRpY2F0b3IoY29uZmlnOiBJbmRpY2F0b3JDb25maWcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFjdGl2ZVBlcnNvbmEgPSB0aGlzLnBlcnNvbmFNYW5hZ2VyLmdldEFjdGl2ZVBlcnNvbmEoKTtcbiAgICBpZiAoYWN0aXZlUGVyc29uYSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEluZGljYXRvcihjb25maWcsIHtcbiAgICAgICAgbmFtZTogYWN0aXZlUGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBhY3RpdmVQZXJzb25hLm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIGF1dGhvcjogYWN0aXZlUGVyc29uYS5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIGNhdGVnb3J5OiBhY3RpdmVQZXJzb25hLm1ldGFkYXRhLmNhdGVnb3J5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdEluZGljYXRvcihjb25maWcsIFNBTVBMRV9QRVJTT05BX01FVEFEQVRBKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0Q29uZmlndXJlU3VjY2Vzcyhjb25maWc6IEluZGljYXRvckNvbmZpZywgZXhhbXBsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYOKchSBJbmRpY2F0b3IgY29uZmlndXJhdGlvbiB1cGRhdGVkIHN1Y2Nlc3NmdWxseSFcblxuQ3VycmVudCBzZXR0aW5nczpcbi0gRW5hYmxlZDogJHtjb25maWcuZW5hYmxlZH1cbi0gU3R5bGU6ICR7Y29uZmlnLnN0eWxlfVxuLSBTaG93IFZlcnNpb246ICR7Y29uZmlnLnNob3dWZXJzaW9ufVxuLSBTaG93IEF1dGhvcjogJHtjb25maWcuc2hvd0F1dGhvcn1cbi0gU2hvdyBDYXRlZ29yeTogJHtjb25maWcuc2hvd0NhdGVnb3J5fVxuLSBFbW9qaTogJHtjb25maWcuZW1vaml9XG4tIEJyYWNrZXRzOiAke2NvbmZpZy5icmFja2V0U3R5bGV9XG4ke2NvbmZpZy5jdXN0b21Gb3JtYXQgPyBgLSBDdXN0b20gRm9ybWF0OiAke2NvbmZpZy5jdXN0b21Gb3JtYXR9XFxuYCA6ICcnfUV4YW1wbGUgaW5kaWNhdG9yOiAke2V4YW1wbGUgfHwgJyhub25lIC0gaW5kaWNhdG9ycyBkaXNhYmxlZCknfVxuXG5Ob3RlOiBDb25maWd1cmF0aW9uIGlzIHRlbXBvcmFyeSBmb3IgdGhpcyBzZXNzaW9uLiBUbyBtYWtlIHBlcm1hbmVudCwgc2V0IGVudmlyb25tZW50IHZhcmlhYmxlczpcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9FTkFCTEVEPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TVFlMRT1mdWxsL21pbmltYWwvY29tcGFjdC9jdXN0b21cbi0gRE9MTEhPVVNFX0lORElDQVRPUl9GT1JNQVQ9XCJjdXN0b20gZm9ybWF0IHRlbXBsYXRlXCJcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX1ZFUlNJT049dHJ1ZS9mYWxzZVxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX1NIT1dfQVVUSE9SPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX0NBVEVHT1JZPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9FTU9KST3wn46tXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfQlJBQ0tFVFM9c3F1YXJlL3JvdW5kL2N1cmx5L2FuZ2xlL25vbmVgO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDb25maWdSZXBvcnQoY29uZmlnOiBJbmRpY2F0b3JDb25maWcsIGV4YW1wbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGDwn5OKIEN1cnJlbnQgSW5kaWNhdG9yIENvbmZpZ3VyYXRpb246XG5cblNldHRpbmdzOlxuLSBFbmFibGVkOiAke2NvbmZpZy5lbmFibGVkfVxuLSBTdHlsZTogJHtjb25maWcuc3R5bGV9XG4tIFNob3cgVmVyc2lvbjogJHtjb25maWcuc2hvd1ZlcnNpb259XG4tIFNob3cgQXV0aG9yOiAke2NvbmZpZy5zaG93QXV0aG9yfVxuLSBTaG93IENhdGVnb3J5OiAke2NvbmZpZy5zaG93Q2F0ZWdvcnl9XG4tIEVtb2ppOiAke2NvbmZpZy5lbW9qaX1cbi0gQnJhY2tldHM6ICR7Y29uZmlnLmJyYWNrZXRTdHlsZX1cbi0gU2VwYXJhdG9yOiBcIiR7Y29uZmlnLnNlcGFyYXRvcn1cIlxuJHtjb25maWcuY3VzdG9tRm9ybWF0ID8gYC0gQ3VzdG9tIEZvcm1hdDogJHtjb25maWcuY3VzdG9tRm9ybWF0fVxcbmAgOiAnJ31cbkF2YWlsYWJsZSBzdHlsZXM6XG4tIGZ1bGw6IFvwn46tIFBlcnNvbmEgTmFtZSB2MS4wIGJ5IEBhdXRob3JdXG4tIG1pbmltYWw6IPCfjq0gUGVyc29uYSBOYW1lXG4tIGNvbXBhY3Q6IFtQZXJzb25hIE5hbWUgdjEuMF1cbi0gY3VzdG9tOiBVc2UgeW91ciBvd24gZm9ybWF0IHdpdGggcGxhY2Vob2xkZXJzXG5cbkV4YW1wbGUgd2l0aCBjdXJyZW50IHNldHRpbmdzOiAke2V4YW1wbGUgfHwgJyhub25lIC0gaW5kaWNhdG9ycyBkaXNhYmxlZCknfVxuXG5QbGFjZWhvbGRlcnMgZm9yIGN1c3RvbSBmb3JtYXQ6XG4tIHtlbW9qaX0gLSBUaGUgY29uZmlndXJlZCBlbW9qaVxuLSB7bmFtZX0gLSBQZXJzb25hIG5hbWVcbi0ge3ZlcnNpb259IC0gUGVyc29uYSB2ZXJzaW9uXG4tIHthdXRob3J9IC0gUGVyc29uYSBhdXRob3Jcbi0ge2NhdGVnb3J5fSAtIFBlcnNvbmEgY2F0ZWdvcnlgO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBpbmRpY2F0b3Igc2V0dGluZ3MgKHJ1bnRpbWUtb25seSlcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUluZGljYXRvcihjb25maWc6IFBhcnRpYWw8SW5kaWNhdG9yQ29uZmlnPikge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoY29uZmlnLmN1c3RvbUZvcm1hdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZUN1c3RvbUZvcm1hdChjb25maWcuY3VzdG9tRm9ybWF0KTtcbiAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChg4p2MIEludmFsaWQgY3VzdG9tIGZvcm1hdDogJHt2YWxpZGF0aW9uLmVycm9yfWApLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VDb25maWcgPSB0aGlzLnBlcnNvbmFNYW5hZ2VyLmdldEluZGljYXRvckNvbmZpZygpO1xuICAgICAgY29uc3QgdXBkYXRlZENvbmZpZyA9IHRoaXMuYXBwbHlVcGRhdGVzKGJhc2VDb25maWcsIGNvbmZpZyk7XG5cbiAgICAgIHRoaXMucGVyc29uYU1hbmFnZXIudXBkYXRlSW5kaWNhdG9yQ29uZmlnKHVwZGF0ZWRDb25maWcpO1xuICAgICAgdGhpcy5pbmRpY2F0b3JTZXJ2aWNlLnVwZGF0ZUNvbmZpZyh1cGRhdGVkQ29uZmlnKTtcblxuICAgICAgLy8gRklYOiBETUNQLVNFQy0wMDYgLSBBZGQgc2VjdXJpdHkgYXVkaXQgbG9nZ2luZyBmb3IgY29uZmlndXJhdGlvbiBjaGFuZ2VzXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05GSUdfVVBEQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnRGlzcGxheUNvbmZpZ0hhbmRsZXIuY29uZmlndXJlSW5kaWNhdG9yJyxcbiAgICAgICAgZGV0YWlsczogYERpc3BsYXkgaW5kaWNhdG9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlZDogJHtPYmplY3Qua2V5cyhjb25maWcpLmpvaW4oJywgJyl9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICB1cGRhdGVkRmllbGRzOiBPYmplY3Qua2V5cyhjb25maWcpLFxuICAgICAgICAgIHN0eWxlOiBjb25maWcuc3R5bGUsXG4gICAgICAgICAgZW5hYmxlZDogY29uZmlnLmVuYWJsZWQsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBleGFtcGxlSW5kaWNhdG9yID0gdGhpcy5idWlsZEV4YW1wbGVJbmRpY2F0b3IodXBkYXRlZENvbmZpZyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcgYXMgY29uc3QsXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeCh0aGlzLmZvcm1hdENvbmZpZ3VyZVN1Y2Nlc3ModXBkYXRlZENvbmZpZywgZXhhbXBsZUluZGljYXRvcikpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoYOKdjCBFcnJvciBjb25maWd1cmluZyBpbmRpY2F0b3I6ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGN1cnJlbnQgaW5kaWNhdG9yIGNvbmZpZ3VyYXRpb24gYW5kIHByZXZpZXcgZXhhbXBsZVxuICAgKi9cbiAgYXN5bmMgZ2V0SW5kaWNhdG9yQ29uZmlnKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcblxuICAgIGNvbnN0IGN1cnJlbnRDb25maWcgPSB0aGlzLnBlcnNvbmFNYW5hZ2VyLmdldEluZGljYXRvckNvbmZpZygpO1xuICAgIGNvbnN0IGV4YW1wbGVJbmRpY2F0b3IgPSB0aGlzLmJ1aWxkRXhhbXBsZUluZGljYXRvcihjdXJyZW50Q29uZmlnKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcgYXMgY29uc3QsXG4gICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgodGhpcy5mb3JtYXRDb25maWdSZXBvcnQoY3VycmVudENvbmZpZywgZXhhbXBsZUluZGljYXRvcikpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG5cbiJdfQ==