@dollhousemcp/mcp-server 2.0.16 → 2.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md.backup +18 -0
  3. package/dist/elements/BaseElement.d.ts +1 -0
  4. package/dist/elements/BaseElement.d.ts.map +1 -1
  5. package/dist/elements/BaseElement.js +7 -1
  6. package/dist/elements/agents/AgentManager.js +2 -2
  7. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  8. package/dist/elements/base/BaseElementManager.js +17 -1
  9. package/dist/elements/base/ElementFileOperations.js +2 -2
  10. package/dist/elements/ensembles/EnsembleManager.js +3 -3
  11. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  12. package/dist/elements/memories/MemoryManager.js +14 -3
  13. package/dist/elements/skills/SkillManager.js +2 -2
  14. package/dist/elements/templates/TemplateManager.js +2 -2
  15. package/dist/generated/version.d.ts +2 -2
  16. package/dist/generated/version.js +3 -3
  17. package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
  18. package/dist/handlers/ElementCRUDHandler.js +3 -2
  19. package/dist/handlers/element-crud/createElement.d.ts.map +1 -1
  20. package/dist/handlers/element-crud/createElement.js +6 -2
  21. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  22. package/dist/handlers/element-crud/editElement.js +6 -2
  23. package/dist/handlers/element-crud/helpers.d.ts +2 -0
  24. package/dist/handlers/element-crud/helpers.d.ts.map +1 -1
  25. package/dist/handlers/element-crud/helpers.js +21 -2
  26. package/dist/handlers/mcp-aql/IntrospectionResolver.d.ts.map +1 -1
  27. package/dist/handlers/mcp-aql/IntrospectionResolver.js +34 -7
  28. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +1 -0
  29. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  30. package/dist/handlers/mcp-aql/MCPAQLHandler.js +50 -14
  31. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  32. package/dist/handlers/mcp-aql/OperationSchema.js +3 -2
  33. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/evaluatePermission.js +2 -1
  35. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts +17 -1
  36. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
  37. package/dist/handlers/mcp-aql/policies/ElementPolicies.js +88 -4
  38. package/dist/handlers/strategies/AgentActivationStrategy.d.ts.map +1 -1
  39. package/dist/handlers/strategies/AgentActivationStrategy.js +5 -1
  40. package/dist/handlers/strategies/BaseActivationStrategy.d.ts +1 -0
  41. package/dist/handlers/strategies/BaseActivationStrategy.d.ts.map +1 -1
  42. package/dist/handlers/strategies/BaseActivationStrategy.js +15 -1
  43. package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
  44. package/dist/handlers/strategies/EnsembleActivationStrategy.js +5 -1
  45. package/dist/handlers/strategies/MemoryActivationStrategy.d.ts.map +1 -1
  46. package/dist/handlers/strategies/MemoryActivationStrategy.js +5 -1
  47. package/dist/handlers/strategies/PersonaActivationStrategy.d.ts.map +1 -1
  48. package/dist/handlers/strategies/PersonaActivationStrategy.js +5 -1
  49. package/dist/handlers/strategies/SkillActivationStrategy.d.ts.map +1 -1
  50. package/dist/handlers/strategies/SkillActivationStrategy.js +5 -1
  51. package/dist/handlers/strategies/TemplateActivationStrategy.d.ts.map +1 -1
  52. package/dist/handlers/strategies/TemplateActivationStrategy.js +7 -2
  53. package/dist/persona/PersonaElement.js +2 -2
  54. package/dist/services/SerializationService.d.ts.map +1 -1
  55. package/dist/services/SerializationService.js +7 -1
  56. package/dist/types/elements/IElement.d.ts +9 -0
  57. package/dist/types/elements/IElement.d.ts.map +1 -1
  58. package/dist/types/elements/IElement.js +1 -1
  59. package/dist/utils/permissionHooks.d.ts +39 -3
  60. package/dist/utils/permissionHooks.d.ts.map +1 -1
  61. package/dist/utils/permissionHooks.js +651 -74
  62. package/dist/web/public/permissions.css +190 -2
  63. package/dist/web/public/permissions.js +209 -56
  64. package/dist/web/public/setup.js +452 -108
  65. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  66. package/dist/web/routes/permissionRoutes.js +108 -17
  67. package/dist/web/routes/setupRoutes.d.ts +1 -0
  68. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  69. package/dist/web/routes/setupRoutes.js +128 -42
  70. package/package.json +3 -1
  71. package/scripts/pretooluse-dollhouse.sh +39 -1
  72. package/scripts/pretooluse-vscode.sh +163 -0
  73. package/scripts/pretooluse-windsurf.sh +166 -4
  74. package/server.json +2 -2
@@ -30,6 +30,7 @@ import { SecurityMonitor } from '../security/securityMonitor.js';
30
30
  import { ELEMENT_TYPE_MAP } from '../utils/elementTypeNormalization.js';
31
31
  import { TemplateActivationStrategy, SkillActivationStrategy, AgentActivationStrategy, MemoryActivationStrategy, PersonaActivationStrategy, EnsembleActivationStrategy } from './strategies/index.js';
32
32
  import { formatValidationFailedError } from './element-crud/responseFormatter.js';
33
+ import { getGatekeeperDiagnostics } from './mcp-aql/policies/ElementPolicies.js';
33
34
  export class ElementCRUDHandler {
34
35
  skillManager;
35
36
  templateManager;
@@ -119,7 +120,7 @@ export class ElementCRUDHandler {
119
120
  : '';
120
121
  }
121
122
  hasGatekeeperPolicy(metadata) {
122
- return Boolean(metadata?.['gatekeeper']);
123
+ return Boolean(metadata?.['gatekeeper'] || getGatekeeperDiagnostics(metadata));
123
124
  }
124
125
  toPolicyElementType(type) {
125
126
  const normalizedType = this.normalizeLookupValue(type).toLowerCase();
@@ -859,4 +860,4 @@ export class ElementCRUDHandler {
859
860
  };
860
861
  }
861
862
  }
862
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudENSVURIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL0VsZW1lbnRDUlVESGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFvQixNQUFNLGtDQUFrQyxDQUFDO0FBT2pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxJQUFJLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEYsT0FBTyxFQUFFLGFBQWEsSUFBSSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxXQUFXLElBQUksa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsY0FBYyxJQUFJLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxlQUFlLElBQUksc0JBQXNCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUs5RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHeEUsT0FBTyxFQUNMLDBCQUEwQixFQUMxQix1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4Qix5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzNCLE1BQU0sdUJBQXVCLENBQUM7QUFPL0Is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UUFDbkMsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBRTlCLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2xELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO2dCQUNyQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLFdBQVcsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUM7b0JBQ1IsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3dCQUN2QixDQUFDLENBQUMsMkJBQTJCO2lCQUNoQyxDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWxlbWVudENSVURIYW5kbGVyIC0gSGFuZGxlcyBhbGwgZ2VuZXJpYyBlbGVtZW50IENSVUQgb3BlcmF0aW9uc1xuICpcbiAqIFByb3ZpZGVzIGNyZWF0ZSwgZWRpdCwgdmFsaWRhdGUsIGFuZCBkZWxldGUgb3BlcmF0aW9ucyBmb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAqIChwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cywgbWVtb3JpZXMpLlxuICpcbiAqIFVzZXMgZGVwZW5kZW5jeSBpbmplY3Rpb24gZm9yIGFsbCBzZXJ2aWNlczpcbiAqIC0gSW5pdGlhbGl6YXRpb25TZXJ2aWNlIGZvciBzZXR1cCB0YXNrc1xuICogLSBQZXJzb25hSW5kaWNhdG9yU2VydmljZSBmb3IgcGVyc29uYSBpbmRpY2F0b3IgZm9ybWF0dGluZ1xuICogLSBFbGVtZW50IG1hbmFnZXJzIChTa2lsbE1hbmFnZXIsIFRlbXBsYXRlTWFuYWdlciwgQWdlbnRNYW5hZ2VyLCBNZW1vcnlNYW5hZ2VyKVxuICogLSBQZXJzb25hTWFuYWdlciBmb3IgcGVyc29uYSBvcGVyYXRpb25zXG4gKiAtIFBvcnRmb2xpb01hbmFnZXIgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zXG4gKlxuICogRklYOiBETUNQLVNFQy0wMDYgLSBTZWN1cml0eSBhdWRpdCBzdXBwcmVzc2lvblxuICogVGhpcyBoYW5kbGVyIGRlbGVnYXRlcyBhbGwgb3BlcmF0aW9ucyB0byBzcGVjaWFsaXplZCBlbGVtZW50IG1hbmFnZXJzLlxuICogQXVkaXQgbG9nZ2luZyBoYXBwZW5zIGluIHRoZSBlbGVtZW50IG1hbmFnZXJzIHRoZW1zZWx2ZXMuXG4gKiBAc2VjdXJpdHktYXVkaXQtc3VwcHJlc3MgRE1DUC1TRUMtMDA2XG4gKi9cblxuaW1wb3J0IHsgRWxlbWVudFR5cGUsIFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTa2lsbE1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9za2lsbHMvaW5kZXguanMnO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvdGVtcGxhdGVzL1RlbXBsYXRlTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZVJlbmRlcmVyIH0gZnJvbSAnLi4vdXRpbHMvVGVtcGxhdGVSZW5kZXJlci5qcyc7XG5pbXBvcnQgeyBBZ2VudE1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9hZ2VudHMvQWdlbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEVuc2VtYmxlTWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnROb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgYXMgY3JlYXRlRWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9jcmVhdGVFbGVtZW50LmpzJztcbmltcG9ydCB7IGRlbGV0ZUVsZW1lbnQgYXMgZGVsZXRlRWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9kZWxldGVFbGVtZW50LmpzJztcbmltcG9ydCB7IGVkaXRFbGVtZW50IGFzIGVkaXRFbGVtZW50Q29tbWFuZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL2VkaXRFbGVtZW50LmpzJztcbmltcG9ydCB7IHVwZ3JhZGVFbGVtZW50IGFzIHVwZ3JhZGVFbGVtZW50Q29tbWFuZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL3VwZ3JhZGVFbGVtZW50LmpzJztcbmltcG9ydCB7IGxpc3RFbGVtZW50cyBhcyBsaXN0RWxlbWVudHNDb21tYW5kIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvbGlzdEVsZW1lbnRzLmpzJztcbmltcG9ydCB7IGZpbmRFbGVtZW50RmxleGlibHksIHNhbml0aXplTWV0YWRhdGEgYXMgc2FuaXRpemVNZXRhZGF0YVJlY29yZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVFbGVtZW50IGFzIHZhbGlkYXRlRWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC92YWxpZGF0ZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudENydWRDb250ZXh0IH0gZnJvbSAnLi9lbGVtZW50LWNydWQvdHlwZXMuanMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvSW5pdGlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvUGVyc29uYUluZGljYXRvclNlcnZpY2UuanMnO1xuaW1wb3J0IHsgUGVyc29uYU1hbmFnZXIgfSBmcm9tICcuLi9wZXJzb25hL1BlcnNvbmFNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBFTEVNRU5UX1RZUEVfTUFQIH0gZnJvbSAnLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSUZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRBY3RpdmF0aW9uU3RyYXRlZ3ksIE1DUFJlc3BvbnNlIH0gZnJvbSAnLi9zdHJhdGVnaWVzL2luZGV4LmpzJztcbmltcG9ydCB7XG4gIFRlbXBsYXRlQWN0aXZhdGlvblN0cmF0ZWd5LFxuICBTa2lsbEFjdGl2YXRpb25TdHJhdGVneSxcbiAgQWdlbnRBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gIE1lbW9yeUFjdGl2YXRpb25TdHJhdGVneSxcbiAgUGVyc29uYUFjdGl2YXRpb25TdHJhdGVneSxcbiAgRW5zZW1ibGVBY3RpdmF0aW9uU3RyYXRlZ3lcbn0gZnJvbSAnLi9zdHJhdGVnaWVzL2luZGV4LmpzJztcbmltcG9ydCB7IEVsZW1lbnRRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWVyeS9FbGVtZW50UXVlcnlTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB0eXBlIHsgQWN0aXZhdGlvblN0b3JlLCBQZXJzaXN0ZWRBY3RpdmF0aW9uLCBQZXJzaXN0ZWRBY3RpdmF0aW9uU3RhdGVTbmFwc2hvdCB9IGZyb20gJy4uL3NlcnZpY2VzL0FjdGl2YXRpb25TdG9yZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhY2t1cFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJztcbmltcG9ydCB0eXBlIHsgUG9saWN5RXhwb3J0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL1BvbGljeUV4cG9ydFNlcnZpY2UuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBmb3JtYXRWYWxpZGF0aW9uRmFpbGVkRXJyb3IgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9yZXNwb25zZUZvcm1hdHRlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50Q1JVREhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0cmF0ZWdpZXM6IE1hcDxzdHJpbmcsIEVsZW1lbnRBY3RpdmF0aW9uU3RyYXRlZ3k+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2tpbGxNYW5hZ2VyOiBTa2lsbE1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZU1hbmFnZXI6IFRlbXBsYXRlTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlUmVuZGVyZXI6IFRlbXBsYXRlUmVuZGVyZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhZ2VudE1hbmFnZXI6IEFnZW50TWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeU1hbmFnZXI6IE1lbW9yeU1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnNlbWJsZU1hbmFnZXI6IEVuc2VtYmxlTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcnNvbmFNYW5hZ2VyOiBQZXJzb25hTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbml0U2VydmljZTogSW5pdGlhbGl6YXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yU2VydmljZTogUGVyc29uYUluZGljYXRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlT3BlcmF0aW9uczogSUZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRRdWVyeVNlcnZpY2U6IEVsZW1lbnRRdWVyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRpb25TdG9yZT86IEFjdGl2YXRpb25TdG9yZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhY2t1cFNlcnZpY2U/OiBCYWNrdXBTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9saWN5RXhwb3J0U2VydmljZT86IFBvbGljeUV4cG9ydFNlcnZpY2VcbiAgKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBzdHJhdGVneSBtYXAgd2l0aCBhbGwgZWxlbWVudCB0eXBlIHN0cmF0ZWdpZXNcbiAgICB0aGlzLnN0cmF0ZWdpZXMgPSBuZXcgTWFwPHN0cmluZywgRWxlbWVudEFjdGl2YXRpb25TdHJhdGVneT4oW1xuICAgICAgW0VsZW1lbnRUeXBlLlBFUlNPTkEsIG5ldyBQZXJzb25hQWN0aXZhdGlvblN0cmF0ZWd5KHBlcnNvbmFNYW5hZ2VyLCBpbmRpY2F0b3JTZXJ2aWNlKV0sXG4gICAgICBbRWxlbWVudFR5cGUuU0tJTEwsIG5ldyBTa2lsbEFjdGl2YXRpb25TdHJhdGVneShza2lsbE1hbmFnZXIpXSxcbiAgICAgIFtFbGVtZW50VHlwZS5URU1QTEFURSwgbmV3IFRlbXBsYXRlQWN0aXZhdGlvblN0cmF0ZWd5KHRlbXBsYXRlTWFuYWdlcildLFxuICAgICAgW0VsZW1lbnRUeXBlLkFHRU5ULCBuZXcgQWdlbnRBY3RpdmF0aW9uU3RyYXRlZ3koYWdlbnRNYW5hZ2VyKV0sXG4gICAgICBbRWxlbWVudFR5cGUuTUVNT1JZLCBuZXcgTWVtb3J5QWN0aXZhdGlvblN0cmF0ZWd5KG1lbW9yeU1hbmFnZXIpXSxcbiAgICAgIFtFbGVtZW50VHlwZS5FTlNFTUJMRSwgbmV3IEVuc2VtYmxlQWN0aXZhdGlvblN0cmF0ZWd5KFxuICAgICAgICBlbnNlbWJsZU1hbmFnZXIsXG4gICAgICAgIHBvcnRmb2xpb01hbmFnZXIsXG4gICAgICAgIHNraWxsTWFuYWdlcixcbiAgICAgICAgdGVtcGxhdGVNYW5hZ2VyLFxuICAgICAgICBhZ2VudE1hbmFnZXIsXG4gICAgICAgIG1lbW9yeU1hbmFnZXIsXG4gICAgICAgIHBlcnNvbmFNYW5hZ2VyXG4gICAgICApXVxuICAgIF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbml0aWFsaXplZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRTZXJ2aWNlLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFBlcnNvbmFJbmRpY2F0b3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbmRpY2F0b3JTZXJ2aWNlLmdldFBlcnNvbmFJbmRpY2F0b3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udGV4dCgpOiBFbGVtZW50Q3J1ZENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBlbnN1cmVJbml0aWFsaXplZDogKCkgPT4gdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpLFxuICAgICAgZ2V0UGVyc29uYUluZGljYXRvcjogKCkgPT4gdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCksXG4gICAgICBza2lsbE1hbmFnZXI6IHRoaXMuc2tpbGxNYW5hZ2VyLFxuICAgICAgdGVtcGxhdGVNYW5hZ2VyOiB0aGlzLnRlbXBsYXRlTWFuYWdlcixcbiAgICAgIHRlbXBsYXRlUmVuZGVyZXI6IHRoaXMudGVtcGxhdGVSZW5kZXJlcixcbiAgICAgIGFnZW50TWFuYWdlcjogdGhpcy5hZ2VudE1hbmFnZXIsXG4gICAgICBtZW1vcnlNYW5hZ2VyOiB0aGlzLm1lbW9yeU1hbmFnZXIsXG4gICAgICBlbnNlbWJsZU1hbmFnZXI6IHRoaXMuZW5zZW1ibGVNYW5hZ2VyLFxuICAgICAgcG9ydGZvbGlvTWFuYWdlcjogdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLFxuICAgICAgcGVyc29uYU1hbmFnZXI6IHRoaXMucGVyc29uYU1hbmFnZXIsXG4gICAgICBmaWxlT3BlcmF0aW9uczogdGhpcy5maWxlT3BlcmF0aW9ucyxcbiAgICAgIGVsZW1lbnRRdWVyeVNlcnZpY2U6IHRoaXMuZWxlbWVudFF1ZXJ5U2VydmljZSxcbiAgICAgIHZhbGlkYXRpb25SZWdpc3RyeTogdGhpcy52YWxpZGF0aW9uUmVnaXN0cnksXG4gICAgICBiYWNrdXBTZXJ2aWNlOiB0aGlzLmJhY2t1cFNlcnZpY2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYnkgbmFtZSwgc3VwcG9ydGluZyBib3RoIGV4YWN0IGRpc3BsYXkgbmFtZSBhbmQgZmlsZW5hbWUgKHNsdWcpIG1hdGNoaW5nXG4gICAqIEhlbHBlciBtZXRob2QgZXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MzQ2LTM3OVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kRWxlbWVudEZsZXhpYmx5KG5hbWU6IHN0cmluZywgZWxlbWVudExpc3Q6IGFueVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gZmluZEVsZW1lbnRGbGV4aWJseShuYW1lLCBlbGVtZW50TGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemUgbWV0YWRhdGEgb2JqZWN0IHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgKiBIZWxwZXIgbWV0aG9kIGV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjM5MC00MTBcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVNZXRhZGF0YShtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiBzYW5pdGl6ZU1ldGFkYXRhUmVjb3JkKG1ldGFkYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplTG9va3VwVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICA/IHZhbHVlLm5vcm1hbGl6ZSgnTkZDJykudHJpbSgpXG4gICAgICA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNHYXRla2VlcGVyUG9saWN5KG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKG1ldGFkYXRhPy5bJ2dhdGVrZWVwZXInXSk7XG4gIH1cblxuICBwcml2YXRlIHRvUG9saWN5RWxlbWVudFR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplTG9va3VwVmFsdWUodHlwZSkudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgIHJldHVybiAncGVyc29uYSc7XG4gICAgICBjYXNlICdza2lsbHMnOlxuICAgICAgICByZXR1cm4gJ3NraWxsJztcbiAgICAgIGNhc2UgJ2FnZW50cyc6XG4gICAgICAgIHJldHVybiAnYWdlbnQnO1xuICAgICAgY2FzZSAnbWVtb3JpZXMnOlxuICAgICAgICByZXR1cm4gJ21lbW9yeSc7XG4gICAgICBjYXNlICdlbnNlbWJsZXMnOlxuICAgICAgICByZXR1cm4gJ2Vuc2VtYmxlJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkVHlwZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MTQ5Mi0xNjMxICgxNDAgbGluZXMgLSBleGFjdCBjb3B5KVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IGluc3RydWN0aW9ucz86IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSkge1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50Q29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRWRpdCBhbiBleGlzdGluZyBlbGVtZW50IHVzaW5nIEdyYXBoUUwtYWxpZ25lZCBuZXN0ZWQgaW5wdXQgb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgaGFuZGxlci5lZGl0RWxlbWVudCh7XG4gICAqICAgbmFtZTogJ215LXNraWxsJyxcbiAgICogICB0eXBlOiAnc2tpbGxzJyxcbiAgICogICBpbnB1dDoge1xuICAgKiAgICAgZGVzY3JpcHRpb246ICdVcGRhdGVkJyxcbiAgICogICAgIG1ldGFkYXRhOiB7IHRyaWdnZXJzOiBbJ2NvZGUnXSB9XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICovXG4gIGFzeW5jIGVkaXRFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSkge1xuICAgIHJldHVybiBlZGl0RWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZ3JhZGUgZWxlbWVudCBmcm9tIHYxIHNpbmdsZS1ib2R5IHRvIHYyIGR1YWwtZmllbGQgZm9ybWF0IChpbnN0cnVjdGlvbnMgKyBjb250ZW50KVxuICAgKi9cbiAgYXN5bmMgdXBncmFkZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBkcnlfcnVuPzogYm9vbGVhbjsgaW5zdHJ1Y3Rpb25zX292ZXJyaWRlPzogc3RyaW5nOyBjb250ZW50X292ZXJyaWRlPzogc3RyaW5nfSkge1xuICAgIHJldHVybiB1cGdyYWRlRWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MTk0MS0yMDU0ICgxMTQgbGluZXMgLSBleGFjdCBjb3B5KVxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgc3RyaWN0PzogYm9vbGVhbn0pIHtcbiAgICByZXR1cm4gdmFsaWRhdGVFbGVtZW50Q29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MjA1Ni0yMzEwICgyNTUgbGluZXMgLSBleGFjdCBjb3B5LCBzcGxpdCBmb3IgcmVhZGFiaWxpdHkpXG4gICAqL1xuICBhc3luYyBkZWxldGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVsZXRlRGF0YT86IGJvb2xlYW59KSB7XG4gICAgcmV0dXJuIGRlbGV0ZUVsZW1lbnRDb21tYW5kKHRoaXMuZ2V0Q29udGV4dCgpLCBhcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcbiAgICAvLyBJc3N1ZSAjNTAxOiBHdWFyZCBhZ2FpbnN0IG51bGwvdW5kZWZpbmVkIHRvIG1hdGNoIHNoYXJlZCB1dGlsaXR5IHBhdHRlcm5cbiAgICBpZiAodHlwZSA9PSBudWxsIHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyB8fCB0eXBlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgYSB2YWxpZCBFbGVtZW50VHlwZSB2YWx1ZSwgcmV0dXJuIGFzLWlzXG4gICAgaWYgKE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmluY2x1ZGVzKHR5cGUgYXMgRWxlbWVudFR5cGUpKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugc2hhcmVkIG5vcm1hbGl6YXRpb24gbWFwIChJc3N1ZSAjNDMzKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBFTEVNRU5UX1RZUEVfTUFQW3R5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmIChub3JtYWxpemVkKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICAvLyBVbmtub3duIHR5cGUgLSByZXR1cm4gYXMtaXMgYW5kIGxldCB2YWxpZGF0aW9uIGhhbmRsZSBpdFxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgYXN5bmMgbGlzdEVsZW1lbnRzKHR5cGU6IHN0cmluZywgb3B0aW9ucz86IGltcG9ydCgnLi4vc2VydmljZXMvcXVlcnkvdHlwZXMuanMnKS5RdWVyeU9wdGlvbnMpIHtcbiAgICByZXR1cm4gbGlzdEVsZW1lbnRzQ29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgdHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJhdyBlbGVtZW50cyBhcnJheSBmb3IgYSBnaXZlbiB0eXBlLlxuICAgKiBVbmxpa2UgbGlzdEVsZW1lbnRzIHdoaWNoIHJldHVybnMgTUNQUmVzcG9uc2UgZm9ybWF0LCB0aGlzIHJldHVybnMgcmF3IGVsZW1lbnQgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBFbGVtZW50IHR5cGUgKHBlcnNvbmEsIHNraWxsLCB0ZW1wbGF0ZSwgYWdlbnQsIG1lbW9yeSwgZW5zZW1ibGUpXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHJhdyBlbGVtZW50IG9iamVjdHNcbiAgICovXG4gIGFzeW5jIGdldEVsZW1lbnRzKHR5cGU6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bltdPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcblxuICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlTWFuYWdlci5saXN0KCk7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICByZXR1cm4gdGhpcy5hZ2VudE1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5NRU1PUlk6XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeU1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhY3RpdmF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgZm9yIGVsZW1lbnQgYWN0aXZhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9BQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRDUlVESGFuZGxlci5hY3RpdmF0ZUVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRWxlbWVudCBhY3RpdmF0aW9uIHJlcXVlc3RlZDogJHt0eXBlfS8ke25hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHR5cGUsIGVsZW1lbnROYW1lOiBuYW1lLCBjb250ZXh0UHJvdmlkZWQ6ICEhY29udGV4dCB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KG5vcm1hbGl6ZWRUeXBlKTtcblxuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LmFjdGl2YXRlKG5hbWUsIGNvbnRleHQpO1xuXG4gICAgICAvLyBJc3N1ZSAjNTk4OiBQZXJzaXN0IGFjdGl2YXRpb24gc3RhdGUgZm9yIHNlc3Npb24gcmVzdG9yZVxuICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvblN0b3JlKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gbm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLlBFUlNPTkFcbiAgICAgICAgICA/IHRoaXMucGVyc29uYU1hbmFnZXIuZmluZFBlcnNvbmEobmFtZSk/LmZpbGVuYW1lXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYWN0aXZhdGlvblN0b3JlLnJlY29yZEFjdGl2YXRpb24obm9ybWFsaXplZFR5cGUsIG5hbWUsIGZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzc2MjogRXhwb3J0IHBvbGljaWVzIHRvIGJyaWRnZSBhZnRlciBhY3RpdmF0aW9uXG4gICAgICB0aGlzLnBvbGljeUV4cG9ydFNlcnZpY2U/LmV4cG9ydFBvbGljaWVzKCkuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBhY3RpdmF0ZSBlbGVtZW50OmAsIHsgdHlwZSwgbmFtZSwgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHModHlwZT86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBJc3N1ZSAjNTAxOiBXaGVuIHR5cGUgaXMgb21pdHRlZCwgYWdncmVnYXRlIGFjdGl2ZSBlbGVtZW50cyBhY3Jvc3MgYWxsIHR5cGVzXG4gICAgICBpZiAoIXR5cGUgfHwgdHlwZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFnZ3JlZ2F0ZUFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVnaWVzLmdldChub3JtYWxpemVkVHlwZSk7XG5cbiAgICAgIGlmICghc3RyYXRlZ3kpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgc3RyYXRlZ3kuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSBlbGVtZW50czpgLCB7IHR5cGUsIGVycm9yIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBnZXQgYWN0aXZlICR7dHlwZSB8fCAnYWxsJ306ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJhdyBhY3RpdmUgZWxlbWVudHMgZm9yIEdhdGVrZWVwZXIgcG9saWN5IGV2YWx1YXRpb24uXG4gICAqIFJldHVybnMgYWN0aXZlIHBlcnNvbmFzLCBza2lsbHMsIGFuZCBlbnNlbWJsZXMgd2l0aCB0aGVpciBtZXRhZGF0YVxuICAgKiBtYXBwZWQgdG8gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IHRoZSBHYXRla2VlcGVyJ3MgQWN0aXZlRWxlbWVudCBpbnRlcmZhY2UuXG4gICAqXG4gICAqIElzc3VlICM0NTI6IFByb3ZpZGVzIGFjdGl2ZSBlbGVtZW50IGNvbnRleHQgZm9yIGVuZm9yY2UoKSBwb2xpY3kgY2hlY2tzLlxuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHNGb3JQb2xpY3koKTogUHJvbWlzZTxBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PiA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBBY3RpdmUgcGVyc29uYXMgKHN5bmMpXG4gICAgICBjb25zdCBwZXJzb25hcyA9IHRoaXMucGVyc29uYU1hbmFnZXIuZ2V0QWN0aXZlUGVyc29uYXMoKTtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBwZXJzb25hcykge1xuICAgICAgICBjb25zdCBrZXkgPSBgcGVyc29uYToke3AubWV0YWRhdGEubmFtZX1gO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3BlcnNvbmEnLFxuICAgICAgICAgIG5hbWU6IHAubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogcC5tZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgYWN0aXZlIHBlcnNvbmFzIGZvciBwb2xpY3kgZXZhbHVhdGlvbicsIHsgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFjdGl2ZSBza2lsbHMgKGFzeW5jKVxuICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuZ2V0QWN0aXZlU2tpbGxzKCk7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2tpbGxzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGBza2lsbDoke3MubWV0YWRhdGEubmFtZX1gO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3NraWxsJyxcbiAgICAgICAgICBuYW1lOiBzLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHMubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBza2lsbHMgZm9yIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0aXZlIGFnZW50cyAoYXN5bmMpXG4gICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5nZXRBY3RpdmVBZ2VudHMoKTtcbiAgICAgIGZvciAoY29uc3QgYWdlbnQgb2YgYWdlbnRzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGBhZ2VudDoke2FnZW50Lm1ldGFkYXRhLm5hbWV9YDtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdhZ2VudCcsXG4gICAgICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogYWdlbnQubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBhZ2VudHMgZm9yIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0aXZlIGVuc2VtYmxlcyAoYXN5bmMpXG4gICAgICBjb25zdCBlbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmVuc2VtYmxlTWFuYWdlci5nZXRBY3RpdmVFbnNlbWJsZXMoKTtcbiAgICAgIGZvciAoY29uc3QgZSBvZiBlbnNlbWJsZXMpIHtcbiAgICAgICAgY29uc3QgZW5zZW1ibGVLZXkgPSBgZW5zZW1ibGU6JHtlLm1ldGFkYXRhLm5hbWV9YDtcbiAgICAgICAgc2Vlbi5hZGQoZW5zZW1ibGVLZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2Vuc2VtYmxlJyxcbiAgICAgICAgICBuYW1lOiBlLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IGUubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSA0OiBSZXNvbHZlIGVuc2VtYmxlIG1lbWJlciBnYXRla2VlcGVyIHBvbGljaWVzXG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSAoZS5tZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uZWxlbWVudHMgYXNcbiAgICAgICAgICBBcnJheTx7IGVsZW1lbnRfbmFtZTogc3RyaW5nOyBlbGVtZW50X3R5cGU6IHN0cmluZyB9PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWVtYmVycykpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBtZW1iZXJLZXkgPSBgJHttZW1iZXIuZWxlbWVudF90eXBlfToke21lbWJlci5lbGVtZW50X25hbWV9YDtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhtZW1iZXJLZXkpKSBjb250aW51ZTsgLy8gQWxyZWFkeSBhY3RpdmUgaW5kaXZpZHVhbGx5XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBtZW1iZXJFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudHMobWVtYmVyLmVsZW1lbnRfdHlwZSk7XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gKG1lbWJlckVsZW1lbnRzIGFzIEFycmF5PHsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KS5maW5kKFxuICAgICAgICAgICAgICAgIGVsID0+IChlbD8ubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5uYW1lID09PSBtZW1iZXIuZWxlbWVudF9uYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChmb3VuZD8ubWV0YWRhdGEgJiYgKGZvdW5kLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uZ2F0ZWtlZXBlcikge1xuICAgICAgICAgICAgICAgIHNlZW4uYWRkKG1lbWJlcktleSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogbWVtYmVyLmVsZW1lbnRfdHlwZSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IG1lbWJlci5lbGVtZW50X25hbWUsXG4gICAgICAgICAgICAgICAgICBtZXRhZGF0YTogZm91bmQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAvLyBOb24tZmF0YWw6IHNraXAgbWVtYmVyIGlmIGVsZW1lbnQgdHlwZSBsb29rdXAgZmFpbHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgYWN0aXZlIGVuc2VtYmxlcyBmb3IgcG9saWN5IGV2YWx1YXRpb24nLCB7IGVycm9yIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBnZXRQb2xpY3lFbGVtZW50c0ZvclJlcG9ydChzZXNzaW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBzZXNzaW9uSWRzPzogc3RyaW5nW107XG4gIH0+PiB7XG4gICAgY29uc3QgbWVyZ2VkID0gbmV3IE1hcDxzdHJpbmcsIHtcbiAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHNlc3Npb25JZHM6IFNldDxzdHJpbmc+O1xuICAgIH0+KCk7XG5cbiAgICBjb25zdCBhZGRFbGVtZW50ID0gKFxuICAgICAgZWxlbWVudDogeyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0sXG4gICAgICBzZXNzaW9uSWRzOiBzdHJpbmdbXSA9IFtdLFxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF0aGlzLmhhc0dhdGVrZWVwZXJQb2xpY3koZWxlbWVudC5tZXRhZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSBgJHtlbGVtZW50LnR5cGV9OiR7ZWxlbWVudC5uYW1lfWA7XG4gICAgICBjb25zdCBleGlzdGluZyA9IG1lcmdlZC5nZXQoa2V5KTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICBzZXNzaW9uSWRzLmZvckVhY2goaWQgPT4gZXhpc3Rpbmcuc2Vzc2lvbklkcy5hZGQoaWQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBtZXJnZWQuc2V0KGtleSwge1xuICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgbWV0YWRhdGE6IGVsZW1lbnQubWV0YWRhdGEsXG4gICAgICAgIHNlc3Npb25JZHM6IG5ldyBTZXQoc2Vzc2lvbklkcyksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgY3VycmVudFNlc3Npb25JZCA9IHRoaXMuYWN0aXZhdGlvblN0b3JlPy5nZXRTZXNzaW9uSWQoKTtcbiAgICBjb25zdCBpbmNsdWRlQ3VycmVudFNlc3Npb24gPSAhc2Vzc2lvbklkIHx8ICFjdXJyZW50U2Vzc2lvbklkIHx8IGN1cnJlbnRTZXNzaW9uSWQgPT09IHNlc3Npb25JZDtcblxuICAgIGlmIChpbmNsdWRlQ3VycmVudFNlc3Npb24pIHtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlRWxlbWVudCBvZiBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5KCkpIHtcbiAgICAgICAgYWRkRWxlbWVudChhY3RpdmVFbGVtZW50LCBjdXJyZW50U2Vzc2lvbklkID8gW2N1cnJlbnRTZXNzaW9uSWRdIDogW10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2YXRpb25TdG9yZT8uaXNFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IHBlcnNpc3RlZFN0YXRlcyA9IGF3YWl0IHRoaXMuYWN0aXZhdGlvblN0b3JlLmxpc3RQZXJzaXN0ZWRBY3RpdmF0aW9uU3RhdGVzKHNlc3Npb25JZCk7XG4gICAgICBjb25zdCBjYXRhbG9ncyA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTx7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGZpbGVuYW1lPzogc3RyaW5nIH0+PigpO1xuXG4gICAgICBjb25zdCBnZXRDYXRhbG9nID0gYXN5bmMgKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICAgIGlmICghY2F0YWxvZ3MuaGFzKG5vcm1hbGl6ZWRUeXBlKSkge1xuICAgICAgICAgIGNhdGFsb2dzLnNldChcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuZ2V0RWxlbWVudHMobm9ybWFsaXplZFR5cGUpKSBhcyBBcnJheTx7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGZpbGVuYW1lPzogc3RyaW5nIH0+LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhdGFsb2dzLmdldChub3JtYWxpemVkVHlwZSkgPz8gW107XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5kUGVyc2lzdGVkRWxlbWVudCA9IGFzeW5jIChcbiAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICBhY3RpdmF0aW9uOiBQZXJzaXN0ZWRBY3RpdmF0aW9uLFxuICAgICAgKTogUHJvbWlzZTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB8IG51bGw+ID0+IHtcbiAgICAgICAgY29uc3QgY2F0YWxvZyA9IGF3YWl0IGdldENhdGFsb2codHlwZSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShhY3RpdmF0aW9uLm5hbWUpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkRmlsZW5hbWUgPSB0aGlzLm5vcm1hbGl6ZUxvb2t1cFZhbHVlKGFjdGl2YXRpb24uZmlsZW5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGZvdW5kID0gY2F0YWxvZy5maW5kKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBlbGVtZW50Lm1ldGFkYXRhID8/IHt9O1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShtZXRhZGF0YVsnbmFtZSddKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50RmlsZW5hbWUgPSB0aGlzLm5vcm1hbGl6ZUxvb2t1cFZhbHVlKFxuICAgICAgICAgICAgZWxlbWVudC5maWxlbmFtZSA/PyBtZXRhZGF0YVsnZmlsZW5hbWUnXSA/PyBtZXRhZGF0YVsnc291cmNlRmlsZSddLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gZWxlbWVudE5hbWUgPT09IG5vcm1hbGl6ZWROYW1lIHx8IChub3JtYWxpemVkRmlsZW5hbWUgIT09ICcnICYmIGVsZW1lbnRGaWxlbmFtZSA9PT0gbm9ybWFsaXplZEZpbGVuYW1lKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFmb3VuZD8ubWV0YWRhdGEgfHwgIXRoaXMuaGFzR2F0ZWtlZXBlclBvbGljeShmb3VuZC5tZXRhZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdGhpcy50b1BvbGljeUVsZW1lbnRUeXBlKHR5cGUpLFxuICAgICAgICAgIG5hbWU6IChmb3VuZC5tZXRhZGF0YVsnbmFtZSddIGFzIHN0cmluZykgPz8gYWN0aXZhdGlvbi5uYW1lLFxuICAgICAgICAgIG1ldGFkYXRhOiBmb3VuZC5tZXRhZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgcGVyc2lzdGVkU3RhdGVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWVyZ2VQZXJzaXN0ZWRQb2xpY3lTdGF0ZShzdGF0ZSwgYWRkRWxlbWVudCwgZmluZFBlcnNpc3RlZEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZC52YWx1ZXMoKSkubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIHR5cGU6IGVudHJ5LnR5cGUsXG4gICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgbWV0YWRhdGE6IGVudHJ5Lm1ldGFkYXRhLFxuICAgICAgLi4uKGVudHJ5LnNlc3Npb25JZHMuc2l6ZSA+IDBcbiAgICAgICAgPyB7IHNlc3Npb25JZHM6IEFycmF5LmZyb20oZW50cnkuc2Vzc2lvbklkcykuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSB9XG4gICAgICAgIDoge30pLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VQZXJzaXN0ZWRQb2xpY3lTdGF0ZShcbiAgICBzdGF0ZTogUGVyc2lzdGVkQWN0aXZhdGlvblN0YXRlU25hcHNob3QsXG4gICAgYWRkRWxlbWVudDogKGVsZW1lbnQ6IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LCBzZXNzaW9uSWRzPzogc3RyaW5nW10pID0+IHZvaWQsXG4gICAgZmluZFBlcnNpc3RlZEVsZW1lbnQ6ICh0eXBlOiBzdHJpbmcsIGFjdGl2YXRpb246IFBlcnNpc3RlZEFjdGl2YXRpb24pID0+IFByb21pc2U8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCBudWxsPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZzogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBhY3RpdmF0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGUuYWN0aXZhdGlvbnMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2YXRpb24gb2YgYWN0aXZhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgcGVuZGluZy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kUGVyc2lzdGVkRWxlbWVudCh0eXBlLCBhY3RpdmF0aW9uKTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZm91bmQsIFtzdGF0ZS5zZXNzaW9uSWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwZW5kaW5nKTtcbiAgfVxuXG4gIGFzeW5jIGRlYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVBQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRDUlVESGFuZGxlci5kZWFjdGl2YXRlRWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBFbGVtZW50IGRlYWN0aXZhdGlvbiByZXF1ZXN0ZWQ6ICR7dHlwZX0vJHtuYW1lfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGVsZW1lbnRUeXBlOiB0eXBlLCBlbGVtZW50TmFtZTogbmFtZSB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KG5vcm1hbGl6ZWRUeXBlKTtcblxuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LmRlYWN0aXZhdGUobmFtZSk7XG5cbiAgICAgIC8vIElzc3VlICM1OTg6IFBlcnNpc3QgZGVhY3RpdmF0aW9uIHN0YXRlIGZvciBzZXNzaW9uIHJlc3RvcmVcbiAgICAgIGlmICh0aGlzLmFjdGl2YXRpb25TdG9yZSkge1xuICAgICAgICB0aGlzLmFjdGl2YXRpb25TdG9yZS5yZWNvcmREZWFjdGl2YXRpb24obm9ybWFsaXplZFR5cGUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNzYyOiBFeHBvcnQgcG9saWNpZXMgdG8gYnJpZGdlIGFmdGVyIGRlYWN0aXZhdGlvblxuICAgICAgdGhpcy5wb2xpY3lFeHBvcnRTZXJ2aWNlPy5leHBvcnRQb2xpY2llcygpLmNhdGNoKCgpID0+IHt9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgdG8gcHJvcGFnYXRlIHRvIE1DUC1BUUwgbGF5ZXJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBvcGVyYXRpb25zIHJldHVybiBzdWNjZXNzPWZhbHNlIGluc3RlYWQgb2Ygc3VjY2Vzcz10cnVlIHdpdGggZXJyb3IgdGV4dFxuICAgICAgLy8gSXNzdWUgIzI3NTogSGFuZGxlcnMgcmV0dXJuIHN1Y2Nlc3M9dHJ1ZSBmb3IgbWlzc2luZyBlbGVtZW50c1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIEFsc28gcmUtdGhyb3cgdmFsaWRhdGlvbiBlcnJvcnMgKGUuZy4sIG1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycylcbiAgICAgIC8vIHNvIHRoZXkgcmVzdWx0IGluIHN1Y2Nlc3M9ZmFsc2UgaW5zdGVhZCBvZiBzdWNjZXNzPXRydWUgd2l0aCBlcnJvciBjb250ZW50XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVhY3RpdmF0ZSBlbGVtZW50OmAsIHsgdHlwZSwgbmFtZSwgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGRlYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcwODogR2V0IHRoZSBlbGVtZW50IG1hbmFnZXIgZm9yIGEgbm9ybWFsaXplZCB0eXBlLlxuICAgKiBVc2VkIHRvIGNoZWNrIGludmFsaWQgZWxlbWVudCByZWNvcmRzIHdoZW4gYW4gZWxlbWVudCBpcyBcIm5vdCBmb3VuZFwiLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VyRm9yVHlwZShub3JtYWxpemVkVHlwZTogc3RyaW5nKTogQmFzZUVsZW1lbnRNYW5hZ2VyPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTogcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIgYXMgdW5rbm93biBhcyBCYXNlRWxlbWVudE1hbmFnZXI8YW55PjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6IHJldHVybiB0aGlzLnNraWxsTWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHJldHVybiB0aGlzLnRlbXBsYXRlTWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHJldHVybiB0aGlzLmFnZW50TWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuTUVNT1JZOiByZXR1cm4gdGhpcy5tZW1vcnlNYW5hZ2VyO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRTogcmV0dXJuIHRoaXMuZW5zZW1ibGVNYW5hZ2VyO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRFbGVtZW50RGV0YWlscyhuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBjb25zdCBzdHJhdGVneSA9IHRoaXMuc3RyYXRlZ2llcy5nZXQobm9ybWFsaXplZFR5cGUpO1xuXG4gICAgICBpZiAoIXN0cmF0ZWd5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHN0cmF0ZWd5LmdldEVsZW1lbnREZXRhaWxzKG5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJc3N1ZSAjNzA4OiBXaGVuIGVsZW1lbnQgaXMgXCJub3QgZm91bmRcIiwgY2hlY2sgaWYgaXQgYWN0dWFsbHkgZXhpc3RzXG4gICAgICAvLyBvbiBkaXNrIGJ1dCBmYWlsZWQgdmFsaWRhdGlvbi4gUmV0dXJuIGEgZGlzdGluY3QgZXJyb3IgaW4gdGhhdCBjYXNlLlxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRNYW5hZ2VyRm9yVHlwZShub3JtYWxpemVkVHlwZSk7XG4gICAgICAgIGlmIChtYW5hZ2VyICYmIHR5cGVvZiBtYW5hZ2VyLmdldEludmFsaWRFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgaW52YWxpZFJlY29yZCA9IG1hbmFnZXIuZ2V0SW52YWxpZEVsZW1lbnQobmFtZSk7XG4gICAgICAgICAgaWYgKGludmFsaWRSZWNvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRWYWxpZGF0aW9uRmFpbGVkRXJyb3IoXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRUeXBlIGFzIEVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBpbnZhbGlkUmVjb3JkLnJlYXNvbixcbiAgICAgICAgICAgICAgaW52YWxpZFJlY29yZC5maWxlUGF0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCBlbGVtZW50IGRldGFpbHM6YCwgeyB0eXBlLCBuYW1lLCBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0ICR7dHlwZX0gZGV0YWlscyBmb3IgJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZCBlbGVtZW50cyBvZiBhIHNwZWNpZmljIHR5cGUgZnJvbSB0aGUgZmlsZXN5c3RlbVxuICAgKiBFeHRyYWN0ZWQgZnJvbSBpbmRleC50czo2MDktNjc5IChleGFjdCBjb3B5LCBhZGFwdGVkIGZvciBoYW5kbGVyIHBhdHRlcm4pXG4gICAqL1xuICBhc3luYyByZWxvYWRFbGVtZW50cyh0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIHRvIGhhbmRsZSBib3RoIHBsdXJhbCBhbmQgc2luZ3VsYXIgZm9ybXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcblxuICAgICAgc3dpdGNoIChub3JtYWxpemVkVHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIucmVsb2FkUGVyc29uYXMoKTtcblxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgdGhpcy5za2lsbE1hbmFnZXIuY2xlYXJDYWNoZSgpO1xuICAgICAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7c2tpbGxzLmxlbmd0aH0gc2tpbGxzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURToge1xuICAgICAgICAgIC8vIFRlbXBsYXRlIG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7dGVtcGxhdGVzLmxlbmd0aH0gdGVtcGxhdGVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIC8vIEFnZW50IG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7YWdlbnRzLmxlbmd0aH0gYWdlbnRzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5NRU1PUlk6IHtcbiAgICAgICAgICAvLyBNZW1vcnkgbWFuYWdlciBkb2Vzbid0IGhhdmUgY2xlYXJDYWNoZSwganVzdCBsaXN0XG4gICAgICAgICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLm1lbW9yeU1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHttZW1vcmllcy5sZW5ndGh9IG1lbW9yaWVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRToge1xuICAgICAgICAgIC8vIEVuc2VtYmxlIG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IGVuc2VtYmxlcyA9IGF3YWl0IHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7ZW5zZW1ibGVzLmxlbmd0aH0gZW5zZW1ibGVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byByZWxvYWQgJHt0eXBlfTpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIHJlbG9hZCAke3R5cGV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIHRlbXBsYXRlIHdpdGggdmFyaWFibGVzXG4gICAqIEV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjY4Mi03MDEgKGV4YWN0IGNvcHkpXG4gICAqXG4gICAqIEB0aHJvd3Mge0VsZW1lbnROb3RGb3VuZEVycm9yfSBXaGVuIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0XG4gICAqIEBzZWUgSXNzdWUgIzI3NSAtIEhhbmRsZXJzIHJldHVybiBzdWNjZXNzPXRydWUgZm9yIG1pc3NpbmcgZWxlbWVudHNcbiAgICovXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlKG5hbWU6IHN0cmluZywgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgLy8gVXNlIHRoZSBuZXcgVGVtcGxhdGVSZW5kZXJlciB1dGlsaXR5IGZvciBjbGVhbmVyIGNvZGUgYW5kIGJldHRlciB2YWxpZGF0aW9uXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50ZW1wbGF0ZVJlbmRlcmVyLnJlbmRlcihuYW1lLCB2YXJpYWJsZXMpO1xuXG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5jb250ZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDwn5OEIFJlbmRlcmVkIHRlbXBsYXRlICcke25hbWV9JzpcXG5cXG4ke3Jlc3VsdC5jb250ZW50fWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElzc3VlICMyNzU6IFRocm93IGVycm9yIGZvciBtaXNzaW5nIHRlbXBsYXRlcyBpbnN0ZWFkIG9mIHJldHVybmluZyBjb250ZW50XG4gICAgICBpZiAocmVzdWx0LmVycm9yPy5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdUZW1wbGF0ZScsIG5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MICR7cmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gcmVuZGVyIHRlbXBsYXRlJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFnZW50IHdpdGggZ29hbCBwYXJhbWV0ZXJzXG4gICAqIFJldHVybnMgY29udGV4dCBmb3IgTExNIHRvIGRyaXZlIHRoZSBhZ2VudGljIGxvb3BcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudChuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZXhlY3V0ZUFnZW50KG5hbWUsIHBhcmFtZXRlcnMpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBzdGVwIGluIGFnZW50IGV4ZWN1dGlvblxuICAgKi9cbiAgYXN5bmMgcmVjb3JkQWdlbnRTdGVwKGFyZ3M6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBzdGVwRGVzY3JpcHRpb246IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgZmluZGluZ3M/OiBzdHJpbmc7XG4gICAgY29uZmlkZW5jZT86IG51bWJlcjtcbiAgICBuZXh0QWN0aW9uSGludD86IHN0cmluZztcbiAgICByaXNrU2NvcmU/OiBudW1iZXI7XG4gIH0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIucmVjb3JkQWdlbnRTdGVwKGFyZ3MpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlY29yZCBhZ2VudCBzdGVwIGZvciAnJHthcmdzLmFnZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gcmVjb3JkIHN0ZXA6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGUgYW4gYWdlbnQgZ29hbFxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBZ2VudEdvYWwoYXJnczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGdvYWxJZD86IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgc3VtbWFyeTogc3RyaW5nO1xuICB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmNvbXBsZXRlQWdlbnRHb2FsKGFyZ3MpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNvbXBsZXRlIGFnZW50IGdvYWwgZm9yICcke2FyZ3MuYWdlbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBjb21wbGV0ZSBnb2FsOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZ2VudCBzdGF0ZVxuICAgKi9cbiAgYXN5bmMgZ2V0QWdlbnRTdGF0ZShhcmdzOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xuICB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmdldEFnZW50U3RhdGUoYXJncyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGFnZW50IHN0YXRlIGZvciAnJHthcmdzLmFnZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0IHN0YXRlOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRpbnVlIGFnZW50IGV4ZWN1dGlvbiBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAqL1xuICBhc3luYyBjb250aW51ZUFnZW50RXhlY3V0aW9uKGFyZ3M6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBwcmV2aW91c1N0ZXBSZXN1bHQ/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuY29udGludWVBZ2VudEV4ZWN1dGlvbihhcmdzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBSZS10aHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjb250aW51ZSBhZ2VudCBleGVjdXRpb24gZm9yICcke2FyZ3MuYWdlbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBjb250aW51ZSBleGVjdXRpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWdncmVnYXRlIGFjdGl2ZSBlbGVtZW50cyBhY3Jvc3MgYWxsIHJlZ2lzdGVyZWQgZWxlbWVudCB0eXBlcy5cbiAgICogSXNzdWUgIzUwMTogQ2FsbGVkIHdoZW4gZ2V0X2FjdGl2ZV9lbGVtZW50cyBpcyBpbnZva2VkIHdpdGhvdXQgZWxlbWVudF90eXBlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhZ2dyZWdhdGVBY3RpdmVFbGVtZW50cygpOiBQcm9taXNlPE1DUFJlc3BvbnNlPiB7XG4gICAgY29uc3Qgc2VjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgc3RyYXRlZ3ldIG9mIHRoaXMuc3RyYXRlZ2llcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyYXRlZ3kuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHJlc3VsdC5jb250ZW50WzBdPy50ZXh0O1xuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgIHNlY3Rpb25zLnB1c2goYFske2VsZW1lbnRUeXBlfV1cXG4ke3RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZhaWxlZCB0byBnZXQgYWN0aXZlICR7ZWxlbWVudFR5cGV9IGVsZW1lbnRzYCwgeyBlcnJvcjogZXJyIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgID8gc2VjdGlvbnMuam9pbignXFxuXFxuJylcbiAgICAgICAgICA6ICdObyBhY3RpdmUgZWxlbWVudHMgZm91bmQuJ1xuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbn1cbiJdfQ==
863
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudENSVURIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL0VsZW1lbnRDUlVESGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFvQixNQUFNLGtDQUFrQyxDQUFDO0FBT2pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxJQUFJLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEYsT0FBTyxFQUFFLGFBQWEsSUFBSSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxXQUFXLElBQUksa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsY0FBYyxJQUFJLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxlQUFlLElBQUksc0JBQXNCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUs5RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHeEUsT0FBTyxFQUNMLDBCQUEwQixFQUMxQix1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4Qix5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzNCLE1BQU0sdUJBQXVCLENBQUM7QUFPL0Is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cEcsQ0FBQzthQUNILENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLEtBQUssQ0FBQyx1QkFBdUI7UUFDbkMsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBRTlCLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2xELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO2dCQUNyQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLFdBQVcsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUM7b0JBQ1IsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3dCQUN2QixDQUFDLENBQUMsMkJBQTJCO2lCQUNoQyxDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWxlbWVudENSVURIYW5kbGVyIC0gSGFuZGxlcyBhbGwgZ2VuZXJpYyBlbGVtZW50IENSVUQgb3BlcmF0aW9uc1xuICpcbiAqIFByb3ZpZGVzIGNyZWF0ZSwgZWRpdCwgdmFsaWRhdGUsIGFuZCBkZWxldGUgb3BlcmF0aW9ucyBmb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAqIChwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cywgbWVtb3JpZXMpLlxuICpcbiAqIFVzZXMgZGVwZW5kZW5jeSBpbmplY3Rpb24gZm9yIGFsbCBzZXJ2aWNlczpcbiAqIC0gSW5pdGlhbGl6YXRpb25TZXJ2aWNlIGZvciBzZXR1cCB0YXNrc1xuICogLSBQZXJzb25hSW5kaWNhdG9yU2VydmljZSBmb3IgcGVyc29uYSBpbmRpY2F0b3IgZm9ybWF0dGluZ1xuICogLSBFbGVtZW50IG1hbmFnZXJzIChTa2lsbE1hbmFnZXIsIFRlbXBsYXRlTWFuYWdlciwgQWdlbnRNYW5hZ2VyLCBNZW1vcnlNYW5hZ2VyKVxuICogLSBQZXJzb25hTWFuYWdlciBmb3IgcGVyc29uYSBvcGVyYXRpb25zXG4gKiAtIFBvcnRmb2xpb01hbmFnZXIgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zXG4gKlxuICogRklYOiBETUNQLVNFQy0wMDYgLSBTZWN1cml0eSBhdWRpdCBzdXBwcmVzc2lvblxuICogVGhpcyBoYW5kbGVyIGRlbGVnYXRlcyBhbGwgb3BlcmF0aW9ucyB0byBzcGVjaWFsaXplZCBlbGVtZW50IG1hbmFnZXJzLlxuICogQXVkaXQgbG9nZ2luZyBoYXBwZW5zIGluIHRoZSBlbGVtZW50IG1hbmFnZXJzIHRoZW1zZWx2ZXMuXG4gKiBAc2VjdXJpdHktYXVkaXQtc3VwcHJlc3MgRE1DUC1TRUMtMDA2XG4gKi9cblxuaW1wb3J0IHsgRWxlbWVudFR5cGUsIFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTa2lsbE1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9za2lsbHMvaW5kZXguanMnO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvdGVtcGxhdGVzL1RlbXBsYXRlTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZVJlbmRlcmVyIH0gZnJvbSAnLi4vdXRpbHMvVGVtcGxhdGVSZW5kZXJlci5qcyc7XG5pbXBvcnQgeyBBZ2VudE1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9hZ2VudHMvQWdlbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEVuc2VtYmxlTWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnROb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgYXMgY3JlYXRlRWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9jcmVhdGVFbGVtZW50LmpzJztcbmltcG9ydCB7IGRlbGV0ZUVsZW1lbnQgYXMgZGVsZXRlRWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9kZWxldGVFbGVtZW50LmpzJztcbmltcG9ydCB7IGVkaXRFbGVtZW50IGFzIGVkaXRFbGVtZW50Q29tbWFuZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL2VkaXRFbGVtZW50LmpzJztcbmltcG9ydCB7IHVwZ3JhZGVFbGVtZW50IGFzIHVwZ3JhZGVFbGVtZW50Q29tbWFuZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL3VwZ3JhZGVFbGVtZW50LmpzJztcbmltcG9ydCB7IGxpc3RFbGVtZW50cyBhcyBsaXN0RWxlbWVudHNDb21tYW5kIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvbGlzdEVsZW1lbnRzLmpzJztcbmltcG9ydCB7IGZpbmRFbGVtZW50RmxleGlibHksIHNhbml0aXplTWV0YWRhdGEgYXMgc2FuaXRpemVNZXRhZGF0YVJlY29yZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVFbGVtZW50IGFzIHZhbGlkYXRlRWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC92YWxpZGF0ZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudENydWRDb250ZXh0IH0gZnJvbSAnLi9lbGVtZW50LWNydWQvdHlwZXMuanMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvSW5pdGlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvUGVyc29uYUluZGljYXRvclNlcnZpY2UuanMnO1xuaW1wb3J0IHsgUGVyc29uYU1hbmFnZXIgfSBmcm9tICcuLi9wZXJzb25hL1BlcnNvbmFNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBFTEVNRU5UX1RZUEVfTUFQIH0gZnJvbSAnLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSUZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRBY3RpdmF0aW9uU3RyYXRlZ3ksIE1DUFJlc3BvbnNlIH0gZnJvbSAnLi9zdHJhdGVnaWVzL2luZGV4LmpzJztcbmltcG9ydCB7XG4gIFRlbXBsYXRlQWN0aXZhdGlvblN0cmF0ZWd5LFxuICBTa2lsbEFjdGl2YXRpb25TdHJhdGVneSxcbiAgQWdlbnRBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gIE1lbW9yeUFjdGl2YXRpb25TdHJhdGVneSxcbiAgUGVyc29uYUFjdGl2YXRpb25TdHJhdGVneSxcbiAgRW5zZW1ibGVBY3RpdmF0aW9uU3RyYXRlZ3lcbn0gZnJvbSAnLi9zdHJhdGVnaWVzL2luZGV4LmpzJztcbmltcG9ydCB7IEVsZW1lbnRRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWVyeS9FbGVtZW50UXVlcnlTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB0eXBlIHsgQWN0aXZhdGlvblN0b3JlLCBQZXJzaXN0ZWRBY3RpdmF0aW9uLCBQZXJzaXN0ZWRBY3RpdmF0aW9uU3RhdGVTbmFwc2hvdCB9IGZyb20gJy4uL3NlcnZpY2VzL0FjdGl2YXRpb25TdG9yZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhY2t1cFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJztcbmltcG9ydCB0eXBlIHsgUG9saWN5RXhwb3J0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL1BvbGljeUV4cG9ydFNlcnZpY2UuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBmb3JtYXRWYWxpZGF0aW9uRmFpbGVkRXJyb3IgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9yZXNwb25zZUZvcm1hdHRlci5qcyc7XG5pbXBvcnQgeyBnZXRHYXRla2VlcGVyRGlhZ25vc3RpY3MgfSBmcm9tICcuL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLmpzJztcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRDUlVESGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RyYXRlZ2llczogTWFwPHN0cmluZywgRWxlbWVudEFjdGl2YXRpb25TdHJhdGVneT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBza2lsbE1hbmFnZXI6IFNraWxsTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlTWFuYWdlcjogVGVtcGxhdGVNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVSZW5kZXJlcjogVGVtcGxhdGVSZW5kZXJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFnZW50TWFuYWdlcjogQWdlbnRNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVtb3J5TWFuYWdlcjogTWVtb3J5TWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVuc2VtYmxlTWFuYWdlcjogRW5zZW1ibGVNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGVyc29uYU1hbmFnZXI6IFBlcnNvbmFNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluaXRTZXJ2aWNlOiBJbml0aWFsaXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JTZXJ2aWNlOiBQZXJzb25hSW5kaWNhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZpbGVPcGVyYXRpb25zOiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFF1ZXJ5U2VydmljZTogRWxlbWVudFF1ZXJ5U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGlvblN0b3JlPzogQWN0aXZhdGlvblN0b3JlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYmFja3VwU2VydmljZT86IEJhY2t1cFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb2xpY3lFeHBvcnRTZXJ2aWNlPzogUG9saWN5RXhwb3J0U2VydmljZVxuICApIHtcbiAgICAvLyBJbml0aWFsaXplIHN0cmF0ZWd5IG1hcCB3aXRoIGFsbCBlbGVtZW50IHR5cGUgc3RyYXRlZ2llc1xuICAgIHRoaXMuc3RyYXRlZ2llcyA9IG5ldyBNYXA8c3RyaW5nLCBFbGVtZW50QWN0aXZhdGlvblN0cmF0ZWd5PihbXG4gICAgICBbRWxlbWVudFR5cGUuUEVSU09OQSwgbmV3IFBlcnNvbmFBY3RpdmF0aW9uU3RyYXRlZ3kocGVyc29uYU1hbmFnZXIsIGluZGljYXRvclNlcnZpY2UpXSxcbiAgICAgIFtFbGVtZW50VHlwZS5TS0lMTCwgbmV3IFNraWxsQWN0aXZhdGlvblN0cmF0ZWd5KHNraWxsTWFuYWdlcildLFxuICAgICAgW0VsZW1lbnRUeXBlLlRFTVBMQVRFLCBuZXcgVGVtcGxhdGVBY3RpdmF0aW9uU3RyYXRlZ3kodGVtcGxhdGVNYW5hZ2VyKV0sXG4gICAgICBbRWxlbWVudFR5cGUuQUdFTlQsIG5ldyBBZ2VudEFjdGl2YXRpb25TdHJhdGVneShhZ2VudE1hbmFnZXIpXSxcbiAgICAgIFtFbGVtZW50VHlwZS5NRU1PUlksIG5ldyBNZW1vcnlBY3RpdmF0aW9uU3RyYXRlZ3kobWVtb3J5TWFuYWdlcildLFxuICAgICAgW0VsZW1lbnRUeXBlLkVOU0VNQkxFLCBuZXcgRW5zZW1ibGVBY3RpdmF0aW9uU3RyYXRlZ3koXG4gICAgICAgIGVuc2VtYmxlTWFuYWdlcixcbiAgICAgICAgcG9ydGZvbGlvTWFuYWdlcixcbiAgICAgICAgc2tpbGxNYW5hZ2VyLFxuICAgICAgICB0ZW1wbGF0ZU1hbmFnZXIsXG4gICAgICAgIGFnZW50TWFuYWdlcixcbiAgICAgICAgbWVtb3J5TWFuYWdlcixcbiAgICAgICAgcGVyc29uYU1hbmFnZXJcbiAgICAgICldXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdFNlcnZpY2UuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVyc29uYUluZGljYXRvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluZGljYXRvclNlcnZpY2UuZ2V0UGVyc29uYUluZGljYXRvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250ZXh0KCk6IEVsZW1lbnRDcnVkQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuc3VyZUluaXRpYWxpemVkOiAoKSA9PiB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCksXG4gICAgICBnZXRQZXJzb25hSW5kaWNhdG9yOiAoKSA9PiB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSxcbiAgICAgIHNraWxsTWFuYWdlcjogdGhpcy5za2lsbE1hbmFnZXIsXG4gICAgICB0ZW1wbGF0ZU1hbmFnZXI6IHRoaXMudGVtcGxhdGVNYW5hZ2VyLFxuICAgICAgdGVtcGxhdGVSZW5kZXJlcjogdGhpcy50ZW1wbGF0ZVJlbmRlcmVyLFxuICAgICAgYWdlbnRNYW5hZ2VyOiB0aGlzLmFnZW50TWFuYWdlcixcbiAgICAgIG1lbW9yeU1hbmFnZXI6IHRoaXMubWVtb3J5TWFuYWdlcixcbiAgICAgIGVuc2VtYmxlTWFuYWdlcjogdGhpcy5lbnNlbWJsZU1hbmFnZXIsXG4gICAgICBwb3J0Zm9saW9NYW5hZ2VyOiB0aGlzLnBvcnRmb2xpb01hbmFnZXIsXG4gICAgICBwZXJzb25hTWFuYWdlcjogdGhpcy5wZXJzb25hTWFuYWdlcixcbiAgICAgIGZpbGVPcGVyYXRpb25zOiB0aGlzLmZpbGVPcGVyYXRpb25zLFxuICAgICAgZWxlbWVudFF1ZXJ5U2VydmljZTogdGhpcy5lbGVtZW50UXVlcnlTZXJ2aWNlLFxuICAgICAgdmFsaWRhdGlvblJlZ2lzdHJ5OiB0aGlzLnZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICAgIGJhY2t1cFNlcnZpY2U6IHRoaXMuYmFja3VwU2VydmljZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBieSBuYW1lLCBzdXBwb3J0aW5nIGJvdGggZXhhY3QgZGlzcGxheSBuYW1lIGFuZCBmaWxlbmFtZSAoc2x1ZykgbWF0Y2hpbmdcbiAgICogSGVscGVyIG1ldGhvZCBleHRyYWN0ZWQgZnJvbSBpbmRleC50czozNDYtMzc5XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRFbGVtZW50RmxleGlibHkobmFtZTogc3RyaW5nLCBlbGVtZW50TGlzdDogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBmaW5kRWxlbWVudEZsZXhpYmx5KG5hbWUsIGVsZW1lbnRMaXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBtZXRhZGF0YSBvYmplY3QgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAqIEhlbHBlciBtZXRob2QgZXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MzkwLTQxMFxuICAgKi9cbiAgcHJpdmF0ZSBzYW5pdGl6ZU1ldGFkYXRhKG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHNhbml0aXplTWV0YWRhdGFSZWNvcmQobWV0YWRhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMb29rdXBWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgID8gdmFsdWUubm9ybWFsaXplKCdORkMnKS50cmltKClcbiAgICAgIDogJyc7XG4gIH1cblxuICBwcml2YXRlIGhhc0dhdGVrZWVwZXJQb2xpY3kobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4obWV0YWRhdGE/LlsnZ2F0ZWtlZXBlciddIHx8IGdldEdhdGVrZWVwZXJEaWFnbm9zdGljcyhtZXRhZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1BvbGljeUVsZW1lbnRUeXBlKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUxvb2t1cFZhbHVlKHR5cGUpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoIChub3JtYWxpemVkVHlwZSkge1xuICAgICAgY2FzZSAncGVyc29uYXMnOlxuICAgICAgICByZXR1cm4gJ3BlcnNvbmEnO1xuICAgICAgY2FzZSAnc2tpbGxzJzpcbiAgICAgICAgcmV0dXJuICdza2lsbCc7XG4gICAgICBjYXNlICdhZ2VudHMnOlxuICAgICAgICByZXR1cm4gJ2FnZW50JztcbiAgICAgIGNhc2UgJ21lbW9yaWVzJzpcbiAgICAgICAgcmV0dXJuICdtZW1vcnknO1xuICAgICAgY2FzZSAnZW5zZW1ibGVzJzpcbiAgICAgICAgcmV0dXJuICdlbnNlbWJsZSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZFR5cGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbGVtZW50XG4gICAqIEV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjE0OTItMTYzMSAoMTQwIGxpbmVzIC0gZXhhY3QgY29weSlcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nOyBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pn0pIHtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgYW4gZXhpc3RpbmcgZWxlbWVudCB1c2luZyBHcmFwaFFMLWFsaWduZWQgbmVzdGVkIGlucHV0IG9iamVjdHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGF3YWl0IGhhbmRsZXIuZWRpdEVsZW1lbnQoe1xuICAgKiAgIG5hbWU6ICdteS1za2lsbCcsXG4gICAqICAgdHlwZTogJ3NraWxscycsXG4gICAqICAgaW5wdXQ6IHtcbiAgICogICAgIGRlc2NyaXB0aW9uOiAnVXBkYXRlZCcsXG4gICAqICAgICBtZXRhZGF0YTogeyB0cmlnZ2VyczogWydjb2RlJ10gfVxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqL1xuICBhc3luYyBlZGl0RWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0pIHtcbiAgICByZXR1cm4gZWRpdEVsZW1lbnRDb21tYW5kKHRoaXMuZ2V0Q29udGV4dCgpLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGdyYWRlIGVsZW1lbnQgZnJvbSB2MSBzaW5nbGUtYm9keSB0byB2MiBkdWFsLWZpZWxkIGZvcm1hdCAoaW5zdHJ1Y3Rpb25zICsgY29udGVudClcbiAgICovXG4gIGFzeW5jIHVwZ3JhZGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZHJ5X3J1bj86IGJvb2xlYW47IGluc3RydWN0aW9uc19vdmVycmlkZT86IHN0cmluZzsgY29udGVudF9vdmVycmlkZT86IHN0cmluZ30pIHtcbiAgICByZXR1cm4gdXBncmFkZUVsZW1lbnRDb21tYW5kKHRoaXMuZ2V0Q29udGV4dCgpLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBlbGVtZW50XG4gICAqIEV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjE5NDEtMjA1NCAoMTE0IGxpbmVzIC0gZXhhY3QgY29weSlcbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHN0cmljdD86IGJvb2xlYW59KSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlRWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBlbGVtZW50XG4gICAqIEV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjIwNTYtMjMxMCAoMjU1IGxpbmVzIC0gZXhhY3QgY29weSwgc3BsaXQgZm9yIHJlYWRhYmlsaXR5KVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGRlbGV0ZURhdGE/OiBib29sZWFufSkge1xuICAgIHJldHVybiBkZWxldGVFbGVtZW50Q29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgYXJncyk7XG4gIH1cblxuICBwdWJsaWMgbm9ybWFsaXplRWxlbWVudFR5cGUodHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgLy8gSXNzdWUgIzUwMTogR3VhcmQgYWdhaW5zdCBudWxsL3VuZGVmaW5lZCB0byBtYXRjaCBzaGFyZWQgdXRpbGl0eSBwYXR0ZXJuXG4gICAgaWYgKHR5cGUgPT0gbnVsbCB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycgfHwgdHlwZS50cmltKCkgPT09ICcnKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IGEgdmFsaWQgRWxlbWVudFR5cGUgdmFsdWUsIHJldHVybiBhcy1pc1xuICAgIGlmIChPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5pbmNsdWRlcyh0eXBlIGFzIEVsZW1lbnRUeXBlKSkge1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgLy8gVXNlIHNoYXJlZCBub3JtYWxpemF0aW9uIG1hcCAoSXNzdWUgIzQzMylcbiAgICBjb25zdCBub3JtYWxpemVkID0gRUxFTUVOVF9UWVBFX01BUFt0eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAobm9ybWFsaXplZCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfVxuXG4gICAgLy8gVW5rbm93biB0eXBlIC0gcmV0dXJuIGFzLWlzIGFuZCBsZXQgdmFsaWRhdGlvbiBoYW5kbGUgaXRcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RFbGVtZW50cyh0eXBlOiBzdHJpbmcsIG9wdGlvbnM/OiBpbXBvcnQoJy4uL3NlcnZpY2VzL3F1ZXJ5L3R5cGVzLmpzJykuUXVlcnlPcHRpb25zKSB7XG4gICAgcmV0dXJuIGxpc3RFbGVtZW50c0NvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIHR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByYXcgZWxlbWVudHMgYXJyYXkgZm9yIGEgZ2l2ZW4gdHlwZS5cbiAgICogVW5saWtlIGxpc3RFbGVtZW50cyB3aGljaCByZXR1cm5zIE1DUFJlc3BvbnNlIGZvcm1hdCwgdGhpcyByZXR1cm5zIHJhdyBlbGVtZW50IG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gRWxlbWVudCB0eXBlIChwZXJzb25hLCBza2lsbCwgdGVtcGxhdGUsIGFnZW50LCBtZW1vcnksIGVuc2VtYmxlKVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiByYXcgZWxlbWVudCBvYmplY3RzXG4gICAqL1xuICBhc3luYyBnZXRFbGVtZW50cyh0eXBlOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd25bXT4ge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG5cbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbmFNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6XG4gICAgICAgIHJldHVybiB0aGlzLnNraWxsTWFuYWdlci5saXN0KCk7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOlxuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZU1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDpcbiAgICAgICAgcmV0dXJuIHRoaXMuYWdlbnRNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuTUVNT1JZOlxuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnlNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuRU5TRU1CTEU6XG4gICAgICAgIHJldHVybiB0aGlzLmVuc2VtYmxlTWFuYWdlci5saXN0KCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICAvLyBGSVg6IERNQ1AtU0VDLTAwNiAtIEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBlbGVtZW50IGFjdGl2YXRpb25cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfQUNUSVZBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdFbGVtZW50Q1JVREhhbmRsZXIuYWN0aXZhdGVFbGVtZW50JyxcbiAgICAgICAgZGV0YWlsczogYEVsZW1lbnQgYWN0aXZhdGlvbiByZXF1ZXN0ZWQ6ICR7dHlwZX0vJHtuYW1lfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGVsZW1lbnRUeXBlOiB0eXBlLCBlbGVtZW50TmFtZTogbmFtZSwgY29udGV4dFByb3ZpZGVkOiAhIWNvbnRleHQgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVnaWVzLmdldChub3JtYWxpemVkVHlwZSk7XG5cbiAgICAgIGlmICghc3RyYXRlZ3kpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJhdGVneS5hY3RpdmF0ZShuYW1lLCBjb250ZXh0KTtcblxuICAgICAgLy8gSXNzdWUgIzU5ODogUGVyc2lzdCBhY3RpdmF0aW9uIHN0YXRlIGZvciBzZXNzaW9uIHJlc3RvcmVcbiAgICAgIGlmICh0aGlzLmFjdGl2YXRpb25TdG9yZSkge1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IG5vcm1hbGl6ZWRUeXBlID09PSBFbGVtZW50VHlwZS5QRVJTT05BXG4gICAgICAgICAgPyB0aGlzLnBlcnNvbmFNYW5hZ2VyLmZpbmRQZXJzb25hKG5hbWUpPy5maWxlbmFtZVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmFjdGl2YXRpb25TdG9yZS5yZWNvcmRBY3RpdmF0aW9uKG5vcm1hbGl6ZWRUeXBlLCBuYW1lLCBmaWxlbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM3NjI6IEV4cG9ydCBwb2xpY2llcyB0byBicmlkZ2UgYWZ0ZXIgYWN0aXZhdGlvblxuICAgICAgdGhpcy5wb2xpY3lFeHBvcnRTZXJ2aWNlPy5leHBvcnRQb2xpY2llcygpLmNhdGNoKCgpID0+IHt9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gYWN0aXZhdGUgZWxlbWVudDpgLCB7IHR5cGUsIG5hbWUsIGVycm9yIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEFjdGl2ZUVsZW1lbnRzKHR5cGU/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gSXNzdWUgIzUwMTogV2hlbiB0eXBlIGlzIG9taXR0ZWQsIGFnZ3JlZ2F0ZSBhY3RpdmUgZWxlbWVudHMgYWNyb3NzIGFsbCB0eXBlc1xuICAgICAgaWYgKCF0eXBlIHx8IHR5cGUudHJpbSgpID09PSAnJykge1xuICAgICAgICByZXR1cm4gdGhpcy5hZ2dyZWdhdGVBY3RpdmVFbGVtZW50cygpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBjb25zdCBzdHJhdGVneSA9IHRoaXMuc3RyYXRlZ2llcy5nZXQobm9ybWFsaXplZFR5cGUpO1xuXG4gICAgICBpZiAoIXN0cmF0ZWd5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHN0cmF0ZWd5LmdldEFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCBhY3RpdmUgZWxlbWVudHM6YCwgeyB0eXBlLCBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSAke3R5cGUgfHwgJ2FsbCd9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCByYXcgYWN0aXZlIGVsZW1lbnRzIGZvciBHYXRla2VlcGVyIHBvbGljeSBldmFsdWF0aW9uLlxuICAgKiBSZXR1cm5zIGFjdGl2ZSBwZXJzb25hcywgc2tpbGxzLCBhbmQgZW5zZW1ibGVzIHdpdGggdGhlaXIgbWV0YWRhdGFcbiAgICogbWFwcGVkIHRvIHRoZSBzaGFwZSBleHBlY3RlZCBieSB0aGUgR2F0ZWtlZXBlcidzIEFjdGl2ZUVsZW1lbnQgaW50ZXJmYWNlLlxuICAgKlxuICAgKiBJc3N1ZSAjNDUyOiBQcm92aWRlcyBhY3RpdmUgZWxlbWVudCBjb250ZXh0IGZvciBlbmZvcmNlKCkgcG9saWN5IGNoZWNrcy5cbiAgICovXG4gIGFzeW5jIGdldEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5KCk6IFByb21pc2U8QXJyYXk8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0aXZlIHBlcnNvbmFzIChzeW5jKVxuICAgICAgY29uc3QgcGVyc29uYXMgPSB0aGlzLnBlcnNvbmFNYW5hZ2VyLmdldEFjdGl2ZVBlcnNvbmFzKCk7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgcGVyc29uYXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gYHBlcnNvbmE6JHtwLm1ldGFkYXRhLm5hbWV9YDtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdwZXJzb25hJyxcbiAgICAgICAgICBuYW1lOiBwLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHAubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBwZXJzb25hcyBmb3IgcG9saWN5IGV2YWx1YXRpb24nLCB7IGVycm9yIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBBY3RpdmUgc2tpbGxzIChhc3luYylcbiAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmdldEFjdGl2ZVNraWxscygpO1xuICAgICAgZm9yIChjb25zdCBzIG9mIHNraWxscykge1xuICAgICAgICBjb25zdCBrZXkgPSBgc2tpbGw6JHtzLm1ldGFkYXRhLm5hbWV9YDtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdza2lsbCcsXG4gICAgICAgICAgbmFtZTogcy5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIG1ldGFkYXRhOiBzLm1ldGFkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGdhdGhlciBhY3RpdmUgc2tpbGxzIGZvciBwb2xpY3kgZXZhbHVhdGlvbicsIHsgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFjdGl2ZSBhZ2VudHMgKGFzeW5jKVxuICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZ2V0QWN0aXZlQWdlbnRzKCk7XG4gICAgICBmb3IgKGNvbnN0IGFnZW50IG9mIGFnZW50cykge1xuICAgICAgICBjb25zdCBrZXkgPSBgYWdlbnQ6JHthZ2VudC5tZXRhZGF0YS5uYW1lfWA7XG4gICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnYWdlbnQnLFxuICAgICAgICAgIG5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IGFnZW50Lm1ldGFkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGdhdGhlciBhY3RpdmUgYWdlbnRzIGZvciBwb2xpY3kgZXZhbHVhdGlvbicsIHsgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFjdGl2ZSBlbnNlbWJsZXMgKGFzeW5jKVxuICAgICAgY29uc3QgZW5zZW1ibGVzID0gYXdhaXQgdGhpcy5lbnNlbWJsZU1hbmFnZXIuZ2V0QWN0aXZlRW5zZW1ibGVzKCk7XG4gICAgICBmb3IgKGNvbnN0IGUgb2YgZW5zZW1ibGVzKSB7XG4gICAgICAgIGNvbnN0IGVuc2VtYmxlS2V5ID0gYGVuc2VtYmxlOiR7ZS5tZXRhZGF0YS5uYW1lfWA7XG4gICAgICAgIHNlZW4uYWRkKGVuc2VtYmxlS2V5KTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdlbnNlbWJsZScsXG4gICAgICAgICAgbmFtZTogZS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIG1ldGFkYXRhOiBlLm1ldGFkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElzc3VlICM2MjUgUGhhc2UgNDogUmVzb2x2ZSBlbnNlbWJsZSBtZW1iZXIgZ2F0ZWtlZXBlciBwb2xpY2llc1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gKGUubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LmVsZW1lbnRzIGFzXG4gICAgICAgICAgQXJyYXk8eyBlbGVtZW50X25hbWU6IHN0cmluZzsgZWxlbWVudF90eXBlOiBzdHJpbmcgfT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1lbWJlcnMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycykge1xuICAgICAgICAgICAgY29uc3QgbWVtYmVyS2V5ID0gYCR7bWVtYmVyLmVsZW1lbnRfdHlwZX06JHttZW1iZXIuZWxlbWVudF9uYW1lfWA7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMobWVtYmVyS2V5KSkgY29udGludWU7IC8vIEFscmVhZHkgYWN0aXZlIGluZGl2aWR1YWxseVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgbWVtYmVyRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRzKG1lbWJlci5lbGVtZW50X3R5cGUpO1xuICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IChtZW1iZXJFbGVtZW50cyBhcyBBcnJheTx7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PikuZmluZChcbiAgICAgICAgICAgICAgICBlbCA9PiAoZWw/Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8ubmFtZSA9PT0gbWVtYmVyLmVsZW1lbnRfbmFtZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoZm91bmQ/Lm1ldGFkYXRhICYmIChmb3VuZC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LmdhdGVrZWVwZXIpIHtcbiAgICAgICAgICAgICAgICBzZWVuLmFkZChtZW1iZXJLZXkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IG1lbWJlci5lbGVtZW50X3R5cGUsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBtZW1iZXIuZWxlbWVudF9uYW1lLFxuICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IGZvdW5kLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgLy8gTm9uLWZhdGFsOiBza2lwIG1lbWJlciBpZiBlbGVtZW50IHR5cGUgbG9va3VwIGZhaWxzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBlbnNlbWJsZXMgZm9yIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgZ2V0UG9saWN5RWxlbWVudHNGb3JSZXBvcnQoc2Vzc2lvbklkPzogc3RyaW5nKTogUHJvbWlzZTxBcnJheTx7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgc2Vzc2lvbklkcz86IHN0cmluZ1tdO1xuICB9Pj4ge1xuICAgIGNvbnN0IG1lcmdlZCA9IG5ldyBNYXA8c3RyaW5nLCB7XG4gICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBzZXNzaW9uSWRzOiBTZXQ8c3RyaW5nPjtcbiAgICB9PigpO1xuXG4gICAgY29uc3QgYWRkRWxlbWVudCA9IChcbiAgICAgIGVsZW1lbnQ6IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LFxuICAgICAgc2Vzc2lvbklkczogc3RyaW5nW10gPSBbXSxcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGlmICghdGhpcy5oYXNHYXRla2VlcGVyUG9saWN5KGVsZW1lbnQubWV0YWRhdGEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gYCR7ZWxlbWVudC50eXBlfToke2VsZW1lbnQubmFtZX1gO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBtZXJnZWQuZ2V0KGtleSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgc2Vzc2lvbklkcy5mb3JFYWNoKGlkID0+IGV4aXN0aW5nLnNlc3Npb25JZHMuYWRkKGlkKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbWVyZ2VkLnNldChrZXksIHtcbiAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgIG1ldGFkYXRhOiBlbGVtZW50Lm1ldGFkYXRhLFxuICAgICAgICBzZXNzaW9uSWRzOiBuZXcgU2V0KHNlc3Npb25JZHMpLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGN1cnJlbnRTZXNzaW9uSWQgPSB0aGlzLmFjdGl2YXRpb25TdG9yZT8uZ2V0U2Vzc2lvbklkKCk7XG4gICAgY29uc3QgaW5jbHVkZUN1cnJlbnRTZXNzaW9uID0gIXNlc3Npb25JZCB8fCAhY3VycmVudFNlc3Npb25JZCB8fCBjdXJyZW50U2Vzc2lvbklkID09PSBzZXNzaW9uSWQ7XG5cbiAgICBpZiAoaW5jbHVkZUN1cnJlbnRTZXNzaW9uKSB7XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2ZUVsZW1lbnQgb2YgYXdhaXQgdGhpcy5nZXRBY3RpdmVFbGVtZW50c0ZvclBvbGljeSgpKSB7XG4gICAgICAgIGFkZEVsZW1lbnQoYWN0aXZlRWxlbWVudCwgY3VycmVudFNlc3Npb25JZCA/IFtjdXJyZW50U2Vzc2lvbklkXSA6IFtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmF0aW9uU3RvcmU/LmlzRW5hYmxlZCgpKSB7XG4gICAgICBjb25zdCBwZXJzaXN0ZWRTdGF0ZXMgPSBhd2FpdCB0aGlzLmFjdGl2YXRpb25TdG9yZS5saXN0UGVyc2lzdGVkQWN0aXZhdGlvblN0YXRlcyhzZXNzaW9uSWQpO1xuICAgICAgY29uc3QgY2F0YWxvZ3MgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8eyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBmaWxlbmFtZT86IHN0cmluZyB9Pj4oKTtcblxuICAgICAgY29uc3QgZ2V0Q2F0YWxvZyA9IGFzeW5jICh0eXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAoIWNhdGFsb2dzLmhhcyhub3JtYWxpemVkVHlwZSkpIHtcbiAgICAgICAgICBjYXRhbG9ncy5zZXQoXG4gICAgICAgICAgICBub3JtYWxpemVkVHlwZSxcbiAgICAgICAgICAgIChhd2FpdCB0aGlzLmdldEVsZW1lbnRzKG5vcm1hbGl6ZWRUeXBlKSkgYXMgQXJyYXk8eyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBmaWxlbmFtZT86IHN0cmluZyB9PixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYXRhbG9ncy5nZXQobm9ybWFsaXplZFR5cGUpID8/IFtdO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluZFBlcnNpc3RlZEVsZW1lbnQgPSBhc3luYyAoXG4gICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgYWN0aXZhdGlvbjogUGVyc2lzdGVkQWN0aXZhdGlvbixcbiAgICAgICk6IFByb21pc2U8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCBudWxsPiA9PiB7XG4gICAgICAgIGNvbnN0IGNhdGFsb2cgPSBhd2FpdCBnZXRDYXRhbG9nKHR5cGUpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplTG9va3VwVmFsdWUoYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVuYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShhY3RpdmF0aW9uLmZpbGVuYW1lKTtcblxuICAgICAgICBjb25zdCBmb3VuZCA9IGNhdGFsb2cuZmluZCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZWxlbWVudC5tZXRhZGF0YSA/PyB7fTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50TmFtZSA9IHRoaXMubm9ybWFsaXplTG9va3VwVmFsdWUobWV0YWRhdGFbJ25hbWUnXSk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudEZpbGVuYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShcbiAgICAgICAgICAgIGVsZW1lbnQuZmlsZW5hbWUgPz8gbWV0YWRhdGFbJ2ZpbGVuYW1lJ10gPz8gbWV0YWRhdGFbJ3NvdXJjZUZpbGUnXSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lID09PSBub3JtYWxpemVkTmFtZSB8fCAobm9ybWFsaXplZEZpbGVuYW1lICE9PSAnJyAmJiBlbGVtZW50RmlsZW5hbWUgPT09IG5vcm1hbGl6ZWRGaWxlbmFtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghZm91bmQ/Lm1ldGFkYXRhIHx8ICF0aGlzLmhhc0dhdGVrZWVwZXJQb2xpY3koZm91bmQubWV0YWRhdGEpKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHRoaXMudG9Qb2xpY3lFbGVtZW50VHlwZSh0eXBlKSxcbiAgICAgICAgICBuYW1lOiAoZm91bmQubWV0YWRhdGFbJ25hbWUnXSBhcyBzdHJpbmcpID8/IGFjdGl2YXRpb24ubmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogZm91bmQubWV0YWRhdGEsXG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHBlcnNpc3RlZFN0YXRlcykge1xuICAgICAgICBhd2FpdCB0aGlzLm1lcmdlUGVyc2lzdGVkUG9saWN5U3RhdGUoc3RhdGUsIGFkZEVsZW1lbnQsIGZpbmRQZXJzaXN0ZWRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShtZXJnZWQudmFsdWVzKCkpLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICB0eXBlOiBlbnRyeS50eXBlLFxuICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgIG1ldGFkYXRhOiBlbnRyeS5tZXRhZGF0YSxcbiAgICAgIC4uLihlbnRyeS5zZXNzaW9uSWRzLnNpemUgPiAwXG4gICAgICAgID8geyBzZXNzaW9uSWRzOiBBcnJheS5mcm9tKGVudHJ5LnNlc3Npb25JZHMpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSkgfVxuICAgICAgICA6IHt9KSxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1lcmdlUGVyc2lzdGVkUG9saWN5U3RhdGUoXG4gICAgc3RhdGU6IFBlcnNpc3RlZEFjdGl2YXRpb25TdGF0ZVNuYXBzaG90LFxuICAgIGFkZEVsZW1lbnQ6IChlbGVtZW50OiB7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSwgc2Vzc2lvbklkcz86IHN0cmluZ1tdKSA9PiB2b2lkLFxuICAgIGZpbmRQZXJzaXN0ZWRFbGVtZW50OiAodHlwZTogc3RyaW5nLCBhY3RpdmF0aW9uOiBQZXJzaXN0ZWRBY3RpdmF0aW9uKSA9PiBQcm9taXNlPHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgbnVsbD4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBlbmRpbmc6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbdHlwZSwgYWN0aXZhdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKHN0YXRlLmFjdGl2YXRpb25zKSkge1xuICAgICAgZm9yIChjb25zdCBhY3RpdmF0aW9uIG9mIGFjdGl2YXRpb25zID8/IFtdKSB7XG4gICAgICAgIHBlbmRpbmcucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgZmluZFBlcnNpc3RlZEVsZW1lbnQodHlwZSwgYWN0aXZhdGlvbik7XG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICBhZGRFbGVtZW50KGZvdW5kLCBbc3RhdGUuc2Vzc2lvbklkXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocGVuZGluZyk7XG4gIH1cblxuICBhc3luYyBkZWFjdGl2YXRlRWxlbWVudChuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFQUNUSVZBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdFbGVtZW50Q1JVREhhbmRsZXIuZGVhY3RpdmF0ZUVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRWxlbWVudCBkZWFjdGl2YXRpb24gcmVxdWVzdGVkOiAke3R5cGV9LyR7bmFtZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbGVtZW50VHlwZTogdHlwZSwgZWxlbWVudE5hbWU6IG5hbWUgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVnaWVzLmdldChub3JtYWxpemVkVHlwZSk7XG5cbiAgICAgIGlmICghc3RyYXRlZ3kpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJhdGVneS5kZWFjdGl2YXRlKG5hbWUpO1xuXG4gICAgICAvLyBJc3N1ZSAjNTk4OiBQZXJzaXN0IGRlYWN0aXZhdGlvbiBzdGF0ZSBmb3Igc2Vzc2lvbiByZXN0b3JlXG4gICAgICBpZiAodGhpcy5hY3RpdmF0aW9uU3RvcmUpIHtcbiAgICAgICAgdGhpcy5hY3RpdmF0aW9uU3RvcmUucmVjb3JkRGVhY3RpdmF0aW9uKG5vcm1hbGl6ZWRUeXBlLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzc2MjogRXhwb3J0IHBvbGljaWVzIHRvIGJyaWRnZSBhZnRlciBkZWFjdGl2YXRpb25cbiAgICAgIHRoaXMucG9saWN5RXhwb3J0U2VydmljZT8uZXhwb3J0UG9saWNpZXMoKS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIHRvIHByb3BhZ2F0ZSB0byBNQ1AtQVFMIGxheWVyXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgb3BlcmF0aW9ucyByZXR1cm4gc3VjY2Vzcz1mYWxzZSBpbnN0ZWFkIG9mIHN1Y2Nlc3M9dHJ1ZSB3aXRoIGVycm9yIHRleHRcbiAgICAgIC8vIElzc3VlICMyNzU6IEhhbmRsZXJzIHJldHVybiBzdWNjZXNzPXRydWUgZm9yIG1pc3NpbmcgZWxlbWVudHNcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBBbHNvIHJlLXRocm93IHZhbGlkYXRpb24gZXJyb3JzIChlLmcuLCBtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnMpXG4gICAgICAvLyBzbyB0aGV5IHJlc3VsdCBpbiBzdWNjZXNzPWZhbHNlIGluc3RlYWQgb2Ygc3VjY2Vzcz10cnVlIHdpdGggZXJyb3IgY29udGVudFxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygncGFyYW1ldGVyIGlzIHJlcXVpcmVkJykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRlYWN0aXZhdGUgZWxlbWVudDpgLCB7IHR5cGUsIG5hbWUsIGVycm9yIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBkZWFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IEdldCB0aGUgZWxlbWVudCBtYW5hZ2VyIGZvciBhIG5vcm1hbGl6ZWQgdHlwZS5cbiAgICogVXNlZCB0byBjaGVjayBpbnZhbGlkIGVsZW1lbnQgcmVjb3JkcyB3aGVuIGFuIGVsZW1lbnQgaXMgXCJub3QgZm91bmRcIi5cbiAgICovXG4gIHByaXZhdGUgZ2V0TWFuYWdlckZvclR5cGUobm9ybWFsaXplZFR5cGU6IHN0cmluZyk6IEJhc2VFbGVtZW50TWFuYWdlcjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6IHJldHVybiB0aGlzLnBlcnNvbmFNYW5hZ2VyIGFzIHVua25vd24gYXMgQmFzZUVsZW1lbnRNYW5hZ2VyPGFueT47XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiByZXR1cm4gdGhpcy5za2lsbE1hbmFnZXI7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOiByZXR1cm4gdGhpcy50ZW1wbGF0ZU1hbmFnZXI7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOiByZXR1cm4gdGhpcy5hZ2VudE1hbmFnZXI7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLk1FTU9SWTogcmV0dXJuIHRoaXMubWVtb3J5TWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuRU5TRU1CTEU6IHJldHVybiB0aGlzLmVuc2VtYmxlTWFuYWdlcjtcbiAgICAgIGRlZmF1bHQ6IHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0RWxlbWVudERldGFpbHMobmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KG5vcm1hbGl6ZWRUeXBlKTtcblxuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBzdHJhdGVneS5nZXRFbGVtZW50RGV0YWlscyhuYW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSXNzdWUgIzcwODogV2hlbiBlbGVtZW50IGlzIFwibm90IGZvdW5kXCIsIGNoZWNrIGlmIGl0IGFjdHVhbGx5IGV4aXN0c1xuICAgICAgLy8gb24gZGlzayBidXQgZmFpbGVkIHZhbGlkYXRpb24uIFJldHVybiBhIGRpc3RpbmN0IGVycm9yIGluIHRoYXQgY2FzZS5cbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgICAgY29uc3QgbWFuYWdlciA9IHRoaXMuZ2V0TWFuYWdlckZvclR5cGUobm9ybWFsaXplZFR5cGUpO1xuICAgICAgICBpZiAobWFuYWdlciAmJiB0eXBlb2YgbWFuYWdlci5nZXRJbnZhbGlkRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IGludmFsaWRSZWNvcmQgPSBtYW5hZ2VyLmdldEludmFsaWRFbGVtZW50KG5hbWUpO1xuICAgICAgICAgIGlmIChpbnZhbGlkUmVjb3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0VmFsaWRhdGlvbkZhaWxlZEVycm9yKFxuICAgICAgICAgICAgICBub3JtYWxpemVkVHlwZSBhcyBFbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgaW52YWxpZFJlY29yZC5yZWFzb24sXG4gICAgICAgICAgICAgIGludmFsaWRSZWNvcmQuZmlsZVBhdGhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBnZXQgZWxlbWVudCBkZXRhaWxzOmAsIHsgdHlwZSwgbmFtZSwgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGdldCAke3R5cGV9IGRldGFpbHMgZm9yICcke25hbWV9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWQgZWxlbWVudHMgb2YgYSBzcGVjaWZpYyB0eXBlIGZyb20gdGhlIGZpbGVzeXN0ZW1cbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6NjA5LTY3OSAoZXhhY3QgY29weSwgYWRhcHRlZCBmb3IgaGFuZGxlciBwYXR0ZXJuKVxuICAgKi9cbiAgYXN5bmMgcmVsb2FkRWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG5cbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNvbmFNYW5hZ2VyLnJlbG9hZFBlcnNvbmFzKCk7XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDoge1xuICAgICAgICAgIHRoaXMuc2tpbGxNYW5hZ2VyLmNsZWFyQ2FjaGUoKTtcbiAgICAgICAgICBjb25zdCBza2lsbHMgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+UhCBSZWxvYWRlZCAke3NraWxscy5sZW5ndGh9IHNraWxscyBmcm9tIHBvcnRmb2xpb2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgICAvLyBUZW1wbGF0ZSBtYW5hZ2VyIGRvZXNuJ3QgaGF2ZSBjbGVhckNhY2hlLCBqdXN0IGxpc3RcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLnRlbXBsYXRlTWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+UhCBSZWxvYWRlZCAke3RlbXBsYXRlcy5sZW5ndGh9IHRlbXBsYXRlcyBmcm9tIHBvcnRmb2xpb2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHtcbiAgICAgICAgICAvLyBBZ2VudCBtYW5hZ2VyIGRvZXNuJ3QgaGF2ZSBjbGVhckNhY2hlLCBqdXN0IGxpc3RcbiAgICAgICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+UhCBSZWxvYWRlZCAke2FnZW50cy5sZW5ndGh9IGFnZW50cyBmcm9tIHBvcnRmb2xpb2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuTUVNT1JZOiB7XG4gICAgICAgICAgLy8gTWVtb3J5IG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IG1lbW9yaWVzID0gYXdhaXQgdGhpcy5tZW1vcnlNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7bWVtb3JpZXMubGVuZ3RofSBtZW1vcmllcyBmcm9tIHBvcnRmb2xpb2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuRU5TRU1CTEU6IHtcbiAgICAgICAgICAvLyBFbnNlbWJsZSBtYW5hZ2VyIGRvZXNuJ3QgaGF2ZSBjbGVhckNhY2hlLCBqdXN0IGxpc3RcbiAgICAgICAgICBjb25zdCBlbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmVuc2VtYmxlTWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+UhCBSZWxvYWRlZCAke2Vuc2VtYmxlcy5sZW5ndGh9IGVuc2VtYmxlcyBmcm9tIHBvcnRmb2xpb2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVsb2FkICR7dHlwZX06YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byByZWxvYWQgJHt0eXBlfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYSB0ZW1wbGF0ZSB3aXRoIHZhcmlhYmxlc1xuICAgKiBFeHRyYWN0ZWQgZnJvbSBpbmRleC50czo2ODItNzAxIChleGFjdCBjb3B5KVxuICAgKlxuICAgKiBAdGhyb3dzIHtFbGVtZW50Tm90Rm91bmRFcnJvcn0gV2hlbiB0ZW1wbGF0ZSBkb2VzIG5vdCBleGlzdFxuICAgKiBAc2VlIElzc3VlICMyNzUgLSBIYW5kbGVycyByZXR1cm4gc3VjY2Vzcz10cnVlIGZvciBtaXNzaW5nIGVsZW1lbnRzXG4gICAqL1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZShuYW1lOiBzdHJpbmcsIHZhcmlhYmxlczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIC8vIFVzZSB0aGUgbmV3IFRlbXBsYXRlUmVuZGVyZXIgdXRpbGl0eSBmb3IgY2xlYW5lciBjb2RlIGFuZCBiZXR0ZXIgdmFsaWRhdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudGVtcGxhdGVSZW5kZXJlci5yZW5kZXIobmFtZSwgdmFyaWFibGVzKTtcblxuICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQuY29udGVudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg8J+ThCBSZW5kZXJlZCB0ZW1wbGF0ZSAnJHtuYW1lfSc6XFxuXFxuJHtyZXN1bHQuY29udGVudH1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJc3N1ZSAjMjc1OiBUaHJvdyBlcnJvciBmb3IgbWlzc2luZyB0ZW1wbGF0ZXMgaW5zdGVhZCBvZiByZXR1cm5pbmcgY29udGVudFxuICAgICAgaWYgKHJlc3VsdC5lcnJvcj8uaW5jbHVkZXMoJ25vdCBmb3VuZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignVGVtcGxhdGUnLCBuYW1lKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCAke3Jlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIHJlbmRlciB0ZW1wbGF0ZSd9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhbiBhZ2VudCB3aXRoIGdvYWwgcGFyYW1ldGVyc1xuICAgKiBSZXR1cm5zIGNvbnRleHQgZm9yIExMTSB0byBkcml2ZSB0aGUgYWdlbnRpYyBsb29wXG4gICAqL1xuICBhc3luYyBleGVjdXRlQWdlbnQobmFtZTogc3RyaW5nLCBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmV4ZWN1dGVBZ2VudChuYW1lLCBwYXJhbWV0ZXJzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBSZS10aHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBleGVjdXRlIGFnZW50ICcke25hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgc3RlcCBpbiBhZ2VudCBleGVjdXRpb25cbiAgICovXG4gIGFzeW5jIHJlY29yZEFnZW50U3RlcChhcmdzOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgc3RlcERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIGZpbmRpbmdzPzogc3RyaW5nO1xuICAgIGNvbmZpZGVuY2U/OiBudW1iZXI7XG4gICAgbmV4dEFjdGlvbkhpbnQ/OiBzdHJpbmc7XG4gICAgcmlza1Njb3JlPzogbnVtYmVyO1xuICB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLnJlY29yZEFnZW50U3RlcChhcmdzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBSZS10aHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byByZWNvcmQgYWdlbnQgc3RlcCBmb3IgJyR7YXJncy5hZ2VudE5hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIHJlY29yZCBzdGVwOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIGFuIGFnZW50IGdvYWxcbiAgICovXG4gIGFzeW5jIGNvbXBsZXRlQWdlbnRHb2FsKGFyZ3M6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBnb2FsSWQ/OiBzdHJpbmc7XG4gICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIHN1bW1hcnk6IHN0cmluZztcbiAgfSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5jb21wbGV0ZUFnZW50R29hbChhcmdzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBSZS10aHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjb21wbGV0ZSBhZ2VudCBnb2FsIGZvciAnJHthcmdzLmFnZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gY29tcGxldGUgZ29hbDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWdlbnQgc3RhdGVcbiAgICovXG4gIGFzeW5jIGdldEFnZW50U3RhdGUoYXJnczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVDb250ZXh0PzogYm9vbGVhbjtcbiAgfSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5nZXRBZ2VudFN0YXRlKGFyZ3MpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCBhZ2VudCBzdGF0ZSBmb3IgJyR7YXJncy5hZ2VudE5hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGdldCBzdGF0ZTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250aW51ZSBhZ2VudCBleGVjdXRpb24gZnJvbSBwcmV2aW91cyBzdGF0ZVxuICAgKi9cbiAgYXN5bmMgY29udGludWVBZ2VudEV4ZWN1dGlvbihhcmdzOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgcGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgcHJldmlvdXNTdGVwUmVzdWx0Pzogc3RyaW5nO1xuICB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmNvbnRpbnVlQWdlbnRFeGVjdXRpb24oYXJncyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY29udGludWUgYWdlbnQgZXhlY3V0aW9uIGZvciAnJHthcmdzLmFnZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gY29udGludWUgZXhlY3V0aW9uOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFnZ3JlZ2F0ZSBhY3RpdmUgZWxlbWVudHMgYWNyb3NzIGFsbCByZWdpc3RlcmVkIGVsZW1lbnQgdHlwZXMuXG4gICAqIElzc3VlICM1MDE6IENhbGxlZCB3aGVuIGdldF9hY3RpdmVfZWxlbWVudHMgaXMgaW52b2tlZCB3aXRob3V0IGVsZW1lbnRfdHlwZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWdncmVnYXRlQWN0aXZlRWxlbWVudHMoKTogUHJvbWlzZTxNQ1BSZXNwb25zZT4ge1xuICAgIGNvbnN0IHNlY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbZWxlbWVudFR5cGUsIHN0cmF0ZWd5XSBvZiB0aGlzLnN0cmF0ZWdpZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LmdldEFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnN0IHRleHQgPSByZXN1bHQuY29udGVudFswXT8udGV4dDtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICBzZWN0aW9ucy5wdXNoKGBbJHtlbGVtZW50VHlwZX1dXFxuJHt0ZXh0fWApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSAke2VsZW1lbnRUeXBlfSBlbGVtZW50c2AsIHsgZXJyb3I6IGVyciB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3tcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIHRleHQ6IHNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHNlY3Rpb25zLmpvaW4oJ1xcblxcbicpXG4gICAgICAgICAgOiAnTm8gYWN0aXZlIGVsZW1lbnRzIGZvdW5kLidcbiAgICAgIH1dXG4gICAgfTtcbiAgfVxuXG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"createElement.d.ts","sourceRoot":"","sources":["../../../src/handlers/element-crud/createElement.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAQhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gJAAgJ;IAChJ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAG7B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC;YAClB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;SACrC,CAAC,CAAC;QACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B,CAAC;IACF;;;OAGG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;KACrC,CAAC;IACF;;;OAGG;IACH,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAeD,wBAAsB,aAAa,CAAC,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;;;;;GAwQvF"}
1
+ {"version":3,"file":"createElement.d.ts","sourceRoot":"","sources":["../../../src/handlers/element-crud/createElement.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAQhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gJAAgJ;IAChJ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAG7B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC;YAClB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;SACrC,CAAC,CAAC;QACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B,CAAC;IACF;;;OAGG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;KACrC,CAAC;IACF;;;OAGG;IACH,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAeD,wBAAsB,aAAa,CAAC,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;;;;;GA6QvF"}
@@ -7,7 +7,7 @@
7
7
  import { ElementType } from '../../portfolio/PortfolioManager.js';
8
8
  import { SECURITY_LIMITS } from '../../security/constants.js';
9
9
  import { sanitizeInput, validateContentSize, validateCategory } from '../../security/InputValidator.js';
10
- import { sanitizeMetadata, normalizeElementTypeInput, formatValidElementTypesList, detectUnknownMetadataProperties, formatUnknownPropertyWarnings, formatElementResolutionWarnings } from './helpers.js';
10
+ import { sanitizeMetadata, normalizeElementTypeInput, formatValidElementTypesList, detectUnknownMetadataProperties, formatUnknownPropertyWarnings, formatElementResolutionWarnings, collectGatekeeperAuthoringErrors, formatGatekeeperValidationMessage, } from './helpers.js';
11
11
  import { resolveElementTypes } from '../../utils/elementTypeResolver.js';
12
12
  import { logger } from '../../utils/logger.js';
13
13
  // FIX: Issue #281 - SecurityMonitor import removed, persona logging now in PersonaManager.create()
@@ -71,6 +71,10 @@ export async function createElement(context, args) {
71
71
  // Element-specific fields (ensemble elements, agent V2 fields) are merged into
72
72
  // metadata by the dispatcher (MCPAQLHandler). createElement just sanitizes and delegates.
73
73
  const sanitized = sanitizeMetadata(metadata);
74
+ const gatekeeperErrors = collectGatekeeperAuthoringErrors({ ...args }, sanitized);
75
+ if (gatekeeperErrors.length > 0) {
76
+ return formatSimpleErrorResponse(formatGatekeeperValidationMessage(gatekeeperErrors));
77
+ }
74
78
  // Issue #621: Validate category format for element types that support it
75
79
  // Persona also supports categories (validated internally by PersonaManager) — include here for consistent early error reporting
76
80
  const CATEGORY_TYPES = new Set([ElementType.PERSONA, ElementType.SKILL, ElementType.TEMPLATE, ElementType.MEMORY]);
@@ -267,4 +271,4 @@ export async function createElement(context, args) {
267
271
  };
268
272
  }
269
273
  }
270
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlRWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9lbGVtZW50LWNydWQvY3JlYXRlRWxlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLDJCQUEyQixFQUMzQiwrQkFBK0IsRUFDL0IsNkJBQTZCLEVBQzdCLCtCQUErQixFQUNoQyxNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsbUdBQW1HO0FBQ25HLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNyQixNQUFNLHdCQUF3QixDQUFDO0FBOEdoQzs7R0FFRztBQUNILFNBQVMsbUJBQW1CLENBQUMsUUFBeUIsRUFBRSxTQUFpQjtJQUN2RSxPQUFPO1FBQ0wsR0FBRyxRQUFRO1FBQ1gsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQyxHQUFHLENBQUM7WUFDSixJQUFJLEVBQUUsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRTtTQUM5QixDQUFDLENBQUM7S0FDSixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUFDLE9BQTJCLEVBQUUsSUFBdUI7SUFDdEYs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cHJlc3Npb25cbiAqIFRoaXMgZmlsZSBkZWxlZ2F0ZXMgZWxlbWVudCBjcmVhdGlvbiB0byBzcGVjaWFsaXplZCBtYW5hZ2Vycy5cbiAqIEF1ZGl0IGxvZ2dpbmcgaGFwcGVucyBpbiB0aGUgbWFuYWdlcnMgdGhlbXNlbHZlcyAoUGVyc29uYU1hbmFnZXIsIFNraWxsTWFuYWdlciwgZXRjLikuXG4gKiBAc2VjdXJpdHktYXVkaXQtc3VwcHJlc3MgRE1DUC1TRUMtMDA2XG4gKi9cblxuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVDb250ZW50U2l6ZSwgdmFsaWRhdGVDYXRlZ29yeSB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7XG4gIHNhbml0aXplTWV0YWRhdGEsXG4gIG5vcm1hbGl6ZUVsZW1lbnRUeXBlSW5wdXQsXG4gIGZvcm1hdFZhbGlkRWxlbWVudFR5cGVzTGlzdCxcbiAgZGV0ZWN0VW5rbm93bk1ldGFkYXRhUHJvcGVydGllcyxcbiAgZm9ybWF0VW5rbm93blByb3BlcnR5V2FybmluZ3MsXG4gIGZvcm1hdEVsZW1lbnRSZXNvbHV0aW9uV2FybmluZ3Ncbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IHJlc29sdmVFbGVtZW50VHlwZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRDcnVkQ29udGV4dCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbi8vIEZJWDogSXNzdWUgIzI4MSAtIFNlY3VyaXR5TW9uaXRvciBpbXBvcnQgcmVtb3ZlZCwgcGVyc29uYSBsb2dnaW5nIG5vdyBpbiBQZXJzb25hTWFuYWdlci5jcmVhdGUoKVxuaW1wb3J0IHtcbiAgZm9ybWF0U2ltcGxlRXJyb3JSZXNwb25zZSxcbiAgZm9ybWF0RHVwbGljYXRlRXJyb3IsXG4gIGZvcm1hdEV4Y2VwdGlvbkVycm9yXG59IGZyb20gJy4vcmVzcG9uc2VGb3JtYXR0ZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNY3BUb29sUmVzcG9uc2UgfSBmcm9tICcuL3Jlc3BvbnNlRm9ybWF0dGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW5zZW1ibGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvZW5zZW1ibGVzL3R5cGVzLmpzJztcblxuLyoqXG4gKiBBcmd1bWVudHMgZm9yIGNyZWF0aW5nIGEgbmV3IGVsZW1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHBlcnNvbmFcbiAqIHsgbmFtZTogJ2hlbHBlcicsIHR5cGU6ICdwZXJzb25hJywgZGVzY3JpcHRpb246ICdBIGhlbHBmdWwgYXNzaXN0YW50JywgaW5zdHJ1Y3Rpb25zOiAnQmUgaGVscGZ1bCcgfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYW4gZW5zZW1ibGUgd2l0aCBlbGVtZW50c1xuICoge1xuICogICBuYW1lOiAnbXktZW5zZW1ibGUnLFxuICogICB0eXBlOiAnZW5zZW1ibGUnLFxuICogICBkZXNjcmlwdGlvbjogJ0EgY29vcmRpbmF0ZWQgZ3JvdXAnLFxuICogICBlbGVtZW50czogW3sgbmFtZTogJ3NraWxsMScsIHR5cGU6ICdza2lsbCcsIHJvbGU6ICdwcmltYXJ5JywgcHJpb3JpdHk6IDEwMCwgYWN0aXZhdGlvbjogJ2Fsd2F5cycgfV1cbiAqIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgVjIgYWdlbnQgd2l0aCBnb2FsIGNvbmZpZ3VyYXRpb25cbiAqIHtcbiAqICAgbmFtZTogJ3Rhc2stcnVubmVyJyxcbiAqICAgdHlwZTogJ2FnZW50JyxcbiAqICAgZGVzY3JpcHRpb246ICdFeGVjdXRlcyB0YXNrcyBhdXRvbm9tb3VzbHknLFxuICogICBnb2FsOiB7XG4gKiAgICAgdGVtcGxhdGU6ICdDb21wbGV0ZSB0aGUgZm9sbG93aW5nIHRhc2s6IHtvYmplY3RpdmV9JyxcbiAqICAgICBwYXJhbWV0ZXJzOiBbeyBuYW1lOiAnb2JqZWN0aXZlJywgdHlwZTogJ3N0cmluZycsIHJlcXVpcmVkOiB0cnVlIH1dLFxuICogICAgIHN1Y2Nlc3NDcml0ZXJpYTogWydUYXNrIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLCAnUmVzdWx0cyBkb2N1bWVudGVkJ11cbiAqICAgfSxcbiAqICAgYWN0aXZhdGVzOiB7IHNraWxsczogWydjb2RlLXJldmlldyddLCBwZXJzb25hczogWydkZXZlbG9wZXInXSB9XG4gKiB9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRWxlbWVudEFyZ3Mge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqIFJlZmVyZW5jZSBtYXRlcmlhbCwga25vd2xlZGdlLCBjb250ZXh0IChpbmZvcm1hdGlvbmFsKS4gRm9yIHRlbXBsYXRlczogdGVtcGxhdGUgYm9keS4gKi9cbiAgY29udGVudD86IHN0cmluZztcbiAgLyoqIEJlaGF2aW9yYWwgZGlyZWN0aXZlcyAoY29tbWFuZCB2b2ljZSkuIEZvciBwZXJzb25hczogYmVoYXZpb3JhbCBwcm9maWxlLiBGb3Igc2tpbGxzOiBob3cgdG8gYXBwbHkuIEZvciBhZ2VudHM6IGFnZW50IGJlaGF2aW9yYWwgcHJvdG9jb2wuICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIEZvciBlbnNlbWJsZXMgLSBhcnJheSBvZiBlbGVtZW50IHJlZmVyZW5jZXMuXG4gICAqIElzc3VlICMyNzg6IExMTXMgb2Z0ZW4gcGFzcyBlbGVtZW50cyBhdCB0b3AgbGV2ZWwsIG5vdCBpbnNpZGUgbWV0YWRhdGEuXG4gICAqL1xuICBlbGVtZW50cz86IEVuc2VtYmxlRWxlbWVudFtdO1xuXG4gIC8vIFYyIEFnZW50IGZpZWxkcyAoY2FuIGFsc28gYmUgcGFzc2VkIGluIG1ldGFkYXRhKVxuICAvKipcbiAgICogRm9yIFYyIGFnZW50cyAtIGdvYWwgY29uZmlndXJhdGlvbiB3aXRoIHRlbXBsYXRlIGFuZCBwYXJhbWV0ZXJzLlxuICAgKiBDYW4gYmUgcGFzc2VkIGFzIGEgc2ltcGxlIHN0cmluZyAod2lsbCBiZSBjb252ZXJ0ZWQgdG8gVjIgZm9ybWF0KVxuICAgKiBvciBhcyBhIGZ1bGwgVjIgY29uZmlnIG9iamVjdC5cbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50IFYyIEluZnJhc3RydWN0dXJlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNpbXBsZSBzdHJpbmcgZ29hbCAoYXV0by1jb252ZXJ0ZWQgdG8gVjIgZm9ybWF0KVxuICAgKiBnb2FsOiAnQ29tcGxldGUgdGhlIGFuYWx5c2lzIHRhc2snXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEZ1bGwgVjIgY29uZmlnIHdpdGggcGFyYW1ldGVyc1xuICAgKiBnb2FsOiB7XG4gICAqICAgdGVtcGxhdGU6ICdBbmFseXplIHt0YXJnZXR9IGZvciB7cHVycG9zZX0nLFxuICAgKiAgIHBhcmFtZXRlcnM6IFtcbiAgICogICAgIHsgbmFtZTogJ3RhcmdldCcsIHR5cGU6ICdzdHJpbmcnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgKiAgICAgeyBuYW1lOiAncHVycG9zZScsIHR5cGU6ICdzdHJpbmcnLCByZXF1aXJlZDogdHJ1ZSB9XG4gICAqICAgXSxcbiAgICogICBzdWNjZXNzQ3JpdGVyaWE6IFsnQW5hbHlzaXMgY29tcGxldGUnLCAnUmVwb3J0IGdlbmVyYXRlZCddXG4gICAqIH1cbiAgICovXG4gIGdvYWw/OiBzdHJpbmcgfCB7XG4gICAgdGVtcGxhdGU6IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzPzogQXJyYXk8e1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdib29sZWFuJztcbiAgICAgIHJlcXVpcmVkOiBib29sZWFuO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgICBkZWZhdWx0Pzogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcbiAgICB9PjtcbiAgICBzdWNjZXNzQ3JpdGVyaWE/OiBzdHJpbmdbXTtcbiAgfTtcbiAgLyoqXG4gICAqIEZvciBWMiBhZ2VudHMgLSBlbGVtZW50cyB0byBhY3RpdmF0ZSB3aGVuIGFnZW50IGV4ZWN1dGVzLlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnQgVjIgSW5mcmFzdHJ1Y3R1cmVcbiAgICovXG4gIGFjdGl2YXRlcz86IHtcbiAgICBwZXJzb25hcz86IHN0cmluZ1tdO1xuICAgIHNraWxscz86IHN0cmluZ1tdO1xuICAgIG1lbW9yaWVzPzogc3RyaW5nW107XG4gICAgdGVtcGxhdGVzPzogc3RyaW5nW107XG4gICAgZW5zZW1ibGVzPzogc3RyaW5nW107XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKlxuICAgKiBGb3IgVjIgYWdlbnRzIC0gdG9vbCBjb25maWd1cmF0aW9uIChpbmZvcm1hdGlvbmFsKS5cbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50IFYyIEluZnJhc3RydWN0dXJlXG4gICAqL1xuICB0b29scz86IHtcbiAgICBhbGxvd2VkOiBzdHJpbmdbXTtcbiAgICBkZW5pZWQ/OiBzdHJpbmdbXTtcbiAgfTtcbiAgLyoqXG4gICAqIEZvciBWMiBhZ2VudHMgLSBjdXN0b20gc3lzdGVtIHByb21wdCBmb3IgTExNIGNvbnRleHQuXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudCBWMiBJbmZyYXN0cnVjdHVyZVxuICAgKi9cbiAgc3lzdGVtUHJvbXB0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBhZGQgcGVyc29uYSBpbmRpY2F0b3IgcHJlZml4IHRvIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFkZFBlcnNvbmFJbmRpY2F0b3IocmVzcG9uc2U6IE1jcFRvb2xSZXNwb25zZSwgaW5kaWNhdG9yOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNwb25zZSxcbiAgICBjb250ZW50OiByZXNwb25zZS5jb250ZW50Lm1hcChjID0+ICh7XG4gICAgICAuLi5jLFxuICAgICAgdGV4dDogYCR7aW5kaWNhdG9yfSR7Yy50ZXh0fWBcbiAgICB9KSlcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoY29udGV4dDogRWxlbWVudENydWRDb250ZXh0LCBhcmdzOiBDcmVhdGVFbGVtZW50QXJncykge1xuICBhd2FpdCBjb250ZXh0LmVuc3VyZUluaXRpYWxpemVkKCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB7IG5hbWUsIHR5cGUsIGRlc2NyaXB0aW9uLCBjb250ZW50LCBpbnN0cnVjdGlvbnMsIG1ldGFkYXRhIH0gPSBhcmdzO1xuXG4gICAgY29uc3QgeyB0eXBlOiBub3JtYWxpemVkVHlwZSB9ID0gbm9ybWFsaXplRWxlbWVudFR5cGVJbnB1dCh0eXBlKTtcblxuICAgIGlmICghbm9ybWFsaXplZFR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBJbnZhbGlkIGVsZW1lbnQgdHlwZSAnJHt0eXBlfScuIFZhbGlkIHR5cGVzOiAke2Zvcm1hdFZhbGlkRWxlbWVudFR5cGVzTGlzdCgpfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgU0VDVVJJVFlfTElNSVRTLk1BWF9GSUxFTkFNRV9MRU5HVEgpO1xuICAgIGNvbnN0IHZhbGlkYXRlZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChkZXNjcmlwdGlvbiwgU0VDVVJJVFlfTElNSVRTLk1BWF9NRVRBREFUQV9GSUVMRF9MRU5HVEgpO1xuXG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRlQ29udGVudFNpemUoY29udGVudCwgU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBDb250ZW50IHRvbyBsYXJnZTogJHtlcnJvci5tZXNzYWdlfS4gTWF4aW11bSBhbGxvd2VkIHNpemUgaXMgJHtTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIfSBjaGFyYWN0ZXJzICgke01hdGguZmxvb3IoU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCAvIDEwMjQpfUtCKS5gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjAyIHJlc29sdmVkOiBCb3RoICdpbnN0cnVjdGlvbnMnIGFuZCAnY29udGVudCcgYXJlIGZpcnN0LWNsYXNzIGZpZWxkcy5cbiAgICAvLyBpbnN0cnVjdGlvbnMgPSBiZWhhdmlvcmFsIGRpcmVjdGl2ZXMgKGNvbW1hbmQgdm9pY2UsIFwiWW91IEFSRS4uLlwiLCBcIkFMV0FZUy4uLlwiKVxuICAgIC8vIGNvbnRlbnQgPSByZWZlcmVuY2UgbWF0ZXJpYWwgKGluZm9ybWF0aW9uYWwsIGRvbWFpbiBrbm93bGVkZ2UsIGV4YW1wbGVzKVxuICAgIGlmIChpbnN0cnVjdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRlQ29udGVudFNpemUoaW5zdHJ1Y3Rpb25zLCBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIEluc3RydWN0aW9ucyB0b28gbGFyZ2U6ICR7ZXJyb3IubWVzc2FnZX0uIE1heGltdW0gYWxsb3dlZCBzaXplIGlzICR7U0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSH0gY2hhcmFjdGVycy5gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbGVtZW50LXNwZWNpZmljIGZpZWxkcyAoZW5zZW1ibGUgZWxlbWVudHMsIGFnZW50IFYyIGZpZWxkcykgYXJlIG1lcmdlZCBpbnRvXG4gICAgLy8gbWV0YWRhdGEgYnkgdGhlIGRpc3BhdGNoZXIgKE1DUEFRTEhhbmRsZXIpLiBjcmVhdGVFbGVtZW50IGp1c3Qgc2FuaXRpemVzIGFuZCBkZWxlZ2F0ZXMuXG4gICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVNZXRhZGF0YShtZXRhZGF0YSk7XG5cbiAgICAvLyBJc3N1ZSAjNjIxOiBWYWxpZGF0ZSBjYXRlZ29yeSBmb3JtYXQgZm9yIGVsZW1lbnQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0XG4gICAgLy8gUGVyc29uYSBhbHNvIHN1cHBvcnRzIGNhdGVnb3JpZXMgKHZhbGlkYXRlZCBpbnRlcm5hbGx5IGJ5IFBlcnNvbmFNYW5hZ2VyKSDigJQgaW5jbHVkZSBoZXJlIGZvciBjb25zaXN0ZW50IGVhcmx5IGVycm9yIHJlcG9ydGluZ1xuICAgIGNvbnN0IENBVEVHT1JZX1RZUEVTID0gbmV3IFNldChbRWxlbWVudFR5cGUuUEVSU09OQSwgRWxlbWVudFR5cGUuU0tJTEwsIEVsZW1lbnRUeXBlLlRFTVBMQVRFLCBFbGVtZW50VHlwZS5NRU1PUlldKTtcbiAgICBpZiAoc2FuaXRpemVkLmNhdGVnb3J5ICYmIENBVEVHT1JZX1RZUEVTLmhhcyhub3JtYWxpemVkVHlwZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRlQ2F0ZWdvcnkoc2FuaXRpemVkLmNhdGVnb3J5IGFzIHN0cmluZyk7XG4gICAgICB9IGNhdGNoIChjYXRlZ29yeUVycm9yOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFNpbXBsZUVycm9yUmVzcG9uc2UoXG4gICAgICAgICAgYEludmFsaWQgY2F0ZWdvcnkgJyR7c2FuaXRpemVkLmNhdGVnb3J5fSc6ICR7Y2F0ZWdvcnlFcnJvci5tZXNzYWdlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXRlY3QgdW5rbm93biBtZXRhZGF0YSBwcm9wZXJ0aWVzIGFuZCBnZW5lcmF0ZSB3YXJuaW5ncyBmb3IgTExNIGZlZWRiYWNrXG4gICAgY29uc3QgdW5rbm93blByb3BlcnR5V2FybmluZ3MgPSBkZXRlY3RVbmtub3duTWV0YWRhdGFQcm9wZXJ0aWVzKFxuICAgICAgbm9ybWFsaXplZFR5cGUsXG4gICAgICBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICk7XG4gICAgY29uc3Qgd2FybmluZ1RleHQgPSBmb3JtYXRVbmtub3duUHJvcGVydHlXYXJuaW5ncyh1bmtub3duUHJvcGVydHlXYXJuaW5ncyk7XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgZm9yIGRlYnVnZ2luZyB3aXRoIHN0cnVjdHVyZWQgZGF0YSBmb3IgYmV0dGVyIG9ic2VydmFiaWxpdHlcbiAgICBpZiAodW5rbm93blByb3BlcnR5V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYFtjcmVhdGVFbGVtZW50XSBVbmtub3duIG1ldGFkYXRhIHByb3BlcnRpZXMgZGV0ZWN0ZWRgLCB7XG4gICAgICAgIGVsZW1lbnRUeXBlOiBub3JtYWxpemVkVHlwZSxcbiAgICAgICAgZWxlbWVudE5hbWU6IG5hbWUsXG4gICAgICAgIHdhcm5pbmdDb3VudDogdW5rbm93blByb3BlcnR5V2FybmluZ3MubGVuZ3RoLFxuICAgICAgICB1bmtub3duUHJvcGVydGllczogdW5rbm93blByb3BlcnR5V2FybmluZ3MubWFwKHcgPT4gKHtcbiAgICAgICAgICBwcm9wZXJ0eTogdy5wcm9wZXJ0eSxcbiAgICAgICAgICBzdWdnZXN0aW9uOiB3LnN1Z2dlc3Rpb25cbiAgICAgICAgfSkpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJc3N1ZSAjNjAyOiBCb3RoICdpbnN0cnVjdGlvbnMnIGFuZCAnY29udGVudCcgYXJlIGZpcnN0LWNsYXNzIGZpZWxkcy5cbiAgICAgICAgICBjb25zdCBwZXJzb25hID0gYXdhaXQgY29udGV4dC5wZXJzb25hTWFuYWdlci5jcmVhdGUoe1xuICAgICAgICAgICAgLi4uc2FuaXRpemVkLFxuICAgICAgICAgICAgbmFtZTogdmFsaWRhdGVkTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZGF0ZWREZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGluc3RydWN0aW9uczogaW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgICAgY29udGVudDogY29udGVudCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHN1Y2Nlc3NNc2cgPSBgJHt3YXJuaW5nVGV4dH3inIUgQ3JlYXRlZCBwZXJzb25hICcke3BlcnNvbmEubWV0YWRhdGEubmFtZX0nIHN1Y2Nlc3NmdWxseWA7XG4gICAgICAgICAgcmV0dXJuIHsgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGAke2NvbnRleHQuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7c3VjY2Vzc01zZ31gIH1dIH07XG4gICAgICAgIH0gY2F0Y2ggKHBlcnNvbmFFcnJvcikge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBwZXJzb25hRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHBlcnNvbmFFcnJvci5tZXNzYWdlIDogU3RyaW5nKHBlcnNvbmFFcnJvcik7XG4gICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJ2luc3RydWN0aW9ucyBhcmUgcmVxdWlyZWQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFNpbXBsZUVycm9yUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGVycm9yUmVzcG9uc2UgPSBtZXNzYWdlLmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0cycpXG4gICAgICAgICAgICA/IGZvcm1hdER1cGxpY2F0ZUVycm9yKEVsZW1lbnRUeXBlLlBFUlNPTkEsIHZhbGlkYXRlZE5hbWUpXG4gICAgICAgICAgICA6IGZvcm1hdEV4Y2VwdGlvbkVycm9yKHBlcnNvbmFFcnJvciwgJ2NyZWF0ZScsIEVsZW1lbnRUeXBlLlBFUlNPTkEsIHZhbGlkYXRlZE5hbWUpO1xuICAgICAgICAgIHJldHVybiBhZGRQZXJzb25hSW5kaWNhdG9yKGVycm9yUmVzcG9uc2UsIGNvbnRleHQuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgIC8vIEZJWDogSXNzdWUgIzIwIC0gQ2F0Y2ggZHVwbGljYXRlIGVycm9ycyBmcm9tIFNraWxsTWFuYWdlclxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNraWxsID0gYXdhaXQgY29udGV4dC5za2lsbE1hbmFnZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIG5hbWU6IHZhbGlkYXRlZE5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsaWRhdGVkRGVzY3JpcHRpb24sXG4gICAgICAgICAgICAuLi5zYW5pdGl6ZWQsXG4gICAgICAgICAgICBpbnN0cnVjdGlvbnM6IGluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQgfHwgJydcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzdWNjZXNzTXNnID0gYCR7d2FybmluZ1RleHR94pyFIENyZWF0ZWQgc2tpbGwgJyR7c2tpbGwubWV0YWRhdGEubmFtZX0nIHN1Y2Nlc3NmdWxseWA7XG4gICAgICAgICAgcmV0dXJuIHsgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGAke2NvbnRleHQuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7c3VjY2Vzc01zZ31gIH1dIH07XG4gICAgICAgIH0gY2F0Y2ggKHNraWxsRXJyb3IpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgZHVwbGljYXRlIGVycm9yXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHNraWxsRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHNraWxsRXJyb3IubWVzc2FnZSA6IFN0cmluZyhza2lsbEVycm9yKTtcbiAgICAgICAgICBjb25zdCBlcnJvclJlc3BvbnNlID0gbWVzc2FnZS5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICAgICAgPyBmb3JtYXREdXBsaWNhdGVFcnJvcihFbGVtZW50VHlwZS5TS0lMTCwgdmFsaWRhdGVkTmFtZSlcbiAgICAgICAgICAgIDogZm9ybWF0RXhjZXB0aW9uRXJyb3Ioc2tpbGxFcnJvciwgJ2NyZWF0ZScsIEVsZW1lbnRUeXBlLlNLSUxMLCB2YWxpZGF0ZWROYW1lKTtcbiAgICAgICAgICByZXR1cm4gYWRkUGVyc29uYUluZGljYXRvcihlcnJvclJlc3BvbnNlLCBjb250ZXh0LmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURToge1xuICAgICAgICAvLyBGSVg6IElzc3VlICMyMCAtIENhdGNoIGR1cGxpY2F0ZSBlcnJvcnMgZnJvbSBUZW1wbGF0ZU1hbmFnZXJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IGNvbnRleHQudGVtcGxhdGVNYW5hZ2VyLmNyZWF0ZSh7XG4gICAgICAgICAgICBuYW1lOiB2YWxpZGF0ZWROYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbGlkYXRlZERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnN0cnVjdGlvbnMsXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50IHx8ICcnLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHNhbml0aXplZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzdWNjZXNzTXNnID0gYCR7d2FybmluZ1RleHR94pyFIENyZWF0ZWQgdGVtcGxhdGUgJyR7dGVtcGxhdGUubWV0YWRhdGEubmFtZX0nIHN1Y2Nlc3NmdWxseWA7XG4gICAgICAgICAgcmV0dXJuIHsgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGAke2NvbnRleHQuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7c3VjY2Vzc01zZ31gIH1dIH07XG4gICAgICAgIH0gY2F0Y2ggKHRlbXBsYXRlRXJyb3IpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgZHVwbGljYXRlIGVycm9yXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRlbXBsYXRlRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHRlbXBsYXRlRXJyb3IubWVzc2FnZSA6IFN0cmluZyh0ZW1wbGF0ZUVycm9yKTtcbiAgICAgICAgICBjb25zdCBlcnJvclJlc3BvbnNlID0gbWVzc2FnZS5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICAgICAgPyBmb3JtYXREdXBsaWNhdGVFcnJvcihFbGVtZW50VHlwZS5URU1QTEFURSwgdmFsaWRhdGVkTmFtZSlcbiAgICAgICAgICAgIDogZm9ybWF0RXhjZXB0aW9uRXJyb3IodGVtcGxhdGVFcnJvciwgJ2NyZWF0ZScsIEVsZW1lbnRUeXBlLlRFTVBMQVRFLCB2YWxpZGF0ZWROYW1lKTtcbiAgICAgICAgICByZXR1cm4gYWRkUGVyc29uYUluZGljYXRvcihlcnJvclJlc3BvbnNlLCBjb250ZXh0LmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAvLyBWMiBmaWVsZHMgYXJlIG1lcmdlZCBpbnRvIG1ldGFkYXRhIGJ5IHRoZSBkaXNwYXRjaGVyIChNQ1BBUUxIYW5kbGVyKS5cbiAgICAgICAgLy8gR29hbCBub3JtYWxpemF0aW9uIChzdHJpbmfihpJvYmplY3QpIGlzIGhhbmRsZWQgYnkgQWdlbnRNYW5hZ2VyLmNyZWF0ZSgpLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIElzc3VlICM3MjI6IHYyIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlIOKAlCBlYWNoIGZpZWxkIGdvZXMgd2hlcmUgaXQgYmVsb25ncy5cbiAgICAgICAgICAvLyBBZ2VudE1hbmFnZXIuY3JlYXRlKCkgM3JkIHBhcmFtID0gYmVoYXZpb3JhbCBkaXJlY3RpdmVzIChhZ2VudC5pbnN0cnVjdGlvbnMpLlxuICAgICAgICAgIC8vIG1ldGFkYXRhLmNvbnRlbnQgPSByZWZlcmVuY2UgbWF0ZXJpYWwgKG1hcmtkb3duIGJvZHkgYWZ0ZXIgZnJvbnRtYXR0ZXIpLlxuICAgICAgICAgIGNvbnN0IGFnZW50SW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuICAgICAgICAgIGNvbnN0IGFnZW50Q29udGVudCA9IGNvbnRlbnQgfHwgJyc7XG4gICAgICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCBjb250ZXh0LmFnZW50TWFuYWdlci5jcmVhdGUoXG4gICAgICAgICAgICB2YWxpZGF0ZWROYW1lLFxuICAgICAgICAgICAgdmFsaWRhdGVkRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBhZ2VudEluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIHsgLi4uc2FuaXRpemVkLCBjb250ZW50OiBhZ2VudENvbnRlbnQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGFnZW50LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VNZXNzYWdlID0gYWdlbnQubWVzc2FnZSAmJiBhZ2VudC5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2NyZWF0ZWQgYWdlbnQnKVxuICAgICAgICAgICAgICA/IGFnZW50Lm1lc3NhZ2VcbiAgICAgICAgICAgICAgOiBgQ3JlYXRlZCBhZ2VudCAnJHt2YWxpZGF0ZWROYW1lfScgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3NNc2cgPSBgJHt3YXJuaW5nVGV4dH3inIUgJHtiYXNlTWVzc2FnZX1gO1xuICAgICAgICAgICAgcmV0dXJuIHsgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGAke2NvbnRleHQuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7c3VjY2Vzc01zZ31gIH1dIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZJWDogSXNzdWUgIzIwIC0gSW5jbHVkZSBcImZhaWxlZCB0byBjcmVhdGVcIiBpbiBlcnJvciBtZXNzYWdlIGZvciB0ZXN0IGNvbXBhdGliaWxpdHlcbiAgICAgICAgICBjb25zdCBmYWlsdXJlUmVhc29uID0gYWdlbnQubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcic7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdFNpbXBsZUVycm9yUmVzcG9uc2UoYEZhaWxlZCB0byBjcmVhdGUgYWdlbnQ6ICR7ZmFpbHVyZVJlYXNvbn1gKTtcbiAgICAgICAgfSBjYXRjaCAoYWdlbnRFcnJvcikge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhZ2VudEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBhZ2VudEVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoYWdlbnRFcnJvcik7XG4gICAgICAgICAgY29uc3QgZXJyb3JSZXNwb25zZSA9IG1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgID8gZm9ybWF0RHVwbGljYXRlRXJyb3IoRWxlbWVudFR5cGUuQUdFTlQsIHZhbGlkYXRlZE5hbWUpXG4gICAgICAgICAgICA6IGZvcm1hdEV4Y2VwdGlvbkVycm9yKGFnZW50RXJyb3IsICdjcmVhdGUnLCBFbGVtZW50VHlwZS5BR0VOVCwgdmFsaWRhdGVkTmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGFkZFBlcnNvbmFJbmRpY2F0b3IoZXJyb3JSZXNwb25zZSwgY29udGV4dC5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuTUVNT1JZOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbWVtb3J5ID0gYXdhaXQgY29udGV4dC5tZW1vcnlNYW5hZ2VyLmNyZWF0ZSh7XG4gICAgICAgICAgICAuLi5zYW5pdGl6ZWQsXG4gICAgICAgICAgICBuYW1lOiB2YWxpZGF0ZWROYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbGlkYXRlZERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgY29udGVudDogY29udGVudCxcbiAgICAgICAgICAgIGluc3RydWN0aW9uczogaW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHN1Y2Nlc3NNc2cgPSBgJHt3YXJuaW5nVGV4dH3inIUgQ3JlYXRlZCBtZW1vcnkgJyR7bWVtb3J5Lm1ldGFkYXRhLm5hbWV9JyBzdWNjZXNzZnVsbHlgO1xuICAgICAgICAgIHJldHVybiB7IGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBgJHtjb250ZXh0LmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3N1Y2Nlc3NNc2d9YCB9XSB9O1xuICAgICAgICB9IGNhdGNoIChtZW1vcnlFcnJvcikge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZW1vcnlFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gbWVtb3J5RXJyb3IubWVzc2FnZSA6IFN0cmluZyhtZW1vcnlFcnJvcik7XG4gICAgICAgICAgY29uc3QgZXJyb3JSZXNwb25zZSA9IG1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgID8gZm9ybWF0RHVwbGljYXRlRXJyb3IoRWxlbWVudFR5cGUuTUVNT1JZLCB2YWxpZGF0ZWROYW1lKVxuICAgICAgICAgICAgOiBmb3JtYXRFeGNlcHRpb25FcnJvcihtZW1vcnlFcnJvciwgJ2NyZWF0ZScsIEVsZW1lbnRUeXBlLk1FTU9SWSwgdmFsaWRhdGVkTmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGFkZFBlcnNvbmFJbmRpY2F0b3IoZXJyb3JSZXNwb25zZSwgY29udGV4dC5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuRU5TRU1CTEU6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJc3N1ZSAjNDY2OiBSZXNvbHZlIG1pc3NpbmcgZWxlbWVudF90eXBlIHZpYSBwb3J0Zm9saW8gbG9va3VwIGJlZm9yZSBjcmVhdGVcbiAgICAgICAgICBjb25zdCByZXNvbHV0aW9uUmVzdWx0ID0gYXdhaXQgcmVzb2x2ZUVsZW1lbnRUeXBlcyhcbiAgICAgICAgICAgIHNhbml0aXplZC5lbGVtZW50cyB8fCBbXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc2tpbGxNYW5hZ2VyOiBjb250ZXh0LnNraWxsTWFuYWdlcixcbiAgICAgICAgICAgICAgdGVtcGxhdGVNYW5hZ2VyOiBjb250ZXh0LnRlbXBsYXRlTWFuYWdlcixcbiAgICAgICAgICAgICAgYWdlbnRNYW5hZ2VyOiBjb250ZXh0LmFnZW50TWFuYWdlcixcbiAgICAgICAgICAgICAgbWVtb3J5TWFuYWdlcjogY29udGV4dC5tZW1vcnlNYW5hZ2VyLFxuICAgICAgICAgICAgICBwZXJzb25hTWFuYWdlcjogY29udGV4dC5wZXJzb25hTWFuYWdlcixcbiAgICAgICAgICAgICAgZW5zZW1ibGVNYW5hZ2VyOiBjb250ZXh0LmVuc2VtYmxlTWFuYWdlcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25XYXJuaW5nVGV4dCA9IGZvcm1hdEVsZW1lbnRSZXNvbHV0aW9uV2FybmluZ3MocmVzb2x1dGlvblJlc3VsdCk7XG5cbiAgICAgICAgICBjb25zdCBlbnNlbWJsZSA9IGF3YWl0IGNvbnRleHQuZW5zZW1ibGVNYW5hZ2VyLmNyZWF0ZSh7XG4gICAgICAgICAgICAuLi5zYW5pdGl6ZWQsXG4gICAgICAgICAgICBuYW1lOiB2YWxpZGF0ZWROYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbGlkYXRlZERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgZWxlbWVudHM6IHJlc29sdXRpb25SZXN1bHQucmVzb2x2ZWQsXG4gICAgICAgICAgICBpbnN0cnVjdGlvbnM6IGluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qgc3VjY2Vzc01zZyA9IGAke3dhcm5pbmdUZXh0fSR7cmVzb2x1dGlvbldhcm5pbmdUZXh0feKchSBDcmVhdGVkIGVuc2VtYmxlICcke2Vuc2VtYmxlLm1ldGFkYXRhLm5hbWV9JyBzdWNjZXNzZnVsbHlgO1xuICAgICAgICAgIHJldHVybiB7IGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBgJHtjb250ZXh0LmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3N1Y2Nlc3NNc2d9YCB9XSB9O1xuICAgICAgICB9IGNhdGNoIChlbnNlbWJsZUVycm9yKSB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVuc2VtYmxlRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVuc2VtYmxlRXJyb3IubWVzc2FnZSA6IFN0cmluZyhlbnNlbWJsZUVycm9yKTtcbiAgICAgICAgICBjb25zdCBlcnJvclJlc3BvbnNlID0gbWVzc2FnZS5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICAgICAgPyBmb3JtYXREdXBsaWNhdGVFcnJvcihFbGVtZW50VHlwZS5FTlNFTUJMRSwgdmFsaWRhdGVkTmFtZSlcbiAgICAgICAgICAgIDogZm9ybWF0RXhjZXB0aW9uRXJyb3IoZW5zZW1ibGVFcnJvciwgJ2NyZWF0ZScsIEVsZW1lbnRUeXBlLkVOU0VNQkxFLCB2YWxpZGF0ZWROYW1lKTtcbiAgICAgICAgICByZXR1cm4gYWRkUGVyc29uYUluZGljYXRvcihlcnJvclJlc3BvbnNlLCBjb250ZXh0LmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIEVsZW1lbnQgdHlwZSAnJHt0eXBlfScgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIGNyZWF0aW9uYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcignRWxlbWVudENSVURIYW5kbGVyLmNyZWF0ZUVsZW1lbnQnLCBlcnJvcik7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InO1xuICAgIGNvbnN0IGluZGljYXRvciA9IGNvbnRleHQuZ2V0UGVyc29uYUluZGljYXRvcigpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogYCR7aW5kaWNhdG9yfeKdjCBGYWlsZWQgdG8gY3JlYXRlIGVsZW1lbnQ6ICR7bWVzc2FnZX1gXG4gICAgICB9XVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlRWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9lbGVtZW50LWNydWQvY3JlYXRlRWxlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLDJCQUEyQixFQUMzQiwrQkFBK0IsRUFDL0IsNkJBQTZCLEVBQzdCLCtCQUErQixFQUMvQixnQ0FBZ0MsRUFDaEMsaUNBQWlDLEdBQ2xDLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxtR0FBbUc7QUFDbkcsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3JCLE1BQU0sd0JBQXdCLENBQUM7QUE4R2hDOztHQUVHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxRQUF5QixFQUFFLFNBQWlCO0lBQ3ZFLE9BQU87UUFDTCxHQUFHLFFBQVE7UUFDWCxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLEdBQUcsQ0FBQztZQUNKLElBQUksRUFBRSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFO1NBQzlCLENBQUMsQ0FBQztLQUNKLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxhQUFhLENB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bUIsRUFBRSxDQUFDO1FBQ2hELE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQztvQkFDUixJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsR0FBRyxTQUFTLCtCQUErQixPQUFPLEVBQUU7aUJBQzNELENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZJWDogRE1DUC1TRUMtMDA2IC0gU2VjdXJpdHkgYXVkaXQgc3VwcHJlc3Npb25cbiAqIFRoaXMgZmlsZSBkZWxlZ2F0ZXMgZWxlbWVudCBjcmVhdGlvbiB0byBzcGVjaWFsaXplZCBtYW5hZ2Vycy5cbiAqIEF1ZGl0IGxvZ2dpbmcgaGFwcGVucyBpbiB0aGUgbWFuYWdlcnMgdGhlbXNlbHZlcyAoUGVyc29uYU1hbmFnZXIsIFNraWxsTWFuYWdlciwgZXRjLikuXG4gKiBAc2VjdXJpdHktYXVkaXQtc3VwcHJlc3MgRE1DUC1TRUMtMDA2XG4gKi9cblxuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVDb250ZW50U2l6ZSwgdmFsaWRhdGVDYXRlZ29yeSB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7XG4gIHNhbml0aXplTWV0YWRhdGEsXG4gIG5vcm1hbGl6ZUVsZW1lbnRUeXBlSW5wdXQsXG4gIGZvcm1hdFZhbGlkRWxlbWVudFR5cGVzTGlzdCxcbiAgZGV0ZWN0VW5rbm93bk1ldGFkYXRhUHJvcGVydGllcyxcbiAgZm9ybWF0VW5rbm93blByb3BlcnR5V2FybmluZ3MsXG4gIGZvcm1hdEVsZW1lbnRSZXNvbHV0aW9uV2FybmluZ3MsXG4gIGNvbGxlY3RHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzLFxuICBmb3JtYXRHYXRla2VlcGVyVmFsaWRhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRWxlbWVudFR5cGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Q3J1ZENvbnRleHQgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG4vLyBGSVg6IElzc3VlICMyODEgLSBTZWN1cml0eU1vbml0b3IgaW1wb3J0IHJlbW92ZWQsIHBlcnNvbmEgbG9nZ2luZyBub3cgaW4gUGVyc29uYU1hbmFnZXIuY3JlYXRlKClcbmltcG9ydCB7XG4gIGZvcm1hdFNpbXBsZUVycm9yUmVzcG9uc2UsXG4gIGZvcm1hdER1cGxpY2F0ZUVycm9yLFxuICBmb3JtYXRFeGNlcHRpb25FcnJvclxufSBmcm9tICcuL3Jlc3BvbnNlRm9ybWF0dGVyLmpzJztcbmltcG9ydCB0eXBlIHsgTWNwVG9vbFJlc3BvbnNlIH0gZnJvbSAnLi9yZXNwb25zZUZvcm1hdHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVuc2VtYmxlRWxlbWVudCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2Vuc2VtYmxlcy90eXBlcy5qcyc7XG5cbi8qKlxuICogQXJndW1lbnRzIGZvciBjcmVhdGluZyBhIG5ldyBlbGVtZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBwZXJzb25hXG4gKiB7IG5hbWU6ICdoZWxwZXInLCB0eXBlOiAncGVyc29uYScsIGRlc2NyaXB0aW9uOiAnQSBoZWxwZnVsIGFzc2lzdGFudCcsIGluc3RydWN0aW9uczogJ0JlIGhlbHBmdWwnIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFuIGVuc2VtYmxlIHdpdGggZWxlbWVudHNcbiAqIHtcbiAqICAgbmFtZTogJ215LWVuc2VtYmxlJyxcbiAqICAgdHlwZTogJ2Vuc2VtYmxlJyxcbiAqICAgZGVzY3JpcHRpb246ICdBIGNvb3JkaW5hdGVkIGdyb3VwJyxcbiAqICAgZWxlbWVudHM6IFt7IG5hbWU6ICdza2lsbDEnLCB0eXBlOiAnc2tpbGwnLCByb2xlOiAncHJpbWFyeScsIHByaW9yaXR5OiAxMDAsIGFjdGl2YXRpb246ICdhbHdheXMnIH1dXG4gKiB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIFYyIGFnZW50IHdpdGggZ29hbCBjb25maWd1cmF0aW9uXG4gKiB7XG4gKiAgIG5hbWU6ICd0YXNrLXJ1bm5lcicsXG4gKiAgIHR5cGU6ICdhZ2VudCcsXG4gKiAgIGRlc2NyaXB0aW9uOiAnRXhlY3V0ZXMgdGFza3MgYXV0b25vbW91c2x5JyxcbiAqICAgZ29hbDoge1xuICogICAgIHRlbXBsYXRlOiAnQ29tcGxldGUgdGhlIGZvbGxvd2luZyB0YXNrOiB7b2JqZWN0aXZlfScsXG4gKiAgICAgcGFyYW1ldGVyczogW3sgbmFtZTogJ29iamVjdGl2ZScsIHR5cGU6ICdzdHJpbmcnLCByZXF1aXJlZDogdHJ1ZSB9XSxcbiAqICAgICBzdWNjZXNzQ3JpdGVyaWE6IFsnVGFzayBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5JywgJ1Jlc3VsdHMgZG9jdW1lbnRlZCddXG4gKiAgIH0sXG4gKiAgIGFjdGl2YXRlczogeyBza2lsbHM6IFsnY29kZS1yZXZpZXcnXSwgcGVyc29uYXM6IFsnZGV2ZWxvcGVyJ10gfVxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUVsZW1lbnRBcmdzIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKiBSZWZlcmVuY2UgbWF0ZXJpYWwsIGtub3dsZWRnZSwgY29udGV4dCAoaW5mb3JtYXRpb25hbCkuIEZvciB0ZW1wbGF0ZXM6IHRlbXBsYXRlIGJvZHkuICovXG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG4gIC8qKiBCZWhhdmlvcmFsIGRpcmVjdGl2ZXMgKGNvbW1hbmQgdm9pY2UpLiBGb3IgcGVyc29uYXM6IGJlaGF2aW9yYWwgcHJvZmlsZS4gRm9yIHNraWxsczogaG93IHRvIGFwcGx5LiBGb3IgYWdlbnRzOiBhZ2VudCBiZWhhdmlvcmFsIHByb3RvY29sLiAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKlxuICAgKiBGb3IgZW5zZW1ibGVzIC0gYXJyYXkgb2YgZWxlbWVudCByZWZlcmVuY2VzLlxuICAgKiBJc3N1ZSAjMjc4OiBMTE1zIG9mdGVuIHBhc3MgZWxlbWVudHMgYXQgdG9wIGxldmVsLCBub3QgaW5zaWRlIG1ldGFkYXRhLlxuICAgKi9cbiAgZWxlbWVudHM/OiBFbnNlbWJsZUVsZW1lbnRbXTtcblxuICAvLyBWMiBBZ2VudCBmaWVsZHMgKGNhbiBhbHNvIGJlIHBhc3NlZCBpbiBtZXRhZGF0YSlcbiAgLyoqXG4gICAqIEZvciBWMiBhZ2VudHMgLSBnb2FsIGNvbmZpZ3VyYXRpb24gd2l0aCB0ZW1wbGF0ZSBhbmQgcGFyYW1ldGVycy5cbiAgICogQ2FuIGJlIHBhc3NlZCBhcyBhIHNpbXBsZSBzdHJpbmcgKHdpbGwgYmUgY29udmVydGVkIHRvIFYyIGZvcm1hdClcbiAgICogb3IgYXMgYSBmdWxsIFYyIGNvbmZpZyBvYmplY3QuXG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudCBWMiBJbmZyYXN0cnVjdHVyZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTaW1wbGUgc3RyaW5nIGdvYWwgKGF1dG8tY29udmVydGVkIHRvIFYyIGZvcm1hdClcbiAgICogZ29hbDogJ0NvbXBsZXRlIHRoZSBhbmFseXNpcyB0YXNrJ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBGdWxsIFYyIGNvbmZpZyB3aXRoIHBhcmFtZXRlcnNcbiAgICogZ29hbDoge1xuICAgKiAgIHRlbXBsYXRlOiAnQW5hbHl6ZSB7dGFyZ2V0fSBmb3Ige3B1cnBvc2V9JyxcbiAgICogICBwYXJhbWV0ZXJzOiBbXG4gICAqICAgICB7IG5hbWU6ICd0YXJnZXQnLCB0eXBlOiAnc3RyaW5nJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICogICAgIHsgbmFtZTogJ3B1cnBvc2UnLCB0eXBlOiAnc3RyaW5nJywgcmVxdWlyZWQ6IHRydWUgfVxuICAgKiAgIF0sXG4gICAqICAgc3VjY2Vzc0NyaXRlcmlhOiBbJ0FuYWx5c2lzIGNvbXBsZXRlJywgJ1JlcG9ydCBnZW5lcmF0ZWQnXVxuICAgKiB9XG4gICAqL1xuICBnb2FsPzogc3RyaW5nIHwge1xuICAgIHRlbXBsYXRlOiBzdHJpbmc7XG4gICAgcGFyYW1ldGVycz86IEFycmF5PHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHR5cGU6ICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbic7XG4gICAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgICAgZGVmYXVsdD86IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG4gICAgfT47XG4gICAgc3VjY2Vzc0NyaXRlcmlhPzogc3RyaW5nW107XG4gIH07XG4gIC8qKlxuICAgKiBGb3IgVjIgYWdlbnRzIC0gZWxlbWVudHMgdG8gYWN0aXZhdGUgd2hlbiBhZ2VudCBleGVjdXRlcy5cbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50IFYyIEluZnJhc3RydWN0dXJlXG4gICAqL1xuICBhY3RpdmF0ZXM/OiB7XG4gICAgcGVyc29uYXM/OiBzdHJpbmdbXTtcbiAgICBza2lsbHM/OiBzdHJpbmdbXTtcbiAgICBtZW1vcmllcz86IHN0cmluZ1tdO1xuICAgIHRlbXBsYXRlcz86IHN0cmluZ1tdO1xuICAgIGVuc2VtYmxlcz86IHN0cmluZ1tdO1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICB9O1xuICAvKipcbiAgICogRm9yIFYyIGFnZW50cyAtIHRvb2wgY29uZmlndXJhdGlvbiAoaW5mb3JtYXRpb25hbCkuXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBBZ2VudCBWMiBJbmZyYXN0cnVjdHVyZVxuICAgKi9cbiAgdG9vbHM/OiB7XG4gICAgYWxsb3dlZDogc3RyaW5nW107XG4gICAgZGVuaWVkPzogc3RyaW5nW107XG4gIH07XG4gIC8qKlxuICAgKiBGb3IgVjIgYWdlbnRzIC0gY3VzdG9tIHN5c3RlbSBwcm9tcHQgZm9yIExMTSBjb250ZXh0LlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnQgVjIgSW5mcmFzdHJ1Y3R1cmVcbiAgICovXG4gIHN5c3RlbVByb21wdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gYWRkIHBlcnNvbmEgaW5kaWNhdG9yIHByZWZpeCB0byByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhZGRQZXJzb25hSW5kaWNhdG9yKHJlc3BvbnNlOiBNY3BUb29sUmVzcG9uc2UsIGluZGljYXRvcjogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzcG9uc2UsXG4gICAgY29udGVudDogcmVzcG9uc2UuY29udGVudC5tYXAoYyA9PiAoe1xuICAgICAgLi4uYyxcbiAgICAgIHRleHQ6IGAke2luZGljYXRvcn0ke2MudGV4dH1gXG4gICAgfSkpXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGNvbnRleHQ6IEVsZW1lbnRDcnVkQ29udGV4dCwgYXJnczogQ3JlYXRlRWxlbWVudEFyZ3MpIHtcbiAgYXdhaXQgY29udGV4dC5lbnN1cmVJbml0aWFsaXplZCgpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgeyBuYW1lLCB0eXBlLCBkZXNjcmlwdGlvbiwgY29udGVudCwgaW5zdHJ1Y3Rpb25zLCBtZXRhZGF0YSB9ID0gYXJncztcblxuICAgIGNvbnN0IHsgdHlwZTogbm9ybWFsaXplZFR5cGUgfSA9IG5vcm1hbGl6ZUVsZW1lbnRUeXBlSW5wdXQodHlwZSk7XG5cbiAgICBpZiAoIW5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBlbGVtZW50IHR5cGUgJyR7dHlwZX0nLiBWYWxpZCB0eXBlczogJHtmb3JtYXRWYWxpZEVsZW1lbnRUeXBlc0xpc3QoKX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIFNFQ1VSSVRZX0xJTUlUUy5NQVhfRklMRU5BTUVfTEVOR1RIKTtcbiAgICBjb25zdCB2YWxpZGF0ZWREZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoZGVzY3JpcHRpb24sIFNFQ1VSSVRZX0xJTUlUUy5NQVhfTUVUQURBVEFfRklFTERfTEVOR1RIKTtcblxuICAgIGlmIChjb250ZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKGNvbnRlbnQsIFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgQ29udGVudCB0b28gbGFyZ2U6ICR7ZXJyb3IubWVzc2FnZX0uIE1heGltdW0gYWxsb3dlZCBzaXplIGlzICR7U0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSH0gY2hhcmFjdGVycyAoJHtNYXRoLmZsb29yKFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEggLyAxMDI0KX1LQikuYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzYwMiByZXNvbHZlZDogQm90aCAnaW5zdHJ1Y3Rpb25zJyBhbmQgJ2NvbnRlbnQnIGFyZSBmaXJzdC1jbGFzcyBmaWVsZHMuXG4gICAgLy8gaW5zdHJ1Y3Rpb25zID0gYmVoYXZpb3JhbCBkaXJlY3RpdmVzIChjb21tYW5kIHZvaWNlLCBcIllvdSBBUkUuLi5cIiwgXCJBTFdBWVMuLi5cIilcbiAgICAvLyBjb250ZW50ID0gcmVmZXJlbmNlIG1hdGVyaWFsIChpbmZvcm1hdGlvbmFsLCBkb21haW4ga25vd2xlZGdlLCBleGFtcGxlcylcbiAgICBpZiAoaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKGluc3RydWN0aW9ucywgU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBJbnN0cnVjdGlvbnMgdG9vIGxhcmdlOiAke2Vycm9yLm1lc3NhZ2V9LiBNYXhpbXVtIGFsbG93ZWQgc2l6ZSBpcyAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEh9IGNoYXJhY3RlcnMuYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRWxlbWVudC1zcGVjaWZpYyBmaWVsZHMgKGVuc2VtYmxlIGVsZW1lbnRzLCBhZ2VudCBWMiBmaWVsZHMpIGFyZSBtZXJnZWQgaW50b1xuICAgIC8vIG1ldGFkYXRhIGJ5IHRoZSBkaXNwYXRjaGVyIChNQ1BBUUxIYW5kbGVyKS4gY3JlYXRlRWxlbWVudCBqdXN0IHNhbml0aXplcyBhbmQgZGVsZWdhdGVzLlxuICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplTWV0YWRhdGEobWV0YWRhdGEpO1xuXG4gICAgY29uc3QgZ2F0ZWtlZXBlckVycm9ycyA9IGNvbGxlY3RHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzKHsgLi4uYXJncyB9LCBzYW5pdGl6ZWQpO1xuICAgIGlmIChnYXRla2VlcGVyRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmb3JtYXRTaW1wbGVFcnJvclJlc3BvbnNlKGZvcm1hdEdhdGVrZWVwZXJWYWxpZGF0aW9uTWVzc2FnZShnYXRla2VlcGVyRXJyb3JzKSk7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzYyMTogVmFsaWRhdGUgY2F0ZWdvcnkgZm9ybWF0IGZvciBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBpdFxuICAgIC8vIFBlcnNvbmEgYWxzbyBzdXBwb3J0cyBjYXRlZ29yaWVzICh2YWxpZGF0ZWQgaW50ZXJuYWxseSBieSBQZXJzb25hTWFuYWdlcikg4oCUIGluY2x1ZGUgaGVyZSBmb3IgY29uc2lzdGVudCBlYXJseSBlcnJvciByZXBvcnRpbmdcbiAgICBjb25zdCBDQVRFR09SWV9UWVBFUyA9IG5ldyBTZXQoW0VsZW1lbnRUeXBlLlBFUlNPTkEsIEVsZW1lbnRUeXBlLlNLSUxMLCBFbGVtZW50VHlwZS5URU1QTEFURSwgRWxlbWVudFR5cGUuTUVNT1JZXSk7XG4gICAgaWYgKHNhbml0aXplZC5jYXRlZ29yeSAmJiBDQVRFR09SWV9UWVBFUy5oYXMobm9ybWFsaXplZFR5cGUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YWxpZGF0ZUNhdGVnb3J5KHNhbml0aXplZC5jYXRlZ29yeSBhcyBzdHJpbmcpO1xuICAgICAgfSBjYXRjaCAoY2F0ZWdvcnlFcnJvcjogYW55KSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRTaW1wbGVFcnJvclJlc3BvbnNlKFxuICAgICAgICAgIGBJbnZhbGlkIGNhdGVnb3J5ICcke3Nhbml0aXplZC5jYXRlZ29yeX0nOiAke2NhdGVnb3J5RXJyb3IubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0IHVua25vd24gbWV0YWRhdGEgcHJvcGVydGllcyBhbmQgZ2VuZXJhdGUgd2FybmluZ3MgZm9yIExMTSBmZWVkYmFja1xuICAgIGNvbnN0IHVua25vd25Qcm9wZXJ0eVdhcm5pbmdzID0gZGV0ZWN0VW5rbm93bk1ldGFkYXRhUHJvcGVydGllcyhcbiAgICAgIG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgbWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApO1xuICAgIGNvbnN0IHdhcm5pbmdUZXh0ID0gZm9ybWF0VW5rbm93blByb3BlcnR5V2FybmluZ3ModW5rbm93blByb3BlcnR5V2FybmluZ3MpO1xuXG4gICAgLy8gTG9nIHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmcgd2l0aCBzdHJ1Y3R1cmVkIGRhdGEgZm9yIGJldHRlciBvYnNlcnZhYmlsaXR5XG4gICAgaWYgKHVua25vd25Qcm9wZXJ0eVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbY3JlYXRlRWxlbWVudF0gVW5rbm93biBtZXRhZGF0YSBwcm9wZXJ0aWVzIGRldGVjdGVkYCwge1xuICAgICAgICBlbGVtZW50VHlwZTogbm9ybWFsaXplZFR5cGUsXG4gICAgICAgIGVsZW1lbnROYW1lOiBuYW1lLFxuICAgICAgICB3YXJuaW5nQ291bnQ6IHVua25vd25Qcm9wZXJ0eVdhcm5pbmdzLmxlbmd0aCxcbiAgICAgICAgdW5rbm93blByb3BlcnRpZXM6IHVua25vd25Qcm9wZXJ0eVdhcm5pbmdzLm1hcCh3ID0+ICh7XG4gICAgICAgICAgcHJvcGVydHk6IHcucHJvcGVydHksXG4gICAgICAgICAgc3VnZ2VzdGlvbjogdy5zdWdnZXN0aW9uXG4gICAgICAgIH0pKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChub3JtYWxpemVkVHlwZSkge1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gSXNzdWUgIzYwMjogQm90aCAnaW5zdHJ1Y3Rpb25zJyBhbmQgJ2NvbnRlbnQnIGFyZSBmaXJzdC1jbGFzcyBmaWVsZHMuXG4gICAgICAgICAgY29uc3QgcGVyc29uYSA9IGF3YWl0IGNvbnRleHQucGVyc29uYU1hbmFnZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIC4uLnNhbml0aXplZCxcbiAgICAgICAgICAgIG5hbWU6IHZhbGlkYXRlZE5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsaWRhdGVkRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBpbnN0cnVjdGlvbnM6IGluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBzdWNjZXNzTXNnID0gYCR7d2FybmluZ1RleHR94pyFIENyZWF0ZWQgcGVyc29uYSAnJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9JyBzdWNjZXNzZnVsbHlgO1xuICAgICAgICAgIHJldHVybiB7IGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBgJHtjb250ZXh0LmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3N1Y2Nlc3NNc2d9YCB9XSB9O1xuICAgICAgICB9IGNhdGNoIChwZXJzb25hRXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gcGVyc29uYUVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBwZXJzb25hRXJyb3IubWVzc2FnZSA6IFN0cmluZyhwZXJzb25hRXJyb3IpO1xuICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdpbnN0cnVjdGlvbnMgYXJlIHJlcXVpcmVkJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRTaW1wbGVFcnJvclJlc3BvbnNlKG1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBlcnJvclJlc3BvbnNlID0gbWVzc2FnZS5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICAgICAgPyBmb3JtYXREdXBsaWNhdGVFcnJvcihFbGVtZW50VHlwZS5QRVJTT05BLCB2YWxpZGF0ZWROYW1lKVxuICAgICAgICAgICAgOiBmb3JtYXRFeGNlcHRpb25FcnJvcihwZXJzb25hRXJyb3IsICdjcmVhdGUnLCBFbGVtZW50VHlwZS5QRVJTT05BLCB2YWxpZGF0ZWROYW1lKTtcbiAgICAgICAgICByZXR1cm4gYWRkUGVyc29uYUluZGljYXRvcihlcnJvclJlc3BvbnNlLCBjb250ZXh0LmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDoge1xuICAgICAgICAvLyBGSVg6IElzc3VlICMyMCAtIENhdGNoIGR1cGxpY2F0ZSBlcnJvcnMgZnJvbSBTa2lsbE1hbmFnZXJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBza2lsbCA9IGF3YWl0IGNvbnRleHQuc2tpbGxNYW5hZ2VyLmNyZWF0ZSh7XG4gICAgICAgICAgICBuYW1lOiB2YWxpZGF0ZWROYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbGlkYXRlZERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgLi4uc2FuaXRpemVkLFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnN0cnVjdGlvbnMsXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50IHx8ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qgc3VjY2Vzc01zZyA9IGAke3dhcm5pbmdUZXh0feKchSBDcmVhdGVkIHNraWxsICcke3NraWxsLm1ldGFkYXRhLm5hbWV9JyBzdWNjZXNzZnVsbHlgO1xuICAgICAgICAgIHJldHVybiB7IGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBgJHtjb250ZXh0LmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3N1Y2Nlc3NNc2d9YCB9XSB9O1xuICAgICAgICB9IGNhdGNoIChza2lsbEVycm9yKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIGR1cGxpY2F0ZSBlcnJvclxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBza2lsbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBza2lsbEVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoc2tpbGxFcnJvcik7XG4gICAgICAgICAgY29uc3QgZXJyb3JSZXNwb25zZSA9IG1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgID8gZm9ybWF0RHVwbGljYXRlRXJyb3IoRWxlbWVudFR5cGUuU0tJTEwsIHZhbGlkYXRlZE5hbWUpXG4gICAgICAgICAgICA6IGZvcm1hdEV4Y2VwdGlvbkVycm9yKHNraWxsRXJyb3IsICdjcmVhdGUnLCBFbGVtZW50VHlwZS5TS0lMTCwgdmFsaWRhdGVkTmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGFkZFBlcnNvbmFJbmRpY2F0b3IoZXJyb3JSZXNwb25zZSwgY29udGV4dC5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgLy8gRklYOiBJc3N1ZSAjMjAgLSBDYXRjaCBkdXBsaWNhdGUgZXJyb3JzIGZyb20gVGVtcGxhdGVNYW5hZ2VyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBhd2FpdCBjb250ZXh0LnRlbXBsYXRlTWFuYWdlci5jcmVhdGUoe1xuICAgICAgICAgICAgbmFtZTogdmFsaWRhdGVkTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZGF0ZWREZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGluc3RydWN0aW9uczogaW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgICAgY29udGVudDogY29udGVudCB8fCAnJyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBzYW5pdGl6ZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qgc3VjY2Vzc01zZyA9IGAke3dhcm5pbmdUZXh0feKchSBDcmVhdGVkIHRlbXBsYXRlICcke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9JyBzdWNjZXNzZnVsbHlgO1xuICAgICAgICAgIHJldHVybiB7IGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBgJHtjb250ZXh0LmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3N1Y2Nlc3NNc2d9YCB9XSB9O1xuICAgICAgICB9IGNhdGNoICh0ZW1wbGF0ZUVycm9yKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIGR1cGxpY2F0ZSBlcnJvclxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0ZW1wbGF0ZUVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyB0ZW1wbGF0ZUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcodGVtcGxhdGVFcnJvcik7XG4gICAgICAgICAgY29uc3QgZXJyb3JSZXNwb25zZSA9IG1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgID8gZm9ybWF0RHVwbGljYXRlRXJyb3IoRWxlbWVudFR5cGUuVEVNUExBVEUsIHZhbGlkYXRlZE5hbWUpXG4gICAgICAgICAgICA6IGZvcm1hdEV4Y2VwdGlvbkVycm9yKHRlbXBsYXRlRXJyb3IsICdjcmVhdGUnLCBFbGVtZW50VHlwZS5URU1QTEFURSwgdmFsaWRhdGVkTmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGFkZFBlcnNvbmFJbmRpY2F0b3IoZXJyb3JSZXNwb25zZSwgY29udGV4dC5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHtcbiAgICAgICAgLy8gVjIgZmllbGRzIGFyZSBtZXJnZWQgaW50byBtZXRhZGF0YSBieSB0aGUgZGlzcGF0Y2hlciAoTUNQQVFMSGFuZGxlcikuXG4gICAgICAgIC8vIEdvYWwgbm9ybWFsaXphdGlvbiAoc3RyaW5n4oaSb2JqZWN0KSBpcyBoYW5kbGVkIGJ5IEFnZW50TWFuYWdlci5jcmVhdGUoKS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJc3N1ZSAjNzIyOiB2MiBkdWFsLWZpZWxkIGFyY2hpdGVjdHVyZSDigJQgZWFjaCBmaWVsZCBnb2VzIHdoZXJlIGl0IGJlbG9uZ3MuXG4gICAgICAgICAgLy8gQWdlbnRNYW5hZ2VyLmNyZWF0ZSgpIDNyZCBwYXJhbSA9IGJlaGF2aW9yYWwgZGlyZWN0aXZlcyAoYWdlbnQuaW5zdHJ1Y3Rpb25zKS5cbiAgICAgICAgICAvLyBtZXRhZGF0YS5jb250ZW50ID0gcmVmZXJlbmNlIG1hdGVyaWFsIChtYXJrZG93biBib2R5IGFmdGVyIGZyb250bWF0dGVyKS5cbiAgICAgICAgICBjb25zdCBhZ2VudEluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucyB8fCAnJztcbiAgICAgICAgICBjb25zdCBhZ2VudENvbnRlbnQgPSBjb250ZW50IHx8ICcnO1xuICAgICAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgY29udGV4dC5hZ2VudE1hbmFnZXIuY3JlYXRlKFxuICAgICAgICAgICAgdmFsaWRhdGVkTmFtZSxcbiAgICAgICAgICAgIHZhbGlkYXRlZERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYWdlbnRJbnN0cnVjdGlvbnMsXG4gICAgICAgICAgICB7IC4uLnNhbml0aXplZCwgY29udGVudDogYWdlbnRDb250ZW50IH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChhZ2VudC5zdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlTWVzc2FnZSA9IGFnZW50Lm1lc3NhZ2UgJiYgYWdlbnQubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjcmVhdGVkIGFnZW50JylcbiAgICAgICAgICAgICAgPyBhZ2VudC5tZXNzYWdlXG4gICAgICAgICAgICAgIDogYENyZWF0ZWQgYWdlbnQgJyR7dmFsaWRhdGVkTmFtZX0nIHN1Y2Nlc3NmdWxseWA7XG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzTXNnID0gYCR7d2FybmluZ1RleHR94pyFICR7YmFzZU1lc3NhZ2V9YDtcbiAgICAgICAgICAgIHJldHVybiB7IGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBgJHtjb250ZXh0LmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3N1Y2Nlc3NNc2d9YCB9XSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGSVg6IElzc3VlICMyMCAtIEluY2x1ZGUgXCJmYWlsZWQgdG8gY3JlYXRlXCIgaW4gZXJyb3IgbWVzc2FnZSBmb3IgdGVzdCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgY29uc3QgZmFpbHVyZVJlYXNvbiA9IGFnZW50Lm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InO1xuICAgICAgICAgIHJldHVybiBmb3JtYXRTaW1wbGVFcnJvclJlc3BvbnNlKGBGYWlsZWQgdG8gY3JlYXRlIGFnZW50OiAke2ZhaWx1cmVSZWFzb259YCk7XG4gICAgICAgIH0gY2F0Y2ggKGFnZW50RXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYWdlbnRFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYWdlbnRFcnJvci5tZXNzYWdlIDogU3RyaW5nKGFnZW50RXJyb3IpO1xuICAgICAgICAgIGNvbnN0IGVycm9yUmVzcG9uc2UgPSBtZXNzYWdlLmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0cycpXG4gICAgICAgICAgICA/IGZvcm1hdER1cGxpY2F0ZUVycm9yKEVsZW1lbnRUeXBlLkFHRU5ULCB2YWxpZGF0ZWROYW1lKVxuICAgICAgICAgICAgOiBmb3JtYXRFeGNlcHRpb25FcnJvcihhZ2VudEVycm9yLCAnY3JlYXRlJywgRWxlbWVudFR5cGUuQUdFTlQsIHZhbGlkYXRlZE5hbWUpO1xuICAgICAgICAgIHJldHVybiBhZGRQZXJzb25hSW5kaWNhdG9yKGVycm9yUmVzcG9uc2UsIGNvbnRleHQuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLk1FTU9SWToge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IGNvbnRleHQubWVtb3J5TWFuYWdlci5jcmVhdGUoe1xuICAgICAgICAgICAgLi4uc2FuaXRpemVkLFxuICAgICAgICAgICAgbmFtZTogdmFsaWRhdGVkTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZGF0ZWREZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgICBpbnN0cnVjdGlvbnM6IGluc3RydWN0aW9ucyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzdWNjZXNzTXNnID0gYCR7d2FybmluZ1RleHR94pyFIENyZWF0ZWQgbWVtb3J5ICcke21lbW9yeS5tZXRhZGF0YS5uYW1lfScgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgICAgICByZXR1cm4geyBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogYCR7Y29udGV4dC5nZXRQZXJzb25hSW5kaWNhdG9yKCl9JHtzdWNjZXNzTXNnfWAgfV0gfTtcbiAgICAgICAgfSBjYXRjaCAobWVtb3J5RXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVtb3J5RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IG1lbW9yeUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcobWVtb3J5RXJyb3IpO1xuICAgICAgICAgIGNvbnN0IGVycm9yUmVzcG9uc2UgPSBtZXNzYWdlLmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0cycpXG4gICAgICAgICAgICA/IGZvcm1hdER1cGxpY2F0ZUVycm9yKEVsZW1lbnRUeXBlLk1FTU9SWSwgdmFsaWRhdGVkTmFtZSlcbiAgICAgICAgICAgIDogZm9ybWF0RXhjZXB0aW9uRXJyb3IobWVtb3J5RXJyb3IsICdjcmVhdGUnLCBFbGVtZW50VHlwZS5NRU1PUlksIHZhbGlkYXRlZE5hbWUpO1xuICAgICAgICAgIHJldHVybiBhZGRQZXJzb25hSW5kaWNhdG9yKGVycm9yUmVzcG9uc2UsIGNvbnRleHQuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLkVOU0VNQkxFOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gSXNzdWUgIzQ2NjogUmVzb2x2ZSBtaXNzaW5nIGVsZW1lbnRfdHlwZSB2aWEgcG9ydGZvbGlvIGxvb2t1cCBiZWZvcmUgY3JlYXRlXG4gICAgICAgICAgY29uc3QgcmVzb2x1dGlvblJlc3VsdCA9IGF3YWl0IHJlc29sdmVFbGVtZW50VHlwZXMoXG4gICAgICAgICAgICBzYW5pdGl6ZWQuZWxlbWVudHMgfHwgW10sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNraWxsTWFuYWdlcjogY29udGV4dC5za2lsbE1hbmFnZXIsXG4gICAgICAgICAgICAgIHRlbXBsYXRlTWFuYWdlcjogY29udGV4dC50ZW1wbGF0ZU1hbmFnZXIsXG4gICAgICAgICAgICAgIGFnZW50TWFuYWdlcjogY29udGV4dC5hZ2VudE1hbmFnZXIsXG4gICAgICAgICAgICAgIG1lbW9yeU1hbmFnZXI6IGNvbnRleHQubWVtb3J5TWFuYWdlcixcbiAgICAgICAgICAgICAgcGVyc29uYU1hbmFnZXI6IGNvbnRleHQucGVyc29uYU1hbmFnZXIsXG4gICAgICAgICAgICAgIGVuc2VtYmxlTWFuYWdlcjogY29udGV4dC5lbnNlbWJsZU1hbmFnZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCByZXNvbHV0aW9uV2FybmluZ1RleHQgPSBmb3JtYXRFbGVtZW50UmVzb2x1dGlvbldhcm5pbmdzKHJlc29sdXRpb25SZXN1bHQpO1xuXG4gICAgICAgICAgY29uc3QgZW5zZW1ibGUgPSBhd2FpdCBjb250ZXh0LmVuc2VtYmxlTWFuYWdlci5jcmVhdGUoe1xuICAgICAgICAgICAgLi4uc2FuaXRpemVkLFxuICAgICAgICAgICAgbmFtZTogdmFsaWRhdGVkTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZGF0ZWREZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGVsZW1lbnRzOiByZXNvbHV0aW9uUmVzdWx0LnJlc29sdmVkLFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnN0cnVjdGlvbnMsXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHN1Y2Nlc3NNc2cgPSBgJHt3YXJuaW5nVGV4dH0ke3Jlc29sdXRpb25XYXJuaW5nVGV4dH3inIUgQ3JlYXRlZCBlbnNlbWJsZSAnJHtlbnNlbWJsZS5tZXRhZGF0YS5uYW1lfScgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgICAgICByZXR1cm4geyBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogYCR7Y29udGV4dC5nZXRQZXJzb25hSW5kaWNhdG9yKCl9JHtzdWNjZXNzTXNnfWAgfV0gfTtcbiAgICAgICAgfSBjYXRjaCAoZW5zZW1ibGVFcnJvcikge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbnNlbWJsZUVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlbnNlbWJsZUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZW5zZW1ibGVFcnJvcik7XG4gICAgICAgICAgY29uc3QgZXJyb3JSZXNwb25zZSA9IG1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgID8gZm9ybWF0RHVwbGljYXRlRXJyb3IoRWxlbWVudFR5cGUuRU5TRU1CTEUsIHZhbGlkYXRlZE5hbWUpXG4gICAgICAgICAgICA6IGZvcm1hdEV4Y2VwdGlvbkVycm9yKGVuc2VtYmxlRXJyb3IsICdjcmVhdGUnLCBFbGVtZW50VHlwZS5FTlNFTUJMRSwgdmFsaWRhdGVkTmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGFkZFBlcnNvbmFJbmRpY2F0b3IoZXJyb3JSZXNwb25zZSwgY29udGV4dC5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBFbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBjcmVhdGlvbmBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ0VsZW1lbnRDUlVESGFuZGxlci5jcmVhdGVFbGVtZW50JywgZXJyb3IpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJztcbiAgICBjb25zdCBpbmRpY2F0b3IgPSBjb250ZXh0LmdldFBlcnNvbmFJbmRpY2F0b3IoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3tcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIHRleHQ6IGAke2luZGljYXRvcn3inYwgRmFpbGVkIHRvIGNyZWF0ZSBlbGVtZW50OiAke21lc3NhZ2V9YFxuICAgICAgfV1cbiAgICB9O1xuICB9XG59XG4iXX0=