@dollhousemcp/mcp-server 1.9.13 → 1.9.15
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 +48 -0
- package/README.github.md +54 -0
- package/README.md.backup +1241 -49
- package/dist/cache/CollectionCache.js +2 -2
- package/dist/collection/CollectionIndexManager.js +3 -3
- package/dist/config/ConfigWizard.js +3 -3
- package/dist/config/indicator-config.js +2 -2
- package/dist/config/portfolio-constants.js +12 -12
- package/dist/elements/BaseElement.js +7 -7
- package/dist/elements/FeedbackProcessor.d.ts +7 -0
- package/dist/elements/FeedbackProcessor.d.ts.map +1 -1
- package/dist/elements/FeedbackProcessor.js +67 -14
- package/dist/elements/agents/AgentManager.js +6 -6
- package/dist/elements/memories/Memory.js +4 -4
- package/dist/elements/memories/MemoryManager.js +3 -3
- package/dist/elements/memories/utils.js +3 -3
- package/dist/elements/skills/Skill.js +2 -2
- package/dist/elements/skills/SkillManager.js +2 -2
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +38 -14
- package/dist/elements/templates/TemplateManager.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ConfigHandler.js +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -16
- package/dist/persona/PersonaElementManager.js +3 -3
- package/dist/persona/PersonaManager.js +2 -2
- package/dist/persona/export-import/PersonaImporter.js +3 -3
- package/dist/portfolio/DefaultElementProvider.d.ts +12 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +23 -6
- package/dist/portfolio/GitHubPortfolioIndexer.js +2 -2
- package/dist/portfolio/MigrationManager.js +2 -2
- package/dist/portfolio/NLPScoringManager.js +2 -2
- package/dist/portfolio/PortfolioManager.d.ts +5 -0
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +8 -1
- package/dist/portfolio/PortfolioRepoManager.js +2 -2
- package/dist/portfolio/PortfolioSyncManager.js +5 -5
- package/dist/portfolio/RelationshipManager.js +4 -4
- package/dist/portfolio/UnifiedIndexManager.js +4 -4
- package/dist/portfolio/types/RelationshipTypes.js +2 -2
- package/dist/security/InputValidator.d.ts +12 -0
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +38 -18
- package/dist/security/audit/config/suppressions.js +10 -10
- package/dist/security/commandValidator.js +2 -2
- package/dist/security/dosProtection.d.ts +123 -0
- package/dist/security/dosProtection.d.ts.map +1 -0
- package/dist/security/dosProtection.js +392 -0
- package/dist/security/pathValidator.js +2 -2
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +4 -3
- package/dist/security/tokenManager.js +10 -10
- package/dist/security/validators/unicodeValidator.js +2 -2
- package/dist/security/yamlValidator.js +3 -3
- package/dist/sync/PortfolioDownloader.js +2 -2
- package/dist/sync/PortfolioSyncComparer.js +2 -2
- package/dist/tools/portfolio/PortfolioElementAdapter.js +3 -3
- package/dist/tools/portfolio/submitToPortfolioTool.js +14 -14
- package/dist/utils/EarlyTerminationSearch.d.ts +1 -1
- package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -1
- package/dist/utils/EarlyTerminationSearch.js +3 -3
- package/dist/utils/ElementFormatter.d.ts +1 -0
- package/dist/utils/ElementFormatter.d.ts.map +1 -1
- package/dist/utils/ElementFormatter.js +21 -13
- package/dist/utils/GitHubRateLimiter.d.ts +6 -0
- package/dist/utils/GitHubRateLimiter.d.ts.map +1 -1
- package/dist/utils/GitHubRateLimiter.js +20 -5
- package/dist/utils/RateLimiter.js +2 -2
- package/dist/utils/SecureDownloader.js +2 -2
- package/dist/utils/fileOperations.d.ts +6 -1
- package/dist/utils/fileOperations.d.ts.map +1 -1
- package/dist/utils/fileOperations.js +29 -5
- package/dist/utils/filesystem.js +6 -6
- package/dist/utils/searchUtils.js +2 -2
- package/dist/utils/version.js +3 -3
- package/package.json +1 -1
|
@@ -349,24 +349,24 @@ export class AgentManager {
|
|
|
349
349
|
const state = parsedContent.data;
|
|
350
350
|
// Convert string numbers back to numbers
|
|
351
351
|
if (state.sessionCount !== undefined) {
|
|
352
|
-
state.sessionCount = parseInt(state.sessionCount, 10);
|
|
352
|
+
state.sessionCount = Number.parseInt(state.sessionCount, 10);
|
|
353
353
|
}
|
|
354
354
|
// Convert goal numbers
|
|
355
355
|
if (state.goals) {
|
|
356
356
|
state.goals.forEach((goal) => {
|
|
357
357
|
if (goal.importance !== undefined)
|
|
358
|
-
goal.importance = parseInt(goal.importance, 10);
|
|
358
|
+
goal.importance = Number.parseInt(goal.importance, 10);
|
|
359
359
|
if (goal.urgency !== undefined)
|
|
360
|
-
goal.urgency = parseInt(goal.urgency, 10);
|
|
360
|
+
goal.urgency = Number.parseInt(goal.urgency, 10);
|
|
361
361
|
if (goal.estimatedEffort !== undefined)
|
|
362
|
-
goal.estimatedEffort = parseFloat(goal.estimatedEffort);
|
|
362
|
+
goal.estimatedEffort = Number.parseFloat(goal.estimatedEffort);
|
|
363
363
|
});
|
|
364
364
|
}
|
|
365
365
|
// Convert decision confidence
|
|
366
366
|
if (state.decisions) {
|
|
367
367
|
state.decisions.forEach((decision) => {
|
|
368
368
|
if (decision.confidence !== undefined)
|
|
369
|
-
decision.confidence = parseFloat(decision.confidence);
|
|
369
|
+
decision.confidence = Number.parseFloat(decision.confidence);
|
|
370
370
|
});
|
|
371
371
|
}
|
|
372
372
|
// Cache the state
|
|
@@ -664,4 +664,4 @@ export class AgentManager {
|
|
|
664
664
|
return agent;
|
|
665
665
|
}
|
|
666
666
|
}
|
|
667
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR25DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsWUFBWTtBQUNaLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0FBQ25DLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQztBQUNqQyxNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztBQUMzQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsUUFBUTtBQUMxQyxNQUFNLGFBQWEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsdUJBQXVCO0FBRXhELDBDQUEwQztBQUMxQyxNQUFNLGtC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U0FBUyxFQUFFLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2YsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyw4QkFBOEIsQ0FBQyxDQUFDO2dCQUM3RCxTQUFTO1lBQ1gsQ0FBQztZQUVELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDOUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyx5RUFBeUUsQ0FBQyxDQUFDO2dCQUM5RyxTQUFTO1lBQ1gsQ0FBQztZQUVELGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQWtCO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsK0RBQStEO1lBQy9ELE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZ2VudE1hbmFnZXIgLSBIYW5kbGVzIENSVUQgb3BlcmF0aW9ucyBmb3IgQWdlbnQgZWxlbWVudHNcbiAqIEZvbGxvd3MgcGF0dGVybnMgZnJvbSBQZXJzb25hRWxlbWVudE1hbmFnZXIgYW5kIE1lbW9yeU1hbmFnZXJcbiAqIFxuICogU0VDVVJJVFk6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgb3BlcmF0aW9ucyBhbmQgU2VjdXJlWWFtbFBhcnNlciBmb3Igc2FmZSBZQU1MIHBhcnNpbmdcbiAqL1xuXG5pbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4vQWdlbnQuanMnO1xuaW1wb3J0IHsgQWdlbnRNZXRhZGF0YSwgQWdlbnRTdGF0ZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnRNYW5hZ2VyLCBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL2luZGV4LmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuXG4vLyBDb25zdGFudHNcbmNvbnN0IEFHRU5UX0ZJTEVfRVhURU5TSU9OID0gJy5tZCc7XG5jb25zdCBTVEFURV9ESVJFQ1RPUlkgPSAnLnN0YXRlJztcbmNvbnN0IFNUQVRFX0ZJTEVfRVhURU5TSU9OID0gJy5zdGF0ZS55YW1sJztcbmNvbnN0IE1BWF9GSUxFX1NJWkUgPSAxMDAgKiAxMDI0OyAvLyAxMDBLQlxuY29uc3QgTUFYX1lBTUxfU0laRSA9IDY0ICogMTAyNDsgLy8gNjRLQiBmb3IgZnJvbnRtYXR0ZXJcblxuLy8gVmFsaWRhdGlvbiBjb25zdGFudHMgZm9yIGFnZW50IHRyaWdnZXJzXG5jb25zdCBNQVhfVFJJR0dFUl9MRU5HVEggPSA1MDtcbmNvbnN0IFRSSUdHRVJfVkFMSURBVElPTl9SRUdFWCA9IC9eW2EtekEtWjAtOVxcLV9dKyQvO1xuXG4vLyBFbGVtZW50IGNyZWF0aW9uIHJlc3VsdCBpbnRlcmZhY2VcbmludGVyZmFjZSBFbGVtZW50Q3JlYXRpb25SZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGVsZW1lbnQ/OiBBZ2VudDtcbn1cblxuaW50ZXJmYWNlIEFnZW50RmlsZURhdGEge1xuICBtZXRhZGF0YTogQWdlbnRNZXRhZGF0YTtcbiAgY29udGVudDogc3RyaW5nO1xuICBzdGF0ZT86IEFnZW50U3RhdGU7XG59XG5cbmV4cG9ydCBjbGFzcyBBZ2VudE1hbmFnZXIgaW1wbGVtZW50cyBJRWxlbWVudE1hbmFnZXI8QWdlbnQ+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhZ2VudHNQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVDYWNoZTogTWFwPHN0cmluZywgQWdlbnRTdGF0ZT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcblxuICBjb25zdHJ1Y3Rvcihwb3J0Zm9saW9QYXRoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFnZW50c1BhdGggPSBwYXRoLmpvaW4ocG9ydGZvbGlvUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQpO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBhZ2VudHMgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhZ2VudHMgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGF3YWl0IGZzLm1rZGlyKHRoaXMuYWdlbnRzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSAuc3RhdGUgZGlyZWN0b3J5IGZvciBhZ2VudCBzdGF0ZXNcbiAgICAgIGNvbnN0IHN0YXRlUGF0aCA9IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIFNUQVRFX0RJUkVDVE9SWSk7XG4gICAgICBhd2FpdCBmcy5ta2RpcihzdGF0ZVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbygnQWdlbnRNYW5hZ2VyIGluaXRpYWxpemVkJywgeyBwYXRoOiB0aGlzLmFnZW50c1BhdGggfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgQWdlbnRNYW5hZ2VyJywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBhZ2VudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBQYXJ0aWFsPEFnZW50TWV0YWRhdGE+XG4gICk6IFByb21pc2U8RWxlbWVudENyZWF0aW9uUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNhbml0aXplIGlucHV0c1xuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWREZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZGVzY3JpcHRpb24pLm5vcm1hbGl6ZWRDb250ZW50LCA1MDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoY29udGVudCkubm9ybWFsaXplZENvbnRlbnQsIDUwMDAwKTtcblxuICAgICAgLy8gVmFsaWRhdGUgbmFtZVxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlRWxlbWVudE5hbWUoc2FuaXRpemVkTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBhZ2VudCBuYW1lLiBVc2Ugb25seSBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMuJ1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBhZ2VudCBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpO1xuICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBmaWxlbmFtZSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhZ2VudCBpbnN0YW5jZVxuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQoe1xuICAgICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb24sXG4gICAgICAgIC4uLm1ldGFkYXRhXG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IGF1dGhvclxuICAgICAgYWdlbnQubWV0YWRhdGEuYXV0aG9yID0gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG5cbiAgICAgIC8vIFByZXBhcmUgZmlsZSBjb250ZW50XG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IHRoaXMuc2VyaWFsaXplVG9GaWxlKGFnZW50LCBzYW5pdGl6ZWRDb250ZW50KTtcblxuICAgICAgLy8gU0VDVVJJVFkgRklYOiBVc2UgYXRvbWljIGZpbGUgY3JlYXRpb24gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFByZXZpb3VzbHk6IFVzZWQgYWNjZXNzKCkgY2hlY2sgZm9sbG93ZWQgYnkgd3JpdGUsIHdoaWNoIGNvdWxkIHJhY2VcbiAgICAgIC8vIE5vdzogVXNlIGV4Y2x1c2l2ZSBmaWxlIGNyZWF0aW9uIHRoYXQgZmFpbHMgYXRvbWljYWxseSBpZiBmaWxlIGV4aXN0c1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmQgPSBhd2FpdCBmcy5vcGVuKGZpbGVwYXRoLCAnd3gnKTsgLy8gJ3d4JyA9IGV4Y2x1c2l2ZSB3cml0ZSwgZmFpbHMgaWYgZXhpc3RzXG4gICAgICAgIGF3YWl0IGZkLndyaXRlRmlsZShmaWxlQ29udGVudCwgJ3V0Zi04Jyk7XG4gICAgICAgIGF3YWl0IGZkLmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnRUVYSVNUJykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jcmVhdGUnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGNyZWF0ZWRgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBhZ2VudElkOiBhZ2VudC5pZCB9XG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmluZm8oYEFnZW50IGNyZWF0ZWQ6ICR7c2FuaXRpemVkTmFtZX1gKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYPCfpJYgKioke3Nhbml0aXplZE5hbWV9KiogYnkgJHthZ2VudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyd9YCxcbiAgICAgICAgZWxlbWVudDogYWdlbnRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhZ2VudCcsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdGYWlsZWQgdG8gY3JlYXRlIGFnZW50J1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhbiBhZ2VudCBieSBuYW1lXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVhZChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpO1xuICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBmaWxlbmFtZSk7XG5cbiAgICAgIC8vIFJlYWQgZmlsZSB3aXRoIGxvY2tcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoZmlsZXBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGZpbGUgc2l6ZVxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gTUFYX0ZJTEVfU0laRSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IGZpbGUgZXhjZWVkcyBtYXhpbXVtIHNpemUgb2YgJHtNQVhfRklMRV9TSVpFfSBieXRlc2ApO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBmaWxlXG4gICAgICBjb25zdCBhZ2VudERhdGEgPSB0aGlzLnBhcnNlQWdlbnRGaWxlKGNvbnRlbnQpO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYWdlbnQgaW5zdGFuY2UgLSBlbnN1cmUgbWV0YWRhdGEgaXMgcGFzc2VkIGNvcnJlY3RseVxuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQoYWdlbnREYXRhLm1ldGFkYXRhKTtcbiAgICAgIFxuICAgICAgLy8gTG9hZCBzdGF0ZSBpZiBhdmFpbGFibGVcbiAgICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgdGhpcy5sb2FkQWdlbnRTdGF0ZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICBhZ2VudC5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgLi4uSlNPTi5wYXJzZShhZ2VudC5zZXJpYWxpemVUb0pTT04oKSksXG4gICAgICAgICAgc3RhdGVcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWdlbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlYWQgYWdlbnQ6ICR7bmFtZX1gLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFuIGFnZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB1cGRhdGVzOiBQYXJ0aWFsPEFnZW50TWV0YWRhdGE+LFxuICAgIGNvbnRlbnQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgbm90IGZvdW5kIGZvciB1cGRhdGU6ICR7bmFtZX1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBtZXRhZGF0YSB1cGRhdGVzXG4gICAgICBpZiAodXBkYXRlcy5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChcbiAgICAgICAgICBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1cGRhdGVzLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCxcbiAgICAgICAgICA1MDBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwZGF0ZXMuc3BlY2lhbGl6YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICAgIHNwZWNpYWxpemF0aW9uczogdXBkYXRlcy5zcGVjaWFsaXphdGlvbnMubWFwKChzOiBzdHJpbmcpID0+IHNhbml0aXplSW5wdXQocywgNTApKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodXBkYXRlcy5kZWNpc2lvbkZyYW1ld29yayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgICBkZWNpc2lvbkZyYW1ld29yazogdXBkYXRlcy5kZWNpc2lvbkZyYW1ld29ya1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodXBkYXRlcy5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICAgIHJpc2tUb2xlcmFuY2U6IHVwZGF0ZXMucmlza1RvbGVyYW5jZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgbW9kaWZpY2F0aW9uIHRpbWVcbiAgICAgIGFnZW50Lm1ldGFkYXRhLm1vZGlmaWVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCBjb250ZW50IGlmIG5vdCBwcm92aWRlZFxuICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUobmFtZSk7XG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgZmlsZW5hbWUpO1xuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZShmaWxlcGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZUFnZW50RmlsZShmaWxlQ29udGVudCk7XG4gICAgICAgIGNvbnRlbnQgPSBwYXJzZWQuY29udGVudDtcbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSBhZ2VudFxuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKG5hbWUpO1xuICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBmaWxlbmFtZSk7XG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IHRoaXMuc2VyaWFsaXplVG9GaWxlKGFnZW50LCBjb250ZW50KTtcbiAgICAgIFxuICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShmaWxlcGF0aCwgZmlsZUNvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIC8vIFNhdmUgc3RhdGUgaWYgbmVlZGVkXG4gICAgICBpZiAoYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZShuYW1lLCBhZ2VudC5nZXRTdGF0ZSgpKTtcbiAgICAgICAgYWdlbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBBZ2VudCB1cGRhdGVkOiAke25hbWV9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gdXBkYXRlIGFnZW50OiAke25hbWV9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gYWdlbnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIGZpbGVuYW1lKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHNcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlcGF0aCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgbWFpbiBmaWxlXG4gICAgICBhd2FpdCBmcy51bmxpbmsoZmlsZXBhdGgpO1xuXG4gICAgICAvLyBEZWxldGUgc3RhdGUgZmlsZSBpZiBleGlzdHNcbiAgICAgIGNvbnN0IHN0YXRlRmlsZW5hbWUgPSBgJHtzYW5pdGl6ZWROYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YDtcbiAgICAgIGNvbnN0IHN0YXRlRmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBTVEFURV9ESVJFQ1RPUlksIHN0YXRlRmlsZW5hbWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKHN0YXRlRmlsZXBhdGgpO1xuICAgICAgICB0aGlzLnN0YXRlQ2FjaGUuZGVsZXRlKHNhbml0aXplZE5hbWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN0YXRlIGZpbGUgbWlnaHQgbm90IGV4aXN0XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBkZWxldGVkYFxuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBBZ2VudCBkZWxldGVkOiAke3Nhbml0aXplZE5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBhZ2VudDogJHtuYW1lfWAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFsbCBhZ2VudHNcbiAgICogU0VDVVJJVFk6IFVzZXMgUG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHMoKSB3aGljaCBmaWx0ZXJzIHRlc3QgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0KCk6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgUG9ydGZvbGlvTWFuYWdlciB0byBnZXQgZmlsdGVyZWQgbGlzdCAoZXhjbHVkZXMgdGVzdCBlbGVtZW50cylcbiAgICAgIGNvbnN0IGFnZW50RmlsZXMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKEVsZW1lbnRUeXBlLkFHRU5UKTtcblxuICAgICAgLy8gTG9hZCBhbGwgYWdlbnRzXG4gICAgICBjb25zdCBhZ2VudHM6IEFnZW50W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBhZ2VudEZpbGVzKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmaWxlLnN1YnN0cmluZygwLCBmaWxlLmxlbmd0aCAtIEFHRU5UX0ZJTEVfRVhURU5TSU9OLmxlbmd0aCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQobmFtZSk7XG4gICAgICAgICAgaWYgKGFnZW50KSB7XG4gICAgICAgICAgICBhZ2VudHMucHVzaChhZ2VudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gbG9hZCBhZ2VudCAke25hbWV9OmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFnZW50cztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIG1pc3NpbmcgZGlyZWN0b3J5IGdyYWNlZnVsbHkgd2l0aCB0eXBlLXNhZmUgY2hlY2tcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0FnZW50cyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgeWV0LCByZXR1cm5pbmcgZW1wdHkgYXJyYXknKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gbGlzdCBhZ2VudHMnLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFnZW50IGV4aXN0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4aXN0cyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgZmlsZW5hbWUpO1xuICAgICAgXG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZXBhdGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGFnZW50IG5hbWVcbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZU5hbWUobmFtZTogc3RyaW5nKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gICAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ05hbWUgY2Fubm90IGJlIGVtcHR5JyB9O1xuICAgIH1cblxuICAgIGlmIChuYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ05hbWUgY2Fubm90IGV4Y2VlZCAxMDAgY2hhcmFjdGVycycgfTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdGVFbGVtZW50TmFtZShuYW1lKSkge1xuICAgICAgcmV0dXJuIHsgXG4gICAgICAgIHZhbGlkOiBmYWxzZSwgXG4gICAgICAgIGVycm9yOiAnTmFtZSBjYW4gb25seSBjb250YWluIGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcycgXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgcHVibGljIGdldEVsZW1lbnRUeXBlKCk6IEVsZW1lbnRUeXBlIHtcbiAgICByZXR1cm4gRWxlbWVudFR5cGUuQUdFTlQ7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhZ2VudCBzdGF0ZSBmcm9tIGZpbGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFnZW50U3RhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudFN0YXRlIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgICAgaWYgKHRoaXMuc3RhdGVDYWNoZS5oYXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVDYWNoZS5nZXQobmFtZSkhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGF0ZUZpbGVuYW1lID0gYCR7bmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWA7XG4gICAgICBjb25zdCBzdGF0ZUZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgU1RBVEVfRElSRUNUT1JZLCBzdGF0ZUZpbGVuYW1lKTtcblxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZShzdGF0ZUZpbGVwYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgXG4gICAgICAvLyBQYXJzZSBZQU1MIHNhZmVseVxuICAgICAgY29uc3QgcGFyc2VkQ29udGVudCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoY29udGVudCwge1xuICAgICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0YXRlID0gcGFyc2VkQ29udGVudC5kYXRhIGFzIGFueTtcbiAgICAgIFxuICAgICAgLy8gQ29udmVydCBzdHJpbmcgbnVtYmVycyBiYWNrIHRvIG51bWJlcnNcbiAgICAgIGlmIChzdGF0ZS5zZXNzaW9uQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdGF0ZS5zZXNzaW9uQ291bnQgPSBwYXJzZUludChzdGF0ZS5zZXNzaW9uQ291bnQsIDEwKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ29udmVydCBnb2FsIG51bWJlcnNcbiAgICAgIGlmIChzdGF0ZS5nb2Fscykge1xuICAgICAgICBzdGF0ZS5nb2Fscy5mb3JFYWNoKChnb2FsOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQpIGdvYWwuaW1wb3J0YW5jZSA9IHBhcnNlSW50KGdvYWwuaW1wb3J0YW5jZSwgMTApO1xuICAgICAgICAgIGlmIChnb2FsLnVyZ2VuY3kgIT09IHVuZGVmaW5lZCkgZ29hbC51cmdlbmN5ID0gcGFyc2VJbnQoZ29hbC51cmdlbmN5LCAxMCk7XG4gICAgICAgICAgaWYgKGdvYWwuZXN0aW1hdGVkRWZmb3J0ICE9PSB1bmRlZmluZWQpIGdvYWwuZXN0aW1hdGVkRWZmb3J0ID0gcGFyc2VGbG9hdChnb2FsLmVzdGltYXRlZEVmZm9ydCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDb252ZXJ0IGRlY2lzaW9uIGNvbmZpZGVuY2VcbiAgICAgIGlmIChzdGF0ZS5kZWNpc2lvbnMpIHtcbiAgICAgICAgc3RhdGUuZGVjaXNpb25zLmZvckVhY2goKGRlY2lzaW9uOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkKSBkZWNpc2lvbi5jb25maWRlbmNlID0gcGFyc2VGbG9hdChkZWNpc2lvbi5jb25maWRlbmNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhY2hlIHRoZSBzdGF0ZVxuICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChuYW1lLCBzdGF0ZSk7XG5cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBhZ2VudCBzdGF0ZTogJHtuYW1lfWAsIGVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGFnZW50IHN0YXRlIHRvIGZpbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlQWdlbnRTdGF0ZShuYW1lOiBzdHJpbmcsIHN0YXRlOiBBZ2VudFN0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRlRmlsZW5hbWUgPSBgJHtuYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YDtcbiAgICAgIGNvbnN0IHN0YXRlRmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBTVEFURV9ESVJFQ1RPUlksIHN0YXRlRmlsZW5hbWUpO1xuXG4gICAgICAvLyBDb252ZXJ0IGRhdGVzIHRvIElTTyBzdHJpbmdzIGFuZCBudW1iZXJzIHRvIHN0cmluZ3MgZm9yIEZBSUxTQUZFX1NDSEVNQVxuICAgICAgY29uc3Qgc2VyaWFsaXplZFN0YXRlID0ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbGFzdEFjdGl2ZTogc3RhdGUubGFzdEFjdGl2ZSBpbnN0YW5jZW9mIERhdGUgPyBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCkgOiBzdGF0ZS5sYXN0QWN0aXZlLFxuICAgICAgICBzZXNzaW9uQ291bnQ6IFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQpLFxuICAgICAgICBnb2Fsczogc3RhdGUuZ29hbHMubWFwKGdvYWwgPT4gKHtcbiAgICAgICAgICAuLi5nb2FsLFxuICAgICAgICAgIGNyZWF0ZWRBdDogZ29hbC5jcmVhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwuY3JlYXRlZEF0LFxuICAgICAgICAgIHVwZGF0ZWRBdDogZ29hbC51cGRhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC51cGRhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwudXBkYXRlZEF0LFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBnb2FsLmNvbXBsZXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwuY29tcGxldGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwuY29tcGxldGVkQXQsXG4gICAgICAgICAgaW1wb3J0YW5jZTogZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5pbXBvcnRhbmNlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB1cmdlbmN5OiBnb2FsLnVyZ2VuY3kgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLnVyZ2VuY3kpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVzdGltYXRlZEVmZm9ydDogZ29hbC5lc3RpbWF0ZWRFZmZvcnQgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhnb2FsLmVzdGltYXRlZEVmZm9ydCkgOiB1bmRlZmluZWRcbiAgICAgICAgfSkpLFxuICAgICAgICBkZWNpc2lvbnM6IHN0YXRlLmRlY2lzaW9ucy5tYXAoZGVjaXNpb24gPT4gKHtcbiAgICAgICAgICAuLi5kZWNpc2lvbixcbiAgICAgICAgICB0aW1lc3RhbXA6IGRlY2lzaW9uLnRpbWVzdGFtcCBpbnN0YW5jZW9mIERhdGUgPyBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSA6IGRlY2lzaW9uLnRpbWVzdGFtcCxcbiAgICAgICAgICBjb25maWRlbmNlOiBkZWNpc2lvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZGVjaXNpb24uY29uZmlkZW5jZSkgOiB1bmRlZmluZWRcbiAgICAgICAgfSkpXG4gICAgICB9O1xuXG4gICAgICAvLyBDb252ZXJ0IHN0YXRlIHRvIFlBTUxcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKHNlcmlhbGl6ZWRTdGF0ZSwge1xuICAgICAgICBzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BLFxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgc2l6ZVxuICAgICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA+IE1BWF9ZQU1MX1NJWkUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGF0ZSBzaXplIGV4Y2VlZHMgbWF4aW11bSBvZiAke01BWF9ZQU1MX1NJWkV9IGJ5dGVzYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdyaXRlIGF0b21pY2FsbHlcbiAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoc3RhdGVGaWxlcGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBjYWNoZVxuICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChuYW1lLCBzdGF0ZSk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQWdlbnQgc3RhdGUgc2F2ZWQ6ICR7bmFtZX1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc2F2ZSBhZ2VudCBzdGF0ZTogJHtuYW1lfWAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhZ2VudCBmaWxlIGNvbnRlbnRcbiAgICovXG4gIHByaXZhdGUgcGFyc2VBZ2VudEZpbGUoY29udGVudDogc3RyaW5nKTogQWdlbnRGaWxlRGF0YSB7XG4gICAgLy8gRXh0cmFjdCBmcm9udG1hdHRlciBhbmQgY29udGVudFxuICAgIGNvbnN0IGZyb250bWF0dGVyUmVnZXggPSAvXi0tLVxcbihbXFxzXFxTXSo/KVxcbi0tLVxcbihbXFxzXFxTXSopJC87XG4gICAgY29uc3QgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZyb250bWF0dGVyUmVnZXgpO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFnZW50IGZpbGUgZm9ybWF0IC0gbWlzc2luZyBmcm9udG1hdHRlcicpO1xuICAgIH1cblxuICAgIGNvbnN0IFssIGZyb250bWF0dGVyLCBib2R5XSA9IG1hdGNoO1xuXG4gICAgLy8gUGFyc2UgZnJvbnRtYXR0ZXIgLSBTZWN1cmVZYW1sUGFyc2VyIGV4cGVjdHMgZnVsbCBjb250ZW50IHdpdGggZnJvbnRtYXR0ZXIgbWFya2Vyc1xuICAgIC8vIGJ1dCB3ZSdyZSBwYXNzaW5nIGp1c3QgdGhlIFlBTUwgY29udGVudCwgc28gd2UgbmVlZCB0byBwYXJzZSBpdCBkaXJlY3RseVxuICAgIGNvbnN0IHBhcnNlZFlhbWwgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGAtLS1cXG4ke2Zyb250bWF0dGVyfVxcbi0tLWAsIHtcbiAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSAgLy8gV2UnbGwgdmFsaWRhdGUgYm9keSBzZXBhcmF0ZWx5XG4gICAgfSk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZWRZYW1sLmRhdGEgYXMgdW5rbm93biBhcyBBZ2VudE1ldGFkYXRhO1xuXG4gICAgLy8gVmFsaWRhdGUgdHlwZSBpZiB1c2luZyB0aGUgdHlwZWQgbWV0YWRhdGFcbiAgICBjb25zdCB0eXBlZE1ldGFkYXRhID0gbWV0YWRhdGEgYXMgYW55O1xuICAgIGlmICh0eXBlZE1ldGFkYXRhLnR5cGUgJiYgdHlwZWRNZXRhZGF0YS50eXBlICE9PSBFbGVtZW50VHlwZS5BR0VOVCAmJiB0eXBlZE1ldGFkYXRhLnR5cGUgIT09ICdhZ2VudCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGU6IGV4cGVjdGVkICcke0VsZW1lbnRUeXBlLkFHRU5UfScsIGdvdCAnJHt0eXBlZE1ldGFkYXRhLnR5cGV9J2ApO1xuICAgIH1cblxuICAgIC8vIEZJWCAjMTEyMzogRXh0cmFjdCBhbmQgdmFsaWRhdGUgdHJpZ2dlcnMgZm9yIEVuaGFuY2VkIEluZGV4IHN1cHBvcnRcbiAgICAvLyBGb2xsb3dpbmcgcGF0dGVybiBmcm9tIFRlbXBsYXRlTWFuYWdlciAoUFIgIzExMzcpLCBTa2lsbE1hbmFnZXIgKFBSICMxMTM2KSBhbmQgTWVtb3J5TWFuYWdlciAoUFIgIzExMzMpXG4gICAgaWYgKHR5cGVkTWV0YWRhdGEudHJpZ2dlcnMgJiYgQXJyYXkuaXNBcnJheSh0eXBlZE1ldGFkYXRhLnRyaWdnZXJzKSkge1xuICAgICAgY29uc3QgeyB2YWxpZFRyaWdnZXJzLCByZWplY3RlZFRyaWdnZXJzIH0gPSB0aGlzLnZhbGlkYXRlVHJpZ2dlcnModHlwZWRNZXRhZGF0YS50cmlnZ2Vycyk7XG5cbiAgICAgIC8vIExvZyB3YXJuaW5ncyBmb3IgcmVqZWN0ZWQgdHJpZ2dlcnMgdG8gYWlkIGRlYnVnZ2luZ1xuICAgICAgaWYgKHJlamVjdGVkVHJpZ2dlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQWdlbnQgXCIke21ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nfVwiOiBSZWplY3RlZCAke3JlamVjdGVkVHJpZ2dlcnMubGVuZ3RofSBpbnZhbGlkIHRyaWdnZXIocylgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFnZW50TmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIHJlamVjdGVkVHJpZ2dlcnMsXG4gICAgICAgICAgICBhY2NlcHRlZENvdW50OiB2YWxpZFRyaWdnZXJzLmxlbmd0aFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgbGltaXQgYW5kIHdhcm4gaWYgZXhjZWVkZWRcbiAgICAgIGlmICh2YWxpZFRyaWdnZXJzLmxlbmd0aCA+IDIwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCBcIiR7bWV0YWRhdGEubmFtZSB8fCAndW5rbm93bid9XCI6IFRyaWdnZXIgY291bnQgZXhjZWVkcyBsaW1pdCAoJHt2YWxpZFRyaWdnZXJzLmxlbmd0aH0gPiAyMCksIHRydW5jYXRpbmdgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFnZW50TmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIHRvdGFsVHJpZ2dlcnM6IHZhbGlkVHJpZ2dlcnMubGVuZ3RoLFxuICAgICAgICAgICAgdHJ1bmNhdGVkVHJpZ2dlcnM6IHZhbGlkVHJpZ2dlcnMuc2xpY2UoMjApXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IHZhbGlkVHJpZ2dlcnMuc2xpY2UoMCwgMjApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YSxcbiAgICAgIGNvbnRlbnQ6IGJvZHkudHJpbSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgYWdlbnQgdG8gZmlsZSBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgc2VyaWFsaXplVG9GaWxlKGFnZW50OiBBZ2VudCwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRhZGF0YTogYW55ID0ge1xuICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgIHR5cGU6IEVsZW1lbnRUeXBlLkFHRU5ULFxuICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogYWdlbnQubWV0YWRhdGEuY3JlYXRlZCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtb2RpZmllZDogYWdlbnQubWV0YWRhdGEubW9kaWZpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgZGVjaXNpb25GcmFtZXdvcms6IGFnZW50LmV4dGVuc2lvbnM/LmRlY2lzaW9uRnJhbWV3b3JrLFxuICAgICAgcmlza1RvbGVyYW5jZTogYWdlbnQuZXh0ZW5zaW9ucz8ucmlza1RvbGVyYW5jZSxcbiAgICAgIGxlYXJuaW5nRW5hYmxlZDogYWdlbnQuZXh0ZW5zaW9ucz8ubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQgP1xuICAgICAgICBTdHJpbmcoYWdlbnQuZXh0ZW5zaW9ucy5sZWFybmluZ0VuYWJsZWQpIDogdW5kZWZpbmVkLFxuICAgICAgbWF4Q29uY3VycmVudEdvYWxzOiAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YSkubWF4Q29uY3VycmVudEdvYWxzLFxuICAgICAgc3BlY2lhbGl6YXRpb25zOiBhZ2VudC5leHRlbnNpb25zPy5zcGVjaWFsaXphdGlvbnMsXG4gICAgICB0cmlnZ2VyczogKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGEpLnRyaWdnZXJzICAvLyBGSVggIzExMjM6IFByZXNlcnZlIHRyaWdnZXJzIHdoZW4gc2F2aW5nXG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSB1bmRlZmluZWQgdmFsdWVzXG4gICAgT2JqZWN0LmtleXMobWV0YWRhdGEpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChtZXRhZGF0YVtrZXkgYXMga2V5b2YgdHlwZW9mIG1ldGFkYXRhXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtrZXkgYXMga2V5b2YgdHlwZW9mIG1ldGFkYXRhXTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG1ldGFkYXRhLCB7XG4gICAgICBzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BLFxuICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgc29ydEtleXM6IHRydWVcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gYC0tLVxcbiR7eWFtbENvbnRlbnR9LS0tXFxuXFxuJHtjb250ZW50fWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpbGVuYW1lIGZvciBhZ2VudFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGaWxlbmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtuYW1lfSR7QUdFTlRfRklMRV9FWFRFTlNJT059YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBlbGVtZW50IG5hbWVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVFbGVtZW50TmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlc1xuICAgIHJldHVybiAvXlthLXpBLVowLTlfLV0rJC8udGVzdChuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIGZvciBhdHRyaWJ1dGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkRPTExIT1VTRV9VU0VSIHx8ICdhbm9ueW1vdXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gYWdlbnQgYnkgcHJlZGljYXRlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmluZChwcmVkaWNhdGU6IChlbGVtZW50OiBBZ2VudCkgPT4gYm9vbGVhbik6IFByb21pc2U8QWdlbnQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gYWdlbnRzLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIG1hbnkgYWdlbnRzIGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKGVsZW1lbnQ6IEFnZW50KSA9PiBib29sZWFuKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGFnZW50cy5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBhZ2VudFxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlKGVsZW1lbnQ6IEFnZW50KTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIHJldHVybiBlbGVtZW50LnZhbGlkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBwYXRoXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGZvciBwYXRoIHRyYXZlcnNhbFxuICAgIGlmIChwYXRoLmluY2x1ZGVzKCcuLicpIHx8IHBhdGguaW5jbHVkZXMoJ34nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBDaGVjayBmb3IgYWJzb2x1dGUgcGF0aHNcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKCcvJykgfHwgcGF0aC5tYXRjaCgvXltBLVphLXpdOi8pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaWxlIGV4dGVuc2lvblxuICAgKi9cbiAgcHVibGljIGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQUdFTlRfRklMRV9FWFRFTlNJT047XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGFnZW50IGZyb20gZGF0YVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ/OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHBhcnNlZC5tZXRhZGF0YSk7XG4gICAgICBpZiAocGFyc2VkLnN0YXRlKSB7XG4gICAgICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHBhcnNlZCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQYXJzZSBhcyBtYXJrZG93biB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICAgIGNvbnN0IGFnZW50RGF0YSA9IHRoaXMucGFyc2VBZ2VudEZpbGUoZGF0YSk7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChhZ2VudERhdGEubWV0YWRhdGEpO1xuICAgICAgaWYgKGFnZW50RGF0YS5zdGF0ZSkge1xuICAgICAgICBhZ2VudC5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgLi4uSlNPTi5wYXJzZShhZ2VudC5zZXJpYWxpemVUb0pTT04oKSksXG4gICAgICAgICAgc3RhdGU6IGFnZW50RGF0YS5zdGF0ZVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWdlbnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBhZ2VudCB0byBhIGZvcm1hdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4cG9ydEVsZW1lbnQoZWxlbWVudDogQWdlbnQsIGZvcm1hdD86ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgLy8gVXNlIHNlcmlhbGl6ZVRvSlNPTiBmb3IgSlNPTiBmb3JtYXQgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgcmV0dXJuIGVsZW1lbnQuc2VyaWFsaXplVG9KU09OKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV4cG9ydCBhcyBtYXJrZG93biB3aXRoIFlBTUwgZnJvbnRtYXR0ZXIgKGRlZmF1bHQpXG4gICAgICBjb25zdCBjb250ZW50ID0gYCMgJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9XFxuXFxuJHtlbGVtZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnfWA7XG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVUb0ZpbGUoZWxlbWVudCwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYW4gYWdlbnQgdG8gYSBzcGVjaWZpYyBwYXRoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZShlbGVtZW50OiBBZ2VudCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmFtZSA9IHRhcmdldFBhdGgucmVwbGFjZShBR0VOVF9GSUxFX0VYVEVOU0lPTiwgJycpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBgIyAke2VsZW1lbnQubWV0YWRhdGEubmFtZX1cXG5cXG4ke2VsZW1lbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgJyd9YDtcbiAgICBcbiAgICAvLyBTYXZlIHRoZSBhZ2VudCBmaWxlXG4gICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKG5hbWUpO1xuICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5pc0Fic29sdXRlKHRhcmdldFBhdGgpID8gdGFyZ2V0UGF0aCA6IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIGZpbGVuYW1lKTtcbiAgICBjb25zdCBmaWxlQ29udGVudCA9IHRoaXMuc2VyaWFsaXplVG9GaWxlKGVsZW1lbnQsIGNvbnRlbnQpO1xuICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoZmlsZXBhdGgsIGZpbGVDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgLy8gU2F2ZSBzdGF0ZSBpZiBuZWVkZWRcbiAgICBpZiAoZWxlbWVudC5uZWVkc1N0YXRlUGVyc2lzdGVuY2UoKSkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZShuYW1lLCBlbGVtZW50LmdldFN0YXRlKCkpO1xuICAgICAgZWxlbWVudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdHJpZ2dlcnMgYXJyYXkgYW5kIHJldHVybiB2YWxpZCBhbmQgcmVqZWN0ZWQgdHJpZ2dlcnNcbiAgICogRXh0cmFjdGVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRyaWdnZXJzKHRyaWdnZXJzOiBhbnlbXSk6IHsgdmFsaWRUcmlnZ2Vyczogc3RyaW5nW10sIHJlamVjdGVkVHJpZ2dlcnM6IHN0cmluZ1tdIH0ge1xuICAgIGNvbnN0IHNhbml0aXplZFRyaWdnZXJzID0gdHJpZ2dlcnMubWFwKCh0cmlnZ2VyOiBhbnkpID0+ICh7XG4gICAgICByYXc6IHRyaWdnZXIsXG4gICAgICBzYW5pdGl6ZWQ6IHNhbml0aXplSW5wdXQoU3RyaW5nKHRyaWdnZXIpLCBNQVhfVFJJR0dFUl9MRU5HVEgpXG4gICAgfSkpO1xuXG4gICAgY29uc3QgdmFsaWRUcmlnZ2Vyczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZWplY3RlZFRyaWdnZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB7IHJhdywgc2FuaXRpemVkIH0gb2Ygc2FuaXRpemVkVHJpZ2dlcnMpIHtcbiAgICAgIGlmICghc2FuaXRpemVkKSB7XG4gICAgICAgIHJlamVjdGVkVHJpZ2dlcnMucHVzaChgXCIke3Jhd31cIiAoZW1wdHkgYWZ0ZXIgc2FuaXRpemF0aW9uKWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFUUklHR0VSX1ZBTElEQVRJT05fUkVHRVgudGVzdChzYW5pdGl6ZWQpKSB7XG4gICAgICAgIHJlamVjdGVkVHJpZ2dlcnMucHVzaChgXCIke3Nhbml0aXplZH1cIiAoaW52YWxpZCBmb3JtYXQgLSBtdXN0IGJlIGFscGhhbnVtZXJpYyB3aXRoIGh5cGhlbnMvdW5kZXJzY29yZXMgb25seSlgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhbGlkVHJpZ2dlcnMucHVzaChzYW5pdGl6ZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkVHJpZ2dlcnMsIHJlamVjdGVkVHJpZ2dlcnMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGFnZW50IGZyb20gYSBzcGVjaWZpYyBwYXRoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZCh0YXJnZXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50PiB7XG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQodGFyZ2V0UGF0aC5yZXBsYWNlKEFHRU5UX0ZJTEVfRVhURU5TSU9OLCAnJykpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjMjA2OiBEb24ndCBleHBvc2UgZmlsZSBwYXRocyBpbiBlcnJvciBtZXNzYWdlc1xuICAgICAgbG9nZ2VyLmVycm9yKCdBZ2VudCBub3QgZm91bmQnLCB7IHBhdGg6IHRhcmdldFBhdGggfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FnZW50IG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICByZXR1cm4gYWdlbnQ7XG4gIH1cbn0iXX0=
|
|
667
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR25DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsWUFBWTtBQUNaLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0FBQ25DLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQztBQUNqQyxNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztBQUMzQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsUUFBUTtBQUMxQyxNQUFNLGFBQWEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsdUJBQXVCO0FBRXhELDBDQUEwQztBQUMxQyxNQUFNLGtC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QWdCLEdBQWEsRUFBRSxDQUFDO1FBRXRDLEtBQUssTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLDhCQUE4QixDQUFDLENBQUM7Z0JBQzdELFNBQVM7WUFDWCxDQUFDO1lBRUQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLHlFQUF5RSxDQUFDLENBQUM7Z0JBQzlHLFNBQVM7WUFDWCxDQUFDO1lBRUQsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBa0I7UUFDbEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCwrREFBK0Q7WUFDL0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50TWFuYWdlciAtIEhhbmRsZXMgQ1JVRCBvcGVyYXRpb25zIGZvciBBZ2VudCBlbGVtZW50c1xuICogRm9sbG93cyBwYXR0ZXJucyBmcm9tIFBlcnNvbmFFbGVtZW50TWFuYWdlciBhbmQgTWVtb3J5TWFuYWdlclxuICogXG4gKiBTRUNVUklUWTogVXNlcyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyBvcGVyYXRpb25zIGFuZCBTZWN1cmVZYW1sUGFyc2VyIGZvciBzYWZlIFlBTUwgcGFyc2luZ1xuICovXG5cbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi9BZ2VudC5qcyc7XG5pbXBvcnQgeyBBZ2VudE1ldGFkYXRhLCBBZ2VudFN0YXRlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIsIEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvaW5kZXguanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbi8vIENvbnN0YW50c1xuY29uc3QgQUdFTlRfRklMRV9FWFRFTlNJT04gPSAnLm1kJztcbmNvbnN0IFNUQVRFX0RJUkVDVE9SWSA9ICcuc3RhdGUnO1xuY29uc3QgU1RBVEVfRklMRV9FWFRFTlNJT04gPSAnLnN0YXRlLnlhbWwnO1xuY29uc3QgTUFYX0ZJTEVfU0laRSA9IDEwMCAqIDEwMjQ7IC8vIDEwMEtCXG5jb25zdCBNQVhfWUFNTF9TSVpFID0gNjQgKiAxMDI0OyAvLyA2NEtCIGZvciBmcm9udG1hdHRlclxuXG4vLyBWYWxpZGF0aW9uIGNvbnN0YW50cyBmb3IgYWdlbnQgdHJpZ2dlcnNcbmNvbnN0IE1BWF9UUklHR0VSX0xFTkdUSCA9IDUwO1xuY29uc3QgVFJJR0dFUl9WQUxJREFUSU9OX1JFR0VYID0gL15bYS16QS1aMC05XFwtX10rJC87XG5cbi8vIEVsZW1lbnQgY3JlYXRpb24gcmVzdWx0IGludGVyZmFjZVxuaW50ZXJmYWNlIEVsZW1lbnRDcmVhdGlvblJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZWxlbWVudD86IEFnZW50O1xufVxuXG5pbnRlcmZhY2UgQWdlbnRGaWxlRGF0YSB7XG4gIG1ldGFkYXRhOiBBZ2VudE1ldGFkYXRhO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHN0YXRlPzogQWdlbnRTdGF0ZTtcbn1cblxuZXhwb3J0IGNsYXNzIEFnZW50TWFuYWdlciBpbXBsZW1lbnRzIElFbGVtZW50TWFuYWdlcjxBZ2VudD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGFnZW50c1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZUNhY2hlOiBNYXA8c3RyaW5nLCBBZ2VudFN0YXRlPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKHBvcnRmb2xpb1BhdGg6IHN0cmluZykge1xuICAgIHRoaXMuYWdlbnRzUGF0aCA9IHBhdGguam9pbihwb3J0Zm9saW9QYXRoLCBFbGVtZW50VHlwZS5BR0VOVCk7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGFnZW50cyBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGFnZW50cyBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgYXdhaXQgZnMubWtkaXIodGhpcy5hZ2VudHNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIC5zdGF0ZSBkaXJlY3RvcnkgZm9yIGFnZW50IHN0YXRlc1xuICAgICAgY29uc3Qgc3RhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgU1RBVEVfRElSRUNUT1JZKTtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKHN0YXRlUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKCdBZ2VudE1hbmFnZXIgaW5pdGlhbGl6ZWQnLCB7IHBhdGg6IHRoaXMuYWdlbnRzUGF0aCB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBBZ2VudE1hbmFnZXInLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGFnZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFBhcnRpYWw8QWdlbnRNZXRhZGF0YT5cbiAgKTogUHJvbWlzZTxFbGVtZW50Q3JlYXRpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gU2FuaXRpemUgaW5wdXRzXG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShuYW1lKS5ub3JtYWxpemVkQ29udGVudCwgMTAwKTtcbiAgICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMCk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRDb250ZW50ID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjb250ZW50KS5ub3JtYWxpemVkQ29udGVudCwgNTAwMDApO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBuYW1lXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVFbGVtZW50TmFtZShzYW5pdGl6ZWROYW1lKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGFnZW50IG5hbWUuIFVzZSBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlcy4nXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFnZW50IGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIGZpbGVuYW1lKTtcblxuICAgICAgLy8gQ3JlYXRlIGFnZW50IGluc3RhbmNlXG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICAgIG5hbWU6IHNhbml0aXplZE5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzYW5pdGl6ZWREZXNjcmlwdGlvbixcbiAgICAgICAgLi4ubWV0YWRhdGFcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgYXV0aG9yXG4gICAgICBhZ2VudC5tZXRhZGF0YS5hdXRob3IgPSB0aGlzLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcblxuICAgICAgLy8gUHJlcGFyZSBmaWxlIGNvbnRlbnRcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gdGhpcy5zZXJpYWxpemVUb0ZpbGUoYWdlbnQsIHNhbml0aXplZENvbnRlbnQpO1xuXG4gICAgICAvLyBTRUNVUklUWSBGSVg6IFVzZSBhdG9taWMgZmlsZSBjcmVhdGlvbiB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgICAgLy8gUHJldmlvdXNseTogVXNlZCBhY2Nlc3MoKSBjaGVjayBmb2xsb3dlZCBieSB3cml0ZSwgd2hpY2ggY291bGQgcmFjZVxuICAgICAgLy8gTm93OiBVc2UgZXhjbHVzaXZlIGZpbGUgY3JlYXRpb24gdGhhdCBmYWlscyBhdG9taWNhbGx5IGlmIGZpbGUgZXhpc3RzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmZCA9IGF3YWl0IGZzLm9wZW4oZmlsZXBhdGgsICd3eCcpOyAvLyAnd3gnID0gZXhjbHVzaXZlIHdyaXRlLCBmYWlscyBpZiBleGlzdHNcbiAgICAgICAgYXdhaXQgZmQud3JpdGVGaWxlKGZpbGVDb250ZW50LCAndXRmLTgnKTtcbiAgICAgICAgYXdhaXQgZmQuY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFRVhJU1QnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNyZWF0ZScsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCAnJHtzYW5pdGl6ZWROYW1lfScgY3JlYXRlZGAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGFnZW50SWQ6IGFnZW50LmlkIH1cbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuaW5mbyhgQWdlbnQgY3JlYXRlZDogJHtzYW5pdGl6ZWROYW1lfWApO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiBg8J+kliAqKiR7c2FuaXRpemVkTmFtZX0qKiBieSAke2FnZW50Lm1ldGFkYXRhLmF1dGhvciB8fCAnYW5vbnltb3VzJ31gLFxuICAgICAgICBlbGVtZW50OiBhZ2VudFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGFnZW50JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBjcmVhdGUgYWdlbnQnXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGFuIGFnZW50IGJ5IG5hbWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWFkKG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIGZpbGVuYW1lKTtcblxuICAgICAgLy8gUmVhZCBmaWxlIHdpdGggbG9ja1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZShmaWxlcGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZmlsZSBzaXplXG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBNQVhfRklMRV9TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgZmlsZSBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke01BWF9GSUxFX1NJWkV9IGJ5dGVzYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIGZpbGVcbiAgICAgIGNvbnN0IGFnZW50RGF0YSA9IHRoaXMucGFyc2VBZ2VudEZpbGUoY29udGVudCk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBhZ2VudCBpbnN0YW5jZSAtIGVuc3VyZSBtZXRhZGF0YSBpcyBwYXNzZWQgY29ycmVjdGx5XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChhZ2VudERhdGEubWV0YWRhdGEpO1xuICAgICAgXG4gICAgICAvLyBMb2FkIHN0YXRlIGlmIGF2YWlsYWJsZVxuICAgICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmxvYWRBZ2VudFN0YXRlKHNhbml0aXplZE5hbWUpO1xuICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAuLi5KU09OLnBhcnNlKGFnZW50LnNlcmlhbGl6ZVRvSlNPTigpKSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVhZCBhZ2VudDogJHtuYW1lfWAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW4gYWdlbnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGRhdGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHVwZGF0ZXM6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YT4sXG4gICAgY29udGVudD86IHN0cmluZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQobmFtZSk7XG4gICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCBub3QgZm91bmQgZm9yIHVwZGF0ZTogJHtuYW1lfWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IG1ldGFkYXRhIHVwZGF0ZXNcbiAgICAgIGlmICh1cGRhdGVzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KFxuICAgICAgICAgIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHVwZGF0ZXMuZGVzY3JpcHRpb24pLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICAgIDUwMFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodXBkYXRlcy5zcGVjaWFsaXphdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgICAgc3BlY2lhbGl6YXRpb25zOiB1cGRhdGVzLnNwZWNpYWxpemF0aW9ucy5tYXAoKHM6IHN0cmluZykgPT4gc2FuaXRpemVJbnB1dChzLCA1MCkpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh1cGRhdGVzLmRlY2lzaW9uRnJhbWV3b3JrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICAgIGRlY2lzaW9uRnJhbWV3b3JrOiB1cGRhdGVzLmRlY2lzaW9uRnJhbWV3b3JrXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh1cGRhdGVzLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgICAgcmlza1RvbGVyYW5jZTogdXBkYXRlcy5yaXNrVG9sZXJhbmNlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBtb2RpZmljYXRpb24gdGltZVxuICAgICAgYWdlbnQubWV0YWRhdGEubW9kaWZpZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IGNvbnRlbnQgaWYgbm90IHByb3ZpZGVkXG4gICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShuYW1lKTtcbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBmaWxlbmFtZSk7XG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKGZpbGVwYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlQWdlbnRGaWxlKGZpbGVDb250ZW50KTtcbiAgICAgICAgY29udGVudCA9IHBhcnNlZC5jb250ZW50O1xuICAgICAgfVxuXG4gICAgICAvLyBTYXZlIGFnZW50XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUobmFtZSk7XG4gICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gdGhpcy5zZXJpYWxpemVUb0ZpbGUoYWdlbnQsIGNvbnRlbnQpO1xuICAgICAgXG4gICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKGZpbGVwYXRoLCBmaWxlQ29udGVudCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgLy8gU2F2ZSBzdGF0ZSBpZiBuZWVkZWRcbiAgICAgIGlmIChhZ2VudC5uZWVkc1N0YXRlUGVyc2lzdGVuY2UoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVBZ2VudFN0YXRlKG5hbWUsIGFnZW50LmdldFN0YXRlKCkpO1xuICAgICAgICBhZ2VudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oYEFnZW50IHVwZGF0ZWQ6ICR7bmFtZX1gKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB1cGRhdGUgYWdlbnQ6ICR7bmFtZX1gLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBhZ2VudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgZmlsZW5hbWUpO1xuXG4gICAgICAvLyBDaGVjayBpZiBmaWxlIGV4aXN0c1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVwYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIERlbGV0ZSBtYWluIGZpbGVcbiAgICAgIGF3YWl0IGZzLnVubGluayhmaWxlcGF0aCk7XG5cbiAgICAgIC8vIERlbGV0ZSBzdGF0ZSBmaWxlIGlmIGV4aXN0c1xuICAgICAgY29uc3Qgc3RhdGVGaWxlbmFtZSA9IGAke3Nhbml0aXplZE5hbWV9JHtTVEFURV9GSUxFX0VYVEVOU0lPTn1gO1xuICAgICAgY29uc3Qgc3RhdGVGaWxlcGF0aCA9IHBhdGguam9pbih0aGlzLmFnZW50c1BhdGgsIFNUQVRFX0RJUkVDVE9SWSwgc3RhdGVGaWxlbmFtZSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsoc3RhdGVGaWxlcGF0aCk7XG4gICAgICAgIHRoaXMuc3RhdGVDYWNoZS5kZWxldGUoc2FuaXRpemVkTmFtZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3RhdGUgZmlsZSBtaWdodCBub3QgZXhpc3RcbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGRlbGV0ZWRgXG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmluZm8oYEFnZW50IGRlbGV0ZWQ6ICR7c2FuaXRpemVkTmFtZX1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIGFnZW50OiAke25hbWV9YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIGFnZW50c1xuICAgKiBTRUNVUklUWTogVXNlcyBQb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cygpIHdoaWNoIGZpbHRlcnMgdGVzdCBlbGVtZW50c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBQb3J0Zm9saW9NYW5hZ2VyIHRvIGdldCBmaWx0ZXJlZCBsaXN0IChleGNsdWRlcyB0ZXN0IGVsZW1lbnRzKVxuICAgICAgY29uc3QgYWdlbnRGaWxlcyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHMoRWxlbWVudFR5cGUuQUdFTlQpO1xuXG4gICAgICAvLyBMb2FkIGFsbCBhZ2VudHNcbiAgICAgIGNvbnN0IGFnZW50czogQWdlbnRbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGFnZW50RmlsZXMpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGZpbGUuc3Vic3RyaW5nKDAsIGZpbGUubGVuZ3RoIC0gQUdFTlRfRklMRV9FWFRFTlNJT04ubGVuZ3RoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICAgICAgICBpZiAoYWdlbnQpIHtcbiAgICAgICAgICAgIGFnZW50cy5wdXNoKGFnZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBsb2FkIGFnZW50ICR7bmFtZX06YCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWdlbnRzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBIYW5kbGUgbWlzc2luZyBkaXJlY3RvcnkgZ3JhY2VmdWxseSB3aXRoIHR5cGUtc2FmZSBjaGVja1xuICAgICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnQWdlbnRzIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCB5ZXQsIHJldHVybmluZyBlbXB0eSBhcnJheScpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBsaXN0IGFnZW50cycsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYWdlbnQgZXhpc3RzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhpc3RzKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplZE5hbWUpO1xuICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBmaWxlbmFtZSk7XG4gICAgICBcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlcGF0aCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gYWdlbnQgbmFtZVxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlTmFtZShuYW1lOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnTmFtZSBjYW5ub3QgYmUgZW1wdHknIH07XG4gICAgfVxuXG4gICAgaWYgKG5hbWUubGVuZ3RoID4gMTAwKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnTmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy52YWxpZGF0ZUVsZW1lbnROYW1lKG5hbWUpKSB7XG4gICAgICByZXR1cm4geyBcbiAgICAgICAgdmFsaWQ6IGZhbHNlLCBcbiAgICAgICAgZXJyb3I6ICdOYW1lIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzJyBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZWxlbWVudCB0eXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudFR5cGUoKTogRWxlbWVudFR5cGUge1xuICAgIHJldHVybiBFbGVtZW50VHlwZS5BR0VOVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFnZW50IHN0YXRlIGZyb20gZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQWdlbnRTdGF0ZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50U3RhdGUgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0XG4gICAgICBpZiAodGhpcy5zdGF0ZUNhY2hlLmhhcyhuYW1lKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZUNhY2hlLmdldChuYW1lKSE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXRlRmlsZW5hbWUgPSBgJHtuYW1lfSR7U1RBVEVfRklMRV9FWFRFTlNJT059YDtcbiAgICAgIGNvbnN0IHN0YXRlRmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBTVEFURV9ESVJFQ1RPUlksIHN0YXRlRmlsZW5hbWUpO1xuXG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKHN0YXRlRmlsZXBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIFlBTUwgc2FmZWx5XG4gICAgICBjb25zdCBwYXJzZWRDb250ZW50ID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShjb250ZW50LCB7XG4gICAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RhdGUgPSBwYXJzZWRDb250ZW50LmRhdGEgYXMgYW55O1xuICAgICAgXG4gICAgICAvLyBDb252ZXJ0IHN0cmluZyBudW1iZXJzIGJhY2sgdG8gbnVtYmVyc1xuICAgICAgaWYgKHN0YXRlLnNlc3Npb25Db3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXRlLnNlc3Npb25Db3VudCA9IE51bWJlci5wYXJzZUludChzdGF0ZS5zZXNzaW9uQ291bnQsIDEwKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ29udmVydCBnb2FsIG51bWJlcnNcbiAgICAgIGlmIChzdGF0ZS5nb2Fscykge1xuICAgICAgICBzdGF0ZS5nb2Fscy5mb3JFYWNoKChnb2FsOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQpIGdvYWwuaW1wb3J0YW5jZSA9IE51bWJlci5wYXJzZUludChnb2FsLmltcG9ydGFuY2UsIDEwKTtcbiAgICAgICAgICBpZiAoZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQpIGdvYWwudXJnZW5jeSA9IE51bWJlci5wYXJzZUludChnb2FsLnVyZ2VuY3ksIDEwKTtcbiAgICAgICAgICBpZiAoZ29hbC5lc3RpbWF0ZWRFZmZvcnQgIT09IHVuZGVmaW5lZCkgZ29hbC5lc3RpbWF0ZWRFZmZvcnQgPSBOdW1iZXIucGFyc2VGbG9hdChnb2FsLmVzdGltYXRlZEVmZm9ydCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDb252ZXJ0IGRlY2lzaW9uIGNvbmZpZGVuY2VcbiAgICAgIGlmIChzdGF0ZS5kZWNpc2lvbnMpIHtcbiAgICAgICAgc3RhdGUuZGVjaXNpb25zLmZvckVhY2goKGRlY2lzaW9uOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkKSBkZWNpc2lvbi5jb25maWRlbmNlID0gTnVtYmVyLnBhcnNlRmxvYXQoZGVjaXNpb24uY29uZmlkZW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWNoZSB0aGUgc3RhdGVcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQobmFtZSwgc3RhdGUpO1xuXG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgYWdlbnQgc3RhdGU6ICR7bmFtZX1gLCBlcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhZ2VudCBzdGF0ZSB0byBmaWxlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZUFnZW50U3RhdGUobmFtZTogc3RyaW5nLCBzdGF0ZTogQWdlbnRTdGF0ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0ZUZpbGVuYW1lID0gYCR7bmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWA7XG4gICAgICBjb25zdCBzdGF0ZUZpbGVwYXRoID0gcGF0aC5qb2luKHRoaXMuYWdlbnRzUGF0aCwgU1RBVEVfRElSRUNUT1JZLCBzdGF0ZUZpbGVuYW1lKTtcblxuICAgICAgLy8gQ29udmVydCBkYXRlcyB0byBJU08gc3RyaW5ncyBhbmQgbnVtYmVycyB0byBzdHJpbmdzIGZvciBGQUlMU0FGRV9TQ0hFTUFcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGxhc3RBY3RpdmU6IHN0YXRlLmxhc3RBY3RpdmUgaW5zdGFuY2VvZiBEYXRlID8gc3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpIDogc3RhdGUubGFzdEFjdGl2ZSxcbiAgICAgICAgc2Vzc2lvbkNvdW50OiBTdHJpbmcoc3RhdGUuc2Vzc2lvbkNvdW50KSxcbiAgICAgICAgZ29hbHM6IHN0YXRlLmdvYWxzLm1hcChnb2FsID0+ICh7XG4gICAgICAgICAgLi4uZ29hbCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGdvYWwuY3JlYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLmNyZWF0ZWRBdCxcbiAgICAgICAgICB1cGRhdGVkQXQ6IGdvYWwudXBkYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLnVwZGF0ZWRBdCxcbiAgICAgICAgICBjb21wbGV0ZWRBdDogZ29hbC5jb21wbGV0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBnb2FsLmNvbXBsZXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLmNvbXBsZXRlZEF0LFxuICAgICAgICAgIGltcG9ydGFuY2U6IGdvYWwuaW1wb3J0YW5jZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGdvYWwuaW1wb3J0YW5jZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdXJnZW5jeTogZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC51cmdlbmN5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGdvYWwuZXN0aW1hdGVkRWZmb3J0ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5lc3RpbWF0ZWRFZmZvcnQpIDogdW5kZWZpbmVkXG4gICAgICAgIH0pKSxcbiAgICAgICAgZGVjaXNpb25zOiBzdGF0ZS5kZWNpc2lvbnMubWFwKGRlY2lzaW9uID0+ICh7XG4gICAgICAgICAgLi4uZGVjaXNpb24sXG4gICAgICAgICAgdGltZXN0YW1wOiBkZWNpc2lvbi50aW1lc3RhbXAgaW5zdGFuY2VvZiBEYXRlID8gZGVjaXNpb24udGltZXN0YW1wLnRvSVNPU3RyaW5nKCkgOiBkZWNpc2lvbi50aW1lc3RhbXAsXG4gICAgICAgICAgY29uZmlkZW5jZTogZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGRlY2lzaW9uLmNvbmZpZGVuY2UpIDogdW5kZWZpbmVkXG4gICAgICAgIH0pKVxuICAgICAgfTtcblxuICAgICAgLy8gQ29udmVydCBzdGF0ZSB0byBZQU1MXG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChzZXJpYWxpemVkU3RhdGUsIHtcbiAgICAgICAgc2NoZW1hOiB5YW1sLkZBSUxTQUZFX1NDSEVNQSxcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHNpemVcbiAgICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPiBNQVhfWUFNTF9TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdGUgc2l6ZSBleGNlZWRzIG1heGltdW0gb2YgJHtNQVhfWUFNTF9TSVpFfSBieXRlc2ApO1xuICAgICAgfVxuXG4gICAgICAvLyBXcml0ZSBhdG9taWNhbGx5XG4gICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKHN0YXRlRmlsZXBhdGgsIHlhbWxDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICAvLyBVcGRhdGUgY2FjaGVcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQobmFtZSwgc3RhdGUpO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYEFnZW50IHN0YXRlIHNhdmVkOiAke25hbWV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHNhdmUgYWdlbnQgc3RhdGU6ICR7bmFtZX1gLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYWdlbnQgZmlsZSBjb250ZW50XG4gICAqL1xuICBwcml2YXRlIHBhcnNlQWdlbnRGaWxlKGNvbnRlbnQ6IHN0cmluZyk6IEFnZW50RmlsZURhdGEge1xuICAgIC8vIEV4dHJhY3QgZnJvbnRtYXR0ZXIgYW5kIGNvbnRlbnRcbiAgICBjb25zdCBmcm9udG1hdHRlclJlZ2V4ID0gL14tLS1cXG4oW1xcc1xcU10qPylcXG4tLS1cXG4oW1xcc1xcU10qKSQvO1xuICAgIGNvbnN0IG1hdGNoID0gY29udGVudC5tYXRjaChmcm9udG1hdHRlclJlZ2V4KTtcblxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhZ2VudCBmaWxlIGZvcm1hdCAtIG1pc3NpbmcgZnJvbnRtYXR0ZXInKTtcbiAgICB9XG5cbiAgICBjb25zdCBbLCBmcm9udG1hdHRlciwgYm9keV0gPSBtYXRjaDtcblxuICAgIC8vIFBhcnNlIGZyb250bWF0dGVyIC0gU2VjdXJlWWFtbFBhcnNlciBleHBlY3RzIGZ1bGwgY29udGVudCB3aXRoIGZyb250bWF0dGVyIG1hcmtlcnNcbiAgICAvLyBidXQgd2UncmUgcGFzc2luZyBqdXN0IHRoZSBZQU1MIGNvbnRlbnQsIHNvIHdlIG5lZWQgdG8gcGFyc2UgaXQgZGlyZWN0bHlcbiAgICBjb25zdCBwYXJzZWRZYW1sID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShgLS0tXFxuJHtmcm9udG1hdHRlcn1cXG4tLS1gLCB7XG4gICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UgIC8vIFdlJ2xsIHZhbGlkYXRlIGJvZHkgc2VwYXJhdGVseVxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VkWWFtbC5kYXRhIGFzIHVua25vd24gYXMgQWdlbnRNZXRhZGF0YTtcblxuICAgIC8vIFZhbGlkYXRlIHR5cGUgaWYgdXNpbmcgdGhlIHR5cGVkIG1ldGFkYXRhXG4gICAgY29uc3QgdHlwZWRNZXRhZGF0YSA9IG1ldGFkYXRhIGFzIGFueTtcbiAgICBpZiAodHlwZWRNZXRhZGF0YS50eXBlICYmIHR5cGVkTWV0YWRhdGEudHlwZSAhPT0gRWxlbWVudFR5cGUuQUdFTlQgJiYgdHlwZWRNZXRhZGF0YS50eXBlICE9PSAnYWdlbnQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCB0eXBlOiBleHBlY3RlZCAnJHtFbGVtZW50VHlwZS5BR0VOVH0nLCBnb3QgJyR7dHlwZWRNZXRhZGF0YS50eXBlfSdgKTtcbiAgICB9XG5cbiAgICAvLyBGSVggIzExMjM6IEV4dHJhY3QgYW5kIHZhbGlkYXRlIHRyaWdnZXJzIGZvciBFbmhhbmNlZCBJbmRleCBzdXBwb3J0XG4gICAgLy8gRm9sbG93aW5nIHBhdHRlcm4gZnJvbSBUZW1wbGF0ZU1hbmFnZXIgKFBSICMxMTM3KSwgU2tpbGxNYW5hZ2VyIChQUiAjMTEzNikgYW5kIE1lbW9yeU1hbmFnZXIgKFBSICMxMTMzKVxuICAgIGlmICh0eXBlZE1ldGFkYXRhLnRyaWdnZXJzICYmIEFycmF5LmlzQXJyYXkodHlwZWRNZXRhZGF0YS50cmlnZ2VycykpIHtcbiAgICAgIGNvbnN0IHsgdmFsaWRUcmlnZ2VycywgcmVqZWN0ZWRUcmlnZ2VycyB9ID0gdGhpcy52YWxpZGF0ZVRyaWdnZXJzKHR5cGVkTWV0YWRhdGEudHJpZ2dlcnMpO1xuXG4gICAgICAvLyBMb2cgd2FybmluZ3MgZm9yIHJlamVjdGVkIHRyaWdnZXJzIHRvIGFpZCBkZWJ1Z2dpbmdcbiAgICAgIGlmIChyZWplY3RlZFRyaWdnZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEFnZW50IFwiJHttZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJ31cIjogUmVqZWN0ZWQgJHtyZWplY3RlZFRyaWdnZXJzLmxlbmd0aH0gaW52YWxpZCB0cmlnZ2VyKHMpYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICByZWplY3RlZFRyaWdnZXJzLFxuICAgICAgICAgICAgYWNjZXB0ZWRDb3VudDogdmFsaWRUcmlnZ2Vycy5sZW5ndGhcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IGxpbWl0IGFuZCB3YXJuIGlmIGV4Y2VlZGVkXG4gICAgICBpZiAodmFsaWRUcmlnZ2Vycy5sZW5ndGggPiAyMCkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQWdlbnQgXCIke21ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nfVwiOiBUcmlnZ2VyIGNvdW50IGV4Y2VlZHMgbGltaXQgKCR7dmFsaWRUcmlnZ2Vycy5sZW5ndGh9ID4gMjApLCB0cnVuY2F0aW5nYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICB0b3RhbFRyaWdnZXJzOiB2YWxpZFRyaWdnZXJzLmxlbmd0aCxcbiAgICAgICAgICAgIHRydW5jYXRlZFRyaWdnZXJzOiB2YWxpZFRyaWdnZXJzLnNsaWNlKDIwKVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSB2YWxpZFRyaWdnZXJzLnNsaWNlKDAsIDIwKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGEsXG4gICAgICBjb250ZW50OiBib2R5LnRyaW0oKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIGFnZW50IHRvIGZpbGUgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIHNlcmlhbGl6ZVRvRmlsZShhZ2VudDogQWdlbnQsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YWRhdGE6IGFueSA9IHtcbiAgICAgIG5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICB0eXBlOiBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICBhdXRob3I6IGFnZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IGFnZW50Lm1ldGFkYXRhLmNyZWF0ZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgbW9kaWZpZWQ6IGFnZW50Lm1ldGFkYXRhLm1vZGlmaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBhZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIGRlY2lzaW9uRnJhbWV3b3JrOiBhZ2VudC5leHRlbnNpb25zPy5kZWNpc2lvbkZyYW1ld29yayxcbiAgICAgIHJpc2tUb2xlcmFuY2U6IGFnZW50LmV4dGVuc2lvbnM/LnJpc2tUb2xlcmFuY2UsXG4gICAgICBsZWFybmluZ0VuYWJsZWQ6IGFnZW50LmV4dGVuc2lvbnM/LmxlYXJuaW5nRW5hYmxlZCAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgU3RyaW5nKGFnZW50LmV4dGVuc2lvbnMubGVhcm5pbmdFbmFibGVkKSA6IHVuZGVmaW5lZCxcbiAgICAgIG1heENvbmN1cnJlbnRHb2FsczogKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGEpLm1heENvbmN1cnJlbnRHb2FscyxcbiAgICAgIHNwZWNpYWxpemF0aW9uczogYWdlbnQuZXh0ZW5zaW9ucz8uc3BlY2lhbGl6YXRpb25zLFxuICAgICAgdHJpZ2dlcnM6IChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhKS50cmlnZ2VycyAgLy8gRklYICMxMTIzOiBQcmVzZXJ2ZSB0cmlnZ2VycyB3aGVuIHNhdmluZ1xuICAgIH07XG5cbiAgICAvLyBSZW1vdmUgdW5kZWZpbmVkIHZhbHVlc1xuICAgIE9iamVjdC5rZXlzKG1ldGFkYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAobWV0YWRhdGFba2V5IGFzIGtleW9mIHR5cGVvZiBtZXRhZGF0YV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgbWV0YWRhdGFba2V5IGFzIGtleW9mIHR5cGVvZiBtZXRhZGF0YV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChtZXRhZGF0YSwge1xuICAgICAgc2NoZW1hOiB5YW1sLkZBSUxTQUZFX1NDSEVNQSxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIGAtLS1cXG4ke3lhbWxDb250ZW50fS0tLVxcblxcbiR7Y29udGVudH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaWxlbmFtZSBmb3IgYWdlbnRcbiAgICovXG4gIHByaXZhdGUgZ2V0RmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ke0FHRU5UX0ZJTEVfRVhURU5TSU9OfWA7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZWxlbWVudCBuYW1lXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRWxlbWVudE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gT25seSBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXNcbiAgICByZXR1cm4gL15bYS16QS1aMC05Xy1dKyQvLnRlc3QobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBmb3IgYXR0cmlidXRpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiB8fCAnYW5vbnltb3VzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGFnZW50IGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZpbmQocHJlZGljYXRlOiAoZWxlbWVudDogQWdlbnQpID0+IGJvb2xlYW4pOiBQcm9taXNlPEFnZW50IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGFnZW50cy5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtYW55IGFnZW50cyBieSBwcmVkaWNhdGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBmaW5kTWFueShwcmVkaWNhdGU6IChlbGVtZW50OiBBZ2VudCkgPT4gYm9vbGVhbik6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBhZ2VudHMuZmlsdGVyKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gYWdlbnRcbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZShlbGVtZW50OiBBZ2VudCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gZWxlbWVudC52YWxpZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgcGF0aFxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlUGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWxcbiAgICBpZiAocGF0aC5pbmNsdWRlcygnLi4nKSB8fCBwYXRoLmluY2x1ZGVzKCd+JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZm9yIGFic29sdXRlIHBhdGhzXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnLycpIHx8IHBhdGgubWF0Y2goL15bQS1aYS16XTovKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmlsZSBleHRlbnNpb25cbiAgICovXG4gIHB1YmxpYyBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFHRU5UX0ZJTEVfRVhURU5TSU9OO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBhZ2VudCBmcm9tIGRhdGFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0PzogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8QWdlbnQ+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudChwYXJzZWQubWV0YWRhdGEpO1xuICAgICAgaWYgKHBhcnNlZC5zdGF0ZSkge1xuICAgICAgICBhZ2VudC5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeShwYXJzZWQpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUGFyc2UgYXMgbWFya2Rvd24gd2l0aCBZQU1MIGZyb250bWF0dGVyXG4gICAgICBjb25zdCBhZ2VudERhdGEgPSB0aGlzLnBhcnNlQWdlbnRGaWxlKGRhdGEpO1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQoYWdlbnREYXRhLm1ldGFkYXRhKTtcbiAgICAgIGlmIChhZ2VudERhdGEuc3RhdGUpIHtcbiAgICAgICAgYWdlbnQuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIC4uLkpTT04ucGFyc2UoYWdlbnQuc2VyaWFsaXplVG9KU09OKCkpLFxuICAgICAgICAgIHN0YXRlOiBhZ2VudERhdGEuc3RhdGVcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gYWdlbnQgdG8gYSBmb3JtYXRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleHBvcnRFbGVtZW50KGVsZW1lbnQ6IEFnZW50LCBmb3JtYXQ/OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIC8vIFVzZSBzZXJpYWxpemVUb0pTT04gZm9yIEpTT04gZm9ybWF0IHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgIHJldHVybiBlbGVtZW50LnNlcmlhbGl6ZVRvSlNPTigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFeHBvcnQgYXMgbWFya2Rvd24gd2l0aCBZQU1MIGZyb250bWF0dGVyIChkZWZhdWx0KVxuICAgICAgY29uc3QgY29udGVudCA9IGAjICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfVxcblxcbiR7ZWxlbWVudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCAnJ31gO1xuICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplVG9GaWxlKGVsZW1lbnQsIGNvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGFuIGFnZW50IHRvIGEgc3BlY2lmaWMgcGF0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmUoZWxlbWVudDogQWdlbnQsIHRhcmdldFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0YXJnZXRQYXRoLnJlcGxhY2UoQUdFTlRfRklMRV9FWFRFTlNJT04sICcnKTtcbiAgICBjb25zdCBjb250ZW50ID0gYCMgJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9XFxuXFxuJHtlbGVtZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnfWA7XG4gICAgXG4gICAgLy8gU2F2ZSB0aGUgYWdlbnQgZmlsZVxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShuYW1lKTtcbiAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguaXNBYnNvbHV0ZSh0YXJnZXRQYXRoKSA/IHRhcmdldFBhdGggOiBwYXRoLmpvaW4odGhpcy5hZ2VudHNQYXRoLCBmaWxlbmFtZSk7XG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPSB0aGlzLnNlcmlhbGl6ZVRvRmlsZShlbGVtZW50LCBjb250ZW50KTtcbiAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKGZpbGVwYXRoLCBmaWxlQ29udGVudCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgIC8vIFNhdmUgc3RhdGUgaWYgbmVlZGVkXG4gICAgaWYgKGVsZW1lbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZUFnZW50U3RhdGUobmFtZSwgZWxlbWVudC5nZXRTdGF0ZSgpKTtcbiAgICAgIGVsZW1lbnQubWFya1N0YXRlUGVyc2lzdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRyaWdnZXJzIGFycmF5IGFuZCByZXR1cm4gdmFsaWQgYW5kIHJlamVjdGVkIHRyaWdnZXJzXG4gICAqIEV4dHJhY3RlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUcmlnZ2Vycyh0cmlnZ2VyczogYW55W10pOiB7IHZhbGlkVHJpZ2dlcnM6IHN0cmluZ1tdLCByZWplY3RlZFRyaWdnZXJzOiBzdHJpbmdbXSB9IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRUcmlnZ2VycyA9IHRyaWdnZXJzLm1hcCgodHJpZ2dlcjogYW55KSA9PiAoe1xuICAgICAgcmF3OiB0cmlnZ2VyLFxuICAgICAgc2FuaXRpemVkOiBzYW5pdGl6ZUlucHV0KFN0cmluZyh0cmlnZ2VyKSwgTUFYX1RSSUdHRVJfTEVOR1RIKVxuICAgIH0pKTtcblxuICAgIGNvbnN0IHZhbGlkVHJpZ2dlcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVqZWN0ZWRUcmlnZ2Vyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgeyByYXcsIHNhbml0aXplZCB9IG9mIHNhbml0aXplZFRyaWdnZXJzKSB7XG4gICAgICBpZiAoIXNhbml0aXplZCkge1xuICAgICAgICByZWplY3RlZFRyaWdnZXJzLnB1c2goYFwiJHtyYXd9XCIgKGVtcHR5IGFmdGVyIHNhbml0aXphdGlvbilgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghVFJJR0dFUl9WQUxJREFUSU9OX1JFR0VYLnRlc3Qoc2FuaXRpemVkKSkge1xuICAgICAgICByZWplY3RlZFRyaWdnZXJzLnB1c2goYFwiJHtzYW5pdGl6ZWR9XCIgKGludmFsaWQgZm9ybWF0IC0gbXVzdCBiZSBhbHBoYW51bWVyaWMgd2l0aCBoeXBoZW5zL3VuZGVyc2NvcmVzIG9ubHkpYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YWxpZFRyaWdnZXJzLnB1c2goc2FuaXRpemVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB2YWxpZFRyaWdnZXJzLCByZWplY3RlZFRyaWdnZXJzIH07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBhZ2VudCBmcm9tIGEgc3BlY2lmaWMgcGF0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWQodGFyZ2V0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHRhcmdldFBhdGgucmVwbGFjZShBR0VOVF9GSUxFX0VYVEVOU0lPTiwgJycpKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBTRUNVUklUWSBGSVggIzIwNjogRG9uJ3QgZXhwb3NlIGZpbGUgcGF0aHMgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgIGxvZ2dlci5lcnJvcignQWdlbnQgbm90IGZvdW5kJywgeyBwYXRoOiB0YXJnZXRQYXRoIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZ2VudCBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGFnZW50O1xuICB9XG59Il19
|