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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/CHANGELOG.md +52 -61
  2. package/README.github.md +2 -2
  3. package/README.md +2 -2
  4. package/README.md.backup +284 -224
  5. package/README.npm.md +2 -2
  6. package/dist/cache/LRUCache.d.ts +3 -0
  7. package/dist/cache/LRUCache.d.ts.map +1 -1
  8. package/dist/cache/LRUCache.js +36 -26
  9. package/dist/config/env.d.ts +14 -4
  10. package/dist/config/env.d.ts.map +1 -1
  11. package/dist/config/env.js +20 -6
  12. package/dist/di/Container.d.ts +21 -0
  13. package/dist/di/Container.d.ts.map +1 -1
  14. package/dist/di/Container.js +250 -53
  15. package/dist/elements/BaseElement.d.ts.map +1 -1
  16. package/dist/elements/BaseElement.js +5 -10
  17. package/dist/elements/base/BaseElementManager.d.ts +22 -0
  18. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  19. package/dist/elements/base/BaseElementManager.js +47 -7
  20. package/dist/elements/memories/Memory.d.ts +1 -0
  21. package/dist/elements/memories/Memory.d.ts.map +1 -1
  22. package/dist/elements/memories/Memory.js +12 -8
  23. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  24. package/dist/elements/memories/MemoryManager.js +23 -42
  25. package/dist/elements/memories/MemorySearchIndex.js +2 -2
  26. package/dist/generated/version.d.ts +2 -2
  27. package/dist/generated/version.d.ts.map +1 -1
  28. package/dist/generated/version.js +3 -3
  29. package/dist/handlers/EnhancedIndexHandler.js +6 -6
  30. package/dist/handlers/element-crud/listElements.d.ts +2 -0
  31. package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
  32. package/dist/handlers/element-crud/listElements.js +3 -1
  33. package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
  35. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
  36. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  37. package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
  38. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  39. package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
  40. package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
  41. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  42. package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
  43. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
  44. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
  45. package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
  46. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  47. package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -3
  50. package/dist/logging/LogHooks.js +11 -11
  51. package/dist/logging/LogManager.d.ts +0 -2
  52. package/dist/logging/LogManager.d.ts.map +1 -1
  53. package/dist/logging/LogManager.js +1 -3
  54. package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
  55. package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
  56. package/dist/logging/sinks/MemoryLogSink.js +12 -3
  57. package/dist/logging/types.d.ts +0 -2
  58. package/dist/logging/types.d.ts.map +1 -1
  59. package/dist/logging/types.js +1 -1
  60. package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
  61. package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
  62. package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
  63. package/dist/metrics/MetricsManager.d.ts +47 -0
  64. package/dist/metrics/MetricsManager.d.ts.map +1 -0
  65. package/dist/metrics/MetricsManager.js +232 -0
  66. package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
  67. package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
  68. package/dist/metrics/OperationMetricsTracker.js +53 -0
  69. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
  70. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
  71. package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
  72. package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
  73. package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
  74. package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
  75. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
  76. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
  77. package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
  78. package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
  79. package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
  80. package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
  81. package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
  82. package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
  83. package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
  84. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
  85. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
  86. package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
  87. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
  88. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
  89. package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
  90. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
  91. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
  92. package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
  93. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
  94. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
  95. package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
  96. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
  97. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
  98. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
  99. package/dist/metrics/collectors/index.d.ts +11 -0
  100. package/dist/metrics/collectors/index.d.ts.map +1 -0
  101. package/dist/metrics/collectors/index.js +11 -0
  102. package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
  103. package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
  104. package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
  105. package/dist/metrics/types.d.ts +98 -0
  106. package/dist/metrics/types.d.ts.map +1 -0
  107. package/dist/metrics/types.js +24 -0
  108. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  109. package/dist/portfolio/DefaultElementProvider.js +1 -7
  110. package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
  111. package/dist/portfolio/EnhancedIndexManager.js +18 -18
  112. package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
  113. package/dist/portfolio/NLPScoringManager.js +5 -9
  114. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  115. package/dist/portfolio/RelationshipManager.js +2 -2
  116. package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
  117. package/dist/portfolio/VerbTriggerManager.js +5 -19
  118. package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
  119. package/dist/portfolio/config/IndexConfig.js +1 -12
  120. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
  121. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
  122. package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
  123. package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
  124. package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
  125. package/dist/portfolio/types/RelationshipTypes.js +3 -17
  126. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  127. package/dist/security/audit/config/suppressions.js +36 -8
  128. package/dist/security/constants.d.ts.map +1 -1
  129. package/dist/security/constants.js +10 -6
  130. package/dist/security/fileLockManager.d.ts.map +1 -1
  131. package/dist/security/fileLockManager.js +8 -6
  132. package/dist/security/secureYamlParser.d.ts.map +1 -1
  133. package/dist/security/secureYamlParser.js +1 -13
  134. package/dist/security/securityMonitor.d.ts +2 -1
  135. package/dist/security/securityMonitor.d.ts.map +1 -1
  136. package/dist/security/securityMonitor.js +14 -3
  137. package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
  138. package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
  139. package/dist/security/telemetry/SecurityTelemetry.js +30 -2
  140. package/dist/security/tokenManager.d.ts +3 -0
  141. package/dist/security/tokenManager.d.ts.map +1 -1
  142. package/dist/security/tokenManager.js +13 -5
  143. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  144. package/dist/security/validation/BackgroundValidator.js +7 -7
  145. package/dist/server/startup.d.ts.map +1 -1
  146. package/dist/server/startup.js +8 -24
  147. package/dist/server/tools/MCPAQLTools.js +4 -1
  148. package/dist/services/ActivationStore.d.ts.map +1 -1
  149. package/dist/services/ActivationStore.js +9 -3
  150. package/dist/services/FileWatchService.d.ts +1 -0
  151. package/dist/services/FileWatchService.d.ts.map +1 -1
  152. package/dist/services/FileWatchService.js +83 -48
  153. package/dist/services/MetadataService.d.ts.map +1 -1
  154. package/dist/services/MetadataService.js +7 -2
  155. package/dist/services/query/ElementQueryService.d.ts.map +1 -1
  156. package/dist/services/query/ElementQueryService.js +1 -41
  157. package/dist/services/query/PaginationService.d.ts.map +1 -1
  158. package/dist/services/query/PaginationService.js +1 -14
  159. package/dist/services/query/SortService.d.ts.map +1 -1
  160. package/dist/services/query/SortService.js +1 -6
  161. package/dist/services/validation/ValidationService.d.ts.map +1 -1
  162. package/dist/services/validation/ValidationService.js +3 -8
  163. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  164. package/dist/storage/ElementStorageLayer.js +5 -2
  165. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  166. package/dist/storage/MemoryStorageLayer.js +5 -2
  167. package/dist/telemetry/OperationalTelemetry.js +2 -2
  168. package/dist/utils/EventDeduplicator.d.ts +44 -0
  169. package/dist/utils/EventDeduplicator.d.ts.map +1 -0
  170. package/dist/utils/EventDeduplicator.js +93 -0
  171. package/dist/utils/FileLock.d.ts.map +1 -1
  172. package/dist/utils/FileLock.js +1 -9
  173. package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
  174. package/dist/utils/PerformanceMonitor.js +5 -5
  175. package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
  176. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  177. package/dist/utils/SlidingWindowRateLimiter.js +23 -0
  178. package/dist/web/console/IngestRoutes.d.ts +84 -0
  179. package/dist/web/console/IngestRoutes.d.ts.map +1 -0
  180. package/dist/web/console/IngestRoutes.js +252 -0
  181. package/dist/web/console/LeaderElection.d.ts +89 -0
  182. package/dist/web/console/LeaderElection.d.ts.map +1 -0
  183. package/dist/web/console/LeaderElection.js +205 -0
  184. package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
  185. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
  186. package/dist/web/console/LeaderForwardingSink.js +197 -0
  187. package/dist/web/console/SessionNames.d.ts +46 -0
  188. package/dist/web/console/SessionNames.d.ts.map +1 -0
  189. package/dist/web/console/SessionNames.js +257 -0
  190. package/dist/web/console/UnifiedConsole.d.ts +64 -0
  191. package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
  192. package/dist/web/console/UnifiedConsole.js +119 -0
  193. package/dist/web/contentPipeline.d.ts +58 -0
  194. package/dist/web/contentPipeline.d.ts.map +1 -0
  195. package/dist/web/contentPipeline.js +112 -0
  196. package/dist/web/portDiscovery.d.ts +58 -0
  197. package/dist/web/portDiscovery.d.ts.map +1 -0
  198. package/dist/web/portDiscovery.js +143 -0
  199. package/dist/web/public/app.js +148 -60
  200. package/dist/web/public/logs.js +638 -0
  201. package/dist/web/public/metrics.js +682 -0
  202. package/dist/web/public/permissions.js +394 -0
  203. package/dist/web/public/sessions.js +369 -0
  204. package/dist/web/routes/healthRoutes.d.ts +16 -0
  205. package/dist/web/routes/healthRoutes.d.ts.map +1 -0
  206. package/dist/web/routes/healthRoutes.js +29 -0
  207. package/dist/web/routes/logRoutes.d.ts +18 -0
  208. package/dist/web/routes/logRoutes.d.ts.map +1 -0
  209. package/dist/web/routes/logRoutes.js +126 -0
  210. package/dist/web/routes/metricsRoutes.d.ts +17 -0
  211. package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
  212. package/dist/web/routes/metricsRoutes.js +90 -0
  213. package/dist/web/routes/permissionRoutes.d.ts +16 -0
  214. package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
  215. package/dist/web/routes/permissionRoutes.js +133 -0
  216. package/dist/web/routes.d.ts.map +1 -1
  217. package/dist/web/routes.js +309 -339
  218. package/dist/web/server.d.ts +21 -1
  219. package/dist/web/server.d.ts.map +1 -1
  220. package/dist/web/server.js +42 -4
  221. package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
  222. package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
  223. package/dist/web/sinks/WebSSELogSink.js +22 -0
  224. package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
  225. package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
  226. package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
  227. package/package.json +2 -2
  228. package/server.json +2 -2
  229. package/dist/constants/version.d.ts +0 -3
  230. package/dist/constants/version.d.ts.map +0 -1
  231. package/dist/constants/version.js +0 -4
  232. package/dist/logging/sinks/SSELogSink.d.ts +0 -35
  233. package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
  234. package/dist/logging/sinks/SSELogSink.js +0 -181
  235. package/dist/logging/viewer/viewerHtml.d.ts +0 -8
  236. package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
  237. package/dist/logging/viewer/viewerHtml.js +0 -204
  238. package/dist/web/public/public/app.js +0 -1878
@@ -1,6 +1,6 @@
1
1
  import os from "os";
2
2
  import * as path from "path";
3
- import { VERSION } from "../constants/version.js";
3
+ import { PACKAGE_VERSION, PACKAGE_VERSION as VERSION } from "../generated/version.js";
4
4
  import { SecurityMonitor } from "../security/securityMonitor.js";
5
5
  import { VerbTriggerManager } from "../portfolio/VerbTriggerManager.js";
6
6
  import { RelationshipManager } from "../portfolio/RelationshipManager.js";
@@ -24,7 +24,8 @@ import { TemplateRenderer } from "../utils/TemplateRenderer.js";
24
24
  import { AgentManager } from "../elements/agents/AgentManager.js";
25
25
  import { Memory } from "../elements/memories/Memory.js";
26
26
  import { MemoryManager } from "../elements/memories/MemoryManager.js";
27
- import { SSELogSink } from "../logging/sinks/SSELogSink.js";
27
+ import { WebSSELogSink } from "../web/sinks/WebSSELogSink.js";
28
+ import { WebSSEMetricsSink } from "../web/sinks/WebSSEMetricsSink.js";
28
29
  import { EnsembleManager } from "../elements/ensembles/EnsembleManager.js";
29
30
  import { PersonaExporter, PersonaImporter } from "../persona/export-import/index.js";
30
31
  import { PersonaManager } from "../persona/PersonaManager.js";
@@ -93,13 +94,18 @@ import { TokenManager } from "../security/tokenManager.js";
93
94
  import { PaginationService, FilterService, SortService, ElementQueryService, } from '../services/query/index.js';
94
95
  import { RetentionPolicyService, MemoryRetentionStrategy } from '../services/RetentionPolicyService.js';
95
96
  import { PolicyExportService } from '../services/PolicyExportService.js';
96
- import { PACKAGE_VERSION } from '../generated/version.js';
97
97
  import { LogManager, buildLogManagerConfig } from '../logging/LogManager.js';
98
98
  import { FileLogSink } from '../logging/sinks/FileLogSink.js';
99
99
  import { MemoryLogSink } from '../logging/sinks/MemoryLogSink.js';
100
100
  import { PlainTextFormatter } from '../logging/formatters/PlainTextFormatter.js';
101
101
  import { JsonlFormatter } from '../logging/formatters/JsonlFormatter.js';
102
102
  import { wireLogHooks, getTriggerMetricsLogListener } from '../logging/LogHooks.js';
103
+ import { MetricsManager } from '../metrics/MetricsManager.js';
104
+ import { MemoryMetricsSink } from '../metrics/sinks/MemoryMetricsSink.js';
105
+ import { buildMetricsManagerConfig } from '../metrics/types.js';
106
+ import { PerformanceMonitorCollector, LRUCacheCollector, SecurityMonitorCollector, SecurityTelemetryCollector, FileLockManagerCollector, DefaultElementProviderCollector, TriggerMetricsTrackerCollector, OperationalTelemetryCollector, OperationMetricsCollector, GatekeeperMetricsCollector, } from '../metrics/collectors/index.js';
107
+ import { OperationMetricsTracker } from '../metrics/OperationMetricsTracker.js';
108
+ import { GatekeeperMetricsTracker } from '../metrics/GatekeeperMetricsTracker.js';
103
109
  export class DollhouseContainer {
104
110
  services = new Map();
105
111
  personasDir = null;
@@ -283,17 +289,7 @@ export class DollhouseContainer {
283
289
  telemetryCapacity: config.memoryTelemetryCapacity,
284
290
  });
285
291
  manager.registerSink(memorySink);
286
- // Register as named service for Phase 5's MCP query tool
287
292
  this.register('MemoryLogSink', () => memorySink);
288
- // Phase 6: SSELogSink (opt-in HTTP debug viewer)
289
- if (config.viewerEnabled) {
290
- const sseSink = new SSELogSink({
291
- port: config.viewerPort,
292
- memorySink: memorySink,
293
- });
294
- manager.registerSink(sseSink);
295
- void sseSink.start();
296
- }
297
293
  // Startup marker — first entry in every server session
298
294
  manager.log({
299
295
  id: manager.generateId(),
@@ -306,11 +302,25 @@ export class DollhouseContainer {
306
302
  version: VERSION,
307
303
  logLevel: config.logLevel,
308
304
  logFormat: config.logFormat,
309
- viewer: config.viewerEnabled ? `http://127.0.0.1:${config.viewerPort}` : 'disabled',
305
+ console: env.DOLLHOUSE_WEB_CONSOLE ? 'http://dollhouse.localhost:3939' : 'disabled',
310
306
  },
311
307
  });
312
308
  return manager;
313
309
  });
310
+ // METRICS COLLECTION
311
+ // MemoryMetricsSink is registered separately (not as a side effect inside
312
+ // MetricsManager's factory) so it's available in the container regardless
313
+ // of MetricsManager resolution order.
314
+ const metricsConfig = buildMetricsManagerConfig(env);
315
+ if (metricsConfig.enabled) {
316
+ const memoryMetricsSink = new MemoryMetricsSink(metricsConfig.memorySnapshotCapacity);
317
+ this.register('MemoryMetricsSink', () => memoryMetricsSink);
318
+ this.register('MetricsManager', () => {
319
+ const manager = new MetricsManager(metricsConfig, logger);
320
+ manager.registerSink(memoryMetricsSink);
321
+ return manager;
322
+ });
323
+ }
314
324
  // TELEMETRY
315
325
  this.register('OperationalTelemetry', () => new OperationalTelemetry(this.resolve('FileOperationsService')));
316
326
  // BACKUP SERVICE (Issue #659: Universal backup for all element types)
@@ -476,6 +486,8 @@ export class DollhouseContainer {
476
486
  monitor.startMonitoring();
477
487
  return monitor;
478
488
  });
489
+ this.register('OperationMetricsTracker', () => new OperationMetricsTracker(), { singleton: true });
490
+ this.register('GatekeeperMetricsTracker', () => new GatekeeperMetricsTracker(), { singleton: true });
479
491
  }
480
492
  getPersonasDir() {
481
493
  return this.personasDir;
@@ -585,7 +597,21 @@ export class DollhouseContainer {
585
597
  logger.info(`[Startup] Test delay injected: ${testDelay}ms`);
586
598
  await new Promise(resolve => setTimeout(resolve, testDelay));
587
599
  }
588
- // --- memory_autoload (deferred) ---
600
+ await this.deferredMemoryAutoload(timer);
601
+ await this.deferredActivationRestore(timer);
602
+ await this.deferredPolicyExport();
603
+ await this.deferredLogHooks(timer);
604
+ await this.deferredMetricsCollectors(timer);
605
+ await this.deferredWebConsole(timer);
606
+ await this.deferredDangerZoneInit(timer);
607
+ await this.deferredPatternEncryption(timer);
608
+ await this.deferredBackgroundValidator(timer);
609
+ this.deferredSetupComplete = true;
610
+ const report = timer.getReport();
611
+ logger.info(`[Startup] Deferred setup completed in ${report.deferredMs}ms ` +
612
+ `(total startup: ${report.totalMs}ms, critical: ${report.criticalPathMs}ms)`);
613
+ }
614
+ async deferredMemoryAutoload(timer) {
589
615
  timer.startPhase('memory_autoload', false);
590
616
  try {
591
617
  const configManager = this.resolve('ConfigManager');
@@ -607,7 +633,8 @@ export class DollhouseContainer {
607
633
  logger.error('[Container] Memory auto-load failed:', error);
608
634
  }
609
635
  timer.endPhase('memory_autoload');
610
- // --- activation_restore (deferred) ---
636
+ }
637
+ async deferredActivationRestore(timer) {
611
638
  timer.startPhase('activation_restore', false);
612
639
  try {
613
640
  const activationStore = this.resolve('ActivationStore');
@@ -620,7 +647,8 @@ export class DollhouseContainer {
620
647
  logger.warn('[Container] Activation state restoration failed:', error);
621
648
  }
622
649
  timer.endPhase('activation_restore');
623
- // --- policy_export (deferred, Issue #762) ---
650
+ }
651
+ async deferredPolicyExport() {
624
652
  try {
625
653
  const policyExportService = this.resolve('PolicyExportService');
626
654
  await policyExportService.exportPolicies();
@@ -628,7 +656,8 @@ export class DollhouseContainer {
628
656
  catch (error) {
629
657
  logger.debug('[Container] Policy export skipped:', error);
630
658
  }
631
- // --- log_hooks (deferred) ---
659
+ }
660
+ async deferredLogHooks(timer) {
632
661
  timer.startPhase('log_hooks', false);
633
662
  try {
634
663
  const logManager = this.resolve('LogManager');
@@ -639,7 +668,72 @@ export class DollhouseContainer {
639
668
  logger.warn('[Container] Failed to wire log hooks:', error);
640
669
  }
641
670
  timer.endPhase('log_hooks');
642
- // --- danger_zone_init (deferred) ---
671
+ }
672
+ async deferredMetricsCollectors(timer) {
673
+ timer.startPhase('metrics_collectors', false);
674
+ try {
675
+ const metricsManager = this.resolve('MetricsManager');
676
+ this.wireMetricsCollectors(metricsManager);
677
+ metricsManager.start();
678
+ logger.info('[Container] Metrics collection started');
679
+ }
680
+ catch (error) {
681
+ logger.warn('[Container] Metrics wiring skipped:', error);
682
+ }
683
+ timer.endPhase('metrics_collectors');
684
+ }
685
+ /** Try to resolve a service, returning undefined if not registered */
686
+ tryResolve(name) {
687
+ try {
688
+ return this.resolve(name);
689
+ }
690
+ catch {
691
+ return undefined;
692
+ }
693
+ }
694
+ /** Wire SSE broadcast sinks for the web console */
695
+ wireSSEBroadcasts(webResult, metricsSink) {
696
+ if (webResult.logBroadcast) {
697
+ const logManager = this.resolve('LogManager');
698
+ logManager.registerSink(new WebSSELogSink(webResult.logBroadcast));
699
+ }
700
+ if (webResult.metricsOnSnapshot && metricsSink) {
701
+ const metricsManager = this.tryResolve('MetricsManager');
702
+ if (metricsManager) {
703
+ metricsManager.registerSink(new WebSSEMetricsSink(webResult.metricsOnSnapshot));
704
+ }
705
+ }
706
+ }
707
+ async deferredWebConsole(timer) {
708
+ timer.startPhase('web_console', false);
709
+ try {
710
+ if (!env.DOLLHOUSE_WEB_CONSOLE)
711
+ return;
712
+ const activationStore = this.resolve('ActivationStore');
713
+ const sessionId = activationStore.getSessionId();
714
+ const portfolioManager = this.resolve('PortfolioManager');
715
+ const memorySink = this.resolve('MemoryLogSink');
716
+ const metricsSink = this.tryResolve('MemoryMetricsSink');
717
+ const mcpAqlHandler = this.tryResolve('mcpAqlHandler');
718
+ const logManager = this.resolve('LogManager');
719
+ const { startUnifiedConsole } = await import('../web/console/UnifiedConsole.js');
720
+ const result = await startUnifiedConsole({
721
+ sessionId,
722
+ portfolioDir: portfolioManager.getBaseDir(),
723
+ memorySink,
724
+ metricsSink,
725
+ mcpAqlHandler,
726
+ registerLogSink: (sink) => logManager.registerSink(sink),
727
+ wireSSEBroadcasts: (webResult, mSink) => this.wireSSEBroadcasts(webResult, mSink),
728
+ });
729
+ logger.info(`[Container] Web console started as ${result.role}`);
730
+ }
731
+ catch (error) {
732
+ logger.warn('[Container] Web console startup failed:', error);
733
+ }
734
+ timer.endPhase('web_console');
735
+ }
736
+ async deferredDangerZoneInit(timer) {
643
737
  timer.startPhase('danger_zone_init', false);
644
738
  try {
645
739
  const dangerZoneEnforcer = this.resolve('DangerZoneEnforcer');
@@ -649,7 +743,8 @@ export class DollhouseContainer {
649
743
  logger.warn('[Container] DangerZoneEnforcer initialization failed:', error);
650
744
  }
651
745
  timer.endPhase('danger_zone_init');
652
- // --- pattern_encryption (deferred) ---
746
+ }
747
+ async deferredPatternEncryption(timer) {
653
748
  timer.startPhase('pattern_encryption', false);
654
749
  try {
655
750
  const patternEncryptor = this.resolve('PatternEncryptor');
@@ -660,7 +755,8 @@ export class DollhouseContainer {
660
755
  logger.warn('[Container] Pattern encryption initialization failed:', error);
661
756
  }
662
757
  timer.endPhase('pattern_encryption');
663
- // --- background_validator (deferred) ---
758
+ }
759
+ async deferredBackgroundValidator(timer) {
664
760
  timer.startPhase('background_validator', false);
665
761
  try {
666
762
  const backgroundValidator = this.resolve('BackgroundValidator');
@@ -671,10 +767,6 @@ export class DollhouseContainer {
671
767
  logger.warn('[Container] Background validator start failed:', error);
672
768
  }
673
769
  timer.endPhase('background_validator');
674
- this.deferredSetupComplete = true;
675
- const report = timer.getReport();
676
- logger.info(`[Startup] Deferred setup completed in ${report.deferredMs}ms ` +
677
- `(total startup: ${report.totalMs}ms, critical: ${report.criticalPathMs}ms)`);
678
770
  }
679
771
  /**
680
772
  * Restore per-session activation state from the ActivationStore.
@@ -856,7 +948,10 @@ export class DollhouseContainer {
856
948
  // Create MCPAQLHandler with all available handlers for full operation coverage (Issue #241)
857
949
  // Issue #301: Pass ContextTracker for request correlation metadata
858
950
  // Issue #402: Pass DangerZoneEnforcer via HandlerRegistry
859
- const mcpAqlHandler = new MCPAQLHandler({
951
+ // Build handler registry, then add lazy metricsSink getter.
952
+ // MemoryMetricsSink is registered during deferredSetup (after MetricsManager.start()),
953
+ // so it isn't available at handler construction time — resolve on first access instead.
954
+ const handlerDeps = {
860
955
  elementCRUD: elementCrudHandler,
861
956
  memoryManager: this.resolve('MemoryManager'),
862
957
  agentManager: this.resolve('AgentManager'),
@@ -877,7 +972,21 @@ export class DollhouseContainer {
877
972
  verificationStore: this.resolve('VerificationStore'), // Issue #142: Verification codes
878
973
  verificationNotifier: this.resolve('VerificationNotifier'), // Issue #522: OS dialog for codes
879
974
  memorySink: this.resolve('MemoryLogSink'), // Issue #528: CRUDE-routed query_logs
880
- }, this.resolve('ContextTracker'));
975
+ performanceMonitor: this.resolve('PerformanceMonitor'),
976
+ operationMetricsTracker: this.resolve('OperationMetricsTracker'),
977
+ gatekeeperMetricsTracker: this.resolve('GatekeeperMetricsTracker'),
978
+ };
979
+ Object.defineProperty(handlerDeps, 'metricsSink', {
980
+ get: () => { try {
981
+ return this.resolve('MemoryMetricsSink');
982
+ }
983
+ catch {
984
+ return undefined;
985
+ } },
986
+ configurable: true,
987
+ enumerable: true,
988
+ });
989
+ const mcpAqlHandler = new MCPAQLHandler(handlerDeps, this.resolve('ContextTracker'));
881
990
  // Register mcpAqlHandler as a singleton for test access
882
991
  this.register('mcpAqlHandler', () => mcpAqlHandler, { singleton: true });
883
992
  this.register('gatekeeper', () => gatekeeper, { singleton: true });
@@ -1001,49 +1110,137 @@ export class DollhouseContainer {
1001
1110
  logger.info(`Alternative: mcpaql mode would use ${alternativeToolCount} tools, ~${alternativeTokens.toLocaleString()} tokens (${Math.abs(Number(savingsPercent))}% ${tokenDiff < 0 ? 'more' : 'less'})`);
1002
1111
  }
1003
1112
  }
1113
+ /**
1114
+ * Wire all metric collectors into the MetricsManager.
1115
+ * Mirrors wireLogHooks() — keeps collector registration out of the constructor.
1116
+ */
1117
+ wireMetricsCollectors(metricsManager) {
1118
+ // PerformanceMonitor (instance)
1119
+ try {
1120
+ const monitor = this.resolve('PerformanceMonitor');
1121
+ metricsManager.registerCollector(new PerformanceMonitorCollector(monitor));
1122
+ }
1123
+ catch { /* not registered */ }
1124
+ // LRUCache instances — API cache + all element manager caches
1125
+ const caches = this.collectLruCachesForMetrics();
1126
+ if (caches.length > 0) {
1127
+ metricsManager.registerCollector(new LRUCacheCollector(caches));
1128
+ }
1129
+ // SecurityMonitor (static)
1130
+ try {
1131
+ metricsManager.registerCollector(new SecurityMonitorCollector());
1132
+ }
1133
+ catch { /* not available */ }
1134
+ // SecurityTelemetry (instance)
1135
+ try {
1136
+ const telemetry = this.resolve('SecurityTelemetry');
1137
+ metricsManager.registerCollector(new SecurityTelemetryCollector(telemetry));
1138
+ }
1139
+ catch { /* not registered */ }
1140
+ // FileLockManager (instance)
1141
+ try {
1142
+ const lockManager = this.resolve('FileLockManager');
1143
+ metricsManager.registerCollector(new FileLockManagerCollector(lockManager));
1144
+ }
1145
+ catch { /* not registered */ }
1146
+ // DefaultElementProvider (static)
1147
+ try {
1148
+ metricsManager.registerCollector(new DefaultElementProviderCollector());
1149
+ }
1150
+ catch { /* not available */ }
1151
+ // TriggerMetricsTracker (instance — created inside EnhancedIndexManager factory)
1152
+ try {
1153
+ const enhancedIndex = this.resolve('EnhancedIndexManager');
1154
+ // EnhancedIndexManager exposes tracker via public getter if available
1155
+ if ('triggerMetricsTracker' in enhancedIndex) {
1156
+ const tracker = enhancedIndex.triggerMetricsTracker;
1157
+ if (tracker) {
1158
+ metricsManager.registerCollector(new TriggerMetricsTrackerCollector(tracker));
1159
+ }
1160
+ }
1161
+ }
1162
+ catch { /* not registered */ }
1163
+ // OperationalTelemetry (instance)
1164
+ try {
1165
+ const opTelemetry = this.resolve('OperationalTelemetry');
1166
+ metricsManager.registerCollector(new OperationalTelemetryCollector(opTelemetry));
1167
+ }
1168
+ catch { /* not registered */ }
1169
+ // OperationMetricsTracker (instance)
1170
+ try {
1171
+ const opTracker = this.resolve('OperationMetricsTracker');
1172
+ metricsManager.registerCollector(new OperationMetricsCollector(opTracker));
1173
+ }
1174
+ catch { /* not registered */ }
1175
+ // GatekeeperMetricsTracker (instance)
1176
+ try {
1177
+ const gkTracker = this.resolve('GatekeeperMetricsTracker');
1178
+ metricsManager.registerCollector(new GatekeeperMetricsCollector(gkTracker));
1179
+ }
1180
+ catch { /* not registered */ }
1181
+ }
1182
+ collectLruCachesForMetrics() {
1183
+ const caches = [];
1184
+ try {
1185
+ const apiCache = this.resolve('APICache');
1186
+ caches.push({ name: 'APICache', instance: apiCache });
1187
+ }
1188
+ catch { /* not available */ }
1189
+ const managerNames = [
1190
+ 'PersonaManager', 'SkillManager', 'AgentManager',
1191
+ 'MemoryManager', 'EnsembleManager', 'TemplateManager',
1192
+ ];
1193
+ for (const name of managerNames) {
1194
+ try {
1195
+ const mgr = this.resolve(name);
1196
+ caches.push(...mgr.getMetricsCaches());
1197
+ }
1198
+ catch { /* not registered */ }
1199
+ }
1200
+ return caches;
1201
+ }
1004
1202
  async dispose() {
1203
+ // Close MetricsManager before general disposal (flush final snapshot)
1204
+ try {
1205
+ const metricsManager = this.resolve('MetricsManager');
1206
+ await metricsManager.close();
1207
+ }
1208
+ catch { /* metrics not enabled or not registered */ }
1005
1209
  // Clean up log hooks before disposing services
1006
1210
  try {
1007
1211
  const cleanups = this.resolve('_logHookCleanups');
1008
1212
  cleanups.forEach(fn => fn());
1009
1213
  }
1010
1214
  catch { /* hooks not yet wired */ }
1011
- // Use Promise.allSettled to ensure all services attempt disposal
1012
- // even if some fail. This provides better resilience and comprehensive
1013
- // error reporting compared to Promise.all which fails fast.
1014
- const disposalPromises = [];
1215
+ const disposalPromises = this.buildDisposalPromises();
1216
+ const results = await Promise.allSettled(disposalPromises.map(d => d.promise));
1217
+ this.reportDisposalFailures(disposalPromises, results);
1218
+ }
1219
+ buildDisposalPromises() {
1220
+ const promises = [];
1015
1221
  for (const [name, service] of this.services) {
1016
- if (service.instance) {
1017
- const instance = service.instance;
1018
- if (typeof instance.dispose === 'function') {
1019
- // Wrap in try-catch to handle synchronous throws, then wrap in Promise
1020
- disposalPromises.push({
1021
- name,
1022
- promise: Promise.resolve().then(() => instance.dispose())
1023
- });
1024
- }
1025
- else if (typeof instance.cleanup === 'function') {
1026
- // Wrap in try-catch to handle synchronous throws, then wrap in Promise
1027
- disposalPromises.push({
1028
- name,
1029
- promise: Promise.resolve().then(() => instance.cleanup())
1030
- });
1031
- }
1222
+ if (!service.instance)
1223
+ continue;
1224
+ const instance = service.instance;
1225
+ if (typeof instance.dispose === 'function') {
1226
+ promises.push({ name, promise: Promise.resolve().then(() => instance.dispose()) });
1227
+ }
1228
+ else if (typeof instance.cleanup === 'function') {
1229
+ promises.push({ name, promise: Promise.resolve().then(() => instance.cleanup()) });
1032
1230
  }
1033
1231
  }
1034
- // Execute all disposals in parallel, collecting results
1035
- const results = await Promise.allSettled(disposalPromises.map(d => d.promise));
1036
- // Aggregate and report all failures for comprehensive diagnostics
1232
+ return promises;
1233
+ }
1234
+ reportDisposalFailures(disposalPromises, results) {
1037
1235
  const failures = [];
1038
1236
  for (const [index, result] of results.entries()) {
1039
1237
  if (result.status === 'rejected') {
1040
1238
  const serviceName = disposalPromises[index].name;
1041
1239
  const error = result.reason instanceof Error ? result.reason : new Error(String(result.reason));
1042
- failures.push({ service: serviceName, error });
1240
+ failures.push(serviceName);
1043
1241
  logger.warn(`Failed to dispose service '${serviceName}'`, { error });
1044
1242
  }
1045
1243
  }
1046
- // Log summary if there were failures
1047
1244
  if (failures.length > 0) {
1048
1245
  logger.warn(`Container disposal completed with ${failures.length} failure(s) out of ${disposalPromises.length} services`);
1049
1246
  }
@@ -1069,4 +1266,4 @@ export class DollhouseContainer {
1069
1266
  }
1070
1267
  }
1071
1268
  }
1072
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpL0NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RyxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsZ0NBQWdDLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoSixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsZ0JBQWdCLEdBQ2pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxn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bUMsQ0FBQyxDQUFDO2dCQUMvRSxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQztZQUM1RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxLQUFLLEdBQUcsTUFBTSxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEtBQUssQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDO1lBQy9FLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLFlBQVksQ0FBQyxRQUFRLENBQUMsOENBQThDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0UsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tIFwiLi4vY29uc3RhbnRzL3ZlcnNpb24uanNcIjtcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gXCIuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanNcIjtcbmltcG9ydCB7IFZlcmJUcmlnZ2VyTWFuYWdlciB9IGZyb20gXCIuLi9wb3J0Zm9saW8vVmVyYlRyaWdnZXJNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbnNoaXBNYW5hZ2VyIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9SZWxhdGlvbnNoaXBNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBOTFBTY29yaW5nTWFuYWdlciB9IGZyb20gXCIuLi9wb3J0Zm9saW8vTkxQU2NvcmluZ01hbmFnZXIuanNcIjtcbmltcG9ydCB7IFNlcnZlciB9IGZyb20gXCJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2RrL3NlcnZlci9pbmRleC5qc1wiO1xuaW1wb3J0IHsgbG9hZEluZGljYXRvckNvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy5qc1wiO1xuaW1wb3J0IHsgZW52IH0gZnJvbSBcIi4uL2NvbmZpZy9lbnYuanNcIjtcbmltcG9ydCB7IEFQSUNhY2hlLCBDb2xsZWN0aW9uQ2FjaGUsIENvbGxlY3Rpb25JbmRleENhY2hlLCBDYWNoZU1lbW9yeUJ1ZGdldCB9IGZyb20gXCIuLi9jYWNoZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdGVkR2xvYmFsQ2FjaGVNZW1vcnlCeXRlcywgZ2V0VmFsaWRhdGVkTWF4QmFja3Vwc1BlckVsZW1lbnQsIFNUT1JBR0VfTEFZRVJfQ09ORklHIH0gZnJvbSBcIi4uL2NvbmZpZy9wZXJmb3JtYW5jZS1jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IEJhY2t1cFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qc1wiO1xuaW1wb3J0IHtcbiAgR2l0SHViQ2xpZW50LFxuICBDb2xsZWN0aW9uQnJvd3NlcixcbiAgQ29sbGVjdGlvbkluZGV4TWFuYWdlcixcbiAgQ29sbGVjdGlvblNlYXJjaCxcbiAgUGVyc29uYURldGFpbHMsXG4gIEVsZW1lbnRJbnN0YWxsZXIsXG59IGZyb20gXCIuLi9jb2xsZWN0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBHaXRIdWJBdXRoTWFuYWdlciB9IGZyb20gXCIuLi9hdXRoL0dpdEh1YkF1dGhNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyLCBFbGVtZW50VHlwZSB9IGZyb20gXCIuLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgTWlncmF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi9wb3J0Zm9saW8vTWlncmF0aW9uTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgRW5oYW5jZWRJbmRleE1hbmFnZXIgfSBmcm9tIFwiLi4vcG9ydGZvbGlvL0VuaGFuY2VkSW5kZXhNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBFbmhhbmNlZEluZGV4SGFuZGxlciB9IGZyb20gXCIuLi9oYW5kbGVycy9FbmhhbmNlZEluZGV4SGFuZGxlci5qc1wiO1xuaW1wb3J0IHsgTUNQQVFMSGFuZGxlciB9IGZyb20gXCIuLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanNcIjtcbmltcG9ydCB7IEdhdGVrZWVwZXIgfSBmcm9tIFwiLi4vaGFuZGxlcnMvbWNwLWFxbC9HYXRla2VlcGVyLmpzXCI7XG5pbXBvcnQgeyBTa2lsbE1hbmFnZXIgfSBmcm9tIFwiLi4vZWxlbWVudHMvc2tpbGxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vZWxlbWVudHMvdGVtcGxhdGVzL1RlbXBsYXRlTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGVSZW5kZXJlciB9IGZyb20gXCIuLi91dGlscy9UZW1wbGF0ZVJlbmRlcmVyLmpzXCI7XG5pbXBvcnQgeyBBZ2VudE1hbmFnZXIgfSBmcm9tIFwiLi4vZWxlbWVudHMvYWdlbnRzL0FnZW50TWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgTWVtb3J5IH0gZnJvbSBcIi4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS5qc1wiO1xuaW1wb3J0IHsgTWVtb3J5TWFuYWdlciB9IGZyb20gXCIuLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBTU0VMb2dTaW5rIH0gZnJvbSBcIi4uL2xvZ2dpbmcvc2lua3MvU1NFTG9nU2luay5qc1wiO1xuaW1wb3J0IHsgRW5zZW1ibGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IFBlcnNvbmFFeHBvcnRlciwgUGVyc29uYUltcG9ydGVyIH0gZnJvbSBcIi4uL3BlcnNvbmEvZXhwb3J0LWltcG9ydC9pbmRleC5qc1wiO1xuaW1wb3J0IHsgUGVyc29uYU1hbmFnZXIgfSBmcm9tIFwiLi4vcGVyc29uYS9QZXJzb25hTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgUGVyc29uYUhhbmRsZXIgfSBmcm9tIFwiLi4vaGFuZGxlcnMvUGVyc29uYUhhbmRsZXIuanNcIjtcbmltcG9ydCB7IEVsZW1lbnRDUlVESGFuZGxlciB9IGZyb20gXCIuLi9oYW5kbGVycy9FbGVtZW50Q1JVREhhbmRsZXIuanNcIjtcbmltcG9ydCB7IENvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXJzL0NvbGxlY3Rpb25IYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBQb3J0Zm9saW9IYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXJzL1BvcnRmb2xpb0hhbmRsZXIuanNcIjtcbmltcG9ydCB7IFBvcnRmb2xpb1B1bGxIYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXJzL1BvcnRmb2xpb1B1bGxIYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBHaXRIdWJBdXRoSGFuZGxlciB9IGZyb20gXCIuLi9oYW5kbGVycy9HaXRIdWJBdXRoSGFuZGxlci5qc1wiO1xuaW1wb3J0IHsgRGlzcGxheUNvbmZpZ0hhbmRsZXIgfSBmcm9tIFwiLi4vaGFuZGxlcnMvRGlzcGxheUNvbmZpZ0hhbmRsZXIuanNcIjtcbmltcG9ydCB7IElkZW50aXR5SGFuZGxlciB9IGZyb20gXCIuLi9oYW5kbGVycy9JZGVudGl0eUhhbmRsZXIuanNcIjtcbmltcG9ydCB7IENvbmZpZ0hhbmRsZXIgfSBmcm9tIFwiLi4vaGFuZGxlcnMvQ29uZmlnSGFuZGxlci5qc1wiO1xuaW1wb3J0IHsgU3luY0hhbmRsZXIgfSBmcm9tIFwiLi4vaGFuZGxlcnMvU3luY0hhbmRsZXJWMi5qc1wiO1xuaW1wb3J0IHsgVG9vbFJlZ2lzdHJ5IH0gZnJvbSBcIi4uL2hhbmRsZXJzL1Rvb2xSZWdpc3RyeS5qc1wiO1xuaW1wb3J0IHsgU2VydmVyU2V0dXAgfSBmcm9tIFwiLi4vc2VydmVyL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTZXJ2ZXJTdGFydHVwIH0gZnJvbSBcIi4uL3NlcnZlci9zdGFydHVwLmpzXCI7XG5pbXBvcnQgeyBQYXRoVmFsaWRhdG9yIH0gZnJvbSBcIi4uL3NlY3VyaXR5L3BhdGhWYWxpZGF0b3IuanNcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi91dGlscy9sb2dnZXIuanNcIjtcbmltcG9ydCB7IEVycm9ySGFuZGxlciB9IGZyb20gXCIuLi91dGlscy9FcnJvckhhbmRsZXIuanNcIjtcbmltcG9ydCB7IFVuaWZpZWRJbmRleE1hbmFnZXIgfSBmcm9tIFwiLi4vcG9ydGZvbGlvL1VuaWZpZWRJbmRleE1hbmFnZXIuanNcIjtcbmltcG9ydCB7IFBvcnRmb2xpb0luZGV4TWFuYWdlciB9IGZyb20gXCIuLi9wb3J0Zm9saW8vUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBTdWJtaXRUb1BvcnRmb2xpb1Rvb2wgfSBmcm9tIFwiLi4vdG9vbHMvcG9ydGZvbGlvL3N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5qc1wiO1xuaW1wb3J0IHsgQ29uZmlnTWFuYWdlciB9IGZyb20gXCIuLi9jb25maWcvQ29uZmlnTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgUG9ydGZvbGlvUmVwb01hbmFnZXIgfSBmcm9tIFwiLi4vcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBQb3J0Zm9saW9TeW5jTWFuYWdlciB9IGZyb20gXCIuLi9wb3J0Zm9saW8vUG9ydGZvbGlvU3luY01hbmFnZXIuanNcIjtcbmltcG9ydCB7IGdldFBvcnRmb2xpb1JlcG9zaXRvcnlOYW1lIH0gZnJvbSBcIi4uL2NvbmZpZy9wb3J0Zm9saW9Db25maWcuanNcIjtcbmltcG9ydCB7IEdpdEh1YlBvcnRmb2xpb0luZGV4ZXIgfSBmcm9tIFwiLi4vcG9ydGZvbGlvL0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIuanNcIjtcbmltcG9ydCB7IEluZGV4Q29uZmlnTWFuYWdlciB9IGZyb20gXCIuLi9wb3J0Zm9saW8vY29uZmlnL0luZGV4Q29uZmlnLmpzXCI7XG5pbXBvcnQgeyBQb3J0Zm9saW9TeW5jQ29tcGFyZXIgfSBmcm9tIFwiLi4vc3luYy9Qb3J0Zm9saW9TeW5jQ29tcGFyZXIuanNcIjtcbmltcG9ydCB7IFBvcnRmb2xpb0Rvd25sb2FkZXIgfSBmcm9tIFwiLi4vc3luYy9Qb3J0Zm9saW9Eb3dubG9hZGVyLmpzXCI7XG5pbXBvcnQgeyBQZXJmb3JtYW5jZU1vbml0b3IgfSBmcm9tIFwiLi4vdXRpbHMvUGVyZm9ybWFuY2VNb25pdG9yLmpzXCI7XG5pbXBvcnQgeyBCdWlsZEluZm9TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL0J1aWxkSW5mb1NlcnZpY2UuanNcIjtcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9Jbml0aWFsaXphdGlvblNlcnZpY2UuanNcIjtcbmltcG9ydCB7IFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL1BlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU3RhdGVDaGFuZ2VOb3RpZmllciB9IGZyb20gXCIuLi9zZXJ2aWNlcy9TdGF0ZUNoYW5nZU5vdGlmaWVyLmpzXCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9TZXJpYWxpemF0aW9uU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgRmlsZVdhdGNoU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tIFwiLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanNcIjtcbmltcG9ydCB7IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1RyaWdnZXJWYWxpZGF0aW9uU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgR2l0SHViUmF0ZUxpbWl0ZXIgfSBmcm9tIFwiLi4vdXRpbHMvR2l0SHViUmF0ZUxpbWl0ZXIuanNcIjtcbmltcG9ydCB7IEFudGhyb3BpY1RvRG9sbGhvdXNlQ29udmVydGVyLCBEb2xsaG91c2VUb0FudGhyb3BpY0NvbnZlcnRlciB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBEYW5nZXJab25lRW5mb3JjZXIgfSBmcm9tIFwiLi4vc2VjdXJpdHkvRGFuZ2VyWm9uZUVuZm9yY2VyLmpzXCI7XG5pbXBvcnQgeyBBY3RpdmF0aW9uU3RvcmUgfSBmcm9tIFwiLi4vc2VydmljZXMvQWN0aXZhdGlvblN0b3JlLmpzXCI7XG5pbXBvcnQgeyBWZXJpZmljYXRpb25TdG9yZSB9IGZyb20gXCJAZG9sbGhvdXNlbWNwL3NhZmV0eVwiO1xuaW1wb3J0IHsgVmVyaWZpY2F0aW9uTm90aWZpZXIgfSBmcm9tIFwiLi4vc2VydmljZXMvVmVyaWZpY2F0aW9uTm90aWZpZXIuanNcIjtcbmltcG9ydCB7IFBhdHRlcm5FbmNyeXB0b3IgfSBmcm9tIFwiLi4vc2VjdXJpdHkvZW5jcnlwdGlvbi9QYXR0ZXJuRW5jcnlwdG9yLmpzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuRGVjcnlwdG9yIH0gZnJvbSBcIi4uL3NlY3VyaXR5L2VuY3J5cHRpb24vUGF0dGVybkRlY3J5cHRvci5qc1wiO1xuaW1wb3J0IHsgQ29udGV4dFRyYWNrZXIgfSBmcm9tIFwiLi4vc2VjdXJpdHkvZW5jcnlwdGlvbi9Db250ZXh0VHJhY2tlci5qc1wiO1xuaW1wb3J0IHsgUGF0dGVybkV4dHJhY3RvciB9IGZyb20gXCIuLi9zZWN1cml0eS92YWxpZGF0aW9uL1BhdHRlcm5FeHRyYWN0b3IuanNcIjtcbmltcG9ydCB7IEJhY2tncm91bmRWYWxpZGF0b3IgfSBmcm9tIFwiLi4vc2VjdXJpdHkvdmFsaWRhdGlvbi9CYWNrZ3JvdW5kVmFsaWRhdG9yLmpzXCI7XG5pbXBvcnQgeyBTZWN1cml0eVRlbGVtZXRyeSB9IGZyb20gXCIuLi9zZWN1cml0eS90ZWxlbWV0cnkvU2VjdXJpdHlUZWxlbWV0cnkuanNcIjtcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tIFwiLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qc1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uYWxUZWxlbWV0cnkgfSBmcm9tIFwiLi4vdGVsZW1ldHJ5L09wZXJhdGlvbmFsVGVsZW1ldHJ5LmpzXCI7XG5pbXBvcnQgeyBTdGFydHVwVGltZXIgfSBmcm9tIFwiLi4vdGVsZW1ldHJ5L1N0YXJ0dXBUaW1lci5qc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEVuaGFuY2VkSW5kZXhIZWxwZXJzIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9lbmhhbmNlZC1pbmRleC9FbmhhbmNlZEluZGV4SGVscGVycy5qc1wiO1xuaW1wb3J0IHsgRWxlbWVudERlZmluaXRpb25CdWlsZGVyIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9lbmhhbmNlZC1pbmRleC9FbGVtZW50RGVmaW5pdGlvbkJ1aWxkZXIuanNcIjtcbmltcG9ydCB7IEFjdGlvblRyaWdnZXJFeHRyYWN0b3IgfSBmcm9tIFwiLi4vcG9ydGZvbGlvL2VuaGFuY2VkLWluZGV4L0FjdGlvblRyaWdnZXJFeHRyYWN0b3IuanNcIjtcbmltcG9ydCB7IFRyaWdnZXJNZXRyaWNzVHJhY2tlciB9IGZyb20gXCIuLi9wb3J0Zm9saW8vZW5oYW5jZWQtaW5kZXgvVHJpZ2dlck1ldHJpY3NUcmFja2VyLmpzXCI7XG5pbXBvcnQgeyBTZW1hbnRpY1JlbGF0aW9uc2hpcFNlcnZpY2UgfSBmcm9tIFwiLi4vcG9ydGZvbGlvL2VuaGFuY2VkLWluZGV4L1NlbWFudGljUmVsYXRpb25zaGlwU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgRWxlbWVudEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uL2V2ZW50cy9FbGVtZW50RXZlbnREaXNwYXRjaGVyLmpzJztcbmltcG9ydCB7IFRva2VuTWFuYWdlciB9IGZyb20gXCIuLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanNcIjtcbmltcG9ydCB7XG4gIFBhZ2luYXRpb25TZXJ2aWNlLFxuICBGaWx0ZXJTZXJ2aWNlLFxuICBTb3J0U2VydmljZSxcbiAgRWxlbWVudFF1ZXJ5U2VydmljZSxcbn0gZnJvbSAnLi4vc2VydmljZXMvcXVlcnkvaW5kZXguanMnO1xuaW1wb3J0IHsgUmV0ZW50aW9uUG9saWN5U2VydmljZSwgTWVtb3J5UmV0ZW50aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9SZXRlbnRpb25Qb2xpY3lTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFBvbGljeUV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9Qb2xpY3lFeHBvcnRTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFBBQ0tBR0VfVkVSU0lPTiB9IGZyb20gJy4uL2dlbmVyYXRlZC92ZXJzaW9uLmpzJztcbmltcG9ydCB7IExvZ01hbmFnZXIsIGJ1aWxkTG9nTWFuYWdlckNvbmZpZyB9IGZyb20gJy4uL2xvZ2dpbmcvTG9nTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9nU2luayB9IGZyb20gJy4uL2xvZ2dpbmcvc2lua3MvRmlsZUxvZ1NpbmsuanMnO1xuaW1wb3J0IHsgTWVtb3J5TG9nU2luayB9IGZyb20gJy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcyc7XG5pbXBvcnQgeyBQbGFpblRleHRGb3JtYXR0ZXIgfSBmcm9tICcuLi9sb2dnaW5nL2Zvcm1hdHRlcnMvUGxhaW5UZXh0Rm9ybWF0dGVyLmpzJztcbmltcG9ydCB7IEpzb25sRm9ybWF0dGVyIH0gZnJvbSAnLi4vbG9nZ2luZy9mb3JtYXR0ZXJzL0pzb25sRm9ybWF0dGVyLmpzJztcbmltcG9ydCB7IHdpcmVMb2dIb29rcywgZ2V0VHJpZ2dlck1ldHJpY3NMb2dMaXN0ZW5lciB9IGZyb20gJy4uL2xvZ2dpbmcvTG9nSG9va3MuanMnO1xuXG4vLyBTdGF0ZSBpcyBvd25lZCBieSBQZXJzb25hTWFuYWdlciBhbmQgc2VydmljZXNcblxuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyQnVuZGxlIHtcbiAgcGVyc29uYUhhbmRsZXI6IFBlcnNvbmFIYW5kbGVyO1xuICBlbGVtZW50Q3J1ZEhhbmRsZXI6IEVsZW1lbnRDUlVESGFuZGxlcjtcbiAgY29sbGVjdGlvbkhhbmRsZXI6IENvbGxlY3Rpb25IYW5kbGVyO1xuICBwb3J0Zm9saW9IYW5kbGVyOiBQb3J0Zm9saW9IYW5kbGVyO1xuICBnaXRodWJBdXRoSGFuZGxlcjogR2l0SHViQXV0aEhhbmRsZXI7XG4gIGRpc3BsYXlDb25maWdIYW5kbGVyOiBEaXNwbGF5Q29uZmlnSGFuZGxlcjtcbiAgaWRlbnRpdHlIYW5kbGVyOiBJZGVudGl0eUhhbmRsZXI7XG4gIGNvbmZpZ0hhbmRsZXI6IENvbmZpZ0hhbmRsZXI7XG4gIHN5bmNIYW5kbGVyOiBTeW5jSGFuZGxlcjtcbiAgdG9vbFJlZ2lzdHJ5OiBUb29sUmVnaXN0cnk7XG4gIGVuaGFuY2VkSW5kZXhIYW5kbGVyOiBFbmhhbmNlZEluZGV4SGFuZGxlcjtcbiAgbWNwQXFsSGFuZGxlcjogTUNQQVFMSGFuZGxlcjtcbn1cblxuLyoqXG4gKiBUeXBlLXNhZmUgc2VydmljZSByZWNvcmQgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGNvbnRhaW5lclxuICpcbiAqIEZJWDogUmVwbGFjZWQgJ2FueScgdHlwZXMgd2l0aCBwcm9wZXIgZ2VuZXJpY3MgdG8gZW5zdXJlIHR5cGUgc2FmZXR5XG4gKiBQcmV2aW91c2x5OiBVc2VkICdhbnknIHdoaWNoIGFsbG93ZWQgdW5zYWZlIGNhc3RzIGFuZCBydW50aW1lIGVycm9yc1xuICogTm93OiBVc2VzIGdlbmVyaWMgVCB3aXRoICd1bmtub3duJyBmYWxsYmFjayBmb3IgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmdcbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgc2VydmljZSB0eXBlIChkZWZhdWx0cyB0byB1bmtub3duIGZvciBtYXhpbXVtIHNhZmV0eSlcbiAqL1xuaW50ZXJmYWNlIFNlcnZpY2VSZWNvcmQ8VCA9IHVua25vd24+IHtcbiAgZmFjdG9yeTogKCkgPT4gVDtcbiAgaW5zdGFuY2U6IFQgfCBudWxsO1xuICBzaW5nbGV0b246IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBEb2xsaG91c2VDb250YWluZXIge1xuICBwcml2YXRlIHNlcnZpY2VzID0gbmV3IE1hcDxzdHJpbmcsIFNlcnZpY2VSZWNvcmQ+KCk7XG4gIHByaXZhdGUgcGVyc29uYXNEaXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogSXNzdWUgIzcwNjogU2V0IHRvIHRydWUgb25jZSBjb21wbGV0ZURlZmVycmVkU2V0dXAoKSByZXNvbHZlcy4gKi9cbiAgcHVibGljIGRlZmVycmVkU2V0dXBDb21wbGV0ZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQXVkaXQgREkgY29udGFpbmVyIGluaXRpYWxpemF0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1BPUlRGT0xJT19JTklUSUFMSVpBVElPTicsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdEb2xsaG91c2VDb250YWluZXIuY29uc3RydWN0b3InLFxuICAgICAgZGV0YWlsczogJ0RlcGVuZGVuY3kgaW5qZWN0aW9uIGNvbnRhaW5lciBpbml0aWFsaXppbmcnXG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclNlcnZpY2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHdpdGggdGhlIERJIGNvbnRhaW5lclxuICAgKlxuICAgKiBGSVg6IEFkZGVkIGV4cGxpY2l0IHR5cGUgcGFyYW1ldGVyIGZvciB0eXBlIHNhZmV0eVxuICAgKiBUaGUgZmFjdG9yeSBpcyBzdG9yZWQgYXMgKCkgPT4gdW5rbm93biBpbnRlcm5hbGx5IHRvIGFsbG93IGhldGVyb2dlbmVvdXMgc3RvcmFnZSxcbiAgICogYnV0IHRoZSB0eXBlIFQgaXMgcHJlc2VydmVkIGZvciByZXNvbHZlKCkgY2FsbHNcbiAgICpcbiAgICogQHRlbXBsYXRlIFQgVGhlIHNlcnZpY2UgdHlwZVxuICAgKiBAcGFyYW0gbmFtZSBVbmlxdWUgc2VydmljZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSBmYWN0b3J5IEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZSBzZXJ2aWNlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyAoc2luZ2xldG9uIGJlaGF2aW9yKVxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPFQ+KG5hbWU6IHN0cmluZywgZmFjdG9yeTogKCkgPT4gVCwgb3B0aW9uczogeyBzaW5nbGV0b24/OiBib29sZWFuIH0gPSB7IHNpbmdsZXRvbjogdHJ1ZSB9KTogdm9pZCB7XG4gICAgLy8gRklYOiBETUNQLVNFQy0wMDYgLSBBdWRpdCBzZXJ2aWNlIHJlZ2lzdHJhdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRG9sbGhvdXNlQ29udGFpbmVyLnJlZ2lzdGVyJyxcbiAgICAgIGRldGFpbHM6IGBTZXJ2aWNlIHJlZ2lzdGVyZWQ6ICR7bmFtZX1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHsgc2VydmljZU5hbWU6IG5hbWUsIHNpbmdsZXRvbjogb3B0aW9ucy5zaW5nbGV0b24gPz8gdHJ1ZSB9XG4gICAgfSk7XG4gICAgdGhpcy5zZXJ2aWNlcy5zZXQobmFtZSwge1xuICAgICAgZmFjdG9yeTogZmFjdG9yeSBhcyAoKSA9PiB1bmtub3duLFxuICAgICAgaW5zdGFuY2U6IG51bGwsXG4gICAgICBzaW5nbGV0b246IG9wdGlvbnMuc2luZ2xldG9uID8/IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgc2VydmljZSBmcm9tIHRoZSBESSBjb250YWluZXJcbiAgICpcbiAgICogRklYOiBUeXBlIHNhZmV0eSBpbXByb3ZlZCB3aXRoIGV4cGxpY2l0IGNhc3RpbmcgYW5kIHZhbGlkYXRpb25cbiAgICogVGhlICdhcyBUJyBjYXN0IGlzIHNhZmUgYmVjYXVzZTpcbiAgICogMS4gU2VydmljZXMgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0eXBlZCBmYWN0b3JpZXNcbiAgICogMi4gVGhlIHNlcnZpY2UgbmFtZSBhY3RzIGFzIGEgdHlwZSBkaXNjcmltaW5hdG9yXG4gICAqIDMuIEluY29ycmVjdCB1c2FnZSB3aWxsIGJlIGNhdWdodCBhdCB0aGUgcmVnaXN0cmF0aW9uIHNpdGVcbiAgICpcbiAgICogQHRlbXBsYXRlIFQgVGhlIGV4cGVjdGVkIHNlcnZpY2UgdHlwZVxuICAgKiBAcGFyYW0gbmFtZSBTZXJ2aWNlIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMgVGhlIHNlcnZpY2UgaW5zdGFuY2VcbiAgICogQHRocm93cyBFcnJvciBpZiBzZXJ2aWNlIGlzIG5vdCByZWdpc3RlcmVkXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZTxUPihuYW1lOiBzdHJpbmcpOiBUIHtcbiAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlcy5nZXQobmFtZSk7XG4gICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICAvLyBGSVg6IERNQ1AtU0VDLTAwNiAtIEF1ZGl0IHNlcnZpY2UgcmVzb2x1dGlvbiBmYWlsdXJlc1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURfRkFJTEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdEb2xsaG91c2VDb250YWluZXIucmVzb2x2ZScsXG4gICAgICAgIGRldGFpbHM6IGBTZXJ2aWNlIG5vdCByZWdpc3RlcmVkOiAke25hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgc2VydmljZU5hbWU6IG5hbWUgfVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQ6ICR7bmFtZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoc2VydmljZS5zaW5nbGV0b24pIHtcbiAgICAgIGlmICghc2VydmljZS5pbnN0YW5jZSkge1xuICAgICAgICBzZXJ2aWNlLmluc3RhbmNlID0gc2VydmljZS5mYWN0b3J5KCk7XG4gICAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQXVkaXQgc2luZ2xldG9uIGluc3RhbnRpYXRpb25cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdEb2xsaG91c2VDb250YWluZXIucmVzb2x2ZScsXG4gICAgICAgICAgZGV0YWlsczogYFNpbmdsZXRvbiBpbnN0YW50aWF0ZWQ6ICR7bmFtZX1gLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IHNlcnZpY2VOYW1lOiBuYW1lIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VydmljZS5pbnN0YW5jZSBhcyBUO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2aWNlLmZhY3RvcnkoKSBhcyBUO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclNlcnZpY2VzKCk6IHZvaWQge1xuXG5cbiAgICAvLyBJc3N1ZSAjNzA2OiBTdGFydHVwIHRpbWluZyBpbnN0cnVtZW50YXRpb25cbiAgICB0aGlzLnJlZ2lzdGVyKCdTdGFydHVwVGltZXInLCAoKSA9PiBuZXcgU3RhcnR1cFRpbWVyKCkpO1xuXG4gICAgLy8gQ09SRSAmIENBQ0hJTkdcbiAgICB0aGlzLnJlZ2lzdGVyKCdDYWNoZU1lbW9yeUJ1ZGdldCcsICgpID0+IG5ldyBDYWNoZU1lbW9yeUJ1ZGdldCh7XG4gICAgICBnbG9iYWxMaW1pdEJ5dGVzOiBnZXRWYWxpZGF0ZWRHbG9iYWxDYWNoZU1lbW9yeUJ5dGVzKCksXG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0FQSUNhY2hlJywgKCkgPT4gbmV3IEFQSUNhY2hlKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0NvbGxlY3Rpb25DYWNoZScsICgpID0+IG5ldyBDb2xsZWN0aW9uQ2FjaGUodGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSwgdW5kZWZpbmVkKSk7XG4gICAgdGhpcy5yZWdpc3RlcignUmF0ZUxpbWl0VHJhY2tlcicsICgpID0+IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKSk7XG4gICAgdGhpcy5yZWdpc3RlcignRmlsZUxvY2tNYW5hZ2VyJywgKCkgPT4gbmV3IEZpbGVMb2NrTWFuYWdlcigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnLCAoKSA9PiBuZXcgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlKHRoaXMucmVzb2x2ZSgnRmlsZUxvY2tNYW5hZ2VyJykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdDb25maWdNYW5hZ2VyJywgKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBDb25maWdNYW5hZ2VyKHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJyksIG9zKTtcbiAgICB9KTtcbiAgICAvLyBJc3N1ZSAjNTE6IEdlbmVyaWMgcmV0ZW50aW9uIHBvbGljeSBzZXJ2aWNlIHdpdGggc3RyYXRlZ3kgcGF0dGVyblxuICAgIHRoaXMucmVnaXN0ZXIoJ1JldGVudGlvblBvbGljeVNlcnZpY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXJ2aWNlID0gbmV3IFJldGVudGlvblBvbGljeVNlcnZpY2UodGhpcy5yZXNvbHZlKCdDb25maWdNYW5hZ2VyJykpO1xuICAgICAgLy8gUmVnaXN0ZXIgbWVtb3J5IHJldGVudGlvbiBzdHJhdGVneSAoZmlyc3Qgb2YgcG90ZW50aWFsbHkgNTArIGVsZW1lbnQgdHlwZXMpXG4gICAgICBzZXJ2aWNlLnJlZ2lzdGVyU3RyYXRlZ3kobmV3IE1lbW9yeVJldGVudGlvblN0cmF0ZWd5KCkpO1xuICAgICAgcmV0dXJuIHNlcnZpY2U7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlcignSW5kZXhDb25maWdNYW5hZ2VyJywgKCkgPT4gbmV3IEluZGV4Q29uZmlnTWFuYWdlcigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdJbmRpY2F0b3JDb25maWcnLCAoKSA9PiBsb2FkSW5kaWNhdG9yQ29uZmlnKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1N0YXRlQ2hhbmdlTm90aWZpZXInLCAoKSA9PiBuZXcgU3RhdGVDaGFuZ2VOb3RpZmllcigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdHaXRIdWJSYXRlTGltaXRlcicsICgpID0+IG5ldyBHaXRIdWJSYXRlTGltaXRlcihcbiAgICAgIHRoaXMucmVzb2x2ZSgnVG9rZW5NYW5hZ2VyJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdFbGVtZW50RXZlbnREaXNwYXRjaGVyJywgKCkgPT4gRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5nZXRTaGFyZWREaXNwYXRjaGVyKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ01DUExvZ2dlcicsICgpID0+IGxvZ2dlcik7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCdQZXJzb25hSW1wb3J0ZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb3J0Zm9saW9NYW5hZ2VyID0gdGhpcy5yZXNvbHZlPFBvcnRmb2xpb01hbmFnZXI+KCdQb3J0Zm9saW9NYW5hZ2VyJyk7XG4gICAgICBjb25zdCBwZXJzb25hc0RpciA9IHBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5QRVJTT05BKTtcbiAgICAgIC8vIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrIHRvIGJyZWFrIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LiBXZSByZXNvbHZlIFBlcnNvbmFNYW5hZ2VyIGluc2lkZSB0aGUgcHJvdmlkZXIgZnVuY3Rpb24uXG4gICAgICBjb25zdCBjdXJyZW50VXNlclByb3ZpZGVyID0gKCkgPT4gdGhpcy5yZXNvbHZlPFBlcnNvbmFNYW5hZ2VyPignUGVyc29uYU1hbmFnZXInKS5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICByZXR1cm4gbmV3IFBlcnNvbmFJbXBvcnRlcihcbiAgICAgICAgcGVyc29uYXNEaXIsXG4gICAgICAgIGN1cnJlbnRVc2VyUHJvdmlkZXIsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIEdJVEhVQiAmIENPTExFQ1RJT05cbiAgICB0aGlzLnJlZ2lzdGVyKCdHaXRIdWJDbGllbnQnLCAoKSA9PiBuZXcgR2l0SHViQ2xpZW50KFxuICAgICAgdGhpcy5yZXNvbHZlKCdBUElDYWNoZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdSYXRlTGltaXRUcmFja2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1Rva2VuTWFuYWdlcicpXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignR2l0SHViQXV0aE1hbmFnZXInLCAoKSA9PiBuZXcgR2l0SHViQXV0aE1hbmFnZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ0FQSUNhY2hlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0NvbmZpZ01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnVG9rZW5NYW5hZ2VyJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdDb2xsZWN0aW9uSW5kZXhNYW5hZ2VyJywgKCkgPT4gbmV3IENvbGxlY3Rpb25JbmRleE1hbmFnZXIoe1xuICAgICAgZmlsZU9wZXJhdGlvbnM6IHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJylcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlcignQ29sbGVjdGlvbkJyb3dzZXInLCAoKSA9PiBuZXcgQ29sbGVjdGlvbkJyb3dzZXIodGhpcy5yZXNvbHZlKCdHaXRIdWJDbGllbnQnKSwgdGhpcy5yZXNvbHZlKCdDb2xsZWN0aW9uQ2FjaGUnKSwgdGhpcy5yZXNvbHZlKCdDb2xsZWN0aW9uSW5kZXhNYW5hZ2VyJykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdDb2xsZWN0aW9uU2VhcmNoJywgKCkgPT4gbmV3IENvbGxlY3Rpb25TZWFyY2goXG4gICAgICB0aGlzLnJlc29sdmUoJ0dpdEh1YkNsaWVudCcpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdDb2xsZWN0aW9uQ2FjaGUnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ29sbGVjdGlvbkluZGV4Q2FjaGUnKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1BlcnNvbmFEZXRhaWxzJywgKCkgPT4gbmV3IFBlcnNvbmFEZXRhaWxzKHRoaXMucmVzb2x2ZSgnR2l0SHViQ2xpZW50JykpKTtcblxuICAgIC8vIFBPUlRGT0xJTyAmIE1BTkFHRVJTXG4gICAgdGhpcy5yZWdpc3RlcignUG9ydGZvbGlvTWFuYWdlcicsICgpID0+IG5ldyBQb3J0Zm9saW9NYW5hZ2VyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSxcbiAgICAgIHVuZGVmaW5lZFxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1BlcnNvbmFNYW5hZ2VyJywgKCkgPT4gbmV3IFBlcnNvbmFNYW5hZ2VyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9NYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0luZGljYXRvckNvbmZpZycpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlTG9ja01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1ZhbGlkYXRpb25SZWdpc3RyeScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdNZXRhZGF0YVNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnUGVyc29uYUltcG9ydGVyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1N0YXRlQ2hhbmdlTm90aWZpZXInKSxcbiAgICAgIHtcbiAgICAgICAgZXZlbnREaXNwYXRjaGVyOiB0aGlzLnJlc29sdmUoJ0VsZW1lbnRFdmVudERpc3BhdGNoZXInKSxcbiAgICAgICAgZW5hYmxlRmlsZVdhdGNoZXI6IHRydWUsXG4gICAgICAgIGF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlOiB0cnVlLFxuICAgICAgICBmaWxlV2F0Y2hTZXJ2aWNlOiB0aGlzLnJlc29sdmUoJ0ZpbGVXYXRjaFNlcnZpY2UnKSxcbiAgICAgICAgbWVtb3J5QnVkZ2V0OiB0aGlzLnJlc29sdmUoJ0NhY2hlTWVtb3J5QnVkZ2V0JyksXG4gICAgICAgIGJhY2t1cFNlcnZpY2U6IHRoaXMucmVzb2x2ZSgnQmFja3VwU2VydmljZScpXG4gICAgICB9XG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignSW5pdGlhbGl6YXRpb25TZXJ2aWNlJywgKCkgPT4gbmV3IEluaXRpYWxpemF0aW9uU2VydmljZShcbiAgICAgIHRoaXMucmVzb2x2ZSgnUGVyc29uYU1hbmFnZXInKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1BlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlJywgKCkgPT4gbmV3IFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlKFxuICAgICAgdGhpcy5yZXNvbHZlKCdQZXJzb25hTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdJbmRpY2F0b3JDb25maWcnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnU3RhdGVDaGFuZ2VOb3RpZmllcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdFbGVtZW50RXZlbnREaXNwYXRjaGVyJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdNaWdyYXRpb25NYW5hZ2VyJywgKCkgPT4gbmV3IE1pZ3JhdGlvbk1hbmFnZXIodGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9NYW5hZ2VyJyksIHRoaXMucmVzb2x2ZSgnRmlsZUxvY2tNYW5hZ2VyJyksIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdFbGVtZW50SW5zdGFsbGVyJywgKCkgPT4gbmV3IEVsZW1lbnRJbnN0YWxsZXIodGhpcy5yZXNvbHZlKCdHaXRIdWJDbGllbnQnKSwge1xuICAgICAgcG9ydGZvbGlvTWFuYWdlcjogdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9NYW5hZ2VyJyksXG4gICAgICB1bmlmaWVkSW5kZXhNYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ1VuaWZpZWRJbmRleE1hbmFnZXInKSxcbiAgICAgIGZpbGVPcGVyYXRpb25zOiB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpXG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyJywgKCkgPT4gbmV3IFBvcnRmb2xpb1JlcG9NYW5hZ2VyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdUb2tlbk1hbmFnZXInKSxcbiAgICAgIGdldFBvcnRmb2xpb1JlcG9zaXRvcnlOYW1lKClcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdHaXRIdWJQb3J0Zm9saW9JbmRleGVyJywgKCkgPT4gbmV3IEdpdEh1YlBvcnRmb2xpb0luZGV4ZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyJylcbiAgICApKTtcbiAgICBcbiAgICAvLyBTRVJWSUNFU1xuICAgIHRoaXMucmVnaXN0ZXIoJ1NlcmlhbGl6YXRpb25TZXJ2aWNlJywgKCkgPT4gbmV3IFNlcmlhbGl6YXRpb25TZXJ2aWNlKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ01ldGFkYXRhU2VydmljZScsICgpID0+IG5ldyBNZXRhZGF0YVNlcnZpY2UoKSk7XG4gICAgdGhpcy5yZWdpc3RlcignVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlJywgKCkgPT4gbmV3IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSgpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdWYWxpZGF0aW9uU2VydmljZScsICgpID0+IG5ldyBWYWxpZGF0aW9uU2VydmljZSgpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdGaWxlV2F0Y2hTZXJ2aWNlJywgKCkgPT4gbmV3IEZpbGVXYXRjaFNlcnZpY2UoKSk7XG4gICAgdGhpcy5yZWdpc3RlcignVmFsaWRhdGlvblJlZ2lzdHJ5JywgKCkgPT4gbmV3IFZhbGlkYXRpb25SZWdpc3RyeShcbiAgICAgIHRoaXMucmVzb2x2ZSgnVmFsaWRhdGlvblNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ01ldGFkYXRhU2VydmljZScpXG4gICAgKSk7XG5cbiAgICAvLyBMT0dHSU5HXG4gICAgdGhpcy5yZWdpc3RlcignTG9nTWFuYWdlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGJ1aWxkTG9nTWFuYWdlckNvbmZpZyhlbnYpO1xuICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBMb2dNYW5hZ2VyKGNvbmZpZyk7XG5cbiAgICAgIC8vIFBoYXNlIDI6IEZpbGVMb2dTaW5rXG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSBjb25maWcubG9nRm9ybWF0ID09PSAnanNvbmwnXG4gICAgICAgID8gbmV3IEpzb25sRm9ybWF0dGVyKClcbiAgICAgICAgOiBuZXcgUGxhaW5UZXh0Rm9ybWF0dGVyKCk7XG4gICAgICBjb25zdCBmaWxlU2luayA9IG5ldyBGaWxlTG9nU2luayh7XG4gICAgICAgIGxvZ0RpcjogY29uZmlnLmxvZ0RpcixcbiAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICBtYXhGaWxlU2l6ZTogY29uZmlnLmZpbGVNYXhTaXplLFxuICAgICAgICByZXRlbnRpb25EYXlzOiBjb25maWcucmV0ZW50aW9uRGF5cyxcbiAgICAgICAgc2VjdXJpdHlSZXRlbnRpb25EYXlzOiBjb25maWcuc2VjdXJpdHlSZXRlbnRpb25EYXlzLFxuICAgICAgICBtYXhEaXJTaXplQnl0ZXM6IGNvbmZpZy5tYXhEaXJTaXplQnl0ZXMsXG4gICAgICAgIG1heEZpbGVzUGVyQ2F0ZWdvcnk6IGNvbmZpZy5tYXhGaWxlc1BlckNhdGVnb3J5LFxuICAgICAgfSk7XG4gICAgICBtYW5hZ2VyLnJlZ2lzdGVyU2luayhmaWxlU2luayk7XG4gICAgICBmaWxlU2luay5zdGFydENsZWFudXBUaW1lcigpO1xuXG4gICAgICAvLyBQaGFzZSAzOiBNZW1vcnlMb2dTaW5rXG4gICAgICBjb25zdCBtZW1vcnlTaW5rID0gbmV3IE1lbW9yeUxvZ1Npbmsoe1xuICAgICAgICBhcHBDYXBhY2l0eTogY29uZmlnLm1lbW9yeUFwcENhcGFjaXR5LFxuICAgICAgICBzZWN1cml0eUNhcGFjaXR5OiBjb25maWcubWVtb3J5U2VjdXJpdHlDYXBhY2l0eSxcbiAgICAgICAgcGVyZkNhcGFjaXR5OiBjb25maWcubWVtb3J5UGVyZkNhcGFjaXR5LFxuICAgICAgICB0ZWxlbWV0cnlDYXBhY2l0eTogY29uZmlnLm1lbW9yeVRlbGVtZXRyeUNhcGFjaXR5LFxuICAgICAgfSk7XG4gICAgICBtYW5hZ2VyLnJlZ2lzdGVyU2luayhtZW1vcnlTaW5rKTtcblxuICAgICAgLy8gUmVnaXN0ZXIgYXMgbmFtZWQgc2VydmljZSBmb3IgUGhhc2UgNSdzIE1DUCBxdWVyeSB0b29sXG4gICAgICB0aGlzLnJlZ2lzdGVyKCdNZW1vcnlMb2dTaW5rJywgKCkgPT4gbWVtb3J5U2luayk7XG5cbiAgICAgIC8vIFBoYXNlIDY6IFNTRUxvZ1NpbmsgKG9wdC1pbiBIVFRQIGRlYnVnIHZpZXdlcilcbiAgICAgIGlmIChjb25maWcudmlld2VyRW5hYmxlZCkge1xuICAgICAgICBjb25zdCBzc2VTaW5rID0gbmV3IFNTRUxvZ1Npbmsoe1xuICAgICAgICAgIHBvcnQ6IGNvbmZpZy52aWV3ZXJQb3J0LFxuICAgICAgICAgIG1lbW9yeVNpbms6IG1lbW9yeVNpbmssXG4gICAgICAgIH0pO1xuICAgICAgICBtYW5hZ2VyLnJlZ2lzdGVyU2luayhzc2VTaW5rKTtcbiAgICAgICAgdm9pZCBzc2VTaW5rLnN0YXJ0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXJ0dXAgbWFya2VyIOKAlCBmaXJzdCBlbnRyeSBpbiBldmVyeSBzZXJ2ZXIgc2Vzc2lvblxuICAgICAgbWFuYWdlci5sb2coe1xuICAgICAgICBpZDogbWFuYWdlci5nZW5lcmF0ZUlkKCksXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBjYXRlZ29yeTogJ2FwcGxpY2F0aW9uJyxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgc291cmNlOiAnRG9sbGhvdXNlTUNQJyxcbiAgICAgICAgbWVzc2FnZTogYERvbGxob3VzZU1DUCB2JHtWRVJTSU9OfSBzdGFydGluZ2AsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB2ZXJzaW9uOiBWRVJTSU9OLFxuICAgICAgICAgIGxvZ0xldmVsOiBjb25maWcubG9nTGV2ZWwsXG4gICAgICAgICAgbG9nRm9ybWF0OiBjb25maWcubG9nRm9ybWF0LFxuICAgICAgICAgIHZpZXdlcjogY29uZmlnLnZpZXdlckVuYWJsZWQgPyBgaHR0cDovLzEyNy4wLjAuMToke2NvbmZpZy52aWV3ZXJQb3J0fWAgOiAnZGlzYWJsZWQnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBtYW5hZ2VyO1xuICAgIH0pO1xuXG4gICAgLy8gVEVMRU1FVFJZXG4gICAgdGhpcy5yZWdpc3RlcignT3BlcmF0aW9uYWxUZWxlbWV0cnknLCAoKSA9PiBuZXcgT3BlcmF0aW9uYWxUZWxlbWV0cnkoXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpXG4gICAgKSk7XG5cbiAgICAvLyBCQUNLVVAgU0VSVklDRSAoSXNzdWUgIzY1OTogVW5pdmVyc2FsIGJhY2t1cCBmb3IgYWxsIGVsZW1lbnQgdHlwZXMpXG4gICAgdGhpcy5yZWdpc3RlcignQmFja3VwU2VydmljZScsICgpID0+IG5ldyBCYWNrdXBTZXJ2aWNlKFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSxcbiAgICAgIHtcbiAgICAgICAgYmFja3VwUm9vdERpcjogcGF0aC5qb2luKHRoaXMucmVzb2x2ZTxQb3J0Zm9saW9NYW5hZ2VyPignUG9ydGZvbGlvTWFuYWdlcicpLmdldEJhc2VEaXIoKSwgJy5iYWNrdXBzJyksXG4gICAgICAgIG1heEJhY2t1cHNQZXJFbGVtZW50OiBnZXRWYWxpZGF0ZWRNYXhCYWNrdXBzUGVyRWxlbWVudCgpLFxuICAgICAgICBlbmFibGVkOiBTVE9SQUdFX0xBWUVSX0NPTkZJRy5CQUNLVVBTX0VOQUJMRUQsXG4gICAgICB9XG4gICAgKSk7XG5cbiAgICAvLyBQT0xJQ1kgRVhQT1JUIFNFUlZJQ0UgKElzc3VlICM3NjI6IEV4cG9ydCBwb2xpY2llcyB0byBicmlkZ2UpXG4gICAgdGhpcy5yZWdpc3RlcignUG9saWN5RXhwb3J0U2VydmljZScsICgpID0+IG5ldyBQb2xpY3lFeHBvcnRTZXJ2aWNlKHtcbiAgICAgIGdldEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMucmVzb2x2ZTxFbGVtZW50Q1JVREhhbmRsZXI+KCdFbGVtZW50Q1JVREhhbmRsZXInKTtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRBY3RpdmVFbGVtZW50c0ZvclBvbGljeSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRTZXJ2ZXJWZXJzaW9uOiAoKSA9PiBQQUNLQUdFX1ZFUlNJT04sXG4gICAgfSkpO1xuXG4gICAgLy8gRUxFTUVOVCBNQU5BR0VSU1xuICAgIHRoaXMucmVnaXN0ZXIoJ1NraWxsTWFuYWdlcicsICgpID0+IG5ldyBTa2lsbE1hbmFnZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZUxvY2tNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdWYWxpZGF0aW9uUmVnaXN0cnknKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnU2VyaWFsaXphdGlvblNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnTWV0YWRhdGFTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVXYXRjaFNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ2FjaGVNZW1vcnlCdWRnZXQnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQmFja3VwU2VydmljZScpXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignVGVtcGxhdGVNYW5hZ2VyJywgKCkgPT4gbmV3IFRlbXBsYXRlTWFuYWdlcihcbiAgICAgIHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlTG9ja01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1ZhbGlkYXRpb25SZWdpc3RyeScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdTZXJpYWxpemF0aW9uU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdNZXRhZGF0YVNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZVdhdGNoU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdDYWNoZU1lbW9yeUJ1ZGdldCcpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdCYWNrdXBTZXJ2aWNlJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdUZW1wbGF0ZVJlbmRlcmVyJywgKCkgPT4gbmV3IFRlbXBsYXRlUmVuZGVyZXIodGhpcy5yZXNvbHZlKCdUZW1wbGF0ZU1hbmFnZXInKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0FnZW50TWFuYWdlcicsICgpID0+IG5ldyBBZ2VudE1hbmFnZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZUxvY2tNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmU8UG9ydGZvbGlvTWFuYWdlcj4oJ1BvcnRmb2xpb01hbmFnZXInKS5nZXRCYXNlRGlyKCksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdWYWxpZGF0aW9uUmVnaXN0cnknKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnU2VyaWFsaXphdGlvblNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnTWV0YWRhdGFTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVXYXRjaFNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ2FjaGVNZW1vcnlCdWRnZXQnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQmFja3VwU2VydmljZScpXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignTWVtb3J5TWFuYWdlcicsICgpID0+IG5ldyBNZW1vcnlNYW5hZ2VyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9NYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVMb2NrTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnVmFsaWRhdGlvblJlZ2lzdHJ5JyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1NlcmlhbGl6YXRpb25TZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ01ldGFkYXRhU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlV2F0Y2hTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0NhY2hlTWVtb3J5QnVkZ2V0JyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0JhY2t1cFNlcnZpY2UnKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0Vuc2VtYmxlTWFuYWdlcicsICgpID0+IG5ldyBFbnNlbWJsZU1hbmFnZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZUxvY2tNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdWYWxpZGF0aW9uUmVnaXN0cnknKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnU2VyaWFsaXphdGlvblNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnTWV0YWRhdGFTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVXYXRjaFNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ2FjaGVNZW1vcnlCdWRnZXQnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQmFja3VwU2VydmljZScpXG4gICAgKSk7XG4gICAgTWVtb3J5LmNvbmZpZ3VyZU1lbW9yeU1hbmFnZXJSZXNvbHZlcigoKSA9PiB0aGlzLnJlc29sdmUoJ01lbW9yeU1hbmFnZXInKSk7XG4gICAgLy8gSXNzdWUgIzUxOiBDb25maWd1cmUgcmV0ZW50aW9uIHBvbGljeSByZXNvbHZlciBmb3IgTWVtb3J5IGNsYXNzXG4gICAgTWVtb3J5LmNvbmZpZ3VyZVJldGVudGlvblBvbGljeVJlc29sdmVyKCgpID0+IHRoaXMucmVzb2x2ZSgnUmV0ZW50aW9uUG9saWN5U2VydmljZScpKTtcbiAgICAvLyBJc3N1ZSAjMTExOiBDb25maWd1cmUgZWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyIGZvciBBZ2VudE1hbmFnZXIgKGVsZW1lbnQtYWdub3N0aWMgYWN0aXZhdGlvbilcbiAgICBBZ2VudE1hbmFnZXIuc2V0RWxlbWVudE1hbmFnZXJSZXNvbHZlcigobWFuYWdlck5hbWU6IHN0cmluZykgPT4gdGhpcy5yZXNvbHZlKG1hbmFnZXJOYW1lKSk7XG4gICAgLy8gSXNzdWUgIzQwMjogQ29uZmlndXJlIERhbmdlclpvbmVFbmZvcmNlciByZXNvbHZlciBmb3IgQWdlbnRNYW5hZ2VyIChhdXRvbm9teSBldmFsdWF0aW9uKVxuICAgIEFnZW50TWFuYWdlci5zZXREYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlcigoKSA9PiB0aGlzLnJlc29sdmUoJ0RhbmdlclpvbmVFbmZvcmNlcicpKTtcbiAgICAvLyBJc3N1ZSAjMTQyOiBDb25maWd1cmUgVmVyaWZpY2F0aW9uU3RvcmUgcmVzb2x2ZXIgZm9yIEFnZW50TWFuYWdlciAoZGFuZ2VyIHpvbmUgdmVyaWZpY2F0aW9uKVxuICAgIEFnZW50TWFuYWdlci5zZXRWZXJpZmljYXRpb25TdG9yZVJlc29sdmVyKCgpID0+IHRoaXMucmVzb2x2ZSgnVmVyaWZpY2F0aW9uU3RvcmUnKSk7XG5cbiAgICAvLyBRVUVSWSBTRVJWSUNFUyAoSXNzdWUgIzM4OiBQYWdpbmF0aW9uLCBmaWx0ZXJpbmcsIHNvcnRpbmcpXG4gICAgLy8gVGhlc2Ugc2VydmljZXMgYXJlIGVsZW1lbnQtYWdub3N0aWMgYW5kIGNhbiBiZSB1c2VkIHdpdGggYW55IGVsZW1lbnQgdHlwZVxuICAgIHRoaXMucmVnaXN0ZXIoJ1BhZ2luYXRpb25TZXJ2aWNlJywgKCkgPT4gbmV3IFBhZ2luYXRpb25TZXJ2aWNlKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0ZpbHRlclNlcnZpY2UnLCAoKSA9PiBuZXcgRmlsdGVyU2VydmljZSgpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdTb3J0U2VydmljZScsICgpID0+IG5ldyBTb3J0U2VydmljZSgpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdFbGVtZW50UXVlcnlTZXJ2aWNlJywgKCkgPT4gbmV3IEVsZW1lbnRRdWVyeVNlcnZpY2UoXG4gICAgICB0aGlzLnJlc29sdmU8UGFnaW5hdGlvblNlcnZpY2U+KCdQYWdpbmF0aW9uU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlPEZpbHRlclNlcnZpY2U+KCdGaWx0ZXJTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmU8U29ydFNlcnZpY2U+KCdTb3J0U2VydmljZScpXG4gICAgKSk7XG5cbiAgICAvLyBDT05WRVJURVJTXG4gICAgdGhpcy5yZWdpc3RlcignQW50aHJvcGljVG9Eb2xsaG91c2VDb252ZXJ0ZXInLCAoKSA9PiBuZXcgQW50aHJvcGljVG9Eb2xsaG91c2VDb252ZXJ0ZXIoKSk7XG4gICAgdGhpcy5yZWdpc3RlcignRG9sbGhvdXNlVG9BbnRocm9waWNDb252ZXJ0ZXInLCAoKSA9PiBuZXcgRG9sbGhvdXNlVG9BbnRocm9waWNDb252ZXJ0ZXIoKSk7XG5cbiAgICAvLyBTRUNVUklUWSBTRVJWSUNFU1xuICAgIC8vIElzc3VlICM0MDI6IERhbmdlclpvbmVFbmZvcmNlciBhcyBESS1tYW5hZ2VkIHNpbmdsZXRvbiAocmVwbGFjZXMgbW9kdWxlLWxldmVsIHNpbmdsZXRvbilcbiAgICB0aGlzLnJlZ2lzdGVyKCdEYW5nZXJab25lRW5mb3JjZXInLCAoKSA9PiBuZXcgRGFuZ2VyWm9uZUVuZm9yY2VyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKVxuICAgICkpO1xuICAgIC8vIElzc3VlICM1OTg6IEFjdGl2YXRpb25TdG9yZSBmb3IgcGVyLXNlc3Npb24gYWN0aXZhdGlvbiBwZXJzaXN0ZW5jZVxuICAgIHRoaXMucmVnaXN0ZXIoJ0FjdGl2YXRpb25TdG9yZScsICgpID0+IG5ldyBBY3RpdmF0aW9uU3RvcmUoXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpXG4gICAgKSk7XG4gICAgLy8gSXNzdWUgIzE0MjogVmVyaWZpY2F0aW9uU3RvcmUgZm9yIGRhbmdlciB6b25lIGNoYWxsZW5nZSBjb2RlcyAoc2VydmVyLXNpZGUpXG4gICAgdGhpcy5yZWdpc3RlcignVmVyaWZpY2F0aW9uU3RvcmUnLCAoKSA9PiBuZXcgVmVyaWZpY2F0aW9uU3RvcmUoKSk7XG4gICAgLy8gSXNzdWUgIzUyMjogTm9uLWJsb2NraW5nIE9TIGRpYWxvZyBub3RpZmllciBmb3IgdmVyaWZpY2F0aW9uIGNvZGVzXG4gICAgdGhpcy5yZWdpc3RlcignVmVyaWZpY2F0aW9uTm90aWZpZXInLCAoKSA9PiBuZXcgVmVyaWZpY2F0aW9uTm90aWZpZXIoKSk7XG4gICAgdGhpcy5yZWdpc3RlcignVG9rZW5NYW5hZ2VyJywgKCkgPT4gbmV3IFRva2VuTWFuYWdlcihcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdQYXR0ZXJuRW5jcnlwdG9yJywgKCkgPT4gbmV3IFBhdHRlcm5FbmNyeXB0b3IoKSk7XG4gICAgdGhpcy5yZWdpc3RlcignQ29udGV4dFRyYWNrZXInLCAoKSA9PiBuZXcgQ29udGV4dFRyYWNrZXIoKSk7XG4gICAgdGhpcy5yZWdpc3RlcignUGF0dGVybkRlY3J5cHRvcicsICgpID0+IG5ldyBQYXR0ZXJuRGVjcnlwdG9yKFxuICAgICAgdGhpcy5yZXNvbHZlKCdQYXR0ZXJuRW5jcnlwdG9yJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0NvbnRleHRUcmFja2VyJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdQYXR0ZXJuRXh0cmFjdG9yJywgKCkgPT4gbmV3IFBhdHRlcm5FeHRyYWN0b3IoXG4gICAgICB0aGlzLnJlc29sdmUoJ1BhdHRlcm5FbmNyeXB0b3InKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0JhY2tncm91bmRWYWxpZGF0b3InLCAoKSA9PiBuZXcgQmFja2dyb3VuZFZhbGlkYXRvcihcbiAgICAgIHRoaXMucmVzb2x2ZSgnUGF0dGVybkV4dHJhY3RvcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdNZW1vcnlNYW5hZ2VyJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdTZWN1cml0eVRlbGVtZXRyeScsICgpID0+IG5ldyBTZWN1cml0eVRlbGVtZXRyeSgpKTtcbiAgICBDb250ZW50VmFsaWRhdG9yLmNvbmZpZ3VyZVRlbGVtZXRyeVJlc29sdmVyKCgpID0+IHRoaXMucmVzb2x2ZSgnU2VjdXJpdHlUZWxlbWV0cnknKSk7XG5cbiAgICAvLyBOTFAgJiBJTkRFWElOR1xuICAgIHRoaXMucmVnaXN0ZXIoJ05MUFNjb3JpbmdNYW5hZ2VyJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleENvbmZpZ01hbmFnZXIgPSB0aGlzLnJlc29sdmU8SW5kZXhDb25maWdNYW5hZ2VyPignSW5kZXhDb25maWdNYW5hZ2VyJyk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGluZGV4Q29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBOTFBTY29yaW5nTWFuYWdlcih7XG4gICAgICAgICAgICBjYWNoZUV4cGlyeTogY29uZmlnLm5scC5jYWNoZUV4cGlyeU1pbnV0ZXMgKiA2MCAqIDEwMDAsXG4gICAgICAgICAgICBtaW5Ub2tlbkxlbmd0aDogY29uZmlnLm5scC5taW5Ub2tlbkxlbmd0aCxcbiAgICAgICAgICAgIGVudHJvcHlCYW5kczogY29uZmlnLm5scC5lbnRyb3B5QmFuZHMsXG4gICAgICAgICAgICBqYWNjYXJkVGhyZXNob2xkczogY29uZmlnLm5scC5qYWNjYXJkVGhyZXNob2xkc1xuICAgICAgICB9LCBpbmRleENvbmZpZ01hbmFnZXIpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1ZlcmJUcmlnZ2VyTWFuYWdlcicsICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXhDb25maWdNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPEluZGV4Q29uZmlnTWFuYWdlcj4oJ0luZGV4Q29uZmlnTWFuYWdlcicpO1xuICAgICAgICBjb25zdCBjb25maWcgPSBpbmRleENvbmZpZ01hbmFnZXIuZ2V0Q29uZmlnKCk7XG4gICAgICAgIHJldHVybiBuZXcgVmVyYlRyaWdnZXJNYW5hZ2VyKHtcbiAgICAgICAgICAgIGNvbmZpZGVuY2VUaHJlc2hvbGQ6IGNvbmZpZy52ZXJicy5jb25maWRlbmNlVGhyZXNob2xkLFxuICAgICAgICAgICAgbWF4RWxlbWVudHNQZXJWZXJiOiBjb25maWcudmVyYnMubWF4RWxlbWVudHNQZXJWZXJiLFxuICAgICAgICAgICAgaW5jbHVkZVN5bm9ueW1zOiBjb25maWcudmVyYnMuaW5jbHVkZVN5bm9ueW1zXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1JlbGF0aW9uc2hpcE1hbmFnZXInLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4Q29uZmlnTWFuYWdlciA9IHRoaXMucmVzb2x2ZTxJbmRleENvbmZpZ01hbmFnZXI+KCdJbmRleENvbmZpZ01hbmFnZXInKTtcbiAgICAgICAgY29uc3QgY29uZmlnID0gaW5kZXhDb25maWdNYW5hZ2VyLmdldENvbmZpZygpO1xuICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uc2hpcE1hbmFnZXIoe1xuICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgbWluQ29uZmlkZW5jZTogY29uZmlnLnBlcmZvcm1hbmNlLnNpbWlsYXJpdHlUaHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgZW5hYmxlQXV0b0Rpc2NvdmVyeTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluZGV4Q29uZmlnTWFuYWdlcixcbiAgICAgICAgICAgIHZlcmJUcmlnZ2VyTWFuYWdlcjogdGhpcy5yZXNvbHZlKCdWZXJiVHJpZ2dlck1hbmFnZXInKSxcbiAgICAgICAgICAgIG5scFNjb3Jpbmc6IHRoaXMucmVzb2x2ZSgnTkxQU2NvcmluZ01hbmFnZXInKSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlcignUG9ydGZvbGlvSW5kZXhNYW5hZ2VyJywgKCkgPT4gbmV3IFBvcnRmb2xpb0luZGV4TWFuYWdlcih0aGlzLnJlc29sdmUoJ0luZGV4Q29uZmlnTWFuYWdlcicpLCB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSwgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0VuaGFuY2VkSW5kZXhIZWxwZXJzJywgKCkgPT4gbmV3IERlZmF1bHRFbmhhbmNlZEluZGV4SGVscGVycyhcbiAgICAgIG5ldyBFbGVtZW50RGVmaW5pdGlvbkJ1aWxkZXIoKSxcbiAgICAgIG5ldyBTZW1hbnRpY1JlbGF0aW9uc2hpcFNlcnZpY2Uoe1xuICAgICAgICBubHBTY29yaW5nOiB0aGlzLnJlc29sdmUoJ05MUFNjb3JpbmdNYW5hZ2VyJyksXG4gICAgICAgIHJlbGF0aW9uc2hpcE1hbmFnZXI6IHRoaXMucmVzb2x2ZSgnUmVsYXRpb25zaGlwTWFuYWdlcicpXG4gICAgICB9KSxcbiAgICAgIChjb250ZXh0KSA9PiBuZXcgQWN0aW9uVHJpZ2dlckV4dHJhY3Rvcihjb250ZXh0KSxcbiAgICAgIChvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYWNrZXIgPSBuZXcgVHJpZ2dlck1ldHJpY3NUcmFja2VyKG9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyYWNrZXIuYWRkTG9nTGlzdGVuZXIoZ2V0VHJpZ2dlck1ldHJpY3NMb2dMaXN0ZW5lcihcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZSgnTG9nTWFuYWdlcicpLFxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlKCdDb250ZXh0VHJhY2tlcicpXG4gICAgICAgICAgKSk7XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBMb2dNYW5hZ2VyIG5vdCB5ZXQgcmVnaXN0ZXJlZCAqLyB9XG4gICAgICAgIHJldHVybiB0cmFja2VyO1xuICAgICAgfVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0VuaGFuY2VkSW5kZXhNYW5hZ2VyJywgKCkgPT4gbmV3IEVuaGFuY2VkSW5kZXhNYW5hZ2VyKFxuICAgICAgICB0aGlzLnJlc29sdmUoJ0luZGV4Q29uZmlnTWFuYWdlcicpLFxuICAgICAgICB0aGlzLnJlc29sdmUoJ0NvbmZpZ01hbmFnZXInKSxcbiAgICAgICAgdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9JbmRleE1hbmFnZXInKSxcbiAgICAgICAgdGhpcy5yZXNvbHZlKCdOTFBTY29yaW5nTWFuYWdlcicpLFxuICAgICAgICB0aGlzLnJlc29sdmUoJ1ZlcmJUcmlnZ2VyTWFuYWdlcicpLFxuICAgICAgICB0aGlzLnJlc29sdmUoJ1JlbGF0aW9uc2hpcE1hbmFnZXInKSxcbiAgICAgICAgdGhpcy5yZXNvbHZlKCdFbmhhbmNlZEluZGV4SGVscGVycycpLFxuICAgICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignQ29sbGVjdGlvbkluZGV4Q2FjaGUnLCAoKSA9PiBuZXcgQ29sbGVjdGlvbkluZGV4Q2FjaGUoXG4gICAgICAgIHRoaXMucmVzb2x2ZSgnR2l0SHViQ2xpZW50JyksXG4gICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgIHRoaXMucmVzb2x2ZSgnUGVyZm9ybWFuY2VNb25pdG9yJyksXG4gICAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdVbmlmaWVkSW5kZXhNYW5hZ2VyJywgKCkgPT4gbmV3IFVuaWZpZWRJbmRleE1hbmFnZXIoe1xuICAgICAgICBwb3J0Zm9saW9JbmRleE1hbmFnZXI6IHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyJyksXG4gICAgICAgIGdpdGh1YkluZGV4ZXI6IHRoaXMucmVzb2x2ZSgnR2l0SHViUG9ydGZvbGlvSW5kZXhlcicpLFxuICAgICAgICBjb2xsZWN0aW9uSW5kZXhDYWNoZTogdGhpcy5yZXNvbHZlKCdDb2xsZWN0aW9uSW5kZXhDYWNoZScpLFxuICAgICAgICBnaXRodWJDbGllbnQ6IHRoaXMucmVzb2x2ZSgnR2l0SHViQ2xpZW50JyksXG4gICAgICAgIGFwaUNhY2hlOiB0aGlzLnJlc29sdmUoJ0FQSUNhY2hlJyksXG4gICAgICAgIHJhdGVMaW1pdFRyYWNrZXI6IHRoaXMucmVzb2x2ZSgnUmF0ZUxpbWl0VHJhY2tlcicpLFxuICAgICAgICBwZXJmb3JtYW5jZU1vbml0b3I6IHRoaXMucmVzb2x2ZSgnUGVyZm9ybWFuY2VNb25pdG9yJyksXG4gICAgICAgIGZpbGVPcGVyYXRpb25zOiB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpXG4gICAgfSkpO1xuXG4gICAgdGhpcy5yZWdpc3RlcignUG9ydGZvbGlvU3luY0NvbXBhcmVyJywgKCkgPT4gbmV3IFBvcnRmb2xpb1N5bmNDb21wYXJlcigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdQb3J0Zm9saW9Eb3dubG9hZGVyJywgKCkgPT4gbmV3IFBvcnRmb2xpb0Rvd25sb2FkZXIoKSk7XG5cbiAgICAvLyBTWU5DICYgVE9PTFNcbiAgICB0aGlzLnJlZ2lzdGVyKCdQb3J0Zm9saW9QdWxsSGFuZGxlcicsICgpID0+IG5ldyBQb3J0Zm9saW9QdWxsSGFuZGxlcih7XG4gICAgICAgIHBvcnRmb2xpb01hbmFnZXI6IHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvTWFuYWdlcicpLFxuICAgICAgICBpbmRleE1hbmFnZXI6IHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyJyksXG4gICAgICAgIGdpdGh1YkluZGV4ZXI6IHRoaXMucmVzb2x2ZSgnR2l0SHViUG9ydGZvbGlvSW5kZXhlcicpLFxuICAgICAgICBwb3J0Zm9saW9SZXBvTWFuYWdlcjogdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9SZXBvTWFuYWdlcicpLFxuICAgICAgICBzeW5jQ29tcGFyZXI6IHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvU3luY0NvbXBhcmVyJyksXG4gICAgICAgIGRvd25sb2FkZXI6IHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvRG93bmxvYWRlcicpLFxuICAgICAgICBmaWxlT3BlcmF0aW9uczogdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSxcbiAgICAgICAgdG9rZW5NYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ1Rva2VuTWFuYWdlcicpLFxuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wnLCAoKSA9PiBuZXcgU3VibWl0VG9Qb3J0Zm9saW9Ub29sKHRoaXMucmVzb2x2ZSgnQVBJQ2FjaGUnKSwge1xuICAgICAgICBhdXRoTWFuYWdlcjogdGhpcy5yZXNvbHZlKCdHaXRIdWJBdXRoTWFuYWdlcicpLFxuICAgICAgICBwb3J0Zm9saW9NYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSxcbiAgICAgICAgcG9ydGZvbGlvSW5kZXhNYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb0luZGV4TWFuYWdlcicpLFxuICAgICAgICBwb3J0Zm9saW9SZXBvTWFuYWdlcjogdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9SZXBvTWFuYWdlcicpLFxuICAgICAgICByYXRlTGltaXRlcjogdGhpcy5yZXNvbHZlKCdHaXRIdWJSYXRlTGltaXRlcicpLFxuICAgICAgICBmaWxlT3BlcmF0aW9uczogdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSxcbiAgICAgICAgdG9rZW5NYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ1Rva2VuTWFuYWdlcicpXG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1BvcnRmb2xpb1N5bmNNYW5hZ2VyJywgKCkgPT4gbmV3IFBvcnRmb2xpb1N5bmNNYW5hZ2VyKHtcbiAgICAgICAgY29uZmlnTWFuYWdlcjogdGhpcy5yZXNvbHZlKCdDb25maWdNYW5hZ2VyJyksXG4gICAgICAgIHBvcnRmb2xpb01hbmFnZXI6IHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvTWFuYWdlcicpLFxuICAgICAgICBwb3J0Zm9saW9SZXBvTWFuYWdlcjogdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9SZXBvTWFuYWdlcicpLFxuICAgICAgICBpbmRleGVyOiB0aGlzLnJlc29sdmUoJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXInKSxcbiAgICAgICAgZmlsZU9wZXJhdGlvbnM6IHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJyksXG4gICAgICAgIHRva2VuTWFuYWdlcjogdGhpcy5yZXNvbHZlKCdUb2tlbk1hbmFnZXInKVxuICAgIH0pKTtcblxuICAgIC8vIFNFUlZFUlxuICAgIHRoaXMucmVnaXN0ZXIoJ1NlcnZlclNldHVwJywgKCkgPT4gbmV3IFNlcnZlclNldHVwKFxuICAgICAgdGhpcy5yZXNvbHZlPENvbnRleHRUcmFja2VyPignQ29udGV4dFRyYWNrZXInKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1NlcnZlclN0YXJ0dXAnLCAoKSA9PiBuZXcgU2VydmVyU3RhcnR1cChcbiAgICAgIHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlTG9ja01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ29uZmlnTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdNaWdyYXRpb25NYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ01lbW9yeU1hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnT3BlcmF0aW9uYWxUZWxlbWV0cnknKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0J1aWxkSW5mb1NlcnZpY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXJ2aWNlID0gbmV3IEJ1aWxkSW5mb1NlcnZpY2UodGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSk7XG4gICAgICAvLyBJc3N1ZSAjNzA2OiBXaXJlIHN0YXJ0dXAgaW5zdHJ1bWVudGF0aW9uXG4gICAgICBzZXJ2aWNlLnNldFN0YXJ0dXBUaW1lcih0aGlzLnJlc29sdmU8U3RhcnR1cFRpbWVyPignU3RhcnR1cFRpbWVyJykpO1xuICAgICAgc2VydmljZS5zZXREZWZlcnJlZFNldHVwQ2hlY2tlcigoKSA9PiB0aGlzLmRlZmVycmVkU2V0dXBDb21wbGV0ZSk7XG4gICAgICByZXR1cm4gc2VydmljZTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdQZXJmb3JtYW5jZU1vbml0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb25pdG9yID0gbmV3IFBlcmZvcm1hbmNlTW9uaXRvcigpO1xuICAgICAgbW9uaXRvci5zdGFydE1vbml0b3JpbmcoKTtcbiAgICAgIHJldHVybiBtb25pdG9yO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFBlcnNvbmFzRGlyKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBlcnNvbmFzRGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgcG9ydGZvbGlvIOKAlCBjcml0aWNhbCBwYXRoIG9ubHkuXG4gICAqXG4gICAqIElzc3VlICM3MDY6IFNwbGl0IGZyb20gdGhlIG9yaWdpbmFsIG1vbm9saXRoaWMgcHJlcGFyZVBvcnRmb2xpbygpLlxuICAgKiBPbmx5IHdvcmsgcmVxdWlyZWQgYmVmb3JlIE1DUCBjb25uZWN0KCkgcnVucyBoZXJlLiBOb24tY3JpdGljYWwgd29ya1xuICAgKiAobWVtb3J5IGF1dG8tbG9hZCwgYWN0aXZhdGlvbiByZXN0b3JlLCBsb2cgaG9va3MsIGRhbmdlciB6b25lIGluaXQpXG4gICAqIGlzIGRlZmVycmVkIHRvIGNvbXBsZXRlRGVmZXJyZWRTZXR1cCgpIHdoaWNoIHJ1bnMgcG9zdC1jb25uZWN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZXBhcmVQb3J0Zm9saW8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSB0aGlzLnJlc29sdmU8U3RhcnR1cFRpbWVyPignU3RhcnR1cFRpbWVyJyk7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBtaWdyYXRpb25NYW5hZ2VyID0gdGhpcy5yZXNvbHZlPE1pZ3JhdGlvbk1hbmFnZXI+KCdNaWdyYXRpb25NYW5hZ2VyJyk7XG4gICAgY29uc3QgcG9ydGZvbGlvTWFuYWdlciA9IHRoaXMucmVzb2x2ZTxQb3J0Zm9saW9NYW5hZ2VyPignUG9ydGZvbGlvTWFuYWdlcicpO1xuXG4gICAgLy8gLS0tIGNvbmZpZ19jaGVja3MgKGNyaXRpY2FsKSAtLS1cbiAgICB0aW1lci5zdGFydFBoYXNlKCdjb25maWdfY2hlY2tzJywgdHJ1ZSk7XG5cbiAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT046IFJ1biBpbmRlcGVuZGVudCBjaGVja3MgaW4gcGFyYWxsZWwgKDQwLTYwJSBmYXN0ZXIgc3RhcnR1cClcbiAgICAvLyBVc2UgUHJvbWlzZS5hbGxTZXR0bGVkIHRvIGNhcHR1cmUgYWxsIGNoZWNrIHJlc3VsdHMsIGV2ZW4gaWYgb25lIGZhaWxzXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICBtaWdyYXRpb25NYW5hZ2VyLm5lZWRzTWlncmF0aW9uKCksXG4gICAgICBwb3J0Zm9saW9NYW5hZ2VyLmV4aXN0cygpXG4gICAgXSk7XG5cbiAgICAvLyBFeHRyYWN0IHJlc3VsdHMgYW5kIGNvbGxlY3QgYW55IGVycm9yc1xuICAgIGNvbnN0IGNoZWNrRXJyb3JzOiBBcnJheTx7IGNoZWNrOiBzdHJpbmc7IGVycm9yOiBFcnJvciB9PiA9IFtdO1xuXG4gICAgbGV0IG5lZWRzTWlncmF0aW9uID0gZmFsc2U7XG4gICAgaWYgKHJlc3VsdHNbMF0uc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgbmVlZHNNaWdyYXRpb24gPSByZXN1bHRzWzBdLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGVja0Vycm9ycy5wdXNoKHtcbiAgICAgICAgY2hlY2s6ICdtaWdyYXRpb24nLFxuICAgICAgICBlcnJvcjogcmVzdWx0c1swXS5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlc3VsdHNbMF0ucmVhc29uIDogbmV3IEVycm9yKFN0cmluZyhyZXN1bHRzWzBdLnJlYXNvbikpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgcG9ydGZvbGlvRXhpc3RzID0gZmFsc2U7XG4gICAgaWYgKHJlc3VsdHNbMV0uc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgcG9ydGZvbGlvRXhpc3RzID0gcmVzdWx0c1sxXS52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tFcnJvcnMucHVzaCh7XG4gICAgICAgIGNoZWNrOiAncG9ydGZvbGlvJyxcbiAgICAgICAgZXJyb3I6IHJlc3VsdHNbMV0ucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZXN1bHRzWzFdLnJlYXNvbiA6IG5ldyBFcnJvcihTdHJpbmcocmVzdWx0c1sxXS5yZWFzb24pKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgYm90aCBjaGVja3MgZmFpbGVkLCB0aHJvdyBjb21wcmVoZW5zaXZlIGVycm9yXG4gICAgaWYgKGNoZWNrRXJyb3JzLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IGNoZWNrRXJyb3JzLm1hcChlID0+IGAke2UuY2hlY2t9OiAke2UuZXJyb3IubWVzc2FnZX1gKS5qb2luKCc7ICcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQb3J0Zm9saW8gcHJlcGFyYXRpb24gZmFpbGVkIC0gYWxsIGNoZWNrcyBmYWlsZWQ6ICR7ZXJyb3JNZXNzYWdlc31gKTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IG9uZSBjaGVjayBmYWlsZWQsIGxvZyB3YXJuaW5nIGJ1dCBjb250aW51ZVxuICAgIGlmIChjaGVja0Vycm9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBQb3J0Zm9saW8gY2hlY2sgZmFpbGVkIGJ1dCBjb250aW51aW5nOiAke2NoZWNrRXJyb3JzWzBdLmNoZWNrfSAtICR7Y2hlY2tFcnJvcnNbMF0uZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICB0aW1lci5lbmRQaGFzZSgnY29uZmlnX2NoZWNrcycpO1xuXG4gICAgLy8gLS0tIG1pZ3JhdGlvbiAoY3JpdGljYWwsIGNvbmRpdGlvbmFsKSAtLS1cbiAgICBpZiAobmVlZHNNaWdyYXRpb24pIHtcbiAgICAgIHRpbWVyLnN0YXJ0UGhhc2UoJ21pZ3JhdGlvbicsIHRydWUpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJMZWdhY3kgcGVyc29uYXMgZGV0ZWN0ZWQuIFN0YXJ0aW5nIG1pZ3JhdGlvbi4uLlwiKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdGlvbk1hbmFnZXIubWlncmF0ZSh7IGJhY2t1cDogdHJ1ZSB9KTtcblxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdWNjZXNzZnVsbHkgbWlncmF0ZWQgJHtyZXN1bHQubWlncmF0ZWRDb3VudH0gcGVyc29uYXNgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5iYWNrZWRVcCAmJiByZXN1bHQuYmFja3VwUGF0aCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBCYWNrdXAgY3JlYXRlZCBhdDogJHtyZXN1bHQuYmFja3VwUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiTWlncmF0aW9uIGNvbXBsZXRlZCB3aXRoIGVycm9yczpcIik7XG4gICAgICAgIHJlc3VsdC5lcnJvcnMuZm9yRWFjaCgoZXJyKSA9PiBsb2dnZXIuZXJyb3IoYCAgLSAke2Vycn1gKSk7XG4gICAgICB9XG4gICAgICB0aW1lci5lbmRQaGFzZSgnbWlncmF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gLS0tIHBvcnRmb2xpb19pbml0IChjcml0aWNhbCwgY29uZGl0aW9uYWwpIC0tLVxuICAgIGlmICghcG9ydGZvbGlvRXhpc3RzKSB7XG4gICAgICB0aW1lci5zdGFydFBoYXNlKCdwb3J0Zm9saW9faW5pdCcsIHRydWUpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJDcmVhdGluZyBwb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZS4uLlwiKTtcbiAgICAgIGF3YWl0IHBvcnRmb2xpb01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgdGltZXIuZW5kUGhhc2UoJ3BvcnRmb2xpb19pbml0Jyk7XG4gICAgfVxuXG4gICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OOiBJbml0aWFsaXplIGNvbGxlY3Rpb24gY2FjaGUgaW4gYmFja2dyb3VuZCAobm9uLWJsb2NraW5nKVxuICAgIC8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIGNvbGxlY3Rpb24gY2FjaGUgaXMgbm90IGNyaXRpY2FsIGZvciBzdGFydHVwXG4gICAgdGhpcy5pbml0aWFsaXplQ29sbGVjdGlvbkNhY2hlKCkuY2F0Y2goZXJyID0+XG4gICAgICBsb2dnZXIud2FybignQmFja2dyb3VuZCBjb2xsZWN0aW9uIGNhY2hlIGluaXRpYWxpemF0aW9uIGZhaWxlZCAod2lsbCByZXRyeSBvbiBkZW1hbmQpJywgZXJyKVxuICAgICk7XG5cbiAgICB0aGlzLnBlcnNvbmFzRGlyID0gcG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLlBFUlNPTkEpO1xuXG4gICAgLy8gLS0tIGNvbmZpZ19tYW5hZ2VyIChjcml0aWNhbCkgLS0tXG4gICAgdGltZXIuc3RhcnRQaGFzZSgnY29uZmlnX21hbmFnZXInLCB0cnVlKTtcbiAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPENvbmZpZ01hbmFnZXI+KCdDb25maWdNYW5hZ2VyJyk7XG4gICAgYXdhaXQgY29uZmlnTWFuYWdlci5pbml0aWFsaXplKCk7XG4gICAgdGltZXIuZW5kUGhhc2UoJ2NvbmZpZ19tYW5hZ2VyJyk7XG5cbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgbG9nZ2VyLmluZm8oYFtTdGFydHVwXSBDcml0aWNhbCBwb3J0Zm9saW8gcGF0aCBjb21wbGV0ZWQgaW4gJHtlbGFwc2VkVGltZX1tcyAocGVyc29uYXMgZGlyZWN0b3J5OiAke3RoaXMucGVyc29uYXNEaXJ9KWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIG5vbi1jcml0aWNhbCBzZXR1cCBhZnRlciBNQ1AgY29ubmVjdCgpLlxuICAgKlxuICAgKiBJc3N1ZSAjNzA2OiBUaGVzZSBvcGVyYXRpb25zIHdlcmUgcHJldmlvdXNseSBpbiBwcmVwYXJlUG9ydGZvbGlvKCkgYnV0IGFyZVxuICAgKiBub24tZmF0YWwgYW5kIGNhbiBzYWZlbHkgcnVuIGFmdGVyIHRoZSBzZXJ2ZXIgaXMgYWNjZXB0aW5nIGNvbm5lY3Rpb25zLlxuICAgKiBUaGlzIHNocmlua3MgdGhlIGNyaXRpY2FsIHBhdGggYnkgMTAwMC0zNzAwbXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29tcGxldGVEZWZlcnJlZFNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gdGhpcy5yZXNvbHZlPFN0YXJ0dXBUaW1lcj4oJ1N0YXJ0dXBUaW1lcicpO1xuXG4gICAgLy8gSXNzdWUgIzcwNjogVGVzdCBob29rIOKAlCBpbmplY3QgYXJ0aWZpY2lhbCBkZWxheSB0byBzaW11bGF0ZSBzbG93IGRlZmVycmVkIHNldHVwLlxuICAgIC8vIE9ubHkgYWN0aXZlIHdoZW4gRE9MTEhPVVNFX1RFU1RfREVGRVJSRURfREVMQVlfTVMgaXMgc2V0IChpbnRlZ3JhdGlvbiB0ZXN0cykuXG4gICAgY29uc3QgdGVzdERlbGF5ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1RFU1RfREVGRVJSRURfREVMQVlfTVMgfHwgJzAnLCAxMCk7XG4gICAgaWYgKHRlc3REZWxheSA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBbU3RhcnR1cF0gVGVzdCBkZWxheSBpbmplY3RlZDogJHt0ZXN0RGVsYXl9bXNgKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0ZXN0RGVsYXkpKTtcbiAgICB9XG5cbiAgICAvLyAtLS0gbWVtb3J5X2F1dG9sb2FkIChkZWZlcnJlZCkgLS0tXG4gICAgdGltZXIuc3RhcnRQaGFzZSgnbWVtb3J5X2F1dG9sb2FkJywgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPENvbmZpZ01hbmFnZXI+KCdDb25maWdNYW5hZ2VyJyk7XG4gICAgICBjb25zdCBjb25maWcgPSBjb25maWdNYW5hZ2VyLmdldENvbmZpZygpO1xuXG4gICAgICBpZiAoY29uZmlnLmF1dG9Mb2FkLmVuYWJsZWQpIHtcbiAgICAgICAgY29uc3QgbWVtb3J5TWFuYWdlciA9IHRoaXMucmVzb2x2ZTxNZW1vcnlNYW5hZ2VyPignTWVtb3J5TWFuYWdlcicpO1xuICAgICAgICBjb25zdCBhdXRvTG9hZFJlc3VsdCA9IGF3YWl0IG1lbW9yeU1hbmFnZXIubG9hZEFuZEFjdGl2YXRlQXV0b0xvYWRNZW1vcmllcygpO1xuXG4gICAgICAgIGlmIChhdXRvTG9hZFJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFtDb250YWluZXJdIEF1dG8tbG9hZCBjb21wbGV0ZWQgd2l0aCAke2F1dG9Mb2FkUmVzdWx0LmVycm9ycy5sZW5ndGh9IGVycm9yKHMpOmAsXG4gICAgICAgICAgICBhdXRvTG9hZFJlc3VsdC5lcnJvcnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFtDb250YWluZXJdIEF1dG8tbG9hZGVkICR7YXV0b0xvYWRSZXN1bHQubG9hZGVkfSBtZW1vcmllcyBgICtcbiAgICAgICAgICBgKH4ke2F1dG9Mb2FkUmVzdWx0LnRvdGFsVG9rZW5zfSB0b2tlbnMpLCAke2F1dG9Mb2FkUmVzdWx0LnNraXBwZWR9IHNraXBwZWRgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1tDb250YWluZXJdIEF1dG8tbG9hZCBtZW1vcmllcyBkaXNhYmxlZCBpbiBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW0NvbnRhaW5lcl0gTWVtb3J5IGF1dG8tbG9hZCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgICB0aW1lci5lbmRQaGFzZSgnbWVtb3J5X2F1dG9sb2FkJyk7XG5cbiAgICAvLyAtLS0gYWN0aXZhdGlvbl9yZXN0b3JlIChkZWZlcnJlZCkgLS0tXG4gICAgdGltZXIuc3RhcnRQaGFzZSgnYWN0aXZhdGlvbl9yZXN0b3JlJywgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhY3RpdmF0aW9uU3RvcmUgPSB0aGlzLnJlc29sdmU8QWN0aXZhdGlvblN0b3JlPignQWN0aXZhdGlvblN0b3JlJyk7XG4gICAgICBhd2FpdCBhY3RpdmF0aW9uU3RvcmUuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICBpZiAoYWN0aXZhdGlvblN0b3JlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZUFjdGl2YXRpb25zKGFjdGl2YXRpb25TdG9yZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdbQ29udGFpbmVyXSBBY3RpdmF0aW9uIHN0YXRlIHJlc3RvcmF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICAgIHRpbWVyLmVuZFBoYXNlKCdhY3RpdmF0aW9uX3Jlc3RvcmUnKTtcblxuICAgIC8vIC0tLSBwb2xpY3lfZXhwb3J0IChkZWZlcnJlZCwgSXNzdWUgIzc2MikgLS0tXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBvbGljeUV4cG9ydFNlcnZpY2UgPSB0aGlzLnJlc29sdmU8UG9saWN5RXhwb3J0U2VydmljZT4oJ1BvbGljeUV4cG9ydFNlcnZpY2UnKTtcbiAgICAgIGF3YWl0IHBvbGljeUV4cG9ydFNlcnZpY2UuZXhwb3J0UG9saWNpZXMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbQ29udGFpbmVyXSBQb2xpY3kgZXhwb3J0IHNraXBwZWQ6JywgZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIC0tLSBsb2dfaG9va3MgKGRlZmVycmVkKSAtLS1cbiAgICB0aW1lci5zdGFydFBoYXNlKCdsb2dfaG9va3MnLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvZ01hbmFnZXIgPSB0aGlzLnJlc29sdmU8TG9nTWFuYWdlcj4oJ0xvZ01hbmFnZXInKTtcbiAgICAgIGNvbnN0IGxvZ0NsZWFudXBzID0gd2lyZUxvZ0hvb2tzKGxvZ01hbmFnZXIsIHRoaXMpO1xuICAgICAgdGhpcy5yZWdpc3RlcignX2xvZ0hvb2tDbGVhbnVwcycsICgpID0+IGxvZ0NsZWFudXBzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1tDb250YWluZXJdIEZhaWxlZCB0byB3aXJlIGxvZyBob29rczonLCBlcnJvcik7XG4gICAgfVxuICAgIHRpbWVyLmVuZFBoYXNlKCdsb2dfaG9va3MnKTtcblxuICAgIC8vIC0tLSBkYW5nZXJfem9uZV9pbml0IChkZWZlcnJlZCkgLS0tXG4gICAgdGltZXIuc3RhcnRQaGFzZSgnZGFuZ2VyX3pvbmVfaW5pdCcsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGFuZ2VyWm9uZUVuZm9yY2VyID0gdGhpcy5yZXNvbHZlPERhbmdlclpvbmVFbmZvcmNlcj4oJ0RhbmdlclpvbmVFbmZvcmNlcicpO1xuICAgICAgYXdhaXQgZGFuZ2VyWm9uZUVuZm9yY2VyLmluaXRpYWxpemUoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1tDb250YWluZXJdIERhbmdlclpvbmVFbmZvcmNlciBpbml0aWFsaXphdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgICB0aW1lci5lbmRQaGFzZSgnZGFuZ2VyX3pvbmVfaW5pdCcpO1xuXG4gICAgLy8gLS0tIHBhdHRlcm5fZW5jcnlwdGlvbiAoZGVmZXJyZWQpIC0tLVxuICAgIHRpbWVyLnN0YXJ0UGhhc2UoJ3BhdHRlcm5fZW5jcnlwdGlvbicsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF0dGVybkVuY3J5cHRvciA9IHRoaXMucmVzb2x2ZSgnUGF0dGVybkVuY3J5cHRvcicpIGFzIFBhdHRlcm5FbmNyeXB0b3I7XG4gICAgICBhd2FpdCBwYXR0ZXJuRW5jcnlwdG9yLmluaXRpYWxpemUoKTtcbiAgICAgIGxvZ2dlci5pbmZvKFwiUGF0dGVybiBlbmNyeXB0aW9uIGluaXRpYWxpemVkXCIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignW0NvbnRhaW5lcl0gUGF0dGVybiBlbmNyeXB0aW9uIGluaXRpYWxpemF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICAgIHRpbWVyLmVuZFBoYXNlKCdwYXR0ZXJuX2VuY3J5cHRpb24nKTtcblxuICAgIC8vIC0tLSBiYWNrZ3JvdW5kX3ZhbGlkYXRvciAoZGVmZXJyZWQpIC0tLVxuICAgIHRpbWVyLnN0YXJ0UGhhc2UoJ2JhY2tncm91bmRfdmFsaWRhdG9yJywgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYWNrZ3JvdW5kVmFsaWRhdG9yID0gdGhpcy5yZXNvbHZlKCdCYWNrZ3JvdW5kVmFsaWRhdG9yJykgYXMgYW55O1xuICAgICAgYmFja2dyb3VuZFZhbGlkYXRvci5zdGFydCgpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJCYWNrZ3JvdW5kIHZhbGlkYXRvciBzdGFydGVkIGZvciBtZW1vcnkgc2VjdXJpdHlcIik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdbQ29udGFpbmVyXSBCYWNrZ3JvdW5kIHZhbGlkYXRvciBzdGFydCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgICB0aW1lci5lbmRQaGFzZSgnYmFja2dyb3VuZF92YWxpZGF0b3InKTtcblxuICAgIHRoaXMuZGVmZXJyZWRTZXR1cENvbXBsZXRlID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJlcG9ydCA9IHRpbWVyLmdldFJlcG9ydCgpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYFtTdGFydHVwXSBEZWZlcnJlZCBzZXR1cCBjb21wbGV0ZWQgaW4gJHtyZXBvcnQuZGVmZXJyZWRNc31tcyBgICtcbiAgICAgIGAodG90YWwgc3RhcnR1cDogJHtyZXBvcnQudG90YWxNc31tcywgY3JpdGljYWw6ICR7cmVwb3J0LmNyaXRpY2FsUGF0aE1zfW1zKWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmUgcGVyLXNlc3Npb24gYWN0aXZhdGlvbiBzdGF0ZSBmcm9tIHRoZSBBY3RpdmF0aW9uU3RvcmUuXG4gICAqIENhbGxlZCBkdXJpbmcgcHJlcGFyZVBvcnRmb2xpbygpIGFmdGVyIGF1dG8tbG9hZCBtZW1vcmllcy5cbiAgICpcbiAgICogSXNzdWUgIzU5ODogRWFjaCBlbGVtZW50IHR5cGUgaXMgcmVzdG9yZWQgaW5kZXBlbmRlbnRseS5cbiAgICogTWlzc2luZyBlbGVtZW50cyAoZGVsZXRlZCBzaW5jZSBsYXN0IHNlc3Npb24pIGFyZSBza2lwcGVkIGFuZCBwcnVuZWQuXG4gICAqIEF1dG8tbG9hZGVkIG1lbW9yaWVzIGFyZSBkZWR1cGxpY2F0ZWQgKG5vdCBhY3RpdmF0ZWQgdHdpY2UpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXN0b3JlQWN0aXZhdGlvbnMoc3RvcmU6IEFjdGl2YXRpb25TdG9yZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBlcnNvbmFNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPFBlcnNvbmFNYW5hZ2VyPignUGVyc29uYU1hbmFnZXInKTtcbiAgICBjb25zdCBza2lsbE1hbmFnZXIgPSB0aGlzLnJlc29sdmU8U2tpbGxNYW5hZ2VyPignU2tpbGxNYW5hZ2VyJyk7XG4gICAgY29uc3QgYWdlbnRNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPEFnZW50TWFuYWdlcj4oJ0FnZW50TWFuYWdlcicpO1xuICAgIGNvbnN0IG1lbW9yeU1hbmFnZXIgPSB0aGlzLnJlc29sdmU8TWVtb3J5TWFuYWdlcj4oJ01lbW9yeU1hbmFnZXInKTtcbiAgICBjb25zdCBlbnNlbWJsZU1hbmFnZXIgPSB0aGlzLnJlc29sdmU8RW5zZW1ibGVNYW5hZ2VyPignRW5zZW1ibGVNYW5hZ2VyJyk7XG5cbiAgICBsZXQgcmVzdG9yZWRDb3VudCA9IDA7XG4gICAgbGV0IHNraXBwZWRDb3VudCA9IDA7XG5cbiAgICAvLyBSZXN0b3JlIHBlcnNvbmFzICh1c2VzIGZpbGVuYW1lIGlmIGF2YWlsYWJsZSwgZmFsbHMgYmFjayB0byBuYW1lKVxuICAgIC8vIElzc3VlICM4NDM6IGFjdGl2YXRlUGVyc29uYSgpIGlzIG5vdyBhc3luYyDigJQgdXNlcyBkaXNrIGZhbGxiYWNrIGZvciBjYWNoZSBtaXNzZXNcbiAgICBmb3IgKGNvbnN0IGFjdGl2YXRpb24gb2Ygc3RvcmUuZ2V0QWN0aXZhdGlvbnMoJ3BlcnNvbmEnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGFjdGl2YXRpb24uZmlsZW5hbWUgfHwgYWN0aXZhdGlvbi5uYW1lO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwZXJzb25hTWFuYWdlci5hY3RpdmF0ZVBlcnNvbmEoaWRlbnRpZmllcik7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc3RvcmVkQ291bnQrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtBY3RpdmF0aW9uU3RvcmVdIFBydW5pbmcgbWlzc2luZyBwZXJzb25hICcke2FjdGl2YXRpb24ubmFtZX0nYCk7XG4gICAgICAgICAgc3RvcmUucmVtb3ZlU3RhbGVBY3RpdmF0aW9uKCdwZXJzb25hJywgYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgICBza2lwcGVkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0FjdGl2YXRpb25TdG9yZV0gU2tpcHBpbmcgZmFpbGVkIHBlcnNvbmEgJyR7YWN0aXZhdGlvbi5uYW1lfSdgKTtcbiAgICAgICAgc3RvcmUucmVtb3ZlU3RhbGVBY3RpdmF0aW9uKCdwZXJzb25hJywgYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBza2lsbHNcbiAgICAvLyBOT1RFOiBhY3RpdmF0ZVNraWxsKCkgcmV0dXJucyB7c3VjY2VzcywgbWVzc2FnZX0g4oCUIGl0IG5ldmVyIHRocm93cyBvbiBub3QtZm91bmQuXG4gICAgZm9yIChjb25zdCBhY3RpdmF0aW9uIG9mIHN0b3JlLmdldEFjdGl2YXRpb25zKCdza2lsbCcpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBza2lsbE1hbmFnZXIuYWN0aXZhdGVTa2lsbChhY3RpdmF0aW9uLm5hbWUpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXN0b3JlZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbQWN0aXZhdGlvblN0b3JlXSBQcnVuaW5nIG1pc3Npbmcgc2tpbGwgJyR7YWN0aXZhdGlvbi5uYW1lfSdgKTtcbiAgICAgICAgICBzdG9yZS5yZW1vdmVTdGFsZUFjdGl2YXRpb24oJ3NraWxsJywgYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgICBza2lwcGVkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0FjdGl2YXRpb25TdG9yZV0gU2tpcHBpbmcgZmFpbGVkIHNraWxsICcke2FjdGl2YXRpb24ubmFtZX0nYCk7XG4gICAgICAgIHN0b3JlLnJlbW92ZVN0YWxlQWN0aXZhdGlvbignc2tpbGwnLCBhY3RpdmF0aW9uLm5hbWUpO1xuICAgICAgICBza2lwcGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGFnZW50c1xuICAgIGZvciAoY29uc3QgYWN0aXZhdGlvbiBvZiBzdG9yZS5nZXRBY3RpdmF0aW9ucygnYWdlbnQnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWdlbnRNYW5hZ2VyLmFjdGl2YXRlQWdlbnQoYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdG9yZWRDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0FjdGl2YXRpb25TdG9yZV0gUHJ1bmluZyBtaXNzaW5nIGFnZW50ICcke2FjdGl2YXRpb24ubmFtZX0nYCk7XG4gICAgICAgICAgc3RvcmUucmVtb3ZlU3RhbGVBY3RpdmF0aW9uKCdhZ2VudCcsIGFjdGl2YXRpb24ubmFtZSk7XG4gICAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtBY3RpdmF0aW9uU3RvcmVdIFNraXBwaW5nIGZhaWxlZCBhZ2VudCAnJHthY3RpdmF0aW9uLm5hbWV9J2ApO1xuICAgICAgICBzdG9yZS5yZW1vdmVTdGFsZUFjdGl2YXRpb24oJ2FnZW50JywgYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBtZW1vcmllcyAoZGVkdXAgYWdhaW5zdCBhdXRvLWxvYWRlZCBvbmVzKVxuICAgIGNvbnN0IGFjdGl2ZU1lbW9yaWVzID0gYXdhaXQgbWVtb3J5TWFuYWdlci5nZXRBY3RpdmVNZW1vcmllcygpO1xuICAgIGNvbnN0IGFjdGl2ZU1lbW9yeU5hbWVzID0gbmV3IFNldChhY3RpdmVNZW1vcmllcy5tYXAobSA9PiBtLm1ldGFkYXRhLm5hbWUpKTtcbiAgICBmb3IgKGNvbnN0IGFjdGl2YXRpb24gb2Ygc3RvcmUuZ2V0QWN0aXZhdGlvbnMoJ21lbW9yeScpKSB7XG4gICAgICBpZiAoYWN0aXZlTWVtb3J5TmFtZXMuaGFzKGFjdGl2YXRpb24ubmFtZSkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbQWN0aXZhdGlvblN0b3JlXSBNZW1vcnkgJyR7YWN0aXZhdGlvbi5uYW1lfScgYWxyZWFkeSBhY3RpdmUgKGF1dG8tbG9hZGVkKSwgc2tpcHBpbmdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtZW1vcnlNYW5hZ2VyLmFjdGl2YXRlTWVtb3J5KGFjdGl2YXRpb24ubmFtZSk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc3RvcmVkQ291bnQrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtBY3RpdmF0aW9uU3RvcmVdIFBydW5pbmcgbWlzc2luZyBtZW1vcnkgJyR7YWN0aXZhdGlvbi5uYW1lfSdgKTtcbiAgICAgICAgICBzdG9yZS5yZW1vdmVTdGFsZUFjdGl2YXRpb24oJ21lbW9yeScsIGFjdGl2YXRpb24ubmFtZSk7XG4gICAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtBY3RpdmF0aW9uU3RvcmVdIFNraXBwaW5nIGZhaWxlZCBtZW1vcnkgJyR7YWN0aXZhdGlvbi5uYW1lfSdgKTtcbiAgICAgICAgc3RvcmUucmVtb3ZlU3RhbGVBY3RpdmF0aW9uKCdtZW1vcnknLCBhY3RpdmF0aW9uLm5hbWUpO1xuICAgICAgICBza2lwcGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGVuc2VtYmxlc1xuICAgIGZvciAoY29uc3QgYWN0aXZhdGlvbiBvZiBzdG9yZS5nZXRBY3RpdmF0aW9ucygnZW5zZW1ibGUnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW5zZW1ibGVNYW5hZ2VyLmFjdGl2YXRlRW5zZW1ibGUoYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdG9yZWRDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0FjdGl2YXRpb25TdG9yZV0gUHJ1bmluZyBtaXNzaW5nIGVuc2VtYmxlICcke2FjdGl2YXRpb24ubmFtZX0nYCk7XG4gICAgICAgICAgc3RvcmUucmVtb3ZlU3RhbGVBY3RpdmF0aW9uKCdlbnNlbWJsZScsIGFjdGl2YXRpb24ubmFtZSk7XG4gICAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtBY3RpdmF0aW9uU3RvcmVdIFNraXBwaW5nIGZhaWxlZCBlbnNlbWJsZSAnJHthY3RpdmF0aW9uLm5hbWV9J2ApO1xuICAgICAgICBzdG9yZS5yZW1vdmVTdGFsZUFjdGl2YXRpb24oJ2Vuc2VtYmxlJywgYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc3RvcmVkQ291bnQgPiAwIHx8IHNraXBwZWRDb3VudCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW0FjdGl2YXRpb25TdG9yZV0gUmVzdG9yZWQgJHtyZXN0b3JlZENvdW50fSBlbGVtZW50KHMpLCBza2lwcGVkICR7c2tpcHBlZENvdW50fSBzdGFsZSBmb3Igc2Vzc2lvbiAnJHtzdG9yZS5nZXRTZXNzaW9uSWQoKX0nYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQm9vdHN0cmFwIGFsbCBoYW5kbGVycyB3aXRob3V0IHJlZ2lzdGVyaW5nIE1DUCB0b29scy5cbiAgICogVXNlZCBieSB3ZWItb25seSBtb2RlICgtLXdlYikgdG8gZ2V0IE1DUEFRTEhhbmRsZXIgd2l0aG91dCBhbiBNQ1AgU2VydmVyLlxuICAgKiBJc3N1ZSAjNzk2OiBTcGxpdCBESSBjb250YWluZXIgYm9vdHN0cmFwIGZyb20gdHJhbnNwb3J0IGNvbm5lY3QuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYm9vdHN0cmFwSGFuZGxlcnMoKTogUHJvbWlzZTxIYW5kbGVyQnVuZGxlPiB7XG4gICAgaWYgKCF0aGlzLnBlcnNvbmFzRGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQZXJzb25hIGRpcmVjdG9yeSBub3QgaW5pdGlhbGl6ZWQuIENhbGwgcHJlcGFyZVBvcnRmb2xpbygpIGZpcnN0LlwiKTtcbiAgICB9XG5cbiAgICBQYXRoVmFsaWRhdG9yLmluaXRpYWxpemUodGhpcy5wZXJzb25hc0Rpcik7XG5cbiAgICBjb25zdCBpbmRpY2F0b3JTZXJ2aWNlID0gdGhpcy5yZXNvbHZlPFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlPignUGVyc29uYUluZGljYXRvclNlcnZpY2UnKTtcbiAgICBjb25zdCBwZXJzb25hTWFuYWdlciA9IHRoaXMucmVzb2x2ZTxQZXJzb25hTWFuYWdlcj4oJ1BlcnNvbmFNYW5hZ2VyJyk7XG4gICAgY29uc3QgaW5pdFNlcnZpY2UgPSB0aGlzLnJlc29sdmU8SW5pdGlhbGl6YXRpb25TZXJ2aWNlPignSW5pdGlhbGl6YXRpb25TZXJ2aWNlJyk7XG4gICAgY29uc3QgcGVyc29uYUV4cG9ydGVyID0gbmV3IFBlcnNvbmFFeHBvcnRlcigoKSA9PiBwZXJzb25hTWFuYWdlci5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCkpO1xuICAgIGNvbnN0IHBlcnNvbmFJbXBvcnRlciA9IG5ldyBQZXJzb25hSW1wb3J0ZXIodGhpcy5wZXJzb25hc0RpciwgKCkgPT4gcGVyc29uYU1hbmFnZXIuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpKTtcblxuICAgIC8vIENyZWF0ZSBzdGF0ZSBhY2Nlc3NvciBmb3IgUGVyc29uYUhhbmRsZXJcbiAgICBjb25zdCBhY3RpdmVQZXJzb25hQWNjZXNzb3IgPSB7XG4gICAgICBnZXQ6ICgpID0+IHBlcnNvbmFNYW5hZ2VyLmdldEFjdGl2ZVBlcnNvbmEoKT8uZmlsZW5hbWUgfHwgbnVsbCxcbiAgICAgIHNldDogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIC8vIElzc3VlICM4NDM6IGFjdGl2YXRlUGVyc29uYSBpcyBub3cgYXN5bmMgYnV0IHRoaXMgc2V0dGVyIGlzIHN5bmNocm9ub3VzLlxuICAgICAgICAgIC8vIEZpcmUtYW5kLWZvcmdldCDigJQgUGVyc29uYUhhbmRsZXIgZG9lcyBpdHMgb3duIGxvb2t1cCBiZWZvcmUgY2FsbGluZyBzZXQoKS5cbiAgICAgICAgICAvLyBMb2cgYXQgZXJyb3IgbGV2ZWwgc2luY2UgYWN0aXZhdGlvbiBmYWlsdXJlcyBoZXJlIGluZGljYXRlIHN0YWxlIHN0YXRlLlxuICAgICAgICAgIHBlcnNvbmFNYW5hZ2VyLmFjdGl2YXRlUGVyc29uYSh2YWx1ZSkuY2F0Y2goZXJyID0+XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFtDb250YWluZXJdIFBlcnNvbmEgYWN0aXZhdGlvbiBmYWlsZWQgZm9yIFwiJHt2YWx1ZX1cIiDigJQgc3RhdGUgYWNjZXNzb3IgbWF5IGJlIHN0YWxlOmAsIGVycilcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlcnNvbmFNYW5hZ2VyLmRlYWN0aXZhdGVQZXJzb25hKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcGVyc29uYUhhbmRsZXIgPSBuZXcgUGVyc29uYUhhbmRsZXIoXG4gICAgICBwZXJzb25hTWFuYWdlcixcbiAgICAgIHBlcnNvbmFFeHBvcnRlcixcbiAgICAgIHBlcnNvbmFJbXBvcnRlcixcbiAgICAgIGluaXRTZXJ2aWNlLFxuICAgICAgaW5kaWNhdG9yU2VydmljZSxcbiAgICAgIGFjdGl2ZVBlcnNvbmFBY2Nlc3NvclxuICAgICk7XG5cbiAgICBhd2FpdCBwZXJzb25hTWFuYWdlci5yZWxvYWQoKTtcblxuICAgIGNvbnN0IGVsZW1lbnRDcnVkSGFuZGxlciA9IG5ldyBFbGVtZW50Q1JVREhhbmRsZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ1NraWxsTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdUZW1wbGF0ZU1hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnVGVtcGxhdGVSZW5kZXJlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdBZ2VudE1hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnTWVtb3J5TWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdFbnNlbWJsZU1hbmFnZXInKSxcbiAgICAgIHBlcnNvbmFNYW5hZ2VyLFxuICAgICAgdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9NYW5hZ2VyJyksXG4gICAgICBpbml0U2VydmljZSxcbiAgICAgIGluZGljYXRvclNlcnZpY2UsXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdFbGVtZW50UXVlcnlTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1ZhbGlkYXRpb25SZWdpc3RyeScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdBY3RpdmF0aW9uU3RvcmUnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQmFja3VwU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdQb2xpY3lFeHBvcnRTZXJ2aWNlJylcbiAgICApO1xuICAgIC8vIFJlZ2lzdGVyIGZvciBsYXp5IHJlc29sdXRpb24gYnkgUG9saWN5RXhwb3J0U2VydmljZVxuICAgIHRoaXMucmVnaXN0ZXIoJ0VsZW1lbnRDUlVESGFuZGxlcicsICgpID0+IGVsZW1lbnRDcnVkSGFuZGxlcik7XG5cbiAgICAvLyBNQ1BBUUxIYW5kbGVyIGNyZWF0ZWQgbGF0ZXIgYWZ0ZXIgYWxsIGhhbmRsZXJzIGFyZSBpbnN0YW50aWF0ZWRcbiAgICAvLyBTZWUgYmVsb3cgYWZ0ZXIgZW5oYW5jZWRJbmRleEhhbmRsZXIgY3JlYXRpb25cblxuICAgIGNvbnN0IGNvbGxlY3Rpb25IYW5kbGVyID0gbmV3IENvbGxlY3Rpb25IYW5kbGVyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdDb2xsZWN0aW9uQnJvd3NlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdDb2xsZWN0aW9uU2VhcmNoJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1BlcnNvbmFEZXRhaWxzJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0VsZW1lbnRJbnN0YWxsZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ29sbGVjdGlvbkNhY2hlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQVBJQ2FjaGUnKSxcbiAgICAgIHBlcnNvbmFNYW5hZ2VyLCAvLyBVc2UgdGhlIHJlc29sdmVkIFBlcnNvbmFNYW5hZ2VyXG4gICAgICB0aGlzLnJlc29sdmUoJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbCcpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdVbmlmaWVkSW5kZXhNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0luaXRpYWxpemF0aW9uU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdQZXJzb25hSW5kaWNhdG9yU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKVxuICAgICk7XG5cbiAgICBjb25zdCBwb3J0Zm9saW9IYW5kbGVyID0gbmV3IFBvcnRmb2xpb0hhbmRsZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ0dpdEh1YkF1dGhNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvUHVsbEhhbmRsZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1VuaWZpZWRJbmRleE1hbmFnZXInKSxcbiAgICAgIGluaXRTZXJ2aWNlLFxuICAgICAgaW5kaWNhdG9yU2VydmljZSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ29uZmlnTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnVG9rZW5NYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyJylcbiAgICApO1xuXG4gICAgY29uc3QgZ2l0aHViQXV0aEhhbmRsZXIgPSBuZXcgR2l0SHViQXV0aEhhbmRsZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ0dpdEh1YkF1dGhNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0NvbmZpZ01hbmFnZXInKSxcbiAgICAgIGluaXRTZXJ2aWNlLFxuICAgICAgaW5kaWNhdG9yU2VydmljZSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJylcbiAgICApO1xuXG4gICAgY29uc3QgZGlzcGxheUNvbmZpZ0hhbmRsZXIgPSBuZXcgRGlzcGxheUNvbmZpZ0hhbmRsZXIoXG4gICAgICBwZXJzb25hTWFuYWdlcixcbiAgICAgIGluaXRTZXJ2aWNlLFxuICAgICAgaW5kaWNhdG9yU2VydmljZVxuICAgICk7XG5cbiAgICBjb25zdCBpZGVudGl0eUhhbmRsZXIgPSBuZXcgSWRlbnRpdHlIYW5kbGVyKFxuICAgICAgcGVyc29uYU1hbmFnZXIsXG4gICAgICBpbml0U2VydmljZSxcbiAgICAgIGluZGljYXRvclNlcnZpY2VcbiAgICApO1xuXG4gICAgY29uc3QgY29uZmlnSGFuZGxlciA9IG5ldyBDb25maWdIYW5kbGVyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdDb25maWdNYW5hZ2VyJyksXG4gICAgICBpbml0U2VydmljZSxcbiAgICAgIGluZGljYXRvclNlcnZpY2VcbiAgICApO1xuICAgIGNvbnN0IHN5bmNIYW5kbGVyID0gbmV3IFN5bmNIYW5kbGVyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9TeW5jTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdDb25maWdNYW5hZ2VyJyksXG4gICAgICBpbmRpY2F0b3JTZXJ2aWNlXG4gICAgKTtcblxuICAgIGNvbnN0IGVuaGFuY2VkSW5kZXhIYW5kbGVyID0gbmV3IEVuaGFuY2VkSW5kZXhIYW5kbGVyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdFbmhhbmNlZEluZGV4TWFuYWdlcicpLFxuICAgICAgaW5kaWNhdG9yU2VydmljZVxuICAgICk7XG5cbiAgICAvLyBJc3N1ZSAjNDUyOiBDcmVhdGUgR2F0ZWtlZXBlciBwb2xpY3kgZW5naW5lIGluc3RhbmNlXG4gICAgLy8gSXNzdWUgIzY3OTogYWxsb3dFbGVtZW50UG9saWN5T3ZlcnJpZGVzIHdpcmVkIGZyb20gZW52IChET0xMSE9VU0VfR0FURUtFRVBFUl9FTEVNRU5UX1BPTElDWV9PVkVSUklERVMpXG4gICAgY29uc3QgZ2F0ZWtlZXBlciA9IG5ldyBHYXRla2VlcGVyKHVuZGVmaW5lZCwge1xuICAgICAgZW5hYmxlQXVkaXRMb2dnaW5nOiB0cnVlLFxuICAgICAgcmVxdWlyZURhbmdlclpvbmVWZXJpZmljYXRpb246IHRydWUsXG4gICAgICBhbGxvd0VsZW1lbnRQb2xpY3lPdmVycmlkZXM6IGVudi5ET0xMSE9VU0VfR0FURUtFRVBFUl9FTEVNRU5UX1BPTElDWV9PVkVSUklERVMsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgTUNQQVFMSGFuZGxlciB3aXRoIGFsbCBhdmFpbGFibGUgaGFuZGxlcnMgZm9yIGZ1bGwgb3BlcmF0aW9uIGNvdmVyYWdlIChJc3N1ZSAjMjQxKVxuICAgIC8vIElzc3VlICMzMDE6IFBhc3MgQ29udGV4dFRyYWNrZXIgZm9yIHJlcXVlc3QgY29ycmVsYXRpb24gbWV0YWRhdGFcbiAgICAvLyBJc3N1ZSAjNDAyOiBQYXNzIERhbmdlclpvbmVFbmZvcmNlciB2aWEgSGFuZGxlclJlZ2lzdHJ5XG4gICAgY29uc3QgbWNwQXFsSGFuZGxlciA9IG5ldyBNQ1BBUUxIYW5kbGVyKHtcbiAgICAgIGVsZW1lbnRDUlVEOiBlbGVtZW50Q3J1ZEhhbmRsZXIsXG4gICAgICBtZW1vcnlNYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ01lbW9yeU1hbmFnZXInKSxcbiAgICAgIGFnZW50TWFuYWdlcjogdGhpcy5yZXNvbHZlKCdBZ2VudE1hbmFnZXInKSxcbiAgICAgIHRlbXBsYXRlUmVuZGVyZXI6IHRoaXMucmVzb2x2ZSgnVGVtcGxhdGVSZW5kZXJlcicpLFxuICAgICAgZWxlbWVudFF1ZXJ5U2VydmljZTogdGhpcy5yZXNvbHZlKCdFbGVtZW50UXVlcnlTZXJ2aWNlJyksXG4gICAgICAvLyBNQ1AtQVFMIGV4dGVuc2lvbiBoYW5kbGVycyAoSXNzdWUgIzI0MSlcbiAgICAgIGNvbGxlY3Rpb25IYW5kbGVyLFxuICAgICAgcG9ydGZvbGlvSGFuZGxlcixcbiAgICAgIGF1dGhIYW5kbGVyOiBnaXRodWJBdXRoSGFuZGxlcixcbiAgICAgIGNvbmZpZ0hhbmRsZXIsXG4gICAgICBlbmhhbmNlZEluZGV4SGFuZGxlcixcbiAgICAgIHBlcnNvbmFIYW5kbGVyLFxuICAgICAgc3luY0hhbmRsZXIsXG4gICAgICBidWlsZEluZm9TZXJ2aWNlOiB0aGlzLnJlc29sdmUoJ0J1aWxkSW5mb1NlcnZpY2UnKSxcbiAgICAgIGNhY2hlTWVtb3J5QnVkZ2V0OiB0aGlzLnJlc29sdmUoJ0NhY2hlTWVtb3J5QnVkZ2V0JyksXG4gICAgICBnYXRla2VlcGVyLCAgLy8gSXNzdWUgIzQ1MjogUG9saWN5IGVuZ2luZSBmb3IgZW5mb3JjZSgpXG4gICAgICBkYW5nZXJab25lRW5mb3JjZXI6IHRoaXMucmVzb2x2ZSgnRGFuZ2VyWm9uZUVuZm9yY2VyJyksXG4gICAgICB2ZXJpZmljYXRpb25TdG9yZTogdGhpcy5yZXNvbHZlKCdWZXJpZmljYXRpb25TdG9yZScpLCAgLy8gSXNzdWUgIzE0MjogVmVyaWZpY2F0aW9uIGNvZGVzXG4gICAgICB2ZXJpZmljYXRpb25Ob3RpZmllcjogdGhpcy5yZXNvbHZlKCdWZXJpZmljYXRpb25Ob3RpZmllcicpLCAgLy8gSXNzdWUgIzUyMjogT1MgZGlhbG9nIGZvciBjb2Rlc1xuICAgICAgbWVtb3J5U2luazogdGhpcy5yZXNvbHZlPE1lbW9yeUxvZ1Npbms+KCdNZW1vcnlMb2dTaW5rJyksICAvLyBJc3N1ZSAjNTI4OiBDUlVERS1yb3V0ZWQgcXVlcnlfbG9nc1xuICAgIH0sIHRoaXMucmVzb2x2ZTxDb250ZXh0VHJhY2tlcj4oJ0NvbnRleHRUcmFja2VyJykpO1xuXG4gICAgLy8gUmVnaXN0ZXIgbWNwQXFsSGFuZGxlciBhcyBhIHNpbmdsZXRvbiBmb3IgdGVzdCBhY2Nlc3NcbiAgICB0aGlzLnJlZ2lzdGVyKCdtY3BBcWxIYW5kbGVyJywgKCkgPT4gbWNwQXFsSGFuZGxlciwgeyBzaW5nbGV0b246IHRydWUgfSk7XG4gICAgdGhpcy5yZWdpc3RlcignZ2F0ZWtlZXBlcicsICgpID0+IGdhdGVrZWVwZXIsIHsgc2luZ2xldG9uOiB0cnVlIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcnNvbmFIYW5kbGVyLFxuICAgICAgZWxlbWVudENydWRIYW5kbGVyLFxuICAgICAgY29sbGVjdGlvbkhhbmRsZXIsXG4gICAgICBwb3J0Zm9saW9IYW5kbGVyLFxuICAgICAgZ2l0aHViQXV0aEhhbmRsZXIsXG4gICAgICBkaXNwbGF5Q29uZmlnSGFuZGxlcixcbiAgICAgIGlkZW50aXR5SGFuZGxlcixcbiAgICAgIGNvbmZpZ0hhbmRsZXIsXG4gICAgICBzeW5jSGFuZGxlcixcbiAgICAgIHRvb2xSZWdpc3RyeTogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVG9vbFJlZ2lzdHJ5LCAvLyBObyB0b29sIHJlZ2lzdHJ5IGluIGJvb3RzdHJhcC1vbmx5IG1vZGVcbiAgICAgIGVuaGFuY2VkSW5kZXhIYW5kbGVyLFxuICAgICAgbWNwQXFsSGFuZGxlcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbGwgaGFuZGxlcnMgd2l0aCBkZXBlbmRlbmN5IGluamVjdGlvbiBhbmQgcmVnaXN0ZXIgTUNQIHRvb2xzLlxuICAgKiBAcGFyYW0gc2VydmVyIC0gTUNQIFNlcnZlciBpbnN0YW5jZSBmb3IgdG9vbCByZWdpc3RyYXRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVIYW5kbGVycyhzZXJ2ZXI6IFNlcnZlcik6IFByb21pc2U8SGFuZGxlckJ1bmRsZT4ge1xuICAgIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IHRoaXMuYm9vdHN0cmFwSGFuZGxlcnMoKTtcblxuICAgIGNvbnN0IHRvb2xSZWdpc3RyeSA9IG5ldyBUb29sUmVnaXN0cnkoc2VydmVyKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRvb2xzIGJhc2VkIG9uIE1DUF9JTlRFUkZBQ0VfTU9ERSAoSXNzdWUgIzIzNylcbiAgICAvLyAtICdkaXNjcmV0ZSc6IFJlZ2lzdGVyIGluZGl2aWR1YWwgZGlzY3JldGUgdG9vbHMgKH40MCB0b29scylcbiAgICAvLyAtICdtY3BhcWwnOiBSZWdpc3RlciBjb25zb2xpZGF0ZWQgTUNQLUFRTCBpbnRlcmZhY2Ugb25seSAofjQgb3IgMSB0b29scylcbiAgICAvLyBUb2tlbiBjb3VudHMgYXJlIGxvZ2dlZCBkeW5hbWljYWxseSBhdCBzdGFydHVwIHZpYSBsb2dUb29sVG9rZW5TdGF0cygpXG4gICAgY29uc3QgaW50ZXJmYWNlTW9kZSA9IGVudi5NQ1BfSU5URVJGQUNFX01PREU7XG4gICAgbG9nZ2VyLmluZm8oYE1DUCBJbnRlcmZhY2UgTW9kZTogJHtpbnRlcmZhY2VNb2RlfWApO1xuXG4gICAgaWYgKGludGVyZmFjZU1vZGUgPT09ICdkaXNjcmV0ZScpIHtcbiAgICAgIC8vIERpc2NyZXRlIG1vZGU6IFJlZ2lzdGVyIGFsbCBpbmRpdmlkdWFsIHRvb2xzXG4gICAgICB0b29sUmVnaXN0cnkucmVnaXN0ZXJQZXJzb25hVG9vbHMoYnVuZGxlLnBlcnNvbmFIYW5kbGVyKTtcbiAgICAgIHRvb2xSZWdpc3RyeS5yZWdpc3RlckVsZW1lbnRUb29scyhidW5kbGUuZWxlbWVudENydWRIYW5kbGVyKTtcbiAgICAgIHRvb2xSZWdpc3RyeS5yZWdpc3RlckNvbGxlY3Rpb25Ub29scyhidW5kbGUuY29sbGVjdGlvbkhhbmRsZXIpO1xuICAgICAgdG9vbFJlZ2lzdHJ5LnJlZ2lzdGVyUG9ydGZvbGlvVG9vbHMoYnVuZGxlLnBvcnRmb2xpb0hhbmRsZXIpO1xuICAgICAgdG9vbFJlZ2lzdHJ5LnJlZ2lzdGVyQXV0aFRvb2xzKGJ1bmRsZS5naXRodWJBdXRoSGFuZGxlcik7XG4gICAgICB0b29sUmVnaXN0cnkucmVnaXN0ZXJDb25maWdUb29scyh7XG4gICAgICAgIGhhbmRsZUNvbmZpZ09wZXJhdGlvbjogKG9wdGlvbnMpID0+XG4gICAgICAgICAgYnVuZGxlLmNvbmZpZ0hhbmRsZXIuaGFuZGxlQ29uZmlnT3BlcmF0aW9uKG9wdGlvbnMpLFxuICAgICAgICBoYW5kbGVTeW5jT3BlcmF0aW9uOiAob3B0aW9ucykgPT5cbiAgICAgICAgICBidW5kbGUuc3luY0hhbmRsZXIuaGFuZGxlU3luY09wZXJhdGlvbihvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgICAgdG9vbFJlZ2lzdHJ5LnJlZ2lzdGVyRW5oYW5jZWRJbmRleFRvb2xzKFxuICAgICAgICBidW5kbGUuZW5oYW5jZWRJbmRleEhhbmRsZXIsXG4gICAgICAgIHRoaXMucmVzb2x2ZTxJbmRleENvbmZpZ01hbmFnZXI+KCdJbmRleENvbmZpZ01hbmFnZXInKS5nZXRDb25maWcoKVxuICAgICAgKTtcbiAgICAgIHRvb2xSZWdpc3RyeS5yZWdpc3RlckJ1aWxkSW5mb1Rvb2xzKHRoaXMucmVzb2x2ZSgnQnVpbGRJbmZvU2VydmljZScpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTUNQLUFRTCBtb2RlOiBSZWdpc3RlciBvbmx5IE1DUC1BUUwgdG9vbHNcbiAgICAgIHRvb2xSZWdpc3RyeS5yZWdpc3Rlck1DUEFRTFRvb2xzKGJ1bmRsZS5tY3BBcWxIYW5kbGVyKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgdG9rZW4gc3RhdGlzdGljcyAoSXNzdWUgIzIzNyBlbmhhbmNlbWVudClcbiAgICB0aGlzLmxvZ1Rvb2xUb2tlblN0YXRzKHRvb2xSZWdpc3RyeSwgaW50ZXJmYWNlTW9kZSwgYnVuZGxlLm1jcEFxbEhhbmRsZXIsIHtcbiAgICAgIHBlcnNvbmFIYW5kbGVyOiBidW5kbGUucGVyc29uYUhhbmRsZXIsXG4gICAgICBlbGVtZW50Q3J1ZEhhbmRsZXI6IGJ1bmRsZS5lbGVtZW50Q3J1ZEhhbmRsZXIsXG4gICAgICBjb2xsZWN0aW9uSGFuZGxlcjogYnVuZGxlLmNvbGxlY3Rpb25IYW5kbGVyLFxuICAgICAgcG9ydGZvbGlvSGFuZGxlcjogYnVuZGxlLnBvcnRmb2xpb0hhbmRsZXIsXG4gICAgICBnaXRodWJBdXRoSGFuZGxlcjogYnVuZGxlLmdpdGh1YkF1dGhIYW5kbGVyLFxuICAgICAgY29uZmlnSGFuZGxlcjogYnVuZGxlLmNvbmZpZ0hhbmRsZXIsXG4gICAgICBzeW5jSGFuZGxlcjogYnVuZGxlLnN5bmNIYW5kbGVyLFxuICAgICAgZW5oYW5jZWRJbmRleEhhbmRsZXI6IGJ1bmRsZS5lbmhhbmNlZEluZGV4SGFuZGxlcixcbiAgICB9KTtcblxuICAgIHRoaXMucmVzb2x2ZTxTZXJ2ZXJTZXR1cD4oJ1NlcnZlclNldHVwJykuc2V0dXBTZXJ2ZXIoc2VydmVyLCB0b29sUmVnaXN0cnksIGJ1bmRsZS5lbGVtZW50Q3J1ZEhhbmRsZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJ1bmRsZSxcbiAgICAgIHRvb2xSZWdpc3RyeSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvZyB0b29sIHRva2VuIHN0YXRpc3RpY3MgZm9yIG1vbml0b3JpbmcgYW5kIGRvY3VtZW50YXRpb24uXG4gICAqIFNob3dzIGN1cnJlbnQgbW9kZSB0b2tlbiBjb3VudCwgYWx0ZXJuYXRpdmUgbW9kZSBjb21wYXJpc29uLCBhbmQgc2F2aW5ncy5cbiAgICpcbiAgICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yOlxuICAgKiAxLiBEb2N1bWVudGluZyBhY3R1YWwgdG9rZW4gc2F2aW5ncyBhY2hpZXZlZFxuICAgKiAyLiBNb25pdG9yaW5nIGNvbnRleHQgd2luZG93IHVzYWdlXG4gICAqIDMuIFN1cHBvcnRpbmcgZnV0dXJlIE1DUC1BUUwgYWRhcHRlciBkZXZlbG9wbWVudFxuICAgKlxuICAgKiBJc3N1ZSAjMjM3IGVuaGFuY2VtZW50XG4gICAqL1xuICBwcml2YXRlIGxvZ1Rvb2xUb2tlblN0YXRzKFxuICAgIHRvb2xSZWdpc3RyeTogVG9vbFJlZ2lzdHJ5LFxuICAgIGludGVyZmFjZU1vZGU6ICdkaXNjcmV0ZScgfCAnbWNwYXFsJyxcbiAgICBtY3BBcWxIYW5kbGVyOiBNQ1BBUUxIYW5kbGVyLFxuICAgIGRpc2NyZXRlSGFuZGxlcnM6IHtcbiAgICAgIHBlcnNvbmFIYW5kbGVyOiBQZXJzb25hSGFuZGxlcjtcbiAgICAgIGVsZW1lbnRDcnVkSGFuZGxlcjogRWxlbWVudENSVURIYW5kbGVyO1xuICAgICAgY29sbGVjdGlvbkhhbmRsZXI6IENvbGxlY3Rpb25IYW5kbGVyO1xuICAgICAgcG9ydGZvbGlvSGFuZGxlcjogUG9ydGZvbGlvSGFuZGxlcjtcbiAgICAgIGdpdGh1YkF1dGhIYW5kbGVyOiBHaXRIdWJBdXRoSGFuZGxlcjtcbiAgICAgIGNvbmZpZ0hhbmRsZXI6IENvbmZpZ0hhbmRsZXI7XG4gICAgICBzeW5jSGFuZGxlcjogU3luY0hhbmRsZXI7XG4gICAgICBlbmhhbmNlZEluZGV4SGFuZGxlcjogRW5oYW5jZWRJbmRleEhhbmRsZXI7XG4gICAgfVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50VG9rZW5zID0gdG9vbFJlZ2lzdHJ5LmdldFRvb2xUb2tlbkVzdGltYXRlKCk7XG4gICAgY29uc3QgY3VycmVudFRvb2xDb3VudCA9IHRvb2xSZWdpc3RyeS5nZXRUb29sQ291bnQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBhbHRlcm5hdGl2ZSBtb2RlIHRva2VucyBmb3IgY29tcGFyaXNvblxuICAgIGxldCBhbHRlcm5hdGl2ZVRva2VuczogbnVtYmVyO1xuICAgIGxldCBhbHRlcm5hdGl2ZVRvb2xDb3VudDogbnVtYmVyO1xuXG4gICAgaWYgKGludGVyZmFjZU1vZGUgPT09ICdkaXNjcmV0ZScpIHtcbiAgICAgIC8vIEN1cnJlbnQgaXMgZGlzY3JldGUsIGNhbGN1bGF0ZSB3aGF0IG1jcGFxbCB3b3VsZCBiZVxuICAgICAgY29uc3QgdGVtcFJlZ2lzdHJ5ID0gbmV3IFRvb2xSZWdpc3RyeSh7fSBhcyBTZXJ2ZXIpO1xuICAgICAgdGVtcFJlZ2lzdHJ5LnJlZ2lzdGVyTUNQQVFMVG9vbHMobWNwQXFsSGFuZGxlcik7XG4gICAgICBhbHRlcm5hdGl2ZVRva2VucyA9IHRlbXBSZWdpc3RyeS5nZXRUb29sVG9rZW5Fc3RpbWF0ZSgpO1xuICAgICAgYWx0ZXJuYXRpdmVUb29sQ291bnQgPSB0ZW1wUmVnaXN0cnkuZ2V0VG9vbENvdW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEN1cnJlbnQgaXMgbWNwYXFsLCBjYWxjdWxhdGUgd2hhdCBkaXNjcmV0ZSB3b3VsZCBiZVxuICAgICAgY29uc3QgdGVtcFJlZ2lzdHJ5ID0gbmV3IFRvb2xSZWdpc3RyeSh7fSBhcyBTZXJ2ZXIpO1xuICAgICAgdGVtcFJlZ2lzdHJ5LnJlZ2lzdGVyUGVyc29uYVRvb2xzKGRpc2NyZXRlSGFuZGxlcnMucGVyc29uYUhhbmRsZXIpO1xuICAgICAgdGVtcFJlZ2lzdHJ5LnJlZ2lzdGVyRWxlbWVudFRvb2xzKGRpc2NyZXRlSGFuZGxlcnMuZWxlbWVudENydWRIYW5kbGVyKTtcbiAgICAgIHRlbXBSZWdpc3RyeS5yZWdpc3RlckNvbGxlY3Rpb25Ub29scyhkaXNjcmV0ZUhhbmRsZXJzLmNvbGxlY3Rpb25IYW5kbGVyKTtcbiAgICAgIHRlbXBSZWdpc3RyeS5yZWdpc3RlclBvcnRmb2xpb1Rvb2xzKGRpc2NyZXRlSGFuZGxlcnMucG9ydGZvbGlvSGFuZGxlcik7XG4gICAgICB0ZW1wUmVnaXN0cnkucmVnaXN0ZXJBdXRoVG9vbHMoZGlzY3JldGVIYW5kbGVycy5naXRodWJBdXRoSGFuZGxlcik7XG4gICAgICB0ZW1wUmVnaXN0cnkucmVnaXN0ZXJDb25maWdUb29scyh7XG4gICAgICAgIGhhbmRsZUNvbmZpZ09wZXJhdGlvbjogKG9wdGlvbnMpID0+XG4gICAgICAgICAgZGlzY3JldGVIYW5kbGVycy5jb25maWdIYW5kbGVyLmhhbmRsZUNvbmZpZ09wZXJhdGlvbihvcHRpb25zKSxcbiAgICAgICAgaGFuZGxlU3luY09wZXJhdGlvbjogKG9wdGlvbnMpID0+XG4gICAgICAgICAgZGlzY3JldGVIYW5kbGVycy5zeW5jSGFuZGxlci5oYW5kbGVTeW5jT3BlcmF0aW9uKG9wdGlvbnMpLFxuICAgICAgfSk7XG4gICAgICB0ZW1wUmVnaXN0cnkucmVnaXN0ZXJFbmhhbmNlZEluZGV4VG9vbHMoXG4gICAgICAgIGRpc2NyZXRlSGFuZGxlcnMuZW5oYW5jZWRJbmRleEhhbmRsZXIsXG4gICAgICAgIHRoaXMucmVzb2x2ZTxJbmRleENvbmZpZ01hbmFnZXI+KCdJbmRleENvbmZpZ01hbmFnZXInKS5nZXRDb25maWcoKVxuICAgICAgKTtcbiAgICAgIHRlbXBSZWdpc3RyeS5yZWdpc3RlckJ1aWxkSW5mb1Rvb2xzKHRoaXMucmVzb2x2ZSgnQnVpbGRJbmZvU2VydmljZScpKTtcbiAgICAgIGFsdGVybmF0aXZlVG9rZW5zID0gdGVtcFJlZ2lzdHJ5LmdldFRvb2xUb2tlbkVzdGltYXRlKCk7XG4gICAgICBhbHRlcm5hdGl2ZVRvb2xDb3VudCA9IHRlbXBSZWdpc3RyeS5nZXRUb29sQ291bnQoKTtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgc2F2aW5ncyAocG9zaXRpdmUgPSBjdXJyZW50IG1vZGUgc2F2ZXMgdG9rZW5zKVxuICAgIGNvbnN0IHRva2VuRGlmZiA9IGFsdGVybmF0aXZlVG9rZW5zIC0gY3VycmVudFRva2VucztcbiAgICBjb25zdCBzYXZpbmdzUGVyY2VudCA9IGFsdGVybmF0aXZlVG9rZW5zID4gMFxuICAgICAgPyAoKHRva2VuRGlmZiAvIGFsdGVybmF0aXZlVG9rZW5zKSAqIDEwMCkudG9GaXhlZCgxKVxuICAgICAgOiAnMCc7XG5cbiAgICAvLyBMb2cgdGhlIGNvbXBhcmlzb25cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBUb29sIFJlZ2lzdHJhdGlvbiBDb21wbGV0ZTogJHtjdXJyZW50VG9vbENvdW50fSB0b29scywgfiR7Y3VycmVudFRva2Vucy50b0xvY2FsZVN0cmluZygpfSB0b2tlbnNgXG4gICAgKTtcblxuICAgIGlmIChpbnRlcmZhY2VNb2RlID09PSAnbWNwYXFsJykge1xuICAgICAgLy8gSGlnaGxpZ2h0IHNhdmluZ3Mgd2hlbiB1c2luZyBtY3BhcWxcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgVG9rZW4gU2F2aW5nczogJHt0b2tlbkRpZmYudG9Mb2NhbGVTdHJpbmcoKX0gdG9rZW5zIHNhdmVkICgke3NhdmluZ3NQZXJjZW50fSUpIHZzIGRpc2NyZXRlIG1vZGUgKCR7YWx0ZXJuYXRpdmVUb29sQ291bnR9IHRvb2xzLCB+JHthbHRlcm5hdGl2ZVRva2Vucy50b0xvY2FsZVN0cmluZygpfSB0b2tlbnMpYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gZGlzY3JldGUgbW9kZSwgc2hvdyB3aGF0IG1jcGFxbCB3b3VsZCBzYXZlXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYEFsdGVybmF0aXZlOiBtY3BhcWwgbW9kZSB3b3VsZCB1c2UgJHthbHRlcm5hdGl2ZVRvb2xDb3VudH0gdG9vbHMsIH4ke2FsdGVybmF0aXZlVG9rZW5zLnRvTG9jYWxlU3RyaW5nKCl9IHRva2VucyAoJHtNYXRoLmFicyhOdW1iZXIoc2F2aW5nc1BlcmNlbnQpKX0lICR7dG9rZW5EaWZmIDwgMCA/ICdtb3JlJyA6ICdsZXNzJ30pYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDbGVhbiB1cCBsb2cgaG9va3MgYmVmb3JlIGRpc3Bvc2luZyBzZXJ2aWNlc1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGVhbnVwcyA9IHRoaXMucmVzb2x2ZTwoKCkgPT4gdm9pZClbXT4oJ19sb2dIb29rQ2xlYW51cHMnKTtcbiAgICAgIGNsZWFudXBzLmZvckVhY2goZm4gPT4gZm4oKSk7XG4gICAgfSBjYXRjaCB7IC8qIGhvb2tzIG5vdCB5ZXQgd2lyZWQgKi8gfVxuXG4gICAgLy8gVXNlIFByb21pc2UuYWxsU2V0dGxlZCB0byBlbnN1cmUgYWxsIHNlcnZpY2VzIGF0dGVtcHQgZGlzcG9zYWxcbiAgICAvLyBldmVuIGlmIHNvbWUgZmFpbC4gVGhpcyBwcm92aWRlcyBiZXR0ZXIgcmVzaWxpZW5jZSBhbmQgY29tcHJlaGVuc2l2ZVxuICAgIC8vIGVycm9yIHJlcG9ydGluZyBjb21wYXJlZCB0byBQcm9taXNlLmFsbCB3aGljaCBmYWlscyBmYXN0LlxuICAgIGNvbnN0IGRpc3Bvc2FsUHJvbWlzZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBwcm9taXNlOiBQcm9taXNlPHZvaWQ+IH0+ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZXJ2aWNlXSBvZiB0aGlzLnNlcnZpY2VzKSB7XG4gICAgICBpZiAoc2VydmljZS5pbnN0YW5jZSkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHNlcnZpY2UuaW5zdGFuY2UgYXMgYW55O1xuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmRpc3Bvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIHRyeS1jYXRjaCB0byBoYW5kbGUgc3luY2hyb25vdXMgdGhyb3dzLCB0aGVuIHdyYXAgaW4gUHJvbWlzZVxuICAgICAgICAgIGRpc3Bvc2FsUHJvbWlzZXMucHVzaCh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbnN0YW5jZS5kaXNwb3NlKCkpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLmNsZWFudXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIHRyeS1jYXRjaCB0byBoYW5kbGUgc3luY2hyb25vdXMgdGhyb3dzLCB0aGVuIHdyYXAgaW4gUHJvbWlzZVxuICAgICAgICAgIGRpc3Bvc2FsUHJvbWlzZXMucHVzaCh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbnN0YW5jZS5jbGVhbnVwKCkpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIGFsbCBkaXNwb3NhbHMgaW4gcGFyYWxsZWwsIGNvbGxlY3RpbmcgcmVzdWx0c1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoZGlzcG9zYWxQcm9taXNlcy5tYXAoZCA9PiBkLnByb21pc2UpKTtcblxuICAgIC8vIEFnZ3JlZ2F0ZSBhbmQgcmVwb3J0IGFsbCBmYWlsdXJlcyBmb3IgY29tcHJlaGVuc2l2ZSBkaWFnbm9zdGljc1xuICAgIGNvbnN0IGZhaWx1cmVzOiBBcnJheTx7IHNlcnZpY2U6IHN0cmluZzsgZXJyb3I6IEVycm9yIH0+ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzdWx0XSBvZiByZXN1bHRzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBkaXNwb3NhbFByb21pc2VzW2luZGV4XS5uYW1lO1xuICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlc3VsdC5yZWFzb24gOiBuZXcgRXJyb3IoU3RyaW5nKHJlc3VsdC5yZWFzb24pKTtcbiAgICAgICAgZmFpbHVyZXMucHVzaCh7IHNlcnZpY2U6IHNlcnZpY2VOYW1lLCBlcnJvciB9KTtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkaXNwb3NlIHNlcnZpY2UgJyR7c2VydmljZU5hbWV9J2AsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9nIHN1bW1hcnkgaWYgdGhlcmUgd2VyZSBmYWlsdXJlc1xuICAgIGlmIChmYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgQ29udGFpbmVyIGRpc3Bvc2FsIGNvbXBsZXRlZCB3aXRoICR7ZmFpbHVyZXMubGVuZ3RofSBmYWlsdXJlKHMpIG91dCBvZiAke2Rpc3Bvc2FsUHJvbWlzZXMubGVuZ3RofSBzZXJ2aWNlc2ApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZUNvbGxlY3Rpb25DYWNoZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29sbGVjdGlvbkNhY2hlID0gdGhpcy5yZXNvbHZlPENvbGxlY3Rpb25DYWNoZT4oJ0NvbGxlY3Rpb25DYWNoZScpO1xuICAgICAgY29uc3QgaXNDYWNoZVZhbGlkID0gYXdhaXQgY29sbGVjdGlvbkNhY2hlLmlzQ2FjaGVWYWxpZCgpO1xuICAgICAgaWYgKCFpc0NhY2hlVmFsaWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJJbml0aWFsaXppbmcgY29sbGVjdGlvbiBjYWNoZSB3aXRoIHNlZWQgZGF0YS4uLlwiKTtcbiAgICAgICAgY29uc3QgeyBDb2xsZWN0aW9uU2VlZGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jb2xsZWN0aW9uL0NvbGxlY3Rpb25TZWVkZXIuanNcIik7XG4gICAgICAgIGNvbnN0IHNlZWREYXRhID0gQ29sbGVjdGlvblNlZWRlci5nZXRTZWVkRGF0YSgpO1xuICAgICAgICBhd2FpdCBjb2xsZWN0aW9uQ2FjaGUuc2F2ZUNhY2hlKHNlZWREYXRhKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYENvbGxlY3Rpb24gY2FjaGUgaW5pdGlhbGl6ZWQgd2l0aCAke3NlZWREYXRhLmxlbmd0aH0gaXRlbXNgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgY29sbGVjdGlvbkNhY2hlLmdldENhY2hlU3RhdHMoKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDb2xsZWN0aW9uIGNhY2hlIGFscmVhZHkgdmFsaWQgd2l0aCAke3N0YXRzLml0ZW1Db3VudH0gaXRlbXNgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKFwiRG9sbGhvdXNlQ29udGFpbmVyLmluaXRpYWxpemVDb2xsZWN0aW9uQ2FjaGVcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIl19
1269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpL0NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLElBQUksT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXRFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxnQ0FBZ0MsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2hKLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxnQkFBZ0IsR0FDakIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0NBQWtDLENB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QUFhLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsS0FBSyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsWUFBWSxDQUFDLFFBQVEsQ0FBQyw4Q0FBOEMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRSxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgUEFDS0FHRV9WRVJTSU9OLCBQQUNLQUdFX1ZFUlNJT04gYXMgVkVSU0lPTiB9IGZyb20gXCIuLi9nZW5lcmF0ZWQvdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSBcIi4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qc1wiO1xuaW1wb3J0IHsgVmVyYlRyaWdnZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9WZXJiVHJpZ2dlck1hbmFnZXIuanNcIjtcbmltcG9ydCB7IFJlbGF0aW9uc2hpcE1hbmFnZXIgfSBmcm9tIFwiLi4vcG9ydGZvbGlvL1JlbGF0aW9uc2hpcE1hbmFnZXIuanNcIjtcbmltcG9ydCB7IE5MUFNjb3JpbmdNYW5hZ2VyIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9OTFBTY29yaW5nTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgU2VydmVyIH0gZnJvbSBcIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvc2VydmVyL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBsb2FkSW5kaWNhdG9yQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZy9pbmRpY2F0b3ItY29uZmlnLmpzXCI7XG5pbXBvcnQgeyBlbnYgfSBmcm9tIFwiLi4vY29uZmlnL2Vudi5qc1wiO1xuaW1wb3J0IHsgQVBJQ2FjaGUsIENvbGxlY3Rpb25DYWNoZSwgQ29sbGVjdGlvbkluZGV4Q2FjaGUsIENhY2hlTWVtb3J5QnVkZ2V0IH0gZnJvbSBcIi4uL2NhY2hlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBnZXRWYWxpZGF0ZWRHbG9iYWxDYWNoZU1lbW9yeUJ5dGVzLCBnZXRWYWxpZGF0ZWRNYXhCYWNrdXBzUGVyRWxlbWVudCwgU1RPUkFHRV9MQVlFUl9DT05GSUcgfSBmcm9tIFwiLi4vY29uZmlnL3BlcmZvcm1hbmNlLWNvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgQmFja3VwU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzXCI7XG5pbXBvcnQge1xuICBHaXRIdWJDbGllbnQsXG4gIENvbGxlY3Rpb25Ccm93c2VyLFxuICBDb2xsZWN0aW9uSW5kZXhNYW5hZ2VyLFxuICBDb2xsZWN0aW9uU2VhcmNoLFxuICBQZXJzb25hRGV0YWlscyxcbiAgRWxlbWVudEluc3RhbGxlcixcbn0gZnJvbSBcIi4uL2NvbGxlY3Rpb24vaW5kZXguanNcIjtcbmltcG9ydCB7IEdpdEh1YkF1dGhNYW5hZ2VyIH0gZnJvbSBcIi4uL2F1dGgvR2l0SHViQXV0aE1hbmFnZXIuanNcIjtcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIsIEVsZW1lbnRUeXBlIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBNaWdyYXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9NaWdyYXRpb25NYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBFbmhhbmNlZEluZGV4TWFuYWdlciB9IGZyb20gXCIuLi9wb3J0Zm9saW8vRW5oYW5jZWRJbmRleE1hbmFnZXIuanNcIjtcbmltcG9ydCB7IEVuaGFuY2VkSW5kZXhIYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXJzL0VuaGFuY2VkSW5kZXhIYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBNQ1BBUUxIYW5kbGVyLCB0eXBlIEhhbmRsZXJSZWdpc3RyeSB9IGZyb20gXCIuLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanNcIjtcbmltcG9ydCB7IEdhdGVrZWVwZXIgfSBmcm9tIFwiLi4vaGFuZGxlcnMvbWNwLWFxbC9HYXRla2VlcGVyLmpzXCI7XG5pbXBvcnQgeyBTa2lsbE1hbmFnZXIgfSBmcm9tIFwiLi4vZWxlbWVudHMvc2tpbGxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vZWxlbWVudHMvdGVtcGxhdGVzL1RlbXBsYXRlTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGVSZW5kZXJlciB9IGZyb20gXCIuLi91dGlscy9UZW1wbGF0ZVJlbmRlcmVyLmpzXCI7XG5pbXBvcnQgeyBBZ2VudE1hbmFnZXIgfSBmcm9tIFwiLi4vZWxlbWVudHMvYWdlbnRzL0FnZW50TWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgTWVtb3J5IH0gZnJvbSBcIi4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS5qc1wiO1xuaW1wb3J0IHsgTWVtb3J5TWFuYWdlciB9IGZyb20gXCIuLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBXZWJTU0VMb2dTaW5rIH0gZnJvbSBcIi4uL3dlYi9zaW5rcy9XZWJTU0VMb2dTaW5rLmpzXCI7XG5pbXBvcnQgeyBXZWJTU0VNZXRyaWNzU2luayB9IGZyb20gXCIuLi93ZWIvc2lua3MvV2ViU1NFTWV0cmljc1NpbmsuanNcIjtcbmltcG9ydCB7IEVuc2VtYmxlTWFuYWdlciB9IGZyb20gXCIuLi9lbGVtZW50cy9lbnNlbWJsZXMvRW5zZW1ibGVNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBQZXJzb25hRXhwb3J0ZXIsIFBlcnNvbmFJbXBvcnRlciB9IGZyb20gXCIuLi9wZXJzb25hL2V4cG9ydC1pbXBvcnQvaW5kZXguanNcIjtcbmltcG9ydCB7IFBlcnNvbmFNYW5hZ2VyIH0gZnJvbSBcIi4uL3BlcnNvbmEvUGVyc29uYU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IFBlcnNvbmFIYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXJzL1BlcnNvbmFIYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBFbGVtZW50Q1JVREhhbmRsZXIgfSBmcm9tIFwiLi4vaGFuZGxlcnMvRWxlbWVudENSVURIYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBDb2xsZWN0aW9uSGFuZGxlciB9IGZyb20gXCIuLi9oYW5kbGVycy9Db2xsZWN0aW9uSGFuZGxlci5qc1wiO1xuaW1wb3J0IHsgUG9ydGZvbGlvSGFuZGxlciB9IGZyb20gXCIuLi9oYW5kbGVycy9Qb3J0Zm9saW9IYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBQb3J0Zm9saW9QdWxsSGFuZGxlciB9IGZyb20gXCIuLi9oYW5kbGVycy9Qb3J0Zm9saW9QdWxsSGFuZGxlci5qc1wiO1xuaW1wb3J0IHsgR2l0SHViQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vaGFuZGxlcnMvR2l0SHViQXV0aEhhbmRsZXIuanNcIjtcbmltcG9ydCB7IERpc3BsYXlDb25maWdIYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXJzL0Rpc3BsYXlDb25maWdIYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBJZGVudGl0eUhhbmRsZXIgfSBmcm9tIFwiLi4vaGFuZGxlcnMvSWRlbnRpdHlIYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBDb25maWdIYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXJzL0NvbmZpZ0hhbmRsZXIuanNcIjtcbmltcG9ydCB7IFN5bmNIYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXJzL1N5bmNIYW5kbGVyVjIuanNcIjtcbmltcG9ydCB7IFRvb2xSZWdpc3RyeSB9IGZyb20gXCIuLi9oYW5kbGVycy9Ub29sUmVnaXN0cnkuanNcIjtcbmltcG9ydCB7IFNlcnZlclNldHVwIH0gZnJvbSBcIi4uL3NlcnZlci9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2VydmVyU3RhcnR1cCB9IGZyb20gXCIuLi9zZXJ2ZXIvc3RhcnR1cC5qc1wiO1xuaW1wb3J0IHsgUGF0aFZhbGlkYXRvciB9IGZyb20gXCIuLi9zZWN1cml0eS9wYXRoVmFsaWRhdG9yLmpzXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyLmpzXCI7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIgfSBmcm9tIFwiLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBVbmlmaWVkSW5kZXhNYW5hZ2VyIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9VbmlmaWVkSW5kZXhNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBQb3J0Zm9saW9JbmRleE1hbmFnZXIgfSBmcm9tIFwiLi4vcG9ydGZvbGlvL1BvcnRmb2xpb0luZGV4TWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgU3VibWl0VG9Qb3J0Zm9saW9Ub29sIH0gZnJvbSBcIi4uL3Rvb2xzL3BvcnRmb2xpby9zdWJtaXRUb1BvcnRmb2xpb1Rvb2wuanNcIjtcbmltcG9ydCB7IENvbmZpZ01hbmFnZXIgfSBmcm9tIFwiLi4vY29uZmlnL0NvbmZpZ01hbmFnZXIuanNcIjtcbmltcG9ydCB7IFBvcnRmb2xpb1JlcG9NYW5hZ2VyIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9Qb3J0Zm9saW9SZXBvTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgUG9ydGZvbGlvU3luY01hbmFnZXIgfSBmcm9tIFwiLi4vcG9ydGZvbGlvL1BvcnRmb2xpb1N5bmNNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBnZXRQb3J0Zm9saW9SZXBvc2l0b3J5TmFtZSB9IGZyb20gXCIuLi9jb25maWcvcG9ydGZvbGlvQ29uZmlnLmpzXCI7XG5pbXBvcnQgeyBHaXRIdWJQb3J0Zm9saW9JbmRleGVyIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9HaXRIdWJQb3J0Zm9saW9JbmRleGVyLmpzXCI7XG5pbXBvcnQgeyBJbmRleENvbmZpZ01hbmFnZXIgfSBmcm9tIFwiLi4vcG9ydGZvbGlvL2NvbmZpZy9JbmRleENvbmZpZy5qc1wiO1xuaW1wb3J0IHsgUG9ydGZvbGlvU3luY0NvbXBhcmVyIH0gZnJvbSBcIi4uL3N5bmMvUG9ydGZvbGlvU3luY0NvbXBhcmVyLmpzXCI7XG5pbXBvcnQgeyBQb3J0Zm9saW9Eb3dubG9hZGVyIH0gZnJvbSBcIi4uL3N5bmMvUG9ydGZvbGlvRG93bmxvYWRlci5qc1wiO1xuaW1wb3J0IHsgUGVyZm9ybWFuY2VNb25pdG9yIH0gZnJvbSBcIi4uL3V0aWxzL1BlcmZvcm1hbmNlTW9uaXRvci5qc1wiO1xuaW1wb3J0IHsgQnVpbGRJbmZvU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9CdWlsZEluZm9TZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvSW5pdGlhbGl6YXRpb25TZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBQZXJzb25hSW5kaWNhdG9yU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9QZXJzb25hSW5kaWNhdG9yU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFN0YXRlQ2hhbmdlTm90aWZpZXIgfSBmcm9tIFwiLi4vc2VydmljZXMvU3RhdGVDaGFuZ2VOb3RpZmllci5qc1wiO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvU2VyaWFsaXphdGlvblNlcnZpY2UuanNcIjtcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvRmlsZVdhdGNoU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSBcIi4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzXCI7XG5pbXBvcnQgeyBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvdmFsaWRhdGlvbi9UcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UuanNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblNlcnZpY2UuanNcIjtcbmltcG9ydCB7IEdpdEh1YlJhdGVMaW1pdGVyIH0gZnJvbSBcIi4uL3V0aWxzL0dpdEh1YlJhdGVMaW1pdGVyLmpzXCI7XG5pbXBvcnQgeyBBbnRocm9waWNUb0RvbGxob3VzZUNvbnZlcnRlciwgRG9sbGhvdXNlVG9BbnRocm9waWNDb252ZXJ0ZXIgfSBmcm9tIFwiLi4vY29udmVydGVycy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgRGFuZ2VyWm9uZUVuZm9yY2VyIH0gZnJvbSBcIi4uL3NlY3VyaXR5L0RhbmdlclpvbmVFbmZvcmNlci5qc1wiO1xuaW1wb3J0IHsgQWN0aXZhdGlvblN0b3JlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL0FjdGl2YXRpb25TdG9yZS5qc1wiO1xuaW1wb3J0IHsgVmVyaWZpY2F0aW9uU3RvcmUgfSBmcm9tIFwiQGRvbGxob3VzZW1jcC9zYWZldHlcIjtcbmltcG9ydCB7IFZlcmlmaWNhdGlvbk5vdGlmaWVyIH0gZnJvbSBcIi4uL3NlcnZpY2VzL1ZlcmlmaWNhdGlvbk5vdGlmaWVyLmpzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuRW5jcnlwdG9yIH0gZnJvbSBcIi4uL3NlY3VyaXR5L2VuY3J5cHRpb24vUGF0dGVybkVuY3J5cHRvci5qc1wiO1xuaW1wb3J0IHsgUGF0dGVybkRlY3J5cHRvciB9IGZyb20gXCIuLi9zZWN1cml0eS9lbmNyeXB0aW9uL1BhdHRlcm5EZWNyeXB0b3IuanNcIjtcbmltcG9ydCB7IENvbnRleHRUcmFja2VyIH0gZnJvbSBcIi4uL3NlY3VyaXR5L2VuY3J5cHRpb24vQ29udGV4dFRyYWNrZXIuanNcIjtcbmltcG9ydCB7IFBhdHRlcm5FeHRyYWN0b3IgfSBmcm9tIFwiLi4vc2VjdXJpdHkvdmFsaWRhdGlvbi9QYXR0ZXJuRXh0cmFjdG9yLmpzXCI7XG5pbXBvcnQgeyBCYWNrZ3JvdW5kVmFsaWRhdG9yIH0gZnJvbSBcIi4uL3NlY3VyaXR5L3ZhbGlkYXRpb24vQmFja2dyb3VuZFZhbGlkYXRvci5qc1wiO1xuaW1wb3J0IHsgU2VjdXJpdHlUZWxlbWV0cnkgfSBmcm9tIFwiLi4vc2VjdXJpdHkvdGVsZW1ldHJ5L1NlY3VyaXR5VGVsZW1ldHJ5LmpzXCI7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSBcIi4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbmFsVGVsZW1ldHJ5IH0gZnJvbSBcIi4uL3RlbGVtZXRyeS9PcGVyYXRpb25hbFRlbGVtZXRyeS5qc1wiO1xuaW1wb3J0IHsgU3RhcnR1cFRpbWVyIH0gZnJvbSBcIi4uL3RlbGVtZXRyeS9TdGFydHVwVGltZXIuanNcIjtcbmltcG9ydCB7IERlZmF1bHRFbmhhbmNlZEluZGV4SGVscGVycyB9IGZyb20gXCIuLi9wb3J0Zm9saW8vZW5oYW5jZWQtaW5kZXgvRW5oYW5jZWRJbmRleEhlbHBlcnMuanNcIjtcbmltcG9ydCB7IEVsZW1lbnREZWZpbml0aW9uQnVpbGRlciB9IGZyb20gXCIuLi9wb3J0Zm9saW8vZW5oYW5jZWQtaW5kZXgvRWxlbWVudERlZmluaXRpb25CdWlsZGVyLmpzXCI7XG5pbXBvcnQgeyBBY3Rpb25UcmlnZ2VyRXh0cmFjdG9yIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9lbmhhbmNlZC1pbmRleC9BY3Rpb25UcmlnZ2VyRXh0cmFjdG9yLmpzXCI7XG5pbXBvcnQgeyBUcmlnZ2VyTWV0cmljc1RyYWNrZXIgfSBmcm9tIFwiLi4vcG9ydGZvbGlvL2VuaGFuY2VkLWluZGV4L1RyaWdnZXJNZXRyaWNzVHJhY2tlci5qc1wiO1xuaW1wb3J0IHsgU2VtYW50aWNSZWxhdGlvbnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4uL3BvcnRmb2xpby9lbmhhbmNlZC1pbmRleC9TZW1hbnRpY1JlbGF0aW9uc2hpcFNlcnZpY2UuanNcIjtcbmltcG9ydCB7IEVsZW1lbnRFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi9ldmVudHMvRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tIFwiLi4vc2VjdXJpdHkvdG9rZW5NYW5hZ2VyLmpzXCI7XG5pbXBvcnQge1xuICBQYWdpbmF0aW9uU2VydmljZSxcbiAgRmlsdGVyU2VydmljZSxcbiAgU29ydFNlcnZpY2UsXG4gIEVsZW1lbnRRdWVyeVNlcnZpY2UsXG59IGZyb20gJy4uL3NlcnZpY2VzL3F1ZXJ5L2luZGV4LmpzJztcbmltcG9ydCB7IFJldGVudGlvblBvbGljeVNlcnZpY2UsIE1lbW9yeVJldGVudGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vc2VydmljZXMvUmV0ZW50aW9uUG9saWN5U2VydmljZS5qcyc7XG5pbXBvcnQgeyBQb2xpY3lFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvUG9saWN5RXhwb3J0U2VydmljZS5qcyc7XG5pbXBvcnQgeyBMb2dNYW5hZ2VyLCBidWlsZExvZ01hbmFnZXJDb25maWcgfSBmcm9tICcuLi9sb2dnaW5nL0xvZ01hbmFnZXIuanMnO1xuaW1wb3J0IHsgRmlsZUxvZ1NpbmsgfSBmcm9tICcuLi9sb2dnaW5nL3NpbmtzL0ZpbGVMb2dTaW5rLmpzJztcbmltcG9ydCB7IE1lbW9yeUxvZ1NpbmsgfSBmcm9tICcuLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnO1xuaW1wb3J0IHsgUGxhaW5UZXh0Rm9ybWF0dGVyIH0gZnJvbSAnLi4vbG9nZ2luZy9mb3JtYXR0ZXJzL1BsYWluVGV4dEZvcm1hdHRlci5qcyc7XG5pbXBvcnQgeyBKc29ubEZvcm1hdHRlciB9IGZyb20gJy4uL2xvZ2dpbmcvZm9ybWF0dGVycy9Kc29ubEZvcm1hdHRlci5qcyc7XG5pbXBvcnQgeyB3aXJlTG9nSG9va3MsIGdldFRyaWdnZXJNZXRyaWNzTG9nTGlzdGVuZXIgfSBmcm9tICcuLi9sb2dnaW5nL0xvZ0hvb2tzLmpzJztcbmltcG9ydCB7IE1ldHJpY3NNYW5hZ2VyIH0gZnJvbSAnLi4vbWV0cmljcy9NZXRyaWNzTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBNZW1vcnlNZXRyaWNzU2luayB9IGZyb20gJy4uL21ldHJpY3Mvc2lua3MvTWVtb3J5TWV0cmljc1NpbmsuanMnO1xuaW1wb3J0IHsgYnVpbGRNZXRyaWNzTWFuYWdlckNvbmZpZyB9IGZyb20gJy4uL21ldHJpY3MvdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgUGVyZm9ybWFuY2VNb25pdG9yQ29sbGVjdG9yLFxuICBMUlVDYWNoZUNvbGxlY3RvcixcbiAgU2VjdXJpdHlNb25pdG9yQ29sbGVjdG9yLFxuICBTZWN1cml0eVRlbGVtZXRyeUNvbGxlY3RvcixcbiAgRmlsZUxvY2tNYW5hZ2VyQ29sbGVjdG9yLFxuICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29sbGVjdG9yLFxuICBUcmlnZ2VyTWV0cmljc1RyYWNrZXJDb2xsZWN0b3IsXG4gIE9wZXJhdGlvbmFsVGVsZW1ldHJ5Q29sbGVjdG9yLFxuICBPcGVyYXRpb25NZXRyaWNzQ29sbGVjdG9yLFxuICBHYXRla2VlcGVyTWV0cmljc0NvbGxlY3Rvcixcbn0gZnJvbSAnLi4vbWV0cmljcy9jb2xsZWN0b3JzL2luZGV4LmpzJztcbmltcG9ydCB7IE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyIH0gZnJvbSAnLi4vbWV0cmljcy9PcGVyYXRpb25NZXRyaWNzVHJhY2tlci5qcyc7XG5pbXBvcnQgeyBHYXRla2VlcGVyTWV0cmljc1RyYWNrZXIgfSBmcm9tICcuLi9tZXRyaWNzL0dhdGVrZWVwZXJNZXRyaWNzVHJhY2tlci5qcyc7XG5cbi8vIFN0YXRlIGlzIG93bmVkIGJ5IFBlcnNvbmFNYW5hZ2VyIGFuZCBzZXJ2aWNlc1xuXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJCdW5kbGUge1xuICBwZXJzb25hSGFuZGxlcjogUGVyc29uYUhhbmRsZXI7XG4gIGVsZW1lbnRDcnVkSGFuZGxlcjogRWxlbWVudENSVURIYW5kbGVyO1xuICBjb2xsZWN0aW9uSGFuZGxlcjogQ29sbGVjdGlvbkhhbmRsZXI7XG4gIHBvcnRmb2xpb0hhbmRsZXI6IFBvcnRmb2xpb0hhbmRsZXI7XG4gIGdpdGh1YkF1dGhIYW5kbGVyOiBHaXRIdWJBdXRoSGFuZGxlcjtcbiAgZGlzcGxheUNvbmZpZ0hhbmRsZXI6IERpc3BsYXlDb25maWdIYW5kbGVyO1xuICBpZGVudGl0eUhhbmRsZXI6IElkZW50aXR5SGFuZGxlcjtcbiAgY29uZmlnSGFuZGxlcjogQ29uZmlnSGFuZGxlcjtcbiAgc3luY0hhbmRsZXI6IFN5bmNIYW5kbGVyO1xuICB0b29sUmVnaXN0cnk6IFRvb2xSZWdpc3RyeTtcbiAgZW5oYW5jZWRJbmRleEhhbmRsZXI6IEVuaGFuY2VkSW5kZXhIYW5kbGVyO1xuICBtY3BBcWxIYW5kbGVyOiBNQ1BBUUxIYW5kbGVyO1xufVxuXG4vKipcbiAqIFR5cGUtc2FmZSBzZXJ2aWNlIHJlY29yZCBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24gY29udGFpbmVyXG4gKlxuICogRklYOiBSZXBsYWNlZCAnYW55JyB0eXBlcyB3aXRoIHByb3BlciBnZW5lcmljcyB0byBlbnN1cmUgdHlwZSBzYWZldHlcbiAqIFByZXZpb3VzbHk6IFVzZWQgJ2FueScgd2hpY2ggYWxsb3dlZCB1bnNhZmUgY2FzdHMgYW5kIHJ1bnRpbWUgZXJyb3JzXG4gKiBOb3c6IFVzZXMgZ2VuZXJpYyBUIHdpdGggJ3Vua25vd24nIGZhbGxiYWNrIGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZ1xuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSBzZXJ2aWNlIHR5cGUgKGRlZmF1bHRzIHRvIHVua25vd24gZm9yIG1heGltdW0gc2FmZXR5KVxuICovXG5pbnRlcmZhY2UgU2VydmljZVJlY29yZDxUID0gdW5rbm93bj4ge1xuICBmYWN0b3J5OiAoKSA9PiBUO1xuICBpbnN0YW5jZTogVCB8IG51bGw7XG4gIHNpbmdsZXRvbjogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIERvbGxob3VzZUNvbnRhaW5lciB7XG4gIHByaXZhdGUgc2VydmljZXMgPSBuZXcgTWFwPHN0cmluZywgU2VydmljZVJlY29yZD4oKTtcbiAgcHJpdmF0ZSBwZXJzb25hc0Rpcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJc3N1ZSAjNzA2OiBTZXQgdG8gdHJ1ZSBvbmNlIGNvbXBsZXRlRGVmZXJyZWRTZXR1cCgpIHJlc29sdmVzLiAqL1xuICBwdWJsaWMgZGVmZXJyZWRTZXR1cENvbXBsZXRlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRklYOiBETUNQLVNFQy0wMDYgLSBBdWRpdCBESSBjb250YWluZXIgaW5pdGlhbGl6YXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0RvbGxob3VzZUNvbnRhaW5lci5jb25zdHJ1Y3RvcicsXG4gICAgICBkZXRhaWxzOiAnRGVwZW5kZW5jeSBpbmplY3Rpb24gY29udGFpbmVyIGluaXRpYWxpemluZydcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyU2VydmljZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHNlcnZpY2Ugd2l0aCB0aGUgREkgY29udGFpbmVyXG4gICAqXG4gICAqIEZJWDogQWRkZWQgZXhwbGljaXQgdHlwZSBwYXJhbWV0ZXIgZm9yIHR5cGUgc2FmZXR5XG4gICAqIFRoZSBmYWN0b3J5IGlzIHN0b3JlZCBhcyAoKSA9PiB1bmtub3duIGludGVybmFsbHkgdG8gYWxsb3cgaGV0ZXJvZ2VuZW91cyBzdG9yYWdlLFxuICAgKiBidXQgdGhlIHR5cGUgVCBpcyBwcmVzZXJ2ZWQgZm9yIHJlc29sdmUoKSBjYWxsc1xuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgc2VydmljZSB0eXBlXG4gICAqIEBwYXJhbSBuYW1lIFVuaXF1ZSBzZXJ2aWNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIGZhY3RvcnkgRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIHNlcnZpY2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zIChzaW5nbGV0b24gYmVoYXZpb3IpXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXI8VD4obmFtZTogc3RyaW5nLCBmYWN0b3J5OiAoKSA9PiBULCBvcHRpb25zOiB7IHNpbmdsZXRvbj86IGJvb2xlYW4gfSA9IHsgc2luZ2xldG9uOiB0cnVlIH0pOiB2b2lkIHtcbiAgICAvLyBGSVg6IERNQ1AtU0VDLTAwNiAtIEF1ZGl0IHNlcnZpY2UgcmVnaXN0cmF0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdEb2xsaG91c2VDb250YWluZXIucmVnaXN0ZXInLFxuICAgICAgZGV0YWlsczogYFNlcnZpY2UgcmVnaXN0ZXJlZDogJHtuYW1lfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YTogeyBzZXJ2aWNlTmFtZTogbmFtZSwgc2luZ2xldG9uOiBvcHRpb25zLnNpbmdsZXRvbiA/PyB0cnVlIH1cbiAgICB9KTtcbiAgICB0aGlzLnNlcnZpY2VzLnNldChuYW1lLCB7XG4gICAgICBmYWN0b3J5OiBmYWN0b3J5IGFzICgpID0+IHVua25vd24sXG4gICAgICBpbnN0YW5jZTogbnVsbCxcbiAgICAgIHNpbmdsZXRvbjogb3B0aW9ucy5zaW5nbGV0b24gPz8gdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBzZXJ2aWNlIGZyb20gdGhlIERJIGNvbnRhaW5lclxuICAgKlxuICAgKiBGSVg6IFR5cGUgc2FmZXR5IGltcHJvdmVkIHdpdGggZXhwbGljaXQgY2FzdGluZyBhbmQgdmFsaWRhdGlvblxuICAgKiBUaGUgJ2FzIFQnIGNhc3QgaXMgc2FmZSBiZWNhdXNlOlxuICAgKiAxLiBTZXJ2aWNlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHR5cGVkIGZhY3Rvcmllc1xuICAgKiAyLiBUaGUgc2VydmljZSBuYW1lIGFjdHMgYXMgYSB0eXBlIGRpc2NyaW1pbmF0b3JcbiAgICogMy4gSW5jb3JyZWN0IHVzYWdlIHdpbGwgYmUgY2F1Z2h0IGF0IHRoZSByZWdpc3RyYXRpb24gc2l0ZVxuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgZXhwZWN0ZWQgc2VydmljZSB0eXBlXG4gICAqIEBwYXJhbSBuYW1lIFNlcnZpY2UgaWRlbnRpZmllclxuICAgKiBAcmV0dXJucyBUaGUgc2VydmljZSBpbnN0YW5jZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlPFQ+KG5hbWU6IHN0cmluZyk6IFQge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzLmdldChuYW1lKTtcbiAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQXVkaXQgc2VydmljZSByZXNvbHV0aW9uIGZhaWx1cmVzXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfTE9BRF9GQUlMRUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0RvbGxob3VzZUNvbnRhaW5lci5yZXNvbHZlJyxcbiAgICAgICAgZGV0YWlsczogYFNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQ6ICR7bmFtZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBzZXJ2aWNlTmFtZTogbmFtZSB9XG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2VydmljZSBub3QgcmVnaXN0ZXJlZDogJHtuYW1lfWApO1xuICAgIH1cblxuICAgIGlmIChzZXJ2aWNlLnNpbmdsZXRvbikge1xuICAgICAgaWYgKCFzZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICAgIHNlcnZpY2UuaW5zdGFuY2UgPSBzZXJ2aWNlLmZhY3RvcnkoKTtcbiAgICAgICAgLy8gRklYOiBETUNQLVNFQy0wMDYgLSBBdWRpdCBzaW5nbGV0b24gaW5zdGFudGlhdGlvblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0RvbGxob3VzZUNvbnRhaW5lci5yZXNvbHZlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgU2luZ2xldG9uIGluc3RhbnRpYXRlZDogJHtuYW1lfWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgc2VydmljZU5hbWU6IG5hbWUgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXJ2aWNlLmluc3RhbmNlIGFzIFQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcnZpY2UuZmFjdG9yeSgpIGFzIFQ7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyU2VydmljZXMoKTogdm9pZCB7XG5cblxuICAgIC8vIElzc3VlICM3MDY6IFN0YXJ0dXAgdGltaW5nIGluc3RydW1lbnRhdGlvblxuICAgIHRoaXMucmVnaXN0ZXIoJ1N0YXJ0dXBUaW1lcicsICgpID0+IG5ldyBTdGFydHVwVGltZXIoKSk7XG5cbiAgICAvLyBDT1JFICYgQ0FDSElOR1xuICAgIHRoaXMucmVnaXN0ZXIoJ0NhY2hlTWVtb3J5QnVkZ2V0JywgKCkgPT4gbmV3IENhY2hlTWVtb3J5QnVkZ2V0KHtcbiAgICAgIGdsb2JhbExpbWl0Qnl0ZXM6IGdldFZhbGlkYXRlZEdsb2JhbENhY2hlTWVtb3J5Qnl0ZXMoKSxcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlcignQVBJQ2FjaGUnLCAoKSA9PiBuZXcgQVBJQ2FjaGUoKSk7XG4gICAgdGhpcy5yZWdpc3RlcignQ29sbGVjdGlvbkNhY2hlJywgKCkgPT4gbmV3IENvbGxlY3Rpb25DYWNoZSh0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpLCB1bmRlZmluZWQpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdSYXRlTGltaXRUcmFja2VyJywgKCkgPT4gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdGaWxlTG9ja01hbmFnZXInLCAoKSA9PiBuZXcgRmlsZUxvY2tNYW5hZ2VyKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScsICgpID0+IG5ldyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UodGhpcy5yZXNvbHZlKCdGaWxlTG9ja01hbmFnZXInKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0NvbmZpZ01hbmFnZXInLCAoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IENvbmZpZ01hbmFnZXIodGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSwgb3MpO1xuICAgIH0pO1xuICAgIC8vIElzc3VlICM1MTogR2VuZXJpYyByZXRlbnRpb24gcG9saWN5IHNlcnZpY2Ugd2l0aCBzdHJhdGVneSBwYXR0ZXJuXG4gICAgdGhpcy5yZWdpc3RlcignUmV0ZW50aW9uUG9saWN5U2VydmljZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlcnZpY2UgPSBuZXcgUmV0ZW50aW9uUG9saWN5U2VydmljZSh0aGlzLnJlc29sdmUoJ0NvbmZpZ01hbmFnZXInKSk7XG4gICAgICAvLyBSZWdpc3RlciBtZW1vcnkgcmV0ZW50aW9uIHN0cmF0ZWd5IChmaXJzdCBvZiBwb3RlbnRpYWxseSA1MCsgZWxlbWVudCB0eXBlcylcbiAgICAgIHNlcnZpY2UucmVnaXN0ZXJTdHJhdGVneShuZXcgTWVtb3J5UmV0ZW50aW9uU3RyYXRlZ3koKSk7XG4gICAgICByZXR1cm4gc2VydmljZTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdJbmRleENvbmZpZ01hbmFnZXInLCAoKSA9PiBuZXcgSW5kZXhDb25maWdNYW5hZ2VyKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0luZGljYXRvckNvbmZpZycsICgpID0+IGxvYWRJbmRpY2F0b3JDb25maWcoKSk7XG4gICAgdGhpcy5yZWdpc3RlcignU3RhdGVDaGFuZ2VOb3RpZmllcicsICgpID0+IG5ldyBTdGF0ZUNoYW5nZU5vdGlmaWVyKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0dpdEh1YlJhdGVMaW1pdGVyJywgKCkgPT4gbmV3IEdpdEh1YlJhdGVMaW1pdGVyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdUb2tlbk1hbmFnZXInKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0VsZW1lbnRFdmVudERpc3BhdGNoZXInLCAoKSA9PiBFbGVtZW50RXZlbnREaXNwYXRjaGVyLmdldFNoYXJlZERpc3BhdGNoZXIoKSk7XG4gICAgdGhpcy5yZWdpc3RlcignTUNQTG9nZ2VyJywgKCkgPT4gbG9nZ2VyKTtcblxuICAgIHRoaXMucmVnaXN0ZXIoJ1BlcnNvbmFJbXBvcnRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSB0aGlzLnJlc29sdmU8UG9ydGZvbGlvTWFuYWdlcj4oJ1BvcnRmb2xpb01hbmFnZXInKTtcbiAgICAgIGNvbnN0IHBlcnNvbmFzRGlyID0gcG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLlBFUlNPTkEpO1xuICAgICAgLy8gVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2sgdG8gYnJlYWsgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kuIFdlIHJlc29sdmUgUGVyc29uYU1hbmFnZXIgaW5zaWRlIHRoZSBwcm92aWRlciBmdW5jdGlvbi5cbiAgICAgIGNvbnN0IGN1cnJlbnRVc2VyUHJvdmlkZXIgPSAoKSA9PiB0aGlzLnJlc29sdmU8UGVyc29uYU1hbmFnZXI+KCdQZXJzb25hTWFuYWdlcicpLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcbiAgICAgIHJldHVybiBuZXcgUGVyc29uYUltcG9ydGVyKFxuICAgICAgICBwZXJzb25hc0RpcixcbiAgICAgICAgY3VycmVudFVzZXJQcm92aWRlcixcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gR0lUSFVCICYgQ09MTEVDVElPTlxuICAgIHRoaXMucmVnaXN0ZXIoJ0dpdEh1YkNsaWVudCcsICgpID0+IG5ldyBHaXRIdWJDbGllbnQoXG4gICAgICB0aGlzLnJlc29sdmUoJ0FQSUNhY2hlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1JhdGVMaW1pdFRyYWNrZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnVG9rZW5NYW5hZ2VyJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdHaXRIdWJBdXRoTWFuYWdlcicsICgpID0+IG5ldyBHaXRIdWJBdXRoTWFuYWdlcihcbiAgICAgIHRoaXMucmVzb2x2ZSgnQVBJQ2FjaGUnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ29uZmlnTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdUb2tlbk1hbmFnZXInKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0NvbGxlY3Rpb25JbmRleE1hbmFnZXInLCAoKSA9PiBuZXcgQ29sbGVjdGlvbkluZGV4TWFuYWdlcih7XG4gICAgICBmaWxlT3BlcmF0aW9uczogdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKVxuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdDb2xsZWN0aW9uQnJvd3NlcicsICgpID0+IG5ldyBDb2xsZWN0aW9uQnJvd3Nlcih0aGlzLnJlc29sdmUoJ0dpdEh1YkNsaWVudCcpLCB0aGlzLnJlc29sdmUoJ0NvbGxlY3Rpb25DYWNoZScpLCB0aGlzLnJlc29sdmUoJ0NvbGxlY3Rpb25JbmRleE1hbmFnZXInKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0NvbGxlY3Rpb25TZWFyY2gnLCAoKSA9PiBuZXcgQ29sbGVjdGlvblNlYXJjaChcbiAgICAgIHRoaXMucmVzb2x2ZSgnR2l0SHViQ2xpZW50JyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0NvbGxlY3Rpb25DYWNoZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdDb2xsZWN0aW9uSW5kZXhDYWNoZScpXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignUGVyc29uYURldGFpbHMnLCAoKSA9PiBuZXcgUGVyc29uYURldGFpbHModGhpcy5yZXNvbHZlKCdHaXRIdWJDbGllbnQnKSkpO1xuXG4gICAgLy8gUE9SVEZPTElPICYgTUFOQUdFUlNcbiAgICB0aGlzLnJlZ2lzdGVyKCdQb3J0Zm9saW9NYW5hZ2VyJywgKCkgPT4gbmV3IFBvcnRmb2xpb01hbmFnZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpLFxuICAgICAgdW5kZWZpbmVkXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignUGVyc29uYU1hbmFnZXInLCAoKSA9PiBuZXcgUGVyc29uYU1hbmFnZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnSW5kaWNhdG9yQ29uZmlnJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVMb2NrTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnVmFsaWRhdGlvblJlZ2lzdHJ5JyksXG4gICAgICB0aGlzLnJlc29sdmUoJ01ldGFkYXRhU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdQZXJzb25hSW1wb3J0ZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnU3RhdGVDaGFuZ2VOb3RpZmllcicpLFxuICAgICAge1xuICAgICAgICBldmVudERpc3BhdGNoZXI6IHRoaXMucmVzb2x2ZSgnRWxlbWVudEV2ZW50RGlzcGF0Y2hlcicpLFxuICAgICAgICBlbmFibGVGaWxlV2F0Y2hlcjogdHJ1ZSxcbiAgICAgICAgYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2U6IHRydWUsXG4gICAgICAgIGZpbGVXYXRjaFNlcnZpY2U6IHRoaXMucmVzb2x2ZSgnRmlsZVdhdGNoU2VydmljZScpLFxuICAgICAgICBtZW1vcnlCdWRnZXQ6IHRoaXMucmVzb2x2ZSgnQ2FjaGVNZW1vcnlCdWRnZXQnKSxcbiAgICAgICAgYmFja3VwU2VydmljZTogdGhpcy5yZXNvbHZlKCdCYWNrdXBTZXJ2aWNlJylcbiAgICAgIH1cbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdJbml0aWFsaXphdGlvblNlcnZpY2UnLCAoKSA9PiBuZXcgSW5pdGlhbGl6YXRpb25TZXJ2aWNlKFxuICAgICAgdGhpcy5yZXNvbHZlKCdQZXJzb25hTWFuYWdlcicpXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignUGVyc29uYUluZGljYXRvclNlcnZpY2UnLCAoKSA9PiBuZXcgUGVyc29uYUluZGljYXRvclNlcnZpY2UoXG4gICAgICB0aGlzLnJlc29sdmUoJ1BlcnNvbmFNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0luZGljYXRvckNvbmZpZycpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdTdGF0ZUNoYW5nZU5vdGlmaWVyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0VsZW1lbnRFdmVudERpc3BhdGNoZXInKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ01pZ3JhdGlvbk1hbmFnZXInLCAoKSA9PiBuZXcgTWlncmF0aW9uTWFuYWdlcih0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSwgdGhpcy5yZXNvbHZlKCdGaWxlTG9ja01hbmFnZXInKSwgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0VsZW1lbnRJbnN0YWxsZXInLCAoKSA9PiBuZXcgRWxlbWVudEluc3RhbGxlcih0aGlzLnJlc29sdmUoJ0dpdEh1YkNsaWVudCcpLCB7XG4gICAgICBwb3J0Zm9saW9NYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSxcbiAgICAgIHVuaWZpZWRJbmRleE1hbmFnZXI6IHRoaXMucmVzb2x2ZSgnVW5pZmllZEluZGV4TWFuYWdlcicpLFxuICAgICAgZmlsZU9wZXJhdGlvbnM6IHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJylcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlcignUG9ydGZvbGlvUmVwb01hbmFnZXInLCAoKSA9PiBuZXcgUG9ydGZvbGlvUmVwb01hbmFnZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ1Rva2VuTWFuYWdlcicpLFxuICAgICAgZ2V0UG9ydGZvbGlvUmVwb3NpdG9yeU5hbWUoKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXInLCAoKSA9PiBuZXcgR2l0SHViUG9ydGZvbGlvSW5kZXhlcihcbiAgICAgIHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvUmVwb01hbmFnZXInKVxuICAgICkpO1xuICAgIFxuICAgIC8vIFNFUlZJQ0VTXG4gICAgdGhpcy5yZWdpc3RlcignU2VyaWFsaXphdGlvblNlcnZpY2UnLCAoKSA9PiBuZXcgU2VyaWFsaXphdGlvblNlcnZpY2UoKSk7XG4gICAgdGhpcy5yZWdpc3RlcignTWV0YWRhdGFTZXJ2aWNlJywgKCkgPT4gbmV3IE1ldGFkYXRhU2VydmljZSgpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UnLCAoKSA9PiBuZXcgVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1ZhbGlkYXRpb25TZXJ2aWNlJywgKCkgPT4gbmV3IFZhbGlkYXRpb25TZXJ2aWNlKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0ZpbGVXYXRjaFNlcnZpY2UnLCAoKSA9PiBuZXcgRmlsZVdhdGNoU2VydmljZSgpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdWYWxpZGF0aW9uUmVnaXN0cnknLCAoKSA9PiBuZXcgVmFsaWRhdGlvblJlZ2lzdHJ5KFxuICAgICAgdGhpcy5yZXNvbHZlKCdWYWxpZGF0aW9uU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnTWV0YWRhdGFTZXJ2aWNlJylcbiAgICApKTtcblxuICAgIC8vIExPR0dJTkdcbiAgICB0aGlzLnJlZ2lzdGVyKCdMb2dNYW5hZ2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnID0gYnVpbGRMb2dNYW5hZ2VyQ29uZmlnKGVudik7XG4gICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IExvZ01hbmFnZXIoY29uZmlnKTtcblxuICAgICAgLy8gUGhhc2UgMjogRmlsZUxvZ1NpbmtcbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IGNvbmZpZy5sb2dGb3JtYXQgPT09ICdqc29ubCdcbiAgICAgICAgPyBuZXcgSnNvbmxGb3JtYXR0ZXIoKVxuICAgICAgICA6IG5ldyBQbGFpblRleHRGb3JtYXR0ZXIoKTtcbiAgICAgIGNvbnN0IGZpbGVTaW5rID0gbmV3IEZpbGVMb2dTaW5rKHtcbiAgICAgICAgbG9nRGlyOiBjb25maWcubG9nRGlyLFxuICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgIG1heEZpbGVTaXplOiBjb25maWcuZmlsZU1heFNpemUsXG4gICAgICAgIHJldGVudGlvbkRheXM6IGNvbmZpZy5yZXRlbnRpb25EYXlzLFxuICAgICAgICBzZWN1cml0eVJldGVudGlvbkRheXM6IGNvbmZpZy5zZWN1cml0eVJldGVudGlvbkRheXMsXG4gICAgICAgIG1heERpclNpemVCeXRlczogY29uZmlnLm1heERpclNpemVCeXRlcyxcbiAgICAgICAgbWF4RmlsZXNQZXJDYXRlZ29yeTogY29uZmlnLm1heEZpbGVzUGVyQ2F0ZWdvcnksXG4gICAgICB9KTtcbiAgICAgIG1hbmFnZXIucmVnaXN0ZXJTaW5rKGZpbGVTaW5rKTtcbiAgICAgIGZpbGVTaW5rLnN0YXJ0Q2xlYW51cFRpbWVyKCk7XG5cbiAgICAgIC8vIFBoYXNlIDM6IE1lbW9yeUxvZ1NpbmtcbiAgICAgIGNvbnN0IG1lbW9yeVNpbmsgPSBuZXcgTWVtb3J5TG9nU2luayh7XG4gICAgICAgIGFwcENhcGFjaXR5OiBjb25maWcubWVtb3J5QXBwQ2FwYWNpdHksXG4gICAgICAgIHNlY3VyaXR5Q2FwYWNpdHk6IGNvbmZpZy5tZW1vcnlTZWN1cml0eUNhcGFjaXR5LFxuICAgICAgICBwZXJmQ2FwYWNpdHk6IGNvbmZpZy5tZW1vcnlQZXJmQ2FwYWNpdHksXG4gICAgICAgIHRlbGVtZXRyeUNhcGFjaXR5OiBjb25maWcubWVtb3J5VGVsZW1ldHJ5Q2FwYWNpdHksXG4gICAgICB9KTtcbiAgICAgIG1hbmFnZXIucmVnaXN0ZXJTaW5rKG1lbW9yeVNpbmspO1xuXG4gICAgICB0aGlzLnJlZ2lzdGVyKCdNZW1vcnlMb2dTaW5rJywgKCkgPT4gbWVtb3J5U2luayk7XG5cbiAgICAgIC8vIFN0YXJ0dXAgbWFya2VyIOKAlCBmaXJzdCBlbnRyeSBpbiBldmVyeSBzZXJ2ZXIgc2Vzc2lvblxuICAgICAgbWFuYWdlci5sb2coe1xuICAgICAgICBpZDogbWFuYWdlci5nZW5lcmF0ZUlkKCksXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBjYXRlZ29yeTogJ2FwcGxpY2F0aW9uJyxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgc291cmNlOiAnRG9sbGhvdXNlTUNQJyxcbiAgICAgICAgbWVzc2FnZTogYERvbGxob3VzZU1DUCB2JHtWRVJTSU9OfSBzdGFydGluZ2AsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB2ZXJzaW9uOiBWRVJTSU9OLFxuICAgICAgICAgIGxvZ0xldmVsOiBjb25maWcubG9nTGV2ZWwsXG4gICAgICAgICAgbG9nRm9ybWF0OiBjb25maWcubG9nRm9ybWF0LFxuICAgICAgICAgIGNvbnNvbGU6IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEUgPyAnaHR0cDovL2RvbGxob3VzZS5sb2NhbGhvc3Q6MzkzOScgOiAnZGlzYWJsZWQnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBtYW5hZ2VyO1xuICAgIH0pO1xuXG4gICAgLy8gTUVUUklDUyBDT0xMRUNUSU9OXG4gICAgLy8gTWVtb3J5TWV0cmljc1NpbmsgaXMgcmVnaXN0ZXJlZCBzZXBhcmF0ZWx5IChub3QgYXMgYSBzaWRlIGVmZmVjdCBpbnNpZGVcbiAgICAvLyBNZXRyaWNzTWFuYWdlcidzIGZhY3RvcnkpIHNvIGl0J3MgYXZhaWxhYmxlIGluIHRoZSBjb250YWluZXIgcmVnYXJkbGVzc1xuICAgIC8vIG9mIE1ldHJpY3NNYW5hZ2VyIHJlc29sdXRpb24gb3JkZXIuXG4gICAgY29uc3QgbWV0cmljc0NvbmZpZyA9IGJ1aWxkTWV0cmljc01hbmFnZXJDb25maWcoZW52KTtcbiAgICBpZiAobWV0cmljc0NvbmZpZy5lbmFibGVkKSB7XG4gICAgICBjb25zdCBtZW1vcnlNZXRyaWNzU2luayA9IG5ldyBNZW1vcnlNZXRyaWNzU2luayhtZXRyaWNzQ29uZmlnLm1lbW9yeVNuYXBzaG90Q2FwYWNpdHkpO1xuICAgICAgdGhpcy5yZWdpc3RlcignTWVtb3J5TWV0cmljc1NpbmsnLCAoKSA9PiBtZW1vcnlNZXRyaWNzU2luayk7XG5cbiAgICAgIHRoaXMucmVnaXN0ZXIoJ01ldHJpY3NNYW5hZ2VyJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IE1ldHJpY3NNYW5hZ2VyKG1ldHJpY3NDb25maWcsIGxvZ2dlcik7XG4gICAgICAgIG1hbmFnZXIucmVnaXN0ZXJTaW5rKG1lbW9yeU1ldHJpY3NTaW5rKTtcbiAgICAgICAgcmV0dXJuIG1hbmFnZXI7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBURUxFTUVUUllcbiAgICB0aGlzLnJlZ2lzdGVyKCdPcGVyYXRpb25hbFRlbGVtZXRyeScsICgpID0+IG5ldyBPcGVyYXRpb25hbFRlbGVtZXRyeShcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJylcbiAgICApKTtcblxuICAgIC8vIEJBQ0tVUCBTRVJWSUNFIChJc3N1ZSAjNjU5OiBVbml2ZXJzYWwgYmFja3VwIGZvciBhbGwgZWxlbWVudCB0eXBlcylcbiAgICB0aGlzLnJlZ2lzdGVyKCdCYWNrdXBTZXJ2aWNlJywgKCkgPT4gbmV3IEJhY2t1cFNlcnZpY2UoXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpLFxuICAgICAge1xuICAgICAgICBiYWNrdXBSb290RGlyOiBwYXRoLmpvaW4odGhpcy5yZXNvbHZlPFBvcnRmb2xpb01hbmFnZXI+KCdQb3J0Zm9saW9NYW5hZ2VyJykuZ2V0QmFzZURpcigpLCAnLmJhY2t1cHMnKSxcbiAgICAgICAgbWF4QmFja3Vwc1BlckVsZW1lbnQ6IGdldFZhbGlkYXRlZE1heEJhY2t1cHNQZXJFbGVtZW50KCksXG4gICAgICAgIGVuYWJsZWQ6IFNUT1JBR0VfTEFZRVJfQ09ORklHLkJBQ0tVUFNfRU5BQkxFRCxcbiAgICAgIH1cbiAgICApKTtcblxuICAgIC8vIFBPTElDWSBFWFBPUlQgU0VSVklDRSAoSXNzdWUgIzc2MjogRXhwb3J0IHBvbGljaWVzIHRvIGJyaWRnZSlcbiAgICB0aGlzLnJlZ2lzdGVyKCdQb2xpY3lFeHBvcnRTZXJ2aWNlJywgKCkgPT4gbmV3IFBvbGljeUV4cG9ydFNlcnZpY2Uoe1xuICAgICAgZ2V0QWN0aXZlRWxlbWVudHNGb3JQb2xpY3k6IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5yZXNvbHZlPEVsZW1lbnRDUlVESGFuZGxlcj4oJ0VsZW1lbnRDUlVESGFuZGxlcicpO1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyLmdldEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5KCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldFNlcnZlclZlcnNpb246ICgpID0+IFBBQ0tBR0VfVkVSU0lPTixcbiAgICB9KSk7XG5cbiAgICAvLyBFTEVNRU5UIE1BTkFHRVJTXG4gICAgdGhpcy5yZWdpc3RlcignU2tpbGxNYW5hZ2VyJywgKCkgPT4gbmV3IFNraWxsTWFuYWdlcihcbiAgICAgIHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlTG9ja01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1ZhbGlkYXRpb25SZWdpc3RyeScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdTZXJpYWxpemF0aW9uU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdNZXRhZGF0YVNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZVdhdGNoU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdDYWNoZU1lbW9yeUJ1ZGdldCcpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdCYWNrdXBTZXJ2aWNlJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdUZW1wbGF0ZU1hbmFnZXInLCAoKSA9PiBuZXcgVGVtcGxhdGVNYW5hZ2VyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9NYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVMb2NrTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnVmFsaWRhdGlvblJlZ2lzdHJ5JyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1NlcmlhbGl6YXRpb25TZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ01ldGFkYXRhU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlV2F0Y2hTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0NhY2hlTWVtb3J5QnVkZ2V0JyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0JhY2t1cFNlcnZpY2UnKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1RlbXBsYXRlUmVuZGVyZXInLCAoKSA9PiBuZXcgVGVtcGxhdGVSZW5kZXJlcih0aGlzLnJlc29sdmUoJ1RlbXBsYXRlTWFuYWdlcicpKSk7XG4gICAgdGhpcy5yZWdpc3RlcignQWdlbnRNYW5hZ2VyJywgKCkgPT4gbmV3IEFnZW50TWFuYWdlcihcbiAgICAgIHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlTG9ja01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZTxQb3J0Zm9saW9NYW5hZ2VyPignUG9ydGZvbGlvTWFuYWdlcicpLmdldEJhc2VEaXIoKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1ZhbGlkYXRpb25SZWdpc3RyeScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdTZXJpYWxpemF0aW9uU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdNZXRhZGF0YVNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZVdhdGNoU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdDYWNoZU1lbW9yeUJ1ZGdldCcpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdCYWNrdXBTZXJ2aWNlJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdNZW1vcnlNYW5hZ2VyJywgKCkgPT4gbmV3IE1lbW9yeU1hbmFnZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZUxvY2tNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdWYWxpZGF0aW9uUmVnaXN0cnknKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnU2VyaWFsaXphdGlvblNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnTWV0YWRhdGFTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVXYXRjaFNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ2FjaGVNZW1vcnlCdWRnZXQnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQmFja3VwU2VydmljZScpXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignRW5zZW1ibGVNYW5hZ2VyJywgKCkgPT4gbmV3IEVuc2VtYmxlTWFuYWdlcihcbiAgICAgIHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlTG9ja01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1ZhbGlkYXRpb25SZWdpc3RyeScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdTZXJpYWxpemF0aW9uU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdNZXRhZGF0YVNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZVdhdGNoU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdDYWNoZU1lbW9yeUJ1ZGdldCcpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdCYWNrdXBTZXJ2aWNlJylcbiAgICApKTtcbiAgICBNZW1vcnkuY29uZmlndXJlTWVtb3J5TWFuYWdlclJlc29sdmVyKCgpID0+IHRoaXMucmVzb2x2ZSgnTWVtb3J5TWFuYWdlcicpKTtcbiAgICAvLyBJc3N1ZSAjNTE6IENvbmZpZ3VyZSByZXRlbnRpb24gcG9saWN5IHJlc29sdmVyIGZvciBNZW1vcnkgY2xhc3NcbiAgICBNZW1vcnkuY29uZmlndXJlUmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIoKCkgPT4gdGhpcy5yZXNvbHZlKCdSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlJykpO1xuICAgIC8vIElzc3VlICMxMTE6IENvbmZpZ3VyZSBlbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXIgZm9yIEFnZW50TWFuYWdlciAoZWxlbWVudC1hZ25vc3RpYyBhY3RpdmF0aW9uKVxuICAgIEFnZW50TWFuYWdlci5zZXRFbGVtZW50TWFuYWdlclJlc29sdmVyKChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiB0aGlzLnJlc29sdmUobWFuYWdlck5hbWUpKTtcbiAgICAvLyBJc3N1ZSAjNDAyOiBDb25maWd1cmUgRGFuZ2VyWm9uZUVuZm9yY2VyIHJlc29sdmVyIGZvciBBZ2VudE1hbmFnZXIgKGF1dG9ub215IGV2YWx1YXRpb24pXG4gICAgQWdlbnRNYW5hZ2VyLnNldERhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyKCgpID0+IHRoaXMucmVzb2x2ZSgnRGFuZ2VyWm9uZUVuZm9yY2VyJykpO1xuICAgIC8vIElzc3VlICMxNDI6IENvbmZpZ3VyZSBWZXJpZmljYXRpb25TdG9yZSByZXNvbHZlciBmb3IgQWdlbnRNYW5hZ2VyIChkYW5nZXIgem9uZSB2ZXJpZmljYXRpb24pXG4gICAgQWdlbnRNYW5hZ2VyLnNldFZlcmlmaWNhdGlvblN0b3JlUmVzb2x2ZXIoKCkgPT4gdGhpcy5yZXNvbHZlKCdWZXJpZmljYXRpb25TdG9yZScpKTtcblxuICAgIC8vIFFVRVJZIFNFUlZJQ0VTIChJc3N1ZSAjMzg6IFBhZ2luYXRpb24sIGZpbHRlcmluZywgc29ydGluZylcbiAgICAvLyBUaGVzZSBzZXJ2aWNlcyBhcmUgZWxlbWVudC1hZ25vc3RpYyBhbmQgY2FuIGJlIHVzZWQgd2l0aCBhbnkgZWxlbWVudCB0eXBlXG4gICAgdGhpcy5yZWdpc3RlcignUGFnaW5hdGlvblNlcnZpY2UnLCAoKSA9PiBuZXcgUGFnaW5hdGlvblNlcnZpY2UoKSk7XG4gICAgdGhpcy5yZWdpc3RlcignRmlsdGVyU2VydmljZScsICgpID0+IG5ldyBGaWx0ZXJTZXJ2aWNlKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1NvcnRTZXJ2aWNlJywgKCkgPT4gbmV3IFNvcnRTZXJ2aWNlKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ0VsZW1lbnRRdWVyeVNlcnZpY2UnLCAoKSA9PiBuZXcgRWxlbWVudFF1ZXJ5U2VydmljZShcbiAgICAgIHRoaXMucmVzb2x2ZTxQYWdpbmF0aW9uU2VydmljZT4oJ1BhZ2luYXRpb25TZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmU8RmlsdGVyU2VydmljZT4oJ0ZpbHRlclNlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZTxTb3J0U2VydmljZT4oJ1NvcnRTZXJ2aWNlJylcbiAgICApKTtcblxuICAgIC8vIENPTlZFUlRFUlNcbiAgICB0aGlzLnJlZ2lzdGVyKCdBbnRocm9waWNUb0RvbGxob3VzZUNvbnZlcnRlcicsICgpID0+IG5ldyBBbnRocm9waWNUb0RvbGxob3VzZUNvbnZlcnRlcigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdEb2xsaG91c2VUb0FudGhyb3BpY0NvbnZlcnRlcicsICgpID0+IG5ldyBEb2xsaG91c2VUb0FudGhyb3BpY0NvbnZlcnRlcigpKTtcblxuICAgIC8vIFNFQ1VSSVRZIFNFUlZJQ0VTXG4gICAgLy8gSXNzdWUgIzQwMjogRGFuZ2VyWm9uZUVuZm9yY2VyIGFzIERJLW1hbmFnZWQgc2luZ2xldG9uIChyZXBsYWNlcyBtb2R1bGUtbGV2ZWwgc2luZ2xldG9uKVxuICAgIHRoaXMucmVnaXN0ZXIoJ0RhbmdlclpvbmVFbmZvcmNlcicsICgpID0+IG5ldyBEYW5nZXJab25lRW5mb3JjZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpXG4gICAgKSk7XG4gICAgLy8gSXNzdWUgIzU5ODogQWN0aXZhdGlvblN0b3JlIGZvciBwZXItc2Vzc2lvbiBhY3RpdmF0aW9uIHBlcnNpc3RlbmNlXG4gICAgdGhpcy5yZWdpc3RlcignQWN0aXZhdGlvblN0b3JlJywgKCkgPT4gbmV3IEFjdGl2YXRpb25TdG9yZShcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJylcbiAgICApKTtcbiAgICAvLyBJc3N1ZSAjMTQyOiBWZXJpZmljYXRpb25TdG9yZSBmb3IgZGFuZ2VyIHpvbmUgY2hhbGxlbmdlIGNvZGVzIChzZXJ2ZXItc2lkZSlcbiAgICB0aGlzLnJlZ2lzdGVyKCdWZXJpZmljYXRpb25TdG9yZScsICgpID0+IG5ldyBWZXJpZmljYXRpb25TdG9yZSgpKTtcbiAgICAvLyBJc3N1ZSAjNTIyOiBOb24tYmxvY2tpbmcgT1MgZGlhbG9nIG5vdGlmaWVyIGZvciB2ZXJpZmljYXRpb24gY29kZXNcbiAgICB0aGlzLnJlZ2lzdGVyKCdWZXJpZmljYXRpb25Ob3RpZmllcicsICgpID0+IG5ldyBWZXJpZmljYXRpb25Ob3RpZmllcigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdUb2tlbk1hbmFnZXInLCAoKSA9PiBuZXcgVG9rZW5NYW5hZ2VyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1BhdHRlcm5FbmNyeXB0b3InLCAoKSA9PiBuZXcgUGF0dGVybkVuY3J5cHRvcigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdDb250ZXh0VHJhY2tlcicsICgpID0+IG5ldyBDb250ZXh0VHJhY2tlcigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdQYXR0ZXJuRGVjcnlwdG9yJywgKCkgPT4gbmV3IFBhdHRlcm5EZWNyeXB0b3IoXG4gICAgICB0aGlzLnJlc29sdmUoJ1BhdHRlcm5FbmNyeXB0b3InKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ29udGV4dFRyYWNrZXInKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1BhdHRlcm5FeHRyYWN0b3InLCAoKSA9PiBuZXcgUGF0dGVybkV4dHJhY3RvcihcbiAgICAgIHRoaXMucmVzb2x2ZSgnUGF0dGVybkVuY3J5cHRvcicpXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignQmFja2dyb3VuZFZhbGlkYXRvcicsICgpID0+IG5ldyBCYWNrZ3JvdW5kVmFsaWRhdG9yKFxuICAgICAgdGhpcy5yZXNvbHZlKCdQYXR0ZXJuRXh0cmFjdG9yJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ01lbW9yeU1hbmFnZXInKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1NlY3VyaXR5VGVsZW1ldHJ5JywgKCkgPT4gbmV3IFNlY3VyaXR5VGVsZW1ldHJ5KCkpO1xuICAgIENvbnRlbnRWYWxpZGF0b3IuY29uZmlndXJlVGVsZW1ldHJ5UmVzb2x2ZXIoKCkgPT4gdGhpcy5yZXNvbHZlKCdTZWN1cml0eVRlbGVtZXRyeScpKTtcblxuICAgIC8vIE5MUCAmIElOREVYSU5HXG4gICAgdGhpcy5yZWdpc3RlcignTkxQU2NvcmluZ01hbmFnZXInLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4Q29uZmlnTWFuYWdlciA9IHRoaXMucmVzb2x2ZTxJbmRleENvbmZpZ01hbmFnZXI+KCdJbmRleENvbmZpZ01hbmFnZXInKTtcbiAgICAgICAgY29uc3QgY29uZmlnID0gaW5kZXhDb25maWdNYW5hZ2VyLmdldENvbmZpZygpO1xuICAgICAgICByZXR1cm4gbmV3IE5MUFNjb3JpbmdNYW5hZ2VyKHtcbiAgICAgICAgICAgIGNhY2hlRXhwaXJ5OiBjb25maWcubmxwLmNhY2hlRXhwaXJ5TWludXRlcyAqIDYwICogMTAwMCxcbiAgICAgICAgICAgIG1pblRva2VuTGVuZ3RoOiBjb25maWcubmxwLm1pblRva2VuTGVuZ3RoLFxuICAgICAgICAgICAgZW50cm9weUJhbmRzOiBjb25maWcubmxwLmVudHJvcHlCYW5kcyxcbiAgICAgICAgICAgIGphY2NhcmRUaHJlc2hvbGRzOiBjb25maWcubmxwLmphY2NhcmRUaHJlc2hvbGRzXG4gICAgICAgIH0sIGluZGV4Q29uZmlnTWFuYWdlcik7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlcignVmVyYlRyaWdnZXJNYW5hZ2VyJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleENvbmZpZ01hbmFnZXIgPSB0aGlzLnJlc29sdmU8SW5kZXhDb25maWdNYW5hZ2VyPignSW5kZXhDb25maWdNYW5hZ2VyJyk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGluZGV4Q29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBWZXJiVHJpZ2dlck1hbmFnZXIoe1xuICAgICAgICAgICAgY29uZmlkZW5jZVRocmVzaG9sZDogY29uZmlnLnZlcmJzLmNvbmZpZGVuY2VUaHJlc2hvbGQsXG4gICAgICAgICAgICBtYXhFbGVtZW50c1BlclZlcmI6IGNvbmZpZy52ZXJicy5tYXhFbGVtZW50c1BlclZlcmIsXG4gICAgICAgICAgICBpbmNsdWRlU3lub255bXM6IGNvbmZpZy52ZXJicy5pbmNsdWRlU3lub255bXNcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlcignUmVsYXRpb25zaGlwTWFuYWdlcicsICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXhDb25maWdNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPEluZGV4Q29uZmlnTWFuYWdlcj4oJ0luZGV4Q29uZmlnTWFuYWdlcicpO1xuICAgICAgICBjb25zdCBjb25maWcgPSBpbmRleENvbmZpZ01hbmFnZXIuZ2V0Q29uZmlnKCk7XG4gICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25zaGlwTWFuYWdlcih7XG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBtaW5Db25maWRlbmNlOiBjb25maWcucGVyZm9ybWFuY2Uuc2ltaWxhcml0eVRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICBlbmFibGVBdXRvRGlzY292ZXJ5OiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5kZXhDb25maWdNYW5hZ2VyLFxuICAgICAgICAgICAgdmVyYlRyaWdnZXJNYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ1ZlcmJUcmlnZ2VyTWFuYWdlcicpLFxuICAgICAgICAgICAgbmxwU2NvcmluZzogdGhpcy5yZXNvbHZlKCdOTFBTY29yaW5nTWFuYWdlcicpLFxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdQb3J0Zm9saW9JbmRleE1hbmFnZXInLCAoKSA9PiBuZXcgUG9ydGZvbGlvSW5kZXhNYW5hZ2VyKHRoaXMucmVzb2x2ZSgnSW5kZXhDb25maWdNYW5hZ2VyJyksIHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvTWFuYWdlcicpLCB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpKSk7XG4gICAgdGhpcy5yZWdpc3RlcignRW5oYW5jZWRJbmRleEhlbHBlcnMnLCAoKSA9PiBuZXcgRGVmYXVsdEVuaGFuY2VkSW5kZXhIZWxwZXJzKFxuICAgICAgbmV3IEVsZW1lbnREZWZpbml0aW9uQnVpbGRlcigpLFxuICAgICAgbmV3IFNlbWFudGljUmVsYXRpb25zaGlwU2VydmljZSh7XG4gICAgICAgIG5scFNjb3Jpbmc6IHRoaXMucmVzb2x2ZSgnTkxQU2NvcmluZ01hbmFnZXInKSxcbiAgICAgICAgcmVsYXRpb25zaGlwTWFuYWdlcjogdGhpcy5yZXNvbHZlKCdSZWxhdGlvbnNoaXBNYW5hZ2VyJylcbiAgICAgIH0pLFxuICAgICAgKGNvbnRleHQpID0+IG5ldyBBY3Rpb25UcmlnZ2VyRXh0cmFjdG9yKGNvbnRleHQpLFxuICAgICAgKG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgdHJhY2tlciA9IG5ldyBUcmlnZ2VyTWV0cmljc1RyYWNrZXIob3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHJhY2tlci5hZGRMb2dMaXN0ZW5lcihnZXRUcmlnZ2VyTWV0cmljc0xvZ0xpc3RlbmVyKFxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlKCdMb2dNYW5hZ2VyJyksXG4gICAgICAgICAgICB0aGlzLnJlc29sdmUoJ0NvbnRleHRUcmFja2VyJylcbiAgICAgICAgICApKTtcbiAgICAgICAgfSBjYXRjaCB7IC8qIExvZ01hbmFnZXIgbm90IHlldCByZWdpc3RlcmVkICovIH1cbiAgICAgICAgcmV0dXJuIHRyYWNrZXI7XG4gICAgICB9XG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignRW5oYW5jZWRJbmRleE1hbmFnZXInLCAoKSA9PiBuZXcgRW5oYW5jZWRJbmRleE1hbmFnZXIoXG4gICAgICAgIHRoaXMucmVzb2x2ZSgnSW5kZXhDb25maWdNYW5hZ2VyJyksXG4gICAgICAgIHRoaXMucmVzb2x2ZSgnQ29uZmlnTWFuYWdlcicpLFxuICAgICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb0luZGV4TWFuYWdlcicpLFxuICAgICAgICB0aGlzLnJlc29sdmUoJ05MUFNjb3JpbmdNYW5hZ2VyJyksXG4gICAgICAgIHRoaXMucmVzb2x2ZSgnVmVyYlRyaWdnZXJNYW5hZ2VyJyksXG4gICAgICAgIHRoaXMucmVzb2x2ZSgnUmVsYXRpb25zaGlwTWFuYWdlcicpLFxuICAgICAgICB0aGlzLnJlc29sdmUoJ0VuaGFuY2VkSW5kZXhIZWxwZXJzJyksXG4gICAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJylcbiAgICApKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdDb2xsZWN0aW9uSW5kZXhDYWNoZScsICgpID0+IG5ldyBDb2xsZWN0aW9uSW5kZXhDYWNoZShcbiAgICAgICAgdGhpcy5yZXNvbHZlKCdHaXRIdWJDbGllbnQnKSxcbiAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgdGhpcy5yZXNvbHZlKCdQZXJmb3JtYW5jZU1vbml0b3InKSxcbiAgICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKVxuICAgICkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1VuaWZpZWRJbmRleE1hbmFnZXInLCAoKSA9PiBuZXcgVW5pZmllZEluZGV4TWFuYWdlcih7XG4gICAgICAgIHBvcnRmb2xpb0luZGV4TWFuYWdlcjogdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9JbmRleE1hbmFnZXInKSxcbiAgICAgICAgZ2l0aHViSW5kZXhlcjogdGhpcy5yZXNvbHZlKCdHaXRIdWJQb3J0Zm9saW9JbmRleGVyJyksXG4gICAgICAgIGNvbGxlY3Rpb25JbmRleENhY2hlOiB0aGlzLnJlc29sdmUoJ0NvbGxlY3Rpb25JbmRleENhY2hlJyksXG4gICAgICAgIGdpdGh1YkNsaWVudDogdGhpcy5yZXNvbHZlKCdHaXRIdWJDbGllbnQnKSxcbiAgICAgICAgYXBpQ2FjaGU6IHRoaXMucmVzb2x2ZSgnQVBJQ2FjaGUnKSxcbiAgICAgICAgcmF0ZUxpbWl0VHJhY2tlcjogdGhpcy5yZXNvbHZlKCdSYXRlTGltaXRUcmFja2VyJyksXG4gICAgICAgIHBlcmZvcm1hbmNlTW9uaXRvcjogdGhpcy5yZXNvbHZlKCdQZXJmb3JtYW5jZU1vbml0b3InKSxcbiAgICAgICAgZmlsZU9wZXJhdGlvbnM6IHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJylcbiAgICB9KSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCdQb3J0Zm9saW9TeW5jQ29tcGFyZXInLCAoKSA9PiBuZXcgUG9ydGZvbGlvU3luY0NvbXBhcmVyKCkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1BvcnRmb2xpb0Rvd25sb2FkZXInLCAoKSA9PiBuZXcgUG9ydGZvbGlvRG93bmxvYWRlcigpKTtcblxuICAgIC8vIFNZTkMgJiBUT09MU1xuICAgIHRoaXMucmVnaXN0ZXIoJ1BvcnRmb2xpb1B1bGxIYW5kbGVyJywgKCkgPT4gbmV3IFBvcnRmb2xpb1B1bGxIYW5kbGVyKHtcbiAgICAgICAgcG9ydGZvbGlvTWFuYWdlcjogdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9NYW5hZ2VyJyksXG4gICAgICAgIGluZGV4TWFuYWdlcjogdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9JbmRleE1hbmFnZXInKSxcbiAgICAgICAgZ2l0aHViSW5kZXhlcjogdGhpcy5yZXNvbHZlKCdHaXRIdWJQb3J0Zm9saW9JbmRleGVyJyksXG4gICAgICAgIHBvcnRmb2xpb1JlcG9NYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyJyksXG4gICAgICAgIHN5bmNDb21wYXJlcjogdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9TeW5jQ29tcGFyZXInKSxcbiAgICAgICAgZG93bmxvYWRlcjogdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9Eb3dubG9hZGVyJyksXG4gICAgICAgIGZpbGVPcGVyYXRpb25zOiB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpLFxuICAgICAgICB0b2tlbk1hbmFnZXI6IHRoaXMucmVzb2x2ZSgnVG9rZW5NYW5hZ2VyJyksXG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbCcsICgpID0+IG5ldyBTdWJtaXRUb1BvcnRmb2xpb1Rvb2wodGhpcy5yZXNvbHZlKCdBUElDYWNoZScpLCB7XG4gICAgICAgIGF1dGhNYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ0dpdEh1YkF1dGhNYW5hZ2VyJyksXG4gICAgICAgIHBvcnRmb2xpb01hbmFnZXI6IHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvTWFuYWdlcicpLFxuICAgICAgICBwb3J0Zm9saW9JbmRleE1hbmFnZXI6IHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyJyksXG4gICAgICAgIHBvcnRmb2xpb1JlcG9NYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyJyksXG4gICAgICAgIHJhdGVMaW1pdGVyOiB0aGlzLnJlc29sdmUoJ0dpdEh1YlJhdGVMaW1pdGVyJyksXG4gICAgICAgIGZpbGVPcGVyYXRpb25zOiB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpLFxuICAgICAgICB0b2tlbk1hbmFnZXI6IHRoaXMucmVzb2x2ZSgnVG9rZW5NYW5hZ2VyJylcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlcignUG9ydGZvbGlvU3luY01hbmFnZXInLCAoKSA9PiBuZXcgUG9ydGZvbGlvU3luY01hbmFnZXIoe1xuICAgICAgICBjb25maWdNYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ0NvbmZpZ01hbmFnZXInKSxcbiAgICAgICAgcG9ydGZvbGlvTWFuYWdlcjogdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9NYW5hZ2VyJyksXG4gICAgICAgIHBvcnRmb2xpb1JlcG9NYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyJyksXG4gICAgICAgIGluZGV4ZXI6IHRoaXMucmVzb2x2ZSgnR2l0SHViUG9ydGZvbGlvSW5kZXhlcicpLFxuICAgICAgICBmaWxlT3BlcmF0aW9uczogdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSxcbiAgICAgICAgdG9rZW5NYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ1Rva2VuTWFuYWdlcicpXG4gICAgfSkpO1xuXG4gICAgLy8gU0VSVkVSXG4gICAgdGhpcy5yZWdpc3RlcignU2VydmVyU2V0dXAnLCAoKSA9PiBuZXcgU2VydmVyU2V0dXAoXG4gICAgICB0aGlzLnJlc29sdmU8Q29udGV4dFRyYWNrZXI+KCdDb250ZXh0VHJhY2tlcicpXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignU2VydmVyU3RhcnR1cCcsICgpID0+IG5ldyBTZXJ2ZXJTdGFydHVwKFxuICAgICAgdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9NYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVMb2NrTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdDb25maWdNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ01pZ3JhdGlvbk1hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnTWVtb3J5TWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdPcGVyYXRpb25hbFRlbGVtZXRyeScpXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3RlcignQnVpbGRJbmZvU2VydmljZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlcnZpY2UgPSBuZXcgQnVpbGRJbmZvU2VydmljZSh0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpKTtcbiAgICAgIC8vIElzc3VlICM3MDY6IFdpcmUgc3RhcnR1cCBpbnN0cnVtZW50YXRpb25cbiAgICAgIHNlcnZpY2Uuc2V0U3RhcnR1cFRpbWVyKHRoaXMucmVzb2x2ZTxTdGFydHVwVGltZXI+KCdTdGFydHVwVGltZXInKSk7XG4gICAgICBzZXJ2aWNlLnNldERlZmVycmVkU2V0dXBDaGVja2VyKCgpID0+IHRoaXMuZGVmZXJyZWRTZXR1cENvbXBsZXRlKTtcbiAgICAgIHJldHVybiBzZXJ2aWNlO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXIoJ1BlcmZvcm1hbmNlTW9uaXRvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vbml0b3IgPSBuZXcgUGVyZm9ybWFuY2VNb25pdG9yKCk7XG4gICAgICBtb25pdG9yLnN0YXJ0TW9uaXRvcmluZygpO1xuICAgICAgcmV0dXJuIG1vbml0b3I7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCdPcGVyYXRpb25NZXRyaWNzVHJhY2tlcicsICgpID0+IG5ldyBPcGVyYXRpb25NZXRyaWNzVHJhY2tlcigpLCB7IHNpbmdsZXRvbjogdHJ1ZSB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdHYXRla2VlcGVyTWV0cmljc1RyYWNrZXInLCAoKSA9PiBuZXcgR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyKCksIHsgc2luZ2xldG9uOiB0cnVlIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFBlcnNvbmFzRGlyKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBlcnNvbmFzRGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgcG9ydGZvbGlvIOKAlCBjcml0aWNhbCBwYXRoIG9ubHkuXG4gICAqXG4gICAqIElzc3VlICM3MDY6IFNwbGl0IGZyb20gdGhlIG9yaWdpbmFsIG1vbm9saXRoaWMgcHJlcGFyZVBvcnRmb2xpbygpLlxuICAgKiBPbmx5IHdvcmsgcmVxdWlyZWQgYmVmb3JlIE1DUCBjb25uZWN0KCkgcnVucyBoZXJlLiBOb24tY3JpdGljYWwgd29ya1xuICAgKiAobWVtb3J5IGF1dG8tbG9hZCwgYWN0aXZhdGlvbiByZXN0b3JlLCBsb2cgaG9va3MsIGRhbmdlciB6b25lIGluaXQpXG4gICAqIGlzIGRlZmVycmVkIHRvIGNvbXBsZXRlRGVmZXJyZWRTZXR1cCgpIHdoaWNoIHJ1bnMgcG9zdC1jb25uZWN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZXBhcmVQb3J0Zm9saW8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSB0aGlzLnJlc29sdmU8U3RhcnR1cFRpbWVyPignU3RhcnR1cFRpbWVyJyk7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBtaWdyYXRpb25NYW5hZ2VyID0gdGhpcy5yZXNvbHZlPE1pZ3JhdGlvbk1hbmFnZXI+KCdNaWdyYXRpb25NYW5hZ2VyJyk7XG4gICAgY29uc3QgcG9ydGZvbGlvTWFuYWdlciA9IHRoaXMucmVzb2x2ZTxQb3J0Zm9saW9NYW5hZ2VyPignUG9ydGZvbGlvTWFuYWdlcicpO1xuXG4gICAgLy8gLS0tIGNvbmZpZ19jaGVja3MgKGNyaXRpY2FsKSAtLS1cbiAgICB0aW1lci5zdGFydFBoYXNlKCdjb25maWdfY2hlY2tzJywgdHJ1ZSk7XG5cbiAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT046IFJ1biBpbmRlcGVuZGVudCBjaGVja3MgaW4gcGFyYWxsZWwgKDQwLTYwJSBmYXN0ZXIgc3RhcnR1cClcbiAgICAvLyBVc2UgUHJvbWlzZS5hbGxTZXR0bGVkIHRvIGNhcHR1cmUgYWxsIGNoZWNrIHJlc3VsdHMsIGV2ZW4gaWYgb25lIGZhaWxzXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICBtaWdyYXRpb25NYW5hZ2VyLm5lZWRzTWlncmF0aW9uKCksXG4gICAgICBwb3J0Zm9saW9NYW5hZ2VyLmV4aXN0cygpXG4gICAgXSk7XG5cbiAgICAvLyBFeHRyYWN0IHJlc3VsdHMgYW5kIGNvbGxlY3QgYW55IGVycm9yc1xuICAgIGNvbnN0IGNoZWNrRXJyb3JzOiBBcnJheTx7IGNoZWNrOiBzdHJpbmc7IGVycm9yOiBFcnJvciB9PiA9IFtdO1xuXG4gICAgbGV0IG5lZWRzTWlncmF0aW9uID0gZmFsc2U7XG4gICAgaWYgKHJlc3VsdHNbMF0uc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgbmVlZHNNaWdyYXRpb24gPSByZXN1bHRzWzBdLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGVja0Vycm9ycy5wdXNoKHtcbiAgICAgICAgY2hlY2s6ICdtaWdyYXRpb24nLFxuICAgICAgICBlcnJvcjogcmVzdWx0c1swXS5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlc3VsdHNbMF0ucmVhc29uIDogbmV3IEVycm9yKFN0cmluZyhyZXN1bHRzWzBdLnJlYXNvbikpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgcG9ydGZvbGlvRXhpc3RzID0gZmFsc2U7XG4gICAgaWYgKHJlc3VsdHNbMV0uc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgcG9ydGZvbGlvRXhpc3RzID0gcmVzdWx0c1sxXS52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tFcnJvcnMucHVzaCh7XG4gICAgICAgIGNoZWNrOiAncG9ydGZvbGlvJyxcbiAgICAgICAgZXJyb3I6IHJlc3VsdHNbMV0ucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZXN1bHRzWzFdLnJlYXNvbiA6IG5ldyBFcnJvcihTdHJpbmcocmVzdWx0c1sxXS5yZWFzb24pKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgYm90aCBjaGVja3MgZmFpbGVkLCB0aHJvdyBjb21wcmVoZW5zaXZlIGVycm9yXG4gICAgaWYgKGNoZWNrRXJyb3JzLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IGNoZWNrRXJyb3JzLm1hcChlID0+IGAke2UuY2hlY2t9OiAke2UuZXJyb3IubWVzc2FnZX1gKS5qb2luKCc7ICcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQb3J0Zm9saW8gcHJlcGFyYXRpb24gZmFpbGVkIC0gYWxsIGNoZWNrcyBmYWlsZWQ6ICR7ZXJyb3JNZXNzYWdlc31gKTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IG9uZSBjaGVjayBmYWlsZWQsIGxvZyB3YXJuaW5nIGJ1dCBjb250aW51ZVxuICAgIGlmIChjaGVja0Vycm9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBQb3J0Zm9saW8gY2hlY2sgZmFpbGVkIGJ1dCBjb250aW51aW5nOiAke2NoZWNrRXJyb3JzWzBdLmNoZWNrfSAtICR7Y2hlY2tFcnJvcnNbMF0uZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICB0aW1lci5lbmRQaGFzZSgnY29uZmlnX2NoZWNrcycpO1xuXG4gICAgLy8gLS0tIG1pZ3JhdGlvbiAoY3JpdGljYWwsIGNvbmRpdGlvbmFsKSAtLS1cbiAgICBpZiAobmVlZHNNaWdyYXRpb24pIHtcbiAgICAgIHRpbWVyLnN0YXJ0UGhhc2UoJ21pZ3JhdGlvbicsIHRydWUpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJMZWdhY3kgcGVyc29uYXMgZGV0ZWN0ZWQuIFN0YXJ0aW5nIG1pZ3JhdGlvbi4uLlwiKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdGlvbk1hbmFnZXIubWlncmF0ZSh7IGJhY2t1cDogdHJ1ZSB9KTtcblxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdWNjZXNzZnVsbHkgbWlncmF0ZWQgJHtyZXN1bHQubWlncmF0ZWRDb3VudH0gcGVyc29uYXNgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5iYWNrZWRVcCAmJiByZXN1bHQuYmFja3VwUGF0aCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBCYWNrdXAgY3JlYXRlZCBhdDogJHtyZXN1bHQuYmFja3VwUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiTWlncmF0aW9uIGNvbXBsZXRlZCB3aXRoIGVycm9yczpcIik7XG4gICAgICAgIHJlc3VsdC5lcnJvcnMuZm9yRWFjaCgoZXJyKSA9PiBsb2dnZXIuZXJyb3IoYCAgLSAke2Vycn1gKSk7XG4gICAgICB9XG4gICAgICB0aW1lci5lbmRQaGFzZSgnbWlncmF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gLS0tIHBvcnRmb2xpb19pbml0IChjcml0aWNhbCwgY29uZGl0aW9uYWwpIC0tLVxuICAgIGlmICghcG9ydGZvbGlvRXhpc3RzKSB7XG4gICAgICB0aW1lci5zdGFydFBoYXNlKCdwb3J0Zm9saW9faW5pdCcsIHRydWUpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJDcmVhdGluZyBwb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZS4uLlwiKTtcbiAgICAgIGF3YWl0IHBvcnRmb2xpb01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgdGltZXIuZW5kUGhhc2UoJ3BvcnRmb2xpb19pbml0Jyk7XG4gICAgfVxuXG4gICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OOiBJbml0aWFsaXplIGNvbGxlY3Rpb24gY2FjaGUgaW4gYmFja2dyb3VuZCAobm9uLWJsb2NraW5nKVxuICAgIC8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIGNvbGxlY3Rpb24gY2FjaGUgaXMgbm90IGNyaXRpY2FsIGZvciBzdGFydHVwXG4gICAgdGhpcy5pbml0aWFsaXplQ29sbGVjdGlvbkNhY2hlKCkuY2F0Y2goZXJyID0+XG4gICAgICBsb2dnZXIud2FybignQmFja2dyb3VuZCBjb2xsZWN0aW9uIGNhY2hlIGluaXRpYWxpemF0aW9uIGZhaWxlZCAod2lsbCByZXRyeSBvbiBkZW1hbmQpJywgZXJyKVxuICAgICk7XG5cbiAgICB0aGlzLnBlcnNvbmFzRGlyID0gcG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLlBFUlNPTkEpO1xuXG4gICAgLy8gLS0tIGNvbmZpZ19tYW5hZ2VyIChjcml0aWNhbCkgLS0tXG4gICAgdGltZXIuc3RhcnRQaGFzZSgnY29uZmlnX21hbmFnZXInLCB0cnVlKTtcbiAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPENvbmZpZ01hbmFnZXI+KCdDb25maWdNYW5hZ2VyJyk7XG4gICAgYXdhaXQgY29uZmlnTWFuYWdlci5pbml0aWFsaXplKCk7XG4gICAgdGltZXIuZW5kUGhhc2UoJ2NvbmZpZ19tYW5hZ2VyJyk7XG5cbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgbG9nZ2VyLmluZm8oYFtTdGFydHVwXSBDcml0aWNhbCBwb3J0Zm9saW8gcGF0aCBjb21wbGV0ZWQgaW4gJHtlbGFwc2VkVGltZX1tcyAocGVyc29uYXMgZGlyZWN0b3J5OiAke3RoaXMucGVyc29uYXNEaXJ9KWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIG5vbi1jcml0aWNhbCBzZXR1cCBhZnRlciBNQ1AgY29ubmVjdCgpLlxuICAgKlxuICAgKiBJc3N1ZSAjNzA2OiBUaGVzZSBvcGVyYXRpb25zIHdlcmUgcHJldmlvdXNseSBpbiBwcmVwYXJlUG9ydGZvbGlvKCkgYnV0IGFyZVxuICAgKiBub24tZmF0YWwgYW5kIGNhbiBzYWZlbHkgcnVuIGFmdGVyIHRoZSBzZXJ2ZXIgaXMgYWNjZXB0aW5nIGNvbm5lY3Rpb25zLlxuICAgKiBUaGlzIHNocmlua3MgdGhlIGNyaXRpY2FsIHBhdGggYnkgMTAwMC0zNzAwbXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29tcGxldGVEZWZlcnJlZFNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gdGhpcy5yZXNvbHZlPFN0YXJ0dXBUaW1lcj4oJ1N0YXJ0dXBUaW1lcicpO1xuXG4gICAgLy8gSXNzdWUgIzcwNjogVGVzdCBob29rIOKAlCBpbmplY3QgYXJ0aWZpY2lhbCBkZWxheSB0byBzaW11bGF0ZSBzbG93IGRlZmVycmVkIHNldHVwLlxuICAgIC8vIE9ubHkgYWN0aXZlIHdoZW4gRE9MTEhPVVNFX1RFU1RfREVGRVJSRURfREVMQVlfTVMgaXMgc2V0IChpbnRlZ3JhdGlvbiB0ZXN0cykuXG4gICAgY29uc3QgdGVzdERlbGF5ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1RFU1RfREVGRVJSRURfREVMQVlfTVMgfHwgJzAnLCAxMCk7XG4gICAgaWYgKHRlc3REZWxheSA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBbU3RhcnR1cF0gVGVzdCBkZWxheSBpbmplY3RlZDogJHt0ZXN0RGVsYXl9bXNgKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0ZXN0RGVsYXkpKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmRlZmVycmVkTWVtb3J5QXV0b2xvYWQodGltZXIpO1xuICAgIGF3YWl0IHRoaXMuZGVmZXJyZWRBY3RpdmF0aW9uUmVzdG9yZSh0aW1lcik7XG4gICAgYXdhaXQgdGhpcy5kZWZlcnJlZFBvbGljeUV4cG9ydCgpO1xuICAgIGF3YWl0IHRoaXMuZGVmZXJyZWRMb2dIb29rcyh0aW1lcik7XG4gICAgYXdhaXQgdGhpcy5kZWZlcnJlZE1ldHJpY3NDb2xsZWN0b3JzKHRpbWVyKTtcbiAgICBhd2FpdCB0aGlzLmRlZmVycmVkV2ViQ29uc29sZSh0aW1lcik7XG4gICAgYXdhaXQgdGhpcy5kZWZlcnJlZERhbmdlclpvbmVJbml0KHRpbWVyKTtcbiAgICBhd2FpdCB0aGlzLmRlZmVycmVkUGF0dGVybkVuY3J5cHRpb24odGltZXIpO1xuICAgIGF3YWl0IHRoaXMuZGVmZXJyZWRCYWNrZ3JvdW5kVmFsaWRhdG9yKHRpbWVyKTtcblxuICAgIHRoaXMuZGVmZXJyZWRTZXR1cENvbXBsZXRlID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJlcG9ydCA9IHRpbWVyLmdldFJlcG9ydCgpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYFtTdGFydHVwXSBEZWZlcnJlZCBzZXR1cCBjb21wbGV0ZWQgaW4gJHtyZXBvcnQuZGVmZXJyZWRNc31tcyBgICtcbiAgICAgIGAodG90YWwgc3RhcnR1cDogJHtyZXBvcnQudG90YWxNc31tcywgY3JpdGljYWw6ICR7cmVwb3J0LmNyaXRpY2FsUGF0aE1zfW1zKWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWZlcnJlZE1lbW9yeUF1dG9sb2FkKHRpbWVyOiBTdGFydHVwVGltZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aW1lci5zdGFydFBoYXNlKCdtZW1vcnlfYXV0b2xvYWQnLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSB0aGlzLnJlc29sdmU8Q29uZmlnTWFuYWdlcj4oJ0NvbmZpZ01hbmFnZXInKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ01hbmFnZXIuZ2V0Q29uZmlnKCk7XG5cbiAgICAgIGlmIChjb25maWcuYXV0b0xvYWQuZW5hYmxlZCkge1xuICAgICAgICBjb25zdCBtZW1vcnlNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPE1lbW9yeU1hbmFnZXI+KCdNZW1vcnlNYW5hZ2VyJyk7XG4gICAgICAgIGNvbnN0IGF1dG9Mb2FkUmVzdWx0ID0gYXdhaXQgbWVtb3J5TWFuYWdlci5sb2FkQW5kQWN0aXZhdGVBdXRvTG9hZE1lbW9yaWVzKCk7XG5cbiAgICAgICAgaWYgKGF1dG9Mb2FkUmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgW0NvbnRhaW5lcl0gQXV0by1sb2FkIGNvbXBsZXRlZCB3aXRoICR7YXV0b0xvYWRSZXN1bHQuZXJyb3JzLmxlbmd0aH0gZXJyb3Iocyk6YCxcbiAgICAgICAgICAgIGF1dG9Mb2FkUmVzdWx0LmVycm9yc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgW0NvbnRhaW5lcl0gQXV0by1sb2FkZWQgJHthdXRvTG9hZFJlc3VsdC5sb2FkZWR9IG1lbW9yaWVzIGAgK1xuICAgICAgICAgIGAofiR7YXV0b0xvYWRSZXN1bHQudG90YWxUb2tlbnN9IHRva2VucyksICR7YXV0b0xvYWRSZXN1bHQuc2tpcHBlZH0gc2tpcHBlZGBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW0NvbnRhaW5lcl0gQXV0by1sb2FkIG1lbW9yaWVzIGRpc2FibGVkIGluIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbQ29udGFpbmVyXSBNZW1vcnkgYXV0by1sb2FkIGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICAgIHRpbWVyLmVuZFBoYXNlKCdtZW1vcnlfYXV0b2xvYWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVmZXJyZWRBY3RpdmF0aW9uUmVzdG9yZSh0aW1lcjogU3RhcnR1cFRpbWVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGltZXIuc3RhcnRQaGFzZSgnYWN0aXZhdGlvbl9yZXN0b3JlJywgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhY3RpdmF0aW9uU3RvcmUgPSB0aGlzLnJlc29sdmU8QWN0aXZhdGlvblN0b3JlPignQWN0aXZhdGlvblN0b3JlJyk7XG4gICAgICBhd2FpdCBhY3RpdmF0aW9uU3RvcmUuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICBpZiAoYWN0aXZhdGlvblN0b3JlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZUFjdGl2YXRpb25zKGFjdGl2YXRpb25TdG9yZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdbQ29udGFpbmVyXSBBY3RpdmF0aW9uIHN0YXRlIHJlc3RvcmF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICAgIHRpbWVyLmVuZFBoYXNlKCdhY3RpdmF0aW9uX3Jlc3RvcmUnKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVmZXJyZWRQb2xpY3lFeHBvcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBvbGljeUV4cG9ydFNlcnZpY2UgPSB0aGlzLnJlc29sdmU8UG9saWN5RXhwb3J0U2VydmljZT4oJ1BvbGljeUV4cG9ydFNlcnZpY2UnKTtcbiAgICAgIGF3YWl0IHBvbGljeUV4cG9ydFNlcnZpY2UuZXhwb3J0UG9saWNpZXMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbQ29udGFpbmVyXSBQb2xpY3kgZXhwb3J0IHNraXBwZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVmZXJyZWRMb2dIb29rcyh0aW1lcjogU3RhcnR1cFRpbWVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGltZXIuc3RhcnRQaGFzZSgnbG9nX2hvb2tzJywgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb2dNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPExvZ01hbmFnZXI+KCdMb2dNYW5hZ2VyJyk7XG4gICAgICBjb25zdCBsb2dDbGVhbnVwcyA9IHdpcmVMb2dIb29rcyhsb2dNYW5hZ2VyLCB0aGlzKTtcbiAgICAgIHRoaXMucmVnaXN0ZXIoJ19sb2dIb29rQ2xlYW51cHMnLCAoKSA9PiBsb2dDbGVhbnVwcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdbQ29udGFpbmVyXSBGYWlsZWQgdG8gd2lyZSBsb2cgaG9va3M6JywgZXJyb3IpO1xuICAgIH1cbiAgICB0aW1lci5lbmRQaGFzZSgnbG9nX2hvb2tzJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRlZmVycmVkTWV0cmljc0NvbGxlY3RvcnModGltZXI6IFN0YXJ0dXBUaW1lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRpbWVyLnN0YXJ0UGhhc2UoJ21ldHJpY3NfY29sbGVjdG9ycycsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0cmljc01hbmFnZXIgPSB0aGlzLnJlc29sdmU8TWV0cmljc01hbmFnZXI+KCdNZXRyaWNzTWFuYWdlcicpO1xuICAgICAgdGhpcy53aXJlTWV0cmljc0NvbGxlY3RvcnMobWV0cmljc01hbmFnZXIpO1xuICAgICAgbWV0cmljc01hbmFnZXIuc3RhcnQoKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdbQ29udGFpbmVyXSBNZXRyaWNzIGNvbGxlY3Rpb24gc3RhcnRlZCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignW0NvbnRhaW5lcl0gTWV0cmljcyB3aXJpbmcgc2tpcHBlZDonLCBlcnJvcik7XG4gICAgfVxuICAgIHRpbWVyLmVuZFBoYXNlKCdtZXRyaWNzX2NvbGxlY3RvcnMnKTtcbiAgfVxuXG4gIC8qKiBUcnkgdG8gcmVzb2x2ZSBhIHNlcnZpY2UsIHJldHVybmluZyB1bmRlZmluZWQgaWYgbm90IHJlZ2lzdGVyZWQgKi9cbiAgcHJpdmF0ZSB0cnlSZXNvbHZlPFQ+KG5hbWU6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7IHJldHVybiB0aGlzLnJlc29sdmU8VD4obmFtZSk7IH0gY2F0Y2ggeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIH1cblxuICAvKiogV2lyZSBTU0UgYnJvYWRjYXN0IHNpbmtzIGZvciB0aGUgd2ViIGNvbnNvbGUgKi9cbiAgcHJpdmF0ZSB3aXJlU1NFQnJvYWRjYXN0cyhcbiAgICB3ZWJSZXN1bHQ6IGltcG9ydCgnLi4vd2ViL3NlcnZlci5qcycpLldlYlNlcnZlclJlc3VsdCxcbiAgICBtZXRyaWNzU2luazogTWVtb3J5TWV0cmljc1NpbmsgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIGlmICh3ZWJSZXN1bHQubG9nQnJvYWRjYXN0KSB7XG4gICAgICBjb25zdCBsb2dNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPExvZ01hbmFnZXI+KCdMb2dNYW5hZ2VyJyk7XG4gICAgICBsb2dNYW5hZ2VyLnJlZ2lzdGVyU2luayhuZXcgV2ViU1NFTG9nU2luayh3ZWJSZXN1bHQubG9nQnJvYWRjYXN0KSk7XG4gICAgfVxuICAgIGlmICh3ZWJSZXN1bHQubWV0cmljc09uU25hcHNob3QgJiYgbWV0cmljc1NpbmspIHtcbiAgICAgIGNvbnN0IG1ldHJpY3NNYW5hZ2VyID0gdGhpcy50cnlSZXNvbHZlPE1ldHJpY3NNYW5hZ2VyPignTWV0cmljc01hbmFnZXInKTtcbiAgICAgIGlmIChtZXRyaWNzTWFuYWdlcikge1xuICAgICAgICBtZXRyaWNzTWFuYWdlci5yZWdpc3RlclNpbmsobmV3IFdlYlNTRU1ldHJpY3NTaW5rKHdlYlJlc3VsdC5tZXRyaWNzT25TbmFwc2hvdCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVmZXJyZWRXZWJDb25zb2xlKHRpbWVyOiBTdGFydHVwVGltZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aW1lci5zdGFydFBoYXNlKCd3ZWJfY29uc29sZScsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgaWYgKCFlbnYuRE9MTEhPVVNFX1dFQl9DT05TT0xFKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGFjdGl2YXRpb25TdG9yZSA9IHRoaXMucmVzb2x2ZTxBY3RpdmF0aW9uU3RvcmU+KCdBY3RpdmF0aW9uU3RvcmUnKTtcbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGFjdGl2YXRpb25TdG9yZS5nZXRTZXNzaW9uSWQoKTtcbiAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSB0aGlzLnJlc29sdmU8UG9ydGZvbGlvTWFuYWdlcj4oJ1BvcnRmb2xpb01hbmFnZXInKTtcbiAgICAgIGNvbnN0IG1lbW9yeVNpbmsgPSB0aGlzLnJlc29sdmU8TWVtb3J5TG9nU2luaz4oJ01lbW9yeUxvZ1NpbmsnKTtcbiAgICAgIGNvbnN0IG1ldHJpY3NTaW5rID0gdGhpcy50cnlSZXNvbHZlPE1lbW9yeU1ldHJpY3NTaW5rPignTWVtb3J5TWV0cmljc1NpbmsnKTtcbiAgICAgIGNvbnN0IG1jcEFxbEhhbmRsZXIgPSB0aGlzLnRyeVJlc29sdmU8TUNQQVFMSGFuZGxlcj4oJ21jcEFxbEhhbmRsZXInKTtcbiAgICAgIGNvbnN0IGxvZ01hbmFnZXIgPSB0aGlzLnJlc29sdmU8TG9nTWFuYWdlcj4oJ0xvZ01hbmFnZXInKTtcblxuICAgICAgY29uc3QgeyBzdGFydFVuaWZpZWRDb25zb2xlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3dlYi9jb25zb2xlL1VuaWZpZWRDb25zb2xlLmpzJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGFydFVuaWZpZWRDb25zb2xlKHtcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBwb3J0Zm9saW9EaXI6IHBvcnRmb2xpb01hbmFnZXIuZ2V0QmFzZURpcigpLFxuICAgICAgICBtZW1vcnlTaW5rLFxuICAgICAgICBtZXRyaWNzU2luayxcbiAgICAgICAgbWNwQXFsSGFuZGxlcixcbiAgICAgICAgcmVnaXN0ZXJMb2dTaW5rOiAoc2luaykgPT4gbG9nTWFuYWdlci5yZWdpc3RlclNpbmsoc2luayksXG4gICAgICAgIHdpcmVTU0VCcm9hZGNhc3RzOiAod2ViUmVzdWx0LCBtU2luaykgPT4gdGhpcy53aXJlU1NFQnJvYWRjYXN0cyh3ZWJSZXN1bHQsIG1TaW5rKSxcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuaW5mbyhgW0NvbnRhaW5lcl0gV2ViIGNvbnNvbGUgc3RhcnRlZCBhcyAke3Jlc3VsdC5yb2xlfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignW0NvbnRhaW5lcl0gV2ViIGNvbnNvbGUgc3RhcnR1cCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgICB0aW1lci5lbmRQaGFzZSgnd2ViX2NvbnNvbGUnKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVmZXJyZWREYW5nZXJab25lSW5pdCh0aW1lcjogU3RhcnR1cFRpbWVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGltZXIuc3RhcnRQaGFzZSgnZGFuZ2VyX3pvbmVfaW5pdCcsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGFuZ2VyWm9uZUVuZm9yY2VyID0gdGhpcy5yZXNvbHZlPERhbmdlclpvbmVFbmZvcmNlcj4oJ0RhbmdlclpvbmVFbmZvcmNlcicpO1xuICAgICAgYXdhaXQgZGFuZ2VyWm9uZUVuZm9yY2VyLmluaXRpYWxpemUoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1tDb250YWluZXJdIERhbmdlclpvbmVFbmZvcmNlciBpbml0aWFsaXphdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgICB0aW1lci5lbmRQaGFzZSgnZGFuZ2VyX3pvbmVfaW5pdCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWZlcnJlZFBhdHRlcm5FbmNyeXB0aW9uKHRpbWVyOiBTdGFydHVwVGltZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aW1lci5zdGFydFBoYXNlKCdwYXR0ZXJuX2VuY3J5cHRpb24nLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhdHRlcm5FbmNyeXB0b3IgPSB0aGlzLnJlc29sdmUoJ1BhdHRlcm5FbmNyeXB0b3InKSBhcyBQYXR0ZXJuRW5jcnlwdG9yO1xuICAgICAgYXdhaXQgcGF0dGVybkVuY3J5cHRvci5pbml0aWFsaXplKCk7XG4gICAgICBsb2dnZXIuaW5mbyhcIlBhdHRlcm4gZW5jcnlwdGlvbiBpbml0aWFsaXplZFwiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1tDb250YWluZXJdIFBhdHRlcm4gZW5jcnlwdGlvbiBpbml0aWFsaXphdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgICB0aW1lci5lbmRQaGFzZSgncGF0dGVybl9lbmNyeXB0aW9uJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRlZmVycmVkQmFja2dyb3VuZFZhbGlkYXRvcih0aW1lcjogU3RhcnR1cFRpbWVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGltZXIuc3RhcnRQaGFzZSgnYmFja2dyb3VuZF92YWxpZGF0b3InLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhY2tncm91bmRWYWxpZGF0b3IgPSB0aGlzLnJlc29sdmUoJ0JhY2tncm91bmRWYWxpZGF0b3InKSBhcyBhbnk7XG4gICAgICBiYWNrZ3JvdW5kVmFsaWRhdG9yLnN0YXJ0KCk7XG4gICAgICBsb2dnZXIuaW5mbyhcIkJhY2tncm91bmQgdmFsaWRhdG9yIHN0YXJ0ZWQgZm9yIG1lbW9yeSBzZWN1cml0eVwiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1tDb250YWluZXJdIEJhY2tncm91bmQgdmFsaWRhdG9yIHN0YXJ0IGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICAgIHRpbWVyLmVuZFBoYXNlKCdiYWNrZ3JvdW5kX3ZhbGlkYXRvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmUgcGVyLXNlc3Npb24gYWN0aXZhdGlvbiBzdGF0ZSBmcm9tIHRoZSBBY3RpdmF0aW9uU3RvcmUuXG4gICAqIENhbGxlZCBkdXJpbmcgcHJlcGFyZVBvcnRmb2xpbygpIGFmdGVyIGF1dG8tbG9hZCBtZW1vcmllcy5cbiAgICpcbiAgICogSXNzdWUgIzU5ODogRWFjaCBlbGVtZW50IHR5cGUgaXMgcmVzdG9yZWQgaW5kZXBlbmRlbnRseS5cbiAgICogTWlzc2luZyBlbGVtZW50cyAoZGVsZXRlZCBzaW5jZSBsYXN0IHNlc3Npb24pIGFyZSBza2lwcGVkIGFuZCBwcnVuZWQuXG4gICAqIEF1dG8tbG9hZGVkIG1lbW9yaWVzIGFyZSBkZWR1cGxpY2F0ZWQgKG5vdCBhY3RpdmF0ZWQgdHdpY2UpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXN0b3JlQWN0aXZhdGlvbnMoc3RvcmU6IEFjdGl2YXRpb25TdG9yZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBlcnNvbmFNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPFBlcnNvbmFNYW5hZ2VyPignUGVyc29uYU1hbmFnZXInKTtcbiAgICBjb25zdCBza2lsbE1hbmFnZXIgPSB0aGlzLnJlc29sdmU8U2tpbGxNYW5hZ2VyPignU2tpbGxNYW5hZ2VyJyk7XG4gICAgY29uc3QgYWdlbnRNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPEFnZW50TWFuYWdlcj4oJ0FnZW50TWFuYWdlcicpO1xuICAgIGNvbnN0IG1lbW9yeU1hbmFnZXIgPSB0aGlzLnJlc29sdmU8TWVtb3J5TWFuYWdlcj4oJ01lbW9yeU1hbmFnZXInKTtcbiAgICBjb25zdCBlbnNlbWJsZU1hbmFnZXIgPSB0aGlzLnJlc29sdmU8RW5zZW1ibGVNYW5hZ2VyPignRW5zZW1ibGVNYW5hZ2VyJyk7XG5cbiAgICBsZXQgcmVzdG9yZWRDb3VudCA9IDA7XG4gICAgbGV0IHNraXBwZWRDb3VudCA9IDA7XG5cbiAgICAvLyBSZXN0b3JlIHBlcnNvbmFzICh1c2VzIGZpbGVuYW1lIGlmIGF2YWlsYWJsZSwgZmFsbHMgYmFjayB0byBuYW1lKVxuICAgIC8vIElzc3VlICM4NDM6IGFjdGl2YXRlUGVyc29uYSgpIGlzIG5vdyBhc3luYyDigJQgdXNlcyBkaXNrIGZhbGxiYWNrIGZvciBjYWNoZSBtaXNzZXNcbiAgICBmb3IgKGNvbnN0IGFjdGl2YXRpb24gb2Ygc3RvcmUuZ2V0QWN0aXZhdGlvbnMoJ3BlcnNvbmEnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGFjdGl2YXRpb24uZmlsZW5hbWUgfHwgYWN0aXZhdGlvbi5uYW1lO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwZXJzb25hTWFuYWdlci5hY3RpdmF0ZVBlcnNvbmEoaWRlbnRpZmllcik7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc3RvcmVkQ291bnQrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtBY3RpdmF0aW9uU3RvcmVdIFBydW5pbmcgbWlzc2luZyBwZXJzb25hICcke2FjdGl2YXRpb24ubmFtZX0nYCk7XG4gICAgICAgICAgc3RvcmUucmVtb3ZlU3RhbGVBY3RpdmF0aW9uKCdwZXJzb25hJywgYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgICBza2lwcGVkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0FjdGl2YXRpb25TdG9yZV0gU2tpcHBpbmcgZmFpbGVkIHBlcnNvbmEgJyR7YWN0aXZhdGlvbi5uYW1lfSdgKTtcbiAgICAgICAgc3RvcmUucmVtb3ZlU3RhbGVBY3RpdmF0aW9uKCdwZXJzb25hJywgYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBza2lsbHNcbiAgICAvLyBOT1RFOiBhY3RpdmF0ZVNraWxsKCkgcmV0dXJucyB7c3VjY2VzcywgbWVzc2FnZX0g4oCUIGl0IG5ldmVyIHRocm93cyBvbiBub3QtZm91bmQuXG4gICAgZm9yIChjb25zdCBhY3RpdmF0aW9uIG9mIHN0b3JlLmdldEFjdGl2YXRpb25zKCdza2lsbCcpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBza2lsbE1hbmFnZXIuYWN0aXZhdGVTa2lsbChhY3RpdmF0aW9uLm5hbWUpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXN0b3JlZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbQWN0aXZhdGlvblN0b3JlXSBQcnVuaW5nIG1pc3Npbmcgc2tpbGwgJyR7YWN0aXZhdGlvbi5uYW1lfSdgKTtcbiAgICAgICAgICBzdG9yZS5yZW1vdmVTdGFsZUFjdGl2YXRpb24oJ3NraWxsJywgYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgICBza2lwcGVkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0FjdGl2YXRpb25TdG9yZV0gU2tpcHBpbmcgZmFpbGVkIHNraWxsICcke2FjdGl2YXRpb24ubmFtZX0nYCk7XG4gICAgICAgIHN0b3JlLnJlbW92ZVN0YWxlQWN0aXZhdGlvbignc2tpbGwnLCBhY3RpdmF0aW9uLm5hbWUpO1xuICAgICAgICBza2lwcGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGFnZW50c1xuICAgIGZvciAoY29uc3QgYWN0aXZhdGlvbiBvZiBzdG9yZS5nZXRBY3RpdmF0aW9ucygnYWdlbnQnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWdlbnRNYW5hZ2VyLmFjdGl2YXRlQWdlbnQoYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdG9yZWRDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0FjdGl2YXRpb25TdG9yZV0gUHJ1bmluZyBtaXNzaW5nIGFnZW50ICcke2FjdGl2YXRpb24ubmFtZX0nYCk7XG4gICAgICAgICAgc3RvcmUucmVtb3ZlU3RhbGVBY3RpdmF0aW9uKCdhZ2VudCcsIGFjdGl2YXRpb24ubmFtZSk7XG4gICAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtBY3RpdmF0aW9uU3RvcmVdIFNraXBwaW5nIGZhaWxlZCBhZ2VudCAnJHthY3RpdmF0aW9uLm5hbWV9J2ApO1xuICAgICAgICBzdG9yZS5yZW1vdmVTdGFsZUFjdGl2YXRpb24oJ2FnZW50JywgYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBtZW1vcmllcyAoZGVkdXAgYWdhaW5zdCBhdXRvLWxvYWRlZCBvbmVzKVxuICAgIGNvbnN0IGFjdGl2ZU1lbW9yaWVzID0gYXdhaXQgbWVtb3J5TWFuYWdlci5nZXRBY3RpdmVNZW1vcmllcygpO1xuICAgIGNvbnN0IGFjdGl2ZU1lbW9yeU5hbWVzID0gbmV3IFNldChhY3RpdmVNZW1vcmllcy5tYXAobSA9PiBtLm1ldGFkYXRhLm5hbWUpKTtcbiAgICBmb3IgKGNvbnN0IGFjdGl2YXRpb24gb2Ygc3RvcmUuZ2V0QWN0aXZhdGlvbnMoJ21lbW9yeScpKSB7XG4gICAgICBpZiAoYWN0aXZlTWVtb3J5TmFtZXMuaGFzKGFjdGl2YXRpb24ubmFtZSkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbQWN0aXZhdGlvblN0b3JlXSBNZW1vcnkgJyR7YWN0aXZhdGlvbi5uYW1lfScgYWxyZWFkeSBhY3RpdmUgKGF1dG8tbG9hZGVkKSwgc2tpcHBpbmdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtZW1vcnlNYW5hZ2VyLmFjdGl2YXRlTWVtb3J5KGFjdGl2YXRpb24ubmFtZSk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc3RvcmVkQ291bnQrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtBY3RpdmF0aW9uU3RvcmVdIFBydW5pbmcgbWlzc2luZyBtZW1vcnkgJyR7YWN0aXZhdGlvbi5uYW1lfSdgKTtcbiAgICAgICAgICBzdG9yZS5yZW1vdmVTdGFsZUFjdGl2YXRpb24oJ21lbW9yeScsIGFjdGl2YXRpb24ubmFtZSk7XG4gICAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtBY3RpdmF0aW9uU3RvcmVdIFNraXBwaW5nIGZhaWxlZCBtZW1vcnkgJyR7YWN0aXZhdGlvbi5uYW1lfSdgKTtcbiAgICAgICAgc3RvcmUucmVtb3ZlU3RhbGVBY3RpdmF0aW9uKCdtZW1vcnknLCBhY3RpdmF0aW9uLm5hbWUpO1xuICAgICAgICBza2lwcGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGVuc2VtYmxlc1xuICAgIGZvciAoY29uc3QgYWN0aXZhdGlvbiBvZiBzdG9yZS5nZXRBY3RpdmF0aW9ucygnZW5zZW1ibGUnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW5zZW1ibGVNYW5hZ2VyLmFjdGl2YXRlRW5zZW1ibGUoYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdG9yZWRDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0FjdGl2YXRpb25TdG9yZV0gUHJ1bmluZyBtaXNzaW5nIGVuc2VtYmxlICcke2FjdGl2YXRpb24ubmFtZX0nYCk7XG4gICAgICAgICAgc3RvcmUucmVtb3ZlU3RhbGVBY3RpdmF0aW9uKCdlbnNlbWJsZScsIGFjdGl2YXRpb24ubmFtZSk7XG4gICAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtBY3RpdmF0aW9uU3RvcmVdIFNraXBwaW5nIGZhaWxlZCBlbnNlbWJsZSAnJHthY3RpdmF0aW9uLm5hbWV9J2ApO1xuICAgICAgICBzdG9yZS5yZW1vdmVTdGFsZUFjdGl2YXRpb24oJ2Vuc2VtYmxlJywgYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc3RvcmVkQ291bnQgPiAwIHx8IHNraXBwZWRDb3VudCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW0FjdGl2YXRpb25TdG9yZV0gUmVzdG9yZWQgJHtyZXN0b3JlZENvdW50fSBlbGVtZW50KHMpLCBza2lwcGVkICR7c2tpcHBlZENvdW50fSBzdGFsZSBmb3Igc2Vzc2lvbiAnJHtzdG9yZS5nZXRTZXNzaW9uSWQoKX0nYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQm9vdHN0cmFwIGFsbCBoYW5kbGVycyB3aXRob3V0IHJlZ2lzdGVyaW5nIE1DUCB0b29scy5cbiAgICogVXNlZCBieSB3ZWItb25seSBtb2RlICgtLXdlYikgdG8gZ2V0IE1DUEFRTEhhbmRsZXIgd2l0aG91dCBhbiBNQ1AgU2VydmVyLlxuICAgKiBJc3N1ZSAjNzk2OiBTcGxpdCBESSBjb250YWluZXIgYm9vdHN0cmFwIGZyb20gdHJhbnNwb3J0IGNvbm5lY3QuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYm9vdHN0cmFwSGFuZGxlcnMoKTogUHJvbWlzZTxIYW5kbGVyQnVuZGxlPiB7XG4gICAgaWYgKCF0aGlzLnBlcnNvbmFzRGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQZXJzb25hIGRpcmVjdG9yeSBub3QgaW5pdGlhbGl6ZWQuIENhbGwgcHJlcGFyZVBvcnRmb2xpbygpIGZpcnN0LlwiKTtcbiAgICB9XG5cbiAgICBQYXRoVmFsaWRhdG9yLmluaXRpYWxpemUodGhpcy5wZXJzb25hc0Rpcik7XG5cbiAgICBjb25zdCBpbmRpY2F0b3JTZXJ2aWNlID0gdGhpcy5yZXNvbHZlPFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlPignUGVyc29uYUluZGljYXRvclNlcnZpY2UnKTtcbiAgICBjb25zdCBwZXJzb25hTWFuYWdlciA9IHRoaXMucmVzb2x2ZTxQZXJzb25hTWFuYWdlcj4oJ1BlcnNvbmFNYW5hZ2VyJyk7XG4gICAgY29uc3QgaW5pdFNlcnZpY2UgPSB0aGlzLnJlc29sdmU8SW5pdGlhbGl6YXRpb25TZXJ2aWNlPignSW5pdGlhbGl6YXRpb25TZXJ2aWNlJyk7XG4gICAgY29uc3QgcGVyc29uYUV4cG9ydGVyID0gbmV3IFBlcnNvbmFFeHBvcnRlcigoKSA9PiBwZXJzb25hTWFuYWdlci5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCkpO1xuICAgIGNvbnN0IHBlcnNvbmFJbXBvcnRlciA9IG5ldyBQZXJzb25hSW1wb3J0ZXIodGhpcy5wZXJzb25hc0RpciwgKCkgPT4gcGVyc29uYU1hbmFnZXIuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpKTtcblxuICAgIC8vIENyZWF0ZSBzdGF0ZSBhY2Nlc3NvciBmb3IgUGVyc29uYUhhbmRsZXJcbiAgICBjb25zdCBhY3RpdmVQZXJzb25hQWNjZXNzb3IgPSB7XG4gICAgICBnZXQ6ICgpID0+IHBlcnNvbmFNYW5hZ2VyLmdldEFjdGl2ZVBlcnNvbmEoKT8uZmlsZW5hbWUgfHwgbnVsbCxcbiAgICAgIHNldDogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIC8vIElzc3VlICM4NDM6IGFjdGl2YXRlUGVyc29uYSBpcyBub3cgYXN5bmMgYnV0IHRoaXMgc2V0dGVyIGlzIHN5bmNocm9ub3VzLlxuICAgICAgICAgIC8vIEZpcmUtYW5kLWZvcmdldCDigJQgUGVyc29uYUhhbmRsZXIgZG9lcyBpdHMgb3duIGxvb2t1cCBiZWZvcmUgY2FsbGluZyBzZXQoKS5cbiAgICAgICAgICAvLyBMb2cgYXQgZXJyb3IgbGV2ZWwgc2luY2UgYWN0aXZhdGlvbiBmYWlsdXJlcyBoZXJlIGluZGljYXRlIHN0YWxlIHN0YXRlLlxuICAgICAgICAgIHBlcnNvbmFNYW5hZ2VyLmFjdGl2YXRlUGVyc29uYSh2YWx1ZSkuY2F0Y2goZXJyID0+XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFtDb250YWluZXJdIFBlcnNvbmEgYWN0aXZhdGlvbiBmYWlsZWQgZm9yIFwiJHt2YWx1ZX1cIiDigJQgc3RhdGUgYWNjZXNzb3IgbWF5IGJlIHN0YWxlOmAsIGVycilcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlcnNvbmFNYW5hZ2VyLmRlYWN0aXZhdGVQZXJzb25hKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcGVyc29uYUhhbmRsZXIgPSBuZXcgUGVyc29uYUhhbmRsZXIoXG4gICAgICBwZXJzb25hTWFuYWdlcixcbiAgICAgIHBlcnNvbmFFeHBvcnRlcixcbiAgICAgIHBlcnNvbmFJbXBvcnRlcixcbiAgICAgIGluaXRTZXJ2aWNlLFxuICAgICAgaW5kaWNhdG9yU2VydmljZSxcbiAgICAgIGFjdGl2ZVBlcnNvbmFBY2Nlc3NvclxuICAgICk7XG5cbiAgICBhd2FpdCBwZXJzb25hTWFuYWdlci5yZWxvYWQoKTtcblxuICAgIGNvbnN0IGVsZW1lbnRDcnVkSGFuZGxlciA9IG5ldyBFbGVtZW50Q1JVREhhbmRsZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ1NraWxsTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdUZW1wbGF0ZU1hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnVGVtcGxhdGVSZW5kZXJlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdBZ2VudE1hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnTWVtb3J5TWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdFbnNlbWJsZU1hbmFnZXInKSxcbiAgICAgIHBlcnNvbmFNYW5hZ2VyLFxuICAgICAgdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9NYW5hZ2VyJyksXG4gICAgICBpbml0U2VydmljZSxcbiAgICAgIGluZGljYXRvclNlcnZpY2UsXG4gICAgICB0aGlzLnJlc29sdmUoJ0ZpbGVPcGVyYXRpb25zU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdFbGVtZW50UXVlcnlTZXJ2aWNlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1ZhbGlkYXRpb25SZWdpc3RyeScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdBY3RpdmF0aW9uU3RvcmUnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQmFja3VwU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdQb2xpY3lFeHBvcnRTZXJ2aWNlJylcbiAgICApO1xuICAgIC8vIFJlZ2lzdGVyIGZvciBsYXp5IHJlc29sdXRpb24gYnkgUG9saWN5RXhwb3J0U2VydmljZVxuICAgIHRoaXMucmVnaXN0ZXIoJ0VsZW1lbnRDUlVESGFuZGxlcicsICgpID0+IGVsZW1lbnRDcnVkSGFuZGxlcik7XG5cbiAgICAvLyBNQ1BBUUxIYW5kbGVyIGNyZWF0ZWQgbGF0ZXIgYWZ0ZXIgYWxsIGhhbmRsZXJzIGFyZSBpbnN0YW50aWF0ZWRcbiAgICAvLyBTZWUgYmVsb3cgYWZ0ZXIgZW5oYW5jZWRJbmRleEhhbmRsZXIgY3JlYXRpb25cblxuICAgIGNvbnN0IGNvbGxlY3Rpb25IYW5kbGVyID0gbmV3IENvbGxlY3Rpb25IYW5kbGVyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdDb2xsZWN0aW9uQnJvd3NlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdDb2xsZWN0aW9uU2VhcmNoJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1BlcnNvbmFEZXRhaWxzJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0VsZW1lbnRJbnN0YWxsZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ29sbGVjdGlvbkNhY2hlJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQVBJQ2FjaGUnKSxcbiAgICAgIHBlcnNvbmFNYW5hZ2VyLCAvLyBVc2UgdGhlIHJlc29sdmVkIFBlcnNvbmFNYW5hZ2VyXG4gICAgICB0aGlzLnJlc29sdmUoJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbCcpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdVbmlmaWVkSW5kZXhNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0luaXRpYWxpemF0aW9uU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdQZXJzb25hSW5kaWNhdG9yU2VydmljZScpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKVxuICAgICk7XG5cbiAgICBjb25zdCBwb3J0Zm9saW9IYW5kbGVyID0gbmV3IFBvcnRmb2xpb0hhbmRsZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ0dpdEh1YkF1dGhNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb01hbmFnZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvUHVsbEhhbmRsZXInKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1VuaWZpZWRJbmRleE1hbmFnZXInKSxcbiAgICAgIGluaXRTZXJ2aWNlLFxuICAgICAgaW5kaWNhdG9yU2VydmljZSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnQ29uZmlnTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdGaWxlT3BlcmF0aW9uc1NlcnZpY2UnKSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnVG9rZW5NYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyJylcbiAgICApO1xuXG4gICAgY29uc3QgZ2l0aHViQXV0aEhhbmRsZXIgPSBuZXcgR2l0SHViQXV0aEhhbmRsZXIoXG4gICAgICB0aGlzLnJlc29sdmUoJ0dpdEh1YkF1dGhNYW5hZ2VyJyksXG4gICAgICB0aGlzLnJlc29sdmUoJ0NvbmZpZ01hbmFnZXInKSxcbiAgICAgIGluaXRTZXJ2aWNlLFxuICAgICAgaW5kaWNhdG9yU2VydmljZSxcbiAgICAgIHRoaXMucmVzb2x2ZSgnRmlsZU9wZXJhdGlvbnNTZXJ2aWNlJylcbiAgICApO1xuXG4gICAgY29uc3QgZGlzcGxheUNvbmZpZ0hhbmRsZXIgPSBuZXcgRGlzcGxheUNvbmZpZ0hhbmRsZXIoXG4gICAgICBwZXJzb25hTWFuYWdlcixcbiAgICAgIGluaXRTZXJ2aWNlLFxuICAgICAgaW5kaWNhdG9yU2VydmljZVxuICAgICk7XG5cbiAgICBjb25zdCBpZGVudGl0eUhhbmRsZXIgPSBuZXcgSWRlbnRpdHlIYW5kbGVyKFxuICAgICAgcGVyc29uYU1hbmFnZXIsXG4gICAgICBpbml0U2VydmljZSxcbiAgICAgIGluZGljYXRvclNlcnZpY2VcbiAgICApO1xuXG4gICAgY29uc3QgY29uZmlnSGFuZGxlciA9IG5ldyBDb25maWdIYW5kbGVyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdDb25maWdNYW5hZ2VyJyksXG4gICAgICBpbml0U2VydmljZSxcbiAgICAgIGluZGljYXRvclNlcnZpY2VcbiAgICApO1xuICAgIGNvbnN0IHN5bmNIYW5kbGVyID0gbmV3IFN5bmNIYW5kbGVyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdQb3J0Zm9saW9TeW5jTWFuYWdlcicpLFxuICAgICAgdGhpcy5yZXNvbHZlKCdDb25maWdNYW5hZ2VyJyksXG4gICAgICBpbmRpY2F0b3JTZXJ2aWNlXG4gICAgKTtcblxuICAgIGNvbnN0IGVuaGFuY2VkSW5kZXhIYW5kbGVyID0gbmV3IEVuaGFuY2VkSW5kZXhIYW5kbGVyKFxuICAgICAgdGhpcy5yZXNvbHZlKCdFbmhhbmNlZEluZGV4TWFuYWdlcicpLFxuICAgICAgaW5kaWNhdG9yU2VydmljZVxuICAgICk7XG5cbiAgICAvLyBJc3N1ZSAjNDUyOiBDcmVhdGUgR2F0ZWtlZXBlciBwb2xpY3kgZW5naW5lIGluc3RhbmNlXG4gICAgLy8gSXNzdWUgIzY3OTogYWxsb3dFbGVtZW50UG9saWN5T3ZlcnJpZGVzIHdpcmVkIGZyb20gZW52IChET0xMSE9VU0VfR0FURUtFRVBFUl9FTEVNRU5UX1BPTElDWV9PVkVSUklERVMpXG4gICAgY29uc3QgZ2F0ZWtlZXBlciA9IG5ldyBHYXRla2VlcGVyKHVuZGVmaW5lZCwge1xuICAgICAgZW5hYmxlQXVkaXRMb2dnaW5nOiB0cnVlLFxuICAgICAgcmVxdWlyZURhbmdlclpvbmVWZXJpZmljYXRpb246IHRydWUsXG4gICAgICBhbGxvd0VsZW1lbnRQb2xpY3lPdmVycmlkZXM6IGVudi5ET0xMSE9VU0VfR0FURUtFRVBFUl9FTEVNRU5UX1BPTElDWV9PVkVSUklERVMsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgTUNQQVFMSGFuZGxlciB3aXRoIGFsbCBhdmFpbGFibGUgaGFuZGxlcnMgZm9yIGZ1bGwgb3BlcmF0aW9uIGNvdmVyYWdlIChJc3N1ZSAjMjQxKVxuICAgIC8vIElzc3VlICMzMDE6IFBhc3MgQ29udGV4dFRyYWNrZXIgZm9yIHJlcXVlc3QgY29ycmVsYXRpb24gbWV0YWRhdGFcbiAgICAvLyBJc3N1ZSAjNDAyOiBQYXNzIERhbmdlclpvbmVFbmZvcmNlciB2aWEgSGFuZGxlclJlZ2lzdHJ5XG4gICAgLy8gQnVpbGQgaGFuZGxlciByZWdpc3RyeSwgdGhlbiBhZGQgbGF6eSBtZXRyaWNzU2luayBnZXR0ZXIuXG4gICAgLy8gTWVtb3J5TWV0cmljc1NpbmsgaXMgcmVnaXN0ZXJlZCBkdXJpbmcgZGVmZXJyZWRTZXR1cCAoYWZ0ZXIgTWV0cmljc01hbmFnZXIuc3RhcnQoKSksXG4gICAgLy8gc28gaXQgaXNuJ3QgYXZhaWxhYmxlIGF0IGhhbmRsZXIgY29uc3RydWN0aW9uIHRpbWUg4oCUIHJlc29sdmUgb24gZmlyc3QgYWNjZXNzIGluc3RlYWQuXG4gICAgY29uc3QgaGFuZGxlckRlcHM6IEhhbmRsZXJSZWdpc3RyeSA9IHtcbiAgICAgIGVsZW1lbnRDUlVEOiBlbGVtZW50Q3J1ZEhhbmRsZXIsXG4gICAgICBtZW1vcnlNYW5hZ2VyOiB0aGlzLnJlc29sdmUoJ01lbW9yeU1hbmFnZXInKSxcbiAgICAgIGFnZW50TWFuYWdlcjogdGhpcy5yZXNvbHZlKCdBZ2VudE1hbmFnZXInKSxcbiAgICAgIHRlbXBsYXRlUmVuZGVyZXI6IHRoaXMucmVzb2x2ZSgnVGVtcGxhdGVSZW5kZXJlcicpLFxuICAgICAgZWxlbWVudFF1ZXJ5U2VydmljZTogdGhpcy5yZXNvbHZlKCdFbGVtZW50UXVlcnlTZXJ2aWNlJyksXG4gICAgICAvLyBNQ1AtQVFMIGV4dGVuc2lvbiBoYW5kbGVycyAoSXNzdWUgIzI0MSlcbiAgICAgIGNvbGxlY3Rpb25IYW5kbGVyLFxuICAgICAgcG9ydGZvbGlvSGFuZGxlcixcbiAgICAgIGF1dGhIYW5kbGVyOiBnaXRodWJBdXRoSGFuZGxlcixcbiAgICAgIGNvbmZpZ0hhbmRsZXIsXG4gICAgICBlbmhhbmNlZEluZGV4SGFuZGxlcixcbiAgICAgIHBlcnNvbmFIYW5kbGVyLFxuICAgICAgc3luY0hhbmRsZXIsXG4gICAgICBidWlsZEluZm9TZXJ2aWNlOiB0aGlzLnJlc29sdmUoJ0J1aWxkSW5mb1NlcnZpY2UnKSxcbiAgICAgIGNhY2hlTWVtb3J5QnVkZ2V0OiB0aGlzLnJlc29sdmUoJ0NhY2hlTWVtb3J5QnVkZ2V0JyksXG4gICAgICBnYXRla2VlcGVyLCAgLy8gSXNzdWUgIzQ1MjogUG9saWN5IGVuZ2luZSBmb3IgZW5mb3JjZSgpXG4gICAgICBkYW5nZXJab25lRW5mb3JjZXI6IHRoaXMucmVzb2x2ZSgnRGFuZ2VyWm9uZUVuZm9yY2VyJyksXG4gICAgICB2ZXJpZmljYXRpb25TdG9yZTogdGhpcy5yZXNvbHZlKCdWZXJpZmljYXRpb25TdG9yZScpLCAgLy8gSXNzdWUgIzE0MjogVmVyaWZpY2F0aW9uIGNvZGVzXG4gICAgICB2ZXJpZmljYXRpb25Ob3RpZmllcjogdGhpcy5yZXNvbHZlKCdWZXJpZmljYXRpb25Ob3RpZmllcicpLCAgLy8gSXNzdWUgIzUyMjogT1MgZGlhbG9nIGZvciBjb2Rlc1xuICAgICAgbWVtb3J5U2luazogdGhpcy5yZXNvbHZlPE1lbW9yeUxvZ1Npbms+KCdNZW1vcnlMb2dTaW5rJyksICAvLyBJc3N1ZSAjNTI4OiBDUlVERS1yb3V0ZWQgcXVlcnlfbG9nc1xuICAgICAgcGVyZm9ybWFuY2VNb25pdG9yOiB0aGlzLnJlc29sdmU8UGVyZm9ybWFuY2VNb25pdG9yPignUGVyZm9ybWFuY2VNb25pdG9yJyksXG4gICAgICBvcGVyYXRpb25NZXRyaWNzVHJhY2tlcjogdGhpcy5yZXNvbHZlPE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyPignT3BlcmF0aW9uTWV0cmljc1RyYWNrZXInKSxcbiAgICAgIGdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlcjogdGhpcy5yZXNvbHZlPEdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlcj4oJ0dhdGVrZWVwZXJNZXRyaWNzVHJhY2tlcicpLFxuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGhhbmRsZXJEZXBzLCAnbWV0cmljc1NpbmsnLCB7XG4gICAgICBnZXQ6ICgpID0+IHsgdHJ5IHsgcmV0dXJuIHRoaXMucmVzb2x2ZTxNZW1vcnlNZXRyaWNzU2luaz4oJ01lbW9yeU1ldHJpY3NTaW5rJyk7IH0gY2F0Y2ggeyByZXR1cm4gdW5kZWZpbmVkOyB9IH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IG1jcEFxbEhhbmRsZXIgPSBuZXcgTUNQQVFMSGFuZGxlcihoYW5kbGVyRGVwcywgdGhpcy5yZXNvbHZlPENvbnRleHRUcmFja2VyPignQ29udGV4dFRyYWNrZXInKSk7XG5cbiAgICAvLyBSZWdpc3RlciBtY3BBcWxIYW5kbGVyIGFzIGEgc2luZ2xldG9uIGZvciB0ZXN0IGFjY2Vzc1xuICAgIHRoaXMucmVnaXN0ZXIoJ21jcEFxbEhhbmRsZXInLCAoKSA9PiBtY3BBcWxIYW5kbGVyLCB7IHNpbmdsZXRvbjogdHJ1ZSB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyKCdnYXRla2VlcGVyJywgKCkgPT4gZ2F0ZWtlZXBlciwgeyBzaW5nbGV0b246IHRydWUgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGVyc29uYUhhbmRsZXIsXG4gICAgICBlbGVtZW50Q3J1ZEhhbmRsZXIsXG4gICAgICBjb2xsZWN0aW9uSGFuZGxlcixcbiAgICAgIHBvcnRmb2xpb0hhbmRsZXIsXG4gICAgICBnaXRodWJBdXRoSGFuZGxlcixcbiAgICAgIGRpc3BsYXlDb25maWdIYW5kbGVyLFxuICAgICAgaWRlbnRpdHlIYW5kbGVyLFxuICAgICAgY29uZmlnSGFuZGxlcixcbiAgICAgIHN5bmNIYW5kbGVyLFxuICAgICAgdG9vbFJlZ2lzdHJ5OiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBUb29sUmVnaXN0cnksIC8vIE5vIHRvb2wgcmVnaXN0cnkgaW4gYm9vdHN0cmFwLW9ubHkgbW9kZVxuICAgICAgZW5oYW5jZWRJbmRleEhhbmRsZXIsXG4gICAgICBtY3BBcWxIYW5kbGVyLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFsbCBoYW5kbGVycyB3aXRoIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGFuZCByZWdpc3RlciBNQ1AgdG9vbHMuXG4gICAqIEBwYXJhbSBzZXJ2ZXIgLSBNQ1AgU2VydmVyIGluc3RhbmNlIGZvciB0b29sIHJlZ2lzdHJhdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZUhhbmRsZXJzKHNlcnZlcjogU2VydmVyKTogUHJvbWlzZTxIYW5kbGVyQnVuZGxlPiB7XG4gICAgY29uc3QgYnVuZGxlID0gYXdhaXQgdGhpcy5ib290c3RyYXBIYW5kbGVycygpO1xuXG4gICAgY29uc3QgdG9vbFJlZ2lzdHJ5ID0gbmV3IFRvb2xSZWdpc3RyeShzZXJ2ZXIpO1xuXG4gICAgLy8gUmVnaXN0ZXIgdG9vbHMgYmFzZWQgb24gTUNQX0lOVEVSRkFDRV9NT0RFIChJc3N1ZSAjMjM3KVxuICAgIC8vIC0gJ2Rpc2NyZXRlJzogUmVnaXN0ZXIgaW5kaXZpZHVhbCBkaXNjcmV0ZSB0b29scyAofjQwIHRvb2xzKVxuICAgIC8vIC0gJ21jcGFxbCc6IFJlZ2lzdGVyIGNvbnNvbGlkYXRlZCBNQ1AtQVFMIGludGVyZmFjZSBvbmx5ICh+NCBvciAxIHRvb2xzKVxuICAgIC8vIFRva2VuIGNvdW50cyBhcmUgbG9nZ2VkIGR5bmFtaWNhbGx5IGF0IHN0YXJ0dXAgdmlhIGxvZ1Rvb2xUb2tlblN0YXRzKClcbiAgICBjb25zdCBpbnRlcmZhY2VNb2RlID0gZW52Lk1DUF9JTlRFUkZBQ0VfTU9ERTtcbiAgICBsb2dnZXIuaW5mbyhgTUNQIEludGVyZmFjZSBNb2RlOiAke2ludGVyZmFjZU1vZGV9YCk7XG5cbiAgICBpZiAoaW50ZXJmYWNlTW9kZSA9PT0gJ2Rpc2NyZXRlJykge1xuICAgICAgLy8gRGlzY3JldGUgbW9kZTogUmVnaXN0ZXIgYWxsIGluZGl2aWR1YWwgdG9vbHNcbiAgICAgIHRvb2xSZWdpc3RyeS5yZWdpc3RlclBlcnNvbmFUb29scyhidW5kbGUucGVyc29uYUhhbmRsZXIpO1xuICAgICAgdG9vbFJlZ2lzdHJ5LnJlZ2lzdGVyRWxlbWVudFRvb2xzKGJ1bmRsZS5lbGVtZW50Q3J1ZEhhbmRsZXIpO1xuICAgICAgdG9vbFJlZ2lzdHJ5LnJlZ2lzdGVyQ29sbGVjdGlvblRvb2xzKGJ1bmRsZS5jb2xsZWN0aW9uSGFuZGxlcik7XG4gICAgICB0b29sUmVnaXN0cnkucmVnaXN0ZXJQb3J0Zm9saW9Ub29scyhidW5kbGUucG9ydGZvbGlvSGFuZGxlcik7XG4gICAgICB0b29sUmVnaXN0cnkucmVnaXN0ZXJBdXRoVG9vbHMoYnVuZGxlLmdpdGh1YkF1dGhIYW5kbGVyKTtcbiAgICAgIHRvb2xSZWdpc3RyeS5yZWdpc3RlckNvbmZpZ1Rvb2xzKHtcbiAgICAgICAgaGFuZGxlQ29uZmlnT3BlcmF0aW9uOiAob3B0aW9ucykgPT5cbiAgICAgICAgICBidW5kbGUuY29uZmlnSGFuZGxlci5oYW5kbGVDb25maWdPcGVyYXRpb24ob3B0aW9ucyksXG4gICAgICAgIGhhbmRsZVN5bmNPcGVyYXRpb246IChvcHRpb25zKSA9PlxuICAgICAgICAgIGJ1bmRsZS5zeW5jSGFuZGxlci5oYW5kbGVTeW5jT3BlcmF0aW9uKG9wdGlvbnMpLFxuICAgICAgfSk7XG4gICAgICB0b29sUmVnaXN0cnkucmVnaXN0ZXJFbmhhbmNlZEluZGV4VG9vbHMoXG4gICAgICAgIGJ1bmRsZS5lbmhhbmNlZEluZGV4SGFuZGxlcixcbiAgICAgICAgdGhpcy5yZXNvbHZlPEluZGV4Q29uZmlnTWFuYWdlcj4oJ0luZGV4Q29uZmlnTWFuYWdlcicpLmdldENvbmZpZygpXG4gICAgICApO1xuICAgICAgdG9vbFJlZ2lzdHJ5LnJlZ2lzdGVyQnVpbGRJbmZvVG9vbHModGhpcy5yZXNvbHZlKCdCdWlsZEluZm9TZXJ2aWNlJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNQ1AtQVFMIG1vZGU6IFJlZ2lzdGVyIG9ubHkgTUNQLUFRTCB0b29sc1xuICAgICAgdG9vbFJlZ2lzdHJ5LnJlZ2lzdGVyTUNQQVFMVG9vbHMoYnVuZGxlLm1jcEFxbEhhbmRsZXIpO1xuICAgIH1cblxuICAgIC8vIExvZyB0b2tlbiBzdGF0aXN0aWNzIChJc3N1ZSAjMjM3IGVuaGFuY2VtZW50KVxuICAgIHRoaXMubG9nVG9vbFRva2VuU3RhdHModG9vbFJlZ2lzdHJ5LCBpbnRlcmZhY2VNb2RlLCBidW5kbGUubWNwQXFsSGFuZGxlciwge1xuICAgICAgcGVyc29uYUhhbmRsZXI6IGJ1bmRsZS5wZXJzb25hSGFuZGxlcixcbiAgICAgIGVsZW1lbnRDcnVkSGFuZGxlcjogYnVuZGxlLmVsZW1lbnRDcnVkSGFuZGxlcixcbiAgICAgIGNvbGxlY3Rpb25IYW5kbGVyOiBidW5kbGUuY29sbGVjdGlvbkhhbmRsZXIsXG4gICAgICBwb3J0Zm9saW9IYW5kbGVyOiBidW5kbGUucG9ydGZvbGlvSGFuZGxlcixcbiAgICAgIGdpdGh1YkF1dGhIYW5kbGVyOiBidW5kbGUuZ2l0aHViQXV0aEhhbmRsZXIsXG4gICAgICBjb25maWdIYW5kbGVyOiBidW5kbGUuY29uZmlnSGFuZGxlcixcbiAgICAgIHN5bmNIYW5kbGVyOiBidW5kbGUuc3luY0hhbmRsZXIsXG4gICAgICBlbmhhbmNlZEluZGV4SGFuZGxlcjogYnVuZGxlLmVuaGFuY2VkSW5kZXhIYW5kbGVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNvbHZlPFNlcnZlclNldHVwPignU2VydmVyU2V0dXAnKS5zZXR1cFNlcnZlcihzZXJ2ZXIsIHRvb2xSZWdpc3RyeSwgYnVuZGxlLmVsZW1lbnRDcnVkSGFuZGxlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYnVuZGxlLFxuICAgICAgdG9vbFJlZ2lzdHJ5LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTG9nIHRvb2wgdG9rZW4gc3RhdGlzdGljcyBmb3IgbW9uaXRvcmluZyBhbmQgZG9jdW1lbnRhdGlvbi5cbiAgICogU2hvd3MgY3VycmVudCBtb2RlIHRva2VuIGNvdW50LCBhbHRlcm5hdGl2ZSBtb2RlIGNvbXBhcmlzb24sIGFuZCBzYXZpbmdzLlxuICAgKlxuICAgKiBUaGlzIGlzIGltcG9ydGFudCBmb3I6XG4gICAqIDEuIERvY3VtZW50aW5nIGFjdHVhbCB0b2tlbiBzYXZpbmdzIGFjaGlldmVkXG4gICAqIDIuIE1vbml0b3JpbmcgY29udGV4dCB3aW5kb3cgdXNhZ2VcbiAgICogMy4gU3VwcG9ydGluZyBmdXR1cmUgTUNQLUFRTCBhZGFwdGVyIGRldmVsb3BtZW50XG4gICAqXG4gICAqIElzc3VlICMyMzcgZW5oYW5jZW1lbnRcbiAgICovXG4gIHByaXZhdGUgbG9nVG9vbFRva2VuU3RhdHMoXG4gICAgdG9vbFJlZ2lzdHJ5OiBUb29sUmVnaXN0cnksXG4gICAgaW50ZXJmYWNlTW9kZTogJ2Rpc2NyZXRlJyB8ICdtY3BhcWwnLFxuICAgIG1jcEFxbEhhbmRsZXI6IE1DUEFRTEhhbmRsZXIsXG4gICAgZGlzY3JldGVIYW5kbGVyczoge1xuICAgICAgcGVyc29uYUhhbmRsZXI6IFBlcnNvbmFIYW5kbGVyO1xuICAgICAgZWxlbWVudENydWRIYW5kbGVyOiBFbGVtZW50Q1JVREhhbmRsZXI7XG4gICAgICBjb2xsZWN0aW9uSGFuZGxlcjogQ29sbGVjdGlvbkhhbmRsZXI7XG4gICAgICBwb3J0Zm9saW9IYW5kbGVyOiBQb3J0Zm9saW9IYW5kbGVyO1xuICAgICAgZ2l0aHViQXV0aEhhbmRsZXI6IEdpdEh1YkF1dGhIYW5kbGVyO1xuICAgICAgY29uZmlnSGFuZGxlcjogQ29uZmlnSGFuZGxlcjtcbiAgICAgIHN5bmNIYW5kbGVyOiBTeW5jSGFuZGxlcjtcbiAgICAgIGVuaGFuY2VkSW5kZXhIYW5kbGVyOiBFbmhhbmNlZEluZGV4SGFuZGxlcjtcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRUb2tlbnMgPSB0b29sUmVnaXN0cnkuZ2V0VG9vbFRva2VuRXN0aW1hdGUoKTtcbiAgICBjb25zdCBjdXJyZW50VG9vbENvdW50ID0gdG9vbFJlZ2lzdHJ5LmdldFRvb2xDb3VudCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGFsdGVybmF0aXZlIG1vZGUgdG9rZW5zIGZvciBjb21wYXJpc29uXG4gICAgbGV0IGFsdGVybmF0aXZlVG9rZW5zOiBudW1iZXI7XG4gICAgbGV0IGFsdGVybmF0aXZlVG9vbENvdW50OiBudW1iZXI7XG5cbiAgICBpZiAoaW50ZXJmYWNlTW9kZSA9PT0gJ2Rpc2NyZXRlJykge1xuICAgICAgLy8gQ3VycmVudCBpcyBkaXNjcmV0ZSwgY2FsY3VsYXRlIHdoYXQgbWNwYXFsIHdvdWxkIGJlXG4gICAgICBjb25zdCB0ZW1wUmVnaXN0cnkgPSBuZXcgVG9vbFJlZ2lzdHJ5KHt9IGFzIFNlcnZlcik7XG4gICAgICB0ZW1wUmVnaXN0cnkucmVnaXN0ZXJNQ1BBUUxUb29scyhtY3BBcWxIYW5kbGVyKTtcbiAgICAgIGFsdGVybmF0aXZlVG9rZW5zID0gdGVtcFJlZ2lzdHJ5LmdldFRvb2xUb2tlbkVzdGltYXRlKCk7XG4gICAgICBhbHRlcm5hdGl2ZVRvb2xDb3VudCA9IHRlbXBSZWdpc3RyeS5nZXRUb29sQ291bnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3VycmVudCBpcyBtY3BhcWwsIGNhbGN1bGF0ZSB3aGF0IGRpc2NyZXRlIHdvdWxkIGJlXG4gICAgICBjb25zdCB0ZW1wUmVnaXN0cnkgPSBuZXcgVG9vbFJlZ2lzdHJ5KHt9IGFzIFNlcnZlcik7XG4gICAgICB0ZW1wUmVnaXN0cnkucmVnaXN0ZXJQZXJzb25hVG9vbHMoZGlzY3JldGVIYW5kbGVycy5wZXJzb25hSGFuZGxlcik7XG4gICAgICB0ZW1wUmVnaXN0cnkucmVnaXN0ZXJFbGVtZW50VG9vbHMoZGlzY3JldGVIYW5kbGVycy5lbGVtZW50Q3J1ZEhhbmRsZXIpO1xuICAgICAgdGVtcFJlZ2lzdHJ5LnJlZ2lzdGVyQ29sbGVjdGlvblRvb2xzKGRpc2NyZXRlSGFuZGxlcnMuY29sbGVjdGlvbkhhbmRsZXIpO1xuICAgICAgdGVtcFJlZ2lzdHJ5LnJlZ2lzdGVyUG9ydGZvbGlvVG9vbHMoZGlzY3JldGVIYW5kbGVycy5wb3J0Zm9saW9IYW5kbGVyKTtcbiAgICAgIHRlbXBSZWdpc3RyeS5yZWdpc3RlckF1dGhUb29scyhkaXNjcmV0ZUhhbmRsZXJzLmdpdGh1YkF1dGhIYW5kbGVyKTtcbiAgICAgIHRlbXBSZWdpc3RyeS5yZWdpc3RlckNvbmZpZ1Rvb2xzKHtcbiAgICAgICAgaGFuZGxlQ29uZmlnT3BlcmF0aW9uOiAob3B0aW9ucykgPT5cbiAgICAgICAgICBkaXNjcmV0ZUhhbmRsZXJzLmNvbmZpZ0hhbmRsZXIuaGFuZGxlQ29uZmlnT3BlcmF0aW9uKG9wdGlvbnMpLFxuICAgICAgICBoYW5kbGVTeW5jT3BlcmF0aW9uOiAob3B0aW9ucykgPT5cbiAgICAgICAgICBkaXNjcmV0ZUhhbmRsZXJzLnN5bmNIYW5kbGVyLmhhbmRsZVN5bmNPcGVyYXRpb24ob3B0aW9ucyksXG4gICAgICB9KTtcbiAgICAgIHRlbXBSZWdpc3RyeS5yZWdpc3RlckVuaGFuY2VkSW5kZXhUb29scyhcbiAgICAgICAgZGlzY3JldGVIYW5kbGVycy5lbmhhbmNlZEluZGV4SGFuZGxlcixcbiAgICAgICAgdGhpcy5yZXNvbHZlPEluZGV4Q29uZmlnTWFuYWdlcj4oJ0luZGV4Q29uZmlnTWFuYWdlcicpLmdldENvbmZpZygpXG4gICAgICApO1xuICAgICAgdGVtcFJlZ2lzdHJ5LnJlZ2lzdGVyQnVpbGRJbmZvVG9vbHModGhpcy5yZXNvbHZlKCdCdWlsZEluZm9TZXJ2aWNlJykpO1xuICAgICAgYWx0ZXJuYXRpdmVUb2tlbnMgPSB0ZW1wUmVnaXN0cnkuZ2V0VG9vbFRva2VuRXN0aW1hdGUoKTtcbiAgICAgIGFsdGVybmF0aXZlVG9vbENvdW50ID0gdGVtcFJlZ2lzdHJ5LmdldFRvb2xDb3VudCgpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBzYXZpbmdzIChwb3NpdGl2ZSA9IGN1cnJlbnQgbW9kZSBzYXZlcyB0b2tlbnMpXG4gICAgY29uc3QgdG9rZW5EaWZmID0gYWx0ZXJuYXRpdmVUb2tlbnMgLSBjdXJyZW50VG9rZW5zO1xuICAgIGNvbnN0IHNhdmluZ3NQZXJjZW50ID0gYWx0ZXJuYXRpdmVUb2tlbnMgPiAwXG4gICAgICA/ICgodG9rZW5EaWZmIC8gYWx0ZXJuYXRpdmVUb2tlbnMpICogMTAwKS50b0ZpeGVkKDEpXG4gICAgICA6ICcwJztcblxuICAgIC8vIExvZyB0aGUgY29tcGFyaXNvblxuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYFRvb2wgUmVnaXN0cmF0aW9uIENvbXBsZXRlOiAke2N1cnJlbnRUb29sQ291bnR9IHRvb2xzLCB+JHtjdXJyZW50VG9rZW5zLnRvTG9jYWxlU3RyaW5nKCl9IHRva2Vuc2BcbiAgICApO1xuXG4gICAgaWYgKGludGVyZmFjZU1vZGUgPT09ICdtY3BhcWwnKSB7XG4gICAgICAvLyBIaWdobGlnaHQgc2F2aW5ncyB3aGVuIHVzaW5nIG1jcGFxbFxuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBUb2tlbiBTYXZpbmdzOiAke3Rva2VuRGlmZi50b0xvY2FsZVN0cmluZygpfSB0b2tlbnMgc2F2ZWQgKCR7c2F2aW5nc1BlcmNlbnR9JSkgdnMgZGlzY3JldGUgbW9kZSAoJHthbHRlcm5hdGl2ZVRvb2xDb3VudH0gdG9vbHMsIH4ke2FsdGVybmF0aXZlVG9rZW5zLnRvTG9jYWxlU3RyaW5nKCl9IHRva2VucylgXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBkaXNjcmV0ZSBtb2RlLCBzaG93IHdoYXQgbWNwYXFsIHdvdWxkIHNhdmVcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgQWx0ZXJuYXRpdmU6IG1jcGFxbCBtb2RlIHdvdWxkIHVzZSAke2FsdGVybmF0aXZlVG9vbENvdW50fSB0b29scywgfiR7YWx0ZXJuYXRpdmVUb2tlbnMudG9Mb2NhbGVTdHJpbmcoKX0gdG9rZW5zICgke01hdGguYWJzKE51bWJlcihzYXZpbmdzUGVyY2VudCkpfSUgJHt0b2tlbkRpZmYgPCAwID8gJ21vcmUnIDogJ2xlc3MnfSlgXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaXJlIGFsbCBtZXRyaWMgY29sbGVjdG9ycyBpbnRvIHRoZSBNZXRyaWNzTWFuYWdlci5cbiAgICogTWlycm9ycyB3aXJlTG9nSG9va3MoKSDigJQga2VlcHMgY29sbGVjdG9yIHJlZ2lzdHJhdGlvbiBvdXQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXJlTWV0cmljc0NvbGxlY3RvcnMobWV0cmljc01hbmFnZXI6IE1ldHJpY3NNYW5hZ2VyKTogdm9pZCB7XG4gICAgLy8gUGVyZm9ybWFuY2VNb25pdG9yIChpbnN0YW5jZSlcbiAgICB0cnkge1xuICAgICAgY29uc3QgbW9uaXRvciA9IHRoaXMucmVzb2x2ZTxpbXBvcnQoJy4uL3V0aWxzL1BlcmZvcm1hbmNlTW9uaXRvci5qcycpLlBlcmZvcm1hbmNlTW9uaXRvcj4oJ1BlcmZvcm1hbmNlTW9uaXRvcicpO1xuICAgICAgbWV0cmljc01hbmFnZXIucmVnaXN0ZXJDb2xsZWN0b3IobmV3IFBlcmZvcm1hbmNlTW9uaXRvckNvbGxlY3Rvcihtb25pdG9yKSk7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCByZWdpc3RlcmVkICovIH1cblxuICAgIC8vIExSVUNhY2hlIGluc3RhbmNlcyDigJQgQVBJIGNhY2hlICsgYWxsIGVsZW1lbnQgbWFuYWdlciBjYWNoZXNcbiAgICBjb25zdCBjYWNoZXMgPSB0aGlzLmNvbGxlY3RMcnVDYWNoZXNGb3JNZXRyaWNzKCk7XG4gICAgaWYgKGNhY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBtZXRyaWNzTWFuYWdlci5yZWdpc3RlckNvbGxlY3RvcihuZXcgTFJVQ2FjaGVDb2xsZWN0b3IoY2FjaGVzKSk7XG4gICAgfVxuXG4gICAgLy8gU2VjdXJpdHlNb25pdG9yIChzdGF0aWMpXG4gICAgdHJ5IHtcbiAgICAgIG1ldHJpY3NNYW5hZ2VyLnJlZ2lzdGVyQ29sbGVjdG9yKG5ldyBTZWN1cml0eU1vbml0b3JDb2xsZWN0b3IoKSk7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCBhdmFpbGFibGUgKi8gfVxuXG4gICAgLy8gU2VjdXJpdHlUZWxlbWV0cnkgKGluc3RhbmNlKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZWxlbWV0cnkgPSB0aGlzLnJlc29sdmU8aW1wb3J0KCcuLi9zZWN1cml0eS90ZWxlbWV0cnkvU2VjdXJpdHlUZWxlbWV0cnkuanMnKS5TZWN1cml0eVRlbGVtZXRyeT4oJ1NlY3VyaXR5VGVsZW1ldHJ5Jyk7XG4gICAgICBtZXRyaWNzTWFuYWdlci5yZWdpc3RlckNvbGxlY3RvcihuZXcgU2VjdXJpdHlUZWxlbWV0cnlDb2xsZWN0b3IodGVsZW1ldHJ5KSk7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCByZWdpc3RlcmVkICovIH1cblxuICAgIC8vIEZpbGVMb2NrTWFuYWdlciAoaW5zdGFuY2UpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvY2tNYW5hZ2VyID0gdGhpcy5yZXNvbHZlPGltcG9ydCgnLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJykuRmlsZUxvY2tNYW5hZ2VyPignRmlsZUxvY2tNYW5hZ2VyJyk7XG4gICAgICBtZXRyaWNzTWFuYWdlci5yZWdpc3RlckNvbGxlY3RvcihuZXcgRmlsZUxvY2tNYW5hZ2VyQ29sbGVjdG9yKGxvY2tNYW5hZ2VyKSk7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCByZWdpc3RlcmVkICovIH1cblxuICAgIC8vIERlZmF1bHRFbGVtZW50UHJvdmlkZXIgKHN0YXRpYylcbiAgICB0cnkge1xuICAgICAgbWV0cmljc01hbmFnZXIucmVnaXN0ZXJDb2xsZWN0b3IobmV3IERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb2xsZWN0b3IoKSk7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCBhdmFpbGFibGUgKi8gfVxuXG4gICAgLy8gVHJpZ2dlck1ldHJpY3NUcmFja2VyIChpbnN0YW5jZSDigJQgY3JlYXRlZCBpbnNpZGUgRW5oYW5jZWRJbmRleE1hbmFnZXIgZmFjdG9yeSlcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW5oYW5jZWRJbmRleCA9IHRoaXMucmVzb2x2ZTxpbXBvcnQoJy4uL3BvcnRmb2xpby9FbmhhbmNlZEluZGV4TWFuYWdlci5qcycpLkVuaGFuY2VkSW5kZXhNYW5hZ2VyPignRW5oYW5jZWRJbmRleE1hbmFnZXInKTtcbiAgICAgIC8vIEVuaGFuY2VkSW5kZXhNYW5hZ2VyIGV4cG9zZXMgdHJhY2tlciB2aWEgcHVibGljIGdldHRlciBpZiBhdmFpbGFibGVcbiAgICAgIGlmICgndHJpZ2dlck1ldHJpY3NUcmFja2VyJyBpbiBlbmhhbmNlZEluZGV4KSB7XG4gICAgICAgIGNvbnN0IHRyYWNrZXIgPSAoZW5oYW5jZWRJbmRleCBhcyBhbnkpLnRyaWdnZXJNZXRyaWNzVHJhY2tlcjtcbiAgICAgICAgaWYgKHRyYWNrZXIpIHtcbiAgICAgICAgICBtZXRyaWNzTWFuYWdlci5yZWdpc3RlckNvbGxlY3RvcihuZXcgVHJpZ2dlck1ldHJpY3NUcmFja2VyQ29sbGVjdG9yKHRyYWNrZXIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggeyAvKiBub3QgcmVnaXN0ZXJlZCAqLyB9XG5cbiAgICAvLyBPcGVyYXRpb25hbFRlbGVtZXRyeSAoaW5zdGFuY2UpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wVGVsZW1ldHJ5ID0gdGhpcy5yZXNvbHZlPGltcG9ydCgnLi4vdGVsZW1ldHJ5L09wZXJhdGlvbmFsVGVsZW1ldHJ5LmpzJykuT3BlcmF0aW9uYWxUZWxlbWV0cnk+KCdPcGVyYXRpb25hbFRlbGVtZXRyeScpO1xuICAgICAgbWV0cmljc01hbmFnZXIucmVnaXN0ZXJDb2xsZWN0b3IobmV3IE9wZXJhdGlvbmFsVGVsZW1ldHJ5Q29sbGVjdG9yKG9wVGVsZW1ldHJ5KSk7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCByZWdpc3RlcmVkICovIH1cblxuICAgIC8vIE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyIChpbnN0YW5jZSlcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3BUcmFja2VyID0gdGhpcy5yZXNvbHZlPE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyPignT3BlcmF0aW9uTWV0cmljc1RyYWNrZXInKTtcbiAgICAgIG1ldHJpY3NNYW5hZ2VyLnJlZ2lzdGVyQ29sbGVjdG9yKG5ldyBPcGVyYXRpb25NZXRyaWNzQ29sbGVjdG9yKG9wVHJhY2tlcikpO1xuICAgIH0gY2F0Y2ggeyAvKiBub3QgcmVnaXN0ZXJlZCAqLyB9XG5cbiAgICAvLyBHYXRla2VlcGVyTWV0cmljc1RyYWNrZXIgKGluc3RhbmNlKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBna1RyYWNrZXIgPSB0aGlzLnJlc29sdmU8R2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyPignR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyJyk7XG4gICAgICBtZXRyaWNzTWFuYWdlci5yZWdpc3RlckNvbGxlY3RvcihuZXcgR2F0ZWtlZXBlck1ldHJpY3NDb2xsZWN0b3IoZ2tUcmFja2VyKSk7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCByZWdpc3RlcmVkICovIH1cbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdExydUNhY2hlc0Zvck1ldHJpY3MoKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGluc3RhbmNlOiBpbXBvcnQoJy4uL2NhY2hlL0xSVUNhY2hlLmpzJykuTFJVQ2FjaGU8dW5rbm93bj4gfT4ge1xuICAgIGNvbnN0IGNhY2hlczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGluc3RhbmNlOiBpbXBvcnQoJy4uL2NhY2hlL0xSVUNhY2hlLmpzJykuTFJVQ2FjaGU8dW5rbm93bj4gfT4gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYXBpQ2FjaGUgPSB0aGlzLnJlc29sdmU8eyBnZXRTdGF0cygpOiBpbXBvcnQoJy4uL2NhY2hlL0xSVUNhY2hlLmpzJykuQ2FjaGVTdGF0cyB9PignQVBJQ2FjaGUnKTtcbiAgICAgIGNhY2hlcy5wdXNoKHsgbmFtZTogJ0FQSUNhY2hlJywgaW5zdGFuY2U6IGFwaUNhY2hlIGFzIGFueSB9KTtcbiAgICB9IGNhdGNoIHsgLyogbm90IGF2YWlsYWJsZSAqLyB9XG5cbiAgICBjb25zdCBtYW5hZ2VyTmFtZXMgPSBbXG4gICAgICAnUGVyc29uYU1hbmFnZXInLCAnU2tpbGxNYW5hZ2VyJywgJ0FnZW50TWFuYWdlcicsXG4gICAgICAnTWVtb3J5TWFuYWdlcicsICdFbnNlbWJsZU1hbmFnZXInLCAnVGVtcGxhdGVNYW5hZ2VyJyxcbiAgICBdIGFzIGNvbnN0O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBtYW5hZ2VyTmFtZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1nciA9IHRoaXMucmVzb2x2ZTxpbXBvcnQoJy4uL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLmpzJykuQmFzZUVsZW1lbnRNYW5hZ2VyPGFueT4+KG5hbWUpO1xuICAgICAgICBjYWNoZXMucHVzaCguLi5tZ3IuZ2V0TWV0cmljc0NhY2hlcygpKTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBub3QgcmVnaXN0ZXJlZCAqLyB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhY2hlcztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENsb3NlIE1ldHJpY3NNYW5hZ2VyIGJlZm9yZSBnZW5lcmFsIGRpc3Bvc2FsIChmbHVzaCBmaW5hbCBzbmFwc2hvdClcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0cmljc01hbmFnZXIgPSB0aGlzLnJlc29sdmU8TWV0cmljc01hbmFnZXI+KCdNZXRyaWNzTWFuYWdlcicpO1xuICAgICAgYXdhaXQgbWV0cmljc01hbmFnZXIuY2xvc2UoKTtcbiAgICB9IGNhdGNoIHsgLyogbWV0cmljcyBub3QgZW5hYmxlZCBvciBub3QgcmVnaXN0ZXJlZCAqLyB9XG5cbiAgICAvLyBDbGVhbiB1cCBsb2cgaG9va3MgYmVmb3JlIGRpc3Bvc2luZyBzZXJ2aWNlc1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGVhbnVwcyA9IHRoaXMucmVzb2x2ZTwoKCkgPT4gdm9pZClbXT4oJ19sb2dIb29rQ2xlYW51cHMnKTtcbiAgICAgIGNsZWFudXBzLmZvckVhY2goZm4gPT4gZm4oKSk7XG4gICAgfSBjYXRjaCB7IC8qIGhvb2tzIG5vdCB5ZXQgd2lyZWQgKi8gfVxuXG4gICAgY29uc3QgZGlzcG9zYWxQcm9taXNlcyA9IHRoaXMuYnVpbGREaXNwb3NhbFByb21pc2VzKCk7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChkaXNwb3NhbFByb21pc2VzLm1hcChkID0+IGQucHJvbWlzZSkpO1xuICAgIHRoaXMucmVwb3J0RGlzcG9zYWxGYWlsdXJlcyhkaXNwb3NhbFByb21pc2VzLCByZXN1bHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREaXNwb3NhbFByb21pc2VzKCk6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBwcm9taXNlOiBQcm9taXNlPHZvaWQ+IH0+IHtcbiAgICBjb25zdCBwcm9taXNlczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHByb21pc2U6IFByb21pc2U8dm9pZD4gfT4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZXJ2aWNlXSBvZiB0aGlzLnNlcnZpY2VzKSB7XG4gICAgICBpZiAoIXNlcnZpY2UuaW5zdGFuY2UpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBzZXJ2aWNlLmluc3RhbmNlIGFzIGFueTtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKHsgbmFtZSwgcHJvbWlzZTogUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbnN0YW5jZS5kaXNwb3NlKCkpIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuY2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKHsgbmFtZSwgcHJvbWlzZTogUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbnN0YW5jZS5jbGVhbnVwKCkpIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZXM7XG4gIH1cblxuICBwcml2YXRlIHJlcG9ydERpc3Bvc2FsRmFpbHVyZXMoXG4gICAgZGlzcG9zYWxQcm9taXNlczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHByb21pc2U6IFByb21pc2U8dm9pZD4gfT4sXG4gICAgcmVzdWx0czogUHJvbWlzZVNldHRsZWRSZXN1bHQ8dm9pZD5bXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZmFpbHVyZXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHJlc3VsdF0gb2YgcmVzdWx0cy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gZGlzcG9zYWxQcm9taXNlc1tpbmRleF0ubmFtZTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZXN1bHQucmVhc29uIDogbmV3IEVycm9yKFN0cmluZyhyZXN1bHQucmVhc29uKSk7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goc2VydmljZU5hbWUpO1xuICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGRpc3Bvc2Ugc2VydmljZSAnJHtzZXJ2aWNlTmFtZX0nYCwgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBDb250YWluZXIgZGlzcG9zYWwgY29tcGxldGVkIHdpdGggJHtmYWlsdXJlcy5sZW5ndGh9IGZhaWx1cmUocykgb3V0IG9mICR7ZGlzcG9zYWxQcm9taXNlcy5sZW5ndGh9IHNlcnZpY2VzYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ29sbGVjdGlvbkNhY2hlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uQ2FjaGUgPSB0aGlzLnJlc29sdmU8Q29sbGVjdGlvbkNhY2hlPignQ29sbGVjdGlvbkNhY2hlJyk7XG4gICAgICBjb25zdCBpc0NhY2hlVmFsaWQgPSBhd2FpdCBjb2xsZWN0aW9uQ2FjaGUuaXNDYWNoZVZhbGlkKCk7XG4gICAgICBpZiAoIWlzQ2FjaGVWYWxpZCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcIkluaXRpYWxpemluZyBjb2xsZWN0aW9uIGNhY2hlIHdpdGggc2VlZCBkYXRhLi4uXCIpO1xuICAgICAgICBjb25zdCB7IENvbGxlY3Rpb25TZWVkZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NvbGxlY3Rpb24vQ29sbGVjdGlvblNlZWRlci5qc1wiKTtcbiAgICAgICAgY29uc3Qgc2VlZERhdGEgPSBDb2xsZWN0aW9uU2VlZGVyLmdldFNlZWREYXRhKCk7XG4gICAgICAgIGF3YWl0IGNvbGxlY3Rpb25DYWNoZS5zYXZlQ2FjaGUoc2VlZERhdGEpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgQ29sbGVjdGlvbiBjYWNoZSBpbml0aWFsaXplZCB3aXRoICR7c2VlZERhdGEubGVuZ3RofSBpdGVtc2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBjb2xsZWN0aW9uQ2FjaGUuZ2V0Q2FjaGVTdGF0cygpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYENvbGxlY3Rpb24gY2FjaGUgYWxyZWFkeSB2YWxpZCB3aXRoICR7c3RhdHMuaXRlbUNvdW50fSBpdGVtc2ApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoXCJEb2xsaG91c2VDb250YWluZXIuaW5pdGlhbGl6ZUNvbGxlY3Rpb25DYWNoZVwiLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG4iXX0=