@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
|
@@ -299,10 +299,10 @@ export class RelationshipManager {
|
|
|
299
299
|
* Find element by partial name match
|
|
300
300
|
*/
|
|
301
301
|
findElementByName(name, index) {
|
|
302
|
-
const nameLower = name.toLowerCase().
|
|
302
|
+
const nameLower = name.toLowerCase().replaceAll(/[_-]/g, '');
|
|
303
303
|
for (const [type, elements] of Object.entries(index.elements)) {
|
|
304
304
|
for (const [elementName, element] of Object.entries(elements)) {
|
|
305
|
-
const elementNameLower = elementName.toLowerCase().
|
|
305
|
+
const elementNameLower = elementName.toLowerCase().replaceAll(/[_-]/g, '');
|
|
306
306
|
// Check exact match first
|
|
307
307
|
if (elementNameLower === nameLower) {
|
|
308
308
|
return `${type}:${elementName}`;
|
|
@@ -312,7 +312,7 @@ export class RelationshipManager {
|
|
|
312
312
|
return `${type}:${elementName}`;
|
|
313
313
|
}
|
|
314
314
|
// Check display name
|
|
315
|
-
const displayNameLower = element.core.name?.toLowerCase().
|
|
315
|
+
const displayNameLower = element.core.name?.toLowerCase().replaceAll(/[_-]/g, '');
|
|
316
316
|
if (displayNameLower && (displayNameLower === nameLower || displayNameLower.includes(nameLower))) {
|
|
317
317
|
return `${type}:${elementName}`;
|
|
318
318
|
}
|
|
@@ -500,4 +500,4 @@ export class RelationshipManager {
|
|
|
500
500
|
return stats;
|
|
501
501
|
}
|
|
502
502
|
}
|
|
503
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsYXRpb25zaGlwTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vUmVsYXRpb25zaGlwTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFldkQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRztJQUNoQywyQkFBMkI7SUFDM0IsVUFBVSxFQUFFLFlBQVksRUFBRyxnQkFBZ0I7SUFFM0Msc0JBQXNCO0lBQ3RCLElBQUksRUFBRSxTQUFTO0lBQ2YsT0FBTyxFQUFFLE1BQU07SUFFZiwyQkFBMkI7SUFDM0IsZ0JBQWdCLEVBQUUsWUFBWTtJQUM5QixVQUFVLEVBQUUsa0JBQWtCO0lBQzlCLFFBQVEsRUFBRSxhQUFhO0lBQ3ZCLFdBQVcsRUFBRSxVQUFVO0lBRXZCLDBCQUEwQjtJQUMxQixXQUFXLEVBQUUsYUFBYTtJQUMxQixXQUFXLEVBQUUsYUFBYTtJQUUxQixpQ0FBaUM7SUFDakMsUUFBUSxFQUFFLGNBQWM7SUFDeEIsWUFBWSxFQUFFLFVBQVU7SUFDeEIsV0FBVyxFQUFFLGFBQWEsRUFBRyxnQkFBZ0I7SUFDN0MsV0FBVyxFQUFFLGFBQWEsRUFBRyxnQkFBZ0I7SUFFN0MsNkJBQTZCO0lBQzdCLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLFFBQVEsRUFBRSxXQUFXO0lBQ3JCLFFBQVEsRUFBRSxjQUFjO0lBQ3hCLFlBQVksRUFB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O29CQUMxQixLQUFLLENBQUMseUJBQXlCLEVBQUUsQ0FBQztvQkFFbEMsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7d0JBQ3pFLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7d0JBQy9CLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUM7d0JBQ2xDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7b0JBQ2pELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZWxhdGlvbnNoaXAgTWFuYWdlciAtIERpc2NvdmVycyBhbmQgbWFuYWdlcyBjcm9zcy1lbGVtZW50IHJlbGF0aW9uc2hpcHNcbiAqXG4gKiBJbXBsZW1lbnRzIEdyYXBoUkFHLXN0eWxlIHJlbGF0aW9uc2hpcCB0cmFja2luZyBiZXR3ZWVuIGVsZW1lbnRzOlxuICogLSBzaW1pbGFyX3RvOiBTZW1hbnRpYyBzaW1pbGFyaXR5IChKYWNjYXJkLWJhc2VkKVxuICogLSB1c2VkX2J5IC8gdXNlczogVXNhZ2UgZGVwZW5kZW5jaWVzXG4gKiAtIHByZXJlcXVpc2l0ZV9mb3IgLyBkZXBlbmRzX29uOiBMZWFybmluZyBwYXRoc1xuICogLSBoZWxwc19kZWJ1ZyAvIGRlYnVnZ2VkX2J5OiBEZWJ1Z2dpbmcgcmVsYXRpb25zaGlwc1xuICogLSBjb250cmFkaWN0cyAvIHN1cHBvcnRzOiBDb25mbGljdGluZyBvciBzdXBwb3J0aW5nIGVsZW1lbnRzXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyByZWxhdGlvbnNoaXAgZGlzY292ZXJ5IGZyb20gY29udGVudFxuICogLSBHcmFwaCB0cmF2ZXJzYWwgZm9yIHJlbGF0aW9uc2hpcCBwYXRoc1xuICogLSBSZWxhdGlvbnNoaXAgc3RyZW5ndGggc2NvcmluZ1xuICogLSBCaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCB0cmFja2luZ1xuICpcbiAqIEZJWEVTIElNUExFTUVOVEVEIChJc3N1ZSAjMTA5OSk6XG4gKiAtIFVzZXMgY2VudHJhbGl6ZWQgZWxlbWVudCBJRCBwYXJzaW5nIHV0aWxpdGllc1xuICogLSBDb25zaXN0ZW50IElEIGZvcm1hdCBoYW5kbGluZ1xuICovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbmhhbmNlZEluZGV4LCBFbGVtZW50RGVmaW5pdGlvbiB9IGZyb20gJy4vRW5oYW5jZWRJbmRleE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgTkxQU2NvcmluZ01hbmFnZXIgfSBmcm9tICcuL05MUFNjb3JpbmdNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFZlcmJUcmlnZ2VyTWFuYWdlciB9IGZyb20gJy4vVmVyYlRyaWdnZXJNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgcGFyc2VFbGVtZW50SWQgfSBmcm9tICcuLi91dGlscy9lbGVtZW50SWQuanMnO1xuaW1wb3J0IHtcbiAgQmFzZVJlbGF0aW9uc2hpcCxcbiAgUGFyc2VkUmVsYXRpb25zaGlwLFxuICBjcmVhdGVSZWxhdGlvbnNoaXAsXG4gIHBhcnNlUmVsYXRpb25zaGlwLFxuICBpc1BhcnNlZFJlbGF0aW9uc2hpcCxcbiAgZGVkdXBsaWNhdGVSZWxhdGlvbnNoaXBzLFxuICBmaWx0ZXJSZWxhdGlvbnNoaXBzQnlTdHJlbmd0aCxcbiAgUmVsYXRpb25zaGlwVHlwZXNcbn0gZnJvbSAnLi90eXBlcy9SZWxhdGlvbnNoaXBUeXBlcy5qcyc7XG5cbi8vIFVzZSBCYXNlUmVsYXRpb25zaGlwIGluc3RlYWQgb2YgaW1wb3J0aW5nIFJlbGF0aW9uc2hpcCBmcm9tIEVuaGFuY2VkSW5kZXhNYW5hZ2VyXG50eXBlIFJlbGF0aW9uc2hpcCA9IEJhc2VSZWxhdGlvbnNoaXA7XG5cbi8qKlxuICogUmVsYXRpb25zaGlwIHR5cGVzIGFuZCB0aGVpciBpbnZlcnNlIG1hcHBpbmdzXG4gKi9cbmV4cG9ydCBjb25zdCBSRUxBVElPTlNISVBfVFlQRVMgPSB7XG4gIC8vIFNpbWlsYXJpdHkgcmVsYXRpb25zaGlwc1xuICBzaW1pbGFyX3RvOiAnc2ltaWxhcl90bycsICAvLyBCaWRpcmVjdGlvbmFsXG5cbiAgLy8gVXNhZ2UgcmVsYXRpb25zaGlwc1xuICB1c2VzOiAndXNlZF9ieScsXG4gIHVzZWRfYnk6ICd1c2VzJyxcblxuICAvLyBEZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHNcbiAgcHJlcmVxdWlzaXRlX2ZvcjogJ2RlcGVuZHNfb24nLFxuICBkZXBlbmRzX29uOiAncHJlcmVxdWlzaXRlX2ZvcicsXG4gIHJlcXVpcmVzOiAncmVxdWlyZWRfYnknLFxuICByZXF1aXJlZF9ieTogJ3JlcXVpcmVzJyxcblxuICAvLyBEZWJ1Z2dpbmcgcmVsYXRpb25zaGlwc1xuICBoZWxwc19kZWJ1ZzogJ2RlYnVnZ2VkX2J5JyxcbiAgZGVidWdnZWRfYnk6ICdoZWxwc19kZWJ1ZycsXG5cbiAgLy8gU3VwcG9ydC9jb25mbGljdCByZWxhdGlvbnNoaXBzXG4gIHN1cHBvcnRzOiAnc3VwcG9ydGVkX2J5JyxcbiAgc3VwcG9ydGVkX2J5OiAnc3VwcG9ydHMnLFxuICBjb250cmFkaWN0czogJ2NvbnRyYWRpY3RzJywgIC8vIEJpZGlyZWN0aW9uYWxcbiAgY29tcGxlbWVudHM6ICdjb21wbGVtZW50cycsICAvLyBCaWRpcmVjdGlvbmFsXG5cbiAgLy8gSGllcmFyY2hpY2FsIHJlbGF0aW9uc2hpcHNcbiAgcGFyZW50X29mOiAnY2hpbGRfb2YnLFxuICBjaGlsZF9vZjogJ3BhcmVudF9vZicsXG4gIGNvbnRhaW5zOiAnY29udGFpbmVkX2J5JyxcbiAgY29udGFpbmVkX2J5OiAnY29udGFpbnMnLFxuXG4gIC8vIFRlbXBvcmFsIHJlbGF0aW9uc2hpcHNcbiAgZm9sbG93czogJ3ByZWNlZGVkX2J5JyxcbiAgcHJlY2VkZWRfYnk6ICdmb2xsb3dzJyxcblxuICAvLyBFeGFtcGxlIHJlbGF0aW9uc2hpcHNcbiAgZXhhbXBsZV9vZjogJ2hhc19leGFtcGxlJyxcbiAgaGFzX2V4YW1wbGU6ICdleGFtcGxlX29mJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUmVsYXRpb25zaGlwVHlwZSA9IGtleW9mIHR5cGVvZiBSRUxBVElPTlNISVBfVFlQRVM7XG5cbi8qKlxuICogUmVsYXRpb25zaGlwIGRpc2NvdmVyeSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVsYXRpb25zaGlwQ29uZmlnIHtcbiAgLy8gTWluaW11bSBjb25maWRlbmNlIHRvIGVzdGFibGlzaCByZWxhdGlvbnNoaXBcbiAgbWluQ29uZmlkZW5jZT86IG51bWJlcjtcblxuICAvLyBNYXhpbXVtIHJlbGF0aW9uc2hpcHMgcGVyIGVsZW1lbnRcbiAgbWF4UmVsYXRpb25zaGlwc1BlckVsZW1lbnQ/OiBudW1iZXI7XG5cbiAgLy8gRW5hYmxlIGF1dG9tYXRpYyBkaXNjb3ZlcnlcbiAgZW5hYmxlQXV0b0Rpc2NvdmVyeT86IGJvb2xlYW47XG5cbiAgLy8gQ3VzdG9tIHJlbGF0aW9uc2hpcCBwYXR0ZXJuc1xuICBjdXN0b21QYXR0ZXJucz86IFJlbGF0aW9uc2hpcFBhdHRlcm5bXTtcbn1cblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBkaXNjb3ZlcmluZyByZWxhdGlvbnNoaXBzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVsYXRpb25zaGlwUGF0dGVybiB7XG4gIHR5cGU6IFJlbGF0aW9uc2hpcFR5cGU7XG4gIHBhdHRlcm46IFJlZ0V4cDtcbiAgY29uZmlkZW5jZTogbnVtYmVyO1xuICBiaWRpcmVjdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBHcmFwaCB0cmF2ZXJzYWwgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYXZlcnNhbE9wdGlvbnMge1xuICBtYXhEZXB0aD86IG51bWJlcjtcbiAgcmVsYXRpb25zaGlwVHlwZXM/OiBSZWxhdGlvbnNoaXBUeXBlW107XG4gIG1pblN0cmVuZ3RoPzogbnVtYmVyO1xuICB2aXNpdGVkPzogU2V0PHN0cmluZz47XG59XG5cbi8qKlxuICogUGF0aCBiZXR3ZWVuIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFBhdGgge1xuICBwYXRoOiBzdHJpbmdbXTtcbiAgcmVsYXRpb25zaGlwczogUmVsYXRpb25zaGlwVHlwZVtdO1xuICB0b3RhbFN0cmVuZ3RoOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxhdGlvbnNoaXBNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFJlbGF0aW9uc2hpcE1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbmxwU2NvcmluZzogTkxQU2NvcmluZ01hbmFnZXI7XG4gIHByaXZhdGUgdmVyYlRyaWdnZXJzOiBWZXJiVHJpZ2dlck1hbmFnZXI7XG4gIHByaXZhdGUgY29uZmlnOiBSZWxhdGlvbnNoaXBDb25maWc7XG5cbiAgLy8gRGVmYXVsdCBwYXR0ZXJucyBmb3IgcmVsYXRpb25zaGlwIGRpc2NvdmVyeVxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQYXR0ZXJuczogUmVsYXRpb25zaGlwUGF0dGVybltdID0gW1xuICAgIC8vIFVzYWdlIHBhdHRlcm5zXG4gICAgeyB0eXBlOiAndXNlcycsIHBhdHRlcm46IC91c2VzP1xccysoXFx3K1stXFx3XSopL2dpLCBjb25maWRlbmNlOiAwLjggfSxcbiAgICB7IHR5cGU6ICd1c2VzJywgcGF0dGVybjogL3JlcXVpcmVzP1xccysoXFx3K1stXFx3XSopL2dpLCBjb25maWRlbmNlOiAwLjcgfSxcbiAgICB7IHR5cGU6ICd1c2VzJywgcGF0dGVybjogL2RlcGVuZHM/XFxzK29uXFxzKyhcXHcrWy1cXHddKikvZ2ksIGNvbmZpZGVuY2U6IDAuNyB9LFxuXG4gICAgLy8gUHJlcmVxdWlzaXRlIHBhdHRlcm5zXG4gICAgeyB0eXBlOiAncHJlcmVxdWlzaXRlX2ZvcicsIHBhdHRlcm46IC9wcmVyZXF1aXNpdGVcXHMrZm9yXFxzKyhcXHcrWy1cXHddKikvZ2ksIGNvbmZpZGVuY2U6IDAuOSB9LFxuICAgIHsgdHlwZTogJ2RlcGVuZHNfb24nLCBwYXR0ZXJuOiAvYWZ0ZXJcXHMrKFxcdytbLVxcd10qKS9naSwgY29uZmlkZW5jZTogMC42IH0sXG5cbiAgICAvLyBEZWJ1ZyBwYXR0ZXJuc1xuICAgIHsgdHlwZTogJ2hlbHBzX2RlYnVnJywgcGF0dGVybjogL2RlYnVnKD86c3xnaW5nKT9cXHMrKFxcdytbLVxcd10qKS9naSwgY29uZmlkZW5jZTogMC43IH0sXG4gICAgeyB0eXBlOiAnaGVscHNfZGVidWcnLCBwYXR0ZXJuOiAvdHJvdWJsZXNob290KD86c3xpbmcpP1xccysoXFx3K1stXFx3XSopL2dpLCBjb25maWRlbmNlOiAwLjcgfSxcblxuICAgIC8vIFN1cHBvcnQgcGF0dGVybnNcbiAgICB7IHR5cGU6ICdzdXBwb3J0cycsIHBhdHRlcm46IC9zdXBwb3J0cz9cXHMrKFxcdytbLVxcd10qKS9naSwgY29uZmlkZW5jZTogMC44IH0sXG4gICAgeyB0eXBlOiAnY29tcGxlbWVudHMnLCBwYXR0ZXJuOiAvY29tcGxlbWVudHM/XFxzKyhcXHcrWy1cXHddKikvZ2ksIGNvbmZpZGVuY2U6IDAuOCB9LFxuICAgIHsgdHlwZTogJ2NvbnRyYWRpY3RzJywgcGF0dGVybjogL2NvbnRyYWRpY3RzP1xccysoXFx3K1stXFx3XSopL2dpLCBjb25maWRlbmNlOiAwLjkgfSxcblxuICAgIC8vIEV4YW1wbGUgcGF0dGVybnNcbiAgICB7IHR5cGU6ICdleGFtcGxlX29mJywgcGF0dGVybjogL2V4YW1wbGVcXHMrb2ZcXHMrKFxcdytbLVxcd10qKS9naSwgY29uZmlkZW5jZTogMC45IH0sXG4gICAgeyB0eXBlOiAnaGFzX2V4YW1wbGUnLCBwYXR0ZXJuOiAvc2VlXFxzKyhcXHcrWy1cXHddKilcXHMrZm9yXFxzK2V4YW1wbGUvZ2ksIGNvbmZpZGVuY2U6IDAuNyB9XG4gIF07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihjb25maWc6IFJlbGF0aW9uc2hpcENvbmZpZyA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBtaW5Db25maWRlbmNlOiBjb25maWcubWluQ29uZmlkZW5jZSB8fCAwLjUsXG4gICAgICBtYXhSZWxhdGlvbnNoaXBzUGVyRWxlbWVudDogY29uZmlnLm1heFJlbGF0aW9uc2hpcHNQZXJFbGVtZW50IHx8IDIwLFxuICAgICAgZW5hYmxlQXV0b0Rpc2NvdmVyeTogY29uZmlnLmVuYWJsZUF1dG9EaXNjb3ZlcnkgIT09IGZhbHNlLFxuICAgICAgY3VzdG9tUGF0dGVybnM6IGNvbmZpZy5jdXN0b21QYXR0ZXJucyB8fCBbXVxuICAgIH07XG5cbiAgICB0aGlzLl9ubHBTY29yaW5nID0gbmV3IE5MUFNjb3JpbmdNYW5hZ2VyKCk7XG4gICAgdGhpcy52ZXJiVHJpZ2dlcnMgPSBWZXJiVHJpZ2dlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblxuICAgIGxvZ2dlci5kZWJ1ZygnUmVsYXRpb25zaGlwTWFuYWdlciBpbml0aWFsaXplZCcsIHsgY29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoY29uZmlnPzogUmVsYXRpb25zaGlwQ29uZmlnKTogUmVsYXRpb25zaGlwTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLmluc3RhbmNlKSB7XG4gICAgICB0aGlzLmluc3RhbmNlID0gbmV3IFJlbGF0aW9uc2hpcE1hbmFnZXIoY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXIgcmVsYXRpb25zaGlwcyBmb3IgYWxsIGVsZW1lbnRzIGluIHRoZSBpbmRleFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2NvdmVyUmVsYXRpb25zaGlwcyhpbmRleDogRW5oYW5jZWRJbmRleCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IHJlbGF0aW9uc2hpcHNGb3VuZCA9IDA7XG5cbiAgICAvLyBGSVg6IEFkZCB0aW1lb3V0IHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHNcbiAgICBjb25zdCBNQVhfRElTQ09WRVJZX1RJTUUgPSAzMDAwOyAvLyAzIHNlY29uZHMgbWF4XG5cbiAgICBsb2dnZXIuaW5mbygnU3RhcnRpbmcgcmVsYXRpb25zaGlwIGRpc2NvdmVyeScpO1xuXG4gICAgLy8gRmlyc3QsIGVuc3VyZSBzZW1hbnRpYyByZWxhdGlvbnNoaXBzIGFyZSBjYWxjdWxhdGVkXG4gICAgLy8gKFRoaXMgaXMgYWxyZWFkeSBkb25lIGluIEVuaGFuY2VkSW5kZXhNYW5hZ2VyKVxuXG4gICAgLy8gVGhlbiBkaXNjb3ZlciBvdGhlciByZWxhdGlvbnNoaXAgdHlwZXNcbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBlbGVtZW50c10gb2YgT2JqZWN0LmVudHJpZXMoaW5kZXguZWxlbWVudHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyhlbGVtZW50cykpIHtcbiAgICAgICAgLy8gRklYOiBDaGVjayB0aW1lb3V0XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID4gTUFYX0RJU0NPVkVSWV9USU1FKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ1JlbGF0aW9uc2hpcCBkaXNjb3ZlcnkgdGltZW91dCcsIHtcbiAgICAgICAgICAgIGVsYXBzZWQ6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgICAgICByZWxhdGlvbnNoaXBzRm91bmRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IHRoaXMuZGlzY292ZXJFbGVtZW50UmVsYXRpb25zaGlwcyhcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIGAke3R5cGV9OiR7bmFtZX1gLFxuICAgICAgICAgIGluZGV4XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTWVyZ2UgZGlzY292ZXJlZCByZWxhdGlvbnNoaXBzIHdpdGggZXhpc3Rpbmcgb25lc1xuICAgICAgICBpZiAoZGlzY292ZXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKCFlbGVtZW50LnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVsYXRpb25zaGlwcyA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcmVsIG9mIGRpc2NvdmVyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbFR5cGUgPSByZWwudHlwZT8uc3BsaXQoJ18nKS5qb2luKCdfJykgfHwgJ3JlbGF0ZWQnO1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50LnJlbGF0aW9uc2hpcHNbcmVsVHlwZV0pIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5yZWxhdGlvbnNoaXBzW3JlbFR5cGVdID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHJlbGF0aW9uc2hpcCBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBlbGVtZW50LnJlbGF0aW9uc2hpcHNbcmVsVHlwZV0uZmluZChcbiAgICAgICAgICAgICAgciA9PiByLmVsZW1lbnQgPT09IHJlbC5lbGVtZW50XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQucmVsYXRpb25zaGlwc1tyZWxUeXBlXS5wdXNoKHJlbCk7XG4gICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHNGb3VuZCsrO1xuXG4gICAgICAgICAgICAgIC8vIEFkZCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBpZiBuZWVkZWRcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRJbnZlcnNlUmVsYXRpb25zaGlwKHJlbCwgYCR7dHlwZX06JHtuYW1lfWAsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgbG9nZ2VyLmluZm8oJ1JlbGF0aW9uc2hpcCBkaXNjb3ZlcnkgY29tcGxldGVkJywge1xuICAgICAgZHVyYXRpb246IGAke2R1cmF0aW9ufW1zYCxcbiAgICAgIHJlbGF0aW9uc2hpcHNGb3VuZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvdmVyIHJlbGF0aW9uc2hpcHMgZm9yIGEgc2luZ2xlIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzY292ZXJFbGVtZW50UmVsYXRpb25zaGlwcyhcbiAgICBlbGVtZW50OiBFbGVtZW50RGVmaW5pdGlvbixcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICBpbmRleDogRW5oYW5jZWRJbmRleFxuICApOiBQcm9taXNlPFJlbGF0aW9uc2hpcFtdPiB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwczogUmVsYXRpb25zaGlwW10gPSBbXTtcblxuICAgIGlmICghdGhpcy5jb25maWcuZW5hYmxlQXV0b0Rpc2NvdmVyeSkge1xuICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcHM7XG4gICAgfVxuXG4gICAgLy8gQ29tYmluZSB0ZXh0IGZyb20gdmFyaW91cyBmaWVsZHMgZm9yIGFuYWx5c2lzXG4gICAgbGV0IHRleHQgPSB0aGlzLmdldEVsZW1lbnRUZXh0KGVsZW1lbnQpO1xuXG4gICAgLy8gRklYOiBQcmV2ZW50IFJlRG9TIGF0dGFja3MgYnkgbGltaXRpbmcgaW5wdXQgbGVuZ3RoXG4gICAgY29uc3QgTUFYX1RFWFRfTEVOR1RIID0gNTAwMDA7IC8vIDUwS0IgbGltaXRcbiAgICBpZiAodGV4dC5sZW5ndGggPiBNQVhfVEVYVF9MRU5HVEgpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdDb250ZW50IHRvbyBsYXJnZSBmb3IgcmVsYXRpb25zaGlwIGV4dHJhY3Rpb24sIHRydW5jYXRpbmcnLCB7XG4gICAgICAgIG9yaWdpbmFsTGVuZ3RoOiB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgZWxlbWVudElkLFxuICAgICAgICB0cnVuY2F0ZWRUbzogTUFYX1RFWFRfTEVOR1RIXG4gICAgICB9KTtcbiAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBNQVhfVEVYVF9MRU5HVEgpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHBhdHRlcm5zIHRvIGRpc2NvdmVyIHJlbGF0aW9uc2hpcHNcbiAgICBjb25zdCBwYXR0ZXJucyA9IFsuLi50aGlzLmRlZmF1bHRQYXR0ZXJucywgLi4uKHRoaXMuY29uZmlnLmN1c3RvbVBhdHRlcm5zIHx8IFtdKV07XG5cbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSB0ZXh0Lm1hdGNoQWxsKHBhdHRlcm4ucGF0dGVybik7XG5cbiAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICBjb25zdCB0YXJnZXROYW1lID0gbWF0Y2hbMV07XG5cbiAgICAgICAgLy8gRmluZCBtYXRjaGluZyBlbGVtZW50XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSB0aGlzLmZpbmRFbGVtZW50QnlOYW1lKHRhcmdldE5hbWUsIGluZGV4KTtcbiAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQgJiYgdGFyZ2V0RWxlbWVudCAhPT0gZWxlbWVudElkKSB7XG4gICAgICAgICAgcmVsYXRpb25zaGlwcy5wdXNoKHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRhcmdldEVsZW1lbnQsXG4gICAgICAgICAgICB0eXBlOiBwYXR0ZXJuLnR5cGUsXG4gICAgICAgICAgICBzdHJlbmd0aDogcGF0dGVybi5jb25maWRlbmNlLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgZGlzY292ZXJ5TWV0aG9kOiAncGF0dGVybicsXG4gICAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm4ucGF0dGVybi5zb3VyY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpc2NvdmVyIHZlcmItYmFzZWQgcmVsYXRpb25zaGlwcyAoZml4ZWQ6IG5vdyBwYXNzZXMgaW5kZXggdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSlcbiAgICBjb25zdCB2ZXJiUmVsYXRpb25zaGlwcyA9IHRoaXMuZGlzY292ZXJWZXJiUmVsYXRpb25zaGlwcyhlbGVtZW50LCBlbGVtZW50SWQsIGluZGV4KTtcbiAgICByZWxhdGlvbnNoaXBzLnB1c2goLi4udmVyYlJlbGF0aW9uc2hpcHMpO1xuXG4gICAgLy8gRmlsdGVyIGJ5IGNvbmZpZGVuY2UgYW5kIGxpbWl0XG4gICAgY29uc3QgZmlsdGVyZWQgPSByZWxhdGlvbnNoaXBzXG4gICAgICAuZmlsdGVyKHIgPT4gKHIuc3RyZW5ndGggfHwgMCkgPj0gdGhpcy5jb25maWcubWluQ29uZmlkZW5jZSEpXG4gICAgICAuc29ydCgoYSwgYikgPT4gKGIuc3RyZW5ndGggfHwgMCkgLSAoYS5zdHJlbmd0aCB8fCAwKSlcbiAgICAgIC5zbGljZSgwLCB0aGlzLmNvbmZpZy5tYXhSZWxhdGlvbnNoaXBzUGVyRWxlbWVudCk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXIgcmVsYXRpb25zaGlwcyBiYXNlZCBvbiB2ZXJiIGFzc29jaWF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBkaXNjb3ZlclZlcmJSZWxhdGlvbnNoaXBzKFxuICAgIF9lbGVtZW50OiBFbGVtZW50RGVmaW5pdGlvbixcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICBpbmRleDogRW5oYW5jZWRJbmRleFxuICApOiBSZWxhdGlvbnNoaXBbXSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwczogUmVsYXRpb25zaGlwW10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBGSVg6IFVzZSBjZW50cmFsaXplZCBlbGVtZW50IElEIHBhcnNpbmdcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRWxlbWVudElkKGVsZW1lbnRJZCk7XG4gICAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICAvLyBHZXQgdmVyYnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudFxuICAgICAgY29uc3QgdmVyYnMgPSB0aGlzLnZlcmJUcmlnZ2Vycy5nZXRWZXJic0ZvckVsZW1lbnQocGFyc2VkLm5hbWUsIGluZGV4KTtcblxuICAgICAgZm9yIChjb25zdCB2ZXJiIG9mIHZlcmJzKSB7XG4gICAgICAgIC8vIEZpbmQgb3RoZXIgZWxlbWVudHMgd2l0aCBzYW1lIHZlcmJcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMudmVyYlRyaWdnZXJzLmdldEVsZW1lbnRzRm9yVmVyYih2ZXJiLCBpbmRleCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgaWYgKG1hdGNoLm5hbWUgIT09IHBhcnNlZC5uYW1lKSB7XG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgcmVsYXRpb25zaGlwIHR5cGUgYmFzZWQgb24gdmVyYiBjYXRlZ29yeVxuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0aGlzLnZlcmJUcmlnZ2Vycy5nZXRWZXJiQ2F0ZWdvcnkodmVyYik7XG4gICAgICAgICAgICBsZXQgcmVsVHlwZTogUmVsYXRpb25zaGlwVHlwZSA9ICdzaW1pbGFyX3RvJztcblxuICAgICAgICAgICAgc3dpdGNoIChjYXRlZ29yeSkge1xuICAgICAgICAgICAgICBjYXNlICdkZWJ1Z2dpbmcnOlxuICAgICAgICAgICAgICAgIHJlbFR5cGUgPSAnaGVscHNfZGVidWcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdjcmVhdGlvbic6XG4gICAgICAgICAgICAgICAgcmVsVHlwZSA9ICdjb21wbGVtZW50cyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2V4cGxhbmF0aW9uJzpcbiAgICAgICAgICAgICAgICByZWxUeXBlID0gJ3N1cHBvcnRzJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnYW5hbHlzaXMnOlxuICAgICAgICAgICAgICAgIHJlbFR5cGUgPSAnY29tcGxlbWVudHMnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWxhdGlvbnNoaXBzLnB1c2goe1xuICAgICAgICAgICAgICBlbGVtZW50OiBgJHttYXRjaC50eXBlfToke21hdGNoLm5hbWV9YCxcbiAgICAgICAgICAgICAgdHlwZTogcmVsVHlwZSxcbiAgICAgICAgICAgICAgc3RyZW5ndGg6IG1hdGNoLmNvbmZpZGVuY2UgKiAwLjcsICAvLyBTbGlnaHRseSBsb3dlciBjb25maWRlbmNlIGZvciB2ZXJiLWJhc2VkXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGlzY292ZXJ5TWV0aG9kOiAndmVyYicsXG4gICAgICAgICAgICAgICAgdmVyYixcbiAgICAgICAgICAgICAgICBjYXRlZ29yeVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgdmVyYiB0cmlnZ2VyIGZhaWxzLCBqdXN0IGNvbnRpbnVlIHdpdGhvdXQgdmVyYi1iYXNlZCByZWxhdGlvbnNoaXBzXG4gICAgICBsb2dnZXIuZGVidWcoJ1ZlcmItYmFzZWQgcmVsYXRpb25zaGlwIGRpc2NvdmVyeSBmYWlsZWQnLCB7IGVsZW1lbnRJZCwgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aW9uc2hpcHM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGludmVyc2UgcmVsYXRpb25zaGlwIGlmIGFwcGxpY2FibGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWRkSW52ZXJzZVJlbGF0aW9uc2hpcChcbiAgICByZWxhdGlvbnNoaXA6IFJlbGF0aW9uc2hpcCxcbiAgICBzb3VyY2VFbGVtZW50OiBzdHJpbmcsXG4gICAgaW5kZXg6IEVuaGFuY2VkSW5kZXhcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVsVHlwZSA9IHJlbGF0aW9uc2hpcC50eXBlIGFzIFJlbGF0aW9uc2hpcFR5cGU7XG4gICAgY29uc3QgaW52ZXJzZVR5cGUgPSBSRUxBVElPTlNISVBfVFlQRVNbcmVsVHlwZV07XG5cbiAgICBpZiAoIWludmVyc2VUeXBlIHx8IGludmVyc2VUeXBlID09PSByZWxUeXBlKSB7XG4gICAgICAvLyBCaWRpcmVjdGlvbmFsIG9yIG5vIGludmVyc2VcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGSVg6IFVzZSBjZW50cmFsaXplZCBlbGVtZW50IElEIHBhcnNpbmdcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUVsZW1lbnRJZChyZWxhdGlvbnNoaXAuZWxlbWVudCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGluZGV4LmVsZW1lbnRzW3BhcnNlZC50eXBlXT8uW3BhcnNlZC5uYW1lXTtcblxuICAgIGlmICghdGFyZ2V0RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0RWxlbWVudC5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICB0YXJnZXRFbGVtZW50LnJlbGF0aW9uc2hpcHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldEVsZW1lbnQucmVsYXRpb25zaGlwc1tpbnZlcnNlVHlwZV0pIHtcbiAgICAgIHRhcmdldEVsZW1lbnQucmVsYXRpb25zaGlwc1tpbnZlcnNlVHlwZV0gPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpbnZlcnNlIGFscmVhZHkgZXhpc3RzXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0YXJnZXRFbGVtZW50LnJlbGF0aW9uc2hpcHNbaW52ZXJzZVR5cGVdLmZpbmQoXG4gICAgICByID0+IHIuZWxlbWVudCA9PT0gc291cmNlRWxlbWVudFxuICAgICk7XG5cbiAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICB0YXJnZXRFbGVtZW50LnJlbGF0aW9uc2hpcHNbaW52ZXJzZVR5cGVdLnB1c2goe1xuICAgICAgICBlbGVtZW50OiBzb3VyY2VFbGVtZW50LFxuICAgICAgICB0eXBlOiBpbnZlcnNlVHlwZSxcbiAgICAgICAgc3RyZW5ndGg6IHJlbGF0aW9uc2hpcC5zdHJlbmd0aCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAuLi5yZWxhdGlvbnNoaXAubWV0YWRhdGEsXG4gICAgICAgICAgaW52ZXJzZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBlbGVtZW50IGJ5IHBhcnRpYWwgbmFtZSBtYXRjaFxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kRWxlbWVudEJ5TmFtZShuYW1lOiBzdHJpbmcsIGluZGV4OiBFbmhhbmNlZEluZGV4KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgbmFtZUxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1tfLV0vZywgJycpO1xuXG4gICAgZm9yIChjb25zdCBbdHlwZSwgZWxlbWVudHNdIG9mIE9iamVjdC5lbnRyaWVzKGluZGV4LmVsZW1lbnRzKSkge1xuICAgICAgZm9yIChjb25zdCBbZWxlbWVudE5hbWUsIGVsZW1lbnRdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW1lbnRzKSkge1xuICAgICAgICBjb25zdCBlbGVtZW50TmFtZUxvd2VyID0gZWxlbWVudE5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXy1dL2csICcnKTtcblxuICAgICAgICAvLyBDaGVjayBleGFjdCBtYXRjaCBmaXJzdFxuICAgICAgICBpZiAoZWxlbWVudE5hbWVMb3dlciA9PT0gbmFtZUxvd2VyKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3R5cGV9OiR7ZWxlbWVudE5hbWV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGVsZW1lbnQgbmFtZSBjb250YWlucyB0aGUgc2VhcmNoIHRlcm1cbiAgICAgICAgaWYgKGVsZW1lbnROYW1lTG93ZXIuaW5jbHVkZXMobmFtZUxvd2VyKSB8fCBuYW1lTG93ZXIuaW5jbHVkZXMoZWxlbWVudE5hbWVMb3dlcikpIHtcbiAgICAgICAgICByZXR1cm4gYCR7dHlwZX06JHtlbGVtZW50TmFtZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZGlzcGxheSBuYW1lXG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lTG93ZXIgPSBlbGVtZW50LmNvcmUubmFtZT8udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXy1dL2csICcnKTtcbiAgICAgICAgaWYgKGRpc3BsYXlOYW1lTG93ZXIgJiYgKGRpc3BsYXlOYW1lTG93ZXIgPT09IG5hbWVMb3dlciB8fCBkaXNwbGF5TmFtZUxvd2VyLmluY2x1ZGVzKG5hbWVMb3dlcikpKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3R5cGV9OiR7ZWxlbWVudE5hbWV9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb21iaW5lZCB0ZXh0IGZyb20gZWxlbWVudCBmb3IgYW5hbHlzaXNcbiAgICovXG4gIHByaXZhdGUgZ2V0RWxlbWVudFRleHQoZWxlbWVudDogRWxlbWVudERlZmluaXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQ29yZSBmaWVsZHNcbiAgICBpZiAoZWxlbWVudC5jb3JlLm5hbWUpIHBhcnRzLnB1c2goZWxlbWVudC5jb3JlLm5hbWUpO1xuICAgIGlmIChlbGVtZW50LmNvcmUuZGVzY3JpcHRpb24pIHBhcnRzLnB1c2goZWxlbWVudC5jb3JlLmRlc2NyaXB0aW9uKTtcblxuICAgIC8vIEtleXdvcmRzIGFuZCB0YWdzIGZyb20gc2VhcmNoIG9wdGltaXphdGlvblxuICAgIGlmIChlbGVtZW50LnNlYXJjaD8ua2V5d29yZHMpIHBhcnRzLnB1c2goLi4uZWxlbWVudC5zZWFyY2gua2V5d29yZHMpO1xuICAgIGlmIChlbGVtZW50LnNlYXJjaD8udGFncykgcGFydHMucHVzaCguLi5lbGVtZW50LnNlYXJjaC50YWdzKTtcblxuICAgIC8vIEN1c3RvbSBmaWVsZHMgKG1pZ2h0IGNvbnRhaW4gcmVsZXZhbnQgdGV4dClcbiAgICBpZiAoZWxlbWVudC5jdXN0b20pIHtcbiAgICAgIGNvbnN0IGN1c3RvbVRleHQgPSB0aGlzLmV4dHJhY3RUZXh0RnJvbU9iamVjdChlbGVtZW50LmN1c3RvbSk7XG4gICAgICBpZiAoY3VzdG9tVGV4dCkgcGFydHMucHVzaChjdXN0b21UZXh0KTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgVW5pY29kZSBmb3Igc2VjdXJpdHkgKERNQ1AtU0VDLTAwNClcbiAgICBjb25zdCBjb21iaW5lZFRleHQgPSBwYXJ0cy5qb2luKCcgJyk7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNvbWJpbmVkVGV4dCk7XG4gICAgaWYgKHZhbGlkYXRpb24uZGV0ZWN0ZWRJc3N1ZXMgJiYgdmFsaWRhdGlvbi5kZXRlY3RlZElzc3Vlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignVW5pY29kZSBpc3N1ZXMgaW4gcmVsYXRpb25zaGlwIHRleHQnLCB7IGlzc3VlczogdmFsaWRhdGlvbi5kZXRlY3RlZElzc3VlcyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHRleHQgZnJvbSBuZXN0ZWQgb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RUZXh0RnJvbU9iamVjdChvYmo6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgdGV4dHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMob2JqKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGV4dHMucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRleHRzLnB1c2goLi4udmFsdWUuZmlsdGVyKHYgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgbmVzdGVkID0gdGhpcy5leHRyYWN0VGV4dEZyb21PYmplY3QodmFsdWUpO1xuICAgICAgICBpZiAobmVzdGVkKSB0ZXh0cy5wdXNoKG5lc3RlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRleHRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHNob3J0ZXN0IHBhdGggYmV0d2VlbiB0d28gZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBmaW5kUGF0aChcbiAgICBmcm9tRWxlbWVudDogc3RyaW5nLFxuICAgIHRvRWxlbWVudDogc3RyaW5nLFxuICAgIGluZGV4OiBFbmhhbmNlZEluZGV4LFxuICAgIG9wdGlvbnM6IFRyYXZlcnNhbE9wdGlvbnMgPSB7fVxuICApOiBFbGVtZW50UGF0aCB8IG51bGwge1xuICAgIGNvbnN0IHtcbiAgICAgIG1heERlcHRoID0gNSxcbiAgICAgIHJlbGF0aW9uc2hpcFR5cGVzLFxuICAgICAgbWluU3RyZW5ndGggPSAwLFxuICAgICAgdmlzaXRlZCA9IG5ldyBTZXQoKVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgLy8gQkZTIHRvIGZpbmQgc2hvcnRlc3QgcGF0aFxuICAgIGNvbnN0IHF1ZXVlOiBFbGVtZW50UGF0aFtdID0gW3tcbiAgICAgIHBhdGg6IFtmcm9tRWxlbWVudF0sXG4gICAgICByZWxhdGlvbnNoaXBzOiBbXSxcbiAgICAgIHRvdGFsU3RyZW5ndGg6IDEuMFxuICAgIH1dO1xuXG4gICAgdmlzaXRlZC5hZGQoZnJvbUVsZW1lbnQpO1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBxdWV1ZS5zaGlmdCgpITtcblxuICAgICAgaWYgKGN1cnJlbnQucGF0aC5sZW5ndGggPiBtYXhEZXB0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50LnBhdGhbY3VycmVudC5wYXRoLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAoY3VycmVudEVsZW1lbnQgPT09IHRvRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH1cblxuICAgICAgLy8gRklYOiBVc2UgY2VudHJhbGl6ZWQgZWxlbWVudCBJRCBwYXJzaW5nXG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUVsZW1lbnRJZChjdXJyZW50RWxlbWVudCk7XG4gICAgICBpZiAoIXBhcnNlZCkgY29udGludWU7XG4gICAgICBjb25zdCBlbGVtZW50ID0gaW5kZXguZWxlbWVudHNbcGFyc2VkLnR5cGVdPy5bcGFyc2VkLm5hbWVdO1xuXG4gICAgICBpZiAoIWVsZW1lbnQ/LnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4cGxvcmUgYWxsIHJlbGF0aW9uc2hpcHNcbiAgICAgIGZvciAoY29uc3QgW3JlbFR5cGUsIHJlbGF0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoZWxlbWVudC5yZWxhdGlvbnNoaXBzKSkge1xuICAgICAgICAvLyBGaWx0ZXIgYnkgcmVsYXRpb25zaGlwIHR5cGVzIGlmIHNwZWNpZmllZFxuICAgICAgICBpZiAocmVsYXRpb25zaGlwVHlwZXMgJiYgIXJlbGF0aW9uc2hpcFR5cGVzLmluY2x1ZGVzKHJlbFR5cGUgYXMgUmVsYXRpb25zaGlwVHlwZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVsIG9mIHJlbGF0aW9ucykge1xuICAgICAgICAgIC8vIEZpbHRlciBieSBzdHJlbmd0aFxuICAgICAgICAgIGlmICgocmVsLnN0cmVuZ3RoIHx8IDApIDwgbWluU3RyZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMocmVsLmVsZW1lbnQpKSB7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChyZWwuZWxlbWVudCk7XG5cbiAgICAgICAgICAgIHF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICBwYXRoOiBbLi4uY3VycmVudC5wYXRoLCByZWwuZWxlbWVudF0sXG4gICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHM6IFsuLi5jdXJyZW50LnJlbGF0aW9uc2hpcHMsIHJlbFR5cGUgYXMgUmVsYXRpb25zaGlwVHlwZV0sXG4gICAgICAgICAgICAgIHRvdGFsU3RyZW5ndGg6IGN1cnJlbnQudG90YWxTdHJlbmd0aCAqIChyZWwuc3RyZW5ndGggfHwgMC41KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBjb25uZWN0ZWQgZWxlbWVudHMgd2l0aGluIGEgY2VydGFpbiBkZXB0aFxuICAgKi9cbiAgcHVibGljIGdldENvbm5lY3RlZEVsZW1lbnRzKFxuICAgIGVsZW1lbnQ6IHN0cmluZyxcbiAgICBpbmRleDogRW5oYW5jZWRJbmRleCxcbiAgICBvcHRpb25zOiBUcmF2ZXJzYWxPcHRpb25zID0ge31cbiAgKTogTWFwPHN0cmluZywgRWxlbWVudFBhdGg+IHtcbiAgICBjb25zdCB7XG4gICAgICBtYXhEZXB0aCA9IDIsXG4gICAgICByZWxhdGlvbnNoaXBUeXBlcyxcbiAgICAgIG1pblN0cmVuZ3RoID0gMFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgY29ubmVjdGVkID0gbmV3IE1hcDxzdHJpbmcsIEVsZW1lbnRQYXRoPigpO1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oW2VsZW1lbnRdKTtcblxuICAgIGNvbnN0IHF1ZXVlOiBFbGVtZW50UGF0aFtdID0gW3tcbiAgICAgIHBhdGg6IFtlbGVtZW50XSxcbiAgICAgIHJlbGF0aW9uc2hpcHM6IFtdLFxuICAgICAgdG90YWxTdHJlbmd0aDogMS4wXG4gICAgfV07XG5cbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHF1ZXVlLnNoaWZ0KCkhO1xuXG4gICAgICBpZiAoY3VycmVudC5wYXRoLmxlbmd0aCA+IG1heERlcHRoICsgMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50LnBhdGhbY3VycmVudC5wYXRoLmxlbmd0aCAtIDFdO1xuICAgICAgLy8gRklYOiBVc2UgY2VudHJhbGl6ZWQgZWxlbWVudCBJRCBwYXJzaW5nXG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUVsZW1lbnRJZChjdXJyZW50RWxlbWVudCk7XG4gICAgICBpZiAoIXBhcnNlZCkgY29udGludWU7XG4gICAgICBjb25zdCBlbGVtZW50RGVmID0gaW5kZXguZWxlbWVudHNbcGFyc2VkLnR5cGVdPy5bcGFyc2VkLm5hbWVdO1xuXG4gICAgICBpZiAoIWVsZW1lbnREZWY/LnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgW3JlbFR5cGUsIHJlbGF0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoZWxlbWVudERlZi5yZWxhdGlvbnNoaXBzKSkge1xuICAgICAgICBpZiAocmVsYXRpb25zaGlwVHlwZXMgJiYgIXJlbGF0aW9uc2hpcFR5cGVzLmluY2x1ZGVzKHJlbFR5cGUgYXMgUmVsYXRpb25zaGlwVHlwZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVsIG9mIHJlbGF0aW9ucykge1xuICAgICAgICAgIGlmICgocmVsLnN0cmVuZ3RoIHx8IDApIDwgbWluU3RyZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMocmVsLmVsZW1lbnQpKSB7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChyZWwuZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhdGg6IEVsZW1lbnRQYXRoID0ge1xuICAgICAgICAgICAgICBwYXRoOiBbLi4uY3VycmVudC5wYXRoLCByZWwuZWxlbWVudF0sXG4gICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHM6IFsuLi5jdXJyZW50LnJlbGF0aW9uc2hpcHMsIHJlbFR5cGUgYXMgUmVsYXRpb25zaGlwVHlwZV0sXG4gICAgICAgICAgICAgIHRvdGFsU3RyZW5ndGg6IGN1cnJlbnQudG90YWxTdHJlbmd0aCAqIChyZWwuc3RyZW5ndGggfHwgMC41KVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29ubmVjdGVkLnNldChyZWwuZWxlbWVudCwgcGF0aCk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50LnBhdGgubGVuZ3RoIDwgbWF4RGVwdGgpIHtcbiAgICAgICAgICAgICAgcXVldWUucHVzaChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29ubmVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWxhdGlvbnNoaXAgc3RhdGlzdGljcyBmb3IgdGhlIGluZGV4XG4gICAqL1xuICBwdWJsaWMgZ2V0UmVsYXRpb25zaGlwU3RhdHMoaW5kZXg6IEVuaGFuY2VkSW5kZXgpOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcbiAgICBjb25zdCBzdGF0czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICAgIHRvdGFsUmVsYXRpb25zaGlwczogMCxcbiAgICAgIGVsZW1lbnRzV2l0aFJlbGF0aW9uc2hpcHM6IDBcbiAgICB9O1xuXG4gICAgLy8gQ291bnQgYnkgcmVsYXRpb25zaGlwIHR5cGVcbiAgICBmb3IgKGNvbnN0IHJlbFR5cGUgb2YgT2JqZWN0LmtleXMoUkVMQVRJT05TSElQX1RZUEVTKSkge1xuICAgICAgc3RhdHNbcmVsVHlwZV0gPSAwO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZWxlbWVudHMgb2YgT2JqZWN0LnZhbHVlcyhpbmRleC5lbGVtZW50cykpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBPYmplY3QudmFsdWVzKGVsZW1lbnRzKSkge1xuICAgICAgICBpZiAoZWxlbWVudC5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgICAgc3RhdHMuZWxlbWVudHNXaXRoUmVsYXRpb25zaGlwcysrO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBbcmVsVHlwZSwgcmVsYXRpb25zXSBvZiBPYmplY3QuZW50cmllcyhlbGVtZW50LnJlbGF0aW9uc2hpcHMpKSB7XG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IHJlbGF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBzdGF0cy50b3RhbFJlbGF0aW9uc2hpcHMgKz0gY291bnQ7XG4gICAgICAgICAgICBzdGF0c1tyZWxUeXBlXSA9IChzdGF0c1tyZWxUeXBlXSB8fCAwKSArIGNvdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGF0cztcbiAgfVxufSJdfQ==
|
|
503
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsYXRpb25zaGlwTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vUmVsYXRpb25zaGlwTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFldkQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRztJQUNoQywyQkFBMkI7SUFDM0IsVUFBVSxFQUFFLFlBQVksRUFBRyxnQkFBZ0I7SUFFM0Msc0JBQXNCO0lBQ3RCLElBQUksRUFBRSxTQUFTO0lBQ2YsT0FBTyxFQUFFLE1BQU07SUFFZiwyQkFBMkI7SUFDM0IsZ0JBQWdCLEVBQUUsWUFBWTtJQUM5QixVQUFVLEVBQUUsa0JBQWtCO0lBQzlCLFFBQVEsRUFBRSxhQUFhO0lBQ3ZCLFdBQVcsRUFBRSxVQUFVO0lBRXZCLDBCQUEwQjtJQUMxQixXQUFXLEVBQUUsYUFBYTtJQUMxQixXQUFXLEVBQUUsYUFBYTtJQUUxQixpQ0FBaUM7SUFDakMsUUFBUSxFQUFFLGNBQWM7SUFDeEIsWUFBWSxFQUFFLFVBQVU7SUFDeEIsV0FBVyxFQUFFLGFBQWEsRUFBRyxnQkFBZ0I7SUFDN0MsV0FBVyxFQUFFLGFBQWEsRUFBRyxnQkFBZ0I7SUFFN0MsNkJBQTZCO0lBQzdCLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLFFBQVEsRUFBRSxXQUFXO0lBQ3JCLFFBQVEsRUFBRSxjQUFjO0lBQ3hCLFlBQVksRUFB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O29CQUMxQixLQUFLLENBQUMseUJBQXlCLEVBQUUsQ0FBQztvQkFFbEMsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7d0JBQ3pFLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7d0JBQy9CLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUM7d0JBQ2xDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7b0JBQ2pELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZWxhdGlvbnNoaXAgTWFuYWdlciAtIERpc2NvdmVycyBhbmQgbWFuYWdlcyBjcm9zcy1lbGVtZW50IHJlbGF0aW9uc2hpcHNcbiAqXG4gKiBJbXBsZW1lbnRzIEdyYXBoUkFHLXN0eWxlIHJlbGF0aW9uc2hpcCB0cmFja2luZyBiZXR3ZWVuIGVsZW1lbnRzOlxuICogLSBzaW1pbGFyX3RvOiBTZW1hbnRpYyBzaW1pbGFyaXR5IChKYWNjYXJkLWJhc2VkKVxuICogLSB1c2VkX2J5IC8gdXNlczogVXNhZ2UgZGVwZW5kZW5jaWVzXG4gKiAtIHByZXJlcXVpc2l0ZV9mb3IgLyBkZXBlbmRzX29uOiBMZWFybmluZyBwYXRoc1xuICogLSBoZWxwc19kZWJ1ZyAvIGRlYnVnZ2VkX2J5OiBEZWJ1Z2dpbmcgcmVsYXRpb25zaGlwc1xuICogLSBjb250cmFkaWN0cyAvIHN1cHBvcnRzOiBDb25mbGljdGluZyBvciBzdXBwb3J0aW5nIGVsZW1lbnRzXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyByZWxhdGlvbnNoaXAgZGlzY292ZXJ5IGZyb20gY29udGVudFxuICogLSBHcmFwaCB0cmF2ZXJzYWwgZm9yIHJlbGF0aW9uc2hpcCBwYXRoc1xuICogLSBSZWxhdGlvbnNoaXAgc3RyZW5ndGggc2NvcmluZ1xuICogLSBCaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCB0cmFja2luZ1xuICpcbiAqIEZJWEVTIElNUExFTUVOVEVEIChJc3N1ZSAjMTA5OSk6XG4gKiAtIFVzZXMgY2VudHJhbGl6ZWQgZWxlbWVudCBJRCBwYXJzaW5nIHV0aWxpdGllc1xuICogLSBDb25zaXN0ZW50IElEIGZvcm1hdCBoYW5kbGluZ1xuICovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbmhhbmNlZEluZGV4LCBFbGVtZW50RGVmaW5pdGlvbiB9IGZyb20gJy4vRW5oYW5jZWRJbmRleE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgTkxQU2NvcmluZ01hbmFnZXIgfSBmcm9tICcuL05MUFNjb3JpbmdNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFZlcmJUcmlnZ2VyTWFuYWdlciB9IGZyb20gJy4vVmVyYlRyaWdnZXJNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgcGFyc2VFbGVtZW50SWQgfSBmcm9tICcuLi91dGlscy9lbGVtZW50SWQuanMnO1xuaW1wb3J0IHtcbiAgQmFzZVJlbGF0aW9uc2hpcCxcbiAgUGFyc2VkUmVsYXRpb25zaGlwLFxuICBjcmVhdGVSZWxhdGlvbnNoaXAsXG4gIHBhcnNlUmVsYXRpb25zaGlwLFxuICBpc1BhcnNlZFJlbGF0aW9uc2hpcCxcbiAgZGVkdXBsaWNhdGVSZWxhdGlvbnNoaXBzLFxuICBmaWx0ZXJSZWxhdGlvbnNoaXBzQnlTdHJlbmd0aCxcbiAgUmVsYXRpb25zaGlwVHlwZXNcbn0gZnJvbSAnLi90eXBlcy9SZWxhdGlvbnNoaXBUeXBlcy5qcyc7XG5cbi8vIFVzZSBCYXNlUmVsYXRpb25zaGlwIGluc3RlYWQgb2YgaW1wb3J0aW5nIFJlbGF0aW9uc2hpcCBmcm9tIEVuaGFuY2VkSW5kZXhNYW5hZ2VyXG50eXBlIFJlbGF0aW9uc2hpcCA9IEJhc2VSZWxhdGlvbnNoaXA7XG5cbi8qKlxuICogUmVsYXRpb25zaGlwIHR5cGVzIGFuZCB0aGVpciBpbnZlcnNlIG1hcHBpbmdzXG4gKi9cbmV4cG9ydCBjb25zdCBSRUxBVElPTlNISVBfVFlQRVMgPSB7XG4gIC8vIFNpbWlsYXJpdHkgcmVsYXRpb25zaGlwc1xuICBzaW1pbGFyX3RvOiAnc2ltaWxhcl90bycsICAvLyBCaWRpcmVjdGlvbmFsXG5cbiAgLy8gVXNhZ2UgcmVsYXRpb25zaGlwc1xuICB1c2VzOiAndXNlZF9ieScsXG4gIHVzZWRfYnk6ICd1c2VzJyxcblxuICAvLyBEZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHNcbiAgcHJlcmVxdWlzaXRlX2ZvcjogJ2RlcGVuZHNfb24nLFxuICBkZXBlbmRzX29uOiAncHJlcmVxdWlzaXRlX2ZvcicsXG4gIHJlcXVpcmVzOiAncmVxdWlyZWRfYnknLFxuICByZXF1aXJlZF9ieTogJ3JlcXVpcmVzJyxcblxuICAvLyBEZWJ1Z2dpbmcgcmVsYXRpb25zaGlwc1xuICBoZWxwc19kZWJ1ZzogJ2RlYnVnZ2VkX2J5JyxcbiAgZGVidWdnZWRfYnk6ICdoZWxwc19kZWJ1ZycsXG5cbiAgLy8gU3VwcG9ydC9jb25mbGljdCByZWxhdGlvbnNoaXBzXG4gIHN1cHBvcnRzOiAnc3VwcG9ydGVkX2J5JyxcbiAgc3VwcG9ydGVkX2J5OiAnc3VwcG9ydHMnLFxuICBjb250cmFkaWN0czogJ2NvbnRyYWRpY3RzJywgIC8vIEJpZGlyZWN0aW9uYWxcbiAgY29tcGxlbWVudHM6ICdjb21wbGVtZW50cycsICAvLyBCaWRpcmVjdGlvbmFsXG5cbiAgLy8gSGllcmFyY2hpY2FsIHJlbGF0aW9uc2hpcHNcbiAgcGFyZW50X29mOiAnY2hpbGRfb2YnLFxuICBjaGlsZF9vZjogJ3BhcmVudF9vZicsXG4gIGNvbnRhaW5zOiAnY29udGFpbmVkX2J5JyxcbiAgY29udGFpbmVkX2J5OiAnY29udGFpbnMnLFxuXG4gIC8vIFRlbXBvcmFsIHJlbGF0aW9uc2hpcHNcbiAgZm9sbG93czogJ3ByZWNlZGVkX2J5JyxcbiAgcHJlY2VkZWRfYnk6ICdmb2xsb3dzJyxcblxuICAvLyBFeGFtcGxlIHJlbGF0aW9uc2hpcHNcbiAgZXhhbXBsZV9vZjogJ2hhc19leGFtcGxlJyxcbiAgaGFzX2V4YW1wbGU6ICdleGFtcGxlX29mJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUmVsYXRpb25zaGlwVHlwZSA9IGtleW9mIHR5cGVvZiBSRUxBVElPTlNISVBfVFlQRVM7XG5cbi8qKlxuICogUmVsYXRpb25zaGlwIGRpc2NvdmVyeSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVsYXRpb25zaGlwQ29uZmlnIHtcbiAgLy8gTWluaW11bSBjb25maWRlbmNlIHRvIGVzdGFibGlzaCByZWxhdGlvbnNoaXBcbiAgbWluQ29uZmlkZW5jZT86IG51bWJlcjtcblxuICAvLyBNYXhpbXVtIHJlbGF0aW9uc2hpcHMgcGVyIGVsZW1lbnRcbiAgbWF4UmVsYXRpb25zaGlwc1BlckVsZW1lbnQ/OiBudW1iZXI7XG5cbiAgLy8gRW5hYmxlIGF1dG9tYXRpYyBkaXNjb3ZlcnlcbiAgZW5hYmxlQXV0b0Rpc2NvdmVyeT86IGJvb2xlYW47XG5cbiAgLy8gQ3VzdG9tIHJlbGF0aW9uc2hpcCBwYXR0ZXJuc1xuICBjdXN0b21QYXR0ZXJucz86IFJlbGF0aW9uc2hpcFBhdHRlcm5bXTtcbn1cblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBkaXNjb3ZlcmluZyByZWxhdGlvbnNoaXBzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVsYXRpb25zaGlwUGF0dGVybiB7XG4gIHR5cGU6IFJlbGF0aW9uc2hpcFR5cGU7XG4gIHBhdHRlcm46IFJlZ0V4cDtcbiAgY29uZmlkZW5jZTogbnVtYmVyO1xuICBiaWRpcmVjdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBHcmFwaCB0cmF2ZXJzYWwgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYXZlcnNhbE9wdGlvbnMge1xuICBtYXhEZXB0aD86IG51bWJlcjtcbiAgcmVsYXRpb25zaGlwVHlwZXM/OiBSZWxhdGlvbnNoaXBUeXBlW107XG4gIG1pblN0cmVuZ3RoPzogbnVtYmVyO1xuICB2aXNpdGVkPzogU2V0PHN0cmluZz47XG59XG5cbi8qKlxuICogUGF0aCBiZXR3ZWVuIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFBhdGgge1xuICBwYXRoOiBzdHJpbmdbXTtcbiAgcmVsYXRpb25zaGlwczogUmVsYXRpb25zaGlwVHlwZVtdO1xuICB0b3RhbFN0cmVuZ3RoOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxhdGlvbnNoaXBNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFJlbGF0aW9uc2hpcE1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbmxwU2NvcmluZzogTkxQU2NvcmluZ01hbmFnZXI7XG4gIHByaXZhdGUgdmVyYlRyaWdnZXJzOiBWZXJiVHJpZ2dlck1hbmFnZXI7XG4gIHByaXZhdGUgY29uZmlnOiBSZWxhdGlvbnNoaXBDb25maWc7XG5cbiAgLy8gRGVmYXVsdCBwYXR0ZXJucyBmb3IgcmVsYXRpb25zaGlwIGRpc2NvdmVyeVxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQYXR0ZXJuczogUmVsYXRpb25zaGlwUGF0dGVybltdID0gW1xuICAgIC8vIFVzYWdlIHBhdHRlcm5zXG4gICAgeyB0eXBlOiAndXNlcycsIHBhdHRlcm46IC91c2VzP1xccysoXFx3K1stXFx3XSopL2dpLCBjb25maWRlbmNlOiAwLjggfSxcbiAgICB7IHR5cGU6ICd1c2VzJywgcGF0dGVybjogL3JlcXVpcmVzP1xccysoXFx3K1stXFx3XSopL2dpLCBjb25maWRlbmNlOiAwLjcgfSxcbiAgICB7IHR5cGU6ICd1c2VzJywgcGF0dGVybjogL2RlcGVuZHM/XFxzK29uXFxzKyhcXHcrWy1cXHddKikvZ2ksIGNvbmZpZGVuY2U6IDAuNyB9LFxuXG4gICAgLy8gUHJlcmVxdWlzaXRlIHBhdHRlcm5zXG4gICAgeyB0eXBlOiAncHJlcmVxdWlzaXRlX2ZvcicsIHBhdHRlcm46IC9wcmVyZXF1aXNpdGVcXHMrZm9yXFxzKyhcXHcrWy1cXHddKikvZ2ksIGNvbmZpZGVuY2U6IDAuOSB9LFxuICAgIHsgdHlwZTogJ2RlcGVuZHNfb24nLCBwYXR0ZXJuOiAvYWZ0ZXJcXHMrKFxcdytbLVxcd10qKS9naSwgY29uZmlkZW5jZTogMC42IH0sXG5cbiAgICAvLyBEZWJ1ZyBwYXR0ZXJuc1xuICAgIHsgdHlwZTogJ2hlbHBzX2RlYnVnJywgcGF0dGVybjogL2RlYnVnKD86c3xnaW5nKT9cXHMrKFxcdytbLVxcd10qKS9naSwgY29uZmlkZW5jZTogMC43IH0sXG4gICAgeyB0eXBlOiAnaGVscHNfZGVidWcnLCBwYXR0ZXJuOiAvdHJvdWJsZXNob290KD86c3xpbmcpP1xccysoXFx3K1stXFx3XSopL2dpLCBjb25maWRlbmNlOiAwLjcgfSxcblxuICAgIC8vIFN1cHBvcnQgcGF0dGVybnNcbiAgICB7IHR5cGU6ICdzdXBwb3J0cycsIHBhdHRlcm46IC9zdXBwb3J0cz9cXHMrKFxcdytbLVxcd10qKS9naSwgY29uZmlkZW5jZTogMC44IH0sXG4gICAgeyB0eXBlOiAnY29tcGxlbWVudHMnLCBwYXR0ZXJuOiAvY29tcGxlbWVudHM/XFxzKyhcXHcrWy1cXHddKikvZ2ksIGNvbmZpZGVuY2U6IDAuOCB9LFxuICAgIHsgdHlwZTogJ2NvbnRyYWRpY3RzJywgcGF0dGVybjogL2NvbnRyYWRpY3RzP1xccysoXFx3K1stXFx3XSopL2dpLCBjb25maWRlbmNlOiAwLjkgfSxcblxuICAgIC8vIEV4YW1wbGUgcGF0dGVybnNcbiAgICB7IHR5cGU6ICdleGFtcGxlX29mJywgcGF0dGVybjogL2V4YW1wbGVcXHMrb2ZcXHMrKFxcdytbLVxcd10qKS9naSwgY29uZmlkZW5jZTogMC45IH0sXG4gICAgeyB0eXBlOiAnaGFzX2V4YW1wbGUnLCBwYXR0ZXJuOiAvc2VlXFxzKyhcXHcrWy1cXHddKilcXHMrZm9yXFxzK2V4YW1wbGUvZ2ksIGNvbmZpZGVuY2U6IDAuNyB9XG4gIF07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihjb25maWc6IFJlbGF0aW9uc2hpcENvbmZpZyA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBtaW5Db25maWRlbmNlOiBjb25maWcubWluQ29uZmlkZW5jZSB8fCAwLjUsXG4gICAgICBtYXhSZWxhdGlvbnNoaXBzUGVyRWxlbWVudDogY29uZmlnLm1heFJlbGF0aW9uc2hpcHNQZXJFbGVtZW50IHx8IDIwLFxuICAgICAgZW5hYmxlQXV0b0Rpc2NvdmVyeTogY29uZmlnLmVuYWJsZUF1dG9EaXNjb3ZlcnkgIT09IGZhbHNlLFxuICAgICAgY3VzdG9tUGF0dGVybnM6IGNvbmZpZy5jdXN0b21QYXR0ZXJucyB8fCBbXVxuICAgIH07XG5cbiAgICB0aGlzLl9ubHBTY29yaW5nID0gbmV3IE5MUFNjb3JpbmdNYW5hZ2VyKCk7XG4gICAgdGhpcy52ZXJiVHJpZ2dlcnMgPSBWZXJiVHJpZ2dlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblxuICAgIGxvZ2dlci5kZWJ1ZygnUmVsYXRpb25zaGlwTWFuYWdlciBpbml0aWFsaXplZCcsIHsgY29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoY29uZmlnPzogUmVsYXRpb25zaGlwQ29uZmlnKTogUmVsYXRpb25zaGlwTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLmluc3RhbmNlKSB7XG4gICAgICB0aGlzLmluc3RhbmNlID0gbmV3IFJlbGF0aW9uc2hpcE1hbmFnZXIoY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXIgcmVsYXRpb25zaGlwcyBmb3IgYWxsIGVsZW1lbnRzIGluIHRoZSBpbmRleFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2NvdmVyUmVsYXRpb25zaGlwcyhpbmRleDogRW5oYW5jZWRJbmRleCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IHJlbGF0aW9uc2hpcHNGb3VuZCA9IDA7XG5cbiAgICAvLyBGSVg6IEFkZCB0aW1lb3V0IHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHNcbiAgICBjb25zdCBNQVhfRElTQ09WRVJZX1RJTUUgPSAzMDAwOyAvLyAzIHNlY29uZHMgbWF4XG5cbiAgICBsb2dnZXIuaW5mbygnU3RhcnRpbmcgcmVsYXRpb25zaGlwIGRpc2NvdmVyeScpO1xuXG4gICAgLy8gRmlyc3QsIGVuc3VyZSBzZW1hbnRpYyByZWxhdGlvbnNoaXBzIGFyZSBjYWxjdWxhdGVkXG4gICAgLy8gKFRoaXMgaXMgYWxyZWFkeSBkb25lIGluIEVuaGFuY2VkSW5kZXhNYW5hZ2VyKVxuXG4gICAgLy8gVGhlbiBkaXNjb3ZlciBvdGhlciByZWxhdGlvbnNoaXAgdHlwZXNcbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBlbGVtZW50c10gb2YgT2JqZWN0LmVudHJpZXMoaW5kZXguZWxlbWVudHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyhlbGVtZW50cykpIHtcbiAgICAgICAgLy8gRklYOiBDaGVjayB0aW1lb3V0XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID4gTUFYX0RJU0NPVkVSWV9USU1FKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ1JlbGF0aW9uc2hpcCBkaXNjb3ZlcnkgdGltZW91dCcsIHtcbiAgICAgICAgICAgIGVsYXBzZWQ6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgICAgICByZWxhdGlvbnNoaXBzRm91bmRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IHRoaXMuZGlzY292ZXJFbGVtZW50UmVsYXRpb25zaGlwcyhcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIGAke3R5cGV9OiR7bmFtZX1gLFxuICAgICAgICAgIGluZGV4XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTWVyZ2UgZGlzY292ZXJlZCByZWxhdGlvbnNoaXBzIHdpdGggZXhpc3Rpbmcgb25lc1xuICAgICAgICBpZiAoZGlzY292ZXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKCFlbGVtZW50LnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVsYXRpb25zaGlwcyA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcmVsIG9mIGRpc2NvdmVyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbFR5cGUgPSByZWwudHlwZT8uc3BsaXQoJ18nKS5qb2luKCdfJykgfHwgJ3JlbGF0ZWQnO1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50LnJlbGF0aW9uc2hpcHNbcmVsVHlwZV0pIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5yZWxhdGlvbnNoaXBzW3JlbFR5cGVdID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHJlbGF0aW9uc2hpcCBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBlbGVtZW50LnJlbGF0aW9uc2hpcHNbcmVsVHlwZV0uZmluZChcbiAgICAgICAgICAgICAgciA9PiByLmVsZW1lbnQgPT09IHJlbC5lbGVtZW50XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQucmVsYXRpb25zaGlwc1tyZWxUeXBlXS5wdXNoKHJlbCk7XG4gICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHNGb3VuZCsrO1xuXG4gICAgICAgICAgICAgIC8vIEFkZCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBpZiBuZWVkZWRcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRJbnZlcnNlUmVsYXRpb25zaGlwKHJlbCwgYCR7dHlwZX06JHtuYW1lfWAsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgbG9nZ2VyLmluZm8oJ1JlbGF0aW9uc2hpcCBkaXNjb3ZlcnkgY29tcGxldGVkJywge1xuICAgICAgZHVyYXRpb246IGAke2R1cmF0aW9ufW1zYCxcbiAgICAgIHJlbGF0aW9uc2hpcHNGb3VuZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvdmVyIHJlbGF0aW9uc2hpcHMgZm9yIGEgc2luZ2xlIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzY292ZXJFbGVtZW50UmVsYXRpb25zaGlwcyhcbiAgICBlbGVtZW50OiBFbGVtZW50RGVmaW5pdGlvbixcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICBpbmRleDogRW5oYW5jZWRJbmRleFxuICApOiBQcm9taXNlPFJlbGF0aW9uc2hpcFtdPiB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwczogUmVsYXRpb25zaGlwW10gPSBbXTtcblxuICAgIGlmICghdGhpcy5jb25maWcuZW5hYmxlQXV0b0Rpc2NvdmVyeSkge1xuICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcHM7XG4gICAgfVxuXG4gICAgLy8gQ29tYmluZSB0ZXh0IGZyb20gdmFyaW91cyBmaWVsZHMgZm9yIGFuYWx5c2lzXG4gICAgbGV0IHRleHQgPSB0aGlzLmdldEVsZW1lbnRUZXh0KGVsZW1lbnQpO1xuXG4gICAgLy8gRklYOiBQcmV2ZW50IFJlRG9TIGF0dGFja3MgYnkgbGltaXRpbmcgaW5wdXQgbGVuZ3RoXG4gICAgY29uc3QgTUFYX1RFWFRfTEVOR1RIID0gNTAwMDA7IC8vIDUwS0IgbGltaXRcbiAgICBpZiAodGV4dC5sZW5ndGggPiBNQVhfVEVYVF9MRU5HVEgpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdDb250ZW50IHRvbyBsYXJnZSBmb3IgcmVsYXRpb25zaGlwIGV4dHJhY3Rpb24sIHRydW5jYXRpbmcnLCB7XG4gICAgICAgIG9yaWdpbmFsTGVuZ3RoOiB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgZWxlbWVudElkLFxuICAgICAgICB0cnVuY2F0ZWRUbzogTUFYX1RFWFRfTEVOR1RIXG4gICAgICB9KTtcbiAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBNQVhfVEVYVF9MRU5HVEgpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHBhdHRlcm5zIHRvIGRpc2NvdmVyIHJlbGF0aW9uc2hpcHNcbiAgICBjb25zdCBwYXR0ZXJucyA9IFsuLi50aGlzLmRlZmF1bHRQYXR0ZXJucywgLi4uKHRoaXMuY29uZmlnLmN1c3RvbVBhdHRlcm5zIHx8IFtdKV07XG5cbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSB0ZXh0Lm1hdGNoQWxsKHBhdHRlcm4ucGF0dGVybik7XG5cbiAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICBjb25zdCB0YXJnZXROYW1lID0gbWF0Y2hbMV07XG5cbiAgICAgICAgLy8gRmluZCBtYXRjaGluZyBlbGVtZW50XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSB0aGlzLmZpbmRFbGVtZW50QnlOYW1lKHRhcmdldE5hbWUsIGluZGV4KTtcbiAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQgJiYgdGFyZ2V0RWxlbWVudCAhPT0gZWxlbWVudElkKSB7XG4gICAgICAgICAgcmVsYXRpb25zaGlwcy5wdXNoKHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRhcmdldEVsZW1lbnQsXG4gICAgICAgICAgICB0eXBlOiBwYXR0ZXJuLnR5cGUsXG4gICAgICAgICAgICBzdHJlbmd0aDogcGF0dGVybi5jb25maWRlbmNlLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgZGlzY292ZXJ5TWV0aG9kOiAncGF0dGVybicsXG4gICAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm4ucGF0dGVybi5zb3VyY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpc2NvdmVyIHZlcmItYmFzZWQgcmVsYXRpb25zaGlwcyAoZml4ZWQ6IG5vdyBwYXNzZXMgaW5kZXggdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSlcbiAgICBjb25zdCB2ZXJiUmVsYXRpb25zaGlwcyA9IHRoaXMuZGlzY292ZXJWZXJiUmVsYXRpb25zaGlwcyhlbGVtZW50LCBlbGVtZW50SWQsIGluZGV4KTtcbiAgICByZWxhdGlvbnNoaXBzLnB1c2goLi4udmVyYlJlbGF0aW9uc2hpcHMpO1xuXG4gICAgLy8gRmlsdGVyIGJ5IGNvbmZpZGVuY2UgYW5kIGxpbWl0XG4gICAgY29uc3QgZmlsdGVyZWQgPSByZWxhdGlvbnNoaXBzXG4gICAgICAuZmlsdGVyKHIgPT4gKHIuc3RyZW5ndGggfHwgMCkgPj0gdGhpcy5jb25maWcubWluQ29uZmlkZW5jZSEpXG4gICAgICAuc29ydCgoYSwgYikgPT4gKGIuc3RyZW5ndGggfHwgMCkgLSAoYS5zdHJlbmd0aCB8fCAwKSlcbiAgICAgIC5zbGljZSgwLCB0aGlzLmNvbmZpZy5tYXhSZWxhdGlvbnNoaXBzUGVyRWxlbWVudCk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXIgcmVsYXRpb25zaGlwcyBiYXNlZCBvbiB2ZXJiIGFzc29jaWF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBkaXNjb3ZlclZlcmJSZWxhdGlvbnNoaXBzKFxuICAgIF9lbGVtZW50OiBFbGVtZW50RGVmaW5pdGlvbixcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICBpbmRleDogRW5oYW5jZWRJbmRleFxuICApOiBSZWxhdGlvbnNoaXBbXSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwczogUmVsYXRpb25zaGlwW10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBGSVg6IFVzZSBjZW50cmFsaXplZCBlbGVtZW50IElEIHBhcnNpbmdcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRWxlbWVudElkKGVsZW1lbnRJZCk7XG4gICAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICAvLyBHZXQgdmVyYnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudFxuICAgICAgY29uc3QgdmVyYnMgPSB0aGlzLnZlcmJUcmlnZ2Vycy5nZXRWZXJic0ZvckVsZW1lbnQocGFyc2VkLm5hbWUsIGluZGV4KTtcblxuICAgICAgZm9yIChjb25zdCB2ZXJiIG9mIHZlcmJzKSB7XG4gICAgICAgIC8vIEZpbmQgb3RoZXIgZWxlbWVudHMgd2l0aCBzYW1lIHZlcmJcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMudmVyYlRyaWdnZXJzLmdldEVsZW1lbnRzRm9yVmVyYih2ZXJiLCBpbmRleCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgaWYgKG1hdGNoLm5hbWUgIT09IHBhcnNlZC5uYW1lKSB7XG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgcmVsYXRpb25zaGlwIHR5cGUgYmFzZWQgb24gdmVyYiBjYXRlZ29yeVxuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0aGlzLnZlcmJUcmlnZ2Vycy5nZXRWZXJiQ2F0ZWdvcnkodmVyYik7XG4gICAgICAgICAgICBsZXQgcmVsVHlwZTogUmVsYXRpb25zaGlwVHlwZSA9ICdzaW1pbGFyX3RvJztcblxuICAgICAgICAgICAgc3dpdGNoIChjYXRlZ29yeSkge1xuICAgICAgICAgICAgICBjYXNlICdkZWJ1Z2dpbmcnOlxuICAgICAgICAgICAgICAgIHJlbFR5cGUgPSAnaGVscHNfZGVidWcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdjcmVhdGlvbic6XG4gICAgICAgICAgICAgICAgcmVsVHlwZSA9ICdjb21wbGVtZW50cyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2V4cGxhbmF0aW9uJzpcbiAgICAgICAgICAgICAgICByZWxUeXBlID0gJ3N1cHBvcnRzJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnYW5hbHlzaXMnOlxuICAgICAgICAgICAgICAgIHJlbFR5cGUgPSAnY29tcGxlbWVudHMnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWxhdGlvbnNoaXBzLnB1c2goe1xuICAgICAgICAgICAgICBlbGVtZW50OiBgJHttYXRjaC50eXBlfToke21hdGNoLm5hbWV9YCxcbiAgICAgICAgICAgICAgdHlwZTogcmVsVHlwZSxcbiAgICAgICAgICAgICAgc3RyZW5ndGg6IG1hdGNoLmNvbmZpZGVuY2UgKiAwLjcsICAvLyBTbGlnaHRseSBsb3dlciBjb25maWRlbmNlIGZvciB2ZXJiLWJhc2VkXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGlzY292ZXJ5TWV0aG9kOiAndmVyYicsXG4gICAgICAgICAgICAgICAgdmVyYixcbiAgICAgICAgICAgICAgICBjYXRlZ29yeVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgdmVyYiB0cmlnZ2VyIGZhaWxzLCBqdXN0IGNvbnRpbnVlIHdpdGhvdXQgdmVyYi1iYXNlZCByZWxhdGlvbnNoaXBzXG4gICAgICBsb2dnZXIuZGVidWcoJ1ZlcmItYmFzZWQgcmVsYXRpb25zaGlwIGRpc2NvdmVyeSBmYWlsZWQnLCB7IGVsZW1lbnRJZCwgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aW9uc2hpcHM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGludmVyc2UgcmVsYXRpb25zaGlwIGlmIGFwcGxpY2FibGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWRkSW52ZXJzZVJlbGF0aW9uc2hpcChcbiAgICByZWxhdGlvbnNoaXA6IFJlbGF0aW9uc2hpcCxcbiAgICBzb3VyY2VFbGVtZW50OiBzdHJpbmcsXG4gICAgaW5kZXg6IEVuaGFuY2VkSW5kZXhcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVsVHlwZSA9IHJlbGF0aW9uc2hpcC50eXBlIGFzIFJlbGF0aW9uc2hpcFR5cGU7XG4gICAgY29uc3QgaW52ZXJzZVR5cGUgPSBSRUxBVElPTlNISVBfVFlQRVNbcmVsVHlwZV07XG5cbiAgICBpZiAoIWludmVyc2VUeXBlIHx8IGludmVyc2VUeXBlID09PSByZWxUeXBlKSB7XG4gICAgICAvLyBCaWRpcmVjdGlvbmFsIG9yIG5vIGludmVyc2VcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGSVg6IFVzZSBjZW50cmFsaXplZCBlbGVtZW50IElEIHBhcnNpbmdcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUVsZW1lbnRJZChyZWxhdGlvbnNoaXAuZWxlbWVudCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGluZGV4LmVsZW1lbnRzW3BhcnNlZC50eXBlXT8uW3BhcnNlZC5uYW1lXTtcblxuICAgIGlmICghdGFyZ2V0RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0RWxlbWVudC5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICB0YXJnZXRFbGVtZW50LnJlbGF0aW9uc2hpcHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldEVsZW1lbnQucmVsYXRpb25zaGlwc1tpbnZlcnNlVHlwZV0pIHtcbiAgICAgIHRhcmdldEVsZW1lbnQucmVsYXRpb25zaGlwc1tpbnZlcnNlVHlwZV0gPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpbnZlcnNlIGFscmVhZHkgZXhpc3RzXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0YXJnZXRFbGVtZW50LnJlbGF0aW9uc2hpcHNbaW52ZXJzZVR5cGVdLmZpbmQoXG4gICAgICByID0+IHIuZWxlbWVudCA9PT0gc291cmNlRWxlbWVudFxuICAgICk7XG5cbiAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICB0YXJnZXRFbGVtZW50LnJlbGF0aW9uc2hpcHNbaW52ZXJzZVR5cGVdLnB1c2goe1xuICAgICAgICBlbGVtZW50OiBzb3VyY2VFbGVtZW50LFxuICAgICAgICB0eXBlOiBpbnZlcnNlVHlwZSxcbiAgICAgICAgc3RyZW5ndGg6IHJlbGF0aW9uc2hpcC5zdHJlbmd0aCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAuLi5yZWxhdGlvbnNoaXAubWV0YWRhdGEsXG4gICAgICAgICAgaW52ZXJzZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBlbGVtZW50IGJ5IHBhcnRpYWwgbmFtZSBtYXRjaFxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kRWxlbWVudEJ5TmFtZShuYW1lOiBzdHJpbmcsIGluZGV4OiBFbmhhbmNlZEluZGV4KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgbmFtZUxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoL1tfLV0vZywgJycpO1xuXG4gICAgZm9yIChjb25zdCBbdHlwZSwgZWxlbWVudHNdIG9mIE9iamVjdC5lbnRyaWVzKGluZGV4LmVsZW1lbnRzKSkge1xuICAgICAgZm9yIChjb25zdCBbZWxlbWVudE5hbWUsIGVsZW1lbnRdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW1lbnRzKSkge1xuICAgICAgICBjb25zdCBlbGVtZW50TmFtZUxvd2VyID0gZWxlbWVudE5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKC9bXy1dL2csICcnKTtcblxuICAgICAgICAvLyBDaGVjayBleGFjdCBtYXRjaCBmaXJzdFxuICAgICAgICBpZiAoZWxlbWVudE5hbWVMb3dlciA9PT0gbmFtZUxvd2VyKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3R5cGV9OiR7ZWxlbWVudE5hbWV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGVsZW1lbnQgbmFtZSBjb250YWlucyB0aGUgc2VhcmNoIHRlcm1cbiAgICAgICAgaWYgKGVsZW1lbnROYW1lTG93ZXIuaW5jbHVkZXMobmFtZUxvd2VyKSB8fCBuYW1lTG93ZXIuaW5jbHVkZXMoZWxlbWVudE5hbWVMb3dlcikpIHtcbiAgICAgICAgICByZXR1cm4gYCR7dHlwZX06JHtlbGVtZW50TmFtZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZGlzcGxheSBuYW1lXG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lTG93ZXIgPSBlbGVtZW50LmNvcmUubmFtZT8udG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKC9bXy1dL2csICcnKTtcbiAgICAgICAgaWYgKGRpc3BsYXlOYW1lTG93ZXIgJiYgKGRpc3BsYXlOYW1lTG93ZXIgPT09IG5hbWVMb3dlciB8fCBkaXNwbGF5TmFtZUxvd2VyLmluY2x1ZGVzKG5hbWVMb3dlcikpKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3R5cGV9OiR7ZWxlbWVudE5hbWV9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb21iaW5lZCB0ZXh0IGZyb20gZWxlbWVudCBmb3IgYW5hbHlzaXNcbiAgICovXG4gIHByaXZhdGUgZ2V0RWxlbWVudFRleHQoZWxlbWVudDogRWxlbWVudERlZmluaXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQ29yZSBmaWVsZHNcbiAgICBpZiAoZWxlbWVudC5jb3JlLm5hbWUpIHBhcnRzLnB1c2goZWxlbWVudC5jb3JlLm5hbWUpO1xuICAgIGlmIChlbGVtZW50LmNvcmUuZGVzY3JpcHRpb24pIHBhcnRzLnB1c2goZWxlbWVudC5jb3JlLmRlc2NyaXB0aW9uKTtcblxuICAgIC8vIEtleXdvcmRzIGFuZCB0YWdzIGZyb20gc2VhcmNoIG9wdGltaXphdGlvblxuICAgIGlmIChlbGVtZW50LnNlYXJjaD8ua2V5d29yZHMpIHBhcnRzLnB1c2goLi4uZWxlbWVudC5zZWFyY2gua2V5d29yZHMpO1xuICAgIGlmIChlbGVtZW50LnNlYXJjaD8udGFncykgcGFydHMucHVzaCguLi5lbGVtZW50LnNlYXJjaC50YWdzKTtcblxuICAgIC8vIEN1c3RvbSBmaWVsZHMgKG1pZ2h0IGNvbnRhaW4gcmVsZXZhbnQgdGV4dClcbiAgICBpZiAoZWxlbWVudC5jdXN0b20pIHtcbiAgICAgIGNvbnN0IGN1c3RvbVRleHQgPSB0aGlzLmV4dHJhY3RUZXh0RnJvbU9iamVjdChlbGVtZW50LmN1c3RvbSk7XG4gICAgICBpZiAoY3VzdG9tVGV4dCkgcGFydHMucHVzaChjdXN0b21UZXh0KTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgVW5pY29kZSBmb3Igc2VjdXJpdHkgKERNQ1AtU0VDLTAwNClcbiAgICBjb25zdCBjb21iaW5lZFRleHQgPSBwYXJ0cy5qb2luKCcgJyk7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNvbWJpbmVkVGV4dCk7XG4gICAgaWYgKHZhbGlkYXRpb24uZGV0ZWN0ZWRJc3N1ZXMgJiYgdmFsaWRhdGlvbi5kZXRlY3RlZElzc3Vlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignVW5pY29kZSBpc3N1ZXMgaW4gcmVsYXRpb25zaGlwIHRleHQnLCB7IGlzc3VlczogdmFsaWRhdGlvbi5kZXRlY3RlZElzc3VlcyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHRleHQgZnJvbSBuZXN0ZWQgb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RUZXh0RnJvbU9iamVjdChvYmo6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgdGV4dHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMob2JqKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGV4dHMucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRleHRzLnB1c2goLi4udmFsdWUuZmlsdGVyKHYgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgbmVzdGVkID0gdGhpcy5leHRyYWN0VGV4dEZyb21PYmplY3QodmFsdWUpO1xuICAgICAgICBpZiAobmVzdGVkKSB0ZXh0cy5wdXNoKG5lc3RlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRleHRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHNob3J0ZXN0IHBhdGggYmV0d2VlbiB0d28gZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBmaW5kUGF0aChcbiAgICBmcm9tRWxlbWVudDogc3RyaW5nLFxuICAgIHRvRWxlbWVudDogc3RyaW5nLFxuICAgIGluZGV4OiBFbmhhbmNlZEluZGV4LFxuICAgIG9wdGlvbnM6IFRyYXZlcnNhbE9wdGlvbnMgPSB7fVxuICApOiBFbGVtZW50UGF0aCB8IG51bGwge1xuICAgIGNvbnN0IHtcbiAgICAgIG1heERlcHRoID0gNSxcbiAgICAgIHJlbGF0aW9uc2hpcFR5cGVzLFxuICAgICAgbWluU3RyZW5ndGggPSAwLFxuICAgICAgdmlzaXRlZCA9IG5ldyBTZXQoKVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgLy8gQkZTIHRvIGZpbmQgc2hvcnRlc3QgcGF0aFxuICAgIGNvbnN0IHF1ZXVlOiBFbGVtZW50UGF0aFtdID0gW3tcbiAgICAgIHBhdGg6IFtmcm9tRWxlbWVudF0sXG4gICAgICByZWxhdGlvbnNoaXBzOiBbXSxcbiAgICAgIHRvdGFsU3RyZW5ndGg6IDEuMFxuICAgIH1dO1xuXG4gICAgdmlzaXRlZC5hZGQoZnJvbUVsZW1lbnQpO1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBxdWV1ZS5zaGlmdCgpITtcblxuICAgICAgaWYgKGN1cnJlbnQucGF0aC5sZW5ndGggPiBtYXhEZXB0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50LnBhdGhbY3VycmVudC5wYXRoLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAoY3VycmVudEVsZW1lbnQgPT09IHRvRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH1cblxuICAgICAgLy8gRklYOiBVc2UgY2VudHJhbGl6ZWQgZWxlbWVudCBJRCBwYXJzaW5nXG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUVsZW1lbnRJZChjdXJyZW50RWxlbWVudCk7XG4gICAgICBpZiAoIXBhcnNlZCkgY29udGludWU7XG4gICAgICBjb25zdCBlbGVtZW50ID0gaW5kZXguZWxlbWVudHNbcGFyc2VkLnR5cGVdPy5bcGFyc2VkLm5hbWVdO1xuXG4gICAgICBpZiAoIWVsZW1lbnQ/LnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4cGxvcmUgYWxsIHJlbGF0aW9uc2hpcHNcbiAgICAgIGZvciAoY29uc3QgW3JlbFR5cGUsIHJlbGF0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoZWxlbWVudC5yZWxhdGlvbnNoaXBzKSkge1xuICAgICAgICAvLyBGaWx0ZXIgYnkgcmVsYXRpb25zaGlwIHR5cGVzIGlmIHNwZWNpZmllZFxuICAgICAgICBpZiAocmVsYXRpb25zaGlwVHlwZXMgJiYgIXJlbGF0aW9uc2hpcFR5cGVzLmluY2x1ZGVzKHJlbFR5cGUgYXMgUmVsYXRpb25zaGlwVHlwZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVsIG9mIHJlbGF0aW9ucykge1xuICAgICAgICAgIC8vIEZpbHRlciBieSBzdHJlbmd0aFxuICAgICAgICAgIGlmICgocmVsLnN0cmVuZ3RoIHx8IDApIDwgbWluU3RyZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMocmVsLmVsZW1lbnQpKSB7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChyZWwuZWxlbWVudCk7XG5cbiAgICAgICAgICAgIHF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICBwYXRoOiBbLi4uY3VycmVudC5wYXRoLCByZWwuZWxlbWVudF0sXG4gICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHM6IFsuLi5jdXJyZW50LnJlbGF0aW9uc2hpcHMsIHJlbFR5cGUgYXMgUmVsYXRpb25zaGlwVHlwZV0sXG4gICAgICAgICAgICAgIHRvdGFsU3RyZW5ndGg6IGN1cnJlbnQudG90YWxTdHJlbmd0aCAqIChyZWwuc3RyZW5ndGggfHwgMC41KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBjb25uZWN0ZWQgZWxlbWVudHMgd2l0aGluIGEgY2VydGFpbiBkZXB0aFxuICAgKi9cbiAgcHVibGljIGdldENvbm5lY3RlZEVsZW1lbnRzKFxuICAgIGVsZW1lbnQ6IHN0cmluZyxcbiAgICBpbmRleDogRW5oYW5jZWRJbmRleCxcbiAgICBvcHRpb25zOiBUcmF2ZXJzYWxPcHRpb25zID0ge31cbiAgKTogTWFwPHN0cmluZywgRWxlbWVudFBhdGg+IHtcbiAgICBjb25zdCB7XG4gICAgICBtYXhEZXB0aCA9IDIsXG4gICAgICByZWxhdGlvbnNoaXBUeXBlcyxcbiAgICAgIG1pblN0cmVuZ3RoID0gMFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgY29ubmVjdGVkID0gbmV3IE1hcDxzdHJpbmcsIEVsZW1lbnRQYXRoPigpO1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oW2VsZW1lbnRdKTtcblxuICAgIGNvbnN0IHF1ZXVlOiBFbGVtZW50UGF0aFtdID0gW3tcbiAgICAgIHBhdGg6IFtlbGVtZW50XSxcbiAgICAgIHJlbGF0aW9uc2hpcHM6IFtdLFxuICAgICAgdG90YWxTdHJlbmd0aDogMS4wXG4gICAgfV07XG5cbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHF1ZXVlLnNoaWZ0KCkhO1xuXG4gICAgICBpZiAoY3VycmVudC5wYXRoLmxlbmd0aCA+IG1heERlcHRoICsgMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50LnBhdGhbY3VycmVudC5wYXRoLmxlbmd0aCAtIDFdO1xuICAgICAgLy8gRklYOiBVc2UgY2VudHJhbGl6ZWQgZWxlbWVudCBJRCBwYXJzaW5nXG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUVsZW1lbnRJZChjdXJyZW50RWxlbWVudCk7XG4gICAgICBpZiAoIXBhcnNlZCkgY29udGludWU7XG4gICAgICBjb25zdCBlbGVtZW50RGVmID0gaW5kZXguZWxlbWVudHNbcGFyc2VkLnR5cGVdPy5bcGFyc2VkLm5hbWVdO1xuXG4gICAgICBpZiAoIWVsZW1lbnREZWY/LnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgW3JlbFR5cGUsIHJlbGF0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoZWxlbWVudERlZi5yZWxhdGlvbnNoaXBzKSkge1xuICAgICAgICBpZiAocmVsYXRpb25zaGlwVHlwZXMgJiYgIXJlbGF0aW9uc2hpcFR5cGVzLmluY2x1ZGVzKHJlbFR5cGUgYXMgUmVsYXRpb25zaGlwVHlwZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVsIG9mIHJlbGF0aW9ucykge1xuICAgICAgICAgIGlmICgocmVsLnN0cmVuZ3RoIHx8IDApIDwgbWluU3RyZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMocmVsLmVsZW1lbnQpKSB7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChyZWwuZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhdGg6IEVsZW1lbnRQYXRoID0ge1xuICAgICAgICAgICAgICBwYXRoOiBbLi4uY3VycmVudC5wYXRoLCByZWwuZWxlbWVudF0sXG4gICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHM6IFsuLi5jdXJyZW50LnJlbGF0aW9uc2hpcHMsIHJlbFR5cGUgYXMgUmVsYXRpb25zaGlwVHlwZV0sXG4gICAgICAgICAgICAgIHRvdGFsU3RyZW5ndGg6IGN1cnJlbnQudG90YWxTdHJlbmd0aCAqIChyZWwuc3RyZW5ndGggfHwgMC41KVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29ubmVjdGVkLnNldChyZWwuZWxlbWVudCwgcGF0aCk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50LnBhdGgubGVuZ3RoIDwgbWF4RGVwdGgpIHtcbiAgICAgICAgICAgICAgcXVldWUucHVzaChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29ubmVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWxhdGlvbnNoaXAgc3RhdGlzdGljcyBmb3IgdGhlIGluZGV4XG4gICAqL1xuICBwdWJsaWMgZ2V0UmVsYXRpb25zaGlwU3RhdHMoaW5kZXg6IEVuaGFuY2VkSW5kZXgpOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcbiAgICBjb25zdCBzdGF0czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICAgIHRvdGFsUmVsYXRpb25zaGlwczogMCxcbiAgICAgIGVsZW1lbnRzV2l0aFJlbGF0aW9uc2hpcHM6IDBcbiAgICB9O1xuXG4gICAgLy8gQ291bnQgYnkgcmVsYXRpb25zaGlwIHR5cGVcbiAgICBmb3IgKGNvbnN0IHJlbFR5cGUgb2YgT2JqZWN0LmtleXMoUkVMQVRJT05TSElQX1RZUEVTKSkge1xuICAgICAgc3RhdHNbcmVsVHlwZV0gPSAwO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZWxlbWVudHMgb2YgT2JqZWN0LnZhbHVlcyhpbmRleC5lbGVtZW50cykpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBPYmplY3QudmFsdWVzKGVsZW1lbnRzKSkge1xuICAgICAgICBpZiAoZWxlbWVudC5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgICAgc3RhdHMuZWxlbWVudHNXaXRoUmVsYXRpb25zaGlwcysrO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBbcmVsVHlwZSwgcmVsYXRpb25zXSBvZiBPYmplY3QuZW50cmllcyhlbGVtZW50LnJlbGF0aW9uc2hpcHMpKSB7XG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IHJlbGF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBzdGF0cy50b3RhbFJlbGF0aW9uc2hpcHMgKz0gY291bnQ7XG4gICAgICAgICAgICBzdGF0c1tyZWxUeXBlXSA9IChzdGF0c1tyZWxUeXBlXSB8fCAwKSArIGNvdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGF0cztcbiAgfVxufSJdfQ==
|