@dollhousemcp/mcp-server 2.0.0-rc.5 → 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 +54 -17
- 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/editElement.d.ts.map +1 -1
- package/dist/handlers/element-crud/editElement.js +39 -18
- package/dist/handlers/element-crud/helpers.d.ts.map +1 -1
- package/dist/handlers/element-crud/helpers.js +30 -3
- 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/GatekeeperTypes.d.ts +4 -0
- package/dist/handlers/mcp-aql/GatekeeperTypes.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/GatekeeperTypes.js +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +33 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +232 -23
- 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/UnifiedEndpoint.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/UnifiedEndpoint.js +4 -3
- 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/ElementPolicies.d.ts +17 -0
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.js +91 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts +5 -3
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.js +56 -2
- package/dist/handlers/mcp-aql/types.d.ts +22 -0
- package/dist/handlers/mcp-aql/types.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/types.js +47 -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 +8 -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/PolicyExportService.d.ts.map +1 -1
- package/dist/services/PolicyExportService.js +8 -1
- 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
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { logger } from './logger.js';
|
|
6
6
|
import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
|
|
7
|
+
import { freemem, totalmem, loadavg } from 'node:os';
|
|
7
8
|
export class PerformanceMonitor {
|
|
8
9
|
searchMetrics = [];
|
|
9
10
|
slowQueries = [];
|
|
@@ -363,14 +364,13 @@ export class PerformanceMonitor {
|
|
|
363
364
|
};
|
|
364
365
|
}
|
|
365
366
|
getSystemStats() {
|
|
366
|
-
const os = require('os');
|
|
367
367
|
return {
|
|
368
368
|
cpuUsage: process.cpuUsage().user / 1000000, // Convert to seconds
|
|
369
|
-
loadAverage:
|
|
370
|
-
freeMemory:
|
|
371
|
-
totalMemory:
|
|
369
|
+
loadAverage: loadavg(),
|
|
370
|
+
freeMemory: freemem(),
|
|
371
|
+
totalMemory: totalmem(),
|
|
372
372
|
uptime: process.uptime()
|
|
373
373
|
};
|
|
374
374
|
}
|
|
375
375
|
}
|
|
376
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyZm9ybWFuY2VNb25pdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL1BlcmZvcm1hbmNlTW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBd0Q5RSxNQUFNLE9BQU8sa0JBQWtCO0lBQ3JCLGFBQWEsR0FBb0IsRUFBRSxDQUFDO0lBQ3BDLFdBQVcsR0FBZ0IsRUFBRSxDQUFDO0lBQzlCLGVBQWUsR0FBa0IsRUFBRSxDQUFDO0lBQ3BDLFlBQVksR0FBa0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVoRSxnQkFBZ0I7SUFDQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDekIsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSztJQUMvQixzQkFBc0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxhQUFhO0lBQzdDLGNBQWMsR0FBRyxHQUFHLENBQUM7SUFFdEMsdUJBQXVCO0lBQ2YscUJBQXFCLENBQWtCO0lBQ3ZDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFckIsV0FBVyxDQUF5RztJQUU1SCxjQUFjLENBQUMsRUFBeUc7UUFDdEgsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsT0FBTyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsZ0JBQWUsQ0FBQztJQUVoQjs7T0FFRztJQUNILGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRTdCLE1B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QUM7UUFFekIsT0FBTztZQUNMLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRSxxQkFBcUI7WUFDbEUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUU7WUFDekIsVUFBVSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUU7WUFDeEIsV0FBVyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUU7WUFDMUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUU7U0FDekIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tcHJlaGVuc2l2ZSBQZXJmb3JtYW5jZSBNb25pdG9yaW5nIFN5c3RlbVxuICogVHJhY2tzIHNlYXJjaCB0aW1lcywgbWVtb3J5IHVzYWdlLCBjYWNoZSBwZXJmb3JtYW5jZSwgYW5kIHN5c3RlbSBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVyZm9ybWFuY2VNZXRyaWNzIHtcbiAgc2VhcmNoVGltZXM6IG51bWJlcltdO1xuICBtZW1vcnlVc2FnZTogTWVtb3J5VXNhZ2VbXTtcbiAgY2FjaGVTdGF0czogQ2FjaGVQZXJmb3JtYW5jZTtcbiAgc3lzdGVtU3RhdHM6IFN5c3RlbVN0YXRzO1xuICB0aW1lc3RhbXA6IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5VXNhZ2Uge1xuICBoZWFwVXNlZDogbnVtYmVyO1xuICBoZWFwVG90YWw6IG51bWJlcjtcbiAgcnNzOiBudW1iZXI7XG4gIGV4dGVybmFsOiBudW1iZXI7XG4gIHRpbWVzdGFtcDogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZVBlcmZvcm1hbmNlIHtcbiAgaGl0UmF0ZTogbnVtYmVyO1xuICBhdmdIaXRUaW1lOiBudW1iZXI7XG4gIGF2Z01pc3NUaW1lOiBudW1iZXI7XG4gIHRvdGFsSGl0czogbnVtYmVyO1xuICB0b3RhbE1pc3NlczogbnVtYmVyO1xuICBldmljdGlvbnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeXN0ZW1TdGF0cyB7XG4gIGNwdVVzYWdlOiBudW1iZXI7XG4gIGxvYWRBdmVyYWdlOiBudW1iZXJbXTtcbiAgZnJlZU1lbW9yeTogbnVtYmVyO1xuICB0b3RhbE1lbW9yeTogbnVtYmVyO1xuICB1cHRpbWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hNZXRyaWNzIHtcbiAgcXVlcnk6IHN0cmluZztcbiAgZHVyYXRpb246IG51bWJlcjtcbiAgcmVzdWx0Q291bnQ6IG51bWJlcjtcbiAgc291cmNlczogc3RyaW5nW107XG4gIGNhY2hlSGl0OiBib29sZWFuO1xuICBtZW1vcnlCZWZvcmU6IG51bWJlcjtcbiAgbWVtb3J5QWZ0ZXI6IG51bWJlcjtcbiAgdGltZXN0YW1wOiBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNsb3dRdWVyeSB7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIGR1cmF0aW9uOiBudW1iZXI7XG4gIHRocmVzaG9sZDogbnVtYmVyO1xuICBzb3VyY2VzOiBzdHJpbmdbXTtcbiAgcmVzdWx0Q291bnQ6IG51bWJlcjtcbiAgbWVtb3J5VXNhZ2U6IG51bWJlcjtcbiAgdGltZXN0YW1wOiBEYXRlO1xufVxuXG5leHBvcnQgY2xhc3MgUGVyZm9ybWFuY2VNb25pdG9yIHtcbiAgcHJpdmF0ZSBzZWFyY2hNZXRyaWNzOiBTZWFyY2hNZXRyaWNzW10gPSBbXTtcbiAgcHJpdmF0ZSBzbG93UXVlcmllczogU2xvd1F1ZXJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBtZW1vcnlTbmFwc2hvdHM6IE1lbW9yeVVzYWdlW10gPSBbXTtcbiAgcHJpdmF0ZSBjYWNoZU1ldHJpY3M6IE1hcDxzdHJpbmcsIENhY2hlUGVyZm9ybWFuY2U+ID0gbmV3IE1hcCgpO1xuXG4gIC8vIENvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhNZXRyaWNzSGlzdG9yeSA9IDEwMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2xvd1F1ZXJ5VGhyZXNob2xkID0gMTAwOyAvLyBtc1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeVNuYXBzaG90SW50ZXJ2YWwgPSAzMDAwMDsgLy8gMzAgc2Vjb25kc1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFNsb3dRdWVyaWVzID0gMTAwO1xuXG4gIC8vIFRpbWVycyBhbmQgaW50ZXJ2YWxzXG4gIHByaXZhdGUgbWVtb3J5TW9uaXRvckludGVydmFsPzogTm9kZUpTLlRpbWVvdXQ7XG4gIHByaXZhdGUgaXNNb25pdG9yaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBsb2dMaXN0ZW5lcj86IChsZXZlbDogJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuXG4gIGFkZExvZ0xpc3RlbmVyKGZuOiAobGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubG9nTGlzdGVuZXIgPSBmbjtcbiAgICByZXR1cm4gKCkgPT4geyB0aGlzLmxvZ0xpc3RlbmVyID0gdW5kZWZpbmVkOyB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBTdGFydCBwZXJmb3JtYW5jZSBtb25pdG9yaW5nXG4gICAqL1xuICBzdGFydE1vbml0b3JpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb25pdG9yaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc01vbml0b3JpbmcgPSB0cnVlO1xuICAgIHRoaXMuc3RhcnRNZW1vcnlNb25pdG9yaW5nKCk7XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ1BlcmZvcm1hbmNlIG1vbml0b3Jpbmcgc3RhcnRlZCcsIHtcbiAgICAgIHNsb3dRdWVyeVRocmVzaG9sZDogdGhpcy5zbG93UXVlcnlUaHJlc2hvbGQsXG4gICAgICBtYXhNZXRyaWNzSGlzdG9yeTogdGhpcy5tYXhNZXRyaWNzSGlzdG9yeVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgcGVyZm9ybWFuY2UgbW9uaXRvcmluZ1xuICAgKi9cbiAgc3RvcE1vbml0b3JpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5pc01vbml0b3JpbmcgPSBmYWxzZTtcbiAgICBcbiAgICBpZiAodGhpcy5tZW1vcnlNb25pdG9ySW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5tZW1vcnlNb25pdG9ySW50ZXJ2YWwpO1xuICAgICAgdGhpcy5tZW1vcnlNb25pdG9ySW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oJ1BlcmZvcm1hbmNlIG1vbml0b3Jpbmcgc3RvcHBlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2UgbW9uaXRvcmluZyBzdGF0ZSBhbmQgdGltZXJzLlxuICAgKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BNb25pdG9yaW5nKCk7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBzZWFyY2ggcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgKi9cbiAgcmVjb3JkU2VhcmNoKG1ldHJpY3M6IFNlYXJjaE1ldHJpY3MpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNb25pdG9yaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIHF1ZXJ5IHN0cmluZyB0byBwcmV2ZW50IFVuaWNvZGUtYmFzZWQgYXR0YWNrc1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShtZXRyaWNzLnF1ZXJ5KTtcbiAgICBjb25zdCBub3JtYWxpemVkTWV0cmljcyA9IHtcbiAgICAgIC4uLm1ldHJpY3MsXG4gICAgICBxdWVyeTogdmFsaWRhdGlvblJlc3VsdC5ub3JtYWxpemVkQ29udGVudFxuICAgIH07XG5cbiAgICB0aGlzLnNlYXJjaE1ldHJpY3MucHVzaChub3JtYWxpemVkTWV0cmljcyk7XG4gICAgdGhpcy5sb2dMaXN0ZW5lcj8uKCdkZWJ1ZycsICdSZWNvcmQgc2VhcmNoJywge1xuICAgICAgcXVlcnk6IG5vcm1hbGl6ZWRNZXRyaWNzLnF1ZXJ5LnN1YnN0cmluZygwLCA1MCksXG4gICAgICBkdXJhdGlvbjogbm9ybWFsaXplZE1ldHJpY3MuZHVyYXRpb24sXG4gICAgICByZXN1bHRDb3VudDogbm9ybWFsaXplZE1ldHJpY3MucmVzdWx0Q291bnQsXG4gICAgICBjYWNoZUhpdDogbm9ybWFsaXplZE1ldHJpY3MuY2FjaGVIaXQsXG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgc2xvdyBxdWVyeSAodXNlIG5vcm1hbGl6ZWQgbWV0cmljcylcbiAgICBpZiAobm9ybWFsaXplZE1ldHJpY3MuZHVyYXRpb24gPiB0aGlzLnNsb3dRdWVyeVRocmVzaG9sZCkge1xuICAgICAgdGhpcy5yZWNvcmRTbG93UXVlcnkoe1xuICAgICAgICBxdWVyeTogbm9ybWFsaXplZE1ldHJpY3MucXVlcnksXG4gICAgICAgIGR1cmF0aW9uOiBub3JtYWxpemVkTWV0cmljcy5kdXJhdGlvbixcbiAgICAgICAgdGhyZXNob2xkOiB0aGlzLnNsb3dRdWVyeVRocmVzaG9sZCxcbiAgICAgICAgc291cmNlczogbm9ybWFsaXplZE1ldHJpY3Muc291cmNlcyxcbiAgICAgICAgcmVzdWx0Q291bnQ6IG5vcm1hbGl6ZWRNZXRyaWNzLnJlc3VsdENvdW50LFxuICAgICAgICBtZW1vcnlVc2FnZTogbm9ybWFsaXplZE1ldHJpY3MubWVtb3J5QWZ0ZXIsXG4gICAgICAgIHRpbWVzdGFtcDogbm9ybWFsaXplZE1ldHJpY3MudGltZXN0YW1wXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUcmltIGhpc3RvcnkgaWYgbmVlZGVkXG4gICAgaWYgKHRoaXMuc2VhcmNoTWV0cmljcy5sZW5ndGggPiB0aGlzLm1heE1ldHJpY3NIaXN0b3J5KSB7XG4gICAgICB0aGlzLnNlYXJjaE1ldHJpY3MgPSB0aGlzLnNlYXJjaE1ldHJpY3Muc2xpY2UoLXRoaXMubWF4TWV0cmljc0hpc3RvcnkpO1xuICAgIH1cblxuICAgIC8vIE5vdGlmeSBsaXN0ZW5lciBhYm91dCBzbG93IHF1ZXJpZXNcbiAgICBpZiAobm9ybWFsaXplZE1ldHJpY3MuZHVyYXRpb24gPiB0aGlzLnNsb3dRdWVyeVRocmVzaG9sZCkge1xuICAgICAgdGhpcy5sb2dMaXN0ZW5lcj8uKCd3YXJuJywgJ0RldGVjdCBzbG93IHF1ZXJ5Jywge1xuICAgICAgICBxdWVyeTogbm9ybWFsaXplZE1ldHJpY3MucXVlcnkuc3Vic3RyaW5nKDAsIDUwKSxcbiAgICAgICAgZHVyYXRpb246IG5vcm1hbGl6ZWRNZXRyaWNzLmR1cmF0aW9uLFxuICAgICAgICB0aHJlc2hvbGQ6IHRoaXMuc2xvd1F1ZXJ5VGhyZXNob2xkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTG9nIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGV2ZW50cyAodXNlIG5vcm1hbGl6ZWQgbWV0cmljcylcbiAgICBpZiAobm9ybWFsaXplZE1ldHJpY3MuZHVyYXRpb24gPiB0aGlzLnNsb3dRdWVyeVRocmVzaG9sZCAqIDIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdWZXJ5IHNsb3cgc2VhcmNoIGRldGVjdGVkJywge1xuICAgICAgICBxdWVyeTogbm9ybWFsaXplZE1ldHJpY3MucXVlcnkuc3Vic3RyaW5nKDAsIDUwKSxcbiAgICAgICAgZHVyYXRpb246IG5vcm1hbGl6ZWRNZXRyaWNzLmR1cmF0aW9uLFxuICAgICAgICByZXN1bHRDb3VudDogbm9ybWFsaXplZE1ldHJpY3MucmVzdWx0Q291bnQsXG4gICAgICAgIHNvdXJjZXM6IG5vcm1hbGl6ZWRNZXRyaWNzLnNvdXJjZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgY2FjaGUgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgKi9cbiAgcmVjb3JkQ2FjaGVQZXJmb3JtYW5jZShjYWNoZU5hbWU6IHN0cmluZywgc3RhdHM6IENhY2hlUGVyZm9ybWFuY2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNb25pdG9yaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIGNhY2hlIG5hbWUgdG8gcHJldmVudCBVbmljb2RlLWJhc2VkIGF0dGFja3NcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoY2FjaGVOYW1lKTtcbiAgICBjb25zdCBub3JtYWxpemVkQ2FjaGVOYW1lID0gdmFsaWRhdGlvblJlc3VsdC5ub3JtYWxpemVkQ29udGVudDtcblxuICAgIHRoaXMuY2FjaGVNZXRyaWNzLnNldChub3JtYWxpemVkQ2FjaGVOYW1lLCBzdGF0cyk7XG5cbiAgICAvLyBOb3RpZnkgbGlzdGVuZXIgYWJvdXQgbG93IGNhY2hlIGhpdCByYXRlXG4gICAgaWYgKHN0YXRzLmhpdFJhdGUgPCAwLjUpIHtcbiAgICAgIHRoaXMubG9nTGlzdGVuZXI/Lignd2FybicsICdEZXRlY3QgbG93IGNhY2hlIGhpdCByYXRlJywge1xuICAgICAgICBjYWNoZTogbm9ybWFsaXplZENhY2hlTmFtZSxcbiAgICAgICAgaGl0UmF0ZTogc3RhdHMuaGl0UmF0ZSxcbiAgICAgICAgdG90YWxPcGVyYXRpb25zOiBzdGF0cy50b3RhbEhpdHMgKyBzdGF0cy50b3RhbE1pc3NlcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExvZyBjYWNoZSBwZXJmb3JtYW5jZSB3YXJuaW5ncyAodXNlIG5vcm1hbGl6ZWQgY2FjaGUgbmFtZSlcbiAgICBpZiAoc3RhdHMuaGl0UmF0ZSA8IDAuNSkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0xvdyBjYWNoZSBoaXQgcmF0ZSBkZXRlY3RlZCcsIHtcbiAgICAgICAgY2FjaGU6IG5vcm1hbGl6ZWRDYWNoZU5hbWUsXG4gICAgICAgIGhpdFJhdGU6IHN0YXRzLmhpdFJhdGUsXG4gICAgICAgIHRvdGFsT3BlcmF0aW9uczogc3RhdHMudG90YWxIaXRzICsgc3RhdHMudG90YWxNaXNzZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29tcHJlaGVuc2l2ZSBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAqL1xuICBnZXRNZXRyaWNzKCk6IFBlcmZvcm1hbmNlTWV0cmljcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlYXJjaFRpbWVzOiB0aGlzLnNlYXJjaE1ldHJpY3MubWFwKG0gPT4gbS5kdXJhdGlvbiksXG4gICAgICBtZW1vcnlVc2FnZTogdGhpcy5tZW1vcnlTbmFwc2hvdHMuc2xpY2UoLTEwMCksIC8vIExhc3QgMTAwIHNuYXBzaG90c1xuICAgICAgY2FjaGVTdGF0czogdGhpcy5hZ2dyZWdhdGVDYWNoZVN0YXRzKCksXG4gICAgICBzeXN0ZW1TdGF0czogdGhpcy5nZXRTeXN0ZW1TdGF0cygpLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VhcmNoIHBlcmZvcm1hbmNlIHN0YXRpc3RpY3NcbiAgICovXG4gIGdldFNlYXJjaFN0YXRzKCk6IHtcbiAgICB0b3RhbFNlYXJjaGVzOiBudW1iZXI7XG4gICAgYXZlcmFnZVRpbWU6IG51bWJlcjtcbiAgICBtZWRpYW5UaW1lOiBudW1iZXI7XG4gICAgcDk1VGltZTogbnVtYmVyO1xuICAgIHA5OVRpbWU6IG51bWJlcjtcbiAgICBzbG93UXVlcmllczogbnVtYmVyO1xuICAgIGNhY2hlSGl0UmF0ZTogbnVtYmVyO1xuICB9IHtcbiAgICBpZiAodGhpcy5zZWFyY2hNZXRyaWNzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG90YWxTZWFyY2hlczogMCxcbiAgICAgICAgYXZlcmFnZVRpbWU6IDAsXG4gICAgICAgIG1lZGlhblRpbWU6IDAsXG4gICAgICAgIHA5NVRpbWU6IDAsXG4gICAgICAgIHA5OVRpbWU6IDAsXG4gICAgICAgIHNsb3dRdWVyaWVzOiAwLFxuICAgICAgICBjYWNoZUhpdFJhdGU6IDBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdGltZXMgPSB0aGlzLnNlYXJjaE1ldHJpY3MubWFwKG0gPT4gbS5kdXJhdGlvbikuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIGNvbnN0IGNhY2hlSGl0cyA9IHRoaXMuc2VhcmNoTWV0cmljcy5maWx0ZXIobSA9PiBtLmNhY2hlSGl0KS5sZW5ndGg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxTZWFyY2hlczogdGhpcy5zZWFyY2hNZXRyaWNzLmxlbmd0aCxcbiAgICAgIGF2ZXJhZ2VUaW1lOiB0aW1lcy5yZWR1Y2UoKHN1bSwgdGltZSkgPT4gc3VtICsgdGltZSwgMCkgLyB0aW1lcy5sZW5ndGgsXG4gICAgICBtZWRpYW5UaW1lOiB0aW1lc1tNYXRoLmZsb29yKHRpbWVzLmxlbmd0aCAvIDIpXSxcbiAgICAgIHA5NVRpbWU6IHRpbWVzW01hdGguZmxvb3IodGltZXMubGVuZ3RoICogMC45NSldLFxuICAgICAgcDk5VGltZTogdGltZXNbTWF0aC5mbG9vcih0aW1lcy5sZW5ndGggKiAwLjk5KV0sXG4gICAgICBzbG93UXVlcmllczogdGhpcy5zbG93UXVlcmllcy5sZW5ndGgsXG4gICAgICBjYWNoZUhpdFJhdGU6IGNhY2hlSGl0cyAvIHRoaXMuc2VhcmNoTWV0cmljcy5sZW5ndGhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljc1xuICAgKi9cbiAgZ2V0TWVtb3J5U3RhdHMoKToge1xuICAgIGN1cnJlbnRVc2FnZTogTWVtb3J5VXNhZ2U7XG4gICAgcGVha1VzYWdlOiBNZW1vcnlVc2FnZTtcbiAgICBhdmVyYWdlVXNhZ2U6IE1lbW9yeVVzYWdlO1xuICAgIGdyb3d0aFJhdGU6IG51bWJlcjsgLy8gTUIgcGVyIG1pbnV0ZVxuICB9IHtcbiAgICBpZiAodGhpcy5tZW1vcnlTbmFwc2hvdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy50YWtlTWVtb3J5U25hcHNob3QoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRVc2FnZTogY3VycmVudCxcbiAgICAgICAgcGVha1VzYWdlOiBjdXJyZW50LFxuICAgICAgICBhdmVyYWdlVXNhZ2U6IGN1cnJlbnQsXG4gICAgICAgIGdyb3d0aFJhdGU6IDBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMubWVtb3J5U25hcHNob3RzW3RoaXMubWVtb3J5U25hcHNob3RzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHBlYWsgPSB0aGlzLm1lbW9yeVNuYXBzaG90cy5yZWR1Y2UoKG1heCwgc25hcHNob3QpID0+XG4gICAgICBzbmFwc2hvdC5oZWFwVXNlZCA+IG1heC5oZWFwVXNlZCA/IHNuYXBzaG90IDogbWF4LFxuICAgICAgdGhpcy5tZW1vcnlTbmFwc2hvdHNbMF1cbiAgICApO1xuXG4gICAgY29uc3QgdG90YWxIZWFwID0gdGhpcy5tZW1vcnlTbmFwc2hvdHMucmVkdWNlKChzdW0sIHNuYXBzaG90KSA9PiBzdW0gKyBzbmFwc2hvdC5oZWFwVXNlZCwgMCk7XG4gICAgY29uc3QgdG90YWxSc3MgPSB0aGlzLm1lbW9yeVNuYXBzaG90cy5yZWR1Y2UoKHN1bSwgc25hcHNob3QpID0+IHN1bSArIHNuYXBzaG90LnJzcywgMCk7XG4gICAgY29uc3QgYXZlcmFnZTogTWVtb3J5VXNhZ2UgPSB7XG4gICAgICBoZWFwVXNlZDogdG90YWxIZWFwIC8gdGhpcy5tZW1vcnlTbmFwc2hvdHMubGVuZ3RoLFxuICAgICAgaGVhcFRvdGFsOiB0aGlzLm1lbW9yeVNuYXBzaG90cy5yZWR1Y2UoKHN1bSwgcykgPT4gc3VtICsgcy5oZWFwVG90YWwsIDApIC8gdGhpcy5tZW1vcnlTbmFwc2hvdHMubGVuZ3RoLFxuICAgICAgcnNzOiB0b3RhbFJzcyAvIHRoaXMubWVtb3J5U25hcHNob3RzLmxlbmd0aCxcbiAgICAgIGV4dGVybmFsOiB0aGlzLm1lbW9yeVNuYXBzaG90cy5yZWR1Y2UoKHN1bSwgcykgPT4gc3VtICsgcy5leHRlcm5hbCwgMCkgLyB0aGlzLm1lbW9yeVNuYXBzaG90cy5sZW5ndGgsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKClcbiAgICB9O1xuXG4gICAgLy8gQ2FsY3VsYXRlIGdyb3d0aCByYXRlIChNQiBwZXIgbWludXRlKVxuICAgIGxldCBncm93dGhSYXRlID0gMDtcbiAgICBpZiAodGhpcy5tZW1vcnlTbmFwc2hvdHMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5tZW1vcnlTbmFwc2hvdHNbMF07XG4gICAgICBjb25zdCB0aW1lRGlmZiA9IChjdXJyZW50LnRpbWVzdGFtcC5nZXRUaW1lKCkgLSBvbGRlc3QudGltZXN0YW1wLmdldFRpbWUoKSkgLyA2MDAwMDsgLy8gbWludXRlc1xuICAgICAgY29uc3QgbWVtb3J5RGlmZiA9IChjdXJyZW50LmhlYXBVc2VkIC0gb2xkZXN0LmhlYXBVc2VkKSAvICgxMDI0ICogMTAyNCk7IC8vIE1CXG4gICAgICBncm93dGhSYXRlID0gdGltZURpZmYgPiAwID8gbWVtb3J5RGlmZiAvIHRpbWVEaWZmIDogMDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFVzYWdlOiBjdXJyZW50LFxuICAgICAgcGVha1VzYWdlOiBwZWFrLFxuICAgICAgYXZlcmFnZVVzYWdlOiBhdmVyYWdlLFxuICAgICAgZ3Jvd3RoUmF0ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNsb3cgcXVlcmllcyB3aXRoIGFuYWx5c2lzXG4gICAqL1xuICBnZXRTbG93UXVlcmllcyhsaW1pdDogbnVtYmVyID0gMTApOiBTbG93UXVlcnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2xvd1F1ZXJpZXNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmR1cmF0aW9uIC0gYS5kdXJhdGlvbilcbiAgICAgIC5zbGljZSgwLCBsaW1pdCk7XG4gIH1cblxuICAvKipcbiAgICogQW5hbHl6ZSBwZXJmb3JtYW5jZSB0cmVuZHNcbiAgICovXG4gIGFuYWx5emVUcmVuZHMoKToge1xuICAgIHBlcmZvcm1hbmNlVHJlbmQ6ICdpbXByb3ZpbmcnIHwgJ2RlZ3JhZGluZycgfCAnc3RhYmxlJztcbiAgICBtZW1vcnlUcmVuZDogJ2dyb3dpbmcnIHwgJ3Nocmlua2luZycgfCAnc3RhYmxlJztcbiAgICByZWNvbW1lbmRhdGlvbnM6IHN0cmluZ1tdO1xuICB9IHtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgLy8gQW5hbHl6ZSBzZWFyY2ggcGVyZm9ybWFuY2UgdHJlbmRcbiAgICBsZXQgcGVyZm9ybWFuY2VUcmVuZDogJ2ltcHJvdmluZycgfCAnZGVncmFkaW5nJyB8ICdzdGFibGUnID0gJ3N0YWJsZSc7XG4gICAgaWYgKHRoaXMuc2VhcmNoTWV0cmljcy5sZW5ndGggPiAxMCkge1xuICAgICAgY29uc3QgcmVjZW50ID0gdGhpcy5zZWFyY2hNZXRyaWNzLnNsaWNlKC0xMCkubWFwKG0gPT4gbS5kdXJhdGlvbik7XG4gICAgICBjb25zdCBvbGRlciA9IHRoaXMuc2VhcmNoTWV0cmljcy5zbGljZSgtMjAsIC0xMCkubWFwKG0gPT4gbS5kdXJhdGlvbik7XG4gICAgICBcbiAgICAgIGlmIChyZWNlbnQubGVuZ3RoID4gMCAmJiBvbGRlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlY2VudEF2ZyA9IHJlY2VudC5yZWR1Y2UoKHN1bSwgdCkgPT4gc3VtICsgdCwgMCkgLyByZWNlbnQubGVuZ3RoO1xuICAgICAgICBjb25zdCBvbGRlckF2ZyA9IG9sZGVyLnJlZHVjZSgoc3VtLCB0KSA9PiBzdW0gKyB0LCAwKSAvIG9sZGVyLmxlbmd0aDtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZWNlbnRBdmcgPiBvbGRlckF2ZyAqIDEuMikge1xuICAgICAgICAgIHBlcmZvcm1hbmNlVHJlbmQgPSAnZGVncmFkaW5nJztcbiAgICAgICAgICByZWNvbW1lbmRhdGlvbnMucHVzaCgnU2VhcmNoIHBlcmZvcm1hbmNlIGlzIGRlZ3JhZGluZy4gQ29uc2lkZXIgY2FjaGUgb3B0aW1pemF0aW9uIG9yIGluZGV4IHJlYnVpbGRpbmcuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVjZW50QXZnIDwgb2xkZXJBdmcgKiAwLjgpIHtcbiAgICAgICAgICBwZXJmb3JtYW5jZVRyZW5kID0gJ2ltcHJvdmluZyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbmFseXplIG1lbW9yeSB0cmVuZFxuICAgIGNvbnN0IG1lbW9yeVN0YXRzID0gdGhpcy5nZXRNZW1vcnlTdGF0cygpO1xuICAgIGxldCBtZW1vcnlUcmVuZDogJ2dyb3dpbmcnIHwgJ3Nocmlua2luZycgfCAnc3RhYmxlJyA9ICdzdGFibGUnO1xuICAgIFxuICAgIGlmIChtZW1vcnlTdGF0cy5ncm93dGhSYXRlID4gMSkgeyAvLyBHcm93aW5nIGJ5IG1vcmUgdGhhbiAxTUIvbWludXRlXG4gICAgICBtZW1vcnlUcmVuZCA9ICdncm93aW5nJztcbiAgICAgIHJlY29tbWVuZGF0aW9ucy5wdXNoKCdNZW1vcnkgdXNhZ2UgaXMgZ3Jvd2luZyByYXBpZGx5LiBDb25zaWRlciBjYWNoZSBjbGVhbnVwIG9yIG1lbW9yeSBsaW1pdHMuJyk7XG4gICAgfSBlbHNlIGlmIChtZW1vcnlTdGF0cy5ncm93dGhSYXRlIDwgLTEpIHtcbiAgICAgIG1lbW9yeVRyZW5kID0gJ3Nocmlua2luZyc7XG4gICAgfVxuXG4gICAgLy8gQ2FjaGUgcGVyZm9ybWFuY2UgcmVjb21tZW5kYXRpb25zXG4gICAgY29uc3QgY2FjaGVTdGF0cyA9IHRoaXMuYWdncmVnYXRlQ2FjaGVTdGF0cygpO1xuICAgIGlmIChjYWNoZVN0YXRzLmhpdFJhdGUgPCAwLjYpIHtcbiAgICAgIHJlY29tbWVuZGF0aW9ucy5wdXNoKCdDYWNoZSBoaXQgcmF0ZSBpcyBsb3cuIENvbnNpZGVyIGFkanVzdGluZyBjYWNoZSBzaXplIG9yIFRUTCBzZXR0aW5ncy4nKTtcbiAgICB9XG5cbiAgICAvLyBTbG93IHF1ZXJ5IHJlY29tbWVuZGF0aW9uc1xuICAgIGlmICh0aGlzLnNsb3dRdWVyaWVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICByZWNvbW1lbmRhdGlvbnMucHVzaCgnTXVsdGlwbGUgc2xvdyBxdWVyaWVzIGRldGVjdGVkLiBDb25zaWRlciBxdWVyeSBvcHRpbWl6YXRpb24gb3IgaW5jcmVhc2VkIGNhY2hpbmcuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcmZvcm1hbmNlVHJlbmQsXG4gICAgICBtZW1vcnlUcmVuZCxcbiAgICAgIHJlY29tbWVuZGF0aW9uc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgYWxsIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoTWV0cmljcyA9IFtdO1xuICAgIHRoaXMuc2xvd1F1ZXJpZXMgPSBbXTtcbiAgICB0aGlzLm1lbW9yeVNuYXBzaG90cyA9IFtdO1xuICAgIHRoaXMuY2FjaGVNZXRyaWNzLmNsZWFyKCk7XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ1BlcmZvcm1hbmNlIG1ldHJpY3MgcmVzZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgbWV0cmljcyBmb3IgZXh0ZXJuYWwgYW5hbHlzaXNcbiAgICovXG4gIGV4cG9ydE1ldHJpY3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgc2VhcmNoTWV0cmljczogdGhpcy5zZWFyY2hNZXRyaWNzLFxuICAgICAgc2xvd1F1ZXJpZXM6IHRoaXMuc2xvd1F1ZXJpZXMsXG4gICAgICBtZW1vcnlTbmFwc2hvdHM6IHRoaXMubWVtb3J5U25hcHNob3RzLFxuICAgICAgY2FjaGVNZXRyaWNzOiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5jYWNoZU1ldHJpY3MpLFxuICAgICAgZXhwb3J0VGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICB9O1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBtZXRob2RzXG5cbiAgcHJpdmF0ZSByZWNvcmRTbG93UXVlcnkocXVlcnk6IFNsb3dRdWVyeSk6IHZvaWQge1xuICAgIHRoaXMuc2xvd1F1ZXJpZXMucHVzaChxdWVyeSk7XG5cbiAgICAvLyBUcmltIHNsb3cgcXVlcmllcyBoaXN0b3J5XG4gICAgaWYgKHRoaXMuc2xvd1F1ZXJpZXMubGVuZ3RoID4gdGhpcy5tYXhTbG93UXVlcmllcykge1xuICAgICAgdGhpcy5zbG93UXVlcmllcyA9IHRoaXMuc2xvd1F1ZXJpZXMuc2xpY2UoLXRoaXMubWF4U2xvd1F1ZXJpZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRNZW1vcnlNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1lbW9yeU1vbml0b3JJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLm1lbW9yeU1vbml0b3JJbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgdGhpcy5tZW1vcnlNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc01vbml0b3JpbmcpIHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnRha2VNZW1vcnlTbmFwc2hvdCgpO1xuICAgICAgICB0aGlzLm1lbW9yeVNuYXBzaG90cy5wdXNoKHNuYXBzaG90KTtcblxuICAgICAgICAvLyBUcmltIG1lbW9yeSBzbmFwc2hvdHMgKGtlZXAgbGFzdCAyMDApXG4gICAgICAgIGlmICh0aGlzLm1lbW9yeVNuYXBzaG90cy5sZW5ndGggPiAyMDApIHtcbiAgICAgICAgICB0aGlzLm1lbW9yeVNuYXBzaG90cyA9IHRoaXMubWVtb3J5U25hcHNob3RzLnNsaWNlKC0yMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgdGhpcy5tZW1vcnlTbmFwc2hvdEludGVydmFsKTtcblxuICAgIC8vIERvIG5vdCBrZWVwIHRoZSBOb2RlLmpzIGV2ZW50IGxvb3AgYWxpdmUgc29sZWx5IGZvciBtb25pdG9yaW5nXG4gICAgaWYgKHR5cGVvZiB0aGlzLm1lbW9yeU1vbml0b3JJbnRlcnZhbC51bnJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5tZW1vcnlNb25pdG9ySW50ZXJ2YWwudW5yZWYoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRha2VNZW1vcnlTbmFwc2hvdCgpOiBNZW1vcnlVc2FnZSB7XG4gICAgY29uc3QgbWVtVXNhZ2UgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYXBVc2VkOiBtZW1Vc2FnZS5oZWFwVXNlZCxcbiAgICAgIGhlYXBUb3RhbDogbWVtVXNhZ2UuaGVhcFRvdGFsLFxuICAgICAgcnNzOiBtZW1Vc2FnZS5yc3MsXG4gICAgICBleHRlcm5hbDogbWVtVXNhZ2UuZXh0ZXJuYWwsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKClcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhZ2dyZWdhdGVDYWNoZVN0YXRzKCk6IENhY2hlUGVyZm9ybWFuY2Uge1xuICAgIGlmICh0aGlzLmNhY2hlTWV0cmljcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoaXRSYXRlOiAwLFxuICAgICAgICBhdmdIaXRUaW1lOiAwLFxuICAgICAgICBhdmdNaXNzVGltZTogMCxcbiAgICAgICAgdG90YWxIaXRzOiAwLFxuICAgICAgICB0b3RhbE1pc3NlczogMCxcbiAgICAgICAgZXZpY3Rpb25zOiAwXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCB0b3RhbEhpdHMgPSAwO1xuICAgIGxldCB0b3RhbE1pc3NlcyA9IDA7XG4gICAgbGV0IHRvdGFsRXZpY3Rpb25zID0gMDtcbiAgICBsZXQgd2VpZ2h0ZWRIaXRUaW1lID0gMDtcbiAgICBsZXQgd2VpZ2h0ZWRNaXNzVGltZSA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHN0YXRzIG9mIHRoaXMuY2FjaGVNZXRyaWNzLnZhbHVlcygpKSB7XG4gICAgICB0b3RhbEhpdHMgKz0gc3RhdHMudG90YWxIaXRzO1xuICAgICAgdG90YWxNaXNzZXMgKz0gc3RhdHMudG90YWxNaXNzZXM7XG4gICAgICB0b3RhbEV2aWN0aW9ucyArPSBzdGF0cy5ldmljdGlvbnM7XG4gICAgICB3ZWlnaHRlZEhpdFRpbWUgKz0gc3RhdHMuYXZnSGl0VGltZSAqIHN0YXRzLnRvdGFsSGl0cztcbiAgICAgIHdlaWdodGVkTWlzc1RpbWUgKz0gc3RhdHMuYXZnTWlzc1RpbWUgKiBzdGF0cy50b3RhbE1pc3NlcztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaGl0UmF0ZTogdG90YWxIaXRzICsgdG90YWxNaXNzZXMgPiAwID8gdG90YWxIaXRzIC8gKHRvdGFsSGl0cyArIHRvdGFsTWlzc2VzKSA6IDAsXG4gICAgICBhdmdIaXRUaW1lOiB0b3RhbEhpdHMgPiAwID8gd2VpZ2h0ZWRIaXRUaW1lIC8gdG90YWxIaXRzIDogMCxcbiAgICAgIGF2Z01pc3NUaW1lOiB0b3RhbE1pc3NlcyA+IDAgPyB3ZWlnaHRlZE1pc3NUaW1lIC8gdG90YWxNaXNzZXMgOiAwLFxuICAgICAgdG90YWxIaXRzLFxuICAgICAgdG90YWxNaXNzZXMsXG4gICAgICBldmljdGlvbnM6IHRvdGFsRXZpY3Rpb25zXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3lzdGVtU3RhdHMoKTogU3lzdGVtU3RhdHMge1xuICAgIGNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgY3B1VXNhZ2U6IHByb2Nlc3MuY3B1VXNhZ2UoKS51c2VyIC8gMTAwMDAwMCwgLy8gQ29udmVydCB0byBzZWNvbmRzXG4gICAgICBsb2FkQXZlcmFnZTogb3MubG9hZGF2ZygpLFxuICAgICAgZnJlZU1lbW9yeTogb3MuZnJlZW1lbSgpLFxuICAgICAgdG90YWxNZW1vcnk6IG9zLnRvdGFsbWVtKCksXG4gICAgICB1cHRpbWU6IHByb2Nlc3MudXB0aW1lKClcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
376
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyZm9ybWFuY2VNb25pdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL1BlcmZvcm1hbmNlTW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQXdEckQsTUFBTSxPQUFPLGtCQUFrQjtJQUNyQixhQUFhLEdBQW9CLEVBQUUsQ0FBQztJQUNwQyxXQUFXLEdBQWdCLEVBQUUsQ0FBQztJQUM5QixlQUFlLEdBQWtCLEVBQUUsQ0FBQztJQUNwQyxZQUFZLEdBQWtDLElBQUksR0FBRyxFQUFFLENBQUM7SUFFaEUsZ0JBQWdCO0lBQ0MsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUs7SUFDL0Isc0JBQXNCLEdBQUcsS0FBSyxDQUFDLENBQUMsYUFBYTtJQUM3QyxjQUFjLEdBQUcsR0FBRyxDQUFDO0lBRXRDLHVCQUF1QjtJQUNmLHFCQUFxQixDQUFrQjtJQUN2QyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXJCLFdBQVcsQ0FBeUc7SUFFNUgsY0FBYyxDQUFDLEVBQXlHO1FBQ3RILElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGdCQUFlLENBQUM7SUFFaEI7O09BRUc7SUFDSCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMs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Q0osQ0FBQztJQUVPLGNBQWM7UUFDcEIsT0FBTztZQUNMLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRSxxQkFBcUI7WUFDbEUsV0FBVyxFQUFFLE9BQU8sRUFBRTtZQUN0QixVQUFVLEVBQUUsT0FBTyxFQUFFO1lBQ3JCLFdBQVcsRUFBRSxRQUFRLEVBQUU7WUFDdkIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUU7U0FDekIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tcHJlaGVuc2l2ZSBQZXJmb3JtYW5jZSBNb25pdG9yaW5nIFN5c3RlbVxuICogVHJhY2tzIHNlYXJjaCB0aW1lcywgbWVtb3J5IHVzYWdlLCBjYWNoZSBwZXJmb3JtYW5jZSwgYW5kIHN5c3RlbSBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBmcmVlbWVtLCB0b3RhbG1lbSwgbG9hZGF2ZyB9IGZyb20gJ25vZGU6b3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlcmZvcm1hbmNlTWV0cmljcyB7XG4gIHNlYXJjaFRpbWVzOiBudW1iZXJbXTtcbiAgbWVtb3J5VXNhZ2U6IE1lbW9yeVVzYWdlW107XG4gIGNhY2hlU3RhdHM6IENhY2hlUGVyZm9ybWFuY2U7XG4gIHN5c3RlbVN0YXRzOiBTeXN0ZW1TdGF0cztcbiAgdGltZXN0YW1wOiBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVVzYWdlIHtcbiAgaGVhcFVzZWQ6IG51bWJlcjtcbiAgaGVhcFRvdGFsOiBudW1iZXI7XG4gIHJzczogbnVtYmVyO1xuICBleHRlcm5hbDogbnVtYmVyO1xuICB0aW1lc3RhbXA6IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVQZXJmb3JtYW5jZSB7XG4gIGhpdFJhdGU6IG51bWJlcjtcbiAgYXZnSGl0VGltZTogbnVtYmVyO1xuICBhdmdNaXNzVGltZTogbnVtYmVyO1xuICB0b3RhbEhpdHM6IG51bWJlcjtcbiAgdG90YWxNaXNzZXM6IG51bWJlcjtcbiAgZXZpY3Rpb25zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3lzdGVtU3RhdHMge1xuICBjcHVVc2FnZTogbnVtYmVyO1xuICBsb2FkQXZlcmFnZTogbnVtYmVyW107XG4gIGZyZWVNZW1vcnk6IG51bWJlcjtcbiAgdG90YWxNZW1vcnk6IG51bWJlcjtcbiAgdXB0aW1lOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoTWV0cmljcyB7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIGR1cmF0aW9uOiBudW1iZXI7XG4gIHJlc3VsdENvdW50OiBudW1iZXI7XG4gIHNvdXJjZXM6IHN0cmluZ1tdO1xuICBjYWNoZUhpdDogYm9vbGVhbjtcbiAgbWVtb3J5QmVmb3JlOiBudW1iZXI7XG4gIG1lbW9yeUFmdGVyOiBudW1iZXI7XG4gIHRpbWVzdGFtcDogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbG93UXVlcnkge1xuICBxdWVyeTogc3RyaW5nO1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgc291cmNlczogc3RyaW5nW107XG4gIHJlc3VsdENvdW50OiBudW1iZXI7XG4gIG1lbW9yeVVzYWdlOiBudW1iZXI7XG4gIHRpbWVzdGFtcDogRGF0ZTtcbn1cblxuZXhwb3J0IGNsYXNzIFBlcmZvcm1hbmNlTW9uaXRvciB7XG4gIHByaXZhdGUgc2VhcmNoTWV0cmljczogU2VhcmNoTWV0cmljc1tdID0gW107XG4gIHByaXZhdGUgc2xvd1F1ZXJpZXM6IFNsb3dRdWVyeVtdID0gW107XG4gIHByaXZhdGUgbWVtb3J5U25hcHNob3RzOiBNZW1vcnlVc2FnZVtdID0gW107XG4gIHByaXZhdGUgY2FjaGVNZXRyaWNzOiBNYXA8c3RyaW5nLCBDYWNoZVBlcmZvcm1hbmNlPiA9IG5ldyBNYXAoKTtcblxuICAvLyBDb25maWd1cmF0aW9uXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4TWV0cmljc0hpc3RvcnkgPSAxMDAwO1xuICBwcml2YXRlIHJlYWRvbmx5IHNsb3dRdWVyeVRocmVzaG9sZCA9IDEwMDsgLy8gbXNcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnlTbmFwc2hvdEludGVydmFsID0gMzAwMDA7IC8vIDMwIHNlY29uZHNcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTbG93UXVlcmllcyA9IDEwMDtcblxuICAvLyBUaW1lcnMgYW5kIGludGVydmFsc1xuICBwcml2YXRlIG1lbW9yeU1vbml0b3JJbnRlcnZhbD86IE5vZGVKUy5UaW1lb3V0O1xuICBwcml2YXRlIGlzTW9uaXRvcmluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgbG9nTGlzdGVuZXI/OiAobGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcblxuICBhZGRMb2dMaXN0ZW5lcihmbjogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmxvZ0xpc3RlbmVyID0gZm47XG4gICAgcmV0dXJuICgpID0+IHsgdGhpcy5sb2dMaXN0ZW5lciA9IHVuZGVmaW5lZDsgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogU3RhcnQgcGVyZm9ybWFuY2UgbW9uaXRvcmluZ1xuICAgKi9cbiAgc3RhcnRNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTW9uaXRvcmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNNb25pdG9yaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0TWVtb3J5TW9uaXRvcmluZygpO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdQZXJmb3JtYW5jZSBtb25pdG9yaW5nIHN0YXJ0ZWQnLCB7XG4gICAgICBzbG93UXVlcnlUaHJlc2hvbGQ6IHRoaXMuc2xvd1F1ZXJ5VGhyZXNob2xkLFxuICAgICAgbWF4TWV0cmljc0hpc3Rvcnk6IHRoaXMubWF4TWV0cmljc0hpc3RvcnlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHBlcmZvcm1hbmNlIG1vbml0b3JpbmdcbiAgICovXG4gIHN0b3BNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuaXNNb25pdG9yaW5nID0gZmFsc2U7XG4gICAgXG4gICAgaWYgKHRoaXMubWVtb3J5TW9uaXRvckludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMubWVtb3J5TW9uaXRvckludGVydmFsKTtcbiAgICAgIHRoaXMubWVtb3J5TW9uaXRvckludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKCdQZXJmb3JtYW5jZSBtb25pdG9yaW5nIHN0b3BwZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG1vbml0b3Jpbmcgc3RhdGUgYW5kIHRpbWVycy5cbiAgICovXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wTW9uaXRvcmluZygpO1xuICAgIHRoaXMucmVzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgc2VhcmNoIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICovXG4gIHJlY29yZFNlYXJjaChtZXRyaWNzOiBTZWFyY2hNZXRyaWNzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTW9uaXRvcmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbGl6ZSBxdWVyeSBzdHJpbmcgdG8gcHJldmVudCBVbmljb2RlLWJhc2VkIGF0dGFja3NcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWV0cmljcy5xdWVyeSk7XG4gICAgY29uc3Qgbm9ybWFsaXplZE1ldHJpY3MgPSB7XG4gICAgICAuLi5tZXRyaWNzLFxuICAgICAgcXVlcnk6IHZhbGlkYXRpb25SZXN1bHQubm9ybWFsaXplZENvbnRlbnRcbiAgICB9O1xuXG4gICAgdGhpcy5zZWFyY2hNZXRyaWNzLnB1c2gobm9ybWFsaXplZE1ldHJpY3MpO1xuICAgIHRoaXMubG9nTGlzdGVuZXI/LignZGVidWcnLCAnUmVjb3JkIHNlYXJjaCcsIHtcbiAgICAgIHF1ZXJ5OiBub3JtYWxpemVkTWV0cmljcy5xdWVyeS5zdWJzdHJpbmcoMCwgNTApLFxuICAgICAgZHVyYXRpb246IG5vcm1hbGl6ZWRNZXRyaWNzLmR1cmF0aW9uLFxuICAgICAgcmVzdWx0Q291bnQ6IG5vcm1hbGl6ZWRNZXRyaWNzLnJlc3VsdENvdW50LFxuICAgICAgY2FjaGVIaXQ6IG5vcm1hbGl6ZWRNZXRyaWNzLmNhY2hlSGl0LFxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIHNsb3cgcXVlcnkgKHVzZSBub3JtYWxpemVkIG1ldHJpY3MpXG4gICAgaWYgKG5vcm1hbGl6ZWRNZXRyaWNzLmR1cmF0aW9uID4gdGhpcy5zbG93UXVlcnlUaHJlc2hvbGQpIHtcbiAgICAgIHRoaXMucmVjb3JkU2xvd1F1ZXJ5KHtcbiAgICAgICAgcXVlcnk6IG5vcm1hbGl6ZWRNZXRyaWNzLnF1ZXJ5LFxuICAgICAgICBkdXJhdGlvbjogbm9ybWFsaXplZE1ldHJpY3MuZHVyYXRpb24sXG4gICAgICAgIHRocmVzaG9sZDogdGhpcy5zbG93UXVlcnlUaHJlc2hvbGQsXG4gICAgICAgIHNvdXJjZXM6IG5vcm1hbGl6ZWRNZXRyaWNzLnNvdXJjZXMsXG4gICAgICAgIHJlc3VsdENvdW50OiBub3JtYWxpemVkTWV0cmljcy5yZXN1bHRDb3VudCxcbiAgICAgICAgbWVtb3J5VXNhZ2U6IG5vcm1hbGl6ZWRNZXRyaWNzLm1lbW9yeUFmdGVyLFxuICAgICAgICB0aW1lc3RhbXA6IG5vcm1hbGl6ZWRNZXRyaWNzLnRpbWVzdGFtcFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVHJpbSBoaXN0b3J5IGlmIG5lZWRlZFxuICAgIGlmICh0aGlzLnNlYXJjaE1ldHJpY3MubGVuZ3RoID4gdGhpcy5tYXhNZXRyaWNzSGlzdG9yeSkge1xuICAgICAgdGhpcy5zZWFyY2hNZXRyaWNzID0gdGhpcy5zZWFyY2hNZXRyaWNzLnNsaWNlKC10aGlzLm1heE1ldHJpY3NIaXN0b3J5KTtcbiAgICB9XG5cbiAgICAvLyBOb3RpZnkgbGlzdGVuZXIgYWJvdXQgc2xvdyBxdWVyaWVzXG4gICAgaWYgKG5vcm1hbGl6ZWRNZXRyaWNzLmR1cmF0aW9uID4gdGhpcy5zbG93UXVlcnlUaHJlc2hvbGQpIHtcbiAgICAgIHRoaXMubG9nTGlzdGVuZXI/Lignd2FybicsICdEZXRlY3Qgc2xvdyBxdWVyeScsIHtcbiAgICAgICAgcXVlcnk6IG5vcm1hbGl6ZWRNZXRyaWNzLnF1ZXJ5LnN1YnN0cmluZygwLCA1MCksXG4gICAgICAgIGR1cmF0aW9uOiBub3JtYWxpemVkTWV0cmljcy5kdXJhdGlvbixcbiAgICAgICAgdGhyZXNob2xkOiB0aGlzLnNsb3dRdWVyeVRocmVzaG9sZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExvZyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBldmVudHMgKHVzZSBub3JtYWxpemVkIG1ldHJpY3MpXG4gICAgaWYgKG5vcm1hbGl6ZWRNZXRyaWNzLmR1cmF0aW9uID4gdGhpcy5zbG93UXVlcnlUaHJlc2hvbGQgKiAyKSB7XG4gICAgICBsb2dnZXIud2FybignVmVyeSBzbG93IHNlYXJjaCBkZXRlY3RlZCcsIHtcbiAgICAgICAgcXVlcnk6IG5vcm1hbGl6ZWRNZXRyaWNzLnF1ZXJ5LnN1YnN0cmluZygwLCA1MCksXG4gICAgICAgIGR1cmF0aW9uOiBub3JtYWxpemVkTWV0cmljcy5kdXJhdGlvbixcbiAgICAgICAgcmVzdWx0Q291bnQ6IG5vcm1hbGl6ZWRNZXRyaWNzLnJlc3VsdENvdW50LFxuICAgICAgICBzb3VyY2VzOiBub3JtYWxpemVkTWV0cmljcy5zb3VyY2VzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGNhY2hlIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICovXG4gIHJlY29yZENhY2hlUGVyZm9ybWFuY2UoY2FjaGVOYW1lOiBzdHJpbmcsIHN0YXRzOiBDYWNoZVBlcmZvcm1hbmNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTW9uaXRvcmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbGl6ZSBjYWNoZSBuYW1lIHRvIHByZXZlbnQgVW5pY29kZS1iYXNlZCBhdHRhY2tzXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNhY2hlTmFtZSk7XG4gICAgY29uc3Qgbm9ybWFsaXplZENhY2hlTmFtZSA9IHZhbGlkYXRpb25SZXN1bHQubm9ybWFsaXplZENvbnRlbnQ7XG5cbiAgICB0aGlzLmNhY2hlTWV0cmljcy5zZXQobm9ybWFsaXplZENhY2hlTmFtZSwgc3RhdHMpO1xuXG4gICAgLy8gTm90aWZ5IGxpc3RlbmVyIGFib3V0IGxvdyBjYWNoZSBoaXQgcmF0ZVxuICAgIGlmIChzdGF0cy5oaXRSYXRlIDwgMC41KSB7XG4gICAgICB0aGlzLmxvZ0xpc3RlbmVyPy4oJ3dhcm4nLCAnRGV0ZWN0IGxvdyBjYWNoZSBoaXQgcmF0ZScsIHtcbiAgICAgICAgY2FjaGU6IG5vcm1hbGl6ZWRDYWNoZU5hbWUsXG4gICAgICAgIGhpdFJhdGU6IHN0YXRzLmhpdFJhdGUsXG4gICAgICAgIHRvdGFsT3BlcmF0aW9uczogc3RhdHMudG90YWxIaXRzICsgc3RhdHMudG90YWxNaXNzZXMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBMb2cgY2FjaGUgcGVyZm9ybWFuY2Ugd2FybmluZ3MgKHVzZSBub3JtYWxpemVkIGNhY2hlIG5hbWUpXG4gICAgaWYgKHN0YXRzLmhpdFJhdGUgPCAwLjUpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdMb3cgY2FjaGUgaGl0IHJhdGUgZGV0ZWN0ZWQnLCB7XG4gICAgICAgIGNhY2hlOiBub3JtYWxpemVkQ2FjaGVOYW1lLFxuICAgICAgICBoaXRSYXRlOiBzdGF0cy5oaXRSYXRlLFxuICAgICAgICB0b3RhbE9wZXJhdGlvbnM6IHN0YXRzLnRvdGFsSGl0cyArIHN0YXRzLnRvdGFsTWlzc2VzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbXByZWhlbnNpdmUgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgKi9cbiAgZ2V0TWV0cmljcygpOiBQZXJmb3JtYW5jZU1ldHJpY3Mge1xuICAgIHJldHVybiB7XG4gICAgICBzZWFyY2hUaW1lczogdGhpcy5zZWFyY2hNZXRyaWNzLm1hcChtID0+IG0uZHVyYXRpb24pLFxuICAgICAgbWVtb3J5VXNhZ2U6IHRoaXMubWVtb3J5U25hcHNob3RzLnNsaWNlKC0xMDApLCAvLyBMYXN0IDEwMCBzbmFwc2hvdHNcbiAgICAgIGNhY2hlU3RhdHM6IHRoaXMuYWdncmVnYXRlQ2FjaGVTdGF0cygpLFxuICAgICAgc3lzdGVtU3RhdHM6IHRoaXMuZ2V0U3lzdGVtU3RhdHMoKSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlYXJjaCBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzXG4gICAqL1xuICBnZXRTZWFyY2hTdGF0cygpOiB7XG4gICAgdG90YWxTZWFyY2hlczogbnVtYmVyO1xuICAgIGF2ZXJhZ2VUaW1lOiBudW1iZXI7XG4gICAgbWVkaWFuVGltZTogbnVtYmVyO1xuICAgIHA5NVRpbWU6IG51bWJlcjtcbiAgICBwOTlUaW1lOiBudW1iZXI7XG4gICAgc2xvd1F1ZXJpZXM6IG51bWJlcjtcbiAgICBjYWNoZUhpdFJhdGU6IG51bWJlcjtcbiAgfSB7XG4gICAgaWYgKHRoaXMuc2VhcmNoTWV0cmljcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvdGFsU2VhcmNoZXM6IDAsXG4gICAgICAgIGF2ZXJhZ2VUaW1lOiAwLFxuICAgICAgICBtZWRpYW5UaW1lOiAwLFxuICAgICAgICBwOTVUaW1lOiAwLFxuICAgICAgICBwOTlUaW1lOiAwLFxuICAgICAgICBzbG93UXVlcmllczogMCxcbiAgICAgICAgY2FjaGVIaXRSYXRlOiAwXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzID0gdGhpcy5zZWFyY2hNZXRyaWNzLm1hcChtID0+IG0uZHVyYXRpb24pLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICBjb25zdCBjYWNoZUhpdHMgPSB0aGlzLnNlYXJjaE1ldHJpY3MuZmlsdGVyKG0gPT4gbS5jYWNoZUhpdCkubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsU2VhcmNoZXM6IHRoaXMuc2VhcmNoTWV0cmljcy5sZW5ndGgsXG4gICAgICBhdmVyYWdlVGltZTogdGltZXMucmVkdWNlKChzdW0sIHRpbWUpID0+IHN1bSArIHRpbWUsIDApIC8gdGltZXMubGVuZ3RoLFxuICAgICAgbWVkaWFuVGltZTogdGltZXNbTWF0aC5mbG9vcih0aW1lcy5sZW5ndGggLyAyKV0sXG4gICAgICBwOTVUaW1lOiB0aW1lc1tNYXRoLmZsb29yKHRpbWVzLmxlbmd0aCAqIDAuOTUpXSxcbiAgICAgIHA5OVRpbWU6IHRpbWVzW01hdGguZmxvb3IodGltZXMubGVuZ3RoICogMC45OSldLFxuICAgICAgc2xvd1F1ZXJpZXM6IHRoaXMuc2xvd1F1ZXJpZXMubGVuZ3RoLFxuICAgICAgY2FjaGVIaXRSYXRlOiBjYWNoZUhpdHMgLyB0aGlzLnNlYXJjaE1ldHJpY3MubGVuZ3RoXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3NcbiAgICovXG4gIGdldE1lbW9yeVN0YXRzKCk6IHtcbiAgICBjdXJyZW50VXNhZ2U6IE1lbW9yeVVzYWdlO1xuICAgIHBlYWtVc2FnZTogTWVtb3J5VXNhZ2U7XG4gICAgYXZlcmFnZVVzYWdlOiBNZW1vcnlVc2FnZTtcbiAgICBncm93dGhSYXRlOiBudW1iZXI7IC8vIE1CIHBlciBtaW51dGVcbiAgfSB7XG4gICAgaWYgKHRoaXMubWVtb3J5U25hcHNob3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMudGFrZU1lbW9yeVNuYXBzaG90KCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW50VXNhZ2U6IGN1cnJlbnQsXG4gICAgICAgIHBlYWtVc2FnZTogY3VycmVudCxcbiAgICAgICAgYXZlcmFnZVVzYWdlOiBjdXJyZW50LFxuICAgICAgICBncm93dGhSYXRlOiAwXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLm1lbW9yeVNuYXBzaG90c1t0aGlzLm1lbW9yeVNuYXBzaG90cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBwZWFrID0gdGhpcy5tZW1vcnlTbmFwc2hvdHMucmVkdWNlKChtYXgsIHNuYXBzaG90KSA9PlxuICAgICAgc25hcHNob3QuaGVhcFVzZWQgPiBtYXguaGVhcFVzZWQgPyBzbmFwc2hvdCA6IG1heCxcbiAgICAgIHRoaXMubWVtb3J5U25hcHNob3RzWzBdXG4gICAgKTtcblxuICAgIGNvbnN0IHRvdGFsSGVhcCA9IHRoaXMubWVtb3J5U25hcHNob3RzLnJlZHVjZSgoc3VtLCBzbmFwc2hvdCkgPT4gc3VtICsgc25hcHNob3QuaGVhcFVzZWQsIDApO1xuICAgIGNvbnN0IHRvdGFsUnNzID0gdGhpcy5tZW1vcnlTbmFwc2hvdHMucmVkdWNlKChzdW0sIHNuYXBzaG90KSA9PiBzdW0gKyBzbmFwc2hvdC5yc3MsIDApO1xuICAgIGNvbnN0IGF2ZXJhZ2U6IE1lbW9yeVVzYWdlID0ge1xuICAgICAgaGVhcFVzZWQ6IHRvdGFsSGVhcCAvIHRoaXMubWVtb3J5U25hcHNob3RzLmxlbmd0aCxcbiAgICAgIGhlYXBUb3RhbDogdGhpcy5tZW1vcnlTbmFwc2hvdHMucmVkdWNlKChzdW0sIHMpID0+IHN1bSArIHMuaGVhcFRvdGFsLCAwKSAvIHRoaXMubWVtb3J5U25hcHNob3RzLmxlbmd0aCxcbiAgICAgIHJzczogdG90YWxSc3MgLyB0aGlzLm1lbW9yeVNuYXBzaG90cy5sZW5ndGgsXG4gICAgICBleHRlcm5hbDogdGhpcy5tZW1vcnlTbmFwc2hvdHMucmVkdWNlKChzdW0sIHMpID0+IHN1bSArIHMuZXh0ZXJuYWwsIDApIC8gdGhpcy5tZW1vcnlTbmFwc2hvdHMubGVuZ3RoLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXG4gICAgfTtcblxuICAgIC8vIENhbGN1bGF0ZSBncm93dGggcmF0ZSAoTUIgcGVyIG1pbnV0ZSlcbiAgICBsZXQgZ3Jvd3RoUmF0ZSA9IDA7XG4gICAgaWYgKHRoaXMubWVtb3J5U25hcHNob3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMubWVtb3J5U25hcHNob3RzWzBdO1xuICAgICAgY29uc3QgdGltZURpZmYgPSAoY3VycmVudC50aW1lc3RhbXAuZ2V0VGltZSgpIC0gb2xkZXN0LnRpbWVzdGFtcC5nZXRUaW1lKCkpIC8gNjAwMDA7IC8vIG1pbnV0ZXNcbiAgICAgIGNvbnN0IG1lbW9yeURpZmYgPSAoY3VycmVudC5oZWFwVXNlZCAtIG9sZGVzdC5oZWFwVXNlZCkgLyAoMTAyNCAqIDEwMjQpOyAvLyBNQlxuICAgICAgZ3Jvd3RoUmF0ZSA9IHRpbWVEaWZmID4gMCA/IG1lbW9yeURpZmYgLyB0aW1lRGlmZiA6IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRVc2FnZTogY3VycmVudCxcbiAgICAgIHBlYWtVc2FnZTogcGVhayxcbiAgICAgIGF2ZXJhZ2VVc2FnZTogYXZlcmFnZSxcbiAgICAgIGdyb3d0aFJhdGVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzbG93IHF1ZXJpZXMgd2l0aCBhbmFseXNpc1xuICAgKi9cbiAgZ2V0U2xvd1F1ZXJpZXMobGltaXQ6IG51bWJlciA9IDEwKTogU2xvd1F1ZXJ5W10ge1xuICAgIHJldHVybiB0aGlzLnNsb3dRdWVyaWVzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5kdXJhdGlvbiAtIGEuZHVyYXRpb24pXG4gICAgICAuc2xpY2UoMCwgbGltaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuYWx5emUgcGVyZm9ybWFuY2UgdHJlbmRzXG4gICAqL1xuICBhbmFseXplVHJlbmRzKCk6IHtcbiAgICBwZXJmb3JtYW5jZVRyZW5kOiAnaW1wcm92aW5nJyB8ICdkZWdyYWRpbmcnIHwgJ3N0YWJsZSc7XG4gICAgbWVtb3J5VHJlbmQ6ICdncm93aW5nJyB8ICdzaHJpbmtpbmcnIHwgJ3N0YWJsZSc7XG4gICAgcmVjb21tZW5kYXRpb25zOiBzdHJpbmdbXTtcbiAgfSB7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIFxuICAgIC8vIEFuYWx5emUgc2VhcmNoIHBlcmZvcm1hbmNlIHRyZW5kXG4gICAgbGV0IHBlcmZvcm1hbmNlVHJlbmQ6ICdpbXByb3ZpbmcnIHwgJ2RlZ3JhZGluZycgfCAnc3RhYmxlJyA9ICdzdGFibGUnO1xuICAgIGlmICh0aGlzLnNlYXJjaE1ldHJpY3MubGVuZ3RoID4gMTApIHtcbiAgICAgIGNvbnN0IHJlY2VudCA9IHRoaXMuc2VhcmNoTWV0cmljcy5zbGljZSgtMTApLm1hcChtID0+IG0uZHVyYXRpb24pO1xuICAgICAgY29uc3Qgb2xkZXIgPSB0aGlzLnNlYXJjaE1ldHJpY3Muc2xpY2UoLTIwLCAtMTApLm1hcChtID0+IG0uZHVyYXRpb24pO1xuICAgICAgXG4gICAgICBpZiAocmVjZW50Lmxlbmd0aCA+IDAgJiYgb2xkZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZWNlbnRBdmcgPSByZWNlbnQucmVkdWNlKChzdW0sIHQpID0+IHN1bSArIHQsIDApIC8gcmVjZW50Lmxlbmd0aDtcbiAgICAgICAgY29uc3Qgb2xkZXJBdmcgPSBvbGRlci5yZWR1Y2UoKHN1bSwgdCkgPT4gc3VtICsgdCwgMCkgLyBvbGRlci5sZW5ndGg7XG4gICAgICAgIFxuICAgICAgICBpZiAocmVjZW50QXZnID4gb2xkZXJBdmcgKiAxLjIpIHtcbiAgICAgICAgICBwZXJmb3JtYW5jZVRyZW5kID0gJ2RlZ3JhZGluZyc7XG4gICAgICAgICAgcmVjb21tZW5kYXRpb25zLnB1c2goJ1NlYXJjaCBwZXJmb3JtYW5jZSBpcyBkZWdyYWRpbmcuIENvbnNpZGVyIGNhY2hlIG9wdGltaXphdGlvbiBvciBpbmRleCByZWJ1aWxkaW5nLicpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlY2VudEF2ZyA8IG9sZGVyQXZnICogMC44KSB7XG4gICAgICAgICAgcGVyZm9ybWFuY2VUcmVuZCA9ICdpbXByb3ZpbmcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQW5hbHl6ZSBtZW1vcnkgdHJlbmRcbiAgICBjb25zdCBtZW1vcnlTdGF0cyA9IHRoaXMuZ2V0TWVtb3J5U3RhdHMoKTtcbiAgICBsZXQgbWVtb3J5VHJlbmQ6ICdncm93aW5nJyB8ICdzaHJpbmtpbmcnIHwgJ3N0YWJsZScgPSAnc3RhYmxlJztcbiAgICBcbiAgICBpZiAobWVtb3J5U3RhdHMuZ3Jvd3RoUmF0ZSA+IDEpIHsgLy8gR3Jvd2luZyBieSBtb3JlIHRoYW4gMU1CL21pbnV0ZVxuICAgICAgbWVtb3J5VHJlbmQgPSAnZ3Jvd2luZyc7XG4gICAgICByZWNvbW1lbmRhdGlvbnMucHVzaCgnTWVtb3J5IHVzYWdlIGlzIGdyb3dpbmcgcmFwaWRseS4gQ29uc2lkZXIgY2FjaGUgY2xlYW51cCBvciBtZW1vcnkgbGltaXRzLicpO1xuICAgIH0gZWxzZSBpZiAobWVtb3J5U3RhdHMuZ3Jvd3RoUmF0ZSA8IC0xKSB7XG4gICAgICBtZW1vcnlUcmVuZCA9ICdzaHJpbmtpbmcnO1xuICAgIH1cblxuICAgIC8vIENhY2hlIHBlcmZvcm1hbmNlIHJlY29tbWVuZGF0aW9uc1xuICAgIGNvbnN0IGNhY2hlU3RhdHMgPSB0aGlzLmFnZ3JlZ2F0ZUNhY2hlU3RhdHMoKTtcbiAgICBpZiAoY2FjaGVTdGF0cy5oaXRSYXRlIDwgMC42KSB7XG4gICAgICByZWNvbW1lbmRhdGlvbnMucHVzaCgnQ2FjaGUgaGl0IHJhdGUgaXMgbG93LiBDb25zaWRlciBhZGp1c3RpbmcgY2FjaGUgc2l6ZSBvciBUVEwgc2V0dGluZ3MuJyk7XG4gICAgfVxuXG4gICAgLy8gU2xvdyBxdWVyeSByZWNvbW1lbmRhdGlvbnNcbiAgICBpZiAodGhpcy5zbG93UXVlcmllcy5sZW5ndGggPiAxMCkge1xuICAgICAgcmVjb21tZW5kYXRpb25zLnB1c2goJ011bHRpcGxlIHNsb3cgcXVlcmllcyBkZXRlY3RlZC4gQ29uc2lkZXIgcXVlcnkgb3B0aW1pemF0aW9uIG9yIGluY3JlYXNlZCBjYWNoaW5nLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwZXJmb3JtYW5jZVRyZW5kLFxuICAgICAgbWVtb3J5VHJlbmQsXG4gICAgICByZWNvbW1lbmRhdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaE1ldHJpY3MgPSBbXTtcbiAgICB0aGlzLnNsb3dRdWVyaWVzID0gW107XG4gICAgdGhpcy5tZW1vcnlTbmFwc2hvdHMgPSBbXTtcbiAgICB0aGlzLmNhY2hlTWV0cmljcy5jbGVhcigpO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdQZXJmb3JtYW5jZSBtZXRyaWNzIHJlc2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IG1ldHJpY3MgZm9yIGV4dGVybmFsIGFuYWx5c2lzXG4gICAqL1xuICBleHBvcnRNZXRyaWNzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHNlYXJjaE1ldHJpY3M6IHRoaXMuc2VhcmNoTWV0cmljcyxcbiAgICAgIHNsb3dRdWVyaWVzOiB0aGlzLnNsb3dRdWVyaWVzLFxuICAgICAgbWVtb3J5U25hcHNob3RzOiB0aGlzLm1lbW9yeVNuYXBzaG90cyxcbiAgICAgIGNhY2hlTWV0cmljczogT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuY2FjaGVNZXRyaWNzKSxcbiAgICAgIGV4cG9ydFRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgfTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgfVxuXG4gIC8vIFByaXZhdGUgbWV0aG9kc1xuXG4gIHByaXZhdGUgcmVjb3JkU2xvd1F1ZXJ5KHF1ZXJ5OiBTbG93UXVlcnkpOiB2b2lkIHtcbiAgICB0aGlzLnNsb3dRdWVyaWVzLnB1c2gocXVlcnkpO1xuXG4gICAgLy8gVHJpbSBzbG93IHF1ZXJpZXMgaGlzdG9yeVxuICAgIGlmICh0aGlzLnNsb3dRdWVyaWVzLmxlbmd0aCA+IHRoaXMubWF4U2xvd1F1ZXJpZXMpIHtcbiAgICAgIHRoaXMuc2xvd1F1ZXJpZXMgPSB0aGlzLnNsb3dRdWVyaWVzLnNsaWNlKC10aGlzLm1heFNsb3dRdWVyaWVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0TWVtb3J5TW9uaXRvcmluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZW1vcnlNb25pdG9ySW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5tZW1vcnlNb25pdG9ySW50ZXJ2YWwpO1xuICAgIH1cblxuICAgIHRoaXMubWVtb3J5TW9uaXRvckludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNNb25pdG9yaW5nKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50YWtlTWVtb3J5U25hcHNob3QoKTtcbiAgICAgICAgdGhpcy5tZW1vcnlTbmFwc2hvdHMucHVzaChzbmFwc2hvdCk7XG5cbiAgICAgICAgLy8gVHJpbSBtZW1vcnkgc25hcHNob3RzIChrZWVwIGxhc3QgMjAwKVxuICAgICAgICBpZiAodGhpcy5tZW1vcnlTbmFwc2hvdHMubGVuZ3RoID4gMjAwKSB7XG4gICAgICAgICAgdGhpcy5tZW1vcnlTbmFwc2hvdHMgPSB0aGlzLm1lbW9yeVNuYXBzaG90cy5zbGljZSgtMjAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHRoaXMubWVtb3J5U25hcHNob3RJbnRlcnZhbCk7XG5cbiAgICAvLyBEbyBub3Qga2VlcCB0aGUgTm9kZS5qcyBldmVudCBsb29wIGFsaXZlIHNvbGVseSBmb3IgbW9uaXRvcmluZ1xuICAgIGlmICh0eXBlb2YgdGhpcy5tZW1vcnlNb25pdG9ySW50ZXJ2YWwudW5yZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMubWVtb3J5TW9uaXRvckludGVydmFsLnVucmVmKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0YWtlTWVtb3J5U25hcHNob3QoKTogTWVtb3J5VXNhZ2Uge1xuICAgIGNvbnN0IG1lbVVzYWdlID0gcHJvY2Vzcy5tZW1vcnlVc2FnZSgpO1xuICAgIHJldHVybiB7XG4gICAgICBoZWFwVXNlZDogbWVtVXNhZ2UuaGVhcFVzZWQsXG4gICAgICBoZWFwVG90YWw6IG1lbVVzYWdlLmhlYXBUb3RhbCxcbiAgICAgIHJzczogbWVtVXNhZ2UucnNzLFxuICAgICAgZXh0ZXJuYWw6IG1lbVVzYWdlLmV4dGVybmFsLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYWdncmVnYXRlQ2FjaGVTdGF0cygpOiBDYWNoZVBlcmZvcm1hbmNlIHtcbiAgICBpZiAodGhpcy5jYWNoZU1ldHJpY3Muc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGl0UmF0ZTogMCxcbiAgICAgICAgYXZnSGl0VGltZTogMCxcbiAgICAgICAgYXZnTWlzc1RpbWU6IDAsXG4gICAgICAgIHRvdGFsSGl0czogMCxcbiAgICAgICAgdG90YWxNaXNzZXM6IDAsXG4gICAgICAgIGV2aWN0aW9uczogMFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgdG90YWxIaXRzID0gMDtcbiAgICBsZXQgdG90YWxNaXNzZXMgPSAwO1xuICAgIGxldCB0b3RhbEV2aWN0aW9ucyA9IDA7XG4gICAgbGV0IHdlaWdodGVkSGl0VGltZSA9IDA7XG4gICAgbGV0IHdlaWdodGVkTWlzc1RpbWUgPSAwO1xuXG4gICAgZm9yIChjb25zdCBzdGF0cyBvZiB0aGlzLmNhY2hlTWV0cmljcy52YWx1ZXMoKSkge1xuICAgICAgdG90YWxIaXRzICs9IHN0YXRzLnRvdGFsSGl0cztcbiAgICAgIHRvdGFsTWlzc2VzICs9IHN0YXRzLnRvdGFsTWlzc2VzO1xuICAgICAgdG90YWxFdmljdGlvbnMgKz0gc3RhdHMuZXZpY3Rpb25zO1xuICAgICAgd2VpZ2h0ZWRIaXRUaW1lICs9IHN0YXRzLmF2Z0hpdFRpbWUgKiBzdGF0cy50b3RhbEhpdHM7XG4gICAgICB3ZWlnaHRlZE1pc3NUaW1lICs9IHN0YXRzLmF2Z01pc3NUaW1lICogc3RhdHMudG90YWxNaXNzZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhpdFJhdGU6IHRvdGFsSGl0cyArIHRvdGFsTWlzc2VzID4gMCA/IHRvdGFsSGl0cyAvICh0b3RhbEhpdHMgKyB0b3RhbE1pc3NlcykgOiAwLFxuICAgICAgYXZnSGl0VGltZTogdG90YWxIaXRzID4gMCA/IHdlaWdodGVkSGl0VGltZSAvIHRvdGFsSGl0cyA6IDAsXG4gICAgICBhdmdNaXNzVGltZTogdG90YWxNaXNzZXMgPiAwID8gd2VpZ2h0ZWRNaXNzVGltZSAvIHRvdGFsTWlzc2VzIDogMCxcbiAgICAgIHRvdGFsSGl0cyxcbiAgICAgIHRvdGFsTWlzc2VzLFxuICAgICAgZXZpY3Rpb25zOiB0b3RhbEV2aWN0aW9uc1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFN5c3RlbVN0YXRzKCk6IFN5c3RlbVN0YXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3B1VXNhZ2U6IHByb2Nlc3MuY3B1VXNhZ2UoKS51c2VyIC8gMTAwMDAwMCwgLy8gQ29udmVydCB0byBzZWNvbmRzXG4gICAgICBsb2FkQXZlcmFnZTogbG9hZGF2ZygpLFxuICAgICAgZnJlZU1lbW9yeTogZnJlZW1lbSgpLFxuICAgICAgdG90YWxNZW1vcnk6IHRvdGFsbWVtKCksXG4gICAgICB1cHRpbWU6IHByb2Nlc3MudXB0aW1lKClcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple sliding-window rate limiter.
|
|
3
|
+
* Tracks timestamps of recent requests and evicts entries older than the window.
|
|
4
|
+
*/
|
|
5
|
+
export declare class SlidingWindowRateLimiter {
|
|
6
|
+
private readonly maxRequests;
|
|
7
|
+
private readonly windowMs;
|
|
8
|
+
private timestamps;
|
|
9
|
+
constructor(maxRequests: number, windowMs: number);
|
|
10
|
+
/** Returns true if the request is allowed, false if rate-limited. */
|
|
11
|
+
tryAcquire(): boolean;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=SlidingWindowRateLimiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SlidingWindowRateLimiter.d.ts","sourceRoot":"","sources":["../../src/utils/SlidingWindowRateLimiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,wBAAwB;IAGjC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAH3B,OAAO,CAAC,UAAU,CAAgB;gBAEf,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM;IAGnC,qEAAqE;IACrE,UAAU,IAAI,OAAO;CAOtB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple sliding-window rate limiter.
|
|
3
|
+
* Tracks timestamps of recent requests and evicts entries older than the window.
|
|
4
|
+
*/
|
|
5
|
+
export class SlidingWindowRateLimiter {
|
|
6
|
+
maxRequests;
|
|
7
|
+
windowMs;
|
|
8
|
+
timestamps = [];
|
|
9
|
+
constructor(maxRequests, windowMs) {
|
|
10
|
+
this.maxRequests = maxRequests;
|
|
11
|
+
this.windowMs = windowMs;
|
|
12
|
+
}
|
|
13
|
+
/** Returns true if the request is allowed, false if rate-limited. */
|
|
14
|
+
tryAcquire() {
|
|
15
|
+
const now = Date.now();
|
|
16
|
+
this.timestamps = this.timestamps.filter(t => now - t < this.windowMs);
|
|
17
|
+
if (this.timestamps.length >= this.maxRequests)
|
|
18
|
+
return false;
|
|
19
|
+
this.timestamps.push(now);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO0lBR2hCO0lBQ0E7SUFIWCxVQUFVLEdBQWEsRUFBRSxDQUFDO0lBQ2xDLFlBQ21CLFdBQW1CLEVBQ25CLFFBQWdCO1FBRGhCLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQ25CLGFBQVEsR0FBUixRQUFRLENBQVE7SUFDaEMsQ0FBQztJQUVKLHFFQUFxRTtJQUNyRSxVQUFVO1FBQ1IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNpbXBsZSBzbGlkaW5nLXdpbmRvdyByYXRlIGxpbWl0ZXIuXG4gKiBUcmFja3MgdGltZXN0YW1wcyBvZiByZWNlbnQgcmVxdWVzdHMgYW5kIGV2aWN0cyBlbnRyaWVzIG9sZGVyIHRoYW4gdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB7XG4gIHByaXZhdGUgdGltZXN0YW1wczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXhSZXF1ZXN0czogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2luZG93TXM6IG51bWJlcixcbiAgKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3QgaXMgYWxsb3dlZCwgZmFsc2UgaWYgcmF0ZS1saW1pdGVkLiAqL1xuICB0cnlBY3F1aXJlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgdGhpcy50aW1lc3RhbXBzID0gdGhpcy50aW1lc3RhbXBzLmZpbHRlcih0ID0+IG5vdyAtIHQgPCB0aGlzLndpbmRvd01zKTtcbiAgICBpZiAodGhpcy50aW1lc3RhbXBzLmxlbmd0aCA+PSB0aGlzLm1heFJlcXVlc3RzKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy50aW1lc3RhbXBzLnB1c2gobm93KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event ingestion routes for the unified web console.
|
|
3
|
+
*
|
|
4
|
+
* The console leader mounts these routes so follower MCP servers can
|
|
5
|
+
* forward their logs, metrics, and session lifecycle events. All ingested
|
|
6
|
+
* entries are stamped with `_sessionId` in their data field and then
|
|
7
|
+
* broadcast to SSE clients via the existing log/metrics broadcast hooks.
|
|
8
|
+
*
|
|
9
|
+
* Routes:
|
|
10
|
+
* - POST /api/ingest/logs — Batched log entries from a follower
|
|
11
|
+
* - POST /api/ingest/metrics — Metric snapshots from a follower
|
|
12
|
+
* - POST /api/ingest/session — Session lifecycle events (started/stopped/heartbeat)
|
|
13
|
+
* - GET /api/sessions — Active session list for the UI
|
|
14
|
+
*
|
|
15
|
+
* @since v2.1.0 — Issue #1700
|
|
16
|
+
*/
|
|
17
|
+
import { Router } from 'express';
|
|
18
|
+
import type { UnifiedLogEntry } from '../../logging/types.js';
|
|
19
|
+
import type { MetricSnapshot } from '../../metrics/types.js';
|
|
20
|
+
/**
|
|
21
|
+
* Tracked session information.
|
|
22
|
+
*/
|
|
23
|
+
export interface SessionInfo {
|
|
24
|
+
sessionId: string;
|
|
25
|
+
/** Friendly puppet name (e.g., "Kermit", "Punch") */
|
|
26
|
+
displayName: string;
|
|
27
|
+
/** Canonical hex color for this puppet character */
|
|
28
|
+
color: string;
|
|
29
|
+
pid: number;
|
|
30
|
+
startedAt: string;
|
|
31
|
+
lastHeartbeat: string;
|
|
32
|
+
status: 'active' | 'ended';
|
|
33
|
+
isLeader: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Payload for POST /api/ingest/logs
|
|
37
|
+
*/
|
|
38
|
+
export interface IngestLogPayload {
|
|
39
|
+
sessionId: string;
|
|
40
|
+
entries: UnifiedLogEntry[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Payload for POST /api/ingest/metrics
|
|
44
|
+
*/
|
|
45
|
+
export interface IngestMetricsPayload {
|
|
46
|
+
sessionId: string;
|
|
47
|
+
snapshot: MetricSnapshot;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Payload for POST /api/ingest/session
|
|
51
|
+
*/
|
|
52
|
+
export interface SessionEventPayload {
|
|
53
|
+
sessionId: string;
|
|
54
|
+
event: 'started' | 'stopped' | 'heartbeat';
|
|
55
|
+
pid: number;
|
|
56
|
+
startedAt: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Callbacks provided by the unified console orchestrator for broadcasting
|
|
60
|
+
* ingested events through the existing SSE infrastructure.
|
|
61
|
+
*/
|
|
62
|
+
export interface IngestBroadcasts {
|
|
63
|
+
logBroadcast: (entry: UnifiedLogEntry) => void;
|
|
64
|
+
metricsOnSnapshot?: (snapshot: MetricSnapshot) => void;
|
|
65
|
+
sessionBroadcast?: (event: SessionInfo) => void;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Result of creating ingest routes.
|
|
69
|
+
*/
|
|
70
|
+
export interface IngestRoutesResult {
|
|
71
|
+
router: Router;
|
|
72
|
+
/** Get all tracked sessions */
|
|
73
|
+
getSessions: () => SessionInfo[];
|
|
74
|
+
/** Register the leader as a session */
|
|
75
|
+
registerLeaderSession: (sessionId: string, pid: number) => void;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create the ingestion routes and session registry.
|
|
79
|
+
*
|
|
80
|
+
* @param broadcasts - Callbacks to forward ingested events to SSE clients
|
|
81
|
+
* @returns Router and session management functions
|
|
82
|
+
*/
|
|
83
|
+
export declare function createIngestRoutes(broadcasts: IngestBroadcasts): IngestRoutesResult;
|
|
84
|
+
//# sourceMappingURL=IngestRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IngestRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/console/IngestRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAmB7D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/C,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IACvD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,WAAW,EAAE,MAAM,WAAW,EAAE,CAAC;IACjC,uCAAuC;IACvC,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE;AAOD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,gBAAgB,GAAG,kBAAkB,CAoOnF"}
|