@dollhousemcp/mcp-server 2.0.0-rc.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/CHANGELOG.md +52 -61
  2. package/README.github.md +2 -2
  3. package/README.md +2 -2
  4. package/README.md.backup +284 -224
  5. package/README.npm.md +2 -2
  6. package/dist/cache/LRUCache.d.ts +3 -0
  7. package/dist/cache/LRUCache.d.ts.map +1 -1
  8. package/dist/cache/LRUCache.js +36 -26
  9. package/dist/config/env.d.ts +14 -4
  10. package/dist/config/env.d.ts.map +1 -1
  11. package/dist/config/env.js +20 -6
  12. package/dist/di/Container.d.ts +21 -0
  13. package/dist/di/Container.d.ts.map +1 -1
  14. package/dist/di/Container.js +250 -53
  15. package/dist/elements/BaseElement.d.ts.map +1 -1
  16. package/dist/elements/BaseElement.js +5 -10
  17. package/dist/elements/base/BaseElementManager.d.ts +22 -0
  18. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  19. package/dist/elements/base/BaseElementManager.js +47 -7
  20. package/dist/elements/memories/Memory.d.ts +1 -0
  21. package/dist/elements/memories/Memory.d.ts.map +1 -1
  22. package/dist/elements/memories/Memory.js +12 -8
  23. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  24. package/dist/elements/memories/MemoryManager.js +23 -42
  25. package/dist/elements/memories/MemorySearchIndex.js +2 -2
  26. package/dist/generated/version.d.ts +2 -2
  27. package/dist/generated/version.d.ts.map +1 -1
  28. package/dist/generated/version.js +3 -3
  29. package/dist/handlers/EnhancedIndexHandler.js +6 -6
  30. package/dist/handlers/element-crud/listElements.d.ts +2 -0
  31. package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
  32. package/dist/handlers/element-crud/listElements.js +3 -1
  33. package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
  35. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
  36. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  37. package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
  38. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  39. package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
  40. package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
  41. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  42. package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
  43. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
  44. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
  45. package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
  46. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  47. package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -3
  50. package/dist/logging/LogHooks.js +11 -11
  51. package/dist/logging/LogManager.d.ts +0 -2
  52. package/dist/logging/LogManager.d.ts.map +1 -1
  53. package/dist/logging/LogManager.js +1 -3
  54. package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
  55. package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
  56. package/dist/logging/sinks/MemoryLogSink.js +12 -3
  57. package/dist/logging/types.d.ts +0 -2
  58. package/dist/logging/types.d.ts.map +1 -1
  59. package/dist/logging/types.js +1 -1
  60. package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
  61. package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
  62. package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
  63. package/dist/metrics/MetricsManager.d.ts +47 -0
  64. package/dist/metrics/MetricsManager.d.ts.map +1 -0
  65. package/dist/metrics/MetricsManager.js +232 -0
  66. package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
  67. package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
  68. package/dist/metrics/OperationMetricsTracker.js +53 -0
  69. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
  70. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
  71. package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
  72. package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
  73. package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
  74. package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
  75. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
  76. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
  77. package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
  78. package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
  79. package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
  80. package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
  81. package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
  82. package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
  83. package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
  84. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
  85. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
  86. package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
  87. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
  88. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
  89. package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
  90. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
  91. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
  92. package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
  93. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
  94. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
  95. package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
  96. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
  97. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
  98. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
  99. package/dist/metrics/collectors/index.d.ts +11 -0
  100. package/dist/metrics/collectors/index.d.ts.map +1 -0
  101. package/dist/metrics/collectors/index.js +11 -0
  102. package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
  103. package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
  104. package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
  105. package/dist/metrics/types.d.ts +98 -0
  106. package/dist/metrics/types.d.ts.map +1 -0
  107. package/dist/metrics/types.js +24 -0
  108. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  109. package/dist/portfolio/DefaultElementProvider.js +1 -7
  110. package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
  111. package/dist/portfolio/EnhancedIndexManager.js +18 -18
  112. package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
  113. package/dist/portfolio/NLPScoringManager.js +5 -9
  114. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  115. package/dist/portfolio/RelationshipManager.js +2 -2
  116. package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
  117. package/dist/portfolio/VerbTriggerManager.js +5 -19
  118. package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
  119. package/dist/portfolio/config/IndexConfig.js +1 -12
  120. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
  121. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
  122. package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
  123. package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
  124. package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
  125. package/dist/portfolio/types/RelationshipTypes.js +3 -17
  126. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  127. package/dist/security/audit/config/suppressions.js +36 -8
  128. package/dist/security/constants.d.ts.map +1 -1
  129. package/dist/security/constants.js +10 -6
  130. package/dist/security/fileLockManager.d.ts.map +1 -1
  131. package/dist/security/fileLockManager.js +8 -6
  132. package/dist/security/secureYamlParser.d.ts.map +1 -1
  133. package/dist/security/secureYamlParser.js +1 -13
  134. package/dist/security/securityMonitor.d.ts +2 -1
  135. package/dist/security/securityMonitor.d.ts.map +1 -1
  136. package/dist/security/securityMonitor.js +14 -3
  137. package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
  138. package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
  139. package/dist/security/telemetry/SecurityTelemetry.js +30 -2
  140. package/dist/security/tokenManager.d.ts +3 -0
  141. package/dist/security/tokenManager.d.ts.map +1 -1
  142. package/dist/security/tokenManager.js +13 -5
  143. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  144. package/dist/security/validation/BackgroundValidator.js +7 -7
  145. package/dist/server/startup.d.ts.map +1 -1
  146. package/dist/server/startup.js +8 -24
  147. package/dist/server/tools/MCPAQLTools.js +4 -1
  148. package/dist/services/ActivationStore.d.ts.map +1 -1
  149. package/dist/services/ActivationStore.js +9 -3
  150. package/dist/services/FileWatchService.d.ts +1 -0
  151. package/dist/services/FileWatchService.d.ts.map +1 -1
  152. package/dist/services/FileWatchService.js +83 -48
  153. package/dist/services/MetadataService.d.ts.map +1 -1
  154. package/dist/services/MetadataService.js +7 -2
  155. package/dist/services/query/ElementQueryService.d.ts.map +1 -1
  156. package/dist/services/query/ElementQueryService.js +1 -41
  157. package/dist/services/query/PaginationService.d.ts.map +1 -1
  158. package/dist/services/query/PaginationService.js +1 -14
  159. package/dist/services/query/SortService.d.ts.map +1 -1
  160. package/dist/services/query/SortService.js +1 -6
  161. package/dist/services/validation/ValidationService.d.ts.map +1 -1
  162. package/dist/services/validation/ValidationService.js +3 -8
  163. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  164. package/dist/storage/ElementStorageLayer.js +5 -2
  165. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  166. package/dist/storage/MemoryStorageLayer.js +5 -2
  167. package/dist/telemetry/OperationalTelemetry.js +2 -2
  168. package/dist/utils/EventDeduplicator.d.ts +44 -0
  169. package/dist/utils/EventDeduplicator.d.ts.map +1 -0
  170. package/dist/utils/EventDeduplicator.js +93 -0
  171. package/dist/utils/FileLock.d.ts.map +1 -1
  172. package/dist/utils/FileLock.js +1 -9
  173. package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
  174. package/dist/utils/PerformanceMonitor.js +5 -5
  175. package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
  176. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  177. package/dist/utils/SlidingWindowRateLimiter.js +23 -0
  178. package/dist/web/console/IngestRoutes.d.ts +84 -0
  179. package/dist/web/console/IngestRoutes.d.ts.map +1 -0
  180. package/dist/web/console/IngestRoutes.js +252 -0
  181. package/dist/web/console/LeaderElection.d.ts +89 -0
  182. package/dist/web/console/LeaderElection.d.ts.map +1 -0
  183. package/dist/web/console/LeaderElection.js +205 -0
  184. package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
  185. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
  186. package/dist/web/console/LeaderForwardingSink.js +197 -0
  187. package/dist/web/console/SessionNames.d.ts +46 -0
  188. package/dist/web/console/SessionNames.d.ts.map +1 -0
  189. package/dist/web/console/SessionNames.js +257 -0
  190. package/dist/web/console/UnifiedConsole.d.ts +64 -0
  191. package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
  192. package/dist/web/console/UnifiedConsole.js +119 -0
  193. package/dist/web/contentPipeline.d.ts +58 -0
  194. package/dist/web/contentPipeline.d.ts.map +1 -0
  195. package/dist/web/contentPipeline.js +112 -0
  196. package/dist/web/portDiscovery.d.ts +58 -0
  197. package/dist/web/portDiscovery.d.ts.map +1 -0
  198. package/dist/web/portDiscovery.js +143 -0
  199. package/dist/web/public/app.js +148 -60
  200. package/dist/web/public/logs.js +638 -0
  201. package/dist/web/public/metrics.js +682 -0
  202. package/dist/web/public/permissions.js +394 -0
  203. package/dist/web/public/sessions.js +369 -0
  204. package/dist/web/routes/healthRoutes.d.ts +16 -0
  205. package/dist/web/routes/healthRoutes.d.ts.map +1 -0
  206. package/dist/web/routes/healthRoutes.js +29 -0
  207. package/dist/web/routes/logRoutes.d.ts +18 -0
  208. package/dist/web/routes/logRoutes.d.ts.map +1 -0
  209. package/dist/web/routes/logRoutes.js +126 -0
  210. package/dist/web/routes/metricsRoutes.d.ts +17 -0
  211. package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
  212. package/dist/web/routes/metricsRoutes.js +90 -0
  213. package/dist/web/routes/permissionRoutes.d.ts +16 -0
  214. package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
  215. package/dist/web/routes/permissionRoutes.js +133 -0
  216. package/dist/web/routes.d.ts.map +1 -1
  217. package/dist/web/routes.js +309 -339
  218. package/dist/web/server.d.ts +21 -1
  219. package/dist/web/server.d.ts.map +1 -1
  220. package/dist/web/server.js +42 -4
  221. package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
  222. package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
  223. package/dist/web/sinks/WebSSELogSink.js +22 -0
  224. package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
  225. package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
  226. package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
  227. package/package.json +2 -2
  228. package/server.json +2 -2
  229. package/dist/constants/version.d.ts +0 -3
  230. package/dist/constants/version.d.ts.map +0 -1
  231. package/dist/constants/version.js +0 -4
  232. package/dist/logging/sinks/SSELogSink.d.ts +0 -35
  233. package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
  234. package/dist/logging/sinks/SSELogSink.js +0 -181
  235. package/dist/logging/viewer/viewerHtml.d.ts +0 -8
  236. package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
  237. package/dist/logging/viewer/viewerHtml.js +0 -204
  238. package/dist/web/public/public/app.js +0 -1878
@@ -340,6 +340,8 @@ System:
340
340
  { operation: "get_build_info" }
341
341
  { operation: "get_cache_budget_report" }
342
342
  { operation: "query_logs", params: { level: "error", limit: 10 } }
343
+ { operation: "query_metrics" }
344
+ { operation: "query_metrics", params: { names: ["system.memory.*"], type: "gauge" } }
343
345
  { operation: "convert_skill_format", params: { direction: "agent_to_dollhouse", agent_skill: { "SKILL.md": "---\\nname: my-skill\\ndescription: test\\n---\\n\\nUse this skill." } } }
344
346
  { operation: "convert_skill_format", params: { direction: "agent_to_dollhouse", security_mode: "warn", path_mode: "lossless", agent_skill: { "SKILL.md": "---\\nname: my-skill\\ndescription: test\\n---\\n\\nUse this skill." } } }
345
347
  { operation: "convert_skill_format", params: { direction: "dollhouse_to_agent", path_mode: "lossless", dollhouse_markdown: "---\\nname: my-skill\\ndescription: test\\ninstructions: Use this skill.\\n---\\n\\n### binaries/logo.png\\n(binary link: ./skills/binaries/logo.png)" } }
@@ -350,6 +352,7 @@ Auth:
350
352
 
351
353
  Gatekeeper & CLI policies:
352
354
  { operation: "permission_prompt", params: { tool: "Bash", prompt: "run npm test" } }
355
+ { operation: "evaluate_permission", params: { tool_name: "Bash", input: { command: "git status" }, platform: "claude_code" } }
353
356
  { operation: "get_effective_cli_policies" }
354
357
  { operation: "get_pending_cli_approvals" }
355
358
 
@@ -514,4 +517,4 @@ Discover required parameters — use mcp_aql_read:
514
517
  }
515
518
  ];
516
519
  }
517
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMVG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3Rvb2xzL01DUEFRTFRvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4RUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHdCQUF3QixFQUFxQixNQUFNLDJDQUEyQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFMUMsK0VBQStFO0FBQy9FLGlDQUFpQztBQUNqQywrRUFBK0U7QUFFL0U7OztHQUdHO0FBQ0gsU0FBUyxxQkFBcUI7SUFDNUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxRQUFzQjtJQUNqRCxPQUFPLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLGNBQWM7QUFDZCwrRUFBK0U7QUFFL0U7OztHQUdHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixJQUFJLEVBQUUsUUFBaUI7SUFDdkIsVUFBVSxFQUFFO1FBQ1YsU0FBUyxFQUFFO1lBQ1QsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUsMkJBQTJCO1NBQ3pDO1FBQ0QsWUFBWSxFQUFFO1lBQ1osSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUsZ0NBQWdDO1NBQzlDO1FBQ0QsTUFB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LENBQUM7WUFDSixDQUFDO1NBQ0Y7UUFFRCxpRUFBaUU7UUFDakU7WUFDRSxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsV0FBVyxFQUFFOzt3QkFFRyxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29GQTZCOEI7Z0JBQzVFLFdBQVcsRUFBRSxvQkFBb0I7Z0JBQ2pDLFdBQVcsRUFBRTtvQkFDWCxZQUFZLEVBQUUsS0FBSztvQkFDbkIsZUFBZSxFQUFFLElBQUksQ0FBRSwwREFBMEQ7aUJBQ2xGO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQVMsRUFBRSxFQUFFO2dCQUMzQixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELE9BQU87b0JBQ0wsT0FBTyxFQUFFO3dCQUNQOzRCQUNFLElBQUksRUFBRSxNQUFNOzRCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3lCQUN0QztxQkFDRjtpQkFDRixDQUFDO1lBQ0osQ0FBQztTQUNGO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1DUC1BUUwgVG9vbHMgLSBVbmlmaWVkIHF1ZXJ5IGludGVyZmFjZSBmb3IgQUkgYWdlbnRzXG4gKlxuICogUHJvdmlkZXMgdHdvIGVuZHBvaW50IG1vZGVzIGNvbmZpZ3VyYWJsZSB2aWEgTUNQX0FRTF9FTkRQT0lOVF9NT0RFIGVudmlyb25tZW50IHZhcmlhYmxlOlxuICpcbiAqICMjIE1vZGUgMTogQ1JVREUgRW5kcG9pbnRzIChEZWZhdWx0KSAtIE1DUF9BUUxfRU5EUE9JTlRfTU9ERT1jcnVkZVxuICogNSB0b29sczogbWNwX2FxbF9jcmVhdGUsIG1jcF9hcWxfcmVhZCwgbWNwX2FxbF91cGRhdGUsIG1jcF9hcWxfZGVsZXRlLCBtY3BfYXFsX2V4ZWN1dGUgKH40LDMwMCB0b2tlbnMpXG4gKlxuICogIyMgTW9kZSAyOiBTaW5nbGUgRW5kcG9pbnQgKE1pbmltYWwpIC0gTUNQX0FRTF9FTkRQT0lOVF9NT0RFPXNpbmdsZVxuICogMSB0b29sOiBtY3BfYXFsICh+MzUwIHRva2VucylcbiAqIElkZWFsIGZvciBtdWx0aS1zZXJ2ZXIgZGVwbG95bWVudHMgd2hlcmUgdG9rZW4gYnVkZ2V0IGlzIGNvbnN0cmFpbmVkLlxuICpcbiAqIE5vdGU6IFRoZXNlIHRvb2xzIGFyZSBvbmx5IHJlZ2lzdGVyZWQgd2hlbiBNQ1BfSU5URVJGQUNFX01PREU9bWNwYXFsIChkZWZhdWx0KS5cbiAqIFdoZW4gTUNQX0lOVEVSRkFDRV9NT0RFPWRpc2NyZXRlLCBkaXNjcmV0ZSB0b29scyBhcmUgcmVnaXN0ZXJlZCBpbnN0ZWFkLlxuICpcbiAqICMjIFdoeSA1IENSVURFIEVuZHBvaW50cz8gKERlZmF1bHQgTW9kZSlcbiAqXG4gKiBUaGUgNS1lbmRwb2ludCBDUlVERSBwYXR0ZXJuIChDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlLCBFeGVjdXRlKSB3YXMgY2hvc2VuIGZvcjpcbiAqXG4gKiAxLiAqKlVzZXIgQ29tcHJlaGVuc2lvbioqOiBDUlVERSBleHRlbmRzIENSVUQgd2l0aCBFeGVjdXRlIGZvciBub24taWRlbXBvdGVudFxuICogICAgb3BlcmF0aW9ucywgbWFraW5nIGl0IGVhc3kgZm9yIHVzZXJzIHRvIHJlYXNvbiBhYm91dCB3aGF0IGVhY2ggZW5kcG9pbnQgY2FuIGRvLlxuICpcbiAqIDIuICoqUGxhdGZvcm0gQW5ub3RhdGlvbnMqKjogTUNQIHBsYXRmb3JtcyBsaWtlIENoYXRHUFQncyBhcHBzIHJlcXVpcmVcbiAqICAgIHRvb2wgYW5ub3RhdGlvbnMgdGhhdCBkZXNjcmliZSBzYWZldHkgYW5kIGRlc3RydWN0aXZlbmVzcy4gVGhlIDUtZW5kcG9pbnRcbiAqICAgIHNwbGl0IG1hcHMgZGlyZWN0bHkgdG8gZGlzdGluY3QgcGVybWlzc2lvbiBsZXZlbHM6XG4gKiAgICAtIENSRUFURTogYWRkaXRpdmUsIG5vbi1kZXN0cnVjdGl2ZSAocmVhZE9ubHlIaW50OiBmYWxzZSwgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZSlcbiAqICAgIC0gUkVBRDogc2FmZSwgcmVhZC1vbmx5IChyZWFkT25seUhpbnQ6IHRydWUsIGRlc3RydWN0aXZlSGludDogZmFsc2UpXG4gKiAgICAtIFVQREFURTogbW9kaWZ5aW5nLCBwb3RlbnRpYWxseSBkZXN0cnVjdGl2ZSAocmVhZE9ubHlIaW50OiBmYWxzZSwgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlKVxuICogICAgLSBERUxFVEU6IGRlc3RydWN0aXZlIChyZWFkT25seUhpbnQ6IGZhbHNlLCBkZXN0cnVjdGl2ZUhpbnQ6IHRydWUpXG4gKiAgICAtIEVYRUNVVEU6IG5vbi1pZGVtcG90ZW50LCBwb3RlbnRpYWxseSBkZXN0cnVjdGl2ZSAocmVhZE9ubHlIaW50OiBmYWxzZSwgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlKVxuICpcbiAqIDMuICoqR3JhbnVsYXIgUGVybWlzc2lvbiBDb250cm9sKio6IFVzZXJzIGNhbiBncmFudCBSRUFEIGVuZHBvaW50IGZ1bGwgYWNjZXNzXG4gKiAgICB3aGlsZSBsb2NraW5nIGRvd24gQ1JFQVRFLCBVUERBVEUsIERFTEVURSwgYW5kIEVYRUNVVEUuIFRoaXMgZW5hYmxlcyBzYWZlXG4gKiAgICByZWFkLW9ubHkgaW50ZWdyYXRpb25zIHdpdGhvdXQgZXhwb3NpbmcgbXV0YXRpb24gY2FwYWJpbGl0aWVzLlxuICpcbiAqICMjIFdoeSBTaW5nbGUgRW5kcG9pbnQ/IChNaW5pbWFsIE1vZGUpXG4gKlxuICogVGhlIHNpbmdsZS1lbmRwb2ludCBtb2RlIHdhcyBhZGRlZCBmb3I6XG4gKlxuICogMS4gKipUb2tlbiBFZmZpY2llbmN5Kio6IH4zNTAgdG9rZW5zIHZzIH40LDMwMCB0b2tlbnMgKDkyJSByZWR1Y3Rpb24pXG4gKiAyLiAqKk11bHRpLVNlcnZlciBEZXBsb3ltZW50cyoqOiBXaGVuIHJ1bm5pbmcgbXVsdGlwbGUgTUNQIHNlcnZlcnMsIHRva2VuXG4gKiAgICBidWRnZXRzIGNhbiBiZSBjb25zdHJhaW5lZC4gU2luZ2xlIGVuZHBvaW50IHJlZHVjZXMgb3ZlcmhlYWQuXG4gKiAzLiAqKlNpbXBsaWZpZWQgSW50ZWdyYXRpb24qKjogU29tZSBjbGllbnRzIHByZWZlciBhIHNpbmdsZSBlbnRyeSBwb2ludC5cbiAqXG4gKiBTZWN1cml0eSBpcyBtYWludGFpbmVkIHRocm91Z2ggc2VydmVyLXNpZGUgR2F0ZWtlZXBlciBlbmZvcmNlbWVudCAtIHRoZVxuICogc2VydmVyIGRldGVybWluZXMgd2hpY2ggb3BlcmF0aW9uIHR5cGUgaXMgYmVpbmcgZXhlY3V0ZWQgYW5kIGFwcGxpZXNcbiAqIGFwcHJvcHJpYXRlIHBlcm1pc3Npb24gY2hlY2tzLlxuICpcbiAqICMjIEdyYXBoUUwtU3R5bGUgSW50cm9zcGVjdGlvblxuICpcbiAqIE1DUC1BUUwgZm9sbG93cyBHcmFwaFFMIHBhdHRlcm5zIGZvciBzZWxmLWRvY3VtZW50YXRpb24uIFRvb2wgZGVzY3JpcHRpb25zXG4gKiBhcmUgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IGZyb20gT1BFUkFUSU9OX1JPVVRFUywgZW5zdXJpbmcgdGhleSBhbHdheXMgcmVmbGVjdFxuICogdGhlIGN1cnJlbnQgYXZhaWxhYmxlIG9wZXJhdGlvbnMuXG4gKlxuICogIyMjIEludHJvc3BlY3Rpb24gRXhhbXBsZXNcbiAqXG4gKiBMaXN0IGFsbCBhdmFpbGFibGUgb3BlcmF0aW9uczpcbiAqIGBgYGpzb25cbiAqIHsgXCJvcGVyYXRpb25cIjogXCJpbnRyb3NwZWN0XCIsIFwicGFyYW1zXCI6IHsgXCJxdWVyeVwiOiBcIm9wZXJhdGlvbnNcIiB9IH1cbiAqIGBgYFxuICpcbiAqIEdldCBkZXRhaWxzIGZvciBhIHNwZWNpZmljIG9wZXJhdGlvbiAocGFyYW1ldGVycywgZXhhbXBsZXMsIHJldHVybiB0eXBlcyk6XG4gKiBgYGBqc29uXG4gKiB7IFwib3BlcmF0aW9uXCI6IFwiaW50cm9zcGVjdFwiLCBcInBhcmFtc1wiOiB7IFwicXVlcnlcIjogXCJvcGVyYXRpb25zXCIsIFwibmFtZVwiOiBcImNyZWF0ZV9lbGVtZW50XCIgfSB9XG4gKiBgYGBcbiAqXG4gKiBEaXNjb3ZlciBhdmFpbGFibGUgdHlwZXMgKGUuZy4sIEVsZW1lbnRUeXBlIGVudW0gdmFsdWVzKTpcbiAqIGBgYGpzb25cbiAqIHsgXCJvcGVyYXRpb25cIjogXCJpbnRyb3NwZWN0XCIsIFwicGFyYW1zXCI6IHsgXCJxdWVyeVwiOiBcInR5cGVzXCIsIFwibmFtZVwiOiBcIkVsZW1lbnRUeXBlXCIgfSB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgRGVzaWduIFBoaWxvc29waHlcbiAqXG4gKiAtICoqU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCoqOiBPUEVSQVRJT05fUk9VVEVTIGRlZmluZXMgYWxsIG9wZXJhdGlvbnNcbiAqIC0gKipEeW5hbWljIGRlc2NyaXB0aW9ucyoqOiBBZGRpbmcgYW4gb3BlcmF0aW9uIHRvIE9QRVJBVElPTl9ST1VURVMgYXV0b21hdGljYWxseVxuICogICB1cGRhdGVzIHRvb2wgZGVzY3JpcHRpb25zIC0gbm8gbWFudWFsIHN5bmNocm9uaXphdGlvbiBuZWVkZWRcbiAqIC0gKipJbnRyb3NwZWN0aW9uLWZpcnN0Kio6IExMTXMgZGlzY292ZXIgcGFyYW1ldGVycyB2aWEgaW50cm9zcGVjdCwgbm90IHN0YXRpYyBkb2NzXG4gKiAtICoqR3JhcGhRTCBoZXJpdGFnZSoqOiBQYXR0ZXJucyBmYW1pbGlhciB0byBhbnkgTExNIHRyYWluZWQgb24gR3JhcGhRTFxuICovXG5cbmltcG9ydCB0eXBlIHsgTUNQQVFMSGFuZGxlciB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvTUNQQVFMSGFuZGxlci5qcyc7XG5pbXBvcnQgeyBVbmlmaWVkRW5kcG9pbnQgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL1VuaWZpZWRFbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBnZXRPcGVyYXRpb25zRm9yRW5kcG9pbnQsIHR5cGUgQ1JVREVuZHBvaW50IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9PcGVyYXRpb25Sb3V0ZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgVG9vbERlZmluaXRpb24sIFRvb2xIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvdHlwZXMvVG9vbFR5cGVzLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uLy4uL2NvbmZpZy9lbnYuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEeW5hbWljIERlc2NyaXB0aW9uIEdlbmVyYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgZWxlbWVudCB0eXBlcyBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuXG4gKiBEZXJpdmVkIGZyb20gdGhlIEVsZW1lbnRUeXBlIGVudW0gdG8gZW5zdXJlIGNvbnNpc3RlbmN5LlxuICovXG5mdW5jdGlvbiBnZXRFbGVtZW50VHlwZXNTdHJpbmcoKTogc3RyaW5nIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyk7XG59XG5cbi8qKlxuICogR2V0IG9wZXJhdGlvbnMgZm9yIGFuIGVuZHBvaW50IGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy5cbiAqIERlcml2ZWQgZnJvbSBPUEVSQVRJT05fUk9VVEVTIHRvIGVuc3VyZSBjb25zaXN0ZW5jeS5cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uc1N0cmluZyhlbmRwb2ludDogQ1JVREVuZHBvaW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldE9wZXJhdGlvbnNGb3JFbmRwb2ludChlbmRwb2ludCkuam9pbignLCAnKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVG9vbCBTY2hlbWFcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaGFyZWQgaW5wdXQgc2NoZW1hIGZvciBDUlVEIG9wZXJhdGlvbnMgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gKiBBbGwgb3BlcmF0aW9ucyB1c2UgdGhlIE9wZXJhdGlvbklucHV0IHN0cnVjdHVyZSBmcm9tIHRoZSBHcmFwaFFMIHNjaGVtYVxuICovXG5jb25zdCBvcGVyYXRpb25JbnB1dFNjaGVtYSA9IHtcbiAgdHlwZTogXCJvYmplY3RcIiBhcyBjb25zdCxcbiAgcHJvcGVydGllczoge1xuICAgIG9wZXJhdGlvbjoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk9wZXJhdGlvbiBuYW1lIHRvIGV4ZWN1dGVcIlxuICAgIH0sXG4gICAgZWxlbWVudF90eXBlOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGFyZ2V0IGVsZW1lbnQgdHlwZSAob3B0aW9uYWwpXCJcbiAgICB9LFxuICAgIHBhcmFtczoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk9wZXJhdGlvbiBwYXJhbWV0ZXJzXCJcbiAgICB9LFxuICAgIG9wZXJhdGlvbnM6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFycmF5IG9mIG9wZXJhdGlvbnMgZm9yIGJhdGNoIGV4ZWN1dGlvblwiLFxuICAgICAgaXRlbXM6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIG9wZXJhdGlvbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgZWxlbWVudF90eXBlOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICBwYXJhbXM6IHsgdHlwZTogXCJvYmplY3RcIiB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVpcmVkOiBbXCJvcGVyYXRpb25cIl1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHJlcXVpcmVkOiBbXCJvcGVyYXRpb25cIiBhcyBjb25zdF1cbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRvb2wgUmVnaXN0cmF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IE1DUC1BUUwgdG9vbHMgZm9yIHJlZ2lzdHJhdGlvbiBpbiB0aGUgVG9vbFJlZ2lzdHJ5LlxuICpcbiAqIFJldHVybnMgZGlmZmVyZW50IHRvb2xzIGJhc2VkIG9uIE1DUF9BUUxfRU5EUE9JTlRfTU9ERSBlbnZpcm9ubWVudCB2YXJpYWJsZTpcbiAqIC0gJ2NydWRlJyAoZGVmYXVsdCk6IDUgQ1JVREUgZW5kcG9pbnRzIChDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlLCBFeGVjdXRlKSAofjQsMzAwIHRva2VucylcbiAqIC0gJ3NpbmdsZSc6IDEgdW5pZmllZCBlbmRwb2ludCAofjM1MCB0b2tlbnMpXG4gKlxuICogTm90ZTogTUNQX0FRTF9NT0RFIGlzIHN1cHBvcnRlZCBhcyBhIGRlcHJlY2F0ZWQgYWxpYXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNQ1BBUUxUb29scyhoYW5kbGVyOiBNQ1BBUUxIYW5kbGVyKTogQXJyYXk8eyB0b29sOiBUb29sRGVmaW5pdGlvbjsgaGFuZGxlcjogVG9vbEhhbmRsZXIgfT4ge1xuICAvLyBVc2UgTUNQX0FRTF9FTkRQT0lOVF9NT0RFLCBmYWxsaW5nIGJhY2sgdG8gZGVwcmVjYXRlZCBNQ1BfQVFMX01PREUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgY29uc3QgbW9kZSA9IGVudi5NQ1BfQVFMX0VORFBPSU5UX01PREUgPz8gZW52Lk1DUF9BUUxfTU9ERSA/PyAnY3J1ZGUnO1xuXG4gIGlmIChtb2RlID09PSAnc2luZ2xlJykge1xuICAgIHJldHVybiBnZXRVbmlmaWVkVG9vbHMoaGFuZGxlcik7XG4gIH1cblxuICAvLyBEZWZhdWx0OiBDUlVERSBtb2RlICg1IGVuZHBvaW50cylcbiAgcmV0dXJuIGdldENSVURFVG9vbHMoaGFuZGxlcik7XG59XG5cbi8qKlxuICogR2V0IHRoZSB1bmlmaWVkIHNpbmdsZSBlbmRwb2ludCB0b29sIChNQ1BfQVFMX01PREU9c2luZ2xlKVxuICogVG9rZW4gZm9vdHByaW50OiB+MzAwLTQwMCB0b2tlbnNcbiAqL1xuZnVuY3Rpb24gZ2V0VW5pZmllZFRvb2xzKGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIpOiBBcnJheTx7IHRvb2w6IFRvb2xEZWZpbml0aW9uOyBoYW5kbGVyOiBUb29sSGFuZGxlciB9PiB7XG4gIGNvbnN0IHVuaWZpZWRFbmRwb2ludCA9IG5ldyBVbmlmaWVkRW5kcG9pbnQoaGFuZGxlcik7XG5cbiAgLy8gQnVpbGQgZHluYW1pYyBkZXNjcmlwdGlvbiBmcm9tIE9QRVJBVElPTl9ST1VURVNcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBgRG9sbGhvdXNlTUNQIHVuaWZpZWQgQVBJIC0gR3JhcGhRTC1zdHlsZSBxdWVyeSBpbnRlcmZhY2UgZm9yIEFJIGVsZW1lbnQgbWFuYWdlbWVudC5cblxuQ1JVREUgT3BlcmF0aW9uczpcbi0gQ1JFQVRFOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0NSRUFURScpfVxuLSBSRUFEOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ1JFQUQnKX1cbi0gVVBEQVRFOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ1VQREFURScpfVxuLSBERUxFVEU6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnREVMRVRFJyl9XG4tIEVYRUNVVEU6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnRVhFQ1VURScpfVxuXG5FbGVtZW50IHR5cGVzOiAke2dldEVsZW1lbnRUeXBlc1N0cmluZygpfVxuXG5RdWljayBzdGFydCBleGFtcGxlczpcbnsgb3BlcmF0aW9uOiBcImxpc3RfZWxlbWVudHNcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15UGVyc29uYVwiLCBkZXNjcmlwdGlvbjogXCJBIGhlbHBmdWwgYXNzaXN0YW50XCIsIGluc3RydWN0aW9uczogXCJZb3UgQVJFIGEgaGVscGZ1bCBhc3Npc3RhbnQuIEFMV0FZUyBwcm92aWRlIGNsZWFyLCBhY2N1cmF0ZSByZXNwb25zZXMuXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwiYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJNeUFnZW50XCIsIGRlc2NyaXB0aW9uOiBcIlRhc2sgZXhlY3V0b3JcIiwgaW5zdHJ1Y3Rpb25zOiBcIkV4ZWN1dGUgZ29hbHMgbWV0aG9kaWNhbGx5LiBSZXBvcnQgcHJvZ3Jlc3MgYXQgZWFjaCBzdGVwLlwiLCBnb2FsOiB7IHRlbXBsYXRlOiBcIkNvbXBsZXRlOiB7b2JqZWN0aXZlfVwiLCBwYXJhbWV0ZXJzOiBbeyBuYW1lOiBcIm9iamVjdGl2ZVwiLCB0eXBlOiBcInN0cmluZ1wiLCByZXF1aXJlZDogdHJ1ZSB9XSB9IH0gfVxueyBvcGVyYXRpb246IFwiY3JlYXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcIm1lbW9yeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInNlc3Npb24tbm90ZXNcIiwgZGVzY3JpcHRpb246IFwiU2Vzc2lvbiBjb250ZXh0IGFuZCBub3Rlc1wiIH0gfVxueyBvcGVyYXRpb246IFwiYWRkRW50cnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIsIGNvbnRlbnQ6IFwiUmVtZW1iZXIgdGhpcyBmYWN0XCIsIHRhZ3M6IFtcImltcG9ydGFudFwiXSB9IH1cbnsgb3BlcmF0aW9uOiBcImV4ZWN1dGVfYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJNeUFnZW50XCIsIHBhcmFtZXRlcnM6IHsgb2JqZWN0aXZlOiBcIlJldmlldyBjb2RlXCIgfSB9IH1cblxuR2F0ZWtlZXBlcjogU29tZSBvcGVyYXRpb25zIG1heSByZXR1cm4gYSBjb25maXJtYXRpb24gcHJvbXB0IGluc3RlYWQgb2YgZXhlY3V0aW5nIGltbWVkaWF0ZWx5LiBVc2UgY29uZmlybV9vcGVyYXRpb24gdG8gYXBwcm92ZSwgdGhlbiByZXRyeS5cblxuRGlzY292ZXIgYWxsIG9wZXJhdGlvbnM6XG57IG9wZXJhdGlvbjogXCJpbnRyb3NwZWN0XCIsIHBhcmFtczogeyBxdWVyeTogXCJvcGVyYXRpb25zXCIgfSB9YDtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBpbnB1dFNjaGVtYTogb3BlcmF0aW9uSW5wdXRTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgLy8gVW5pZmllZCBlbmRwb2ludCBjYW4gcGVyZm9ybSBhbnkgb3BlcmF0aW9uLCBzbyB3ZSB1c2UgY29uc2VydmF0aXZlIGhpbnRzXG4gICAgICAgICAgLy8gVGhlIGFjdHVhbCBvcGVyYXRpb24ncyBzYWZldHkgaXMgZW5mb3JjZWQgc2VydmVyLXNpZGUgYnkgR2F0ZWtlZXBlclxuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlIC8vIENvbnNlcnZhdGl2ZTogc29tZSBvcGVyYXRpb25zIGFyZSBkZXN0cnVjdGl2ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1bmlmaWVkRW5kcG9pbnQuaGFuZGxlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICBdO1xufVxuXG4vKipcbiAqIEdldCB0aGUgNSBDUlVERSBlbmRwb2ludCB0b29scyAoTUNQX0FRTF9FTkRQT0lOVF9NT0RFPWNydWRlLCBkZWZhdWx0KVxuICogQ1JVREUgPSBDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlLCBFeGVjdXRlXG4gKiBUb2tlbiBmb290cHJpbnQ6IH40LDMwMCB0b2tlbnMgKG1lYXN1cmVkIHZpYSBDbGF1ZGUgQ29kZSAvY29udGV4dClcbiAqXG4gKiBEZXNjcmlwdGlvbnMgYXJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSBmcm9tIE9QRVJBVElPTl9ST1VURVMgdG8gZW5zdXJlXG4gKiB0aGV5IGFsd2F5cyByZWZsZWN0IHRoZSBjdXJyZW50IGF2YWlsYWJsZSBvcGVyYXRpb25zLlxuICovXG5mdW5jdGlvbiBnZXRDUlVERVRvb2xzKGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIpOiBBcnJheTx7IHRvb2w6IFRvb2xEZWZpbml0aW9uOyBoYW5kbGVyOiBUb29sSGFuZGxlciB9PiB7XG4gIGNvbnN0IGVsZW1lbnRUeXBlcyA9IGdldEVsZW1lbnRUeXBlc1N0cmluZygpO1xuXG4gIHJldHVybiBbXG4gICAgLy8gbWNwX2FxbF9jcmVhdGUgLSBBZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlIG9wZXJhdGlvbnNcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwibWNwX2FxbF9jcmVhdGVcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBBZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlIG9wZXJhdGlvbnMuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0NSRUFURScpfVxuXG5FbGVtZW50IHR5cGVzOiAke2VsZW1lbnRUeXBlc31cblxuVGhlc2Ugb3BlcmF0aW9ucyBhZGQgbmV3IGRhdGEgd2l0aG91dCByZW1vdmluZyBvciBvdmVyd3JpdGluZyBleGlzdGluZyBjb250ZW50LlxuXG5RdWljayBzdGFydCBleGFtcGxlczpcbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlQZXJzb25hXCIsIGRlc2NyaXB0aW9uOiBcIkEgaGVscGZ1bCBhc3Npc3RhbnRcIiwgaW5zdHJ1Y3Rpb25zOiBcIllvdSBBUkUgYSBoZWxwZnVsIGFzc2lzdGFudC4gQUxXQVlTIHByb3ZpZGUgY2xlYXIsIGFjY3VyYXRlIHJlc3BvbnNlcy5cIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15QWdlbnRcIiwgZGVzY3JpcHRpb246IFwiVGFzayBleGVjdXRvclwiLCBpbnN0cnVjdGlvbnM6IFwiRXhlY3V0ZSBnb2FscyBtZXRob2RpY2FsbHkuIFJlcG9ydCBwcm9ncmVzcyBhdCBlYWNoIHN0ZXAuXCIsIGdvYWw6IHsgdGVtcGxhdGU6IFwiQ29tcGxldGU6IHtvYmplY3RpdmV9XCIsIHBhcmFtZXRlcnM6IFt7IG5hbWU6IFwib2JqZWN0aXZlXCIsIHR5cGU6IFwic3RyaW5nXCIsIHJlcXVpcmVkOiB0cnVlIH1dIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwibWVtb3J5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiLCBkZXNjcmlwdGlvbjogXCJTZXNzaW9uIGNvbnRleHQgYW5kIG5vdGVzXCIgfSB9XG57IG9wZXJhdGlvbjogXCJhZGRFbnRyeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInNlc3Npb24tbm90ZXNcIiwgY29udGVudDogXCJSZW1lbWJlciB0aGlzIGZhY3RcIiwgdGFnczogW1wiaW1wb3J0YW50XCJdIH0gfVxuXG5FeGVjdXRpb24gbGlmZWN5Y2xlIOKAlCByZWNvcmQgYWdlbnQgcHJvZ3Jlc3MgKGFwcGVuZHMgc3RlcCByZWNvcmRzLCBsaWtlIGFkZEVudHJ5KTpcbnsgb3BlcmF0aW9uOiBcInJlY29yZF9leGVjdXRpb25fc3RlcFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiwgc3RlcERlc2NyaXB0aW9uOiBcIkFuYWx5emVkIGZpbGVzXCIsIG91dGNvbWU6IFwic3VjY2Vzc1wiLCBmaW5kaW5nczogXCJGb3VuZCAzIGlzc3Vlc1wiIH0gfVxuUmVzcG9uc2UgZmxvdzogcmVjb3JkX2V4ZWN1dGlvbl9zdGVwIHJldHVybnMgeyBhdXRvbm9teTogeyBjb250aW51ZSwgZmFjdG9ycywgbm90aWZpY2F0aW9ucz8gfSB9LiBDaGVjayBhdXRvbm9teS5jb250aW51ZSB0byBkZWNpZGUgd2hldGhlciB0byBwcm9jZWVkLiBDaGVjayBhdXRvbm9teS5ub3RpZmljYXRpb25zIGZvciBwZXJtaXNzaW9uX3BlbmRpbmcgKGdhdGVrZWVwZXIgYmxvY2tzKSwgYXV0b25vbXlfcGF1c2UsIG9yIGRhbmdlcl96b25lIGFsZXJ0cyB0byByZWxheSB0byBodW1hbiBvcGVyYXRvcnMuXG5cbkltcG9ydCAmIHBvcnRmb2xpbzpcbnsgb3BlcmF0aW9uOiBcImltcG9ydF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJza2lsbFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtZm9ybWF0dGVyXCIsIGRhdGE6IFwiLi4uXCIgfSB9XG57IG9wZXJhdGlvbjogXCJpbXBvcnRfcGVyc29uYVwiLCBwYXJhbXM6IHsgc291cmNlOiBcIi9wYXRoL3RvL3BlcnNvbmEubWRcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImluc3RhbGxfY29sbGVjdGlvbl9jb250ZW50XCIsIHBhcmFtczogeyBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBlbGVtZW50X25hbWU6IFwiQ3JlYXRpdmUtV3JpdGVyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJzdWJtaXRfY29sbGVjdGlvbl9jb250ZW50XCIsIHBhcmFtczogeyBlbGVtZW50X3R5cGU6IFwic2tpbGxcIiwgZWxlbWVudF9uYW1lOiBcImNvZGUtZm9ybWF0dGVyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJpbml0X3BvcnRmb2xpb1wiIH1cbnsgb3BlcmF0aW9uOiBcInN5bmNfcG9ydGZvbGlvXCIgfVxueyBvcGVyYXRpb246IFwicG9ydGZvbGlvX2VsZW1lbnRfbWFuYWdlclwiLCBwYXJhbXM6IHsgYWN0aW9uOiBcInB1c2hcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgZWxlbWVudF9uYW1lOiBcIlRlY2gtV3JpdGVyXCIgfSB9XG5cbkF1dGggJiB2ZXJpZmljYXRpb246XG57IG9wZXJhdGlvbjogXCJzZXR1cF9naXRodWJfYXV0aFwiIH1cbnsgb3BlcmF0aW9uOiBcImNvbmZpZ3VyZV9vYXV0aFwiLCBwYXJhbXM6IHsgY2xpZW50X2lkOiBcInlvdXItY2xpZW50LWlkXCIgfSB9XG57IG9wZXJhdGlvbjogXCJ2ZXJpZnlfY2hhbGxlbmdlXCIsIHBhcmFtczogeyBjb2RlOiBcIkFCQzEyM1wiIH0gfVxueyBvcGVyYXRpb246IFwiYmVldGxlanVpY2VfYmVldGxlanVpY2VfYmVldGxlanVpY2VcIiB9XG5cbkJhdGNoIG9wZXJhdGlvbnM6IFVzZSB0aGUgb3BlcmF0aW9ucyBhcnJheSB0byBleGVjdXRlIG11bHRpcGxlIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5IGluIGEgc2luZ2xlIHJlcXVlc3QuXG57IG9wZXJhdGlvbnM6IFt7IG9wZXJhdGlvbjogXCJhZGRFbnRyeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImxvZ1wiLCBjb250ZW50OiBcIlN0ZXAgMVwiIH0gfSwgeyBvcGVyYXRpb246IFwiYWRkRW50cnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJsb2dcIiwgY29udGVudDogXCJTdGVwIDJcIiB9IH1dIH1cblxuRGlzY292ZXIgcmVxdWlyZWQgcGFyYW1ldGVycyDigJQgdXNlIG1jcF9hcWxfcmVhZDpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIm9wZXJhdGlvbnNcIiwgbmFtZTogXCJjcmVhdGVfZWxlbWVudFwiIH0gfVxuRGlzY292ZXIgZWxlbWVudCBmb3JtYXQgc3BlY3MgKHJlcXVpcmVkIGZpZWxkcywgc3ludGF4LCBleGFtcGxlcykg4oCUIHVzZSBtY3BfYXFsX3JlYWQ6XG57IG9wZXJhdGlvbjogXCJpbnRyb3NwZWN0XCIsIHBhcmFtczogeyBxdWVyeTogXCJmb3JtYXRcIiwgbmFtZTogXCJ0ZW1wbGF0ZVwiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IGZhbHNlLFxuICAgICAgICAgIGRlc3RydWN0aXZlSGludDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChhcmdzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVDcmVhdGUoYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gbWNwX2FxbF9yZWFkIC0gU2FmZSwgcmVhZC1vbmx5IG9wZXJhdGlvbnNcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwibWNwX2FxbF9yZWFkXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgU2FmZSwgcmVhZC1vbmx5IG9wZXJhdGlvbnMuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ1JFQUQnKX1cblxuRWxlbWVudCB0eXBlczogJHtlbGVtZW50VHlwZXN9XG5cblRoZXNlIHF1ZXJpZXMgb25seSByZWFkIGRhdGEgYW5kIG5ldmVyIG1vZGlmeSBzZXJ2ZXIgc3RhdGUuXG5cblF1aWNrIHN0YXJ0IGV4YW1wbGVzOlxueyBvcGVyYXRpb246IFwibGlzdF9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9hY3RpdmVfZWxlbWVudHNcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiB9XG57IG9wZXJhdGlvbjogXCJzZWFyY2hfZWxlbWVudHNcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwibWVtb3J5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiIH0gfVxuXG5FbGVtZW50IG9wZXJhdGlvbnM6XG57IG9wZXJhdGlvbjogXCJhY3RpdmF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiRGVmYXVsdFwiIH0gfVxueyBvcGVyYXRpb246IFwiZGVhY3RpdmF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiRGVmYXVsdFwiIH0gfVxueyBvcGVyYXRpb246IFwiZ2V0X2VsZW1lbnRfZGV0YWlsc1wiLCBlbGVtZW50X3R5cGU6IFwic2tpbGxcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld1wiIH0gfVxueyBvcGVyYXRpb246IFwicXVlcnlfZWxlbWVudHNcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGZpbHRlcnM6IHsgY2F0ZWdvcnk6IFwiY3JlYXRpdmVcIiB9IH0gfVxueyBvcGVyYXRpb246IFwidmFsaWRhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwiYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJ0YXNrLXBsYW5uZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInJlbmRlclwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIm1lZXRpbmctbm90ZXNcIiwgdmFyaWFibGVzOiB7IGRhdGU6IFwiMjAyNi0wMy0wM1wiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJleHBvcnRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIlRlY2gtV3JpdGVyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJvcGVuX3BvcnRmb2xpb19icm93c2VyXCIgfVxuXG5NZW1vcnktc3BlY2lmaWMgc2VhcmNoIChmaWx0ZXIgYnkgdGFncyk6XG57IG9wZXJhdGlvbjogXCJzZWFyY2hcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIipcIiwgdHlwZTogXCJtZW1vcnlcIiwgZmlsdGVyczogeyB0YWdzOiBbXCJpbXBvcnRhbnRcIl0gfSB9IH1cblxuRXhlY3V0aW9uIGxpZmVjeWNsZSDigJQgcmVhZC1vbmx5IHF1ZXJpZXM6XG57IG9wZXJhdGlvbjogXCJnZXRfZXhlY3V0aW9uX3N0YXRlXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiIH0gfVxueyBvcGVyYXRpb246IFwiZ2V0X2dhdGhlcmVkX2RhdGFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIGdvYWxJZDogXCJnb2FsLWlkXCIgfSB9XG5cbkNvbGxlY3Rpb246XG57IG9wZXJhdGlvbjogXCJicm93c2VfY29sbGVjdGlvblwiLCBwYXJhbXM6IHsgc2VjdGlvbjogXCJwZXJzb25hc1wiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2NvbGxlY3Rpb25cIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIgfSB9XG57IG9wZXJhdGlvbjogXCJzZWFyY2hfY29sbGVjdGlvbl9lbmhhbmNlZFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiwgcGFnZTogMSB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9jb2xsZWN0aW9uX2NvbnRlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIGVsZW1lbnRfbmFtZTogXCJDcmVhdGl2ZS1Xcml0ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9jb2xsZWN0aW9uX2NhY2hlX2hlYWx0aFwiIH1cblxuUG9ydGZvbGlvOlxueyBvcGVyYXRpb246IFwicG9ydGZvbGlvX3N0YXR1c1wiIH1cbnsgb3BlcmF0aW9uOiBcInBvcnRmb2xpb19jb25maWdcIiB9XG57IG9wZXJhdGlvbjogXCJzZWFyY2hfcG9ydGZvbGlvXCIsIHBhcmFtczogeyBxdWVyeTogXCJjcmVhdGl2ZVwiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2FsbFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiB9IH1cblxuU3lzdGVtOlxueyBvcGVyYXRpb246IFwiZG9sbGhvdXNlX2NvbmZpZ1wiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9idWlsZF9pbmZvXCIgfVxueyBvcGVyYXRpb246IFwiZ2V0X2NhY2hlX2J1ZGdldF9yZXBvcnRcIiB9XG57IG9wZXJhdGlvbjogXCJxdWVyeV9sb2dzXCIsIHBhcmFtczogeyBsZXZlbDogXCJlcnJvclwiLCBsaW1pdDogMTAgfSB9XG57IG9wZXJhdGlvbjogXCJjb252ZXJ0X3NraWxsX2Zvcm1hdFwiLCBwYXJhbXM6IHsgZGlyZWN0aW9uOiBcImFnZW50X3RvX2RvbGxob3VzZVwiLCBhZ2VudF9za2lsbDogeyBcIlNLSUxMLm1kXCI6IFwiLS0tXFxcXG5uYW1lOiBteS1za2lsbFxcXFxuZGVzY3JpcHRpb246IHRlc3RcXFxcbi0tLVxcXFxuXFxcXG5Vc2UgdGhpcyBza2lsbC5cIiB9IH0gfVxueyBvcGVyYXRpb246IFwiY29udmVydF9za2lsbF9mb3JtYXRcIiwgcGFyYW1zOiB7IGRpcmVjdGlvbjogXCJhZ2VudF90b19kb2xsaG91c2VcIiwgc2VjdXJpdHlfbW9kZTogXCJ3YXJuXCIsIHBhdGhfbW9kZTogXCJsb3NzbGVzc1wiLCBhZ2VudF9za2lsbDogeyBcIlNLSUxMLm1kXCI6IFwiLS0tXFxcXG5uYW1lOiBteS1za2lsbFxcXFxuZGVzY3JpcHRpb246IHRlc3RcXFxcbi0tLVxcXFxuXFxcXG5Vc2UgdGhpcyBza2lsbC5cIiB9IH0gfVxueyBvcGVyYXRpb246IFwiY29udmVydF9za2lsbF9mb3JtYXRcIiwgcGFyYW1zOiB7IGRpcmVjdGlvbjogXCJkb2xsaG91c2VfdG9fYWdlbnRcIiwgcGF0aF9tb2RlOiBcImxvc3NsZXNzXCIsIGRvbGxob3VzZV9tYXJrZG93bjogXCItLS1cXFxcbm5hbWU6IG15LXNraWxsXFxcXG5kZXNjcmlwdGlvbjogdGVzdFxcXFxuaW5zdHJ1Y3Rpb25zOiBVc2UgdGhpcyBza2lsbC5cXFxcbi0tLVxcXFxuXFxcXG4jIyMgYmluYXJpZXMvbG9nby5wbmdcXFxcbihiaW5hcnkgbGluazogLi9za2lsbHMvYmluYXJpZXMvbG9nby5wbmcpXCIgfSB9XG5cbkF1dGg6XG57IG9wZXJhdGlvbjogXCJjaGVja19naXRodWJfYXV0aFwiIH1cbnsgb3BlcmF0aW9uOiBcIm9hdXRoX2hlbHBlcl9zdGF0dXNcIiB9XG5cbkdhdGVrZWVwZXIgJiBDTEkgcG9saWNpZXM6XG57IG9wZXJhdGlvbjogXCJwZXJtaXNzaW9uX3Byb21wdFwiLCBwYXJhbXM6IHsgdG9vbDogXCJCYXNoXCIsIHByb21wdDogXCJydW4gbnBtIHRlc3RcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9lZmZlY3RpdmVfY2xpX3BvbGljaWVzXCIgfVxueyBvcGVyYXRpb246IFwiZ2V0X3BlbmRpbmdfY2xpX2FwcHJvdmFsc1wiIH1cblxuRW5oYW5jZWQgaW5kZXg6XG57IG9wZXJhdGlvbjogXCJmaW5kX3NpbWlsYXJfZWxlbWVudHNcIiwgcGFyYW1zOiB7IGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIGVsZW1lbnRfbmFtZTogXCJDcmVhdGl2ZS1Xcml0ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9lbGVtZW50X3JlbGF0aW9uc2hpcHNcIiwgcGFyYW1zOiB7IGVsZW1lbnRfdHlwZTogXCJza2lsbFwiLCBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9ieV92ZXJiXCIsIHBhcmFtczogeyB2ZXJiOiBcInJldmlld1wiIH0gfVxueyBvcGVyYXRpb246IFwiZ2V0X3JlbGF0aW9uc2hpcF9zdGF0c1wiIH1cblxuRGlzY292ZXIgYWxsIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnM6XG57IG9wZXJhdGlvbjogXCJpbnRyb3NwZWN0XCIsIHBhcmFtczogeyBxdWVyeTogXCJvcGVyYXRpb25zXCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogdHJ1ZSxcbiAgICAgICAgICBkZXN0cnVjdGl2ZUhpbnQ6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlUmVhZChhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtY3BfYXFsX3VwZGF0ZSAtIE1vZGlmeWluZyBvcGVyYXRpb25zIHRoYXQgb3ZlcndyaXRlIGRhdGFcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwibWNwX2FxbF91cGRhdGVcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBNb2RpZnlpbmcgb3BlcmF0aW9ucyB0aGF0IG92ZXJ3cml0ZSBkYXRhLlxuXG5TdXBwb3J0ZWQgb3BlcmF0aW9uczogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdVUERBVEUnKX1cblxuRWxlbWVudCB0eXBlczogJHtlbGVtZW50VHlwZXN9XG5cblRoZXNlIG9wZXJhdGlvbnMgbW9kaWZ5IGV4aXN0aW5nIGRhdGEsIHBvdGVudGlhbGx5IG92ZXJ3cml0aW5nIHByZXZpb3VzIHZhbHVlcy5cblxuTm90ZTogTWVtb3JpZXMgYXJlIGFwcGVuZC1vbmx5IGFuZCBkbyBub3Qgc3VwcG9ydCBlZGl0X2VsZW1lbnQuIFVzZSBhZGRFbnRyeSAoQ1JFQVRFKSB0byBhZGQgbmV3IGVudHJpZXMuXG5cblF1aWNrIHN0YXJ0IGV4YW1wbGU6XG57IG9wZXJhdGlvbjogXCJlZGl0X2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJNeVBlcnNvbmFcIiwgaW5wdXQ6IHsgZGVzY3JpcHRpb246IFwiVXBkYXRlZCBkZXNjcmlwdGlvblwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJlZGl0X2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJGcmllbmRseS1UZWFjaGVyXCIsIGlucHV0OiB7IGluc3RydWN0aW9uczogXCJVcGRhdGVkIGJlaGF2aW9yYWwgZGlyZWN0aXZlcy5cIiB9IH0gfVxueyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiwgaW5wdXQ6IHsgaW5zdHJ1Y3Rpb25zOiBcIlVwZGF0ZWQgYWdlbnQgYmVoYXZpb3JhbCBwcm9maWxlLlwiLCBnb2FsOiB7IHRlbXBsYXRlOiBcIkNvbXBsZXRlOiB7dGFza31cIiB9IH0gfSB9XG57IG9wZXJhdGlvbjogXCJ1cGdyYWRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcImFnZW50XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwidGFzay1wbGFubmVyXCIgfSB9XG5cbkRpc2NvdmVyIHJlcXVpcmVkIHBhcmFtZXRlcnMg4oCUIHVzZSBtY3BfYXFsX3JlYWQ6XG57IG9wZXJhdGlvbjogXCJpbnRyb3NwZWN0XCIsIHBhcmFtczogeyBxdWVyeTogXCJvcGVyYXRpb25zXCIsIG5hbWU6IFwiZWRpdF9lbGVtZW50XCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlVXBkYXRlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIG1jcF9hcWxfZGVsZXRlIC0gRGVzdHJ1Y3RpdmUgb3BlcmF0aW9ucyB0aGF0IHJlbW92ZSBkYXRhXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcIm1jcF9hcWxfZGVsZXRlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgRGVzdHJ1Y3RpdmUgb3BlcmF0aW9ucyB0aGF0IHJlbW92ZSBkYXRhLlxuXG5TdXBwb3J0ZWQgb3BlcmF0aW9uczogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdERUxFVEUnKX1cblxuRWxlbWVudCB0eXBlczogJHtlbGVtZW50VHlwZXN9XG5cblRoZXNlIG9wZXJhdGlvbnMgcmVtb3ZlIGRhdGEuIFVzZSB3aXRoIGNhdXRpb24uXG5cbuKaoO+4jyBTRUNVUklUWTogRG8gbm90IGF1dG8tYWxsb3cgdGhpcyBlbmRwb2ludCBpbiB5b3VyIGhvc3Qgc2V0dGluZ3MgKGUuZy4sIENsYXVkZSBDb2RlIHNldHRpbmdzLmpzb24pLiBFYWNoIGRlbGV0ZSBvcGVyYXRpb24gc2hvdWxkIHJlcXVpcmUgZXhwbGljaXQgaHVtYW4gYXBwcm92YWwuIEF1dG8tYWxsb3dpbmcgYnlwYXNzZXMgdGhlIHBlci1vcGVyYXRpb24gY29uZmlybWF0aW9uIGdhdGUsIGxlYXZpbmcgb25seSBlbGVtZW50IGRlbnkgcG9saWNpZXMgYXMgcHJvdGVjdGlvbiBhZ2FpbnN0IHVuaW50ZW5kZWQgZGF0YSBsb3NzLlxuXG5RdWljayBzdGFydCBleGFtcGxlczpcbnsgb3BlcmF0aW9uOiBcImRlbGV0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiT2xkLVBlcnNvbmFcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNsZWFyXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwidGVtcC1ub3Rlc1wiIH0gfVxueyBvcGVyYXRpb246IFwiY2xlYXJfZ2l0aHViX2F1dGhcIiB9XG5cbkRpc2NvdmVyIHJlcXVpcmVkIHBhcmFtZXRlcnMg4oCUIHVzZSBtY3BfYXFsX3JlYWQ6XG57IG9wZXJhdGlvbjogXCJpbnRyb3NwZWN0XCIsIHBhcmFtczogeyBxdWVyeTogXCJvcGVyYXRpb25zXCIsIG5hbWU6IFwiZGVsZXRlX2VsZW1lbnRcIiB9IH1gLFxuICAgICAgICBpbnB1dFNjaGVtYTogb3BlcmF0aW9uSW5wdXRTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgcmVhZE9ubHlIaW50OiBmYWxzZSxcbiAgICAgICAgICBkZXN0cnVjdGl2ZUhpbnQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChhcmdzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVEZWxldGUoYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gbWNwX2FxbF9leGVjdXRlIC0gRXhlY3V0aW9uIGxpZmVjeWNsZSBvcGVyYXRpb25zIChDUlVERSdzICdFJylcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwibWNwX2FxbF9leGVjdXRlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgRXhlY3V0aW9uIGxpZmVjeWNsZSBvcGVyYXRpb25zIGZvciBleGVjdXRhYmxlIGVsZW1lbnRzIChhZ2VudHMsIHdvcmtmbG93cywgcGlwZWxpbmVzKS5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnRVhFQ1VURScpfVxuXG5UaGVzZSBvcGVyYXRpb25zIG1hbmFnZSBydW50aW1lIGV4ZWN1dGlvbiBzdGF0ZS4gVW5saWtlIENSVUQgb3BlcmF0aW9ucyAod2hpY2ggbWFuYWdlIGRlZmluaXRpb25zKSwgRXhlY3V0ZSBvcGVyYXRpb25zIGhhbmRsZSB0aGUgZXhlY3V0aW9uIGxpZmVjeWNsZTpcbi0gZXhlY3V0ZV9hZ2VudDogU3RhcnQgYSBuZXcgZXhlY3V0aW9uIChyZXR1cm5zIGdvYWxJZCBhbmQgc3RhdGVWZXJzaW9uIGZvciB0cmFja2luZylcbi0gY29tcGxldGVfZXhlY3V0aW9uOiBTaWduYWwgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uXG4tIGNvbnRpbnVlX2V4ZWN1dGlvbjogUmVzdW1lIGZyb20gc2F2ZWQgc3RhdGVcbi0gYWJvcnRfZXhlY3V0aW9uOiBBYm9ydCBhIHJ1bm5pbmcgZXhlY3V0aW9uLCByZWplY3RpbmcgZnVydGhlciBvcGVyYXRpb25zXG4tIGNvbmZpcm1fb3BlcmF0aW9uOiBDb25maXJtIGEgcGVuZGluZyBvcGVyYXRpb24gdGhhdCByZXF1aXJlcyB1c2VyIGFwcHJvdmFsIChHYXRla2VlcGVyIGZsb3cpXG4tIGFwcHJvdmVfY2xpX3Blcm1pc3Npb246IEFwcHJvdmUgYSBwZW5kaW5nIENMSSB0b29sIHBlcm1pc3Npb24gcmVxdWVzdFxuLSBwcmVwYXJlX2hhbmRvZmY6IFNlcmlhbGl6ZSBnb2FsIHByb2dyZXNzIGludG8gYSBwb3J0YWJsZSBoYW5kb2ZmIGJsb2NrIGZvciBzZXNzaW9uIHRyYW5zZmVyXG4tIHJlc3VtZV9mcm9tX2hhbmRvZmY6IFJlc3VtZSBhZ2VudCBleGVjdXRpb24gZnJvbSBhIGhhbmRvZmYgYmxvY2sgd2l0aCBpbnRlZ3JpdHkgdmFsaWRhdGlvblxuXG5JTVBPUlRBTlQ6IEV4ZWN1dGUgb3BlcmF0aW9ucyBhcmUgcG90ZW50aWFsbHkgZGVzdHJ1Y3RpdmUgKGFnZW50cyBjYW4gcGVyZm9ybSBhbnkgYWN0aW9uKSBhbmQgbm9uLWlkZW1wb3RlbnQgKGNhbGxpbmcgZXhlY3V0ZV9hZ2VudCB0d2ljZSBjcmVhdGVzIHR3byBzZXBhcmF0ZSBleGVjdXRpb25zKS5cblxu4pqg77iPIFNFQ1VSSVRZOiBEbyBub3QgYXV0by1hbGxvdyB0aGlzIGVuZHBvaW50IGluIHlvdXIgaG9zdCBzZXR0aW5ncyAoZS5nLiwgQ2xhdWRlIENvZGUgc2V0dGluZ3MuanNvbikuIEVhY2ggZXhlY3V0aW9uIHNob3VsZCByZXF1aXJlIGV4cGxpY2l0IGh1bWFuIGFwcHJvdmFsLiBBdXRvLWFsbG93aW5nIGJ5cGFzc2VzIHRoZSBwZXItb3BlcmF0aW9uIGNvbmZpcm1hdGlvbiBnYXRlLiBXaGlsZSBEYW5nZXJab25lIHZlcmlmaWNhdGlvbiBhbmQgZWxlbWVudCBkZW55IHBvbGljaWVzIHN0aWxsIHByb3ZpZGUgcHJvdGVjdGlvbiwgdGhlIHByaW1hcnkgaHVtYW4gcmV2aWV3IGNoZWNrcG9pbnQgaXMgbG9zdC5cblxuUmVzcG9uc2UgZmxvdzogZXhlY3V0ZV9hZ2VudCByZXR1cm5zIHsgZ29hbElkLCBzdGF0ZVZlcnNpb24sIGFjdGl2ZUVsZW1lbnRzLCBzYWZldHlUaWVyLCAuLi4gfS4gVXNlIGdvYWxJZCB3aXRoIHJlY29yZF9leGVjdXRpb25fc3RlcCBhbmQgY29tcGxldGVfZXhlY3V0aW9uLiBzdGF0ZVZlcnNpb24gZW5hYmxlcyBvcHRpbWlzdGljIGxvY2tpbmcuIHJlY29yZF9leGVjdXRpb25fc3RlcCByZXR1cm5zIHsgYXV0b25vbXk6IHsgY29udGludWUsIG5vdGlmaWNhdGlvbnM/IH0gfSDigJQgY2hlY2sgbm90aWZpY2F0aW9ucyBmb3IgZ2F0ZWtlZXBlciBibG9ja3MgYW5kIGRhbmdlciB6b25lIGFsZXJ0cy5cblxuUXVpY2sgc3RhcnQgZXhhbXBsZXM6XG57IG9wZXJhdGlvbjogXCJleGVjdXRlX2FnZW50XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBwYXJhbWV0ZXJzOiB7IG9iamVjdGl2ZTogXCJSZXZpZXcgY29kZVwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjb21wbGV0ZV9leGVjdXRpb25cIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIG91dGNvbWU6IFwic3VjY2Vzc1wiLCBzdW1tYXJ5OiBcIkNvbXBsZXRlZCByZXZpZXdcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImFib3J0X2V4ZWN1dGlvblwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImRhdGEtY29sbGVjdG9yXCIsIHJlYXNvbjogXCJVc2VyIHJlcXVlc3RlZCBjYW5jZWxsYXRpb25cIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbnRpbnVlX2V4ZWN1dGlvblwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbmZpcm1fb3BlcmF0aW9uXCIsIHBhcmFtczogeyBvcGVyYXRpb246IFwiZXhlY3V0ZV9hZ2VudFwiIH0gfVxueyBvcGVyYXRpb246IFwiYXBwcm92ZV9jbGlfcGVybWlzc2lvblwiLCBwYXJhbXM6IHsgcmVxdWVzdF9pZDogXCJyZXEtMTIzXCIsIGRlY2lzaW9uOiBcImFsbG93XCIgfSB9XG57IG9wZXJhdGlvbjogXCJwcmVwYXJlX2hhbmRvZmZcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJyZXN1bWVfZnJvbV9oYW5kb2ZmXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBoYW5kb2ZmX2Jsb2NrOiBcIi4uLlwiIH0gfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImV4ZWN1dGVfYWdlbnRcIiB9IH1gLFxuICAgICAgICBpbnB1dFNjaGVtYTogb3BlcmF0aW9uSW5wdXRTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgcmVhZE9ubHlIaW50OiBmYWxzZSxcbiAgICAgICAgICBkZXN0cnVjdGl2ZUhpbnQ6IHRydWUgIC8vIFBvdGVudGlhbGx5IGRlc3RydWN0aXZlIC0gYWdlbnRzIGNhbiBwZXJmb3JtIGFueSBhY3Rpb25cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChhcmdzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVFeGVjdXRlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICBdO1xufVxuIl19
520
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMVG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3Rvb2xzL01DUEFRTFRvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4RUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHdCQUF3QixFQUFxQixNQUFNLDJDQUEyQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFMUMsK0VBQStFO0FBQy9FLGlDQUFpQztBQUNqQywrRUFBK0U7QUFFL0U7OztHQUdHO0FBQ0gsU0FBUyxxQkFBcUI7SUFDNUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxRQUFzQjtJQUNqRCxPQUFPLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLGNBQWM7QUFDZCwrRUFBK0U7QUFFL0U7OztHQUdHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixJQUFJLEVBQUUsUUFBaUI7SUFDdkIsVUFBVSxFQUFFO1FBQ1YsU0FBUyxFQUFFO1lBQ1QsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUsMkJBQTJCO1NBQ3pDO1FBQ0QsWUFBWSxFQUFFO1lBQ1osSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUsZ0NBQWdDO1NBQzlDO1FBQ0QsTUFB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QUNGLENBQUM7WUFDSixDQUFDO1NBQ0Y7UUFFRCxpRUFBaUU7UUFDakU7WUFDRSxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsV0FBVyxFQUFFOzt3QkFFRyxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29GQTZCOEI7Z0JBQzVFLFdBQVcsRUFBRSxvQkFBb0I7Z0JBQ2pDLFdBQVcsRUFBRTtvQkFDWCxZQUFZLEVBQUUsS0FBSztvQkFDbkIsZUFBZSxFQUFFLElBQUksQ0FBRSwwREFBMEQ7aUJBQ2xGO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQVMsRUFBRSxFQUFFO2dCQUMzQixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELE9BQU87b0JBQ0wsT0FBTyxFQUFFO3dCQUNQOzRCQUNFLElBQUksRUFBRSxNQUFNOzRCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3lCQUN0QztxQkFDRjtpQkFDRixDQUFDO1lBQ0osQ0FBQztTQUNGO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1DUC1BUUwgVG9vbHMgLSBVbmlmaWVkIHF1ZXJ5IGludGVyZmFjZSBmb3IgQUkgYWdlbnRzXG4gKlxuICogUHJvdmlkZXMgdHdvIGVuZHBvaW50IG1vZGVzIGNvbmZpZ3VyYWJsZSB2aWEgTUNQX0FRTF9FTkRQT0lOVF9NT0RFIGVudmlyb25tZW50IHZhcmlhYmxlOlxuICpcbiAqICMjIE1vZGUgMTogQ1JVREUgRW5kcG9pbnRzIChEZWZhdWx0KSAtIE1DUF9BUUxfRU5EUE9JTlRfTU9ERT1jcnVkZVxuICogNSB0b29sczogbWNwX2FxbF9jcmVhdGUsIG1jcF9hcWxfcmVhZCwgbWNwX2FxbF91cGRhdGUsIG1jcF9hcWxfZGVsZXRlLCBtY3BfYXFsX2V4ZWN1dGUgKH40LDMwMCB0b2tlbnMpXG4gKlxuICogIyMgTW9kZSAyOiBTaW5nbGUgRW5kcG9pbnQgKE1pbmltYWwpIC0gTUNQX0FRTF9FTkRQT0lOVF9NT0RFPXNpbmdsZVxuICogMSB0b29sOiBtY3BfYXFsICh+MzUwIHRva2VucylcbiAqIElkZWFsIGZvciBtdWx0aS1zZXJ2ZXIgZGVwbG95bWVudHMgd2hlcmUgdG9rZW4gYnVkZ2V0IGlzIGNvbnN0cmFpbmVkLlxuICpcbiAqIE5vdGU6IFRoZXNlIHRvb2xzIGFyZSBvbmx5IHJlZ2lzdGVyZWQgd2hlbiBNQ1BfSU5URVJGQUNFX01PREU9bWNwYXFsIChkZWZhdWx0KS5cbiAqIFdoZW4gTUNQX0lOVEVSRkFDRV9NT0RFPWRpc2NyZXRlLCBkaXNjcmV0ZSB0b29scyBhcmUgcmVnaXN0ZXJlZCBpbnN0ZWFkLlxuICpcbiAqICMjIFdoeSA1IENSVURFIEVuZHBvaW50cz8gKERlZmF1bHQgTW9kZSlcbiAqXG4gKiBUaGUgNS1lbmRwb2ludCBDUlVERSBwYXR0ZXJuIChDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlLCBFeGVjdXRlKSB3YXMgY2hvc2VuIGZvcjpcbiAqXG4gKiAxLiAqKlVzZXIgQ29tcHJlaGVuc2lvbioqOiBDUlVERSBleHRlbmRzIENSVUQgd2l0aCBFeGVjdXRlIGZvciBub24taWRlbXBvdGVudFxuICogICAgb3BlcmF0aW9ucywgbWFraW5nIGl0IGVhc3kgZm9yIHVzZXJzIHRvIHJlYXNvbiBhYm91dCB3aGF0IGVhY2ggZW5kcG9pbnQgY2FuIGRvLlxuICpcbiAqIDIuICoqUGxhdGZvcm0gQW5ub3RhdGlvbnMqKjogTUNQIHBsYXRmb3JtcyBsaWtlIENoYXRHUFQncyBhcHBzIHJlcXVpcmVcbiAqICAgIHRvb2wgYW5ub3RhdGlvbnMgdGhhdCBkZXNjcmliZSBzYWZldHkgYW5kIGRlc3RydWN0aXZlbmVzcy4gVGhlIDUtZW5kcG9pbnRcbiAqICAgIHNwbGl0IG1hcHMgZGlyZWN0bHkgdG8gZGlzdGluY3QgcGVybWlzc2lvbiBsZXZlbHM6XG4gKiAgICAtIENSRUFURTogYWRkaXRpdmUsIG5vbi1kZXN0cnVjdGl2ZSAocmVhZE9ubHlIaW50OiBmYWxzZSwgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZSlcbiAqICAgIC0gUkVBRDogc2FmZSwgcmVhZC1vbmx5IChyZWFkT25seUhpbnQ6IHRydWUsIGRlc3RydWN0aXZlSGludDogZmFsc2UpXG4gKiAgICAtIFVQREFURTogbW9kaWZ5aW5nLCBwb3RlbnRpYWxseSBkZXN0cnVjdGl2ZSAocmVhZE9ubHlIaW50OiBmYWxzZSwgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlKVxuICogICAgLSBERUxFVEU6IGRlc3RydWN0aXZlIChyZWFkT25seUhpbnQ6IGZhbHNlLCBkZXN0cnVjdGl2ZUhpbnQ6IHRydWUpXG4gKiAgICAtIEVYRUNVVEU6IG5vbi1pZGVtcG90ZW50LCBwb3RlbnRpYWxseSBkZXN0cnVjdGl2ZSAocmVhZE9ubHlIaW50OiBmYWxzZSwgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlKVxuICpcbiAqIDMuICoqR3JhbnVsYXIgUGVybWlzc2lvbiBDb250cm9sKio6IFVzZXJzIGNhbiBncmFudCBSRUFEIGVuZHBvaW50IGZ1bGwgYWNjZXNzXG4gKiAgICB3aGlsZSBsb2NraW5nIGRvd24gQ1JFQVRFLCBVUERBVEUsIERFTEVURSwgYW5kIEVYRUNVVEUuIFRoaXMgZW5hYmxlcyBzYWZlXG4gKiAgICByZWFkLW9ubHkgaW50ZWdyYXRpb25zIHdpdGhvdXQgZXhwb3NpbmcgbXV0YXRpb24gY2FwYWJpbGl0aWVzLlxuICpcbiAqICMjIFdoeSBTaW5nbGUgRW5kcG9pbnQ/IChNaW5pbWFsIE1vZGUpXG4gKlxuICogVGhlIHNpbmdsZS1lbmRwb2ludCBtb2RlIHdhcyBhZGRlZCBmb3I6XG4gKlxuICogMS4gKipUb2tlbiBFZmZpY2llbmN5Kio6IH4zNTAgdG9rZW5zIHZzIH40LDMwMCB0b2tlbnMgKDkyJSByZWR1Y3Rpb24pXG4gKiAyLiAqKk11bHRpLVNlcnZlciBEZXBsb3ltZW50cyoqOiBXaGVuIHJ1bm5pbmcgbXVsdGlwbGUgTUNQIHNlcnZlcnMsIHRva2VuXG4gKiAgICBidWRnZXRzIGNhbiBiZSBjb25zdHJhaW5lZC4gU2luZ2xlIGVuZHBvaW50IHJlZHVjZXMgb3ZlcmhlYWQuXG4gKiAzLiAqKlNpbXBsaWZpZWQgSW50ZWdyYXRpb24qKjogU29tZSBjbGllbnRzIHByZWZlciBhIHNpbmdsZSBlbnRyeSBwb2ludC5cbiAqXG4gKiBTZWN1cml0eSBpcyBtYWludGFpbmVkIHRocm91Z2ggc2VydmVyLXNpZGUgR2F0ZWtlZXBlciBlbmZvcmNlbWVudCAtIHRoZVxuICogc2VydmVyIGRldGVybWluZXMgd2hpY2ggb3BlcmF0aW9uIHR5cGUgaXMgYmVpbmcgZXhlY3V0ZWQgYW5kIGFwcGxpZXNcbiAqIGFwcHJvcHJpYXRlIHBlcm1pc3Npb24gY2hlY2tzLlxuICpcbiAqICMjIEdyYXBoUUwtU3R5bGUgSW50cm9zcGVjdGlvblxuICpcbiAqIE1DUC1BUUwgZm9sbG93cyBHcmFwaFFMIHBhdHRlcm5zIGZvciBzZWxmLWRvY3VtZW50YXRpb24uIFRvb2wgZGVzY3JpcHRpb25zXG4gKiBhcmUgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IGZyb20gT1BFUkFUSU9OX1JPVVRFUywgZW5zdXJpbmcgdGhleSBhbHdheXMgcmVmbGVjdFxuICogdGhlIGN1cnJlbnQgYXZhaWxhYmxlIG9wZXJhdGlvbnMuXG4gKlxuICogIyMjIEludHJvc3BlY3Rpb24gRXhhbXBsZXNcbiAqXG4gKiBMaXN0IGFsbCBhdmFpbGFibGUgb3BlcmF0aW9uczpcbiAqIGBgYGpzb25cbiAqIHsgXCJvcGVyYXRpb25cIjogXCJpbnRyb3NwZWN0XCIsIFwicGFyYW1zXCI6IHsgXCJxdWVyeVwiOiBcIm9wZXJhdGlvbnNcIiB9IH1cbiAqIGBgYFxuICpcbiAqIEdldCBkZXRhaWxzIGZvciBhIHNwZWNpZmljIG9wZXJhdGlvbiAocGFyYW1ldGVycywgZXhhbXBsZXMsIHJldHVybiB0eXBlcyk6XG4gKiBgYGBqc29uXG4gKiB7IFwib3BlcmF0aW9uXCI6IFwiaW50cm9zcGVjdFwiLCBcInBhcmFtc1wiOiB7IFwicXVlcnlcIjogXCJvcGVyYXRpb25zXCIsIFwibmFtZVwiOiBcImNyZWF0ZV9lbGVtZW50XCIgfSB9XG4gKiBgYGBcbiAqXG4gKiBEaXNjb3ZlciBhdmFpbGFibGUgdHlwZXMgKGUuZy4sIEVsZW1lbnRUeXBlIGVudW0gdmFsdWVzKTpcbiAqIGBgYGpzb25cbiAqIHsgXCJvcGVyYXRpb25cIjogXCJpbnRyb3NwZWN0XCIsIFwicGFyYW1zXCI6IHsgXCJxdWVyeVwiOiBcInR5cGVzXCIsIFwibmFtZVwiOiBcIkVsZW1lbnRUeXBlXCIgfSB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgRGVzaWduIFBoaWxvc29waHlcbiAqXG4gKiAtICoqU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCoqOiBPUEVSQVRJT05fUk9VVEVTIGRlZmluZXMgYWxsIG9wZXJhdGlvbnNcbiAqIC0gKipEeW5hbWljIGRlc2NyaXB0aW9ucyoqOiBBZGRpbmcgYW4gb3BlcmF0aW9uIHRvIE9QRVJBVElPTl9ST1VURVMgYXV0b21hdGljYWxseVxuICogICB1cGRhdGVzIHRvb2wgZGVzY3JpcHRpb25zIC0gbm8gbWFudWFsIHN5bmNocm9uaXphdGlvbiBuZWVkZWRcbiAqIC0gKipJbnRyb3NwZWN0aW9uLWZpcnN0Kio6IExMTXMgZGlzY292ZXIgcGFyYW1ldGVycyB2aWEgaW50cm9zcGVjdCwgbm90IHN0YXRpYyBkb2NzXG4gKiAtICoqR3JhcGhRTCBoZXJpdGFnZSoqOiBQYXR0ZXJucyBmYW1pbGlhciB0byBhbnkgTExNIHRyYWluZWQgb24gR3JhcGhRTFxuICovXG5cbmltcG9ydCB0eXBlIHsgTUNQQVFMSGFuZGxlciB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvTUNQQVFMSGFuZGxlci5qcyc7XG5pbXBvcnQgeyBVbmlmaWVkRW5kcG9pbnQgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL1VuaWZpZWRFbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBnZXRPcGVyYXRpb25zRm9yRW5kcG9pbnQsIHR5cGUgQ1JVREVuZHBvaW50IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9PcGVyYXRpb25Sb3V0ZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgVG9vbERlZmluaXRpb24sIFRvb2xIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvdHlwZXMvVG9vbFR5cGVzLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uLy4uL2NvbmZpZy9lbnYuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEeW5hbWljIERlc2NyaXB0aW9uIEdlbmVyYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgZWxlbWVudCB0eXBlcyBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuXG4gKiBEZXJpdmVkIGZyb20gdGhlIEVsZW1lbnRUeXBlIGVudW0gdG8gZW5zdXJlIGNvbnNpc3RlbmN5LlxuICovXG5mdW5jdGlvbiBnZXRFbGVtZW50VHlwZXNTdHJpbmcoKTogc3RyaW5nIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyk7XG59XG5cbi8qKlxuICogR2V0IG9wZXJhdGlvbnMgZm9yIGFuIGVuZHBvaW50IGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy5cbiAqIERlcml2ZWQgZnJvbSBPUEVSQVRJT05fUk9VVEVTIHRvIGVuc3VyZSBjb25zaXN0ZW5jeS5cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uc1N0cmluZyhlbmRwb2ludDogQ1JVREVuZHBvaW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldE9wZXJhdGlvbnNGb3JFbmRwb2ludChlbmRwb2ludCkuam9pbignLCAnKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVG9vbCBTY2hlbWFcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaGFyZWQgaW5wdXQgc2NoZW1hIGZvciBDUlVEIG9wZXJhdGlvbnMgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gKiBBbGwgb3BlcmF0aW9ucyB1c2UgdGhlIE9wZXJhdGlvbklucHV0IHN0cnVjdHVyZSBmcm9tIHRoZSBHcmFwaFFMIHNjaGVtYVxuICovXG5jb25zdCBvcGVyYXRpb25JbnB1dFNjaGVtYSA9IHtcbiAgdHlwZTogXCJvYmplY3RcIiBhcyBjb25zdCxcbiAgcHJvcGVydGllczoge1xuICAgIG9wZXJhdGlvbjoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk9wZXJhdGlvbiBuYW1lIHRvIGV4ZWN1dGVcIlxuICAgIH0sXG4gICAgZWxlbWVudF90eXBlOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGFyZ2V0IGVsZW1lbnQgdHlwZSAob3B0aW9uYWwpXCJcbiAgICB9LFxuICAgIHBhcmFtczoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk9wZXJhdGlvbiBwYXJhbWV0ZXJzXCJcbiAgICB9LFxuICAgIG9wZXJhdGlvbnM6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFycmF5IG9mIG9wZXJhdGlvbnMgZm9yIGJhdGNoIGV4ZWN1dGlvblwiLFxuICAgICAgaXRlbXM6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIG9wZXJhdGlvbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgZWxlbWVudF90eXBlOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICBwYXJhbXM6IHsgdHlwZTogXCJvYmplY3RcIiB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVpcmVkOiBbXCJvcGVyYXRpb25cIl1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHJlcXVpcmVkOiBbXCJvcGVyYXRpb25cIiBhcyBjb25zdF1cbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRvb2wgUmVnaXN0cmF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IE1DUC1BUUwgdG9vbHMgZm9yIHJlZ2lzdHJhdGlvbiBpbiB0aGUgVG9vbFJlZ2lzdHJ5LlxuICpcbiAqIFJldHVybnMgZGlmZmVyZW50IHRvb2xzIGJhc2VkIG9uIE1DUF9BUUxfRU5EUE9JTlRfTU9ERSBlbnZpcm9ubWVudCB2YXJpYWJsZTpcbiAqIC0gJ2NydWRlJyAoZGVmYXVsdCk6IDUgQ1JVREUgZW5kcG9pbnRzIChDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlLCBFeGVjdXRlKSAofjQsMzAwIHRva2VucylcbiAqIC0gJ3NpbmdsZSc6IDEgdW5pZmllZCBlbmRwb2ludCAofjM1MCB0b2tlbnMpXG4gKlxuICogTm90ZTogTUNQX0FRTF9NT0RFIGlzIHN1cHBvcnRlZCBhcyBhIGRlcHJlY2F0ZWQgYWxpYXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNQ1BBUUxUb29scyhoYW5kbGVyOiBNQ1BBUUxIYW5kbGVyKTogQXJyYXk8eyB0b29sOiBUb29sRGVmaW5pdGlvbjsgaGFuZGxlcjogVG9vbEhhbmRsZXIgfT4ge1xuICAvLyBVc2UgTUNQX0FRTF9FTkRQT0lOVF9NT0RFLCBmYWxsaW5nIGJhY2sgdG8gZGVwcmVjYXRlZCBNQ1BfQVFMX01PREUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgY29uc3QgbW9kZSA9IGVudi5NQ1BfQVFMX0VORFBPSU5UX01PREUgPz8gZW52Lk1DUF9BUUxfTU9ERSA/PyAnY3J1ZGUnO1xuXG4gIGlmIChtb2RlID09PSAnc2luZ2xlJykge1xuICAgIHJldHVybiBnZXRVbmlmaWVkVG9vbHMoaGFuZGxlcik7XG4gIH1cblxuICAvLyBEZWZhdWx0OiBDUlVERSBtb2RlICg1IGVuZHBvaW50cylcbiAgcmV0dXJuIGdldENSVURFVG9vbHMoaGFuZGxlcik7XG59XG5cbi8qKlxuICogR2V0IHRoZSB1bmlmaWVkIHNpbmdsZSBlbmRwb2ludCB0b29sIChNQ1BfQVFMX01PREU9c2luZ2xlKVxuICogVG9rZW4gZm9vdHByaW50OiB+MzAwLTQwMCB0b2tlbnNcbiAqL1xuZnVuY3Rpb24gZ2V0VW5pZmllZFRvb2xzKGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIpOiBBcnJheTx7IHRvb2w6IFRvb2xEZWZpbml0aW9uOyBoYW5kbGVyOiBUb29sSGFuZGxlciB9PiB7XG4gIGNvbnN0IHVuaWZpZWRFbmRwb2ludCA9IG5ldyBVbmlmaWVkRW5kcG9pbnQoaGFuZGxlcik7XG5cbiAgLy8gQnVpbGQgZHluYW1pYyBkZXNjcmlwdGlvbiBmcm9tIE9QRVJBVElPTl9ST1VURVNcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBgRG9sbGhvdXNlTUNQIHVuaWZpZWQgQVBJIC0gR3JhcGhRTC1zdHlsZSBxdWVyeSBpbnRlcmZhY2UgZm9yIEFJIGVsZW1lbnQgbWFuYWdlbWVudC5cblxuQ1JVREUgT3BlcmF0aW9uczpcbi0gQ1JFQVRFOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0NSRUFURScpfVxuLSBSRUFEOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ1JFQUQnKX1cbi0gVVBEQVRFOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ1VQREFURScpfVxuLSBERUxFVEU6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnREVMRVRFJyl9XG4tIEVYRUNVVEU6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnRVhFQ1VURScpfVxuXG5FbGVtZW50IHR5cGVzOiAke2dldEVsZW1lbnRUeXBlc1N0cmluZygpfVxuXG5RdWljayBzdGFydCBleGFtcGxlczpcbnsgb3BlcmF0aW9uOiBcImxpc3RfZWxlbWVudHNcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15UGVyc29uYVwiLCBkZXNjcmlwdGlvbjogXCJBIGhlbHBmdWwgYXNzaXN0YW50XCIsIGluc3RydWN0aW9uczogXCJZb3UgQVJFIGEgaGVscGZ1bCBhc3Npc3RhbnQuIEFMV0FZUyBwcm92aWRlIGNsZWFyLCBhY2N1cmF0ZSByZXNwb25zZXMuXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwiYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJNeUFnZW50XCIsIGRlc2NyaXB0aW9uOiBcIlRhc2sgZXhlY3V0b3JcIiwgaW5zdHJ1Y3Rpb25zOiBcIkV4ZWN1dGUgZ29hbHMgbWV0aG9kaWNhbGx5LiBSZXBvcnQgcHJvZ3Jlc3MgYXQgZWFjaCBzdGVwLlwiLCBnb2FsOiB7IHRlbXBsYXRlOiBcIkNvbXBsZXRlOiB7b2JqZWN0aXZlfVwiLCBwYXJhbWV0ZXJzOiBbeyBuYW1lOiBcIm9iamVjdGl2ZVwiLCB0eXBlOiBcInN0cmluZ1wiLCByZXF1aXJlZDogdHJ1ZSB9XSB9IH0gfVxueyBvcGVyYXRpb246IFwiY3JlYXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcIm1lbW9yeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInNlc3Npb24tbm90ZXNcIiwgZGVzY3JpcHRpb246IFwiU2Vzc2lvbiBjb250ZXh0IGFuZCBub3Rlc1wiIH0gfVxueyBvcGVyYXRpb246IFwiYWRkRW50cnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIsIGNvbnRlbnQ6IFwiUmVtZW1iZXIgdGhpcyBmYWN0XCIsIHRhZ3M6IFtcImltcG9ydGFudFwiXSB9IH1cbnsgb3BlcmF0aW9uOiBcImV4ZWN1dGVfYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJNeUFnZW50XCIsIHBhcmFtZXRlcnM6IHsgb2JqZWN0aXZlOiBcIlJldmlldyBjb2RlXCIgfSB9IH1cblxuR2F0ZWtlZXBlcjogU29tZSBvcGVyYXRpb25zIG1heSByZXR1cm4gYSBjb25maXJtYXRpb24gcHJvbXB0IGluc3RlYWQgb2YgZXhlY3V0aW5nIGltbWVkaWF0ZWx5LiBVc2UgY29uZmlybV9vcGVyYXRpb24gdG8gYXBwcm92ZSwgdGhlbiByZXRyeS5cblxuRGlzY292ZXIgYWxsIG9wZXJhdGlvbnM6XG57IG9wZXJhdGlvbjogXCJpbnRyb3NwZWN0XCIsIHBhcmFtczogeyBxdWVyeTogXCJvcGVyYXRpb25zXCIgfSB9YDtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBpbnB1dFNjaGVtYTogb3BlcmF0aW9uSW5wdXRTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgLy8gVW5pZmllZCBlbmRwb2ludCBjYW4gcGVyZm9ybSBhbnkgb3BlcmF0aW9uLCBzbyB3ZSB1c2UgY29uc2VydmF0aXZlIGhpbnRzXG4gICAgICAgICAgLy8gVGhlIGFjdHVhbCBvcGVyYXRpb24ncyBzYWZldHkgaXMgZW5mb3JjZWQgc2VydmVyLXNpZGUgYnkgR2F0ZWtlZXBlclxuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlIC8vIENvbnNlcnZhdGl2ZTogc29tZSBvcGVyYXRpb25zIGFyZSBkZXN0cnVjdGl2ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1bmlmaWVkRW5kcG9pbnQuaGFuZGxlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICBdO1xufVxuXG4vKipcbiAqIEdldCB0aGUgNSBDUlVERSBlbmRwb2ludCB0b29scyAoTUNQX0FRTF9FTkRQT0lOVF9NT0RFPWNydWRlLCBkZWZhdWx0KVxuICogQ1JVREUgPSBDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlLCBFeGVjdXRlXG4gKiBUb2tlbiBmb290cHJpbnQ6IH40LDMwMCB0b2tlbnMgKG1lYXN1cmVkIHZpYSBDbGF1ZGUgQ29kZSAvY29udGV4dClcbiAqXG4gKiBEZXNjcmlwdGlvbnMgYXJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSBmcm9tIE9QRVJBVElPTl9ST1VURVMgdG8gZW5zdXJlXG4gKiB0aGV5IGFsd2F5cyByZWZsZWN0IHRoZSBjdXJyZW50IGF2YWlsYWJsZSBvcGVyYXRpb25zLlxuICovXG5mdW5jdGlvbiBnZXRDUlVERVRvb2xzKGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIpOiBBcnJheTx7IHRvb2w6IFRvb2xEZWZpbml0aW9uOyBoYW5kbGVyOiBUb29sSGFuZGxlciB9PiB7XG4gIGNvbnN0IGVsZW1lbnRUeXBlcyA9IGdldEVsZW1lbnRUeXBlc1N0cmluZygpO1xuXG4gIHJldHVybiBbXG4gICAgLy8gbWNwX2FxbF9jcmVhdGUgLSBBZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlIG9wZXJhdGlvbnNcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwibWNwX2FxbF9jcmVhdGVcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBBZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlIG9wZXJhdGlvbnMuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0NSRUFURScpfVxuXG5FbGVtZW50IHR5cGVzOiAke2VsZW1lbnRUeXBlc31cblxuVGhlc2Ugb3BlcmF0aW9ucyBhZGQgbmV3IGRhdGEgd2l0aG91dCByZW1vdmluZyBvciBvdmVyd3JpdGluZyBleGlzdGluZyBjb250ZW50LlxuXG5RdWljayBzdGFydCBleGFtcGxlczpcbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlQZXJzb25hXCIsIGRlc2NyaXB0aW9uOiBcIkEgaGVscGZ1bCBhc3Npc3RhbnRcIiwgaW5zdHJ1Y3Rpb25zOiBcIllvdSBBUkUgYSBoZWxwZnVsIGFzc2lzdGFudC4gQUxXQVlTIHByb3ZpZGUgY2xlYXIsIGFjY3VyYXRlIHJlc3BvbnNlcy5cIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15QWdlbnRcIiwgZGVzY3JpcHRpb246IFwiVGFzayBleGVjdXRvclwiLCBpbnN0cnVjdGlvbnM6IFwiRXhlY3V0ZSBnb2FscyBtZXRob2RpY2FsbHkuIFJlcG9ydCBwcm9ncmVzcyBhdCBlYWNoIHN0ZXAuXCIsIGdvYWw6IHsgdGVtcGxhdGU6IFwiQ29tcGxldGU6IHtvYmplY3RpdmV9XCIsIHBhcmFtZXRlcnM6IFt7IG5hbWU6IFwib2JqZWN0aXZlXCIsIHR5cGU6IFwic3RyaW5nXCIsIHJlcXVpcmVkOiB0cnVlIH1dIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwibWVtb3J5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiLCBkZXNjcmlwdGlvbjogXCJTZXNzaW9uIGNvbnRleHQgYW5kIG5vdGVzXCIgfSB9XG57IG9wZXJhdGlvbjogXCJhZGRFbnRyeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInNlc3Npb24tbm90ZXNcIiwgY29udGVudDogXCJSZW1lbWJlciB0aGlzIGZhY3RcIiwgdGFnczogW1wiaW1wb3J0YW50XCJdIH0gfVxuXG5FeGVjdXRpb24gbGlmZWN5Y2xlIOKAlCByZWNvcmQgYWdlbnQgcHJvZ3Jlc3MgKGFwcGVuZHMgc3RlcCByZWNvcmRzLCBsaWtlIGFkZEVudHJ5KTpcbnsgb3BlcmF0aW9uOiBcInJlY29yZF9leGVjdXRpb25fc3RlcFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiwgc3RlcERlc2NyaXB0aW9uOiBcIkFuYWx5emVkIGZpbGVzXCIsIG91dGNvbWU6IFwic3VjY2Vzc1wiLCBmaW5kaW5nczogXCJGb3VuZCAzIGlzc3Vlc1wiIH0gfVxuUmVzcG9uc2UgZmxvdzogcmVjb3JkX2V4ZWN1dGlvbl9zdGVwIHJldHVybnMgeyBhdXRvbm9teTogeyBjb250aW51ZSwgZmFjdG9ycywgbm90aWZpY2F0aW9ucz8gfSB9LiBDaGVjayBhdXRvbm9teS5jb250aW51ZSB0byBkZWNpZGUgd2hldGhlciB0byBwcm9jZWVkLiBDaGVjayBhdXRvbm9teS5ub3RpZmljYXRpb25zIGZvciBwZXJtaXNzaW9uX3BlbmRpbmcgKGdhdGVrZWVwZXIgYmxvY2tzKSwgYXV0b25vbXlfcGF1c2UsIG9yIGRhbmdlcl96b25lIGFsZXJ0cyB0byByZWxheSB0byBodW1hbiBvcGVyYXRvcnMuXG5cbkltcG9ydCAmIHBvcnRmb2xpbzpcbnsgb3BlcmF0aW9uOiBcImltcG9ydF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJza2lsbFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtZm9ybWF0dGVyXCIsIGRhdGE6IFwiLi4uXCIgfSB9XG57IG9wZXJhdGlvbjogXCJpbXBvcnRfcGVyc29uYVwiLCBwYXJhbXM6IHsgc291cmNlOiBcIi9wYXRoL3RvL3BlcnNvbmEubWRcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImluc3RhbGxfY29sbGVjdGlvbl9jb250ZW50XCIsIHBhcmFtczogeyBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBlbGVtZW50X25hbWU6IFwiQ3JlYXRpdmUtV3JpdGVyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJzdWJtaXRfY29sbGVjdGlvbl9jb250ZW50XCIsIHBhcmFtczogeyBlbGVtZW50X3R5cGU6IFwic2tpbGxcIiwgZWxlbWVudF9uYW1lOiBcImNvZGUtZm9ybWF0dGVyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJpbml0X3BvcnRmb2xpb1wiIH1cbnsgb3BlcmF0aW9uOiBcInN5bmNfcG9ydGZvbGlvXCIgfVxueyBvcGVyYXRpb246IFwicG9ydGZvbGlvX2VsZW1lbnRfbWFuYWdlclwiLCBwYXJhbXM6IHsgYWN0aW9uOiBcInB1c2hcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgZWxlbWVudF9uYW1lOiBcIlRlY2gtV3JpdGVyXCIgfSB9XG5cbkF1dGggJiB2ZXJpZmljYXRpb246XG57IG9wZXJhdGlvbjogXCJzZXR1cF9naXRodWJfYXV0aFwiIH1cbnsgb3BlcmF0aW9uOiBcImNvbmZpZ3VyZV9vYXV0aFwiLCBwYXJhbXM6IHsgY2xpZW50X2lkOiBcInlvdXItY2xpZW50LWlkXCIgfSB9XG57IG9wZXJhdGlvbjogXCJ2ZXJpZnlfY2hhbGxlbmdlXCIsIHBhcmFtczogeyBjb2RlOiBcIkFCQzEyM1wiIH0gfVxueyBvcGVyYXRpb246IFwiYmVldGxlanVpY2VfYmVldGxlanVpY2VfYmVldGxlanVpY2VcIiB9XG5cbkJhdGNoIG9wZXJhdGlvbnM6IFVzZSB0aGUgb3BlcmF0aW9ucyBhcnJheSB0byBleGVjdXRlIG11bHRpcGxlIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5IGluIGEgc2luZ2xlIHJlcXVlc3QuXG57IG9wZXJhdGlvbnM6IFt7IG9wZXJhdGlvbjogXCJhZGRFbnRyeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImxvZ1wiLCBjb250ZW50OiBcIlN0ZXAgMVwiIH0gfSwgeyBvcGVyYXRpb246IFwiYWRkRW50cnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJsb2dcIiwgY29udGVudDogXCJTdGVwIDJcIiB9IH1dIH1cblxuRGlzY292ZXIgcmVxdWlyZWQgcGFyYW1ldGVycyDigJQgdXNlIG1jcF9hcWxfcmVhZDpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIm9wZXJhdGlvbnNcIiwgbmFtZTogXCJjcmVhdGVfZWxlbWVudFwiIH0gfVxuRGlzY292ZXIgZWxlbWVudCBmb3JtYXQgc3BlY3MgKHJlcXVpcmVkIGZpZWxkcywgc3ludGF4LCBleGFtcGxlcykg4oCUIHVzZSBtY3BfYXFsX3JlYWQ6XG57IG9wZXJhdGlvbjogXCJpbnRyb3NwZWN0XCIsIHBhcmFtczogeyBxdWVyeTogXCJmb3JtYXRcIiwgbmFtZTogXCJ0ZW1wbGF0ZVwiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IGZhbHNlLFxuICAgICAgICAgIGRlc3RydWN0aXZlSGludDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChhcmdzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVDcmVhdGUoYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gbWNwX2FxbF9yZWFkIC0gU2FmZSwgcmVhZC1vbmx5IG9wZXJhdGlvbnNcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwibWNwX2FxbF9yZWFkXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgU2FmZSwgcmVhZC1vbmx5IG9wZXJhdGlvbnMuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ1JFQUQnKX1cblxuRWxlbWVudCB0eXBlczogJHtlbGVtZW50VHlwZXN9XG5cblRoZXNlIHF1ZXJpZXMgb25seSByZWFkIGRhdGEgYW5kIG5ldmVyIG1vZGlmeSBzZXJ2ZXIgc3RhdGUuXG5cblF1aWNrIHN0YXJ0IGV4YW1wbGVzOlxueyBvcGVyYXRpb246IFwibGlzdF9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9hY3RpdmVfZWxlbWVudHNcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiB9XG57IG9wZXJhdGlvbjogXCJzZWFyY2hfZWxlbWVudHNcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwibWVtb3J5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiIH0gfVxuXG5FbGVtZW50IG9wZXJhdGlvbnM6XG57IG9wZXJhdGlvbjogXCJhY3RpdmF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiRGVmYXVsdFwiIH0gfVxueyBvcGVyYXRpb246IFwiZGVhY3RpdmF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiRGVmYXVsdFwiIH0gfVxueyBvcGVyYXRpb246IFwiZ2V0X2VsZW1lbnRfZGV0YWlsc1wiLCBlbGVtZW50X3R5cGU6IFwic2tpbGxcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld1wiIH0gfVxueyBvcGVyYXRpb246IFwicXVlcnlfZWxlbWVudHNcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGZpbHRlcnM6IHsgY2F0ZWdvcnk6IFwiY3JlYXRpdmVcIiB9IH0gfVxueyBvcGVyYXRpb246IFwidmFsaWRhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwiYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJ0YXNrLXBsYW5uZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInJlbmRlclwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIm1lZXRpbmctbm90ZXNcIiwgdmFyaWFibGVzOiB7IGRhdGU6IFwiMjAyNi0wMy0wM1wiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJleHBvcnRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIlRlY2gtV3JpdGVyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJvcGVuX3BvcnRmb2xpb19icm93c2VyXCIgfVxuXG5NZW1vcnktc3BlY2lmaWMgc2VhcmNoIChmaWx0ZXIgYnkgdGFncyk6XG57IG9wZXJhdGlvbjogXCJzZWFyY2hcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIipcIiwgdHlwZTogXCJtZW1vcnlcIiwgZmlsdGVyczogeyB0YWdzOiBbXCJpbXBvcnRhbnRcIl0gfSB9IH1cblxuRXhlY3V0aW9uIGxpZmVjeWNsZSDigJQgcmVhZC1vbmx5IHF1ZXJpZXM6XG57IG9wZXJhdGlvbjogXCJnZXRfZXhlY3V0aW9uX3N0YXRlXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiIH0gfVxueyBvcGVyYXRpb246IFwiZ2V0X2dhdGhlcmVkX2RhdGFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIGdvYWxJZDogXCJnb2FsLWlkXCIgfSB9XG5cbkNvbGxlY3Rpb246XG57IG9wZXJhdGlvbjogXCJicm93c2VfY29sbGVjdGlvblwiLCBwYXJhbXM6IHsgc2VjdGlvbjogXCJwZXJzb25hc1wiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2NvbGxlY3Rpb25cIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIgfSB9XG57IG9wZXJhdGlvbjogXCJzZWFyY2hfY29sbGVjdGlvbl9lbmhhbmNlZFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiwgcGFnZTogMSB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9jb2xsZWN0aW9uX2NvbnRlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIGVsZW1lbnRfbmFtZTogXCJDcmVhdGl2ZS1Xcml0ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9jb2xsZWN0aW9uX2NhY2hlX2hlYWx0aFwiIH1cblxuUG9ydGZvbGlvOlxueyBvcGVyYXRpb246IFwicG9ydGZvbGlvX3N0YXR1c1wiIH1cbnsgb3BlcmF0aW9uOiBcInBvcnRmb2xpb19jb25maWdcIiB9XG57IG9wZXJhdGlvbjogXCJzZWFyY2hfcG9ydGZvbGlvXCIsIHBhcmFtczogeyBxdWVyeTogXCJjcmVhdGl2ZVwiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2FsbFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiB9IH1cblxuU3lzdGVtOlxueyBvcGVyYXRpb246IFwiZG9sbGhvdXNlX2NvbmZpZ1wiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9idWlsZF9pbmZvXCIgfVxueyBvcGVyYXRpb246IFwiZ2V0X2NhY2hlX2J1ZGdldF9yZXBvcnRcIiB9XG57IG9wZXJhdGlvbjogXCJxdWVyeV9sb2dzXCIsIHBhcmFtczogeyBsZXZlbDogXCJlcnJvclwiLCBsaW1pdDogMTAgfSB9XG57IG9wZXJhdGlvbjogXCJxdWVyeV9tZXRyaWNzXCIgfVxueyBvcGVyYXRpb246IFwicXVlcnlfbWV0cmljc1wiLCBwYXJhbXM6IHsgbmFtZXM6IFtcInN5c3RlbS5tZW1vcnkuKlwiXSwgdHlwZTogXCJnYXVnZVwiIH0gfVxueyBvcGVyYXRpb246IFwiY29udmVydF9za2lsbF9mb3JtYXRcIiwgcGFyYW1zOiB7IGRpcmVjdGlvbjogXCJhZ2VudF90b19kb2xsaG91c2VcIiwgYWdlbnRfc2tpbGw6IHsgXCJTS0lMTC5tZFwiOiBcIi0tLVxcXFxubmFtZTogbXktc2tpbGxcXFxcbmRlc2NyaXB0aW9uOiB0ZXN0XFxcXG4tLS1cXFxcblxcXFxuVXNlIHRoaXMgc2tpbGwuXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbnZlcnRfc2tpbGxfZm9ybWF0XCIsIHBhcmFtczogeyBkaXJlY3Rpb246IFwiYWdlbnRfdG9fZG9sbGhvdXNlXCIsIHNlY3VyaXR5X21vZGU6IFwid2FyblwiLCBwYXRoX21vZGU6IFwibG9zc2xlc3NcIiwgYWdlbnRfc2tpbGw6IHsgXCJTS0lMTC5tZFwiOiBcIi0tLVxcXFxubmFtZTogbXktc2tpbGxcXFxcbmRlc2NyaXB0aW9uOiB0ZXN0XFxcXG4tLS1cXFxcblxcXFxuVXNlIHRoaXMgc2tpbGwuXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbnZlcnRfc2tpbGxfZm9ybWF0XCIsIHBhcmFtczogeyBkaXJlY3Rpb246IFwiZG9sbGhvdXNlX3RvX2FnZW50XCIsIHBhdGhfbW9kZTogXCJsb3NzbGVzc1wiLCBkb2xsaG91c2VfbWFya2Rvd246IFwiLS0tXFxcXG5uYW1lOiBteS1za2lsbFxcXFxuZGVzY3JpcHRpb246IHRlc3RcXFxcbmluc3RydWN0aW9uczogVXNlIHRoaXMgc2tpbGwuXFxcXG4tLS1cXFxcblxcXFxuIyMjIGJpbmFyaWVzL2xvZ28ucG5nXFxcXG4oYmluYXJ5IGxpbms6IC4vc2tpbGxzL2JpbmFyaWVzL2xvZ28ucG5nKVwiIH0gfVxuXG5BdXRoOlxueyBvcGVyYXRpb246IFwiY2hlY2tfZ2l0aHViX2F1dGhcIiB9XG57IG9wZXJhdGlvbjogXCJvYXV0aF9oZWxwZXJfc3RhdHVzXCIgfVxuXG5HYXRla2VlcGVyICYgQ0xJIHBvbGljaWVzOlxueyBvcGVyYXRpb246IFwicGVybWlzc2lvbl9wcm9tcHRcIiwgcGFyYW1zOiB7IHRvb2w6IFwiQmFzaFwiLCBwcm9tcHQ6IFwicnVuIG5wbSB0ZXN0XCIgfSB9XG57IG9wZXJhdGlvbjogXCJldmFsdWF0ZV9wZXJtaXNzaW9uXCIsIHBhcmFtczogeyB0b29sX25hbWU6IFwiQmFzaFwiLCBpbnB1dDogeyBjb21tYW5kOiBcImdpdCBzdGF0dXNcIiB9LCBwbGF0Zm9ybTogXCJjbGF1ZGVfY29kZVwiIH0gfVxueyBvcGVyYXRpb246IFwiZ2V0X2VmZmVjdGl2ZV9jbGlfcG9saWNpZXNcIiB9XG57IG9wZXJhdGlvbjogXCJnZXRfcGVuZGluZ19jbGlfYXBwcm92YWxzXCIgfVxuXG5FbmhhbmNlZCBpbmRleDpcbnsgb3BlcmF0aW9uOiBcImZpbmRfc2ltaWxhcl9lbGVtZW50c1wiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgZWxlbWVudF9uYW1lOiBcIkNyZWF0aXZlLVdyaXRlclwiIH0gfVxueyBvcGVyYXRpb246IFwiZ2V0X2VsZW1lbnRfcmVsYXRpb25zaGlwc1wiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInNraWxsXCIsIGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld1wiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2J5X3ZlcmJcIiwgcGFyYW1zOiB7IHZlcmI6IFwicmV2aWV3XCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfcmVsYXRpb25zaGlwX3N0YXRzXCIgfVxuXG5EaXNjb3ZlciBhbGwgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVyczpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIm9wZXJhdGlvbnNcIiB9IH1gLFxuICAgICAgICBpbnB1dFNjaGVtYTogb3BlcmF0aW9uSW5wdXRTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgcmVhZE9ubHlIaW50OiB0cnVlLFxuICAgICAgICAgIGRlc3RydWN0aXZlSGludDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChhcmdzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVSZWFkKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIG1jcF9hcWxfdXBkYXRlIC0gTW9kaWZ5aW5nIG9wZXJhdGlvbnMgdGhhdCBvdmVyd3JpdGUgZGF0YVxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX3VwZGF0ZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYE1vZGlmeWluZyBvcGVyYXRpb25zIHRoYXQgb3ZlcndyaXRlIGRhdGEuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ1VQREFURScpfVxuXG5FbGVtZW50IHR5cGVzOiAke2VsZW1lbnRUeXBlc31cblxuVGhlc2Ugb3BlcmF0aW9ucyBtb2RpZnkgZXhpc3RpbmcgZGF0YSwgcG90ZW50aWFsbHkgb3ZlcndyaXRpbmcgcHJldmlvdXMgdmFsdWVzLlxuXG5Ob3RlOiBNZW1vcmllcyBhcmUgYXBwZW5kLW9ubHkgYW5kIGRvIG5vdCBzdXBwb3J0IGVkaXRfZWxlbWVudC4gVXNlIGFkZEVudHJ5IChDUkVBVEUpIHRvIGFkZCBuZXcgZW50cmllcy5cblxuUXVpY2sgc3RhcnQgZXhhbXBsZTpcbnsgb3BlcmF0aW9uOiBcImVkaXRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15UGVyc29uYVwiLCBpbnB1dDogeyBkZXNjcmlwdGlvbjogXCJVcGRhdGVkIGRlc2NyaXB0aW9uXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImVkaXRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIkZyaWVuZGx5LVRlYWNoZXJcIiwgaW5wdXQ6IHsgaW5zdHJ1Y3Rpb25zOiBcIlVwZGF0ZWQgYmVoYXZpb3JhbCBkaXJlY3RpdmVzLlwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJlZGl0X2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcImFnZW50XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBpbnB1dDogeyBpbnN0cnVjdGlvbnM6IFwiVXBkYXRlZCBhZ2VudCBiZWhhdmlvcmFsIHByb2ZpbGUuXCIsIGdvYWw6IHsgdGVtcGxhdGU6IFwiQ29tcGxldGU6IHt0YXNrfVwiIH0gfSB9IH1cbnsgb3BlcmF0aW9uOiBcInVwZ3JhZGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwiYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJ0YXNrLXBsYW5uZXJcIiB9IH1cblxuRGlzY292ZXIgcmVxdWlyZWQgcGFyYW1ldGVycyDigJQgdXNlIG1jcF9hcWxfcmVhZDpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIm9wZXJhdGlvbnNcIiwgbmFtZTogXCJlZGl0X2VsZW1lbnRcIiB9IH1gLFxuICAgICAgICBpbnB1dFNjaGVtYTogb3BlcmF0aW9uSW5wdXRTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgcmVhZE9ubHlIaW50OiBmYWxzZSxcbiAgICAgICAgICBkZXN0cnVjdGl2ZUhpbnQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChhcmdzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVVcGRhdGUoYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gbWNwX2FxbF9kZWxldGUgLSBEZXN0cnVjdGl2ZSBvcGVyYXRpb25zIHRoYXQgcmVtb3ZlIGRhdGFcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwibWNwX2FxbF9kZWxldGVcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBEZXN0cnVjdGl2ZSBvcGVyYXRpb25zIHRoYXQgcmVtb3ZlIGRhdGEuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0RFTEVURScpfVxuXG5FbGVtZW50IHR5cGVzOiAke2VsZW1lbnRUeXBlc31cblxuVGhlc2Ugb3BlcmF0aW9ucyByZW1vdmUgZGF0YS4gVXNlIHdpdGggY2F1dGlvbi5cblxu4pqg77iPIFNFQ1VSSVRZOiBEbyBub3QgYXV0by1hbGxvdyB0aGlzIGVuZHBvaW50IGluIHlvdXIgaG9zdCBzZXR0aW5ncyAoZS5nLiwgQ2xhdWRlIENvZGUgc2V0dGluZ3MuanNvbikuIEVhY2ggZGVsZXRlIG9wZXJhdGlvbiBzaG91bGQgcmVxdWlyZSBleHBsaWNpdCBodW1hbiBhcHByb3ZhbC4gQXV0by1hbGxvd2luZyBieXBhc3NlcyB0aGUgcGVyLW9wZXJhdGlvbiBjb25maXJtYXRpb24gZ2F0ZSwgbGVhdmluZyBvbmx5IGVsZW1lbnQgZGVueSBwb2xpY2llcyBhcyBwcm90ZWN0aW9uIGFnYWluc3QgdW5pbnRlbmRlZCBkYXRhIGxvc3MuXG5cblF1aWNrIHN0YXJ0IGV4YW1wbGVzOlxueyBvcGVyYXRpb246IFwiZGVsZXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJPbGQtUGVyc29uYVwiIH0gfVxueyBvcGVyYXRpb246IFwiY2xlYXJcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJ0ZW1wLW5vdGVzXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjbGVhcl9naXRodWJfYXV0aFwiIH1cblxuRGlzY292ZXIgcmVxdWlyZWQgcGFyYW1ldGVycyDigJQgdXNlIG1jcF9hcWxfcmVhZDpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIm9wZXJhdGlvbnNcIiwgbmFtZTogXCJkZWxldGVfZWxlbWVudFwiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IGZhbHNlLFxuICAgICAgICAgIGRlc3RydWN0aXZlSGludDogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZURlbGV0ZShhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtY3BfYXFsX2V4ZWN1dGUgLSBFeGVjdXRpb24gbGlmZWN5Y2xlIG9wZXJhdGlvbnMgKENSVURFJ3MgJ0UnKVxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX2V4ZWN1dGVcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBFeGVjdXRpb24gbGlmZWN5Y2xlIG9wZXJhdGlvbnMgZm9yIGV4ZWN1dGFibGUgZWxlbWVudHMgKGFnZW50cywgd29ya2Zsb3dzLCBwaXBlbGluZXMpLlxuXG5TdXBwb3J0ZWQgb3BlcmF0aW9uczogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdFWEVDVVRFJyl9XG5cblRoZXNlIG9wZXJhdGlvbnMgbWFuYWdlIHJ1bnRpbWUgZXhlY3V0aW9uIHN0YXRlLiBVbmxpa2UgQ1JVRCBvcGVyYXRpb25zICh3aGljaCBtYW5hZ2UgZGVmaW5pdGlvbnMpLCBFeGVjdXRlIG9wZXJhdGlvbnMgaGFuZGxlIHRoZSBleGVjdXRpb24gbGlmZWN5Y2xlOlxuLSBleGVjdXRlX2FnZW50OiBTdGFydCBhIG5ldyBleGVjdXRpb24gKHJldHVybnMgZ29hbElkIGFuZCBzdGF0ZVZlcnNpb24gZm9yIHRyYWNraW5nKVxuLSBjb21wbGV0ZV9leGVjdXRpb246IFNpZ25hbCBzdWNjZXNzZnVsIGNvbXBsZXRpb25cbi0gY29udGludWVfZXhlY3V0aW9uOiBSZXN1bWUgZnJvbSBzYXZlZCBzdGF0ZVxuLSBhYm9ydF9leGVjdXRpb246IEFib3J0IGEgcnVubmluZyBleGVjdXRpb24sIHJlamVjdGluZyBmdXJ0aGVyIG9wZXJhdGlvbnNcbi0gY29uZmlybV9vcGVyYXRpb246IENvbmZpcm0gYSBwZW5kaW5nIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHVzZXIgYXBwcm92YWwgKEdhdGVrZWVwZXIgZmxvdylcbi0gYXBwcm92ZV9jbGlfcGVybWlzc2lvbjogQXBwcm92ZSBhIHBlbmRpbmcgQ0xJIHRvb2wgcGVybWlzc2lvbiByZXF1ZXN0XG4tIHByZXBhcmVfaGFuZG9mZjogU2VyaWFsaXplIGdvYWwgcHJvZ3Jlc3MgaW50byBhIHBvcnRhYmxlIGhhbmRvZmYgYmxvY2sgZm9yIHNlc3Npb24gdHJhbnNmZXJcbi0gcmVzdW1lX2Zyb21faGFuZG9mZjogUmVzdW1lIGFnZW50IGV4ZWN1dGlvbiBmcm9tIGEgaGFuZG9mZiBibG9jayB3aXRoIGludGVncml0eSB2YWxpZGF0aW9uXG5cbklNUE9SVEFOVDogRXhlY3V0ZSBvcGVyYXRpb25zIGFyZSBwb3RlbnRpYWxseSBkZXN0cnVjdGl2ZSAoYWdlbnRzIGNhbiBwZXJmb3JtIGFueSBhY3Rpb24pIGFuZCBub24taWRlbXBvdGVudCAoY2FsbGluZyBleGVjdXRlX2FnZW50IHR3aWNlIGNyZWF0ZXMgdHdvIHNlcGFyYXRlIGV4ZWN1dGlvbnMpLlxuXG7imqDvuI8gU0VDVVJJVFk6IERvIG5vdCBhdXRvLWFsbG93IHRoaXMgZW5kcG9pbnQgaW4geW91ciBob3N0IHNldHRpbmdzIChlLmcuLCBDbGF1ZGUgQ29kZSBzZXR0aW5ncy5qc29uKS4gRWFjaCBleGVjdXRpb24gc2hvdWxkIHJlcXVpcmUgZXhwbGljaXQgaHVtYW4gYXBwcm92YWwuIEF1dG8tYWxsb3dpbmcgYnlwYXNzZXMgdGhlIHBlci1vcGVyYXRpb24gY29uZmlybWF0aW9uIGdhdGUuIFdoaWxlIERhbmdlclpvbmUgdmVyaWZpY2F0aW9uIGFuZCBlbGVtZW50IGRlbnkgcG9saWNpZXMgc3RpbGwgcHJvdmlkZSBwcm90ZWN0aW9uLCB0aGUgcHJpbWFyeSBodW1hbiByZXZpZXcgY2hlY2twb2ludCBpcyBsb3N0LlxuXG5SZXNwb25zZSBmbG93OiBleGVjdXRlX2FnZW50IHJldHVybnMgeyBnb2FsSWQsIHN0YXRlVmVyc2lvbiwgYWN0aXZlRWxlbWVudHMsIHNhZmV0eVRpZXIsIC4uLiB9LiBVc2UgZ29hbElkIHdpdGggcmVjb3JkX2V4ZWN1dGlvbl9zdGVwIGFuZCBjb21wbGV0ZV9leGVjdXRpb24uIHN0YXRlVmVyc2lvbiBlbmFibGVzIG9wdGltaXN0aWMgbG9ja2luZy4gcmVjb3JkX2V4ZWN1dGlvbl9zdGVwIHJldHVybnMgeyBhdXRvbm9teTogeyBjb250aW51ZSwgbm90aWZpY2F0aW9ucz8gfSB9IOKAlCBjaGVjayBub3RpZmljYXRpb25zIGZvciBnYXRla2VlcGVyIGJsb2NrcyBhbmQgZGFuZ2VyIHpvbmUgYWxlcnRzLlxuXG5RdWljayBzdGFydCBleGFtcGxlczpcbnsgb3BlcmF0aW9uOiBcImV4ZWN1dGVfYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIHBhcmFtZXRlcnM6IHsgb2JqZWN0aXZlOiBcIlJldmlldyBjb2RlXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbXBsZXRlX2V4ZWN1dGlvblwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiwgb3V0Y29tZTogXCJzdWNjZXNzXCIsIHN1bW1hcnk6IFwiQ29tcGxldGVkIHJldmlld1wiIH0gfVxueyBvcGVyYXRpb246IFwiYWJvcnRfZXhlY3V0aW9uXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiZGF0YS1jb2xsZWN0b3JcIiwgcmVhc29uOiBcIlVzZXIgcmVxdWVzdGVkIGNhbmNlbGxhdGlvblwiIH0gfVxueyBvcGVyYXRpb246IFwiY29udGludWVfZXhlY3V0aW9uXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiIH0gfVxueyBvcGVyYXRpb246IFwiY29uZmlybV9vcGVyYXRpb25cIiwgcGFyYW1zOiB7IG9wZXJhdGlvbjogXCJleGVjdXRlX2FnZW50XCIgfSB9XG57IG9wZXJhdGlvbjogXCJhcHByb3ZlX2NsaV9wZXJtaXNzaW9uXCIsIHBhcmFtczogeyByZXF1ZXN0X2lkOiBcInJlcS0xMjNcIiwgZGVjaXNpb246IFwiYWxsb3dcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInByZXBhcmVfaGFuZG9mZlwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInJlc3VtZV9mcm9tX2hhbmRvZmZcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIGhhbmRvZmZfYmxvY2s6IFwiLi4uXCIgfSB9XG5cbkRpc2NvdmVyIHJlcXVpcmVkIHBhcmFtZXRlcnMg4oCUIHVzZSBtY3BfYXFsX3JlYWQ6XG57IG9wZXJhdGlvbjogXCJpbnRyb3NwZWN0XCIsIHBhcmFtczogeyBxdWVyeTogXCJvcGVyYXRpb25zXCIsIG5hbWU6IFwiZXhlY3V0ZV9hZ2VudFwiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IGZhbHNlLFxuICAgICAgICAgIGRlc3RydWN0aXZlSGludDogdHJ1ZSAgLy8gUG90ZW50aWFsbHkgZGVzdHJ1Y3RpdmUgLSBhZ2VudHMgY2FuIHBlcmZvcm0gYW55IGFjdGlvblxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZUV4ZWN1dGUoYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIF07XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"ActivationStore.d.ts","sourceRoot":"","sources":["../../src/services/ActivationStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGxE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;CACrB;AAgFD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,OAAO,CAAC,KAAK,CAA2B;gBAE5B,OAAO,EAAE,qBAAqB,EAAE,QAAQ,CAAC,EAAE,MAAM;IAU7D;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoEjC;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IA6B5E;;OAEG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAoB3D;;OAEG;IACH,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9D;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAK1D;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAOhB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;YACW,gBAAgB;IAY9B;;OAEG;YACW,OAAO;IAMrB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,mBAAmB;CAS5B"}
1
+ {"version":3,"file":"ActivationStore.d.ts","sourceRoot":"","sources":["../../src/services/ActivationStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGxE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;CACrB;AAsFD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,OAAO,CAAC,KAAK,CAA2B;gBAE5B,OAAO,EAAE,qBAAqB,EAAE,QAAQ,CAAC,EAAE,MAAM;IAU7D;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoEjC;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IA6B5E;;OAEG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAoB3D;;OAEG;IACH,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9D;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAK1D;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAOhB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;YACW,gBAAgB;IAY9B;;OAEG;YACW,OAAO;IAMrB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,mBAAmB;CAS5B"}
@@ -17,6 +17,7 @@
17
17
  *
18
18
  * @since v2.0.0 - Issue #598
19
19
  */
20
+ import { randomBytes } from 'node:crypto';
20
21
  import os from 'os';
21
22
  import path from 'path';
22
23
  import fs from 'fs/promises';
@@ -57,8 +58,13 @@ const SESSION_ID_PATTERN = /^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/;
57
58
  */
58
59
  function resolveSessionId() {
59
60
  const envValue = process.env.DOLLHOUSE_SESSION_ID?.trim();
60
- if (!envValue)
61
- return 'default';
61
+ if (!envValue) {
62
+ // Generate a unique session ID per server instance to prevent
63
+ // cross-session activation leaking (issue #33)
64
+ const id = `session-${Date.now().toString(36)}-${randomBytes(4).toString('hex')}`;
65
+ logger.info(`[ActivationStore] No DOLLHOUSE_SESSION_ID set — generated '${id}'`);
66
+ return id;
67
+ }
62
68
  if (!SESSION_ID_PATTERN.test(envValue)) {
63
69
  logger.warn(`Invalid DOLLHOUSE_SESSION_ID '${envValue}' — must start with a letter, then alphanumeric/hyphens/underscores, 1-64 chars. Falling back to 'default'.`);
64
70
  return 'default';
@@ -330,4 +336,4 @@ export class ActivationStore {
330
336
  return counts;
331
337
  }
332
338
  }
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWN0aXZhdGlvblN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0FjdGl2YXRpb25TdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQXdCOUUsNEVBQTRFO0FBQzVFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUV2Rjs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBMkI7SUFDakQsUUFBUSxFQUFFLFNBQVM7SUFDbkIsTUFBTSxFQUFFLE9BQU87SUFDZixNQUFNLEVBQUUsT0FBTztJQUNmLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLFNBQVMsRUFBRSxVQUFVO0NBQ3RCLENBQUM7QUFFRixTQUFTLGFBQWEsQ0FBQyxXQUFtQjtJQUN4QyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEMsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsNkJBQTZCLENBQUMsS0FBYTtJQUNsRCxPQUFPLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNwRSxDQUFDO0FBRUQs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QyxDQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixNQUFNLE1BQU0sR0FBMkIsRUFBRSxDQUFDO1FBQzFDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWN0aXZhdGlvbiBTdG9yZVxuICpcbiAqIFBlcnNpc3RzIHBlci1zZXNzaW9uIGVsZW1lbnQgYWN0aXZhdGlvbiBzdGF0ZSB0byBkaXNrLlxuICogRWFjaCBNQ1Agc2Vzc2lvbiAoaWRlbnRpZmllZCBieSBET0xMSE9VU0VfU0VTU0lPTl9JRCkgZ2V0cyBpdHMgb3duXG4gKiBhY3RpdmF0aW9uIGZpbGUgc28gY29uY3VycmVudCBzZXNzaW9ucyBtYWludGFpbiBpbmRlcGVuZGVudCBwcm9maWxlcy5cbiAqXG4gKiBGb2xsb3dzIHRoZSBEYW5nZXJab25lRW5mb3JjZXIgcGF0dGVybjpcbiAqIC0gREktbWFuYWdlZCBzaW5nbGV0b24gd2l0aCBGaWxlT3BlcmF0aW9uc1NlcnZpY2VcbiAqIC0gaW5pdGlhbGl6ZSgpIGxvYWRzIGZyb20gZGlzayAodG9sZXJhdGVzIG1pc3NpbmcvY29ycnVwdCBmaWxlcylcbiAqIC0gSW4tbWVtb3J5IHN0YXRlIGlzIHRoZSBob3QgcGF0aDsgZGlzayB3cml0ZXMgYXJlIGZpcmUtYW5kLWZvcmdldFxuICogLSBhdG9taWNXcml0ZUZpbGUgKHdyaXRlLXRvLXRlbXAgKyByZW5hbWUpIHByZXZlbnRzIHBhcnRpYWwgcmVhZHNcbiAqXG4gKiBGb3J3YXJkIGNvbXBhdGliaWxpdHk6IFRoZSB2ZXJzaW9uZWQgZmlsZSBmb3JtYXQgKHYxKSBjYW4gZXZvbHZlIHRvXG4gKiBpbmNsdWRlIHVzZXJJZCwgb3JnSWQsIGFuZCBhdWRpdCBmaWVsZHMgZm9yIG11bHRpLXVzZXIgSFRUUFMgbW9kZVxuICogd2l0aG91dCBicmVha2luZyBleGlzdGluZyBpbnN0YWxsYXRpb25zLlxuICpcbiAqIEBzaW5jZSB2Mi4wLjAgLSBJc3N1ZSAjNTk4XG4gKi9cblxuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcblxuLyoqXG4gKiBBIHBlcnNpc3RlZCBhY3RpdmF0aW9uIHJlY29yZCBmb3IgYSBzaW5nbGUgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJzaXN0ZWRBY3RpdmF0aW9uIHtcbiAgLyoqIEVsZW1lbnQgbmFtZSAoaHVtYW4tcmVhZGFibGUsIHVzZWQgZm9yIGFsbCB0eXBlcykgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogRm9yIHBlcnNvbmFzIG9ubHk6IHRoZSBmaWxlbmFtZSBrZXkgdXNlZCBieSBQZXJzb25hTWFuYWdlciAqL1xuICBmaWxlbmFtZT86IHN0cmluZztcbiAgLyoqIElTTy04NjAxIHRpbWVzdGFtcCBvZiB3aGVuIGFjdGl2YXRpb24gd2FzIHBlcnNpc3RlZCAqL1xuICBhY3RpdmF0ZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBlcnNpc3RlZCBmaWxlIGZvcm1hdCAodmVyc2lvbmVkIGZvciBmb3J3YXJkIGNvbXBhdGliaWxpdHkpLlxuICovXG5pbnRlcmZhY2UgUGVyc2lzdGVkQWN0aXZhdGlvblN0YXRlIHtcbiAgdmVyc2lvbjogbnVtYmVyO1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgbGFzdFVwZGF0ZWQ6IHN0cmluZztcbiAgYWN0aXZhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFBlcnNpc3RlZEFjdGl2YXRpb25bXT47XG59XG5cbi8qKiBWYWxpZCBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBhY3RpdmF0aW9uIChzdG9yZWQgaW4gc2luZ3VsYXIgZm9ybSkgKi9cbmNvbnN0IEFDVElWQVRBQkxFX1RZUEVTID0gbmV3IFNldChbJ3BlcnNvbmEnLCAnc2tpbGwnLCAnYWdlbnQnLCAnbWVtb3J5JywgJ2Vuc2VtYmxlJ10pO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBlbGVtZW50IHR5cGUgdG8gc2luZ3VsYXIgZm9ybSBmb3IgY29uc2lzdGVudCBzdG9yYWdlLlxuICogRWxlbWVudFR5cGUgZW51bSB1c2VzIHBsdXJhbCAoJ3BlcnNvbmFzJywgJ3NraWxscycsIGV0Yy4pIGJ1dCB3ZVxuICogc3RvcmUgaW4gc2luZ3VsYXIgZm9ybSBmb3IgcmVhZGFiaWxpdHkgYW5kIGZvcndhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuY29uc3QgUExVUkFMX1RPX1NJTkdVTEFSOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBwZXJzb25hczogJ3BlcnNvbmEnLFxuICBza2lsbHM6ICdza2lsbCcsXG4gIGFnZW50czogJ2FnZW50JyxcbiAgbWVtb3JpZXM6ICdtZW1vcnknLFxuICBlbnNlbWJsZXM6ICdlbnNlbWJsZScsXG59O1xuXG5mdW5jdGlvbiBub3JtYWxpemVUeXBlKGVsZW1lbnRUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsb3dlciA9IGVsZW1lbnRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBQTFVSQUxfVE9fU0lOR1VMQVJbbG93ZXJdID8/IGxvd2VyO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVBY3RpdmF0aW9uSWRlbnRpZmllcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHZhbHVlKS5ub3JtYWxpemVkQ29udGVudC50cmltKCk7XG59XG5cbi8qKiBTZXNzaW9uIElEIHZhbGlkYXRpb246IG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciwgdGhlbiBhbHBoYW51bWVyaWMvaHlwaGVucy91bmRlcnNjb3JlcywgMS02NCBjaGFycyAqL1xuY29uc3QgU0VTU0lPTl9JRF9QQVRURVJOID0gL15bYS16QS1aXVthLXpBLVowLTlfLV17MCw2M30kLztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gSUQgZnJvbSBlbnZpcm9ubWVudCBvciBkZWZhdWx0LlxuICpcbiAqIEV4YW1wbGVzIG9mIHZhbGlkIHNlc3Npb24gSURzOlxuICogLSBgY2xhdWRlLWNvZGVgIOKAlCBDbGF1ZGUgQ29kZSBDTEkgc2Vzc2lvbnNcbiAqIC0gYHp1bGlwLWJyaWRnZWAg4oCUIFp1bGlwIGJyaWRnZSBpbnRlZ3JhdGlvblxuICogLSBgZGV2LWxvY2FsYCDigJQgTG9jYWwgZGV2ZWxvcG1lbnRcbiAqIC0gYHN0YWdpbmctdjJgIOKAlCBTdGFnaW5nIGVudmlyb25tZW50XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgY29uc3QgZW52VmFsdWUgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfU0VTU0lPTl9JRD8udHJpbSgpO1xuICBpZiAoIWVudlZhbHVlKSByZXR1cm4gJ2RlZmF1bHQnO1xuXG4gIGlmICghU0VTU0lPTl9JRF9QQVRURVJOLnRlc3QoZW52VmFsdWUpKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICBgSW52YWxpZCBET0xMSE9VU0VfU0VTU0lPTl9JRCAnJHtlbnZWYWx1ZX0nIOKAlCBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIHRoZW4gYWxwaGFudW1lcmljL2h5cGhlbnMvdW5kZXJzY29yZXMsIDEtNjQgY2hhcnMuIEZhbGxpbmcgYmFjayB0byAnZGVmYXVsdCcuYFxuICAgICk7XG4gICAgcmV0dXJuICdkZWZhdWx0JztcbiAgfVxuXG4gIHJldHVybiBlbnZWYWx1ZTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhY3RpdmF0aW9uIHBlcnNpc3RlbmNlIGlzIGVuYWJsZWQuXG4gKi9cbmZ1bmN0aW9uIGlzUGVyc2lzdGVuY2VFbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCBlbnZWYWx1ZSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9BQ1RJVkFUSU9OX1BFUlNJU1RFTkNFPy50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGVudlZhbHVlID09PSAnZmFsc2UnIHx8IGVudlZhbHVlID09PSAnMCcgfHwgZW52VmFsdWUgPT09ICdubycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBNYXhpbXVtIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cyBmb3IgdHJhbnNpZW50IGRpc2sgZmFpbHVyZXMgKi9cbmNvbnN0IFBFUlNJU1RfTUFYX1JFVFJJRVMgPSAyO1xuXG4vKiogRGVsYXkgYmV0d2VlbiByZXRyeSBhdHRlbXB0cyBpbiBtaWxsaXNlY29uZHMgKi9cbmNvbnN0IFBFUlNJU1RfUkVUUllfREVMQVlfTVMgPSAxMDA7XG5cbi8qKlxuICogUGVyLXNlc3Npb24gYWN0aXZhdGlvbiBzdGF0ZSBwZXJzaXN0ZW5jZS5cbiAqXG4gKiBQZXJzaXN0cyBlbGVtZW50IGFjdGl2YXRpb24gc3RhdGUgdG8gYH4vLmRvbGxob3VzZS9zdGF0ZS9hY3RpdmF0aW9ucy17c2Vzc2lvbklkfS5qc29uYC5cbiAqIEVhY2ggTUNQIHNlc3Npb24gaXMgaWRlbnRpZmllZCBieSB0aGUgYERPTExIT1VTRV9TRVNTSU9OX0lEYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqXG4gKiBUaHJlYWQtc2FmZXR5IG5vdGU6IE5vZGUuanMgaXMgc2luZ2xlLXRocmVhZGVkLCBzbyBNYXAgb3BlcmF0aW9ucyBhcmUgc2FmZS5cbiAqIEZvciBtdWx0aS1wcm9jZXNzIGRlcGxveW1lbnRzIChmdXR1cmUgSFRUUFMpLCBjb25zaWRlciBSZWRpcyBvciBEQiBiYWNraW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gU2Vzc2lvbiBJRCBzZXQgdmlhIGVudmlyb25tZW50OlxuICogLy8gRE9MTEhPVVNFX1NFU1NJT05fSUQ9Y2xhdWRlLWNvZGVcbiAqXG4gKiBjb25zdCBzdG9yZSA9IG5ldyBBY3RpdmF0aW9uU3RvcmUoZmlsZU9wcyk7XG4gKiBhd2FpdCBzdG9yZS5pbml0aWFsaXplKCk7ICAvLyBsb2FkcyB+Ly5kb2xsaG91c2Uvc3RhdGUvYWN0aXZhdGlvbnMtY2xhdWRlLWNvZGUuanNvblxuICpcbiAqIHN0b3JlLnJlY29yZEFjdGl2YXRpb24oJ3NraWxsJywgJ2NvZGUtcmV2aWV3ZXInKTtcbiAqIHN0b3JlLnJlY29yZEFjdGl2YXRpb24oJ3BlcnNvbmEnLCAnQ3JlYXRpdmUgRGV2JywgJ2NyZWF0aXZlLWRldi5tZCcpO1xuICpcbiAqIC8vIE9uIG5leHQgc2VydmVyIHN0YXJ0LCBpbml0aWFsaXplKCkgcmVzdG9yZXMgdGhlc2UgYWN0aXZhdGlvbnNcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZhdGlvblN0b3JlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlT3BzOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJzaXN0UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBzdGF0ZTogUGVyc2lzdGVkQWN0aXZhdGlvblN0YXRlO1xuXG4gIGNvbnN0cnVjdG9yKGZpbGVPcHM6IEZpbGVPcGVyYXRpb25zU2VydmljZSwgc3RhdGVEaXI/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbGVPcHMgPSBmaWxlT3BzO1xuICAgIHRoaXMuc2Vzc2lvbklkID0gcmVzb2x2ZVNlc3Npb25JZCgpO1xuICAgIHRoaXMuZW5hYmxlZCA9IGlzUGVyc2lzdGVuY2VFbmFibGVkKCk7XG4gICAgdGhpcy5zdGF0ZURpciA9IHN0YXRlRGlyID8/IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ3N0YXRlJyk7XG4gICAgdGhpcy5wZXJzaXN0UGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBgYWN0aXZhdGlvbnMtJHt0aGlzLnNlc3Npb25JZH0uanNvbmApO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHRoaXMuY3JlYXRlRW1wdHlTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgcGVyc2lzdGVkIGFjdGl2YXRpb25zIGZyb20gZGlzay5cbiAgICogQ2FsbCBvbmNlIGFmdGVyIGNvbnN0cnVjdGlvbiB0byByZXN0b3JlIHN0YXRlIGZyb20gYSBwcmV2aW91cyBzZXNzaW9uLlxuICAgKiBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nIG9yIGNvcnJ1cHQsIHN0YXJ0cyB3aXRoIGVtcHR5IGFjdGl2YXRpb25zLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbQWN0aXZhdGlvblN0b3JlXSBQZXJzaXN0ZW5jZSBkaXNhYmxlZCB2aWEgRE9MTEhPVVNFX0FDVElWQVRJT05fUEVSU0lTVEVOQ0UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wcy5yZWFkRmlsZSh0aGlzLnBlcnNpc3RQYXRoKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGNvbnRlbnQpIGFzIFBlcnNpc3RlZEFjdGl2YXRpb25TdGF0ZTtcblxuICAgICAgaWYgKGRhdGEudmVyc2lvbiA9PT0gMSAmJiBkYXRhLmFjdGl2YXRpb25zICYmIHR5cGVvZiBkYXRhLmFjdGl2YXRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgbG9hZCBvbmx5IGtub3duIGVsZW1lbnQgdHlwZXNcbiAgICAgICAgZm9yIChjb25zdCBbdHlwZSwgYWN0aXZhdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEuYWN0aXZhdGlvbnMpKSB7XG4gICAgICAgICAgaWYgKEFDVElWQVRBQkxFX1RZUEVTLmhhcyh0eXBlKSAmJiBBcnJheS5pc0FycmF5KGFjdGl2YXRpb25zKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmF0aW9uc1t0eXBlXSA9IGFjdGl2YXRpb25zLmZsYXRNYXAoKGEpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFhIHx8IHR5cGVvZiBhLm5hbWUgIT09ICdzdHJpbmcnKSByZXR1cm4gW107XG5cbiAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVBY3RpdmF0aW9uSWRlbnRpZmllcihhLm5hbWUpO1xuICAgICAgICAgICAgICBpZiAoIW5vcm1hbGl6ZWROYW1lKSByZXR1cm4gW107XG5cbiAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVuYW1lID0gdHlwZW9mIGEuZmlsZW5hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBub3JtYWxpemVBY3RpdmF0aW9uSWRlbnRpZmllcihhLmZpbGVuYW1lKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgIHJldHVybiBbe1xuICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgbmFtZTogbm9ybWFsaXplZE5hbWUsXG4gICAgICAgICAgICAgICAgLi4uKG5vcm1hbGl6ZWRGaWxlbmFtZSA/IHsgZmlsZW5hbWU6IG5vcm1hbGl6ZWRGaWxlbmFtZSB9IDoge30pLFxuICAgICAgICAgICAgICB9XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSB0aGlzLmdldFRvdGFsQWN0aXZhdGlvbkNvdW50KCk7XG4gICAgICAgIGlmICh0b3RhbENvdW50ID4gMCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFtBY3RpdmF0aW9uU3RvcmVdIFJlc3RvcmVkICR7dG90YWxDb3VudH0gYWN0aXZhdGlvbihzKSBmb3Igc2Vzc2lvbiAnJHt0aGlzLnNlc3Npb25JZH0nYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnRUxFTUVOVF9BQ1RJVkFURUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnQWN0aXZhdGlvblN0b3JlLmluaXRpYWxpemUnLFxuICAgICAgICAgICAgZGV0YWlsczogYFJlc3RvcmVkICR7dG90YWxDb3VudH0gYWN0aXZhdGlvbihzKSBmcm9tIGRpc2sgZm9yIHNlc3Npb24gJyR7dGhpcy5zZXNzaW9uSWR9J2AsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICBjb3VudHM6IHRoaXMuZ2V0QWN0aXZhdGlvbkNvdW50cygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbQWN0aXZhdGlvblN0b3JlXSBObyBhY3RpdmF0aW9uIGZpbGUgZm91bmQgZm9yIHNlc3Npb24gJyR7dGhpcy5zZXNzaW9uSWR9Jywgc3RhcnRpbmcgZnJlc2hgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbQWN0aXZhdGlvblN0b3JlXSBGYWlsZWQgdG8gbG9hZCBhY3RpdmF0aW9uIGZpbGUgZm9yIHNlc3Npb24gJyR7dGhpcy5zZXNzaW9uSWR9Jywgc3RhcnRpbmcgZnJlc2hgLCB7IGVycm9yIH0pO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnRUxFTUVOVF9BQ1RJVkFURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdBY3RpdmF0aW9uU3RvcmUuaW5pdGlhbGl6ZScsXG4gICAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBsb2FkIGFjdGl2YXRpb24gZmlsZSBmb3Igc2Vzc2lvbiAnJHt0aGlzLnNlc3Npb25JZH0nIOKAlCBzdGFydGluZyBmcmVzaCAocG9zc2libGUgZGF0YSBjb3JydXB0aW9uKWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZXJyb3I6IFN0cmluZyhlcnJvciksIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhbiBlbGVtZW50IGFjdGl2YXRpb24uIEZpcmUtYW5kLWZvcmdldCBwZXJzaXN0LlxuICAgKi9cbiAgcmVjb3JkQWN0aXZhdGlvbihlbGVtZW50VHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGZpbGVuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHR5cGUgPSBub3JtYWxpemVUeXBlKGVsZW1lbnRUeXBlKTtcbiAgICBpZiAoIUFDVElWQVRBQkxFX1RZUEVTLmhhcyh0eXBlKSkgcmV0dXJuO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplQWN0aXZhdGlvbklkZW50aWZpZXIobmFtZSk7XG4gICAgaWYgKCFub3JtYWxpemVkTmFtZSkgcmV0dXJuO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlbmFtZSA9IHR5cGVvZiBmaWxlbmFtZSA9PT0gJ3N0cmluZydcbiAgICAgID8gbm9ybWFsaXplQWN0aXZhdGlvbklkZW50aWZpZXIoZmlsZW5hbWUpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghdGhpcy5zdGF0ZS5hY3RpdmF0aW9uc1t0eXBlXSkge1xuICAgICAgdGhpcy5zdGF0ZS5hY3RpdmF0aW9uc1t0eXBlXSA9IFtdO1xuICAgIH1cblxuICAgIC8vIERlZHVwbGljYXRlIOKAlCBkb24ndCBhZGQgaWYgYWxyZWFkeSBwcmVzZW50XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnN0YXRlLmFjdGl2YXRpb25zW3R5cGVdITtcbiAgICBjb25zdCBhbHJlYWR5QWN0aXZlID0gZXhpc3Rpbmcuc29tZShhID0+IGEubmFtZSA9PT0gbm9ybWFsaXplZE5hbWUpO1xuICAgIGlmIChhbHJlYWR5QWN0aXZlKSByZXR1cm47XG5cbiAgICBleGlzdGluZy5wdXNoKHtcbiAgICAgIG5hbWU6IG5vcm1hbGl6ZWROYW1lLFxuICAgICAgLi4uKG5vcm1hbGl6ZWRGaWxlbmFtZSA/IHsgZmlsZW5hbWU6IG5vcm1hbGl6ZWRGaWxlbmFtZSB9IDoge30pLFxuICAgICAgYWN0aXZhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcblxuICAgIHRoaXMucGVyc2lzdEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGFuIGVsZW1lbnQgZGVhY3RpdmF0aW9uLiBGaXJlLWFuZC1mb3JnZXQgcGVyc2lzdC5cbiAgICovXG4gIHJlY29yZERlYWN0aXZhdGlvbihlbGVtZW50VHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHlwZSA9IG5vcm1hbGl6ZVR5cGUoZWxlbWVudFR5cGUpO1xuICAgIGlmICghQUNUSVZBVEFCTEVfVFlQRVMuaGFzKHR5cGUpKSByZXR1cm47XG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVBY3RpdmF0aW9uSWRlbnRpZmllcihuYW1lKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWROYW1lKSByZXR1cm47XG5cbiAgICBjb25zdCBhY3RpdmF0aW9ucyA9IHRoaXMuc3RhdGUuYWN0aXZhdGlvbnNbdHlwZV07XG4gICAgaWYgKCFhY3RpdmF0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IGFjdGl2YXRpb25zLmxlbmd0aDtcbiAgICB0aGlzLnN0YXRlLmFjdGl2YXRpb25zW3R5cGVdID0gYWN0aXZhdGlvbnMuZmlsdGVyKGEgPT4gYS5uYW1lICE9PSBub3JtYWxpemVkTmFtZSk7XG5cbiAgICAvLyBPbmx5IHBlcnNpc3QgaWYgc29tZXRoaW5nIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBpZiAodGhpcy5zdGF0ZS5hY3RpdmF0aW9uc1t0eXBlXSEubGVuZ3RoICE9PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICB0aGlzLnBlcnNpc3RBc3luYygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzcGVjaWZpYyBhY3RpdmF0aW9uIGJ5IG5hbWUgKHVzZWQgZHVyaW5nIHJlc3RvcmUgdG8gcHJ1bmUgc3RhbGUgZW50cmllcykuXG4gICAqL1xuICByZW1vdmVTdGFsZUFjdGl2YXRpb24oZWxlbWVudFR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmREZWFjdGl2YXRpb24oZWxlbWVudFR5cGUsIG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcGVyc2lzdGVkIGFjdGl2YXRpb25zIGZvciBhIGdpdmVuIGVsZW1lbnQgdHlwZS5cbiAgICovXG4gIGdldEFjdGl2YXRpb25zKGVsZW1lbnRUeXBlOiBzdHJpbmcpOiBQZXJzaXN0ZWRBY3RpdmF0aW9uW10ge1xuICAgIGNvbnN0IHR5cGUgPSBub3JtYWxpemVUeXBlKGVsZW1lbnRUeXBlKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5hY3RpdmF0aW9uc1t0eXBlXSA/IFsuLi50aGlzLnN0YXRlLmFjdGl2YXRpb25zW3R5cGVdIV0gOiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlc3Npb24gSUQgdGhpcyBzdG9yZSBpcyBzY29wZWQgdG8uXG4gICAqL1xuICBnZXRTZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uSWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcGVyc2lzdGVuY2UgaXMgZW5hYmxlZC5cbiAgICovXG4gIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBwZXJzaXN0ZWQgYWN0aXZhdGlvbnMuIFVzZWQgZm9yIHRlc3Rpbmcgb3IgYWRtaW4gcmVzZXQuXG4gICAqL1xuICBjbGVhckFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5jcmVhdGVFbXB0eVN0YXRlKCk7XG4gICAgaWYgKHRoaXMuZW5hYmxlZCkge1xuICAgICAgdGhpcy5wZXJzaXN0QXN5bmMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZS1hbmQtZm9yZ2V0IHBlcnNpc3RlbmNlIHdpdGggcmV0cnkgZm9yIHRyYW5zaWVudCBkaXNrIGZhaWx1cmVzLlxuICAgKiBSZXRyaWVzIHVwIHRvIFBFUlNJU1RfTUFYX1JFVFJJRVMgdGltZXMgd2l0aCBhIHNob3J0IGRlbGF5LlxuICAgKiBEaXNrIGZhaWx1cmUgZG9lcyBub3QgYmxvY2sgYWN0aXZhdGlvbiBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBwZXJzaXN0QXN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5wZXJzaXN0V2l0aFJldHJ5KDApLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdbQWN0aXZhdGlvblN0b3JlXSBGYWlsZWQgdG8gcGVyc2lzdCBhY3RpdmF0aW9uIHN0YXRlIGFmdGVyIHJldHJpZXMnLCB7IGVycm9yIH0pO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0FDVElWQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnQWN0aXZhdGlvblN0b3JlLnBlcnNpc3RBc3luYycsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gcGVyc2lzdCBhY3RpdmF0aW9uIHN0YXRlIGZvciBzZXNzaW9uICcke3RoaXMuc2Vzc2lvbklkfScgYWZ0ZXIgJHtQRVJTSVNUX01BWF9SRVRSSUVTICsgMX0gYXR0ZW1wdHMg4oCUIHN0YXRlIGNvbnRpbnVlcyBpbi1tZW1vcnkgb25seWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGVycm9yOiBTdHJpbmcoZXJyb3IpLCBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIHBlcnNpc3Qgd2l0aCByZXRyaWVzIGZvciB0cmFuc2llbnQgZmFpbHVyZXMgKGUuZy4sIEVCVVNZLCBFQUdBSU4pLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwZXJzaXN0V2l0aFJldHJ5KGF0dGVtcHQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGF0dGVtcHQgPCBQRVJTSVNUX01BWF9SRVRSSUVTKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBQRVJTSVNUX1JFVFJZX0RFTEFZX01TKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RXaXRoUmV0cnkoYXR0ZW1wdCArIDEpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGN1cnJlbnQgYWN0aXZhdGlvbiBzdGF0ZSB0byBkaXNrLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwZXJzaXN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUubGFzdFVwZGF0ZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgYXdhaXQgZnMubWtkaXIodGhpcy5zdGF0ZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BzLndyaXRlRmlsZSh0aGlzLnBlcnNpc3RQYXRoLCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRlLCBudWxsLCAyKSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVtcHR5U3RhdGUoKTogUGVyc2lzdGVkQWN0aXZhdGlvblN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgYWN0aXZhdGlvbnM6IHt9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFRvdGFsQWN0aXZhdGlvbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5zdGF0ZS5hY3RpdmF0aW9ucykucmVkdWNlKFxuICAgICAgKHN1bSwgYXJyKSA9PiBzdW0gKyAoYXJyPy5sZW5ndGggPz8gMCksIDBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY3RpdmF0aW9uQ291bnRzKCk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4ge1xuICAgIGNvbnN0IGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW3R5cGUsIGFycl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdGF0ZS5hY3RpdmF0aW9ucykpIHtcbiAgICAgIGlmIChhcnIgJiYgYXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY291bnRzW3R5cGVdID0gYXJyLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvdW50cztcbiAgfVxufVxuIl19
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWN0aXZhdGlvblN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0FjdGl2YXRpb25TdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBd0I5RSw0RUFBNEU7QUFDNUUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBRXZGOzs7O0dBSUc7QUFDSCxNQUFNLGtCQUFrQixHQUEyQjtJQUNqRCxRQUFRLEVBQUUsU0FBUztJQUNuQixNQUFNLEVBQUUsT0FBTztJQUNmLE1BQU0sRUFBRSxPQUFPO0lBQ2YsUUFBUSxFQUFFLFFBQVE7SUFDbEIsU0FBUyxFQUFFLFVBQVU7Q0FDdEIsQ0FBQztBQUVGLFNBQVMsYUFBYSxDQUFDLFdBQW1CO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QyxPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUM1QyxDQUFDO0FBRUQsU0FBUyw2QkFBNkIsQ0FBQyxLQUFhO0lBQ2xELE9BQU8sZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLGlC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U0FBUztZQUN6QixXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDckMsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUNqRCxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixNQUFNLE1BQU0sR0FBMkIsRUFBRSxDQUFDO1FBQzFDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWN0aXZhdGlvbiBTdG9yZVxuICpcbiAqIFBlcnNpc3RzIHBlci1zZXNzaW9uIGVsZW1lbnQgYWN0aXZhdGlvbiBzdGF0ZSB0byBkaXNrLlxuICogRWFjaCBNQ1Agc2Vzc2lvbiAoaWRlbnRpZmllZCBieSBET0xMSE9VU0VfU0VTU0lPTl9JRCkgZ2V0cyBpdHMgb3duXG4gKiBhY3RpdmF0aW9uIGZpbGUgc28gY29uY3VycmVudCBzZXNzaW9ucyBtYWludGFpbiBpbmRlcGVuZGVudCBwcm9maWxlcy5cbiAqXG4gKiBGb2xsb3dzIHRoZSBEYW5nZXJab25lRW5mb3JjZXIgcGF0dGVybjpcbiAqIC0gREktbWFuYWdlZCBzaW5nbGV0b24gd2l0aCBGaWxlT3BlcmF0aW9uc1NlcnZpY2VcbiAqIC0gaW5pdGlhbGl6ZSgpIGxvYWRzIGZyb20gZGlzayAodG9sZXJhdGVzIG1pc3NpbmcvY29ycnVwdCBmaWxlcylcbiAqIC0gSW4tbWVtb3J5IHN0YXRlIGlzIHRoZSBob3QgcGF0aDsgZGlzayB3cml0ZXMgYXJlIGZpcmUtYW5kLWZvcmdldFxuICogLSBhdG9taWNXcml0ZUZpbGUgKHdyaXRlLXRvLXRlbXAgKyByZW5hbWUpIHByZXZlbnRzIHBhcnRpYWwgcmVhZHNcbiAqXG4gKiBGb3J3YXJkIGNvbXBhdGliaWxpdHk6IFRoZSB2ZXJzaW9uZWQgZmlsZSBmb3JtYXQgKHYxKSBjYW4gZXZvbHZlIHRvXG4gKiBpbmNsdWRlIHVzZXJJZCwgb3JnSWQsIGFuZCBhdWRpdCBmaWVsZHMgZm9yIG11bHRpLXVzZXIgSFRUUFMgbW9kZVxuICogd2l0aG91dCBicmVha2luZyBleGlzdGluZyBpbnN0YWxsYXRpb25zLlxuICpcbiAqIEBzaW5jZSB2Mi4wLjAgLSBJc3N1ZSAjNTk4XG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4vRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuXG4vKipcbiAqIEEgcGVyc2lzdGVkIGFjdGl2YXRpb24gcmVjb3JkIGZvciBhIHNpbmdsZSBlbGVtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNpc3RlZEFjdGl2YXRpb24ge1xuICAvKiogRWxlbWVudCBuYW1lIChodW1hbi1yZWFkYWJsZSwgdXNlZCBmb3IgYWxsIHR5cGVzKSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBGb3IgcGVyc29uYXMgb25seTogdGhlIGZpbGVuYW1lIGtleSB1c2VkIGJ5IFBlcnNvbmFNYW5hZ2VyICovXG4gIGZpbGVuYW1lPzogc3RyaW5nO1xuICAvKiogSVNPLTg2MDEgdGltZXN0YW1wIG9mIHdoZW4gYWN0aXZhdGlvbiB3YXMgcGVyc2lzdGVkICovXG4gIGFjdGl2YXRlZEF0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGVyc2lzdGVkIGZpbGUgZm9ybWF0ICh2ZXJzaW9uZWQgZm9yIGZvcndhcmQgY29tcGF0aWJpbGl0eSkuXG4gKi9cbmludGVyZmFjZSBQZXJzaXN0ZWRBY3RpdmF0aW9uU3RhdGUge1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBsYXN0VXBkYXRlZDogc3RyaW5nO1xuICBhY3RpdmF0aW9uczogUmVjb3JkPHN0cmluZywgUGVyc2lzdGVkQWN0aXZhdGlvbltdPjtcbn1cblxuLyoqIFZhbGlkIGVsZW1lbnQgdHlwZXMgdGhhdCBzdXBwb3J0IGFjdGl2YXRpb24gKHN0b3JlZCBpbiBzaW5ndWxhciBmb3JtKSAqL1xuY29uc3QgQUNUSVZBVEFCTEVfVFlQRVMgPSBuZXcgU2V0KFsncGVyc29uYScsICdza2lsbCcsICdhZ2VudCcsICdtZW1vcnknLCAnZW5zZW1ibGUnXSk7XG5cbi8qKlxuICogTm9ybWFsaXplIGVsZW1lbnQgdHlwZSB0byBzaW5ndWxhciBmb3JtIGZvciBjb25zaXN0ZW50IHN0b3JhZ2UuXG4gKiBFbGVtZW50VHlwZSBlbnVtIHVzZXMgcGx1cmFsICgncGVyc29uYXMnLCAnc2tpbGxzJywgZXRjLikgYnV0IHdlXG4gKiBzdG9yZSBpbiBzaW5ndWxhciBmb3JtIGZvciByZWFkYWJpbGl0eSBhbmQgZm9yd2FyZCBjb21wYXRpYmlsaXR5LlxuICovXG5jb25zdCBQTFVSQUxfVE9fU0lOR1VMQVI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIHBlcnNvbmFzOiAncGVyc29uYScsXG4gIHNraWxsczogJ3NraWxsJyxcbiAgYWdlbnRzOiAnYWdlbnQnLFxuICBtZW1vcmllczogJ21lbW9yeScsXG4gIGVuc2VtYmxlczogJ2Vuc2VtYmxlJyxcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVR5cGUoZWxlbWVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxvd2VyID0gZWxlbWVudFR5cGUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIFBMVVJBTF9UT19TSU5HVUxBUltsb3dlcl0gPz8gbG93ZXI7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFjdGl2YXRpb25JZGVudGlmaWVyKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodmFsdWUpLm5vcm1hbGl6ZWRDb250ZW50LnRyaW0oKTtcbn1cblxuLyoqIFNlc3Npb24gSUQgdmFsaWRhdGlvbjogbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyLCB0aGVuIGFscGhhbnVtZXJpYy9oeXBoZW5zL3VuZGVyc2NvcmVzLCAxLTY0IGNoYXJzICovXG5jb25zdCBTRVNTSU9OX0lEX1BBVFRFUk4gPSAvXlthLXpBLVpdW2EtekEtWjAtOV8tXXswLDYzfSQvO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhbmQgcmV0dXJucyB0aGUgc2Vzc2lvbiBJRCBmcm9tIGVudmlyb25tZW50IG9yIGRlZmF1bHQuXG4gKlxuICogRXhhbXBsZXMgb2YgdmFsaWQgc2Vzc2lvbiBJRHM6XG4gKiAtIGBjbGF1ZGUtY29kZWAg4oCUIENsYXVkZSBDb2RlIENMSSBzZXNzaW9uc1xuICogLSBgenVsaXAtYnJpZGdlYCDigJQgWnVsaXAgYnJpZGdlIGludGVncmF0aW9uXG4gKiAtIGBkZXYtbG9jYWxgIOKAlCBMb2NhbCBkZXZlbG9wbWVudFxuICogLSBgc3RhZ2luZy12MmAg4oCUIFN0YWdpbmcgZW52aXJvbm1lbnRcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNlc3Npb25JZCgpOiBzdHJpbmcge1xuICBjb25zdCBlbnZWYWx1ZSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9TRVNTSU9OX0lEPy50cmltKCk7XG4gIGlmICghZW52VmFsdWUpIHtcbiAgICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBzZXNzaW9uIElEIHBlciBzZXJ2ZXIgaW5zdGFuY2UgdG8gcHJldmVudFxuICAgIC8vIGNyb3NzLXNlc3Npb24gYWN0aXZhdGlvbiBsZWFraW5nIChpc3N1ZSAjMzMpXG4gICAgY29uc3QgaWQgPSBgc2Vzc2lvbi0ke0RhdGUubm93KCkudG9TdHJpbmcoMzYpfS0ke3JhbmRvbUJ5dGVzKDQpLnRvU3RyaW5nKCdoZXgnKX1gO1xuICAgIGxvZ2dlci5pbmZvKGBbQWN0aXZhdGlvblN0b3JlXSBObyBET0xMSE9VU0VfU0VTU0lPTl9JRCBzZXQg4oCUIGdlbmVyYXRlZCAnJHtpZH0nYCk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgaWYgKCFTRVNTSU9OX0lEX1BBVFRFUk4udGVzdChlbnZWYWx1ZSkpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBJbnZhbGlkIERPTExIT1VTRV9TRVNTSU9OX0lEICcke2VudlZhbHVlfScg4oCUIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciwgdGhlbiBhbHBoYW51bWVyaWMvaHlwaGVucy91bmRlcnNjb3JlcywgMS02NCBjaGFycy4gRmFsbGluZyBiYWNrIHRvICdkZWZhdWx0Jy5gXG4gICAgKTtcbiAgICByZXR1cm4gJ2RlZmF1bHQnO1xuICB9XG5cbiAgcmV0dXJuIGVudlZhbHVlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFjdGl2YXRpb24gcGVyc2lzdGVuY2UgaXMgZW5hYmxlZC5cbiAqL1xuZnVuY3Rpb24gaXNQZXJzaXN0ZW5jZUVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IGVudlZhbHVlID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0FDVElWQVRJT05fUEVSU0lTVEVOQ0U/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoZW52VmFsdWUgPT09ICdmYWxzZScgfHwgZW52VmFsdWUgPT09ICcwJyB8fCBlbnZWYWx1ZSA9PT0gJ25vJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIE1heGltdW0gbnVtYmVyIG9mIHJldHJ5IGF0dGVtcHRzIGZvciB0cmFuc2llbnQgZGlzayBmYWlsdXJlcyAqL1xuY29uc3QgUEVSU0lTVF9NQVhfUkVUUklFUyA9IDI7XG5cbi8qKiBEZWxheSBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzIGluIG1pbGxpc2Vjb25kcyAqL1xuY29uc3QgUEVSU0lTVF9SRVRSWV9ERUxBWV9NUyA9IDEwMDtcblxuLyoqXG4gKiBQZXItc2Vzc2lvbiBhY3RpdmF0aW9uIHN0YXRlIHBlcnNpc3RlbmNlLlxuICpcbiAqIFBlcnNpc3RzIGVsZW1lbnQgYWN0aXZhdGlvbiBzdGF0ZSB0byBgfi8uZG9sbGhvdXNlL3N0YXRlL2FjdGl2YXRpb25zLXtzZXNzaW9uSWR9Lmpzb25gLlxuICogRWFjaCBNQ1Agc2Vzc2lvbiBpcyBpZGVudGlmaWVkIGJ5IHRoZSBgRE9MTEhPVVNFX1NFU1NJT05fSURgIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIFRocmVhZC1zYWZldHkgbm90ZTogTm9kZS5qcyBpcyBzaW5nbGUtdGhyZWFkZWQsIHNvIE1hcCBvcGVyYXRpb25zIGFyZSBzYWZlLlxuICogRm9yIG11bHRpLXByb2Nlc3MgZGVwbG95bWVudHMgKGZ1dHVyZSBIVFRQUyksIGNvbnNpZGVyIFJlZGlzIG9yIERCIGJhY2tpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBTZXNzaW9uIElEIHNldCB2aWEgZW52aXJvbm1lbnQ6XG4gKiAvLyBET0xMSE9VU0VfU0VTU0lPTl9JRD1jbGF1ZGUtY29kZVxuICpcbiAqIGNvbnN0IHN0b3JlID0gbmV3IEFjdGl2YXRpb25TdG9yZShmaWxlT3BzKTtcbiAqIGF3YWl0IHN0b3JlLmluaXRpYWxpemUoKTsgIC8vIGxvYWRzIH4vLmRvbGxob3VzZS9zdGF0ZS9hY3RpdmF0aW9ucy1jbGF1ZGUtY29kZS5qc29uXG4gKlxuICogc3RvcmUucmVjb3JkQWN0aXZhdGlvbignc2tpbGwnLCAnY29kZS1yZXZpZXdlcicpO1xuICogc3RvcmUucmVjb3JkQWN0aXZhdGlvbigncGVyc29uYScsICdDcmVhdGl2ZSBEZXYnLCAnY3JlYXRpdmUtZGV2Lm1kJyk7XG4gKlxuICogLy8gT24gbmV4dCBzZXJ2ZXIgc3RhcnQsIGluaXRpYWxpemUoKSByZXN0b3JlcyB0aGVzZSBhY3RpdmF0aW9uc1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3RpdmF0aW9uU3RvcmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVPcHM6IEZpbGVPcGVyYXRpb25zU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZURpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25JZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlcnNpc3RQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5hYmxlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIHN0YXRlOiBQZXJzaXN0ZWRBY3RpdmF0aW9uU3RhdGU7XG5cbiAgY29uc3RydWN0b3IoZmlsZU9wczogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCBzdGF0ZURpcj86IHN0cmluZykge1xuICAgIHRoaXMuZmlsZU9wcyA9IGZpbGVPcHM7XG4gICAgdGhpcy5zZXNzaW9uSWQgPSByZXNvbHZlU2Vzc2lvbklkKCk7XG4gICAgdGhpcy5lbmFibGVkID0gaXNQZXJzaXN0ZW5jZUVuYWJsZWQoKTtcbiAgICB0aGlzLnN0YXRlRGlyID0gc3RhdGVEaXIgPz8gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAnc3RhdGUnKTtcbiAgICB0aGlzLnBlcnNpc3RQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIGBhY3RpdmF0aW9ucy0ke3RoaXMuc2Vzc2lvbklkfS5qc29uYCk7XG5cbiAgICB0aGlzLnN0YXRlID0gdGhpcy5jcmVhdGVFbXB0eVN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBwZXJzaXN0ZWQgYWN0aXZhdGlvbnMgZnJvbSBkaXNrLlxuICAgKiBDYWxsIG9uY2UgYWZ0ZXIgY29uc3RydWN0aW9uIHRvIHJlc3RvcmUgc3RhdGUgZnJvbSBhIHByZXZpb3VzIHNlc3Npb24uXG4gICAqIElmIHRoZSBmaWxlIGlzIG1pc3Npbmcgb3IgY29ycnVwdCwgc3RhcnRzIHdpdGggZW1wdHkgYWN0aXZhdGlvbnMuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5lbmFibGVkKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tBY3RpdmF0aW9uU3RvcmVdIFBlcnNpc3RlbmNlIGRpc2FibGVkIHZpYSBET0xMSE9VU0VfQUNUSVZBVElPTl9QRVJTSVNURU5DRScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BzLnJlYWRGaWxlKHRoaXMucGVyc2lzdFBhdGgpO1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgUGVyc2lzdGVkQWN0aXZhdGlvblN0YXRlO1xuXG4gICAgICBpZiAoZGF0YS52ZXJzaW9uID09PSAxICYmIGRhdGEuYWN0aXZhdGlvbnMgJiYgdHlwZW9mIGRhdGEuYWN0aXZhdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGFuZCBsb2FkIG9ubHkga25vd24gZWxlbWVudCB0eXBlc1xuICAgICAgICBmb3IgKGNvbnN0IFt0eXBlLCBhY3RpdmF0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoZGF0YS5hY3RpdmF0aW9ucykpIHtcbiAgICAgICAgICBpZiAoQUNUSVZBVEFCTEVfVFlQRVMuaGFzKHR5cGUpICYmIEFycmF5LmlzQXJyYXkoYWN0aXZhdGlvbnMpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2YXRpb25zW3R5cGVdID0gYWN0aXZhdGlvbnMuZmxhdE1hcCgoYSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWEgfHwgdHlwZW9mIGEubmFtZSAhPT0gJ3N0cmluZycpIHJldHVybiBbXTtcblxuICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZUFjdGl2YXRpb25JZGVudGlmaWVyKGEubmFtZSk7XG4gICAgICAgICAgICAgIGlmICghbm9ybWFsaXplZE5hbWUpIHJldHVybiBbXTtcblxuICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRmlsZW5hbWUgPSB0eXBlb2YgYS5maWxlbmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IG5vcm1hbGl6ZUFjdGl2YXRpb25JZGVudGlmaWVyKGEuZmlsZW5hbWUpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgICAgICAgLi4uYSxcbiAgICAgICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZSxcbiAgICAgICAgICAgICAgICAuLi4obm9ybWFsaXplZEZpbGVuYW1lID8geyBmaWxlbmFtZTogbm9ybWFsaXplZEZpbGVuYW1lIH0gOiB7fSksXG4gICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IHRoaXMuZ2V0VG90YWxBY3RpdmF0aW9uQ291bnQoKTtcbiAgICAgICAgaWYgKHRvdGFsQ291bnQgPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgW0FjdGl2YXRpb25TdG9yZV0gUmVzdG9yZWQgJHt0b3RhbENvdW50fSBhY3RpdmF0aW9uKHMpIGZvciBzZXNzaW9uICcke3RoaXMuc2Vzc2lvbklkfSdgXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdFTEVNRU5UX0FDVElWQVRFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdBY3RpdmF0aW9uU3RvcmUuaW5pdGlhbGl6ZScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgUmVzdG9yZWQgJHt0b3RhbENvdW50fSBhY3RpdmF0aW9uKHMpIGZyb20gZGlzayBmb3Igc2Vzc2lvbiAnJHt0aGlzLnNlc3Npb25JZH0nYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGNvdW50czogdGhpcy5nZXRBY3RpdmF0aW9uQ291bnRzKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtBY3RpdmF0aW9uU3RvcmVdIE5vIGFjdGl2YXRpb24gZmlsZSBmb3VuZCBmb3Igc2Vzc2lvbiAnJHt0aGlzLnNlc3Npb25JZH0nLCBzdGFydGluZyBmcmVzaGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtBY3RpdmF0aW9uU3RvcmVdIEZhaWxlZCB0byBsb2FkIGFjdGl2YXRpb24gZmlsZSBmb3Igc2Vzc2lvbiAnJHt0aGlzLnNlc3Npb25JZH0nLCBzdGFydGluZyBmcmVzaGAsIHsgZXJyb3IgfSk7XG5cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdFTEVNRU5UX0FDVElWQVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ0FjdGl2YXRpb25TdG9yZS5pbml0aWFsaXplJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGxvYWQgYWN0aXZhdGlvbiBmaWxlIGZvciBzZXNzaW9uICcke3RoaXMuc2Vzc2lvbklkfScg4oCUIHN0YXJ0aW5nIGZyZXNoIChwb3NzaWJsZSBkYXRhIGNvcnJ1cHRpb24pYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlcnJvcjogU3RyaW5nKGVycm9yKSwgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGFuIGVsZW1lbnQgYWN0aXZhdGlvbi4gRmlyZS1hbmQtZm9yZ2V0IHBlcnNpc3QuXG4gICAqL1xuICByZWNvcmRBY3RpdmF0aW9uKGVsZW1lbnRUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZmlsZW5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHlwZSA9IG5vcm1hbGl6ZVR5cGUoZWxlbWVudFR5cGUpO1xuICAgIGlmICghQUNUSVZBVEFCTEVfVFlQRVMuaGFzKHR5cGUpKSByZXR1cm47XG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVBY3RpdmF0aW9uSWRlbnRpZmllcihuYW1lKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWROYW1lKSByZXR1cm47XG4gICAgY29uc3Qgbm9ybWFsaXplZEZpbGVuYW1lID0gdHlwZW9mIGZpbGVuYW1lID09PSAnc3RyaW5nJ1xuICAgICAgPyBub3JtYWxpemVBY3RpdmF0aW9uSWRlbnRpZmllcihmaWxlbmFtZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlLmFjdGl2YXRpb25zW3R5cGVdKSB7XG4gICAgICB0aGlzLnN0YXRlLmFjdGl2YXRpb25zW3R5cGVdID0gW107XG4gICAgfVxuXG4gICAgLy8gRGVkdXBsaWNhdGUg4oCUIGRvbid0IGFkZCBpZiBhbHJlYWR5IHByZXNlbnRcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuc3RhdGUuYWN0aXZhdGlvbnNbdHlwZV0hO1xuICAgIGNvbnN0IGFscmVhZHlBY3RpdmUgPSBleGlzdGluZy5zb21lKGEgPT4gYS5uYW1lID09PSBub3JtYWxpemVkTmFtZSk7XG4gICAgaWYgKGFscmVhZHlBY3RpdmUpIHJldHVybjtcblxuICAgIGV4aXN0aW5nLnB1c2goe1xuICAgICAgbmFtZTogbm9ybWFsaXplZE5hbWUsXG4gICAgICAuLi4obm9ybWFsaXplZEZpbGVuYW1lID8geyBmaWxlbmFtZTogbm9ybWFsaXplZEZpbGVuYW1lIH0gOiB7fSksXG4gICAgICBhY3RpdmF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wZXJzaXN0QXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYW4gZWxlbWVudCBkZWFjdGl2YXRpb24uIEZpcmUtYW5kLWZvcmdldCBwZXJzaXN0LlxuICAgKi9cbiAgcmVjb3JkRGVhY3RpdmF0aW9uKGVsZW1lbnRUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkKSByZXR1cm47XG5cbiAgICBjb25zdCB0eXBlID0gbm9ybWFsaXplVHlwZShlbGVtZW50VHlwZSk7XG4gICAgaWYgKCFBQ1RJVkFUQUJMRV9UWVBFUy5oYXModHlwZSkpIHJldHVybjtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZUFjdGl2YXRpb25JZGVudGlmaWVyKG5hbWUpO1xuICAgIGlmICghbm9ybWFsaXplZE5hbWUpIHJldHVybjtcblxuICAgIGNvbnN0IGFjdGl2YXRpb25zID0gdGhpcy5zdGF0ZS5hY3RpdmF0aW9uc1t0eXBlXTtcbiAgICBpZiAoIWFjdGl2YXRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gYWN0aXZhdGlvbnMubGVuZ3RoO1xuICAgIHRoaXMuc3RhdGUuYWN0aXZhdGlvbnNbdHlwZV0gPSBhY3RpdmF0aW9ucy5maWx0ZXIoYSA9PiBhLm5hbWUgIT09IG5vcm1hbGl6ZWROYW1lKTtcblxuICAgIC8vIE9ubHkgcGVyc2lzdCBpZiBzb21ldGhpbmcgYWN0dWFsbHkgY2hhbmdlZFxuICAgIGlmICh0aGlzLnN0YXRlLmFjdGl2YXRpb25zW3R5cGVdIS5sZW5ndGggIT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgIHRoaXMucGVyc2lzdEFzeW5jKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHNwZWNpZmljIGFjdGl2YXRpb24gYnkgbmFtZSAodXNlZCBkdXJpbmcgcmVzdG9yZSB0byBwcnVuZSBzdGFsZSBlbnRyaWVzKS5cbiAgICovXG4gIHJlbW92ZVN0YWxlQWN0aXZhdGlvbihlbGVtZW50VHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZERlYWN0aXZhdGlvbihlbGVtZW50VHlwZSwgbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwZXJzaXN0ZWQgYWN0aXZhdGlvbnMgZm9yIGEgZ2l2ZW4gZWxlbWVudCB0eXBlLlxuICAgKi9cbiAgZ2V0QWN0aXZhdGlvbnMoZWxlbWVudFR5cGU6IHN0cmluZyk6IFBlcnNpc3RlZEFjdGl2YXRpb25bXSB7XG4gICAgY29uc3QgdHlwZSA9IG5vcm1hbGl6ZVR5cGUoZWxlbWVudFR5cGUpO1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmFjdGl2YXRpb25zW3R5cGVdID8gWy4uLnRoaXMuc3RhdGUuYWN0aXZhdGlvbnNbdHlwZV0hXSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2Vzc2lvbiBJRCB0aGlzIHN0b3JlIGlzIHNjb3BlZCB0by5cbiAgICovXG4gIGdldFNlc3Npb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwZXJzaXN0ZW5jZSBpcyBlbmFibGVkLlxuICAgKi9cbiAgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVuYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIHBlcnNpc3RlZCBhY3RpdmF0aW9ucy4gVXNlZCBmb3IgdGVzdGluZyBvciBhZG1pbiByZXNldC5cbiAgICovXG4gIGNsZWFyQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSB0aGlzLmNyZWF0ZUVtcHR5U3RhdGUoKTtcbiAgICBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgICB0aGlzLnBlcnNpc3RBc3luYygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlLWFuZC1mb3JnZXQgcGVyc2lzdGVuY2Ugd2l0aCByZXRyeSBmb3IgdHJhbnNpZW50IGRpc2sgZmFpbHVyZXMuXG4gICAqIFJldHJpZXMgdXAgdG8gUEVSU0lTVF9NQVhfUkVUUklFUyB0aW1lcyB3aXRoIGEgc2hvcnQgZGVsYXkuXG4gICAqIERpc2sgZmFpbHVyZSBkb2VzIG5vdCBibG9jayBhY3RpdmF0aW9uIG9wZXJhdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHBlcnNpc3RBc3luYygpOiB2b2lkIHtcbiAgICB0aGlzLnBlcnNpc3RXaXRoUmV0cnkoMCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oJ1tBY3RpdmF0aW9uU3RvcmVdIEZhaWxlZCB0byBwZXJzaXN0IGFjdGl2YXRpb24gc3RhdGUgYWZ0ZXIgcmV0cmllcycsIHsgZXJyb3IgfSk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfQUNUSVZBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdBY3RpdmF0aW9uU3RvcmUucGVyc2lzdEFzeW5jJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBwZXJzaXN0IGFjdGl2YXRpb24gc3RhdGUgZm9yIHNlc3Npb24gJyR7dGhpcy5zZXNzaW9uSWR9JyBhZnRlciAke1BFUlNJU1RfTUFYX1JFVFJJRVMgKyAxfSBhdHRlbXB0cyDigJQgc3RhdGUgY29udGludWVzIGluLW1lbW9yeSBvbmx5YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZXJyb3I6IFN0cmluZyhlcnJvciksIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gcGVyc2lzdCB3aXRoIHJldHJpZXMgZm9yIHRyYW5zaWVudCBmYWlsdXJlcyAoZS5nLiwgRUJVU1ksIEVBR0FJTikuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcnNpc3RXaXRoUmV0cnkoYXR0ZW1wdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoYXR0ZW1wdCA8IFBFUlNJU1RfTUFYX1JFVFJJRVMpIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIFBFUlNJU1RfUkVUUllfREVMQVlfTVMpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdFdpdGhSZXRyeShhdHRlbXB0ICsgMSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgY3VycmVudCBhY3RpdmF0aW9uIHN0YXRlIHRvIGRpc2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcnNpc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZS5sYXN0VXBkYXRlZCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLnN0YXRlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcHMud3JpdGVGaWxlKHRoaXMucGVyc2lzdFBhdGgsIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdGUsIG51bGwsIDIpKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRW1wdHlTdGF0ZSgpOiBQZXJzaXN0ZWRBY3RpdmF0aW9uU3RhdGUge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBhY3RpdmF0aW9uczoge30sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG90YWxBY3RpdmF0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnN0YXRlLmFjdGl2YXRpb25zKS5yZWR1Y2UoXG4gICAgICAoc3VtLCBhcnIpID0+IHN1bSArIChhcnI/Lmxlbmd0aCA/PyAwKSwgMFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2YXRpb25Db3VudHMoKTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB7XG4gICAgY29uc3QgY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgZm9yIChjb25zdCBbdHlwZSwgYXJyXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnN0YXRlLmFjdGl2YXRpb25zKSkge1xuICAgICAgaWYgKGFyciAmJiBhcnIubGVuZ3RoID4gMCkge1xuICAgICAgICBjb3VudHNbdHlwZV0gPSBhcnIubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY291bnRzO1xuICB9XG59XG4iXX0=
@@ -7,6 +7,7 @@ export type FileChangeHandler = (relativePath: string) => void;
7
7
  */
8
8
  export declare class FileWatchService {
9
9
  private readonly watchers;
10
+ private readonly debounceTimers;
10
11
  /**
11
12
  * Watch a directory for changes. If the directory doesn't exist, it will be created.
12
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"FileWatchService.d.ts","sourceRoot":"","sources":["../../src/services/FileWatchService.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;AA+B/D;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAE1D;;;;;;;;;;;;;;;OAeG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAgNvE,OAAO,CAAC,aAAa;IAarB;;;OAGG;IACH,OAAO,IAAI,IAAI;CAehB"}
1
+ {"version":3,"file":"FileWatchService.d.ts","sourceRoot":"","sources":["../../src/services/FileWatchService.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;AA+B/D;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoD;IAEnF;;;;;;;;;;;;;;;OAeG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAqPvE,OAAO,CAAC,aAAa;IAarB;;;OAGG;IACH,OAAO,IAAI,IAAI;CAqBhB"}