@dollhousemcp/mcp-server 1.5.2 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/README.md +494 -111
- package/data/agents/code-reviewer.md +8 -1
- package/data/agents/research-assistant.md +8 -1
- package/data/agents/task-manager.md +8 -1
- package/data/ensembles/business-advisor.md +8 -1
- package/data/ensembles/creative-studio.md +8 -1
- package/data/ensembles/development-team.md +8 -1
- package/data/ensembles/security-analysis-team.md +8 -1
- package/data/memories/conversation-history.md +8 -1
- package/data/memories/learning-progress.md +8 -1
- package/data/memories/project-context.md +8 -1
- package/data/personas/business-consultant.md +8 -1
- package/data/personas/creative-writer.md +8 -1
- package/data/personas/debug-detective.md +8 -1
- package/data/personas/eli5-explainer.md +8 -1
- package/data/personas/security-analyst.md +8 -1
- package/data/personas/technical-analyst.md +8 -1
- package/data/skills/code-review.md +8 -1
- package/data/skills/creative-writing.md +8 -1
- package/data/skills/data-analysis.md +8 -1
- package/data/skills/penetration-testing.md +8 -1
- package/data/skills/research.md +8 -1
- package/data/skills/threat-modeling.md +8 -1
- package/data/skills/translation.md +8 -1
- package/data/templates/code-documentation.md +8 -1
- package/data/templates/email-professional.md +8 -1
- package/data/templates/meeting-notes.md +8 -1
- package/data/templates/penetration-test-report.md +8 -1
- package/data/templates/project-brief.md +8 -1
- package/data/templates/report-executive.md +8 -1
- package/data/templates/security-vulnerability-report.md +8 -1
- package/data/templates/threat-assessment-report.md +8 -1
- package/dist/auth/GitHubAuthManager.d.ts +6 -1
- package/dist/auth/GitHubAuthManager.d.ts.map +1 -1
- package/dist/auth/GitHubAuthManager.js +45 -18
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts +98 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts.map +1 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.js +531 -0
- package/dist/cache/CollectionCache.d.ts.map +1 -1
- package/dist/cache/CollectionCache.js +13 -3
- package/dist/cache/CollectionIndexCache.d.ts +77 -0
- package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
- package/dist/cache/CollectionIndexCache.js +349 -0
- package/dist/cache/LRUCache.d.ts +93 -0
- package/dist/cache/LRUCache.d.ts.map +1 -0
- package/dist/cache/LRUCache.js +299 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +2 -1
- package/dist/collection/CollectionBrowser.d.ts +21 -1
- package/dist/collection/CollectionBrowser.d.ts.map +1 -1
- package/dist/collection/CollectionBrowser.js +130 -10
- package/dist/collection/CollectionIndexManager.d.ts +151 -0
- package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
- package/dist/collection/CollectionIndexManager.js +499 -0
- package/dist/collection/CollectionSearch.d.ts +55 -0
- package/dist/collection/CollectionSearch.d.ts.map +1 -1
- package/dist/collection/CollectionSearch.js +338 -13
- package/dist/collection/CollectionSeeder.d.ts.map +1 -1
- package/dist/collection/CollectionSeeder.js +38 -1
- package/dist/collection/ElementInstaller.d.ts +31 -0
- package/dist/collection/ElementInstaller.d.ts.map +1 -1
- package/dist/collection/ElementInstaller.js +77 -15
- package/dist/collection/PersonaSubmitter.d.ts +1 -1
- package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
- package/dist/collection/PersonaSubmitter.js +2 -2
- package/dist/collection/index.d.ts +1 -0
- package/dist/collection/index.d.ts.map +1 -1
- package/dist/collection/index.js +2 -1
- package/dist/config/ConfigManager.d.ts +78 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +216 -0
- package/dist/config/element-types.d.ts +135 -0
- package/dist/config/element-types.d.ts.map +1 -0
- package/dist/config/element-types.js +108 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/portfolio-constants.d.ts +83 -0
- package/dist/config/portfolio-constants.d.ts.map +1 -0
- package/dist/config/portfolio-constants.js +99 -0
- package/dist/elements/BaseElement.d.ts +14 -2
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +88 -6
- package/dist/elements/agents/Agent.d.ts +10 -1
- package/dist/elements/agents/Agent.d.ts.map +1 -1
- package/dist/elements/agents/Agent.js +66 -19
- package/dist/elements/agents/AgentManager.d.ts +2 -0
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +12 -10
- package/dist/elements/skills/Skill.d.ts +10 -1
- package/dist/elements/skills/Skill.d.ts.map +1 -1
- package/dist/elements/skills/Skill.js +40 -3
- package/dist/elements/skills/SkillManager.d.ts +1 -0
- package/dist/elements/skills/SkillManager.d.ts.map +1 -1
- package/dist/elements/skills/SkillManager.js +10 -4
- package/dist/elements/templates/Template.d.ts +10 -1
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +35 -18
- package/dist/elements/templates/TemplateManager.d.ts +1 -1
- package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
- package/dist/elements/templates/TemplateManager.js +6 -5
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/index.barrel.d.ts +1 -2
- package/dist/index.barrel.d.ts.map +1 -1
- package/dist/index.barrel.js +2 -4
- package/dist/index.d.ts +143 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1883 -310
- package/dist/persona/PersonaElement.d.ts +10 -0
- package/dist/persona/PersonaElement.d.ts.map +1 -1
- package/dist/persona/PersonaElement.js +55 -32
- package/dist/persona/PersonaElementManager.d.ts.map +1 -1
- package/dist/persona/PersonaElementManager.js +13 -11
- package/dist/persona/PersonaLoader.d.ts.map +1 -1
- package/dist/persona/PersonaLoader.js +8 -2
- package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaImporter.js +24 -5
- package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
- package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaSharer.js +198 -22
- package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +499 -7
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
- package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
- package/dist/portfolio/MigrationManager.d.ts.map +1 -1
- package/dist/portfolio/MigrationManager.js +136 -3
- package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
- package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioIndexManager.js +478 -0
- package/dist/portfolio/PortfolioManager.d.ts +5 -0
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +61 -20
- package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioRepoManager.js +337 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
- package/dist/portfolio/UnifiedIndexManager.js +1434 -0
- package/dist/portfolio/index.d.ts +15 -0
- package/dist/portfolio/index.d.ts.map +1 -0
- package/dist/portfolio/index.js +15 -0
- package/dist/portfolio/types.d.ts +7 -0
- package/dist/portfolio/types.d.ts.map +1 -1
- package/dist/portfolio/types.js +6 -1
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +50 -48
- package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
- package/dist/security/audit/SecurityAuditor.js +17 -9
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +19 -3
- package/dist/security/contentValidator.d.ts +2 -0
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +115 -4
- package/dist/security/secureYamlParser.d.ts +1 -0
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +29 -7
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/security/tokenManager.d.ts +1 -1
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +30 -10
- package/dist/server/ServerSetup.d.ts +22 -2
- package/dist/server/ServerSetup.d.ts.map +1 -1
- package/dist/server/ServerSetup.js +77 -12
- package/dist/server/tools/AuthTools.d.ts.map +1 -1
- package/dist/server/tools/AuthTools.js +33 -1
- package/dist/server/tools/BuildInfoTools.d.ts +25 -0
- package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
- package/dist/server/tools/BuildInfoTools.js +36 -0
- package/dist/server/tools/CollectionTools.d.ts.map +1 -1
- package/dist/server/tools/CollectionTools.js +55 -46
- package/dist/server/tools/ConfigTools.d.ts.map +1 -1
- package/dist/server/tools/ConfigTools.js +29 -1
- package/dist/server/tools/PersonaTools.d.ts +4 -2
- package/dist/server/tools/PersonaTools.d.ts.map +1 -1
- package/dist/server/tools/PersonaTools.js +5 -152
- package/dist/server/tools/PortfolioTools.d.ts +12 -0
- package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
- package/dist/server/tools/PortfolioTools.js +221 -0
- package/dist/server/tools/index.d.ts +3 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +4 -2
- package/dist/server/types.d.ts +40 -5
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +1 -1
- package/dist/services/BuildInfoService.d.ts +84 -0
- package/dist/services/BuildInfoService.d.ts.map +1 -0
- package/dist/services/BuildInfoService.js +271 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
- package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
- package/dist/tools/portfolio/types.d.ts +41 -0
- package/dist/tools/portfolio/types.d.ts.map +1 -0
- package/dist/tools/portfolio/types.js +15 -0
- package/dist/types/collection.d.ts +51 -0
- package/dist/types/collection.d.ts.map +1 -1
- package/dist/types/collection.js +1 -1
- package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
- package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
- package/dist/utils/EarlyTerminationSearch.js +164 -0
- package/dist/utils/ErrorHandler.d.ts +86 -0
- package/dist/utils/ErrorHandler.d.ts.map +1 -0
- package/dist/utils/ErrorHandler.js +201 -0
- package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
- package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
- package/dist/utils/FileDiscoveryUtil.js +169 -0
- package/dist/utils/GitHubRateLimiter.d.ts +88 -0
- package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
- package/dist/utils/GitHubRateLimiter.js +315 -0
- package/dist/utils/PerformanceMonitor.d.ts +134 -0
- package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
- package/dist/utils/PerformanceMonitor.js +347 -0
- package/dist/utils/RateLimiter.d.ts.map +1 -0
- package/dist/utils/RateLimiter.js +172 -0
- package/dist/utils/SecureDownloader.d.ts +241 -0
- package/dist/utils/SecureDownloader.d.ts.map +1 -0
- package/dist/utils/SecureDownloader.js +759 -0
- package/dist/utils/ToolCache.d.ts +82 -0
- package/dist/utils/ToolCache.d.ts.map +1 -0
- package/dist/utils/ToolCache.js +196 -0
- package/dist/utils/errorCodes.d.ts +136 -0
- package/dist/utils/errorCodes.d.ts.map +1 -0
- package/dist/utils/errorCodes.js +87 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -1
- package/dist/utils/installation.d.ts +1 -1
- package/dist/utils/installation.d.ts.map +1 -1
- package/dist/utils/installation.js +9 -8
- package/dist/utils/searchUtils.d.ts +31 -0
- package/dist/utils/searchUtils.d.ts.map +1 -1
- package/dist/utils/searchUtils.js +62 -1
- package/package.json +17 -7
- package/dist/config/updateConfig.d.ts +0 -84
- package/dist/config/updateConfig.d.ts.map +0 -1
- package/dist/config/updateConfig.js +0 -148
- package/dist/server/tools/UpdateTools.d.ts +0 -10
- package/dist/server/tools/UpdateTools.d.ts.map +0 -1
- package/dist/server/tools/UpdateTools.js +0 -85
- package/dist/update/BackupManager.d.ts +0 -63
- package/dist/update/BackupManager.d.ts.map +0 -1
- package/dist/update/BackupManager.js +0 -370
- package/dist/update/DependencyChecker.d.ts +0 -41
- package/dist/update/DependencyChecker.d.ts.map +0 -1
- package/dist/update/DependencyChecker.js +0 -132
- package/dist/update/RateLimiter.d.ts.map +0 -1
- package/dist/update/RateLimiter.js +0 -172
- package/dist/update/SignatureVerifier.d.ts +0 -71
- package/dist/update/SignatureVerifier.d.ts.map +0 -1
- package/dist/update/SignatureVerifier.js +0 -214
- package/dist/update/UpdateChecker.d.ts +0 -132
- package/dist/update/UpdateChecker.d.ts.map +0 -1
- package/dist/update/UpdateChecker.js +0 -506
- package/dist/update/UpdateManager.d.ts +0 -60
- package/dist/update/UpdateManager.d.ts.map +0 -1
- package/dist/update/UpdateManager.js +0 -730
- package/dist/update/VersionManager.d.ts +0 -31
- package/dist/update/VersionManager.d.ts.map +0 -1
- package/dist/update/VersionManager.js +0 -181
- package/dist/update/index.d.ts +0 -9
- package/dist/update/index.d.ts.map +0 -1
- package/dist/update/index.js +0 -9
- /package/dist/{update → utils}/RateLimiter.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentManager.d.ts","sourceRoot":"","sources":["../../../src/elements/agents/AgentManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentManager.d.ts","sourceRoot":"","sources":["../../../src/elements/agents/AgentManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { promises as fs } from 'fs';
|
|
|
8
8
|
import * as path from 'path';
|
|
9
9
|
import { Agent } from './Agent.js';
|
|
10
10
|
import { ElementType } from '../../portfolio/types.js';
|
|
11
|
+
import { PortfolioManager } from '../../portfolio/PortfolioManager.js';
|
|
11
12
|
import { FileLockManager } from '../../security/fileLockManager.js';
|
|
12
13
|
import { SecureYamlParser } from '../../security/secureYamlParser.js';
|
|
13
14
|
import * as yaml from 'js-yaml';
|
|
@@ -24,8 +25,10 @@ const MAX_YAML_SIZE = 64 * 1024; // 64KB for frontmatter
|
|
|
24
25
|
export class AgentManager {
|
|
25
26
|
agentsPath;
|
|
26
27
|
stateCache = new Map();
|
|
28
|
+
portfolioManager;
|
|
27
29
|
constructor(portfolioPath) {
|
|
28
30
|
this.agentsPath = path.join(portfolioPath, ElementType.AGENT);
|
|
31
|
+
this.portfolioManager = PortfolioManager.getInstance();
|
|
29
32
|
}
|
|
30
33
|
/**
|
|
31
34
|
* Initialize the agents directory structure
|
|
@@ -135,7 +138,7 @@ export class AgentManager {
|
|
|
135
138
|
const state = await this.loadAgentState(sanitizedName);
|
|
136
139
|
if (state) {
|
|
137
140
|
agent.deserialize(JSON.stringify({
|
|
138
|
-
...JSON.parse(agent.
|
|
141
|
+
...JSON.parse(agent.serializeToJSON()),
|
|
139
142
|
state
|
|
140
143
|
}));
|
|
141
144
|
}
|
|
@@ -252,14 +255,12 @@ export class AgentManager {
|
|
|
252
255
|
}
|
|
253
256
|
/**
|
|
254
257
|
* List all agents
|
|
258
|
+
* SECURITY: Uses PortfolioManager.listElements() which filters test elements
|
|
255
259
|
*/
|
|
256
260
|
async list() {
|
|
257
261
|
try {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
const agentFiles = files.filter(file => file.endsWith(AGENT_FILE_EXTENSION) &&
|
|
261
|
-
!file.startsWith('.') &&
|
|
262
|
-
file !== STATE_DIRECTORY);
|
|
262
|
+
// Use PortfolioManager to get filtered list (excludes test elements)
|
|
263
|
+
const agentFiles = await this.portfolioManager.listElements(ElementType.AGENT);
|
|
263
264
|
// Load all agents
|
|
264
265
|
const agents = [];
|
|
265
266
|
for (const file of agentFiles) {
|
|
@@ -562,7 +563,7 @@ export class AgentManager {
|
|
|
562
563
|
const agent = new Agent(agentData.metadata);
|
|
563
564
|
if (agentData.state) {
|
|
564
565
|
agent.deserialize(JSON.stringify({
|
|
565
|
-
...JSON.parse(agent.
|
|
566
|
+
...JSON.parse(agent.serializeToJSON()),
|
|
566
567
|
state: agentData.state
|
|
567
568
|
}));
|
|
568
569
|
}
|
|
@@ -574,10 +575,11 @@ export class AgentManager {
|
|
|
574
575
|
*/
|
|
575
576
|
async exportElement(element, format) {
|
|
576
577
|
if (format === 'json') {
|
|
577
|
-
|
|
578
|
+
// Use serializeToJSON for JSON format to maintain backward compatibility
|
|
579
|
+
return element.serializeToJSON();
|
|
578
580
|
}
|
|
579
581
|
else {
|
|
580
|
-
// Export as markdown with YAML frontmatter
|
|
582
|
+
// Export as markdown with YAML frontmatter (default)
|
|
581
583
|
const content = `# ${element.metadata.name}\n\n${element.metadata.description || ''}`;
|
|
582
584
|
return this.serializeToFile(element, content);
|
|
583
585
|
}
|
|
@@ -612,4 +614,4 @@ export class AgentManager {
|
|
|
612
614
|
return agent;
|
|
613
615
|
}
|
|
614
616
|
}
|
|
615
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR25DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsWUFBWTtBQUNaLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0FBQ25DLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQztBQUNqQyxNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztBQUMzQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsUUFBUTtBQUMxQyxNQUFNLGFBQWEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsdUJBQXVCO0FBZXhELE1BQU0sT0FBTyxZQUFZO0lBQ04sVUFBVSxDQUFTO0lBQ25CLFVBQVUsR0FBNEIsSUFBSSxHQUFHLEVBQUUsQ0FB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Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWdlbnRNYW5hZ2VyIC0gSGFuZGxlcyBDUlVEIG9wZXJhdGlvbnMgZm9yIEFnZW50IGVsZW1lbnRzXG4gKiBGb2xsb3dzIHBhdHRlcm5zIGZyb20gUGVyc29uYUVsZW1lbnRNYW5hZ2VyIGFuZCBNZW1vcnlNYW5hZ2VyXG4gKiBcbiAqIFNFQ1VSSVRZOiBVc2VzIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIG9wZXJhdGlvbnMgYW5kIFNlY3VyZVlhbWxQYXJzZXIgZm9yIHNhZmUgWUFNTCBwYXJzaW5nXG4gKi9cblxuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICcuL0FnZW50LmpzJztcbmltcG9ydCB7IEFnZW50TWV0YWRhdGEsIEFnZW50U3RhdGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IElFbGVtZW50TWFuYWdlciwgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuXG4vLyBDb25zdGFudHNcbmNvbnN0IEFHRU5UX0ZJTEVfRVhURU5TSU9OID0gJy5tZCc7XG5jb25zdCBTVEFURV9ESVJFQ1RPUlkgPSAnLnN0YXRlJztcbmNvbnN0IFNUQVRFX0ZJTEVfRVhURU5TSU9OID0gJy5zdGF0ZS55YW1sJztcbmNvbnN0IE1BWF9GSUxFX1NJWkUgPSAxMDAgKiAxMDI0OyAvLyAxMDBLQlxuY29uc3QgTUFYX1lBTUxfU0laRSA9IDY0ICogMTAyNDsgLy8gNjRLQiBmb3IgZnJvbnRtYXR0ZXJcblxuLy8gRWxlbWVudCBjcmVhdGlvbiByZXN1bHQgaW50ZXJmYWNlXG5pbnRlcmZhY2UgRWxlbWVudENyZWF0aW9uUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBlbGVtZW50PzogQWdlbnQ7XG59XG5cbmludGVyZmFjZSBBZ2VudEZpbGVEYXRhIHtcbiAgbWV0YWRhdGE6IEFnZW50TWV0YWRhdGE7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgc3RhdGU/OiBBZ2VudFN0YXRlO1xufVxuXG5leHBvcnQgY2xhc3MgQWdlbnRNYW5hZ2VyIGltcGxlbWVudHMgSUVsZW1lbnRNYW5hZ2VyPEFnZW50PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWdlbnRzUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlQ2FjaGU6IE1hcDxzdHJpbmcsIEFnZW50U3RhdGU+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKHBvcnRmb2xpb1BhdGg6IHN0cmluZykge1xuICAgIHRoaXMuYWdlbnRzUGF0aCA9IHBhdGguam9pbihwb3J0Zm9saW9QYXRoLCBFbGVtZW50VHlwZS5BR0VOVCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYWdlbnRzIGRpcmVjdG9yeSBzdHJ1Y3R1cmVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYWdlbnRzIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLmFnZW50c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgLnN0YXRlIGRpcmVjdG9yeSBmb3IgYWdlbnQgc3RhdGVzXG4gICAgICBjb25zdCBzdGF0ZVBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBTVEFURV9ESVJFQ1RPUlkpO1xuICAgICAgYXdhaXQgZnMubWtkaXIoc3RhdGVQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmluZm8oJ0FnZW50TWFuYWdlciBpbml0aWFsaXplZCcsIHsgcGF0aDogdGhpcy5hZ2VudHNQYXRoIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIEFnZW50TWFuYWdlcicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYWdlbnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUGFydGlhbDxBZ2VudE1ldGFkYXRhPlxuICApOiBQcm9taXNlPEVsZW1lbnRDcmVhdGlvblJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBTYW5pdGl6ZSBpbnB1dHNcbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkRGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKTtcbiAgICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNvbnRlbnQpLm5vcm1hbGl6ZWRDb250ZW50LCA1MDAwMCk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIG5hbWVcbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZUVsZW1lbnROYW1lKHNhbml0aXplZE5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgYWdlbnQgbmFtZS4gVXNlIG9ubHkgbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzLidcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgYWdlbnQgYWxyZWFkeSBleGlzdHNcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgZmlsZW5hbWUpO1xuXG4gICAgICAvLyBDcmVhdGUgYWdlbnQgaW5zdGFuY2VcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgICAgbmFtZTogc2FuaXRpemVkTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uLFxuICAgICAgICAuLi5tZXRhZGF0YVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBhdXRob3JcbiAgICAgIGFnZW50Lm1ldGFkYXRhLmF1dGhvciA9IHRoaXMuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpO1xuXG4gICAgICAvLyBQcmVwYXJlIGZpbGUgY29udGVudFxuICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSB0aGlzLnNlcmlhbGl6ZVRvRmlsZShhZ2VudCwgc2FuaXRpemVkQ29udGVudCk7XG5cbiAgICAgIC8vIFNFQ1VSSVRZIEZJWDogVXNlIGF0b21pYyBmaWxlIGNyZWF0aW9uIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgICAvLyBQcmV2aW91c2x5OiBVc2VkIGFjY2VzcygpIGNoZWNrIGZvbGxvd2VkIGJ5IHdyaXRlLCB3aGljaCBjb3VsZCByYWNlXG4gICAgICAvLyBOb3c6IFVzZSBleGNsdXNpdmUgZmlsZSBjcmVhdGlvbiB0aGF0IGZhaWxzIGF0b21pY2FsbHkgaWYgZmlsZSBleGlzdHNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZkID0gYXdhaXQgZnMub3BlbihmaWxlcGF0aCwgJ3d4Jyk7IC8vICd3eCcgPSBleGNsdXNpdmUgd3JpdGUsIGZhaWxzIGlmIGV4aXN0c1xuICAgICAgICBhd2FpdCBmZC53cml0ZUZpbGUoZmlsZUNvbnRlbnQsICd1dGYtOCcpO1xuICAgICAgICBhd2FpdCBmZC5jbG9zZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VFWElTVCcpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuY3JlYXRlJyxcbiAgICAgICAgZGV0YWlsczogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBjcmVhdGVkYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgYWdlbnRJZDogYWdlbnQuaWQgfVxuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBBZ2VudCBjcmVhdGVkOiAke3Nhbml0aXplZE5hbWV9YCk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGDwn6SWICoqJHtzYW5pdGl6ZWROYW1lfSoqIGJ5ICR7YWdlbnQubWV0YWRhdGEuYXV0aG9yIHx8ICdhbm9ueW1vdXMnfWAsXG4gICAgICAgIGVsZW1lbnQ6IGFnZW50XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYWdlbnQnLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnRmFpbGVkIHRvIGNyZWF0ZSBhZ2VudCdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW4gYWdlbnQgYnkgbmFtZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudCB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgZmlsZW5hbWUpO1xuXG4gICAgICAvLyBSZWFkIGZpbGUgd2l0aCBsb2NrXG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKGZpbGVwYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBmaWxlIHNpemVcbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IE1BWF9GSUxFX1NJWkUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZ2VudCBmaWxlIGV4Y2VlZHMgbWF4aW11bSBzaXplIG9mICR7TUFYX0ZJTEVfU0laRX0gYnl0ZXNgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFyc2UgZmlsZVxuICAgICAgY29uc3QgYWdlbnREYXRhID0gdGhpcy5wYXJzZUFnZW50RmlsZShjb250ZW50KTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGFnZW50IGluc3RhbmNlIC0gZW5zdXJlIG1ldGFkYXRhIGlzIHBhc3NlZCBjb3JyZWN0bHlcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KGFnZW50RGF0YS5tZXRhZGF0YSk7XG4gICAgICBcbiAgICAgIC8vIExvYWQgc3RhdGUgaWYgYXZhaWxhYmxlXG4gICAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHRoaXMubG9hZEFnZW50U3RhdGUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgYWdlbnQuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIC4uLkpTT04ucGFyc2UoYWdlbnQuc2VyaWFsaXplKCkpLFxuICAgICAgICAgIHN0YXRlXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byByZWFkIGFnZW50OiAke25hbWV9YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBhZ2VudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlczogUGFydGlhbDxBZ2VudE1ldGFkYXRhPixcbiAgICBjb250ZW50Pzogc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEFnZW50IG5vdCBmb3VuZCBmb3IgdXBkYXRlOiAke25hbWV9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgbWV0YWRhdGEgdXBkYXRlc1xuICAgICAgaWYgKHVwZGF0ZXMuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoXG4gICAgICAgICAgVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodXBkYXRlcy5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgICAgNTAwXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh1cGRhdGVzLnNwZWNpYWxpemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgICBzcGVjaWFsaXphdGlvbnM6IHVwZGF0ZXMuc3BlY2lhbGl6YXRpb25zLm1hcCgoczogc3RyaW5nKSA9PiBzYW5pdGl6ZUlucHV0KHMsIDUwKSlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgICAgZGVjaXNpb25GcmFtZXdvcms6IHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwZGF0ZXMucmlza1RvbGVyYW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgICByaXNrVG9sZXJhbmNlOiB1cGRhdGVzLnJpc2tUb2xlcmFuY2VcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIG1vZGlmaWNhdGlvbiB0aW1lXG4gICAgICBhZ2VudC5tZXRhZGF0YS5tb2RpZmllZCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgICAgLy8gR2V0IGN1cnJlbnQgY29udGVudCBpZiBub3QgcHJvdmlkZWRcbiAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKG5hbWUpO1xuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIGZpbGVuYW1lKTtcbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoZmlsZXBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VBZ2VudEZpbGUoZmlsZUNvbnRlbnQpO1xuICAgICAgICBjb250ZW50ID0gcGFyc2VkLmNvbnRlbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgYWdlbnRcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShuYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgZmlsZW5hbWUpO1xuICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSB0aGlzLnNlcmlhbGl6ZVRvRmlsZShhZ2VudCwgY29udGVudCk7XG4gICAgICBcbiAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoZmlsZXBhdGgsIGZpbGVDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICAvLyBTYXZlIHN0YXRlIGlmIG5lZWRlZFxuICAgICAgaWYgKGFnZW50Lm5lZWRzU3RhdGVQZXJzaXN0ZW5jZSgpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZUFnZW50U3RhdGUobmFtZSwgYWdlbnQuZ2V0U3RhdGUoKSk7XG4gICAgICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhgQWdlbnQgdXBkYXRlZDogJHtuYW1lfWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHVwZGF0ZSBhZ2VudDogJHtuYW1lfWAsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGFnZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpO1xuICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBmaWxlbmFtZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZXBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIG1haW4gZmlsZVxuICAgICAgYXdhaXQgZnMudW5saW5rKGZpbGVwYXRoKTtcblxuICAgICAgLy8gRGVsZXRlIHN0YXRlIGZpbGUgaWYgZXhpc3RzXG4gICAgICBjb25zdCBzdGF0ZUZpbGVuYW1lID0gYCR7c2FuaXRpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWA7XG4gICAgICBjb25zdCBzdGF0ZUZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgU1RBVEVfRElSRUNUT1JZLCBzdGF0ZUZpbGVuYW1lKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnVubGluayhzdGF0ZUZpbGVwYXRoKTtcbiAgICAgICAgdGhpcy5zdGF0ZUNhY2hlLmRlbGV0ZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTdGF0ZSBmaWxlIG1pZ2h0IG5vdCBleGlzdFxuICAgICAgfVxuXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgZGVsZXRlZGBcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuaW5mbyhgQWdlbnQgZGVsZXRlZDogJHtzYW5pdGl6ZWROYW1lfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgYWdlbnQ6ICR7bmFtZX1gLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgYWdlbnRzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdCgpOiBQcm9taXNlPEFnZW50W10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHRoaXMuYWdlbnRzUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIEZpbHRlciBmb3IgYWdlbnQgZmlsZXNcbiAgICAgIGNvbnN0IGFnZW50RmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiBcbiAgICAgICAgZmlsZS5lbmRzV2l0aChBR0VOVF9GSUxFX0VYVEVOU0lPTikgJiYgXG4gICAgICAgICFmaWxlLnN0YXJ0c1dpdGgoJy4nKSAmJlxuICAgICAgICBmaWxlICE9PSBTVEFURV9ESVJFQ1RPUllcbiAgICAgICk7XG5cbiAgICAgIC8vIExvYWQgYWxsIGFnZW50c1xuICAgICAgY29uc3QgYWdlbnRzOiBBZ2VudFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYWdlbnRGaWxlcykge1xuICAgICAgICBjb25zdCBuYW1lID0gZmlsZS5zdWJzdHJpbmcoMCwgZmlsZS5sZW5ndGggLSBBR0VOVF9GSUxFX0VYVEVOU0lPTi5sZW5ndGgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgICAgIGlmIChhZ2VudCkge1xuICAgICAgICAgICAgYWdlbnRzLnB1c2goYWdlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGxvYWQgYWdlbnQgJHtuYW1lfTpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhZ2VudHM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEhhbmRsZSBtaXNzaW5nIGRpcmVjdG9yeSBncmFjZWZ1bGx5IHdpdGggdHlwZS1zYWZlIGNoZWNrXG4gICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdBZ2VudHMgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IHlldCwgcmV0dXJuaW5nIGVtcHR5IGFycmF5Jyk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGxpc3QgYWdlbnRzJywgZXJyb3IpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhZ2VudCBleGlzdHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleGlzdHMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIGZpbGVuYW1lKTtcbiAgICAgIFxuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVwYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBhZ2VudCBuYW1lXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVOYW1lKG5hbWU6IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICAgIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBiZSBlbXB0eScgfTtcbiAgICB9XG5cbiAgICBpZiAobmFtZS5sZW5ndGggPiAxMDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBleGNlZWQgMTAwIGNoYXJhY3RlcnMnIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRWxlbWVudE5hbWUobmFtZSkpIHtcbiAgICAgIHJldHVybiB7IFxuICAgICAgICB2YWxpZDogZmFsc2UsIFxuICAgICAgICBlcnJvcjogJ05hbWUgY2FuIG9ubHkgY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMnIFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbGVtZW50IHR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRFbGVtZW50VHlwZSgpOiBFbGVtZW50VHlwZSB7XG4gICAgcmV0dXJuIEVsZW1lbnRUeXBlLkFHRU5UO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYWdlbnQgc3RhdGUgZnJvbSBmaWxlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRBZ2VudFN0YXRlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnRTdGF0ZSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICAgIGlmICh0aGlzLnN0YXRlQ2FjaGUuaGFzKG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlQ2FjaGUuZ2V0KG5hbWUpITtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhdGVGaWxlbmFtZSA9IGAke25hbWV9JHtTVEFURV9GSUxFX0VYVEVOU0lPTn1gO1xuICAgICAgY29uc3Qgc3RhdGVGaWxlcGF0aCA9IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIFNUQVRFX0RJUkVDVE9SWSwgc3RhdGVGaWxlbmFtZSk7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoc3RhdGVGaWxlcGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICAgIFxuICAgICAgLy8gUGFyc2UgWUFNTCBzYWZlbHlcbiAgICAgIGNvbnN0IHBhcnNlZENvbnRlbnQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGNvbnRlbnQsIHtcbiAgICAgICAgbWF4WWFtbFNpemU6IE1BWF9ZQU1MX1NJWkUsXG4gICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjb25zdCBzdGF0ZSA9IHBhcnNlZENvbnRlbnQuZGF0YSBhcyBhbnk7XG4gICAgICBcbiAgICAgIC8vIENvbnZlcnQgc3RyaW5nIG51bWJlcnMgYmFjayB0byBudW1iZXJzXG4gICAgICBpZiAoc3RhdGUuc2Vzc2lvbkNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhdGUuc2Vzc2lvbkNvdW50ID0gcGFyc2VJbnQoc3RhdGUuc2Vzc2lvbkNvdW50LCAxMCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENvbnZlcnQgZ29hbCBudW1iZXJzXG4gICAgICBpZiAoc3RhdGUuZ29hbHMpIHtcbiAgICAgICAgc3RhdGUuZ29hbHMuZm9yRWFjaCgoZ29hbDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGdvYWwuaW1wb3J0YW5jZSAhPT0gdW5kZWZpbmVkKSBnb2FsLmltcG9ydGFuY2UgPSBwYXJzZUludChnb2FsLmltcG9ydGFuY2UsIDEwKTtcbiAgICAgICAgICBpZiAoZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQpIGdvYWwudXJnZW5jeSA9IHBhcnNlSW50KGdvYWwudXJnZW5jeSwgMTApO1xuICAgICAgICAgIGlmIChnb2FsLmVzdGltYXRlZEVmZm9ydCAhPT0gdW5kZWZpbmVkKSBnb2FsLmVzdGltYXRlZEVmZm9ydCA9IHBhcnNlRmxvYXQoZ29hbC5lc3RpbWF0ZWRFZmZvcnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ29udmVydCBkZWNpc2lvbiBjb25maWRlbmNlXG4gICAgICBpZiAoc3RhdGUuZGVjaXNpb25zKSB7XG4gICAgICAgIHN0YXRlLmRlY2lzaW9ucy5mb3JFYWNoKChkZWNpc2lvbjogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGRlY2lzaW9uLmNvbmZpZGVuY2UgIT09IHVuZGVmaW5lZCkgZGVjaXNpb24uY29uZmlkZW5jZSA9IHBhcnNlRmxvYXQoZGVjaXNpb24uY29uZmlkZW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWNoZSB0aGUgc3RhdGVcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQobmFtZSwgc3RhdGUpO1xuXG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgYWdlbnQgc3RhdGU6ICR7bmFtZX1gLCBlcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhZ2VudCBzdGF0ZSB0byBmaWxlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZUFnZW50U3RhdGUobmFtZTogc3RyaW5nLCBzdGF0ZTogQWdlbnRTdGF0ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0ZUZpbGVuYW1lID0gYCR7bmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWA7XG4gICAgICBjb25zdCBzdGF0ZUZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgU1RBVEVfRElSRUNUT1JZLCBzdGF0ZUZpbGVuYW1lKTtcblxuICAgICAgLy8gQ29udmVydCBkYXRlcyB0byBJU08gc3RyaW5ncyBhbmQgbnVtYmVycyB0byBzdHJpbmdzIGZvciBGQUlMU0FGRV9TQ0hFTUFcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGxhc3RBY3RpdmU6IHN0YXRlLmxhc3RBY3RpdmUgaW5zdGFuY2VvZiBEYXRlID8gc3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpIDogc3RhdGUubGFzdEFjdGl2ZSxcbiAgICAgICAgc2Vzc2lvbkNvdW50OiBTdHJpbmcoc3RhdGUuc2Vzc2lvbkNvdW50KSxcbiAgICAgICAgZ29hbHM6IHN0YXRlLmdvYWxzLm1hcChnb2FsID0+ICh7XG4gICAgICAgICAgLi4uZ29hbCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGdvYWwuY3JlYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLmNyZWF0ZWRBdCxcbiAgICAgICAgICB1cGRhdGVkQXQ6IGdvYWwudXBkYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLnVwZGF0ZWRBdCxcbiAgICAgICAgICBjb21wbGV0ZWRBdDogZ29hbC5jb21wbGV0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBnb2FsLmNvbXBsZXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLmNvbXBsZXRlZEF0LFxuICAgICAgICAgIGltcG9ydGFuY2U6IGdvYWwuaW1wb3J0YW5jZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGdvYWwuaW1wb3J0YW5jZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdXJnZW5jeTogZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC51cmdlbmN5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGdvYWwuZXN0aW1hdGVkRWZmb3J0ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5lc3RpbWF0ZWRFZmZvcnQpIDogdW5kZWZpbmVkXG4gICAgICAgIH0pKSxcbiAgICAgICAgZGVjaXNpb25zOiBzdGF0ZS5kZWNpc2lvbnMubWFwKGRlY2lzaW9uID0+ICh7XG4gICAgICAgICAgLi4uZGVjaXNpb24sXG4gICAgICAgICAgdGltZXN0YW1wOiBkZWNpc2lvbi50aW1lc3RhbXAgaW5zdGFuY2VvZiBEYXRlID8gZGVjaXNpb24udGltZXN0YW1wLnRvSVNPU3RyaW5nKCkgOiBkZWNpc2lvbi50aW1lc3RhbXAsXG4gICAgICAgICAgY29uZmlkZW5jZTogZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGRlY2lzaW9uLmNvbmZpZGVuY2UpIDogdW5kZWZpbmVkXG4gICAgICAgIH0pKVxuICAgICAgfTtcblxuICAgICAgLy8gQ29udmVydCBzdGF0ZSB0byBZQU1MXG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChzZXJpYWxpemVkU3RhdGUsIHtcbiAgICAgICAgc2NoZW1hOiB5YW1sLkZBSUxTQUZFX1NDSEVNQSxcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHNpemVcbiAgICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPiBNQVhfWUFNTF9TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdGUgc2l6ZSBleGNlZWRzIG1heGltdW0gb2YgJHtNQVhfWUFNTF9TSVpFfSBieXRlc2ApO1xuICAgICAgfVxuXG4gICAgICAvLyBXcml0ZSBhdG9taWNhbGx5XG4gICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKHN0YXRlRmlsZXBhdGgsIHlhbWxDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICAvLyBVcGRhdGUgY2FjaGVcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQobmFtZSwgc3RhdGUpO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYEFnZW50IHN0YXRlIHNhdmVkOiAke25hbWV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHNhdmUgYWdlbnQgc3RhdGU6ICR7bmFtZX1gLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYWdlbnQgZmlsZSBjb250ZW50XG4gICAqL1xuICBwcml2YXRlIHBhcnNlQWdlbnRGaWxlKGNvbnRlbnQ6IHN0cmluZyk6IEFnZW50RmlsZURhdGEge1xuICAgIC8vIEV4dHJhY3QgZnJvbnRtYXR0ZXIgYW5kIGNvbnRlbnRcbiAgICBjb25zdCBmcm9udG1hdHRlclJlZ2V4ID0gL14tLS1cXG4oW1xcc1xcU10qPylcXG4tLS1cXG4oW1xcc1xcU10qKSQvO1xuICAgIGNvbnN0IG1hdGNoID0gY29udGVudC5tYXRjaChmcm9udG1hdHRlclJlZ2V4KTtcblxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhZ2VudCBmaWxlIGZvcm1hdCAtIG1pc3NpbmcgZnJvbnRtYXR0ZXInKTtcbiAgICB9XG5cbiAgICBjb25zdCBbLCBmcm9udG1hdHRlciwgYm9keV0gPSBtYXRjaDtcblxuICAgIC8vIFBhcnNlIGZyb250bWF0dGVyIC0gU2VjdXJlWWFtbFBhcnNlciBleHBlY3RzIGZ1bGwgY29udGVudCB3aXRoIGZyb250bWF0dGVyIG1hcmtlcnNcbiAgICAvLyBidXQgd2UncmUgcGFzc2luZyBqdXN0IHRoZSBZQU1MIGNvbnRlbnQsIHNvIHdlIG5lZWQgdG8gcGFyc2UgaXQgZGlyZWN0bHlcbiAgICBjb25zdCBwYXJzZWRZYW1sID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShgLS0tXFxuJHtmcm9udG1hdHRlcn1cXG4tLS1gLCB7XG4gICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UgIC8vIFdlJ2xsIHZhbGlkYXRlIGJvZHkgc2VwYXJhdGVseVxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VkWWFtbC5kYXRhIGFzIHVua25vd24gYXMgQWdlbnRNZXRhZGF0YTtcblxuICAgIC8vIFZhbGlkYXRlIHR5cGUgaWYgdXNpbmcgdGhlIHR5cGVkIG1ldGFkYXRhXG4gICAgY29uc3QgdHlwZWRNZXRhZGF0YSA9IG1ldGFkYXRhIGFzIGFueTtcbiAgICBpZiAodHlwZWRNZXRhZGF0YS50eXBlICYmIHR5cGVkTWV0YWRhdGEudHlwZSAhPT0gRWxlbWVudFR5cGUuQUdFTlQgJiYgdHlwZWRNZXRhZGF0YS50eXBlICE9PSAnYWdlbnQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCB0eXBlOiBleHBlY3RlZCAnJHtFbGVtZW50VHlwZS5BR0VOVH0nLCBnb3QgJyR7dHlwZWRNZXRhZGF0YS50eXBlfSdgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGEsXG4gICAgICBjb250ZW50OiBib2R5LnRyaW0oKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIGFnZW50IHRvIGZpbGUgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIHNlcmlhbGl6ZVRvRmlsZShhZ2VudDogQWdlbnQsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YWRhdGE6IGFueSA9IHtcbiAgICAgIG5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICB0eXBlOiBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICBhdXRob3I6IGFnZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IGFnZW50Lm1ldGFkYXRhLmNyZWF0ZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgbW9kaWZpZWQ6IGFnZW50Lm1ldGFkYXRhLm1vZGlmaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIGRlY2lzaW9uRnJhbWV3b3JrOiBhZ2VudC5leHRlbnNpb25zPy5kZWNpc2lvbkZyYW1ld29yayxcbiAgICAgIHJpc2tUb2xlcmFuY2U6IGFnZW50LmV4dGVuc2lvbnM/LnJpc2tUb2xlcmFuY2UsXG4gICAgICBsZWFybmluZ0VuYWJsZWQ6IGFnZW50LmV4dGVuc2lvbnM/LmxlYXJuaW5nRW5hYmxlZCAhPT0gdW5kZWZpbmVkID8gXG4gICAgICAgIFN0cmluZyhhZ2VudC5leHRlbnNpb25zLmxlYXJuaW5nRW5hYmxlZCkgOiB1bmRlZmluZWQsXG4gICAgICBtYXhDb25jdXJyZW50R29hbHM6IChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhKS5tYXhDb25jdXJyZW50R29hbHMsXG4gICAgICBzcGVjaWFsaXphdGlvbnM6IGFnZW50LmV4dGVuc2lvbnM/LnNwZWNpYWxpemF0aW9uc1xuICAgIH07XG5cbiAgICAvLyBSZW1vdmUgdW5kZWZpbmVkIHZhbHVlc1xuICAgIE9iamVjdC5rZXlzKG1ldGFkYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAobWV0YWRhdGFba2V5IGFzIGtleW9mIHR5cGVvZiBtZXRhZGF0YV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgbWV0YWRhdGFba2V5IGFzIGtleW9mIHR5cGVvZiBtZXRhZGF0YV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChtZXRhZGF0YSwge1xuICAgICAgc2NoZW1hOiB5YW1sLkZBSUxTQUZFX1NDSEVNQSxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIGAtLS1cXG4ke3lhbWxDb250ZW50fS0tLVxcblxcbiR7Y29udGVudH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaWxlbmFtZSBmb3IgYWdlbnRcbiAgICovXG4gIHByaXZhdGUgZ2V0RmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ke0FHRU5UX0ZJTEVfRVhURU5TSU9OfWA7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZWxlbWVudCBuYW1lXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRWxlbWVudE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gT25seSBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXNcbiAgICByZXR1cm4gL15bYS16QS1aMC05Xy1dKyQvLnRlc3QobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBmb3IgYXR0cmlidXRpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiB8fCAnYW5vbnltb3VzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGFnZW50IGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZpbmQocHJlZGljYXRlOiAoZWxlbWVudDogQWdlbnQpID0+IGJvb2xlYW4pOiBQcm9taXNlPEFnZW50IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGFnZW50cy5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtYW55IGFnZW50cyBieSBwcmVkaWNhdGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBmaW5kTWFueShwcmVkaWNhdGU6IChlbGVtZW50OiBBZ2VudCkgPT4gYm9vbGVhbik6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBhZ2VudHMuZmlsdGVyKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gYWdlbnRcbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZShlbGVtZW50OiBBZ2VudCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gZWxlbWVudC52YWxpZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgcGF0aFxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlUGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWxcbiAgICBpZiAocGF0aC5pbmNsdWRlcygnLi4nKSB8fCBwYXRoLmluY2x1ZGVzKCd+JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZm9yIGFic29sdXRlIHBhdGhzXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnLycpIHx8IHBhdGgubWF0Y2goL15bQS1aYS16XTovKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmlsZSBleHRlbnNpb25cbiAgICovXG4gIHB1YmxpYyBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFHRU5UX0ZJTEVfRVhURU5TSU9OO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBhZ2VudCBmcm9tIGRhdGFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0PzogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8QWdlbnQ+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChwYXJzZWQubWV0YWRhdGEpO1xuICAgICAgaWYgKHBhcnNlZC5zdGF0ZSkge1xuICAgICAgICBhZ2VudC5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeShwYXJzZWQpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUGFyc2UgYXMgbWFya2Rvd24gd2l0aCBZQU1MIGZyb250bWF0dGVyXG4gICAgICBjb25zdCBhZ2VudERhdGEgPSB0aGlzLnBhcnNlQWdlbnRGaWxlKGRhdGEpO1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQoYWdlbnREYXRhLm1ldGFkYXRhKTtcbiAgICAgIGlmIChhZ2VudERhdGEuc3RhdGUpIHtcbiAgICAgICAgYWdlbnQuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIC4uLkpTT04ucGFyc2UoYWdlbnQuc2VyaWFsaXplKCkpLFxuICAgICAgICAgIHN0YXRlOiBhZ2VudERhdGEuc3RhdGVcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gYWdlbnQgdG8gYSBmb3JtYXRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleHBvcnRFbGVtZW50KGVsZW1lbnQ6IEFnZW50LCBmb3JtYXQ/OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LnNlcmlhbGl6ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFeHBvcnQgYXMgbWFya2Rvd24gd2l0aCBZQU1MIGZyb250bWF0dGVyXG4gICAgICBjb25zdCBjb250ZW50ID0gYCMgJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9XFxuXFxuJHtlbGVtZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnfWA7XG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVUb0ZpbGUoZWxlbWVudCwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYW4gYWdlbnQgdG8gYSBzcGVjaWZpYyBwYXRoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZShlbGVtZW50OiBBZ2VudCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmFtZSA9IHRhcmdldFBhdGgucmVwbGFjZShBR0VOVF9GSUxFX0VYVEVOU0lPTiwgJycpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBgIyAke2VsZW1lbnQubWV0YWRhdGEubmFtZX1cXG5cXG4ke2VsZW1lbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgJyd9YDtcbiAgICBcbiAgICAvLyBTYXZlIHRoZSBhZ2VudCBmaWxlXG4gICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKG5hbWUpO1xuICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5pc0Fic29sdXRlKHRhcmdldFBhdGgpID8gdGFyZ2V0UGF0aCA6IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIGZpbGVuYW1lKTtcbiAgICBjb25zdCBmaWxlQ29udGVudCA9IHRoaXMuc2VyaWFsaXplVG9GaWxlKGVsZW1lbnQsIGNvbnRlbnQpO1xuICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoZmlsZXBhdGgsIGZpbGVDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgLy8gU2F2ZSBzdGF0ZSBpZiBuZWVkZWRcbiAgICBpZiAoZWxlbWVudC5uZWVkc1N0YXRlUGVyc2lzdGVuY2UoKSkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZShuYW1lLCBlbGVtZW50LmdldFN0YXRlKCkpO1xuICAgICAgZWxlbWVudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBhZ2VudCBmcm9tIGEgc3BlY2lmaWMgcGF0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWQodGFyZ2V0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHRhcmdldFBhdGgucmVwbGFjZShBR0VOVF9GSUxFX0VYVEVOU0lPTiwgJycpKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBTRUNVUklUWSBGSVggIzIwNjogRG9uJ3QgZXhwb3NlIGZpbGUgcGF0aHMgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgIGxvZ2dlci5lcnJvcignQWdlbnQgbm90IGZvdW5kJywgeyBwYXRoOiB0YXJnZXRQYXRoIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZ2VudCBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGFnZW50O1xuICB9XG59Il19
|
|
617
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR25DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsWUFBWTtBQUNaLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0FBQ25DLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQztBQUNqQyxNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztBQUMzQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsUUFBUTtBQUMxQyxNQUFNLGFBQWEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsdUJBQXVCO0FBZXhELE1BQU0sT0FBTyxZQUFZO0lBQ04s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WyIvKipcbiAqIEFnZW50TWFuYWdlciAtIEhhbmRsZXMgQ1JVRCBvcGVyYXRpb25zIGZvciBBZ2VudCBlbGVtZW50c1xuICogRm9sbG93cyBwYXR0ZXJucyBmcm9tIFBlcnNvbmFFbGVtZW50TWFuYWdlciBhbmQgTWVtb3J5TWFuYWdlclxuICogXG4gKiBTRUNVUklUWTogVXNlcyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyBvcGVyYXRpb25zIGFuZCBTZWN1cmVZYW1sUGFyc2VyIGZvciBzYWZlIFlBTUwgcGFyc2luZ1xuICovXG5cbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi9BZ2VudC5qcyc7XG5pbXBvcnQgeyBBZ2VudE1ldGFkYXRhLCBBZ2VudFN0YXRlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIsIEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvaW5kZXguanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbi8vIENvbnN0YW50c1xuY29uc3QgQUdFTlRfRklMRV9FWFRFTlNJT04gPSAnLm1kJztcbmNvbnN0IFNUQVRFX0RJUkVDVE9SWSA9ICcuc3RhdGUnO1xuY29uc3QgU1RBVEVfRklMRV9FWFRFTlNJT04gPSAnLnN0YXRlLnlhbWwnO1xuY29uc3QgTUFYX0ZJTEVfU0laRSA9IDEwMCAqIDEwMjQ7IC8vIDEwMEtCXG5jb25zdCBNQVhfWUFNTF9TSVpFID0gNjQgKiAxMDI0OyAvLyA2NEtCIGZvciBmcm9udG1hdHRlclxuXG4vLyBFbGVtZW50IGNyZWF0aW9uIHJlc3VsdCBpbnRlcmZhY2VcbmludGVyZmFjZSBFbGVtZW50Q3JlYXRpb25SZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGVsZW1lbnQ/OiBBZ2VudDtcbn1cblxuaW50ZXJmYWNlIEFnZW50RmlsZURhdGEge1xuICBtZXRhZGF0YTogQWdlbnRNZXRhZGF0YTtcbiAgY29udGVudDogc3RyaW5nO1xuICBzdGF0ZT86IEFnZW50U3RhdGU7XG59XG5cbmV4cG9ydCBjbGFzcyBBZ2VudE1hbmFnZXIgaW1wbGVtZW50cyBJRWxlbWVudE1hbmFnZXI8QWdlbnQ+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhZ2VudHNQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVDYWNoZTogTWFwPHN0cmluZywgQWdlbnRTdGF0ZT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcblxuICBjb25zdHJ1Y3Rvcihwb3J0Zm9saW9QYXRoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFnZW50c1BhdGggPSBwYXRoLmpvaW4ocG9ydGZvbGlvUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQpO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBhZ2VudHMgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhZ2VudHMgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGF3YWl0IGZzLm1rZGlyKHRoaXMuYWdlbnRzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSAuc3RhdGUgZGlyZWN0b3J5IGZvciBhZ2VudCBzdGF0ZXNcbiAgICAgIGNvbnN0IHN0YXRlUGF0aCA9IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIFNUQVRFX0RJUkVDVE9SWSk7XG4gICAgICBhd2FpdCBmcy5ta2RpcihzdGF0ZVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbygnQWdlbnRNYW5hZ2VyIGluaXRpYWxpemVkJywgeyBwYXRoOiB0aGlzLmFnZW50c1BhdGggfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgQWdlbnRNYW5hZ2VyJywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBhZ2VudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBQYXJ0aWFsPEFnZW50TWV0YWRhdGE+XG4gICk6IFByb21pc2U8RWxlbWVudENyZWF0aW9uUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNhbml0aXplIGlucHV0c1xuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWREZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZGVzY3JpcHRpb24pLm5vcm1hbGl6ZWRDb250ZW50LCA1MDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoY29udGVudCkubm9ybWFsaXplZENvbnRlbnQsIDUwMDAwKTtcblxuICAgICAgLy8gVmFsaWRhdGUgbmFtZVxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlRWxlbWVudE5hbWUoc2FuaXRpemVkTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBhZ2VudCBuYW1lLiBVc2Ugb25seSBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMuJ1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBhZ2VudCBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpO1xuICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBmaWxlbmFtZSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhZ2VudCBpbnN0YW5jZVxuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQoe1xuICAgICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb24sXG4gICAgICAgIC4uLm1ldGFkYXRhXG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IGF1dGhvclxuICAgICAgYWdlbnQubWV0YWRhdGEuYXV0aG9yID0gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG5cbiAgICAgIC8vIFByZXBhcmUgZmlsZSBjb250ZW50XG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IHRoaXMuc2VyaWFsaXplVG9GaWxlKGFnZW50LCBzYW5pdGl6ZWRDb250ZW50KTtcblxuICAgICAgLy8gU0VDVVJJVFkgRklYOiBVc2UgYXRvbWljIGZpbGUgY3JlYXRpb24gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFByZXZpb3VzbHk6IFVzZWQgYWNjZXNzKCkgY2hlY2sgZm9sbG93ZWQgYnkgd3JpdGUsIHdoaWNoIGNvdWxkIHJhY2VcbiAgICAgIC8vIE5vdzogVXNlIGV4Y2x1c2l2ZSBmaWxlIGNyZWF0aW9uIHRoYXQgZmFpbHMgYXRvbWljYWxseSBpZiBmaWxlIGV4aXN0c1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmQgPSBhd2FpdCBmcy5vcGVuKGZpbGVwYXRoLCAnd3gnKTsgLy8gJ3d4JyA9IGV4Y2x1c2l2ZSB3cml0ZSwgZmFpbHMgaWYgZXhpc3RzXG4gICAgICAgIGF3YWl0IGZkLndyaXRlRmlsZShmaWxlQ29udGVudCwgJ3V0Zi04Jyk7XG4gICAgICAgIGF3YWl0IGZkLmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnRUVYSVNUJykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jcmVhdGUnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGNyZWF0ZWRgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBhZ2VudElkOiBhZ2VudC5pZCB9XG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmluZm8oYEFnZW50IGNyZWF0ZWQ6ICR7c2FuaXRpemVkTmFtZX1gKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYPCfpJYgKioke3Nhbml0aXplZE5hbWV9KiogYnkgJHthZ2VudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyd9YCxcbiAgICAgICAgZWxlbWVudDogYWdlbnRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhZ2VudCcsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdGYWlsZWQgdG8gY3JlYXRlIGFnZW50J1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhbiBhZ2VudCBieSBuYW1lXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVhZChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpO1xuICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBmaWxlbmFtZSk7XG5cbiAgICAgIC8vIFJlYWQgZmlsZSB3aXRoIGxvY2tcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoZmlsZXBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGZpbGUgc2l6ZVxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gTUFYX0ZJTEVfU0laRSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IGZpbGUgZXhjZWVkcyBtYXhpbXVtIHNpemUgb2YgJHtNQVhfRklMRV9TSVpFfSBieXRlc2ApO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBmaWxlXG4gICAgICBjb25zdCBhZ2VudERhdGEgPSB0aGlzLnBhcnNlQWdlbnRGaWxlKGNvbnRlbnQpO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYWdlbnQgaW5zdGFuY2UgLSBlbnN1cmUgbWV0YWRhdGEgaXMgcGFzc2VkIGNvcnJlY3RseVxuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQoYWdlbnREYXRhLm1ldGFkYXRhKTtcbiAgICAgIFxuICAgICAgLy8gTG9hZCBzdGF0ZSBpZiBhdmFpbGFibGVcbiAgICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgdGhpcy5sb2FkQWdlbnRTdGF0ZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICBhZ2VudC5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgLi4uSlNPTi5wYXJzZShhZ2VudC5zZXJpYWxpemVUb0pTT04oKSksXG4gICAgICAgICAgc3RhdGVcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWdlbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlYWQgYWdlbnQ6ICR7bmFtZX1gLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFuIGFnZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB1cGRhdGVzOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGE+LFxuICAgIGNvbnRlbnQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgbm90IGZvdW5kIGZvciB1cGRhdGU6ICR7bmFtZX1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBtZXRhZGF0YSB1cGRhdGVzXG4gICAgICBpZiAodXBkYXRlcy5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChcbiAgICAgICAgICBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1cGRhdGVzLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCxcbiAgICAgICAgICA1MDBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwZGF0ZXMuc3BlY2lhbGl6YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICAgIHNwZWNpYWxpemF0aW9uczogdXBkYXRlcy5zcGVjaWFsaXphdGlvbnMubWFwKChzOiBzdHJpbmcpID0+IHNhbml0aXplSW5wdXQocywgNTApKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodXBkYXRlcy5kZWNpc2lvbkZyYW1ld29yayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgICBkZWNpc2lvbkZyYW1ld29yazogdXBkYXRlcy5kZWNpc2lvbkZyYW1ld29ya1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodXBkYXRlcy5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICAgIHJpc2tUb2xlcmFuY2U6IHVwZGF0ZXMucmlza1RvbGVyYW5jZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgbW9kaWZpY2F0aW9uIHRpbWVcbiAgICAgIGFnZW50Lm1ldGFkYXRhLm1vZGlmaWVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCBjb250ZW50IGlmIG5vdCBwcm92aWRlZFxuICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUobmFtZSk7XG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgZmlsZW5hbWUpO1xuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZShmaWxlcGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZUFnZW50RmlsZShmaWxlQ29udGVudCk7XG4gICAgICAgIGNvbnRlbnQgPSBwYXJzZWQuY29udGVudDtcbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSBhZ2VudFxuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKG5hbWUpO1xuICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBmaWxlbmFtZSk7XG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IHRoaXMuc2VyaWFsaXplVG9GaWxlKGFnZW50LCBjb250ZW50KTtcbiAgICAgIFxuICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShmaWxlcGF0aCwgZmlsZUNvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIC8vIFNhdmUgc3RhdGUgaWYgbmVlZGVkXG4gICAgICBpZiAoYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZShuYW1lLCBhZ2VudC5nZXRTdGF0ZSgpKTtcbiAgICAgICAgYWdlbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBBZ2VudCB1cGRhdGVkOiAke25hbWV9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gdXBkYXRlIGFnZW50OiAke25hbWV9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gYWdlbnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIGZpbGVuYW1lKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHNcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlcGF0aCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgbWFpbiBmaWxlXG4gICAgICBhd2FpdCBmcy51bmxpbmsoZmlsZXBhdGgpO1xuXG4gICAgICAvLyBEZWxldGUgc3RhdGUgZmlsZSBpZiBleGlzdHNcbiAgICAgIGNvbnN0IHN0YXRlRmlsZW5hbWUgPSBgJHtzYW5pdGl6ZWROYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YDtcbiAgICAgIGNvbnN0IHN0YXRlRmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBTVEFURV9ESVJFQ1RPUlksIHN0YXRlRmlsZW5hbWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKHN0YXRlRmlsZXBhdGgpO1xuICAgICAgICB0aGlzLnN0YXRlQ2FjaGUuZGVsZXRlKHNhbml0aXplZE5hbWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN0YXRlIGZpbGUgbWlnaHQgbm90IGV4aXN0XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBkZWxldGVkYFxuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBBZ2VudCBkZWxldGVkOiAke3Nhbml0aXplZE5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBhZ2VudDogJHtuYW1lfWAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFsbCBhZ2VudHNcbiAgICogU0VDVVJJVFk6IFVzZXMgUG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHMoKSB3aGljaCBmaWx0ZXJzIHRlc3QgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0KCk6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgUG9ydGZvbGlvTWFuYWdlciB0byBnZXQgZmlsdGVyZWQgbGlzdCAoZXhjbHVkZXMgdGVzdCBlbGVtZW50cylcbiAgICAgIGNvbnN0IGFnZW50RmlsZXMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKEVsZW1lbnRUeXBlLkFHRU5UKTtcblxuICAgICAgLy8gTG9hZCBhbGwgYWdlbnRzXG4gICAgICBjb25zdCBhZ2VudHM6IEFnZW50W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBhZ2VudEZpbGVzKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmaWxlLnN1YnN0cmluZygwLCBmaWxlLmxlbmd0aCAtIEFHRU5UX0ZJTEVfRVhURU5TSU9OLmxlbmd0aCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQobmFtZSk7XG4gICAgICAgICAgaWYgKGFnZW50KSB7XG4gICAgICAgICAgICBhZ2VudHMucHVzaChhZ2VudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gbG9hZCBhZ2VudCAke25hbWV9OmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFnZW50cztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIG1pc3NpbmcgZGlyZWN0b3J5IGdyYWNlZnVsbHkgd2l0aCB0eXBlLXNhZmUgY2hlY2tcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0FnZW50cyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgeWV0LCByZXR1cm5pbmcgZW1wdHkgYXJyYXknKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gbGlzdCBhZ2VudHMnLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFnZW50IGV4aXN0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4aXN0cyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgZmlsZW5hbWUpO1xuICAgICAgXG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZXBhdGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGFnZW50IG5hbWVcbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZU5hbWUobmFtZTogc3RyaW5nKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gICAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ05hbWUgY2Fubm90IGJlIGVtcHR5JyB9O1xuICAgIH1cblxuICAgIGlmIChuYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ05hbWUgY2Fubm90IGV4Y2VlZCAxMDAgY2hhcmFjdGVycycgfTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdGVFbGVtZW50TmFtZShuYW1lKSkge1xuICAgICAgcmV0dXJuIHsgXG4gICAgICAgIHZhbGlkOiBmYWxzZSwgXG4gICAgICAgIGVycm9yOiAnTmFtZSBjYW4gb25seSBjb250YWluIGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcycgXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgcHVibGljIGdldEVsZW1lbnRUeXBlKCk6IEVsZW1lbnRUeXBlIHtcbiAgICByZXR1cm4gRWxlbWVudFR5cGUuQUdFTlQ7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhZ2VudCBzdGF0ZSBmcm9tIGZpbGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFnZW50U3RhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudFN0YXRlIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgICAgaWYgKHRoaXMuc3RhdGVDYWNoZS5oYXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVDYWNoZS5nZXQobmFtZSkhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGF0ZUZpbGVuYW1lID0gYCR7bmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWA7XG4gICAgICBjb25zdCBzdGF0ZUZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgU1RBVEVfRElSRUNUT1JZLCBzdGF0ZUZpbGVuYW1lKTtcblxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZShzdGF0ZUZpbGVwYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgXG4gICAgICAvLyBQYXJzZSBZQU1MIHNhZmVseVxuICAgICAgY29uc3QgcGFyc2VkQ29udGVudCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoY29udGVudCwge1xuICAgICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0YXRlID0gcGFyc2VkQ29udGVudC5kYXRhIGFzIGFueTtcbiAgICAgIFxuICAgICAgLy8gQ29udmVydCBzdHJpbmcgbnVtYmVycyBiYWNrIHRvIG51bWJlcnNcbiAgICAgIGlmIChzdGF0ZS5zZXNzaW9uQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdGF0ZS5zZXNzaW9uQ291bnQgPSBwYXJzZUludChzdGF0ZS5zZXNzaW9uQ291bnQsIDEwKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ29udmVydCBnb2FsIG51bWJlcnNcbiAgICAgIGlmIChzdGF0ZS5nb2Fscykge1xuICAgICAgICBzdGF0ZS5nb2Fscy5mb3JFYWNoKChnb2FsOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQpIGdvYWwuaW1wb3J0YW5jZSA9IHBhcnNlSW50KGdvYWwuaW1wb3J0YW5jZSwgMTApO1xuICAgICAgICAgIGlmIChnb2FsLnVyZ2VuY3kgIT09IHVuZGVmaW5lZCkgZ29hbC51cmdlbmN5ID0gcGFyc2VJbnQoZ29hbC51cmdlbmN5LCAxMCk7XG4gICAgICAgICAgaWYgKGdvYWwuZXN0aW1hdGVkRWZmb3J0ICE9PSB1bmRlZmluZWQpIGdvYWwuZXN0aW1hdGVkRWZmb3J0ID0gcGFyc2VGbG9hdChnb2FsLmVzdGltYXRlZEVmZm9ydCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDb252ZXJ0IGRlY2lzaW9uIGNvbmZpZGVuY2VcbiAgICAgIGlmIChzdGF0ZS5kZWNpc2lvbnMpIHtcbiAgICAgICAgc3RhdGUuZGVjaXNpb25zLmZvckVhY2goKGRlY2lzaW9uOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkKSBkZWNpc2lvbi5jb25maWRlbmNlID0gcGFyc2VGbG9hdChkZWNpc2lvbi5jb25maWRlbmNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhY2hlIHRoZSBzdGF0ZVxuICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChuYW1lLCBzdGF0ZSk7XG5cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBhZ2VudCBzdGF0ZTogJHtuYW1lfWAsIGVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGFnZW50IHN0YXRlIHRvIGZpbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlQWdlbnRTdGF0ZShuYW1lOiBzdHJpbmcsIHN0YXRlOiBBZ2VudFN0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRlRmlsZW5hbWUgPSBgJHtuYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YDtcbiAgICAgIGNvbnN0IHN0YXRlRmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBTVEFURV9ESVJFQ1RPUlksIHN0YXRlRmlsZW5hbWUpO1xuXG4gICAgICAvLyBDb252ZXJ0IGRhdGVzIHRvIElTTyBzdHJpbmdzIGFuZCBudW1iZXJzIHRvIHN0cmluZ3MgZm9yIEZBSUxTQUZFX1NDSEVNQVxuICAgICAgY29uc3Qgc2VyaWFsaXplZFN0YXRlID0ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbGFzdEFjdGl2ZTogc3RhdGUubGFzdEFjdGl2ZSBpbnN0YW5jZW9mIERhdGUgPyBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCkgOiBzdGF0ZS5sYXN0QWN0aXZlLFxuICAgICAgICBzZXNzaW9uQ291bnQ6IFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQpLFxuICAgICAgICBnb2Fsczogc3RhdGUuZ29hbHMubWFwKGdvYWwgPT4gKHtcbiAgICAgICAgICAuLi5nb2FsLFxuICAgICAgICAgIGNyZWF0ZWRBdDogZ29hbC5jcmVhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwuY3JlYXRlZEF0LFxuICAgICAgICAgIHVwZGF0ZWRBdDogZ29hbC51cGRhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC51cGRhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwudXBkYXRlZEF0LFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBnb2FsLmNvbXBsZXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwuY29tcGxldGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwuY29tcGxldGVkQXQsXG4gICAgICAgICAgaW1wb3J0YW5jZTogZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5pbXBvcnRhbmNlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB1cmdlbmN5OiBnb2FsLnVyZ2VuY3kgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLnVyZ2VuY3kpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVzdGltYXRlZEVmZm9ydDogZ29hbC5lc3RpbWF0ZWRFZmZvcnQgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLmVzdGltYXRlZEVmZm9ydCkgOiB1bmRlZmluZWRcbiAgICAgICAgfSkpLFxuICAgICAgICBkZWNpc2lvbnM6IHN0YXRlLmRlY2lzaW9ucy5tYXAoZGVjaXNpb24gPT4gKHtcbiAgICAgICAgICAuLi5kZWNpc2lvbixcbiAgICAgICAgICB0aW1lc3RhbXA6IGRlY2lzaW9uLnRpbWVzdGFtcCBpbnN0YW5jZW9mIERhdGUgPyBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSA6IGRlY2lzaW9uLnRpbWVzdGFtcCxcbiAgICAgICAgICBjb25maWRlbmNlOiBkZWNpc2lvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZGVjaXNpb24uY29uZmlkZW5jZSkgOiB1bmRlZmluZWRcbiAgICAgICAgfSkpXG4gICAgICB9O1xuXG4gICAgICAvLyBDb252ZXJ0IHN0YXRlIHRvIFlBTUxcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKHNlcmlhbGl6ZWRTdGF0ZSwge1xuICAgICAgICBzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BLFxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgc2l6ZVxuICAgICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA+IE1BWF9ZQU1MX1NJWkUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGF0ZSBzaXplIGV4Y2VlZHMgbWF4aW11bSBvZiAke01BWF9ZQU1MX1NJWkV9IGJ5dGVzYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdyaXRlIGF0b21pY2FsbHlcbiAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoc3RhdGVGaWxlcGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBjYWNoZVxuICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChuYW1lLCBzdGF0ZSk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQWdlbnQgc3RhdGUgc2F2ZWQ6ICR7bmFtZX1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc2F2ZSBhZ2VudCBzdGF0ZTogJHtuYW1lfWAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhZ2VudCBmaWxlIGNvbnRlbnRcbiAgICovXG4gIHByaXZhdGUgcGFyc2VBZ2VudEZpbGUoY29udGVudDogc3RyaW5nKTogQWdlbnRGaWxlRGF0YSB7XG4gICAgLy8gRXh0cmFjdCBmcm9udG1hdHRlciBhbmQgY29udGVudFxuICAgIGNvbnN0IGZyb250bWF0dGVyUmVnZXggPSAvXi0tLVxcbihbXFxzXFxTXSo/KVxcbi0tLVxcbihbXFxzXFxTXSopJC87XG4gICAgY29uc3QgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZyb250bWF0dGVyUmVnZXgpO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFnZW50IGZpbGUgZm9ybWF0IC0gbWlzc2luZyBmcm9udG1hdHRlcicpO1xuICAgIH1cblxuICAgIGNvbnN0IFssIGZyb250bWF0dGVyLCBib2R5XSA9IG1hdGNoO1xuXG4gICAgLy8gUGFyc2UgZnJvbnRtYXR0ZXIgLSBTZWN1cmVZYW1sUGFyc2VyIGV4cGVjdHMgZnVsbCBjb250ZW50IHdpdGggZnJvbnRtYXR0ZXIgbWFya2Vyc1xuICAgIC8vIGJ1dCB3ZSdyZSBwYXNzaW5nIGp1c3QgdGhlIFlBTUwgY29udGVudCwgc28gd2UgbmVlZCB0byBwYXJzZSBpdCBkaXJlY3RseVxuICAgIGNvbnN0IHBhcnNlZFlhbWwgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGAtLS1cXG4ke2Zyb250bWF0dGVyfVxcbi0tLWAsIHtcbiAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSAgLy8gV2UnbGwgdmFsaWRhdGUgYm9keSBzZXBhcmF0ZWx5XG4gICAgfSk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZWRZYW1sLmRhdGEgYXMgdW5rbm93biBhcyBBZ2VudE1ldGFkYXRhO1xuXG4gICAgLy8gVmFsaWRhdGUgdHlwZSBpZiB1c2luZyB0aGUgdHlwZWQgbWV0YWRhdGFcbiAgICBjb25zdCB0eXBlZE1ldGFkYXRhID0gbWV0YWRhdGEgYXMgYW55O1xuICAgIGlmICh0eXBlZE1ldGFkYXRhLnR5cGUgJiYgdHlwZWRNZXRhZGF0YS50eXBlICE9PSBFbGVtZW50VHlwZS5BR0VOVCAmJiB0eXBlZE1ldGFkYXRhLnR5cGUgIT09ICdhZ2VudCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGU6IGV4cGVjdGVkICcke0VsZW1lbnRUeXBlLkFHRU5UfScsIGdvdCAnJHt0eXBlZE1ldGFkYXRhLnR5cGV9J2ApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YSxcbiAgICAgIGNvbnRlbnQ6IGJvZHkudHJpbSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgYWdlbnQgdG8gZmlsZSBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgc2VyaWFsaXplVG9GaWxlKGFnZW50OiBBZ2VudCwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRhZGF0YTogYW55ID0ge1xuICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgIHR5cGU6IEVsZW1lbnRUeXBlLkFHRU5ULFxuICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogYWdlbnQubWV0YWRhdGEuY3JlYXRlZCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtb2RpZmllZDogYWdlbnQubWV0YWRhdGEubW9kaWZpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgZGVjaXNpb25GcmFtZXdvcms6IGFnZW50LmV4dGVuc2lvbnM/LmRlY2lzaW9uRnJhbWV3b3JrLFxuICAgICAgcmlza1RvbGVyYW5jZTogYWdlbnQuZXh0ZW5zaW9ucz8ucmlza1RvbGVyYW5jZSxcbiAgICAgIGxlYXJuaW5nRW5hYmxlZDogYWdlbnQuZXh0ZW5zaW9ucz8ubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQgPyBcbiAgICAgICAgU3RyaW5nKGFnZW50LmV4dGVuc2lvbnMubGVhcm5pbmdFbmFibGVkKSA6IHVuZGVmaW5lZCxcbiAgICAgIG1heENvbmN1cnJlbnRHb2FsczogKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGEpLm1heENvbmN1cnJlbnRHb2FscyxcbiAgICAgIHNwZWNpYWxpemF0aW9uczogYWdlbnQuZXh0ZW5zaW9ucz8uc3BlY2lhbGl6YXRpb25zXG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSB1bmRlZmluZWQgdmFsdWVzXG4gICAgT2JqZWN0LmtleXMobWV0YWRhdGEpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChtZXRhZGF0YVtrZXkgYXMga2V5b2YgdHlwZW9mIG1ldGFkYXRhXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtrZXkgYXMga2V5b2YgdHlwZW9mIG1ldGFkYXRhXTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG1ldGFkYXRhLCB7XG4gICAgICBzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BLFxuICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgc29ydEtleXM6IHRydWVcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gYC0tLVxcbiR7eWFtbENvbnRlbnR9LS0tXFxuXFxuJHtjb250ZW50fWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpbGVuYW1lIGZvciBhZ2VudFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGaWxlbmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtuYW1lfSR7QUdFTlRfRklMRV9FWFRFTlNJT059YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBlbGVtZW50IG5hbWVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVFbGVtZW50TmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlc1xuICAgIHJldHVybiAvXlthLXpBLVowLTlfLV0rJC8udGVzdChuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIGZvciBhdHRyaWJ1dGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkRPTExIT1VTRV9VU0VSIHx8ICdhbm9ueW1vdXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gYWdlbnQgYnkgcHJlZGljYXRlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmluZChwcmVkaWNhdGU6IChlbGVtZW50OiBBZ2VudCkgPT4gYm9vbGVhbik6IFByb21pc2U8QWdlbnQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gYWdlbnRzLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIG1hbnkgYWdlbnRzIGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKGVsZW1lbnQ6IEFnZW50KSA9PiBib29sZWFuKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGFnZW50cy5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBhZ2VudFxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlKGVsZW1lbnQ6IEFnZW50KTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIHJldHVybiBlbGVtZW50LnZhbGlkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBwYXRoXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGZvciBwYXRoIHRyYXZlcnNhbFxuICAgIGlmIChwYXRoLmluY2x1ZGVzKCcuLicpIHx8IHBhdGguaW5jbHVkZXMoJ34nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBDaGVjayBmb3IgYWJzb2x1dGUgcGF0aHNcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKCcvJykgfHwgcGF0aC5tYXRjaCgvXltBLVphLXpdOi8pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaWxlIGV4dGVuc2lvblxuICAgKi9cbiAgcHVibGljIGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQUdFTlRfRklMRV9FWFRFTlNJT047XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGFnZW50IGZyb20gZGF0YVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ/OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHBhcnNlZC5tZXRhZGF0YSk7XG4gICAgICBpZiAocGFyc2VkLnN0YXRlKSB7XG4gICAgICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHBhcnNlZCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQYXJzZSBhcyBtYXJrZG93biB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICAgIGNvbnN0IGFnZW50RGF0YSA9IHRoaXMucGFyc2VBZ2VudEZpbGUoZGF0YSk7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChhZ2VudERhdGEubWV0YWRhdGEpO1xuICAgICAgaWYgKGFnZW50RGF0YS5zdGF0ZSkge1xuICAgICAgICBhZ2VudC5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgLi4uSlNPTi5wYXJzZShhZ2VudC5zZXJpYWxpemVUb0pTT04oKSksXG4gICAgICAgICAgc3RhdGU6IGFnZW50RGF0YS5zdGF0ZVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWdlbnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBhZ2VudCB0byBhIGZvcm1hdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4cG9ydEVsZW1lbnQoZWxlbWVudDogQWdlbnQsIGZvcm1hdD86ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgLy8gVXNlIHNlcmlhbGl6ZVRvSlNPTiBmb3IgSlNPTiBmb3JtYXQgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgcmV0dXJuIGVsZW1lbnQuc2VyaWFsaXplVG9KU09OKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV4cG9ydCBhcyBtYXJrZG93biB3aXRoIFlBTUwgZnJvbnRtYXR0ZXIgKGRlZmF1bHQpXG4gICAgICBjb25zdCBjb250ZW50ID0gYCMgJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9XFxuXFxuJHtlbGVtZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnfWA7XG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVUb0ZpbGUoZWxlbWVudCwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYW4gYWdlbnQgdG8gYSBzcGVjaWZpYyBwYXRoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZShlbGVtZW50OiBBZ2VudCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmFtZSA9IHRhcmdldFBhdGgucmVwbGFjZShBR0VOVF9GSUxFX0VYVEVOU0lPTiwgJycpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBgIyAke2VsZW1lbnQubWV0YWRhdGEubmFtZX1cXG5cXG4ke2VsZW1lbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgJyd9YDtcbiAgICBcbiAgICAvLyBTYXZlIHRoZSBhZ2VudCBmaWxlXG4gICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKG5hbWUpO1xuICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5pc0Fic29sdXRlKHRhcmdldFBhdGgpID8gdGFyZ2V0UGF0aCA6IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIGZpbGVuYW1lKTtcbiAgICBjb25zdCBmaWxlQ29udGVudCA9IHRoaXMuc2VyaWFsaXplVG9GaWxlKGVsZW1lbnQsIGNvbnRlbnQpO1xuICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoZmlsZXBhdGgsIGZpbGVDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgLy8gU2F2ZSBzdGF0ZSBpZiBuZWVkZWRcbiAgICBpZiAoZWxlbWVudC5uZWVkc1N0YXRlUGVyc2lzdGVuY2UoKSkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZShuYW1lLCBlbGVtZW50LmdldFN0YXRlKCkpO1xuICAgICAgZWxlbWVudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBhZ2VudCBmcm9tIGEgc3BlY2lmaWMgcGF0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWQodGFyZ2V0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHRhcmdldFBhdGgucmVwbGFjZShBR0VOVF9GSUxFX0VYVEVOU0lPTiwgJycpKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBTRUNVUklUWSBGSVggIzIwNjogRG9uJ3QgZXhwb3NlIGZpbGUgcGF0aHMgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgIGxvZ2dlci5lcnJvcignQWdlbnQgbm90IGZvdW5kJywgeyBwYXRoOiB0YXJnZXRQYXRoIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZ2VudCBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGFnZW50O1xuICB9XG59Il19
|
|
@@ -77,7 +77,16 @@ export declare class Skill extends BaseElement implements IElement {
|
|
|
77
77
|
*/
|
|
78
78
|
validate(): ElementValidationResult;
|
|
79
79
|
/**
|
|
80
|
-
* Serialize
|
|
80
|
+
* Serialize to JSON format for internal use and testing
|
|
81
|
+
*/
|
|
82
|
+
serializeToJSON(): string;
|
|
83
|
+
/**
|
|
84
|
+
* Get content for serialization
|
|
85
|
+
*/
|
|
86
|
+
protected getContent(): string;
|
|
87
|
+
/**
|
|
88
|
+
* Serialize skill to markdown format with YAML frontmatter
|
|
89
|
+
* FIX: Changed from JSON to markdown for GitHub portfolio compatibility
|
|
81
90
|
*/
|
|
82
91
|
serialize(): string;
|
|
83
92
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Skill.d.ts","sourceRoot":"","sources":["../../../src/elements/skills/Skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAQpG,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,KAAM,SAAQ,WAAY,YAAW,QAAQ;IACzC,QAAQ,EAAE,aAAa,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAa;IAKhD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,YAAY,GAAE,MAAW;IA2CvE;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IA0E5C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAI/B;;OAEG;IACH,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIvC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAmB9B;;OAEG;IACG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAwBxC;;OAEG;IACa,QAAQ,IAAI,uBAAuB;IAiFnD;;OAEG;IACa,SAAS,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"Skill.d.ts","sourceRoot":"","sources":["../../../src/elements/skills/Skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAQpG,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,KAAM,SAAQ,WAAY,YAAW,QAAQ;IACzC,QAAQ,EAAE,aAAa,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAa;IAKhD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,YAAY,GAAE,MAAW;IA2CvE;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IA0E5C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAI/B;;OAEG;IACH,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIvC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAmB9B;;OAEG;IACG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAwBxC;;OAEG;IACa,QAAQ,IAAI,uBAAuB;IAiFnD;;OAEG;IACa,eAAe,IAAI,MAAM;IAezC;;OAEG;cACgB,UAAU,IAAI,MAAM;IAoBvC;;;OAGG;IACa,SAAS,IAAI,MAAM;IAkBnC;;OAEG;IACa,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAkC/C;;OAEG;IACmB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/C;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK;IAkBjD;;;;OAIG;IACmB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjD;;;;;OAKG;IACH,eAAe,IAAI,IAAI;CAIxB"}
|