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

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 (229) hide show
  1. package/CHANGELOG.md +52 -61
  2. package/README.github.md +2 -2
  3. package/README.md +284 -224
  4. package/README.md.backup +284 -224
  5. package/README.npm.md +284 -224
  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/web/public/public/app.js +0 -1878
@@ -443,12 +443,6 @@ export class DefaultElementProvider {
443
443
  const bufferHits = DefaultElementProvider.bufferPoolStats.hits;
444
444
  const bufferMisses = DefaultElementProvider.bufferPoolStats.misses;
445
445
  const totalRequests = bufferHits + bufferMisses;
446
- DefaultElementProvider.logListener?.('debug', 'Report buffer pool stats', {
447
- hits: bufferHits,
448
- misses: bufferMisses,
449
- hitRate: totalRequests > 0 ? bufferHits / totalRequests : 0,
450
- poolSize: DefaultElementProvider.bufferPool.length,
451
- });
452
446
  return {
453
447
  bufferPool: {
454
448
  hits: bufferHits,
@@ -992,4 +986,4 @@ export class DefaultElementProvider {
992
986
  }
993
987
  }
994
988
  }
995
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vRGVmYXVsdEVsZW1lbnRQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxxR0FBcUc7QUFDckcseUdBQXlHO0FBQ3pHLDZGQUE2RjtBQUM3RixPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR25FLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsZ0NBQWdDO0lBQ2pFLGtCQUFrQixFQUFFLFFBQVE7SUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxzQ0FBc0M7Q0FDcEQsQ0FBQztBQUVYLDZCQUE2QjtBQUM3QixzRUFBc0U7QUFDdEUsTUFBTSxtQkFBbUIsR0FB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QzNCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSwwQ0FBMEM7Z0JBQ2xELE9BQU8sRUFBRSx5Q0FBeUMsV0FBVyxtQkFBbUI7Z0JBQ2hGLFFBQVEsRUFBRTtvQkFDUixnQkFBZ0I7b0JBQ2hCLE9BQU87b0JBQ1AsWUFBWTtpQkFDYjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyx1RkFBdUYsQ0FBQyxDQUFDO1FBQ3ZHLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyIC0gUG9wdWxhdGVzIHBvcnRmb2xpbyB3aXRoIGRlZmF1bHQgZWxlbWVudHMgZnJvbSBidW5kbGVkIGRhdGFcbiAqIFxuICogVGhpcyBjbGFzcyBoYW5kbGVzIGNvcHlpbmcgZGVmYXVsdCBwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFuZCBvdGhlciBlbGVtZW50c1xuICogZnJvbSB0aGUgTlBNIHBhY2thZ2Ugb3IgR2l0IHJlcG9zaXRvcnkgdG8gdGhlIHVzZXIncyBwb3J0Zm9saW8gb24gZmlyc3QgcnVuLlxuICogSXQgZW5zdXJlcyB1c2VycyBoYXZlIGV4YW1wbGUgY29udGVudCB0byB3b3JrIHdpdGggaW1tZWRpYXRlbHkgYWZ0ZXIgaW5zdGFsbGF0aW9uLlxuICovXG5cbi8vIE5PVEU6IGZzU3luYyBpcyBpbnRlbnRpb25hbGx5IGtlcHQgZm9yIHN5bmNocm9ub3VzIGRldmVsb3BtZW50IG1vZGUgZGV0ZWN0aW9uIGF0IG1vZHVsZSBsb2FkIHRpbWUuXG4vLyBUaGUgSVNfREVWRUxPUE1FTlRfTU9ERSBjaGVjayBydW5zIGR1cmluZyBtb2R1bGUgaW5pdGlhbGl6YXRpb24gYmVmb3JlIGFzeW5jIG9wZXJhdGlvbnMgYXJlIGF2YWlsYWJsZS5cbi8vIEFsbCBvdGhlciBmaWxlIG9wZXJhdGlvbnMgdXNlIEZpbGVPcGVyYXRpb25zU2VydmljZSBmb3IgY2VudHJhbGl6ZWQsIHNlY3VyZSBmaWxlIGhhbmRsaW5nLlxuaW1wb3J0ICogYXMgZnNTeW5jIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcblxuLy8gRmlsZSBvcGVyYXRpb24gY29uc3RhbnRzXG5leHBvcnQgY29uc3QgRklMRV9DT05TVEFOVFMgPSB7XG4gIEVMRU1FTlRfRVhURU5TSU9OOiAnLm1kJyxcbiAgWUFNTF9FWFRFTlNJT046ICcueWFtbCcsXG4gIFlNTF9FWFRFTlNJT046ICcueW1sJyxcbiAgSlNPTl9FWFRFTlNJT046ICcuanNvbicsXG4gIE1BWF9GSUxFX1NJWkU6IDEwICogMTAyNCAqIDEwMjQsIC8vIDEwTUIgbWF4IGZpbGUgc2l6ZSBmb3Igc2FmZXR5XG4gIENIRUNLU1VNX0FMR09SSVRITTogJ3NoYTI1NicsXG4gIEZJTEVfUEVSTUlTU0lPTlM6IDBvNjQ0LFxuICBDSFVOS19TSVpFOiA2NCAqIDEwMjQgLy8gNjRLQiBjaHVua3MgZm9yIHJlYWRpbmcgbGFyZ2UgZmlsZXNcbn0gYXMgY29uc3Q7XG5cbi8vIERldmVsb3BtZW50IG1vZGUgZGV0ZWN0aW9uXG4vLyBXaGVuIHJ1bm5pbmcgZnJvbSBhIGdpdCBjbG9uZSwgd2UgZG9uJ3Qgd2FudCB0byBhdXRvLWxvYWQgdGVzdCBkYXRhXG5jb25zdCBJU19ERVZFTE9QTUVOVF9NT0RFID0gKCgpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBhIGdpdCByZXBvc2l0b3J5IChkZXZlbG9wbWVudCBtb2RlKVxuICAgIGNvbnN0IGdpdERpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLmdpdCcpO1xuICAgIHJldHVybiBmc1N5bmMuZXhpc3RzU3luYyhnaXREaXIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn0pKCk7XG5cbi8vIEludGVybmFsIGNvbnN0YW50c1xuY29uc3QgQ09QWV9SRVRSWV9BVFRFTVBUUyA9IDM7XG5jb25zdCBDT1BZX1JFVFJZX0RFTEFZID0gMTAwOyAvLyBtc1xuXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb25maWcge1xuICAvKiogQ3VzdG9tIGRhdGEgZGlyZWN0b3J5IHBhdGhzIHRvIHNlYXJjaCAoY2hlY2tlZCBiZWZvcmUgZGVmYXVsdCBwYXRocykgKi9cbiAgY3VzdG9tRGF0YVBhdGhzPzogc3RyaW5nW107XG4gIC8qKiBXaGV0aGVyIHRvIHVzZSBkZWZhdWx0IHNlYXJjaCBwYXRocyBhZnRlciBjdXN0b20gcGF0aHMgKi9cbiAgdXNlRGVmYXVsdFBhdGhzPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdG8gbG9hZCB0ZXN0L2V4YW1wbGUgZGF0YSBmcm9tIHJlcG9zaXRvcnkgKGRlZmF1bHQ6IGZhbHNlIGluIGRldiBtb2RlKSAqL1xuICBsb2FkVGVzdERhdGE/OiBib29sZWFuO1xuICAvKiogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIGZvciBjZW50cmFsaXplZCBmaWxlIG9wZXJhdGlvbnMgKi9cbiAgZmlsZU9wZXJhdGlvbnM/OiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xufVxuXG4vLyBQRVJGT1JNQU5DRTogTWV0YWRhdGEgY2FjaGUgd2l0aCBtdGltZS1iYXNlZCBpbnZhbGlkYXRpb25cbmludGVyZmFjZSBNZXRhZGF0YUNhY2hlRW50cnkge1xuICBtZXRhZGF0YTogYW55O1xuICBtdGltZTogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0RWxlbWVudFByb3ZpZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfX2Rpcm5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBzdGF0aWMgY2FjaGVkRGF0YURpcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIHBvcHVsYXRlSW5Qcm9ncmVzczogTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVPcGVyYXRpb25zPzogSUZpbGVPcGVyYXRpb25zU2VydmljZTtcbiAgcHJpdmF0ZSBzdGF0aWMgbG9nTGlzdGVuZXI/OiAobGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcblxuICBzdGF0aWMgYWRkTG9nTGlzdGVuZXIoZm46IChsZXZlbDogJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5sb2dMaXN0ZW5lciA9IGZuO1xuICAgIHJldHVybiAoKSA9PiB7IHRoaXMubG9nTGlzdGVuZXIgPSB1bmRlZmluZWQ7IH07XG4gIH1cblxuICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT046IENhY2hlIG1ldGFkYXRhIHdpdGggZmlsZSBtdGltZSBmb3IgaW52YWxpZGF0aW9uXG4gIHByaXZhdGUgc3RhdGljIG1ldGFkYXRhQ2FjaGU6IE1hcDxzdHJpbmcsIE1ldGFkYXRhQ2FjaGVFbnRyeT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9DQUNIRV9TSVpFID0gMjA7IC8vIE1FTU9SWSBMRUFLIEZJWDogRnVydGhlciByZWR1Y2VkIGNhY2hlIHNpemUgdG8gcHJldmVudCBhY2N1bXVsYXRpb24gZHVyaW5nIHBlcmZvcm1hbmNlIHRlc3RzXG5cbiAgY29uc3RydWN0b3IoY29uZmlnPzogRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbmZpZykge1xuICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG4gICAgdGhpcy5fX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoX19maWxlbmFtZSk7XG5cbiAgICAvLyBTdG9yZSBmaWxlT3BlcmF0aW9ucyBzZXJ2aWNlIGlmIHByb3ZpZGVkXG4gICAgdGhpcy5maWxlT3BlcmF0aW9ucyA9IGNvbmZpZz8uZmlsZU9wZXJhdGlvbnM7XG4gICAgXG4gICAgLy8gQ2hlY2sgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHRlc3QgZGF0YSBsb2FkaW5nXG4gICAgY29uc3QgZW52TG9hZFRlc3REYXRhID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0xPQURfVEVTVF9EQVRBO1xuICAgIGNvbnN0IGxvYWRUZXN0RGF0YUZyb21FbnYgPSBlbnZMb2FkVGVzdERhdGEgPT09ICd0cnVlJyB8fCBlbnZMb2FkVGVzdERhdGEgPT09ICcxJztcbiAgICBjb25zdCBkaXNhYmxlVGVzdERhdGFGcm9tRW52ID0gZW52TG9hZFRlc3REYXRhID09PSAnZmFsc2UnIHx8IGVudkxvYWRUZXN0RGF0YSA9PT0gJzAnO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGRldmVsb3BtZW50IG1vZGUgKHdpdGggcmVzcGVjdCB0byBGT1JDRV9QUk9EVUNUSU9OX01PREUgb3ZlcnJpZGUpXG4gICAgY29uc3QgaXNEZXZNb2RlID0gKCgpID0+IHtcbiAgICAgIC8vIFJlc3BlY3QgRk9SQ0VfUFJPRFVDVElPTl9NT0RFIG92ZXJyaWRlIGZpcnN0XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuRk9SQ0VfUFJPRFVDVElPTl9NT0RFID09PSAndHJ1ZScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGb3JjZSBwcm9kdWN0aW9uIG1vZGVcbiAgICAgIH1cbiAgICAgIGlmIChwcm9jZXNzLmVudi5GT1JDRV9QUk9EVUNUSU9OX01PREUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIEZvcmNlIGRldmVsb3BtZW50IG1vZGVcbiAgICAgIH1cbiAgICAgIC8vIEZhbGwgYmFjayB0byBnaXQgZGV0ZWN0aW9uXG4gICAgICByZXR1cm4gSVNfREVWRUxPUE1FTlRfTU9ERTtcbiAgICB9KSgpO1xuICAgIFxuICAgIC8vIERldGVybWluZSBsb2FkVGVzdERhdGEgdmFsdWVcbiAgICBsZXQgY29tcHV0ZWRMb2FkVGVzdERhdGE6IGJvb2xlYW47XG4gICAgaWYgKGxvYWRUZXN0RGF0YUZyb21FbnYpIHtcbiAgICAgIC8vIEVudmlyb25tZW50IGV4cGxpY2l0bHkgZW5hYmxlcyB0ZXN0IGRhdGFcbiAgICAgIGNvbXB1dGVkTG9hZFRlc3REYXRhID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRpc2FibGVUZXN0RGF0YUZyb21FbnYpIHtcbiAgICAgIC8vIEVudmlyb25tZW50IGV4cGxpY2l0bHkgZGlzYWJsZXMgdGVzdCBkYXRhXG4gICAgICBjb21wdXRlZExvYWRUZXN0RGF0YSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IGxvZ2ljOiBlbmFibGUgaW4gcHJvZHVjdGlvbiwgZGlzYWJsZSBpbiBkZXZlbG9wbWVudCB1bmxlc3MgY29uZmlnIG92ZXJyaWRlc1xuICAgICAgY29tcHV0ZWRMb2FkVGVzdERhdGEgPSAhaXNEZXZNb2RlICYmIChjb25maWc/LmxvYWRUZXN0RGF0YSA/PyB0cnVlKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB1c2VEZWZhdWx0UGF0aHM6IHRydWUsXG4gICAgICAuLi5jb25maWcsXG4gICAgICAvLyBBcHBseSBmaW5hbCBsb2FkVGVzdERhdGEgbG9naWMgLSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIGRldmVsb3BtZW50IG1vZGUgdGFrZSBwcmVjZWRlbmNlXG4gICAgICBsb2FkVGVzdERhdGE6IGxvYWRUZXN0RGF0YUZyb21FbnYgPyB0cnVlIDogZGlzYWJsZVRlc3REYXRhRnJvbUVudiA/IGZhbHNlIDogY29tcHV0ZWRMb2FkVGVzdERhdGFcbiAgICB9O1xuICAgIFxuICAgIGlmIChpc0Rldk1vZGUgJiYgIXRoaXMuY29uZmlnLmxvYWRUZXN0RGF0YSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBEZXZlbG9wbWVudCBtb2RlIGRldGVjdGVkIC0gdGVzdCBkYXRhIGxvYWRpbmcgZGlzYWJsZWQnKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gVG8gZW5hYmxlIHRlc3QgZGF0YSwgc2V0IERPTExIT1VTRV9MT0FEX1RFU1RfREFUQT10cnVlJyk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGxvYWRUZXN0RGF0YSBjb25maWd1cmF0aW9uIHZhbHVlXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGVzdCBkYXRhIGxvYWRpbmcgaXMgZW5hYmxlZFxuICAgKi9cbiAgcHVibGljIGdldCBpc1Rlc3REYXRhTG9hZGluZ0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmxvYWRUZXN0RGF0YSA/PyBmYWxzZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIHRoZSBzeXN0ZW0gaXMgaW4gZGV2ZWxvcG1lbnQgbW9kZVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHJ1bm5pbmcgaW4gZGV2ZWxvcG1lbnQgbW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0RldmVsb3BtZW50TW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gSVNfREVWRUxPUE1FTlRfTU9ERTtcbiAgfVxuXG4gIC8vID09PT09IEhFTFBFUiBNRVRIT0RTIEZPUiBGSUxFIE9QRVJBVElPTlMgPT09PT1cbiAgLy8gVGhlc2UgbWV0aG9kcyBwcm92aWRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2hlbiBmaWxlT3BlcmF0aW9ucyBpcyBub3QgaW5qZWN0ZWRcbiAgLy8gYW5kIGNlbnRyYWxpemUgYWxsIGZpbGUgc3lzdGVtIGNhbGxzIHRocm91Z2ggRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIHdoZW4gYXZhaWxhYmxlXG5cbiAgcHJpdmF0ZSBhc3luYyBzdGF0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxmc1N5bmMuU3RhdHM+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuc3RhdChmaWxlUGF0aCk7XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrOiBpbXBvcnQgZnMvcHJvbWlzZXMgZHluYW1pY2FsbHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIHJldHVybiBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbGlzdERpcihkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkoZGlyUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgcmV0dXJuIGZzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbGVFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHMoZmlsZVBhdGgpO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBtYWtlRGlyZWN0b3J5KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkoZGlyUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvcHlGaWxlT3Aoc291cmNlUGF0aDogc3RyaW5nLCBkZXN0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmNvcHlGaWxlKHNvdXJjZVBhdGgsIGRlc3RQYXRoLCB7XG4gICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29weUZpbGVPcCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2htb2RGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIG1vZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5jaG1vZChmaWxlUGF0aCwgbW9kZSwge1xuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNobW9kRmlsZSdcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIGF3YWl0IGZzLmNobW9kKGZpbGVQYXRoLCBtb2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlRmlsZU9wKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShmaWxlUGF0aCwgdW5kZWZpbmVkLCB7XG4gICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuZGVsZXRlRmlsZU9wJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgYXdhaXQgZnMudW5saW5rKGZpbGVQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZEZpbGVDb250ZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShmaWxlUGF0aCwge1xuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnJlYWRGaWxlQ29udGVudCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIHJldHVybiBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvLyA9PT09PSBFTkQgSEVMUEVSIE1FVEhPRFMgPT09PT1cblxuICAvKipcbiAgICogU2VhcmNoIHBhdGhzIGZvciBidW5kbGVkIGRhdGEgZGlyZWN0b3J5XG4gICAqIE9yZGVyZWQgYnkgcHJpb3JpdHkgLSBjdXN0b20gcGF0aHMgZmlyc3QsIHRoZW4gZGV2ZWxvcG1lbnQvZ2l0LCB0aGVuIE5QTSBsb2NhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgZ2V0IGRhdGFTZWFyY2hQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgLy8gQWRkIGN1c3RvbSBwYXRocyBmaXJzdCAoaGlnaGVzdCBwcmlvcml0eSlcbiAgICBpZiAodGhpcy5jb25maWcuY3VzdG9tRGF0YVBhdGhzKSB7XG4gICAgICBwYXRocy5wdXNoKC4uLnRoaXMuY29uZmlnLmN1c3RvbURhdGFQYXRocyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBkZWZhdWx0IHBhdGhzIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5jb25maWcudXNlRGVmYXVsdFBhdGhzICE9PSBmYWxzZSkge1xuICAgICAgLy8gU2tpcCBkZXZlbG9wbWVudC9yZXBvc2l0b3J5IGRhdGEgcGF0aHMgdW5sZXNzIHRlc3QgZGF0YSBsb2FkaW5nIGlzIGVuYWJsZWRcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEpIHtcbiAgICAgICAgLy8gRGV2ZWxvcG1lbnQvR2l0IGluc3RhbGxhdGlvbiAocmVsYXRpdmUgdG8gdGhpcyBmaWxlKVxuICAgICAgICBwYXRocy5wdXNoKFxuICAgICAgICAgIHBhdGguam9pbih0aGlzLl9fZGlybmFtZSwgJy4uLy4uL2RhdGEnKSxcbiAgICAgICAgICBwYXRoLmpvaW4odGhpcy5fX2Rpcm5hbWUsICcuLi8uLi8uLi9kYXRhJyksXG4gICAgICAgICAgLy8gQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAobGFzdCByZXNvcnQpXG4gICAgICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdkYXRhJylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWx3YXlzIGluY2x1ZGUgTlBNIGluc3RhbGxhdGlvbiBwYXRocyAodGhlc2Ugd291bGQgaGF2ZSBwcm9kdWN0aW9uIGRhdGEpXG4gICAgICBwYXRocy5wdXNoKFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIG1hY09TIEhvbWVicmV3XG4gICAgICAgICcvb3B0L2hvbWVicmV3L2xpYi9ub2RlX21vZHVsZXMvQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyL2RhdGEnLFxuICAgICAgICBcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBzdGFuZGFyZCBVbml4L0xpbnV4XG4gICAgICAgICcvdXNyL2xvY2FsL2xpYi9ub2RlX21vZHVsZXMvQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyL2RhdGEnLFxuICAgICAgICAnL3Vzci9saWIvbm9kZV9tb2R1bGVzL0Bkb2xsaG91c2VtY3AvbWNwLXNlcnZlci9kYXRhJyxcbiAgICAgICAgXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gV2luZG93c1xuICAgICAgICAnQzpcXFxcUHJvZ3JhbSBGaWxlc1xcXFxub2RlanNcXFxcbm9kZV9tb2R1bGVzXFxcXEBkb2xsaG91c2VtY3BcXFxcbWNwLXNlcnZlclxcXFxkYXRhJyxcbiAgICAgICAgJ0M6XFxcXFByb2dyYW0gRmlsZXMgKHg4NilcXFxcbm9kZWpzXFxcXG5vZGVfbW9kdWxlc1xcXFxAZG9sbGhvdXNlbWNwXFxcXG1jcC1zZXJ2ZXJcXFxcZGF0YScsXG4gICAgICAgIFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIFdpbmRvd3Mgd2l0aCBudm1cbiAgICAgICAgcGF0aC5qb2luKHByb2Nlc3MuZW52LkFQUERBVEEgfHwgJycsICducG0nLCAnbm9kZV9tb2R1bGVzJywgJ0Bkb2xsaG91c2VtY3AnLCAnbWNwLXNlcnZlcicsICdkYXRhJylcbiAgICAgICk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBwYXRocztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZpbmQgdGhlIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnkgYnkgY2hlY2tpbmcgZWFjaCBzZWFyY2ggcGF0aFxuICAgKiBVc2VzIFByb21pc2UuYWxsU2V0dGxlZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIGFuZCBjYWNoZXMgdGhlIHJlc3VsdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kRGF0YURpcmVjdG9yeSgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHZhbHVlIGlmIGF2YWlsYWJsZVxuICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXI7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGFsbCBwYXRocyBpbiBwYXJhbGxlbCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgY29uc3QgY2hlY2tQcm9taXNlcyA9IHRoaXMuZGF0YVNlYXJjaFBhdGhzLm1hcChhc3luYyAoc2VhcmNoUGF0aCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLnN0YXRGaWxlKHNlYXJjaFBhdGgpO1xuICAgICAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIC8vIFZlcmlmeSBpdCBjb250YWlucyBleHBlY3RlZCBzdWJkaXJlY3Rvcmllc1xuICAgICAgICAgIGNvbnN0IGhhc1BlcnNvbmFzID0gYXdhaXQgdGhpcy5kaXJlY3RvcnlFeGlzdHMocGF0aC5qb2luKHNlYXJjaFBhdGgsICdwZXJzb25hcycpKTtcbiAgICAgICAgICBjb25zdCBoYXNTa2lsbHMgPSBhd2FpdCB0aGlzLmRpcmVjdG9yeUV4aXN0cyhwYXRoLmpvaW4oc2VhcmNoUGF0aCwgJ3NraWxscycpKTtcbiAgICAgICAgICBpZiAoaGFzUGVyc29uYXMgfHwgaGFzU2tpbGxzKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VhcmNoUGF0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBEaXJlY3RvcnkgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBhY2Nlc3NlZFxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICAgIFxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2hlY2tQcm9taXNlcyk7XG4gICAgXG4gICAgLy8gRmluZCB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCByZXN1bHRcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgcmVzdWx0LnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRm91bmQgZGF0YSBkaXJlY3RvcnkgYXQ6ICR7cmVzdWx0LnZhbHVlfWApO1xuICAgICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0XG4gICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2FjaGVkRGF0YURpciA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLndhcm4oJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyBidW5kbGVkIGRhdGEgZGlyZWN0b3J5IGZvdW5kIGluIGFueSBzZWFyY2ggcGF0aCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogSGVscGVyIHRvIGNoZWNrIGlmIGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXJlY3RvcnlFeGlzdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5zdGF0RmlsZShkaXJQYXRoKTtcbiAgICAgIHJldHVybiBzdGF0cy5pc0RpcmVjdG9yeSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBmaWxlIHBhdGggdG8gcHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzXG4gICAqIFNFQ1VSSVRZIEZJWDogQWRkZWQgZmlsZSBwYXRoIHZhbGlkYXRpb24gdG8gcHJldmVudCBkaXJlY3RvcnkgdHJhdmVyc2FsXG4gICAqIFByZXZpb3VzbHk6IEZpbGUgcGF0aHMgd2VyZSB1c2VkIHdpdGhvdXQgdmFsaWRhdGlvbiwgYWxsb3dpbmcgcG90ZW50aWFsIC4uLy4uLy4uLyBhdHRhY2tzXG4gICAqIE5vdzogU3RyaWN0IHZhbGlkYXRpb24gZW5zdXJlcyBwYXRocyBzdGF5IHdpdGhpbiBhbGxvd2VkIGRpcmVjdG9yaWVzXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBUaGUgZmlsZSBwYXRoIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBhbGxvd2VkQmFzZVBhdGhzIEFycmF5IG9mIGFsbG93ZWQgYmFzZSBwYXRocyAob3B0aW9uYWwpXG4gICAqIEByZXR1cm5zIHRydWUgaWYgcGF0aCBpcyBzYWZlLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVGaWxlUGF0aChmaWxlUGF0aDogc3RyaW5nLCBhbGxvd2VkQmFzZVBhdGhzPzogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgLy8gU0VDVVJJVFk6IE5vcm1hbGl6ZSBwYXRoIHRvIHByZXZlbnQgdHJhdmVyc2FsIGF0dGVtcHRzXG4gICAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFk6IFJlamVjdCBwYXRocyBjb250YWluaW5nIHRyYXZlcnNhbCBwYXR0ZXJuc1xuICAgICAgaWYgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBibG9ja2VkOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBDaGVjayBmb3IgaG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uIGF0dGVtcHRzLCBidXQgYWxsb3cgV2luZG93cyA4LjMgc2hvcnQgcGF0aCBuYW1lc1xuICAgICAgLy8gV2luZG93cyBzaG9ydCBwYXRoIG5hbWVzIHVzZSB+IGZvbGxvd2VkIGJ5IGEgZGlnaXQgKGUuZy4sIFJVTk5FUn4xKSwgd2hpY2ggc2hvdWxkIGJlIGFsbG93ZWRcbiAgICAgIC8vIE9ubHkgYmxvY2sgfiBmb2xsb3dlZCBieSAvIG9yIFxcIChob21lIGRpcmVjdG9yeSBleHBhbnNpb24gcGF0dGVybnMpXG4gICAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJ34vJykgfHwgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJ35cXFxcJykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBIb21lIGRpcmVjdG9yeSBleHBhbnNpb24gYXR0ZW1wdCBibG9ja2VkOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBSZWplY3QgYWJzb2x1dGUgcGF0aHMgb3V0c2lkZSBhbGxvd2VkIGRpcmVjdG9yaWVzXG4gICAgICBpZiAocGF0aC5pc0Fic29sdXRlKG5vcm1hbGl6ZWRQYXRoKSAmJiBhbGxvd2VkQmFzZVBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGlzQWxsb3dlZCA9IGFsbG93ZWRCYXNlUGF0aHMuc29tZShiYXNlUGF0aCA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEJhc2UgPSBwYXRoLm5vcm1hbGl6ZShiYXNlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZEJhc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGlmICghaXNBbGxvd2VkKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBBYnNvbHV0ZSBwYXRoIG91dHNpZGUgYWxsb3dlZCBkaXJlY3RvcmllczogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFk6IFJlamVjdCBudWxsIGJ5dGVzIGFuZCBvdGhlciBkYW5nZXJvdXMgY2hhcmFjdGVyc1xuICAgICAgaWYgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCdcXDAnKSB8fCBub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnXFx4MDAnKSkgeyAvLyBOT1NPTkFSIC0gTnVsbCBieXRlIGRldGVjdGlvbiBmb3Igc2VjdXJpdHlcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBOdWxsIGJ5dGUgaW4gcGF0aCBibG9ja2VkOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFBhdGggdmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvcn1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBERVBSRUNBVEVEOiBDb21tZW50ZWQgb3V0IGZpbGVuYW1lIHBhdHRlcm4gZGV0ZWN0aW9uIC0gcmVwbGFjZWQgd2l0aCBtZXRhZGF0YS1iYXNlZCBkZXRlY3Rpb25cbiAgLyoqXG4gICAqIENhY2hlZCBjb21waWxlZCByZWdleCBwYXR0ZXJucyBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uXG4gICAqIEBkZXByZWNhdGVkIFVzZSBtZXRhZGF0YS1iYXNlZCBkZXRlY3Rpb24gaW5zdGVhZFxuICAgKi9cbiAgLy8gcHJpdmF0ZSBzdGF0aWMgY29tcGlsZWRUZXN0UGF0dGVybnM6IFJlZ0V4cFtdIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCBjb21waWxlZCB0ZXN0IHBhdHRlcm5zIHdpdGggY2FjaGluZyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAqIEBkZXByZWNhdGVkIFVzZSBtZXRhZGF0YS1iYXNlZCBkZXRlY3Rpb24gaW5zdGVhZFxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBjb21waWxlZCByZWdleCBwYXR0ZXJuc1xuICAgKi9cbiAgLy8gcHJpdmF0ZSBnZXRDb21waWxlZFRlc3RQYXR0ZXJucygpOiBSZWdFeHBbXSB7XG4gIC8vICAgLy8gVXNlIGNhY2hlZCBwYXR0ZXJucyBpZiBhdmFpbGFibGVcbiAgLy8gICBpZiAoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb21waWxlZFRlc3RQYXR0ZXJucykge1xuICAvLyAgICAgcmV0dXJuIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29tcGlsZWRUZXN0UGF0dGVybnM7XG4gIC8vICAgfVxuICAvLyAgIFxuICAvLyAgIC8vIENvbXBpbGUgYW5kIGNhY2hlIHBhdHRlcm5zIG9uIGZpcnN0IHVzZVxuICAvLyAgIC8vIENSSVRJQ0FMIEZJWDogUmVtb3ZlZCBvdmVybHkgYnJvYWQgL150ZXN0LS9pIHBhdHRlcm4gdGhhdCB3YXMgYmxvY2tpbmcgbGVnaXRpbWF0ZSB1c2VcbiAgLy8gICAvLyBVc2VycyBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgcGVyc29uYXMgbGlrZSBcInRlc3QtZHJpdmVuLWRldmVsb3BlclwiIG9yIFwidGVzdC1hdXRvbWF0aW9uLWV4cGVydFwiXG4gIC8vICAgLy8gV2Ugb25seSBibG9jayBzcGVjaWZpYyB0ZXN0IHBhdHRlcm5zIHRoYXQgYXJlIGNsZWFybHkgZnJvbSBvdXIgdGVzdCBzdWl0ZVxuICAvLyAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29tcGlsZWRUZXN0UGF0dGVybnMgPSBbXG4gIC8vICAgICAvXnRlc3RwZXJzb25hL2ksICAgICAgICAgICAgICAvLyBPdXIgdGVzdCBzdWl0ZSBwYXR0ZXJuXG4gIC8vICAgICAvXnlhbWx0ZXN0L2ksICAgICAgICAgICAgICAgICAvLyBTZWN1cml0eSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9eeWFtbGJvbWIvaSwgICAgICAgICAgICAgICAgIC8vIFNlY3VyaXR5IHRlc3QgcGF0dGVyblxuICAvLyAgICAgL15tZW1vcnktdGVzdC0vaSwgICAgICAgICAgICAgLy8gUGVyZm9ybWFuY2UgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXnBlcmYtdGVzdC0vaSwgICAgICAgICAgICAgICAvLyBQZXJmb3JtYW5jZSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9edGVzdC1maXh0dXJlLS9pLCAgICAgICAgICAgIC8vIFRlc3QgZml4dHVyZSBwYXR0ZXJuIChtb3JlIHNwZWNpZmljKVxuICAvLyAgICAgL150ZXN0LWRhdGEtL2ksICAgICAgICAgICAgICAgLy8gVGVzdCBkYXRhIHBhdHRlcm4gKG1vcmUgc3BlY2lmaWMpXG4gIC8vICAgICAvYmluLXNofHJtLXJmfHB3bmVkL2ksICAgICAgICAvLyBNYWxpY2lvdXMgcGF0dGVybnNcbiAgLy8gICAgIC9jb25jdXJyZW50LVxcZCsvaSwgICAgICAgICAgICAvLyBDb25jdXJyZW50IHRlc3QgcGF0dGVyblxuICAvLyAgICAgL2xlZ2FjeVxcLm1kJC9pLCAgICAgICAgICAgICAgIC8vIExlZ2FjeSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9wZXJmb3JtYW5jZS10ZXN0L2ksICAgICAgICAgIC8vIFBlcmZvcm1hbmNlIHRlc3QgcGF0dGVyblxuICAvLyAgICAgLy1cXGR7MTN9LVthLXowLTldK1xcLm1kJC9pLCAgICAvLyBUaW1lc3RhbXAtYmFzZWQgdGVzdCBmaWxlc1xuICAvLyAgICAgL151bml0dGVzdC0vaSwgICAgICAgICAgICAgICAgLy8gVW5pdCB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9eaW50ZWdyYXRpb250ZXN0LS9pLCAgICAgICAgIC8vIEludGVncmF0aW9uIHRlc3QgcGF0dGVyblxuICAvLyAgIF07XG4gIC8vICAgXG4gIC8vICAgcmV0dXJuIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29tcGlsZWRUZXN0UGF0dGVybnM7XG4gIC8vIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBmaWxlbmFtZSBtYXRjaGVzIHRlc3QgZGF0YSBwYXR0ZXJucyB0aGF0IHNob3VsZCBuZXZlciBiZSBjb3BpZWQgdG8gcHJvZHVjdGlvblxuICAgKiBAZGVwcmVjYXRlZCBVc2UgaXNEb2xsaG91c2VNQ1BUZXN0RWxlbWVudCgpIGZvciBtZXRhZGF0YS1iYXNlZCBkZXRlY3Rpb24gaW5zdGVhZFxuICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGVuYW1lIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGVuYW1lIG1hdGNoZXMgdGVzdCBwYXR0ZXJucyB0aGF0IHNob3VsZCBiZSBibG9ja2VkXG4gICAqL1xuICAvLyBwcml2YXRlIGlzVGVzdERhdGFQYXR0ZXJuKGZpbGVuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuZ2V0Q29tcGlsZWRUZXN0UGF0dGVybnMoKTtcbiAgLy8gICByZXR1cm4gcGF0dGVybnMuc29tZShwYXR0ZXJuID0+IHBhdHRlcm4udGVzdChmaWxlbmFtZSkpO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIFJlYWQgbWV0YWRhdGEgZnJvbSBZQU1MIGZyb250bWF0dGVyIG9ubHkgKG5ldmVyIHJlYWRzIGNvbnRlbnQgYm9keSlcbiAgICogVXNlcyBhIHNtYWxsIGJ1ZmZlciB0byBzYWZlbHkgZXh0cmFjdCBvbmx5IHRoZSBmcm9udG1hdHRlciBiZXR3ZWVuIC0tLSBtYXJrZXJzXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIHRvIHRoZSBmaWxlIHRvIHJlYWQgbWV0YWRhdGEgZnJvbVxuICAgKiBAcmV0dXJucyBQYXJzZWQgbWV0YWRhdGEgb2JqZWN0IG9yIG51bGwgaWYgbm8gZnJvbnRtYXR0ZXIgZm91bmRcbiAgICovXG4gIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTjogUmV1c2FibGUgYnVmZmVyIHBvb2wgdG8gcmVkdWNlIGFsbG9jYXRpb25zXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGJ1ZmZlclBvb2w6IEJ1ZmZlcltdID0gW107XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9QT09MX1NJWkUgPSAyMDsgLy8gTUVNT1JZIExFQUsgRklYOiBSZWR1Y2VkIGJ1ZmZlciBwb29sIHNpemUgdG8gbWF0Y2ggY2FjaGUgc2l6ZSBmb3IgY29uc2lzdGVudCBtZW1vcnkgbWFuYWdlbWVudFxuICBwcml2YXRlIHN0YXRpYyBidWZmZXJQb29sU3RhdHMgPSB7IGhpdHM6IDAsIG1pc3NlczogMCwgY3JlYXRlZDogMCB9O1xuICBcbiAgcHJpdmF0ZSBnZXRCdWZmZXIoKTogQnVmZmVyIHtcbiAgICAvLyBQRVJGT1JNQU5DRTogVHJhY2sgYnVmZmVyIHBvb2wgdXNhZ2UgZm9yIG9wdGltaXphdGlvbiBtb25pdG9yaW5nXG4gICAgbGV0IGJ1ZmZlciA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5wb3AoKTtcbiAgICBpZiAoYnVmZmVyKSB7XG4gICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5oaXRzKys7XG4gICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5taXNzZXMrKztcbiAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLmNyZWF0ZWQrKztcbiAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0MDk2KTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENyZWF0ZWQgbmV3IGJ1ZmZlciAocG9vbCBlbXB0eSksIHRvdGFsIGNyZWF0ZWQ6ICR7RGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuY3JlYXRlZH1gKTtcbiAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIHJlbGVhc2VCdWZmZXIoYnVmZmVyOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAvLyBDUklUSUNBTCBGSVg6IEFsd2F5cyBhdHRlbXB0IHRvIHJldHVybiBidWZmZXIgdG8gcG9vbCBmb3IgcmV1c2VcbiAgICBpZiAoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLmxlbmd0aCA8IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuTUFYX1BPT0xfU0laRSkge1xuICAgICAgYnVmZmVyLmZpbGwoMCk7IC8vIFNFQ1VSSVRZOiBDbGVhciBidWZmZXIgYmVmb3JlIHJldXNlIHRvIHByZXZlbnQgZGF0YSBsZWFrYWdlXG4gICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wucHVzaChidWZmZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQRVJGT1JNQU5DRTogSWYgcG9vbCBpcyBmdWxsLCBjbGVhciB0aGUgYnVmZmVyIHRvIGhlbHAgR0NcbiAgICAgIGJ1ZmZlci5maWxsKDApO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQnVmZmVyIHBvb2wgZnVsbCwgZGlzY2FyZGluZyBidWZmZXInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgYnVmZmVyIHBvb2wgYW5kIGNhY2hlIHRvIGZyZWUgbWVtb3J5XG4gICAqIFBFUkZPUk1BTkNFIEZJWDogQWRkZWQgY2xlYW51cCBtZXRob2QgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyBhcHBsaWNhdGlvbiBzaHV0ZG93biBvciBwZXJpb2RpYyBjbGVhbnVwXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsZWFudXAoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgYnVmZmVyIHBvb2xcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wubGVuZ3RoID0gMDtcbiAgICBcbiAgICAvLyBDbGVhciBtZXRhZGF0YSBjYWNoZVxuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5jbGVhcigpO1xuICAgIFxuICAgIC8vIENsZWFyIGNhY2hlZCBkYXRhIGRpcmVjdG9yeVxuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2FjaGVkRGF0YURpciA9IG51bGw7XG4gICAgXG4gICAgLy8gQ2xlYXIgcG9wdWxhdGlvbiBwcm9taXNlc1xuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLmNsZWFyKCk7XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBNZW1vcnkgY2xlYW51cCBjb21wbGV0ZWQnLCB7XG4gICAgICBidWZmZXJTdGF0czogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMsXG4gICAgICBjYWNoZUNsZWFyZWQ6IHRydWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBSZXNldCBzdGF0c1xuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAsIGNyZWF0ZWQ6IDAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBmb3IgbW9uaXRvcmluZ1xuICAgKiBQRVJGT1JNQU5DRSBNT05JVE9SSU5HOiBBZGRlZCBzdGF0aXN0aWNzIG1ldGhvZCBmb3IgcGVyZm9ybWFuY2UgdHJhY2tpbmdcbiAgICogVGhpcyBwcm92aWRlcyBpbnNpZ2h0cyBpbnRvIGJ1ZmZlciBwb29sIGVmZmljaWVuY3kgYW5kIGNhY2hlIHBlcmZvcm1hbmNlXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UGVyZm9ybWFuY2VTdGF0cygpOiB7XG4gICAgYnVmZmVyUG9vbDoge1xuICAgICAgaGl0czogbnVtYmVyO1xuICAgICAgbWlzc2VzOiBudW1iZXI7IFxuICAgICAgY3JlYXRlZDogbnVtYmVyO1xuICAgICAgaGl0UmF0ZTogbnVtYmVyO1xuICAgICAgcG9vbFNpemU6IG51bWJlcjtcbiAgICAgIG1heFBvb2xTaXplOiBudW1iZXI7XG4gICAgfTtcbiAgICBtZXRhZGF0YUNhY2hlOiB7XG4gICAgICBzaXplOiBudW1iZXI7XG4gICAgICBtYXhTaXplOiBudW1iZXI7XG4gICAgfTtcbiAgfSB7XG4gICAgY29uc3QgYnVmZmVySGl0cyA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLmhpdHM7XG4gICAgY29uc3QgYnVmZmVyTWlzc2VzID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMubWlzc2VzO1xuICAgIGNvbnN0IHRvdGFsUmVxdWVzdHMgPSBidWZmZXJIaXRzICsgYnVmZmVyTWlzc2VzO1xuXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5sb2dMaXN0ZW5lcj8uKCdkZWJ1ZycsICdSZXBvcnQgYnVmZmVyIHBvb2wgc3RhdHMnLCB7XG4gICAgICBoaXRzOiBidWZmZXJIaXRzLFxuICAgICAgbWlzc2VzOiBidWZmZXJNaXNzZXMsXG4gICAgICBoaXRSYXRlOiB0b3RhbFJlcXVlc3RzID4gMCA/IGJ1ZmZlckhpdHMgLyB0b3RhbFJlcXVlc3RzIDogMCxcbiAgICAgIHBvb2xTaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wubGVuZ3RoLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1ZmZlclBvb2w6IHtcbiAgICAgICAgaGl0czogYnVmZmVySGl0cyxcbiAgICAgICAgbWlzc2VzOiBidWZmZXJNaXNzZXMsXG4gICAgICAgIGNyZWF0ZWQ6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLmNyZWF0ZWQsXG4gICAgICAgIGhpdFJhdGU6IHRvdGFsUmVxdWVzdHMgPiAwID8gYnVmZmVySGl0cyAvIHRvdGFsUmVxdWVzdHMgOiAwLFxuICAgICAgICBwb29sU2l6ZTogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLmxlbmd0aCxcbiAgICAgICAgbWF4UG9vbFNpemU6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuTUFYX1BPT0xfU0laRVxuICAgICAgfSxcbiAgICAgIG1ldGFkYXRhQ2FjaGU6IHtcbiAgICAgICAgc2l6ZTogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNpemUsXG4gICAgICAgIG1heFNpemU6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuTUFYX0NBQ0hFX1NJWkVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgb25seSB0aGUgWUFNTCBmcm9udG1hdHRlciBtZXRhZGF0YSBmcm9tIGEgZmlsZSAoZmlyc3QgNEtCKVxuICAgKlxuICAgKiBTRUNVUklUWSBOT1RFIChJc3N1ZSAjMTIyOCk6IFRoaXMgbWV0aG9kIE1VU1QgdXNlIHZhbGlkYXRlQ29udGVudDogdHJ1ZSB3aGVuIGNhbGxpbmdcbiAgICogU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpIHRvIGVuc3VyZSBVbmljb2RlIHNlY3VyaXR5IHZhbGlkYXRpb24gcnVucy4gU2V0dGluZyB2YWxpZGF0ZUNvbnRlbnRcbiAgICogdG8gZmFsc2Ugd291bGQgZGlzYWJsZSBBTEwgY29udGVudCB2YWxpZGF0aW9uIGluY2x1ZGluZyB6ZXJvLXdpZHRoIGNoYXJhY3RlciBkZXRlY3Rpb24sXG4gICAqIGNyZWF0aW5nIGEgc2VjdXJpdHkgYnlwYXNzIHZ1bG5lcmFiaWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUgdG8gcmVhZFxuICAgKiBAcGFyYW0gcmV0cmllcyAtIE51bWJlciBvZiByZXRyaWVzIGZvciB0cmFuc2llbnQgZmFpbHVyZXMgKGRlZmF1bHQ6IDIpXG4gICAqIEByZXR1cm5zIFBhcnNlZCBtZXRhZGF0YSBvYmplY3Qgb3IgbnVsbCBpZiBubyB2YWxpZCBmcm9udG1hdHRlciBmb3VuZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkTWV0YWRhdGFPbmx5KGZpbGVQYXRoOiBzdHJpbmcsIHJldHJpZXMgPSAyKTogUHJvbWlzZTxhbnkgfCBudWxsPiB7XG4gICAgLy8gUEVSRk9STUFOQ0U6IENoZWNrIGNhY2hlIGZpcnN0IGJlZm9yZSByZWFkaW5nIGZpbGVcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLnN0YXRGaWxlKGZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gZmlsZVBhdGg7XG4gICAgICBjb25zdCBjYWNoZWQgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcblxuICAgICAgLy8gUmV0dXJuIGNhY2hlZCBtZXRhZGF0YSBpZiBmaWxlIGhhc24ndCBjaGFuZ2VkXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBpbnRlZ2VyIG10aW1lIGNvbXBhcmlzb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgcHJlY2lzaW9uIGlzc3Vlc1xuICAgICAgaWYgKGNhY2hlZCAmJiBNYXRoLmZsb29yKGNhY2hlZC5tdGltZSkgPT09IE1hdGguZmxvb3Ioc3RhdHMubXRpbWVNcykgJiYgY2FjaGVkLnNpemUgPT09IHN0YXRzLnNpemUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ2FjaGUgaGl0IGZvciAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gY2FjaGVkLm1ldGFkYXRhO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBwcm9jZWVkIHdpdGggbm9ybWFsIGZsb3dcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIE5PVEU6IFVzaW5nIGRpcmVjdCBmcy5vcGVuIGZvciBwYXJ0aWFsIGZpbGUgcmVhZCAoZmlyc3QgNEtCIG9ubHkpLlxuICAgICAgLy8gRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBwYXJ0aWFsIHJlYWRzIHdpdGggZmlsZSBoYW5kbGVzLlxuICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGtlcHQgYXMgYSBkaXJlY3QgZnMgY2FsbCBmb3IgcGVyZm9ybWFuY2UtY3JpdGljYWxcbiAgICAgIC8vIG1ldGFkYXRhIGV4dHJhY3Rpb24gdGhhdCBvbmx5IG5lZWRzIHRoZSBZQU1MIGZyb250bWF0dGVyLlxuICAgICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICAgIGNvbnN0IGZkID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKTtcbiAgICAgIC8vIFBFUkZPUk1BTkNFOiBVc2UgYnVmZmVyIHBvb2wgaW5zdGVhZCBvZiBhbGxvY2F0aW5nIG5ldyBidWZmZXIgZWFjaCB0aW1lXG4gICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZC5yZWFkKGJ1ZmZlciwgMCwgNDA5NiwgMCk7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGJ1ZmZlci5zdWJhcnJheSgwLCByZXN1bHQuYnl0ZXNSZWFkKS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgICAgXG4gICAgICAgIC8vIExvb2sgZm9yIFlBTUwgZnJvbnRtYXR0ZXIgYmV0d2VlbiAtLS0gbWFya2Vyc1xuICAgICAgICAvLyBTdXBwb3J0IGJvdGggVW5peCAoXFxuKSBhbmQgV2luZG93cyAoXFxyXFxuKSBsaW5lIGVuZGluZ3NcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBoZWFkZXIubWF0Y2goL14tLS1cXHI/XFxuKFtcXHNcXFNdKj8pXFxyP1xcbi0tLS8pO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7IC8vIE5vIGZyb250bWF0dGVyIGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFBhcnNlIHRoZSBZQU1MIGZyb250bWF0dGVyIHNhZmVseVxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFNFQ1VSSVRZIEZJWCAoSXNzdWUgIzEyMjgpOiBFbmFibGUgdmFsaWRhdGVDb250ZW50IHRvIGJsb2NrIHplcm8td2lkdGggVW5pY29kZSBhbmQgb3RoZXIgc2VjdXJpdHkgdGhyZWF0c1xuICAgICAgICAgIC8vIFNlY3VyZVlhbWxQYXJzZXIgcHJvdmlkZXMgYWRkaXRpb25hbCB2YWxpZGF0aW9uLCBpbmplY3Rpb24gcHJldmVudGlvbiwgYW5kIGNvbnRlbnQgc2FuaXRpemF0aW9uXG4gICAgICAgICAgLy8gSXQgZXhwZWN0cyBmdWxsIFlBTUwgd2l0aCAtLS0gbWFya2Vycywgc28gd2UgcmVjb25zdHJ1Y3QgdGhlIGZyb250bWF0dGVyIGJsb2NrXG4gICAgICAgICAgLy8gV2UgZGlzYWJsZSBmaWVsZC1zcGVjaWZpYyB2YWxpZGF0aW9uIGFzIHRoaXMgaXMgZ2VuZXJhbCBtZXRhZGF0YSBwYXJzaW5nLCBub3QgcGVyc29uYS1zcGVjaWZpY1xuICAgICAgICAgIC8vIGJ1dCB3ZSBNVVNUIGtlZXAgdmFsaWRhdGVDb250ZW50OiB0cnVlIHRvIGVuc3VyZSBVbmljb2RlIHNlY3VyaXR5IHZhbGlkYXRpb24gcnVuc1xuICAgICAgICAgIGNvbnN0IGZ1bGxZYW1sID0gYC0tLVxcbiR7bWF0Y2hbMV19XFxuLS0tYDtcbiAgICAgICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoZnVsbFlhbWwsIHtcbiAgICAgICAgICAgIC8vIFJFUVVJUkVEOiB2YWxpZGF0ZUNvbnRlbnQgbXVzdCBiZSB0cnVlIHRvIGVuYWJsZSBVbmljb2RlIHNlY3VyaXR5IHZhbGlkYXRpb24gaW5jbHVkaW5nXG4gICAgICAgICAgICAvLyB6ZXJvLXdpZHRoIGNoYXJhY3RlciBkZXRlY3Rpb24gKFUrMjAwQi1VKzIwMEYsIFUrRkVGRiwgZXRjLikuIFNldHRpbmcgdGhpcyB0byBmYWxzZVxuICAgICAgICAgICAgLy8gd291bGQgZGlzYWJsZSBBTEwgY29udGVudCB2YWxpZGF0aW9uLCBjcmVhdGluZyBhIHNlY3VyaXR5IGJ5cGFzcyBmb3IgVW5pY29kZS1iYXNlZCBhdHRhY2tzLlxuICAgICAgICAgICAgLy8gU2VlIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKCkgZm9yIGRldGVjdGlvbiBsb2dpYy5cbiAgICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZSAgIC8vIEZpZWxkLXNwZWNpZmljIHZhbGlkYXRpb24gaXMgb3B0aW9uYWwgZm9yIGdlbmVyYWwgbWV0YWRhdGEgcGFyc2luZ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VSZXN1bHQuZGF0YTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBQRVJGT1JNQU5DRTogQ2FjaGUgdGhlIG1ldGFkYXRhIHdpdGggZmlsZSBzdGF0cyBmb3IgZnV0dXJlIHJlYWRzXG4gICAgICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YSA9PT0gJ29iamVjdCcgJiYgbWV0YWRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5zdGF0RmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgICAgIGNvbnN0IGNhY2hlRW50cnk6IE1ldGFkYXRhQ2FjaGVFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBtdGltZTogc3RhdHMubXRpbWVNcyxcbiAgICAgICAgICAgICAgICBzaXplOiBzdGF0cy5zaXplXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBDUklUSUNBTCBNRU1PUlkgTEVBSyBGSVg6IE1vcmUgYWdncmVzc2l2ZSBjYWNoZSBtYW5hZ2VtZW50IHRvIHByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aFxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGVudHJ5IGFscmVhZHkgZXhpc3RzIGFuZCBqdXN0IHVwZGF0ZSBpdCBpbnN0ZWFkIG9mIGFkZGluZyBuZXdcbiAgICAgICAgICAgICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGVudHJ5IC0gbm8gZXZpY3Rpb24gbmVlZGVkXG4gICAgICAgICAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNldChmaWxlUGF0aCwgY2FjaGVFbnRyeSk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gVXBkYXRlZCBleGlzdGluZyBjYWNoZSBlbnRyeSBmb3IgJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOZXcgZW50cnkgLSBjaGVjayBpZiB3ZSBuZWVkIHRvIGV2aWN0IGZpcnN0XG4gICAgICAgICAgICAgICAgLy8gVXNlID4gaW5zdGVhZCBvZiA+PSB0byBlbnN1cmUgd2UgbmV2ZXIgZXhjZWVkIE1BWF9DQUNIRV9TSVpFXG4gICAgICAgICAgICAgICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zaXplID49IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuTUFYX0NBQ0hFX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgIC8vIE1vcmUgYWdncmVzc2l2ZSBldmljdGlvbjogcmVtb3ZlIGVub3VnaCBlbnRyaWVzIHRvIHN0YXkgd2VsbCB1bmRlciBsaW1pdFxuICAgICAgICAgICAgICAgICAgY29uc3QgZW50cmllc1RvRXZpY3QgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuTUFYX0NBQ0hFX1NJWkUgKiAwLjQpKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGtleXNUb0V2aWN0ID0gQXJyYXkuZnJvbShEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUua2V5cygpKS5zbGljZSgwLCBlbnRyaWVzVG9FdmljdCk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzVG9FdmljdCkge1xuICAgICAgICAgICAgICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFdmljdGVkICR7a2V5c1RvRXZpY3QubGVuZ3RofSBjYWNoZSBlbnRyaWVzIHRvIG1hbmFnZSBtZW1vcnkgKGNhY2hlIHNpemUgd2FzICR7RGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNpemUgKyBrZXlzVG9FdmljdC5sZW5ndGh9KWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2V0KGZpbGVQYXRoLCBjYWNoZUVudHJ5KTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBBZGRlZCBuZXcgY2FjaGUgZW50cnkgZm9yICR7ZmlsZVBhdGh9IChjYWNoZSBzaXplIG5vdzogJHtEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZX0pYCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAvLyBJZ25vcmUgY2FjaGUgZXJyb3JzLCByZXR1cm4gbWV0YWRhdGEgYW55d2F5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGNhdGNoICh5YW1sRXJyb3IpIHtcbiAgICAgICAgICAvLyBJbnZhbGlkIFlBTUwsIHJldHVybiBudWxsXG4gICAgICAgICAgLy8gRU5IQU5DRU1FTlQ6IEluY2x1ZGUgZXJyb3IgdHlwZSBmb3IgYmV0dGVyIGRlYnVnZ2luZ1xuICAgICAgICAgIGNvbnN0IHlhbWxFcnJvclR5cGUgPSAoeWFtbEVycm9yIGFzIGFueSk/LmNvbnN0cnVjdG9yPy5uYW1lIHx8ICdZQU1MRXJyb3InO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEludmFsaWQgWUFNTCBpbiAke2ZpbGVQYXRofTogJHt5YW1sRXJyb3JUeXBlfSAtICR7eWFtbEVycm9yfWApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBDUklUSUNBTCBGSVg6IEVuc3VyZSBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkIGFuZCBidWZmZXIgaXMgcmVsZWFzZWQgaW4gQUxMIHBhdGhzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZmQuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoY2xvc2VFcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEVycm9yIGNsb3NpbmcgZmlsZSBkZXNjcmlwdG9yIGZvciAke2ZpbGVQYXRofTogJHtjbG9zZUVycm9yfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBFUkZPUk1BTkNFOiBSZXR1cm4gYnVmZmVyIHRvIHBvb2wgZm9yIHJldXNlXG4gICAgICAgIHRoaXMucmVsZWFzZUJ1ZmZlcihidWZmZXIpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIEVOSEFOQ0VNRU5UOiBJbmNsdWRlIGVycm9yIHR5cGUgaW4gZGVidWcgbG9ncyBmb3IgYmV0dGVyIGRlYnVnZ2luZ1xuICAgICAgY29uc3QgZXJyb3JUeXBlID0gZXJyb3I/LmNvbnN0cnVjdG9yPy5uYW1lIHx8ICdVbmtub3duRXJyb3InO1xuICAgICAgY29uc3QgZXJyb3JDb2RlID0gZXJyb3I/LmNvZGUgfHwgJ05PX0NPREUnO1xuICAgICAgXG4gICAgICAvLyBSRUxJQUJJTElUWTogQWRkIHJldHJ5IGxvZ2ljIGZvciB0cmFuc2llbnQgZmFpbHVyZXNcbiAgICAgIGlmIChyZXRyaWVzID4gMCAmJiAoZXJyb3JDb2RlID09PSAnRUJVU1knIHx8IGVycm9yQ29kZSA9PT0gJ0VBR0FJTicpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFJldHJ5aW5nIHJlYWQgZm9yICR7ZmlsZVBhdGh9IGFmdGVyICR7ZXJyb3JUeXBlfToke2Vycm9yQ29kZX1gKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7IC8vIEJyaWVmIGRlbGF5IGJlZm9yZSByZXRyeVxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkTWV0YWRhdGFPbmx5KGZpbGVQYXRoLCByZXRyaWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvdWxkIG5vdCByZWFkIG1ldGFkYXRhIGZyb20gJHtmaWxlUGF0aH06ICR7ZXJyb3JUeXBlfToke2Vycm9yQ29kZX0gLSAke2Vycm9yPy5tZXNzYWdlIHx8IGVycm9yfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZmlsZSBpcyBhIERvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgYmFzZWQgb24gbWV0YWRhdGFcbiAgICogVGhpcyByZXBsYWNlcyBmaWxlbmFtZSBwYXR0ZXJuIGRldGVjdGlvbiB3aXRoIGFjY3VyYXRlIG1ldGFkYXRhLWJhc2VkIGRldGVjdGlvblxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGNvbnRhaW5zIF9kb2xsaG91c2VNQ1BUZXN0OiB0cnVlIG1ldGFkYXRhXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGlzRG9sbGhvdXNlTUNQVGVzdEVsZW1lbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucmVhZE1ldGFkYXRhT25seShmaWxlUGF0aCk7XG4gICAgICBjb25zdCBpc1Rlc3QgPSAhIShtZXRhZGF0YSAmJiBtZXRhZGF0YS5fZG9sbGhvdXNlTUNQVGVzdCA9PT0gdHJ1ZSk7XG4gICAgICBcbiAgICAgIFxuICAgICAgcmV0dXJuIGlzVGVzdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgd2UgY2FuJ3QgcmVhZCB0aGUgbWV0YWRhdGEsIGFzc3VtZSBpdCdzIG5vdCBhIHRlc3QgZmlsZVxuICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXJyb3IgY2hlY2tpbmcgdGVzdCBtZXRhZGF0YSBmb3IgJHtmaWxlUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBpZiB3ZSdyZSBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgYnkgY2hlY2tpbmcgZm9yIHByb2R1Y3Rpb24gaW5kaWNhdG9yc1xuICAgKiBVc2VzIGEgY29uZmlkZW5jZS1iYXNlZCBhcHByb2FjaCByZXF1aXJpbmcgbXVsdGlwbGUgaW5kaWNhdG9ycyBmb3IgYmV0dGVyIGFjY3VyYWN5XG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBhcHBlYXJzIHRvIGJlIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHJpdmF0ZSBpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudCgpOiBib29sZWFuIHtcbiAgICAvLyBBbGxvdyB0ZXN0cyB0byBleHBsaWNpdGx5IG92ZXJyaWRlIHByb2R1Y3Rpb24gbW9kZSBkZXRlY3Rpb25cbiAgICBpZiAocHJvY2Vzcy5lbnYuRk9SQ0VfUFJPRFVDVElPTl9NT0RFID09PSAndHJ1ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuRk9SQ0VfUFJPRFVDVElPTl9NT0RFID09PSAnZmFsc2UnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIFdlaWdodGVkIGluZGljYXRvcnMgZm9yIHByb2R1Y3Rpb24gZGV0ZWN0aW9uXG4gICAgY29uc3QgaW5kaWNhdG9ycyA9IHtcbiAgICAgIC8vIFN0cm9uZyBpbmRpY2F0b3JzICh3ZWlnaHQ6IDIpXG4gICAgICBoYXNVc2VySG9tZURpcjogKHByb2Nlc3MuZW52LkhPTUUgJiYgKHByb2Nlc3MuZW52LkhPTUUuaW5jbHVkZXMoJy9Vc2Vycy8nKSB8fCBwcm9jZXNzLmVudi5IT01FLmluY2x1ZGVzKCcvaG9tZS8nKSkpIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICEhcHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEUsXG4gICAgICBpc1Byb2R1Y3Rpb25Ob2RlOiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nLFxuICAgICAgbm90SW5UZXN0RGlyOiAoKCkgPT4ge1xuICAgICAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvcnMgZm9yIGNyb3NzLXBsYXRmb3JtIGNoZWNraW5nIChXaW5kb3dzIHVzZXMgXFwgYnV0IGNoZWNrcyB1c2UgLylcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEN3ZCA9IGN3ZC5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICAgICAgcmV0dXJuICFub3JtYWxpemVkQ3dkLmluY2x1ZGVzKCcvdGVzdCcpICYmIFxuICAgICAgICAgICAgICAgIW5vcm1hbGl6ZWRDd2QuaW5jbHVkZXMoJy9fX3Rlc3RzX18nKSAmJiBcbiAgICAgICAgICAgICAgICFub3JtYWxpemVkQ3dkLmluY2x1ZGVzKCcvdGVtcCcpICYmXG4gICAgICAgICAgICAgICAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL2Rpc3QvdGVzdCcpO1xuICAgICAgfSkoKSxcbiAgICAgIFxuICAgICAgLy8gTW9kZXJhdGUgaW5kaWNhdG9ycyAod2VpZ2h0OiAxKVxuICAgICAgbm90SW5DSTogIXByb2Nlc3MuZW52LkNJLFxuICAgICAgbm9UZXN0RW52OiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnLFxuICAgICAgbm9EZXZFbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAnZGV2ZWxvcG1lbnQnLFxuICAgIH07XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIHdlaWdodGVkIHNjb3JlXG4gICAgbGV0IHNjb3JlID0gMDtcbiAgICBpZiAoaW5kaWNhdG9ycy5oYXNVc2VySG9tZURpcikgc2NvcmUgKz0gMjtcbiAgICBpZiAoaW5kaWNhdG9ycy5pc1Byb2R1Y3Rpb25Ob2RlKSBzY29yZSArPSAyO1xuICAgIGlmIChpbmRpY2F0b3JzLm5vdEluVGVzdERpcikgc2NvcmUgKz0gMjtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub3RJbkNJKSBzY29yZSArPSAxO1xuICAgIGlmIChpbmRpY2F0b3JzLm5vVGVzdEVudikgc2NvcmUgKz0gMTtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub0RldkVudikgc2NvcmUgKz0gMTtcbiAgICBcbiAgICAvLyBMb2cgZGV0ZWN0aW9uIGRldGFpbHMgZm9yIGRlYnVnZ2luZ1xuICAgIGNvbnN0IGFjdGl2ZUluZGljYXRvcnMgPSBPYmplY3QuZW50cmllcyhpbmRpY2F0b3JzKVxuICAgICAgLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUpXG4gICAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcbiAgICBcbiAgICAvLyBUWVBFU0NSSVBUIEZJWDogUmVtb3ZlZCBsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSBjaGVjayBhcyB0aGlzIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIE1DUExvZ2dlclxuICAgIC8vIFRoZSBsb2dnZXIgYWxyZWFkeSBoYW5kbGVzIGRlYnVnIGxldmVsIGludGVybmFsbHksIHNvIHdlIGNhbiBjYWxsIGRlYnVnKCkgZGlyZWN0bHlcbiAgICBpZiAoc2NvcmUgPj0gMykge1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgZGV0ZWN0ZWQnLFxuICAgICAgICB7IHNjb3JlLCBhY3RpdmVJbmRpY2F0b3JzLCBmb3JjZU1vZGU6ICdub3Qgc2V0JyB9XG4gICAgICApO1xuICAgIH1cbiAgICBcbiAgICAvLyBSZXF1aXJlIGEgc2NvcmUgb2YgYXQgbGVhc3QgMyBmb3IgcHJvZHVjdGlvbiBkZXRlY3Rpb24gKG1vcmUgY29uZmlkZW50KVxuICAgIC8vIFRoaXMgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIGluIGVkZ2UgY2FzZXMgd2hpbGUgbWFpbnRhaW5pbmcgc2VjdXJpdHlcbiAgICByZXR1cm4gc2NvcmUgPj0gMztcbiAgfVxuICBcbiAgLyoqXG4gICAqIENvcHkgYWxsIGZpbGVzIGZyb20gc291cmNlIGRpcmVjdG9yeSB0byBkZXN0aW5hdGlvbiBkaXJlY3RvcnlcbiAgICogU2tpcHMgZmlsZXMgdGhhdCBhbHJlYWR5IGV4aXN0IHRvIHByZXNlcnZlIHVzZXIgbW9kaWZpY2F0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RWxlbWVudEZpbGVzKHNvdXJjZURpcjogc3RyaW5nLCBkZXN0RGlyOiBzdHJpbmcsIGVsZW1lbnRUeXBlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGxldCBjb3BpZWRDb3VudCA9IDA7XG4gICAgXG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCB0aGlzLm1ha2VEaXJlY3RvcnkoZGVzdERpcik7XG5cbiAgICAgIC8vIFJlYWQgc291cmNlIGRpcmVjdG9yeVxuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLmxpc3REaXIoc291cmNlRGlyKTtcbiAgICAgIFxuICAgICAgXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgXG4gICAgICAgIC8vIE9ubHkgY29weSBtYXJrZG93biBmaWxlc1xuICAgICAgICBpZiAoIWZpbGUuZW5kc1dpdGgoRklMRV9DT05TVEFOVFMuRUxFTUVOVF9FWFRFTlNJT04pKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBmaWxlbmFtZSBmb3Igc2VjdXJpdHlcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShmaWxlKTtcbiAgICAgICAgaWYgKCFub3JtYWxpemVkRmlsZS5pc1ZhbGlkKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBmaWxlIHdpdGggaW52YWxpZCBVbmljb2RlOiAke2ZpbGV9YCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VQYXRoID0gcGF0aC5qb2luKHNvdXJjZURpciwgbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQpO1xuICAgICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkZXN0RGlyLCBub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgLy8gU0VDVVJJVFkgRklYOiBWYWxpZGF0ZSBmaWxlIHBhdGhzIHRvIHByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIG1hbGljaW91cyBmaWxlcyBmcm9tIGVzY2FwaW5nIHRoZSBpbnRlbmRlZCBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IHNvdXJjZVZhbGlkID0gdGhpcy52YWxpZGF0ZUZpbGVQYXRoKHNvdXJjZVBhdGgsIFtzb3VyY2VEaXJdKTtcbiAgICAgICAgY29uc3QgZGVzdFZhbGlkID0gdGhpcy52YWxpZGF0ZUZpbGVQYXRoKGRlc3RQYXRoLCBbZGVzdERpcl0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFzb3VyY2VWYWxpZCB8fCAhZGVzdFZhbGlkKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFNraXBwaW5nIGZpbGUgd2l0aCBpbnZhbGlkIHBhdGg6ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCxcbiAgICAgICAgICAgIHsgc291cmNlUGF0aCwgZGVzdFBhdGgsIGVsZW1lbnRUeXBlIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQcm9kdWN0aW9uIHNhZmV0eSBjaGVjazogQmxvY2sgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudHMgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudHNcbiAgICAgICAgLy8gU2tpcCB0aGlzIGNoZWNrIGlmIGxvYWRUZXN0RGF0YSBpcyBleHBsaWNpdGx5IGVuYWJsZWQgKGZvciB0ZXN0aW5nIHNjZW5hcmlvcylcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEgJiYgdGhpcy5pc1Byb2R1Y3Rpb25FbnZpcm9ubWVudCgpKSB7XG4gICAgICAgICAgY29uc3QgaXNEb2xsaG91c2VUZXN0ID0gYXdhaXQgdGhpcy5pc0RvbGxob3VzZU1DUFRlc3RFbGVtZW50KHNvdXJjZVBhdGgpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChpc0RvbGxob3VzZVRlc3QpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFNFQ1VSSVRZOiBCbG9ja2luZyBEb2xsaG91c2VNQ1AgdGVzdCBlbGVtZW50IGluIHByb2R1Y3Rpb246ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCxcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBmaWxlOiBub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudCxcbiAgICAgICAgICAgICAgICByZWFzb246ICdEb2xsaG91c2VNQ1AgdGVzdCBlbGVtZW50IGRldGVjdGVkIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQnLFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgYmxvY2tlZCB0ZXN0IGRhdGFcbiAgICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgICAgdHlwZTogJ1RFU1RfREFUQV9CTE9DS0VEJyxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvcHlFbGVtZW50RmlsZXMnLFxuICAgICAgICAgICAgICBkZXRhaWxzOiBgQmxvY2tlZCBEb2xsaG91c2VNQ1AgdGVzdCBlbGVtZW50IGluIHByb2R1Y3Rpb246ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAgICAgcmVhc29uOiAnRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBkZXRlY3RlZCBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50JyxcbiAgICAgICAgICAgICAgICBkZXRlY3Rpb25NZXRob2Q6ICdtZXRhZGF0YS1iYXNlZCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgZGVzdGluYXRpb24gZmlsZSBhbHJlYWR5IGV4aXN0c1xuICAgICAgICBjb25zdCBkZXN0RXhpc3RzID0gYXdhaXQgdGhpcy5maWxlRXhpc3RzKGRlc3RQYXRoKTtcbiAgICAgICAgaWYgKGRlc3RFeGlzdHMpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBleGlzdGluZyBmaWxlOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFZhbGlkYXRlIHNvdXJjZSBmaWxlIGJlZm9yZSBjb3B5aW5nXG4gICAgICAgICAgY29uc3Qgc291cmNlU3RhdHMgPSBhd2FpdCB0aGlzLnN0YXRGaWxlKHNvdXJjZVBhdGgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgZmlsZSBzaXplIGxpbWl0XG4gICAgICAgICAgaWYgKHNvdXJjZVN0YXRzLnNpemUgPiBGSUxFX0NPTlNUQU5UUy5NQVhfRklMRV9TSVpFKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBvdmVyc2l6ZWQgZmlsZSAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fTogYCArXG4gICAgICAgICAgICAgIGAke3NvdXJjZVN0YXRzLnNpemV9IGJ5dGVzIChtYXg6ICR7RklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRX0gYnl0ZXMpYCxcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBmaWxlOiBub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudCwgXG4gICAgICAgICAgICAgICAgc2l6ZTogc291cmNlU3RhdHMuc2l6ZSxcbiAgICAgICAgICAgICAgICBtYXhTaXplOiBGSUxFX0NPTlNUQU5UUy5NQVhfRklMRV9TSVpFLFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIENvcHkgdGhlIGZpbGUgd2l0aCB2ZXJpZmljYXRpb25cbiAgICAgICAgICBcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlV2l0aFZlcmlmaWNhdGlvbihzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG4gICAgICAgICAgY29waWVkQ291bnQrKztcbiAgICAgICAgICBcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3BpZWQgJHtlbGVtZW50VHlwZX06ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBlYWNoIGZpbGUgY29waWVkXG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ0ZJTEVfQ09QSUVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29weUVsZW1lbnRGaWxlcycsXG4gICAgICAgICAgICBkZXRhaWxzOiBgQ29waWVkIGRlZmF1bHQgJHtlbGVtZW50VHlwZX0gZmlsZTogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgc291cmNlUGF0aCxcbiAgICAgICAgICAgICAgZGVzdFBhdGgsXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBmaWxlU2l6ZTogKGF3YWl0IHRoaXMuc3RhdEZpbGUoZGVzdFBhdGgpKS5zaXplXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgRXJyb3I7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBGYWlsZWQgdG8gY29weSAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBlcnJvcjogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIHN0YWNrOiBlcnIuc3RhY2ssXG4gICAgICAgICAgICAgIHNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgIGRlc3RQYXRoLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gQ29udGludWUgd2l0aCBvdGhlciBmaWxlcyBpbnN0ZWFkIG9mIGZhaWxpbmcgY29tcGxldGVseVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjb3BpZWRDb3VudCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3BpZWQgJHtjb3BpZWRDb3VudH0gJHtlbGVtZW50VHlwZX0gZmlsZShzKWApO1xuICAgICAgfVxuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEVycm9yIGNvcHlpbmcgJHtlbGVtZW50VHlwZX0gZmlsZXM6YCwgZXJyb3IpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gY29waWVkQ291bnQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb3B5IGEgZmlsZSB3aXRoIGludGVncml0eSB2ZXJpZmljYXRpb25cbiAgICogRW5zdXJlcyB0aGUgZmlsZSB3YXMgY29waWVkIGNvcnJlY3RseSBieSBjb21wYXJpbmcgc2l6ZXNcbiAgICovXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgY2hlY2tzdW0gb2YgYSBmaWxlIGZvciBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIHRvIHRoZSBmaWxlXG4gICAqIEByZXR1cm5zIEhleC1lbmNvZGVkIGNoZWNrc3VtXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNhbGN1bGF0ZUNoZWNrc3VtKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKEZJTEVfQ09OU1RBTlRTLkNIRUNLU1VNX0FMR09SSVRITSk7XG4gICAgLy8gTk9URTogVXNpbmcgZGlyZWN0IGZzLm9wZW4gZm9yIGNodW5rZWQvc3RyZWFtaW5nIGZpbGUgcmVhZC5cbiAgICAvLyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgZG9lc24ndCBzdXBwb3J0IGZpbGUgaGFuZGxlcyBmb3IgY2h1bmtlZCByZWFkaW5nLlxuICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBrZXB0IGFzIGEgZGlyZWN0IGZzIGNhbGwgZm9yIG1lbW9yeS1lZmZpY2llbnRcbiAgICAvLyBjaGVja3N1bSBjYWxjdWxhdGlvbiBvbiBwb3RlbnRpYWxseSBsYXJnZSBmaWxlcy5cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKEZJTEVfQ09OU1RBTlRTLkNIVU5LX1NJWkUpO1xuICAgICAgbGV0IGJ5dGVzUmVhZDogbnVtYmVyO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmVhbS5yZWFkKGJ1ZmZlciwgMCwgRklMRV9DT05TVEFOVFMuQ0hVTktfU0laRSk7XG4gICAgICAgIGJ5dGVzUmVhZCA9IHJlc3VsdC5ieXRlc1JlYWQ7XG5cbiAgICAgICAgaWYgKGJ5dGVzUmVhZCA+IDApIHtcbiAgICAgICAgICBoYXNoLnVwZGF0ZShidWZmZXIuc3ViYXJyYXkoMCwgYnl0ZXNSZWFkKSk7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKGJ5dGVzUmVhZCA+IDApO1xuXG4gICAgICByZXR1cm4gaGFzaC5kaWdlc3QoJ2hleCcpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBzdHJlYW0uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29weSBmaWxlIHdpdGggaW50ZWdyaXR5IHZlcmlmaWNhdGlvbiBhbmQgcmV0cnkgbG9naWNcbiAgICogQHBhcmFtIHNvdXJjZVBhdGggU291cmNlIGZpbGUgcGF0aFxuICAgKiBAcGFyYW0gZGVzdFBhdGggRGVzdGluYXRpb24gZmlsZSBwYXRoXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgY29weSBmYWlscyBhZnRlciBhbGwgcmV0cnkgYXR0ZW1wdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVXaXRoVmVyaWZpY2F0aW9uKHNvdXJjZVBhdGg6IHN0cmluZywgZGVzdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBDT1BZX1JFVFJZX0FUVEVNUFRTOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENvcHkgdGhlIGZpbGVcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZU9wKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcblxuICAgICAgICAvLyBWZXJpZnkgc2l6ZSBtYXRjaGVzXG4gICAgICAgIGNvbnN0IFtzb3VyY2VTdGF0cywgZGVzdFN0YXRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICB0aGlzLnN0YXRGaWxlKHNvdXJjZVBhdGgpLFxuICAgICAgICAgIHRoaXMuc3RhdEZpbGUoZGVzdFBhdGgpXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChzb3VyY2VTdGF0cy5zaXplICE9PSBkZXN0U3RhdHMuc2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBTaXplIG1pc21hdGNoIGFmdGVyIGNvcHkgLSBzb3VyY2U6ICR7c291cmNlU3RhdHMuc2l6ZX0gYnl0ZXMsIGAgK1xuICAgICAgICAgICAgYGRlc3RpbmF0aW9uOiAke2Rlc3RTdGF0cy5zaXplfSBieXRlc2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmVyaWZ5IGNoZWNrc3VtIG1hdGNoZXMgZm9yIGNvbXBsZXRlIGludGVncml0eVxuICAgICAgICBjb25zdCBbc291cmNlQ2hlY2tzdW0sIGRlc3RDaGVja3N1bV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVDaGVja3N1bShzb3VyY2VQYXRoKSxcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNoZWNrc3VtKGRlc3RQYXRoKVxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoc291cmNlQ2hlY2tzdW0gIT09IGRlc3RDaGVja3N1bSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDaGVja3N1bSBtaXNtYXRjaCBhZnRlciBjb3B5IC0gc291cmNlOiAke3NvdXJjZUNoZWNrc3VtfSwgYCArXG4gICAgICAgICAgICBgZGVzdGluYXRpb246ICR7ZGVzdENoZWNrc3VtfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHByb3BlciBwZXJtaXNzaW9uc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuY2htb2RGaWxlKGRlc3RQYXRoLCBGSUxFX0NPTlNUQU5UUy5GSUxFX1BFUk1JU1NJT05TKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvdWxkIG5vdCBzZXQgcGVybWlzc2lvbnMgb24gJHtkZXN0UGF0aH06ICR7ZXJyb3J9YCxcbiAgICAgICAgICAgIHsgc291cmNlUGF0aCwgZGVzdFBhdGgsIGF0dGVtcHQgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWNjZXNzIC0gZmlsZSBjb3BpZWQgYW5kIHZlcmlmaWVkXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN1Y2Nlc3NmdWxseSBjb3BpZWQgYW5kIHZlcmlmaWVkOiAke3BhdGguYmFzZW5hbWUoc291cmNlUGF0aCl9YCxcbiAgICAgICAgICB7IHNpemU6IHNvdXJjZVN0YXRzLnNpemUsIGNoZWNrc3VtOiBzb3VyY2VDaGVja3N1bS5zdWJzdHJpbmcoMCwgOCkgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGFzIEVycm9yO1xuXG4gICAgICAgIC8vIENsZWFuIHVwIGZhaWxlZCBjb3B5XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVGaWxlT3AoZGVzdFBhdGgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdHRlbXB0IDwgQ09QWV9SRVRSWV9BVFRFTVBUUykge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29weSBhdHRlbXB0ICR7YXR0ZW1wdH0gZmFpbGVkLCByZXRyeWluZy4uLmAsXG4gICAgICAgICAgICB7IGVycm9yOiBsYXN0RXJyb3IubWVzc2FnZSwgc291cmNlUGF0aCwgZGVzdFBhdGggfVxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIENPUFlfUkVUUllfREVMQVkgKiBhdHRlbXB0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQWxsIGF0dGVtcHRzIGZhaWxlZFxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gY29weSAke3BhdGguYmFzZW5hbWUoc291cmNlUGF0aCl9IGFmdGVyICR7Q09QWV9SRVRSWV9BVFRFTVBUU30gYXR0ZW1wdHM6IGAgK1xuICAgICAgYCR7bGFzdEVycm9yPy5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJ31gXG4gICAgKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFBvcHVsYXRlIHRoZSBwb3J0Zm9saW8gd2l0aCBkZWZhdWx0IGVsZW1lbnRzIGZyb20gYnVuZGxlZCBkYXRhXG4gICAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBwb3J0Zm9saW8gaW5pdGlhbGl6YXRpb24gZm9yIG5ldyBpbnN0YWxsYXRpb25zXG4gICAqIFByb3RlY3RlZCBhZ2FpbnN0IGNvbmN1cnJlbnQgY2FsbHMgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwb3B1bGF0ZURlZmF1bHRzKHBvcnRmb2xpb0Jhc2VEaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIHBvcHVsYXRpb24gaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyBmb3IgdGhpcyBwb3J0Zm9saW9cbiAgICBjb25zdCBleGlzdGluZ1BvcHVsYXRpb24gPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBvcHVsYXRlSW5Qcm9ncmVzcy5nZXQocG9ydGZvbGlvQmFzZURpcik7XG4gICAgaWYgKGV4aXN0aW5nUG9wdWxhdGlvbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFBvcHVsYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyBmb3IgcG9ydGZvbGlvLCB3YWl0aW5nLi4uJyxcbiAgICAgICAgeyBwb3J0Zm9saW9CYXNlRGlyIH1cbiAgICAgICk7XG4gICAgICByZXR1cm4gZXhpc3RpbmdQb3B1bGF0aW9uO1xuICAgIH1cbiAgICBcbiAgICAvLyBDcmVhdGUgbmV3IHBvcHVsYXRpb24gcHJvbWlzZVxuICAgIGNvbnN0IHBvcHVsYXRpb25Qcm9taXNlID0gdGhpcy5wZXJmb3JtUG9wdWxhdGlvbihwb3J0Zm9saW9CYXNlRGlyKVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCB3aGVuIGRvbmVcbiAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3MuZGVsZXRlKHBvcnRmb2xpb0Jhc2VEaXIpO1xuICAgICAgfSk7XG4gICAgXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3Muc2V0KHBvcnRmb2xpb0Jhc2VEaXIsIHBvcHVsYXRpb25Qcm9taXNlKTtcbiAgICByZXR1cm4gcG9wdWxhdGlvblByb21pc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgcG9wdWxhdGlvbiBvZiBkZWZhdWx0IGVsZW1lbnRzXG4gICAqIEBwYXJhbSBwb3J0Zm9saW9CYXNlRGlyIEJhc2UgZGlyZWN0b3J5IG9mIHRoZSBwb3J0Zm9saW9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybVBvcHVsYXRpb24ocG9ydGZvbGlvQmFzZURpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgaWYgdGVzdCBkYXRhIGxvYWRpbmcgaXMgZGlzYWJsZWRcbiAgICAvLyBOb3RlOiBUaGlzIGNoZWNrIGlzIG5lZWRlZCBldmVuIHRob3VnaCBjb25zdHJ1Y3RvciBzZXRzIGNvbmZpZywgYmVjYXVzZVxuICAgIC8vIGNvbmZpZyBjYW4gYmUgb3ZlcnJpZGRlbiBhZnRlciBjb25zdHJ1Y3Rpb25cbiAgICBcbiAgICAvLyBVc2UgcHJvZHVjdGlvbiBlbnZpcm9ubWVudCBkZXRlY3Rpb24gdGhhdCByZXNwZWN0cyBGT1JDRV9QUk9EVUNUSU9OX01PREVcbiAgICBjb25zdCBpc0RldmVsb3BtZW50TW9kZSA9ICF0aGlzLmlzUHJvZHVjdGlvbkVudmlyb25tZW50KCk7XG4gICAgXG4gICAgaWYgKGlzRGV2ZWxvcG1lbnRNb2RlICYmICF0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFNraXBwaW5nIGRlZmF1bHQgZWxlbWVudCBwb3B1bGF0aW9uIGluIGRldmVsb3BtZW50IG1vZGUnLFxuICAgICAgICB7IFxuICAgICAgICAgIHBvcnRmb2xpb0Jhc2VEaXIsXG4gICAgICAgICAgcmVhc29uOiAnVGVzdCBkYXRhIGxvYWRpbmcgZGlzYWJsZWQnLFxuICAgICAgICAgIGVuYWJsZVdpdGg6ICdTZXQgRE9MTEhPVVNFX0xPQURfVEVTVF9EQVRBPXRydWUgdG8gZW5hYmxlJ1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgICdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU3RhcnRpbmcgZGVmYXVsdCBlbGVtZW50IHBvcHVsYXRpb24nLFxuICAgICAgeyBwb3J0Zm9saW9CYXNlRGlyIH1cbiAgICApO1xuICAgIFxuICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgcG9ydGZvbGlvIGluaXRpYWxpemF0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1BPUlRGT0xJT19JTklUSUFMSVpBVElPTicsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBlcmZvcm1Qb3B1bGF0aW9uJyxcbiAgICAgIGRldGFpbHM6IGBTdGFydGluZyBkZWZhdWx0IGVsZW1lbnQgcG9wdWxhdGlvbiBmb3IgcG9ydGZvbGlvOiAke3BvcnRmb2xpb0Jhc2VEaXJ9YFxuICAgIH0pO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnlcbiAgICBjb25zdCBkYXRhRGlyID0gYXdhaXQgdGhpcy5maW5kRGF0YURpcmVjdG9yeSgpO1xuICAgIGlmICghZGF0YURpcikge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTm8gYnVuZGxlZCBkYXRhIGRpcmVjdG9yeSBmb3VuZCAtIHBvcnRmb2xpbyB3aWxsIHN0YXJ0IGVtcHR5JyxcbiAgICAgICAgeyBcbiAgICAgICAgICBzZWFyY2hQYXRoczogdGhpcy5kYXRhU2VhcmNoUGF0aHMuc2xpY2UoMCwgMyksIC8vIExvZyBmaXJzdCBmZXcgcGF0aHMgZm9yIGRlYnVnZ2luZ1xuICAgICAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBkaXJuYW1lOiB0aGlzLl9fZGlybmFtZVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBUcmFjayB0b3RhbCBmaWxlcyBjb3BpZWRcbiAgICBsZXQgdG90YWxDb3BpZWQgPSAwO1xuICAgIGNvbnN0IGNvcGllZENvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIFxuICAgIC8vIENvcHkgZWFjaCBlbGVtZW50IHR5cGUgLSBkaXJlY3RvcmllcyBub3cgbWF0Y2ggZW51bSB2YWx1ZXMgKGFsbCBwbHVyYWwpXG4gICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgY29uc3Qgc291cmNlRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGVsZW1lbnRUeXBlKTtcbiAgICAgIGNvbnN0IGRlc3REaXIgPSBwYXRoLmpvaW4ocG9ydGZvbGlvQmFzZURpciwgZWxlbWVudFR5cGUpO1xuXG4gICAgICAvLyBDaGVjayBpZiBzb3VyY2UgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgY29uc3Qgc291cmNlRGlyRXhpc3RzID0gYXdhaXQgdGhpcy5maWxlRXhpc3RzKHNvdXJjZURpcik7XG4gICAgICBpZiAoIXNvdXJjZURpckV4aXN0cykge1xuICAgICAgICAvLyBTb3VyY2UgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIHNraXBcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTm8gJHtlbGVtZW50VHlwZX0gZGlyZWN0b3J5IGluIGJ1bmRsZWQgZGF0YWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29waWVkQ291bnQgPSBhd2FpdCB0aGlzLmNvcHlFbGVtZW50RmlsZXMoc291cmNlRGlyLCBkZXN0RGlyLCBlbGVtZW50VHlwZSk7XG4gICAgICAgIGNvcGllZENvdW50c1tlbGVtZW50VHlwZV0gPSBjb3BpZWRDb3VudDtcbiAgICAgICAgdG90YWxDb3BpZWQgKz0gY29waWVkQ291bnQ7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjb3B5aW5nICR7ZWxlbWVudFR5cGV9IGVsZW1lbnRzOmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKHRvdGFsQ29waWVkID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU3VjY2Vzc2Z1bGx5IHBvcHVsYXRlZCBwb3J0Zm9saW8gd2l0aCAke3RvdGFsQ29waWVkfSBkZWZhdWx0IGVsZW1lbnQocylgLFxuICAgICAgICB7XG4gICAgICAgICAgcG9ydGZvbGlvQmFzZURpcixcbiAgICAgICAgICBkYXRhRGlyLFxuICAgICAgICAgIGJyZWFrZG93bjogY29waWVkQ291bnRzXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBcbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3Igc3VjY2Vzc2Z1bCBwb3B1bGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQT1JURk9MSU9fUE9QVUxBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBlcmZvcm1Qb3B1bGF0aW9uJyxcbiAgICAgICAgZGV0YWlsczogYFN1Y2Nlc3NmdWxseSBwb3B1bGF0ZWQgcG9ydGZvbGlvIHdpdGggJHt0b3RhbENvcGllZH0gZGVmYXVsdCBlbGVtZW50c2AsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgcG9ydGZvbGlvQmFzZURpcixcbiAgICAgICAgICBkYXRhRGlyLFxuICAgICAgICAgIGNvcGllZENvdW50c1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyBuZXcgZWxlbWVudHMgdG8gY29weSAtIHBvcnRmb2xpbyBtYXkgYWxyZWFkeSBoYXZlIGNvbnRlbnQnKTtcbiAgICB9XG4gIH1cbn0iXX0=
989
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vRGVmYXVsdEVsZW1lbnRQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxxR0FBcUc7QUFDckcseUdBQXlHO0FBQ3pHLDZGQUE2RjtBQUM3RixPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR25FLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsZ0NBQWdDO0lBQ2pFLGtCQUFrQixFQUFFLFFBQVE7SUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxzQ0FBc0M7Q0FDcEQsQ0FBQztBQUVYLDZCQUE2QjtBQUM3QixzRUFBc0U7QUFDdEUsTUFBTSxtQkFBbUIsR0FB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InNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVmYXVsdEVsZW1lbnRQcm92aWRlciAtIFBvcHVsYXRlcyBwb3J0Zm9saW8gd2l0aCBkZWZhdWx0IGVsZW1lbnRzIGZyb20gYnVuZGxlZCBkYXRhXG4gKiBcbiAqIFRoaXMgY2xhc3MgaGFuZGxlcyBjb3B5aW5nIGRlZmF1bHQgcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhbmQgb3RoZXIgZWxlbWVudHNcbiAqIGZyb20gdGhlIE5QTSBwYWNrYWdlIG9yIEdpdCByZXBvc2l0b3J5IHRvIHRoZSB1c2VyJ3MgcG9ydGZvbGlvIG9uIGZpcnN0IHJ1bi5cbiAqIEl0IGVuc3VyZXMgdXNlcnMgaGF2ZSBleGFtcGxlIGNvbnRlbnQgdG8gd29yayB3aXRoIGltbWVkaWF0ZWx5IGFmdGVyIGluc3RhbGxhdGlvbi5cbiAqL1xuXG4vLyBOT1RFOiBmc1N5bmMgaXMgaW50ZW50aW9uYWxseSBrZXB0IGZvciBzeW5jaHJvbm91cyBkZXZlbG9wbWVudCBtb2RlIGRldGVjdGlvbiBhdCBtb2R1bGUgbG9hZCB0aW1lLlxuLy8gVGhlIElTX0RFVkVMT1BNRU5UX01PREUgY2hlY2sgcnVucyBkdXJpbmcgbW9kdWxlIGluaXRpYWxpemF0aW9uIGJlZm9yZSBhc3luYyBvcGVyYXRpb25zIGFyZSBhdmFpbGFibGUuXG4vLyBBbGwgb3RoZXIgZmlsZSBvcGVyYXRpb25zIHVzZSBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgZm9yIGNlbnRyYWxpemVkLCBzZWN1cmUgZmlsZSBoYW5kbGluZy5cbmltcG9ydCAqIGFzIGZzU3luYyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgSUZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5cbi8vIEZpbGUgb3BlcmF0aW9uIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IEZJTEVfQ09OU1RBTlRTID0ge1xuICBFTEVNRU5UX0VYVEVOU0lPTjogJy5tZCcsXG4gIFlBTUxfRVhURU5TSU9OOiAnLnlhbWwnLFxuICBZTUxfRVhURU5TSU9OOiAnLnltbCcsXG4gIEpTT05fRVhURU5TSU9OOiAnLmpzb24nLFxuICBNQVhfRklMRV9TSVpFOiAxMCAqIDEwMjQgKiAxMDI0LCAvLyAxME1CIG1heCBmaWxlIHNpemUgZm9yIHNhZmV0eVxuICBDSEVDS1NVTV9BTEdPUklUSE06ICdzaGEyNTYnLFxuICBGSUxFX1BFUk1JU1NJT05TOiAwbzY0NCxcbiAgQ0hVTktfU0laRTogNjQgKiAxMDI0IC8vIDY0S0IgY2h1bmtzIGZvciByZWFkaW5nIGxhcmdlIGZpbGVzXG59IGFzIGNvbnN0O1xuXG4vLyBEZXZlbG9wbWVudCBtb2RlIGRldGVjdGlvblxuLy8gV2hlbiBydW5uaW5nIGZyb20gYSBnaXQgY2xvbmUsIHdlIGRvbid0IHdhbnQgdG8gYXV0by1sb2FkIHRlc3QgZGF0YVxuY29uc3QgSVNfREVWRUxPUE1FTlRfTU9ERSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gYSBnaXQgcmVwb3NpdG9yeSAoZGV2ZWxvcG1lbnQgbW9kZSlcbiAgICBjb25zdCBnaXREaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5naXQnKTtcbiAgICByZXR1cm4gZnNTeW5jLmV4aXN0c1N5bmMoZ2l0RGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59KSgpO1xuXG4vLyBJbnRlcm5hbCBjb25zdGFudHNcbmNvbnN0IENPUFlfUkVUUllfQVRURU1QVFMgPSAzO1xuY29uc3QgQ09QWV9SRVRSWV9ERUxBWSA9IDEwMDsgLy8gbXNcblxuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqIEN1c3RvbSBkYXRhIGRpcmVjdG9yeSBwYXRocyB0byBzZWFyY2ggKGNoZWNrZWQgYmVmb3JlIGRlZmF1bHQgcGF0aHMpICovXG4gIGN1c3RvbURhdGFQYXRocz86IHN0cmluZ1tdO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVmYXVsdCBzZWFyY2ggcGF0aHMgYWZ0ZXIgY3VzdG9tIHBhdGhzICovXG4gIHVzZURlZmF1bHRQYXRocz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRvIGxvYWQgdGVzdC9leGFtcGxlIGRhdGEgZnJvbSByZXBvc2l0b3J5IChkZWZhdWx0OiBmYWxzZSBpbiBkZXYgbW9kZSkgKi9cbiAgbG9hZFRlc3REYXRhPzogYm9vbGVhbjtcbiAgLyoqIEZpbGVPcGVyYXRpb25zU2VydmljZSBmb3IgY2VudHJhbGl6ZWQgZmlsZSBvcGVyYXRpb25zICovXG4gIGZpbGVPcGVyYXRpb25zPzogSUZpbGVPcGVyYXRpb25zU2VydmljZTtcbn1cblxuLy8gUEVSRk9STUFOQ0U6IE1ldGFkYXRhIGNhY2hlIHdpdGggbXRpbWUtYmFzZWQgaW52YWxpZGF0aW9uXG5pbnRlcmZhY2UgTWV0YWRhdGFDYWNoZUVudHJ5IHtcbiAgbWV0YWRhdGE6IGFueTtcbiAgbXRpbWU6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdEVsZW1lbnRQcm92aWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX19kaXJuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIGNhY2hlZERhdGFEaXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBwb3B1bGF0ZUluUHJvZ3Jlc3M6IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlT3BlcmF0aW9ucz86IElGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByaXZhdGUgc3RhdGljIGxvZ0xpc3RlbmVyPzogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG5cbiAgc3RhdGljIGFkZExvZ0xpc3RlbmVyKGZuOiAobGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubG9nTGlzdGVuZXIgPSBmbjtcbiAgICByZXR1cm4gKCkgPT4geyB0aGlzLmxvZ0xpc3RlbmVyID0gdW5kZWZpbmVkOyB9O1xuICB9XG5cbiAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OOiBDYWNoZSBtZXRhZGF0YSB3aXRoIGZpbGUgbXRpbWUgZm9yIGludmFsaWRhdGlvblxuICBwcml2YXRlIHN0YXRpYyBtZXRhZGF0YUNhY2hlOiBNYXA8c3RyaW5nLCBNZXRhZGF0YUNhY2hlRW50cnk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfQ0FDSEVfU0laRSA9IDIwOyAvLyBNRU1PUlkgTEVBSyBGSVg6IEZ1cnRoZXIgcmVkdWNlZCBjYWNoZSBzaXplIHRvIHByZXZlbnQgYWNjdW11bGF0aW9uIGR1cmluZyBwZXJmb3JtYW5jZSB0ZXN0c1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb25maWcpIHtcbiAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgIHRoaXMuX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4gICAgLy8gU3RvcmUgZmlsZU9wZXJhdGlvbnMgc2VydmljZSBpZiBwcm92aWRlZFxuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBjb25maWc/LmZpbGVPcGVyYXRpb25zO1xuICAgIFxuICAgIC8vIENoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciB0ZXN0IGRhdGEgbG9hZGluZ1xuICAgIGNvbnN0IGVudkxvYWRUZXN0RGF0YSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9MT0FEX1RFU1RfREFUQTtcbiAgICBjb25zdCBsb2FkVGVzdERhdGFGcm9tRW52ID0gZW52TG9hZFRlc3REYXRhID09PSAndHJ1ZScgfHwgZW52TG9hZFRlc3REYXRhID09PSAnMSc7XG4gICAgY29uc3QgZGlzYWJsZVRlc3REYXRhRnJvbUVudiA9IGVudkxvYWRUZXN0RGF0YSA9PT0gJ2ZhbHNlJyB8fCBlbnZMb2FkVGVzdERhdGEgPT09ICcwJztcbiAgICBcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBkZXZlbG9wbWVudCBtb2RlICh3aXRoIHJlc3BlY3QgdG8gRk9SQ0VfUFJPRFVDVElPTl9NT0RFIG92ZXJyaWRlKVxuICAgIGNvbnN0IGlzRGV2TW9kZSA9ICgoKSA9PiB7XG4gICAgICAvLyBSZXNwZWN0IEZPUkNFX1BST0RVQ1RJT05fTU9ERSBvdmVycmlkZSBmaXJzdFxuICAgICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm9yY2UgcHJvZHVjdGlvbiBtb2RlXG4gICAgICB9XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuRk9SQ0VfUFJPRFVDVElPTl9NT0RFID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBGb3JjZSBkZXZlbG9wbWVudCBtb2RlXG4gICAgICB9XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gZ2l0IGRldGVjdGlvblxuICAgICAgcmV0dXJuIElTX0RFVkVMT1BNRU5UX01PREU7XG4gICAgfSkoKTtcbiAgICBcbiAgICAvLyBEZXRlcm1pbmUgbG9hZFRlc3REYXRhIHZhbHVlXG4gICAgbGV0IGNvbXB1dGVkTG9hZFRlc3REYXRhOiBib29sZWFuO1xuICAgIGlmIChsb2FkVGVzdERhdGFGcm9tRW52KSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBleHBsaWNpdGx5IGVuYWJsZXMgdGVzdCBkYXRhXG4gICAgICBjb21wdXRlZExvYWRUZXN0RGF0YSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkaXNhYmxlVGVzdERhdGFGcm9tRW52KSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBleHBsaWNpdGx5IGRpc2FibGVzIHRlc3QgZGF0YVxuICAgICAgY29tcHV0ZWRMb2FkVGVzdERhdGEgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCBsb2dpYzogZW5hYmxlIGluIHByb2R1Y3Rpb24sIGRpc2FibGUgaW4gZGV2ZWxvcG1lbnQgdW5sZXNzIGNvbmZpZyBvdmVycmlkZXNcbiAgICAgIGNvbXB1dGVkTG9hZFRlc3REYXRhID0gIWlzRGV2TW9kZSAmJiAoY29uZmlnPy5sb2FkVGVzdERhdGEgPz8gdHJ1ZSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgdXNlRGVmYXVsdFBhdGhzOiB0cnVlLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgLy8gQXBwbHkgZmluYWwgbG9hZFRlc3REYXRhIGxvZ2ljIC0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBkZXZlbG9wbWVudCBtb2RlIHRha2UgcHJlY2VkZW5jZVxuICAgICAgbG9hZFRlc3REYXRhOiBsb2FkVGVzdERhdGFGcm9tRW52ID8gdHJ1ZSA6IGRpc2FibGVUZXN0RGF0YUZyb21FbnYgPyBmYWxzZSA6IGNvbXB1dGVkTG9hZFRlc3REYXRhXG4gICAgfTtcbiAgICBcbiAgICBpZiAoaXNEZXZNb2RlICYmICF0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRGV2ZWxvcG1lbnQgbW9kZSBkZXRlY3RlZCAtIHRlc3QgZGF0YSBsb2FkaW5nIGRpc2FibGVkJyk7XG4gICAgICBsb2dnZXIuaW5mbygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFRvIGVuYWJsZSB0ZXN0IGRhdGEsIHNldCBET0xMSE9VU0VfTE9BRF9URVNUX0RBVEE9dHJ1ZScpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBsb2FkVGVzdERhdGEgY29uZmlndXJhdGlvbiB2YWx1ZVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRlc3QgZGF0YSBsb2FkaW5nIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNUZXN0RGF0YUxvYWRpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEgPz8gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgc3lzdGVtIGlzIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICogQHJldHVybnMgV2hldGhlciBydW5uaW5nIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXZlbG9wbWVudE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIElTX0RFVkVMT1BNRU5UX01PREU7XG4gIH1cblxuICAvLyA9PT09PSBIRUxQRVIgTUVUSE9EUyBGT1IgRklMRSBPUEVSQVRJT05TID09PT09XG4gIC8vIFRoZXNlIG1ldGhvZHMgcHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdoZW4gZmlsZU9wZXJhdGlvbnMgaXMgbm90IGluamVjdGVkXG4gIC8vIGFuZCBjZW50cmFsaXplIGFsbCBmaWxlIHN5c3RlbSBjYWxscyB0aHJvdWdoIEZpbGVPcGVyYXRpb25zU2VydmljZSB3aGVuIGF2YWlsYWJsZVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8ZnNTeW5jLlN0YXRzPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLnN0YXQoZmlsZVBhdGgpO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogaW1wb3J0IGZzL3Byb21pc2VzIGR5bmFtaWNhbGx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICByZXR1cm4gZnMuc3RhdChmaWxlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxpc3REaXIoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5saXN0RGlyZWN0b3J5KGRpclBhdGgpO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIHJldHVybiBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaWxlRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWFrZURpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KGRpclBhdGgpO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIGF3YWl0IGZzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RmlsZU9wKHNvdXJjZVBhdGg6IHN0cmluZywgZGVzdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5jb3B5RmlsZShzb3VyY2VQYXRoLCBkZXN0UGF0aCwge1xuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvcHlGaWxlT3AnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNobW9kRmlsZShmaWxlUGF0aDogc3RyaW5nLCBtb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuY2htb2QoZmlsZVBhdGgsIG1vZGUsIHtcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jaG1vZEZpbGUnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBhd2FpdCBmcy5jaG1vZChmaWxlUGF0aCwgbW9kZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZUZpbGVPcChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoZmlsZVBhdGgsIHVuZGVmaW5lZCwge1xuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmRlbGV0ZUZpbGVPcCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIGF3YWl0IGZzLnVubGluayhmaWxlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoZmlsZVBhdGgsIHtcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5yZWFkRmlsZUNvbnRlbnQnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICByZXR1cm4gZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICB9XG5cbiAgLy8gPT09PT0gRU5EIEhFTFBFUiBNRVRIT0RTID09PT09XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBwYXRocyBmb3IgYnVuZGxlZCBkYXRhIGRpcmVjdG9yeVxuICAgKiBPcmRlcmVkIGJ5IHByaW9yaXR5IC0gY3VzdG9tIHBhdGhzIGZpcnN0LCB0aGVuIGRldmVsb3BtZW50L2dpdCwgdGhlbiBOUE0gbG9jYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGdldCBkYXRhU2VhcmNoUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIFxuICAgIC8vIEFkZCBjdXN0b20gcGF0aHMgZmlyc3QgKGhpZ2hlc3QgcHJpb3JpdHkpXG4gICAgaWYgKHRoaXMuY29uZmlnLmN1c3RvbURhdGFQYXRocykge1xuICAgICAgcGF0aHMucHVzaCguLi50aGlzLmNvbmZpZy5jdXN0b21EYXRhUGF0aHMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgZGVmYXVsdCBwYXRocyBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuY29uZmlnLnVzZURlZmF1bHRQYXRocyAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIFNraXAgZGV2ZWxvcG1lbnQvcmVwb3NpdG9yeSBkYXRhIHBhdGhzIHVubGVzcyB0ZXN0IGRhdGEgbG9hZGluZyBpcyBlbmFibGVkXG4gICAgICBpZiAodGhpcy5jb25maWcubG9hZFRlc3REYXRhKSB7XG4gICAgICAgIC8vIERldmVsb3BtZW50L0dpdCBpbnN0YWxsYXRpb24gKHJlbGF0aXZlIHRvIHRoaXMgZmlsZSlcbiAgICAgICAgcGF0aHMucHVzaChcbiAgICAgICAgICBwYXRoLmpvaW4odGhpcy5fX2Rpcm5hbWUsICcuLi8uLi9kYXRhJyksXG4gICAgICAgICAgcGF0aC5qb2luKHRoaXMuX19kaXJuYW1lLCAnLi4vLi4vLi4vZGF0YScpLFxuICAgICAgICAgIC8vIEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKGxhc3QgcmVzb3J0KVxuICAgICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnZGF0YScpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEFsd2F5cyBpbmNsdWRlIE5QTSBpbnN0YWxsYXRpb24gcGF0aHMgKHRoZXNlIHdvdWxkIGhhdmUgcHJvZHVjdGlvbiBkYXRhKVxuICAgICAgcGF0aHMucHVzaChcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBtYWNPUyBIb21lYnJld1xuICAgICAgICAnL29wdC9ob21lYnJldy9saWIvbm9kZV9tb2R1bGVzL0Bkb2xsaG91c2VtY3AvbWNwLXNlcnZlci9kYXRhJyxcbiAgICAgICAgXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gc3RhbmRhcmQgVW5peC9MaW51eFxuICAgICAgICAnL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL0Bkb2xsaG91c2VtY3AvbWNwLXNlcnZlci9kYXRhJyxcbiAgICAgICAgJy91c3IvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgIFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIFdpbmRvd3NcbiAgICAgICAgJ0M6XFxcXFByb2dyYW0gRmlsZXNcXFxcbm9kZWpzXFxcXG5vZGVfbW9kdWxlc1xcXFxAZG9sbGhvdXNlbWNwXFxcXG1jcC1zZXJ2ZXJcXFxcZGF0YScsXG4gICAgICAgICdDOlxcXFxQcm9ncmFtIEZpbGVzICh4ODYpXFxcXG5vZGVqc1xcXFxub2RlX21vZHVsZXNcXFxcQGRvbGxob3VzZW1jcFxcXFxtY3Atc2VydmVyXFxcXGRhdGEnLFxuICAgICAgICBcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBXaW5kb3dzIHdpdGggbnZtXG4gICAgICAgIHBhdGguam9pbihwcm9jZXNzLmVudi5BUFBEQVRBIHx8ICcnLCAnbnBtJywgJ25vZGVfbW9kdWxlcycsICdAZG9sbGhvdXNlbWNwJywgJ21jcC1zZXJ2ZXInLCAnZGF0YScpXG4gICAgICApO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBidW5kbGVkIGRhdGEgZGlyZWN0b3J5IGJ5IGNoZWNraW5nIGVhY2ggc2VhcmNoIHBhdGhcbiAgICogVXNlcyBQcm9taXNlLmFsbFNldHRsZWQgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgY2FjaGVzIHRoZSByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZERhdGFEaXJlY3RvcnkoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCB2YWx1ZSBpZiBhdmFpbGFibGVcbiAgICBpZiAoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBhbGwgcGF0aHMgaW4gcGFyYWxsZWwgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IGNoZWNrUHJvbWlzZXMgPSB0aGlzLmRhdGFTZWFyY2hQYXRocy5tYXAoYXN5bmMgKHNlYXJjaFBhdGgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5zdGF0RmlsZShzZWFyY2hQYXRoKTtcbiAgICAgICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAvLyBWZXJpZnkgaXQgY29udGFpbnMgZXhwZWN0ZWQgc3ViZGlyZWN0b3JpZXNcbiAgICAgICAgICBjb25zdCBoYXNQZXJzb25hcyA9IGF3YWl0IHRoaXMuZGlyZWN0b3J5RXhpc3RzKHBhdGguam9pbihzZWFyY2hQYXRoLCAncGVyc29uYXMnKSk7XG4gICAgICAgICAgY29uc3QgaGFzU2tpbGxzID0gYXdhaXQgdGhpcy5kaXJlY3RvcnlFeGlzdHMocGF0aC5qb2luKHNlYXJjaFBhdGgsICdza2lsbHMnKSk7XG4gICAgICAgICAgaWYgKGhhc1BlcnNvbmFzIHx8IGhhc1NraWxscykge1xuICAgICAgICAgICAgcmV0dXJuIHNlYXJjaFBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgYWNjZXNzZWRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNoZWNrUHJvbWlzZXMpO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcmVzdWx0XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEZvdW5kIGRhdGEgZGlyZWN0b3J5IGF0OiAke3Jlc3VsdC52YWx1ZX1gKTtcbiAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci53YXJuKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTm8gYnVuZGxlZCBkYXRhIGRpcmVjdG9yeSBmb3VuZCBpbiBhbnkgc2VhcmNoIHBhdGgnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhlbHBlciB0byBjaGVjayBpZiBhIGRpcmVjdG9yeSBleGlzdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlyZWN0b3J5RXhpc3RzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoZGlyUGF0aCk7XG4gICAgICByZXR1cm4gc3RhdHMuaXNEaXJlY3RvcnkoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZmlsZSBwYXRoIHRvIHByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiBTRUNVUklUWSBGSVg6IEFkZGVkIGZpbGUgcGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGlyZWN0b3J5IHRyYXZlcnNhbFxuICAgKiBQcmV2aW91c2x5OiBGaWxlIHBhdGhzIHdlcmUgdXNlZCB3aXRob3V0IHZhbGlkYXRpb24sIGFsbG93aW5nIHBvdGVudGlhbCAuLi8uLi8uLi8gYXR0YWNrc1xuICAgKiBOb3c6IFN0cmljdCB2YWxpZGF0aW9uIGVuc3VyZXMgcGF0aHMgc3RheSB3aXRoaW4gYWxsb3dlZCBkaXJlY3Rvcmllc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggVGhlIGZpbGUgcGF0aCB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gYWxsb3dlZEJhc2VQYXRocyBBcnJheSBvZiBhbGxvd2VkIGJhc2UgcGF0aHMgKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHBhdGggaXMgc2FmZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZywgYWxsb3dlZEJhc2VQYXRocz86IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBOb3JtYWxpemUgcGF0aCB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRlbXB0c1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBSZWplY3QgcGF0aHMgY29udGFpbmluZyB0cmF2ZXJzYWwgcGF0dGVybnNcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFBhdGggdHJhdmVyc2FsIGF0dGVtcHQgYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogQ2hlY2sgZm9yIGhvbWUgZGlyZWN0b3J5IGV4cGFuc2lvbiBhdHRlbXB0cywgYnV0IGFsbG93IFdpbmRvd3MgOC4zIHNob3J0IHBhdGggbmFtZXNcbiAgICAgIC8vIFdpbmRvd3Mgc2hvcnQgcGF0aCBuYW1lcyB1c2UgfiBmb2xsb3dlZCBieSBhIGRpZ2l0IChlLmcuLCBSVU5ORVJ+MSksIHdoaWNoIHNob3VsZCBiZSBhbGxvd2VkXG4gICAgICAvLyBPbmx5IGJsb2NrIH4gZm9sbG93ZWQgYnkgLyBvciBcXCAoaG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uIHBhdHRlcm5zKVxuICAgICAgaWYgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCd+LycpIHx8IG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCd+XFxcXCcpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gSG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uIGF0dGVtcHQgYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogUmVqZWN0IGFic29sdXRlIHBhdGhzIG91dHNpZGUgYWxsb3dlZCBkaXJlY3Rvcmllc1xuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShub3JtYWxpemVkUGF0aCkgJiYgYWxsb3dlZEJhc2VQYXRocykge1xuICAgICAgICBjb25zdCBpc0FsbG93ZWQgPSBhbGxvd2VkQmFzZVBhdGhzLnNvbWUoYmFzZVBhdGggPT4ge1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRCYXNlID0gcGF0aC5ub3JtYWxpemUoYmFzZVBhdGgpO1xuICAgICAgICAgIHJldHVybiBub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRCYXNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWlzQWxsb3dlZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQWJzb2x1dGUgcGF0aCBvdXRzaWRlIGFsbG93ZWQgZGlyZWN0b3JpZXM6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBSZWplY3QgbnVsbCBieXRlcyBhbmQgb3RoZXIgZGFuZ2Vyb3VzIGNoYXJhY3RlcnNcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnXFwwJykgfHwgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJ1xceDAwJykpIHsgLy8gTk9TT05BUiAtIE51bGwgYnl0ZSBkZXRlY3Rpb24gZm9yIHNlY3VyaXR5XG4gICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTnVsbCBieXRlIGluIHBhdGggYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQYXRoIHZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gREVQUkVDQVRFRDogQ29tbWVudGVkIG91dCBmaWxlbmFtZSBwYXR0ZXJuIGRldGVjdGlvbiAtIHJlcGxhY2VkIHdpdGggbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uXG4gIC8qKlxuICAgKiBDYWNoZWQgY29tcGlsZWQgcmVnZXggcGF0dGVybnMgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICovXG4gIC8vIHByaXZhdGUgc3RhdGljIGNvbXBpbGVkVGVzdFBhdHRlcm5zOiBSZWdFeHBbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBHZXQgY29tcGlsZWQgdGVzdCBwYXR0ZXJucyB3aXRoIGNhY2hpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICogQHJldHVybnMgQXJyYXkgb2YgY29tcGlsZWQgcmVnZXggcGF0dGVybnNcbiAgICovXG4gIC8vIHByaXZhdGUgZ2V0Q29tcGlsZWRUZXN0UGF0dGVybnMoKTogUmVnRXhwW10ge1xuICAvLyAgIC8vIFVzZSBjYWNoZWQgcGF0dGVybnMgaWYgYXZhaWxhYmxlXG4gIC8vICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29tcGlsZWRUZXN0UGF0dGVybnMpIHtcbiAgLy8gICAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zO1xuICAvLyAgIH1cbiAgLy8gICBcbiAgLy8gICAvLyBDb21waWxlIGFuZCBjYWNoZSBwYXR0ZXJucyBvbiBmaXJzdCB1c2VcbiAgLy8gICAvLyBDUklUSUNBTCBGSVg6IFJlbW92ZWQgb3Zlcmx5IGJyb2FkIC9edGVzdC0vaSBwYXR0ZXJuIHRoYXQgd2FzIGJsb2NraW5nIGxlZ2l0aW1hdGUgdXNlXG4gIC8vICAgLy8gVXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlIHBlcnNvbmFzIGxpa2UgXCJ0ZXN0LWRyaXZlbi1kZXZlbG9wZXJcIiBvciBcInRlc3QtYXV0b21hdGlvbi1leHBlcnRcIlxuICAvLyAgIC8vIFdlIG9ubHkgYmxvY2sgc3BlY2lmaWMgdGVzdCBwYXR0ZXJucyB0aGF0IGFyZSBjbGVhcmx5IGZyb20gb3VyIHRlc3Qgc3VpdGVcbiAgLy8gICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zID0gW1xuICAvLyAgICAgL150ZXN0cGVyc29uYS9pLCAgICAgICAgICAgICAgLy8gT3VyIHRlc3Qgc3VpdGUgcGF0dGVyblxuICAvLyAgICAgL155YW1sdGVzdC9pLCAgICAgICAgICAgICAgICAgLy8gU2VjdXJpdHkgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXnlhbWxib21iL2ksICAgICAgICAgICAgICAgICAvLyBTZWN1cml0eSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9ebWVtb3J5LXRlc3QtL2ksICAgICAgICAgICAgIC8vIFBlcmZvcm1hbmNlIHRlc3QgcGF0dGVyblxuICAvLyAgICAgL15wZXJmLXRlc3QtL2ksICAgICAgICAgICAgICAgLy8gUGVyZm9ybWFuY2UgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXnRlc3QtZml4dHVyZS0vaSwgICAgICAgICAgICAvLyBUZXN0IGZpeHR1cmUgcGF0dGVybiAobW9yZSBzcGVjaWZpYylcbiAgLy8gICAgIC9edGVzdC1kYXRhLS9pLCAgICAgICAgICAgICAgIC8vIFRlc3QgZGF0YSBwYXR0ZXJuIChtb3JlIHNwZWNpZmljKVxuICAvLyAgICAgL2Jpbi1zaHxybS1yZnxwd25lZC9pLCAgICAgICAgLy8gTWFsaWNpb3VzIHBhdHRlcm5zXG4gIC8vICAgICAvY29uY3VycmVudC1cXGQrL2ksICAgICAgICAgICAgLy8gQ29uY3VycmVudCB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9sZWdhY3lcXC5tZCQvaSwgICAgICAgICAgICAgICAvLyBMZWdhY3kgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvcGVyZm9ybWFuY2UtdGVzdC9pLCAgICAgICAgICAvLyBQZXJmb3JtYW5jZSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC8tXFxkezEzfS1bYS16MC05XStcXC5tZCQvaSwgICAgLy8gVGltZXN0YW1wLWJhc2VkIHRlc3QgZmlsZXNcbiAgLy8gICAgIC9edW5pdHRlc3QtL2ksICAgICAgICAgICAgICAgIC8vIFVuaXQgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXmludGVncmF0aW9udGVzdC0vaSwgICAgICAgICAvLyBJbnRlZ3JhdGlvbiB0ZXN0IHBhdHRlcm5cbiAgLy8gICBdO1xuICAvLyAgIFxuICAvLyAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZmlsZW5hbWUgbWF0Y2hlcyB0ZXN0IGRhdGEgcGF0dGVybnMgdGhhdCBzaG91bGQgbmV2ZXIgYmUgY29waWVkIHRvIHByb2R1Y3Rpb25cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGlzRG9sbGhvdXNlTUNQVGVzdEVsZW1lbnQoKSBmb3IgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlbmFtZSBtYXRjaGVzIHRlc3QgcGF0dGVybnMgdGhhdCBzaG91bGQgYmUgYmxvY2tlZFxuICAgKi9cbiAgLy8gcHJpdmF0ZSBpc1Rlc3REYXRhUGF0dGVybihmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLmdldENvbXBpbGVkVGVzdFBhdHRlcm5zKCk7XG4gIC8vICAgcmV0dXJuIHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBwYXR0ZXJuLnRlc3QoZmlsZW5hbWUpKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBSZWFkIG1ldGFkYXRhIGZyb20gWUFNTCBmcm9udG1hdHRlciBvbmx5IChuZXZlciByZWFkcyBjb250ZW50IGJvZHkpXG4gICAqIFVzZXMgYSBzbWFsbCBidWZmZXIgdG8gc2FmZWx5IGV4dHJhY3Qgb25seSB0aGUgZnJvbnRtYXR0ZXIgYmV0d2VlbiAtLS0gbWFya2Vyc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZSB0byByZWFkIG1ldGFkYXRhIGZyb21cbiAgICogQHJldHVybnMgUGFyc2VkIG1ldGFkYXRhIG9iamVjdCBvciBudWxsIGlmIG5vIGZyb250bWF0dGVyIGZvdW5kXG4gICAqL1xuICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT046IFJldXNhYmxlIGJ1ZmZlciBwb29sIHRvIHJlZHVjZSBhbGxvY2F0aW9uc1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBidWZmZXJQb29sOiBCdWZmZXJbXSA9IFtdO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUE9PTF9TSVpFID0gMjA7IC8vIE1FTU9SWSBMRUFLIEZJWDogUmVkdWNlZCBidWZmZXIgcG9vbCBzaXplIHRvIG1hdGNoIGNhY2hlIHNpemUgZm9yIGNvbnNpc3RlbnQgbWVtb3J5IG1hbmFnZW1lbnRcbiAgcHJpdmF0ZSBzdGF0aWMgYnVmZmVyUG9vbFN0YXRzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAsIGNyZWF0ZWQ6IDAgfTtcbiAgXG4gIHByaXZhdGUgZ2V0QnVmZmVyKCk6IEJ1ZmZlciB7XG4gICAgLy8gUEVSRk9STUFOQ0U6IFRyYWNrIGJ1ZmZlciBwb29sIHVzYWdlIGZvciBvcHRpbWl6YXRpb24gbW9uaXRvcmluZ1xuICAgIGxldCBidWZmZXIgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wucG9wKCk7XG4gICAgaWYgKGJ1ZmZlcikge1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuaGl0cysrO1xuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMubWlzc2VzKys7XG4gICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICBidWZmZXIgPSBCdWZmZXIuYWxsb2MoNDA5Nik7XG4gICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDcmVhdGVkIG5ldyBidWZmZXIgKHBvb2wgZW1wdHkpLCB0b3RhbCBjcmVhdGVkOiAke0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLmNyZWF0ZWR9YCk7XG4gICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSByZWxlYXNlQnVmZmVyKGJ1ZmZlcjogQnVmZmVyKTogdm9pZCB7XG4gICAgLy8gQ1JJVElDQUwgRklYOiBBbHdheXMgYXR0ZW1wdCB0byByZXR1cm4gYnVmZmVyIHRvIHBvb2wgZm9yIHJldXNlXG4gICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5sZW5ndGggPCBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9QT09MX1NJWkUpIHtcbiAgICAgIGJ1ZmZlci5maWxsKDApOyAvLyBTRUNVUklUWTogQ2xlYXIgYnVmZmVyIGJlZm9yZSByZXVzZSB0byBwcmV2ZW50IGRhdGEgbGVha2FnZVxuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLnB1c2goYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUEVSRk9STUFOQ0U6IElmIHBvb2wgaXMgZnVsbCwgY2xlYXIgdGhlIGJ1ZmZlciB0byBoZWxwIEdDXG4gICAgICBidWZmZXIuZmlsbCgwKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEJ1ZmZlciBwb29sIGZ1bGwsIGRpc2NhcmRpbmcgYnVmZmVyJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIGJ1ZmZlciBwb29sIGFuZCBjYWNoZSB0byBmcmVlIG1lbW9yeVxuICAgKiBQRVJGT1JNQU5DRSBGSVg6IEFkZGVkIGNsZWFudXAgbWV0aG9kIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgYXBwbGljYXRpb24gc2h1dGRvd24gb3IgcGVyaW9kaWMgY2xlYW51cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGVhbnVwKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGJ1ZmZlciBwb29sXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLmxlbmd0aCA9IDA7XG4gICAgXG4gICAgLy8gQ2xlYXIgbWV0YWRhdGEgY2FjaGVcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuY2xlYXIoKTtcbiAgICBcbiAgICAvLyBDbGVhciBjYWNoZWQgZGF0YSBkaXJlY3RvcnlcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgPSBudWxsO1xuICAgIFxuICAgIC8vIENsZWFyIHBvcHVsYXRpb24gcHJvbWlzZXNcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBvcHVsYXRlSW5Qcm9ncmVzcy5jbGVhcigpO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTWVtb3J5IGNsZWFudXAgY29tcGxldGVkJywge1xuICAgICAgYnVmZmVyU3RhdHM6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLFxuICAgICAgY2FjaGVDbGVhcmVkOiB0cnVlXG4gICAgfSk7XG4gICAgXG4gICAgLy8gUmVzZXQgc3RhdHNcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cyA9IHsgaGl0czogMCwgbWlzc2VzOiAwLCBjcmVhdGVkOiAwIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MgZm9yIG1vbml0b3JpbmdcbiAgICogUEVSRk9STUFOQ0UgTU9OSVRPUklORzogQWRkZWQgc3RhdGlzdGljcyBtZXRob2QgZm9yIHBlcmZvcm1hbmNlIHRyYWNraW5nXG4gICAqIFRoaXMgcHJvdmlkZXMgaW5zaWdodHMgaW50byBidWZmZXIgcG9vbCBlZmZpY2llbmN5IGFuZCBjYWNoZSBwZXJmb3JtYW5jZVxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFBlcmZvcm1hbmNlU3RhdHMoKToge1xuICAgIGJ1ZmZlclBvb2w6IHtcbiAgICAgIGhpdHM6IG51bWJlcjtcbiAgICAgIG1pc3NlczogbnVtYmVyOyBcbiAgICAgIGNyZWF0ZWQ6IG51bWJlcjtcbiAgICAgIGhpdFJhdGU6IG51bWJlcjtcbiAgICAgIHBvb2xTaXplOiBudW1iZXI7XG4gICAgICBtYXhQb29sU2l6ZTogbnVtYmVyO1xuICAgIH07XG4gICAgbWV0YWRhdGFDYWNoZToge1xuICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgbWF4U2l6ZTogbnVtYmVyO1xuICAgIH07XG4gIH0ge1xuICAgIGNvbnN0IGJ1ZmZlckhpdHMgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5oaXRzO1xuICAgIGNvbnN0IGJ1ZmZlck1pc3NlcyA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLm1pc3NlcztcbiAgICBjb25zdCB0b3RhbFJlcXVlc3RzID0gYnVmZmVySGl0cyArIGJ1ZmZlck1pc3NlcztcblxuICAgIHJldHVybiB7XG4gICAgICBidWZmZXJQb29sOiB7XG4gICAgICAgIGhpdHM6IGJ1ZmZlckhpdHMsXG4gICAgICAgIG1pc3NlczogYnVmZmVyTWlzc2VzLFxuICAgICAgICBjcmVhdGVkOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5jcmVhdGVkLFxuICAgICAgICBoaXRSYXRlOiB0b3RhbFJlcXVlc3RzID4gMCA/IGJ1ZmZlckhpdHMgLyB0b3RhbFJlcXVlc3RzIDogMCxcbiAgICAgICAgcG9vbFNpemU6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5sZW5ndGgsXG4gICAgICAgIG1heFBvb2xTaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9QT09MX1NJWkVcbiAgICAgIH0sXG4gICAgICBtZXRhZGF0YUNhY2hlOiB7XG4gICAgICAgIHNpemU6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zaXplLFxuICAgICAgICBtYXhTaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9DQUNIRV9TSVpFXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIG9ubHkgdGhlIFlBTUwgZnJvbnRtYXR0ZXIgbWV0YWRhdGEgZnJvbSBhIGZpbGUgKGZpcnN0IDRLQilcbiAgICpcbiAgICogU0VDVVJJVFkgTk9URSAoSXNzdWUgIzEyMjgpOiBUaGlzIG1ldGhvZCBNVVNUIHVzZSB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUgd2hlbiBjYWxsaW5nXG4gICAqIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSB0byBlbnN1cmUgVW5pY29kZSBzZWN1cml0eSB2YWxpZGF0aW9uIHJ1bnMuIFNldHRpbmcgdmFsaWRhdGVDb250ZW50XG4gICAqIHRvIGZhbHNlIHdvdWxkIGRpc2FibGUgQUxMIGNvbnRlbnQgdmFsaWRhdGlvbiBpbmNsdWRpbmcgemVyby13aWR0aCBjaGFyYWN0ZXIgZGV0ZWN0aW9uLFxuICAgKiBjcmVhdGluZyBhIHNlY3VyaXR5IGJ5cGFzcyB2dWxuZXJhYmlsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlIHRvIHJlYWRcbiAgICogQHBhcmFtIHJldHJpZXMgLSBOdW1iZXIgb2YgcmV0cmllcyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzIChkZWZhdWx0OiAyKVxuICAgKiBAcmV0dXJucyBQYXJzZWQgbWV0YWRhdGEgb2JqZWN0IG9yIG51bGwgaWYgbm8gdmFsaWQgZnJvbnRtYXR0ZXIgZm91bmRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZE1ldGFkYXRhT25seShmaWxlUGF0aDogc3RyaW5nLCByZXRyaWVzID0gMik6IFByb21pc2U8YW55IHwgbnVsbD4ge1xuICAgIC8vIFBFUkZPUk1BTkNFOiBDaGVjayBjYWNoZSBmaXJzdCBiZWZvcmUgcmVhZGluZyBmaWxlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5zdGF0RmlsZShmaWxlUGF0aCk7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IGZpbGVQYXRoO1xuICAgICAgY29uc3QgY2FjaGVkID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgICAgIC8vIFJldHVybiBjYWNoZWQgbWV0YWRhdGEgaWYgZmlsZSBoYXNuJ3QgY2hhbmdlZFxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgaW50ZWdlciBtdGltZSBjb21wYXJpc29uIHRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbiBpc3N1ZXNcbiAgICAgIGlmIChjYWNoZWQgJiYgTWF0aC5mbG9vcihjYWNoZWQubXRpbWUpID09PSBNYXRoLmZsb29yKHN0YXRzLm10aW1lTXMpICYmIGNhY2hlZC5zaXplID09PSBzdGF0cy5zaXplKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENhY2hlIGhpdCBmb3IgJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGNhY2hlZC5tZXRhZGF0YTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgcHJvY2VlZCB3aXRoIG5vcm1hbCBmbG93XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBOT1RFOiBVc2luZyBkaXJlY3QgZnMub3BlbiBmb3IgcGFydGlhbCBmaWxlIHJlYWQgKGZpcnN0IDRLQiBvbmx5KS5cbiAgICAgIC8vIEZpbGVPcGVyYXRpb25zU2VydmljZSBkb2Vzbid0IHN1cHBvcnQgcGFydGlhbCByZWFkcyB3aXRoIGZpbGUgaGFuZGxlcy5cbiAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBrZXB0IGFzIGEgZGlyZWN0IGZzIGNhbGwgZm9yIHBlcmZvcm1hbmNlLWNyaXRpY2FsXG4gICAgICAvLyBtZXRhZGF0YSBleHRyYWN0aW9uIHRoYXQgb25seSBuZWVkcyB0aGUgWUFNTCBmcm9udG1hdHRlci5cbiAgICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgICBjb25zdCBmZCA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG4gICAgICAvLyBQRVJGT1JNQU5DRTogVXNlIGJ1ZmZlciBwb29sIGluc3RlYWQgb2YgYWxsb2NhdGluZyBuZXcgYnVmZmVyIGVhY2ggdGltZVxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmQucmVhZChidWZmZXIsIDAsIDQwOTYsIDApO1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBidWZmZXIuc3ViYXJyYXkoMCwgcmVzdWx0LmJ5dGVzUmVhZCkudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBMb29rIGZvciBZQU1MIGZyb250bWF0dGVyIGJldHdlZW4gLS0tIG1hcmtlcnNcbiAgICAgICAgLy8gU3VwcG9ydCBib3RoIFVuaXggKFxcbikgYW5kIFdpbmRvd3MgKFxcclxcbikgbGluZSBlbmRpbmdzXG4gICAgICAgIGNvbnN0IG1hdGNoID0gaGVhZGVyLm1hdGNoKC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIHJldHVybiBudWxsOyAvLyBObyBmcm9udG1hdHRlciBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQYXJzZSB0aGUgWUFNTCBmcm9udG1hdHRlciBzYWZlbHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTRUNVUklUWSBGSVggKElzc3VlICMxMjI4KTogRW5hYmxlIHZhbGlkYXRlQ29udGVudCB0byBibG9jayB6ZXJvLXdpZHRoIFVuaWNvZGUgYW5kIG90aGVyIHNlY3VyaXR5IHRocmVhdHNcbiAgICAgICAgICAvLyBTZWN1cmVZYW1sUGFyc2VyIHByb3ZpZGVzIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiwgaW5qZWN0aW9uIHByZXZlbnRpb24sIGFuZCBjb250ZW50IHNhbml0aXphdGlvblxuICAgICAgICAgIC8vIEl0IGV4cGVjdHMgZnVsbCBZQU1MIHdpdGggLS0tIG1hcmtlcnMsIHNvIHdlIHJlY29uc3RydWN0IHRoZSBmcm9udG1hdHRlciBibG9ja1xuICAgICAgICAgIC8vIFdlIGRpc2FibGUgZmllbGQtc3BlY2lmaWMgdmFsaWRhdGlvbiBhcyB0aGlzIGlzIGdlbmVyYWwgbWV0YWRhdGEgcGFyc2luZywgbm90IHBlcnNvbmEtc3BlY2lmaWNcbiAgICAgICAgICAvLyBidXQgd2UgTVVTVCBrZWVwIHZhbGlkYXRlQ29udGVudDogdHJ1ZSB0byBlbnN1cmUgVW5pY29kZSBzZWN1cml0eSB2YWxpZGF0aW9uIHJ1bnNcbiAgICAgICAgICBjb25zdCBmdWxsWWFtbCA9IGAtLS1cXG4ke21hdGNoWzFdfVxcbi0tLWA7XG4gICAgICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGZ1bGxZYW1sLCB7XG4gICAgICAgICAgICAvLyBSRVFVSVJFRDogdmFsaWRhdGVDb250ZW50IG11c3QgYmUgdHJ1ZSB0byBlbmFibGUgVW5pY29kZSBzZWN1cml0eSB2YWxpZGF0aW9uIGluY2x1ZGluZ1xuICAgICAgICAgICAgLy8gemVyby13aWR0aCBjaGFyYWN0ZXIgZGV0ZWN0aW9uIChVKzIwMEItVSsyMDBGLCBVK0ZFRkYsIGV0Yy4pLiBTZXR0aW5nIHRoaXMgdG8gZmFsc2VcbiAgICAgICAgICAgIC8vIHdvdWxkIGRpc2FibGUgQUxMIGNvbnRlbnQgdmFsaWRhdGlvbiwgY3JlYXRpbmcgYSBzZWN1cml0eSBieXBhc3MgZm9yIFVuaWNvZGUtYmFzZWQgYXR0YWNrcy5cbiAgICAgICAgICAgIC8vIFNlZSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSgpIGZvciBkZXRlY3Rpb24gbG9naWMuXG4gICAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2UgICAvLyBGaWVsZC1zcGVjaWZpYyB2YWxpZGF0aW9uIGlzIG9wdGlvbmFsIGZvciBnZW5lcmFsIG1ldGFkYXRhIHBhcnNpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlUmVzdWx0LmRhdGE7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUEVSRk9STUFOQ0U6IENhY2hlIHRoZSBtZXRhZGF0YSB3aXRoIGZpbGUgc3RhdHMgZm9yIGZ1dHVyZSByZWFkc1xuICAgICAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09ICdvYmplY3QnICYmIG1ldGFkYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICBjb25zdCBjYWNoZUVudHJ5OiBNZXRhZGF0YUNhY2hlRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbXRpbWU6IHN0YXRzLm10aW1lTXMsXG4gICAgICAgICAgICAgICAgc2l6ZTogc3RhdHMuc2l6ZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gQ1JJVElDQUwgTUVNT1JZIExFQUsgRklYOiBNb3JlIGFnZ3Jlc3NpdmUgY2FjaGUgbWFuYWdlbWVudCB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBlbnRyeSBhbHJlYWR5IGV4aXN0cyBhbmQganVzdCB1cGRhdGUgaXQgaW5zdGVhZCBvZiBhZGRpbmcgbmV3XG4gICAgICAgICAgICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBlbnRyeSAtIG5vIGV2aWN0aW9uIG5lZWRlZFxuICAgICAgICAgICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zZXQoZmlsZVBhdGgsIGNhY2hlRW50cnkpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFVwZGF0ZWQgZXhpc3RpbmcgY2FjaGUgZW50cnkgZm9yICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IGVudHJ5IC0gY2hlY2sgaWYgd2UgbmVlZCB0byBldmljdCBmaXJzdFxuICAgICAgICAgICAgICAgIC8vIFVzZSA+IGluc3RlYWQgb2YgPj0gdG8gZW5zdXJlIHdlIG5ldmVyIGV4Y2VlZCBNQVhfQ0FDSEVfU0laRVxuICAgICAgICAgICAgICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZSA+PSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9DQUNIRV9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAvLyBNb3JlIGFnZ3Jlc3NpdmUgZXZpY3Rpb246IHJlbW92ZSBlbm91Z2ggZW50cmllcyB0byBzdGF5IHdlbGwgdW5kZXIgbGltaXRcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJpZXNUb0V2aWN0ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9DQUNIRV9TSVpFICogMC40KSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBrZXlzVG9FdmljdCA9IEFycmF5LmZyb20oRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmtleXMoKSkuc2xpY2UoMCwgZW50cmllc1RvRXZpY3QpO1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1RvRXZpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXZpY3RlZCAke2tleXNUb0V2aWN0Lmxlbmd0aH0gY2FjaGUgZW50cmllcyB0byBtYW5hZ2UgbWVtb3J5IChjYWNoZSBzaXplIHdhcyAke0RlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zaXplICsga2V5c1RvRXZpY3QubGVuZ3RofSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNldChmaWxlUGF0aCwgY2FjaGVFbnRyeSk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQWRkZWQgbmV3IGNhY2hlIGVudHJ5IGZvciAke2ZpbGVQYXRofSAoY2FjaGUgc2l6ZSBub3c6ICR7RGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNpemV9KWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgLy8gSWdub3JlIGNhY2hlIGVycm9ycywgcmV0dXJuIG1ldGFkYXRhIGFueXdheVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoeWFtbEVycm9yKSB7XG4gICAgICAgICAgLy8gSW52YWxpZCBZQU1MLCByZXR1cm4gbnVsbFxuICAgICAgICAgIC8vIEVOSEFOQ0VNRU5UOiBJbmNsdWRlIGVycm9yIHR5cGUgZm9yIGJldHRlciBkZWJ1Z2dpbmdcbiAgICAgICAgICBjb25zdCB5YW1sRXJyb3JUeXBlID0gKHlhbWxFcnJvciBhcyBhbnkpPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCAnWUFNTEVycm9yJztcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBJbnZhbGlkIFlBTUwgaW4gJHtmaWxlUGF0aH06ICR7eWFtbEVycm9yVHlwZX0gLSAke3lhbWxFcnJvcn1gKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gQ1JJVElDQUwgRklYOiBFbnN1cmUgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCBhbmQgYnVmZmVyIGlzIHJlbGVhc2VkIGluIEFMTCBwYXRoc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZkLmNsb3NlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGNsb3NlRXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjbG9zaW5nIGZpbGUgZGVzY3JpcHRvciBmb3IgJHtmaWxlUGF0aH06ICR7Y2xvc2VFcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQRVJGT1JNQU5DRTogUmV0dXJuIGJ1ZmZlciB0byBwb29sIGZvciByZXVzZVxuICAgICAgICB0aGlzLnJlbGVhc2VCdWZmZXIoYnVmZmVyKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBFTkhBTkNFTUVOVDogSW5jbHVkZSBlcnJvciB0eXBlIGluIGRlYnVnIGxvZ3MgZm9yIGJldHRlciBkZWJ1Z2dpbmdcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IGVycm9yPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCAnVW5rbm93bkVycm9yJztcbiAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGVycm9yPy5jb2RlIHx8ICdOT19DT0RFJztcbiAgICAgIFxuICAgICAgLy8gUkVMSUFCSUxJVFk6IEFkZCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAgICBpZiAocmV0cmllcyA+IDAgJiYgKGVycm9yQ29kZSA9PT0gJ0VCVVNZJyB8fCBlcnJvckNvZGUgPT09ICdFQUdBSU4nKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBSZXRyeWluZyByZWFkIGZvciAke2ZpbGVQYXRofSBhZnRlciAke2Vycm9yVHlwZX06JHtlcnJvckNvZGV9YCk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MCkpOyAvLyBCcmllZiBkZWxheSBiZWZvcmUgcmV0cnlcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZE1ldGFkYXRhT25seShmaWxlUGF0aCwgcmV0cmllcyAtIDEpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3VsZCBub3QgcmVhZCBtZXRhZGF0YSBmcm9tICR7ZmlsZVBhdGh9OiAke2Vycm9yVHlwZX06JHtlcnJvckNvZGV9IC0gJHtlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcn1gKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGZpbGUgaXMgYSBEb2xsaG91c2VNQ1AgdGVzdCBlbGVtZW50IGJhc2VkIG9uIG1ldGFkYXRhXG4gICAqIFRoaXMgcmVwbGFjZXMgZmlsZW5hbWUgcGF0dGVybiBkZXRlY3Rpb24gd2l0aCBhY2N1cmF0ZSBtZXRhZGF0YS1iYXNlZCBkZXRlY3Rpb25cbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGZpbGUgdG8gY2hlY2tcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBjb250YWlucyBfZG9sbGhvdXNlTUNQVGVzdDogdHJ1ZSBtZXRhZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpc0RvbGxob3VzZU1DUFRlc3RFbGVtZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnJlYWRNZXRhZGF0YU9ubHkoZmlsZVBhdGgpO1xuICAgICAgY29uc3QgaXNUZXN0ID0gISEobWV0YWRhdGEgJiYgbWV0YWRhdGEuX2RvbGxob3VzZU1DUFRlc3QgPT09IHRydWUpO1xuICAgICAgXG4gICAgICBcbiAgICAgIHJldHVybiBpc1Rlc3Q7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHdlIGNhbid0IHJlYWQgdGhlIG1ldGFkYXRhLCBhc3N1bWUgaXQncyBub3QgYSB0ZXN0IGZpbGVcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEVycm9yIGNoZWNraW5nIHRlc3QgbWV0YWRhdGEgZm9yICR7ZmlsZVBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgaWYgd2UncmUgaW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50IGJ5IGNoZWNraW5nIGZvciBwcm9kdWN0aW9uIGluZGljYXRvcnNcbiAgICogVXNlcyBhIGNvbmZpZGVuY2UtYmFzZWQgYXBwcm9hY2ggcmVxdWlyaW5nIG11bHRpcGxlIGluZGljYXRvcnMgZm9yIGJldHRlciBhY2N1cmFjeVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgYXBwZWFycyB0byBiZSBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRcbiAgICovXG4gIHByaXZhdGUgaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gQWxsb3cgdGVzdHMgdG8gZXhwbGljaXRseSBvdmVycmlkZSBwcm9kdWN0aW9uIG1vZGUgZGV0ZWN0aW9uXG4gICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ3RydWUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ2ZhbHNlJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBXZWlnaHRlZCBpbmRpY2F0b3JzIGZvciBwcm9kdWN0aW9uIGRldGVjdGlvblxuICAgIGNvbnN0IGluZGljYXRvcnMgPSB7XG4gICAgICAvLyBTdHJvbmcgaW5kaWNhdG9ycyAod2VpZ2h0OiAyKVxuICAgICAgaGFzVXNlckhvbWVEaXI6IChwcm9jZXNzLmVudi5IT01FICYmIChwcm9jZXNzLmVudi5IT01FLmluY2x1ZGVzKCcvVXNlcnMvJykgfHwgcHJvY2Vzcy5lbnYuSE9NRS5pbmNsdWRlcygnL2hvbWUvJykpKSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAhIXByb2Nlc3MuZW52LlVTRVJQUk9GSUxFLFxuICAgICAgaXNQcm9kdWN0aW9uTm9kZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyxcbiAgICAgIG5vdEluVGVzdERpcjogKCgpID0+IHtcbiAgICAgICAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIGZvciBjcm9zcy1wbGF0Zm9ybSBjaGVja2luZyAoV2luZG93cyB1c2VzIFxcIGJ1dCBjaGVja3MgdXNlIC8pXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDd2QgPSBjd2QucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICAgIHJldHVybiAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL3Rlc3QnKSAmJiBcbiAgICAgICAgICAgICAgICFub3JtYWxpemVkQ3dkLmluY2x1ZGVzKCcvX190ZXN0c19fJykgJiYgXG4gICAgICAgICAgICAgICAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL3RlbXAnKSAmJlxuICAgICAgICAgICAgICAgIW5vcm1hbGl6ZWRDd2QuaW5jbHVkZXMoJy9kaXN0L3Rlc3QnKTtcbiAgICAgIH0pKCksXG4gICAgICBcbiAgICAgIC8vIE1vZGVyYXRlIGluZGljYXRvcnMgKHdlaWdodDogMSlcbiAgICAgIG5vdEluQ0k6ICFwcm9jZXNzLmVudi5DSSxcbiAgICAgIG5vVGVzdEVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyxcbiAgICAgIG5vRGV2RW52OiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ2RldmVsb3BtZW50JyxcbiAgICB9O1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSB3ZWlnaHRlZCBzY29yZVxuICAgIGxldCBzY29yZSA9IDA7XG4gICAgaWYgKGluZGljYXRvcnMuaGFzVXNlckhvbWVEaXIpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMuaXNQcm9kdWN0aW9uTm9kZSkgc2NvcmUgKz0gMjtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub3RJblRlc3REaXIpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMubm90SW5DSSkgc2NvcmUgKz0gMTtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub1Rlc3RFbnYpIHNjb3JlICs9IDE7XG4gICAgaWYgKGluZGljYXRvcnMubm9EZXZFbnYpIHNjb3JlICs9IDE7XG4gICAgXG4gICAgLy8gTG9nIGRldGVjdGlvbiBkZXRhaWxzIGZvciBkZWJ1Z2dpbmdcbiAgICBjb25zdCBhY3RpdmVJbmRpY2F0b3JzID0gT2JqZWN0LmVudHJpZXMoaW5kaWNhdG9ycylcbiAgICAgIC5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlKVxuICAgICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gICAgXG4gICAgLy8gVFlQRVNDUklQVCBGSVg6IFJlbW92ZWQgbG9nZ2VyLmlzRGVidWdFbmFibGVkKCkgY2hlY2sgYXMgdGhpcyBtZXRob2QgZG9lc24ndCBleGlzdCBvbiBNQ1BMb2dnZXJcbiAgICAvLyBUaGUgbG9nZ2VyIGFscmVhZHkgaGFuZGxlcyBkZWJ1ZyBsZXZlbCBpbnRlcm5hbGx5LCBzbyB3ZSBjYW4gY2FsbCBkZWJ1ZygpIGRpcmVjdGx5XG4gICAgaWYgKHNjb3JlID49IDMpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQcm9kdWN0aW9uIGVudmlyb25tZW50IGRldGVjdGVkJyxcbiAgICAgICAgeyBzY29yZSwgYWN0aXZlSW5kaWNhdG9ycywgZm9yY2VNb2RlOiAnbm90IHNldCcgfVxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVxdWlyZSBhIHNjb3JlIG9mIGF0IGxlYXN0IDMgZm9yIHByb2R1Y3Rpb24gZGV0ZWN0aW9uIChtb3JlIGNvbmZpZGVudClcbiAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBpbiBlZGdlIGNhc2VzIHdoaWxlIG1haW50YWluaW5nIHNlY3VyaXR5XG4gICAgcmV0dXJuIHNjb3JlID49IDM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb3B5IGFsbCBmaWxlcyBmcm9tIHNvdXJjZSBkaXJlY3RvcnkgdG8gZGVzdGluYXRpb24gZGlyZWN0b3J5XG4gICAqIFNraXBzIGZpbGVzIHRoYXQgYWxyZWFkeSBleGlzdCB0byBwcmVzZXJ2ZSB1c2VyIG1vZGlmaWNhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29weUVsZW1lbnRGaWxlcyhzb3VyY2VEaXI6IHN0cmluZywgZGVzdERpcjogc3RyaW5nLCBlbGVtZW50VHlwZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgY29waWVkQ291bnQgPSAwO1xuICAgIFxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5tYWtlRGlyZWN0b3J5KGRlc3REaXIpO1xuXG4gICAgICAvLyBSZWFkIHNvdXJjZSBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5saXN0RGlyKHNvdXJjZURpcik7XG4gICAgICBcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIFxuICAgICAgICAvLyBPbmx5IGNvcHkgbWFya2Rvd24gZmlsZXNcbiAgICAgICAgaWYgKCFmaWxlLmVuZHNXaXRoKEZJTEVfQ09OU1RBTlRTLkVMRU1FTlRfRVhURU5TSU9OKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBOb3JtYWxpemUgZmlsZW5hbWUgZm9yIHNlY3VyaXR5XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZmlsZSk7XG4gICAgICAgIGlmICghbm9ybWFsaXplZEZpbGUuaXNWYWxpZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZmlsZSB3aXRoIGludmFsaWQgVW5pY29kZTogJHtmaWxlfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlUGF0aCA9IHBhdGguam9pbihzb3VyY2VEaXIsIG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdERpciwgbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQpO1xuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIC8vIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgZmlsZSBwYXRocyB0byBwcmV2ZW50IHBhdGggdHJhdmVyc2FsIGF0dGFja3NcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBtYWxpY2lvdXMgZmlsZXMgZnJvbSBlc2NhcGluZyB0aGUgaW50ZW5kZWQgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgICAgICBjb25zdCBzb3VyY2VWYWxpZCA9IHRoaXMudmFsaWRhdGVGaWxlUGF0aChzb3VyY2VQYXRoLCBbc291cmNlRGlyXSk7XG4gICAgICAgIGNvbnN0IGRlc3RWYWxpZCA9IHRoaXMudmFsaWRhdGVGaWxlUGF0aChkZXN0UGF0aCwgW2Rlc3REaXJdKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghc291cmNlVmFsaWQgfHwgIWRlc3RWYWxpZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBmaWxlIHdpdGggaW52YWxpZCBwYXRoOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICB7IHNvdXJjZVBhdGgsIGRlc3RQYXRoLCBlbGVtZW50VHlwZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUHJvZHVjdGlvbiBzYWZldHkgY2hlY2s6IEJsb2NrIERvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnRzIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzXG4gICAgICAgIC8vIFNraXAgdGhpcyBjaGVjayBpZiBsb2FkVGVzdERhdGEgaXMgZXhwbGljaXRseSBlbmFibGVkIChmb3IgdGVzdGluZyBzY2VuYXJpb3MpXG4gICAgICAgIGlmICghdGhpcy5jb25maWcubG9hZFRlc3REYXRhICYmIHRoaXMuaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQoKSkge1xuICAgICAgICAgIGNvbnN0IGlzRG9sbGhvdXNlVGVzdCA9IGF3YWl0IHRoaXMuaXNEb2xsaG91c2VNQ1BUZXN0RWxlbWVudChzb3VyY2VQYXRoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaXNEb2xsaG91c2VUZXN0KSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTRUNVUklUWTogQmxvY2tpbmcgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBpbiBwcm9kdWN0aW9uOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgZmlsZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgICAgICAgICAgcmVhc29uOiAnRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBkZXRlY3RlZCBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50JyxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGJsb2NrZWQgdGVzdCBkYXRhXG4gICAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdURVNUX0RBVEFfQkxPQ0tFRCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb3B5RWxlbWVudEZpbGVzJyxcbiAgICAgICAgICAgICAgZGV0YWlsczogYEJsb2NrZWQgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBpbiBwcm9kdWN0aW9uOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogJ0RvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgZGV0ZWN0ZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgZGV0ZWN0aW9uTWV0aG9kOiAnbWV0YWRhdGEtYmFzZWQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIGRlc3RpbmF0aW9uIGZpbGUgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgY29uc3QgZGVzdEV4aXN0cyA9IGF3YWl0IHRoaXMuZmlsZUV4aXN0cyhkZXN0UGF0aCk7XG4gICAgICAgIGlmIChkZXN0RXhpc3RzKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZXhpc3RpbmcgZmlsZTogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBWYWxpZGF0ZSBzb3VyY2UgZmlsZSBiZWZvcmUgY29weWluZ1xuICAgICAgICAgIGNvbnN0IHNvdXJjZVN0YXRzID0gYXdhaXQgdGhpcy5zdGF0RmlsZShzb3VyY2VQYXRoKTtcblxuICAgICAgICAgIC8vIENoZWNrIGZpbGUgc2l6ZSBsaW1pdFxuICAgICAgICAgIGlmIChzb3VyY2VTdGF0cy5zaXplID4gRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgb3ZlcnNpemVkIGZpbGUgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH06IGAgK1xuICAgICAgICAgICAgICBgJHtzb3VyY2VTdGF0cy5zaXplfSBieXRlcyAobWF4OiAke0ZJTEVfQ09OU1RBTlRTLk1BWF9GSUxFX1NJWkV9IGJ5dGVzKWAsXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgZmlsZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsIFxuICAgICAgICAgICAgICAgIHNpemU6IHNvdXJjZVN0YXRzLnNpemUsXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDb3B5IHRoZSBmaWxlIHdpdGggdmVyaWZpY2F0aW9uXG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZVdpdGhWZXJpZmljYXRpb24oc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgICAgIGNvcGllZENvdW50Kys7XG4gICAgICAgICAgXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7ZWxlbWVudFR5cGV9OiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWApO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgZWFjaCBmaWxlIGNvcGllZFxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvcHlFbGVtZW50RmlsZXMnLFxuICAgICAgICAgICAgZGV0YWlsczogYENvcGllZCBkZWZhdWx0ICR7ZWxlbWVudFR5cGV9IGZpbGU6ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgIGRlc3RQYXRoLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgZmlsZVNpemU6IChhd2FpdCB0aGlzLnN0YXRGaWxlKGRlc3RQYXRoKSkuc2l6ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRmFpbGVkIHRvIGNvcHkgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgZXJyb3I6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICAgICAgICBzb3VyY2VQYXRoLFxuICAgICAgICAgICAgICBkZXN0UGF0aCxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZmlsZXMgaW5zdGVhZCBvZiBmYWlsaW5nIGNvbXBsZXRlbHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY29waWVkQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7Y29waWVkQ291bnR9ICR7ZWxlbWVudFR5cGV9IGZpbGUocylgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjb3B5aW5nICR7ZWxlbWVudFR5cGV9IGZpbGVzOmAsIGVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNvcGllZENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogQ29weSBhIGZpbGUgd2l0aCBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uXG4gICAqIEVuc3VyZXMgdGhlIGZpbGUgd2FzIGNvcGllZCBjb3JyZWN0bHkgYnkgY29tcGFyaW5nIHNpemVzXG4gICAqL1xuICAvKipcbiAgICogQ2FsY3VsYXRlIGNoZWNrc3VtIG9mIGEgZmlsZSBmb3IgaW50ZWdyaXR5IHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZVxuICAgKiBAcmV0dXJucyBIZXgtZW5jb2RlZCBjaGVja3N1bVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjYWxjdWxhdGVDaGVja3N1bShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChGSUxFX0NPTlNUQU5UUy5DSEVDS1NVTV9BTEdPUklUSE0pO1xuICAgIC8vIE5PVEU6IFVzaW5nIGRpcmVjdCBmcy5vcGVuIGZvciBjaHVua2VkL3N0cmVhbWluZyBmaWxlIHJlYWQuXG4gICAgLy8gRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBmaWxlIGhhbmRsZXMgZm9yIGNodW5rZWQgcmVhZGluZy5cbiAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkga2VwdCBhcyBhIGRpcmVjdCBmcyBjYWxsIGZvciBtZW1vcnktZWZmaWNpZW50XG4gICAgLy8gY2hlY2tzdW0gY2FsY3VsYXRpb24gb24gcG90ZW50aWFsbHkgbGFyZ2UgZmlsZXMuXG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBmcy5vcGVuKGZpbGVQYXRoLCAncicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhGSUxFX0NPTlNUQU5UUy5DSFVOS19TSVpFKTtcbiAgICAgIGxldCBieXRlc1JlYWQ6IG51bWJlcjtcblxuICAgICAgZG8ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJlYW0ucmVhZChidWZmZXIsIDAsIEZJTEVfQ09OU1RBTlRTLkNIVU5LX1NJWkUpO1xuICAgICAgICBieXRlc1JlYWQgPSByZXN1bHQuYnl0ZXNSZWFkO1xuXG4gICAgICAgIGlmIChieXRlc1JlYWQgPiAwKSB7XG4gICAgICAgICAgaGFzaC51cGRhdGUoYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCkpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlIChieXRlc1JlYWQgPiAwKTtcblxuICAgICAgcmV0dXJuIGhhc2guZGlnZXN0KCdoZXgnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgc3RyZWFtLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgZmlsZSB3aXRoIGludGVncml0eSB2ZXJpZmljYXRpb24gYW5kIHJldHJ5IGxvZ2ljXG4gICAqIEBwYXJhbSBzb3VyY2VQYXRoIFNvdXJjZSBmaWxlIHBhdGhcbiAgICogQHBhcmFtIGRlc3RQYXRoIERlc3RpbmF0aW9uIGZpbGUgcGF0aFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGNvcHkgZmFpbHMgYWZ0ZXIgYWxsIHJldHJ5IGF0dGVtcHRzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvcHlGaWxlV2l0aFZlcmlmaWNhdGlvbihzb3VyY2VQYXRoOiBzdHJpbmcsIGRlc3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gQ09QWV9SRVRSWV9BVFRFTVBUUzsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDb3B5IHRoZSBmaWxlXG4gICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVPcChzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHNpemUgbWF0Y2hlc1xuICAgICAgICBjb25zdCBbc291cmNlU3RhdHMsIGRlc3RTdGF0c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgdGhpcy5zdGF0RmlsZShzb3VyY2VQYXRoKSxcbiAgICAgICAgICB0aGlzLnN0YXRGaWxlKGRlc3RQYXRoKVxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoc291cmNlU3RhdHMuc2l6ZSAhPT0gZGVzdFN0YXRzLnNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU2l6ZSBtaXNtYXRjaCBhZnRlciBjb3B5IC0gc291cmNlOiAke3NvdXJjZVN0YXRzLnNpemV9IGJ5dGVzLCBgICtcbiAgICAgICAgICAgIGBkZXN0aW5hdGlvbjogJHtkZXN0U3RhdHMuc2l6ZX0gYnl0ZXNgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZlcmlmeSBjaGVja3N1bSBtYXRjaGVzIGZvciBjb21wbGV0ZSBpbnRlZ3JpdHlcbiAgICAgICAgY29uc3QgW3NvdXJjZUNoZWNrc3VtLCBkZXN0Q2hlY2tzdW1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ2hlY2tzdW0oc291cmNlUGF0aCksXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVDaGVja3N1bShkZXN0UGF0aClcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHNvdXJjZUNoZWNrc3VtICE9PSBkZXN0Q2hlY2tzdW0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2hlY2tzdW0gbWlzbWF0Y2ggYWZ0ZXIgY29weSAtIHNvdXJjZTogJHtzb3VyY2VDaGVja3N1bX0sIGAgK1xuICAgICAgICAgICAgYGRlc3RpbmF0aW9uOiAke2Rlc3RDaGVja3N1bX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBwcm9wZXIgcGVybWlzc2lvbnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNobW9kRmlsZShkZXN0UGF0aCwgRklMRV9DT05TVEFOVFMuRklMRV9QRVJNSVNTSU9OUyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3VsZCBub3Qgc2V0IHBlcm1pc3Npb25zIG9uICR7ZGVzdFBhdGh9OiAke2Vycm9yfWAsXG4gICAgICAgICAgICB7IHNvdXJjZVBhdGgsIGRlc3RQYXRoLCBhdHRlbXB0IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VjY2VzcyAtIGZpbGUgY29waWVkIGFuZCB2ZXJpZmllZFxuICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTdWNjZXNzZnVsbHkgY29waWVkIGFuZCB2ZXJpZmllZDogJHtwYXRoLmJhc2VuYW1lKHNvdXJjZVBhdGgpfWAsXG4gICAgICAgICAgeyBzaXplOiBzb3VyY2VTdGF0cy5zaXplLCBjaGVja3N1bTogc291cmNlQ2hlY2tzdW0uc3Vic3RyaW5nKDAsIDgpIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBhcyBFcnJvcjtcblxuICAgICAgICAvLyBDbGVhbiB1cCBmYWlsZWQgY29weVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRmlsZU9wKGRlc3RQYXRoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXR0ZW1wdCA8IENPUFlfUkVUUllfQVRURU1QVFMpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvcHkgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZCwgcmV0cnlpbmcuLi5gLFxuICAgICAgICAgICAgeyBlcnJvcjogbGFzdEVycm9yLm1lc3NhZ2UsIHNvdXJjZVBhdGgsIGRlc3RQYXRoIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBDT1BZX1JFVFJZX0RFTEFZICogYXR0ZW1wdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFsbCBhdHRlbXB0cyBmYWlsZWRcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGNvcHkgJHtwYXRoLmJhc2VuYW1lKHNvdXJjZVBhdGgpfSBhZnRlciAke0NPUFlfUkVUUllfQVRURU1QVFN9IGF0dGVtcHRzOiBgICtcbiAgICAgIGAke2xhc3RFcnJvcj8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YFxuICAgICk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSB0aGUgcG9ydGZvbGlvIHdpdGggZGVmYXVsdCBlbGVtZW50cyBmcm9tIGJ1bmRsZWQgZGF0YVxuICAgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgcG9ydGZvbGlvIGluaXRpYWxpemF0aW9uIGZvciBuZXcgaW5zdGFsbGF0aW9uc1xuICAgKiBQcm90ZWN0ZWQgYWdhaW5zdCBjb25jdXJyZW50IGNhbGxzIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcG9wdWxhdGVEZWZhdWx0cyhwb3J0Zm9saW9CYXNlRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBwb3B1bGF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgcG9ydGZvbGlvXG4gICAgY29uc3QgZXhpc3RpbmdQb3B1bGF0aW9uID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3MuZ2V0KHBvcnRmb2xpb0Jhc2VEaXIpO1xuICAgIGlmIChleGlzdGluZ1BvcHVsYXRpb24pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQb3B1bGF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHBvcnRmb2xpbywgd2FpdGluZy4uLicsXG4gICAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nUG9wdWxhdGlvbjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG5ldyBwb3B1bGF0aW9uIHByb21pc2VcbiAgICBjb25zdCBwb3B1bGF0aW9uUHJvbWlzZSA9IHRoaXMucGVyZm9ybVBvcHVsYXRpb24ocG9ydGZvbGlvQmFzZURpcilcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgd2hlbiBkb25lXG4gICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLmRlbGV0ZShwb3J0Zm9saW9CYXNlRGlyKTtcbiAgICAgIH0pO1xuICAgIFxuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLnNldChwb3J0Zm9saW9CYXNlRGlyLCBwb3B1bGF0aW9uUHJvbWlzZSk7XG4gICAgcmV0dXJuIHBvcHVsYXRpb25Qcm9taXNlO1xuICB9XG4gIFxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHBvcHVsYXRpb24gb2YgZGVmYXVsdCBlbGVtZW50c1xuICAgKiBAcGFyYW0gcG9ydGZvbGlvQmFzZURpciBCYXNlIGRpcmVjdG9yeSBvZiB0aGUgcG9ydGZvbGlvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1Qb3B1bGF0aW9uKHBvcnRmb2xpb0Jhc2VEaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIHRlc3QgZGF0YSBsb2FkaW5nIGlzIGRpc2FibGVkXG4gICAgLy8gTm90ZTogVGhpcyBjaGVjayBpcyBuZWVkZWQgZXZlbiB0aG91Z2ggY29uc3RydWN0b3Igc2V0cyBjb25maWcsIGJlY2F1c2VcbiAgICAvLyBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgY29uc3RydWN0aW9uXG4gICAgXG4gICAgLy8gVXNlIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgZGV0ZWN0aW9uIHRoYXQgcmVzcGVjdHMgRk9SQ0VfUFJPRFVDVElPTl9NT0RFXG4gICAgY29uc3QgaXNEZXZlbG9wbWVudE1vZGUgPSAhdGhpcy5pc1Byb2R1Y3Rpb25FbnZpcm9ubWVudCgpO1xuICAgIFxuICAgIGlmIChpc0RldmVsb3BtZW50TW9kZSAmJiAhdGhpcy5jb25maWcubG9hZFRlc3REYXRhKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBkZWZhdWx0IGVsZW1lbnQgcG9wdWxhdGlvbiBpbiBkZXZlbG9wbWVudCBtb2RlJyxcbiAgICAgICAgeyBcbiAgICAgICAgICBwb3J0Zm9saW9CYXNlRGlyLFxuICAgICAgICAgIHJlYXNvbjogJ1Rlc3QgZGF0YSBsb2FkaW5nIGRpc2FibGVkJyxcbiAgICAgICAgICBlbmFibGVXaXRoOiAnU2V0IERPTExIT1VTRV9MT0FEX1RFU1RfREFUQT10cnVlIHRvIGVuYWJsZSdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN0YXJ0aW5nIGRlZmF1bHQgZWxlbWVudCBwb3B1bGF0aW9uJyxcbiAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgKTtcbiAgICBcbiAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIHBvcnRmb2xpbyBpbml0aWFsaXphdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdQT1JURk9MSU9fSU5JVElBTElaQVRJT04nLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wZXJmb3JtUG9wdWxhdGlvbicsXG4gICAgICBkZXRhaWxzOiBgU3RhcnRpbmcgZGVmYXVsdCBlbGVtZW50IHBvcHVsYXRpb24gZm9yIHBvcnRmb2xpbzogJHtwb3J0Zm9saW9CYXNlRGlyfWBcbiAgICB9KTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBidW5kbGVkIGRhdGEgZGlyZWN0b3J5XG4gICAgY29uc3QgZGF0YURpciA9IGF3YWl0IHRoaXMuZmluZERhdGFEaXJlY3RvcnkoKTtcbiAgICBpZiAoIWRhdGFEaXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnkgZm91bmQgLSBwb3J0Zm9saW8gd2lsbCBzdGFydCBlbXB0eScsXG4gICAgICAgIHsgXG4gICAgICAgICAgc2VhcmNoUGF0aHM6IHRoaXMuZGF0YVNlYXJjaFBhdGhzLnNsaWNlKDAsIDMpLCAvLyBMb2cgZmlyc3QgZmV3IHBhdGhzIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgZGlybmFtZTogdGhpcy5fX2Rpcm5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJhY2sgdG90YWwgZmlsZXMgY29waWVkXG4gICAgbGV0IHRvdGFsQ29waWVkID0gMDtcbiAgICBjb25zdCBjb3BpZWRDb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBcbiAgICAvLyBDb3B5IGVhY2ggZWxlbWVudCB0eXBlIC0gZGlyZWN0b3JpZXMgbm93IG1hdGNoIGVudW0gdmFsdWVzIChhbGwgcGx1cmFsKVxuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZURpciA9IHBhdGguam9pbihkYXRhRGlyLCBlbGVtZW50VHlwZSk7XG4gICAgICBjb25zdCBkZXN0RGlyID0gcGF0aC5qb2luKHBvcnRmb2xpb0Jhc2VEaXIsIGVsZW1lbnRUeXBlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgc291cmNlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGNvbnN0IHNvdXJjZURpckV4aXN0cyA9IGF3YWl0IHRoaXMuZmlsZUV4aXN0cyhzb3VyY2VEaXIpO1xuICAgICAgaWYgKCFzb3VyY2VEaXJFeGlzdHMpIHtcbiAgICAgICAgLy8gU291cmNlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBza2lwXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vICR7ZWxlbWVudFR5cGV9IGRpcmVjdG9yeSBpbiBidW5kbGVkIGRhdGFgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvcGllZENvdW50ID0gYXdhaXQgdGhpcy5jb3B5RWxlbWVudEZpbGVzKHNvdXJjZURpciwgZGVzdERpciwgZWxlbWVudFR5cGUpO1xuICAgICAgICBjb3BpZWRDb3VudHNbZWxlbWVudFR5cGVdID0gY29waWVkQ291bnQ7XG4gICAgICAgIHRvdGFsQ29waWVkICs9IGNvcGllZENvdW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXJyb3IgY29weWluZyAke2VsZW1lbnRUeXBlfSBlbGVtZW50czpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmICh0b3RhbENvcGllZCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN1Y2Nlc3NmdWxseSBwb3B1bGF0ZWQgcG9ydGZvbGlvIHdpdGggJHt0b3RhbENvcGllZH0gZGVmYXVsdCBlbGVtZW50KHMpYCxcbiAgICAgICAge1xuICAgICAgICAgIHBvcnRmb2xpb0Jhc2VEaXIsXG4gICAgICAgICAgZGF0YURpcixcbiAgICAgICAgICBicmVha2Rvd246IGNvcGllZENvdW50c1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIHN1Y2Nlc3NmdWwgcG9wdWxhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUE9SVEZPTElPX1BPUFVMQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wZXJmb3JtUG9wdWxhdGlvbicsXG4gICAgICAgIGRldGFpbHM6IGBTdWNjZXNzZnVsbHkgcG9wdWxhdGVkIHBvcnRmb2xpbyB3aXRoICR7dG90YWxDb3BpZWR9IGRlZmF1bHQgZWxlbWVudHNgLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHBvcnRmb2xpb0Jhc2VEaXIsXG4gICAgICAgICAgZGF0YURpcixcbiAgICAgICAgICBjb3BpZWRDb3VudHNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTm8gbmV3IGVsZW1lbnRzIHRvIGNvcHkgLSBwb3J0Zm9saW8gbWF5IGFscmVhZHkgaGF2ZSBjb250ZW50Jyk7XG4gICAgfVxuICB9XG59Il19
@@ -1 +1 @@
1
- {"version":3,"file":"EnhancedIndexManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/EnhancedIndexManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EnhancedIndexManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/EnhancedIndexManager.ts"],"names":[],"mappings":"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"}