@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
@@ -1 +1 @@
1
- {"version":3,"file":"Memory.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/Memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Memory.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/Memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAmB,MAAM,+BAA+B,CAAC;AAEnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAKpE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGpE,OAAO,EAA4C,YAAY,EAAE,cAAc,EAAgB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAClI,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAwDxC,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,qBAAa,MAAO,SAAQ,WAAY,YAAW,QAAQ;IAIzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IAC/D,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAA2G;IAEhJ;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAA8E;WAEvG,8BAA8B,CAAC,QAAQ,EAAE,MAAM;QAAE,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAAE,GAAG,SAAS,GAAG,IAAI;IAItK;;;OAGG;WACW,gCAAgC,CAAC,QAAQ,EAAE,MAAM;QAAE,mBAAmB,IAAI,OAAO,CAAC;QAAC,SAAS,IAAI,OAAO,CAAC;KAAE,GAAG,SAAS,GAAG,IAAI;IAI3I;;;;OAIG;WACW,cAAc,IAAI,IAAI;IAKpC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAOxC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAW/B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,UAAU,CAAS;IAG3B,OAAO,CAAC,WAAW,CAAoB;IAGvC,OAAO,CAAC,iBAAiB,CAAmB;IAG5C,OAAO,CAAC,QAAQ,CAAC,CAAS;IAG1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,2BAA2B,CAAO;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAK;gBAEjD,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,YAAK,EAAE,eAAe,EAAE,eAAe;IAiGpF;;;OAGG;IACH,OAAO,KAAK,WAAW,GAEtB;IAED;;;;;;;;OAQG;IACU,QAAQ,CACnB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,MAAM,GAAE,MAAkB,GACzB,OAAO,CAAC,WAAW,CAAC;IAiEvB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACU,MAAM,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAuF9E;;OAEG;IACU,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAInE;;;OAGG;IACU,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBtD;;;;OAIG;IACH,IAAa,OAAO,IAAI,MAAM,CA6C7B;IAED;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;OAGG;IACU,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IA2CtD;;;OAGG;IACU,QAAQ,CAAC,OAAO,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB9D;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA8BxB;;OAEG;IACI,QAAQ,IAAI;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,IAAI,CAAC;QACnB,WAAW,CAAC,EAAE,IAAI,CAAC;QACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC;IAyCD;;OAEG;IACa,QAAQ,IAAI,uBAAuB;IA0CnD;;OAEG;IACa,SAAS,IAAI,MAAM;IAanC;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAyChC;;;;OAIG;IACa,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA6E/C,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,YAAY;IASpB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;;;OAIG;YACW,yBAAyB;IA2BvC;;;;;;;OAOG;IACI,sBAAsB,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW,EAAE;IAKpE;;;;;;OAMG;IACI,aAAa,IAAI,WAAW,EAAE;IAIrC;;;;;OAKG;IACI,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;IAK7C;;;;;;;OAOG;IACI,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI5C;;;;;OAKG;IACK,kBAAkB,IAAI,gBAAgB,CAAC,WAAW,CAAC;IAI3D;;;;;;;OAOG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAUtC;;;;OAIG;IACI,WAAW,IAAI,MAAM,GAAG,SAAS;IAIxC;;;;;;;OAOG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC;;;;;;;;;OASG;WACiB,gBAAgB,CAClC,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC;IA8BpB;;;;;;;;;;OAUG;WACiB,IAAI,CAAC,MAAM,EAAE;QAC/B,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBrB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;CAgC7B"}
@@ -111,6 +111,7 @@ function sanitizeMemoryContent(content, maxLength) {
111
111
  export class Memory extends BaseElement {
112
112
  // instructions inherited from BaseElement (v2.0 dual-field architecture)
113
113
  // content: overridden below with a custom getter that returns formatted entries
114
+ static createdMemoryNames = new Set();
114
115
  static memoryManagerResolver;
115
116
  /**
116
117
  * Static resolver for RetentionPolicyService (Issue #51)
@@ -246,13 +247,16 @@ export class Memory extends BaseElement {
246
247
  enablePersistence: false // Future enhancement
247
248
  };
248
249
  this.searchIndex = new MemorySearchIndex(indexConfig);
249
- // Log memory creation
250
- SecurityMonitor.logSecurityEvent({
251
- type: MEMORY_SECURITY_EVENTS.MEMORY_CREATED,
252
- severity: 'LOW',
253
- source: 'Memory.constructor',
254
- details: `Memory created: ${this.metadata.name} with ${this.storageBackend} backend`
255
- });
250
+ // Log memory creation (once per unique name per server lifetime)
251
+ if (!Memory.createdMemoryNames.has(this.metadata.name)) {
252
+ SecurityMonitor.logSecurityEvent({
253
+ type: MEMORY_SECURITY_EVENTS.MEMORY_CREATED,
254
+ severity: 'LOW',
255
+ source: 'Memory.constructor',
256
+ details: `Memory created: ${this.metadata.name} with ${this.storageBackend} backend`
257
+ });
258
+ Memory.createdMemoryNames.add(this.metadata.name);
259
+ }
256
260
  }
257
261
  /**
258
262
  * Helper method to get the current number of entries
@@ -1122,4 +1126,4 @@ export class Memory extends BaseElement {
1122
1126
  return true;
1123
1127
  }
1124
1128
  }
1125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVqRSwwRkFBMEY7QUFDMUYsaURBQWlEO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBZ0MsWUFBWSxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBa0MsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBRTlCOzs7O0dBSUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHLHFCQUFxQixDQUFDO0FBRXZELGtDQUFrQztBQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENB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QUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeSBFbGVtZW50IC0gUGVyc2lzdGVudCBjb250ZXh0IHN0b3JhZ2UgZm9yIGNvbnRpbnVpdHkgYW5kIGxlYXJuaW5nXG4gKiBcbiAqIFByb3ZpZGVzIG11bHRpcGxlIHN0b3JhZ2UgYmFja2VuZHMsIHJldGVudGlvbiBwb2xpY2llcywgYW5kIHNlYXJjaCBjYXBhYmlsaXRpZXNcbiAqIGZvciBtYWludGFpbmluZyBjb250ZXh0IGFjcm9zcyBzZXNzaW9ucyBhbmQgaW50ZXJhY3Rpb25zLlxuICogXG4gKiBTRUNVUklUWSBNRUFTVVJFUyBJTVBMRU1FTlRFRDpcbiAqIDEuIElucHV0IHNhbml0aXphdGlvbiBmb3IgYWxsIG1lbW9yeSBjb250ZW50XG4gKiAyLiBNZW1vcnkgc2l6ZSBsaW1pdHMgdG8gcHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoXG4gKiAzLiBQYXRoIHZhbGlkYXRpb24gZm9yIGZpbGUtYmFzZWQgc3RvcmFnZVxuICogNC4gUmV0ZW50aW9uIHBvbGljeSBlbmZvcmNlbWVudFxuICogNS4gUHJpdmFjeSBsZXZlbCBhY2Nlc3MgY29udHJvbFxuICogNi4gQXVkaXQgbG9nZ2luZyBmb3IgYWxsIG9wZXJhdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBCYXNlRWxlbWVudCB9IGZyb20gJy4uL0Jhc2VFbGVtZW50LmpzJztcbmltcG9ydCB7IElFbGVtZW50LCBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvaW5kZXguanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnRNZXRhZGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UuanMnO1xuLy8gRklYICMxMzE1OiBDb250ZW50VmFsaWRhdG9yIG5vIGxvbmdlciB1c2VkIGluIGFkZEVudHJ5IChtb3ZlZCB0byBiYWNrZ3JvdW5kIHZhbGlkYXRpb24pXG4vLyBJbXBvcnQgcmVtb3ZlZCB0byBjbGVhbiB1cCB1bnVzZWQgZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBNRU1PUllfQ09OU1RBTlRTLCBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLCBQcml2YWN5TGV2ZWwsIFN0b3JhZ2VCYWNrZW5kLCBUUlVTVF9MRVZFTFMsIFRydXN0TGV2ZWwgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBNZW1vcnlUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU1lbW9yeUlkIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBNZW1vcnlTZWFyY2hJbmRleCwgU2VhcmNoUXVlcnksIFNlYXJjaEluZGV4Q29uZmlnIH0gZnJvbSAnLi9NZW1vcnlTZWFyY2hJbmRleC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IERPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknO1xuaW1wb3J0IHsgSlNET00gfSBmcm9tICdqc2RvbSc7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4uLy4uL2NhY2hlL0xSVUNhY2hlLmpzJztcblxuLyoqXG4gKiBNYXhpbXVtIGxlbmd0aCBmb3IgaW5kaXZpZHVhbCB0cmlnZ2VyIHdvcmRzIHVzZWQgaW4gRW5oYW5jZWQgSW5kZXhcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5jb25zdCBNQVhfVFJJR0dFUl9MRU5HVEggPSA1MDtcblxuLyoqXG4gKiBWYWxpZGF0aW9uIHBhdHRlcm4gZm9yIHRyaWdnZXIgd29yZHNcbiAqIEFsbG93cyBhbHBoYW51bWVyaWMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBAIChtZW50aW9ucy9lbWFpbHMpLCAuIChkb21haW5zKVxuICogQGNvbnN0YW50IHtSZWdFeHB9XG4gKi9cbmNvbnN0IFRSSUdHRVJfVkFMSURBVElPTl9SRUdFWCA9IC9eW2EtekEtWjAtOVxcLV9ALl0rJC87XG5cbi8vIEluaXRpYWxpemUgRE9NUHVyaWZ5IHdpdGggSlNET01cbmNvbnN0IHdpbmRvdyA9IG5ldyBKU0RPTSgnJykud2luZG93O1xuY29uc3QgcHVyaWZ5ID0gRE9NUHVyaWZ5KHdpbmRvdyBhcyBhbnkpO1xuXG4vLyBDb25maWd1cmUgRE9NUHVyaWZ5IGZvciBtZW1vcnkgY29udGVudCAtIHN0cmlwIGFsbCBIVE1MIGJ1dCBrZWVwIHRleHRcbnB1cmlmeS5zZXRDb25maWcoe1xuICBBTExPV0VEX1RBR1M6IFtdLCAgLy8gTm8gSFRNTCB0YWdzIGFsbG93ZWRcbiAgQUxMT1dFRF9BVFRSOiBbXSwgIC8vIE5vIGF0dHJpYnV0ZXMgYWxsb3dlZFxuICBLRUVQX0NPTlRFTlQ6IHRydWUgLy8gS2VlcCB0ZXh0IGNvbnRlbnRcbn0pO1xuXG4vKipcbiAqIFNhbml0aXplIGNvbnRlbnQgZm9yIG1lbW9yeSBzdG9yYWdlXG4gKiBNb3JlIHBlcm1pc3NpdmUgdGhhbiBzYW5pdGl6ZUlucHV0IC0gYWxsb3dzIHB1bmN0dWF0aW9uLCBxdW90ZXMsIGV0Yy5cbiAqIGJ1dCBzdGlsbCBwcmV2ZW50cyBYU1MgYW5kIGNvbnRyb2wgY2hhcmFjdGVyc1xuICovXG5mdW5jdGlvbiBzYW5pdGl6ZU1lbW9yeUNvbnRlbnQoY29udGVudDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghY29udGVudCB8fCB0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgXG4gIC8vIEZpcnN0IG5vcm1hbGl6ZSBVbmljb2RlXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjb250ZW50KS5ub3JtYWxpemVkQ29udGVudDtcbiAgXG4gIC8vIFVzZSBET01QdXJpZnkgdG8gc3RyaXAgYW55IEhUTUwvWFNTIGF0dGVtcHRzIGJ1dCBrZWVwIHRleHRcbiAgY29uc3QgY2xlYW5lZCA9IHB1cmlmeS5zYW5pdGl6ZShub3JtYWxpemVkKTtcbiAgXG4gIC8vIFJlbW92ZSBvbmx5IGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgbnVsbCBieXRlc1xuICByZXR1cm4gY2xlYW5lZFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIEludGVudGlvbmFsbHkgcmVtb3ZpbmcgY29udHJvbCBjaGFycyBleGNlcHQgXFx0IFxcbiBcXHIgZm9yIHNhbml0aXphdGlvblxuICAgIC5yZXBsYWNlQWxsKC9bXFx1MDAwMC1cXHUwMDA4XFx1MDAwQlxcdTAwMENcXHUwMDBFLVxcdTAwMUZcXHUwMDdGXS9nLCAnJykgLy8gTk9TT05BUlxuICAgIC5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKVxuICAgIC50cmltKCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5TWV0YWRhdGEgZXh0ZW5kcyBJRWxlbWVudE1ldGFkYXRhIHtcbiAgc3RvcmFnZUJhY2tlbmQ/OiBTdG9yYWdlQmFja2VuZDtcbiAgcmV0ZW50aW9uRGF5cz86IG51bWJlcjtcbiAgcHJpdmFjeUxldmVsPzogUHJpdmFjeUxldmVsO1xuICBzZWFyY2hhYmxlPzogYm9vbGVhbjtcbiAgbWF4RW50cmllcz86IG51bWJlcjtcbiAgZW5jcnlwdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuICAvLyBTZWFyY2ggaW5kZXggY29uZmlndXJhdGlvbiAoSXNzdWUgIzk4NClcbiAgaW5kZXhUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIGVuYWJsZUNvbnRlbnRJbmRleD86IGJvb2xlYW47XG4gIG1heFRlcm1zUGVyRW50cnk/OiBudW1iZXI7XG4gIG1pblRlcm1MZW5ndGg/OiBudW1iZXI7XG4gIC8vIFRyaWdnZXIgd29yZHMgZm9yIEVuaGFuY2VkIEluZGV4IChJc3N1ZSAjMTEyNClcbiAgdHJpZ2dlcnM/OiBzdHJpbmdbXTtcbiAgLy8gQXV0by1sb2FkIGNvbmZpZ3VyYXRpb24gKElzc3VlICMxNDMwKVxuICBhdXRvTG9hZD86IGJvb2xlYW47XG4gIHByaW9yaXR5PzogbnVtYmVyO1xuICAvLyBNZW1vcnkgdHlwZSBjbGFzc2lmaWNhdGlvbiBmb3IgZm9sZGVyIG9yZ2FuaXphdGlvblxuICBtZW1vcnlUeXBlPzogTWVtb3J5VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlFbnRyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogRGF0ZTtcbiAgY29udGVudDogc3RyaW5nO1xuICB0YWdzPzogc3RyaW5nW107XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgZXhwaXJlc0F0PzogRGF0ZTtcbiAgcHJpdmFjeUxldmVsPzogUHJpdmFjeUxldmVsO1xuICAvLyBGSVggIzEyNjk6IFRydXN0IGxldmVsIGZvciBjb250ZW50IHNlY3VyaXR5XG4gIHRydXN0TGV2ZWw/OiBUcnVzdExldmVsO1xuICAvLyBTb3VyY2UgaW5mb3JtYXRpb24gZm9yIHRydXN0IGRlY2lzaW9uc1xuICBzb3VyY2U/OiBzdHJpbmc7ICAvLyBlLmcuLCAndXNlcicsICd3ZWItc2NyYXBlJywgJ2FnZW50JywgJ2FwaSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlTZWFyY2hPcHRpb25zIHtcbiAgcXVlcnk/OiBzdHJpbmc7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAgc3RhcnREYXRlPzogRGF0ZTtcbiAgZW5kRGF0ZT86IERhdGU7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBwcml2YWN5TGV2ZWw/OiBQcml2YWN5TGV2ZWw7XG59XG5cbi8qKlxuICogTWVtb3J5IEVsZW1lbnQgSW1wbGVtZW50YXRpb25cbiAqXG4gKiBUT0RPOiBNZW1vcnkgU2hhcmRpbmcgU3RyYXRlZ3kgKElzc3VlICM5ODEpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEN1cnJlbnQ6IFNpbmdsZSBNYXA8aWQsIGVudHJ5PiBmb3IgYWxsIG1lbW9yaWVzXG4gKiBQcm9ibGVtOiBMYXJnZSBtZW1vcnkgc2V0cyAoPjEwSyBlbnRyaWVzKSBjYXVzZSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICpcbiAqIFBsYW5uZWQgU2hhcmRpbmcgQXJjaGl0ZWN0dXJlOlxuICogMS4gU2hhcmQgbWVtb3JpZXMgYWNyb3NzIG11bHRpcGxlIGZpbGVzIGJhc2VkIG9uIGhhc2gobWVtb3J5SWQpICUgc2hhcmRDb3VudFxuICogMi4gRWFjaCBzaGFyZCBmaWxlIDwyNTZLQiBmb3Igb3B0aW1hbCBZQU1MIHBhcnNpbmdcbiAqIDMuIE1lbW9yeSByZWZlcmVuY2VzIHN0b3JlZCBzZXBhcmF0ZWx5IGZyb20gY29udGVudCAobGlrZSBnaXQgb2JqZWN0cylcbiAqIDQuIExhcmdlIGJpbmFyeSBjb250ZW50IChQREZzLCBpbWFnZXMpIHN0b3JlZCBhcyBleHRlcm5hbCByZWZlcmVuY2VzXG4gKlxuICogQmVuZWZpdHM6XG4gKiAtIFBhcmFsbGVsIGxvYWRpbmcgb2YgbWVtb3J5IHNoYXJkc1xuICogLSBSZWR1Y2VkIG1lbW9yeSBmb290cHJpbnQgKGxvYWQgb25seSBuZWVkZWQgc2hhcmRzKVxuICogLSBCZXR0ZXIgY29ycnVwdGlvbiByZXNpc3RhbmNlIChvbmUgc2hhcmQgZmFpbHVyZSBkb2Vzbid0IGFmZmVjdCBvdGhlcnMpXG4gKiAtIEVmZmljaWVudCBpbmNyZW1lbnRhbCB1cGRhdGVzXG4gKlxuICogVE9ETzogQ29udGVudCBJbnRlZ3JpdHkgVmVyaWZpY2F0aW9uIChJc3N1ZSAjOTgyKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFkZCBTSEEtMjU2IGhhc2hlcyB0byBkZXRlY3Q6XG4gKiAtIEFjY2lkZW50YWwgY29ycnVwdGlvbiBmcm9tIGRpc2sgZXJyb3JzXG4gKiAtIEludGVudGlvbmFsIHRhbXBlcmluZyB3aXRoIG1lbW9yeSBmaWxlc1xuICogLSBWZXJzaW9uIGNvbmZsaWN0cyBkdXJpbmcgY29uY3VycmVudCBhY2Nlc3NcbiAqXG4gKiBJbXBsZW1lbnRhdGlvbjpcbiAqIC0gU3RvcmUgaGFzaCBpbiBtZW1vcnkgbWV0YWRhdGFcbiAqIC0gVmVyaWZ5IG9uIGxvYWQsIHdhcm4gb24gbWlzbWF0Y2hcbiAqIC0gT3B0aW9uIHRvIGF1dG8tcmVzdG9yZSBmcm9tIGJhY2t1cCBvbiBjb3JydXB0aW9uXG4gKlxuICogVE9ETzogTWVtb3J5IENhcGFjaXR5IE1hbmFnZW1lbnQgKElzc3VlICM5ODMpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEN1cnJlbnQ6IFN5bmNocm9ub3VzIHJldGVudGlvbiBlbmZvcmNlbWVudCBvbiBlYWNoIGFkZFxuICogQmV0dGVyOiBCYWNrZ3JvdW5kIGNsZWFudXAgd2l0aCBzbWFydCB0cmlnZ2VyczpcbiAqIC0gQ2xlYW51cCB3aGVuIDkwJSBjYXBhY2l0eSByZWFjaGVkXG4gKiAtIEJhdGNoIGRlbGV0aW9ucyBmb3IgZWZmaWNpZW5jeVxuICogLSBMUlUgZXZpY3Rpb24gd2l0aCBhY2Nlc3MgdHJhY2tpbmdcbiAqIC0gUHJlc2VydmUgXCJwaW5uZWRcIiBtZW1vcmllcyByZWdhcmRsZXNzIG9mIGFnZVxuICovXG5leHBvcnQgY2xhc3MgTWVtb3J5IGV4dGVuZHMgQmFzZUVsZW1lbnQgaW1wbGVtZW50cyBJRWxlbWVudCB7XG4gIC8vIGluc3RydWN0aW9ucyBpbmhlcml0ZWQgZnJvbSBCYXNlRWxlbWVudCAodjIuMCBkdWFsLWZpZWxkIGFyY2hpdGVjdHVyZSlcbiAgLy8gY29udGVudDogb3ZlcnJpZGRlbiBiZWxvdyB3aXRoIGEgY3VzdG9tIGdldHRlciB0aGF0IHJldHVybnMgZm9ybWF0dGVkIGVudHJpZXNcblxuICBwcml2YXRlIHN0YXRpYyBtZW1vcnlNYW5hZ2VyUmVzb2x2ZXI/OiAoKSA9PiB7IGxpc3QoKTogUHJvbWlzZTxNZW1vcnlbXT47IHNhdmUobWVtb3J5OiBNZW1vcnksIGZpbGVQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjsgfSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3RhdGljIHJlc29sdmVyIGZvciBSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlIChJc3N1ZSAjNTEpXG4gICAqIFVzZWQgdG8gY2hlY2sgaWYgcmV0ZW50aW9uIGVuZm9yY2VtZW50IHNob3VsZCBoYXBwZW4gb24gbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmV0ZW50aW9uUG9saWN5UmVzb2x2ZXI/OiAoKSA9PiB7IHNob3VsZEVuZm9yY2VPbkxvYWQoKTogYm9vbGVhbjsgaXNFbmFibGVkKCk6IGJvb2xlYW47IH0gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHN0YXRpYyBjb25maWd1cmVNZW1vcnlNYW5hZ2VyUmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IHsgbGlzdCgpOiBQcm9taXNlPE1lbW9yeVtdPjsgc2F2ZShtZW1vcnk6IE1lbW9yeSwgZmlsZVBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+OyB9IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5tZW1vcnlNYW5hZ2VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIFJldGVudGlvblBvbGljeVNlcnZpY2UgcmVzb2x2ZXIgKElzc3VlICM1MSlcbiAgICogQ2FsbGVkIGR1cmluZyBESSBjb250YWluZXIgc2V0dXBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29uZmlndXJlUmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IHsgc2hvdWxkRW5mb3JjZU9uTG9hZCgpOiBib29sZWFuOyBpc0VuYWJsZWQoKTogYm9vbGVhbjsgfSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMucmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBhbGwgc3RhdGljIHJlc29sdmVycyAoZm9yIHRlc3QgY2xlYW51cClcbiAgICogQ2FsbCB0aGlzIGluIGFmdGVyRWFjaCBob29rcyB0byBwcmV2ZW50IHRlc3QgaXNvbGF0aW9uIGlzc3Vlc1xuICAgKiB3aGVyZSBhIHN0YWxlIHJlc29sdmVyIHJlZmVyZW5jZXMgZGlzcG9zZWQgc2VydmljZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRSZXNvbHZlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5tZW1vcnlNYW5hZ2VyUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZXRlbnRpb25Qb2xpY3lSZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFJldGVudGlvblBvbGljeVNlcnZpY2UgaW5zdGFuY2VcbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IGNvbmZpZ3VyZWQgKGFsbG93cyBncmFjZWZ1bCBmYWxsYmFjaylcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldFJldGVudGlvblBvbGljeVNlcnZpY2UoKSB7XG4gICAgaWYgKCF0aGlzLnJldGVudGlvblBvbGljeVJlc29sdmVyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXRlbnRpb25Qb2xpY3lSZXNvbHZlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWVtb3J5TWFuYWdlcigpIHtcbiAgICBpZiAoIXRoaXMubWVtb3J5TWFuYWdlclJlc29sdmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBtYW5hZ2VyIHJlc29sdmVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLm1lbW9yeU1hbmFnZXJSZXNvbHZlcigpO1xuICAgIGlmICghbWFuYWdlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgbWFuYWdlciByZXNvbHZlciByZXR1cm5lZCB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hbmFnZXI7XG4gIH1cbiAgLy8gTWVtb3J5LXNwZWNpZmljIHByb3BlcnRpZXMgKHdpdGggc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3MpXG4gIHByaXZhdGUgZW50cmllczogTFJVQ2FjaGU8TWVtb3J5RW50cnk+O1xuICBwcml2YXRlIHN0b3JhZ2VCYWNrZW5kOiBTdG9yYWdlQmFja2VuZDtcbiAgcHJpdmF0ZSByZXRlbnRpb25EYXlzOiBudW1iZXI7XG4gIHByaXZhdGUgcHJpdmFjeUxldmVsOiBQcml2YWN5TGV2ZWw7XG4gIHByaXZhdGUgc2VhcmNoYWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtYXhFbnRyaWVzOiBudW1iZXI7XG5cbiAgLy8gU2VhcmNoIGluZGV4IGZvciBwZXJmb3JtYW5jZSAoSXNzdWUgIzk4NClcbiAgcHJpdmF0ZSBzZWFyY2hJbmRleDogTWVtb3J5U2VhcmNoSW5kZXg7XG5cbiAgLy8gU2FuaXRpemF0aW9uIGNhY2hlIHRvIGF2b2lkIHJlZHVuZGFudCBwcm9jZXNzaW5nICh3aXRoIHNpemUgbGltaXRzKVxuICBwcml2YXRlIHNhbml0aXphdGlvbkNhY2hlOiBMUlVDYWNoZTxzdHJpbmc+O1xuXG4gIC8vIEZJWCAjMTMyMDogU3RvcmUgZmlsZSBwYXRoIGZvciBwZXJzaXN0ZW5jZVxuICBwcml2YXRlIGZpbGVQYXRoPzogc3RyaW5nO1xuXG4gIC8vIENhY2hlIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9TQU5JVElaQVRJT05fQ0FDSEVfU0laRSA9IDUwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1NBTklUSVpBVElPTl9DQUNIRV9NRU1PUllfTUIgPSA1O1xuICBcbiAgY29uc3RydWN0b3IobWV0YWRhdGE6IFBhcnRpYWw8TWVtb3J5TWV0YWRhdGE+ID0ge30sIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlKSB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBTYW5pdGl6ZSBhbGwgaW5wdXRzIGR1cmluZyBjb25zdHJ1Y3Rpb25cbiAgICBjb25zdCBzYW5pdGl6ZWRNZXRhZGF0YSA9IHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSA/XG4gICAgICAgIHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWV0YWRhdGEubmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCkgOlxuICAgICAgICAnVW5uYW1lZCBNZW1vcnknLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uID9cbiAgICAgICAgc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShtZXRhZGF0YS5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMCkgOlxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAvLyBGSVggIzExMjQ6IFByZXNlcnZlIHRyaWdnZXJzIGZvciBFbmhhbmNlZCBJbmRleFxuICAgICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIEJFRk9SRSBzYW5pdGl6YXRpb24gdG8gcmVqZWN0IGludmFsaWQgY2hhcmFjdGVyc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyAnYmFkIXRyaWdnZXInIGZyb20gYmVjb21pbmcgJ2JhZHRyaWdnZXInIGFuZCBwYXNzaW5nXG4gICAgICB0cmlnZ2VyczogQXJyYXkuaXNBcnJheShtZXRhZGF0YS50cmlnZ2VycykgP1xuICAgICAgICBtZXRhZGF0YS50cmlnZ2Vyc1xuICAgICAgICAgIC5tYXAodCA9PiBTdHJpbmcodCkudHJpbSgpKVxuICAgICAgICAgIC5maWx0ZXIodCA9PiB0ICYmIFRSSUdHRVJfVkFMSURBVElPTl9SRUdFWC50ZXN0KHQpKSAvLyBWYWxpZGF0ZSBmb3JtYXQgRklSU1RcbiAgICAgICAgICAubWFwKHQgPT4gc2FuaXRpemVJbnB1dCh0LCBNQVhfVFJJR0dFUl9MRU5HVEgpKSAvLyBUaGVuIHNhbml0aXplIGZvciBsZW5ndGhcbiAgICAgICAgICAuZmlsdGVyKHQgPT4gdCkgOiAvLyBSZW1vdmUgYW55IHRoYXQgYmVjYW1lIGVtcHR5IGFmdGVyIHNhbml0aXphdGlvblxuICAgICAgICBbXVxuICAgIH07XG5cbiAgICBzdXBlcihFbGVtZW50VHlwZS5NRU1PUlksIHNhbml0aXplZE1ldGFkYXRhLCBtZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBtZW1vcnktc3BlY2lmaWMgcHJvcGVydGllcyB3aXRoIGRlZmF1bHRzXG4gICAgdGhpcy5zdG9yYWdlQmFja2VuZCA9IG1ldGFkYXRhLnN0b3JhZ2VCYWNrZW5kIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9TVE9SQUdFX0JBQ0tFTkQ7XG4gICAgdGhpcy5yZXRlbnRpb25EYXlzID0gbWV0YWRhdGEucmV0ZW50aW9uRGF5cyB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUkVURU5USU9OX0RBWVM7XG4gICAgLy8gVmFsaWRhdGUgcHJpdmFjeSBsZXZlbCAtIGRlZmF1bHQgdG8gcHJpdmF0ZSBpZiBpbnZhbGlkXG4gICAgdGhpcy5wcml2YWN5TGV2ZWwgPSAobWV0YWRhdGEucHJpdmFjeUxldmVsICYmIE1FTU9SWV9DT05TVEFOVFMuUFJJVkFDWV9MRVZFTFMuaW5jbHVkZXMobWV0YWRhdGEucHJpdmFjeUxldmVsKSlcbiAgICAgID8gbWV0YWRhdGEucHJpdmFjeUxldmVsXG4gICAgICA6IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9QUklWQUNZX0xFVkVMO1xuICAgIHRoaXMuc2VhcmNoYWJsZSA9IG1ldGFkYXRhLnNlYXJjaGFibGUgIT09IGZhbHNlO1xuICAgIHRoaXMubWF4RW50cmllcyA9IE1hdGgubWluKFxuICAgICAgbWV0YWRhdGEubWF4RW50cmllcyB8fCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFQsXG4gICAgICBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFRcbiAgICApO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBMUlUgY2FjaGVzIHdpdGggc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICB0aGlzLmVudHJpZXMgPSBuZXcgTFJVQ2FjaGU8TWVtb3J5RW50cnk+KHtcbiAgICAgIG5hbWU6ICdtZW1vcnktZW50cmllcycsXG4gICAgICBtYXhTaXplOiB0aGlzLm1heEVudHJpZXMsXG4gICAgICBtYXhNZW1vcnlNQjogMjUsIC8vIE1heCAyNU1CIGZvciBtZW1vcnkgZW50cmllc1xuICAgIH0pO1xuXG4gICAgdGhpcy5zYW5pdGl6YXRpb25DYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmc+KHtcbiAgICAgIG5hbWU6ICdtZW1vcnktc2FuaXRpemF0aW9uJyxcbiAgICAgIG1heFNpemU6IE1lbW9yeS5NQVhfU0FOSVRJWkFUSU9OX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogTWVtb3J5Lk1BWF9TQU5JVElaQVRJT05fQ0FDSEVfTUVNT1JZX01CLFxuICAgIH0pO1xuXG4gICAgLy8gRklYICMxNDMwOiBVcGRhdGUgbWV0YWRhdGEgdG8gaW5jbHVkZSBhbGwgTWVtb3J5TWV0YWRhdGEgZmllbGRzXG4gICAgLy8gVGhpcyBlbnN1cmVzIHRoZXkgYXJlIHByZXNlcnZlZCB3aGVuIHNlcmlhbGl6ZUVsZW1lbnQoKSBpcyBjYWxsZWRcbiAgICAvLyBQZXIgVG9kZCdzIHN1Z2dlc3Rpb246IHN0b3JlIGFsbCBydW50aW1lIHByb3BlcnRpZXMgaW4gbWV0YWRhdGEsIG5vdCBleHRlbnNpb25zXG4gICAgdGhpcy5tZXRhZGF0YSA9IHtcbiAgICAgIC4uLnRoaXMubWV0YWRhdGEsXG4gICAgICBzdG9yYWdlQmFja2VuZDogdGhpcy5zdG9yYWdlQmFja2VuZCxcbiAgICAgIHJldGVudGlvbkRheXM6IHRoaXMucmV0ZW50aW9uRGF5cyxcbiAgICAgIHByaXZhY3lMZXZlbDogdGhpcy5wcml2YWN5TGV2ZWwsXG4gICAgICBzZWFyY2hhYmxlOiB0aGlzLnNlYXJjaGFibGUsXG4gICAgICBtYXhFbnRyaWVzOiB0aGlzLm1heEVudHJpZXMsXG4gICAgICBhdXRvTG9hZDogbWV0YWRhdGEuYXV0b0xvYWQsXG4gICAgICBwcmlvcml0eTogbWV0YWRhdGEucHJpb3JpdHksXG4gICAgICBlbmNyeXB0aW9uRW5hYmxlZDogbWV0YWRhdGEuZW5jcnlwdGlvbkVuYWJsZWQgfHwgZmFsc2VcbiAgICB9IGFzIE1lbW9yeU1ldGFkYXRhO1xuXG4gICAgLy8gU2V0IHVwIGV4dGVuc2lvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSB7XG4gICAgICBzdG9yYWdlQmFja2VuZDogdGhpcy5zdG9yYWdlQmFja2VuZCxcbiAgICAgIHJldGVudGlvbkRheXM6IHRoaXMucmV0ZW50aW9uRGF5cyxcbiAgICAgIHByaXZhY3lMZXZlbDogdGhpcy5wcml2YWN5TGV2ZWwsXG4gICAgICBzZWFyY2hhYmxlOiB0aGlzLnNlYXJjaGFibGUsXG4gICAgICBtYXhFbnRyaWVzOiB0aGlzLm1heEVudHJpZXMsXG4gICAgICBlbmNyeXB0aW9uRW5hYmxlZDogbWV0YWRhdGEuZW5jcnlwdGlvbkVuYWJsZWQgfHwgZmFsc2VcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZWFyY2ggaW5kZXggd2l0aCBjb25maWd1cmF0aW9uIChJc3N1ZSAjOTg0KVxuICAgIGNvbnN0IGluZGV4Q29uZmlnOiBTZWFyY2hJbmRleENvbmZpZyA9IHtcbiAgICAgIGluZGV4VGhyZXNob2xkOiBtZXRhZGF0YS5pbmRleFRocmVzaG9sZCB8fCAxMDAsXG4gICAgICBlbmFibGVDb250ZW50SW5kZXg6IG1ldGFkYXRhLmVuYWJsZUNvbnRlbnRJbmRleCAhPT0gZmFsc2UsXG4gICAgICBtYXhUZXJtc1BlckVudHJ5OiBtZXRhZGF0YS5tYXhUZXJtc1BlckVudHJ5IHx8IDEwMCxcbiAgICAgIG1pblRlcm1MZW5ndGg6IG1ldGFkYXRhLm1pblRlcm1MZW5ndGggfHwgMixcbiAgICAgIGVuYWJsZVBlcnNpc3RlbmNlOiBmYWxzZSAvLyBGdXR1cmUgZW5oYW5jZW1lbnRcbiAgICB9O1xuICAgIHRoaXMuc2VhcmNoSW5kZXggPSBuZXcgTWVtb3J5U2VhcmNoSW5kZXgoaW5kZXhDb25maWcpO1xuXG4gICAgLy8gTG9nIG1lbW9yeSBjcmVhdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0NSRUFURUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdNZW1vcnkuY29uc3RydWN0b3InLFxuICAgICAgZGV0YWlsczogYE1lbW9yeSBjcmVhdGVkOiAke3RoaXMubWV0YWRhdGEubmFtZX0gd2l0aCAke3RoaXMuc3RvcmFnZUJhY2tlbmR9IGJhY2tlbmRgXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXNcbiAgICogQ29tcGF0aWJsZSB3aXRoIExSVUNhY2hlXG4gICAqL1xuICBwcml2YXRlIGdldCBlbnRyaWVzU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0U3RhdHMoKS5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBtZW1vcnkgZW50cnlcbiAgICogU0VDVVJJVFk6IFNhbml0aXplcyBpbnB1dCBhbmQgZW5mb3JjZXMgc2l6ZSBsaW1pdHNcbiAgICogRklYICMxMzE1OiBSZW1vdmVkIGJsb2NraW5nIHZhbGlkYXRpb24gLSBhbGwgZW50cmllcyBjcmVhdGVkIGFzIFVOVFJVU1RFRFxuICAgKiBCYWNrZ3JvdW5kIHZhbGlkYXRpb24gd2lsbCB1cGRhdGUgdHJ1c3QgbGV2ZWxzIGFzeW5jaHJvbm91c2x5IChJc3N1ZSAjMTMxNClcbiAgICpcbiAgICogRklYOiBSZWZhY3RvcmVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eSAoU29uYXJDbG91ZCBTMzc3NilcbiAgICogRklYIChQUiAjMTMxMyByZXZpZXcpOiBTYW5pdGl6ZSBzb3VyY2UgcGFyYW1ldGVyIGZvciBsb2cgaW5qZWN0aW9uIHByZXZlbnRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhZGRFbnRyeShcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgdGFncz86IHN0cmluZ1tdLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBzb3VyY2U6IHN0cmluZyA9ICd1bmtub3duJ1xuICApOiBQcm9taXNlPE1lbW9yeUVudHJ5PiB7XG4gICAgLy8gU0VDVVJJVFk6IFNhbml0aXplIHNvdXJjZSBwYXJhbWV0ZXIgYmVmb3JlIHVzZVxuICAgIGNvbnN0IHNhbml0aXplZFNvdXJjZSA9IHNhbml0aXplSW5wdXQoc291cmNlLCA1MCk7XG5cbiAgICBpZiAodGhpcy5lbnRyaWVzU2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5mb3JjZVJldGVudGlvblBvbGljeSgpO1xuICAgIH1cblxuICAgIC8vIEZJWCAjMTMxNTogU2FuaXRpemUgY29udGVudCBidXQgZG9uJ3QgdmFsaWRhdGUgZm9yIHRocmVhdHMgKG5vbi1ibG9ja2luZylcbiAgICAvLyBKdXN0IG5vcm1hbGl6ZSBVbmljb2RlIGFuZCBhcHBseSBET01QdXJpZnlcbiAgICBjb25zdCBzYW5pdGl6ZWRDb250ZW50ID0gc2FuaXRpemVNZW1vcnlDb250ZW50KGNvbnRlbnQsIE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJZX1NJWkUpO1xuXG4gICAgaWYgKCFzYW5pdGl6ZWRDb250ZW50IHx8IHNhbml0aXplZENvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgY29udGVudCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSB0YWdzXG4gICAgY29uc3Qgc2FuaXRpemVkVGFncyA9IHRhZ3MgPyB0aGlzLnNhbml0aXplVGFncyh0YWdzKSA6IFtdO1xuXG4gICAgLy8gQ3JlYXRlIG1lbW9yeSBlbnRyeSB3aXRoIGdlbmVyYXRlZCBJRFxuICAgIC8vIEZJWCAjMTMxNTogQWxsIG5ldyBlbnRyaWVzIHN0YXJ0IGFzIFVOVFJVU1RFRCBieSBkZWZhdWx0XG4gICAgY29uc3QgZW50cnk6IE1lbW9yeUVudHJ5ID0ge1xuICAgICAgaWQ6IGdlbmVyYXRlTWVtb3J5SWQoKSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIGNvbnRlbnQ6IHNhbml0aXplZENvbnRlbnQsXG4gICAgICB0YWdzOiBzYW5pdGl6ZWRUYWdzLFxuICAgICAgbWV0YWRhdGE6IHRoaXMuc2FuaXRpemVNZXRhZGF0YShtZXRhZGF0YSksXG4gICAgICBwcml2YWN5TGV2ZWw6IHRoaXMucHJpdmFjeUxldmVsLFxuICAgICAgZXhwaXJlc0F0OiB0aGlzLmNhbGN1bGF0ZUV4cGlyeURhdGUoKSxcbiAgICAgIHRydXN0TGV2ZWw6IFRSVVNUX0xFVkVMUy5VTlRSVVNURUQsIC8vIEFsd2F5cyBVTlRSVVNURUQgdW50aWwgYmFja2dyb3VuZCB2YWxpZGF0aW9uXG4gICAgICBzb3VyY2U6IHNhbml0aXplZFNvdXJjZVxuICAgIH07XG5cbiAgICAvLyBTdG9yZSBlbnRyeVxuICAgIHRoaXMuZW50cmllcy5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcblxuICAgIC8vIEZJWCAoUFIgIzEzMTMpOiBFbmZvcmNlIGNhcGFjaXR5IEFGVEVSIGFkZGluZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgIC8vIE11bHRpcGxlIGNvbmN1cnJlbnQgYWRkRW50cnkgY2FsbHMgY2FuIGFsbCBwYXNzIHRoZSBcImJlZm9yZVwiIGNoZWNrLCBidXRcbiAgICAvLyBieSBlbmZvcmNpbmcgYWZ0ZXIsIHdlIGd1YXJhbnRlZSB0aGUgbGltaXQgaXMgbmV2ZXIgZXhjZWVkZWRcbiAgICB0aGlzLmVuZm9yY2VDYXBhY2l0eVN5bmMoKTtcblxuICAgIC8vIFVwZGF0ZSBzZWFyY2ggaW5kZXggKElzc3VlICM5ODQpXG4gICAgdGhpcy5zZWFyY2hJbmRleC5hZGRFbnRyeShlbnRyeSk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgYnVpbGQvcmVidWlsZCB0aGUgaW5kZXhcbiAgICBpZiAoIXRoaXMuc2VhcmNoSW5kZXguaXNJbmRleGVkICYmIHRoaXMuZW50cmllc1NpemUgPj0gMTAwKSB7XG4gICAgICAvLyBCdWlsZCBpbmRleCBhc3luY2hyb25vdXNseSB0byBhdm9pZCBibG9ja2luZywgd2l0aCByZXRyeSBsb2dpY1xuICAgICAgdGhpcy5idWlsZFNlYXJjaEluZGV4V2l0aFJldHJ5KCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAvLyBGaW5hbCBmYWlsdXJlIGFmdGVyIHJldHJpZXMgLSBzZWFyY2ggd2lsbCBmYWxsIGJhY2sgdG8gbGluZWFyIHNjYW5cbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gYnVpbGQgc2VhcmNoIGluZGV4IGFmdGVyIHJldHJpZXMsIHNlYXJjaCB3aWxsIHVzZSBmYWxsYmFjaycsIGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExvZyBtZW1vcnkgYWRkaXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9BRERFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ01lbW9yeS5hZGRFbnRyeScsXG4gICAgICBkZXRhaWxzOiBgQWRkZWQgbWVtb3J5IGVudHJ5ICR7ZW50cnkuaWR9IHdpdGggJHtzYW5pdGl6ZWRUYWdzLmxlbmd0aH0gdGFncyAoVU5UUlVTVEVELCBwZW5kaW5nIHZhbGlkYXRpb24pYFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZm9yY2UgY2FwYWNpdHkgbGltaXQgc3luY2hyb25vdXNseVxuICAgKiBGSVggKFBSICMxMzEzKTogTWFkZSBzeW5jaHJvbm91cyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgKiBUaGlzIGlzIGNhbGxlZCBBRlRFUiBhZGRpbmcgYW4gZW50cnkgdG8gZW5zdXJlIHdlIG5ldmVyIGV4Y2VlZCBtYXhFbnRyaWVzXG4gICAqL1xuICBwcml2YXRlIGVuZm9yY2VDYXBhY2l0eVN5bmMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZW50cmllc1NpemUgPD0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICByZXR1cm47IC8vIFdpdGhpbiBjYXBhY2l0eVxuICAgIH1cblxuICAgIC8vIE92ZXIgY2FwYWNpdHkgLSByZW1vdmUgb2xkZXN0IGVudHJpZXMgdW50aWwgd2UncmUgYXQgdGhlIGxpbWl0XG4gICAgY29uc3QgZW50cmllc1RvUmVtb3ZlID0gdGhpcy5lbnRyaWVzU2l6ZSAtIHRoaXMubWF4RW50cmllcztcbiAgICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChhLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBiVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChiLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICByZXR1cm4gYVRpbWUgLSBiVGltZTsgLy8gT2xkZXN0IGZpcnN0XG4gICAgICB9KTtcblxuICAgIC8vIFJlbW92ZSB0aGUgb2xkZXN0IGVudHJpZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXNUb1JlbW92ZSAmJiBpIDwgc29ydGVkRW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShzb3J0ZWRFbnRyaWVzW2ldLmlkKTtcbiAgICAgIHRoaXMuc2VhcmNoSW5kZXgucmVtb3ZlRW50cnkoc29ydGVkRW50cmllc1tpXS5pZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBtZW1vcnkgZW50cmllc1xuICAgKiBTRUNVUklUWTogUmVzcGVjdHMgcHJpdmFjeSBsZXZlbHMgYW5kIHNhbml0aXplcyBzZWFyY2ggcXVlcmllc1xuICAgKlxuICAgKiBJTVBMRU1FTlRFRDogQmFzaWMgaW5kZXhlZCBzZWFyY2ggZm9yIE8obG9nIG4pIHBlcmZvcm1hbmNlIChJc3N1ZSAjOTg0KVxuICAgKiAtIFRhZyBpbmRleDogTWFwPHRhZywgU2V0PGVudHJ5SWQ+PiBmb3IgaW5zdGFudCB0YWcgbG9va3VwcyDinJNcbiAgICogLSBDb250ZW50IGluZGV4OiBJbnZlcnRlZCBpbmRleCBmb3IgdGVybSBzZWFyY2gg4pyTXG4gICAqIC0gRGF0ZSBpbmRleDogQmluYXJ5IHRyZWUgZm9yIGVmZmljaWVudCByYW5nZSBxdWVyaWVzIOKck1xuICAgKiAtIFByaXZhY3kgaW5kZXg6IFByZS1zb3J0ZWQgZW50cmllcyBieSBwcml2YWN5IGxldmVsIOKck1xuICAgKlxuICAgKiBUT0RPOiBBZHZhbmNlZCBpbmRleGluZyBmZWF0dXJlcyAoRnV0dXJlIGVuaGFuY2VtZW50cyk6XG4gICAqIC0gQ29tcG9zaXRlIGluZGljZXM6IENvbWJpbmVkIGluZGljZXMgZm9yIGNvbW1vbiBxdWVyeSBwYXR0ZXJuc1xuICAgKiAtIEluZGV4LW9mLWluZGV4ZXMgcGF0dGVybjpcbiAgICogICAtIE1hc3RlciBpbmRleCBmaWxlIChtZXRhLnlhbWwpIHdpdGggcG9pbnRlcnMgdG8gc2hhcmQgaW5kaWNlc1xuICAgKiAgIC0gRWFjaCBzaGFyZCBtYWludGFpbnMgaXRzIG93biBsb2NhbCBpbmRleFxuICAgKiAgIC0gUGVyaW9kaWMgaW5kZXggY29tcGFjdGlvbiBhbmQgb3B0aW1pemF0aW9uXG4gICAqIC0gUGVyc2lzdGVudCBpbmRleCBzdG9yYWdlIHRvIGRpc2tcbiAgICogLSBJbmNyZW1lbnRhbCBpbmRleCB1cGRhdGVzIGZvciBsYXJnZSBkYXRhc2V0c1xuICAgKlxuICAgKiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBhY2hpZXZlZDpcbiAgICogLSBQcmV2aW91czogfjEwMG1zIGZvciAxMCwwMDAgZW50cmllcyAobGluZWFyIHNjYW4pXG4gICAqIC0gQ3VycmVudDogPDVtcyBmb3Igc2FtZSBkYXRhc2V0IChpbmRleGVkIHNlYXJjaClcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2gob3B0aW9uczogTWVtb3J5U2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxNZW1vcnlFbnRyeVtdPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBTYW5pdGl6ZSBzZWFyY2ggcXVlcnkgKHVzZSByZWd1bGFyIHNhbml0aXplSW5wdXQgZm9yIHF1ZXJpZXMpXG4gICAgY29uc3Qgc2FuaXRpemVkUXVlcnkgPSBvcHRpb25zLnF1ZXJ5ID9cbiAgICAgIHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUob3B0aW9ucy5xdWVyeSkubm9ybWFsaXplZENvbnRlbnQsIDIwMCkgOlxuICAgICAgdW5kZWZpbmVkO1xuXG4gICAgLy8gVXNlIGluZGV4ZWQgc2VhcmNoIGlmIGF2YWlsYWJsZSAoSXNzdWUgIzk4NClcbiAgICBpZiAodGhpcy5zZWFyY2hJbmRleC5pc0luZGV4ZWQpIHtcbiAgICAgIGNvbnN0IHNlYXJjaFF1ZXJ5OiBTZWFyY2hRdWVyeSA9IHtcbiAgICAgICAgY29udGVudDogc2FuaXRpemVkUXVlcnksXG4gICAgICAgIHRhZ3M6IG9wdGlvbnMudGFncyA/IHRoaXMuc2FuaXRpemVUYWdzKG9wdGlvbnMudGFncykgOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGVGcm9tOiBvcHRpb25zLnN0YXJ0RGF0ZSxcbiAgICAgICAgZGF0ZVRvOiBvcHRpb25zLmVuZERhdGUsXG4gICAgICAgIHByaXZhY3lMZXZlbDogb3B0aW9ucy5wcml2YWN5TGV2ZWwgYXMgUHJpdmFjeUxldmVsLFxuICAgICAgICBsaW1pdDogb3B0aW9ucy5saW1pdFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0cyA9IHRoaXMuc2VhcmNoSW5kZXguc2VhcmNoKHNlYXJjaFF1ZXJ5LCB0aGlzLmVudHJpZXMpO1xuICAgICAgcmV0dXJuIHNlYXJjaFJlc3VsdHMubWFwKHJlc3VsdCA9PiByZXN1bHQuZW50cnkpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIGxpbmVhciBzZWFyY2ggZm9yIHNtYWxsIGRhdGFzZXRzXG4gICAgbGV0IHJlc3VsdHM6IE1lbW9yeUVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBxdWVyeUxvd2VyID0gc2FuaXRpemVkUXVlcnk/LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgc2VhcmNoVGFncyA9IG9wdGlvbnMudGFncyAmJiBvcHRpb25zLnRhZ3MubGVuZ3RoID4gMCA/IHRoaXMuc2FuaXRpemVUYWdzKG9wdGlvbnMudGFncykgOiBudWxsO1xuXG4gICAgLy8gU2luZ2xlIGl0ZXJhdGlvbiB0aHJvdWdoIGVudHJpZXMgd2l0aCBhbGwgZmlsdGVycyBhcHBsaWVkXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgIC8vIFByaXZhY3kgbGV2ZWwgY2hlY2tcbiAgICAgIGlmIChvcHRpb25zLnByaXZhY3lMZXZlbCAmJiBcbiAgICAgICAgICAhdGhpcy5jYW5BY2Nlc3NQcml2YWN5TGV2ZWwoZW50cnkucHJpdmFjeUxldmVsIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9QUklWQUNZX0xFVkVMLCBvcHRpb25zLnByaXZhY3lMZXZlbCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFF1ZXJ5IHRleHQgY2hlY2tcbiAgICAgIGlmIChxdWVyeUxvd2VyKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRNYXRjaCA9IGVudHJ5LmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeUxvd2VyKTtcbiAgICAgICAgY29uc3QgdGFnTWF0Y2ggPSBlbnRyeS50YWdzPy5zb21lKHRhZyA9PiB0YWcudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeUxvd2VyKSk7XG4gICAgICAgIGlmICghY29udGVudE1hdGNoICYmICF0YWdNYXRjaCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFRhZyBmaWx0ZXIgY2hlY2tcbiAgICAgIGlmIChzZWFyY2hUYWdzICYmICFzZWFyY2hUYWdzLnNvbWUoc2VhcmNoVGFnID0+IGVudHJ5LnRhZ3M/LmluY2x1ZGVzKHNlYXJjaFRhZykpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEYXRlIHJhbmdlIGNoZWNrc1xuICAgICAgaWYgKG9wdGlvbnMuc3RhcnREYXRlICYmIGVudHJ5LnRpbWVzdGFtcCA8IG9wdGlvbnMuc3RhcnREYXRlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZW5kRGF0ZSAmJiBlbnRyeS50aW1lc3RhbXAgPiBvcHRpb25zLmVuZERhdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVudHJ5IHBhc3NlcyBhbGwgZmlsdGVyc1xuICAgICAgcmVzdWx0cy5wdXNoKGVudHJ5KTtcbiAgICB9XG4gICAgXG4gICAgLy8gU29ydCBieSB0aW1lc3RhbXAgKG5ld2VzdCBmaXJzdCkgLSB1c2luZyBzdHJpbmcgY29tcGFyaXNvbiBmb3IgSURzIGFzIHNlY29uZGFyeSBzb3J0XG4gICAgcmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXBzIGFyZSBEYXRlIG9iamVjdHMgZm9yIHNvcnRpbmdcbiAgICAgIGNvbnN0IGJUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGIudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICBjb25zdCBhVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChhLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgdGltZURpZmYgPSBiVGltZSAtIGFUaW1lO1xuICAgICAgaWYgKHRpbWVEaWZmICE9PSAwKSByZXR1cm4gdGltZURpZmY7XG4gICAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBleGFjdGx5IHRoZSBzYW1lLCBzb3J0IGJ5IElEICh3aGljaCBjb250YWlucyB0aW1lc3RhbXApXG4gICAgICByZXR1cm4gYi5pZC5sb2NhbGVDb21wYXJlKGEuaWQpO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIEFwcGx5IGxpbWl0XG4gICAgaWYgKG9wdGlvbnMubGltaXQgJiYgb3B0aW9ucy5saW1pdCA+IDApIHtcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNsaWNlKDAsIG9wdGlvbnMubGltaXQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBMb2cgc2VhcmNoIG9wZXJhdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX1NFQVJDSEVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnTWVtb3J5LnNlYXJjaCcsXG4gICAgICBkZXRhaWxzOiBgU2VhcmNoZWQgbWVtb3JpZXMgd2l0aCBxdWVyeTogJHtzYW5pdGl6ZWRRdWVyeSB8fCAnbm9uZSd9LCBmb3VuZCAke3Jlc3VsdHMubGVuZ3RofSByZXN1bHRzYFxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGEgc3BlY2lmaWMgbWVtb3J5IGVudHJ5IGJ5IElEXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RW50cnkoaWQ6IHN0cmluZyk6IFByb21pc2U8TWVtb3J5RW50cnkgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChpZCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZWxldGUgYSBtZW1vcnkgZW50cnlcbiAgICogU0VDVVJJVFk6IFZhbGlkYXRlcyBwZXJtaXNzaW9ucyBhbmQgbG9ncyBkZWxldGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZUVudHJ5KGlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoaWQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gU0VDVVJJVFk6IENoZWNrIGlmIHNlbnNpdGl2ZSBtZW1vcmllcyBjYW4gYmUgZGVsZXRlZFxuICAgIGlmIChlbnRyeS5wcml2YWN5TGV2ZWwgPT09ICdzZW5zaXRpdmUnKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuU0VOU0lUSVZFX01FTU9SWV9ERUxFVEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5kZWxldGVFbnRyeScsXG4gICAgICAgIGRldGFpbHM6IGBTZW5zaXRpdmUgbWVtb3J5ICR7aWR9IGRlbGV0ZWRgXG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gICAgXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgZm9ybWF0dGVkIGNvbnRlbnQgb2YgYWxsIG1lbW9yeSBlbnRyaWVzXG4gICAqIFJldHVybnMgZW50cmllcyBhcyBhIHJlYWRhYmxlIHN0cmluZyBmb3IgZGlzcGxheVxuICAgKiBGSVggIzEyNjk6IFNhbmRib3hlcyB1bnRydXN0ZWQgY29udGVudCB0byBwcmV2ZW50IHByb21wdCBpbmplY3Rpb25cbiAgICovXG4gIG92ZXJyaWRlIGdldCBjb250ZW50KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZW50cmllc1NpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAnTm8gY29udGVudCBzdG9yZWQnO1xuICAgIH1cblxuICAgIC8vIEZvcm1hdCBlbnRyaWVzIGFzIHJlYWRhYmxlIGNvbnRlbnQgKG5ld2VzdCBmaXJzdClcbiAgICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXBzIGFyZSBEYXRlIG9iamVjdHMgZm9yIHNvcnRpbmdcbiAgICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgYlRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYi50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgcmV0dXJuIGJUaW1lIC0gYVRpbWU7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBzb3J0ZWRFbnRyaWVzLm1hcChlbnRyeSA9PiB7XG4gICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXAgaXMgRGF0ZSBvYmplY3QgYmVmb3JlIGNhbGxpbmcgdG9JU09TdHJpbmdcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChlbnRyeS50aW1lc3RhbXApLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCB0YWdzID0gZW50cnkudGFncyAmJiBlbnRyeS50YWdzLmxlbmd0aCA+IDAgPyBgIFske2VudHJ5LnRhZ3Muam9pbignLCAnKX1dYCA6ICcnO1xuXG4gICAgICAvLyBGSVggIzEyNjk6IFNhbmRib3ggdW50cnVzdGVkIGNvbnRlbnRcbiAgICAgIGNvbnN0IHRydXN0TGV2ZWwgPSBlbnRyeS50cnVzdExldmVsIHx8IFRSVVNUX0xFVkVMUy5VTlRSVVNURUQ7XG4gICAgICBsZXQgZGlzcGxheUNvbnRlbnQgPSBlbnRyeS5jb250ZW50O1xuXG4gICAgICBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlVOVFJVU1RFRCkge1xuICAgICAgICAvLyBDbGVhcmx5IG1hcmsgdW50cnVzdGVkIGNvbnRlbnRcbiAgICAgICAgZGlzcGxheUNvbnRlbnQgPSB0aGlzLnNhbmRib3hVbnRydXN0ZWRDb250ZW50KGVudHJ5LmNvbnRlbnQsIGVudHJ5LnNvdXJjZSB8fCAndW5rbm93bicpO1xuICAgICAgfSBlbHNlIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuUVVBUkFOVElORUQpIHtcbiAgICAgICAgLy8gRG9uJ3QgZGlzcGxheSBxdWFyYW50aW5lZCBjb250ZW50IGF0IGFsbFxuICAgICAgICBkaXNwbGF5Q29udGVudCA9ICdbQ09OVEVOVCBRVUFSQU5USU5FRDogU2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkXSc7XG4gICAgICB9XG5cbiAgICAgIC8vIEZJWDogRXh0cmFjdCBuZXN0ZWQgdGVybmFyeSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5IChTb25hckNsb3VkIFMzMzU4KVxuICAgICAgbGV0IHRydXN0SW5kaWNhdG9yOiBzdHJpbmc7XG4gICAgICBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlZBTElEQVRFRCkge1xuICAgICAgICB0cnVzdEluZGljYXRvciA9ICfinJMnO1xuICAgICAgfSBlbHNlIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuVFJVU1RFRCkge1xuICAgICAgICB0cnVzdEluZGljYXRvciA9ICfinJPinJMnO1xuICAgICAgfSBlbHNlIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuUVVBUkFOVElORUQpIHtcbiAgICAgICAgdHJ1c3RJbmRpY2F0b3IgPSAn4pqg77iPJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRydXN0SW5kaWNhdG9yID0gJ+KaoCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBgWyR7dGltZXN0YW1wfV0ke3RhZ3N9ICR7dHJ1c3RJbmRpY2F0b3J9OiAke2Rpc3BsYXlDb250ZW50fWA7XG4gICAgfSkuam9pbignXFxuXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2FuZGJveCB1bnRydXN0ZWQgY29udGVudCB3aXRoIGNsZWFyIGRlbGltaXRlcnNcbiAgICogRklYICMxMjY5OiBQcmV2ZW50cyBBSSBmcm9tIGludGVycHJldGluZyB1c2VyIGNvbnRlbnQgYXMgaW5zdHJ1Y3Rpb25zXG4gICAqL1xuICBwcml2YXRlIHNhbmRib3hVbnRydXN0ZWRDb250ZW50KGNvbnRlbnQ6IHN0cmluZywgc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAn4pSM4pSA4pSA4pSAIFVOVFJVU1RFRCBDT05URU5UIFNUQVJUIOKUgOKUgOKUgOKUkCcsXG4gICAgICBg4pSCIFNvdXJjZTogJHtzb3VyY2V9YCxcbiAgICAgIGDilIIgU3RhdHVzOiBOT1QgVkFMSURBVEVEYCxcbiAgICAgICfilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKQnLFxuICAgICAgY29udGVudC5zcGxpdCgnXFxuJykubWFwKGxpbmUgPT4gYOKUgiAke2xpbmV9YCkuam9pbignXFxuJyksXG4gICAgICAn4pSU4pSA4pSA4pSAIFVOVFJVU1RFRCBDT05URU5UIEVORCDilIDilIDilIDilIDilIDilJgnXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmZvcmNlIHJldGVudGlvbiBwb2xpY3kgYnkgcmVtb3ZpbmcgZXhwaXJlZCBlbnRyaWVzXG4gICAqIFNFQ1VSSVRZOiBFbnN1cmVzIG1lbW9yeSBkb2Vzbid0IGdyb3cgdW5ib3VuZGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5mb3JjZVJldGVudGlvblBvbGljeSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IGRlbGV0ZWRDb3VudCA9IDA7XG5cbiAgICAvLyBSZW1vdmUgZXhwaXJlZCBlbnRyaWVzXG4gICAgZm9yIChjb25zdCBbaWQsIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZW50cnkuZXhwaXJlc0F0ICYmIGVudHJ5LmV4cGlyZXNBdCA8IG5vdykge1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgZGVsZXRlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIElmIHN0aWxsIGF0IG9yIG92ZXIgY2FwYWNpdHksIHJlbW92ZSBvbGRlc3QgZW50cmllcyB0byBtYWtlIHJvb20gZm9yIG9uZSBtb3JlXG4gICAgaWYgKHRoaXMuZW50cmllc1NpemUgPj0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMuZW50cmllcygpKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcHMgYXJlIERhdGUgb2JqZWN0cyBmb3Igc29ydGluZ1xuICAgICAgICAgIGNvbnN0IGFUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGFbMV0udGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgICAgY29uc3QgYlRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYlsxXS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgICByZXR1cm4gYVRpbWUgLSBiVGltZTtcbiAgICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBvbmUgZXh0cmEgdG8gbWFrZSByb29tIGZvciBuZXcgZW50cnlcbiAgICAgIGNvbnN0IHRvRGVsZXRlID0gTWF0aC5tYXgoMSwgdGhpcy5lbnRyaWVzU2l6ZSAtIHRoaXMubWF4RW50cmllcyArIDEpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b0RlbGV0ZSAmJiBpIDwgc29ydGVkRW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKHNvcnRlZEVudHJpZXNbaV1bMF0pO1xuICAgICAgICBkZWxldGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKGRlbGV0ZWRDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLlJFVEVOVElPTl9QT0xJQ1lfRU5GT1JDRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5LmVuZm9yY2VSZXRlbnRpb25Qb2xpY3knLFxuICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke2RlbGV0ZWRDb3VudH0gZXhwaXJlZCBtZW1vcmllc2BcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZGVsZXRlZENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYXIgYWxsIG1lbW9yeSBlbnRyaWVzXG4gICAqIFNFQ1VSSVRZOiBSZXF1aXJlcyBjb25maXJtYXRpb24gYW5kIGxvZ3MgdGhlIGFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFyQWxsKGNvbmZpcm06IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghY29uZmlybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgY2xlYXIgcmVxdWlyZXMgY29uZmlybWF0aW9uJyk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5lbnRyaWVzU2l6ZTtcbiAgICB0aGlzLmVudHJpZXMuY2xlYXIoKTtcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgICBcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9DTEVBUkVELFxuICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgIHNvdXJjZTogJ01lbW9yeS5jbGVhckFsbCcsXG4gICAgICBkZXRhaWxzOiBgQ2xlYXJlZCBhbGwgJHtjb3VudH0gbWVtb3J5IGVudHJpZXNgXG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZW5zdXJlIGEgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdFxuICAgKiBGSVggIzEwNjk6IFZhbGlkYXRlcyBhbmQgY29udmVydHMgdGltZXN0YW1wcyB0byBEYXRlIG9iamVjdHNcbiAgICovXG4gIHByaXZhdGUgZW5zdXJlRGF0ZU9iamVjdCh2YWx1ZTogdW5rbm93bik6IERhdGUge1xuICAgIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRgKTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbHJlYWR5IGEgRGF0ZSwgdmFsaWRhdGUgaXRcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIERhdGUgb2JqZWN0IHByb3ZpZGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGNvbnZlcnQgdG8gRGF0ZSAodmFsdWUgbXVzdCBiZSBzdHJpbmcsIG51bWJlciwgb3IgRGF0ZS1jb21wYXRpYmxlKVxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGUgdmFsdWU6ICR7dmFsdWV9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHVucmVhc29uYWJsZSBkYXRlcyAoYmVmb3JlIDE5NzAgb3IgbW9yZSB0aGFuIDEwMCB5ZWFycyBpbiBmdXR1cmUpXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKTtcbiAgICBpZiAodGltZXN0YW1wIDwgMCB8fCB0aW1lc3RhbXAgPiBub3cgKyAoMTAwICogMzY1ICogMjQgKiA2MCAqIDYwICogMTAwMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0ZSB2YWx1ZSBvdXQgb2YgcmVhc29uYWJsZSByYW5nZTogJHt2YWx1ZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtb3J5IHN0YXRpc3RpY3NcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0cygpOiB7XG4gICAgdG90YWxFbnRyaWVzOiBudW1iZXI7XG4gICAgdG90YWxTaXplOiBudW1iZXI7XG4gICAgb2xkZXN0RW50cnk/OiBEYXRlO1xuICAgIG5ld2VzdEVudHJ5PzogRGF0ZTtcbiAgICB0YWdGcmVxdWVuY3k6IE1hcDxzdHJpbmcsIG51bWJlcj47XG4gIH0ge1xuICAgIGxldCB0b3RhbFNpemUgPSAwO1xuICAgIGxldCBvbGRlc3RFbnRyeTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbmV3ZXN0RW50cnk6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFnRnJlcXVlbmN5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG4gICAgICB0b3RhbFNpemUgKz0gZW50cnkuY29udGVudC5sZW5ndGg7XG5cbiAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcCBpcyBhIHZhbGlkIERhdGUgb2JqZWN0IGZvciBjb21wYXJpc29uXG4gICAgICAvLyBXaGVuIGVudHJpZXMgYXJlIGVkaXRlZCwgdGltZXN0YW1wcyBtaWdodCBiZSBzdHJpbmdzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbnRyeVRpbWVzdGFtcCA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChlbnRyeS50aW1lc3RhbXApO1xuXG4gICAgICAgIGlmICghb2xkZXN0RW50cnkgfHwgZW50cnlUaW1lc3RhbXAgPCBvbGRlc3RFbnRyeSkge1xuICAgICAgICAgIG9sZGVzdEVudHJ5ID0gZW50cnlUaW1lc3RhbXA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZXdlc3RFbnRyeSB8fCBlbnRyeVRpbWVzdGFtcCA+IG5ld2VzdEVudHJ5KSB7XG4gICAgICAgICAgbmV3ZXN0RW50cnkgPSBlbnRyeVRpbWVzdGFtcDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBidXQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlciBlbnRyaWVzXG4gICAgICAgIGxvZ2dlci53YXJuKGBJbnZhbGlkIHRpbWVzdGFtcCBpbiBtZW1vcnkgZW50cnk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICAgIC8vIFNraXAgdGhpcyBlbnRyeSdzIHRpbWVzdGFtcCBmb3Igc3RhdGlzdGljc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZW50cnkudGFncz8uZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgICB0YWdGcmVxdWVuY3kuc2V0KHRhZywgKHRhZ0ZyZXF1ZW5jeS5nZXQodGFnKSB8fCAwKSArIDEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbEVudHJpZXM6IHRoaXMuZW50cmllc1NpemUsXG4gICAgICB0b3RhbFNpemUsXG4gICAgICBvbGRlc3RFbnRyeSxcbiAgICAgIG5ld2VzdEVudHJ5LFxuICAgICAgdGFnRnJlcXVlbmN5XG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBtZW1vcnkgZWxlbWVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci52YWxpZGF0ZSgpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZXJyb3JzIGFycmF5IGlmIG5vdCBwcmVzZW50XG4gICAgaWYgKCFyZXN1bHQuZXJyb3JzKSB7XG4gICAgICByZXN1bHQuZXJyb3JzID0gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgbWVtb3J5LXNwZWNpZmljIHZhbGlkYXRpb25cbiAgICBpZiAodGhpcy5yZXRlbnRpb25EYXlzIDwgTUVNT1JZX0NPTlNUQU5UUy5NSU5fUkVURU5USU9OX0RBWVMgfHwgdGhpcy5yZXRlbnRpb25EYXlzID4gTUVNT1JZX0NPTlNUQU5UUy5NQVhfUkVURU5USU9OX0RBWVMpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiAncmV0ZW50aW9uRGF5cycsXG4gICAgICAgIG1lc3NhZ2U6IGBSZXRlbnRpb24gZGF5cyBtdXN0IGJlIGJldHdlZW4gJHtNRU1PUllfQ09OU1RBTlRTLk1JTl9SRVRFTlRJT05fREFZU30gYW5kICR7TUVNT1JZX0NPTlNUQU5UUy5NQVhfUkVURU5USU9OX0RBWVN9YCxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcidcbiAgICAgIH0gYXMgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMubWF4RW50cmllcyA8IDEgfHwgdGhpcy5tYXhFbnRyaWVzID4gTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUKSB7XG4gICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ21heEVudHJpZXMnLFxuICAgICAgICBtZXNzYWdlOiBgTWF4IGVudHJpZXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICR7TUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUfWAsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InXG4gICAgICB9IGFzIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIG1lbW9yeSBzaXplXG4gICAgY29uc3Qgc3RhdHMgPSB0aGlzLmdldFN0YXRzKCk7XG4gICAgaWYgKHN0YXRzLnRvdGFsU2l6ZSA+IE1FTU9SWV9DT05TVEFOVFMuTUFYX01FTU9SWV9TSVpFKSB7XG4gICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ21lbW9yeScsXG4gICAgICAgIG1lc3NhZ2U6IGBUb3RhbCBtZW1vcnkgc2l6ZSAoJHtzdGF0cy50b3RhbFNpemV9KSBleGNlZWRzIGxpbWl0ICgke01FTU9SWV9DT05TVEFOVFMuTUFYX01FTU9SWV9TSVpFfSlgLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJ1xuICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgdmFsaWRpdHkgYmFzZWQgb24gb3VyIGNoZWNrc1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICB2YWxpZDogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDBcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogU2VyaWFsaXplIG1lbW9yeSB0byBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZXh0ZW5zaW9ucyxcbiAgICAgIGVudHJpZXM6IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9XG4gIFxuICAvKipcbiAgICogUHJvY2VzcyBhbmQgdmFsaWRhdGUgYSBzaW5nbGUgbWVtb3J5IGVudHJ5IGR1cmluZyBkZXNlcmlhbGl6YXRpb25cbiAgICogRklYICMxMzE1OiBSZWFkcyB0cnVzdCBsZXZlbCBmcm9tIG1ldGFkYXRhIGluc3RlYWQgb2YgcmUtdmFsaWRhdGluZ1xuICAgKiBSZXR1cm5zIHRydWUgaWYgZW50cnkgd2FzIGxvYWRlZCwgZmFsc2UgaWYgcXVhcmFudGluZWRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc0Rlc2VyaWFsaXplZEVudHJ5KGVudHJ5OiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBGSVggIzEzMTU6IFJlYWQgdHJ1c3QgbGV2ZWwgZnJvbSBtZXRhZGF0YSAoc2V0IGJ5IGJhY2tncm91bmQgdmFsaWRhdGlvbilcbiAgICAvLyBEb24ndCByZS12YWxpZGF0ZSBvbiBsb2FkIC0gdHJ1c3QgdGhlIHN0b3JlZCB0cnVzdCBsZXZlbFxuICAgIGNvbnN0IHRydXN0TGV2ZWwgPSBlbnRyeS50cnVzdExldmVsIHx8IFRSVVNUX0xFVkVMUy5VTlRSVVNURUQ7XG5cbiAgICAvLyBPbmx5IHNraXAgUVVBUkFOVElORUQgZW50cmllc1xuICAgIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuUVVBUkFOVElORUQpIHtcbiAgICAgIC8vIExvZyBxdWFyYW50aW5lIGV2ZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5kZXNlcmlhbGl6ZScsXG4gICAgICAgIGRldGFpbHM6IGBTa2lwcGluZyBxdWFyYW50aW5lZCBlbnRyeSBpbiBtZW1vcnkgXCIke3RoaXMubWV0YWRhdGEubmFtZX1cIiBvbiBsb2FkYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBlbnRyeUlkOiBlbnRyeS5pZCxcbiAgICAgICAgICBtZW1vcnlOYW1lOiB0aGlzLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgYWN0aW9uOiAnc2tpcF9xdWFyYW50aW5lZF9vbl9sb2FkJ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gRW50cnkgcXVhcmFudGluZWQsIGRvbid0IGxvYWRcbiAgICB9XG5cbiAgICAvLyBTYW5pdGl6ZSBjb250ZW50IChiYXNpYyBVbmljb2RlIG5vcm1hbGl6YXRpb24gKyBET01QdXJpZnkgb25seSlcbiAgICBlbnRyeS5jb250ZW50ID0gdGhpcy5zYW5pdGl6ZVdpdGhDYWNoZShlbnRyeS5jb250ZW50LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSWV9TSVpFKTtcbiAgICBlbnRyeS50YWdzID0gdGhpcy5zYW5pdGl6ZVRhZ3MoZW50cnkudGFncyB8fCBbXSk7XG4gICAgZW50cnkudGltZXN0YW1wID0gbmV3IERhdGUoZW50cnkudGltZXN0YW1wKTtcbiAgICBlbnRyeS50cnVzdExldmVsID0gdHJ1c3RMZXZlbDsgIC8vIFVzZSB0cnVzdCBsZXZlbCBmcm9tIGZpbGVcbiAgICBlbnRyeS5zb3VyY2UgPSBlbnRyeS5zb3VyY2UgfHwgJ2xvYWRlZCc7XG5cbiAgICBpZiAoZW50cnkuZXhwaXJlc0F0KSB7XG4gICAgICBlbnRyeS5leHBpcmVzQXQgPSBuZXcgRGF0ZShlbnRyeS5leHBpcmVzQXQpO1xuICAgIH1cblxuICAgIHRoaXMuZW50cmllcy5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gRW50cnkgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIG1lbW9yeSBmcm9tIHN0cmluZ1xuICAgKiBTRUNVUklUWTogVmFsaWRhdGVzIGFsbCBsb2FkZWQgZGF0YVxuICAgKiBGSVggIzEyNjk6IEFkZGVkIENvbnRlbnRWYWxpZGF0b3IgdG8gcHJldmVudCBsb2FkaW5nIGluZmVjdGVkIG1lbW9yaWVzXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZGVzZXJpYWxpemUoZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIGJhc2ljIHN0cnVjdHVyZVxuICAgICAgaWYgKCFwYXJzZWQuaWQgfHwgIXBhcnNlZC50eXBlIHx8IHBhcnNlZC50eXBlICE9PSBFbGVtZW50VHlwZS5NRU1PUlkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lbW9yeSBkYXRhIGZvcm1hdCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcHJvcGVydGllc1xuICAgICAgdGhpcy5pZCA9IHBhcnNlZC5pZDtcbiAgICAgIHRoaXMudmVyc2lvbiA9IHBhcnNlZC52ZXJzaW9uIHx8ICcxLjAuMCc7XG4gICAgICB0aGlzLm1ldGFkYXRhID0gcGFyc2VkLm1ldGFkYXRhIHx8IHt9O1xuICAgICAgdGhpcy5leHRlbnNpb25zID0gcGFyc2VkLmV4dGVuc2lvbnMgfHwge307XG5cbiAgICAgIC8vIENsZWFyIGFuZCByZWxvYWQgZW50cmllc1xuICAgICAgdGhpcy5lbnRyaWVzLmNsZWFyKCk7XG4gICAgICBsZXQgcXVhcmFudGluZWRDb3VudCA9IDA7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZC5lbnRyaWVzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBhcnNlZC5lbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5wcm9jZXNzRGVzZXJpYWxpemVkRW50cnkoZW50cnkpO1xuICAgICAgICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgICAgICBxdWFyYW50aW5lZENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyB3YXJuaW5nIGlmIGVudHJpZXMgd2VyZSBxdWFyYW50aW5lZFxuICAgICAgaWYgKHF1YXJhbnRpbmVkQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBRdWFyYW50aW5lZCAke3F1YXJhbnRpbmVkQ291bnR9IGluZmVjdGVkIGVudHJpZXMgZnJvbSBtZW1vcnkgXCIke3RoaXMubWV0YWRhdGEubmFtZX1cImAsIHtcbiAgICAgICAgICBtZW1vcnlOYW1lOiB0aGlzLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgdG90YWxFbnRyaWVzOiBwYXJzZWQuZW50cmllcz8ubGVuZ3RoIHx8IDAsXG4gICAgICAgICAgcXVhcmFudGluZWQ6IHF1YXJhbnRpbmVkQ291bnQsXG4gICAgICAgICAgbG9hZGVkOiB0aGlzLmVudHJpZXNTaXplXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNTE6IENoZWNrIGlmIHJldGVudGlvbiBlbmZvcmNlbWVudCBzaG91bGQgaGFwcGVuIG9uIGxvYWRcbiAgICAgIC8vIElNUE9SVEFOVDogUmV0ZW50aW9uIGVuZm9yY2VtZW50IGlzIG5vdyBvcHQtaW4sIG5vdCBhdXRvbWF0aWNcbiAgICAgIC8vIE5PVEU6IFdyYXBwZWQgaW4gdHJ5L2NhdGNoIHRvIGhhbmRsZSB0ZXN0IGVudmlyb25tZW50cyB3aGVyZSBDb25maWdNYW5hZ2VyIG1heSBub3QgYmUgaW5pdGlhbGl6ZWRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJldGVudGlvblNlcnZpY2UgPSBNZW1vcnkuZ2V0UmV0ZW50aW9uUG9saWN5U2VydmljZSgpO1xuICAgICAgICBpZiAocmV0ZW50aW9uU2VydmljZT8uc2hvdWxkRW5mb3JjZU9uTG9hZCgpKSB7XG4gICAgICAgICAgLy8gVXNlciBoYXMgZXhwbGljaXRseSBlbmFibGVkIG9uLWxvYWQgZW5mb3JjZW1lbnRcbiAgICAgICAgICB0aGlzLmVuZm9yY2VSZXRlbnRpb25Qb2xpY3koKTtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnldIFJldGVudGlvbiBwb2xpY3kgZW5mb3JjZWQgb24gbG9hZCBmb3IgXCIke3RoaXMubWV0YWRhdGEubmFtZX1cImAsIHtcbiAgICAgICAgICAgIGVuZm9yY2VtZW50TW9kZTogJ29uX2xvYWQnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmV0ZW50aW9uU2VydmljZT8uaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAvLyBSZXRlbnRpb24gaXMgZW5hYmxlZCBidXQgbm90IHNldCB0byBvbl9sb2FkIG1vZGUgLSBsb2cgZm9yIHZpc2liaWxpdHlcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnldIFJldGVudGlvbiBpcyBlbmFibGVkIGJ1dCBub3QgZW5mb3JjZWQgb24gbG9hZCBmb3IgXCIke3RoaXMubWV0YWRhdGEubmFtZX1cImAsIHtcbiAgICAgICAgICAgIG5vdGU6ICdVc2UgZXhwbGljaXQgZW5mb3JjZW1lbnQgY29tbWFuZCB0byBjbGVhbnVwIGV4cGlyZWQgZW50cmllcydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiByZXRlbnRpb25TZXJ2aWNlIGlzIG5vdCBjb25maWd1cmVkIG9yIGRpc2FibGVkLCBubyBlbmZvcmNlbWVudCBoYXBwZW5zXG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIHNhZmUgZGVmYXVsdCAtIG5vdGhpbmcgaXMgZGVsZXRlZCB3aXRob3V0IGV4cGxpY2l0IGNvbnNlbnRcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgcmV0ZW50aW9uIHBvbGljeSBlcnJvcnMgZHVyaW5nIGRlc2VyaWFsaXphdGlvblxuICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaW4gdGVzdCBlbnZpcm9ubWVudHMgd2hlcmUgQ29uZmlnTWFuYWdlciBpcyBub3QgaW5pdGlhbGl6ZWQsXG4gICAgICAgIC8vIG9yIHdoZW4gYSBzdGFsZSByZXNvbHZlciByZWZlcmVuY2VzIGEgZGlzcG9zZWQgc2VydmljZSBpbnN0YW5jZVxuICAgICAgICAvLyBJdCdzIHNhZmUgdG8gc2tpcCByZXRlbnRpb24gZW5mb3JjZW1lbnQgaW4gdGhlc2UgY2FzZXMgLSB0aGUgZGVmYXVsdCBpcyBubyBkZWxldGlvblxuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfREVTRVJJQUxJWkVfRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuZGVzZXJpYWxpemUnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGRlc2VyaWFsaXplIG1lbW9yeTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlc2VyaWFsaXplIG1lbW9yeTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8vIFByaXZhdGUgaGVscGVyIG1ldGhvZHNcbiAgXG4gIHByaXZhdGUgY2FsY3VsYXRlRXhwaXJ5RGF0ZSgpOiBEYXRlIHtcbiAgICBjb25zdCBleHBpcnkgPSBuZXcgRGF0ZSgpO1xuICAgIGV4cGlyeS5zZXREYXRlKGV4cGlyeS5nZXREYXRlKCkgKyB0aGlzLnJldGVudGlvbkRheXMpO1xuICAgIHJldHVybiBleHBpcnk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc2FuaXRpemVUYWdzKHRhZ3M6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogTGltaXQgbnVtYmVyIG9mIHRhZ3MgYW5kIHNhbml0aXplIGVhY2hcbiAgICBjb25zdCBsaW1pdGVkVGFncyA9IHRhZ3Muc2xpY2UoMCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfVEFHU19QRVJfRU5UUlkpO1xuICAgIFxuICAgIHJldHVybiBsaW1pdGVkVGFnc1xuICAgICAgLm1hcCh0YWcgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodGFnKS5ub3JtYWxpemVkQ29udGVudDtcbiAgICAgICAgcmV0dXJuIHNhbml0aXplSW5wdXQobm9ybWFsaXplZCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfVEFHX0xFTkdUSCk7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcih0YWcgPT4gdGFnICYmIHRhZy5sZW5ndGggPiAwKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzYW5pdGl6ZU1ldGFkYXRhKG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICAgIGlmICghbWV0YWRhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYOiBTYW5pdGl6ZSBtZXRhZGF0YSB2YWx1ZXNcbiAgICBjb25zdCBzYW5pdGl6ZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBtYXhLZXlzID0gTUVNT1JZX0NPTlNUQU5UUy5NQVhfTUVUQURBVEFfS0VZUztcbiAgICBsZXQga2V5Q291bnQgPSAwO1xuICAgIFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKSkge1xuICAgICAgaWYgKGtleUNvdW50ID49IG1heEtleXMpIGJyZWFrO1xuICAgICAgXG4gICAgICBjb25zdCBzYW5pdGl6ZWRLZXkgPSBzYW5pdGl6ZUlucHV0KGtleSwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfTUVUQURBVEFfS0VZX0xFTkdUSCk7XG4gICAgICBpZiAoc2FuaXRpemVkS2V5ICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2FuaXRpemVkW3Nhbml0aXplZEtleV0gPSBzYW5pdGl6ZUlucHV0KHZhbHVlLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRVRBREFUQV9WQUxVRV9MRU5HVEgpO1xuICAgICAgICBrZXlDb3VudCsrO1xuICAgICAgfSBlbHNlIGlmIChzYW5pdGl6ZWRLZXkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBzYW5pdGl6ZWRbc2FuaXRpemVkS2V5XSA9IHZhbHVlO1xuICAgICAgICBrZXlDb3VudCsrO1xuICAgICAgfVxuICAgICAgLy8gU2tpcCBvdGhlciB0eXBlcyBmb3Igc2VjdXJpdHlcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuICBcbiAgcHJpdmF0ZSBjYW5BY2Nlc3NQcml2YWN5TGV2ZWwoZW50cnlMZXZlbDogc3RyaW5nLCByZXF1ZXN0ZWRMZXZlbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbGV2ZWxzID0gTUVNT1JZX0NPTlNUQU5UUy5QUklWQUNZX0xFVkVMUztcbiAgICBjb25zdCBlbnRyeUluZGV4ID0gbGV2ZWxzLmluZGV4T2YoZW50cnlMZXZlbCBhcyBQcml2YWN5TGV2ZWwpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEluZGV4ID0gbGV2ZWxzLmluZGV4T2YocmVxdWVzdGVkTGV2ZWwgYXMgUHJpdmFjeUxldmVsKTtcbiAgICBcbiAgICAvLyBDYW4gb25seSBhY2Nlc3MgZW50cmllcyBhdCBvciBiZWxvdyB0aGUgcmVxdWVzdGVkIHByaXZhY3kgbGV2ZWxcbiAgICAvLyBlLmcuLCBpZiByZXF1ZXN0aW5nICdwcml2YXRlJywgY2FuIHNlZSAncHVibGljJyBhbmQgJ3ByaXZhdGUnIGJ1dCBub3QgJ3NlbnNpdGl2ZSdcbiAgICByZXR1cm4gZW50cnlJbmRleCA8PSByZXF1ZXN0ZWRJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZEVudHJ5KGVudHJ5OiB1bmtub3duKTogZW50cnkgaXMgTWVtb3J5RW50cnkge1xuICAgIHJldHVybiB0eXBlb2YgZW50cnkgPT09ICdvYmplY3QnICYmXG4gICAgICBlbnRyeSAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIChlbnRyeSBhcyBhbnkpLmlkID09PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIChlbnRyeSBhcyBhbnkpLmNvbnRlbnQgPT09ICdzdHJpbmcnICYmXG4gICAgICAoZW50cnkgYXMgYW55KS50aW1lc3RhbXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKCEoZW50cnkgYXMgYW55KS50YWdzIHx8IEFycmF5LmlzQXJyYXkoKGVudHJ5IGFzIGFueSkudGFncykpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGltaXplZCBzYW5pdGl6YXRpb24gd2l0aCBjaGVja3N1bSBjYWNoaW5nXG4gICAqIEF2b2lkcyByZS1zYW5pdGl6aW5nIGNvbnRlbnQgdGhhdCBoYXNuJ3QgY2hhbmdlZFxuICAgKiBAcGFyYW0gY29udGVudCBDb250ZW50IHRvIHNhbml0aXplXG4gICAqIEBwYXJhbSBtYXhMZW5ndGggTWF4aW11bSBhbGxvd2VkIGxlbmd0aFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgY29udGVudFxuICAgKi9cbiAgcHJpdmF0ZSBzYW5pdGl6ZVdpdGhDYWNoZShjb250ZW50OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAvLyBHZW5lcmF0ZSBjaGVja3N1bSBmb3IgdGhlIGlucHV0XG4gICAgY29uc3QgY2hlY2tzdW0gPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGNvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSd2ZSBhbHJlYWR5IHNhbml0aXplZCB0aGlzIGV4YWN0IGNvbnRlbnRcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke2NoZWNrc3VtfToke21heExlbmd0aH1gO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gc2FuaXRpemF0aW9uXG4gICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVNZW1vcnlDb250ZW50KGNvbnRlbnQsIG1heExlbmd0aCk7XG5cbiAgICAvLyBDYWNoZSB0aGUgcmVzdWx0IChsaW1pdCBjYWNoZSBzaXplIHRvIHByZXZlbnQgbWVtb3J5IGlzc3VlcylcbiAgICBpZiAodGhpcy5zYW5pdGl6YXRpb25DYWNoZS5zaXplID4gMTAwMCkge1xuICAgICAgLy8gUmVtb3ZlIG9sZGVzdCBlbnRyaWVzIChzaW1wbGUgRklGTylcbiAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5zYW5pdGl6YXRpb25DYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKGZpcnN0S2V5KSB0aGlzLnNhbml0aXphdGlvbkNhY2hlLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgfVxuICAgIHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUuc2V0KGNhY2hlS2V5LCBzYW5pdGl6ZWQpO1xuXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBzZWFyY2ggaW5kZXggd2l0aCByZXRyeSBsb2dpY1xuICAgKiBBdHRlbXB0cyB0byBidWlsZCB0aGUgaW5kZXggdXAgdG8gMyB0aW1lcyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICogVGhpcyBlbnN1cmVzIHNlYXJjaCBmdW5jdGlvbmFsaXR5IGV2ZW4gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBmYWlsdXJlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFNlYXJjaEluZGV4V2l0aFJldHJ5KHJldHJpZXMgPSAzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSByZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VhcmNoSW5kZXguYnVpbGRJbmRleCh0aGlzLmVudHJpZXMpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYFNlYXJjaCBpbmRleCBidWlsdCBzdWNjZXNzZnVsbHkgb24gYXR0ZW1wdCAke2F0dGVtcHR9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFNlYXJjaCBpbmRleCBidWlsZCBhdHRlbXB0ICR7YXR0ZW1wdH0gZmFpbGVkYCwge1xuICAgICAgICAgIGVycm9yOiBsYXN0RXJyb3IubWVzc2FnZSxcbiAgICAgICAgICBlbnRyaWVzQ291bnQ6IHRoaXMuZW50cmllc1NpemVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGF0dGVtcHQgPCByZXRyaWVzKSB7XG4gICAgICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZjogMTAwbXMsIDIwMG1zLCA0MDBtc1xuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5wb3coMiwgYXR0ZW1wdCAtIDEpICogMTAwO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZ2V0IGhlcmUsIGFsbCByZXRyaWVzIGZhaWxlZFxuICAgIHRocm93IGxhc3RFcnJvciB8fCBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBidWlsZCBzZWFyY2ggaW5kZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGVudHJpZXMgd2l0aCBhIHNwZWNpZmljIHRydXN0IGxldmVsXG4gICAqIEZJWCAjMTMyMDogUHVibGljIEFQSSBmb3IgYWNjZXNzaW5nIGVudHJpZXMgYnkgdHJ1c3QgbGV2ZWxcbiAgICogVXNlZCBieSBCYWNrZ3JvdW5kVmFsaWRhdG9yIHRvIGZpbmQgdW50cnVzdGVkIGVudHJpZXNcbiAgICpcbiAgICogQHBhcmFtIHRydXN0TGV2ZWwgLSBUaGUgdHJ1c3QgbGV2ZWwgdG8gZmlsdGVyIGJ5XG4gICAqIEByZXR1cm5zIEFycmF5IG9mIG1lbW9yeSBlbnRyaWVzIG1hdGNoaW5nIHRoZSB0cnVzdCBsZXZlbFxuICAgKi9cbiAgcHVibGljIGdldEVudHJpZXNCeVRydXN0TGV2ZWwodHJ1c3RMZXZlbDogVHJ1c3RMZXZlbCk6IE1lbW9yeUVudHJ5W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkudHJ1c3RMZXZlbCA9PT0gdHJ1c3RMZXZlbCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbnRyaWVzIGluIHRoaXMgbWVtb3J5XG4gICAqIEZJWCAjMTMyMDogUHVibGljIEFQSSBmb3IgYWNjZXNzaW5nIGFsbCBlbnRyaWVzXG4gICAqIFJlcGxhY2VzIHRoZSBuZWVkIGZvciBgKG1lbW9yeSBhcyBhbnkpLmVudHJpZXNgIGhhY2tzXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGFsbCBtZW1vcnkgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGdldEFsbEVudHJpZXMoKTogTWVtb3J5RW50cnlbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVudHJpZXMgbWFwIGRpcmVjdGx5XG4gICAqIFVzZWQgYnkgUmV0ZW50aW9uUG9saWN5U2VydmljZSBmb3IgcmV0ZW50aW9uIGVuZm9yY2VtZW50IChJc3N1ZSAjNTEpXG4gICAqXG4gICAqIEByZXR1cm5zIE1hcCBvZiBlbnRyeSBJRCB0byBtZW1vcnkgZW50cnlcbiAgICovXG4gIHB1YmxpYyBnZXRFbnRyaWVzKCk6IE1hcDxzdHJpbmcsIE1lbW9yeUVudHJ5PiB7XG4gICAgLy8gUmV0dXJuIGEgbmV3IE1hcCB0byBwcmV2ZW50IGV4dGVybmFsIG1vZGlmaWNhdGlvbiBvZiBpbnRlcm5hbCBzdGF0ZVxuICAgIHJldHVybiBuZXcgTWFwKHRoaXMuZW50cmllcy5lbnRyaWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHNwZWNpZmljIGVudHJ5IGJ5IElEXG4gICAqIEZJWCAjNTE6IFB1YmxpYyBBUEkgZm9yIHJldGVudGlvbiBwb2xpY3kgdG8gcmVtb3ZlIGV4cGlyZWQgZW50cmllc1xuICAgKiBSZXBsYWNlcyB0aGUgbmVlZCBmb3IgYChtZW1vcnkgYXMgYW55KS5lbnRyaWVzLmRlbGV0ZSgpYCBoYWNrc1xuICAgKlxuICAgKiBAcGFyYW0gZW50cnlJZCAtIFRoZSBJRCBvZiB0aGUgZW50cnkgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgZW50cnkgd2FzIHJlbW92ZWQsIGZhbHNlIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgcHVibGljIHJlbW92ZUVudHJ5KGVudHJ5SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZGVsZXRlKGVudHJ5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpdGVyYXRvciBvdmVyIGFsbCBlbnRyaWVzXG4gICAqIEZJWCAjMTMyMDogTWVtb3J5LWVmZmljaWVudCB3YXkgdG8gaXRlcmF0ZSBlbnRyaWVzXG4gICAqXG4gICAqIEByZXR1cm5zIEl0ZXJhdG9yIG92ZXIgbWVtb3J5IGVudHJpZXNcbiAgICovXG4gIHB1YmxpYyAqZ2V0RW50cmllc0l0ZXJhdG9yKCk6IEl0ZXJhYmxlSXRlcmF0b3I8TWVtb3J5RW50cnk+IHtcbiAgICB5aWVsZCogdGhpcy5lbnRyaWVzLnZhbHVlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZmlsZSBwYXRoIGZvciB0aGlzIG1lbW9yeVxuICAgKiBGSVggIzEzMjA6IFVzZWQgYnkgTWVtb3J5TWFuYWdlciBhZnRlciBsb2FkaW5nXG4gICAqIEZJWCAoU29uYXJDbG91ZCk6IEFkZGVkIGlucHV0IHZhbGlkYXRpb24gd2l0aCBwcm9wZXIgZXJyb3IgdHlwZXNcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgZmlsZSBwYXRoIHdoZXJlIHRoaXMgbWVtb3J5IGlzIHN0b3JlZFxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHBhdGggaXMgbm90IGEgc3RyaW5nXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBwYXRoIGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgc2V0RmlsZVBhdGgocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWVtb3J5IGZpbGUgcGF0aCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChwYXRoLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IGZpbGUgcGF0aCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gICAgdGhpcy5maWxlUGF0aCA9IHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIHBhdGggZm9yIHRoaXMgbWVtb3J5XG4gICAqIEZJWCAjMTMyMDogUmV0dXJucyB0aGUgcGF0aCB3aGVyZSB0aGlzIG1lbW9yeSBpcyBzdG9yZWRcbiAgICogQHJldHVybnMgVGhlIGZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIGlmIG5vdCB5ZXQgcGVyc2lzdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsZVBhdGgoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maWxlUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoaXMgbWVtb3J5IHRvIGRpc2tcbiAgICogRklYICMxMzIwOiBJbnN0YW5jZSBtZXRob2QgZm9yIHBlcnNpc3RpbmcgbWVtb3J5IGNoYW5nZXNcbiAgICogVXNlZCBieSBCYWNrZ3JvdW5kVmFsaWRhdG9yIHRvIHNhdmUgdXBkYXRlZCB0cnVzdCBsZXZlbHNcbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2F2ZSBpcyBjb21wbGV0ZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgbWVtb3J5IGhhcyBub3QgYmVlbiBsb2FkZWQgZnJvbSBmaWxlIGFuZCBubyBwYXRoIGlzIHNldFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IE1lbW9yeS5nZXRNZW1vcnlNYW5hZ2VyKCk7XG4gICAgYXdhaXQgbWFuYWdlci5zYXZlKHRoaXMsIHRoaXMuZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYWxsIG1lbW9yaWVzIHRoYXQgaGF2ZSBlbnRyaWVzIHdpdGggYSBzcGVjaWZpYyB0cnVzdCBsZXZlbFxuICAgKiBGSVggIzEzMjA6IFN0YXRpYyBxdWVyeSBBUEkgZm9yIGZpbmRpbmcgbWVtb3JpZXMgYnkgdHJ1c3QgbGV2ZWxcbiAgICogVXNlZCBieSBCYWNrZ3JvdW5kVmFsaWRhdG9yIHRvIGRpc2NvdmVyIHVudHJ1c3RlZCBtZW1vcmllc1xuICAgKlxuICAgKiBAcGFyYW0gdHJ1c3RMZXZlbCAtIFRoZSB0cnVzdCBsZXZlbCB0byBmaWx0ZXIgYnlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBxdWVyeSBvcHRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbWl0IC0gTWF4aW11bSBudW1iZXIgb2YgbWVtb3JpZXMgdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIG1lbW9yaWVzIHdpdGggbWF0Y2hpbmcgZW50cmllc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBmaW5kQnlUcnVzdExldmVsKFxuICAgIHRydXN0TGV2ZWw6IFRydXN0TGV2ZWwsXG4gICAgb3B0aW9ucz86IHsgbGltaXQ/OiBudW1iZXIgfVxuICApOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IE1lbW9yeS5nZXRNZW1vcnlNYW5hZ2VyKCk7XG5cbiAgICAvLyBMb2FkIGFsbCBtZW1vcmllcyBhbmQgZmlsdGVyIGJ5IHRydXN0IGxldmVsXG4gICAgY29uc3QgYWxsTWVtb3JpZXMgPSBhd2FpdCBtYW5hZ2VyLmxpc3QoKTtcbiAgICBjb25zdCBtYXRjaGluZ01lbW9yaWVzOiBNZW1vcnlbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBtZW1vcnkgb2YgYWxsTWVtb3JpZXMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgbWVtb3J5IGhhcyBhbnkgZW50cmllcyB3aXRoIHRoZSBzcGVjaWZpZWQgdHJ1c3QgbGV2ZWxcbiAgICAgIGNvbnN0IGhhc01hdGNoaW5nRW50cmllcyA9IG1lbW9yeS5nZXRFbnRyaWVzQnlUcnVzdExldmVsKHRydXN0TGV2ZWwpLmxlbmd0aCA+IDA7XG5cbiAgICAgIGlmIChoYXNNYXRjaGluZ0VudHJpZXMpIHtcbiAgICAgICAgbWF0Y2hpbmdNZW1vcmllcy5wdXNoKG1lbW9yeSk7XG5cbiAgICAgICAgLy8gQXBwbHkgbGltaXQgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChvcHRpb25zPy5saW1pdCAmJiBtYXRjaGluZ01lbW9yaWVzLmxlbmd0aCA+PSBvcHRpb25zLmxpbWl0KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIG1lbW9yaWVzIHdpdGggdHJ1c3QgbGV2ZWwnLCB7XG4gICAgICB0cnVzdExldmVsLFxuICAgICAgY291bnQ6IG1hdGNoaW5nTWVtb3JpZXMubGVuZ3RoLFxuICAgICAgbGltaXQ6IG9wdGlvbnM/LmxpbWl0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF0Y2hpbmdNZW1vcmllcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmFsIHF1ZXJ5IEFQSSBmb3IgZmluZGluZyBtZW1vcmllc1xuICAgKiBGSVggIzEzMjA6IEZsZXhpYmxlIHF1ZXJ5IEFQSSBmb3IgbXVsdGlwbGUgY3JpdGVyaWFcbiAgICogRklYIChTb25hckNsb3VkKTogUmVmYWN0b3JlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkgZnJvbSAyMCB0byA4XG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBRdWVyeSBmaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIGZpbHRlci50cnVzdExldmVsIC0gRmlsdGVyIGJ5IHRydXN0IGxldmVsXG4gICAqIEBwYXJhbSBmaWx0ZXIudGFncyAtIEZpbHRlciBieSB0YWdzXG4gICAqIEBwYXJhbSBmaWx0ZXIubWF4QWdlIC0gRmlsdGVyIGJ5IGFnZSBpbiBkYXlzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIG1hdGNoaW5nIG1lbW9yaWVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmQoZmlsdGVyOiB7XG4gICAgdHJ1c3RMZXZlbD86IFRydXN0TGV2ZWw7XG4gICAgdGFncz86IHN0cmluZ1tdO1xuICAgIG1heEFnZT86IG51bWJlcjtcbiAgfSk6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gTWVtb3J5LmdldE1lbW9yeU1hbmFnZXIoKTtcblxuICAgIC8vIExvYWQgYWxsIG1lbW9yaWVzXG4gICAgY29uc3QgYWxsTWVtb3JpZXMgPSBhd2FpdCBtYW5hZ2VyLmxpc3QoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBjdXRvZmYgZGF0ZSBpZiBtYXhBZ2UgaXMgc3BlY2lmaWVkXG4gICAgY29uc3QgY3V0b2ZmRGF0ZSA9IGZpbHRlci5tYXhBZ2VcbiAgICAgID8gbmV3IERhdGUoRGF0ZS5ub3coKSAtIGZpbHRlci5tYXhBZ2UgKiAyNCAqIDYwICogNjAgKiAxMDAwKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBGaWx0ZXIgbWVtb3JpZXMgdXNpbmcgaGVscGVyIG1ldGhvZFxuICAgIGNvbnN0IHJlc3VsdHMgPSBhbGxNZW1vcmllcy5maWx0ZXIobWVtb3J5ID0+XG4gICAgICB0aGlzLm1hdGNoZXNGaWx0ZXIobWVtb3J5LCBmaWx0ZXIsIGN1dG9mZkRhdGUpXG4gICAgKTtcblxuICAgIGxvZ2dlci5kZWJ1ZygnTWVtb3J5IHF1ZXJ5IGNvbXBsZXRlJywge1xuICAgICAgZmlsdGVyLFxuICAgICAgcmVzdWx0Q291bnQ6IHJlc3VsdHMubGVuZ3RoXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG1lbW9yeSBtYXRjaGVzIHRoZSBnaXZlbiBmaWx0ZXIgY3JpdGVyaWFcbiAgICogRklYIChTb25hckNsb3VkKTogRXh0cmFjdGVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2hlc0ZpbHRlcihcbiAgICBtZW1vcnk6IE1lbW9yeSxcbiAgICBmaWx0ZXI6IHsgdHJ1c3RMZXZlbD86IFRydXN0TGV2ZWw7IHRhZ3M/OiBzdHJpbmdbXTsgbWF4QWdlPzogbnVtYmVyIH0sXG4gICAgY3V0b2ZmRGF0ZT86IERhdGVcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gRmlsdGVyIGJ5IHRydXN0IGxldmVsXG4gICAgaWYgKGZpbHRlci50cnVzdExldmVsKSB7XG4gICAgICBjb25zdCBoYXNNYXRjaGluZ1RydXN0TGV2ZWwgPSBtZW1vcnkuZ2V0RW50cmllc0J5VHJ1c3RMZXZlbChmaWx0ZXIudHJ1c3RMZXZlbCkubGVuZ3RoID4gMDtcbiAgICAgIGlmICghaGFzTWF0Y2hpbmdUcnVzdExldmVsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgYnkgdGFnc1xuICAgIGlmIChmaWx0ZXIudGFncyAmJiBmaWx0ZXIudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtZW1vcnlUYWdzID0gbWVtb3J5Lm1ldGFkYXRhLnRhZ3MgfHwgW107XG4gICAgICBjb25zdCBoYXNNYXRjaGluZ1RhZyA9IGZpbHRlci50YWdzLnNvbWUodGFnID0+IG1lbW9yeVRhZ3MuaW5jbHVkZXModGFnKSk7XG4gICAgICBpZiAoIWhhc01hdGNoaW5nVGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgYnkgYWdlXG4gICAgaWYgKGN1dG9mZkRhdGUpIHtcbiAgICAgIGNvbnN0IHN0YXRzID0gbWVtb3J5LmdldFN0YXRzKCk7XG4gICAgICBpZiAoIXN0YXRzLm5ld2VzdEVudHJ5IHx8IHN0YXRzLm5ld2VzdEVudHJ5IDwgY3V0b2ZmRGF0ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdfQ==
1129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVqRSwwRkFBMEY7QUFDMUYsaURBQWlEO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBZ0MsWUFBWSxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBa0MsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBRTlCOzs7O0dBSUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHLHFCQUFxQixDQUFDO0FBRXZELGtDQUFrQztBQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENB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LENBQUM7UUFFRCxnQkFBZ0I7UUFDaEIsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLFVBQVUsRUFBRSxDQUFDO2dCQUN6RCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZW1vcnkgRWxlbWVudCAtIFBlcnNpc3RlbnQgY29udGV4dCBzdG9yYWdlIGZvciBjb250aW51aXR5IGFuZCBsZWFybmluZ1xuICogXG4gKiBQcm92aWRlcyBtdWx0aXBsZSBzdG9yYWdlIGJhY2tlbmRzLCByZXRlbnRpb24gcG9saWNpZXMsIGFuZCBzZWFyY2ggY2FwYWJpbGl0aWVzXG4gKiBmb3IgbWFpbnRhaW5pbmcgY29udGV4dCBhY3Jvc3Mgc2Vzc2lvbnMgYW5kIGludGVyYWN0aW9ucy5cbiAqIFxuICogU0VDVVJJVFkgTUVBU1VSRVMgSU1QTEVNRU5URUQ6XG4gKiAxLiBJbnB1dCBzYW5pdGl6YXRpb24gZm9yIGFsbCBtZW1vcnkgY29udGVudFxuICogMi4gTWVtb3J5IHNpemUgbGltaXRzIHRvIHByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aFxuICogMy4gUGF0aCB2YWxpZGF0aW9uIGZvciBmaWxlLWJhc2VkIHN0b3JhZ2VcbiAqIDQuIFJldGVudGlvbiBwb2xpY3kgZW5mb3JjZW1lbnRcbiAqIDUuIFByaXZhY3kgbGV2ZWwgYWNjZXNzIGNvbnRyb2xcbiAqIDYuIEF1ZGl0IGxvZ2dpbmcgZm9yIGFsbCBvcGVyYXRpb25zXG4gKi9cblxuaW1wb3J0IHsgQmFzZUVsZW1lbnQgfSBmcm9tICcuLi9CYXNlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudCwgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL2luZGV4LmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IElFbGVtZW50TWV0YWRhdGEgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUlucHV0IH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbi8vIEZJWCAjMTMxNTogQ29udGVudFZhbGlkYXRvciBubyBsb25nZXIgdXNlZCBpbiBhZGRFbnRyeSAobW92ZWQgdG8gYmFja2dyb3VuZCB2YWxpZGF0aW9uKVxuLy8gSW1wb3J0IHJlbW92ZWQgdG8gY2xlYW4gdXAgdW51c2VkIGRlcGVuZGVuY2llc1xuaW1wb3J0IHsgTUVNT1JZX0NPTlNUQU5UUywgTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUywgUHJpdmFjeUxldmVsLCBTdG9yYWdlQmFja2VuZCwgVFJVU1RfTEVWRUxTLCBUcnVzdExldmVsIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgTWVtb3J5VHlwZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNZW1vcnlJZCB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgTWVtb3J5U2VhcmNoSW5kZXgsIFNlYXJjaFF1ZXJ5LCBTZWFyY2hJbmRleENvbmZpZyB9IGZyb20gJy4vTWVtb3J5U2VhcmNoSW5kZXguanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5JztcbmltcG9ydCB7IEpTRE9NIH0gZnJvbSAnanNkb20nO1xuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tICcuLi8uLi9jYWNoZS9MUlVDYWNoZS5qcyc7XG5cbi8qKlxuICogTWF4aW11bSBsZW5ndGggZm9yIGluZGl2aWR1YWwgdHJpZ2dlciB3b3JkcyB1c2VkIGluIEVuaGFuY2VkIEluZGV4XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuY29uc3QgTUFYX1RSSUdHRVJfTEVOR1RIID0gNTA7XG5cbi8qKlxuICogVmFsaWRhdGlvbiBwYXR0ZXJuIGZvciB0cmlnZ2VyIHdvcmRzXG4gKiBBbGxvd3MgYWxwaGFudW1lcmljLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgQCAobWVudGlvbnMvZW1haWxzKSwgLiAoZG9tYWlucylcbiAqIEBjb25zdGFudCB7UmVnRXhwfVxuICovXG5jb25zdCBUUklHR0VSX1ZBTElEQVRJT05fUkVHRVggPSAvXlthLXpBLVowLTlcXC1fQC5dKyQvO1xuXG4vLyBJbml0aWFsaXplIERPTVB1cmlmeSB3aXRoIEpTRE9NXG5jb25zdCB3aW5kb3cgPSBuZXcgSlNET00oJycpLndpbmRvdztcbmNvbnN0IHB1cmlmeSA9IERPTVB1cmlmeSh3aW5kb3cgYXMgYW55KTtcblxuLy8gQ29uZmlndXJlIERPTVB1cmlmeSBmb3IgbWVtb3J5IGNvbnRlbnQgLSBzdHJpcCBhbGwgSFRNTCBidXQga2VlcCB0ZXh0XG5wdXJpZnkuc2V0Q29uZmlnKHtcbiAgQUxMT1dFRF9UQUdTOiBbXSwgIC8vIE5vIEhUTUwgdGFncyBhbGxvd2VkXG4gIEFMTE9XRURfQVRUUjogW10sICAvLyBObyBhdHRyaWJ1dGVzIGFsbG93ZWRcbiAgS0VFUF9DT05URU5UOiB0cnVlIC8vIEtlZXAgdGV4dCBjb250ZW50XG59KTtcblxuLyoqXG4gKiBTYW5pdGl6ZSBjb250ZW50IGZvciBtZW1vcnkgc3RvcmFnZVxuICogTW9yZSBwZXJtaXNzaXZlIHRoYW4gc2FuaXRpemVJbnB1dCAtIGFsbG93cyBwdW5jdHVhdGlvbiwgcXVvdGVzLCBldGMuXG4gKiBidXQgc3RpbGwgcHJldmVudHMgWFNTIGFuZCBjb250cm9sIGNoYXJhY3RlcnNcbiAqL1xuZnVuY3Rpb24gc2FuaXRpemVNZW1vcnlDb250ZW50KGNvbnRlbnQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoIWNvbnRlbnQgfHwgdHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIFxuICAvLyBGaXJzdCBub3JtYWxpemUgVW5pY29kZVxuICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoY29udGVudCkubm9ybWFsaXplZENvbnRlbnQ7XG4gIFxuICAvLyBVc2UgRE9NUHVyaWZ5IHRvIHN0cmlwIGFueSBIVE1ML1hTUyBhdHRlbXB0cyBidXQga2VlcCB0ZXh0XG4gIGNvbnN0IGNsZWFuZWQgPSBwdXJpZnkuc2FuaXRpemUobm9ybWFsaXplZCk7XG4gIFxuICAvLyBSZW1vdmUgb25seSBjb250cm9sIGNoYXJhY3RlcnMgYW5kIG51bGwgYnl0ZXNcbiAgcmV0dXJuIGNsZWFuZWRcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBJbnRlbnRpb25hbGx5IHJlbW92aW5nIGNvbnRyb2wgY2hhcnMgZXhjZXB0IFxcdCBcXG4gXFxyIGZvciBzYW5pdGl6YXRpb25cbiAgICAucmVwbGFjZUFsbCgvW1xcdTAwMDAtXFx1MDAwOFxcdTAwMEJcXHUwMDBDXFx1MDAwRS1cXHUwMDFGXFx1MDA3Rl0vZywgJycpIC8vIE5PU09OQVJcbiAgICAuc3Vic3RyaW5nKDAsIG1heExlbmd0aClcbiAgICAudHJpbSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeU1ldGFkYXRhIGV4dGVuZHMgSUVsZW1lbnRNZXRhZGF0YSB7XG4gIHN0b3JhZ2VCYWNrZW5kPzogU3RvcmFnZUJhY2tlbmQ7XG4gIHJldGVudGlvbkRheXM/OiBudW1iZXI7XG4gIHByaXZhY3lMZXZlbD86IFByaXZhY3lMZXZlbDtcbiAgc2VhcmNoYWJsZT86IGJvb2xlYW47XG4gIG1heEVudHJpZXM/OiBudW1iZXI7XG4gIGVuY3J5cHRpb25FbmFibGVkPzogYm9vbGVhbjtcbiAgLy8gU2VhcmNoIGluZGV4IGNvbmZpZ3VyYXRpb24gKElzc3VlICM5ODQpXG4gIGluZGV4VGhyZXNob2xkPzogbnVtYmVyO1xuICBlbmFibGVDb250ZW50SW5kZXg/OiBib29sZWFuO1xuICBtYXhUZXJtc1BlckVudHJ5PzogbnVtYmVyO1xuICBtaW5UZXJtTGVuZ3RoPzogbnVtYmVyO1xuICAvLyBUcmlnZ2VyIHdvcmRzIGZvciBFbmhhbmNlZCBJbmRleCAoSXNzdWUgIzExMjQpXG4gIHRyaWdnZXJzPzogc3RyaW5nW107XG4gIC8vIEF1dG8tbG9hZCBjb25maWd1cmF0aW9uIChJc3N1ZSAjMTQzMClcbiAgYXV0b0xvYWQ/OiBib29sZWFuO1xuICBwcmlvcml0eT86IG51bWJlcjtcbiAgLy8gTWVtb3J5IHR5cGUgY2xhc3NpZmljYXRpb24gZm9yIGZvbGRlciBvcmdhbml6YXRpb25cbiAgbWVtb3J5VHlwZT86IE1lbW9yeVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5RW50cnkge1xuICBpZDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IERhdGU7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgdGFncz86IHN0cmluZ1tdO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGV4cGlyZXNBdD86IERhdGU7XG4gIHByaXZhY3lMZXZlbD86IFByaXZhY3lMZXZlbDtcbiAgLy8gRklYICMxMjY5OiBUcnVzdCBsZXZlbCBmb3IgY29udGVudCBzZWN1cml0eVxuICB0cnVzdExldmVsPzogVHJ1c3RMZXZlbDtcbiAgLy8gU291cmNlIGluZm9ybWF0aW9uIGZvciB0cnVzdCBkZWNpc2lvbnNcbiAgc291cmNlPzogc3RyaW5nOyAgLy8gZS5nLiwgJ3VzZXInLCAnd2ViLXNjcmFwZScsICdhZ2VudCcsICdhcGknXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5U2VhcmNoT3B0aW9ucyB7XG4gIHF1ZXJ5Pzogc3RyaW5nO1xuICB0YWdzPzogc3RyaW5nW107XG4gIHN0YXJ0RGF0ZT86IERhdGU7XG4gIGVuZERhdGU/OiBEYXRlO1xuICBsaW1pdD86IG51bWJlcjtcbiAgcHJpdmFjeUxldmVsPzogUHJpdmFjeUxldmVsO1xufVxuXG4vKipcbiAqIE1lbW9yeSBFbGVtZW50IEltcGxlbWVudGF0aW9uXG4gKlxuICogVE9ETzogTWVtb3J5IFNoYXJkaW5nIFN0cmF0ZWd5IChJc3N1ZSAjOTgxKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDdXJyZW50OiBTaW5nbGUgTWFwPGlkLCBlbnRyeT4gZm9yIGFsbCBtZW1vcmllc1xuICogUHJvYmxlbTogTGFyZ2UgbWVtb3J5IHNldHMgKD4xMEsgZW50cmllcykgY2F1c2UgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAqXG4gKiBQbGFubmVkIFNoYXJkaW5nIEFyY2hpdGVjdHVyZTpcbiAqIDEuIFNoYXJkIG1lbW9yaWVzIGFjcm9zcyBtdWx0aXBsZSBmaWxlcyBiYXNlZCBvbiBoYXNoKG1lbW9yeUlkKSAlIHNoYXJkQ291bnRcbiAqIDIuIEVhY2ggc2hhcmQgZmlsZSA8MjU2S0IgZm9yIG9wdGltYWwgWUFNTCBwYXJzaW5nXG4gKiAzLiBNZW1vcnkgcmVmZXJlbmNlcyBzdG9yZWQgc2VwYXJhdGVseSBmcm9tIGNvbnRlbnQgKGxpa2UgZ2l0IG9iamVjdHMpXG4gKiA0LiBMYXJnZSBiaW5hcnkgY29udGVudCAoUERGcywgaW1hZ2VzKSBzdG9yZWQgYXMgZXh0ZXJuYWwgcmVmZXJlbmNlc1xuICpcbiAqIEJlbmVmaXRzOlxuICogLSBQYXJhbGxlbCBsb2FkaW5nIG9mIG1lbW9yeSBzaGFyZHNcbiAqIC0gUmVkdWNlZCBtZW1vcnkgZm9vdHByaW50IChsb2FkIG9ubHkgbmVlZGVkIHNoYXJkcylcbiAqIC0gQmV0dGVyIGNvcnJ1cHRpb24gcmVzaXN0YW5jZSAob25lIHNoYXJkIGZhaWx1cmUgZG9lc24ndCBhZmZlY3Qgb3RoZXJzKVxuICogLSBFZmZpY2llbnQgaW5jcmVtZW50YWwgdXBkYXRlc1xuICpcbiAqIFRPRE86IENvbnRlbnQgSW50ZWdyaXR5IFZlcmlmaWNhdGlvbiAoSXNzdWUgIzk4MilcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBZGQgU0hBLTI1NiBoYXNoZXMgdG8gZGV0ZWN0OlxuICogLSBBY2NpZGVudGFsIGNvcnJ1cHRpb24gZnJvbSBkaXNrIGVycm9yc1xuICogLSBJbnRlbnRpb25hbCB0YW1wZXJpbmcgd2l0aCBtZW1vcnkgZmlsZXNcbiAqIC0gVmVyc2lvbiBjb25mbGljdHMgZHVyaW5nIGNvbmN1cnJlbnQgYWNjZXNzXG4gKlxuICogSW1wbGVtZW50YXRpb246XG4gKiAtIFN0b3JlIGhhc2ggaW4gbWVtb3J5IG1ldGFkYXRhXG4gKiAtIFZlcmlmeSBvbiBsb2FkLCB3YXJuIG9uIG1pc21hdGNoXG4gKiAtIE9wdGlvbiB0byBhdXRvLXJlc3RvcmUgZnJvbSBiYWNrdXAgb24gY29ycnVwdGlvblxuICpcbiAqIFRPRE86IE1lbW9yeSBDYXBhY2l0eSBNYW5hZ2VtZW50IChJc3N1ZSAjOTgzKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDdXJyZW50OiBTeW5jaHJvbm91cyByZXRlbnRpb24gZW5mb3JjZW1lbnQgb24gZWFjaCBhZGRcbiAqIEJldHRlcjogQmFja2dyb3VuZCBjbGVhbnVwIHdpdGggc21hcnQgdHJpZ2dlcnM6XG4gKiAtIENsZWFudXAgd2hlbiA5MCUgY2FwYWNpdHkgcmVhY2hlZFxuICogLSBCYXRjaCBkZWxldGlvbnMgZm9yIGVmZmljaWVuY3lcbiAqIC0gTFJVIGV2aWN0aW9uIHdpdGggYWNjZXNzIHRyYWNraW5nXG4gKiAtIFByZXNlcnZlIFwicGlubmVkXCIgbWVtb3JpZXMgcmVnYXJkbGVzcyBvZiBhZ2VcbiAqL1xuZXhwb3J0IGNsYXNzIE1lbW9yeSBleHRlbmRzIEJhc2VFbGVtZW50IGltcGxlbWVudHMgSUVsZW1lbnQge1xuICAvLyBpbnN0cnVjdGlvbnMgaW5oZXJpdGVkIGZyb20gQmFzZUVsZW1lbnQgKHYyLjAgZHVhbC1maWVsZCBhcmNoaXRlY3R1cmUpXG4gIC8vIGNvbnRlbnQ6IG92ZXJyaWRkZW4gYmVsb3cgd2l0aCBhIGN1c3RvbSBnZXR0ZXIgdGhhdCByZXR1cm5zIGZvcm1hdHRlZCBlbnRyaWVzXG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY3JlYXRlZE1lbW9yeU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgc3RhdGljIG1lbW9yeU1hbmFnZXJSZXNvbHZlcj86ICgpID0+IHsgbGlzdCgpOiBQcm9taXNlPE1lbW9yeVtdPjsgc2F2ZShtZW1vcnk6IE1lbW9yeSwgZmlsZVBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+OyB9IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBTdGF0aWMgcmVzb2x2ZXIgZm9yIFJldGVudGlvblBvbGljeVNlcnZpY2UgKElzc3VlICM1MSlcbiAgICogVXNlZCB0byBjaGVjayBpZiByZXRlbnRpb24gZW5mb3JjZW1lbnQgc2hvdWxkIGhhcHBlbiBvbiBsb2FkXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZXRlbnRpb25Qb2xpY3lSZXNvbHZlcj86ICgpID0+IHsgc2hvdWxkRW5mb3JjZU9uTG9hZCgpOiBib29sZWFuOyBpc0VuYWJsZWQoKTogYm9vbGVhbjsgfSB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgc3RhdGljIGNvbmZpZ3VyZU1lbW9yeU1hbmFnZXJSZXNvbHZlcihyZXNvbHZlcjogKCkgPT4geyBsaXN0KCk6IFByb21pc2U8TWVtb3J5W10+OyBzYXZlKG1lbW9yeTogTWVtb3J5LCBmaWxlUGF0aD86IHN0cmluZyk6IFByb21pc2U8dm9pZD47IH0gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLm1lbW9yeU1hbmFnZXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGUgUmV0ZW50aW9uUG9saWN5U2VydmljZSByZXNvbHZlciAoSXNzdWUgIzUxKVxuICAgKiBDYWxsZWQgZHVyaW5nIERJIGNvbnRhaW5lciBzZXR1cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb25maWd1cmVSZXRlbnRpb25Qb2xpY3lSZXNvbHZlcihyZXNvbHZlcjogKCkgPT4geyBzaG91bGRFbmZvcmNlT25Mb2FkKCk6IGJvb2xlYW47IGlzRW5hYmxlZCgpOiBib29sZWFuOyB9IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5yZXRlbnRpb25Qb2xpY3lSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCBzdGF0aWMgcmVzb2x2ZXJzIChmb3IgdGVzdCBjbGVhbnVwKVxuICAgKiBDYWxsIHRoaXMgaW4gYWZ0ZXJFYWNoIGhvb2tzIHRvIHByZXZlbnQgdGVzdCBpc29sYXRpb24gaXNzdWVzXG4gICAqIHdoZXJlIGEgc3RhbGUgcmVzb2x2ZXIgcmVmZXJlbmNlcyBkaXNwb3NlZCBzZXJ2aWNlc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXNldFJlc29sdmVycygpOiB2b2lkIHtcbiAgICB0aGlzLm1lbW9yeU1hbmFnZXJSZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJldGVudGlvblBvbGljeVJlc29sdmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgUmV0ZW50aW9uUG9saWN5U2VydmljZSBpbnN0YW5jZVxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub3QgY29uZmlndXJlZCAoYWxsb3dzIGdyYWNlZnVsIGZhbGxiYWNrKVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmV0ZW50aW9uUG9saWN5U2VydmljZSgpIHtcbiAgICBpZiAoIXRoaXMucmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJldGVudGlvblBvbGljeVJlc29sdmVyKCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRNZW1vcnlNYW5hZ2VyKCkge1xuICAgIGlmICghdGhpcy5tZW1vcnlNYW5hZ2VyUmVzb2x2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IG1hbmFnZXIgcmVzb2x2ZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlciA9IHRoaXMubWVtb3J5TWFuYWdlclJlc29sdmVyKCk7XG4gICAgaWYgKCFtYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBtYW5hZ2VyIHJlc29sdmVyIHJldHVybmVkIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICByZXR1cm4gbWFuYWdlcjtcbiAgfVxuICAvLyBNZW1vcnktc3BlY2lmaWMgcHJvcGVydGllcyAod2l0aCBzaXplIGxpbWl0cyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcylcbiAgcHJpdmF0ZSBlbnRyaWVzOiBMUlVDYWNoZTxNZW1vcnlFbnRyeT47XG4gIHByaXZhdGUgc3RvcmFnZUJhY2tlbmQ6IFN0b3JhZ2VCYWNrZW5kO1xuICBwcml2YXRlIHJldGVudGlvbkRheXM6IG51bWJlcjtcbiAgcHJpdmF0ZSBwcml2YWN5TGV2ZWw6IFByaXZhY3lMZXZlbDtcbiAgcHJpdmF0ZSBzZWFyY2hhYmxlOiBib29sZWFuO1xuICBwcml2YXRlIG1heEVudHJpZXM6IG51bWJlcjtcblxuICAvLyBTZWFyY2ggaW5kZXggZm9yIHBlcmZvcm1hbmNlIChJc3N1ZSAjOTg0KVxuICBwcml2YXRlIHNlYXJjaEluZGV4OiBNZW1vcnlTZWFyY2hJbmRleDtcblxuICAvLyBTYW5pdGl6YXRpb24gY2FjaGUgdG8gYXZvaWQgcmVkdW5kYW50IHByb2Nlc3NpbmcgKHdpdGggc2l6ZSBsaW1pdHMpXG4gIHByaXZhdGUgc2FuaXRpemF0aW9uQ2FjaGU6IExSVUNhY2hlPHN0cmluZz47XG5cbiAgLy8gRklYICMxMzIwOiBTdG9yZSBmaWxlIHBhdGggZm9yIHBlcnNpc3RlbmNlXG4gIHByaXZhdGUgZmlsZVBhdGg/OiBzdHJpbmc7XG5cbiAgLy8gQ2FjaGUgY29uZmlndXJhdGlvbiBjb25zdGFudHNcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1NBTklUSVpBVElPTl9DQUNIRV9TSVpFID0gNTAwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfU0FOSVRJWkFUSU9OX0NBQ0hFX01FTU9SWV9NQiA9IDU7XG4gIFxuICBjb25zdHJ1Y3RvcihtZXRhZGF0YTogUGFydGlhbDxNZW1vcnlNZXRhZGF0YT4gPSB7fSwgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2UpIHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IFNhbml0aXplIGFsbCBpbnB1dHMgZHVyaW5nIGNvbnN0cnVjdGlvblxuICAgIGNvbnN0IHNhbml0aXplZE1ldGFkYXRhID0ge1xuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lID9cbiAgICAgICAgc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShtZXRhZGF0YS5uYW1lKS5ub3JtYWxpemVkQ29udGVudCwgMTAwKSA6XG4gICAgICAgICdVbm5hbWVkIE1lbW9yeScsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24gP1xuICAgICAgICBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG1ldGFkYXRhLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKSA6XG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgIC8vIEZJWCAjMTEyNDogUHJlc2VydmUgdHJpZ2dlcnMgZm9yIEVuaGFuY2VkIEluZGV4XG4gICAgICAvLyBTRUNVUklUWTogVmFsaWRhdGUgQkVGT1JFIHNhbml0aXphdGlvbiB0byByZWplY3QgaW52YWxpZCBjaGFyYWN0ZXJzXG4gICAgICAvLyBUaGlzIHByZXZlbnRzICdiYWQhdHJpZ2dlcicgZnJvbSBiZWNvbWluZyAnYmFkdHJpZ2dlcicgYW5kIHBhc3NpbmdcbiAgICAgIHRyaWdnZXJzOiBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRyaWdnZXJzKSA/XG4gICAgICAgIG1ldGFkYXRhLnRyaWdnZXJzXG4gICAgICAgICAgLm1hcCh0ID0+IFN0cmluZyh0KS50cmltKCkpXG4gICAgICAgICAgLmZpbHRlcih0ID0+IHQgJiYgVFJJR0dFUl9WQUxJREFUSU9OX1JFR0VYLnRlc3QodCkpIC8vIFZhbGlkYXRlIGZvcm1hdCBGSVJTVFxuICAgICAgICAgIC5tYXAodCA9PiBzYW5pdGl6ZUlucHV0KHQsIE1BWF9UUklHR0VSX0xFTkdUSCkpIC8vIFRoZW4gc2FuaXRpemUgZm9yIGxlbmd0aFxuICAgICAgICAgIC5maWx0ZXIodCA9PiB0KSA6IC8vIFJlbW92ZSBhbnkgdGhhdCBiZWNhbWUgZW1wdHkgYWZ0ZXIgc2FuaXRpemF0aW9uXG4gICAgICAgIFtdXG4gICAgfTtcblxuICAgIHN1cGVyKEVsZW1lbnRUeXBlLk1FTU9SWSwgc2FuaXRpemVkTWV0YWRhdGEsIG1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAvLyBJbml0aWFsaXplIG1lbW9yeS1zcGVjaWZpYyBwcm9wZXJ0aWVzIHdpdGggZGVmYXVsdHNcbiAgICB0aGlzLnN0b3JhZ2VCYWNrZW5kID0gbWV0YWRhdGEuc3RvcmFnZUJhY2tlbmQgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1NUT1JBR0VfQkFDS0VORDtcbiAgICB0aGlzLnJldGVudGlvbkRheXMgPSBtZXRhZGF0YS5yZXRlbnRpb25EYXlzIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9SRVRFTlRJT05fREFZUztcbiAgICAvLyBWYWxpZGF0ZSBwcml2YWN5IGxldmVsIC0gZGVmYXVsdCB0byBwcml2YXRlIGlmIGludmFsaWRcbiAgICB0aGlzLnByaXZhY3lMZXZlbCA9IChtZXRhZGF0YS5wcml2YWN5TGV2ZWwgJiYgTUVNT1JZX0NPTlNUQU5UUy5QUklWQUNZX0xFVkVMUy5pbmNsdWRlcyhtZXRhZGF0YS5wcml2YWN5TGV2ZWwpKVxuICAgICAgPyBtZXRhZGF0YS5wcml2YWN5TGV2ZWxcbiAgICAgIDogTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1BSSVZBQ1lfTEVWRUw7XG4gICAgdGhpcy5zZWFyY2hhYmxlID0gbWV0YWRhdGEuc2VhcmNoYWJsZSAhPT0gZmFsc2U7XG4gICAgdGhpcy5tYXhFbnRyaWVzID0gTWF0aC5taW4oXG4gICAgICBtZXRhZGF0YS5tYXhFbnRyaWVzIHx8IE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJJRVNfREVGQVVMVCxcbiAgICAgIE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJJRVNfREVGQVVMVFxuICAgICk7XG5cbiAgICAvLyBJbml0aWFsaXplIExSVSBjYWNoZXMgd2l0aCBzaXplIGxpbWl0cyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgIHRoaXMuZW50cmllcyA9IG5ldyBMUlVDYWNoZTxNZW1vcnlFbnRyeT4oe1xuICAgICAgbmFtZTogJ21lbW9yeS1lbnRyaWVzJyxcbiAgICAgIG1heFNpemU6IHRoaXMubWF4RW50cmllcyxcbiAgICAgIG1heE1lbW9yeU1COiAyNSwgLy8gTWF4IDI1TUIgZm9yIG1lbW9yeSBlbnRyaWVzXG4gICAgfSk7XG5cbiAgICB0aGlzLnNhbml0aXphdGlvbkNhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZz4oe1xuICAgICAgbmFtZTogJ21lbW9yeS1zYW5pdGl6YXRpb24nLFxuICAgICAgbWF4U2l6ZTogTWVtb3J5Lk1BWF9TQU5JVElaQVRJT05fQ0FDSEVfU0laRSxcbiAgICAgIG1heE1lbW9yeU1COiBNZW1vcnkuTUFYX1NBTklUSVpBVElPTl9DQUNIRV9NRU1PUllfTUIsXG4gICAgfSk7XG5cbiAgICAvLyBGSVggIzE0MzA6IFVwZGF0ZSBtZXRhZGF0YSB0byBpbmNsdWRlIGFsbCBNZW1vcnlNZXRhZGF0YSBmaWVsZHNcbiAgICAvLyBUaGlzIGVuc3VyZXMgdGhleSBhcmUgcHJlc2VydmVkIHdoZW4gc2VyaWFsaXplRWxlbWVudCgpIGlzIGNhbGxlZFxuICAgIC8vIFBlciBUb2RkJ3Mgc3VnZ2VzdGlvbjogc3RvcmUgYWxsIHJ1bnRpbWUgcHJvcGVydGllcyBpbiBtZXRhZGF0YSwgbm90IGV4dGVuc2lvbnNcbiAgICB0aGlzLm1ldGFkYXRhID0ge1xuICAgICAgLi4udGhpcy5tZXRhZGF0YSxcbiAgICAgIHN0b3JhZ2VCYWNrZW5kOiB0aGlzLnN0b3JhZ2VCYWNrZW5kLFxuICAgICAgcmV0ZW50aW9uRGF5czogdGhpcy5yZXRlbnRpb25EYXlzLFxuICAgICAgcHJpdmFjeUxldmVsOiB0aGlzLnByaXZhY3lMZXZlbCxcbiAgICAgIHNlYXJjaGFibGU6IHRoaXMuc2VhcmNoYWJsZSxcbiAgICAgIG1heEVudHJpZXM6IHRoaXMubWF4RW50cmllcyxcbiAgICAgIGF1dG9Mb2FkOiBtZXRhZGF0YS5hdXRvTG9hZCxcbiAgICAgIHByaW9yaXR5OiBtZXRhZGF0YS5wcmlvcml0eSxcbiAgICAgIGVuY3J5cHRpb25FbmFibGVkOiBtZXRhZGF0YS5lbmNyeXB0aW9uRW5hYmxlZCB8fCBmYWxzZVxuICAgIH0gYXMgTWVtb3J5TWV0YWRhdGE7XG5cbiAgICAvLyBTZXQgdXAgZXh0ZW5zaW9ucyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHtcbiAgICAgIHN0b3JhZ2VCYWNrZW5kOiB0aGlzLnN0b3JhZ2VCYWNrZW5kLFxuICAgICAgcmV0ZW50aW9uRGF5czogdGhpcy5yZXRlbnRpb25EYXlzLFxuICAgICAgcHJpdmFjeUxldmVsOiB0aGlzLnByaXZhY3lMZXZlbCxcbiAgICAgIHNlYXJjaGFibGU6IHRoaXMuc2VhcmNoYWJsZSxcbiAgICAgIG1heEVudHJpZXM6IHRoaXMubWF4RW50cmllcyxcbiAgICAgIGVuY3J5cHRpb25FbmFibGVkOiBtZXRhZGF0YS5lbmNyeXB0aW9uRW5hYmxlZCB8fCBmYWxzZVxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIHNlYXJjaCBpbmRleCB3aXRoIGNvbmZpZ3VyYXRpb24gKElzc3VlICM5ODQpXG4gICAgY29uc3QgaW5kZXhDb25maWc6IFNlYXJjaEluZGV4Q29uZmlnID0ge1xuICAgICAgaW5kZXhUaHJlc2hvbGQ6IG1ldGFkYXRhLmluZGV4VGhyZXNob2xkIHx8IDEwMCxcbiAgICAgIGVuYWJsZUNvbnRlbnRJbmRleDogbWV0YWRhdGEuZW5hYmxlQ29udGVudEluZGV4ICE9PSBmYWxzZSxcbiAgICAgIG1heFRlcm1zUGVyRW50cnk6IG1ldGFkYXRhLm1heFRlcm1zUGVyRW50cnkgfHwgMTAwLFxuICAgICAgbWluVGVybUxlbmd0aDogbWV0YWRhdGEubWluVGVybUxlbmd0aCB8fCAyLFxuICAgICAgZW5hYmxlUGVyc2lzdGVuY2U6IGZhbHNlIC8vIEZ1dHVyZSBlbmhhbmNlbWVudFxuICAgIH07XG4gICAgdGhpcy5zZWFyY2hJbmRleCA9IG5ldyBNZW1vcnlTZWFyY2hJbmRleChpbmRleENvbmZpZyk7XG5cbiAgICAvLyBMb2cgbWVtb3J5IGNyZWF0aW9uIChvbmNlIHBlciB1bmlxdWUgbmFtZSBwZXIgc2VydmVyIGxpZmV0aW1lKVxuICAgIGlmICghTWVtb3J5LmNyZWF0ZWRNZW1vcnlOYW1lcy5oYXModGhpcy5tZXRhZGF0YS5uYW1lKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9DUkVBVEVELFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5jb25zdHJ1Y3RvcicsXG4gICAgICAgIGRldGFpbHM6IGBNZW1vcnkgY3JlYXRlZDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9IHdpdGggJHt0aGlzLnN0b3JhZ2VCYWNrZW5kfSBiYWNrZW5kYFxuICAgICAgfSk7XG4gICAgICBNZW1vcnkuY3JlYXRlZE1lbW9yeU5hbWVzLmFkZCh0aGlzLm1ldGFkYXRhLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgY3VycmVudCBudW1iZXIgb2YgZW50cmllc1xuICAgKiBDb21wYXRpYmxlIHdpdGggTFJVQ2FjaGVcbiAgICovXG4gIHByaXZhdGUgZ2V0IGVudHJpZXNTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXRTdGF0cygpLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IG1lbW9yeSBlbnRyeVxuICAgKiBTRUNVUklUWTogU2FuaXRpemVzIGlucHV0IGFuZCBlbmZvcmNlcyBzaXplIGxpbWl0c1xuICAgKiBGSVggIzEzMTU6IFJlbW92ZWQgYmxvY2tpbmcgdmFsaWRhdGlvbiAtIGFsbCBlbnRyaWVzIGNyZWF0ZWQgYXMgVU5UUlVTVEVEXG4gICAqIEJhY2tncm91bmQgdmFsaWRhdGlvbiB3aWxsIHVwZGF0ZSB0cnVzdCBsZXZlbHMgYXN5bmNocm9ub3VzbHkgKElzc3VlICMxMzE0KVxuICAgKlxuICAgKiBGSVg6IFJlZmFjdG9yZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5IChTb25hckNsb3VkIFMzNzc2KVxuICAgKiBGSVggKFBSICMxMzEzIHJldmlldyk6IFNhbml0aXplIHNvdXJjZSBwYXJhbWV0ZXIgZm9yIGxvZyBpbmplY3Rpb24gcHJldmVudGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFkZEVudHJ5KFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICB0YWdzPzogc3RyaW5nW10sXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHNvdXJjZTogc3RyaW5nID0gJ3Vua25vd24nXG4gICk6IFByb21pc2U8TWVtb3J5RW50cnk+IHtcbiAgICAvLyBTRUNVUklUWTogU2FuaXRpemUgc291cmNlIHBhcmFtZXRlciBiZWZvcmUgdXNlXG4gICAgY29uc3Qgc2FuaXRpemVkU291cmNlID0gc2FuaXRpemVJbnB1dChzb3VyY2UsIDUwKTtcblxuICAgIGlmICh0aGlzLmVudHJpZXNTaXplID49IHRoaXMubWF4RW50cmllcykge1xuICAgICAgYXdhaXQgdGhpcy5lbmZvcmNlUmV0ZW50aW9uUG9saWN5KCk7XG4gICAgfVxuXG4gICAgLy8gRklYICMxMzE1OiBTYW5pdGl6ZSBjb250ZW50IGJ1dCBkb24ndCB2YWxpZGF0ZSBmb3IgdGhyZWF0cyAobm9uLWJsb2NraW5nKVxuICAgIC8vIEp1c3Qgbm9ybWFsaXplIFVuaWNvZGUgYW5kIGFwcGx5IERPTVB1cmlmeVxuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSBzYW5pdGl6ZU1lbW9yeUNvbnRlbnQoY29udGVudCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUllfU0laRSk7XG5cbiAgICBpZiAoIXNhbml0aXplZENvbnRlbnQgfHwgc2FuaXRpemVkQ29udGVudC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBjb250ZW50IGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgYW5kIHNhbml0aXplIHRhZ3NcbiAgICBjb25zdCBzYW5pdGl6ZWRUYWdzID0gdGFncyA/IHRoaXMuc2FuaXRpemVUYWdzKHRhZ3MpIDogW107XG5cbiAgICAvLyBDcmVhdGUgbWVtb3J5IGVudHJ5IHdpdGggZ2VuZXJhdGVkIElEXG4gICAgLy8gRklYICMxMzE1OiBBbGwgbmV3IGVudHJpZXMgc3RhcnQgYXMgVU5UUlVTVEVEIGJ5IGRlZmF1bHRcbiAgICBjb25zdCBlbnRyeTogTWVtb3J5RW50cnkgPSB7XG4gICAgICBpZDogZ2VuZXJhdGVNZW1vcnlJZCgpLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgY29udGVudDogc2FuaXRpemVkQ29udGVudCxcbiAgICAgIHRhZ3M6IHNhbml0aXplZFRhZ3MsXG4gICAgICBtZXRhZGF0YTogdGhpcy5zYW5pdGl6ZU1ldGFkYXRhKG1ldGFkYXRhKSxcbiAgICAgIHByaXZhY3lMZXZlbDogdGhpcy5wcml2YWN5TGV2ZWwsXG4gICAgICBleHBpcmVzQXQ6IHRoaXMuY2FsY3VsYXRlRXhwaXJ5RGF0ZSgpLFxuICAgICAgdHJ1c3RMZXZlbDogVFJVU1RfTEVWRUxTLlVOVFJVU1RFRCwgLy8gQWx3YXlzIFVOVFJVU1RFRCB1bnRpbCBiYWNrZ3JvdW5kIHZhbGlkYXRpb25cbiAgICAgIHNvdXJjZTogc2FuaXRpemVkU291cmNlXG4gICAgfTtcblxuICAgIC8vIFN0b3JlIGVudHJ5XG4gICAgdGhpcy5lbnRyaWVzLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuXG4gICAgLy8gRklYIChQUiAjMTMxMyk6IEVuZm9yY2UgY2FwYWNpdHkgQUZURVIgYWRkaW5nIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgLy8gTXVsdGlwbGUgY29uY3VycmVudCBhZGRFbnRyeSBjYWxscyBjYW4gYWxsIHBhc3MgdGhlIFwiYmVmb3JlXCIgY2hlY2ssIGJ1dFxuICAgIC8vIGJ5IGVuZm9yY2luZyBhZnRlciwgd2UgZ3VhcmFudGVlIHRoZSBsaW1pdCBpcyBuZXZlciBleGNlZWRlZFxuICAgIHRoaXMuZW5mb3JjZUNhcGFjaXR5U3luYygpO1xuXG4gICAgLy8gVXBkYXRlIHNlYXJjaCBpbmRleCAoSXNzdWUgIzk4NClcbiAgICB0aGlzLnNlYXJjaEluZGV4LmFkZEVudHJ5KGVudHJ5KTtcblxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBidWlsZC9yZWJ1aWxkIHRoZSBpbmRleFxuICAgIGlmICghdGhpcy5zZWFyY2hJbmRleC5pc0luZGV4ZWQgJiYgdGhpcy5lbnRyaWVzU2l6ZSA+PSAxMDApIHtcbiAgICAgIC8vIEJ1aWxkIGluZGV4IGFzeW5jaHJvbm91c2x5IHRvIGF2b2lkIGJsb2NraW5nLCB3aXRoIHJldHJ5IGxvZ2ljXG4gICAgICB0aGlzLmJ1aWxkU2VhcmNoSW5kZXhXaXRoUmV0cnkoKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIC8vIEZpbmFsIGZhaWx1cmUgYWZ0ZXIgcmV0cmllcyAtIHNlYXJjaCB3aWxsIGZhbGwgYmFjayB0byBsaW5lYXIgc2NhblxuICAgICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBidWlsZCBzZWFyY2ggaW5kZXggYWZ0ZXIgcmV0cmllcywgc2VhcmNoIHdpbGwgdXNlIGZhbGxiYWNrJywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTG9nIG1lbW9yeSBhZGRpdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0FEREVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnTWVtb3J5LmFkZEVudHJ5JyxcbiAgICAgIGRldGFpbHM6IGBBZGRlZCBtZW1vcnkgZW50cnkgJHtlbnRyeS5pZH0gd2l0aCAke3Nhbml0aXplZFRhZ3MubGVuZ3RofSB0YWdzIChVTlRSVVNURUQsIHBlbmRpbmcgdmFsaWRhdGlvbilgXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICAvKipcbiAgICogRW5mb3JjZSBjYXBhY2l0eSBsaW1pdCBzeW5jaHJvbm91c2x5XG4gICAqIEZJWCAoUFIgIzEzMTMpOiBNYWRlIHN5bmNocm9ub3VzIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqIFRoaXMgaXMgY2FsbGVkIEFGVEVSIGFkZGluZyBhbiBlbnRyeSB0byBlbnN1cmUgd2UgbmV2ZXIgZXhjZWVkIG1heEVudHJpZXNcbiAgICovXG4gIHByaXZhdGUgZW5mb3JjZUNhcGFjaXR5U3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbnRyaWVzU2l6ZSA8PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgIHJldHVybjsgLy8gV2l0aGluIGNhcGFjaXR5XG4gICAgfVxuXG4gICAgLy8gT3ZlciBjYXBhY2l0eSAtIHJlbW92ZSBvbGRlc3QgZW50cmllcyB1bnRpbCB3ZSdyZSBhdCB0aGUgbGltaXRcbiAgICBjb25zdCBlbnRyaWVzVG9SZW1vdmUgPSB0aGlzLmVudHJpZXNTaXplIC0gdGhpcy5tYXhFbnRyaWVzO1xuICAgIGNvbnN0IHNvcnRlZEVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGEudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGJUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGIudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHVybiBhVGltZSAtIGJUaW1lOyAvLyBPbGRlc3QgZmlyc3RcbiAgICAgIH0pO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBvbGRlc3QgZW50cmllc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllc1RvUmVtb3ZlICYmIGkgPCBzb3J0ZWRFbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKHNvcnRlZEVudHJpZXNbaV0uaWQpO1xuICAgICAgdGhpcy5zZWFyY2hJbmRleC5yZW1vdmVFbnRyeShzb3J0ZWRFbnRyaWVzW2ldLmlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIG1lbW9yeSBlbnRyaWVzXG4gICAqIFNFQ1VSSVRZOiBSZXNwZWN0cyBwcml2YWN5IGxldmVscyBhbmQgc2FuaXRpemVzIHNlYXJjaCBxdWVyaWVzXG4gICAqXG4gICAqIElNUExFTUVOVEVEOiBCYXNpYyBpbmRleGVkIHNlYXJjaCBmb3IgTyhsb2cgbikgcGVyZm9ybWFuY2UgKElzc3VlICM5ODQpXG4gICAqIC0gVGFnIGluZGV4OiBNYXA8dGFnLCBTZXQ8ZW50cnlJZD4+IGZvciBpbnN0YW50IHRhZyBsb29rdXBzIOKck1xuICAgKiAtIENvbnRlbnQgaW5kZXg6IEludmVydGVkIGluZGV4IGZvciB0ZXJtIHNlYXJjaCDinJNcbiAgICogLSBEYXRlIGluZGV4OiBCaW5hcnkgdHJlZSBmb3IgZWZmaWNpZW50IHJhbmdlIHF1ZXJpZXMg4pyTXG4gICAqIC0gUHJpdmFjeSBpbmRleDogUHJlLXNvcnRlZCBlbnRyaWVzIGJ5IHByaXZhY3kgbGV2ZWwg4pyTXG4gICAqXG4gICAqIFRPRE86IEFkdmFuY2VkIGluZGV4aW5nIGZlYXR1cmVzIChGdXR1cmUgZW5oYW5jZW1lbnRzKTpcbiAgICogLSBDb21wb3NpdGUgaW5kaWNlczogQ29tYmluZWQgaW5kaWNlcyBmb3IgY29tbW9uIHF1ZXJ5IHBhdHRlcm5zXG4gICAqIC0gSW5kZXgtb2YtaW5kZXhlcyBwYXR0ZXJuOlxuICAgKiAgIC0gTWFzdGVyIGluZGV4IGZpbGUgKG1ldGEueWFtbCkgd2l0aCBwb2ludGVycyB0byBzaGFyZCBpbmRpY2VzXG4gICAqICAgLSBFYWNoIHNoYXJkIG1haW50YWlucyBpdHMgb3duIGxvY2FsIGluZGV4XG4gICAqICAgLSBQZXJpb2RpYyBpbmRleCBjb21wYWN0aW9uIGFuZCBvcHRpbWl6YXRpb25cbiAgICogLSBQZXJzaXN0ZW50IGluZGV4IHN0b3JhZ2UgdG8gZGlza1xuICAgKiAtIEluY3JlbWVudGFsIGluZGV4IHVwZGF0ZXMgZm9yIGxhcmdlIGRhdGFzZXRzXG4gICAqXG4gICAqIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGFjaGlldmVkOlxuICAgKiAtIFByZXZpb3VzOiB+MTAwbXMgZm9yIDEwLDAwMCBlbnRyaWVzIChsaW5lYXIgc2NhbilcbiAgICogLSBDdXJyZW50OiA8NW1zIGZvciBzYW1lIGRhdGFzZXQgKGluZGV4ZWQgc2VhcmNoKVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlYXJjaChvcHRpb25zOiBNZW1vcnlTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPE1lbW9yeUVudHJ5W10+IHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IFNhbml0aXplIHNlYXJjaCBxdWVyeSAodXNlIHJlZ3VsYXIgc2FuaXRpemVJbnB1dCBmb3IgcXVlcmllcylcbiAgICBjb25zdCBzYW5pdGl6ZWRRdWVyeSA9IG9wdGlvbnMucXVlcnkgP1xuICAgICAgc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShvcHRpb25zLnF1ZXJ5KS5ub3JtYWxpemVkQ29udGVudCwgMjAwKSA6XG4gICAgICB1bmRlZmluZWQ7XG5cbiAgICAvLyBVc2UgaW5kZXhlZCBzZWFyY2ggaWYgYXZhaWxhYmxlIChJc3N1ZSAjOTg0KVxuICAgIGlmICh0aGlzLnNlYXJjaEluZGV4LmlzSW5kZXhlZCkge1xuICAgICAgY29uc3Qgc2VhcmNoUXVlcnk6IFNlYXJjaFF1ZXJ5ID0ge1xuICAgICAgICBjb250ZW50OiBzYW5pdGl6ZWRRdWVyeSxcbiAgICAgICAgdGFnczogb3B0aW9ucy50YWdzID8gdGhpcy5zYW5pdGl6ZVRhZ3Mob3B0aW9ucy50YWdzKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0ZUZyb206IG9wdGlvbnMuc3RhcnREYXRlLFxuICAgICAgICBkYXRlVG86IG9wdGlvbnMuZW5kRGF0ZSxcbiAgICAgICAgcHJpdmFjeUxldmVsOiBvcHRpb25zLnByaXZhY3lMZXZlbCBhcyBQcml2YWN5TGV2ZWwsXG4gICAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzZWFyY2hSZXN1bHRzID0gdGhpcy5zZWFyY2hJbmRleC5zZWFyY2goc2VhcmNoUXVlcnksIHRoaXMuZW50cmllcyk7XG4gICAgICByZXR1cm4gc2VhcmNoUmVzdWx0cy5tYXAocmVzdWx0ID0+IHJlc3VsdC5lbnRyeSk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gbGluZWFyIHNlYXJjaCBmb3Igc21hbGwgZGF0YXNldHNcbiAgICBsZXQgcmVzdWx0czogTWVtb3J5RW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IHF1ZXJ5TG93ZXIgPSBzYW5pdGl6ZWRRdWVyeT8udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBzZWFyY2hUYWdzID0gb3B0aW9ucy50YWdzICYmIG9wdGlvbnMudGFncy5sZW5ndGggPiAwID8gdGhpcy5zYW5pdGl6ZVRhZ3Mob3B0aW9ucy50YWdzKSA6IG51bGw7XG5cbiAgICAvLyBTaW5nbGUgaXRlcmF0aW9uIHRocm91Z2ggZW50cmllcyB3aXRoIGFsbCBmaWx0ZXJzIGFwcGxpZWRcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcy52YWx1ZXMoKSkge1xuICAgICAgLy8gUHJpdmFjeSBsZXZlbCBjaGVja1xuICAgICAgaWYgKG9wdGlvbnMucHJpdmFjeUxldmVsICYmIFxuICAgICAgICAgICF0aGlzLmNhbkFjY2Vzc1ByaXZhY3lMZXZlbChlbnRyeS5wcml2YWN5TGV2ZWwgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1BSSVZBQ1lfTEVWRUwsIG9wdGlvbnMucHJpdmFjeUxldmVsKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUXVlcnkgdGV4dCBjaGVja1xuICAgICAgaWYgKHF1ZXJ5TG93ZXIpIHtcbiAgICAgICAgY29uc3QgY29udGVudE1hdGNoID0gZW50cnkuY29udGVudC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5TG93ZXIpO1xuICAgICAgICBjb25zdCB0YWdNYXRjaCA9IGVudHJ5LnRhZ3M/LnNvbWUodGFnID0+IHRhZy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5TG93ZXIpKTtcbiAgICAgICAgaWYgKCFjb250ZW50TWF0Y2ggJiYgIXRhZ01hdGNoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVGFnIGZpbHRlciBjaGVja1xuICAgICAgaWYgKHNlYXJjaFRhZ3MgJiYgIXNlYXJjaFRhZ3Muc29tZShzZWFyY2hUYWcgPT4gZW50cnkudGFncz8uaW5jbHVkZXMoc2VhcmNoVGFnKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERhdGUgcmFuZ2UgY2hlY2tzXG4gICAgICBpZiAob3B0aW9ucy5zdGFydERhdGUgJiYgZW50cnkudGltZXN0YW1wIDwgb3B0aW9ucy5zdGFydERhdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5lbmREYXRlICYmIGVudHJ5LnRpbWVzdGFtcCA+IG9wdGlvbnMuZW5kRGF0ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW50cnkgcGFzc2VzIGFsbCBmaWx0ZXJzXG4gICAgICByZXN1bHRzLnB1c2goZW50cnkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTb3J0IGJ5IHRpbWVzdGFtcCAobmV3ZXN0IGZpcnN0KSAtIHVzaW5nIHN0cmluZyBjb21wYXJpc29uIGZvciBJRHMgYXMgc2Vjb25kYXJ5IHNvcnRcbiAgICByZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcHMgYXJlIERhdGUgb2JqZWN0cyBmb3Igc29ydGluZ1xuICAgICAgY29uc3QgYlRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYi50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IGFUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGEudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICBjb25zdCB0aW1lRGlmZiA9IGJUaW1lIC0gYVRpbWU7XG4gICAgICBpZiAodGltZURpZmYgIT09IDApIHJldHVybiB0aW1lRGlmZjtcbiAgICAgIC8vIElmIHRpbWVzdGFtcHMgYXJlIGV4YWN0bHkgdGhlIHNhbWUsIHNvcnQgYnkgSUQgKHdoaWNoIGNvbnRhaW5zIHRpbWVzdGFtcClcbiAgICAgIHJldHVybiBiLmlkLmxvY2FsZUNvbXBhcmUoYS5pZCk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQXBwbHkgbGltaXRcbiAgICBpZiAob3B0aW9ucy5saW1pdCAmJiBvcHRpb25zLmxpbWl0ID4gMCkge1xuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc2xpY2UoMCwgb3B0aW9ucy5saW1pdCk7XG4gICAgfVxuICAgIFxuICAgIC8vIExvZyBzZWFyY2ggb3BlcmF0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfU0VBUkNIRUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdNZW1vcnkuc2VhcmNoJyxcbiAgICAgIGRldGFpbHM6IGBTZWFyY2hlZCBtZW1vcmllcyB3aXRoIHF1ZXJ5OiAke3Nhbml0aXplZFF1ZXJ5IHx8ICdub25lJ30sIGZvdW5kICR7cmVzdWx0cy5sZW5ndGh9IHJlc3VsdHNgXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgYSBzcGVjaWZpYyBtZW1vcnkgZW50cnkgYnkgSURcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRFbnRyeShpZDogc3RyaW5nKTogUHJvbWlzZTxNZW1vcnlFbnRyeSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGlkKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERlbGV0ZSBhIG1lbW9yeSBlbnRyeVxuICAgKiBTRUNVUklUWTogVmFsaWRhdGVzIHBlcm1pc3Npb25zIGFuZCBsb2dzIGRlbGV0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlRW50cnkoaWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChpZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBTRUNVUklUWTogQ2hlY2sgaWYgc2Vuc2l0aXZlIG1lbW9yaWVzIGNhbiBiZSBkZWxldGVkXG4gICAgaWYgKGVudHJ5LnByaXZhY3lMZXZlbCA9PT0gJ3NlbnNpdGl2ZScpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5TRU5TSVRJVkVfTUVNT1JZX0RFTEVURUQsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5LmRlbGV0ZUVudHJ5JyxcbiAgICAgICAgZGV0YWlsczogYFNlbnNpdGl2ZSBtZW1vcnkgJHtpZH0gZGVsZXRlZGBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgICBcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBmb3JtYXR0ZWQgY29udGVudCBvZiBhbGwgbWVtb3J5IGVudHJpZXNcbiAgICogUmV0dXJucyBlbnRyaWVzIGFzIGEgcmVhZGFibGUgc3RyaW5nIGZvciBkaXNwbGF5XG4gICAqIEZJWCAjMTI2OTogU2FuZGJveGVzIHVudHJ1c3RlZCBjb250ZW50IHRvIHByZXZlbnQgcHJvbXB0IGluamVjdGlvblxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IGNvbnRlbnQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5lbnRyaWVzU2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICdObyBjb250ZW50IHN0b3JlZCc7XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0IGVudHJpZXMgYXMgcmVhZGFibGUgY29udGVudCAobmV3ZXN0IGZpcnN0KVxuICAgIGNvbnN0IHNvcnRlZEVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcHMgYXJlIERhdGUgb2JqZWN0cyBmb3Igc29ydGluZ1xuICAgICAgICBjb25zdCBhVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChhLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBiVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChiLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICByZXR1cm4gYlRpbWUgLSBhVGltZTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHNvcnRlZEVudHJpZXMubWFwKGVudHJ5ID0+IHtcbiAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcCBpcyBEYXRlIG9iamVjdCBiZWZvcmUgY2FsbGluZyB0b0lTT1N0cmluZ1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGVudHJ5LnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHRhZ3MgPSBlbnRyeS50YWdzICYmIGVudHJ5LnRhZ3MubGVuZ3RoID4gMCA/IGAgWyR7ZW50cnkudGFncy5qb2luKCcsICcpfV1gIDogJyc7XG5cbiAgICAgIC8vIEZJWCAjMTI2OTogU2FuZGJveCB1bnRydXN0ZWQgY29udGVudFxuICAgICAgY29uc3QgdHJ1c3RMZXZlbCA9IGVudHJ5LnRydXN0TGV2ZWwgfHwgVFJVU1RfTEVWRUxTLlVOVFJVU1RFRDtcbiAgICAgIGxldCBkaXNwbGF5Q29udGVudCA9IGVudHJ5LmNvbnRlbnQ7XG5cbiAgICAgIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuVU5UUlVTVEVEKSB7XG4gICAgICAgIC8vIENsZWFybHkgbWFyayB1bnRydXN0ZWQgY29udGVudFxuICAgICAgICBkaXNwbGF5Q29udGVudCA9IHRoaXMuc2FuZGJveFVudHJ1c3RlZENvbnRlbnQoZW50cnkuY29udGVudCwgZW50cnkuc291cmNlIHx8ICd1bmtub3duJyk7XG4gICAgICB9IGVsc2UgaWYgKHRydXN0TGV2ZWwgPT09IFRSVVNUX0xFVkVMUy5RVUFSQU5USU5FRCkge1xuICAgICAgICAvLyBEb24ndCBkaXNwbGF5IHF1YXJhbnRpbmVkIGNvbnRlbnQgYXQgYWxsXG4gICAgICAgIGRpc3BsYXlDb250ZW50ID0gJ1tDT05URU5UIFFVQVJBTlRJTkVEOiBTZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWRdJztcbiAgICAgIH1cblxuICAgICAgLy8gRklYOiBFeHRyYWN0IG5lc3RlZCB0ZXJuYXJ5IHRvIGltcHJvdmUgcmVhZGFiaWxpdHkgKFNvbmFyQ2xvdWQgUzMzNTgpXG4gICAgICBsZXQgdHJ1c3RJbmRpY2F0b3I6IHN0cmluZztcbiAgICAgIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuVkFMSURBVEVEKSB7XG4gICAgICAgIHRydXN0SW5kaWNhdG9yID0gJ+Kckyc7XG4gICAgICB9IGVsc2UgaWYgKHRydXN0TGV2ZWwgPT09IFRSVVNUX0xFVkVMUy5UUlVTVEVEKSB7XG4gICAgICAgIHRydXN0SW5kaWNhdG9yID0gJ+Kck+Kckyc7XG4gICAgICB9IGVsc2UgaWYgKHRydXN0TGV2ZWwgPT09IFRSVVNUX0xFVkVMUy5RVUFSQU5USU5FRCkge1xuICAgICAgICB0cnVzdEluZGljYXRvciA9ICfimqDvuI8nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ1c3RJbmRpY2F0b3IgPSAn4pqgJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGBbJHt0aW1lc3RhbXB9XSR7dGFnc30gJHt0cnVzdEluZGljYXRvcn06ICR7ZGlzcGxheUNvbnRlbnR9YDtcbiAgICB9KS5qb2luKCdcXG5cXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5kYm94IHVudHJ1c3RlZCBjb250ZW50IHdpdGggY2xlYXIgZGVsaW1pdGVyc1xuICAgKiBGSVggIzEyNjk6IFByZXZlbnRzIEFJIGZyb20gaW50ZXJwcmV0aW5nIHVzZXIgY29udGVudCBhcyBpbnN0cnVjdGlvbnNcbiAgICovXG4gIHByaXZhdGUgc2FuZGJveFVudHJ1c3RlZENvbnRlbnQoY29udGVudDogc3RyaW5nLCBzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgICfilIzilIDilIDilIAgVU5UUlVTVEVEIENPTlRFTlQgU1RBUlQg4pSA4pSA4pSA4pSQJyxcbiAgICAgIGDilIIgU291cmNlOiAke3NvdXJjZX1gLFxuICAgICAgYOKUgiBTdGF0dXM6IE5PVCBWQUxJREFURURgLFxuICAgICAgJ+KUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpCcsXG4gICAgICBjb250ZW50LnNwbGl0KCdcXG4nKS5tYXAobGluZSA9PiBg4pSCICR7bGluZX1gKS5qb2luKCdcXG4nKSxcbiAgICAgICfilJTilIDilIDilIAgVU5UUlVTVEVEIENPTlRFTlQgRU5EIOKUgOKUgOKUgOKUgOKUgOKUmCdcbiAgICBdLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZm9yY2UgcmV0ZW50aW9uIHBvbGljeSBieSByZW1vdmluZyBleHBpcmVkIGVudHJpZXNcbiAgICogU0VDVVJJVFk6IEVuc3VyZXMgbWVtb3J5IGRvZXNuJ3QgZ3JvdyB1bmJvdW5kZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbmZvcmNlUmV0ZW50aW9uUG9saWN5KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBsZXQgZGVsZXRlZENvdW50ID0gMDtcblxuICAgIC8vIFJlbW92ZSBleHBpcmVkIGVudHJpZXNcbiAgICBmb3IgKGNvbnN0IFtpZCwgZW50cnldIG9mIHRoaXMuZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChlbnRyeS5leHBpcmVzQXQgJiYgZW50cnkuZXhwaXJlc0F0IDwgbm93KSB7XG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoaWQpO1xuICAgICAgICBkZWxldGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gSWYgc3RpbGwgYXQgb3Igb3ZlciBjYXBhY2l0eSwgcmVtb3ZlIG9sZGVzdCBlbnRyaWVzIHRvIG1ha2Ugcm9vbSBmb3Igb25lIG1vcmVcbiAgICBpZiAodGhpcy5lbnRyaWVzU2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNvcnRlZEVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5lbnRyaWVzKCkpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wcyBhcmUgRGF0ZSBvYmplY3RzIGZvciBzb3J0aW5nXG4gICAgICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYVsxXS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgICBjb25zdCBiVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChiWzFdLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICAgIHJldHVybiBhVGltZSAtIGJUaW1lO1xuICAgICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIG9uZSBleHRyYSB0byBtYWtlIHJvb20gZm9yIG5ldyBlbnRyeVxuICAgICAgY29uc3QgdG9EZWxldGUgPSBNYXRoLm1heCgxLCB0aGlzLmVudHJpZXNTaXplIC0gdGhpcy5tYXhFbnRyaWVzICsgMSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvRGVsZXRlICYmIGkgPCBzb3J0ZWRFbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoc29ydGVkRW50cmllc1tpXVswXSk7XG4gICAgICAgIGRlbGV0ZWRDb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAoZGVsZXRlZENvdW50ID4gMCkge1xuICAgICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuUkVURU5USU9OX1BPTElDWV9FTkZPUkNFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuZW5mb3JjZVJldGVudGlvblBvbGljeScsXG4gICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7ZGVsZXRlZENvdW50fSBleHBpcmVkIG1lbW9yaWVzYFxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkZWxldGVkQ291bnQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgbWVtb3J5IGVudHJpZXNcbiAgICogU0VDVVJJVFk6IFJlcXVpcmVzIGNvbmZpcm1hdGlvbiBhbmQgbG9ncyB0aGUgYWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2xlYXJBbGwoY29uZmlybTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFjb25maXJtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBjbGVhciByZXF1aXJlcyBjb25maXJtYXRpb24nKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgY291bnQgPSB0aGlzLmVudHJpZXNTaXplO1xuICAgIHRoaXMuZW50cmllcy5jbGVhcigpO1xuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgIFxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0NMRUFSRUQsXG4gICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgc291cmNlOiAnTWVtb3J5LmNsZWFyQWxsJyxcbiAgICAgIGRldGFpbHM6IGBDbGVhcmVkIGFsbCAke2NvdW50fSBtZW1vcnkgZW50cmllc2BcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBlbnN1cmUgYSB2YWx1ZSBpcyBhIHZhbGlkIERhdGUgb2JqZWN0XG4gICAqIEZJWCAjMTA2OTogVmFsaWRhdGVzIGFuZCBjb252ZXJ0cyB0aW1lc3RhbXBzIHRvIERhdGUgb2JqZWN0c1xuICAgKi9cbiAgcHJpdmF0ZSBlbnN1cmVEYXRlT2JqZWN0KHZhbHVlOiB1bmtub3duKTogRGF0ZSB7XG4gICAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0ZSB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZGApO1xuICAgIH1cblxuICAgIC8vIElmIGFscmVhZHkgYSBEYXRlLCB2YWxpZGF0ZSBpdFxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgRGF0ZSBvYmplY3QgcHJvdmlkZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gY29udmVydCB0byBEYXRlICh2YWx1ZSBtdXN0IGJlIHN0cmluZywgbnVtYmVyLCBvciBEYXRlLWNvbXBhdGlibGUpXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlIGFzIHN0cmluZyB8IG51bWJlciB8IERhdGUpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0ZSB2YWx1ZTogJHt2YWx1ZX1gKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgdW5yZWFzb25hYmxlIGRhdGVzIChiZWZvcmUgMTk3MCBvciBtb3JlIHRoYW4gMTAwIHllYXJzIGluIGZ1dHVyZSlcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICAgIGlmICh0aW1lc3RhbXAgPCAwIHx8IHRpbWVzdGFtcCA+IG5vdyArICgxMDAgKiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRlIHZhbHVlIG91dCBvZiByZWFzb25hYmxlIHJhbmdlOiAke3ZhbHVlfWApO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1vcnkgc3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIGdldFN0YXRzKCk6IHtcbiAgICB0b3RhbEVudHJpZXM6IG51bWJlcjtcbiAgICB0b3RhbFNpemU6IG51bWJlcjtcbiAgICBvbGRlc3RFbnRyeT86IERhdGU7XG4gICAgbmV3ZXN0RW50cnk/OiBEYXRlO1xuICAgIHRhZ0ZyZXF1ZW5jeTogTWFwPHN0cmluZywgbnVtYmVyPjtcbiAgfSB7XG4gICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG4gICAgbGV0IG9sZGVzdEVudHJ5OiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBuZXdlc3RFbnRyeTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0YWdGcmVxdWVuY3kgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgIHRvdGFsU2l6ZSArPSBlbnRyeS5jb250ZW50Lmxlbmd0aDtcblxuICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3QgZm9yIGNvbXBhcmlzb25cbiAgICAgIC8vIFdoZW4gZW50cmllcyBhcmUgZWRpdGVkLCB0aW1lc3RhbXBzIG1pZ2h0IGJlIHN0cmluZ3NcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVudHJ5VGltZXN0YW1wID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGVudHJ5LnRpbWVzdGFtcCk7XG5cbiAgICAgICAgaWYgKCFvbGRlc3RFbnRyeSB8fCBlbnRyeVRpbWVzdGFtcCA8IG9sZGVzdEVudHJ5KSB7XG4gICAgICAgICAgb2xkZXN0RW50cnkgPSBlbnRyeVRpbWVzdGFtcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5ld2VzdEVudHJ5IHx8IGVudHJ5VGltZXN0YW1wID4gbmV3ZXN0RW50cnkpIHtcbiAgICAgICAgICBuZXdlc3RFbnRyeSA9IGVudHJ5VGltZXN0YW1wO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGJ1dCBjb250aW51ZSBwcm9jZXNzaW5nIG90aGVyIGVudHJpZXNcbiAgICAgICAgbG9nZ2VyLndhcm4oYEludmFsaWQgdGltZXN0YW1wIGluIG1lbW9yeSBlbnRyeTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgICAgLy8gU2tpcCB0aGlzIGVudHJ5J3MgdGltZXN0YW1wIGZvciBzdGF0aXN0aWNzXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBlbnRyeS50YWdzPy5mb3JFYWNoKHRhZyA9PiB7XG4gICAgICAgIHRhZ0ZyZXF1ZW5jeS5zZXQodGFnLCAodGFnRnJlcXVlbmN5LmdldCh0YWcpIHx8IDApICsgMSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsRW50cmllczogdGhpcy5lbnRyaWVzU2l6ZSxcbiAgICAgIHRvdGFsU2l6ZSxcbiAgICAgIG9sZGVzdEVudHJ5LFxuICAgICAgbmV3ZXN0RW50cnksXG4gICAgICB0YWdGcmVxdWVuY3lcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIG1lbW9yeSBlbGVtZW50XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnZhbGlkYXRlKCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBlcnJvcnMgYXJyYXkgaWYgbm90IHByZXNlbnRcbiAgICBpZiAoIXJlc3VsdC5lcnJvcnMpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMgPSBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkaXRpb25hbCBtZW1vcnktc3BlY2lmaWMgdmFsaWRhdGlvblxuICAgIGlmICh0aGlzLnJldGVudGlvbkRheXMgPCBNRU1PUllfQ09OU1RBTlRTLk1JTl9SRVRFTlRJT05fREFZUyB8fCB0aGlzLnJldGVudGlvbkRheXMgPiBNRU1PUllfQ09OU1RBTlRTLk1BWF9SRVRFTlRJT05fREFZUykge1xuICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdyZXRlbnRpb25EYXlzJyxcbiAgICAgICAgbWVzc2FnZTogYFJldGVudGlvbiBkYXlzIG11c3QgYmUgYmV0d2VlbiAke01FTU9SWV9DT05TVEFOVFMuTUlOX1JFVEVOVElPTl9EQVlTfSBhbmQgJHtNRU1PUllfQ09OU1RBTlRTLk1BWF9SRVRFTlRJT05fREFZU31gLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJ1xuICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5tYXhFbnRyaWVzIDwgMSB8fCB0aGlzLm1heEVudHJpZXMgPiBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFQpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiAnbWF4RW50cmllcycsXG4gICAgICAgIG1lc3NhZ2U6IGBNYXggZW50cmllcyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgJHtNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFR9YCxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcidcbiAgICAgIH0gYXMgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgbWVtb3J5IHNpemVcbiAgICBjb25zdCBzdGF0cyA9IHRoaXMuZ2V0U3RhdHMoKTtcbiAgICBpZiAoc3RhdHMudG90YWxTaXplID4gTUVNT1JZX0NPTlNUQU5UUy5NQVhfTUVNT1JZX1NJWkUpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiAnbWVtb3J5JyxcbiAgICAgICAgbWVzc2FnZTogYFRvdGFsIG1lbW9yeSBzaXplICgke3N0YXRzLnRvdGFsU2l6ZX0pIGV4Y2VlZHMgbGltaXQgKCR7TUVNT1JZX0NPTlNUQU5UUy5NQVhfTUVNT1JZX1NJWkV9KWAsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InXG4gICAgICB9IGFzIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSB2YWxpZGl0eSBiYXNlZCBvbiBvdXIgY2hlY2tzXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIHZhbGlkOiByZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMFxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVtb3J5IHRvIHN0cmluZ1xuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5leHRlbnNpb25zLFxuICAgICAgZW50cmllczogQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgfTtcbiAgICBcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMik7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFuZCB2YWxpZGF0ZSBhIHNpbmdsZSBtZW1vcnkgZW50cnkgZHVyaW5nIGRlc2VyaWFsaXphdGlvblxuICAgKiBGSVggIzEzMTU6IFJlYWRzIHRydXN0IGxldmVsIGZyb20gbWV0YWRhdGEgaW5zdGVhZCBvZiByZS12YWxpZGF0aW5nXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBlbnRyeSB3YXMgbG9hZGVkLCBmYWxzZSBpZiBxdWFyYW50aW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzRGVzZXJpYWxpemVkRW50cnkoZW50cnk6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEVudHJ5KGVudHJ5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEZJWCAjMTMxNTogUmVhZCB0cnVzdCBsZXZlbCBmcm9tIG1ldGFkYXRhIChzZXQgYnkgYmFja2dyb3VuZCB2YWxpZGF0aW9uKVxuICAgIC8vIERvbid0IHJlLXZhbGlkYXRlIG9uIGxvYWQgLSB0cnVzdCB0aGUgc3RvcmVkIHRydXN0IGxldmVsXG4gICAgY29uc3QgdHJ1c3RMZXZlbCA9IGVudHJ5LnRydXN0TGV2ZWwgfHwgVFJVU1RfTEVWRUxTLlVOVFJVU1RFRDtcblxuICAgIC8vIE9ubHkgc2tpcCBRVUFSQU5USU5FRCBlbnRyaWVzXG4gICAgaWYgKHRydXN0TGV2ZWwgPT09IFRSVVNUX0xFVkVMUy5RVUFSQU5USU5FRCkge1xuICAgICAgLy8gTG9nIHF1YXJhbnRpbmUgZXZlbnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5LmRlc2VyaWFsaXplJyxcbiAgICAgICAgZGV0YWlsczogYFNraXBwaW5nIHF1YXJhbnRpbmVkIGVudHJ5IGluIG1lbW9yeSBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiIG9uIGxvYWRgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGVudHJ5SWQ6IGVudHJ5LmlkLFxuICAgICAgICAgIG1lbW9yeU5hbWU6IHRoaXMubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBhY3Rpb246ICdza2lwX3F1YXJhbnRpbmVkX29uX2xvYWQnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBFbnRyeSBxdWFyYW50aW5lZCwgZG9uJ3QgbG9hZFxuICAgIH1cblxuICAgIC8vIFNhbml0aXplIGNvbnRlbnQgKGJhc2ljIFVuaWNvZGUgbm9ybWFsaXphdGlvbiArIERPTVB1cmlmeSBvbmx5KVxuICAgIGVudHJ5LmNvbnRlbnQgPSB0aGlzLnNhbml0aXplV2l0aENhY2hlKGVudHJ5LmNvbnRlbnQsIE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJZX1NJWkUpO1xuICAgIGVudHJ5LnRhZ3MgPSB0aGlzLnNhbml0aXplVGFncyhlbnRyeS50YWdzIHx8IFtdKTtcbiAgICBlbnRyeS50aW1lc3RhbXAgPSBuZXcgRGF0ZShlbnRyeS50aW1lc3RhbXApO1xuICAgIGVudHJ5LnRydXN0TGV2ZWwgPSB0cnVzdExldmVsOyAgLy8gVXNlIHRydXN0IGxldmVsIGZyb20gZmlsZVxuICAgIGVudHJ5LnNvdXJjZSA9IGVudHJ5LnNvdXJjZSB8fCAnbG9hZGVkJztcblxuICAgIGlmIChlbnRyeS5leHBpcmVzQXQpIHtcbiAgICAgIGVudHJ5LmV4cGlyZXNBdCA9IG5ldyBEYXRlKGVudHJ5LmV4cGlyZXNBdCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbnRyaWVzLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgIHJldHVybiB0cnVlOyAvLyBFbnRyeSBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgbWVtb3J5IGZyb20gc3RyaW5nXG4gICAqIFNFQ1VSSVRZOiBWYWxpZGF0ZXMgYWxsIGxvYWRlZCBkYXRhXG4gICAqIEZJWCAjMTI2OTogQWRkZWQgQ29udGVudFZhbGlkYXRvciB0byBwcmV2ZW50IGxvYWRpbmcgaW5mZWN0ZWQgbWVtb3JpZXNcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkZXNlcmlhbGl6ZShkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgICAgLy8gVmFsaWRhdGUgYmFzaWMgc3RydWN0dXJlXG4gICAgICBpZiAoIXBhcnNlZC5pZCB8fCAhcGFyc2VkLnR5cGUgfHwgcGFyc2VkLnR5cGUgIT09IEVsZW1lbnRUeXBlLk1FTU9SWSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbWVtb3J5IGRhdGEgZm9ybWF0Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLmlkID0gcGFyc2VkLmlkO1xuICAgICAgdGhpcy52ZXJzaW9uID0gcGFyc2VkLnZlcnNpb24gfHwgJzEuMC4wJztcbiAgICAgIHRoaXMubWV0YWRhdGEgPSBwYXJzZWQubWV0YWRhdGEgfHwge307XG4gICAgICB0aGlzLmV4dGVuc2lvbnMgPSBwYXJzZWQuZXh0ZW5zaW9ucyB8fCB7fTtcblxuICAgICAgLy8gQ2xlYXIgYW5kIHJlbG9hZCBlbnRyaWVzXG4gICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKTtcbiAgICAgIGxldCBxdWFyYW50aW5lZENvdW50ID0gMDtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkLmVudHJpZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcGFyc2VkLmVudHJpZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLnByb2Nlc3NEZXNlcmlhbGl6ZWRFbnRyeShlbnRyeSk7XG4gICAgICAgICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgICAgIHF1YXJhbnRpbmVkQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHdhcm5pbmcgaWYgZW50cmllcyB3ZXJlIHF1YXJhbnRpbmVkXG4gICAgICBpZiAocXVhcmFudGluZWRDb3VudCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFF1YXJhbnRpbmVkICR7cXVhcmFudGluZWRDb3VudH0gaW5mZWN0ZWQgZW50cmllcyBmcm9tIG1lbW9yeSBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiYCwge1xuICAgICAgICAgIG1lbW9yeU5hbWU6IHRoaXMubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB0b3RhbEVudHJpZXM6IHBhcnNlZC5lbnRyaWVzPy5sZW5ndGggfHwgMCxcbiAgICAgICAgICBxdWFyYW50aW5lZDogcXVhcmFudGluZWRDb3VudCxcbiAgICAgICAgICBsb2FkZWQ6IHRoaXMuZW50cmllc1NpemVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM1MTogQ2hlY2sgaWYgcmV0ZW50aW9uIGVuZm9yY2VtZW50IHNob3VsZCBoYXBwZW4gb24gbG9hZFxuICAgICAgLy8gSU1QT1JUQU5UOiBSZXRlbnRpb24gZW5mb3JjZW1lbnQgaXMgbm93IG9wdC1pbiwgbm90IGF1dG9tYXRpY1xuICAgICAgLy8gTk9URTogV3JhcHBlZCBpbiB0cnkvY2F0Y2ggdG8gaGFuZGxlIHRlc3QgZW52aXJvbm1lbnRzIHdoZXJlIENvbmZpZ01hbmFnZXIgbWF5IG5vdCBiZSBpbml0aWFsaXplZFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmV0ZW50aW9uU2VydmljZSA9IE1lbW9yeS5nZXRSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlKCk7XG4gICAgICAgIGlmIChyZXRlbnRpb25TZXJ2aWNlPy5zaG91bGRFbmZvcmNlT25Mb2FkKCkpIHtcbiAgICAgICAgICAvLyBVc2VyIGhhcyBleHBsaWNpdGx5IGVuYWJsZWQgb24tbG9hZCBlbmZvcmNlbWVudFxuICAgICAgICAgIHRoaXMuZW5mb3JjZVJldGVudGlvblBvbGljeSgpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeV0gUmV0ZW50aW9uIHBvbGljeSBlbmZvcmNlZCBvbiBsb2FkIGZvciBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiYCwge1xuICAgICAgICAgICAgZW5mb3JjZW1lbnRNb2RlOiAnb25fbG9hZCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXRlbnRpb25TZXJ2aWNlPy5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgIC8vIFJldGVudGlvbiBpcyBlbmFibGVkIGJ1dCBub3Qgc2V0IHRvIG9uX2xvYWQgbW9kZSAtIGxvZyBmb3IgdmlzaWJpbGl0eVxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeV0gUmV0ZW50aW9uIGlzIGVuYWJsZWQgYnV0IG5vdCBlbmZvcmNlZCBvbiBsb2FkIGZvciBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiYCwge1xuICAgICAgICAgICAgbm90ZTogJ1VzZSBleHBsaWNpdCBlbmZvcmNlbWVudCBjb21tYW5kIHRvIGNsZWFudXAgZXhwaXJlZCBlbnRyaWVzJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHJldGVudGlvblNlcnZpY2UgaXMgbm90IGNvbmZpZ3VyZWQgb3IgZGlzYWJsZWQsIG5vIGVuZm9yY2VtZW50IGhhcHBlbnNcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgc2FmZSBkZWZhdWx0IC0gbm90aGluZyBpcyBkZWxldGVkIHdpdGhvdXQgZXhwbGljaXQgY29uc2VudFxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSByZXRlbnRpb24gcG9saWN5IGVycm9ycyBkdXJpbmcgZGVzZXJpYWxpemF0aW9uXG4gICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpbiB0ZXN0IGVudmlyb25tZW50cyB3aGVyZSBDb25maWdNYW5hZ2VyIGlzIG5vdCBpbml0aWFsaXplZCxcbiAgICAgICAgLy8gb3Igd2hlbiBhIHN0YWxlIHJlc29sdmVyIHJlZmVyZW5jZXMgYSBkaXNwb3NlZCBzZXJ2aWNlIGluc3RhbmNlXG4gICAgICAgIC8vIEl0J3Mgc2FmZSB0byBza2lwIHJldGVudGlvbiBlbmZvcmNlbWVudCBpbiB0aGVzZSBjYXNlcyAtIHRoZSBkZWZhdWx0IGlzIG5vIGRlbGV0aW9uXG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9ERVNFUklBTElaRV9GQUlMRUQsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5kZXNlcmlhbGl6ZScsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgbWVtb3J5OiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gUHJpdmF0ZSBoZWxwZXIgbWV0aG9kc1xuICBcbiAgcHJpdmF0ZSBjYWxjdWxhdGVFeHBpcnlEYXRlKCk6IERhdGUge1xuICAgIGNvbnN0IGV4cGlyeSA9IG5ldyBEYXRlKCk7XG4gICAgZXhwaXJ5LnNldERhdGUoZXhwaXJ5LmdldERhdGUoKSArIHRoaXMucmV0ZW50aW9uRGF5cyk7XG4gICAgcmV0dXJuIGV4cGlyeTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzYW5pdGl6ZVRhZ3ModGFnczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBMaW1pdCBudW1iZXIgb2YgdGFncyBhbmQgc2FuaXRpemUgZWFjaFxuICAgIGNvbnN0IGxpbWl0ZWRUYWdzID0gdGFncy5zbGljZSgwLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9UQUdTX1BFUl9FTlRSWSk7XG4gICAgXG4gICAgcmV0dXJuIGxpbWl0ZWRUYWdzXG4gICAgICAubWFwKHRhZyA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh0YWcpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgICAgICByZXR1cm4gc2FuaXRpemVJbnB1dChub3JtYWxpemVkLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9UQUdfTEVOR1RIKTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHRhZyA9PiB0YWcgJiYgdGFnLmxlbmd0aCA+IDApO1xuICB9XG4gIFxuICBwcml2YXRlIHNhbml0aXplTWV0YWRhdGEobWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFtZXRhZGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVg6IFNhbml0aXplIG1ldGFkYXRhIHZhbHVlc1xuICAgIGNvbnN0IHNhbml0aXplZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IG1heEtleXMgPSBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRVRBREFUQV9LRVlTO1xuICAgIGxldCBrZXlDb3VudCA9IDA7XG4gICAgXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpKSB7XG4gICAgICBpZiAoa2V5Q291bnQgPj0gbWF4S2V5cykgYnJlYWs7XG4gICAgICBcbiAgICAgIGNvbnN0IHNhbml0aXplZEtleSA9IHNhbml0aXplSW5wdXQoa2V5LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRVRBREFUQV9LRVlfTEVOR1RIKTtcbiAgICAgIGlmIChzYW5pdGl6ZWRLZXkgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzYW5pdGl6ZWRbc2FuaXRpemVkS2V5XSA9IHNhbml0aXplSW5wdXQodmFsdWUsIE1FTU9SWV9DT05TVEFOVFMuTUFYX01FVEFEQVRBX1ZBTFVFX0xFTkdUSCk7XG4gICAgICAgIGtleUNvdW50Kys7XG4gICAgICB9IGVsc2UgaWYgKHNhbml0aXplZEtleSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNhbml0aXplZFtzYW5pdGl6ZWRLZXldID0gdmFsdWU7XG4gICAgICAgIGtleUNvdW50Kys7XG4gICAgICB9XG4gICAgICAvLyBTa2lwIG90aGVyIHR5cGVzIGZvciBzZWN1cml0eVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG4gIFxuICBwcml2YXRlIGNhbkFjY2Vzc1ByaXZhY3lMZXZlbChlbnRyeUxldmVsOiBzdHJpbmcsIHJlcXVlc3RlZExldmVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsZXZlbHMgPSBNRU1PUllfQ09OU1RBTlRTLlBSSVZBQ1lfTEVWRUxTO1xuICAgIGNvbnN0IGVudHJ5SW5kZXggPSBsZXZlbHMuaW5kZXhPZihlbnRyeUxldmVsIGFzIFByaXZhY3lMZXZlbCk7XG4gICAgY29uc3QgcmVxdWVzdGVkSW5kZXggPSBsZXZlbHMuaW5kZXhPZihyZXF1ZXN0ZWRMZXZlbCBhcyBQcml2YWN5TGV2ZWwpO1xuICAgIFxuICAgIC8vIENhbiBvbmx5IGFjY2VzcyBlbnRyaWVzIGF0IG9yIGJlbG93IHRoZSByZXF1ZXN0ZWQgcHJpdmFjeSBsZXZlbFxuICAgIC8vIGUuZy4sIGlmIHJlcXVlc3RpbmcgJ3ByaXZhdGUnLCBjYW4gc2VlICdwdWJsaWMnIGFuZCAncHJpdmF0ZScgYnV0IG5vdCAnc2Vuc2l0aXZlJ1xuICAgIHJldHVybiBlbnRyeUluZGV4IDw9IHJlcXVlc3RlZEluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkRW50cnkoZW50cnk6IHVua25vd24pOiBlbnRyeSBpcyBNZW1vcnlFbnRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIGVudHJ5ICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgKGVudHJ5IGFzIGFueSkuaWQgPT09ICdzdHJpbmcnICYmXG4gICAgICB0eXBlb2YgKGVudHJ5IGFzIGFueSkuY29udGVudCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIChlbnRyeSBhcyBhbnkpLnRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoIShlbnRyeSBhcyBhbnkpLnRhZ3MgfHwgQXJyYXkuaXNBcnJheSgoZW50cnkgYXMgYW55KS50YWdzKSk7XG4gIH1cblxuICAvKipcbiAgICogT3B0aW1pemVkIHNhbml0aXphdGlvbiB3aXRoIGNoZWNrc3VtIGNhY2hpbmdcbiAgICogQXZvaWRzIHJlLXNhbml0aXppbmcgY29udGVudCB0aGF0IGhhc24ndCBjaGFuZ2VkXG4gICAqIEBwYXJhbSBjb250ZW50IENvbnRlbnQgdG8gc2FuaXRpemVcbiAgICogQHBhcmFtIG1heExlbmd0aCBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoXG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBjb250ZW50XG4gICAqL1xuICBwcml2YXRlIHNhbml0aXplV2l0aENhY2hlKGNvbnRlbnQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIC8vIEdlbmVyYXRlIGNoZWNrc3VtIGZvciB0aGUgaW5wdXRcbiAgICBjb25zdCBjaGVja3N1bSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoY29udGVudCkuZGlnZXN0KCdoZXgnKTtcblxuICAgIC8vIENoZWNrIGlmIHdlJ3ZlIGFscmVhZHkgc2FuaXRpemVkIHRoaXMgZXhhY3QgY29udGVudFxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y2hlY2tzdW19OiR7bWF4TGVuZ3RofWA7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zYW5pdGl6YXRpb25DYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBzYW5pdGl6YXRpb25cbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZU1lbW9yeUNvbnRlbnQoY29udGVudCwgbWF4TGVuZ3RoKTtcblxuICAgIC8vIENhY2hlIHRoZSByZXN1bHQgKGxpbWl0IGNhY2hlIHNpemUgdG8gcHJldmVudCBtZW1vcnkgaXNzdWVzKVxuICAgIGlmICh0aGlzLnNhbml0aXphdGlvbkNhY2hlLnNpemUgPiAxMDAwKSB7XG4gICAgICAvLyBSZW1vdmUgb2xkZXN0IGVudHJpZXMgKHNpbXBsZSBGSUZPKVxuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLnNhbml0aXphdGlvbkNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkpIHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUuZGVsZXRlKGZpcnN0S2V5KTtcbiAgICB9XG4gICAgdGhpcy5zYW5pdGl6YXRpb25DYWNoZS5zZXQoY2FjaGVLZXksIHNhbml0aXplZCk7XG5cbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHNlYXJjaCBpbmRleCB3aXRoIHJldHJ5IGxvZ2ljXG4gICAqIEF0dGVtcHRzIHRvIGJ1aWxkIHRoZSBpbmRleCB1cCB0byAzIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICAgKiBUaGlzIGVuc3VyZXMgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgZXZlbiBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkU2VhcmNoSW5kZXhXaXRoUmV0cnkocmV0cmllcyA9IDMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IHJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZWFyY2hJbmRleC5idWlsZEluZGV4KHRoaXMuZW50cmllcyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgU2VhcmNoIGluZGV4IGJ1aWx0IHN1Y2Nlc3NmdWxseSBvbiBhdHRlbXB0ICR7YXR0ZW1wdH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xuICAgICAgICBsb2dnZXIud2FybihgU2VhcmNoIGluZGV4IGJ1aWxkIGF0dGVtcHQgJHthdHRlbXB0fSBmYWlsZWRgLCB7XG4gICAgICAgICAgZXJyb3I6IGxhc3RFcnJvci5tZXNzYWdlLFxuICAgICAgICAgIGVudHJpZXNDb3VudDogdGhpcy5lbnRyaWVzU2l6ZVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXR0ZW1wdCA8IHJldHJpZXMpIHtcbiAgICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmOiAxMDBtcywgMjAwbXMsIDQwMG1zXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSkgKiAxMDA7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIHJldHJpZXMgZmFpbGVkXG4gICAgdGhyb3cgbGFzdEVycm9yIHx8IG5ldyBFcnJvcignRmFpbGVkIHRvIGJ1aWxkIHNlYXJjaCBpbmRleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZW50cmllcyB3aXRoIGEgc3BlY2lmaWMgdHJ1c3QgbGV2ZWxcbiAgICogRklYICMxMzIwOiBQdWJsaWMgQVBJIGZvciBhY2Nlc3NpbmcgZW50cmllcyBieSB0cnVzdCBsZXZlbFxuICAgKiBVc2VkIGJ5IEJhY2tncm91bmRWYWxpZGF0b3IgdG8gZmluZCB1bnRydXN0ZWQgZW50cmllc1xuICAgKlxuICAgKiBAcGFyYW0gdHJ1c3RMZXZlbCAtIFRoZSB0cnVzdCBsZXZlbCB0byBmaWx0ZXIgYnlcbiAgICogQHJldHVybnMgQXJyYXkgb2YgbWVtb3J5IGVudHJpZXMgbWF0Y2hpbmcgdGhlIHRydXN0IGxldmVsXG4gICAqL1xuICBwdWJsaWMgZ2V0RW50cmllc0J5VHJ1c3RMZXZlbCh0cnVzdExldmVsOiBUcnVzdExldmVsKTogTWVtb3J5RW50cnlbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50cnVzdExldmVsID09PSB0cnVzdExldmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGVudHJpZXMgaW4gdGhpcyBtZW1vcnlcbiAgICogRklYICMxMzIwOiBQdWJsaWMgQVBJIGZvciBhY2Nlc3NpbmcgYWxsIGVudHJpZXNcbiAgICogUmVwbGFjZXMgdGhlIG5lZWQgZm9yIGAobWVtb3J5IGFzIGFueSkuZW50cmllc2AgaGFja3NcbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2YgYWxsIG1lbW9yeSBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsRW50cmllcygpOiBNZW1vcnlFbnRyeVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZW50cmllcyBtYXAgZGlyZWN0bHlcbiAgICogVXNlZCBieSBSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlIGZvciByZXRlbnRpb24gZW5mb3JjZW1lbnQgKElzc3VlICM1MSlcbiAgICpcbiAgICogQHJldHVybnMgTWFwIG9mIGVudHJ5IElEIHRvIG1lbW9yeSBlbnRyeVxuICAgKi9cbiAgcHVibGljIGdldEVudHJpZXMoKTogTWFwPHN0cmluZywgTWVtb3J5RW50cnk+IHtcbiAgICAvLyBSZXR1cm4gYSBuZXcgTWFwIHRvIHByZXZlbnQgZXh0ZXJuYWwgbW9kaWZpY2F0aW9uIG9mIGludGVybmFsIHN0YXRlXG4gICAgcmV0dXJuIG5ldyBNYXAodGhpcy5lbnRyaWVzLmVudHJpZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgc3BlY2lmaWMgZW50cnkgYnkgSURcbiAgICogRklYICM1MTogUHVibGljIEFQSSBmb3IgcmV0ZW50aW9uIHBvbGljeSB0byByZW1vdmUgZXhwaXJlZCBlbnRyaWVzXG4gICAqIFJlcGxhY2VzIHRoZSBuZWVkIGZvciBgKG1lbW9yeSBhcyBhbnkpLmVudHJpZXMuZGVsZXRlKClgIGhhY2tzXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeUlkIC0gVGhlIElEIG9mIHRoZSBlbnRyeSB0byByZW1vdmVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBlbnRyeSB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGZvdW5kXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnlJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5kZWxldGUoZW50cnlJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGl0ZXJhdG9yIG92ZXIgYWxsIGVudHJpZXNcbiAgICogRklYICMxMzIwOiBNZW1vcnktZWZmaWNpZW50IHdheSB0byBpdGVyYXRlIGVudHJpZXNcbiAgICpcbiAgICogQHJldHVybnMgSXRlcmF0b3Igb3ZlciBtZW1vcnkgZW50cmllc1xuICAgKi9cbiAgcHVibGljICpnZXRFbnRyaWVzSXRlcmF0b3IoKTogSXRlcmFibGVJdGVyYXRvcjxNZW1vcnlFbnRyeT4ge1xuICAgIHlpZWxkKiB0aGlzLmVudHJpZXMudmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBmaWxlIHBhdGggZm9yIHRoaXMgbWVtb3J5XG4gICAqIEZJWCAjMTMyMDogVXNlZCBieSBNZW1vcnlNYW5hZ2VyIGFmdGVyIGxvYWRpbmdcbiAgICogRklYIChTb25hckNsb3VkKTogQWRkZWQgaW5wdXQgdmFsaWRhdGlvbiB3aXRoIHByb3BlciBlcnJvciB0eXBlc1xuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBmaWxlIHBhdGggd2hlcmUgdGhpcyBtZW1vcnkgaXMgc3RvcmVkXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcGF0aCBpcyBub3QgYSBzdHJpbmdcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHBhdGggaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBzZXRGaWxlUGF0aChwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNZW1vcnkgZmlsZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKHBhdGgudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgZmlsZSBwYXRoIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cbiAgICB0aGlzLmZpbGVQYXRoID0gcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgcGF0aCBmb3IgdGhpcyBtZW1vcnlcbiAgICogRklYICMxMzIwOiBSZXR1cm5zIHRoZSBwYXRoIHdoZXJlIHRoaXMgbWVtb3J5IGlzIHN0b3JlZFxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSBwYXRoLCBvciB1bmRlZmluZWQgaWYgbm90IHlldCBwZXJzaXN0ZWRcbiAgICovXG4gIHB1YmxpYyBnZXRGaWxlUGF0aCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbGVQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhpcyBtZW1vcnkgdG8gZGlza1xuICAgKiBGSVggIzEzMjA6IEluc3RhbmNlIG1ldGhvZCBmb3IgcGVyc2lzdGluZyBtZW1vcnkgY2hhbmdlc1xuICAgKiBVc2VkIGJ5IEJhY2tncm91bmRWYWxpZGF0b3IgdG8gc2F2ZSB1cGRhdGVkIHRydXN0IGxldmVsc1xuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzYXZlIGlzIGNvbXBsZXRlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBtZW1vcnkgaGFzIG5vdCBiZWVuIGxvYWRlZCBmcm9tIGZpbGUgYW5kIG5vIHBhdGggaXMgc2V0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gTWVtb3J5LmdldE1lbW9yeU1hbmFnZXIoKTtcbiAgICBhd2FpdCBtYW5hZ2VyLnNhdmUodGhpcywgdGhpcy5maWxlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbGwgbWVtb3JpZXMgdGhhdCBoYXZlIGVudHJpZXMgd2l0aCBhIHNwZWNpZmljIHRydXN0IGxldmVsXG4gICAqIEZJWCAjMTMyMDogU3RhdGljIHF1ZXJ5IEFQSSBmb3IgZmluZGluZyBtZW1vcmllcyBieSB0cnVzdCBsZXZlbFxuICAgKiBVc2VkIGJ5IEJhY2tncm91bmRWYWxpZGF0b3IgdG8gZGlzY292ZXIgdW50cnVzdGVkIG1lbW9yaWVzXG4gICAqXG4gICAqIEBwYXJhbSB0cnVzdExldmVsIC0gVGhlIHRydXN0IGxldmVsIHRvIGZpbHRlciBieVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHF1ZXJ5IG9wdGlvbnNcbiAgICogQHBhcmFtIG9wdGlvbnMubGltaXQgLSBNYXhpbXVtIG51bWJlciBvZiBtZW1vcmllcyB0byByZXR1cm5cbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYXJyYXkgb2YgbWVtb3JpZXMgd2l0aCBtYXRjaGluZyBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmRCeVRydXN0TGV2ZWwoXG4gICAgdHJ1c3RMZXZlbDogVHJ1c3RMZXZlbCxcbiAgICBvcHRpb25zPzogeyBsaW1pdD86IG51bWJlciB9XG4gICk6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gTWVtb3J5LmdldE1lbW9yeU1hbmFnZXIoKTtcblxuICAgIC8vIExvYWQgYWxsIG1lbW9yaWVzIGFuZCBmaWx0ZXIgYnkgdHJ1c3QgbGV2ZWxcbiAgICBjb25zdCBhbGxNZW1vcmllcyA9IGF3YWl0IG1hbmFnZXIubGlzdCgpO1xuICAgIGNvbnN0IG1hdGNoaW5nTWVtb3JpZXM6IE1lbW9yeVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IG1lbW9yeSBvZiBhbGxNZW1vcmllcykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBtZW1vcnkgaGFzIGFueSBlbnRyaWVzIHdpdGggdGhlIHNwZWNpZmllZCB0cnVzdCBsZXZlbFxuICAgICAgY29uc3QgaGFzTWF0Y2hpbmdFbnRyaWVzID0gbWVtb3J5LmdldEVudHJpZXNCeVRydXN0TGV2ZWwodHJ1c3RMZXZlbCkubGVuZ3RoID4gMDtcblxuICAgICAgaWYgKGhhc01hdGNoaW5nRW50cmllcykge1xuICAgICAgICBtYXRjaGluZ01lbW9yaWVzLnB1c2gobWVtb3J5KTtcblxuICAgICAgICAvLyBBcHBseSBsaW1pdCBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKG9wdGlvbnM/LmxpbWl0ICYmIG1hdGNoaW5nTWVtb3JpZXMubGVuZ3RoID49IG9wdGlvbnMubGltaXQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgbWVtb3JpZXMgd2l0aCB0cnVzdCBsZXZlbCcsIHtcbiAgICAgIHRydXN0TGV2ZWwsXG4gICAgICBjb3VudDogbWF0Y2hpbmdNZW1vcmllcy5sZW5ndGgsXG4gICAgICBsaW1pdDogb3B0aW9ucz8ubGltaXRcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXRjaGluZ01lbW9yaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYWwgcXVlcnkgQVBJIGZvciBmaW5kaW5nIG1lbW9yaWVzXG4gICAqIEZJWCAjMTMyMDogRmxleGlibGUgcXVlcnkgQVBJIGZvciBtdWx0aXBsZSBjcml0ZXJpYVxuICAgKiBGSVggKFNvbmFyQ2xvdWQpOiBSZWZhY3RvcmVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eSBmcm9tIDIwIHRvIDhcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIFF1ZXJ5IGZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gZmlsdGVyLnRydXN0TGV2ZWwgLSBGaWx0ZXIgYnkgdHJ1c3QgbGV2ZWxcbiAgICogQHBhcmFtIGZpbHRlci50YWdzIC0gRmlsdGVyIGJ5IHRhZ3NcbiAgICogQHBhcmFtIGZpbHRlci5tYXhBZ2UgLSBGaWx0ZXIgYnkgYWdlIGluIGRheXNcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYXJyYXkgb2YgbWF0Y2hpbmcgbWVtb3JpZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZChmaWx0ZXI6IHtcbiAgICB0cnVzdExldmVsPzogVHJ1c3RMZXZlbDtcbiAgICB0YWdzPzogc3RyaW5nW107XG4gICAgbWF4QWdlPzogbnVtYmVyO1xuICB9KTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBNZW1vcnkuZ2V0TWVtb3J5TWFuYWdlcigpO1xuXG4gICAgLy8gTG9hZCBhbGwgbWVtb3JpZXNcbiAgICBjb25zdCBhbGxNZW1vcmllcyA9IGF3YWl0IG1hbmFnZXIubGlzdCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGN1dG9mZiBkYXRlIGlmIG1heEFnZSBpcyBzcGVjaWZpZWRcbiAgICBjb25zdCBjdXRvZmZEYXRlID0gZmlsdGVyLm1heEFnZVxuICAgICAgPyBuZXcgRGF0ZShEYXRlLm5vdygpIC0gZmlsdGVyLm1heEFnZSAqIDI0ICogNjAgKiA2MCAqIDEwMDApXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIEZpbHRlciBtZW1vcmllcyB1c2luZyBoZWxwZXIgbWV0aG9kXG4gICAgY29uc3QgcmVzdWx0cyA9IGFsbE1lbW9yaWVzLmZpbHRlcihtZW1vcnkgPT5cbiAgICAgIHRoaXMubWF0Y2hlc0ZpbHRlcihtZW1vcnksIGZpbHRlciwgY3V0b2ZmRGF0ZSlcbiAgICApO1xuXG4gICAgbG9nZ2VyLmRlYnVnKCdNZW1vcnkgcXVlcnkgY29tcGxldGUnLCB7XG4gICAgICBmaWx0ZXIsXG4gICAgICByZXN1bHRDb3VudDogcmVzdWx0cy5sZW5ndGhcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbWVtb3J5IG1hdGNoZXMgdGhlIGdpdmVuIGZpbHRlciBjcml0ZXJpYVxuICAgKiBGSVggKFNvbmFyQ2xvdWQpOiBFeHRyYWN0ZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBtYXRjaGVzRmlsdGVyKFxuICAgIG1lbW9yeTogTWVtb3J5LFxuICAgIGZpbHRlcjogeyB0cnVzdExldmVsPzogVHJ1c3RMZXZlbDsgdGFncz86IHN0cmluZ1tdOyBtYXhBZ2U/OiBudW1iZXIgfSxcbiAgICBjdXRvZmZEYXRlPzogRGF0ZVxuICApOiBib29sZWFuIHtcbiAgICAvLyBGaWx0ZXIgYnkgdHJ1c3QgbGV2ZWxcbiAgICBpZiAoZmlsdGVyLnRydXN0TGV2ZWwpIHtcbiAgICAgIGNvbnN0IGhhc01hdGNoaW5nVHJ1c3RMZXZlbCA9IG1lbW9yeS5nZXRFbnRyaWVzQnlUcnVzdExldmVsKGZpbHRlci50cnVzdExldmVsKS5sZW5ndGggPiAwO1xuICAgICAgaWYgKCFoYXNNYXRjaGluZ1RydXN0TGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbHRlciBieSB0YWdzXG4gICAgaWYgKGZpbHRlci50YWdzICYmIGZpbHRlci50YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1lbW9yeVRhZ3MgPSBtZW1vcnkubWV0YWRhdGEudGFncyB8fCBbXTtcbiAgICAgIGNvbnN0IGhhc01hdGNoaW5nVGFnID0gZmlsdGVyLnRhZ3Muc29tZSh0YWcgPT4gbWVtb3J5VGFncy5pbmNsdWRlcyh0YWcpKTtcbiAgICAgIGlmICghaGFzTWF0Y2hpbmdUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbHRlciBieSBhZ2VcbiAgICBpZiAoY3V0b2ZmRGF0ZSkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBtZW1vcnkuZ2V0U3RhdHMoKTtcbiAgICAgIGlmICghc3RhdHMubmV3ZXN0RW50cnkgfHwgc3RhdHMubmV3ZXN0RW50cnkgPCBjdXRvZmZEYXRlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryManager.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/MemoryManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAMnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAIpE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAQpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAGrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAItE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AA4DvE,qBAAa,aAAc,SAAQ,kBAAkB,CAAC,MAAM,CAAC;IA4BzD,OAAO,CAAC,eAAe;IA3BzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,gBAAgB,CAKrB;IACH,OAAO,CAAC,iBAAiB,CAKtB;IACH,OAAO,CAAC,wBAAwB,CAA2B;IAC3D,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,oBAAoB,CAAuB;IAGnD,OAAO,CAAC,iBAAiB,CAA0B;gBAGjD,gBAAgB,EAAE,gBAAgB,EAClC,eAAe,EAAE,eAAe,EAChC,qBAAqB,EAAE,qBAAqB,EAC5C,kBAAkB,EAAE,kBAAkB,EACtC,oBAAoB,EAAE,oBAAoB,EAClC,eAAe,EAAE,eAAe,EACxC,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,YAAY,CAAC,EAAE,OAAO,kCAAkC,EAAE,iBAAiB,EAC3E,aAAa,CAAC,EAAE,OAAO,iCAAiC,EAAE,aAAa;IASzE;;OAEG;cACgB,kBAAkB,CAAC,qBAAqB,EAAE,qBAAqB,GAAG,aAAa;cAW/E,eAAe,IAAI,MAAM;cAMnB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;cACvC,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC;IAErE;;;OAGG;IACM,UAAU,IAAI,IAAI;IAM3B;;;OAGG;IACM,OAAO,IAAI,IAAI;IAQxB;;;;;OAKG;YACW,iBAAiB;IA+B/B;;;;;;;;;OASG;IACY,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqHtD;;;OAGG;YACW,gBAAgB;IAiB9B;;;;OAIG;YACW,qBAAqB;IAoCnC;;;;;;;;;;OAUG;YACW,kBAAkB;IAqChC;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAU7B;;;OAGG;YACW,qBAAqB;IAanC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;;;;OAKG;YACW,cAAc;IAe5B;;;;;;;;;OASG;IACY,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyItE;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAezB;;;;;;OAMG;IACY,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA4DxC;;;;;;OAMG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAsCzG;;;;;OAKG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA2B1F;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK5C;;;;;;;OAOG;IACG,oBAAoB,CACxB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,GACxE,OAAO,CAAC;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,gBAAgB,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC9E,YAAY,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtD,CAAC;IAqFF;;;;;;;;;OASG;IACG,uBAAuB,CAC3B,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,GAAE,OAAe,EACvB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,GACxE,OAAO,CAAC;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,YAAY,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtD,CAAC;IAkGF;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA2BhC;;;;OAIG;YACW,0BAA0B;IA+CxC;;;;OAIG;YACW,cAAc;IAmB5B;;;;OAIG;YACW,oBAAoB;IAoBlC;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC;QAC7B,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAClD,CAAC;IA0BF;;;;;;;OAOG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAqC9C;;;;;;;;;OASG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8J1C;;OAEG;IACY,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKzF;;OAEG;IACY,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKnF;;;OAGG;IACY,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6CtD;;OAEG;IACY,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASzD;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAoD9G;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;;;OAIG;YACW,sBAAsB;IA8CpC;;;;;;;;;;OAUG;IACY,aAAa,CAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAM,GAAG,MAAM,GAAG,UAAmB,GAC5C,OAAO,CAAC,MAAM,CAAC;IAqClB;;OAEG;IACY,aAAa,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAM,GAAG,MAAM,GAAG,UAAmB,GAC5C,OAAO,CAAC,MAAM,CAAC;cA6BO,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;cAKvD,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;cAU3D,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkC3E;;OAEG;IACM,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IAI3D;;;OAGG;IACM,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAqBhD;;OAEG;IACM,cAAc,IAAI,WAAW;IAItC;;OAEG;IACM,gBAAgB,IAAI,MAAM;IAMnC;;;;;;;;OAQG;YACW,sBAAsB;IAuCpC,OAAO,CAAC,eAAe;IAqFvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;;;;OAKG;IACI,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAU9C;;;;;;;;;;;;;OAaG;IACG,+BAA+B,IAAI,OAAO,CAAC;QAC/C,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CAqIH"}
1
+ {"version":3,"file":"MemoryManager.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/MemoryManager.ts"],"names":[],"mappings":"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"}