@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
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
* Security Telemetry is now a singleton service managed by the DI container.
|
|
12
12
|
*/
|
|
13
13
|
import { EvictingQueue } from '../../utils/EvictingQueue.js';
|
|
14
|
+
import { EventDeduplicator } from '../../utils/EventDeduplicator.js';
|
|
15
|
+
/** Deduplication window: suppress identical log listener calls within this period */
|
|
16
|
+
const DEDUP_WINDOW_MS = 60_000;
|
|
17
|
+
/** Maximum dedup cache entries before LRU eviction */
|
|
18
|
+
const DEDUP_MAX_SIZE = 500;
|
|
14
19
|
/**
|
|
15
20
|
* Security Telemetry Service
|
|
16
21
|
*
|
|
@@ -22,6 +27,7 @@ export class SecurityTelemetry {
|
|
|
22
27
|
METRIC_WINDOW_HOURS = 24; // Track last 24 hours
|
|
23
28
|
attackVectorMap = new Map();
|
|
24
29
|
logListener;
|
|
30
|
+
logDedup = new EventDeduplicator(DEDUP_WINDOW_MS, DEDUP_MAX_SIZE);
|
|
25
31
|
addLogListener(fn) {
|
|
26
32
|
this.logListener = fn;
|
|
27
33
|
return () => { this.logListener = undefined; };
|
|
@@ -48,7 +54,10 @@ export class SecurityTelemetry {
|
|
|
48
54
|
};
|
|
49
55
|
// Bounded FIFO eviction — EvictingQueue handles capacity
|
|
50
56
|
this.attackHistory.push(entry);
|
|
51
|
-
|
|
57
|
+
// Deduplicate log listener calls — same attackType+pattern within 60s = suppress
|
|
58
|
+
if (!this.logDedup.shouldSuppress(`${attackType}\0${pattern}`)) {
|
|
59
|
+
this.logListener?.(entry);
|
|
60
|
+
}
|
|
52
61
|
// Update attack vector map
|
|
53
62
|
const vectorKey = `${attackType}:${pattern}`;
|
|
54
63
|
const existing = this.attackVectorMap.get(vectorKey);
|
|
@@ -125,9 +134,23 @@ export class SecurityTelemetry {
|
|
|
125
134
|
lowSeverityBlocked: lowCount,
|
|
126
135
|
topAttackVectors: topVectors,
|
|
127
136
|
attacksPerHour,
|
|
137
|
+
deduplication: this.getDeduplicationStats(),
|
|
128
138
|
lastUpdated: new Date().toISOString()
|
|
129
139
|
};
|
|
130
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Returns deduplication statistics for observability.
|
|
143
|
+
* Tracks how many repeated log listener calls were suppressed
|
|
144
|
+
* vs. how many unique events passed through.
|
|
145
|
+
*/
|
|
146
|
+
getDeduplicationStats() {
|
|
147
|
+
const stats = this.logDedup.getStats();
|
|
148
|
+
return {
|
|
149
|
+
suppressedEvents: stats.suppressedCount,
|
|
150
|
+
uniqueEvents: stats.processedCount,
|
|
151
|
+
cacheSize: stats.cacheSize,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
131
154
|
/**
|
|
132
155
|
* Get attack patterns by type
|
|
133
156
|
*/
|
|
@@ -191,6 +214,11 @@ Severity Breakdown:
|
|
|
191
214
|
- Medium: ${metrics.mediumSeverityBlocked}
|
|
192
215
|
- Low: ${metrics.lowSeverityBlocked}
|
|
193
216
|
|
|
217
|
+
Deduplication:
|
|
218
|
+
- Suppressed (repeated): ${metrics.deduplication.suppressedEvents}
|
|
219
|
+
- Unique (passed through): ${metrics.deduplication.uniqueEvents}
|
|
220
|
+
- Cache entries: ${metrics.deduplication.cacheSize}
|
|
221
|
+
|
|
194
222
|
Top Attack Vectors:
|
|
195
223
|
${metrics.topAttackVectors.map((v, i) => `${i + 1}. ${v.type} (${v.count} attempts, severity: ${v.severity})`).join('\n')}
|
|
196
224
|
|
|
@@ -240,4 +268,4 @@ ${metrics.attacksPerHour.map((count, i) => `Hour ${23 - i}: ${count} attacks`).j
|
|
|
240
268
|
this.attackVectorMap.clear();
|
|
241
269
|
}
|
|
242
270
|
}
|
|
243
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdXJpdHlUZWxlbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VjdXJpdHkvdGVsZW1ldHJ5L1NlY3VyaXR5VGVsZW1ldHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBR0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBZ0M3RDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFDcEIsYUFBYSxHQUFHLElBQUksYUFBYSxDQUF1QixLQUFLLENBQUMsQ0FBQztJQUN0RCxtQkFBbUIsR0FBRyxFQUFFLENBQUMsQ0FBQyxzQkFBc0I7SUFDaEQsZUFBZSxHQUE4QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2hFLFdBQVcsQ0FBeUM7SUFFNUQsY0FBYyxDQUFDLEVBQXlDO1FBQ3RELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0g7UUFDRSwwQkFBMEI7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILG1CQUFtQixDQUNqQixVQUFrQixFQUNsQixPQUFlLEVBQ2YsUUFBbUMsRUFDbkMsTUFBYyxFQUNkLFFBQThCO1FBRTlCLE1BQU0sS0FBSyxHQUF5QjtZQUNsQyxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSwyQkFBMkI7WUFDaEUsVUFBVTtZQUNWLE9BQU87WUFDUCxRQUFRO1lBQ1IsTUFBTTtZQUNOLE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUTtTQUNULENBQUM7UUFFRix5REFBeUQ7UUFDekQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxD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ZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFLUixPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3BDLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEQsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7U0FDM0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyaXR5IFRlbGVtZXRyeSBmb3IgRG9sbGhvdXNlTUNQXG4gKlxuICogVHJhY2tzIGFuZCBhZ2dyZWdhdGVzIHNlY3VyaXR5IG1ldHJpY3MgZm9yIGJsb2NrZWQgYXR0YWNrcyxcbiAqIHByb3ZpZGluZyBpbnNpZ2h0cyBpbnRvIHRocmVhdCBwYXR0ZXJucyBhbmQgc3lzdGVtIGRlZmVuc2UgZWZmZWN0aXZlbmVzcy5cbiAqXG4gKiBJc3N1ZSAjMTI2OTogRW5oYW5jZWQgdGVsZW1ldHJ5IGZvciBtZW1vcnkgaW5qZWN0aW9uIHByb3RlY3Rpb25cbiAqXG4gKiBSRUZBQ1RPUiBOT1RFOlxuICogQ29udmVydGVkIGZyb20gc3RhdGljIGNsYXNzIHRvIGluc3RhbmNlLWJhc2VkIGZvciBESSBhcmNoaXRlY3R1cmUgY29tcGF0aWJpbGl0eS5cbiAqIFNlY3VyaXR5IFRlbGVtZXRyeSBpcyBub3cgYSBzaW5nbGV0b24gc2VydmljZSBtYW5hZ2VkIGJ5IHRoZSBESSBjb250YWluZXIuXG4gKi9cblxuaW1wb3J0IHsgU2VjdXJpdHlFdmVudCB9IGZyb20gJy4uL3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBFdmljdGluZ1F1ZXVlIH0gZnJvbSAnLi4vLi4vdXRpbHMvRXZpY3RpbmdRdWV1ZS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0YWNrVmVjdG9yIHtcbiAgdHlwZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xuICBsYXN0U2Vlbjogc3RyaW5nO1xuICBzZXZlcml0eTogJ0xPVycgfCAnTUVESVVNJyB8ICdISUdIJyB8ICdDUklUSUNBTCc7XG4gIGJsb2NrZWRQYXR0ZXJuczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlNZXRyaWNzIHtcbiAgdG90YWxCbG9ja2VkQXR0ZW1wdHM6IG51bWJlcjtcbiAgdW5pcXVlQXR0YWNrVmVjdG9yczogbnVtYmVyO1xuICBjcml0aWNhbEF0dGFja3NCbG9ja2VkOiBudW1iZXI7XG4gIGhpZ2hTZXZlcml0eUJsb2NrZWQ6IG51bWJlcjtcbiAgbWVkaXVtU2V2ZXJpdHlCbG9ja2VkOiBudW1iZXI7XG4gIGxvd1NldmVyaXR5QmxvY2tlZDogbnVtYmVyO1xuICB0b3BBdHRhY2tWZWN0b3JzOiBBdHRhY2tWZWN0b3JbXTtcbiAgYXR0YWNrc1BlckhvdXI6IG51bWJlcltdO1xuICBsYXN0VXBkYXRlZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0dGFja1RlbGVtZXRyeUVudHJ5IHtcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIGF0dGFja1R5cGU6IHN0cmluZztcbiAgcGF0dGVybjogc3RyaW5nO1xuICBzZXZlcml0eTogJ0xPVycgfCAnTUVESVVNJyB8ICdISUdIJyB8ICdDUklUSUNBTCc7XG4gIHNvdXJjZTogc3RyaW5nO1xuICBibG9ja2VkOiBib29sZWFuO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogU2VjdXJpdHkgVGVsZW1ldHJ5IFNlcnZpY2VcbiAqXG4gKiBESS1DT01QQVRJQkxFOiBJbnN0YW5jZS1iYXNlZCBzZXJ2aWNlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIFRyYWNrcyBzZWN1cml0eSBldmVudHMsIGF0dGFjayBwYXR0ZXJucywgYW5kIGdlbmVyYXRlcyBtZXRyaWNzLlxuICovXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlUZWxlbWV0cnkge1xuICBwcml2YXRlIGF0dGFja0hpc3RvcnkgPSBuZXcgRXZpY3RpbmdRdWV1ZTxBdHRhY2tUZWxlbWV0cnlFbnRyeT4oMTAwMDApO1xuICBwcml2YXRlIHJlYWRvbmx5IE1FVFJJQ19XSU5ET1dfSE9VUlMgPSAyNDsgLy8gVHJhY2sgbGFzdCAyNCBob3Vyc1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dGFja1ZlY3Rvck1hcDogTWFwPHN0cmluZywgQXR0YWNrVmVjdG9yPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBsb2dMaXN0ZW5lcj86IChlbnRyeTogQXR0YWNrVGVsZW1ldHJ5RW50cnkpID0+IHZvaWQ7XG5cbiAgYWRkTG9nTGlzdGVuZXIoZm46IChlbnRyeTogQXR0YWNrVGVsZW1ldHJ5RW50cnkpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmxvZ0xpc3RlbmVyID0gZm47XG4gICAgcmV0dXJuICgpID0+IHsgdGhpcy5sb2dMaXN0ZW5lciA9IHVuZGVmaW5lZDsgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgU2VjdXJpdHlUZWxlbWV0cnkgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEluc3RhbmNlIGluaXRpYWxpemF0aW9uXG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhIGJsb2NrZWQgYXR0YWNrIGF0dGVtcHRcbiAgICogRklYIChQUiAjMTMxMyByZXZpZXcpOiBVc2UgVVRDIHRpbWVzdGFtcHMgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyB0aW1lem9uZXNcbiAgICovXG4gIHJlY29yZEJsb2NrZWRBdHRhY2soXG4gICAgYXR0YWNrVHlwZTogc3RyaW5nLFxuICAgIHBhdHRlcm46IHN0cmluZyxcbiAgICBzZXZlcml0eTogU2VjdXJpdHlFdmVudFsnc2V2ZXJpdHknXSxcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnk6IEF0dGFja1RlbGVtZXRyeUVudHJ5ID0ge1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIC8vIElTTyBzdHJpbmcgaXMgYWx3YXlzIFVUQ1xuICAgICAgYXR0YWNrVHlwZSxcbiAgICAgIHBhdHRlcm4sXG4gICAgICBzZXZlcml0eSxcbiAgICAgIHNvdXJjZSxcbiAgICAgIGJsb2NrZWQ6IHRydWUsXG4gICAgICBtZXRhZGF0YVxuICAgIH07XG5cbiAgICAvLyBCb3VuZGVkIEZJRk8gZXZpY3Rpb24g4oCUIEV2aWN0aW5nUXVldWUgaGFuZGxlcyBjYXBhY2l0eVxuICAgIHRoaXMuYXR0YWNrSGlzdG9yeS5wdXNoKGVudHJ5KTtcbiAgICB0aGlzLmxvZ0xpc3RlbmVyPy4oZW50cnkpO1xuXG4gICAgLy8gVXBkYXRlIGF0dGFjayB2ZWN0b3IgbWFwXG4gICAgY29uc3QgdmVjdG9yS2V5ID0gYCR7YXR0YWNrVHlwZX06JHtwYXR0ZXJufWA7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmF0dGFja1ZlY3Rvck1hcC5nZXQodmVjdG9yS2V5KTtcblxuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcuY291bnQrKztcbiAgICAgIGV4aXN0aW5nLmxhc3RTZWVuID0gZW50cnkudGltZXN0YW1wO1xuICAgICAgaWYgKCFleGlzdGluZy5ibG9ja2VkUGF0dGVybnMuaW5jbHVkZXMocGF0dGVybikpIHtcbiAgICAgICAgZXhpc3RpbmcuYmxvY2tlZFBhdHRlcm5zLnB1c2gocGF0dGVybik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXR0YWNrVmVjdG9yTWFwLnNldCh2ZWN0b3JLZXksIHtcbiAgICAgICAgdHlwZTogYXR0YWNrVHlwZSxcbiAgICAgICAgY291bnQ6IDEsXG4gICAgICAgIGxhc3RTZWVuOiBlbnRyeS50aW1lc3RhbXAsXG4gICAgICAgIHNldmVyaXR5LFxuICAgICAgICBibG9ja2VkUGF0dGVybnM6IFtwYXR0ZXJuXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZ2dyZWdhdGVkIHNlY3VyaXR5IG1ldHJpY3NcbiAgICovXG4gIGdldE1ldHJpY3MoKTogU2VjdXJpdHlNZXRyaWNzIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHdpbmRvd1N0YXJ0ID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIHRoaXMuTUVUUklDX1dJTkRPV19IT1VSUyAqIDYwICogNjAgKiAxMDAwKTtcblxuICAgIC8vIEZpbHRlciB0byByZWNlbnQgYXR0YWNrc1xuICAgIGNvbnN0IHJlY2VudEF0dGFja3MgPSB0aGlzLmF0dGFja0hpc3RvcnkudG9BcnJheSgpLmZpbHRlcihcbiAgICAgIGF0dGFjayA9PiBuZXcgRGF0ZShhdHRhY2sudGltZXN0YW1wKSA+PSB3aW5kb3dTdGFydFxuICAgICk7XG5cbiAgICAvLyBDb3VudCBieSBzZXZlcml0eVxuICAgIGxldCBjcml0aWNhbENvdW50ID0gMDtcbiAgICBsZXQgaGlnaENvdW50ID0gMDtcbiAgICBsZXQgbWVkaXVtQ291bnQgPSAwO1xuICAgIGxldCBsb3dDb3VudCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGF0dGFjayBvZiByZWNlbnRBdHRhY2tzKSB7XG4gICAgICBzd2l0Y2ggKGF0dGFjay5zZXZlcml0eSkge1xuICAgICAgICBjYXNlICdDUklUSUNBTCc6XG4gICAgICAgICAgY3JpdGljYWxDb3VudCsrO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdISUdIJzpcbiAgICAgICAgICBoaWdoQ291bnQrKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTUVESVVNJzpcbiAgICAgICAgICBtZWRpdW1Db3VudCsrO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdMT1cnOlxuICAgICAgICAgIGxvd0NvdW50Kys7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGF0dGFja3MgcGVyIGhvdXJcbiAgICAvLyBGSVggKFBSICMxMzEzIHJldmlldyk6IEVuc3VyZSBjb25zaXN0ZW50IFVUQyB0aW1lem9uZSBoYW5kbGluZyBmb3IgbWV0cmljc1xuICAgIGNvbnN0IGF0dGFja3NQZXJIb3VyOiBudW1iZXJbXSA9IG5ldyBBcnJheSgyNCkuZmlsbCgwKTtcbiAgICBjb25zdCBub3dVVEMgPSBEYXRlLm5vdygpOyAvLyBVbml4IHRpbWVzdGFtcCBpbiBVVENcbiAgICBmb3IgKGNvbnN0IGF0dGFjayBvZiByZWNlbnRBdHRhY2tzKSB7XG4gICAgICAvLyBhdHRhY2sudGltZXN0YW1wIGlzIElTTyBzdHJpbmcgKFVUQyksIHBhcnNlIHRvIGdldCBVVEMgdGltZVxuICAgICAgY29uc3QgYXR0YWNrVGltZVVUQyA9IG5ldyBEYXRlKGF0dGFjay50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IGhvdXJzQWdvID0gTWF0aC5mbG9vcigobm93VVRDIC0gYXR0YWNrVGltZVVUQykgLyAoNjAgKiA2MCAqIDEwMDApKTtcbiAgICAgIGlmIChob3Vyc0FnbyA+PSAwICYmIGhvdXJzQWdvIDwgMjQpIHtcbiAgICAgICAgYXR0YWNrc1BlckhvdXJbMjMgLSBob3Vyc0Fnb10rKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgdG9wIGF0dGFjayB2ZWN0b3JzXG4gICAgY29uc3QgdmVjdG9yQXJyYXkgPSBBcnJheS5mcm9tKHRoaXMuYXR0YWNrVmVjdG9yTWFwLnZhbHVlcygpKTtcbiAgICAvLyBGSVg6IENyZWF0ZSBjb3B5IGJlZm9yZSBzb3J0aW5nIHRvIGF2b2lkIG11dGF0aW9uIChTb25hckNsb3VkIFM0MDQzKVxuICAgIGNvbnN0IHRvcFZlY3RvcnMgPSBbLi4udmVjdG9yQXJyYXldXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5jb3VudCAtIGEuY291bnQpXG4gICAgICAuc2xpY2UoMCwgMTApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsQmxvY2tlZEF0dGVtcHRzOiByZWNlbnRBdHRhY2tzLmxlbmd0aCxcbiAgICAgIHVuaXF1ZUF0dGFja1ZlY3RvcnM6IG5ldyBTZXQocmVjZW50QXR0YWNrcy5tYXAoYSA9PiBhLmF0dGFja1R5cGUpKS5zaXplLFxuICAgICAgY3JpdGljYWxBdHRhY2tzQmxvY2tlZDogY3JpdGljYWxDb3VudCxcbiAgICAgIGhpZ2hTZXZlcml0eUJsb2NrZWQ6IGhpZ2hDb3VudCxcbiAgICAgIG1lZGl1bVNldmVyaXR5QmxvY2tlZDogbWVkaXVtQ291bnQsXG4gICAgICBsb3dTZXZlcml0eUJsb2NrZWQ6IGxvd0NvdW50LFxuICAgICAgdG9wQXR0YWNrVmVjdG9yczogdG9wVmVjdG9ycyxcbiAgICAgIGF0dGFja3NQZXJIb3VyLFxuICAgICAgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF0dGFjayBwYXR0ZXJucyBieSB0eXBlXG4gICAqL1xuICBnZXRBdHRhY2tQYXR0ZXJuc0J5VHlwZShhdHRhY2tUeXBlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgYXR0YWNrIG9mIHRoaXMuYXR0YWNrSGlzdG9yeS50b0FycmF5KCkpIHtcbiAgICAgIGlmIChhdHRhY2suYXR0YWNrVHlwZSA9PT0gYXR0YWNrVHlwZSkge1xuICAgICAgICBwYXR0ZXJucy5hZGQoYXR0YWNrLnBhdHRlcm4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKHBhdHRlcm5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXR0YWNrIHRpbWVsaW5lIGZvciB2aXN1YWxpemF0aW9uXG4gICAqL1xuICBnZXRBdHRhY2tUaW1lbGluZShob3VyczogbnVtYmVyID0gMjQpOiB7IGhvdXI6IHN0cmluZzsgY291bnQ6IG51bWJlcjsgc2V2ZXJpdHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfVtdIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHRpbWVsaW5lOiB7IGhvdXI6IHN0cmluZzsgY291bnQ6IG51bWJlcjsgc2V2ZXJpdHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfVtdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gaG91cnMgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgaG91clN0YXJ0ID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIChpICsgMSkgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgICBjb25zdCBob3VyRW5kID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIGkgKiA2MCAqIDYwICogMTAwMCk7XG5cbiAgICAgIGNvbnN0IGhvdXJBdHRhY2tzID0gdGhpcy5hdHRhY2tIaXN0b3J5LnRvQXJyYXkoKS5maWx0ZXIoYXR0YWNrID0+IHtcbiAgICAgICAgY29uc3QgYXR0YWNrVGltZSA9IG5ldyBEYXRlKGF0dGFjay50aW1lc3RhbXApO1xuICAgICAgICAvLyBGb3IgdGhlIG1vc3QgcmVjZW50IGhvdXIgKGk9MCksIGluY2x1ZGUgYXR0YWNrcyB1cCB0byBhbmQgaW5jbHVkaW5nIFwibm93XCJcbiAgICAgICAgcmV0dXJuIGkgPT09IDBcbiAgICAgICAgICA/IGF0dGFja1RpbWUgPj0gaG91clN0YXJ0ICYmIGF0dGFja1RpbWUgPD0gbm93XG4gICAgICAgICAgOiBhdHRhY2tUaW1lID49IGhvdXJTdGFydCAmJiBhdHRhY2tUaW1lIDwgaG91ckVuZDtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzZXZlcml0eUNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICAgICAgQ1JJVElDQUw6IDAsXG4gICAgICAgIEhJR0g6IDAsXG4gICAgICAgIE1FRElVTTogMCxcbiAgICAgICAgTE9XOiAwXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IGF0dGFjayBvZiBob3VyQXR0YWNrcykge1xuICAgICAgICBzZXZlcml0eUNvdW50c1thdHRhY2suc2V2ZXJpdHldKys7XG4gICAgICB9XG5cbiAgICAgIHRpbWVsaW5lLnB1c2goe1xuICAgICAgICBob3VyOiBob3VyU3RhcnQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzFdLnNwbGl0KCc6JylbMF0gKyAnOjAwJyxcbiAgICAgICAgY291bnQ6IGhvdXJBdHRhY2tzLmxlbmd0aCxcbiAgICAgICAgc2V2ZXJpdHk6IHNldmVyaXR5Q291bnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZWxpbmU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN1bW1hcnkgcmVwb3J0IGZvciBzZWN1cml0eSBhdWRpdHNcbiAgICovXG4gIGdlbmVyYXRlUmVwb3J0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0cmljcyA9IHRoaXMuZ2V0TWV0cmljcygpO1xuXG4gICAgY29uc3QgcmVwb3J0ID0gYFxuPT09IFNlY3VyaXR5IFRlbGVtZXRyeSBSZXBvcnQgPT09XG5HZW5lcmF0ZWQ6ICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfVxuXG5Ub3RhbCBCbG9ja2VkIEF0dGFja3MgKDI0aCk6ICR7bWV0cmljcy50b3RhbEJsb2NrZWRBdHRlbXB0c31cblVuaXF1ZSBBdHRhY2sgVmVjdG9yczogJHttZXRyaWNzLnVuaXF1ZUF0dGFja1ZlY3RvcnN9XG5cblNldmVyaXR5IEJyZWFrZG93bjpcbi0gQ3JpdGljYWw6ICR7bWV0cmljcy5jcml0aWNhbEF0dGFja3NCbG9ja2VkfVxuLSBIaWdoOiAke21ldHJpY3MuaGlnaFNldmVyaXR5QmxvY2tlZH1cbi0gTWVkaXVtOiAke21ldHJpY3MubWVkaXVtU2V2ZXJpdHlCbG9ja2VkfVxuLSBMb3c6ICR7bWV0cmljcy5sb3dTZXZlcml0eUJsb2NrZWR9XG5cblRvcCBBdHRhY2sgVmVjdG9yczpcbiR7bWV0cmljcy50b3BBdHRhY2tWZWN0b3JzLm1hcCgodiwgaSkgPT5cbiAgYCR7aSArIDF9LiAke3YudHlwZX0gKCR7di5jb3VudH0gYXR0ZW1wdHMsIHNldmVyaXR5OiAke3Yuc2V2ZXJpdHl9KWBcbikuam9pbignXFxuJyl9XG5cbkhvdXJseSBEaXN0cmlidXRpb24gKGxhc3QgMjRoKTpcbiR7bWV0cmljcy5hdHRhY2tzUGVySG91ci5tYXAoKGNvdW50LCBpKSA9PlxuICBgSG91ciAkezIzIC0gaX06ICR7Y291bnR9IGF0dGFja3NgXG4pLmpvaW4oJywgJyl9XG5gO1xuXG4gICAgcmV0dXJuIHJlcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBvbGQgdGVsZW1ldHJ5IGRhdGFcbiAgICovXG4gIGNsZWFyT2xkRGF0YShkYXlzVG9LZWVwOiBudW1iZXIgPSAzMCk6IHZvaWQge1xuICAgIGlmIChkYXlzVG9LZWVwID09PSAwKSB7XG4gICAgICAvLyBDbGVhciBhbGwgZGF0YSBpbW1lZGlhdGVseVxuICAgICAgdGhpcy5hdHRhY2tIaXN0b3J5LmNsZWFyKCk7XG4gICAgICB0aGlzLmF0dGFja1ZlY3Rvck1hcC5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1dG9mZkRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGN1dG9mZkRhdGUuc2V0RGF0ZShjdXRvZmZEYXRlLmdldERhdGUoKSAtIGRheXNUb0tlZXApO1xuICAgIGNvbnN0IGN1dG9mZlRpbWVzdGFtcCA9IGN1dG9mZkRhdGUudG9JU09TdHJpbmcoKTtcblxuICAgIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMuYXR0YWNrSGlzdG9yeS50b0FycmF5KCkuZmlsdGVyKFxuICAgICAgYXR0YWNrID0+IGF0dGFjay50aW1lc3RhbXAgPj0gY3V0b2ZmVGltZXN0YW1wXG4gICAgKTtcbiAgICB0aGlzLmF0dGFja0hpc3RvcnkucmVzZXQoWy4uLnJlbWFpbmluZ10pO1xuXG4gICAgLy8gQ2xlYW4gdXAgb2xkIHZlY3RvcnMgdGhhdCBoYXZlbid0IGJlZW4gc2VlbiByZWNlbnRseVxuICAgIGZvciAoY29uc3QgW2tleSwgdmVjdG9yXSBvZiB0aGlzLmF0dGFja1ZlY3Rvck1hcC5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChuZXcgRGF0ZSh2ZWN0b3IubGFzdFNlZW4pIDwgY3V0b2ZmRGF0ZSkge1xuICAgICAgICB0aGlzLmF0dGFja1ZlY3Rvck1hcC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IHRlbGVtZXRyeSBkYXRhIGZvciBleHRlcm5hbCBhbmFseXNpc1xuICAgKi9cbiAgZXhwb3J0RGF0YSgpOiB7XG4gICAgaGlzdG9yeTogQXR0YWNrVGVsZW1ldHJ5RW50cnlbXTtcbiAgICB2ZWN0b3JzOiBBdHRhY2tWZWN0b3JbXTtcbiAgICBtZXRyaWNzOiBTZWN1cml0eU1ldHJpY3M7XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBoaXN0b3J5OiB0aGlzLmF0dGFja0hpc3RvcnkudG9KU09OKCksXG4gICAgICB2ZWN0b3JzOiBBcnJheS5mcm9tKHRoaXMuYXR0YWNrVmVjdG9yTWFwLnZhbHVlcygpKSxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZ2V0TWV0cmljcygpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIHRoZSB0ZWxlbWV0cnkgc2VydmljZSBhbmQgY2xlYW4gdXAgcmVzb3VyY2VzXG4gICAqIEltcGxlbWVudHMgY2xlYW51cCBmb3IgcHJvcGVyIERJIGxpZmVjeWNsZSBtYW5hZ2VtZW50XG4gICAqL1xuICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXR0YWNrSGlzdG9yeS5jbGVhcigpO1xuICAgIHRoaXMuYXR0YWNrVmVjdG9yTWFwLmNsZWFyKCk7XG4gIH1cbn1cbiJdfQ==
|
|
271
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdXJpdHlUZWxlbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VjdXJpdHkvdGVsZW1ldHJ5L1NlY3VyaXR5VGVsZW1ldHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBR0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBMENyRSxxRkFBcUY7QUFDckYsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBRS9CLHNEQUFzRDtBQUN0RCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFFM0I7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBdUIsS0FBSyxDQUFDLENBQUM7SUFDdEQsbUJBQW1CLEdBQUcsRUFBRSxDQUFDLENBQUMsc0JBQXNCO0lBQ2hELGVBQWUsR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNoRSxXQUFXLENBQXlDO0lBQzNDLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUVuRixjQUFjLENBQUMsRUFBeUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsT0FBTyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSDtRQUNFLDBCQUEwQjtJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsbUJBQW1CLENBQ2pCLFVBQWtCLEVBQ2xCLE9BQWUsRUFDZixRQUFtQyxFQUNuQyxNQUFjLEVBQ2QsUUFBOEI7UUFFOUIsTUFBTSxLQUFLLEdBQXlCO1lBQ2xDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdB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O0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VjdXJpdHkgVGVsZW1ldHJ5IGZvciBEb2xsaG91c2VNQ1BcbiAqXG4gKiBUcmFja3MgYW5kIGFnZ3JlZ2F0ZXMgc2VjdXJpdHkgbWV0cmljcyBmb3IgYmxvY2tlZCBhdHRhY2tzLFxuICogcHJvdmlkaW5nIGluc2lnaHRzIGludG8gdGhyZWF0IHBhdHRlcm5zIGFuZCBzeXN0ZW0gZGVmZW5zZSBlZmZlY3RpdmVuZXNzLlxuICpcbiAqIElzc3VlICMxMjY5OiBFbmhhbmNlZCB0ZWxlbWV0cnkgZm9yIG1lbW9yeSBpbmplY3Rpb24gcHJvdGVjdGlvblxuICpcbiAqIFJFRkFDVE9SIE5PVEU6XG4gKiBDb252ZXJ0ZWQgZnJvbSBzdGF0aWMgY2xhc3MgdG8gaW5zdGFuY2UtYmFzZWQgZm9yIERJIGFyY2hpdGVjdHVyZSBjb21wYXRpYmlsaXR5LlxuICogU2VjdXJpdHkgVGVsZW1ldHJ5IGlzIG5vdyBhIHNpbmdsZXRvbiBzZXJ2aWNlIG1hbmFnZWQgYnkgdGhlIERJIGNvbnRhaW5lci5cbiAqL1xuXG5pbXBvcnQgeyBTZWN1cml0eUV2ZW50IH0gZnJvbSAnLi4vc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IEV2aWN0aW5nUXVldWUgfSBmcm9tICcuLi8uLi91dGlscy9FdmljdGluZ1F1ZXVlLmpzJztcbmltcG9ydCB7IEV2ZW50RGVkdXBsaWNhdG9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvRXZlbnREZWR1cGxpY2F0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dGFja1ZlY3RvciB7XG4gIHR5cGU6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbiAgc2V2ZXJpdHk6ICdMT1cnIHwgJ01FRElVTScgfCAnSElHSCcgfCAnQ1JJVElDQUwnO1xuICBibG9ja2VkUGF0dGVybnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZHVwbGljYXRpb25TdGF0cyB7XG4gIC8qKiBOdW1iZXIgb2YgcmVwZWF0ZWQgZXZlbnRzIHRoYXQgd2VyZSBzdXBwcmVzc2VkICovXG4gIHN1cHByZXNzZWRFdmVudHM6IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiB1bmlxdWUgZXZlbnRzIHRoYXQgcGFzc2VkIHRocm91Z2ggKi9cbiAgdW5pcXVlRXZlbnRzOiBudW1iZXI7XG4gIC8qKiBDdXJyZW50IG51bWJlciBvZiBrZXlzIGluIHRoZSBkZWR1cCBjYWNoZSAqL1xuICBjYWNoZVNpemU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eU1ldHJpY3Mge1xuICB0b3RhbEJsb2NrZWRBdHRlbXB0czogbnVtYmVyO1xuICB1bmlxdWVBdHRhY2tWZWN0b3JzOiBudW1iZXI7XG4gIGNyaXRpY2FsQXR0YWNrc0Jsb2NrZWQ6IG51bWJlcjtcbiAgaGlnaFNldmVyaXR5QmxvY2tlZDogbnVtYmVyO1xuICBtZWRpdW1TZXZlcml0eUJsb2NrZWQ6IG51bWJlcjtcbiAgbG93U2V2ZXJpdHlCbG9ja2VkOiBudW1iZXI7XG4gIHRvcEF0dGFja1ZlY3RvcnM6IEF0dGFja1ZlY3RvcltdO1xuICBhdHRhY2tzUGVySG91cjogbnVtYmVyW107XG4gIGRlZHVwbGljYXRpb246IERlZHVwbGljYXRpb25TdGF0cztcbiAgbGFzdFVwZGF0ZWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdHRhY2tUZWxlbWV0cnlFbnRyeSB7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICBhdHRhY2tUeXBlOiBzdHJpbmc7XG4gIHBhdHRlcm46IHN0cmluZztcbiAgc2V2ZXJpdHk6ICdMT1cnIHwgJ01FRElVTScgfCAnSElHSCcgfCAnQ1JJVElDQUwnO1xuICBzb3VyY2U6IHN0cmluZztcbiAgYmxvY2tlZDogYm9vbGVhbjtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKiogRGVkdXBsaWNhdGlvbiB3aW5kb3c6IHN1cHByZXNzIGlkZW50aWNhbCBsb2cgbGlzdGVuZXIgY2FsbHMgd2l0aGluIHRoaXMgcGVyaW9kICovXG5jb25zdCBERURVUF9XSU5ET1dfTVMgPSA2MF8wMDA7XG5cbi8qKiBNYXhpbXVtIGRlZHVwIGNhY2hlIGVudHJpZXMgYmVmb3JlIExSVSBldmljdGlvbiAqL1xuY29uc3QgREVEVVBfTUFYX1NJWkUgPSA1MDA7XG5cbi8qKlxuICogU2VjdXJpdHkgVGVsZW1ldHJ5IFNlcnZpY2VcbiAqXG4gKiBESS1DT01QQVRJQkxFOiBJbnN0YW5jZS1iYXNlZCBzZXJ2aWNlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIFRyYWNrcyBzZWN1cml0eSBldmVudHMsIGF0dGFjayBwYXR0ZXJucywgYW5kIGdlbmVyYXRlcyBtZXRyaWNzLlxuICovXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlUZWxlbWV0cnkge1xuICBwcml2YXRlIGF0dGFja0hpc3RvcnkgPSBuZXcgRXZpY3RpbmdRdWV1ZTxBdHRhY2tUZWxlbWV0cnlFbnRyeT4oMTAwMDApO1xuICBwcml2YXRlIHJlYWRvbmx5IE1FVFJJQ19XSU5ET1dfSE9VUlMgPSAyNDsgLy8gVHJhY2sgbGFzdCAyNCBob3Vyc1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dGFja1ZlY3Rvck1hcDogTWFwPHN0cmluZywgQXR0YWNrVmVjdG9yPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBsb2dMaXN0ZW5lcj86IChlbnRyeTogQXR0YWNrVGVsZW1ldHJ5RW50cnkpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nRGVkdXAgPSBuZXcgRXZlbnREZWR1cGxpY2F0b3IoREVEVVBfV0lORE9XX01TLCBERURVUF9NQVhfU0laRSk7XG5cbiAgYWRkTG9nTGlzdGVuZXIoZm46IChlbnRyeTogQXR0YWNrVGVsZW1ldHJ5RW50cnkpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmxvZ0xpc3RlbmVyID0gZm47XG4gICAgcmV0dXJuICgpID0+IHsgdGhpcy5sb2dMaXN0ZW5lciA9IHVuZGVmaW5lZDsgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgU2VjdXJpdHlUZWxlbWV0cnkgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEluc3RhbmNlIGluaXRpYWxpemF0aW9uXG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhIGJsb2NrZWQgYXR0YWNrIGF0dGVtcHRcbiAgICogRklYIChQUiAjMTMxMyByZXZpZXcpOiBVc2UgVVRDIHRpbWVzdGFtcHMgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyB0aW1lem9uZXNcbiAgICovXG4gIHJlY29yZEJsb2NrZWRBdHRhY2soXG4gICAgYXR0YWNrVHlwZTogc3RyaW5nLFxuICAgIHBhdHRlcm46IHN0cmluZyxcbiAgICBzZXZlcml0eTogU2VjdXJpdHlFdmVudFsnc2V2ZXJpdHknXSxcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnk6IEF0dGFja1RlbGVtZXRyeUVudHJ5ID0ge1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIC8vIElTTyBzdHJpbmcgaXMgYWx3YXlzIFVUQ1xuICAgICAgYXR0YWNrVHlwZSxcbiAgICAgIHBhdHRlcm4sXG4gICAgICBzZXZlcml0eSxcbiAgICAgIHNvdXJjZSxcbiAgICAgIGJsb2NrZWQ6IHRydWUsXG4gICAgICBtZXRhZGF0YVxuICAgIH07XG5cbiAgICAvLyBCb3VuZGVkIEZJRk8gZXZpY3Rpb24g4oCUIEV2aWN0aW5nUXVldWUgaGFuZGxlcyBjYXBhY2l0eVxuICAgIHRoaXMuYXR0YWNrSGlzdG9yeS5wdXNoKGVudHJ5KTtcblxuICAgIC8vIERlZHVwbGljYXRlIGxvZyBsaXN0ZW5lciBjYWxscyDigJQgc2FtZSBhdHRhY2tUeXBlK3BhdHRlcm4gd2l0aGluIDYwcyA9IHN1cHByZXNzXG4gICAgaWYgKCF0aGlzLmxvZ0RlZHVwLnNob3VsZFN1cHByZXNzKGAke2F0dGFja1R5cGV9XFwwJHtwYXR0ZXJufWApKSB7XG4gICAgICB0aGlzLmxvZ0xpc3RlbmVyPy4oZW50cnkpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBhdHRhY2sgdmVjdG9yIG1hcFxuICAgIGNvbnN0IHZlY3RvcktleSA9IGAke2F0dGFja1R5cGV9OiR7cGF0dGVybn1gO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5hdHRhY2tWZWN0b3JNYXAuZ2V0KHZlY3RvcktleSk7XG5cbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGV4aXN0aW5nLmNvdW50Kys7XG4gICAgICBleGlzdGluZy5sYXN0U2VlbiA9IGVudHJ5LnRpbWVzdGFtcDtcbiAgICAgIGlmICghZXhpc3RpbmcuYmxvY2tlZFBhdHRlcm5zLmluY2x1ZGVzKHBhdHRlcm4pKSB7XG4gICAgICAgIGV4aXN0aW5nLmJsb2NrZWRQYXR0ZXJucy5wdXNoKHBhdHRlcm4pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF0dGFja1ZlY3Rvck1hcC5zZXQodmVjdG9yS2V5LCB7XG4gICAgICAgIHR5cGU6IGF0dGFja1R5cGUsXG4gICAgICAgIGNvdW50OiAxLFxuICAgICAgICBsYXN0U2VlbjogZW50cnkudGltZXN0YW1wLFxuICAgICAgICBzZXZlcml0eSxcbiAgICAgICAgYmxvY2tlZFBhdHRlcm5zOiBbcGF0dGVybl1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWdncmVnYXRlZCBzZWN1cml0eSBtZXRyaWNzXG4gICAqL1xuICBnZXRNZXRyaWNzKCk6IFNlY3VyaXR5TWV0cmljcyB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB3aW5kb3dTdGFydCA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSB0aGlzLk1FVFJJQ19XSU5ET1dfSE9VUlMgKiA2MCAqIDYwICogMTAwMCk7XG5cbiAgICAvLyBGaWx0ZXIgdG8gcmVjZW50IGF0dGFja3NcbiAgICBjb25zdCByZWNlbnRBdHRhY2tzID0gdGhpcy5hdHRhY2tIaXN0b3J5LnRvQXJyYXkoKS5maWx0ZXIoXG4gICAgICBhdHRhY2sgPT4gbmV3IERhdGUoYXR0YWNrLnRpbWVzdGFtcCkgPj0gd2luZG93U3RhcnRcbiAgICApO1xuXG4gICAgLy8gQ291bnQgYnkgc2V2ZXJpdHlcbiAgICBsZXQgY3JpdGljYWxDb3VudCA9IDA7XG4gICAgbGV0IGhpZ2hDb3VudCA9IDA7XG4gICAgbGV0IG1lZGl1bUNvdW50ID0gMDtcbiAgICBsZXQgbG93Q291bnQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBhdHRhY2sgb2YgcmVjZW50QXR0YWNrcykge1xuICAgICAgc3dpdGNoIChhdHRhY2suc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSAnQ1JJVElDQUwnOlxuICAgICAgICAgIGNyaXRpY2FsQ291bnQrKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnSElHSCc6XG4gICAgICAgICAgaGlnaENvdW50Kys7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ01FRElVTSc6XG4gICAgICAgICAgbWVkaXVtQ291bnQrKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTE9XJzpcbiAgICAgICAgICBsb3dDb3VudCsrO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhdHRhY2tzIHBlciBob3VyXG4gICAgLy8gRklYIChQUiAjMTMxMyByZXZpZXcpOiBFbnN1cmUgY29uc2lzdGVudCBVVEMgdGltZXpvbmUgaGFuZGxpbmcgZm9yIG1ldHJpY3NcbiAgICBjb25zdCBhdHRhY2tzUGVySG91cjogbnVtYmVyW10gPSBuZXcgQXJyYXkoMjQpLmZpbGwoMCk7XG4gICAgY29uc3Qgbm93VVRDID0gRGF0ZS5ub3coKTsgLy8gVW5peCB0aW1lc3RhbXAgaW4gVVRDXG4gICAgZm9yIChjb25zdCBhdHRhY2sgb2YgcmVjZW50QXR0YWNrcykge1xuICAgICAgLy8gYXR0YWNrLnRpbWVzdGFtcCBpcyBJU08gc3RyaW5nIChVVEMpLCBwYXJzZSB0byBnZXQgVVRDIHRpbWVcbiAgICAgIGNvbnN0IGF0dGFja1RpbWVVVEMgPSBuZXcgRGF0ZShhdHRhY2sudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICBjb25zdCBob3Vyc0FnbyA9IE1hdGguZmxvb3IoKG5vd1VUQyAtIGF0dGFja1RpbWVVVEMpIC8gKDYwICogNjAgKiAxMDAwKSk7XG4gICAgICBpZiAoaG91cnNBZ28gPj0gMCAmJiBob3Vyc0FnbyA8IDI0KSB7XG4gICAgICAgIGF0dGFja3NQZXJIb3VyWzIzIC0gaG91cnNBZ29dKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IHRvcCBhdHRhY2sgdmVjdG9yc1xuICAgIGNvbnN0IHZlY3RvckFycmF5ID0gQXJyYXkuZnJvbSh0aGlzLmF0dGFja1ZlY3Rvck1hcC52YWx1ZXMoKSk7XG4gICAgLy8gRklYOiBDcmVhdGUgY29weSBiZWZvcmUgc29ydGluZyB0byBhdm9pZCBtdXRhdGlvbiAoU29uYXJDbG91ZCBTNDA0MylcbiAgICBjb25zdCB0b3BWZWN0b3JzID0gWy4uLnZlY3RvckFycmF5XVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY291bnQgLSBhLmNvdW50KVxuICAgICAgLnNsaWNlKDAsIDEwKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbEJsb2NrZWRBdHRlbXB0czogcmVjZW50QXR0YWNrcy5sZW5ndGgsXG4gICAgICB1bmlxdWVBdHRhY2tWZWN0b3JzOiBuZXcgU2V0KHJlY2VudEF0dGFja3MubWFwKGEgPT4gYS5hdHRhY2tUeXBlKSkuc2l6ZSxcbiAgICAgIGNyaXRpY2FsQXR0YWNrc0Jsb2NrZWQ6IGNyaXRpY2FsQ291bnQsXG4gICAgICBoaWdoU2V2ZXJpdHlCbG9ja2VkOiBoaWdoQ291bnQsXG4gICAgICBtZWRpdW1TZXZlcml0eUJsb2NrZWQ6IG1lZGl1bUNvdW50LFxuICAgICAgbG93U2V2ZXJpdHlCbG9ja2VkOiBsb3dDb3VudCxcbiAgICAgIHRvcEF0dGFja1ZlY3RvcnM6IHRvcFZlY3RvcnMsXG4gICAgICBhdHRhY2tzUGVySG91cixcbiAgICAgIGRlZHVwbGljYXRpb246IHRoaXMuZ2V0RGVkdXBsaWNhdGlvblN0YXRzKCksXG4gICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGRlZHVwbGljYXRpb24gc3RhdGlzdGljcyBmb3Igb2JzZXJ2YWJpbGl0eS5cbiAgICogVHJhY2tzIGhvdyBtYW55IHJlcGVhdGVkIGxvZyBsaXN0ZW5lciBjYWxscyB3ZXJlIHN1cHByZXNzZWRcbiAgICogdnMuIGhvdyBtYW55IHVuaXF1ZSBldmVudHMgcGFzc2VkIHRocm91Z2guXG4gICAqL1xuICBnZXREZWR1cGxpY2F0aW9uU3RhdHMoKTogRGVkdXBsaWNhdGlvblN0YXRzIHtcbiAgICBjb25zdCBzdGF0cyA9IHRoaXMubG9nRGVkdXAuZ2V0U3RhdHMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3VwcHJlc3NlZEV2ZW50czogc3RhdHMuc3VwcHJlc3NlZENvdW50LFxuICAgICAgdW5pcXVlRXZlbnRzOiBzdGF0cy5wcm9jZXNzZWRDb3VudCxcbiAgICAgIGNhY2hlU2l6ZTogc3RhdHMuY2FjaGVTaXplLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF0dGFjayBwYXR0ZXJucyBieSB0eXBlXG4gICAqL1xuICBnZXRBdHRhY2tQYXR0ZXJuc0J5VHlwZShhdHRhY2tUeXBlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgYXR0YWNrIG9mIHRoaXMuYXR0YWNrSGlzdG9yeS50b0FycmF5KCkpIHtcbiAgICAgIGlmIChhdHRhY2suYXR0YWNrVHlwZSA9PT0gYXR0YWNrVHlwZSkge1xuICAgICAgICBwYXR0ZXJucy5hZGQoYXR0YWNrLnBhdHRlcm4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKHBhdHRlcm5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXR0YWNrIHRpbWVsaW5lIGZvciB2aXN1YWxpemF0aW9uXG4gICAqL1xuICBnZXRBdHRhY2tUaW1lbGluZShob3VyczogbnVtYmVyID0gMjQpOiB7IGhvdXI6IHN0cmluZzsgY291bnQ6IG51bWJlcjsgc2V2ZXJpdHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfVtdIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHRpbWVsaW5lOiB7IGhvdXI6IHN0cmluZzsgY291bnQ6IG51bWJlcjsgc2V2ZXJpdHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfVtdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gaG91cnMgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgaG91clN0YXJ0ID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIChpICsgMSkgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgICBjb25zdCBob3VyRW5kID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIGkgKiA2MCAqIDYwICogMTAwMCk7XG5cbiAgICAgIGNvbnN0IGhvdXJBdHRhY2tzID0gdGhpcy5hdHRhY2tIaXN0b3J5LnRvQXJyYXkoKS5maWx0ZXIoYXR0YWNrID0+IHtcbiAgICAgICAgY29uc3QgYXR0YWNrVGltZSA9IG5ldyBEYXRlKGF0dGFjay50aW1lc3RhbXApO1xuICAgICAgICAvLyBGb3IgdGhlIG1vc3QgcmVjZW50IGhvdXIgKGk9MCksIGluY2x1ZGUgYXR0YWNrcyB1cCB0byBhbmQgaW5jbHVkaW5nIFwibm93XCJcbiAgICAgICAgcmV0dXJuIGkgPT09IDBcbiAgICAgICAgICA/IGF0dGFja1RpbWUgPj0gaG91clN0YXJ0ICYmIGF0dGFja1RpbWUgPD0gbm93XG4gICAgICAgICAgOiBhdHRhY2tUaW1lID49IGhvdXJTdGFydCAmJiBhdHRhY2tUaW1lIDwgaG91ckVuZDtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzZXZlcml0eUNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICAgICAgQ1JJVElDQUw6IDAsXG4gICAgICAgIEhJR0g6IDAsXG4gICAgICAgIE1FRElVTTogMCxcbiAgICAgICAgTE9XOiAwXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IGF0dGFjayBvZiBob3VyQXR0YWNrcykge1xuICAgICAgICBzZXZlcml0eUNvdW50c1thdHRhY2suc2V2ZXJpdHldKys7XG4gICAgICB9XG5cbiAgICAgIHRpbWVsaW5lLnB1c2goe1xuICAgICAgICBob3VyOiBob3VyU3RhcnQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzFdLnNwbGl0KCc6JylbMF0gKyAnOjAwJyxcbiAgICAgICAgY291bnQ6IGhvdXJBdHRhY2tzLmxlbmd0aCxcbiAgICAgICAgc2V2ZXJpdHk6IHNldmVyaXR5Q291bnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZWxpbmU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN1bW1hcnkgcmVwb3J0IGZvciBzZWN1cml0eSBhdWRpdHNcbiAgICovXG4gIGdlbmVyYXRlUmVwb3J0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0cmljcyA9IHRoaXMuZ2V0TWV0cmljcygpO1xuXG4gICAgY29uc3QgcmVwb3J0ID0gYFxuPT09IFNlY3VyaXR5IFRlbGVtZXRyeSBSZXBvcnQgPT09XG5HZW5lcmF0ZWQ6ICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfVxuXG5Ub3RhbCBCbG9ja2VkIEF0dGFja3MgKDI0aCk6ICR7bWV0cmljcy50b3RhbEJsb2NrZWRBdHRlbXB0c31cblVuaXF1ZSBBdHRhY2sgVmVjdG9yczogJHttZXRyaWNzLnVuaXF1ZUF0dGFja1ZlY3RvcnN9XG5cblNldmVyaXR5IEJyZWFrZG93bjpcbi0gQ3JpdGljYWw6ICR7bWV0cmljcy5jcml0aWNhbEF0dGFja3NCbG9ja2VkfVxuLSBIaWdoOiAke21ldHJpY3MuaGlnaFNldmVyaXR5QmxvY2tlZH1cbi0gTWVkaXVtOiAke21ldHJpY3MubWVkaXVtU2V2ZXJpdHlCbG9ja2VkfVxuLSBMb3c6ICR7bWV0cmljcy5sb3dTZXZlcml0eUJsb2NrZWR9XG5cbkRlZHVwbGljYXRpb246XG4tIFN1cHByZXNzZWQgKHJlcGVhdGVkKTogJHttZXRyaWNzLmRlZHVwbGljYXRpb24uc3VwcHJlc3NlZEV2ZW50c31cbi0gVW5pcXVlIChwYXNzZWQgdGhyb3VnaCk6ICR7bWV0cmljcy5kZWR1cGxpY2F0aW9uLnVuaXF1ZUV2ZW50c31cbi0gQ2FjaGUgZW50cmllczogJHttZXRyaWNzLmRlZHVwbGljYXRpb24uY2FjaGVTaXplfVxuXG5Ub3AgQXR0YWNrIFZlY3RvcnM6XG4ke21ldHJpY3MudG9wQXR0YWNrVmVjdG9ycy5tYXAoKHYsIGkpID0+XG4gIGAke2kgKyAxfS4gJHt2LnR5cGV9ICgke3YuY291bnR9IGF0dGVtcHRzLCBzZXZlcml0eTogJHt2LnNldmVyaXR5fSlgXG4pLmpvaW4oJ1xcbicpfVxuXG5Ib3VybHkgRGlzdHJpYnV0aW9uIChsYXN0IDI0aCk6XG4ke21ldHJpY3MuYXR0YWNrc1BlckhvdXIubWFwKChjb3VudCwgaSkgPT5cbiAgYEhvdXIgJHsyMyAtIGl9OiAke2NvdW50fSBhdHRhY2tzYFxuKS5qb2luKCcsICcpfVxuYDtcblxuICAgIHJldHVybiByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgb2xkIHRlbGVtZXRyeSBkYXRhXG4gICAqL1xuICBjbGVhck9sZERhdGEoZGF5c1RvS2VlcDogbnVtYmVyID0gMzApOiB2b2lkIHtcbiAgICBpZiAoZGF5c1RvS2VlcCA9PT0gMCkge1xuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgaW1tZWRpYXRlbHlcbiAgICAgIHRoaXMuYXR0YWNrSGlzdG9yeS5jbGVhcigpO1xuICAgICAgdGhpcy5hdHRhY2tWZWN0b3JNYXAuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXRvZmZEYXRlID0gbmV3IERhdGUoKTtcbiAgICBjdXRvZmZEYXRlLnNldERhdGUoY3V0b2ZmRGF0ZS5nZXREYXRlKCkgLSBkYXlzVG9LZWVwKTtcbiAgICBjb25zdCBjdXRvZmZUaW1lc3RhbXAgPSBjdXRvZmZEYXRlLnRvSVNPU3RyaW5nKCk7XG5cbiAgICBjb25zdCByZW1haW5pbmcgPSB0aGlzLmF0dGFja0hpc3RvcnkudG9BcnJheSgpLmZpbHRlcihcbiAgICAgIGF0dGFjayA9PiBhdHRhY2sudGltZXN0YW1wID49IGN1dG9mZlRpbWVzdGFtcFxuICAgICk7XG4gICAgdGhpcy5hdHRhY2tIaXN0b3J5LnJlc2V0KFsuLi5yZW1haW5pbmddKTtcblxuICAgIC8vIENsZWFuIHVwIG9sZCB2ZWN0b3JzIHRoYXQgaGF2ZW4ndCBiZWVuIHNlZW4gcmVjZW50bHlcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZlY3Rvcl0gb2YgdGhpcy5hdHRhY2tWZWN0b3JNYXAuZW50cmllcygpKSB7XG4gICAgICBpZiAobmV3IERhdGUodmVjdG9yLmxhc3RTZWVuKSA8IGN1dG9mZkRhdGUpIHtcbiAgICAgICAgdGhpcy5hdHRhY2tWZWN0b3JNYXAuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCB0ZWxlbWV0cnkgZGF0YSBmb3IgZXh0ZXJuYWwgYW5hbHlzaXNcbiAgICovXG4gIGV4cG9ydERhdGEoKToge1xuICAgIGhpc3Rvcnk6IEF0dGFja1RlbGVtZXRyeUVudHJ5W107XG4gICAgdmVjdG9yczogQXR0YWNrVmVjdG9yW107XG4gICAgbWV0cmljczogU2VjdXJpdHlNZXRyaWNzO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGlzdG9yeTogdGhpcy5hdHRhY2tIaXN0b3J5LnRvSlNPTigpLFxuICAgICAgdmVjdG9yczogQXJyYXkuZnJvbSh0aGlzLmF0dGFja1ZlY3Rvck1hcC52YWx1ZXMoKSksXG4gICAgICBtZXRyaWNzOiB0aGlzLmdldE1ldHJpY3MoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSBvZiB0aGUgdGVsZW1ldHJ5IHNlcnZpY2UgYW5kIGNsZWFuIHVwIHJlc291cmNlc1xuICAgKiBJbXBsZW1lbnRzIGNsZWFudXAgZm9yIHByb3BlciBESSBsaWZlY3ljbGUgbWFuYWdlbWVudFxuICAgKi9cbiAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmF0dGFja0hpc3RvcnkuY2xlYXIoKTtcbiAgICB0aGlzLmF0dGFja1ZlY3Rvck1hcC5jbGVhcigpO1xuICB9XG59XG4iXX0=
|
|
@@ -22,6 +22,9 @@ export interface TokenValidationResult {
|
|
|
22
22
|
* Secure GitHub token manager with validation and protection
|
|
23
23
|
*/
|
|
24
24
|
export declare class TokenManager {
|
|
25
|
+
private static tokenLoggedOnce;
|
|
26
|
+
/** Reset static flags for test isolation. */
|
|
27
|
+
static resetStaticState(): void;
|
|
25
28
|
private static readonly GITHUB_TOKEN_PATTERNS;
|
|
26
29
|
private static readonly TOKEN_DIR;
|
|
27
30
|
private static readonly TOKEN_FILE;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenManager.d.ts","sourceRoot":"","sources":["../../src/security/tokenManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAOtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC;KACjB,CAAC;IACF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAU3C;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAA+C;IAChF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAM;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAM;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAM;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAM;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAU;IAG5C,OAAO,CAAC,sBAAsB,CAA4B;IAG1D,OAAO,CAAC,cAAc,CAAyB;gBAEnC,cAAc,EAAE,sBAAsB;IAIlD;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAOjC;;;OAGG;IACH,4BAA4B,IAAI,WAAW;IAQ3C;;;OAGG;IACH,2BAA2B,IAAI,IAAI;IAInC;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAW3C;;;;;;;OAOG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"tokenManager.d.ts","sourceRoot":"","sources":["../../src/security/tokenManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,11 @@ import { UnicodeValidator } from './validators/unicodeValidator.js';
|
|
|
13
13
|
* Secure GitHub token manager with validation and protection
|
|
14
14
|
*/
|
|
15
15
|
export class TokenManager {
|
|
16
|
+
static tokenLoggedOnce = false;
|
|
17
|
+
/** Reset static flags for test isolation. */
|
|
18
|
+
static resetStaticState() {
|
|
19
|
+
TokenManager.tokenLoggedOnce = false;
|
|
20
|
+
}
|
|
16
21
|
static GITHUB_TOKEN_PATTERNS = {
|
|
17
22
|
// More flexible patterns - accept any content after the prefix
|
|
18
23
|
PERSONAL_ACCESS_TOKEN: /^ghp_.+$/, // Personal access tokens
|
|
@@ -111,10 +116,13 @@ export class TokenManager {
|
|
|
111
116
|
return null;
|
|
112
117
|
}
|
|
113
118
|
// codeql[js/clear-text-logging] — Only token type name and first 4 chars (tokenPrefix) are logged, never the full token
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
119
|
+
if (!TokenManager.tokenLoggedOnce) {
|
|
120
|
+
logger.debug('Valid GitHub token found', {
|
|
121
|
+
tokenType: this.getTokenType(token),
|
|
122
|
+
tokenPrefix: this.getTokenPrefix(token)
|
|
123
|
+
});
|
|
124
|
+
TokenManager.tokenLoggedOnce = true;
|
|
125
|
+
}
|
|
118
126
|
return token;
|
|
119
127
|
}
|
|
120
128
|
/**
|
|
@@ -539,4 +547,4 @@ export class TokenManager {
|
|
|
539
547
|
return this.retrieveGitHubToken();
|
|
540
548
|
}
|
|
541
549
|
}
|
|
542
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5NYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L3Rva2VuTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQW9CcEU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLE1BQU0sQ0FBVSxxQkFBcUIsR0FBRztRQUM5QywrREFBK0Q7UUFDL0QscUJBQXFCLEVBQUUsVUFBVSxFQUFPLHlCQUF5QjtRQUNqRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBSyxzQ0FBc0M7UUFDOUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFVLGlDQUFpQztRQUN6RSxpQkFBaUIsRUFBRSxVQUFVLEVBQVcsbUNBQW1DO1FBQzNFLGFBQWEsRUFBRSxVQUFVLEVBQWUsaUJBQWlCO1FBQ3pELGtCQUFrQixFQUFFLFVBQVUsRUFBVSwyQkFBMkI7UUFDbkUsdUZBQXVGO1FBQ3ZGLG9CQUFvQixFQUFFLGVBQWUsQ0FBRyxpQ0FBaUM7S0FDMUUsQ0FBQztJQUVGLCtCQUErQjtJQUN2QixNQUFNLENBQVUsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxD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Q3pDLENBQUMsQ0FBQztnQkFFSCxlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSxxQkFBcUI7b0JBQzNCLFFBQVEsRUFBRSxLQUFLO29CQUNmLE1BQU0sRUFBRSxnQ0FBZ0M7b0JBQ3hDLE9BQU8sRUFBRSwwQ0FBMEM7aUJBQ3BELENBQUMsQ0FBQztnQkFFSCxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDN0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHFCQUFxQjtnQkFDckIsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHFCQUFxQjtnQkFDM0IsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLGdDQUFnQztnQkFDeEMsT0FBTyxFQUFFLGtDQUFrQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUU7YUFDdEcsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CO1FBQ3ZCLG1DQUFtQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWN1cmUgR2l0SHViIHRva2VuIG1hbmFnZW1lbnQgYW5kIHZhbGlkYXRpb25cbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi91dGlscy9SYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4vc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblNjb3BlcyB7XG4gIHJlcXVpcmVkOiBzdHJpbmdbXTtcbiAgb3B0aW9uYWw/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblZhbGlkYXRpb25SZXN1bHQge1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICBzY29wZXM/OiBzdHJpbmdbXTtcbiAgcmF0ZUxpbWl0Pzoge1xuICAgIHJlbWFpbmluZzogbnVtYmVyO1xuICAgIHJlc2V0VGltZTogRGF0ZTtcbiAgfTtcbiAgcmF0ZUxpbWl0RXhjZWVkZWQ/OiBib29sZWFuO1xuICByZXRyeUFmdGVyTXM/OiBudW1iZXI7XG4gIGVycm9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNlY3VyZSBHaXRIdWIgdG9rZW4gbWFuYWdlciB3aXRoIHZhbGlkYXRpb24gYW5kIHByb3RlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFRva2VuTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdJVEhVQl9UT0tFTl9QQVRURVJOUyA9IHtcbiAgICAvLyBNb3JlIGZsZXhpYmxlIHBhdHRlcm5zIC0gYWNjZXB0IGFueSBjb250ZW50IGFmdGVyIHRoZSBwcmVmaXhcbiAgICBQRVJTT05BTF9BQ0NFU1NfVE9LRU46IC9eZ2hwXy4rJC8sICAgICAgLy8gUGVyc29uYWwgYWNjZXNzIHRva2Vuc1xuICAgIEZJTkVfR1JBSU5FRF9QQVQ6IC9eZ2l0aHViX3BhdF8uKyQvLCAgICAvLyBGaW5lLWdyYWluZWQgcGVyc29uYWwgYWNjZXNzIHRva2Vuc1xuICAgIElOU1RBTExBVElPTl9UT0tFTjogL15naHNfLiskLywgICAgICAgICAvLyBHaXRIdWIgQXBwIGluc3RhbGxhdGlvbiB0b2tlbnNcbiAgICBVU0VSX0FDQ0VTU19UT0tFTjogL15naHVfLiskLywgICAgICAgICAgLy8gR2l0SHViIEFwcCB1c2VyLXRvLXNlcnZlciB0b2tlbnNcbiAgICBSRUZSRVNIX1RPS0VOOiAvXmdocl8uKyQvLCAgICAgICAgICAgICAgLy8gUmVmcmVzaCB0b2tlbnNcbiAgICBPQVVUSF9BQ0NFU1NfVE9LRU46IC9eZ2hvXy4rJC8sICAgICAgICAgLy8gT0F1dGggZGV2aWNlIGZsb3cgdG9rZW5zXG4gICAgLy8gR2VuZXJpYyBwYXR0ZXJuIHRvIGNhdGNoIEFMTCBHaXRIdWIgdG9rZW5zIChnaCArIGFueSBsZXR0ZXIgKyB1bmRlcnNjb3JlICsgYW55dGhpbmcpXG4gICAgR0VORVJJQ19HSVRIVUJfVE9LRU46IC9eZ2hbYS16XV8uKyQvaSAgIC8vIENhdGNoLWFsbCBmb3IgYW55IGdoKl8gcGF0dGVyblxuICB9O1xuXG4gIC8vIFNlY3VyZSBzdG9yYWdlIGNvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVE9LRU5fRElSID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAnLmF1dGgnKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVE9LRU5fRklMRSA9ICdnaXRodWJfdG9rZW4uZW5jJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQUxHT1JJVEhNID0gJ2Flcy0yNTYtZ2NtJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgS0VZX0xFTkdUSCA9IDMyO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJVl9MRU5HVEggPSAxNjtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0xFTkdUSCA9IDE2O1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTQUxUX0xFTkdUSCA9IDMyO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJVEVSQVRJT05TID0gMTAwMDAwO1xuXG4gIC8vIFJhdGUgbGltaXRlciBmb3IgdG9rZW4gdmFsaWRhdGlvbiBvcGVyYXRpb25zIC0gcHJldmVudHMgYnJ1dGUgZm9yY2UgYXR0YWNrc1xuICBwcml2YXRlIHRva2VuVmFsaWRhdGlvbkxpbWl0ZXI6IFJhdGVMaW1pdGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRmlsZSBvcGVyYXRpb25zIHNlcnZpY2UgZm9yIHNlY3VyZSBmaWxlIGFjY2VzcyAoaW5qZWN0ZWQgdmlhIGNvbnN0cnVjdG9yKVxuICBwcml2YXRlIGZpbGVPcGVyYXRpb25zOiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKGZpbGVPcGVyYXRpb25zOiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlKSB7XG4gICAgdGhpcy5maWxlT3BlcmF0aW9ucyA9IGZpbGVPcGVyYXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBjcmVhdGUgdGhlIHRva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdGVyXG4gICAqIFByZXZlbnRzIGJydXRlIGZvcmNlIHRva2VuIHZhbGlkYXRpb24gYXR0YWNrc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk6IFJhdGVMaW1pdGVyIHtcbiAgICBpZiAoIXRoaXMudG9rZW5WYWxpZGF0aW9uTGltaXRlcikge1xuICAgICAgdGhpcy50b2tlblZhbGlkYXRpb25MaW1pdGVyID0gdGhpcy5jcmVhdGVUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VuVmFsaWRhdGlvbkxpbWl0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcmF0ZSBsaW1pdGVyIHNwZWNpZmljYWxseSBmb3IgdG9rZW4gdmFsaWRhdGlvblxuICAgKiBDb25zZXJ2YXRpdmUgbGltaXRzIHRvIHByZXZlbnQgYWJ1c2Ugd2hpbGUgYWxsb3dpbmcgbGVnaXRpbWF0ZSB1c2FnZVxuICAgKi9cbiAgY3JlYXRlVG9rZW5WYWxpZGF0aW9uTGltaXRlcigpOiBSYXRlTGltaXRlciB7XG4gICAgcmV0dXJuIG5ldyBSYXRlTGltaXRlcih7XG4gICAgICBtYXhSZXF1ZXN0czogMTAsICAgICAgICAgIC8vIDEwIHZhbGlkYXRpb24gYXR0ZW1wdHNcbiAgICAgIHdpbmRvd01zOiA2MCAqIDYwICogMTAwMCwgLy8gcGVyIGhvdXJcbiAgICAgIG1pbkRlbGF5TXM6IDUgKiAxMDAwICAgICAgLy8gNSBzZWNvbmRzIG1pbmltdW0gYmV0d2VlbiBhdHRlbXB0c1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSB0b2tlbiB2YWxpZGF0aW9uIHJhdGUgbGltaXRlclxuICAgKiBVc2VmdWwgZm9yIHRlc3Rpbmcgb3IgbWFudWFsIGludGVydmVudGlvblxuICAgKi9cbiAgcmVzZXRUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5WYWxpZGF0aW9uTGltaXRlcj8ucmVzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBHaXRIdWIgdG9rZW4gZm9ybWF0XG4gICAqL1xuICB2YWxpZGF0ZVRva2VuRm9ybWF0KHRva2VuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRva2VuIHx8IHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhZ2FpbnN0IGFsbCBrbm93biBHaXRIdWIgdG9rZW4gcGF0dGVybnNcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhUb2tlbk1hbmFnZXIuR0lUSFVCX1RPS0VOX1BBVFRFUk5TKS5zb21lKHBhdHRlcm4gPT5cbiAgICAgIHBhdHRlcm4udGVzdCh0b2tlbilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgdG9rZW4gZnJvbSBlbnZpcm9ubWVudCB3aXRoIHZhbGlkYXRpb25cbiAgICpcbiAgICogU3VwcG9ydHMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2YXJpYWJsZSBuYW1lczpcbiAgICogLSBHSVRIVUJfVE9LRU4gKGNhbm9uaWNhbClcbiAgICogLSBURVNUX0dJVEhVQl9UT0tFTiAoZGVwcmVjYXRlZClcbiAgICogLSBHSVRIVUJfVEVTVF9UT0tFTiAoZGVwcmVjYXRlZClcbiAgICovXG4gIGdldEdpdEh1YlRva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIFRyeSBjYW5vbmljYWwgbmFtZSBmaXJzdFxuICAgIGxldCB0b2tlbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTjtcblxuICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IENoZWNrIGZvciBvbGQgdmFyaWFibGUgbmFtZXNcbiAgICBpZiAoIXRva2VuICYmIHByb2Nlc3MuZW52LlRFU1RfR0lUSFVCX1RPS0VOKSB7XG4gICAgICBsb2dnZXIud2FybignREVQUkVDQVRFRDogVEVTVF9HSVRIVUJfVE9LRU4gaXMgZGVwcmVjYXRlZC4gVXNlIEdJVEhVQl9UT0tFTiB3aXRoIC5lbnYgZmlsZSBvciBHSVRIVUJfVEVTVF9UT0tFTiBmb3IgdGVzdHMuJyk7XG4gICAgICB0b2tlbiA9IHByb2Nlc3MuZW52LlRFU1RfR0lUSFVCX1RPS0VOO1xuICAgIH1cblxuICAgIGlmICghdG9rZW4gJiYgcHJvY2Vzcy5lbnYuR0lUSFVCX1RFU1RfVE9LRU4pIHtcbiAgICAgIGxvZ2dlci53YXJuKCdERVBSRUNBVEVEOiBHSVRIVUJfVEVTVF9UT0tFTiBmb3VuZCBidXQgc2hvdWxkIGJlIHVzZWQgYnkgdGVzdCBjb2RlIG9ubHkuIFByb2R1Y3Rpb24gY29kZSBzaG91bGQgdXNlIEdJVEhVQl9UT0tFTi4nKTtcbiAgICAgIHRva2VuID0gcHJvY2Vzcy5lbnYuR0lUSFVCX1RFU1RfVE9LRU47XG4gICAgfVxuXG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdObyBHaXRIdWIgdG9rZW4gZm91bmQgaW4gZW52aXJvbm1lbnQnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghdGhpcy52YWxpZGF0ZVRva2VuRm9ybWF0KHRva2VuKSkge1xuICAgICAgLy8gY29kZXFsW2pzL2NsZWFyLXRleHQtbG9nZ2luZ10g4oCUIE9ubHkgdGhlIGZpcnN0IDQgY2hhcnMgKHRva2VuUHJlZml4KSBhbmQgbGVuZ3RoIGFyZSBsb2dnZWQsIG5ldmVyIHRoZSBmdWxsIHRva2VuXG4gICAgICBsb2dnZXIud2FybignSW52YWxpZCBHaXRIdWIgdG9rZW4gZm9ybWF0IGRldGVjdGVkJywge1xuICAgICAgICB0b2tlblByZWZpeDogdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbiksXG4gICAgICAgIGxlbmd0aDogdG9rZW4ubGVuZ3RoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNvZGVxbFtqcy9jbGVhci10ZXh0LWxvZ2dpbmddIOKAlCBPbmx5IHRva2VuIHR5cGUgbmFtZSBhbmQgZmlyc3QgNCBjaGFycyAodG9rZW5QcmVmaXgpIGFyZSBsb2dnZWQsIG5ldmVyIHRoZSBmdWxsIHRva2VuXG4gICAgbG9nZ2VyLmRlYnVnKCdWYWxpZCBHaXRIdWIgdG9rZW4gZm91bmQnLCB7XG4gICAgICB0b2tlblR5cGU6IHRoaXMuZ2V0VG9rZW5UeXBlKHRva2VuKSxcbiAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZGFjdCB0b2tlbiBmb3Igc2FmZSBsb2dnaW5nXG4gICAqL1xuICByZWRhY3RUb2tlbih0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuLmxlbmd0aCA8IDgpIHtcbiAgICAgIHJldHVybiAnW1JFREFDVEVEXSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VuLnN1YnN0cmluZygwLCA0KSArICcuLi4nICsgdG9rZW4uc3Vic3RyaW5nKHRva2VuLmxlbmd0aCAtIDQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0b2tlbiB0eXBlIGZyb20gZm9ybWF0XG4gICAqL1xuICBnZXRUb2tlblR5cGUodG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gQ2hlY2sgZmluZS1ncmFpbmVkIFBBVCBmaXJzdCBzaW5jZSBpdCdzIG1vcmUgc3BlY2lmaWNcbiAgICBpZiAoVG9rZW5NYW5hZ2VyLkdJVEhVQl9UT0tFTl9QQVRURVJOUy5GSU5FX0dSQUlORURfUEFULnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0ZpbmUtZ3JhaW5lZCBQZXJzb25hbCBBY2Nlc3MgVG9rZW4nO1xuICAgIH1cbiAgICBpZiAoVG9rZW5NYW5hZ2VyLkdJVEhVQl9UT0tFTl9QQVRURVJOUy5QRVJTT05BTF9BQ0NFU1NfVE9LRU4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiAnUGVyc29uYWwgQWNjZXNzIFRva2VuJztcbiAgICB9XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuSU5TVEFMTEFUSU9OX1RPS0VOLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0luc3RhbGxhdGlvbiBUb2tlbic7XG4gICAgfVxuICAgIGlmIChUb2tlbk1hbmFnZXIuR0lUSFVCX1RPS0VOX1BBVFRFUk5TLlVTRVJfQUNDRVNTX1RPS0VOLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ1VzZXIgQWNjZXNzIFRva2VuJztcbiAgICB9XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuUkVGUkVTSF9UT0tFTi50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuICdSZWZyZXNoIFRva2VuJztcbiAgICB9XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuT0FVVEhfQUNDRVNTX1RPS0VOLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ09BdXRoIEFjY2VzcyBUb2tlbic7XG4gICAgfVxuICAgIC8vIENoZWNrIGdlbmVyaWMgcGF0dGVybiBsYXN0XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuR0VORVJJQ19HSVRIVUJfVE9LRU4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiAnR2l0SHViIFRva2VuJztcbiAgICB9XG4gICAgcmV0dXJuICdVbmtub3duJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2FmZSB0b2tlbiBwcmVmaXggZm9yIGxvZ2dpbmdcbiAgICovXG4gIGdldFRva2VuUHJlZml4KHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdG9rZW4gfHwgdG9rZW4ubGVuZ3RoIDwgNCkge1xuICAgICAgcmV0dXJuICdbSU5WQUxJRF0nO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW4uc3Vic3RyaW5nKDAsIDQpICsgJy4uLic7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdG9rZW4gc2NvcGVzIHZpYSBHaXRIdWIgQVBJXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZVRva2VuU2NvcGVzKFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgcmVxdWlyZWRTY29wZXM6IFRva2VuU2NvcGVzXG4gICk6IFByb21pc2U8VG9rZW5WYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgLy8gVmFsaWRhdGUgdG9rZW4gZm9ybWF0IGJlZm9yZSBjb25zdW1pbmcgcmF0ZSBsaW1pdFxuICAgIGlmICghdGhpcy52YWxpZGF0ZVRva2VuRm9ybWF0KHRva2VuKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnSW52YWxpZCB0b2tlbiBmb3JtYXQnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIHJhdGUgbGltaXQgYmVmb3JlIG1ha2luZyBBUEkgY2FsbFxuICAgIGNvbnN0IHJhdGVMaW1pdGVyID0gdGhpcy5nZXRUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk7XG4gICAgY29uc3QgcmF0ZUxpbWl0U3RhdHVzID0gcmF0ZUxpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuXG4gICAgaWYgKCFyYXRlTGltaXRTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1Rva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdCBleGNlZWRlZCcsIHtcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICByZXRyeUFmdGVyTXM6IHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMsXG4gICAgICAgIHJlbWFpbmluZ1Rva2VuczogcmF0ZUxpbWl0U3RhdHVzLnJlbWFpbmluZ1Rva2Vuc1xuICAgICAgfSk7XG5cbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICBgVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgcmV0cnkgaW4gJHtNYXRoLmNlaWwoKHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMgfHwgMCkgLyAxMDAwKX0gc2Vjb25kcy5gLFxuICAgICAgICAnUkFURV9MSU1JVF9FWENFRURFRCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnN1bWUgcmF0ZSBsaW1pdCB0b2tlbiBmb3IgdGhpcyB2YWxpZGF0aW9uIGF0dGVtcHRcbiAgICAgIHJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgICAgLy8gTWFrZSBhIHRlc3QgQVBJIGNhbGwgdG8gY2hlY2sgdG9rZW4gdmFsaWRpdHkgYW5kIHNjb3Blc1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2VyJywge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhdGVMaW1pdFJlbWFpbmluZyA9IE51bWJlci5wYXJzZUludChyZXNwb25zZS5oZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVtYWluaW5nJykgfHwgJzAnKTtcbiAgICAgIGNvbnN0IHJhdGVMaW1pdFJlc2V0ID0gTnVtYmVyLnBhcnNlSW50KHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZXNldCcpIHx8ICcwJyk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBgR2l0SHViIEFQSSBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gO1xuICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBzY29wZXMgZnJvbSByZXNwb25zZSBoZWFkZXJzXG4gICAgICBjb25zdCBzY29wZXNIZWFkZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldCgneC1vYXV0aC1zY29wZXMnKSB8fCAnJztcbiAgICAgIGNvbnN0IHRva2VuU2NvcGVzID0gc2NvcGVzSGVhZGVyLnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpLmZpbHRlcihzID0+IHMpO1xuXG4gICAgICAvLyBDaGVjayBpZiByZXF1aXJlZCBzY29wZXMgYXJlIHByZXNlbnRcbiAgICAgIGNvbnN0IGhhc1JlcXVpcmVkU2NvcGVzID0gcmVxdWlyZWRTY29wZXMucmVxdWlyZWQuZXZlcnkoc2NvcGUgPT4gXG4gICAgICAgIHRva2VuU2NvcGVzLmluY2x1ZGVzKHNjb3BlKVxuICAgICAgKTtcblxuICAgICAgaWYgKCFoYXNSZXF1aXJlZFNjb3Blcykge1xuICAgICAgICBjb25zdCBtaXNzaW5nU2NvcGVzID0gcmVxdWlyZWRTY29wZXMucmVxdWlyZWQuZmlsdGVyKHNjb3BlID0+IFxuICAgICAgICAgICF0b2tlblNjb3Blcy5pbmNsdWRlcyhzY29wZSlcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci53YXJuKCdUb2tlbiBtaXNzaW5nIHJlcXVpcmVkIHNjb3BlcycsIHtcbiAgICAgICAgICB0b2tlblByZWZpeDogdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbiksXG4gICAgICAgICAgbWlzc2luZ1Njb3BlczogbWlzc2luZ1Njb3BlcyxcbiAgICAgICAgICBjdXJyZW50U2NvcGVzOiB0b2tlblNjb3Blc1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIHNjb3BlczogdG9rZW5TY29wZXMsXG4gICAgICAgICAgZXJyb3I6IGBNaXNzaW5nIHJlcXVpcmVkIHNjb3BlczogJHttaXNzaW5nU2NvcGVzLmpvaW4oJywgJyl9YFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnVG9rZW4gdmFsaWRhdGlvbiBzdWNjZXNzZnVsJywge1xuICAgICAgICB0b2tlblR5cGU6IHRoaXMuZ2V0VG9rZW5UeXBlKHRva2VuKSxcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICBzY29wZXM6IHRva2VuU2NvcGVzLFxuICAgICAgICByYXRlTGltaXRSZW1haW5pbmc6IHJhdGVMaW1pdFJlbWFpbmluZ1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIHNjb3BlczogdG9rZW5TY29wZXMsXG4gICAgICAgIHJhdGVMaW1pdDoge1xuICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgIHJlc2V0VGltZTogbmV3IERhdGUocmF0ZUxpbWl0UmVzZXQgKiAxMDAwKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEhhbmRsZSBTZWN1cml0eUVycm9yIChpbmNsdWRpbmcgcmF0ZSBsaW1pdCBlcnJvcnMpIHNlcGFyYXRlbHlcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ1JBVEVfTElNSVRfRVhDRUVERUQnKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0dXMgPSByYXRlTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgcmF0ZUxpbWl0RXhjZWVkZWQ6IHRydWUsXG4gICAgICAgICAgcmV0cnlBZnRlck1zOiBjdXJyZW50U3RhdHVzLnJldHJ5QWZ0ZXJNcyxcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJztcbiAgICAgIGxvZ2dlci5lcnJvcignVG9rZW4gdmFsaWRhdGlvbiBlcnJvcicsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiBgVmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvck1lc3NhZ2V9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHNhZmUgZXJyb3IgbWVzc2FnZSB3aXRob3V0IHRva2VuIGV4cG9zdXJlXG4gICAqL1xuICBjcmVhdGVTYWZlRXJyb3JNZXNzYWdlKGVycm9yOiBzdHJpbmcsIHRva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgYW55IHBvdGVudGlhbCB0b2tlbiBkYXRhIGZyb20gZXJyb3IgbWVzc2FnZXNcbiAgICAvLyBVc2luZyB3b3JkIGJvdW5kYXJpZXMgdG8gYXZvaWQgb3Zlci1tYXRjaGluZ1xuICAgIGxldCBzYWZlTWVzc2FnZSA9IGVycm9yXG4gICAgICAucmVwbGFjZUFsbCgvXFxiZ2hwX1xcUysvZywgJ1tSRURBQ1RFRF9QQVRdJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXGJnaXRodWJfcGF0X1xcUysvZywgJ1tSRURBQ1RFRF9GSU5FX1BBVF0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdoc19cXFMrL2csICdbUkVEQUNURURfSU5TVEFMTF0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdodV9cXFMrL2csICdbUkVEQUNURURfVVNFUl0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdocl9cXFMrL2csICdbUkVEQUNURURfUkVGUkVTSF0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdob19cXFMrL2csICdbUkVEQUNURURfT0FVVEhdJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXGJnaFthLXpdX1xcUysvZ2ksICdbUkVEQUNURURfVE9LRU5dJyk7ICAvLyBDYXRjaCBhbnkgb3RoZXIgZ2gqXyBwYXR0ZXJuXG5cbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IHRva2VuUHJlZml4ID0gdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbik7XG4gICAgICBzYWZlTWVzc2FnZSArPSBgIChUb2tlbjogJHt0b2tlblByZWZpeH0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2FmZU1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1pbmltdW0gcmVxdWlyZWQgc2NvcGVzIGZvciBkaWZmZXJlbnQgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBOT1RFOiBUaGUgJ21hcmtldHBsYWNlJyBzY29wZSBpZGVudGlmaWVyIGlzIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICogd2l0aCBleGlzdGluZyB0b2tlbiB2YWxpZGF0aW9ucy4gVGhpcyBpcyBhbiBpbnRlcm5hbCBzY29wZSBuYW1lIGFuZCBkb2VzIG5vdFxuICAgKiBhZmZlY3QgdXNlci1mYWNpbmcgZnVuY3Rpb25hbGl0eS4gKFBSICMyODApXG4gICAqL1xuICBnZXRSZXF1aXJlZFNjb3BlcyhvcGVyYXRpb246ICdyZWFkJyB8ICd3cml0ZScgfCAnbWFya2V0cGxhY2UnIHwgJ2NvbGxlY3Rpb24nIHwgJ2dpc3QnKTogVG9rZW5TY29wZXMge1xuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICdyZWFkJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydwdWJsaWNfcmVwbyddLCAgLy8gT0F1dGggdG9rZW5zIHVzZSAncHVibGljX3JlcG8nIG5vdCAncmVwbydcbiAgICAgICAgICBvcHRpb25hbDogWyd1c2VyOmVtYWlsJ11cbiAgICAgICAgfTtcbiAgICAgIFxuICAgICAgY2FzZSAnd3JpdGUnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkOiBbJ3B1YmxpY19yZXBvJ10sICAvLyBPQXV0aCB0b2tlbnMgdXNlICdwdWJsaWNfcmVwbycgbm90ICdyZXBvJ1xuICAgICAgICAgIG9wdGlvbmFsOiBbJ3VzZXI6ZW1haWwnXVxuICAgICAgICB9O1xuICAgICAgXG4gICAgICBjYXNlICdtYXJrZXRwbGFjZSc6IC8vIEludGVybmFsIHNjb3BlIG5hbWUga2VwdCBmb3IgY29tcGF0aWJpbGl0eSAoUFIgIzI4MClcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOiAvLyBOZXcgcHJlZmVycmVkIG5hbWVcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydwdWJsaWNfcmVwbyddLCAgLy8gT0F1dGggdG9rZW5zIHVzZSAncHVibGljX3JlcG8nIG5vdCAncmVwbydcbiAgICAgICAgICBvcHRpb25hbDogWyd1c2VyOmVtYWlsJ11cbiAgICAgICAgfTtcbiAgICAgIFxuICAgICAgY2FzZSAnZ2lzdCc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVxdWlyZWQ6IFsnZ2lzdCddLFxuICAgICAgICAgIG9wdGlvbmFsOiBbJ3VzZXI6ZW1haWwnXVxuICAgICAgICB9O1xuICAgICAgXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkOiBbJ3B1YmxpY19yZXBvJ10gIC8vIE9BdXRoIHRva2VucyB1c2UgJ3B1YmxpY19yZXBvJyBub3QgJ3JlcG8nXG4gICAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRva2VuIGhhcyBzdWZmaWNpZW50IHBlcm1pc3Npb25zIGZvciBvcGVyYXRpb25cbiAgICpcbiAgICogTk9URTogVGhlICdtYXJrZXRwbGFjZScgb3BlcmF0aW9uIHR5cGUgaXMga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAgICogVGhpcyBpcyBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIGFjY2Vzc2luZyBjb2xsZWN0aW9uIGZlYXR1cmVzLiAoUFIgIzI4MClcbiAgICovXG4gIGFzeW5jIGVuc3VyZVRva2VuUGVybWlzc2lvbnMoXG4gICAgb3BlcmF0aW9uOiAncmVhZCcgfCAnd3JpdGUnIHwgJ21hcmtldHBsYWNlJyB8ICdjb2xsZWN0aW9uJyB8ICdnaXN0J1xuICApOiBQcm9taXNlPFRva2VuVmFsaWRhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRHaXRIdWJUb2tlbigpO1xuICAgIFxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogJ05vIEdpdEh1YiB0b2tlbiBhdmFpbGFibGUnXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVpcmVkU2NvcGVzID0gdGhpcy5nZXRSZXF1aXJlZFNjb3BlcyhvcGVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVG9rZW5TY29wZXModG9rZW4sIHJlcXVpcmVkU2NvcGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmUgZW5jcnlwdGlvbiBrZXkgZnJvbSBhIHBhc3NwaHJhc2VcbiAgICovXG4gIHByaXZhdGUgZGVyaXZlS2V5KHBhc3NwaHJhc2U6IHN0cmluZywgc2FsdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICByZXR1cm4gY3J5cHRvLnBia2RmMlN5bmMocGFzc3BocmFzZSwgc2FsdCwgVG9rZW5NYW5hZ2VyLklURVJBVElPTlMsIFRva2VuTWFuYWdlci5LRVlfTEVOR1RILCAnc2hhMjU2Jyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1hY2hpbmUtc3BlY2lmaWMgcGFzc3BocmFzZSBmb3IgZW5jcnlwdGlvblxuICAgKiBVc2VzIGEgY29tYmluYXRpb24gb2YgbWFjaGluZSBJRCBhbmQgdXNlciBpbmZvIGZvciB1bmlxdWVuZXNzXG4gICAqL1xuICBwcml2YXRlIGdldE1hY2hpbmVQYXNzcGhyYXNlKCk6IHN0cmluZyB7XG4gICAgLy8gVXNlIGEgY29tYmluYXRpb24gb2YgaG9zdG5hbWUsIHVzZXJuYW1lLCBhbmQgYSBmaXhlZCBhcHAgaWRlbnRpZmllci5cbiAgICAvLyBjb2RlcWxbanMvaW5zdWZmaWNpZW50LXBhc3N3b3JkLWhhc2hpbmddIOKAlCBUaGVzZSBhcmUgTk9UIHBhc3N3b3JkIGhhc2hlcy5cbiAgICAvLyBTSEEtMjU2IGlzIHVzZWQgdG8gZGVyaXZlIGEgc3RhYmxlIG1hY2hpbmUgZmluZ2VycHJpbnQgZnJvbSBzeXN0ZW0gaWRlbnRpZmllcnNcbiAgICAvLyAoaG9tZSBkaXJlY3RvcnkgcGF0aCwgT1MgdXNlcm5hbWUpLiBUaGUgYWN0dWFsIHRva2VuIGVuY3J5cHRpb24gdXNlcyBwYmtkZjJTeW5jXG4gICAgLy8gd2l0aCBJVEVSQVRJT05TIHJvdW5kcyAoc2VlIGRlcml2ZUtleSBtZXRob2QgYWJvdmUpLlxuICAgIGNvbnN0IGhvc3RuYW1lID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShob21lZGlyKCkpLmRpZ2VzdCgnaGV4Jykuc3Vic3RyaW5nKDAsIDE2KTtcbiAgICBjb25zdCB1c2VybmFtZSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocHJvY2Vzcy5lbnYuVVNFUiB8fCAnZGVmYXVsdCcpLmRpZ2VzdCgnaGV4Jykuc3Vic3RyaW5nKDAsIDE2KTtcbiAgICBjb25zdCBhcHBJZCA9ICdEb2xsaG91c2VNQ1AtVG9rZW5TdG9yZS12MSc7XG5cbiAgICByZXR1cm4gYCR7YXBwSWR9LSR7aG9zdG5hbWV9LSR7dXNlcm5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBHaXRIdWIgdG9rZW4gc2VjdXJlbHkgdG8gZmlsZVxuICAgKi9cbiAgYXN5bmMgc3RvcmVHaXRIdWJUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIHRva2VuIGZvcm1hdCBmaXJzdFxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlVG9rZW5Gb3JtYXQodG9rZW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdJbnZhbGlkIHRva2VuIGZvcm1hdCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWxpemUgYW5kIHZhbGlkYXRlIHRva2VuXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodG9rZW4pO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoJ1Rva2VuIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycycpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkoVG9rZW5NYW5hZ2VyLlRPS0VOX0RJUik7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKFRva2VuTWFuYWdlci5UT0tFTl9ESVIsIDBvNzAwLCB7XG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5zdG9yZUdpdEh1YlRva2VuJ1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEdlbmVyYXRlIGVuY3J5cHRpb24gY29tcG9uZW50c1xuICAgICAgY29uc3Qgc2FsdCA9IGNyeXB0by5yYW5kb21CeXRlcyhUb2tlbk1hbmFnZXIuU0FMVF9MRU5HVEgpO1xuICAgICAgY29uc3QgaXYgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoVG9rZW5NYW5hZ2VyLklWX0xFTkdUSCk7XG4gICAgICBjb25zdCBwYXNzcGhyYXNlID0gdGhpcy5nZXRNYWNoaW5lUGFzc3BocmFzZSgpO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5kZXJpdmVLZXkocGFzc3BocmFzZSwgc2FsdCk7XG5cbiAgICAgIC8vIEVuY3J5cHQgdG9rZW5cbiAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdihUb2tlbk1hbmFnZXIuQUxHT1JJVEhNLCBrZXksIGl2KTtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBjaXBoZXIudXBkYXRlKHZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQsICd1dGY4JyksXG4gICAgICAgIGNpcGhlci5maW5hbCgpXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHRhZyA9IGNpcGhlci5nZXRBdXRoVGFnKCk7XG5cbiAgICAgIC8vIENyZWF0ZSBzdG9yYWdlIGZvcm1hdDogc2FsdCArIGl2ICsgdGFnICsgZW5jcnlwdGVkXG4gICAgICBjb25zdCBzdG9yZWQgPSBCdWZmZXIuY29uY2F0KFtzYWx0LCBpdiwgdGFnLCBlbmNyeXB0ZWRdKTtcblxuICAgICAgLy8gV3JpdGUgdG8gZmlsZSB3aXRoIHJlc3RyaWN0ZWQgcGVybWlzc2lvbnNcbiAgICAgIGNvbnN0IHRva2VuUGF0aCA9IHBhdGguam9pbihUb2tlbk1hbmFnZXIuVE9LRU5fRElSLCBUb2tlbk1hbmFnZXIuVE9LRU5fRklMRSk7XG4gICAgICAvLyBXcml0ZSB0aGUgYmluYXJ5IGNvbnRlbnQgdG8gdGhlIGZpbGUgKG5lZWQgdG8gY29udmVydCBCdWZmZXIgdG8gc3RyaW5nIGZvciBGaWxlT3BlcmF0aW9uc1NlcnZpY2UpXG4gICAgICAvLyBTaW5jZSB3ZSdyZSB3cml0aW5nIGJpbmFyeSBkYXRhLCB3ZSdsbCB3cml0ZSBhcyBiYXNlNjQgZm9yIHNhZmUgc3RvcmFnZVxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUodG9rZW5QYXRoLCBzdG9yZWQudG9TdHJpbmcoJ2Jhc2U2NCcpLCB7XG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5zdG9yZUdpdEh1YlRva2VuJ1xuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKHRva2VuUGF0aCwgMG82MDAsIHtcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnN0b3JlR2l0SHViVG9rZW4nXG4gICAgICB9KTtcblxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5zdG9yZUdpdEh1YlRva2VuJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiBzdG9yZWQgc2VjdXJlbHknLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHRva2VuVHlwZTogdGhpcy5nZXRUb2tlblR5cGUodG9rZW4pLFxuICAgICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiB0b2tlbiBzdG9yZWQgc2VjdXJlbHknKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdUb2tlbk1hbmFnZXIuc3RvcmVHaXRIdWJUb2tlbicsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gc3RvcmUgR2l0SHViIHRva2VuOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgRmFpbGVkIHRvIHN0b3JlIHRva2VuOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBHaXRIdWIgdG9rZW4gZnJvbSBzZWN1cmUgc3RvcmFnZVxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVHaXRIdWJUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW5QYXRoID0gcGF0aC5qb2luKFRva2VuTWFuYWdlci5UT0tFTl9ESVIsIFRva2VuTWFuYWdlci5UT0tFTl9GSUxFKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHNcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHRva2VuUGF0aCk7XG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAvLyBObyBzdG9yZWQgdG9rZW5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgZW5jcnlwdGVkIGRhdGEgKHN0b3JlZCBhcyBiYXNlNjQpXG4gICAgICBjb25zdCBiYXNlNjRDb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZSh0b2tlblBhdGgsIHtcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnJldHJpZXZlR2l0SHViVG9rZW4nXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IEJ1ZmZlci5mcm9tKGJhc2U2NENvbnRlbnQsICdiYXNlNjQnKTtcblxuICAgICAgLy8gRXh0cmFjdCBjb21wb25lbnRzXG4gICAgICBjb25zdCBzYWx0ID0gc3RvcmVkLnN1YmFycmF5KDAsIFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCk7XG4gICAgICBjb25zdCBpdiA9IHN0b3JlZC5zdWJhcnJheShUb2tlbk1hbmFnZXIuU0FMVF9MRU5HVEgsIFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCArIFRva2VuTWFuYWdlci5JVl9MRU5HVEgpO1xuICAgICAgY29uc3QgdGFnID0gc3RvcmVkLnN1YmFycmF5KFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCArIFRva2VuTWFuYWdlci5JVl9MRU5HVEgsIFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCArIFRva2VuTWFuYWdlci5JVl9MRU5HVEggKyBUb2tlbk1hbmFnZXIuVEFHX0xFTkdUSCk7XG4gICAgICBjb25zdCBlbmNyeXB0ZWQgPSBzdG9yZWQuc3ViYXJyYXkoVG9rZW5NYW5hZ2VyLlNBTFRfTEVOR1RIICsgVG9rZW5NYW5hZ2VyLklWX0xFTkdUSCArIFRva2VuTWFuYWdlci5UQUdfTEVOR1RIKTtcblxuICAgICAgLy8gRGVyaXZlIGRlY3J5cHRpb24ga2V5XG4gICAgICBjb25zdCBwYXNzcGhyYXNlID0gdGhpcy5nZXRNYWNoaW5lUGFzc3BocmFzZSgpO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5kZXJpdmVLZXkocGFzc3BocmFzZSwgc2FsdCk7XG5cbiAgICAgIC8vIERlY3J5cHQgdG9rZW5cbiAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoVG9rZW5NYW5hZ2VyLkFMR09SSVRITSwga2V5LCBpdik7XG4gICAgICBkZWNpcGhlci5zZXRBdXRoVGFnKHRhZyk7XG4gICAgICBcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBkZWNpcGhlci51cGRhdGUoZW5jcnlwdGVkKSxcbiAgICAgICAgZGVjaXBoZXIuZmluYWwoKVxuICAgICAgXSkudG9TdHJpbmcoJ3V0ZjgnKTtcblxuICAgICAgLy8gVmFsaWRhdGUgZGVjcnlwdGVkIHRva2VuXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVUb2tlbkZvcm1hdChkZWNyeXB0ZWQpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5yZXRyaWV2ZUdpdEh1YlRva2VuJyxcbiAgICAgICAgICBkZXRhaWxzOiAnRGVjcnlwdGVkIHRva2VuIGhhcyBpbnZhbGlkIGZvcm1hdCdcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5yZXRyaWV2ZUdpdEh1YlRva2VuJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiByZXRyaWV2ZWQgZnJvbSBzZWN1cmUgc3RvcmFnZScsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdG9rZW5UeXBlOiB0aGlzLmdldFRva2VuVHlwZShkZWNyeXB0ZWQpLFxuICAgICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KGRlY3J5cHRlZClcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBkZWNyeXB0ZWQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnJldHJpZXZlR2l0SHViVG9rZW4nLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIHJldHJpZXZlIEdpdEh1YiB0b2tlbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gcmV0cmlldmUgc3RvcmVkIHRva2VuJywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgc3RvcmVkIEdpdEh1YiB0b2tlblxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlU3RvcmVkVG9rZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VuUGF0aCA9IHBhdGguam9pbihUb2tlbk1hbmFnZXIuVE9LRU5fRElSLCBUb2tlbk1hbmFnZXIuVE9LRU5fRklMRSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzIGJlZm9yZSBhdHRlbXB0aW5nIGRlbGV0aW9uXG4gICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyh0b2tlblBhdGgpO1xuICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUodG9rZW5QYXRoLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICBzb3VyY2U6ICdUb2tlbk1hbmFnZXIucmVtb3ZlU3RvcmVkVG9rZW4nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5yZW1vdmVTdG9yZWRUb2tlbicsXG4gICAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiByZW1vdmVkIGZyb20gc2VjdXJlIHN0b3JhZ2UnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKCdTdG9yZWQgR2l0SHViIHRva2VuIHJlbW92ZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdFxuICAgICAgICBsb2dnZXIuZGVidWcoJ05vIHN0b3JlZCB0b2tlbiB0byByZW1vdmUnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnJlbW92ZVN0b3JlZFRva2VuJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byByZW1vdmUgc3RvcmVkIHRva2VuOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHJlbW92ZSBzdG9yZWQgdG9rZW4nLCB7IGVycm9yIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgR2l0SHViIHRva2VuIGZyb20gZW52aXJvbm1lbnQgb3Igc2VjdXJlIHN0b3JhZ2VcbiAgICogVXBkYXRlZCB0byBjaGVjayBzZWN1cmUgc3RvcmFnZSBpZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0XG4gICAqL1xuICBhc3luYyBnZXRHaXRIdWJUb2tlbkFzeW5jKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIC8vIEZpcnN0IGNoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAgY29uc3QgZW52VG9rZW4gPSB0aGlzLmdldEdpdEh1YlRva2VuKCk7XG4gICAgaWYgKGVudlRva2VuKSB7XG4gICAgICByZXR1cm4gZW52VG9rZW47XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIHNlY3VyZSBzdG9yYWdlXG4gICAgcmV0dXJuIHRoaXMucmV0cmlldmVHaXRIdWJUb2tlbigpO1xuICB9XG59Il19
|
|
550
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5NYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L3Rva2VuTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQW9CcEU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLE1BQU0sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRXZDLDZDQUE2QztJQUM3QyxNQUFNLENBQUMsZ0JBQWdCO1FBQ3JCLFlBQVksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxNQUFNLENBQVUscUJBQXFCLEdBQUc7UUFDOUMsK0RBQStEO1FBQy9ELHFCQUFxQixFQUFFLFVBQVUsRUFBTyx5QkFBeUI7UUFDakUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUssc0NBQXNDO1FBQzlFLGtCQUFrQixFQUFFLFVBQVUsRUFBVSxpQ0FBaUM7UUFDekUsaUJBQWlCLEVBQUUsVUFBVSxFQUFXLG1DQUFtQztRQUMzRSxhQUFhLEVBQUUsVUFBVSxFQUFlLGlCQUFpQjtRQUN6RCxrQkFBa0IsRUFBRSxVQUFVLEVBQVUsMkJBQTJCO1FBQ25FLHVGQUF1RjtRQUN2RixvQkFBb0IsRUFBRSxlQUFl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QUFFLENBQUM7UUFDdkMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWN1cmUgR2l0SHViIHRva2VuIG1hbmFnZW1lbnQgYW5kIHZhbGlkYXRpb25cbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi91dGlscy9SYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4vc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblNjb3BlcyB7XG4gIHJlcXVpcmVkOiBzdHJpbmdbXTtcbiAgb3B0aW9uYWw/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblZhbGlkYXRpb25SZXN1bHQge1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICBzY29wZXM/OiBzdHJpbmdbXTtcbiAgcmF0ZUxpbWl0Pzoge1xuICAgIHJlbWFpbmluZzogbnVtYmVyO1xuICAgIHJlc2V0VGltZTogRGF0ZTtcbiAgfTtcbiAgcmF0ZUxpbWl0RXhjZWVkZWQ/OiBib29sZWFuO1xuICByZXRyeUFmdGVyTXM/OiBudW1iZXI7XG4gIGVycm9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNlY3VyZSBHaXRIdWIgdG9rZW4gbWFuYWdlciB3aXRoIHZhbGlkYXRpb24gYW5kIHByb3RlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFRva2VuTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIHRva2VuTG9nZ2VkT25jZSA9IGZhbHNlO1xuXG4gIC8qKiBSZXNldCBzdGF0aWMgZmxhZ3MgZm9yIHRlc3QgaXNvbGF0aW9uLiAqL1xuICBzdGF0aWMgcmVzZXRTdGF0aWNTdGF0ZSgpOiB2b2lkIHtcbiAgICBUb2tlbk1hbmFnZXIudG9rZW5Mb2dnZWRPbmNlID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHSVRIVUJfVE9LRU5fUEFUVEVSTlMgPSB7XG4gICAgLy8gTW9yZSBmbGV4aWJsZSBwYXR0ZXJucyAtIGFjY2VwdCBhbnkgY29udGVudCBhZnRlciB0aGUgcHJlZml4XG4gICAgUEVSU09OQUxfQUNDRVNTX1RPS0VOOiAvXmdocF8uKyQvLCAgICAgIC8vIFBlcnNvbmFsIGFjY2VzcyB0b2tlbnNcbiAgICBGSU5FX0dSQUlORURfUEFUOiAvXmdpdGh1Yl9wYXRfLiskLywgICAgLy8gRmluZS1ncmFpbmVkIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnNcbiAgICBJTlNUQUxMQVRJT05fVE9LRU46IC9eZ2hzXy4rJC8sICAgICAgICAgLy8gR2l0SHViIEFwcCBpbnN0YWxsYXRpb24gdG9rZW5zXG4gICAgVVNFUl9BQ0NFU1NfVE9LRU46IC9eZ2h1Xy4rJC8sICAgICAgICAgIC8vIEdpdEh1YiBBcHAgdXNlci10by1zZXJ2ZXIgdG9rZW5zXG4gICAgUkVGUkVTSF9UT0tFTjogL15naHJfLiskLywgICAgICAgICAgICAgIC8vIFJlZnJlc2ggdG9rZW5zXG4gICAgT0FVVEhfQUNDRVNTX1RPS0VOOiAvXmdob18uKyQvLCAgICAgICAgIC8vIE9BdXRoIGRldmljZSBmbG93IHRva2Vuc1xuICAgIC8vIEdlbmVyaWMgcGF0dGVybiB0byBjYXRjaCBBTEwgR2l0SHViIHRva2VucyAoZ2ggKyBhbnkgbGV0dGVyICsgdW5kZXJzY29yZSArIGFueXRoaW5nKVxuICAgIEdFTkVSSUNfR0lUSFVCX1RPS0VOOiAvXmdoW2Etel1fLiskL2kgICAvLyBDYXRjaC1hbGwgZm9yIGFueSBnaCpfIHBhdHRlcm5cbiAgfTtcblxuICAvLyBTZWN1cmUgc3RvcmFnZSBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPS0VOX0RJUiA9IHBhdGguam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJy5hdXRoJyk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPS0VOX0ZJTEUgPSAnZ2l0aHViX3Rva2VuLmVuYyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFMR09SSVRITSA9ICdhZXMtMjU2LWdjbSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEtFWV9MRU5HVEggPSAzMjtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSVZfTEVOR1RIID0gMTY7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19MRU5HVEggPSAxNjtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0FMVF9MRU5HVEggPSAzMjtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSVRFUkFUSU9OUyA9IDEwMDAwMDtcblxuICAvLyBSYXRlIGxpbWl0ZXIgZm9yIHRva2VuIHZhbGlkYXRpb24gb3BlcmF0aW9ucyAtIHByZXZlbnRzIGJydXRlIGZvcmNlIGF0dGFja3NcbiAgcHJpdmF0ZSB0b2tlblZhbGlkYXRpb25MaW1pdGVyOiBSYXRlTGltaXRlciB8IG51bGwgPSBudWxsO1xuXG4gIC8vIEZpbGUgb3BlcmF0aW9ucyBzZXJ2aWNlIGZvciBzZWN1cmUgZmlsZSBhY2Nlc3MgKGluamVjdGVkIHZpYSBjb25zdHJ1Y3RvcilcbiAgcHJpdmF0ZSBmaWxlT3BlcmF0aW9uczogSUZpbGVPcGVyYXRpb25zU2VydmljZTtcblxuICBjb25zdHJ1Y3RvcihmaWxlT3BlcmF0aW9uczogSUZpbGVPcGVyYXRpb25zU2VydmljZSkge1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBmaWxlT3BlcmF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY3JlYXRlIHRoZSB0b2tlbiB2YWxpZGF0aW9uIHJhdGUgbGltaXRlclxuICAgKiBQcmV2ZW50cyBicnV0ZSBmb3JjZSB0b2tlbiB2YWxpZGF0aW9uIGF0dGFja3NcbiAgICovXG4gIHByaXZhdGUgZ2V0VG9rZW5WYWxpZGF0aW9uTGltaXRlcigpOiBSYXRlTGltaXRlciB7XG4gICAgaWYgKCF0aGlzLnRva2VuVmFsaWRhdGlvbkxpbWl0ZXIpIHtcbiAgICAgIHRoaXMudG9rZW5WYWxpZGF0aW9uTGltaXRlciA9IHRoaXMuY3JlYXRlVG9rZW5WYWxpZGF0aW9uTGltaXRlcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2tlblZhbGlkYXRpb25MaW1pdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJhdGUgbGltaXRlciBzcGVjaWZpY2FsbHkgZm9yIHRva2VuIHZhbGlkYXRpb25cbiAgICogQ29uc2VydmF0aXZlIGxpbWl0cyB0byBwcmV2ZW50IGFidXNlIHdoaWxlIGFsbG93aW5nIGxlZ2l0aW1hdGUgdXNhZ2VcbiAgICovXG4gIGNyZWF0ZVRva2VuVmFsaWRhdGlvbkxpbWl0ZXIoKTogUmF0ZUxpbWl0ZXIge1xuICAgIHJldHVybiBuZXcgUmF0ZUxpbWl0ZXIoe1xuICAgICAgbWF4UmVxdWVzdHM6IDEwLCAgICAgICAgICAvLyAxMCB2YWxpZGF0aW9uIGF0dGVtcHRzXG4gICAgICB3aW5kb3dNczogNjAgKiA2MCAqIDEwMDAsIC8vIHBlciBob3VyXG4gICAgICBtaW5EZWxheU1zOiA1ICogMTAwMCAgICAgIC8vIDUgc2Vjb25kcyBtaW5pbXVtIGJldHdlZW4gYXR0ZW1wdHNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgdG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZXJcbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nIG9yIG1hbnVhbCBpbnRlcnZlbnRpb25cbiAgICovXG4gIHJlc2V0VG9rZW5WYWxpZGF0aW9uTGltaXRlcigpOiB2b2lkIHtcbiAgICB0aGlzLnRva2VuVmFsaWRhdGlvbkxpbWl0ZXI/LnJlc2V0KCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgR2l0SHViIHRva2VuIGZvcm1hdFxuICAgKi9cbiAgdmFsaWRhdGVUb2tlbkZvcm1hdCh0b2tlbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0b2tlbiB8fCB0eXBlb2YgdG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYWdhaW5zdCBhbGwga25vd24gR2l0SHViIHRva2VuIHBhdHRlcm5zXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoVG9rZW5NYW5hZ2VyLkdJVEhVQl9UT0tFTl9QQVRURVJOUykuc29tZShwYXR0ZXJuID0+XG4gICAgICBwYXR0ZXJuLnRlc3QodG9rZW4pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgR2l0SHViIHRva2VuIGZyb20gZW52aXJvbm1lbnQgd2l0aCB2YWxpZGF0aW9uXG4gICAqXG4gICAqIFN1cHBvcnRzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgdmFyaWFibGUgbmFtZXM6XG4gICAqIC0gR0lUSFVCX1RPS0VOIChjYW5vbmljYWwpXG4gICAqIC0gVEVTVF9HSVRIVUJfVE9LRU4gKGRlcHJlY2F0ZWQpXG4gICAqIC0gR0lUSFVCX1RFU1RfVE9LRU4gKGRlcHJlY2F0ZWQpXG4gICAqL1xuICBnZXRHaXRIdWJUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUcnkgY2Fub25pY2FsIG5hbWUgZmlyc3RcbiAgICBsZXQgdG9rZW4gPSBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG5cbiAgICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBDaGVjayBmb3Igb2xkIHZhcmlhYmxlIG5hbWVzXG4gICAgaWYgKCF0b2tlbiAmJiBwcm9jZXNzLmVudi5URVNUX0dJVEhVQl9UT0tFTikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0RFUFJFQ0FURUQ6IFRFU1RfR0lUSFVCX1RPS0VOIGlzIGRlcHJlY2F0ZWQuIFVzZSBHSVRIVUJfVE9LRU4gd2l0aCAuZW52IGZpbGUgb3IgR0lUSFVCX1RFU1RfVE9LRU4gZm9yIHRlc3RzLicpO1xuICAgICAgdG9rZW4gPSBwcm9jZXNzLmVudi5URVNUX0dJVEhVQl9UT0tFTjtcbiAgICB9XG5cbiAgICBpZiAoIXRva2VuICYmIHByb2Nlc3MuZW52LkdJVEhVQl9URVNUX1RPS0VOKSB7XG4gICAgICBsb2dnZXIud2FybignREVQUkVDQVRFRDogR0lUSFVCX1RFU1RfVE9LRU4gZm91bmQgYnV0IHNob3VsZCBiZSB1c2VkIGJ5IHRlc3QgY29kZSBvbmx5LiBQcm9kdWN0aW9uIGNvZGUgc2hvdWxkIHVzZSBHSVRIVUJfVE9LRU4uJyk7XG4gICAgICB0b2tlbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9URVNUX1RPS0VOO1xuICAgIH1cblxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gR2l0SHViIHRva2VuIGZvdW5kIGluIGVudmlyb25tZW50Jyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdGVUb2tlbkZvcm1hdCh0b2tlbikpIHtcbiAgICAgIC8vIGNvZGVxbFtqcy9jbGVhci10ZXh0LWxvZ2dpbmddIOKAlCBPbmx5IHRoZSBmaXJzdCA0IGNoYXJzICh0b2tlblByZWZpeCkgYW5kIGxlbmd0aCBhcmUgbG9nZ2VkLCBuZXZlciB0aGUgZnVsbCB0b2tlblxuICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgR2l0SHViIHRva2VuIGZvcm1hdCBkZXRlY3RlZCcsIHtcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICBsZW5ndGg6IHRva2VuLmxlbmd0aFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjb2RlcWxbanMvY2xlYXItdGV4dC1sb2dnaW5nXSDigJQgT25seSB0b2tlbiB0eXBlIG5hbWUgYW5kIGZpcnN0IDQgY2hhcnMgKHRva2VuUHJlZml4KSBhcmUgbG9nZ2VkLCBuZXZlciB0aGUgZnVsbCB0b2tlblxuICAgIGlmICghVG9rZW5NYW5hZ2VyLnRva2VuTG9nZ2VkT25jZSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdWYWxpZCBHaXRIdWIgdG9rZW4gZm91bmQnLCB7XG4gICAgICAgIHRva2VuVHlwZTogdGhpcy5nZXRUb2tlblR5cGUodG9rZW4pLFxuICAgICAgICB0b2tlblByZWZpeDogdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbilcbiAgICAgIH0pO1xuICAgICAgVG9rZW5NYW5hZ2VyLnRva2VuTG9nZ2VkT25jZSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZGFjdCB0b2tlbiBmb3Igc2FmZSBsb2dnaW5nXG4gICAqL1xuICByZWRhY3RUb2tlbih0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuLmxlbmd0aCA8IDgpIHtcbiAgICAgIHJldHVybiAnW1JFREFDVEVEXSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VuLnN1YnN0cmluZygwLCA0KSArICcuLi4nICsgdG9rZW4uc3Vic3RyaW5nKHRva2VuLmxlbmd0aCAtIDQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0b2tlbiB0eXBlIGZyb20gZm9ybWF0XG4gICAqL1xuICBnZXRUb2tlblR5cGUodG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gQ2hlY2sgZmluZS1ncmFpbmVkIFBBVCBmaXJzdCBzaW5jZSBpdCdzIG1vcmUgc3BlY2lmaWNcbiAgICBpZiAoVG9rZW5NYW5hZ2VyLkdJVEhVQl9UT0tFTl9QQVRURVJOUy5GSU5FX0dSQUlORURfUEFULnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0ZpbmUtZ3JhaW5lZCBQZXJzb25hbCBBY2Nlc3MgVG9rZW4nO1xuICAgIH1cbiAgICBpZiAoVG9rZW5NYW5hZ2VyLkdJVEhVQl9UT0tFTl9QQVRURVJOUy5QRVJTT05BTF9BQ0NFU1NfVE9LRU4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiAnUGVyc29uYWwgQWNjZXNzIFRva2VuJztcbiAgICB9XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuSU5TVEFMTEFUSU9OX1RPS0VOLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0luc3RhbGxhdGlvbiBUb2tlbic7XG4gICAgfVxuICAgIGlmIChUb2tlbk1hbmFnZXIuR0lUSFVCX1RPS0VOX1BBVFRFUk5TLlVTRVJfQUNDRVNTX1RPS0VOLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ1VzZXIgQWNjZXNzIFRva2VuJztcbiAgICB9XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuUkVGUkVTSF9UT0tFTi50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuICdSZWZyZXNoIFRva2VuJztcbiAgICB9XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuT0FVVEhfQUNDRVNTX1RPS0VOLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ09BdXRoIEFjY2VzcyBUb2tlbic7XG4gICAgfVxuICAgIC8vIENoZWNrIGdlbmVyaWMgcGF0dGVybiBsYXN0XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuR0VORVJJQ19HSVRIVUJfVE9LRU4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiAnR2l0SHViIFRva2VuJztcbiAgICB9XG4gICAgcmV0dXJuICdVbmtub3duJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2FmZSB0b2tlbiBwcmVmaXggZm9yIGxvZ2dpbmdcbiAgICovXG4gIGdldFRva2VuUHJlZml4KHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdG9rZW4gfHwgdG9rZW4ubGVuZ3RoIDwgNCkge1xuICAgICAgcmV0dXJuICdbSU5WQUxJRF0nO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW4uc3Vic3RyaW5nKDAsIDQpICsgJy4uLic7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdG9rZW4gc2NvcGVzIHZpYSBHaXRIdWIgQVBJXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZVRva2VuU2NvcGVzKFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgcmVxdWlyZWRTY29wZXM6IFRva2VuU2NvcGVzXG4gICk6IFByb21pc2U8VG9rZW5WYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgLy8gVmFsaWRhdGUgdG9rZW4gZm9ybWF0IGJlZm9yZSBjb25zdW1pbmcgcmF0ZSBsaW1pdFxuICAgIGlmICghdGhpcy52YWxpZGF0ZVRva2VuRm9ybWF0KHRva2VuKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnSW52YWxpZCB0b2tlbiBmb3JtYXQnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIHJhdGUgbGltaXQgYmVmb3JlIG1ha2luZyBBUEkgY2FsbFxuICAgIGNvbnN0IHJhdGVMaW1pdGVyID0gdGhpcy5nZXRUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk7XG4gICAgY29uc3QgcmF0ZUxpbWl0U3RhdHVzID0gcmF0ZUxpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuXG4gICAgaWYgKCFyYXRlTGltaXRTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1Rva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdCBleGNlZWRlZCcsIHtcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICByZXRyeUFmdGVyTXM6IHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMsXG4gICAgICAgIHJlbWFpbmluZ1Rva2VuczogcmF0ZUxpbWl0U3RhdHVzLnJlbWFpbmluZ1Rva2Vuc1xuICAgICAgfSk7XG5cbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICBgVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgcmV0cnkgaW4gJHtNYXRoLmNlaWwoKHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMgfHwgMCkgLyAxMDAwKX0gc2Vjb25kcy5gLFxuICAgICAgICAnUkFURV9MSU1JVF9FWENFRURFRCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnN1bWUgcmF0ZSBsaW1pdCB0b2tlbiBmb3IgdGhpcyB2YWxpZGF0aW9uIGF0dGVtcHRcbiAgICAgIHJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgICAgLy8gTWFrZSBhIHRlc3QgQVBJIGNhbGwgdG8gY2hlY2sgdG9rZW4gdmFsaWRpdHkgYW5kIHNjb3Blc1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2VyJywge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhdGVMaW1pdFJlbWFpbmluZyA9IE51bWJlci5wYXJzZUludChyZXNwb25zZS5oZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVtYWluaW5nJykgfHwgJzAnKTtcbiAgICAgIGNvbnN0IHJhdGVMaW1pdFJlc2V0ID0gTnVtYmVyLnBhcnNlSW50KHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZXNldCcpIHx8ICcwJyk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBgR2l0SHViIEFQSSBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gO1xuICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBzY29wZXMgZnJvbSByZXNwb25zZSBoZWFkZXJzXG4gICAgICBjb25zdCBzY29wZXNIZWFkZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldCgneC1vYXV0aC1zY29wZXMnKSB8fCAnJztcbiAgICAgIGNvbnN0IHRva2VuU2NvcGVzID0gc2NvcGVzSGVhZGVyLnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpLmZpbHRlcihzID0+IHMpO1xuXG4gICAgICAvLyBDaGVjayBpZiByZXF1aXJlZCBzY29wZXMgYXJlIHByZXNlbnRcbiAgICAgIGNvbnN0IGhhc1JlcXVpcmVkU2NvcGVzID0gcmVxdWlyZWRTY29wZXMucmVxdWlyZWQuZXZlcnkoc2NvcGUgPT4gXG4gICAgICAgIHRva2VuU2NvcGVzLmluY2x1ZGVzKHNjb3BlKVxuICAgICAgKTtcblxuICAgICAgaWYgKCFoYXNSZXF1aXJlZFNjb3Blcykge1xuICAgICAgICBjb25zdCBtaXNzaW5nU2NvcGVzID0gcmVxdWlyZWRTY29wZXMucmVxdWlyZWQuZmlsdGVyKHNjb3BlID0+IFxuICAgICAgICAgICF0b2tlblNjb3Blcy5pbmNsdWRlcyhzY29wZSlcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci53YXJuKCdUb2tlbiBtaXNzaW5nIHJlcXVpcmVkIHNjb3BlcycsIHtcbiAgICAgICAgICB0b2tlblByZWZpeDogdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbiksXG4gICAgICAgICAgbWlzc2luZ1Njb3BlczogbWlzc2luZ1Njb3BlcyxcbiAgICAgICAgICBjdXJyZW50U2NvcGVzOiB0b2tlblNjb3Blc1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIHNjb3BlczogdG9rZW5TY29wZXMsXG4gICAgICAgICAgZXJyb3I6IGBNaXNzaW5nIHJlcXVpcmVkIHNjb3BlczogJHttaXNzaW5nU2NvcGVzLmpvaW4oJywgJyl9YFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnVG9rZW4gdmFsaWRhdGlvbiBzdWNjZXNzZnVsJywge1xuICAgICAgICB0b2tlblR5cGU6IHRoaXMuZ2V0VG9rZW5UeXBlKHRva2VuKSxcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICBzY29wZXM6IHRva2VuU2NvcGVzLFxuICAgICAgICByYXRlTGltaXRSZW1haW5pbmc6IHJhdGVMaW1pdFJlbWFpbmluZ1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIHNjb3BlczogdG9rZW5TY29wZXMsXG4gICAgICAgIHJhdGVMaW1pdDoge1xuICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgIHJlc2V0VGltZTogbmV3IERhdGUocmF0ZUxpbWl0UmVzZXQgKiAxMDAwKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEhhbmRsZSBTZWN1cml0eUVycm9yIChpbmNsdWRpbmcgcmF0ZSBsaW1pdCBlcnJvcnMpIHNlcGFyYXRlbHlcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ1JBVEVfTElNSVRfRVhDRUVERUQnKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0dXMgPSByYXRlTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgcmF0ZUxpbWl0RXhjZWVkZWQ6IHRydWUsXG4gICAgICAgICAgcmV0cnlBZnRlck1zOiBjdXJyZW50U3RhdHVzLnJldHJ5QWZ0ZXJNcyxcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJztcbiAgICAgIGxvZ2dlci5lcnJvcignVG9rZW4gdmFsaWRhdGlvbiBlcnJvcicsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiBgVmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvck1lc3NhZ2V9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHNhZmUgZXJyb3IgbWVzc2FnZSB3aXRob3V0IHRva2VuIGV4cG9zdXJlXG4gICAqL1xuICBjcmVhdGVTYWZlRXJyb3JNZXNzYWdlKGVycm9yOiBzdHJpbmcsIHRva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgYW55IHBvdGVudGlhbCB0b2tlbiBkYXRhIGZyb20gZXJyb3IgbWVzc2FnZXNcbiAgICAvLyBVc2luZyB3b3JkIGJvdW5kYXJpZXMgdG8gYXZvaWQgb3Zlci1tYXRjaGluZ1xuICAgIGxldCBzYWZlTWVzc2FnZSA9IGVycm9yXG4gICAgICAucmVwbGFjZUFsbCgvXFxiZ2hwX1xcUysvZywgJ1tSRURBQ1RFRF9QQVRdJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXGJnaXRodWJfcGF0X1xcUysvZywgJ1tSRURBQ1RFRF9GSU5FX1BBVF0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdoc19cXFMrL2csICdbUkVEQUNURURfSU5TVEFMTF0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdodV9cXFMrL2csICdbUkVEQUNURURfVVNFUl0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdocl9cXFMrL2csICdbUkVEQUNURURfUkVGUkVTSF0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdob19cXFMrL2csICdbUkVEQUNURURfT0FVVEhdJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXGJnaFthLXpdX1xcUysvZ2ksICdbUkVEQUNURURfVE9LRU5dJyk7ICAvLyBDYXRjaCBhbnkgb3RoZXIgZ2gqXyBwYXR0ZXJuXG5cbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IHRva2VuUHJlZml4ID0gdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbik7XG4gICAgICBzYWZlTWVzc2FnZSArPSBgIChUb2tlbjogJHt0b2tlblByZWZpeH0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2FmZU1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1pbmltdW0gcmVxdWlyZWQgc2NvcGVzIGZvciBkaWZmZXJlbnQgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBOT1RFOiBUaGUgJ21hcmtldHBsYWNlJyBzY29wZSBpZGVudGlmaWVyIGlzIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICogd2l0aCBleGlzdGluZyB0b2tlbiB2YWxpZGF0aW9ucy4gVGhpcyBpcyBhbiBpbnRlcm5hbCBzY29wZSBuYW1lIGFuZCBkb2VzIG5vdFxuICAgKiBhZmZlY3QgdXNlci1mYWNpbmcgZnVuY3Rpb25hbGl0eS4gKFBSICMyODApXG4gICAqL1xuICBnZXRSZXF1aXJlZFNjb3BlcyhvcGVyYXRpb246ICdyZWFkJyB8ICd3cml0ZScgfCAnbWFya2V0cGxhY2UnIHwgJ2NvbGxlY3Rpb24nIHwgJ2dpc3QnKTogVG9rZW5TY29wZXMge1xuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICdyZWFkJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydwdWJsaWNfcmVwbyddLCAgLy8gT0F1dGggdG9rZW5zIHVzZSAncHVibGljX3JlcG8nIG5vdCAncmVwbydcbiAgICAgICAgICBvcHRpb25hbDogWyd1c2VyOmVtYWlsJ11cbiAgICAgICAgfTtcbiAgICAgIFxuICAgICAgY2FzZSAnd3JpdGUnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkOiBbJ3B1YmxpY19yZXBvJ10sICAvLyBPQXV0aCB0b2tlbnMgdXNlICdwdWJsaWNfcmVwbycgbm90ICdyZXBvJ1xuICAgICAgICAgIG9wdGlvbmFsOiBbJ3VzZXI6ZW1haWwnXVxuICAgICAgICB9O1xuICAgICAgXG4gICAgICBjYXNlICdtYXJrZXRwbGFjZSc6IC8vIEludGVybmFsIHNjb3BlIG5hbWUga2VwdCBmb3IgY29tcGF0aWJpbGl0eSAoUFIgIzI4MClcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOiAvLyBOZXcgcHJlZmVycmVkIG5hbWVcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydwdWJsaWNfcmVwbyddLCAgLy8gT0F1dGggdG9rZW5zIHVzZSAncHVibGljX3JlcG8nIG5vdCAncmVwbydcbiAgICAgICAgICBvcHRpb25hbDogWyd1c2VyOmVtYWlsJ11cbiAgICAgICAgfTtcbiAgICAgIFxuICAgICAgY2FzZSAnZ2lzdCc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVxdWlyZWQ6IFsnZ2lzdCddLFxuICAgICAgICAgIG9wdGlvbmFsOiBbJ3VzZXI6ZW1haWwnXVxuICAgICAgICB9O1xuICAgICAgXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkOiBbJ3B1YmxpY19yZXBvJ10gIC8vIE9BdXRoIHRva2VucyB1c2UgJ3B1YmxpY19yZXBvJyBub3QgJ3JlcG8nXG4gICAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRva2VuIGhhcyBzdWZmaWNpZW50IHBlcm1pc3Npb25zIGZvciBvcGVyYXRpb25cbiAgICpcbiAgICogTk9URTogVGhlICdtYXJrZXRwbGFjZScgb3BlcmF0aW9uIHR5cGUgaXMga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAgICogVGhpcyBpcyBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIGFjY2Vzc2luZyBjb2xsZWN0aW9uIGZlYXR1cmVzLiAoUFIgIzI4MClcbiAgICovXG4gIGFzeW5jIGVuc3VyZVRva2VuUGVybWlzc2lvbnMoXG4gICAgb3BlcmF0aW9uOiAncmVhZCcgfCAnd3JpdGUnIHwgJ21hcmtldHBsYWNlJyB8ICdjb2xsZWN0aW9uJyB8ICdnaXN0J1xuICApOiBQcm9taXNlPFRva2VuVmFsaWRhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRHaXRIdWJUb2tlbigpO1xuICAgIFxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogJ05vIEdpdEh1YiB0b2tlbiBhdmFpbGFibGUnXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVpcmVkU2NvcGVzID0gdGhpcy5nZXRSZXF1aXJlZFNjb3BlcyhvcGVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVG9rZW5TY29wZXModG9rZW4sIHJlcXVpcmVkU2NvcGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmUgZW5jcnlwdGlvbiBrZXkgZnJvbSBhIHBhc3NwaHJhc2VcbiAgICovXG4gIHByaXZhdGUgZGVyaXZlS2V5KHBhc3NwaHJhc2U6IHN0cmluZywgc2FsdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICByZXR1cm4gY3J5cHRvLnBia2RmMlN5bmMocGFzc3BocmFzZSwgc2FsdCwgVG9rZW5NYW5hZ2VyLklURVJBVElPTlMsIFRva2VuTWFuYWdlci5LRVlfTEVOR1RILCAnc2hhMjU2Jyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1hY2hpbmUtc3BlY2lmaWMgcGFzc3BocmFzZSBmb3IgZW5jcnlwdGlvblxuICAgKiBVc2VzIGEgY29tYmluYXRpb24gb2YgbWFjaGluZSBJRCBhbmQgdXNlciBpbmZvIGZvciB1bmlxdWVuZXNzXG4gICAqL1xuICBwcml2YXRlIGdldE1hY2hpbmVQYXNzcGhyYXNlKCk6IHN0cmluZyB7XG4gICAgLy8gVXNlIGEgY29tYmluYXRpb24gb2YgaG9zdG5hbWUsIHVzZXJuYW1lLCBhbmQgYSBmaXhlZCBhcHAgaWRlbnRpZmllci5cbiAgICAvLyBjb2RlcWxbanMvaW5zdWZmaWNpZW50LXBhc3N3b3JkLWhhc2hpbmddIOKAlCBUaGVzZSBhcmUgTk9UIHBhc3N3b3JkIGhhc2hlcy5cbiAgICAvLyBTSEEtMjU2IGlzIHVzZWQgdG8gZGVyaXZlIGEgc3RhYmxlIG1hY2hpbmUgZmluZ2VycHJpbnQgZnJvbSBzeXN0ZW0gaWRlbnRpZmllcnNcbiAgICAvLyAoaG9tZSBkaXJlY3RvcnkgcGF0aCwgT1MgdXNlcm5hbWUpLiBUaGUgYWN0dWFsIHRva2VuIGVuY3J5cHRpb24gdXNlcyBwYmtkZjJTeW5jXG4gICAgLy8gd2l0aCBJVEVSQVRJT05TIHJvdW5kcyAoc2VlIGRlcml2ZUtleSBtZXRob2QgYWJvdmUpLlxuICAgIGNvbnN0IGhvc3RuYW1lID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShob21lZGlyKCkpLmRpZ2VzdCgnaGV4Jykuc3Vic3RyaW5nKDAsIDE2KTtcbiAgICBjb25zdCB1c2VybmFtZSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocHJvY2Vzcy5lbnYuVVNFUiB8fCAnZGVmYXVsdCcpLmRpZ2VzdCgnaGV4Jykuc3Vic3RyaW5nKDAsIDE2KTtcbiAgICBjb25zdCBhcHBJZCA9ICdEb2xsaG91c2VNQ1AtVG9rZW5TdG9yZS12MSc7XG5cbiAgICByZXR1cm4gYCR7YXBwSWR9LSR7aG9zdG5hbWV9LSR7dXNlcm5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBHaXRIdWIgdG9rZW4gc2VjdXJlbHkgdG8gZmlsZVxuICAgKi9cbiAgYXN5bmMgc3RvcmVHaXRIdWJUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIHRva2VuIGZvcm1hdCBmaXJzdFxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlVG9rZW5Gb3JtYXQodG9rZW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdJbnZhbGlkIHRva2VuIGZvcm1hdCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWxpemUgYW5kIHZhbGlkYXRlIHRva2VuXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodG9rZW4pO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoJ1Rva2VuIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycycpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkoVG9rZW5NYW5hZ2VyLlRPS0VOX0RJUik7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKFRva2VuTWFuYWdlci5UT0tFTl9ESVIsIDBvNzAwLCB7XG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5zdG9yZUdpdEh1YlRva2VuJ1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEdlbmVyYXRlIGVuY3J5cHRpb24gY29tcG9uZW50c1xuICAgICAgY29uc3Qgc2FsdCA9IGNyeXB0by5yYW5kb21CeXRlcyhUb2tlbk1hbmFnZXIuU0FMVF9MRU5HVEgpO1xuICAgICAgY29uc3QgaXYgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoVG9rZW5NYW5hZ2VyLklWX0xFTkdUSCk7XG4gICAgICBjb25zdCBwYXNzcGhyYXNlID0gdGhpcy5nZXRNYWNoaW5lUGFzc3BocmFzZSgpO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5kZXJpdmVLZXkocGFzc3BocmFzZSwgc2FsdCk7XG5cbiAgICAgIC8vIEVuY3J5cHQgdG9rZW5cbiAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdihUb2tlbk1hbmFnZXIuQUxHT1JJVEhNLCBrZXksIGl2KTtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBjaXBoZXIudXBkYXRlKHZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQsICd1dGY4JyksXG4gICAgICAgIGNpcGhlci5maW5hbCgpXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHRhZyA9IGNpcGhlci5nZXRBdXRoVGFnKCk7XG5cbiAgICAgIC8vIENyZWF0ZSBzdG9yYWdlIGZvcm1hdDogc2FsdCArIGl2ICsgdGFnICsgZW5jcnlwdGVkXG4gICAgICBjb25zdCBzdG9yZWQgPSBCdWZmZXIuY29uY2F0KFtzYWx0LCBpdiwgdGFnLCBlbmNyeXB0ZWRdKTtcblxuICAgICAgLy8gV3JpdGUgdG8gZmlsZSB3aXRoIHJlc3RyaWN0ZWQgcGVybWlzc2lvbnNcbiAgICAgIGNvbnN0IHRva2VuUGF0aCA9IHBhdGguam9pbihUb2tlbk1hbmFnZXIuVE9LRU5fRElSLCBUb2tlbk1hbmFnZXIuVE9LRU5fRklMRSk7XG4gICAgICAvLyBXcml0ZSB0aGUgYmluYXJ5IGNvbnRlbnQgdG8gdGhlIGZpbGUgKG5lZWQgdG8gY29udmVydCBCdWZmZXIgdG8gc3RyaW5nIGZvciBGaWxlT3BlcmF0aW9uc1NlcnZpY2UpXG4gICAgICAvLyBTaW5jZSB3ZSdyZSB3cml0aW5nIGJpbmFyeSBkYXRhLCB3ZSdsbCB3cml0ZSBhcyBiYXNlNjQgZm9yIHNhZmUgc3RvcmFnZVxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUodG9rZW5QYXRoLCBzdG9yZWQudG9TdHJpbmcoJ2Jhc2U2NCcpLCB7XG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5zdG9yZUdpdEh1YlRva2VuJ1xuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKHRva2VuUGF0aCwgMG82MDAsIHtcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnN0b3JlR2l0SHViVG9rZW4nXG4gICAgICB9KTtcblxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5zdG9yZUdpdEh1YlRva2VuJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiBzdG9yZWQgc2VjdXJlbHknLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHRva2VuVHlwZTogdGhpcy5nZXRUb2tlblR5cGUodG9rZW4pLFxuICAgICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiB0b2tlbiBzdG9yZWQgc2VjdXJlbHknKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdUb2tlbk1hbmFnZXIuc3RvcmVHaXRIdWJUb2tlbicsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gc3RvcmUgR2l0SHViIHRva2VuOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgRmFpbGVkIHRvIHN0b3JlIHRva2VuOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBHaXRIdWIgdG9rZW4gZnJvbSBzZWN1cmUgc3RvcmFnZVxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVHaXRIdWJUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW5QYXRoID0gcGF0aC5qb2luKFRva2VuTWFuYWdlci5UT0tFTl9ESVIsIFRva2VuTWFuYWdlci5UT0tFTl9GSUxFKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHNcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHRva2VuUGF0aCk7XG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAvLyBObyBzdG9yZWQgdG9rZW5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgZW5jcnlwdGVkIGRhdGEgKHN0b3JlZCBhcyBiYXNlNjQpXG4gICAgICBjb25zdCBiYXNlNjRDb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZSh0b2tlblBhdGgsIHtcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnJldHJpZXZlR2l0SHViVG9rZW4nXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IEJ1ZmZlci5mcm9tKGJhc2U2NENvbnRlbnQsICdiYXNlNjQnKTtcblxuICAgICAgLy8gRXh0cmFjdCBjb21wb25lbnRzXG4gICAgICBjb25zdCBzYWx0ID0gc3RvcmVkLnN1YmFycmF5KDAsIFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCk7XG4gICAgICBjb25zdCBpdiA9IHN0b3JlZC5zdWJhcnJheShUb2tlbk1hbmFnZXIuU0FMVF9MRU5HVEgsIFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCArIFRva2VuTWFuYWdlci5JVl9MRU5HVEgpO1xuICAgICAgY29uc3QgdGFnID0gc3RvcmVkLnN1YmFycmF5KFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCArIFRva2VuTWFuYWdlci5JVl9MRU5HVEgsIFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCArIFRva2VuTWFuYWdlci5JVl9MRU5HVEggKyBUb2tlbk1hbmFnZXIuVEFHX0xFTkdUSCk7XG4gICAgICBjb25zdCBlbmNyeXB0ZWQgPSBzdG9yZWQuc3ViYXJyYXkoVG9rZW5NYW5hZ2VyLlNBTFRfTEVOR1RIICsgVG9rZW5NYW5hZ2VyLklWX0xFTkdUSCArIFRva2VuTWFuYWdlci5UQUdfTEVOR1RIKTtcblxuICAgICAgLy8gRGVyaXZlIGRlY3J5cHRpb24ga2V5XG4gICAgICBjb25zdCBwYXNzcGhyYXNlID0gdGhpcy5nZXRNYWNoaW5lUGFzc3BocmFzZSgpO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5kZXJpdmVLZXkocGFzc3BocmFzZSwgc2FsdCk7XG5cbiAgICAgIC8vIERlY3J5cHQgdG9rZW5cbiAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoVG9rZW5NYW5hZ2VyLkFMR09SSVRITSwga2V5LCBpdik7XG4gICAgICBkZWNpcGhlci5zZXRBdXRoVGFnKHRhZyk7XG4gICAgICBcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBkZWNpcGhlci51cGRhdGUoZW5jcnlwdGVkKSxcbiAgICAgICAgZGVjaXBoZXIuZmluYWwoKVxuICAgICAgXSkudG9TdHJpbmcoJ3V0ZjgnKTtcblxuICAgICAgLy8gVmFsaWRhdGUgZGVjcnlwdGVkIHRva2VuXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVUb2tlbkZvcm1hdChkZWNyeXB0ZWQpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5yZXRyaWV2ZUdpdEh1YlRva2VuJyxcbiAgICAgICAgICBkZXRhaWxzOiAnRGVjcnlwdGVkIHRva2VuIGhhcyBpbnZhbGlkIGZvcm1hdCdcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5yZXRyaWV2ZUdpdEh1YlRva2VuJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiByZXRyaWV2ZWQgZnJvbSBzZWN1cmUgc3RvcmFnZScsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdG9rZW5UeXBlOiB0aGlzLmdldFRva2VuVHlwZShkZWNyeXB0ZWQpLFxuICAgICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KGRlY3J5cHRlZClcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBkZWNyeXB0ZWQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnJldHJpZXZlR2l0SHViVG9rZW4nLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIHJldHJpZXZlIEdpdEh1YiB0b2tlbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gcmV0cmlldmUgc3RvcmVkIHRva2VuJywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgc3RvcmVkIEdpdEh1YiB0b2tlblxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlU3RvcmVkVG9rZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VuUGF0aCA9IHBhdGguam9pbihUb2tlbk1hbmFnZXIuVE9LRU5fRElSLCBUb2tlbk1hbmFnZXIuVE9LRU5fRklMRSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzIGJlZm9yZSBhdHRlbXB0aW5nIGRlbGV0aW9uXG4gICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyh0b2tlblBhdGgpO1xuICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUodG9rZW5QYXRoLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICBzb3VyY2U6ICdUb2tlbk1hbmFnZXIucmVtb3ZlU3RvcmVkVG9rZW4nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5yZW1vdmVTdG9yZWRUb2tlbicsXG4gICAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiByZW1vdmVkIGZyb20gc2VjdXJlIHN0b3JhZ2UnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKCdTdG9yZWQgR2l0SHViIHRva2VuIHJlbW92ZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdFxuICAgICAgICBsb2dnZXIuZGVidWcoJ05vIHN0b3JlZCB0b2tlbiB0byByZW1vdmUnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnJlbW92ZVN0b3JlZFRva2VuJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byByZW1vdmUgc3RvcmVkIHRva2VuOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHJlbW92ZSBzdG9yZWQgdG9rZW4nLCB7IGVycm9yIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgR2l0SHViIHRva2VuIGZyb20gZW52aXJvbm1lbnQgb3Igc2VjdXJlIHN0b3JhZ2VcbiAgICogVXBkYXRlZCB0byBjaGVjayBzZWN1cmUgc3RvcmFnZSBpZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0XG4gICAqL1xuICBhc3luYyBnZXRHaXRIdWJUb2tlbkFzeW5jKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIC8vIEZpcnN0IGNoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAgY29uc3QgZW52VG9rZW4gPSB0aGlzLmdldEdpdEh1YlRva2VuKCk7XG4gICAgaWYgKGVudlRva2VuKSB7XG4gICAgICByZXR1cm4gZW52VG9rZW47XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIHNlY3VyZSBzdG9yYWdlXG4gICAgcmV0dXJuIHRoaXMucmV0cmlldmVHaXRIdWJUb2tlbigpO1xuICB9XG59Il19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackgroundValidator.d.ts","sourceRoot":"","sources":["../../../src/security/validation/BackgroundValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IAEjB,6EAA6E;IAC7E,eAAe,EAAE,MAAM,CAAC;IAExB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAElB,2EAA2E;IAC3E,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAYD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IAEZ,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IAEpB,oCAAoC;IACpC,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAEjD,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IAEjB,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qDAAqD;IACrD,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAM5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;IANhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,YAAY,CAAkB;gBAGnB,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,GAAG,EAAE,qDAAqD;IAC1F,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC;IAU7C;;;OAGG;IACH,KAAK,IAAI,IAAI;IAwBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;OAGG;IACG,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"BackgroundValidator.d.ts","sourceRoot":"","sources":["../../../src/security/validation/BackgroundValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IAEjB,6EAA6E;IAC7E,eAAe,EAAE,MAAM,CAAC;IAExB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAElB,2EAA2E;IAC3E,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAYD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IAEZ,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IAEpB,oCAAoC;IACpC,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAEjD,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IAEjB,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qDAAqD;IACrD,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAM5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;IANhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,YAAY,CAAkB;gBAGnB,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,GAAG,EAAE,qDAAqD;IAC1F,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC;IAU7C;;;OAGG;IACH,KAAK,IAAI,IAAI;IAwBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;OAGG;IACG,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC/C;;;;;OAKG;YACW,gCAAgC;IA8B9C;;OAEG;YACW,YAAY;IAe1B;;;;OAIG;YACW,cAAc;IA4C5B;;;;;OAKG;YACW,aAAa;IAwD3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,QAAQ;;;;;;IASR;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI/B"}
|