@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.
- package/CHANGELOG.md +52 -61
- package/README.github.md +2 -2
- package/README.md +2 -2
- package/README.md.backup +284 -224
- package/README.npm.md +2 -2
- package/dist/cache/LRUCache.d.ts +3 -0
- package/dist/cache/LRUCache.d.ts.map +1 -1
- package/dist/cache/LRUCache.js +36 -26
- package/dist/config/env.d.ts +14 -4
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +20 -6
- package/dist/di/Container.d.ts +21 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +250 -53
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +5 -10
- package/dist/elements/base/BaseElementManager.d.ts +22 -0
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +47 -7
- package/dist/elements/memories/Memory.d.ts +1 -0
- package/dist/elements/memories/Memory.d.ts.map +1 -1
- package/dist/elements/memories/Memory.js +12 -8
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
- package/dist/elements/memories/MemoryManager.js +23 -42
- package/dist/elements/memories/MemorySearchIndex.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/handlers/EnhancedIndexHandler.js +6 -6
- package/dist/handlers/element-crud/listElements.d.ts +2 -0
- package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
- package/dist/handlers/element-crud/listElements.js +3 -1
- package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
- package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
- package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/logging/LogHooks.js +11 -11
- package/dist/logging/LogManager.d.ts +0 -2
- package/dist/logging/LogManager.d.ts.map +1 -1
- package/dist/logging/LogManager.js +1 -3
- package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
- package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
- package/dist/logging/sinks/MemoryLogSink.js +12 -3
- package/dist/logging/types.d.ts +0 -2
- package/dist/logging/types.d.ts.map +1 -1
- package/dist/logging/types.js +1 -1
- package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
- package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
- package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
- package/dist/metrics/MetricsManager.d.ts +47 -0
- package/dist/metrics/MetricsManager.d.ts.map +1 -0
- package/dist/metrics/MetricsManager.js +232 -0
- package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
- package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
- package/dist/metrics/OperationMetricsTracker.js +53 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
- package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
- package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
- package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
- package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
- package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
- package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
- package/dist/metrics/collectors/index.d.ts +11 -0
- package/dist/metrics/collectors/index.d.ts.map +1 -0
- package/dist/metrics/collectors/index.js +11 -0
- package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
- package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
- package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
- package/dist/metrics/types.d.ts +98 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +24 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +1 -7
- package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
- package/dist/portfolio/EnhancedIndexManager.js +18 -18
- package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
- package/dist/portfolio/NLPScoringManager.js +5 -9
- package/dist/portfolio/PortfolioIndexManager.js +2 -2
- package/dist/portfolio/RelationshipManager.js +2 -2
- package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
- package/dist/portfolio/VerbTriggerManager.js +5 -19
- package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
- package/dist/portfolio/config/IndexConfig.js +1 -12
- package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
- package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
- package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
- package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
- package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
- package/dist/portfolio/types/RelationshipTypes.js +3 -17
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +36 -8
- package/dist/security/constants.d.ts.map +1 -1
- package/dist/security/constants.js +10 -6
- package/dist/security/fileLockManager.d.ts.map +1 -1
- package/dist/security/fileLockManager.js +8 -6
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +1 -13
- package/dist/security/securityMonitor.d.ts +2 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +14 -3
- package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
- package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
- package/dist/security/telemetry/SecurityTelemetry.js +30 -2
- package/dist/security/tokenManager.d.ts +3 -0
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +13 -5
- package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
- package/dist/security/validation/BackgroundValidator.js +7 -7
- package/dist/server/startup.d.ts.map +1 -1
- package/dist/server/startup.js +8 -24
- package/dist/server/tools/MCPAQLTools.js +4 -1
- package/dist/services/ActivationStore.d.ts.map +1 -1
- package/dist/services/ActivationStore.js +9 -3
- package/dist/services/FileWatchService.d.ts +1 -0
- package/dist/services/FileWatchService.d.ts.map +1 -1
- package/dist/services/FileWatchService.js +83 -48
- package/dist/services/MetadataService.d.ts.map +1 -1
- package/dist/services/MetadataService.js +7 -2
- package/dist/services/query/ElementQueryService.d.ts.map +1 -1
- package/dist/services/query/ElementQueryService.js +1 -41
- package/dist/services/query/PaginationService.d.ts.map +1 -1
- package/dist/services/query/PaginationService.js +1 -14
- package/dist/services/query/SortService.d.ts.map +1 -1
- package/dist/services/query/SortService.js +1 -6
- package/dist/services/validation/ValidationService.d.ts.map +1 -1
- package/dist/services/validation/ValidationService.js +3 -8
- package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
- package/dist/storage/ElementStorageLayer.js +5 -2
- package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
- package/dist/storage/MemoryStorageLayer.js +5 -2
- package/dist/telemetry/OperationalTelemetry.js +2 -2
- package/dist/utils/EventDeduplicator.d.ts +44 -0
- package/dist/utils/EventDeduplicator.d.ts.map +1 -0
- package/dist/utils/EventDeduplicator.js +93 -0
- package/dist/utils/FileLock.d.ts.map +1 -1
- package/dist/utils/FileLock.js +1 -9
- package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
- package/dist/utils/PerformanceMonitor.js +5 -5
- package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
- package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
- package/dist/utils/SlidingWindowRateLimiter.js +23 -0
- package/dist/web/console/IngestRoutes.d.ts +84 -0
- package/dist/web/console/IngestRoutes.d.ts.map +1 -0
- package/dist/web/console/IngestRoutes.js +252 -0
- package/dist/web/console/LeaderElection.d.ts +89 -0
- package/dist/web/console/LeaderElection.d.ts.map +1 -0
- package/dist/web/console/LeaderElection.js +205 -0
- package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
- package/dist/web/console/LeaderForwardingSink.js +197 -0
- package/dist/web/console/SessionNames.d.ts +46 -0
- package/dist/web/console/SessionNames.d.ts.map +1 -0
- package/dist/web/console/SessionNames.js +257 -0
- package/dist/web/console/UnifiedConsole.d.ts +64 -0
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
- package/dist/web/console/UnifiedConsole.js +119 -0
- package/dist/web/contentPipeline.d.ts +58 -0
- package/dist/web/contentPipeline.d.ts.map +1 -0
- package/dist/web/contentPipeline.js +112 -0
- package/dist/web/portDiscovery.d.ts +58 -0
- package/dist/web/portDiscovery.d.ts.map +1 -0
- package/dist/web/portDiscovery.js +143 -0
- package/dist/web/public/app.js +148 -60
- package/dist/web/public/logs.js +638 -0
- package/dist/web/public/metrics.js +682 -0
- package/dist/web/public/permissions.js +394 -0
- package/dist/web/public/sessions.js +369 -0
- package/dist/web/routes/healthRoutes.d.ts +16 -0
- package/dist/web/routes/healthRoutes.d.ts.map +1 -0
- package/dist/web/routes/healthRoutes.js +29 -0
- package/dist/web/routes/logRoutes.d.ts +18 -0
- package/dist/web/routes/logRoutes.d.ts.map +1 -0
- package/dist/web/routes/logRoutes.js +126 -0
- package/dist/web/routes/metricsRoutes.d.ts +17 -0
- package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
- package/dist/web/routes/metricsRoutes.js +90 -0
- package/dist/web/routes/permissionRoutes.d.ts +16 -0
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
- package/dist/web/routes/permissionRoutes.js +133 -0
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +309 -339
- package/dist/web/server.d.ts +21 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +42 -4
- package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
- package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
- package/dist/web/sinks/WebSSELogSink.js +22 -0
- package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
- package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
- package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
- package/package.json +2 -2
- package/server.json +2 -2
- package/dist/constants/version.d.ts +0 -3
- package/dist/constants/version.d.ts.map +0 -1
- package/dist/constants/version.js +0 -4
- package/dist/logging/sinks/SSELogSink.d.ts +0 -35
- package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
- package/dist/logging/sinks/SSELogSink.js +0 -181
- package/dist/logging/viewer/viewerHtml.d.ts +0 -8
- package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
- package/dist/logging/viewer/viewerHtml.js +0 -204
- package/dist/web/public/public/app.js +0 -1878
|
@@ -104,13 +104,11 @@ export class BackgroundValidator {
|
|
|
104
104
|
}
|
|
105
105
|
this.isProcessing = true;
|
|
106
106
|
try {
|
|
107
|
-
logger.debug('Starting validation pass');
|
|
108
107
|
// PHASE 1 INCOMPLETE: Memory discovery integration pending
|
|
109
108
|
// Issue #1314 Phase 1 - This will be connected to Memory loading system
|
|
110
109
|
// in a follow-up PR once Memory.find() API is available
|
|
111
110
|
const untrustedMemories = await this.findMemoriesWithUntrustedEntries();
|
|
112
111
|
if (untrustedMemories.length === 0) {
|
|
113
|
-
logger.debug('No untrusted memories found');
|
|
114
112
|
return;
|
|
115
113
|
}
|
|
116
114
|
logger.info('Found untrusted memories to validate', {
|
|
@@ -153,10 +151,12 @@ export class BackgroundValidator {
|
|
|
153
151
|
}
|
|
154
152
|
}
|
|
155
153
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
154
|
+
if (untrustedMemories.length > 0) {
|
|
155
|
+
logger.debug('Found memories with untrusted entries', {
|
|
156
|
+
count: untrustedMemories.length,
|
|
157
|
+
limit
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
160
|
return untrustedMemories;
|
|
161
161
|
}
|
|
162
162
|
/**
|
|
@@ -318,4 +318,4 @@ export class BackgroundValidator {
|
|
|
318
318
|
logger.debug('BackgroundValidator disposed');
|
|
319
319
|
}
|
|
320
320
|
}
|
|
321
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFja2dyb3VuZFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZWN1cml0eS92YWxpZGF0aW9uL0JhY2tncm91bmRWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFnQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQXFCcEU7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBOEI7SUFDaEQsT0FBTyxFQUFFLElBQUk7SUFDYixlQUFlLEVBQUUsR0FBRyxFQUFHLFlBQVk7SUFDbkMsU0FBUyxFQUFFLEVBQUU7SUFDYixtQkFBbUIsRUFBRSxJQUFJO0NBQzFCLENBQUM7QUFrQ0Y7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQU1YO0lBQ0E7SUFORixNQUFNLENBQTRCO0lBQzNDLGNBQWMsQ0FBa0I7SUFDaEMsWUFBWSxHQUFZLEtBQUssQ0FBQztJQUV0QyxZQUNtQixnQkFBa0MsRUFDbEMsYUFBa0IsRUFBRSxxREFBcUQ7SUFDMUYsTUFBMkM7UUFGMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxrQkFBYSxHQUFiLGFBQWEsQ0FBSztRQUduQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxjQUFjLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFO1lBQzdDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87WUFDNUIsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZTtZQUM1QyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FB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b3J5IFNlY3VyaXR5XG4gKlxuICogUGFydCBvZiBJc3N1ZSAjMTMxNCBQaGFzZSAxOiBNZW1vcnkgU2VjdXJpdHkgQXJjaGl0ZWN0dXJlXG4gKlxuICogUFVSUE9TRTpcbiAqIEFzeW5jaHJvbm91c2x5IHZhbGlkYXRlcyBVTlRSVVNURUQgbWVtb3J5IGVudHJpZXMgYW5kIHVwZGF0ZXMgdGhlaXIgdHJ1c3QgbGV2ZWxzXG4gKiB3aXRob3V0IGJsb2NraW5nIG1lbW9yeSBjcmVhdGlvbi4gUnVucyBvdXRzaWRlIHRoZSBMTE0gcmVxdWVzdCBwYXRoIHRvIGF2b2lkXG4gKiB0b2tlbiBjb3N0cyBhbmQgbGF0ZW5jeS5cbiAqXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiAtIExheWVyIDIgaW4gdGhlIE1lbW9yeSBTZWN1cml0eSBBcmNoaXRlY3R1cmUgKHNlZSBkb2NzL2RldmVsb3BtZW50L01FTU9SWV9TRUNVUklUWV9BUkNISVRFQ1RVUkUubWQpXG4gKiAtIFJ1bnMgc2VydmVyLXNpZGUsIG5vdCBpbiBMTE0gY29udGV4dFxuICogLSBObyB0b2tlbiBjb3N0IGZvciB2YWxpZGF0aW9uXG4gKiAtIFVwZGF0ZXMgdHJ1c3QgbGV2ZWxzIGluLXBsYWNlXG4gKlxuICogVFJVU1QgTEVWRUwgVFJBTlNJVElPTlM6XG4gKiBVTlRSVVNURUQg4oaSIFZBTElEQVRFRCAoY2xlYW4gY29udGVudCwgbm8gcGF0dGVybnMpXG4gKiBVTlRSVVNURUQg4oaSIEZMQUdHRUQgKGRhbmdlcm91cyBwYXR0ZXJucyBkZXRlY3RlZCwgbmVlZHMgZW5jcnlwdGlvbilcbiAqIFVOVFJVU1RFRCDihpIgUVVBUkFOVElORUQgKGV4cGxpY2l0bHkgbWFsaWNpb3VzLCBjcml0aWNhbCB0aHJlYXQpXG4gKlxuICogQG1vZHVsZSBCYWNrZ3JvdW5kVmFsaWRhdG9yXG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IsIHR5cGUgQ29udGVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFRSVVNUX0xFVkVMUyB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBQYXR0ZXJuRXh0cmFjdG9yIH0gZnJvbSAnLi9QYXR0ZXJuRXh0cmFjdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5LmpzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gYmVoYXZpb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYWNrZ3JvdW5kVmFsaWRhdG9yQ29uZmlnIHtcbiAgLyoqIEVuYWJsZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqIEludGVydmFsIGluIHNlY29uZHMgYmV0d2VlbiB2YWxpZGF0aW9uIHJ1bnMgKGRlZmF1bHQ6IDMwMCA9IDUgbWludXRlcykgKi9cbiAgaW50ZXJ2YWxTZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIG1lbW9yaWVzIHRvIHByb2Nlc3MgcGVyIGJhdGNoIChkZWZhdWx0OiAxMCkgKi9cbiAgYmF0Y2hTaXplOiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gdGltZSBpbiBtcyBmb3IgYSBzaW5nbGUgdmFsaWRhdGlvbiBvcGVyYXRpb24gKGRlZmF1bHQ6IDUwMDApICovXG4gIHZhbGlkYXRpb25UaW1lb3V0TXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGJhY2tncm91bmQgdmFsaWRhdGlvblxuICovXG5jb25zdCBERUZBVUxUX0NPTkZJRzogQmFja2dyb3VuZFZhbGlkYXRvckNvbmZpZyA9IHtcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgaW50ZXJ2YWxTZWNvbmRzOiAzMDAsICAvLyA1IG1pbnV0ZXNcbiAgYmF0Y2hTaXplOiAxMCxcbiAgdmFsaWRhdGlvblRpbWVvdXRNczogNTAwMCxcbn07XG5cbi8qKlxuICogUGF0dGVybiBpbmZvcm1hdGlvbiBmb3IgZW5jcnlwdGVkIHN0b3JhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5pdGl6ZWRQYXR0ZXJuIHtcbiAgLyoqIFVuaXF1ZSByZWZlcmVuY2UgSUQgZm9yIHRoaXMgcGF0dGVybiAqL1xuICByZWY6IHN0cmluZztcblxuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHBhdHRlcm4gKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKiogU2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIHBhdHRlcm4gKi9cbiAgc2V2ZXJpdHk6ICdjcml0aWNhbCcgfCAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnO1xuXG4gIC8qKiBMb2NhdGlvbiBpbiBvcmlnaW5hbCBjb250ZW50IChvZmZzZXQgYW5kIGxlbmd0aCkgKi9cbiAgbG9jYXRpb246IHN0cmluZztcblxuICAvKiogRW5jcnlwdGVkIHBhdHRlcm4gKEFFUy0yNTYtR0NNKSAtIFBoYXNlIDIgKi9cbiAgZW5jcnlwdGVkUGF0dGVybj86IHN0cmluZztcblxuICAvKiogRW5jcnlwdGlvbiBhbGdvcml0aG0gdXNlZCAtIFBoYXNlIDIgKi9cbiAgYWxnb3JpdGhtPzogc3RyaW5nO1xuXG4gIC8qKiBJbml0aWFsaXphdGlvbiB2ZWN0b3IgZm9yIGRlY3J5cHRpb24gLSBQaGFzZSAyICovXG4gIGl2Pzogc3RyaW5nO1xuXG4gIC8qKiBHQ00gYXV0aGVudGljYXRpb24gdGFnIGZvciBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uIC0gUGhhc2UgMiAqL1xuICBhdXRoVGFnPzogc3RyaW5nO1xuXG4gIC8qKiBTYWZldHkgaW5zdHJ1Y3Rpb24gZm9yIHBhdHRlcm4gdXNhZ2UgKi9cbiAgc2FmZXR5SW5zdHJ1Y3Rpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBCYWNrZ3JvdW5kIHZhbGlkYXRpb24gc2VydmljZSBmb3IgbWVtb3J5IGVudHJpZXNcbiAqXG4gKiBUaGlzIHNlcnZpY2UgcnVucyBvdXRzaWRlIHRoZSBMTE0gcmVxdWVzdCBwYXRoIHRvIHZhbGlkYXRlIFVOVFJVU1RFRFxuICogbWVtb3J5IGVudHJpZXMgYW5kIHVwZGF0ZSB0aGVpciB0cnVzdCBsZXZlbHMgYmFzZWQgb24gc2VjdXJpdHkgYW5hbHlzaXMuXG4gKlxuICogUkVGQUNUT1IgTk9URTpcbiAqIENvbnZlcnRlZCB0byBmdWxsIERJIGFyY2hpdGVjdHVyZS4gUmVtb3ZlZCBzaW5nbGV0b24gZXhwb3J0LlxuICogUGF0dGVybkV4dHJhY3RvciBpcyBub3cgaW5qZWN0ZWQgYXMgYSBkZXBlbmRlbmN5IGluc3RlYWQgb2Ygc3RhdGljIGNhbGxzLlxuICovXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZFZhbGlkYXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBCYWNrZ3JvdW5kVmFsaWRhdG9yQ29uZmlnO1xuICBwcml2YXRlIGludGVydmFsSGFuZGxlPzogTm9kZUpTLlRpbWVvdXQ7XG4gIHByaXZhdGUgaXNQcm9jZXNzaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXR0ZXJuRXh0cmFjdG9yOiBQYXR0ZXJuRXh0cmFjdG9yLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVtb3J5TWFuYWdlcjogYW55LCAvLyBNZW1vcnlNYW5hZ2VyIC0gdXNpbmcgYW55IHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydFxuICAgIGNvbmZpZz86IFBhcnRpYWw8QmFja2dyb3VuZFZhbGlkYXRvckNvbmZpZz5cbiAgKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfQ09ORklHLCAuLi5jb25maWcgfTtcbiAgICBsb2dnZXIuaW5mbygnQmFja2dyb3VuZFZhbGlkYXRvciBpbml0aWFsaXplZCcsIHtcbiAgICAgIGVuYWJsZWQ6IHRoaXMuY29uZmlnLmVuYWJsZWQsXG4gICAgICBpbnRlcnZhbFNlY29uZHM6IHRoaXMuY29uZmlnLmludGVydmFsU2Vjb25kcyxcbiAgICAgIGJhdGNoU2l6ZTogdGhpcy5jb25maWcuYmF0Y2hTaXplLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gc2VydmljZVxuICAgKiBCZWdpbnMgcGVyaW9kaWMgdmFsaWRhdGlvbiBvZiBVTlRSVVNURUQgbWVtb3JpZXNcbiAgICovXG4gIHN0YXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcuZW5hYmxlZCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ0JhY2tncm91bmQgdmFsaWRhdGlvbiBkaXNhYmxlZCBpbiBjb25maWcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnRlcnZhbEhhbmRsZSkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0JhY2tncm91bmQgdmFsaWRhdGlvbiBhbHJlYWR5IHJ1bm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbygnU3RhcnRpbmcgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHNlcnZpY2UnLCB7XG4gICAgICBpbnRlcnZhbFNlY29uZHM6IHRoaXMuY29uZmlnLmludGVydmFsU2Vjb25kcyxcbiAgICB9KTtcblxuICAgIC8vIFJ1biBpbW1lZGlhdGVseSBvbiBzdGFydFxuICAgIHZvaWQgdGhpcy5wcm9jZXNzVW50cnVzdGVkTWVtb3JpZXMoKTtcblxuICAgIC8vIFRoZW4gcnVuIHBlcmlvZGljYWxseVxuICAgIHRoaXMuaW50ZXJ2YWxIYW5kbGUgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB2b2lkIHRoaXMucHJvY2Vzc1VudHJ1c3RlZE1lbW9yaWVzKCk7XG4gICAgfSwgdGhpcy5jb25maWcuaW50ZXJ2YWxTZWNvbmRzICogMTAwMCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHNlcnZpY2VcbiAgICovXG4gIHN0b3AoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJ2YWxIYW5kbGUpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbEhhbmRsZSk7XG4gICAgICB0aGlzLmludGVydmFsSGFuZGxlID0gdW5kZWZpbmVkO1xuICAgICAgbG9nZ2VyLmluZm8oJ0JhY2tncm91bmQgdmFsaWRhdGlvbiBzZXJ2aWNlIHN0b3BwZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhbGwgVU5UUlVTVEVEIG1lbW9yeSBlbnRyaWVzXG4gICAqIFRoaXMgaXMgdGhlIG1haW4gYmFja2dyb3VuZCB2YWxpZGF0aW9uIGxvb3BcbiAgICovXG4gIGFzeW5jIHByb2Nlc3NVbnRydXN0ZWRNZW1vcmllcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmcpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnVmFsaWRhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzLCBza2lwcGluZyB0aGlzIHJ1bicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIHZhbGlkYXRpb24gcGFzcycpO1xuXG4gICAgICAvLyBQSEFTRSAxIElOQ09NUExFVEU6IE1lbW9yeSBkaXNjb3ZlcnkgaW50ZWdyYXRpb24gcGVuZGluZ1xuICAgICAgLy8gSXNzdWUgIzEzMTQgUGhhc2UgMSAtIFRoaXMgd2lsbCBiZSBjb25uZWN0ZWQgdG8gTWVtb3J5IGxvYWRpbmcgc3lzdGVtXG4gICAgICAvLyBpbiBhIGZvbGxvdy11cCBQUiBvbmNlIE1lbW9yeS5maW5kKCkgQVBJIGlzIGF2YWlsYWJsZVxuICAgICAgY29uc3QgdW50cnVzdGVkTWVtb3JpZXMgPSBhd2FpdCB0aGlzLmZpbmRNZW1vcmllc1dpdGhVbnRydXN0ZWRFbnRyaWVzKCk7XG5cbiAgICAgIGlmICh1bnRydXN0ZWRNZW1vcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdObyB1bnRydXN0ZWQgbWVtb3JpZXMgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnRm91bmQgdW50cnVzdGVkIG1lbW9yaWVzIHRvIHZhbGlkYXRlJywge1xuICAgICAgICBjb3VudDogdW50cnVzdGVkTWVtb3JpZXMubGVuZ3RoLFxuICAgICAgICBiYXRjaFNpemU6IHRoaXMuY29uZmlnLmJhdGNoU2l6ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm9jZXNzIGluIGJhdGNoZXNcbiAgICAgIGNvbnN0IGJhdGNoZXMgPSB0aGlzLmNyZWF0ZUJhdGNoZXModW50cnVzdGVkTWVtb3JpZXMsIHRoaXMuY29uZmlnLmJhdGNoU2l6ZSk7XG5cbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgYmF0Y2hlcykge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NCYXRjaChiYXRjaCk7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdWYWxpZGF0aW9uIHBhc3MgY29tcGxldGUnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgYmFja2dyb3VuZCB2YWxpZGF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbGwgbWVtb3JpZXMgdGhhdCBoYXZlIFVOVFJVU1RFRCBlbnRyaWVzXG4gICAqXG4gICAqIERJIFJFRkFDVE9SOiBVc2UgaW5qZWN0ZWQgTWVtb3J5TWFuYWdlciBpbnN0ZWFkIG9mIHN0YXRpYyBNZW1vcnkgbWV0aG9kc1xuICAgKiBMb2FkcyBtZW1vcmllcyBmcm9tIGZpbGVzeXN0ZW0gYW5kIGZpbHRlcnMgYnkgdHJ1c3QgbGV2ZWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZE1lbW9yaWVzV2l0aFVudHJ1c3RlZEVudHJpZXMoKTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIC8vIExvYWQgYWxsIG1lbW9yaWVzIHVzaW5nIHRoZSBpbmplY3RlZCBNZW1vcnlNYW5hZ2VyXG4gICAgY29uc3QgYWxsTWVtb3JpZXMgPSBhd2FpdCB0aGlzLm1lbW9yeU1hbmFnZXIubGlzdCgpO1xuXG4gICAgLy8gRmlsdGVyIHRvIG9ubHkgbWVtb3JpZXMgd2l0aCBVTlRSVVNURUQgZW50cmllc1xuICAgIGNvbnN0IHVudHJ1c3RlZE1lbW9yaWVzOiBNZW1vcnlbXSA9IFtdO1xuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5jb25maWcuYmF0Y2hTaXplICogMTA7XG5cbiAgICBmb3IgKGNvbnN0IG1lbW9yeSBvZiBhbGxNZW1vcmllcykge1xuICAgICAgY29uc3QgaGFzVW50cnVzdGVkRW50cmllcyA9IG1lbW9yeS5nZXRFbnRyaWVzQnlUcnVzdExldmVsKFRSVVNUX0xFVkVMUy5VTlRSVVNURUQpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzVW50cnVzdGVkRW50cmllcykge1xuICAgICAgICB1bnRydXN0ZWRNZW1vcmllcy5wdXNoKG1lbW9yeSk7XG5cbiAgICAgICAgLy8gQXBwbHkgbGltaXRcbiAgICAgICAgaWYgKHVudHJ1c3RlZE1lbW9yaWVzLmxlbmd0aCA+PSBsaW1pdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBtZW1vcmllcyB3aXRoIHVudHJ1c3RlZCBlbnRyaWVzJywge1xuICAgICAgY291bnQ6IHVudHJ1c3RlZE1lbW9yaWVzLmxlbmd0aCxcbiAgICAgIGxpbWl0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdW50cnVzdGVkTWVtb3JpZXM7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhIGJhdGNoIG9mIG1lbW9yaWVzIGZvciB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NCYXRjaChtZW1vcmllczogTWVtb3J5W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoJ1Byb2Nlc3NpbmcgYmF0Y2gnLCB7IHNpemU6IG1lbW9yaWVzLmxlbmd0aCB9KTtcblxuICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIG1lbW9yaWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTWVtb3J5KG1lbW9yeSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIHZhbGlkYXRpbmcgbWVtb3J5Jywge1xuICAgICAgICAgIG1lbW9yeUlkOiBtZW1vcnkuaWQsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbGwgVU5UUlVTVEVEIGVudHJpZXMgaW4gYSBtZW1vcnlcbiAgICogRklYICMxMzIwOiBOb3cgdXNlcyBwdWJsaWMgTWVtb3J5IEFQSSBhbmQgc2F2ZXMgY2hhbmdlc1xuICAgKiBGSVggKENsYXVkZSBCb3QgUmV2aWV3KTogUmVtb3ZlZCB0eXBlIGNhc3RpbmcgZm9yIG1lbW9yeS5pZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZU1lbW9yeShtZW1vcnk6IE1lbW9yeSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5kZWJ1ZygnVmFsaWRhdGluZyBtZW1vcnknLCB7IG1lbW9yeUlkOiBtZW1vcnkuaWQgfSk7XG5cbiAgICBsZXQgdXBkYXRlZENvdW50ID0gMDtcblxuICAgIC8vIEZJWCAjMTMyMDogVXNlIHB1YmxpYyBBUEkgaW5zdGVhZCBvZiBjYXN0aW5nIHRvIGFueVxuICAgIGNvbnN0IGVudHJpZXMgPSBtZW1vcnkuZ2V0RW50cmllc0J5VHJ1c3RMZXZlbChUUlVTVF9MRVZFTFMuVU5UUlVTVEVEKTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMudmFsaWRhdGVFbnRyeShlbnRyeSk7XG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgdXBkYXRlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgdmFsaWRhdGluZyBlbnRyeScsIHtcbiAgICAgICAgICBlbnRyeUlkOiBlbnRyeS5pZCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZWRDb3VudCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdVcGRhdGVkIHRydXN0IGxldmVscyBpbiBtZW1vcnknLCB7XG4gICAgICAgIG1lbW9yeUlkOiBtZW1vcnkuaWQsXG4gICAgICAgIHVwZGF0ZWRDb3VudCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBESSBSRUZBQ1RPUjogVXNlIGluamVjdGVkIE1lbW9yeU1hbmFnZXIgdG8gc2F2ZVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5tZW1vcnlNYW5hZ2VyLnNhdmUobWVtb3J5KTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdNZW1vcnkgc2F2ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICAgIG1lbW9yeUlkOiBtZW1vcnkuaWRcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBzYXZlIG1lbW9yeSBhZnRlciB2YWxpZGF0aW9uJywge1xuICAgICAgICAgIG1lbW9yeUlkOiBtZW1vcnkuaWQsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIERvbid0IHRocm93IC0gY29udGludWUgd2l0aCBvdGhlciBtZW1vcmllc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIHNpbmdsZSBtZW1vcnkgZW50cnkgYW5kIHVwZGF0ZSBpdHMgdHJ1c3QgbGV2ZWxcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5IC0gVGhlIG1lbW9yeSBlbnRyeSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBlbnRyeSB3YXMgdXBkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRW50cnkoZW50cnk6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxvZ2dlci5kZWJ1ZygnVmFsaWRhdGluZyBlbnRyeScsIHsgZW50cnlJZDogZW50cnkuaWQgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBjb250ZW50IHVzaW5nIENvbnRlbnRWYWxpZGF0b3JcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGVudHJ5LmNvbnRlbnQsIHtcbiAgICAgIHNraXBTaXplQ2hlY2s6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBEZXRlcm1pbmUgbmV3IHRydXN0IGxldmVsIGJhc2VkIG9uIHZhbGlkYXRpb24gcmVzdWx0c1xuICAgIGNvbnN0IG5ld1RydXN0TGV2ZWwgPSB0aGlzLmRldGVybWluZVRydXN0TGV2ZWwodmFsaWRhdGlvblJlc3VsdCk7XG5cbiAgICBpZiAobmV3VHJ1c3RMZXZlbCA9PT0gZW50cnkudHJ1c3RMZXZlbCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdUcnVzdCBsZXZlbCB1bmNoYW5nZWQnLCB7XG4gICAgICAgIGVudHJ5SWQ6IGVudHJ5LmlkLFxuICAgICAgICB0cnVzdExldmVsOiBlbnRyeS50cnVzdExldmVsLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRydXN0IGxldmVsXG4gICAgZW50cnkudHJ1c3RMZXZlbCA9IG5ld1RydXN0TGV2ZWw7XG5cbiAgICBsb2dnZXIuaW5mbygnVXBkYXRlZCBlbnRyeSB0cnVzdCBsZXZlbCcsIHtcbiAgICAgIGVudHJ5SWQ6IGVudHJ5LmlkLFxuICAgICAgb2xkVHJ1c3RMZXZlbDogVFJVU1RfTEVWRUxTLlVOVFJVU1RFRCxcbiAgICAgIG5ld1RydXN0TGV2ZWwsXG4gICAgICBkZXRlY3RlZFBhdHRlcm5zOiB2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnM/Lmxlbmd0aCB8fCAwLFxuICAgIH0pO1xuXG4gICAgLy8gSWYgRkxBR0dFRCwgZXh0cmFjdCBwYXR0ZXJucyBhbmQgY3JlYXRlIHNhbml0aXplZCBjb250ZW50XG4gICAgaWYgKG5ld1RydXN0TGV2ZWwgPT09IFRSVVNUX0xFVkVMUy5GTEFHR0VEKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0VudHJ5IGZsYWdnZWQsIGV4dHJhY3RpbmcgcGF0dGVybnMnLCB7XG4gICAgICAgIGVudHJ5SWQ6IGVudHJ5LmlkLFxuICAgICAgICBwYXR0ZXJuczogdmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFBoYXNlIDE6IEV4dHJhY3QgcGF0dGVybnMgYW5kIGNyZWF0ZSBzYW5pdGl6ZWQgY29udGVudFxuICAgICAgY29uc3QgZXh0cmFjdGlvblJlc3VsdCA9IHRoaXMucGF0dGVybkV4dHJhY3Rvci5leHRyYWN0UGF0dGVybnMoXG4gICAgICAgIGVudHJ5LmNvbnRlbnQsXG4gICAgICAgIHZhbGlkYXRpb25SZXN1bHRcbiAgICAgICk7XG5cbiAgICAgIC8vIFN0b3JlIHNhbml0aXplZCBwYXR0ZXJucyBhbmQgY29udGVudCBpbiBlbnRyeSBtZXRhZGF0YVxuICAgICAgLy8gUGhhc2UgMiB3aWxsIGFkZCBlbmNyeXB0aW9uIHRvIHRoZXNlIHBhdHRlcm5zXG4gICAgICBlbnRyeS5zYW5pdGl6ZWRQYXR0ZXJucyA9IGV4dHJhY3Rpb25SZXN1bHQucGF0dGVybnM7XG4gICAgICBlbnRyeS5zYW5pdGl6ZWRDb250ZW50ID0gZXh0cmFjdGlvblJlc3VsdC5zYW5pdGl6ZWRDb250ZW50O1xuXG4gICAgICBsb2dnZXIuaW5mbygnUGF0dGVybnMgZXh0cmFjdGVkIGZyb20gZW50cnknLCB7XG4gICAgICAgIGVudHJ5SWQ6IGVudHJ5LmlkLFxuICAgICAgICBwYXR0ZXJuQ291bnQ6IGV4dHJhY3Rpb25SZXN1bHQucGF0dGVybkNvdW50LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSB0cnVzdCBsZXZlbCBiYXNlZCBvbiB2YWxpZGF0aW9uIHJlc3VsdHNcbiAgICovXG4gIHByaXZhdGUgZGV0ZXJtaW5lVHJ1c3RMZXZlbCh2YWxpZGF0aW9uUmVzdWx0OiBDb250ZW50VmFsaWRhdGlvblJlc3VsdCk6IHN0cmluZyB7XG4gICAgLy8gSWYgdmFsaWRhdGlvbiBwYXNzZWQgd2l0aCBubyBwYXR0ZXJucywgbWFyayBhcyBWQUxJREFURURcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkICYmICghdmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zIHx8IHZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucy5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm4gVFJVU1RfTEVWRUxTLlZBTElEQVRFRDtcbiAgICB9XG5cbiAgICAvLyBJZiBjcml0aWNhbC9oaWdoIHNldmVyaXR5IHRocmVhdHMgZGV0ZWN0ZWQsIG1hcmsgYXMgRkxBR0dFRFxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnIHx8IHZhbGlkYXRpb25SZXN1bHQuc2V2ZXJpdHkgPT09ICdoaWdoJykge1xuICAgICAgLy8gUEhBU0UgMSBJTkNPTVBMRVRFOiBRVUFSQU5USU5FRCB0cnVzdCBsZXZlbCBsb2dpYyBkZWZlcnJlZCAoSXNzdWUgIzEzMTQpXG4gICAgICAvLyBXaWxsIGFkZCBkaXN0aW5jdGlvbiBiZXR3ZWVuIEZMQUdHRUQgKGRhbmdlcm91cykgdnMgUVVBUkFOVElORUQgKG1hbGljaW91cylcbiAgICAgIC8vIEZvciBub3csIGFsbCBoaWdoL2NyaXRpY2FsIHNldmVyaXR5IGdvZXMgdG8gRkxBR0dFRFxuICAgICAgcmV0dXJuIFRSVVNUX0xFVkVMUy5GTEFHR0VEO1xuICAgIH1cblxuICAgIC8vIE1lZGl1bS9sb3cgc2V2ZXJpdHkgb3IgbWlub3IgaXNzdWVzIC0ga2VlcCBhcyBVTlRSVVNURUQgZm9yIG5vd1xuICAgIC8vIChDb3VsZCBiZSBWQUxJREFURUQgaW4gYSBtb3JlIGxlbmllbnQgcG9saWN5KVxuICAgIHJldHVybiBUUlVTVF9MRVZFTFMuVU5UUlVTVEVEO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IGFuIGFycmF5IGludG8gYmF0Y2hlcyBvZiBzcGVjaWZpZWQgc2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVCYXRjaGVzPFQ+KGl0ZW1zOiBUW10sIGJhdGNoU2l6ZTogbnVtYmVyKTogVFtdW10ge1xuICAgIGNvbnN0IGJhdGNoZXM6IFRbXVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICBiYXRjaGVzLnB1c2goaXRlbXMuc2xpY2UoaSwgaSArIGJhdGNoU2l6ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYmF0Y2hlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB2YWxpZGF0aW9uIHN0YXRpc3RpY3NcbiAgICovXG4gIGdldFN0YXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlbmFibGVkOiB0aGlzLmNvbmZpZy5lbmFibGVkLFxuICAgICAgaXNQcm9jZXNzaW5nOiB0aGlzLmlzUHJvY2Vzc2luZyxcbiAgICAgIGludGVydmFsU2Vjb25kczogdGhpcy5jb25maWcuaW50ZXJ2YWxTZWNvbmRzLFxuICAgICAgYmF0Y2hTaXplOiB0aGlzLmNvbmZpZy5iYXRjaFNpemUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIHRoZSB2YWxpZGF0b3IgYW5kIGNsZWFuIHVwIHJlc291cmNlc1xuICAgKiBJbXBsZW1lbnRzIGNsZWFudXAgZm9yIHByb3BlciBESSBsaWZlY3ljbGUgbWFuYWdlbWVudFxuICAgKi9cbiAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3AoKTtcbiAgICBsb2dnZXIuZGVidWcoJ0JhY2tncm91bmRWYWxpZGF0b3IgZGlzcG9zZWQnKTtcbiAgfVxufVxuIl19
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFja2dyb3VuZFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZWN1cml0eS92YWxpZGF0aW9uL0JhY2tncm91bmRWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFnQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQXFCcEU7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBOEI7SUFDaEQsT0FBTyxFQUFFLElBQUk7SUFDYixlQUFlLEVBQUUsR0FBRyxFQUFHLFlBQVk7SUFDbkMsU0FBUyxFQUFFLEVBQUU7SUFDYixtQkFBbUIsRUFBRSxJQUFJO0NBQzFCLENBQUM7QUFrQ0Y7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQU1YO0lBQ0E7SUFORixNQUFNLENBQTRCO0lBQzNDLGNBQWMsQ0FBa0I7SUFDaEMsWUFBWSxHQUFZLEtBQUssQ0FBQztJQUV0QyxZQUNtQixnQkFBa0MsRUFDbEMsYUFBa0IsRUFBRSxxREFBcUQ7SUFDMUYsTUFBMkM7UUFGMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxrQkFBYSxHQUFiLGFBQWEsQ0FBSztRQUduQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxjQUFjLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFO1lBQzdDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87WUFDNUIsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZTtZQUM1QyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FB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LElBQUksZ0JBQWdCLENBQUMsUUFBUSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3JGLDJFQUEyRTtZQUMzRSw4RUFBOEU7WUFDOUUsc0RBQXNEO1lBQ3RELE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQztRQUM5QixDQUFDO1FBRUQsa0VBQWtFO1FBQ2xFLGdEQUFnRDtRQUNoRCxPQUFPLFlBQVksQ0FBQyxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYSxDQUFJLEtBQVUsRUFBRSxTQUFpQjtRQUNwRCxNQUFNLE9BQU8sR0FBVSxFQUFFLENBQUM7UUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztZQUM1QixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZTtZQUM1QyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1NBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDWCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYWNrZ3JvdW5kIFZhbGlkYXRpb24gU2VydmljZSBmb3IgTWVtb3J5IFNlY3VyaXR5XG4gKlxuICogUGFydCBvZiBJc3N1ZSAjMTMxNCBQaGFzZSAxOiBNZW1vcnkgU2VjdXJpdHkgQXJjaGl0ZWN0dXJlXG4gKlxuICogUFVSUE9TRTpcbiAqIEFzeW5jaHJvbm91c2x5IHZhbGlkYXRlcyBVTlRSVVNURUQgbWVtb3J5IGVudHJpZXMgYW5kIHVwZGF0ZXMgdGhlaXIgdHJ1c3QgbGV2ZWxzXG4gKiB3aXRob3V0IGJsb2NraW5nIG1lbW9yeSBjcmVhdGlvbi4gUnVucyBvdXRzaWRlIHRoZSBMTE0gcmVxdWVzdCBwYXRoIHRvIGF2b2lkXG4gKiB0b2tlbiBjb3N0cyBhbmQgbGF0ZW5jeS5cbiAqXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiAtIExheWVyIDIgaW4gdGhlIE1lbW9yeSBTZWN1cml0eSBBcmNoaXRlY3R1cmUgKHNlZSBkb2NzL2RldmVsb3BtZW50L01FTU9SWV9TRUNVUklUWV9BUkNISVRFQ1RVUkUubWQpXG4gKiAtIFJ1bnMgc2VydmVyLXNpZGUsIG5vdCBpbiBMTE0gY29udGV4dFxuICogLSBObyB0b2tlbiBjb3N0IGZvciB2YWxpZGF0aW9uXG4gKiAtIFVwZGF0ZXMgdHJ1c3QgbGV2ZWxzIGluLXBsYWNlXG4gKlxuICogVFJVU1QgTEVWRUwgVFJBTlNJVElPTlM6XG4gKiBVTlRSVVNURUQg4oaSIFZBTElEQVRFRCAoY2xlYW4gY29udGVudCwgbm8gcGF0dGVybnMpXG4gKiBVTlRSVVNURUQg4oaSIEZMQUdHRUQgKGRhbmdlcm91cyBwYXR0ZXJucyBkZXRlY3RlZCwgbmVlZHMgZW5jcnlwdGlvbilcbiAqIFVOVFJVU1RFRCDihpIgUVVBUkFOVElORUQgKGV4cGxpY2l0bHkgbWFsaWNpb3VzLCBjcml0aWNhbCB0aHJlYXQpXG4gKlxuICogQG1vZHVsZSBCYWNrZ3JvdW5kVmFsaWRhdG9yXG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IsIHR5cGUgQ29udGVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFRSVVNUX0xFVkVMUyB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBQYXR0ZXJuRXh0cmFjdG9yIH0gZnJvbSAnLi9QYXR0ZXJuRXh0cmFjdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5LmpzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gYmVoYXZpb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYWNrZ3JvdW5kVmFsaWRhdG9yQ29uZmlnIHtcbiAgLyoqIEVuYWJsZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqIEludGVydmFsIGluIHNlY29uZHMgYmV0d2VlbiB2YWxpZGF0aW9uIHJ1bnMgKGRlZmF1bHQ6IDMwMCA9IDUgbWludXRlcykgKi9cbiAgaW50ZXJ2YWxTZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIG1lbW9yaWVzIHRvIHByb2Nlc3MgcGVyIGJhdGNoIChkZWZhdWx0OiAxMCkgKi9cbiAgYmF0Y2hTaXplOiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gdGltZSBpbiBtcyBmb3IgYSBzaW5nbGUgdmFsaWRhdGlvbiBvcGVyYXRpb24gKGRlZmF1bHQ6IDUwMDApICovXG4gIHZhbGlkYXRpb25UaW1lb3V0TXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGJhY2tncm91bmQgdmFsaWRhdGlvblxuICovXG5jb25zdCBERUZBVUxUX0NPTkZJRzogQmFja2dyb3VuZFZhbGlkYXRvckNvbmZpZyA9IHtcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgaW50ZXJ2YWxTZWNvbmRzOiAzMDAsICAvLyA1IG1pbnV0ZXNcbiAgYmF0Y2hTaXplOiAxMCxcbiAgdmFsaWRhdGlvblRpbWVvdXRNczogNTAwMCxcbn07XG5cbi8qKlxuICogUGF0dGVybiBpbmZvcm1hdGlvbiBmb3IgZW5jcnlwdGVkIHN0b3JhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5pdGl6ZWRQYXR0ZXJuIHtcbiAgLyoqIFVuaXF1ZSByZWZlcmVuY2UgSUQgZm9yIHRoaXMgcGF0dGVybiAqL1xuICByZWY6IHN0cmluZztcblxuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHBhdHRlcm4gKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKiogU2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIHBhdHRlcm4gKi9cbiAgc2V2ZXJpdHk6ICdjcml0aWNhbCcgfCAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnO1xuXG4gIC8qKiBMb2NhdGlvbiBpbiBvcmlnaW5hbCBjb250ZW50IChvZmZzZXQgYW5kIGxlbmd0aCkgKi9cbiAgbG9jYXRpb246IHN0cmluZztcblxuICAvKiogRW5jcnlwdGVkIHBhdHRlcm4gKEFFUy0yNTYtR0NNKSAtIFBoYXNlIDIgKi9cbiAgZW5jcnlwdGVkUGF0dGVybj86IHN0cmluZztcblxuICAvKiogRW5jcnlwdGlvbiBhbGdvcml0aG0gdXNlZCAtIFBoYXNlIDIgKi9cbiAgYWxnb3JpdGhtPzogc3RyaW5nO1xuXG4gIC8qKiBJbml0aWFsaXphdGlvbiB2ZWN0b3IgZm9yIGRlY3J5cHRpb24gLSBQaGFzZSAyICovXG4gIGl2Pzogc3RyaW5nO1xuXG4gIC8qKiBHQ00gYXV0aGVudGljYXRpb24gdGFnIGZvciBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uIC0gUGhhc2UgMiAqL1xuICBhdXRoVGFnPzogc3RyaW5nO1xuXG4gIC8qKiBTYWZldHkgaW5zdHJ1Y3Rpb24gZm9yIHBhdHRlcm4gdXNhZ2UgKi9cbiAgc2FmZXR5SW5zdHJ1Y3Rpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBCYWNrZ3JvdW5kIHZhbGlkYXRpb24gc2VydmljZSBmb3IgbWVtb3J5IGVudHJpZXNcbiAqXG4gKiBUaGlzIHNlcnZpY2UgcnVucyBvdXRzaWRlIHRoZSBMTE0gcmVxdWVzdCBwYXRoIHRvIHZhbGlkYXRlIFVOVFJVU1RFRFxuICogbWVtb3J5IGVudHJpZXMgYW5kIHVwZGF0ZSB0aGVpciB0cnVzdCBsZXZlbHMgYmFzZWQgb24gc2VjdXJpdHkgYW5hbHlzaXMuXG4gKlxuICogUkVGQUNUT1IgTk9URTpcbiAqIENvbnZlcnRlZCB0byBmdWxsIERJIGFyY2hpdGVjdHVyZS4gUmVtb3ZlZCBzaW5nbGV0b24gZXhwb3J0LlxuICogUGF0dGVybkV4dHJhY3RvciBpcyBub3cgaW5qZWN0ZWQgYXMgYSBkZXBlbmRlbmN5IGluc3RlYWQgb2Ygc3RhdGljIGNhbGxzLlxuICovXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZFZhbGlkYXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBCYWNrZ3JvdW5kVmFsaWRhdG9yQ29uZmlnO1xuICBwcml2YXRlIGludGVydmFsSGFuZGxlPzogTm9kZUpTLlRpbWVvdXQ7XG4gIHByaXZhdGUgaXNQcm9jZXNzaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXR0ZXJuRXh0cmFjdG9yOiBQYXR0ZXJuRXh0cmFjdG9yLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVtb3J5TWFuYWdlcjogYW55LCAvLyBNZW1vcnlNYW5hZ2VyIC0gdXNpbmcgYW55IHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydFxuICAgIGNvbmZpZz86IFBhcnRpYWw8QmFja2dyb3VuZFZhbGlkYXRvckNvbmZpZz5cbiAgKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfQ09ORklHLCAuLi5jb25maWcgfTtcbiAgICBsb2dnZXIuaW5mbygnQmFja2dyb3VuZFZhbGlkYXRvciBpbml0aWFsaXplZCcsIHtcbiAgICAgIGVuYWJsZWQ6IHRoaXMuY29uZmlnLmVuYWJsZWQsXG4gICAgICBpbnRlcnZhbFNlY29uZHM6IHRoaXMuY29uZmlnLmludGVydmFsU2Vjb25kcyxcbiAgICAgIGJhdGNoU2l6ZTogdGhpcy5jb25maWcuYmF0Y2hTaXplLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gc2VydmljZVxuICAgKiBCZWdpbnMgcGVyaW9kaWMgdmFsaWRhdGlvbiBvZiBVTlRSVVNURUQgbWVtb3JpZXNcbiAgICovXG4gIHN0YXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcuZW5hYmxlZCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ0JhY2tncm91bmQgdmFsaWRhdGlvbiBkaXNhYmxlZCBpbiBjb25maWcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnRlcnZhbEhhbmRsZSkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0JhY2tncm91bmQgdmFsaWRhdGlvbiBhbHJlYWR5IHJ1bm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbygnU3RhcnRpbmcgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHNlcnZpY2UnLCB7XG4gICAgICBpbnRlcnZhbFNlY29uZHM6IHRoaXMuY29uZmlnLmludGVydmFsU2Vjb25kcyxcbiAgICB9KTtcblxuICAgIC8vIFJ1biBpbW1lZGlhdGVseSBvbiBzdGFydFxuICAgIHZvaWQgdGhpcy5wcm9jZXNzVW50cnVzdGVkTWVtb3JpZXMoKTtcblxuICAgIC8vIFRoZW4gcnVuIHBlcmlvZGljYWxseVxuICAgIHRoaXMuaW50ZXJ2YWxIYW5kbGUgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB2b2lkIHRoaXMucHJvY2Vzc1VudHJ1c3RlZE1lbW9yaWVzKCk7XG4gICAgfSwgdGhpcy5jb25maWcuaW50ZXJ2YWxTZWNvbmRzICogMTAwMCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHNlcnZpY2VcbiAgICovXG4gIHN0b3AoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJ2YWxIYW5kbGUpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbEhhbmRsZSk7XG4gICAgICB0aGlzLmludGVydmFsSGFuZGxlID0gdW5kZWZpbmVkO1xuICAgICAgbG9nZ2VyLmluZm8oJ0JhY2tncm91bmQgdmFsaWRhdGlvbiBzZXJ2aWNlIHN0b3BwZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhbGwgVU5UUlVTVEVEIG1lbW9yeSBlbnRyaWVzXG4gICAqIFRoaXMgaXMgdGhlIG1haW4gYmFja2dyb3VuZCB2YWxpZGF0aW9uIGxvb3BcbiAgICovXG4gIGFzeW5jIHByb2Nlc3NVbnRydXN0ZWRNZW1vcmllcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmcpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnVmFsaWRhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzLCBza2lwcGluZyB0aGlzIHJ1bicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBQSEFTRSAxIElOQ09NUExFVEU6IE1lbW9yeSBkaXNjb3ZlcnkgaW50ZWdyYXRpb24gcGVuZGluZ1xuICAgICAgLy8gSXNzdWUgIzEzMTQgUGhhc2UgMSAtIFRoaXMgd2lsbCBiZSBjb25uZWN0ZWQgdG8gTWVtb3J5IGxvYWRpbmcgc3lzdGVtXG4gICAgICAvLyBpbiBhIGZvbGxvdy11cCBQUiBvbmNlIE1lbW9yeS5maW5kKCkgQVBJIGlzIGF2YWlsYWJsZVxuICAgICAgY29uc3QgdW50cnVzdGVkTWVtb3JpZXMgPSBhd2FpdCB0aGlzLmZpbmRNZW1vcmllc1dpdGhVbnRydXN0ZWRFbnRyaWVzKCk7XG5cbiAgICAgIGlmICh1bnRydXN0ZWRNZW1vcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnRm91bmQgdW50cnVzdGVkIG1lbW9yaWVzIHRvIHZhbGlkYXRlJywge1xuICAgICAgICBjb3VudDogdW50cnVzdGVkTWVtb3JpZXMubGVuZ3RoLFxuICAgICAgICBiYXRjaFNpemU6IHRoaXMuY29uZmlnLmJhdGNoU2l6ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm9jZXNzIGluIGJhdGNoZXNcbiAgICAgIGNvbnN0IGJhdGNoZXMgPSB0aGlzLmNyZWF0ZUJhdGNoZXModW50cnVzdGVkTWVtb3JpZXMsIHRoaXMuY29uZmlnLmJhdGNoU2l6ZSk7XG5cbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgYmF0Y2hlcykge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NCYXRjaChiYXRjaCk7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdWYWxpZGF0aW9uIHBhc3MgY29tcGxldGUnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgYmFja2dyb3VuZCB2YWxpZGF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbGwgbWVtb3JpZXMgdGhhdCBoYXZlIFVOVFJVU1RFRCBlbnRyaWVzXG4gICAqXG4gICAqIERJIFJFRkFDVE9SOiBVc2UgaW5qZWN0ZWQgTWVtb3J5TWFuYWdlciBpbnN0ZWFkIG9mIHN0YXRpYyBNZW1vcnkgbWV0aG9kc1xuICAgKiBMb2FkcyBtZW1vcmllcyBmcm9tIGZpbGVzeXN0ZW0gYW5kIGZpbHRlcnMgYnkgdHJ1c3QgbGV2ZWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZE1lbW9yaWVzV2l0aFVudHJ1c3RlZEVudHJpZXMoKTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIC8vIExvYWQgYWxsIG1lbW9yaWVzIHVzaW5nIHRoZSBpbmplY3RlZCBNZW1vcnlNYW5hZ2VyXG4gICAgY29uc3QgYWxsTWVtb3JpZXMgPSBhd2FpdCB0aGlzLm1lbW9yeU1hbmFnZXIubGlzdCgpO1xuXG4gICAgLy8gRmlsdGVyIHRvIG9ubHkgbWVtb3JpZXMgd2l0aCBVTlRSVVNURUQgZW50cmllc1xuICAgIGNvbnN0IHVudHJ1c3RlZE1lbW9yaWVzOiBNZW1vcnlbXSA9IFtdO1xuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5jb25maWcuYmF0Y2hTaXplICogMTA7XG5cbiAgICBmb3IgKGNvbnN0IG1lbW9yeSBvZiBhbGxNZW1vcmllcykge1xuICAgICAgY29uc3QgaGFzVW50cnVzdGVkRW50cmllcyA9IG1lbW9yeS5nZXRFbnRyaWVzQnlUcnVzdExldmVsKFRSVVNUX0xFVkVMUy5VTlRSVVNURUQpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzVW50cnVzdGVkRW50cmllcykge1xuICAgICAgICB1bnRydXN0ZWRNZW1vcmllcy5wdXNoKG1lbW9yeSk7XG5cbiAgICAgICAgLy8gQXBwbHkgbGltaXRcbiAgICAgICAgaWYgKHVudHJ1c3RlZE1lbW9yaWVzLmxlbmd0aCA+PSBsaW1pdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHVudHJ1c3RlZE1lbW9yaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgbWVtb3JpZXMgd2l0aCB1bnRydXN0ZWQgZW50cmllcycsIHtcbiAgICAgICAgY291bnQ6IHVudHJ1c3RlZE1lbW9yaWVzLmxlbmd0aCxcbiAgICAgICAgbGltaXRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1bnRydXN0ZWRNZW1vcmllcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGEgYmF0Y2ggb2YgbWVtb3JpZXMgZm9yIHZhbGlkYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0JhdGNoKG1lbW9yaWVzOiBNZW1vcnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5kZWJ1ZygnUHJvY2Vzc2luZyBiYXRjaCcsIHsgc2l6ZTogbWVtb3JpZXMubGVuZ3RoIH0pO1xuXG4gICAgZm9yIChjb25zdCBtZW1vcnkgb2YgbWVtb3JpZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVNZW1vcnkobWVtb3J5KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgdmFsaWRhdGluZyBtZW1vcnknLCB7XG4gICAgICAgICAgbWVtb3J5SWQ6IG1lbW9yeS5pZCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFsbCBVTlRSVVNURUQgZW50cmllcyBpbiBhIG1lbW9yeVxuICAgKiBGSVggIzEzMjA6IE5vdyB1c2VzIHB1YmxpYyBNZW1vcnkgQVBJIGFuZCBzYXZlcyBjaGFuZ2VzXG4gICAqIEZJWCAoQ2xhdWRlIEJvdCBSZXZpZXcpOiBSZW1vdmVkIHR5cGUgY2FzdGluZyBmb3IgbWVtb3J5LmlkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlTWVtb3J5KG1lbW9yeTogTWVtb3J5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmRlYnVnKCdWYWxpZGF0aW5nIG1lbW9yeScsIHsgbWVtb3J5SWQ6IG1lbW9yeS5pZCB9KTtcblxuICAgIGxldCB1cGRhdGVkQ291bnQgPSAwO1xuXG4gICAgLy8gRklYICMxMzIwOiBVc2UgcHVibGljIEFQSSBpbnN0ZWFkIG9mIGNhc3RpbmcgdG8gYW55XG4gICAgY29uc3QgZW50cmllcyA9IG1lbW9yeS5nZXRFbnRyaWVzQnlUcnVzdExldmVsKFRSVVNUX0xFVkVMUy5VTlRSVVNURUQpO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy52YWxpZGF0ZUVudHJ5KGVudHJ5KTtcbiAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICB1cGRhdGVkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciB2YWxpZGF0aW5nIGVudHJ5Jywge1xuICAgICAgICAgIGVudHJ5SWQ6IGVudHJ5LmlkLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXBkYXRlZENvdW50ID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ1VwZGF0ZWQgdHJ1c3QgbGV2ZWxzIGluIG1lbW9yeScsIHtcbiAgICAgICAgbWVtb3J5SWQ6IG1lbW9yeS5pZCxcbiAgICAgICAgdXBkYXRlZENvdW50LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIERJIFJFRkFDVE9SOiBVc2UgaW5qZWN0ZWQgTWVtb3J5TWFuYWdlciB0byBzYXZlXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm1lbW9yeU1hbmFnZXIuc2F2ZShtZW1vcnkpO1xuICAgICAgICBsb2dnZXIuZGVidWcoJ01lbW9yeSBzYXZlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgICAgbWVtb3J5SWQ6IG1lbW9yeS5pZFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHNhdmUgbWVtb3J5IGFmdGVyIHZhbGlkYXRpb24nLCB7XG4gICAgICAgICAgbWVtb3J5SWQ6IG1lbW9yeS5pZCxcbiAgICAgICAgICBlcnJvclxuICAgICAgICB9KTtcbiAgICAgICAgLy8gRG9uJ3QgdGhyb3cgLSBjb250aW51ZSB3aXRoIG90aGVyIG1lbW9yaWVzXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgc2luZ2xlIG1lbW9yeSBlbnRyeSBhbmQgdXBkYXRlIGl0cyB0cnVzdCBsZXZlbFxuICAgKlxuICAgKiBAcGFyYW0gZW50cnkgLSBUaGUgbWVtb3J5IGVudHJ5IHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGVudHJ5IHdhcyB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVFbnRyeShlbnRyeTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbG9nZ2VyLmRlYnVnKCdWYWxpZGF0aW5nIGVudHJ5JywgeyBlbnRyeUlkOiBlbnRyeS5pZCB9KTtcblxuICAgIC8vIFZhbGlkYXRlIGNvbnRlbnQgdXNpbmcgQ29udGVudFZhbGlkYXRvclxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoZW50cnkuY29udGVudCwge1xuICAgICAgc2tpcFNpemVDaGVjazogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIERldGVybWluZSBuZXcgdHJ1c3QgbGV2ZWwgYmFzZWQgb24gdmFsaWRhdGlvbiByZXN1bHRzXG4gICAgY29uc3QgbmV3VHJ1c3RMZXZlbCA9IHRoaXMuZGV0ZXJtaW5lVHJ1c3RMZXZlbCh2YWxpZGF0aW9uUmVzdWx0KTtcblxuICAgIGlmIChuZXdUcnVzdExldmVsID09PSBlbnRyeS50cnVzdExldmVsKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1RydXN0IGxldmVsIHVuY2hhbmdlZCcsIHtcbiAgICAgICAgZW50cnlJZDogZW50cnkuaWQsXG4gICAgICAgIHRydXN0TGV2ZWw6IGVudHJ5LnRydXN0TGV2ZWwsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdHJ1c3QgbGV2ZWxcbiAgICBlbnRyeS50cnVzdExldmVsID0gbmV3VHJ1c3RMZXZlbDtcblxuICAgIGxvZ2dlci5pbmZvKCdVcGRhdGVkIGVudHJ5IHRydXN0IGxldmVsJywge1xuICAgICAgZW50cnlJZDogZW50cnkuaWQsXG4gICAgICBvbGRUcnVzdExldmVsOiBUUlVTVF9MRVZFTFMuVU5UUlVTVEVELFxuICAgICAgbmV3VHJ1c3RMZXZlbCxcbiAgICAgIGRldGVjdGVkUGF0dGVybnM6IHZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8ubGVuZ3RoIHx8IDAsXG4gICAgfSk7XG5cbiAgICAvLyBJZiBGTEFHR0VELCBleHRyYWN0IHBhdHRlcm5zIGFuZCBjcmVhdGUgc2FuaXRpemVkIGNvbnRlbnRcbiAgICBpZiAobmV3VHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLkZMQUdHRUQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRW50cnkgZmxhZ2dlZCwgZXh0cmFjdGluZyBwYXR0ZXJucycsIHtcbiAgICAgICAgZW50cnlJZDogZW50cnkuaWQsXG4gICAgICAgIHBhdHRlcm5zOiB2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnMsXG4gICAgICB9KTtcblxuICAgICAgLy8gUGhhc2UgMTogRXh0cmFjdCBwYXR0ZXJucyBhbmQgY3JlYXRlIHNhbml0aXplZCBjb250ZW50XG4gICAgICBjb25zdCBleHRyYWN0aW9uUmVzdWx0ID0gdGhpcy5wYXR0ZXJuRXh0cmFjdG9yLmV4dHJhY3RQYXR0ZXJucyhcbiAgICAgICAgZW50cnkuY29udGVudCxcbiAgICAgICAgdmFsaWRhdGlvblJlc3VsdFxuICAgICAgKTtcblxuICAgICAgLy8gU3RvcmUgc2FuaXRpemVkIHBhdHRlcm5zIGFuZCBjb250ZW50IGluIGVudHJ5IG1ldGFkYXRhXG4gICAgICAvLyBQaGFzZSAyIHdpbGwgYWRkIGVuY3J5cHRpb24gdG8gdGhlc2UgcGF0dGVybnNcbiAgICAgIGVudHJ5LnNhbml0aXplZFBhdHRlcm5zID0gZXh0cmFjdGlvblJlc3VsdC5wYXR0ZXJucztcbiAgICAgIGVudHJ5LnNhbml0aXplZENvbnRlbnQgPSBleHRyYWN0aW9uUmVzdWx0LnNhbml0aXplZENvbnRlbnQ7XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdQYXR0ZXJucyBleHRyYWN0ZWQgZnJvbSBlbnRyeScsIHtcbiAgICAgICAgZW50cnlJZDogZW50cnkuaWQsXG4gICAgICAgIHBhdHRlcm5Db3VudDogZXh0cmFjdGlvblJlc3VsdC5wYXR0ZXJuQ291bnQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIHRydXN0IGxldmVsIGJhc2VkIG9uIHZhbGlkYXRpb24gcmVzdWx0c1xuICAgKi9cbiAgcHJpdmF0ZSBkZXRlcm1pbmVUcnVzdExldmVsKHZhbGlkYXRpb25SZXN1bHQ6IENvbnRlbnRWYWxpZGF0aW9uUmVzdWx0KTogc3RyaW5nIHtcbiAgICAvLyBJZiB2YWxpZGF0aW9uIHBhc3NlZCB3aXRoIG5vIHBhdHRlcm5zLCBtYXJrIGFzIFZBTElEQVRFRFxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQgJiYgKCF2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnMgfHwgdmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHJldHVybiBUUlVTVF9MRVZFTFMuVkFMSURBVEVEO1xuICAgIH1cblxuICAgIC8vIElmIGNyaXRpY2FsL2hpZ2ggc2V2ZXJpdHkgdGhyZWF0cyBkZXRlY3RlZCwgbWFyayBhcyBGTEFHR0VEXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcgfHwgdmFsaWRhdGlvblJlc3VsdC5zZXZlcml0eSA9PT0gJ2hpZ2gnKSB7XG4gICAgICAvLyBQSEFTRSAxIElOQ09NUExFVEU6IFFVQVJBTlRJTkVEIHRydXN0IGxldmVsIGxvZ2ljIGRlZmVycmVkIChJc3N1ZSAjMTMxNClcbiAgICAgIC8vIFdpbGwgYWRkIGRpc3RpbmN0aW9uIGJldHdlZW4gRkxBR0dFRCAoZGFuZ2Vyb3VzKSB2cyBRVUFSQU5USU5FRCAobWFsaWNpb3VzKVxuICAgICAgLy8gRm9yIG5vdywgYWxsIGhpZ2gvY3JpdGljYWwgc2V2ZXJpdHkgZ29lcyB0byBGTEFHR0VEXG4gICAgICByZXR1cm4gVFJVU1RfTEVWRUxTLkZMQUdHRUQ7XG4gICAgfVxuXG4gICAgLy8gTWVkaXVtL2xvdyBzZXZlcml0eSBvciBtaW5vciBpc3N1ZXMgLSBrZWVwIGFzIFVOVFJVU1RFRCBmb3Igbm93XG4gICAgLy8gKENvdWxkIGJlIFZBTElEQVRFRCBpbiBhIG1vcmUgbGVuaWVudCBwb2xpY3kpXG4gICAgcmV0dXJuIFRSVVNUX0xFVkVMUy5VTlRSVVNURUQ7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXQgYW4gYXJyYXkgaW50byBiYXRjaGVzIG9mIHNwZWNpZmllZCBzaXplXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUJhdGNoZXM8VD4oaXRlbXM6IFRbXSwgYmF0Y2hTaXplOiBudW1iZXIpOiBUW11bXSB7XG4gICAgY29uc3QgYmF0Y2hlczogVFtdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcbiAgICAgIGJhdGNoZXMucHVzaChpdGVtcy5zbGljZShpLCBpICsgYmF0Y2hTaXplKSk7XG4gICAgfVxuICAgIHJldHVybiBiYXRjaGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHZhbGlkYXRpb24gc3RhdGlzdGljc1xuICAgKi9cbiAgZ2V0U3RhdHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuYWJsZWQ6IHRoaXMuY29uZmlnLmVuYWJsZWQsXG4gICAgICBpc1Byb2Nlc3Npbmc6IHRoaXMuaXNQcm9jZXNzaW5nLFxuICAgICAgaW50ZXJ2YWxTZWNvbmRzOiB0aGlzLmNvbmZpZy5pbnRlcnZhbFNlY29uZHMsXG4gICAgICBiYXRjaFNpemU6IHRoaXMuY29uZmlnLmJhdGNoU2l6ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgdGhlIHZhbGlkYXRvciBhbmQgY2xlYW4gdXAgcmVzb3VyY2VzXG4gICAqIEltcGxlbWVudHMgY2xlYW51cCBmb3IgcHJvcGVyIERJIGxpZmVjeWNsZSBtYW5hZ2VtZW50XG4gICAqL1xuICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIGxvZ2dlci5kZWJ1ZygnQmFja2dyb3VuZFZhbGlkYXRvciBkaXNwb3NlZCcpO1xuICB9XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../../src/server/startup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAQ5E,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,oBAAoB,CAAuB;gBAGjD,gBAAgB,EAAE,gBAAgB,EAClC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,aAAa,EAC5B,oBAAoB,EAAE,oBAAoB;IAU5C;;OAEG;IACG,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8C7D;;;;;OAKG;YACW,qBAAqB;
|
|
1
|
+
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../../src/server/startup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAQ5E,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,oBAAoB,CAAuB;gBAGjD,gBAAgB,EAAE,gBAAgB,EAClC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,aAAa,EAC5B,oBAAoB,EAAE,oBAAoB;IAU5C;;OAEG;IACG,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8C7D;;;;;OAKG;YACW,qBAAqB;IAqEnC;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IAYjC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IA6B/B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAUnC;;;;OAIG;YACW,0BAA0B;IAoKxC;;OAEG;IACG,kBAAkB;;;;;;IAIxB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAS/B"}
|
package/dist/server/startup.js
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* See docs/architecture/memory-autoload-architectures.md for detailed comparison.
|
|
27
27
|
*/
|
|
28
28
|
import { ElementType } from '../portfolio/PortfolioManager.js';
|
|
29
|
-
import { VERSION } from '../
|
|
29
|
+
import { PACKAGE_VERSION as VERSION } from '../generated/version.js';
|
|
30
30
|
import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
|
|
31
31
|
import { SecurityMonitor } from '../security/securityMonitor.js';
|
|
32
32
|
import { AutoLoadError } from '../errors/AutoLoadError.js';
|
|
@@ -122,19 +122,10 @@ export class ServerStartup {
|
|
|
122
122
|
logger.info(`[ServerStartup] 🔄 Activating memory: ${memoryName}...`);
|
|
123
123
|
await memory.activate();
|
|
124
124
|
logger.info(`[ServerStartup] ✅ Memory activated: ${memoryName}`);
|
|
125
|
-
//
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
source: 'ServerStartup.initializeAutoLoadMemories',
|
|
130
|
-
details: `Auto-loaded memory: ${memoryName}`,
|
|
131
|
-
additionalData: {
|
|
132
|
-
memoryName,
|
|
133
|
-
estimatedTokens,
|
|
134
|
-
priority: memory.metadata.priority,
|
|
135
|
-
totalTokensSoFar: options.totalTokens + estimatedTokens
|
|
136
|
-
}
|
|
137
|
-
});
|
|
125
|
+
// DMCP-SEC-006: Per-memory audit downgraded from security event to debug.
|
|
126
|
+
// Was generating O(n) security events per startup where n = auto-load count,
|
|
127
|
+
// causing 25x security buffer turnover. Completion summary kept as security event.
|
|
128
|
+
logger.debug(`[ServerStartup] Auto-loaded: ${memoryName} (~${estimatedTokens} tokens, priority: ${memory.metadata.priority})`);
|
|
138
129
|
return { skip: false, breakLoop: false, skippedCount: 0, estimatedTokens, warnings };
|
|
139
130
|
}
|
|
140
131
|
catch (error) {
|
|
@@ -243,13 +234,6 @@ export class ServerStartup {
|
|
|
243
234
|
const config = this.configManager.getConfig();
|
|
244
235
|
if (!config.autoLoad.enabled) {
|
|
245
236
|
logger.debug('[ServerStartup] Auto-load memories disabled in configuration');
|
|
246
|
-
SecurityMonitor.logSecurityEvent({
|
|
247
|
-
type: 'MEMORY_LOADED',
|
|
248
|
-
severity: 'LOW',
|
|
249
|
-
source: 'ServerStartup.initializeAutoLoadMemories',
|
|
250
|
-
details: 'Auto-load memories disabled in configuration',
|
|
251
|
-
additionalData: { reason: 'config.autoLoad.enabled=false' }
|
|
252
|
-
});
|
|
253
237
|
return;
|
|
254
238
|
}
|
|
255
239
|
// DI: use this.memoryManager instead of new MemoryManager()
|
|
@@ -303,12 +287,12 @@ export class ServerStartup {
|
|
|
303
287
|
}
|
|
304
288
|
logger.info(`[ServerStartup] Auto-load complete: ${loadedCount} memories loaded ` +
|
|
305
289
|
`(~${totalTokens} tokens), ${skippedCount} skipped, ${warningCount} warnings`);
|
|
306
|
-
//
|
|
290
|
+
// Summary event — fires once per startup, keep as security event
|
|
307
291
|
SecurityMonitor.logSecurityEvent({
|
|
308
292
|
type: 'MEMORY_LOADED',
|
|
309
293
|
severity: 'LOW',
|
|
310
294
|
source: 'ServerStartup.initializeAutoLoadMemories',
|
|
311
|
-
details:
|
|
295
|
+
details: `Auto-load complete: ${loadedCount} loaded, ${skippedCount} skipped`,
|
|
312
296
|
additionalData: {
|
|
313
297
|
loadedCount,
|
|
314
298
|
skippedCount,
|
|
@@ -382,4 +366,4 @@ export class ServerStartup {
|
|
|
382
366
|
logger.debug('[ServerStartup] Disposed and cleaned up resources');
|
|
383
367
|
}
|
|
384
368
|
}
|
|
385
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnR1cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvc3RhcnR1cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSCxPQUFPLEVBQW9CLFdBQVcsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBTWpGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU81QyxNQUFNLE9BQU8sYUFBYTtJQUNoQixnQkFBZ0IsQ0FBbUI7SUFDbkMsZ0JBQWdCLENBQW1CO0lBQ25DLGVBQWUsQ0FBa0I7SUFDakMsYUFBYSxDQUFnQjtJQUM3QixhQUFhLENBQWdCO0lBQzdCLG9CQUFvQixDQUF1QjtJQUVuRCxZQUNFLGdCQUFrQyxFQUNsQyxlQUFnQyxFQUNoQyxhQUE0QixFQUM1QixnQkFBa0MsRUFDbEMsYUFBNEIsRUFDNUIsb0JBQTBDO1FBRTFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUN2QyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBMEIs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QjtnQkFDL0IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2dCQUNuQyxPQUFPLEVBQUUsT0FBTztnQkFDaEIsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLFdBQVc7Z0JBQ1gsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTO2dCQUNsQyxZQUFZO2dCQUNaLFlBQVk7Z0JBQ1osY0FBYyxFQUFFLFlBQVksR0FBRyxDQUFDO2dCQUNoQyxpQkFBaUI7YUFDbEIsQ0FBQztZQUVGLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCO1FBQ3RCLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDWCxrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU3Qiw4Q0FBOEM7UUFDOUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFM0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VydmVyIHN0YXJ0dXAgdXRpbGl0aWVzIGluY2x1ZGluZyBtaWdyYXRpb25cbiAqXG4gKiBBUkNISVRFQ1RVUkUgTk9URVMgLSBNZW1vcnkgQXV0by1Mb2FkIEltcGxlbWVudGF0aW9uOlxuICpcbiAqIFRoZXJlIGFyZSB0d28gdmFsaWQgYXJjaGl0ZWN0dXJhbCBhcHByb2FjaGVzIGZvciBtZW1vcnkgYXV0by1sb2FkOlxuICpcbiAqIDEuIE1lbW9yeU1hbmFnZXIubG9hZEFuZEFjdGl2YXRlQXV0b0xvYWRNZW1vcmllcygpIChDVVJSRU5UIElNUExFTUVOVEFUSU9OKVxuICogICAgLSBBdXRvLWxvYWQgbG9naWMgbGl2ZXMgaW4gTWVtb3J5TWFuYWdlclxuICogICAgLSBDYWxsZWQgZGlyZWN0bHkgZnJvbSBDb250YWluZXIucHJlcGFyZVBvcnRmb2xpbygpXG4gKiAgICAtIEZvbGxvd3MgREkgcGF0dGVybjogbWFuYWdlcnMgb3duIGFsbCBvcGVyYXRpb25zIGZvciB0aGVpciBlbGVtZW50IHR5cGVcbiAqICAgIC0gUHJvczogQmV0dGVyIGVuY2Fwc3VsYXRpb24sIGNsZWFyZXIgb3duZXJzaGlwLCBubyBkdXBsaWNhdGVkIHJlc3BvbnNpYmlsaXR5XG4gKiAgICAtIFVzZWQgYnk6IENvbnRhaW5lci5wcmVwYXJlUG9ydGZvbGlvKCkgKGN1cnJlbnQgcHJvZHVjdGlvbiBhcHByb2FjaClcbiAqXG4gKiAyLiBTZXJ2ZXJTdGFydHVwLmluaXRpYWxpemVBdXRvTG9hZE1lbW9yaWVzKCkgKEFMVEVSTkFUSVZFIEFQUFJPQUNIKVxuICogICAgLSBBdXRvLWxvYWQgb3JjaGVzdHJhdGVkIGJ5IFNlcnZlclN0YXJ0dXBcbiAqICAgIC0gU2VydmVyU3RhcnR1cCBkZWxlZ2F0ZXMgdG8gTWVtb3J5TWFuYWdlciBmb3IgYWN0dWFsIG9wZXJhdGlvbnNcbiAqICAgIC0gVXNlZnVsIGZvcjogQ29tcGxleCBzdGFydHVwIHNlcXVlbmNlcyB3aXRoIG11bHRpcGxlIGNvb3JkaW5hdGVkIHN0ZXBzXG4gKiAgICAtIFByb3M6IENlbnRyYWxpemVzIHN0YXJ0dXAgY29uY2VybnMsIGVhc2llciB0byBhZGQgY3Jvc3MtY3V0dGluZyBmZWF0dXJlc1xuICogICAgLSBVc2VkIGJ5OiBUaGlzIGNsYXNzIChrZXB0IGZvciBmdXR1cmUgdXNlIGFuZCBhbHRlcm5hdGl2ZSB3b3JrZmxvd3MpXG4gKlxuICogQm90aCBhcHByb2FjaGVzIGFyZSB2YWxpZCBhbmQgbWFpbnRhaW5lZC4gQ2hvb3NlIGJhc2VkIG9uIHlvdXIgbmVlZHM6XG4gKiAtIFVzZSBNZW1vcnlNYW5hZ2VyIGRpcmVjdGx5IGZvciBzaW1wbGUsIGZvY3VzZWQgYXV0by1sb2FkXG4gKiAtIFVzZSBTZXJ2ZXJTdGFydHVwIGZvciBjb21wbGV4IG9yY2hlc3RyYXRpb24gd2l0aCBtdWx0aXBsZSBzdGFydHVwIHBoYXNlc1xuICpcbiAqIFNlZSBkb2NzL2FyY2hpdGVjdHVyZS9tZW1vcnktYXV0b2xvYWQtYXJjaGl0ZWN0dXJlcy5tZCBmb3IgZGV0YWlsZWQgY29tcGFyaXNvbi5cbiAqL1xuXG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyLCBFbGVtZW50VHlwZSB9IGZyb20gJy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IE1pZ3JhdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9wb3J0Zm9saW8vTWlncmF0aW9uTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgTWVtb3J5TWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29uZmlnTWFuYWdlciB9IGZyb20gJy4uL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzJztcbmltcG9ydCB7IE9wZXJhdGlvbmFsVGVsZW1ldHJ5IH0gZnJvbSAnLi4vdGVsZW1ldHJ5L09wZXJhdGlvbmFsVGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuLi9jb25zdGFudHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEF1dG9Mb2FkTWV0cmljcyB9IGZyb20gJy4uL3RlbGVtZXRyeS90eXBlcy5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBBdXRvTG9hZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL0F1dG9Mb2FkRXJyb3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGFydHVwT3B0aW9ucyB7XG4gIHNraXBNaWdyYXRpb24/OiBib29sZWFuO1xuICBhdXRvQmFja3VwPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNlcnZlclN0YXJ0dXAge1xuICBwcml2YXRlIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByaXZhdGUgbWlncmF0aW9uTWFuYWdlcjogTWlncmF0aW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcjtcbiAgcHJpdmF0ZSBtZW1vcnlNYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyO1xuICBwcml2YXRlIGNvbmZpZ01hbmFnZXI6IENvbmZpZ01hbmFnZXI7XG4gIHByaXZhdGUgb3BlcmF0aW9uYWxUZWxlbWV0cnk6IE9wZXJhdGlvbmFsVGVsZW1ldHJ5O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgY29uZmlnTWFuYWdlcjogQ29uZmlnTWFuYWdlcixcbiAgICBtaWdyYXRpb25NYW5hZ2VyOiBNaWdyYXRpb25NYW5hZ2VyLFxuICAgIG1lbW9yeU1hbmFnZXI6IE1lbW9yeU1hbmFnZXIsXG4gICAgb3BlcmF0aW9uYWxUZWxlbWV0cnk6IE9wZXJhdGlvbmFsVGVsZW1ldHJ5XG4gICkge1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IHBvcnRmb2xpb01hbmFnZXI7XG4gICAgdGhpcy5maWxlTG9ja01hbmFnZXIgPSBmaWxlTG9ja01hbmFnZXI7XG4gICAgdGhpcy5jb25maWdNYW5hZ2VyID0gY29uZmlnTWFuYWdlcjtcbiAgICB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIgPSBtaWdyYXRpb25NYW5hZ2VyO1xuICAgIHRoaXMubWVtb3J5TWFuYWdlciA9IG1lbW9yeU1hbmFnZXI7XG4gICAgdGhpcy5vcGVyYXRpb25hbFRlbGVtZXRyeSA9IG9wZXJhdGlvbmFsVGVsZW1ldHJ5O1xuICB9XG4gIFxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBzZXJ2ZXIgd2l0aCBtaWdyYXRpb24gY2hlY2tcbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUob3B0aW9uczogU3RhcnR1cE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKCdbU2VydmVyU3RhcnR1cF0gSW5pdGlhbGl6aW5nIHNlcnZlci4uLicpO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIG1pZ3JhdGlvbiBpcyBuZWVkZWRcbiAgICBpZiAoIW9wdGlvbnMuc2tpcE1pZ3JhdGlvbikge1xuICAgICAgY29uc3QgbmVlZHNNaWdyYXRpb24gPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIubmVlZHNNaWdyYXRpb24oKTtcbiAgICAgIFxuICAgICAgaWYgKG5lZWRzTWlncmF0aW9uKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbU2VydmVyU3RhcnR1cF0gTGVnYWN5IHBlcnNvbmFzIGRldGVjdGVkLiBTdGFydGluZyBtaWdyYXRpb24uLi4nKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWlncmF0aW9uTWFuYWdlci5taWdyYXRlKHsgXG4gICAgICAgICAgYmFja3VwOiBvcHRpb25zLmF1dG9CYWNrdXAgIT09IGZhbHNlIC8vIERlZmF1bHQgdG8gdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBbU2VydmVyU3RhcnR1cF0gU3VjY2Vzc2Z1bGx5IG1pZ3JhdGVkICR7cmVzdWx0Lm1pZ3JhdGVkQ291bnR9IHBlcnNvbmFzYCk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5iYWNrZWRVcCAmJiByZXN1bHQuYmFja3VwUGF0aCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFtTZXJ2ZXJTdGFydHVwXSBCYWNrdXAgY3JlYXRlZCBhdDogJHtyZXN1bHQuYmFja3VwUGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdbU2VydmVyU3RhcnR1cF0gTWlncmF0aW9uIGNvbXBsZXRlZCB3aXRoIGVycm9yczonKTtcbiAgICAgICAgICByZXN1bHQuZXJyb3JzLmZvckVhY2goZXJyID0+IGxvZ2dlci5lcnJvcihgW1NlcnZlclN0YXJ0dXBdICAgLSAke2Vycn1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIHBvcnRmb2xpbyBzdHJ1Y3R1cmUgZXhpc3RzXG4gICAgY29uc3QgcG9ydGZvbGlvRXhpc3RzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmV4aXN0cygpO1xuICAgIGlmICghcG9ydGZvbGlvRXhpc3RzKSB7XG4gICAgICBsb2dnZXIuaW5mbygnW1NlcnZlclN0YXJ0dXBdIENyZWF0aW5nIHBvcnRmb2xpbyBkaXJlY3Rvcnkgc3RydWN0dXJlLi4uJyk7XG4gICAgICBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBMb2cgcG9ydGZvbGlvIHN0YXRpc3RpY3NcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRTdGF0aXN0aWNzKCk7XG4gICAgbG9nZ2VyLmluZm8oJ1tTZXJ2ZXJTdGFydHVwXSBQb3J0Zm9saW8gc3RhdGlzdGljczonKTtcbiAgICBPYmplY3QuZW50cmllcyhzdGF0cykuZm9yRWFjaCgoW3R5cGUsIGNvdW50XSkgPT4ge1xuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW1NlcnZlclN0YXJ0dXBdICAgLSAke3R5cGV9OiAke2NvdW50fSBlbGVtZW50c2ApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhdXRvLWxvYWQgbWVtb3JpZXNcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVBdXRvTG9hZE1lbW9yaWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhIHNpbmdsZSBhdXRvLWxvYWQgbWVtb3J5XG4gICAqIEZJWCAoU29uYXJDbG91ZCk6IEV4dHJhY3RlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICogRklYIChTb25hckNsb3VkKTogUmVkdWNlZCBwYXJhbWV0ZXIgY291bnQgYnkgdXNpbmcgb3B0aW9ucyBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0F1dG9Mb2FkTWVtb3J5KFxuICAgIG1lbW9yeTogYW55LFxuICAgIG1lbW9yeU1hbmFnZXI6IGFueSxcbiAgICBvcHRpb25zOiB7XG4gICAgICB0b3RhbFRva2VuczogbnVtYmVyO1xuICAgICAgc2luZ2xlTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIHRvdGFsQnVkZ2V0OiBudW1iZXI7XG4gICAgICBzdXBwcmVzc1dhcm5pbmdzOiBib29sZWFuO1xuICAgICAgdG90YWxNZW1vcmllczogbnVtYmVyO1xuICAgICAgbG9hZGVkQ291bnQ6IG51bWJlcjtcbiAgICB9XG4gICk6IFByb21pc2U8e1xuICAgIHNraXA6IGJvb2xlYW47XG4gICAgYnJlYWtMb29wOiBib29sZWFuO1xuICAgIHNraXBwZWRDb3VudDogbnVtYmVyO1xuICAgIGVzdGltYXRlZFRva2VuczogbnVtYmVyO1xuICAgIHdhcm5pbmdzOiBudW1iZXI7XG4gIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRklYOiBETUNQLVNFQy0wMDQgLSBOb3JtYWxpemUgVW5pY29kZSBpbiB1c2VyIGlucHV0IHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWVtb3J5Lm1ldGFkYXRhLm5hbWUpO1xuICAgICAgY29uc3QgbWVtb3J5TmFtZSA9IG5vcm1hbGl6ZWROYW1lLm5vcm1hbGl6ZWRDb250ZW50O1xuXG4gICAgICAvLyBQUiAjMTQzNjogVmFsaWRhdGUgbWVtb3J5IGJlZm9yZSBsb2FkaW5nXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gbWVtb3J5LnZhbGlkYXRlKCk7XG4gICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgdGhyb3cgQXV0b0xvYWRFcnJvci52YWxpZGF0aW9uRmFpbGVkKFxuICAgICAgICAgIG1lbW9yeU5hbWUsXG4gICAgICAgICAgdmFsaWRhdGlvbi5lcnJvcnM/Lm1hcCgoZTogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpIHx8ICdVbmtub3duIHZhbGlkYXRpb24gZXJyb3InXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVzdGltYXRlZFRva2VucyA9IG1lbW9yeU1hbmFnZXIuZXN0aW1hdGVUb2tlbnMobWVtb3J5LmNvbnRlbnQgfHwgJycpO1xuXG4gICAgICAvLyBDaGVjayBmb3Igc2l6ZSB3YXJuaW5nc1xuICAgICAgY29uc3Qgd2FybmluZ3MgPSB0aGlzLmNoZWNrTWVtb3J5U2l6ZVdhcm5pbmdzKG1lbW9yeU5hbWUsIGVzdGltYXRlZFRva2Vucywgb3B0aW9ucy5zdXBwcmVzc1dhcm5pbmdzKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgbWVtb3J5IHNob3VsZCBiZSBza2lwcGVkXG4gICAgICBjb25zdCBza2lwQ2hlY2sgPSB0aGlzLnNob3VsZFNraXBNZW1vcnkobWVtb3J5TmFtZSwgZXN0aW1hdGVkVG9rZW5zLCBvcHRpb25zLnRvdGFsVG9rZW5zLCBvcHRpb25zLnNpbmdsZUxpbWl0LCBvcHRpb25zLnRvdGFsQnVkZ2V0KTtcbiAgICAgIGlmIChza2lwQ2hlY2suc2tpcCkge1xuICAgICAgICBpZiAoc2tpcENoZWNrLnJlYXNvbiA9PT0gJ2J1ZGdldF9leGNlZWRlZCcpIHtcbiAgICAgICAgICBjb25zdCByZW1haW5pbmcgPSBvcHRpb25zLnRvdGFsTWVtb3JpZXMgLSBvcHRpb25zLmxvYWRlZENvdW50O1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFtTZXJ2ZXJTdGFydHVwXSBUb2tlbiBidWRnZXQgcmVhY2hlZCAoJHtvcHRpb25zLnRvdGFsVG9rZW5zfS8ke29wdGlvbnMudG90YWxCdWRnZXR9IHRva2VucykuIGAgK1xuICAgICAgICAgICAgYExvYWRlZCAke29wdGlvbnMubG9hZGVkQ291bnR9IG1lbW9yaWVzLCBza2lwcGluZyByZW1haW5pbmcgJHtyZW1haW5pbmd9LmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHNraXA6IGZhbHNlLCBicmVha0xvb3A6IHRydWUsIHNraXBwZWRDb3VudDogcmVtYWluaW5nLCBlc3RpbWF0ZWRUb2tlbnM6IDAsIHdhcm5pbmdzOiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc2tpcDogdHJ1ZSwgYnJlYWtMb29wOiBmYWxzZSwgc2tpcHBlZENvdW50OiAwLCBlc3RpbWF0ZWRUb2tlbnM6IDAsIHdhcm5pbmdzOiAwIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEZJWCAjMTQzMDogQWN0aXZhdGUgdGhlIG1lbW9yeSBzbyBpdCdzIGF2YWlsYWJsZSBmb3IgdXNlXG4gICAgICBsb2dnZXIuaW5mbyhgW1NlcnZlclN0YXJ0dXBdIPCflIQgQWN0aXZhdGluZyBtZW1vcnk6ICR7bWVtb3J5TmFtZX0uLi5gKTtcbiAgICAgIGF3YWl0IG1lbW9yeS5hY3RpdmF0ZSgpO1xuICAgICAgbG9nZ2VyLmluZm8oYFtTZXJ2ZXJTdGFydHVwXSDinIUgTWVtb3J5IGFjdGl2YXRlZDogJHttZW1vcnlOYW1lfWApO1xuXG4gICAgICAvLyBGSVg6IERNQ1AtU0VDLTAwNiAtIEF1ZGl0IGxvZyBlYWNoIGxvYWRlZCBtZW1vcnlcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ01FTU9SWV9MT0FERUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1NlcnZlclN0YXJ0dXAuaW5pdGlhbGl6ZUF1dG9Mb2FkTWVtb3JpZXMnLFxuICAgICAgICBkZXRhaWxzOiBgQXV0by1sb2FkZWQgbWVtb3J5OiAke21lbW9yeU5hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBtZW1vcnlOYW1lLFxuICAgICAgICAgIGVzdGltYXRlZFRva2VucyxcbiAgICAgICAgICBwcmlvcml0eTogbWVtb3J5Lm1ldGFkYXRhLnByaW9yaXR5LFxuICAgICAgICAgIHRvdGFsVG9rZW5zU29GYXI6IG9wdGlvbnMudG90YWxUb2tlbnMgKyBlc3RpbWF0ZWRUb2tlbnNcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7IHNraXA6IGZhbHNlLCBicmVha0xvb3A6IGZhbHNlLCBza2lwcGVkQ291bnQ6IDAsIGVzdGltYXRlZFRva2Vucywgd2FybmluZ3MgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUFIgIzE0MzY6IFN0cnVjdHVyZWQgZXJyb3IgaGFuZGxpbmcgd2l0aCBBdXRvTG9hZEVycm9yXG4gICAgICB0aGlzLmhhbmRsZUF1dG9Mb2FkTWVtb3J5RXJyb3IoZXJyb3IsIG1lbW9yeSk7XG4gICAgICByZXR1cm4geyBza2lwOiB0cnVlLCBicmVha0xvb3A6IGZhbHNlLCBza2lwcGVkQ291bnQ6IDAsIGVzdGltYXRlZFRva2VuczogMCwgd2FybmluZ3M6IDAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGVycm9ycyBkdXJpbmcgYXV0by1sb2FkIG1lbW9yeSBwcm9jZXNzaW5nXG4gICAqIEZJWCAoU29uYXJDbG91ZCk6IEV4dHJhY3RlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQXV0b0xvYWRNZW1vcnlFcnJvcihlcnJvcjogdW5rbm93biwgbWVtb3J5OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBdXRvTG9hZEVycm9yKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFtTZXJ2ZXJTdGFydHVwXSBTa2lwcGluZyAnJHtlcnJvci5tZW1vcnlOYW1lfScgLSBgICtcbiAgICAgICAgYCR7ZXJyb3IucGhhc2V9IHBoYXNlIGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1lbW9yeU5hbWUgPSBtZW1vcnkubWV0YWRhdGEubmFtZSB8fCAndW5rbm93bic7XG4gICAgICBsb2dnZXIud2FybihgW1NlcnZlclN0YXJ0dXBdIFVuZXhwZWN0ZWQgZXJyb3IgbG9hZGluZyAnJHttZW1vcnlOYW1lfSc6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFuZCBsb2cgc2l6ZSB3YXJuaW5ncyBmb3IgYSBtZW1vcnlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tNZW1vcnlTaXplV2FybmluZ3MoXG4gICAgbWVtb3J5TmFtZTogc3RyaW5nLFxuICAgIGVzdGltYXRlZFRva2VuczogbnVtYmVyLFxuICAgIHN1cHByZXNzV2FybmluZ3M6IGJvb2xlYW5cbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCBMQVJHRV9NRU1PUllfV0FSTiA9IDUwMDA7XG4gICAgY29uc3QgVkVSWV9MQVJHRV9NRU1PUllfV0FSTiA9IDEwMDAwO1xuXG4gICAgaWYgKHN1cHByZXNzV2FybmluZ3MpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlmIChlc3RpbWF0ZWRUb2tlbnMgPiBWRVJZX0xBUkdFX01FTU9SWV9XQVJOKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFtTZXJ2ZXJTdGFydHVwXSBNZW1vcnkgJyR7bWVtb3J5TmFtZX0nIGlzIHZlcnkgbGFyZ2UgYCArXG4gICAgICAgIGAofiR7ZXN0aW1hdGVkVG9rZW5zfSB0b2tlbnMsIHJlY29tbWVuZGVkOiAke1ZFUllfTEFSR0VfTUVNT1JZX1dBUk59KS4gYCArXG4gICAgICAgIGBUaGlzIG1heSBpbXBhY3Qgc3RhcnR1cCB0aW1lLmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBpZiAoZXN0aW1hdGVkVG9rZW5zID4gTEFSR0VfTUVNT1JZX1dBUk4pIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBbU2VydmVyU3RhcnR1cF0gTWVtb3J5ICcke21lbW9yeU5hbWV9JyBpcyBsYXJnZSAofiR7ZXN0aW1hdGVkVG9rZW5zfSB0b2tlbnMpLmApO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgbWVtb3J5IHNob3VsZCBiZSBza2lwcGVkIGR1ZSB0byBidWRnZXQgbGltaXRzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHNob3VsZFNraXBNZW1vcnkoXG4gICAgbWVtb3J5TmFtZTogc3RyaW5nLFxuICAgIGVzdGltYXRlZFRva2VuczogbnVtYmVyLFxuICAgIHRvdGFsVG9rZW5zOiBudW1iZXIsXG4gICAgc2luZ2xlTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICB0b3RhbEJ1ZGdldDogbnVtYmVyXG4gICk6IHsgc2tpcDogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0ge1xuICAgIC8vIENoZWNrIHNpbmdsZSBtZW1vcnkgbGltaXRcbiAgICBpZiAoc2luZ2xlTGltaXQgIT09IHVuZGVmaW5lZCAmJiBlc3RpbWF0ZWRUb2tlbnMgPiBzaW5nbGVMaW1pdCkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbU2VydmVyU3RhcnR1cF0gU2tpcHBpbmcgJyR7bWVtb3J5TmFtZX0nIC0gYCArXG4gICAgICAgIGBleGNlZWRzIGNvbmZpZ3VyZWQgc2luZ2xlIG1lbW9yeSBsaW1pdCAoJHtlc3RpbWF0ZWRUb2tlbnN9ID4gJHtzaW5nbGVMaW1pdH0gdG9rZW5zKWBcbiAgICAgICk7XG4gICAgICByZXR1cm4geyBza2lwOiB0cnVlLCByZWFzb246ICdzaW5nbGVfbGltaXQnIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgdG90YWwgYnVkZ2V0XG4gICAgaWYgKHRvdGFsVG9rZW5zICsgZXN0aW1hdGVkVG9rZW5zID4gdG90YWxCdWRnZXQpIHtcbiAgICAgIHJldHVybiB7IHNraXA6IHRydWUsIHJlYXNvbjogJ2J1ZGdldF9leGNlZWRlZCcgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBza2lwOiBmYWxzZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvZyBlcnJvciByZWNvdmVyeSBzdWdnZXN0aW9ucyBiYXNlZCBvbiBlcnJvciB0eXBlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGxvZ0F1dG9Mb2FkRXJyb3JTdWdnZXN0aW9ucyhlcnJvck1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ0VOT0VOVCcpIHx8IGVycm9yTWVzc2FnZS5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbU2VydmVyU3RhcnR1cF0gVGlwOiBNZW1vcnkgZmlsZXMgbWF5IG5vdCBleGlzdCB5ZXQuIFRoZXkgd2lsbCBiZSBjcmVhdGVkIG9uIGZpcnN0IHVzZS4nKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnRUFDQ0VTJykgfHwgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdwZXJtaXNzaW9uJykpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdbU2VydmVyU3RhcnR1cF0gVGlwOiBDaGVjayBmaWxlIHBlcm1pc3Npb25zIGZvciB+Ly5kb2xsaG91c2UvcG9ydGZvbGlvL21lbW9yaWVzLycpO1xuICAgIH0gZWxzZSBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdZQU1MJykgfHwgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdwYXJzZScpKSB7XG4gICAgICBsb2dnZXIud2FybignW1NlcnZlclN0YXJ0dXBdIFRpcDogQ2hlY2sgWUFNTCBzeW50YXggaW4gbWVtb3J5IGZpbGVzLiBVc2UgZG9sbGhvdXNlIHZhbGlkYXRlIHRvIGRpYWdub3NlLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGF1dG8tbG9hZCBtZW1vcmllc1xuICAgKiBJc3N1ZSAjMTQzMDogQXV0b21hdGljYWxseSBsb2FkIGJhc2VsaW5lIG1lbW9yaWVzIG9uIHNlcnZlciBzdGFydHVwXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVBdXRvTG9hZE1lbW9yaWVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IHRvdGFsVG9rZW5zID0gMDtcbiAgICBsZXQgbG9hZGVkQ291bnQgPSAwO1xuICAgIGxldCBza2lwcGVkQ291bnQgPSAwO1xuICAgIGxldCB3YXJuaW5nQ291bnQgPSAwO1xuICAgIGNvbnN0IGVtZXJnZW5jeURpc2FibGVkID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0RJU0FCTEVfQVVUT0xPQUQgPT09ICd0cnVlJztcblxuICAgIHRyeSB7XG4gICAgICAvLyBGSVg6IERNQ1AtU0VDLTAwNiAtIEFkZCBhdWRpdCBsb2dnaW5nIGZvciBzZWN1cml0eSBvcGVyYXRpb25zXG4gICAgICAvLyBDaGVjayBmb3IgZW1lcmdlbmN5IGRpc2FibGVcbiAgICAgIGlmIChlbWVyZ2VuY3lEaXNhYmxlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnW1NlcnZlclN0YXJ0dXBdIEF1dG8tbG9hZCBkaXNhYmxlZCB2aWEgRE9MTEhPVVNFX0RJU0FCTEVfQVVUT0xPQUQnKTtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdNRU1PUllfTE9BREVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnU2VydmVyU3RhcnR1cC5pbml0aWFsaXplQXV0b0xvYWRNZW1vcmllcycsXG4gICAgICAgICAgZGV0YWlsczogJ0F1dG8tbG9hZCBtZW1vcmllcyBkaXNhYmxlZCB2aWEgZW1lcmdlbmN5IGVudmlyb25tZW50IHZhcmlhYmxlJyxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyByZWFzb246ICdET0xMSE9VU0VfRElTQUJMRV9BVVRPTE9BRD10cnVlJyB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGF1dG8tbG9hZCBpcyBlbmFibGVkIGluIGNvbmZpZyAoREk6IHVzZSB0aGlzLmNvbmZpZ01hbmFnZXIpXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdNYW5hZ2VyLmdldENvbmZpZygpO1xuXG4gICAgICBpZiAoIWNvbmZpZy5hdXRvTG9hZC5lbmFibGVkKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW1NlcnZlclN0YXJ0dXBdIEF1dG8tbG9hZCBtZW1vcmllcyBkaXNhYmxlZCBpbiBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1NlcnZlclN0YXJ0dXAuaW5pdGlhbGl6ZUF1dG9Mb2FkTWVtb3JpZXMnLFxuICAgICAgICAgIGRldGFpbHM6ICdBdXRvLWxvYWQgbWVtb3JpZXMgZGlzYWJsZWQgaW4gY29uZmlndXJhdGlvbicsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgcmVhc29uOiAnY29uZmlnLmF1dG9Mb2FkLmVuYWJsZWQ9ZmFsc2UnIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gREk6IHVzZSB0aGlzLm1lbW9yeU1hbmFnZXIgaW5zdGVhZCBvZiBuZXcgTWVtb3J5TWFuYWdlcigpXG4gICAgICBjb25zdCBtZW1vcnlNYW5hZ2VyID0gdGhpcy5tZW1vcnlNYW5hZ2VyO1xuXG4gICAgICAvLyBJc3N1ZSAjMTQzMDogSW5zdGFsbCBzZWVkIG1lbW9yaWVzIGJlZm9yZSBsb2FkaW5nIGF1dG8tbG9hZCBtZW1vcmllc1xuICAgICAgLy8gVGhpcyBlbnN1cmVzIGJhc2VsaW5lIGtub3dsZWRnZSBpcyBhdmFpbGFibGUgb24gZmlyc3QgcnVuXG4gICAgICBsb2dnZXIuaW5mbygnW1NlcnZlclN0YXJ0dXBdIPCfjLEgSW5zdGFsbGluZyBzZWVkIG1lbW9yaWVzLi4uJyk7XG4gICAgICBhd2FpdCBtZW1vcnlNYW5hZ2VyLmluc3RhbGxTZWVkTWVtb3JpZXMoKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdbU2VydmVyU3RhcnR1cF0g4pyFIFNlZWQgaW5zdGFsbGF0aW9uIGNvbXBsZXRlJyk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdbU2VydmVyU3RhcnR1cF0g8J+UjSBGZXRjaGluZyBhdXRvLWxvYWQgbWVtb3JpZXMuLi4nKTtcbiAgICAgIGNvbnN0IGF1dG9Mb2FkTWVtb3JpZXMgPSBhd2FpdCBtZW1vcnlNYW5hZ2VyLmdldEF1dG9Mb2FkTWVtb3JpZXMoKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbU2VydmVyU3RhcnR1cF0g8J+TiyBBdXRvLWxvYWQgbWVtb3JpZXMgZm91bmQ6ICR7YXV0b0xvYWRNZW1vcmllcy5sZW5ndGh9YCk7XG5cbiAgICAgIGlmIChhdXRvTG9hZE1lbW9yaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsb2dnZXIud2FybignW1NlcnZlclN0YXJ0dXBdIOKaoO+4jyAgTm8gYXV0by1sb2FkIG1lbW9yaWVzIGNvbmZpZ3VyZWQgLSBiYXNlbGluZSBrbm93bGVkZ2UgbWF5IG5vdCBiZSBhdmFpbGFibGUnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2VyLWNvbmZpZ3VyZWQgbGltaXRzIChoYXJkIGVuZm9yY2VtZW50IGlmIHNldClcbiAgICAgIC8vIFBSICMxNDM2OiBWYWxpZGF0ZSBtYXhUb2tlbkJ1ZGdldCB3aXRoIGJvdW5kcyBhbmQgdXNlciB3YXJuaW5nXG4gICAgICAvLyBNaW5pbXVtOiAxMDAgdG9rZW5zIChlbm91Z2ggZm9yIG1pbmltYWwgYmFzZWxpbmUga25vd2xlZGdlKVxuICAgICAgLy8gTWF4aW11bTogNTAsMDAwIHRva2VucyAocHJldmVudHMgZXhjZXNzaXZlIHN0YXJ0dXAgdGltZSBhbmQgbWVtb3J5IHVzYWdlKVxuICAgICAgLy8gRGVmYXVsdDogNSwwMDAgdG9rZW5zIChiYWxhbmNlZCBmb3IgdHlwaWNhbCB1c2UgY2FzZXMpXG4gICAgICBjb25zdCBjb25maWd1cmVkQnVkZ2V0ID0gY29uZmlnLmF1dG9Mb2FkLm1heFRva2VuQnVkZ2V0IHx8IDUwMDA7XG4gICAgICBjb25zdCB0b3RhbEJ1ZGdldCA9IE1hdGgubWF4KDEwMCwgTWF0aC5taW4oNTAwMDAsIGNvbmZpZ3VyZWRCdWRnZXQpKTtcblxuICAgICAgLy8gUFIgIzE0MzY6IFdhcm4gaWYgY29uZmlndXJlZCBidWRnZXQgd2FzIGNsYW1wZWQgdG8gdmFsaWQgcmFuZ2VcbiAgICAgIGlmIChjb25maWd1cmVkQnVkZ2V0ICE9PSB0b3RhbEJ1ZGdldCkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgW1NlcnZlclN0YXJ0dXBdIENvbmZpZ3VyZWQgbWF4VG9rZW5CdWRnZXQgKCR7Y29uZmlndXJlZEJ1ZGdldH0pIGAgK1xuICAgICAgICAgIGB3YXMgYWRqdXN0ZWQgdG8gJHt0b3RhbEJ1ZGdldH0gKHZhbGlkIHJhbmdlOiAxMDAtNTAsMDAwKWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2luZ2xlTGltaXQgPSBjb25maWcuYXV0b0xvYWQubWF4U2luZ2xlTWVtb3J5VG9rZW5zOyAvLyB1bmRlZmluZWQgPSBubyBsaW1pdFxuICAgICAgY29uc3Qgc3VwcHJlc3NXYXJuaW5ncyA9IGNvbmZpZy5hdXRvTG9hZC5zdXBwcmVzc0xhcmdlTWVtb3J5V2FybmluZ3MgfHwgZmFsc2U7XG5cbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIGF1dG9Mb2FkTWVtb3JpZXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9jZXNzQXV0b0xvYWRNZW1vcnkoXG4gICAgICAgICAgbWVtb3J5LFxuICAgICAgICAgIG1lbW9yeU1hbmFnZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdG90YWxUb2tlbnMsXG4gICAgICAgICAgICBzaW5nbGVMaW1pdCxcbiAgICAgICAgICAgIHRvdGFsQnVkZ2V0LFxuICAgICAgICAgICAgc3VwcHJlc3NXYXJuaW5ncyxcbiAgICAgICAgICAgIHRvdGFsTWVtb3JpZXM6IGF1dG9Mb2FkTWVtb3JpZXMubGVuZ3RoLFxuICAgICAgICAgICAgbG9hZGVkQ291bnRcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5icmVha0xvb3ApIHtcbiAgICAgICAgICBza2lwcGVkQ291bnQgKz0gcmVzdWx0LnNraXBwZWRDb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQuc2tpcCkge1xuICAgICAgICAgIHNraXBwZWRDb3VudCsrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdG90YWxUb2tlbnMgKz0gcmVzdWx0LmVzdGltYXRlZFRva2VucztcbiAgICAgICAgbG9hZGVkQ291bnQrKztcbiAgICAgICAgd2FybmluZ0NvdW50ICs9IHJlc3VsdC53YXJuaW5ncztcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbU2VydmVyU3RhcnR1cF0gQXV0by1sb2FkIGNvbXBsZXRlOiAke2xvYWRlZENvdW50fSBtZW1vcmllcyBsb2FkZWQgYCArXG4gICAgICAgIGAofiR7dG90YWxUb2tlbnN9IHRva2VucyksICR7c2tpcHBlZENvdW50fSBza2lwcGVkLCAke3dhcm5pbmdDb3VudH0gd2FybmluZ3NgXG4gICAgICApO1xuXG4gICAgICAvLyBGSVg6IERNQ1AtU0VDLTAwNiAtIEF1ZGl0IGxvZyBzdWNjZXNzZnVsIGNvbXBsZXRpb25cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ01FTU9SWV9MT0FERUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1NlcnZlclN0YXJ0dXAuaW5pdGlhbGl6ZUF1dG9Mb2FkTWVtb3JpZXMnLFxuICAgICAgICBkZXRhaWxzOiAnQXV0by1sb2FkIG1lbW9yaWVzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGxvYWRlZENvdW50LFxuICAgICAgICAgIHNraXBwZWRDb3VudCxcbiAgICAgICAgICB3YXJuaW5nQ291bnQsXG4gICAgICAgICAgdG90YWxUb2tlbnMsXG4gICAgICAgICAgbG9hZFRpbWVNczogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRU5IQU5DRUQgRVJST1IgSEFORExJTkc6IElzc3VlICMxNDMwXG4gICAgICAvLyBEb24ndCBmYWlsIHN0YXJ0dXAgaWYgYXV0by1sb2FkIGZhaWxzLCBidXQgcHJvdmlkZSBkZXRhaWxlZCBkaWFnbm9zdGljc1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgY29uc3QgZXJyb3JUeXBlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgOiAnVW5rbm93bic7XG5cbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgW1NlcnZlclN0YXJ0dXBdIEZhaWxlZCB0byBsb2FkIGF1dG8tbG9hZCBtZW1vcmllcyAoJHtlcnJvclR5cGV9KTogJHtlcnJvck1lc3NhZ2V9YFxuICAgICAgKTtcblxuICAgICAgLy8gUHJvdmlkZSBoZWxwZnVsIHJlY292ZXJ5IHN1Z2dlc3Rpb25zIGJhc2VkIG9uIGVycm9yIHR5cGVcbiAgICAgIHRoaXMubG9nQXV0b0xvYWRFcnJvclN1Z2dlc3Rpb25zKGVycm9yTWVzc2FnZSk7XG5cbiAgICAgIC8vIFJlY29yZCBlcnJvciBpbiB0ZWxlbWV0cnkgZm9yIGRpYWdub3N0aWNzXG4gICAgICBsb2FkZWRDb3VudCA9IDA7XG4gICAgICB0b3RhbFRva2VucyA9IDA7XG5cbiAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQXVkaXQgbG9nIGF1dG8tbG9hZCBmYWlsdXJlXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfTE9BRF9GQUlMRUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1NlcnZlclN0YXJ0dXAuaW5pdGlhbGl6ZUF1dG9Mb2FkTWVtb3JpZXMnLFxuICAgICAgICBkZXRhaWxzOiBgQXV0by1sb2FkIG1lbW9yaWVzIGZhaWxlZDogJHtlcnJvclR5cGV9IC0gJHtlcnJvck1lc3NhZ2V9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBlcnJvclR5cGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICAgIGxvYWRUaW1lTXM6IERhdGUubm93KCkgLSBzdGFydFRpbWVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlY29yZCB0ZWxlbWV0cnlcbiAgICAgIGNvbnN0IG1ldHJpY3M6IEF1dG9Mb2FkTWV0cmljcyA9IHtcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHZlcnNpb246IFZFUlNJT04sXG4gICAgICAgIG1lbW9yeUNvdW50OiBsb2FkZWRDb3VudCxcbiAgICAgICAgdG90YWxUb2tlbnMsXG4gICAgICAgIGxvYWRUaW1lTXM6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgIHNraXBwZWRDb3VudCxcbiAgICAgICAgd2FybmluZ0NvdW50LFxuICAgICAgICBidWRnZXRFeGNlZWRlZDogc2tpcHBlZENvdW50ID4gMCxcbiAgICAgICAgZW1lcmdlbmN5RGlzYWJsZWRcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMub3BlcmF0aW9uYWxUZWxlbWV0cnkucmVjb3JkQXV0b0xvYWRNZXRyaWNzKG1ldHJpY3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWlncmF0aW9uIHN0YXR1cyB3aXRob3V0IHBlcmZvcm1pbmcgbWlncmF0aW9uXG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25TdGF0dXMoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubWlncmF0aW9uTWFuYWdlci5nZXRNaWdyYXRpb25TdGF0dXMoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgcGVyc29uYXMgZGlyZWN0b3J5IHBhdGggZm9yIGxlZ2FjeSBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBnZXRQZXJzb25hc0RpcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5QRVJTT05BKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIHJlc291cmNlcyBhbmQgY2xlYW51cFxuICAgKiBDbGVhbnMgdXAgbWFuYWdlcnMgYW5kIHRlbGVtZXRyeSB0byBwcmV2ZW50IG9wZW4gaGFuZGxlc1xuICAgKi9cbiAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBEaXNwb3NlIE1lbW9yeU1hbmFnZXIgKGNsZWFucyB1cCBmaWxlIHdhdGNoZXJzKVxuICAgIHRoaXMubWVtb3J5TWFuYWdlci5kaXNwb3NlKCk7XG5cbiAgICAvLyBTaHV0ZG93biB0ZWxlbWV0cnkgKGZsdXNoZXMgUG9zdEhvZyBldmVudHMpXG4gICAgYXdhaXQgdGhpcy5vcGVyYXRpb25hbFRlbGVtZXRyeS5zaHV0ZG93bigpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKCdbU2VydmVyU3RhcnR1cF0gRGlzcG9zZWQgYW5kIGNsZWFuZWQgdXAgcmVzb3VyY2VzJyk7XG4gIH1cbn1cbiJdfQ==
|
|
369
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnR1cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvc3RhcnR1cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSCxPQUFPLEVBQW9CLFdBQVcsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBTWpGLE9BQU8sRUFBRSxlQUFlLElBQUksT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFPNUMsTUFBTSxPQUFPLGFBQWE7SUFDaEIsZ0JBQWdCLENBQW1CO0lBQ25DLGdCQUFnQixDQUFtQjtJQUNuQyxlQUFlLENBQWtCO0lBQ2pDLGFBQWEsQ0FBZ0I7SUFDN0IsYUFBYSxDQUFnQjtJQUM3QixvQkFBb0IsQ0FBdUI7SUFFbkQsWUFDRSxnQkFBa0MsRUFDbEMsZUFBZ0MsRUFDaEMsYUFBNEIsRUFDNUIsZ0JBQWtDLEVBQ2xDLGFBQTRCLEVBQzVCLG9CQUEwQztRQUUxQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsVUFBVSxD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SCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCO1FBQ3RCLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDWCxrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU3Qiw4Q0FBOEM7UUFDOUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFM0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VydmVyIHN0YXJ0dXAgdXRpbGl0aWVzIGluY2x1ZGluZyBtaWdyYXRpb25cbiAqXG4gKiBBUkNISVRFQ1RVUkUgTk9URVMgLSBNZW1vcnkgQXV0by1Mb2FkIEltcGxlbWVudGF0aW9uOlxuICpcbiAqIFRoZXJlIGFyZSB0d28gdmFsaWQgYXJjaGl0ZWN0dXJhbCBhcHByb2FjaGVzIGZvciBtZW1vcnkgYXV0by1sb2FkOlxuICpcbiAqIDEuIE1lbW9yeU1hbmFnZXIubG9hZEFuZEFjdGl2YXRlQXV0b0xvYWRNZW1vcmllcygpIChDVVJSRU5UIElNUExFTUVOVEFUSU9OKVxuICogICAgLSBBdXRvLWxvYWQgbG9naWMgbGl2ZXMgaW4gTWVtb3J5TWFuYWdlclxuICogICAgLSBDYWxsZWQgZGlyZWN0bHkgZnJvbSBDb250YWluZXIucHJlcGFyZVBvcnRmb2xpbygpXG4gKiAgICAtIEZvbGxvd3MgREkgcGF0dGVybjogbWFuYWdlcnMgb3duIGFsbCBvcGVyYXRpb25zIGZvciB0aGVpciBlbGVtZW50IHR5cGVcbiAqICAgIC0gUHJvczogQmV0dGVyIGVuY2Fwc3VsYXRpb24sIGNsZWFyZXIgb3duZXJzaGlwLCBubyBkdXBsaWNhdGVkIHJlc3BvbnNpYmlsaXR5XG4gKiAgICAtIFVzZWQgYnk6IENvbnRhaW5lci5wcmVwYXJlUG9ydGZvbGlvKCkgKGN1cnJlbnQgcHJvZHVjdGlvbiBhcHByb2FjaClcbiAqXG4gKiAyLiBTZXJ2ZXJTdGFydHVwLmluaXRpYWxpemVBdXRvTG9hZE1lbW9yaWVzKCkgKEFMVEVSTkFUSVZFIEFQUFJPQUNIKVxuICogICAgLSBBdXRvLWxvYWQgb3JjaGVzdHJhdGVkIGJ5IFNlcnZlclN0YXJ0dXBcbiAqICAgIC0gU2VydmVyU3RhcnR1cCBkZWxlZ2F0ZXMgdG8gTWVtb3J5TWFuYWdlciBmb3IgYWN0dWFsIG9wZXJhdGlvbnNcbiAqICAgIC0gVXNlZnVsIGZvcjogQ29tcGxleCBzdGFydHVwIHNlcXVlbmNlcyB3aXRoIG11bHRpcGxlIGNvb3JkaW5hdGVkIHN0ZXBzXG4gKiAgICAtIFByb3M6IENlbnRyYWxpemVzIHN0YXJ0dXAgY29uY2VybnMsIGVhc2llciB0byBhZGQgY3Jvc3MtY3V0dGluZyBmZWF0dXJlc1xuICogICAgLSBVc2VkIGJ5OiBUaGlzIGNsYXNzIChrZXB0IGZvciBmdXR1cmUgdXNlIGFuZCBhbHRlcm5hdGl2ZSB3b3JrZmxvd3MpXG4gKlxuICogQm90aCBhcHByb2FjaGVzIGFyZSB2YWxpZCBhbmQgbWFpbnRhaW5lZC4gQ2hvb3NlIGJhc2VkIG9uIHlvdXIgbmVlZHM6XG4gKiAtIFVzZSBNZW1vcnlNYW5hZ2VyIGRpcmVjdGx5IGZvciBzaW1wbGUsIGZvY3VzZWQgYXV0by1sb2FkXG4gKiAtIFVzZSBTZXJ2ZXJTdGFydHVwIGZvciBjb21wbGV4IG9yY2hlc3RyYXRpb24gd2l0aCBtdWx0aXBsZSBzdGFydHVwIHBoYXNlc1xuICpcbiAqIFNlZSBkb2NzL2FyY2hpdGVjdHVyZS9tZW1vcnktYXV0b2xvYWQtYXJjaGl0ZWN0dXJlcy5tZCBmb3IgZGV0YWlsZWQgY29tcGFyaXNvbi5cbiAqL1xuXG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyLCBFbGVtZW50VHlwZSB9IGZyb20gJy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IE1pZ3JhdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9wb3J0Zm9saW8vTWlncmF0aW9uTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgTWVtb3J5TWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29uZmlnTWFuYWdlciB9IGZyb20gJy4uL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzJztcbmltcG9ydCB7IE9wZXJhdGlvbmFsVGVsZW1ldHJ5IH0gZnJvbSAnLi4vdGVsZW1ldHJ5L09wZXJhdGlvbmFsVGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IFBBQ0tBR0VfVkVSU0lPTiBhcyBWRVJTSU9OIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBBdXRvTG9hZE1ldHJpY3MgfSBmcm9tICcuLi90ZWxlbWV0cnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgQXV0b0xvYWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9BdXRvTG9hZEVycm9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnR1cE9wdGlvbnMge1xuICBza2lwTWlncmF0aW9uPzogYm9vbGVhbjtcbiAgYXV0b0JhY2t1cD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJTdGFydHVwIHtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcml2YXRlIG1pZ3JhdGlvbk1hbmFnZXI6IE1pZ3JhdGlvbk1hbmFnZXI7XG4gIHByaXZhdGUgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXI7XG4gIHByaXZhdGUgbWVtb3J5TWFuYWdlcjogTWVtb3J5TWFuYWdlcjtcbiAgcHJpdmF0ZSBjb25maWdNYW5hZ2VyOiBDb25maWdNYW5hZ2VyO1xuICBwcml2YXRlIG9wZXJhdGlvbmFsVGVsZW1ldHJ5OiBPcGVyYXRpb25hbFRlbGVtZXRyeTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIGNvbmZpZ01hbmFnZXI6IENvbmZpZ01hbmFnZXIsXG4gICAgbWlncmF0aW9uTWFuYWdlcjogTWlncmF0aW9uTWFuYWdlcixcbiAgICBtZW1vcnlNYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyLFxuICAgIG9wZXJhdGlvbmFsVGVsZW1ldHJ5OiBPcGVyYXRpb25hbFRlbGVtZXRyeVxuICApIHtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBwb3J0Zm9saW9NYW5hZ2VyO1xuICAgIHRoaXMuZmlsZUxvY2tNYW5hZ2VyID0gZmlsZUxvY2tNYW5hZ2VyO1xuICAgIHRoaXMuY29uZmlnTWFuYWdlciA9IGNvbmZpZ01hbmFnZXI7XG4gICAgdGhpcy5taWdyYXRpb25NYW5hZ2VyID0gbWlncmF0aW9uTWFuYWdlcjtcbiAgICB0aGlzLm1lbW9yeU1hbmFnZXIgPSBtZW1vcnlNYW5hZ2VyO1xuICAgIHRoaXMub3BlcmF0aW9uYWxUZWxlbWV0cnkgPSBvcGVyYXRpb25hbFRlbGVtZXRyeTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgc2VydmVyIHdpdGggbWlncmF0aW9uIGNoZWNrXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKG9wdGlvbnM6IFN0YXJ0dXBPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuaW5mbygnW1NlcnZlclN0YXJ0dXBdIEluaXRpYWxpemluZyBzZXJ2ZXIuLi4nKTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiBtaWdyYXRpb24gaXMgbmVlZGVkXG4gICAgaWYgKCFvcHRpb25zLnNraXBNaWdyYXRpb24pIHtcbiAgICAgIGNvbnN0IG5lZWRzTWlncmF0aW9uID0gYXdhaXQgdGhpcy5taWdyYXRpb25NYW5hZ2VyLm5lZWRzTWlncmF0aW9uKCk7XG4gICAgICBcbiAgICAgIGlmIChuZWVkc01pZ3JhdGlvbikge1xuICAgICAgICBsb2dnZXIuaW5mbygnW1NlcnZlclN0YXJ0dXBdIExlZ2FjeSBwZXJzb25hcyBkZXRlY3RlZC4gU3RhcnRpbmcgbWlncmF0aW9uLi4uJyk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIubWlncmF0ZSh7IFxuICAgICAgICAgIGJhY2t1cDogb3B0aW9ucy5hdXRvQmFja3VwICE9PSBmYWxzZSAvLyBEZWZhdWx0IHRvIHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW1NlcnZlclN0YXJ0dXBdIFN1Y2Nlc3NmdWxseSBtaWdyYXRlZCAke3Jlc3VsdC5taWdyYXRlZENvdW50fSBwZXJzb25hc2ApO1xuICAgICAgICAgIGlmIChyZXN1bHQuYmFja2VkVXAgJiYgcmVzdWx0LmJhY2t1cFBhdGgpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBbU2VydmVyU3RhcnR1cF0gQmFja3VwIGNyZWF0ZWQgYXQ6ICR7cmVzdWx0LmJhY2t1cFBhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignW1NlcnZlclN0YXJ0dXBdIE1pZ3JhdGlvbiBjb21wbGV0ZWQgd2l0aCBlcnJvcnM6Jyk7XG4gICAgICAgICAgcmVzdWx0LmVycm9ycy5mb3JFYWNoKGVyciA9PiBsb2dnZXIuZXJyb3IoYFtTZXJ2ZXJTdGFydHVwXSAgIC0gJHtlcnJ9YCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBwb3J0Zm9saW8gc3RydWN0dXJlIGV4aXN0c1xuICAgIGNvbnN0IHBvcnRmb2xpb0V4aXN0cyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5leGlzdHMoKTtcbiAgICBpZiAoIXBvcnRmb2xpb0V4aXN0cykge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tTZXJ2ZXJTdGFydHVwXSBDcmVhdGluZyBwb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZS4uLicpO1xuICAgICAgYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmluaXRpYWxpemUoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTG9nIHBvcnRmb2xpbyBzdGF0aXN0aWNzXG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0U3RhdGlzdGljcygpO1xuICAgIGxvZ2dlci5pbmZvKCdbU2VydmVyU3RhcnR1cF0gUG9ydGZvbGlvIHN0YXRpc3RpY3M6Jyk7XG4gICAgT2JqZWN0LmVudHJpZXMoc3RhdHMpLmZvckVhY2goKFt0eXBlLCBjb3VudF0pID0+IHtcbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtTZXJ2ZXJTdGFydHVwXSAgIC0gJHt0eXBlfTogJHtjb3VudH0gZWxlbWVudHNgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpemUgYXV0by1sb2FkIG1lbW9yaWVzXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQXV0b0xvYWRNZW1vcmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYSBzaW5nbGUgYXV0by1sb2FkIG1lbW9yeVxuICAgKiBGSVggKFNvbmFyQ2xvdWQpOiBFeHRyYWN0ZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAqIEZJWCAoU29uYXJDbG91ZCk6IFJlZHVjZWQgcGFyYW1ldGVyIGNvdW50IGJ5IHVzaW5nIG9wdGlvbnMgb2JqZWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NBdXRvTG9hZE1lbW9yeShcbiAgICBtZW1vcnk6IGFueSxcbiAgICBtZW1vcnlNYW5hZ2VyOiBhbnksXG4gICAgb3B0aW9uczoge1xuICAgICAgdG90YWxUb2tlbnM6IG51bWJlcjtcbiAgICAgIHNpbmdsZUxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICB0b3RhbEJ1ZGdldDogbnVtYmVyO1xuICAgICAgc3VwcHJlc3NXYXJuaW5nczogYm9vbGVhbjtcbiAgICAgIHRvdGFsTWVtb3JpZXM6IG51bWJlcjtcbiAgICAgIGxvYWRlZENvdW50OiBudW1iZXI7XG4gICAgfVxuICApOiBQcm9taXNlPHtcbiAgICBza2lwOiBib29sZWFuO1xuICAgIGJyZWFrTG9vcDogYm9vbGVhbjtcbiAgICBza2lwcGVkQ291bnQ6IG51bWJlcjtcbiAgICBlc3RpbWF0ZWRUb2tlbnM6IG51bWJlcjtcbiAgICB3YXJuaW5nczogbnVtYmVyO1xuICB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA0IC0gTm9ybWFsaXplIFVuaWNvZGUgaW4gdXNlciBpbnB1dCB0byBwcmV2ZW50IGhvbW9ncmFwaCBhdHRhY2tzXG4gICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG1lbW9yeS5tZXRhZGF0YS5uYW1lKTtcbiAgICAgIGNvbnN0IG1lbW9yeU5hbWUgPSBub3JtYWxpemVkTmFtZS5ub3JtYWxpemVkQ29udGVudDtcblxuICAgICAgLy8gUFIgIzE0MzY6IFZhbGlkYXRlIG1lbW9yeSBiZWZvcmUgbG9hZGluZ1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IG1lbW9yeS52YWxpZGF0ZSgpO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgIHRocm93IEF1dG9Mb2FkRXJyb3IudmFsaWRhdGlvbkZhaWxlZChcbiAgICAgICAgICBtZW1vcnlOYW1lLFxuICAgICAgICAgIHZhbGlkYXRpb24uZXJyb3JzPy5tYXAoKGU6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGUubWVzc2FnZSkuam9pbignLCAnKSB8fCAnVW5rbm93biB2YWxpZGF0aW9uIGVycm9yJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlc3RpbWF0ZWRUb2tlbnMgPSBtZW1vcnlNYW5hZ2VyLmVzdGltYXRlVG9rZW5zKG1lbW9yeS5jb250ZW50IHx8ICcnKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIHNpemUgd2FybmluZ3NcbiAgICAgIGNvbnN0IHdhcm5pbmdzID0gdGhpcy5jaGVja01lbW9yeVNpemVXYXJuaW5ncyhtZW1vcnlOYW1lLCBlc3RpbWF0ZWRUb2tlbnMsIG9wdGlvbnMuc3VwcHJlc3NXYXJuaW5ncyk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG1lbW9yeSBzaG91bGQgYmUgc2tpcHBlZFxuICAgICAgY29uc3Qgc2tpcENoZWNrID0gdGhpcy5zaG91bGRTa2lwTWVtb3J5KG1lbW9yeU5hbWUsIGVzdGltYXRlZFRva2Vucywgb3B0aW9ucy50b3RhbFRva2Vucywgb3B0aW9ucy5zaW5nbGVMaW1pdCwgb3B0aW9ucy50b3RhbEJ1ZGdldCk7XG4gICAgICBpZiAoc2tpcENoZWNrLnNraXApIHtcbiAgICAgICAgaWYgKHNraXBDaGVjay5yZWFzb24gPT09ICdidWRnZXRfZXhjZWVkZWQnKSB7XG4gICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gb3B0aW9ucy50b3RhbE1lbW9yaWVzIC0gb3B0aW9ucy5sb2FkZWRDb3VudDtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBbU2VydmVyU3RhcnR1cF0gVG9rZW4gYnVkZ2V0IHJlYWNoZWQgKCR7b3B0aW9ucy50b3RhbFRva2Vuc30vJHtvcHRpb25zLnRvdGFsQnVkZ2V0fSB0b2tlbnMpLiBgICtcbiAgICAgICAgICAgIGBMb2FkZWQgJHtvcHRpb25zLmxvYWRlZENvdW50fSBtZW1vcmllcywgc2tpcHBpbmcgcmVtYWluaW5nICR7cmVtYWluaW5nfS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4geyBza2lwOiBmYWxzZSwgYnJlYWtMb29wOiB0cnVlLCBza2lwcGVkQ291bnQ6IHJlbWFpbmluZywgZXN0aW1hdGVkVG9rZW5zOiAwLCB3YXJuaW5nczogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNraXA6IHRydWUsIGJyZWFrTG9vcDogZmFsc2UsIHNraXBwZWRDb3VudDogMCwgZXN0aW1hdGVkVG9rZW5zOiAwLCB3YXJuaW5nczogMCB9O1xuICAgICAgfVxuXG4gICAgICAvLyBGSVggIzE0MzA6IEFjdGl2YXRlIHRoZSBtZW1vcnkgc28gaXQncyBhdmFpbGFibGUgZm9yIHVzZVxuICAgICAgbG9nZ2VyLmluZm8oYFtTZXJ2ZXJTdGFydHVwXSDwn5SEIEFjdGl2YXRpbmcgbWVtb3J5OiAke21lbW9yeU5hbWV9Li4uYCk7XG4gICAgICBhd2FpdCBtZW1vcnkuYWN0aXZhdGUoKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbU2VydmVyU3RhcnR1cF0g4pyFIE1lbW9yeSBhY3RpdmF0ZWQ6ICR7bWVtb3J5TmFtZX1gKTtcblxuICAgICAgLy8gRE1DUC1TRUMtMDA2OiBQZXItbWVtb3J5IGF1ZGl0IGRvd25ncmFkZWQgZnJvbSBzZWN1cml0eSBldmVudCB0byBkZWJ1Zy5cbiAgICAgIC8vIFdhcyBnZW5lcmF0aW5nIE8obikgc2VjdXJpdHkgZXZlbnRzIHBlciBzdGFydHVwIHdoZXJlIG4gPSBhdXRvLWxvYWQgY291bnQsXG4gICAgICAvLyBjYXVzaW5nIDI1eCBzZWN1cml0eSBidWZmZXIgdHVybm92ZXIuIENvbXBsZXRpb24gc3VtbWFyeSBrZXB0IGFzIHNlY3VyaXR5IGV2ZW50LlxuICAgICAgbG9nZ2VyLmRlYnVnKGBbU2VydmVyU3RhcnR1cF0gQXV0by1sb2FkZWQ6ICR7bWVtb3J5TmFtZX0gKH4ke2VzdGltYXRlZFRva2Vuc30gdG9rZW5zLCBwcmlvcml0eTogJHttZW1vcnkubWV0YWRhdGEucHJpb3JpdHl9KWApO1xuXG4gICAgICByZXR1cm4geyBza2lwOiBmYWxzZSwgYnJlYWtMb29wOiBmYWxzZSwgc2tpcHBlZENvdW50OiAwLCBlc3RpbWF0ZWRUb2tlbnMsIHdhcm5pbmdzIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFBSICMxNDM2OiBTdHJ1Y3R1cmVkIGVycm9yIGhhbmRsaW5nIHdpdGggQXV0b0xvYWRFcnJvclxuICAgICAgdGhpcy5oYW5kbGVBdXRvTG9hZE1lbW9yeUVycm9yKGVycm9yLCBtZW1vcnkpO1xuICAgICAgcmV0dXJuIHsgc2tpcDogdHJ1ZSwgYnJlYWtMb29wOiBmYWxzZSwgc2tpcHBlZENvdW50OiAwLCBlc3RpbWF0ZWRUb2tlbnM6IDAsIHdhcm5pbmdzOiAwIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBlcnJvcnMgZHVyaW5nIGF1dG8tbG9hZCBtZW1vcnkgcHJvY2Vzc2luZ1xuICAgKiBGSVggKFNvbmFyQ2xvdWQpOiBFeHRyYWN0ZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUF1dG9Mb2FkTWVtb3J5RXJyb3IoZXJyb3I6IHVua25vd24sIG1lbW9yeTogYW55KTogdm9pZCB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXV0b0xvYWRFcnJvcikge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbU2VydmVyU3RhcnR1cF0gU2tpcHBpbmcgJyR7ZXJyb3IubWVtb3J5TmFtZX0nIC0gYCArXG4gICAgICAgIGAke2Vycm9yLnBoYXNlfSBwaGFzZSBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZW1vcnlOYW1lID0gbWVtb3J5Lm1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgICAgbG9nZ2VyLndhcm4oYFtTZXJ2ZXJTdGFydHVwXSBVbmV4cGVjdGVkIGVycm9yIGxvYWRpbmcgJyR7bWVtb3J5TmFtZX0nOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbmQgbG9nIHNpemUgd2FybmluZ3MgZm9yIGEgbWVtb3J5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNoZWNrTWVtb3J5U2l6ZVdhcm5pbmdzKFxuICAgIG1lbW9yeU5hbWU6IHN0cmluZyxcbiAgICBlc3RpbWF0ZWRUb2tlbnM6IG51bWJlcixcbiAgICBzdXBwcmVzc1dhcm5pbmdzOiBib29sZWFuXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgTEFSR0VfTUVNT1JZX1dBUk4gPSA1MDAwO1xuICAgIGNvbnN0IFZFUllfTEFSR0VfTUVNT1JZX1dBUk4gPSAxMDAwMDtcblxuICAgIGlmIChzdXBwcmVzc1dhcm5pbmdzKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAoZXN0aW1hdGVkVG9rZW5zID4gVkVSWV9MQVJHRV9NRU1PUllfV0FSTikge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBbU2VydmVyU3RhcnR1cF0gTWVtb3J5ICcke21lbW9yeU5hbWV9JyBpcyB2ZXJ5IGxhcmdlIGAgK1xuICAgICAgICBgKH4ke2VzdGltYXRlZFRva2Vuc30gdG9rZW5zLCByZWNvbW1lbmRlZDogJHtWRVJZX0xBUkdFX01FTU9SWV9XQVJOfSkuIGAgK1xuICAgICAgICBgVGhpcyBtYXkgaW1wYWN0IHN0YXJ0dXAgdGltZS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgaWYgKGVzdGltYXRlZFRva2VucyA+IExBUkdFX01FTU9SWV9XQVJOKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgW1NlcnZlclN0YXJ0dXBdIE1lbW9yeSAnJHttZW1vcnlOYW1lfScgaXMgbGFyZ2UgKH4ke2VzdGltYXRlZFRva2Vuc30gdG9rZW5zKS5gKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG1lbW9yeSBzaG91bGQgYmUgc2tpcHBlZCBkdWUgdG8gYnVkZ2V0IGxpbWl0c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRTa2lwTWVtb3J5KFxuICAgIG1lbW9yeU5hbWU6IHN0cmluZyxcbiAgICBlc3RpbWF0ZWRUb2tlbnM6IG51bWJlcixcbiAgICB0b3RhbFRva2VuczogbnVtYmVyLFxuICAgIHNpbmdsZUxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgdG90YWxCdWRnZXQ6IG51bWJlclxuICApOiB7IHNraXA6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9IHtcbiAgICAvLyBDaGVjayBzaW5nbGUgbWVtb3J5IGxpbWl0XG4gICAgaWYgKHNpbmdsZUxpbWl0ICE9PSB1bmRlZmluZWQgJiYgZXN0aW1hdGVkVG9rZW5zID4gc2luZ2xlTGltaXQpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW1NlcnZlclN0YXJ0dXBdIFNraXBwaW5nICcke21lbW9yeU5hbWV9JyAtIGAgK1xuICAgICAgICBgZXhjZWVkcyBjb25maWd1cmVkIHNpbmdsZSBtZW1vcnkgbGltaXQgKCR7ZXN0aW1hdGVkVG9rZW5zfSA+ICR7c2luZ2xlTGltaXR9IHRva2VucylgXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsgc2tpcDogdHJ1ZSwgcmVhc29uOiAnc2luZ2xlX2xpbWl0JyB9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRvdGFsIGJ1ZGdldFxuICAgIGlmICh0b3RhbFRva2VucyArIGVzdGltYXRlZFRva2VucyA+IHRvdGFsQnVkZ2V0KSB7XG4gICAgICByZXR1cm4geyBza2lwOiB0cnVlLCByZWFzb246ICdidWRnZXRfZXhjZWVkZWQnIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2tpcDogZmFsc2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgZXJyb3IgcmVjb3Zlcnkgc3VnZ2VzdGlvbnMgYmFzZWQgb24gZXJyb3IgdHlwZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dBdXRvTG9hZEVycm9yU3VnZ2VzdGlvbnMoZXJyb3JNZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdFTk9FTlQnKSB8fCBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBmb3VuZCcpKSB7XG4gICAgICBsb2dnZXIuaW5mbygnW1NlcnZlclN0YXJ0dXBdIFRpcDogTWVtb3J5IGZpbGVzIG1heSBub3QgZXhpc3QgeWV0LiBUaGV5IHdpbGwgYmUgY3JlYXRlZCBvbiBmaXJzdCB1c2UuJyk7XG4gICAgfSBlbHNlIGlmIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ0VBQ0NFUycpIHx8IGVycm9yTWVzc2FnZS5pbmNsdWRlcygncGVybWlzc2lvbicpKSB7XG4gICAgICBsb2dnZXIud2FybignW1NlcnZlclN0YXJ0dXBdIFRpcDogQ2hlY2sgZmlsZSBwZXJtaXNzaW9ucyBmb3Igfi8uZG9sbGhvdXNlL3BvcnRmb2xpby9tZW1vcmllcy8nKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnWUFNTCcpIHx8IGVycm9yTWVzc2FnZS5pbmNsdWRlcygncGFyc2UnKSkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1tTZXJ2ZXJTdGFydHVwXSBUaXA6IENoZWNrIFlBTUwgc3ludGF4IGluIG1lbW9yeSBmaWxlcy4gVXNlIGRvbGxob3VzZSB2YWxpZGF0ZSB0byBkaWFnbm9zZS4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhdXRvLWxvYWQgbWVtb3JpZXNcbiAgICogSXNzdWUgIzE0MzA6IEF1dG9tYXRpY2FsbHkgbG9hZCBiYXNlbGluZSBtZW1vcmllcyBvbiBzZXJ2ZXIgc3RhcnR1cFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQXV0b0xvYWRNZW1vcmllcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCB0b3RhbFRva2VucyA9IDA7XG4gICAgbGV0IGxvYWRlZENvdW50ID0gMDtcbiAgICBsZXQgc2tpcHBlZENvdW50ID0gMDtcbiAgICBsZXQgd2FybmluZ0NvdW50ID0gMDtcbiAgICBjb25zdCBlbWVyZ2VuY3lEaXNhYmxlZCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9ESVNBQkxFX0FVVE9MT0FEID09PSAndHJ1ZSc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRklYOiBETUNQLVNFQy0wMDYgLSBBZGQgYXVkaXQgbG9nZ2luZyBmb3Igc2VjdXJpdHkgb3BlcmF0aW9uc1xuICAgICAgLy8gQ2hlY2sgZm9yIGVtZXJnZW5jeSBkaXNhYmxlXG4gICAgICBpZiAoZW1lcmdlbmN5RGlzYWJsZWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tTZXJ2ZXJTdGFydHVwXSBBdXRvLWxvYWQgZGlzYWJsZWQgdmlhIERPTExIT1VTRV9ESVNBQkxFX0FVVE9MT0FEJyk7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1NlcnZlclN0YXJ0dXAuaW5pdGlhbGl6ZUF1dG9Mb2FkTWVtb3JpZXMnLFxuICAgICAgICAgIGRldGFpbHM6ICdBdXRvLWxvYWQgbWVtb3JpZXMgZGlzYWJsZWQgdmlhIGVtZXJnZW5jeSBlbnZpcm9ubWVudCB2YXJpYWJsZScsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgcmVhc29uOiAnRE9MTEhPVVNFX0RJU0FCTEVfQVVUT0xPQUQ9dHJ1ZScgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBhdXRvLWxvYWQgaXMgZW5hYmxlZCBpbiBjb25maWcgKERJOiB1c2UgdGhpcy5jb25maWdNYW5hZ2VyKVxuICAgICAgYXdhaXQgdGhpcy5jb25maWdNYW5hZ2VyLmluaXRpYWxpemUoKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcblxuICAgICAgaWYgKCFjb25maWcuYXV0b0xvYWQuZW5hYmxlZCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1tTZXJ2ZXJTdGFydHVwXSBBdXRvLWxvYWQgbWVtb3JpZXMgZGlzYWJsZWQgaW4gY29uZmlndXJhdGlvbicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIERJOiB1c2UgdGhpcy5tZW1vcnlNYW5hZ2VyIGluc3RlYWQgb2YgbmV3IE1lbW9yeU1hbmFnZXIoKVxuICAgICAgY29uc3QgbWVtb3J5TWFuYWdlciA9IHRoaXMubWVtb3J5TWFuYWdlcjtcblxuICAgICAgLy8gSXNzdWUgIzE0MzA6IEluc3RhbGwgc2VlZCBtZW1vcmllcyBiZWZvcmUgbG9hZGluZyBhdXRvLWxvYWQgbWVtb3JpZXNcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBiYXNlbGluZSBrbm93bGVkZ2UgaXMgYXZhaWxhYmxlIG9uIGZpcnN0IHJ1blxuICAgICAgbG9nZ2VyLmluZm8oJ1tTZXJ2ZXJTdGFydHVwXSDwn4yxIEluc3RhbGxpbmcgc2VlZCBtZW1vcmllcy4uLicpO1xuICAgICAgYXdhaXQgbWVtb3J5TWFuYWdlci5pbnN0YWxsU2VlZE1lbW9yaWVzKCk7XG4gICAgICBsb2dnZXIuaW5mbygnW1NlcnZlclN0YXJ0dXBdIOKchSBTZWVkIGluc3RhbGxhdGlvbiBjb21wbGV0ZScpO1xuXG4gICAgICBsb2dnZXIuaW5mbygnW1NlcnZlclN0YXJ0dXBdIPCflI0gRmV0Y2hpbmcgYXV0by1sb2FkIG1lbW9yaWVzLi4uJyk7XG4gICAgICBjb25zdCBhdXRvTG9hZE1lbW9yaWVzID0gYXdhaXQgbWVtb3J5TWFuYWdlci5nZXRBdXRvTG9hZE1lbW9yaWVzKCk7XG4gICAgICBsb2dnZXIuaW5mbyhgW1NlcnZlclN0YXJ0dXBdIPCfk4sgQXV0by1sb2FkIG1lbW9yaWVzIGZvdW5kOiAke2F1dG9Mb2FkTWVtb3JpZXMubGVuZ3RofWApO1xuXG4gICAgICBpZiAoYXV0b0xvYWRNZW1vcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tTZXJ2ZXJTdGFydHVwXSDimqDvuI8gIE5vIGF1dG8tbG9hZCBtZW1vcmllcyBjb25maWd1cmVkIC0gYmFzZWxpbmUga25vd2xlZGdlIG1heSBub3QgYmUgYXZhaWxhYmxlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlci1jb25maWd1cmVkIGxpbWl0cyAoaGFyZCBlbmZvcmNlbWVudCBpZiBzZXQpXG4gICAgICAvLyBQUiAjMTQzNjogVmFsaWRhdGUgbWF4VG9rZW5CdWRnZXQgd2l0aCBib3VuZHMgYW5kIHVzZXIgd2FybmluZ1xuICAgICAgLy8gTWluaW11bTogMTAwIHRva2VucyAoZW5vdWdoIGZvciBtaW5pbWFsIGJhc2VsaW5lIGtub3dsZWRnZSlcbiAgICAgIC8vIE1heGltdW06IDUwLDAwMCB0b2tlbnMgKHByZXZlbnRzIGV4Y2Vzc2l2ZSBzdGFydHVwIHRpbWUgYW5kIG1lbW9yeSB1c2FnZSlcbiAgICAgIC8vIERlZmF1bHQ6IDUsMDAwIHRva2VucyAoYmFsYW5jZWQgZm9yIHR5cGljYWwgdXNlIGNhc2VzKVxuICAgICAgY29uc3QgY29uZmlndXJlZEJ1ZGdldCA9IGNvbmZpZy5hdXRvTG9hZC5tYXhUb2tlbkJ1ZGdldCB8fCA1MDAwO1xuICAgICAgY29uc3QgdG90YWxCdWRnZXQgPSBNYXRoLm1heCgxMDAsIE1hdGgubWluKDUwMDAwLCBjb25maWd1cmVkQnVkZ2V0KSk7XG5cbiAgICAgIC8vIFBSICMxNDM2OiBXYXJuIGlmIGNvbmZpZ3VyZWQgYnVkZ2V0IHdhcyBjbGFtcGVkIHRvIHZhbGlkIHJhbmdlXG4gICAgICBpZiAoY29uZmlndXJlZEJ1ZGdldCAhPT0gdG90YWxCdWRnZXQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFtTZXJ2ZXJTdGFydHVwXSBDb25maWd1cmVkIG1heFRva2VuQnVkZ2V0ICgke2NvbmZpZ3VyZWRCdWRnZXR9KSBgICtcbiAgICAgICAgICBgd2FzIGFkanVzdGVkIHRvICR7dG90YWxCdWRnZXR9ICh2YWxpZCByYW5nZTogMTAwLTUwLDAwMClgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNpbmdsZUxpbWl0ID0gY29uZmlnLmF1dG9Mb2FkLm1heFNpbmdsZU1lbW9yeVRva2VuczsgLy8gdW5kZWZpbmVkID0gbm8gbGltaXRcbiAgICAgIGNvbnN0IHN1cHByZXNzV2FybmluZ3MgPSBjb25maWcuYXV0b0xvYWQuc3VwcHJlc3NMYXJnZU1lbW9yeVdhcm5pbmdzIHx8IGZhbHNlO1xuXG4gICAgICBmb3IgKGNvbnN0IG1lbW9yeSBvZiBhdXRvTG9hZE1lbW9yaWVzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucHJvY2Vzc0F1dG9Mb2FkTWVtb3J5KFxuICAgICAgICAgIG1lbW9yeSxcbiAgICAgICAgICBtZW1vcnlNYW5hZ2VyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRvdGFsVG9rZW5zLFxuICAgICAgICAgICAgc2luZ2xlTGltaXQsXG4gICAgICAgICAgICB0b3RhbEJ1ZGdldCxcbiAgICAgICAgICAgIHN1cHByZXNzV2FybmluZ3MsXG4gICAgICAgICAgICB0b3RhbE1lbW9yaWVzOiBhdXRvTG9hZE1lbW9yaWVzLmxlbmd0aCxcbiAgICAgICAgICAgIGxvYWRlZENvdW50XG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuYnJlYWtMb29wKSB7XG4gICAgICAgICAgc2tpcHBlZENvdW50ICs9IHJlc3VsdC5za2lwcGVkQ291bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LnNraXApIHtcbiAgICAgICAgICBza2lwcGVkQ291bnQrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvdGFsVG9rZW5zICs9IHJlc3VsdC5lc3RpbWF0ZWRUb2tlbnM7XG4gICAgICAgIGxvYWRlZENvdW50Kys7XG4gICAgICAgIHdhcm5pbmdDb3VudCArPSByZXN1bHQud2FybmluZ3M7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW1NlcnZlclN0YXJ0dXBdIEF1dG8tbG9hZCBjb21wbGV0ZTogJHtsb2FkZWRDb3VudH0gbWVtb3JpZXMgbG9hZGVkIGAgK1xuICAgICAgICBgKH4ke3RvdGFsVG9rZW5zfSB0b2tlbnMpLCAke3NraXBwZWRDb3VudH0gc2tpcHBlZCwgJHt3YXJuaW5nQ291bnR9IHdhcm5pbmdzYFxuICAgICAgKTtcblxuICAgICAgLy8gU3VtbWFyeSBldmVudCDigJQgZmlyZXMgb25jZSBwZXIgc3RhcnR1cCwga2VlcCBhcyBzZWN1cml0eSBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnU2VydmVyU3RhcnR1cC5pbml0aWFsaXplQXV0b0xvYWRNZW1vcmllcycsXG4gICAgICAgIGRldGFpbHM6IGBBdXRvLWxvYWQgY29tcGxldGU6ICR7bG9hZGVkQ291bnR9IGxvYWRlZCwgJHtza2lwcGVkQ291bnR9IHNraXBwZWRgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGxvYWRlZENvdW50LFxuICAgICAgICAgIHNraXBwZWRDb3VudCxcbiAgICAgICAgICB3YXJuaW5nQ291bnQsXG4gICAgICAgICAgdG90YWxUb2tlbnMsXG4gICAgICAgICAgbG9hZFRpbWVNczogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRU5IQU5DRUQgRVJST1IgSEFORExJTkc6IElzc3VlICMxNDMwXG4gICAgICAvLyBEb24ndCBmYWlsIHN0YXJ0dXAgaWYgYXV0by1sb2FkIGZhaWxzLCBidXQgcHJvdmlkZSBkZXRhaWxlZCBkaWFnbm9zdGljc1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgY29uc3QgZXJyb3JUeXBlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgOiAnVW5rbm93bic7XG5cbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgW1NlcnZlclN0YXJ0dXBdIEZhaWxlZCB0byBsb2FkIGF1dG8tbG9hZCBtZW1vcmllcyAoJHtlcnJvclR5cGV9KTogJHtlcnJvck1lc3NhZ2V9YFxuICAgICAgKTtcblxuICAgICAgLy8gUHJvdmlkZSBoZWxwZnVsIHJlY292ZXJ5IHN1Z2dlc3Rpb25zIGJhc2VkIG9uIGVycm9yIHR5cGVcbiAgICAgIHRoaXMubG9nQXV0b0xvYWRFcnJvclN1Z2dlc3Rpb25zKGVycm9yTWVzc2FnZSk7XG5cbiAgICAgIC8vIFJlY29yZCBlcnJvciBpbiB0ZWxlbWV0cnkgZm9yIGRpYWdub3N0aWNzXG4gICAgICBsb2FkZWRDb3VudCA9IDA7XG4gICAgICB0b3RhbFRva2VucyA9IDA7XG5cbiAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQXVkaXQgbG9nIGF1dG8tbG9hZCBmYWlsdXJlXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfTE9BRF9GQUlMRUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1NlcnZlclN0YXJ0dXAuaW5pdGlhbGl6ZUF1dG9Mb2FkTWVtb3JpZXMnLFxuICAgICAgICBkZXRhaWxzOiBgQXV0by1sb2FkIG1lbW9yaWVzIGZhaWxlZDogJHtlcnJvclR5cGV9IC0gJHtlcnJvck1lc3NhZ2V9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBlcnJvclR5cGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICAgIGxvYWRUaW1lTXM6IERhdGUubm93KCkgLSBzdGFydFRpbWVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlY29yZCB0ZWxlbWV0cnlcbiAgICAgIGNvbnN0IG1ldHJpY3M6IEF1dG9Mb2FkTWV0cmljcyA9IHtcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHZlcnNpb246IFZFUlNJT04sXG4gICAgICAgIG1lbW9yeUNvdW50OiBsb2FkZWRDb3VudCxcbiAgICAgICAgdG90YWxUb2tlbnMsXG4gICAgICAgIGxvYWRUaW1lTXM6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgIHNraXBwZWRDb3VudCxcbiAgICAgICAgd2FybmluZ0NvdW50LFxuICAgICAgICBidWRnZXRFeGNlZWRlZDogc2tpcHBlZENvdW50ID4gMCxcbiAgICAgICAgZW1lcmdlbmN5RGlzYWJsZWRcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMub3BlcmF0aW9uYWxUZWxlbWV0cnkucmVjb3JkQXV0b0xvYWRNZXRyaWNzKG1ldHJpY3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWlncmF0aW9uIHN0YXR1cyB3aXRob3V0IHBlcmZvcm1pbmcgbWlncmF0aW9uXG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25TdGF0dXMoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubWlncmF0aW9uTWFuYWdlci5nZXRNaWdyYXRpb25TdGF0dXMoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgcGVyc29uYXMgZGlyZWN0b3J5IHBhdGggZm9yIGxlZ2FjeSBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBnZXRQZXJzb25hc0RpcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5QRVJTT05BKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIHJlc291cmNlcyBhbmQgY2xlYW51cFxuICAgKiBDbGVhbnMgdXAgbWFuYWdlcnMgYW5kIHRlbGVtZXRyeSB0byBwcmV2ZW50IG9wZW4gaGFuZGxlc1xuICAgKi9cbiAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBEaXNwb3NlIE1lbW9yeU1hbmFnZXIgKGNsZWFucyB1cCBmaWxlIHdhdGNoZXJzKVxuICAgIHRoaXMubWVtb3J5TWFuYWdlci5kaXNwb3NlKCk7XG5cbiAgICAvLyBTaHV0ZG93biB0ZWxlbWV0cnkgKGZsdXNoZXMgUG9zdEhvZyBldmVudHMpXG4gICAgYXdhaXQgdGhpcy5vcGVyYXRpb25hbFRlbGVtZXRyeS5zaHV0ZG93bigpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKCdbU2VydmVyU3RhcnR1cF0gRGlzcG9zZWQgYW5kIGNsZWFuZWQgdXAgcmVzb3VyY2VzJyk7XG4gIH1cbn1cbiJdfQ==
|