@dollhousemcp/mcp-server 2.0.0-rc.5 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -17
- package/README.github.md +2 -2
- package/README.md +2 -2
- package/README.md.backup +284 -224
- package/README.npm.md +2 -2
- package/dist/cache/LRUCache.d.ts +3 -0
- package/dist/cache/LRUCache.d.ts.map +1 -1
- package/dist/cache/LRUCache.js +36 -26
- package/dist/config/env.d.ts +14 -4
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +20 -6
- package/dist/di/Container.d.ts +21 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +250 -53
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +5 -10
- package/dist/elements/base/BaseElementManager.d.ts +22 -0
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +47 -7
- package/dist/elements/memories/Memory.d.ts +1 -0
- package/dist/elements/memories/Memory.d.ts.map +1 -1
- package/dist/elements/memories/Memory.js +12 -8
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
- package/dist/elements/memories/MemoryManager.js +23 -42
- package/dist/elements/memories/MemorySearchIndex.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/handlers/EnhancedIndexHandler.js +6 -6
- package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
- package/dist/handlers/element-crud/editElement.js +39 -18
- package/dist/handlers/element-crud/helpers.d.ts.map +1 -1
- package/dist/handlers/element-crud/helpers.js +30 -3
- package/dist/handlers/element-crud/listElements.d.ts +2 -0
- package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
- package/dist/handlers/element-crud/listElements.js +3 -1
- package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
- package/dist/handlers/mcp-aql/GatekeeperTypes.d.ts +4 -0
- package/dist/handlers/mcp-aql/GatekeeperTypes.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/GatekeeperTypes.js +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +33 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +232 -23
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
- package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
- package/dist/handlers/mcp-aql/UnifiedEndpoint.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/UnifiedEndpoint.js +4 -3
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
- package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts +17 -0
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.js +91 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts +5 -3
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.js +56 -2
- package/dist/handlers/mcp-aql/types.d.ts +22 -0
- package/dist/handlers/mcp-aql/types.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/types.js +47 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/logging/LogHooks.js +11 -11
- package/dist/logging/LogManager.d.ts +0 -2
- package/dist/logging/LogManager.d.ts.map +1 -1
- package/dist/logging/LogManager.js +1 -3
- package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
- package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
- package/dist/logging/sinks/MemoryLogSink.js +12 -3
- package/dist/logging/types.d.ts +0 -2
- package/dist/logging/types.d.ts.map +1 -1
- package/dist/logging/types.js +1 -1
- package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
- package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
- package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
- package/dist/metrics/MetricsManager.d.ts +47 -0
- package/dist/metrics/MetricsManager.d.ts.map +1 -0
- package/dist/metrics/MetricsManager.js +232 -0
- package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
- package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
- package/dist/metrics/OperationMetricsTracker.js +53 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
- package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
- package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
- package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
- package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
- package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
- package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
- package/dist/metrics/collectors/index.d.ts +11 -0
- package/dist/metrics/collectors/index.d.ts.map +1 -0
- package/dist/metrics/collectors/index.js +11 -0
- package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
- package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
- package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
- package/dist/metrics/types.d.ts +98 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +24 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +1 -7
- package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
- package/dist/portfolio/EnhancedIndexManager.js +18 -18
- package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
- package/dist/portfolio/NLPScoringManager.js +5 -9
- package/dist/portfolio/PortfolioIndexManager.js +2 -2
- package/dist/portfolio/RelationshipManager.js +2 -2
- package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
- package/dist/portfolio/VerbTriggerManager.js +5 -19
- package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
- package/dist/portfolio/config/IndexConfig.js +1 -12
- package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
- package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
- package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
- package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
- package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
- package/dist/portfolio/types/RelationshipTypes.js +3 -17
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +36 -8
- package/dist/security/constants.d.ts.map +1 -1
- package/dist/security/constants.js +10 -6
- package/dist/security/fileLockManager.d.ts.map +1 -1
- package/dist/security/fileLockManager.js +8 -6
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +1 -13
- package/dist/security/securityMonitor.d.ts +2 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +14 -3
- package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
- package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
- package/dist/security/telemetry/SecurityTelemetry.js +30 -2
- package/dist/security/tokenManager.d.ts +3 -0
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +13 -5
- package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
- package/dist/security/validation/BackgroundValidator.js +7 -7
- package/dist/server/startup.d.ts.map +1 -1
- package/dist/server/startup.js +8 -24
- package/dist/server/tools/MCPAQLTools.js +8 -1
- package/dist/services/ActivationStore.d.ts.map +1 -1
- package/dist/services/ActivationStore.js +9 -3
- package/dist/services/FileWatchService.d.ts +1 -0
- package/dist/services/FileWatchService.d.ts.map +1 -1
- package/dist/services/FileWatchService.js +83 -48
- package/dist/services/MetadataService.d.ts.map +1 -1
- package/dist/services/MetadataService.js +7 -2
- package/dist/services/PolicyExportService.d.ts.map +1 -1
- package/dist/services/PolicyExportService.js +8 -1
- package/dist/services/query/ElementQueryService.d.ts.map +1 -1
- package/dist/services/query/ElementQueryService.js +1 -41
- package/dist/services/query/PaginationService.d.ts.map +1 -1
- package/dist/services/query/PaginationService.js +1 -14
- package/dist/services/query/SortService.d.ts.map +1 -1
- package/dist/services/query/SortService.js +1 -6
- package/dist/services/validation/ValidationService.d.ts.map +1 -1
- package/dist/services/validation/ValidationService.js +3 -8
- package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
- package/dist/storage/ElementStorageLayer.js +5 -2
- package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
- package/dist/storage/MemoryStorageLayer.js +5 -2
- package/dist/telemetry/OperationalTelemetry.js +2 -2
- package/dist/utils/EventDeduplicator.d.ts +44 -0
- package/dist/utils/EventDeduplicator.d.ts.map +1 -0
- package/dist/utils/EventDeduplicator.js +93 -0
- package/dist/utils/FileLock.d.ts.map +1 -1
- package/dist/utils/FileLock.js +1 -9
- package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
- package/dist/utils/PerformanceMonitor.js +5 -5
- package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
- package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
- package/dist/utils/SlidingWindowRateLimiter.js +23 -0
- package/dist/web/console/IngestRoutes.d.ts +84 -0
- package/dist/web/console/IngestRoutes.d.ts.map +1 -0
- package/dist/web/console/IngestRoutes.js +252 -0
- package/dist/web/console/LeaderElection.d.ts +89 -0
- package/dist/web/console/LeaderElection.d.ts.map +1 -0
- package/dist/web/console/LeaderElection.js +205 -0
- package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
- package/dist/web/console/LeaderForwardingSink.js +197 -0
- package/dist/web/console/SessionNames.d.ts +46 -0
- package/dist/web/console/SessionNames.d.ts.map +1 -0
- package/dist/web/console/SessionNames.js +257 -0
- package/dist/web/console/UnifiedConsole.d.ts +64 -0
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
- package/dist/web/console/UnifiedConsole.js +119 -0
- package/dist/web/contentPipeline.d.ts +58 -0
- package/dist/web/contentPipeline.d.ts.map +1 -0
- package/dist/web/contentPipeline.js +112 -0
- package/dist/web/portDiscovery.d.ts +58 -0
- package/dist/web/portDiscovery.d.ts.map +1 -0
- package/dist/web/portDiscovery.js +143 -0
- package/dist/web/public/app.js +148 -60
- package/dist/web/public/logs.js +638 -0
- package/dist/web/public/metrics.js +682 -0
- package/dist/web/public/permissions.js +394 -0
- package/dist/web/public/sessions.js +369 -0
- package/dist/web/routes/healthRoutes.d.ts +16 -0
- package/dist/web/routes/healthRoutes.d.ts.map +1 -0
- package/dist/web/routes/healthRoutes.js +29 -0
- package/dist/web/routes/logRoutes.d.ts +18 -0
- package/dist/web/routes/logRoutes.d.ts.map +1 -0
- package/dist/web/routes/logRoutes.js +126 -0
- package/dist/web/routes/metricsRoutes.d.ts +17 -0
- package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
- package/dist/web/routes/metricsRoutes.js +90 -0
- package/dist/web/routes/permissionRoutes.d.ts +16 -0
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
- package/dist/web/routes/permissionRoutes.js +133 -0
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +309 -339
- package/dist/web/server.d.ts +21 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +42 -4
- package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
- package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
- package/dist/web/sinks/WebSSELogSink.js +22 -0
- package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
- package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
- package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
- package/package.json +2 -2
- package/server.json +2 -2
- package/dist/constants/version.d.ts +0 -3
- package/dist/constants/version.d.ts.map +0 -1
- package/dist/constants/version.js +0 -4
- package/dist/logging/sinks/SSELogSink.d.ts +0 -35
- package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
- package/dist/logging/sinks/SSELogSink.js +0 -181
- package/dist/logging/viewer/viewerHtml.d.ts +0 -8
- package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
- package/dist/logging/viewer/viewerHtml.js +0 -204
- package/dist/web/public/public/app.js +0 -1878
|
@@ -238,9 +238,12 @@ export function parseElementPolicy(metadata) {
|
|
|
238
238
|
throw new Error('Invalid gatekeeper policy: externalRestrictions.description is required and must be a non-empty string');
|
|
239
239
|
}
|
|
240
240
|
const denyPatterns = validateStringArray(er.denyPatterns, 'externalRestrictions.denyPatterns');
|
|
241
|
+
const confirmPatterns = validateStringArray(er.confirmPatterns, 'externalRestrictions.confirmPatterns');
|
|
241
242
|
const allowPatterns = validateStringArray(er.allowPatterns, 'externalRestrictions.allowPatterns');
|
|
242
243
|
if (denyPatterns)
|
|
243
244
|
validatePatternStrings(denyPatterns, 'externalRestrictions.denyPatterns');
|
|
245
|
+
if (confirmPatterns)
|
|
246
|
+
validatePatternStrings(confirmPatterns, 'externalRestrictions.confirmPatterns');
|
|
244
247
|
if (allowPatterns)
|
|
245
248
|
validatePatternStrings(allowPatterns, 'externalRestrictions.allowPatterns');
|
|
246
249
|
// Validate approvalPolicy (Issue #625 Phase 3)
|
|
@@ -288,6 +291,7 @@ export function parseElementPolicy(metadata) {
|
|
|
288
291
|
externalRestrictions = {
|
|
289
292
|
description: er.description,
|
|
290
293
|
denyPatterns,
|
|
294
|
+
confirmPatterns,
|
|
291
295
|
allowPatterns,
|
|
292
296
|
approvalPolicy,
|
|
293
297
|
};
|
|
@@ -336,6 +340,92 @@ function validatePatternStrings(patterns, fieldName) {
|
|
|
336
340
|
}
|
|
337
341
|
}
|
|
338
342
|
}
|
|
343
|
+
/**
|
|
344
|
+
* Known CLI tool names used in externalRestrictions patterns.
|
|
345
|
+
* Patterns should start with one of these followed by ':' to be effective.
|
|
346
|
+
*/
|
|
347
|
+
const KNOWN_TOOL_PREFIXES = new Set([
|
|
348
|
+
'Bash', 'Edit', 'Write', 'Read', 'Glob', 'Grep',
|
|
349
|
+
'WebFetch', 'WebSearch', 'NotebookEdit',
|
|
350
|
+
]);
|
|
351
|
+
/**
|
|
352
|
+
* Regex characters that have no meaning in glob syntax.
|
|
353
|
+
* Users who include these likely intend regex but the matcher only supports * and ?.
|
|
354
|
+
*/
|
|
355
|
+
const REGEX_SYNTAX_PATTERN = /[|(){}[\]\\+^$]/;
|
|
356
|
+
/**
|
|
357
|
+
* Analyze externalRestrictions patterns for common mistakes and suspicious syntax.
|
|
358
|
+
*
|
|
359
|
+
* Returns non-fatal warnings to help LLMs and users write effective patterns.
|
|
360
|
+
* Does NOT throw — validation errors are handled by {@link validatePatternStrings}.
|
|
361
|
+
*
|
|
362
|
+
* Checks performed (Issue #1664):
|
|
363
|
+
* - Missing tool prefix (pattern doesn't start with ToolName:)
|
|
364
|
+
* - Overly broad patterns (bare `*` or `ToolName:*`)
|
|
365
|
+
* - Regex syntax that won't work in glob matching
|
|
366
|
+
* - Leading/trailing whitespace
|
|
367
|
+
*
|
|
368
|
+
* @param patterns - Array of pattern strings to analyze
|
|
369
|
+
* @param fieldName - Field name for warning messages
|
|
370
|
+
* @returns Array of warning messages (empty if no issues found)
|
|
371
|
+
*/
|
|
372
|
+
export function analyzePatternSyntax(patterns, fieldName) {
|
|
373
|
+
const warnings = [];
|
|
374
|
+
for (const pattern of patterns) {
|
|
375
|
+
analyzeOnePattern(pattern, fieldName, warnings);
|
|
376
|
+
}
|
|
377
|
+
return warnings;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Analyze a single pattern string and append any warnings found.
|
|
381
|
+
* Extracted from {@link analyzePatternSyntax} to reduce cognitive complexity.
|
|
382
|
+
*/
|
|
383
|
+
function analyzeOnePattern(pattern, fieldName, warnings) {
|
|
384
|
+
// Check leading/trailing whitespace
|
|
385
|
+
if (pattern !== pattern.trim()) {
|
|
386
|
+
warnings.push(`${fieldName} pattern '${pattern}' has leading/trailing whitespace — this may prevent expected matches`);
|
|
387
|
+
}
|
|
388
|
+
// Check for bare wildcard (matches everything)
|
|
389
|
+
if (pattern === '*') {
|
|
390
|
+
warnings.push(`${fieldName} pattern '*' matches everything — this is likely unintentional`);
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
// Check for tool prefix and related issues
|
|
394
|
+
const colonIndex = pattern.indexOf(':');
|
|
395
|
+
if (colonIndex === -1) {
|
|
396
|
+
warnings.push(`${fieldName} pattern '${pattern}' has no tool prefix (e.g., 'Bash:', 'Edit:'). ` +
|
|
397
|
+
`Patterns are matched against 'ToolName:input' strings and will not match without a prefix.`);
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
checkToolPrefix(pattern, colonIndex, fieldName, warnings);
|
|
401
|
+
}
|
|
402
|
+
// Check for regex syntax that won't work in glob
|
|
403
|
+
const regexChars = new Set();
|
|
404
|
+
for (const ch of pattern) {
|
|
405
|
+
if (REGEX_SYNTAX_PATTERN.test(ch))
|
|
406
|
+
regexChars.add(ch);
|
|
407
|
+
}
|
|
408
|
+
if (regexChars.size > 0) {
|
|
409
|
+
warnings.push(`${fieldName} pattern '${pattern}' contains regex syntax '${[...regexChars].join(', ')}' — ` +
|
|
410
|
+
`only glob wildcards (* and ?) are supported`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Check tool prefix validity and broadness for a pattern that contains ':'.
|
|
415
|
+
*/
|
|
416
|
+
function checkToolPrefix(pattern, colonIndex, fieldName, warnings) {
|
|
417
|
+
const prefix = pattern.slice(0, colonIndex);
|
|
418
|
+
const afterColon = pattern.slice(colonIndex + 1);
|
|
419
|
+
// Check for unknown tool prefix
|
|
420
|
+
if (!KNOWN_TOOL_PREFIXES.has(prefix) && !prefix.startsWith('mcp_')) {
|
|
421
|
+
warnings.push(`${fieldName} pattern '${pattern}' uses unknown tool prefix '${prefix}'. ` +
|
|
422
|
+
`Known prefixes: ${[...KNOWN_TOOL_PREFIXES].join(', ')}. MCP tools use 'mcp_' prefix.`);
|
|
423
|
+
}
|
|
424
|
+
// Check for overly broad ToolName:* pattern
|
|
425
|
+
if (afterColon === '*') {
|
|
426
|
+
warnings.push(`${fieldName} pattern '${pattern}' matches ALL ${prefix} operations — verify this is intentional`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
339
429
|
/**
|
|
340
430
|
* Validate and sanitize a gatekeeper policy during element deserialization.
|
|
341
431
|
*
|
|
@@ -483,4 +573,4 @@ export function sanitizeGatekeeperPolicy(rawPolicy, elementName, elementType) {
|
|
|
483
573
|
return undefined;
|
|
484
574
|
}
|
|
485
575
|
}
|
|
486
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudFBvbGljaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFDTCxlQUFlLEVBSWYsbUJBQW1CLEdBQ3BCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0csT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQTRDM0U7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFNBQWlCLEVBQ2pCLGNBQStCLEVBQy9CLGlCQUEwQjtJQUUxQixvREFBb0Q7SUFDcEQsSUFBSSxjQUFjLEdBQUcseUJBQXlCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUQsSUFBSSxhQUFpQyxDQUFDO0lBQ3RDLElBQUksYUFBbUQsQ0FBQztJQUN4RCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDekIsOEZBQThGO0lBQzlGLGdGQUFnRjtJQUNoRixJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMvQixzRkFBc0Y7SUFDdEYsTUFBTSxtQkFBbUIsR0FBMEQsRUFBRSxDQUFDO0lBRXRGLDhDQUE4QztJQUM5QyxLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLFNBQVM7UUFDWCxDQUFDO1FBRUQsOENBQThDO1FBQzlDLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPO2dCQUNMLGVBQWUsRUFBRSxlQUFlLENBQUMsSUFBSTtnQkFDckMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2dCQUMzQixhQUFhLEVBQUUsTUFBTTtnQkFDckIsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDdEYsQ0FBQztRQUNKLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsSUFBSSxpQkFBaUIsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNsRCxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztZQUVoRSwyREFBMkQ7WUFDM0QsSUFBSSxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztnQkFDOUQsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDcEIsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQzdCLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQztnQkFDcEMsU0FBUyxDQUFDLG9EQUFvRDtZQUNoRSxDQUFDO1lBRUQsK0RBQStEO1lBQy9ELElBQUksWUFBWSxFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLGFBQWEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUM3QixhQUFhLEdBQUcsbUJBQW1CLENBQUM7Z0JBQ3BDLFNBQVM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsa0RBQWtEO1lBQ2xELElBQUksY0FBYyxLQUFLLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDNUMsY0FBYyxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUM7Z0JBQ2pELGtCQUFrQixHQUFHLElBQUksQ0FBQztnQkFDMUIsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQzdCLGFBQWEsR0FBRyxTQUFTLENBQUM7WUFDNUIsQ0FBQztRQUNILENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsOEZBQThGO1FBQzlGLHFGQUFxRjtRQUNyRixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDdEMsaURBQWlEO1lBQ2pELElBQUksc0JBQXNCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQ3hCLDRFQUE0RTtvQkFDNUUsY0FBYyxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUM7b0JBQzlDLGFBQWEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUM3QixhQUFhLEdBQUcsT0FBTyxDQUFDO2dCQUMxQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sa0VBQWtFO29CQUNsRSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7Z0JBQzlGLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCx5REFBeUQ7SUFDekQsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixPQUFPO1lBQ0wsZUFBZSxFQUFFLGVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWE7WUFDYixhQUFhLEVBQUUsbUJBQW1CO1lBQ2xDLFlBQVksRUFBRSxJQUFJO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLGVBQWUsRUFBRSxjQUFjO1FBQy9CLGFBQWE7UUFDYixhQUFhO1FBQ2IsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDdEYsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxTQUFpQixFQUNqQixNQUEyQixFQUMzQixpQkFBMEI7SUFFMUIsTUFBTSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRXJGLGNBQWM7SUFDZCxJQUFJLGVBQWUsS0FBSyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLGVBQWU7Z0JBQ2YsU0FBUyxFQUFFLG1CQUFtQixDQUFDLGlCQUFpQjtnQkFDaEQsTUFBTSxFQUFFLGNBQWMsU0FBUyxxQ0FBcUMsaUJBQWlCLGtEQUFrRCxhQUFhLEdBQUc7Z0JBQ3ZKLFVBQVUsRUFBRSwyQkFBMkIsYUFBYSxtQ0FBbUM7Z0JBQ3ZGLFlBQVksRUFBRSxnQkFBZ0I7YUFDL0IsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLEtBQUs7WUFDZCxlQUFlO1lBQ2YsU0FBUyxFQUFFLG1CQUFtQixDQUFDLHdCQUF3QjtZQUN2RCxNQUFNLEVBQUUsY0FBYyxTQUFTLG1DQUFtQyxhQUFhLGlCQUFpQjtZQUNoRyxVQUFVLEVBQUUsMkJBQTJCLGFBQWEsa0NBQWtDO1lBQ3RGLFlBQVksRUFBRSxnQkFBZ0I7U0FDL0IsQ0FBQztJQUNKLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsSUFDRSxlQUFlLEtBQUssZUFBZSxDQUFDLGVBQWU7UUFDbkQsZUFBZSxLQUFLLGVBQWUsQ0FBQyxrQkFBa0IsRUFDdEQsQ0FBQztRQUNELHVFQUF1RTtRQUN2RSxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxNQUFNLFVBQVUsR0FBRyxlQUFlLEtBQUssZUFBZSxDQUFDLGtCQUFrQjtZQUN2RSxDQUFDLENBQUMsaUNBQWlDO1lBQ25DLENBQUMsQ0FBQyx3Q0FBd0MsQ0FBQztRQUU3QyxJQUFJLFNBQWlCLENBQUM7UUFDdEIsSUFBSSxhQUFhLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4RCxvRUFBb0U7WUFDcEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxTQUFTLEdBQUcsbUJBQW1CLGFBQWEscURBQXFELFlBQVksRUFBRSxDQUFDO1FBQ2xILENBQUM7YUFBTSxJQUFJLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUM3QixnREFBZ0Q7WUFDaEQsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixnREFBZ0Q7WUFDaEQsU0FBUyxHQUFHLDRFQUE0RSxDQUFDO1FBQzNGLENBQUM7UUFFRCwrRUFBK0U7UUFDL0UsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLElBQUksbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDeEUsQ0FBQyxDQUFDLFdBQVcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUsscUNBQXFDO1lBQ3ZMLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFUCxPQUFPO1lBQ0wsT0FBTyxFQUFFLEtBQUs7WUFDZCxlQUFlO1lBQ2YsU0FBUyxFQUFFLG1CQUFtQixDQUFDLHFCQUFxQjtZQUNwRCxNQUFNLEVBQUUsY0FBYyxTQUFTLEtBQUssVUFBVSxLQUFLLFNBQVMsR0FBRyxZQUFZLEVBQUU7WUFDN0UsVUFBVSxFQUFFLHVEQUF1RDtZQUNuRSxtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxtQkFBbUI7U0FDckUsQ0FBQztJQUNKLENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsT0FBTztRQUNMLE9BQU8sRUFBRSxJQUFJO1FBQ2IsZUFBZTtRQUNmLE1BQU0sRUFBRSxhQUFhO1lBQ25CLENBQUMsQ0FBQyxjQUFjLFNBQVMsK0JBQStCLGFBQWEsR0FBRztZQUN4RSxDQUFDLENBQUMsY0FBYyxTQUFTLG1DQUFtQztRQUM5RCxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0tBQ3JFLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxRQUFpQjtJQUVqQixJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxRQUFtQyxDQUFDO0lBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7SUFFbkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFxQyxDQUFDO0lBRXJELGtDQUFrQztJQUNsQyxNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0QsTUFBTSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUV0RCw4QkFBOEI7SUFDOUIsSUFBSSxpQkFBK0QsQ0FBQztJQUNwRSxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdCLElBQUksT0FBTyxNQUFNLENBQUMsaUJBQWlCLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN0RixNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxpQkFBNEMsQ0FBQztRQUMvRCxpQkFBaUIsR0FBRztZQUNsQixZQUFZLEVBQUUsbUJBQW1CLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxnQ0FBZ0MsQ0FBQztZQUNwRixZQUFZLEVBQUUsbUJBQW1CLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxnQ0FBZ0MsQ0FBQztTQUNyRixDQUFDO0lBQ0osQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxJQUFJLG9CQUFxRSxDQUFDO0lBQzFFLElBQUksTUFBTSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDaEMsSUFBSSxPQUFPLE1BQU0sQ0FBQyxvQkFBb0IsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLG9CQUFvQixLQUFLLElBQUksRUFBRSxDQUFDO1lBQzVGLE1BQU0sSUFBSSxLQUFLLENBQUMsbUVBQW1FLENBQUMsQ0FBQztRQUN2RixDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLG9CQUErQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxJQUFJLE9BQU8sRUFBRSxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMxRCxNQUFNLElBQUksS0FBSyxDQUFDLHdHQUF3RyxDQUFDLENBQUM7UUFDNUgsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUMvRixNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLG9DQUFvQyxDQUFDLENBQUM7UUFDbEcsSUFBSSxZQUFZO1lBQUUsc0JBQXNCLENBQUMsWUFBWSxFQUFFLG1DQUFtQyxDQUFDLENBQUM7UUFDNUYsSUFBSSxhQUFhO1lBQUUsc0JBQXNCLENBQUMsYUFBYSxFQUFFLG9DQUFvQyxDQUFDLENBQUM7UUFDL0YsK0NBQStDO1FBQy9DLElBQUksY0FBYyxHQUFrQyxTQUFTLENBQUM7UUFDOUQsSUFBSSxFQUFFLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLElBQUksT0FBTyxFQUFFLENBQUMsY0FBYyxLQUFLLFFBQVEsSUFBSSxFQUFFLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN4RSxNQUFNLElBQUksS0FBSyxDQUFDLGtGQUFrRixDQUFDLENBQUM7WUFDdEcsQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxjQUF5QyxDQUFDO1lBRXhELDJCQUEyQjtZQUMzQixJQUFJLGVBQXlELENBQUM7WUFDOUQsSUFBSSxFQUFFLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpR0FBaUcsQ0FBQyxDQUFDO2dCQUNySCxDQUFDO2dCQUNELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELEtBQUssTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN2QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQywwR0FBMEcsS0FBSyx1Q0FBdUMsQ0FBQyxDQUFDO29CQUMxSyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsZUFBZSxHQUFHLEVBQUUsQ0FBQyxlQUErQyxDQUFDO1lBQ3ZFLENBQUM7WUFFRCx3QkFBd0I7WUFDeEIsSUFBSSxZQUFtRCxDQUFDO1lBQ3hELElBQUksRUFBRSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxFQUFFLENBQUMsWUFBWSxLQUFLLFFBQVEsSUFBSSxFQUFFLENBQUMsWUFBWSxLQUFLLGNBQWMsRUFBRSxDQUFDO29CQUN2RSxNQUFNLElBQUksS0FBSyxDQUFDLHdIQUF3SCxFQUFFLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFDOUosQ0FBQztnQkFDRCxZQUFZLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUNqQyxDQUFDO1lBRUQsc0JBQXNCO1lBQ3RCLElBQUksVUFBOEIsQ0FBQztZQUNuQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksT0FBTyxFQUFFLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7b0JBQ3pFLE1BQU0sSUFBSSxLQUFLLENBQUMsNEZBQTRGLENBQUMsQ0FBQztnQkFDaEgsQ0FBQztnQkFDRCxJQUFJLEVBQUUsQ0FBQyxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxFQUFFLENBQUM7b0JBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsOEdBQThHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUNqSixDQUFDO2dCQUNELFVBQVUsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQzdCLENBQUM7WUFFRCxjQUFjLEdBQUcsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQ2pFLENBQUM7UUFFRCxvQkFBb0IsR0FBRztZQUNyQixXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQXFCO1lBQ3JDLFlBQVk7WUFDWixhQUFhO1lBQ2IsY0FBYztTQUNmLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLEtBQUs7UUFDTCxPQUFPO1FBQ1AsSUFBSTtRQUNKLGlCQUFpQjtRQUNqQixvQkFBb0I7S0FDckIsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLG1CQUFtQixDQUMxQixLQUFjLEVBQ2QsU0FBaUI7SUFFakIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsU0FBUyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDckUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsU0FBUyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHNCQUFzQixDQUM3QixRQUFrQixFQUNsQixTQUFpQjtJQUVqQixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLFNBQVMsbUNBQW1DLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLHVCQUF1QixFQUFFLENBQUM7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsU0FBUyxzQ0FBc0MsdUJBQXVCLGFBQWEsQ0FBQyxDQUFDO1FBQ3JJLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25DLGtCQUFrQjtJQUNsQix3QkFBd0I7SUFDeEIsbUJBQW1CO0NBQ3BCLENBQUMsQ0FBQztBQUVILHNGQUFzRjtBQUN0RixNQUFNLDJCQUEyQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQzFDLEdBQUcsb0JBQW9CO0lBQ3ZCLG1CQUFtQjtDQUNwQixDQUFDLENBQUM7QUFFSDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLFNBQWlCO0lBQzFELE9BQU8sMkJBQTJCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLGNBQXdGO0lBRXhGLEtBQUssTUFBTSxPQUFPLElBQUksY0FBYyxFQUFFLENBQUM7UUFDckMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFpRCxDQUFDO1FBQ3ZGLE1BQU0sUUFBUSxHQUFHLFVBQVUsRUFBRSxJQUFJLENBQUM7UUFDbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FDekMsY0FBd0Y7SUFFeEYsTUFBTSxVQUFVLEdBQTBDLEVBQUUsQ0FBQztJQUM3RCxLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBaUQsQ0FBQztRQUN2RixNQUFNLFdBQVcsR0FBRyxVQUFVLEVBQUUsT0FBTyxDQUFDO1FBQ3hDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztZQUM1RSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGNBQWMsQ0FDckIsVUFBZ0MsRUFDaEMsUUFBZ0IsRUFDaEIsV0FBbUIsRUFDbkIsV0FBbUI7SUFFbkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFFM0MsK0RBQStEO0lBQy9ELDBGQUEwRjtJQUMxRix1RkFBdUY7SUFDdkYsNkZBQTZGO0lBQzdGLHVGQUF1RjtJQUN2RixNQUFNLFVBQVUsR0FBRyxRQUFRLEtBQUssT0FBTztRQUNyQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLG9CQUFvQixFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO0lBRXpCLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDdEMsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxDQUFDLElBQUksQ0FDVCwwQkFBMEIsRUFBRSxVQUFVLFFBQVEsWUFBWSxXQUFXLEtBQUssV0FBVyxNQUFNO2dCQUMzRix1RkFBdUYsQ0FDeEYsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxTQUFrQixFQUNsQixXQUFtQixFQUNuQixXQUFtQjtJQUVuQixJQUFJLENBQUMsU0FBUyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2hELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxtRUFBbUU7UUFDbkUsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsK0VBQStFO1lBQy9FLDBDQUEwQztZQUMxQyxTQUFTLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDckYsU0FBUyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzNGLFNBQVMsQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUVsRixNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxXQUFXLEtBQUssV0FBVyxHQUFHLEVBQUU7Z0JBQzNFLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO2dCQUNuQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztnQkFDdkMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUM7Z0JBQ2pDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCO2FBQ3BELENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sT0FBTyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RSxlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDL0IsSUFBSSxFQUFFLHNCQUFzQjtZQUM1QixRQUFRLEVBQUUsUUFBUTtZQUNsQixNQUFNLEVBQUUsR0FBRyxXQUFXLGNBQWM7WUFDcEMsT0FBTyxFQUFFLG1DQUFtQyxXQUFXLDJCQUEyQixPQUFPLEVBQUU7U0FDNUYsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsV0FBVyxLQUFLLFdBQVcsTUFBTSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3JHLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbGVtZW50IFBvbGljaWVzXG4gKlxuICogSGFuZGxlcyBlbGVtZW50LWJhc2VkIGFjY2VzcyBjb250cm9sIGZvciB0aGUgR2F0ZWtlZXBlci5cbiAqIEFsbG93cyBBTlkgRG9sbGhvdXNlTUNQIGVsZW1lbnQgdG8gZGVmaW5lIHBvbGljaWVzIGluIGl0cyBtZXRhZGF0YVxuICogdGhhdCBvdmVycmlkZSBvciByZXN0cmljdCB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcG9saWNpZXMuXG4gKlxuICogUG9saWN5IFJlc29sdXRpb24gT3JkZXI6XG4gKiAxLiBBY3RpdmUgZWxlbWVudCBkZW55IGxpc3QgKGhpZ2hlc3QgcHJpb3JpdHkgLSBibG9ja3Mgb3BlcmF0aW9uKVxuICogMi4gQWN0aXZlIGVsZW1lbnQgY29uZmlybSBsaXN0IChyZXF1aXJlcyBjb25maXJtYXRpb24pXG4gKiAzLiBBY3RpdmUgZWxlbWVudCBhbGxvdyBsaXN0IChhdXRvLWFwcHJvdmVzKVxuICogNC4gT3BlcmF0aW9uIGRlZmF1bHQgcGVybWlzc2lvbiAoZmFsbGJhY2spXG4gKi9cblxuaW1wb3J0IHtcbiAgUGVybWlzc2lvbkxldmVsLFxuICB0eXBlIEVsZW1lbnRHYXRla2VlcGVyUG9saWN5LFxuICB0eXBlIENsaUFwcHJvdmFsUG9saWN5LFxuICB0eXBlIEdhdGVrZWVwZXJEZWNpc2lvbixcbiAgR2F0ZWtlZXBlckVycm9yQ29kZSxcbn0gZnJvbSAnLi4vR2F0ZWtlZXBlclR5cGVzLmpzJztcbmltcG9ydCB7IGdldERlZmF1bHRQZXJtaXNzaW9uTGV2ZWwsIGNhbk9wZXJhdGlvbkJlRWxldmF0ZWQsIGdldE9wZXJhdGlvblBvbGljeSB9IGZyb20gJy4vT3BlcmF0aW9uUG9saWNpZXMuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBNQVhfR0xPQl9QQVRURVJOX0xFTkdUSCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3BhdHRlcm5NYXRjaGVyLmpzJztcblxuLyoqXG4gKiBNZXRhZGF0YSBzdHJ1Y3R1cmUgZm9yIGVsZW1lbnRzIHdpdGggR2F0ZWtlZXBlciBwb2xpY2llcy5cbiAqIFRoZSAnZ2F0ZWtlZXBlcicgZmllbGQgaXMgb3B0aW9uYWwgYW5kIGNvbnRhaW5zIHBvbGljeSBkZWZpbml0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50TWV0YWRhdGFXaXRoUG9saWN5IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZ2F0ZWtlZXBlcj86IEVsZW1lbnRHYXRla2VlcGVyUG9saWN5O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIEFjdGl2ZSBlbGVtZW50IGZvciBwb2xpY3kgZXZhbHVhdGlvbi5cbiAqIFJlcHJlc2VudHMgYW4gZWxlbWVudCBjdXJyZW50bHkgYWN0aXZlIGluIHRoZSBzZXNzaW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2ZUVsZW1lbnQge1xuICB0eXBlOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbWV0YWRhdGE6IEVsZW1lbnRNZXRhZGF0YVdpdGhQb2xpY3k7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGVsZW1lbnQgcG9saWN5IHJlc29sdXRpb24uXG4gKiBDb250YWlucyB0aGUgZWZmZWN0aXZlIHBlcm1pc3Npb24gbGV2ZWwgYW5kIHBvbGljeSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFBvbGljeVJlc3VsdCB7XG4gIC8qKiBFZmZlY3RpdmUgcGVybWlzc2lvbiBsZXZlbCBhZnRlciBlbGVtZW50IHBvbGljeSBhcHBsaWNhdGlvbiAqL1xuICBwZXJtaXNzaW9uTGV2ZWw6IFBlcm1pc3Npb25MZXZlbDtcbiAgLyoqIFdoaWNoIGVsZW1lbnQncyBwb2xpY3kgZGV0ZXJtaW5lZCB0aGlzIHJlc3VsdCAqL1xuICBzb3VyY2VFbGVtZW50Pzogc3RyaW5nO1xuICAvKiogVGhlIHNwZWNpZmljIHBvbGljeSBmaWVsZCB0aGF0IG1hdGNoZWQgKGFsbG93L2NvbmZpcm0vZGVueSkgKi9cbiAgbWF0Y2hlZFBvbGljeT86ICdhbGxvdycgfCAnY29uZmlybScgfCAnZGVueScgfCAnc2NvcGVfcmVzdHJpY3Rpb24nO1xuICAvKiogV2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBibG9ja2VkIGJ5IHNjb3BlIHJlc3RyaWN0aW9ucyAqL1xuICBzY29wZUJsb2NrZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogRWxlbWVudHMgdGhhdCB3YW50ZWQgdG8gYXV0by1hcHByb3ZlIHRoaXMgb3BlcmF0aW9uIGJ1dCB3ZXJlIG92ZXJyaWRkZW5cbiAgICogYnkgYSBoaWdoZXItcHJpb3JpdHkgY29uZmlybSBvciBkZW55IHBvbGljeSBmcm9tIGFub3RoZXIgZWxlbWVudC5cbiAgICogSXNzdWUgIzY3NDogYWxsb3cgY2Fubm90IG92ZXJyaWRlIGNvbmZpcm0uXG4gICAqL1xuICBjb25mbGljdGluZ0VsZW1lbnRzPzogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHdhbnRlZExldmVsOiBQZXJtaXNzaW9uTGV2ZWwgfT47XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIHBlcm1pc3Npb24gbGV2ZWwgZm9yIGFuIG9wZXJhdGlvblxuICogY29uc2lkZXJpbmcgYWxsIGFjdGl2ZSBlbGVtZW50cyBhbmQgdGhlaXIgcG9saWNpZXMuXG4gKlxuICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gdG8gY2hlY2tcbiAqIEBwYXJhbSBhY3RpdmVFbGVtZW50cyAtIEN1cnJlbnRseSBhY3RpdmUgZWxlbWVudHMgd2l0aCB0aGVpciBtZXRhZGF0YVxuICogQHBhcmFtIHRhcmdldEVsZW1lbnRUeXBlIC0gT3B0aW9uYWwgZWxlbWVudCB0eXBlIGJlaW5nIG9wZXJhdGVkIG9uXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgcG9saWN5IHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUVsZW1lbnRQb2xpY3koXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBhY3RpdmVFbGVtZW50czogQWN0aXZlRWxlbWVudFtdLFxuICB0YXJnZXRFbGVtZW50VHlwZT86IHN0cmluZ1xuKTogRWxlbWVudFBvbGljeVJlc3VsdCB7XG4gIC8vIFN0YXJ0IHdpdGggdGhlIGRlZmF1bHQgb3BlcmF0aW9uIHBlcm1pc3Npb24gbGV2ZWxcbiAgbGV0IGVmZmVjdGl2ZUxldmVsID0gZ2V0RGVmYXVsdFBlcm1pc3Npb25MZXZlbChvcGVyYXRpb24pO1xuICBsZXQgc291cmNlRWxlbWVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgbWF0Y2hlZFBvbGljeTogRWxlbWVudFBvbGljeVJlc3VsdFsnbWF0Y2hlZFBvbGljeSddO1xuICBsZXQgc2NvcGVCbG9ja2VkID0gZmFsc2U7XG4gIC8vIElzc3VlICM2NzQ6IFRyYWNrIHdoZXRoZXIgQ09ORklSTSB3YXMgc2V0IGJ5IGFuIGVsZW1lbnQgcG9saWN5IChub3QganVzdCB0aGUgcm91dGUgZGVmYXVsdClcbiAgLy8gYWxsb3cgY2FuIG92ZXJyaWRlIHRoZSByb3V0ZSBkZWZhdWx0IGJ1dCBOT1QgYW5vdGhlciBlbGVtZW50J3MgY29uZmlybSBwb2xpY3lcbiAgbGV0IGNvbmZpcm1lZEJ5RWxlbWVudCA9IGZhbHNlO1xuICAvLyBUcmFjayBlbGVtZW50cyB0aGF0IHdhbnRlZCBhbGxvdyBidXQgd2VyZSBvdmVycmlkZGVuIGJ5IGFuIGVsZW1lbnQtc2V0IGNvbmZpcm0vZGVueVxuICBjb25zdCBjb25mbGljdGluZ0VsZW1lbnRzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgd2FudGVkTGV2ZWw6IFBlcm1pc3Npb25MZXZlbCB9PiA9IFtdO1xuXG4gIC8vIENoZWNrIGVhY2ggYWN0aXZlIGVsZW1lbnQncyBwb2xpY3kgaW4gb3JkZXJcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFjdGl2ZUVsZW1lbnRzKSB7XG4gICAgY29uc3QgcG9saWN5ID0gZWxlbWVudC5tZXRhZGF0YS5nYXRla2VlcGVyO1xuICAgIGlmICghcG9saWN5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyAxLiBDaGVjayBkZW55IGxpc3QgZmlyc3QgKGhpZ2hlc3QgcHJpb3JpdHkpXG4gICAgaWYgKHBvbGljeS5kZW55Py5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwZXJtaXNzaW9uTGV2ZWw6IFBlcm1pc3Npb25MZXZlbC5ERU5ZLFxuICAgICAgICBzb3VyY2VFbGVtZW50OiBlbGVtZW50Lm5hbWUsXG4gICAgICAgIG1hdGNoZWRQb2xpY3k6ICdkZW55JyxcbiAgICAgICAgY29uZmxpY3RpbmdFbGVtZW50czogY29uZmxpY3RpbmdFbGVtZW50cy5sZW5ndGggPiAwID8gY29uZmxpY3RpbmdFbGVtZW50cyA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gMi4gQ2hlY2sgc2NvcGUgcmVzdHJpY3Rpb25zXG4gICAgaWYgKHRhcmdldEVsZW1lbnRUeXBlICYmIHBvbGljeS5zY29wZVJlc3RyaWN0aW9ucykge1xuICAgICAgY29uc3QgeyBhbGxvd2VkVHlwZXMsIGJsb2NrZWRUeXBlcyB9ID0gcG9saWN5LnNjb3BlUmVzdHJpY3Rpb25zO1xuXG4gICAgICAvLyBJZiBhbGxvd2VkVHlwZXMgaXMgc3BlY2lmaWVkLCB0YXJnZXQgbXVzdCBiZSBpbiB0aGUgbGlzdFxuICAgICAgaWYgKGFsbG93ZWRUeXBlcyAmJiAhYWxsb3dlZFR5cGVzLmluY2x1ZGVzKHRhcmdldEVsZW1lbnRUeXBlKSkge1xuICAgICAgICBzY29wZUJsb2NrZWQgPSB0cnVlO1xuICAgICAgICBzb3VyY2VFbGVtZW50ID0gZWxlbWVudC5uYW1lO1xuICAgICAgICBtYXRjaGVkUG9saWN5ID0gJ3Njb3BlX3Jlc3RyaWN0aW9uJztcbiAgICAgICAgY29udGludWU7IC8vIENoZWNrIG90aGVyIGVsZW1lbnRzLCBtaWdodCBoYXZlIGRpZmZlcmVudCBwb2xpY3lcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYmxvY2tlZFR5cGVzIGlzIHNwZWNpZmllZCwgdGFyZ2V0IG11c3QgTk9UIGJlIGluIHRoZSBsaXN0XG4gICAgICBpZiAoYmxvY2tlZFR5cGVzPy5pbmNsdWRlcyh0YXJnZXRFbGVtZW50VHlwZSkpIHtcbiAgICAgICAgc2NvcGVCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgc291cmNlRWxlbWVudCA9IGVsZW1lbnQubmFtZTtcbiAgICAgICAgbWF0Y2hlZFBvbGljeSA9ICdzY29wZV9yZXN0cmljdGlvbic7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIENoZWNrIGNvbmZpcm0gbGlzdCAocmVxdWlyZXMgY29uZmlybWF0aW9uKVxuICAgIGlmIChwb2xpY3kuY29uZmlybT8uaW5jbHVkZXMob3BlcmF0aW9uKSkge1xuICAgICAgLy8gRG9uJ3QgZG93bmdyYWRlIGZyb20gREVOWSBvciBDT05GSVJNX1NJTkdMRV9VU0VcbiAgICAgIGlmIChlZmZlY3RpdmVMZXZlbCAhPT0gUGVybWlzc2lvbkxldmVsLkRFTlkpIHtcbiAgICAgICAgZWZmZWN0aXZlTGV2ZWwgPSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TRVNTSU9OO1xuICAgICAgICBjb25maXJtZWRCeUVsZW1lbnQgPSB0cnVlO1xuICAgICAgICBzb3VyY2VFbGVtZW50ID0gZWxlbWVudC5uYW1lO1xuICAgICAgICBtYXRjaGVkUG9saWN5ID0gJ2NvbmZpcm0nO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDQuIENoZWNrIGFsbG93IGxpc3QgKGF1dG8tYXBwcm92ZXMpXG4gICAgLy8gSXNzdWUgIzY3NDogYWxsb3cgQ0FOIG92ZXJyaWRlIHRoZSByb3V0ZSBkZWZhdWx0LCBidXQgTk9UIGFub3RoZXIgZWxlbWVudCdzIGNvbmZpcm0gcG9saWN5LlxuICAgIC8vIFByaW9yaXR5IGhpZXJhcmNoeTogZWxlbWVudCBkZW55ID4gZWxlbWVudCBjb25maXJtID4gZWxlbWVudCBhbGxvdyA+IHJvdXRlIGRlZmF1bHRcbiAgICBpZiAocG9saWN5LmFsbG93Py5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAvLyBPbmx5IGVsZXZhdGUgaWYgdGhlIG9wZXJhdGlvbiBhbGxvd3MgZWxldmF0aW9uXG4gICAgICBpZiAoY2FuT3BlcmF0aW9uQmVFbGV2YXRlZChvcGVyYXRpb24pKSB7XG4gICAgICAgIGlmICghY29uZmlybWVkQnlFbGVtZW50KSB7XG4gICAgICAgICAgLy8gTm8gZWxlbWVudCBoYXMgY29uZmlybWVkIHRoaXMg4oCUIHNhZmUgdG8gZWxldmF0ZSAob3ZlcnJpZGVzIHJvdXRlIGRlZmF1bHQpXG4gICAgICAgICAgZWZmZWN0aXZlTGV2ZWwgPSBQZXJtaXNzaW9uTGV2ZWwuQVVUT19BUFBST1ZFO1xuICAgICAgICAgIHNvdXJjZUVsZW1lbnQgPSBlbGVtZW50Lm5hbWU7XG4gICAgICAgICAgbWF0Y2hlZFBvbGljeSA9ICdhbGxvdyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQW5vdGhlciBlbGVtZW50J3MgY29uZmlybSBwb2xpY3kgdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGlzIGFsbG93XG4gICAgICAgICAgY29uZmxpY3RpbmdFbGVtZW50cy5wdXNoKHsgbmFtZTogZWxlbWVudC5uYW1lLCB3YW50ZWRMZXZlbDogUGVybWlzc2lvbkxldmVsLkFVVE9fQVBQUk9WRSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIHNjb3BlIHdhcyBibG9ja2VkIGJ5IGFsbCBlbGVtZW50cyB3aXRoIHJlc3RyaWN0aW9uc1xuICBpZiAoc2NvcGVCbG9ja2VkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcm1pc3Npb25MZXZlbDogUGVybWlzc2lvbkxldmVsLkRFTlksXG4gICAgICBzb3VyY2VFbGVtZW50LFxuICAgICAgbWF0Y2hlZFBvbGljeTogJ3Njb3BlX3Jlc3RyaWN0aW9uJyxcbiAgICAgIHNjb3BlQmxvY2tlZDogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwZXJtaXNzaW9uTGV2ZWw6IGVmZmVjdGl2ZUxldmVsLFxuICAgIHNvdXJjZUVsZW1lbnQsXG4gICAgbWF0Y2hlZFBvbGljeSxcbiAgICBjb25mbGljdGluZ0VsZW1lbnRzOiBjb25mbGljdGluZ0VsZW1lbnRzLmxlbmd0aCA+IDAgPyBjb25mbGljdGluZ0VsZW1lbnRzIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIEdhdGVrZWVwZXIgZGVjaXNpb24gZnJvbSBlbGVtZW50IHBvbGljeSByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIHRoYXQgd2FzIGNoZWNrZWRcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgZWxlbWVudCBwb2xpY3kgcmVzb2x1dGlvbiByZXN1bHRcbiAqIEBwYXJhbSB0YXJnZXRFbGVtZW50VHlwZSAtIE9wdGlvbmFsIGVsZW1lbnQgdHlwZSBiZWluZyBvcGVyYXRlZCBvblxuICogQHJldHVybnMgQSBHYXRla2VlcGVyRGVjaXNpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWNpc2lvbkZyb21Qb2xpY3koXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICByZXN1bHQ6IEVsZW1lbnRQb2xpY3lSZXN1bHQsXG4gIHRhcmdldEVsZW1lbnRUeXBlPzogc3RyaW5nXG4pOiBHYXRla2VlcGVyRGVjaXNpb24ge1xuICBjb25zdCB7IHBlcm1pc3Npb25MZXZlbCwgc291cmNlRWxlbWVudCwgc2NvcGVCbG9ja2VkLCBjb25mbGljdGluZ0VsZW1lbnRzIH0gPSByZXN1bHQ7XG5cbiAgLy8gSGFuZGxlIERFTllcbiAgaWYgKHBlcm1pc3Npb25MZXZlbCA9PT0gUGVybWlzc2lvbkxldmVsLkRFTlkpIHtcbiAgICBpZiAoc2NvcGVCbG9ja2VkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbGxvd2VkOiBmYWxzZSxcbiAgICAgICAgcGVybWlzc2lvbkxldmVsLFxuICAgICAgICBlcnJvckNvZGU6IEdhdGVrZWVwZXJFcnJvckNvZGUuU0NPUEVfUkVTVFJJQ1RJT04sXG4gICAgICAgIHJlYXNvbjogYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGlzIG5vdCBhbGxvd2VkIG9uIGVsZW1lbnQgdHlwZSBcIiR7dGFyZ2V0RWxlbWVudFR5cGV9XCIgZHVlIHRvIHNjb3BlIHJlc3RyaWN0aW9ucyBpbiBhY3RpdmUgZWxlbWVudCBcIiR7c291cmNlRWxlbWVudH1cImAsXG4gICAgICAgIHN1Z2dlc3Rpb246IGBEZWFjdGl2YXRlIHRoZSBlbGVtZW50IFwiJHtzb3VyY2VFbGVtZW50fVwiIG9yIHVzZSBhIGRpZmZlcmVudCBlbGVtZW50IHR5cGVgLFxuICAgICAgICBwb2xpY3lTb3VyY2U6ICdlbGVtZW50X3BvbGljeScsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhbGxvd2VkOiBmYWxzZSxcbiAgICAgIHBlcm1pc3Npb25MZXZlbCxcbiAgICAgIGVycm9yQ29kZTogR2F0ZWtlZXBlckVycm9yQ29kZS5FTEVNRU5UX1BPTElDWV9WSU9MQVRJT04sXG4gICAgICByZWFzb246IGBPcGVyYXRpb24gXCIke29wZXJhdGlvbn1cIiBpcyBibG9ja2VkIGJ5IGFjdGl2ZSBlbGVtZW50IFwiJHtzb3VyY2VFbGVtZW50fVwiJ3MgZGVueSBwb2xpY3lgLFxuICAgICAgc3VnZ2VzdGlvbjogYERlYWN0aXZhdGUgdGhlIGVsZW1lbnQgXCIke3NvdXJjZUVsZW1lbnR9XCIgdG8gcHJvY2VlZCB3aXRoIHRoaXMgb3BlcmF0aW9uYCxcbiAgICAgIHBvbGljeVNvdXJjZTogJ2VsZW1lbnRfcG9saWN5JyxcbiAgICB9O1xuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmZpcm1hdGlvbiByZXF1aXJlZFxuICBpZiAoXG4gICAgcGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TRVNTSU9OIHx8XG4gICAgcGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFXG4gICkge1xuICAgIC8vIEJ1aWxkIGh1bWFuLXJlYWRhYmxlIHJhdGlvbmFsZSBleHBsYWluaW5nIFdIWSBjb25maXJtYXRpb24gaXMgbmVlZGVkXG4gICAgY29uc3QgcG9saWN5ID0gZ2V0T3BlcmF0aW9uUG9saWN5KG9wZXJhdGlvbik7XG4gICAgY29uc3QgbGV2ZWxMYWJlbCA9IHBlcm1pc3Npb25MZXZlbCA9PT0gUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRVxuICAgICAgPyAncmVxdWlyZXMgY29uZmlybWF0aW9uIGVhY2ggdGltZSdcbiAgICAgIDogJ3JlcXVpcmVzIGNvbmZpcm1hdGlvbiBvbmNlIHBlciBzZXNzaW9uJztcblxuICAgIGxldCByYXRpb25hbGU6IHN0cmluZztcbiAgICBpZiAoc291cmNlRWxlbWVudCAmJiByZXN1bHQubWF0Y2hlZFBvbGljeSA9PT0gJ2NvbmZpcm0nKSB7XG4gICAgICAvLyBFbGVtZW50IHBvbGljeSBlbGV2YXRlZCB0aGlzIG9wZXJhdGlvbidzIGNvbmZpcm1hdGlvbiByZXF1aXJlbWVudFxuICAgICAgY29uc3QgcG9saWN5RGV0YWlsID0gcG9saWN5Py5yYXRpb25hbGUgPyBgICR7cG9saWN5LnJhdGlvbmFsZX1gIDogJyc7XG4gICAgICByYXRpb25hbGUgPSBgQWN0aXZlIGVsZW1lbnQgXCIke3NvdXJjZUVsZW1lbnR9XCIgcG9saWN5IHJlcXVpcmVzIGNvbmZpcm1hdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24uJHtwb2xpY3lEZXRhaWx9YDtcbiAgICB9IGVsc2UgaWYgKHBvbGljeT8ucmF0aW9uYWxlKSB7XG4gICAgICAvLyBSb3V0ZS1sZXZlbCBkZWZhdWx0IHdpdGggZG9jdW1lbnRlZCByYXRpb25hbGVcbiAgICAgIHJhdGlvbmFsZSA9IHBvbGljeS5yYXRpb25hbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVuZHBvaW50LWxldmVsIGRlZmF1bHQsIG5vIHNwZWNpZmljIHJhdGlvbmFsZVxuICAgICAgcmF0aW9uYWxlID0gJ1RoaXMgb3BlcmF0aW9uIG1vZGlmaWVzIGRhdGEgYW5kIHJlcXVpcmVzIGh1bWFuIGFwcHJvdmFsIGJlZm9yZSBwcm9jZWVkaW5nJztcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjc0OiBTdXJmYWNlIGVsZW1lbnRzIHRoYXQgd2FudGVkIHRvIGF1dG8tYXBwcm92ZSBidXQgd2VyZSBvdmVycmlkZGVuXG4gICAgY29uc3QgY29uZmxpY3ROb3RlID0gY29uZmxpY3RpbmdFbGVtZW50cyAmJiBjb25mbGljdGluZ0VsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgID8gYCAoTm90ZTogJHtjb25mbGljdGluZ0VsZW1lbnRzLm1hcChlID0+IGBcIiR7ZS5uYW1lfVwiYCkuam9pbignLCAnKX0gd291bGQgYXV0by1hcHByb3ZlIHRoaXMgYnV0ICR7Y29uZmxpY3RpbmdFbGVtZW50cy5sZW5ndGggPT09IDEgPyAnaXMnIDogJ2FyZSd9IG92ZXJyaWRkZW4gYnkgdGhlIGNvbmZpcm0gcG9saWN5LilgXG4gICAgICA6ICcnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgcGVybWlzc2lvbkxldmVsLFxuICAgICAgZXJyb3JDb2RlOiBHYXRla2VlcGVyRXJyb3JDb2RlLkNPTkZJUk1BVElPTl9SRVFVSVJFRCxcbiAgICAgIHJlYXNvbjogYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiICR7bGV2ZWxMYWJlbH0uICR7cmF0aW9uYWxlfSR7Y29uZmxpY3ROb3RlfWAsXG4gICAgICBzdWdnZXN0aW9uOiAnVXNlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nIHRvIGFwcHJvdmUgdGhpcyBvcGVyYXRpb24nLFxuICAgICAgY29uZmlybWF0aW9uUGVuZGluZzogdHJ1ZSxcbiAgICAgIHBvbGljeVNvdXJjZTogc291cmNlRWxlbWVudCA/ICdlbGVtZW50X3BvbGljeScgOiAnb3BlcmF0aW9uX2RlZmF1bHQnLFxuICAgIH07XG4gIH1cblxuICAvLyBIYW5kbGUgQVVUT19BUFBST1ZFXG4gIHJldHVybiB7XG4gICAgYWxsb3dlZDogdHJ1ZSxcbiAgICBwZXJtaXNzaW9uTGV2ZWwsXG4gICAgcmVhc29uOiBzb3VyY2VFbGVtZW50XG4gICAgICA/IGBPcGVyYXRpb24gXCIke29wZXJhdGlvbn1cIiBhdXRvLWFwcHJvdmVkIGJ5IGVsZW1lbnQgXCIke3NvdXJjZUVsZW1lbnR9XCJgXG4gICAgICA6IGBPcGVyYXRpb24gXCIke29wZXJhdGlvbn1cIiBhdXRvLWFwcHJvdmVkIGJ5IGRlZmF1bHQgcG9saWN5YCxcbiAgICBwb2xpY3lTb3VyY2U6IHNvdXJjZUVsZW1lbnQgPyAnZWxlbWVudF9wb2xpY3knIDogJ29wZXJhdGlvbl9kZWZhdWx0JyxcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBHYXRla2VlcGVyIHBvbGljeSBmcm9tIGVsZW1lbnQgbWV0YWRhdGEuXG4gKlxuICogQHBhcmFtIG1ldGFkYXRhIC0gVGhlIGVsZW1lbnQgbWV0YWRhdGEgdG8gcGFyc2VcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgcG9saWN5LCBvciB1bmRlZmluZWQgaWYgbm8gcG9saWN5IGlzIGRlZmluZWRcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHBvbGljeSBpcyBtYWxmb3JtZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRWxlbWVudFBvbGljeShcbiAgbWV0YWRhdGE6IHVua25vd25cbik6IEVsZW1lbnRHYXRla2VlcGVyUG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFtZXRhZGF0YSB8fCB0eXBlb2YgbWV0YWRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG1ldGEgPSBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgZ2F0ZWtlZXBlciA9IG1ldGEuZ2F0ZWtlZXBlcjtcblxuICBpZiAoIWdhdGVrZWVwZXIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnYXRla2VlcGVyICE9PSAnb2JqZWN0JyB8fCBnYXRla2VlcGVyID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgY29uc3QgcG9saWN5ID0gZ2F0ZWtlZXBlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBWYWxpZGF0ZSBhbmQgZXh0cmFjdCBhbGxvdyBsaXN0XG4gIGNvbnN0IGFsbG93ID0gdmFsaWRhdGVTdHJpbmdBcnJheShwb2xpY3kuYWxsb3csICdhbGxvdycpO1xuICBjb25zdCBjb25maXJtID0gdmFsaWRhdGVTdHJpbmdBcnJheShwb2xpY3kuY29uZmlybSwgJ2NvbmZpcm0nKTtcbiAgY29uc3QgZGVueSA9IHZhbGlkYXRlU3RyaW5nQXJyYXkocG9saWN5LmRlbnksICdkZW55Jyk7XG5cbiAgLy8gVmFsaWRhdGUgc2NvcGUgcmVzdHJpY3Rpb25zXG4gIGxldCBzY29wZVJlc3RyaWN0aW9uczogRWxlbWVudEdhdGVrZWVwZXJQb2xpY3lbJ3Njb3BlUmVzdHJpY3Rpb25zJ107XG4gIGlmIChwb2xpY3kuc2NvcGVSZXN0cmljdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHBvbGljeS5zY29wZVJlc3RyaWN0aW9ucyAhPT0gJ29iamVjdCcgfHwgcG9saWN5LnNjb3BlUmVzdHJpY3Rpb25zID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZ2F0ZWtlZXBlciBwb2xpY3k6IHNjb3BlUmVzdHJpY3Rpb25zIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHNyID0gcG9saWN5LnNjb3BlUmVzdHJpY3Rpb25zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHNjb3BlUmVzdHJpY3Rpb25zID0ge1xuICAgICAgYWxsb3dlZFR5cGVzOiB2YWxpZGF0ZVN0cmluZ0FycmF5KHNyLmFsbG93ZWRUeXBlcywgJ3Njb3BlUmVzdHJpY3Rpb25zLmFsbG93ZWRUeXBlcycpLFxuICAgICAgYmxvY2tlZFR5cGVzOiB2YWxpZGF0ZVN0cmluZ0FycmF5KHNyLmJsb2NrZWRUeXBlcywgJ3Njb3BlUmVzdHJpY3Rpb25zLmJsb2NrZWRUeXBlcycpLFxuICAgIH07XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBleHRlcm5hbCByZXN0cmljdGlvbnMgKElzc3VlICM2MjUgUGhhc2UgMilcbiAgbGV0IGV4dGVybmFsUmVzdHJpY3Rpb25zOiBFbGVtZW50R2F0ZWtlZXBlclBvbGljeVsnZXh0ZXJuYWxSZXN0cmljdGlvbnMnXTtcbiAgaWYgKHBvbGljeS5leHRlcm5hbFJlc3RyaWN0aW9ucykge1xuICAgIGlmICh0eXBlb2YgcG9saWN5LmV4dGVybmFsUmVzdHJpY3Rpb25zICE9PSAnb2JqZWN0JyB8fCBwb2xpY3kuZXh0ZXJuYWxSZXN0cmljdGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogZXh0ZXJuYWxSZXN0cmljdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3QgZXIgPSBwb2xpY3kuZXh0ZXJuYWxSZXN0cmljdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKCFlci5kZXNjcmlwdGlvbiB8fCB0eXBlb2YgZXIuZGVzY3JpcHRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZ2F0ZWtlZXBlciBwb2xpY3k6IGV4dGVybmFsUmVzdHJpY3Rpb25zLmRlc2NyaXB0aW9uIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cbiAgICBjb25zdCBkZW55UGF0dGVybnMgPSB2YWxpZGF0ZVN0cmluZ0FycmF5KGVyLmRlbnlQYXR0ZXJucywgJ2V4dGVybmFsUmVzdHJpY3Rpb25zLmRlbnlQYXR0ZXJucycpO1xuICAgIGNvbnN0IGFsbG93UGF0dGVybnMgPSB2YWxpZGF0ZVN0cmluZ0FycmF5KGVyLmFsbG93UGF0dGVybnMsICdleHRlcm5hbFJlc3RyaWN0aW9ucy5hbGxvd1BhdHRlcm5zJyk7XG4gICAgaWYgKGRlbnlQYXR0ZXJucykgdmFsaWRhdGVQYXR0ZXJuU3RyaW5ncyhkZW55UGF0dGVybnMsICdleHRlcm5hbFJlc3RyaWN0aW9ucy5kZW55UGF0dGVybnMnKTtcbiAgICBpZiAoYWxsb3dQYXR0ZXJucykgdmFsaWRhdGVQYXR0ZXJuU3RyaW5ncyhhbGxvd1BhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuYWxsb3dQYXR0ZXJucycpO1xuICAgIC8vIFZhbGlkYXRlIGFwcHJvdmFsUG9saWN5IChJc3N1ZSAjNjI1IFBoYXNlIDMpXG4gICAgbGV0IGFwcHJvdmFsUG9saWN5OiBDbGlBcHByb3ZhbFBvbGljeSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoZXIuYXBwcm92YWxQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBlci5hcHByb3ZhbFBvbGljeSAhPT0gJ29iamVjdCcgfHwgZXIuYXBwcm92YWxQb2xpY3kgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgYXAgPSBlci5hcHByb3ZhbFBvbGljeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZUFwcHJvdmFsXG4gICAgICBsZXQgcmVxdWlyZUFwcHJvdmFsOiAoJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFwLnJlcXVpcmVBcHByb3ZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcC5yZXF1aXJlQXBwcm92YWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS5yZXF1aXJlQXBwcm92YWwgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbGlkTGV2ZWxzID0gbmV3IFNldChbJ21vZGVyYXRlJywgJ2Rhbmdlcm91cyddKTtcbiAgICAgICAgZm9yIChjb25zdCBsZXZlbCBvZiBhcC5yZXF1aXJlQXBwcm92YWwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsICE9PSAnc3RyaW5nJyB8fCAhdmFsaWRMZXZlbHMuaGFzKGxldmVsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS5yZXF1aXJlQXBwcm92YWwgY29udGFpbnMgaW52YWxpZCB2YWx1ZSBcIiR7bGV2ZWx9XCIuIE11c3QgYmUgXCJtb2RlcmF0ZVwiIG9yIFwiZGFuZ2Vyb3VzXCIuYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcXVpcmVBcHByb3ZhbCA9IGFwLnJlcXVpcmVBcHByb3ZhbCBhcyAoJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKVtdO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBkZWZhdWx0U2NvcGVcbiAgICAgIGxldCBkZWZhdWx0U2NvcGU6ICdzaW5nbGUnIHwgJ3Rvb2xfc2Vzc2lvbicgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXAuZGVmYXVsdFNjb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFwLmRlZmF1bHRTY29wZSAhPT0gJ3NpbmdsZScgJiYgYXAuZGVmYXVsdFNjb3BlICE9PSAndG9vbF9zZXNzaW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogZXh0ZXJuYWxSZXN0cmljdGlvbnMuYXBwcm92YWxQb2xpY3kuZGVmYXVsdFNjb3BlIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcInRvb2xfc2Vzc2lvblwiLCBnb3QgXCIke2FwLmRlZmF1bHRTY29wZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHRTY29wZSA9IGFwLmRlZmF1bHRTY29wZTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdHRsU2Vjb25kc1xuICAgICAgbGV0IHR0bFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChhcC50dGxTZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcC50dGxTZWNvbmRzICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzRmluaXRlKGFwLnR0bFNlY29uZHMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXAudHRsU2Vjb25kcyA8IDMwIHx8IGFwLnR0bFNlY29uZHMgPiAzNjAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzIG11c3QgYmUgYmV0d2VlbiAzMCBhbmQgMzYwMCwgZ290ICR7YXAudHRsU2Vjb25kc31gKTtcbiAgICAgICAgfVxuICAgICAgICB0dGxTZWNvbmRzID0gYXAudHRsU2Vjb25kcztcbiAgICAgIH1cblxuICAgICAgYXBwcm92YWxQb2xpY3kgPSB7IHJlcXVpcmVBcHByb3ZhbCwgZGVmYXVsdFNjb3BlLCB0dGxTZWNvbmRzIH07XG4gICAgfVxuXG4gICAgZXh0ZXJuYWxSZXN0cmljdGlvbnMgPSB7XG4gICAgICBkZXNjcmlwdGlvbjogZXIuZGVzY3JpcHRpb24gYXMgc3RyaW5nLFxuICAgICAgZGVueVBhdHRlcm5zLFxuICAgICAgYWxsb3dQYXR0ZXJucyxcbiAgICAgIGFwcHJvdmFsUG9saWN5LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFsbG93LFxuICAgIGNvbmZpcm0sXG4gICAgZGVueSxcbiAgICBzY29wZVJlc3RyaWN0aW9ucyxcbiAgICBleHRlcm5hbFJlc3RyaWN0aW9ucyxcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgdmFsdWUgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSBmaWVsZE5hbWUgLSBUaGUgZmllbGQgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXNcbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgYXJyYXksIG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZ0FycmF5KFxuICB2YWx1ZTogdW5rbm93bixcbiAgZmllbGROYW1lOiBzdHJpbmdcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogJHtmaWVsZE5hbWV9IG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgfVxuXG4gIGlmICghdmFsdWUuZXZlcnkoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiAke2ZpZWxkTmFtZX0gbXVzdCBjb250YWluIG9ubHkgc3RyaW5nc2ApO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHBhdHRlcm4gc3RyaW5ncyBmb3IgbGVuZ3RoIGFuZCBub24tZW1wdGluZXNzLlxuICpcbiAqIEBwYXJhbSBwYXR0ZXJucyAtIEFycmF5IG9mIHBhdHRlcm4gc3RyaW5ncyB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIEZpZWxkIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFueSBwYXR0ZXJuIGlzIGVtcHR5IG9yIGV4Y2VlZHMgTUFYX0dMT0JfUEFUVEVSTl9MRU5HVEhcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJuU3RyaW5ncyhcbiAgcGF0dGVybnM6IHN0cmluZ1tdLFxuICBmaWVsZE5hbWU6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIGlmICghcGF0dGVybikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiAke2ZpZWxkTmFtZX0gY29udGFpbnMgYW4gZW1wdHkgcGF0dGVybiBzdHJpbmdgKTtcbiAgICB9XG4gICAgaWYgKHBhdHRlcm4ubGVuZ3RoID4gTUFYX0dMT0JfUEFUVEVSTl9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogJHtmaWVsZE5hbWV9IHBhdHRlcm4gZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke01BWF9HTE9CX1BBVFRFUk5fTEVOR1RIfSBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIHNhbml0aXplIGEgZ2F0ZWtlZXBlciBwb2xpY3kgZHVyaW5nIGVsZW1lbnQgZGVzZXJpYWxpemF0aW9uLlxuICpcbiAqIFJldHVybnMgYSB2YWxpZGF0ZWQge0BsaW5rIEVsZW1lbnRHYXRla2VlcGVyUG9saWN5fSBpZiB0aGUgcmF3IGRhdGEgaXNcbiAqIHN0cnVjdHVyYWxseSB2YWxpZCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIGRhdGEgaXMgYWJzZW50LCBmYWxzeSwgb3JcbiAqIG1hbGZvcm1lZC4gTWFsZm9ybWVkIHBvbGljaWVzIGFyZSBsb2dnZWQgYXMgc2VjdXJpdHkgZXZlbnRzIGFuZCBzdHJpcHBlZFxuICogc28gdGhleSBuZXZlciByZWFjaCB0aGUgZW5mb3JjZW1lbnQgcGlwZWxpbmUuXG4gKlxuICogVXNlIHRoaXMgYXQgZXZlcnkgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IChtYW5hZ2VyIGBwYXJzZU1ldGFkYXRhYCAvXG4gKiBgc2FuaXRpemVNZXRhZGF0YWAgLyBgcGFyc2VNZW1vcnlGaWxlYCkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSB3ZWxsLWZvcm1lZFxuICogcG9saWNpZXMgc3Vydml2ZSBsb2FkaW5nLlxuICpcbiAqIEBwYXJhbSByYXdQb2xpY3kgLSBUaGUgcmF3IGdhdGVrZWVwZXIgdmFsdWUgZnJvbSBwYXJzZWQgWUFNTC9KU09OXG4gKiBAcGFyYW0gZWxlbWVudE5hbWUgLSBFbGVtZW50IG5hbWUgZm9yIGRpYWdub3N0aWMgbG9nZ2luZ1xuICogQHBhcmFtIGVsZW1lbnRUeXBlIC0gRWxlbWVudCB0eXBlIGZvciBkaWFnbm9zdGljIGxvZ2dpbmdcbiAqIEByZXR1cm5zIFZhbGlkYXRlZCBwb2xpY3kgb3IgdW5kZWZpbmVkXG4gKlxuICogQHNpbmNlIElzc3VlICM1MjQg4oCUIFJ1bnRpbWUgdmFsaWRhdGlvbiBmb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAqL1xuLyoqXG4gKiBHYXRla2VlcGVyIGluZnJhc3RydWN0dXJlIG9wZXJhdGlvbnMg4oCUIHR3byByZWxhdGVkIHNldHMgd2l0aCBkaXN0aW5jdCBwdXJwb3Nlcy5cbiAqXG4gKiBVTkdBVEFCTEVfT1BFUkFUSU9OUzogT3BlcmF0aW9ucyB0aGF0IG11c3QgTkVWRVIgYXBwZWFyIGluIGVsZW1lbnQgcG9saWN5IGxpc3RzLlxuICogVGhlc2UgYXJlIHB1cmUgaW50ZXJuYWwgcGx1bWJpbmcg4oCUIGdhdGluZyB0aGVtIHNlcnZlcyBubyBzZWN1cml0eSBwdXJwb3NlIGFuZFxuICogYnJlYWtzIGNyaXRpY2FsIGZsb3dzICh2ZXJpZmljYXRpb24sIENMSSBhcHByb3ZhbCwgcGVybWlzc2lvbiBldmFsdWF0aW9uKS5cbiAqIFN0cmlwcGVkIGZyb20gQUxMIHBvbGljeSBsaXN0cyAoYWxsb3csIGNvbmZpcm0sIGRlbnkpIGR1cmluZyBzYW5pdGl6YXRpb24uXG4gKlxuICogR0FURUtFRVBFUl9JTkZSQV9PUEVSQVRJT05TOiBPcGVyYXRpb25zIHRoYXQgc2tpcCBMYXllciAyIChlbGVtZW50IHBvbGljeVxuICogcmVzb2x1dGlvbikgZHVyaW5nIHByaW1hcnkgZW5mb3JjZW1lbnQuIFRoaXMgaXMgYSBTVVBFUlNFVCBvZiBVTkdBVEFCTEVfT1BFUkFUSU9OU1xuICog4oCUIGl0IGFkZHMgY29uZmlybV9vcGVyYXRpb24sIHdoaWNoIElTIGEgdmFsaWQgcG9saWN5IHRhcmdldCAoZGVueSA9IG51Y2xlYXIgc2FuZGJveClcbiAqIGJ1dCBtdXN0IG5vdCBiZSBnYXRlZCB0aHJvdWdoIHRoZSBub3JtYWwgZW5mb3JjZSgpIHBhdGggKHRoYXQgY3JlYXRlcyB0aGVcbiAqIGNhc2NhZGluZyBjb25maXJtYXRpb24gbG9vcCBmcm9tIElzc3VlICM3NTgpLiBjb25maXJtX29wZXJhdGlvbidzIGVsZW1lbnQgcG9saWNpZXNcbiAqIGFyZSBlbmZvcmNlZCB0aHJvdWdoIGEgc2VwYXJhdGUgY2hlY2sgaW4gdGhlIGNvbmZpcm0gaGFuZGxlciBpbnN0ZWFkLlxuICpcbiAqIFJlbGF0aW9uc2hpcDogR0FURUtFRVBFUl9JTkZSQV9PUEVSQVRJT05TID0gVU5HQVRBQkxFX09QRVJBVElPTlMgKyBjb25maXJtX29wZXJhdGlvblxuICogVGhpcyBkZXJpdmF0aW9uIGlzIGV4cGxpY2l0IGluIGNvZGUgdG8gcHJldmVudCB0aGUgc2V0cyBmcm9tIGRyaWZ0aW5nIGFwYXJ0LlxuICovXG5jb25zdCBVTkdBVEFCTEVfT1BFUkFUSU9OUyA9IG5ldyBTZXQoW1xuICAndmVyaWZ5X2NoYWxsZW5nZScsXG4gICdhcHByb3ZlX2NsaV9wZXJtaXNzaW9uJyxcbiAgJ3Blcm1pc3Npb25fcHJvbXB0Jyxcbl0pO1xuXG4vKiogRGVyaXZlZCBmcm9tIFVOR0FUQUJMRV9PUEVSQVRJT05TICsgY29uZmlybV9vcGVyYXRpb24uIFNlZSBibG9jayBjb21tZW50IGFib3ZlLiAqL1xuY29uc3QgR0FURUtFRVBFUl9JTkZSQV9PUEVSQVRJT05TID0gbmV3IFNldChbXG4gIC4uLlVOR0FUQUJMRV9PUEVSQVRJT05TLFxuICAnY29uZmlybV9vcGVyYXRpb24nLFxuXSk7XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gb3BlcmF0aW9uIGlzIGEgZ2F0ZWtlZXBlciBpbmZyYXN0cnVjdHVyZSBvcGVyYXRpb24gdGhhdCBzaG91bGRcbiAqIHNraXAgZWxlbWVudCBwb2xpY3kgZXZhbHVhdGlvbiBpbiB0aGUgcHJpbWFyeSBlbmZvcmNlbWVudCBwYXRoLlxuICogRXhwb3J0ZWQgZm9yIHVzZSBieSBNQ1BBUUxIYW5kbGVyLiBJc3N1ZSAjNzU4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHYXRla2VlcGVySW5mcmFPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEdBVEVLRUVQRVJfSU5GUkFfT1BFUkFUSU9OUy5oYXMob3BlcmF0aW9uKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbnkgYWN0aXZlIGVsZW1lbnRzIGRlbnkgY29uZmlybV9vcGVyYXRpb24gKG51Y2xlYXIgc2FuZGJveCkuXG4gKiBSZXR1cm5zIHRoZSBkZW55aW5nIGVsZW1lbnQgbmFtZSBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDb25maXJtRGVueWluZ0VsZW1lbnQoXG4gIGFjdGl2ZUVsZW1lbnRzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT5cbik6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhY3RpdmVFbGVtZW50cykge1xuICAgIGNvbnN0IGdhdGVrZWVwZXIgPSBlbGVtZW50Lm1ldGFkYXRhPy5nYXRla2VlcGVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlbnlMaXN0ID0gZ2F0ZWtlZXBlcj8uZGVueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkZW55TGlzdCkgJiYgZGVueUxpc3QuaW5jbHVkZXMoJ2NvbmZpcm1fb3BlcmF0aW9uJykpIHtcbiAgICAgIHJldHVybiB7IG5hbWU6IGVsZW1lbnQubmFtZSwgdHlwZTogZWxlbWVudC50eXBlIH07XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW55IGFjdGl2ZSBlbGVtZW50cyBoYXZlIGNvbmZpcm1fb3BlcmF0aW9uIGluIHRoZWlyIGNvbmZpcm0gbGlzdCAoYWR2aXNvcnkpLlxuICogUmV0dXJucyB0aGUgZWxlbWVudCBuYW1lcyB0aGF0IHJlcXVlc3QgYWRkaXRpb25hbCBzY3J1dGlueS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDb25maXJtQWR2aXNvcnlFbGVtZW50cyhcbiAgYWN0aXZlRWxlbWVudHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PlxuKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGFkdmlzb3JpZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfT4gPSBbXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFjdGl2ZUVsZW1lbnRzKSB7XG4gICAgY29uc3QgZ2F0ZWtlZXBlciA9IGVsZW1lbnQubWV0YWRhdGE/LmdhdGVrZWVwZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlybUxpc3QgPSBnYXRla2VlcGVyPy5jb25maXJtO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpcm1MaXN0KSAmJiBjb25maXJtTGlzdC5pbmNsdWRlcygnY29uZmlybV9vcGVyYXRpb24nKSkge1xuICAgICAgYWR2aXNvcmllcy5wdXNoKHsgbmFtZTogZWxlbWVudC5uYW1lLCB0eXBlOiBlbGVtZW50LnR5cGUgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBhZHZpc29yaWVzO1xufVxuXG4vKipcbiAqIFN0cmlwIHVuZ2F0YWJsZSBvcGVyYXRpb25zIGZyb20gYSBwb2xpY3kgbGlzdCBhbmQgbG9nIHdhcm5pbmdzLlxuICogUmV0dXJucyB0aGUgZmlsdGVyZWQgbGlzdCAobWF5IGJlIGVtcHR5KS5cbiAqXG4gKiBOb3RlOiBjb25maXJtX29wZXJhdGlvbiBpcyBOT1Qgc3RyaXBwZWQgZnJvbSBkZW55IGxpc3RzIOKAlCBpdCdzIGEgbGVnaXRpbWF0ZVxuICogc2FuZGJveCBtZWNoYW5pc20uIEl0IElTIHN0cmlwcGVkIGZyb20gYWxsb3cvY29uZmlybSBsaXN0cyBzaW5jZSB0aG9zZSBhcmVcbiAqIGhhbmRsZWQgdGhyb3VnaCBhZHZpc29yeSBtZXNzYWdpbmcsIG5vdCB0aHJvdWdoIGVuZm9yY2UoKS5cbiAqL1xuZnVuY3Rpb24gc3RyaXBVbmdhdGFibGUoXG4gIG9wZXJhdGlvbnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICBsaXN0TmFtZTogc3RyaW5nLFxuICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICBlbGVtZW50VHlwZTogc3RyaW5nLFxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBpZiAoIW9wZXJhdGlvbnM/Lmxlbmd0aCkgcmV0dXJuIG9wZXJhdGlvbnM7XG5cbiAgLy8gY29uZmlybV9vcGVyYXRpb24gaW4gZGVueSBsaXN0cyA9IG51Y2xlYXIgc2FuZGJveCAocHJlc2VydmUpXG4gIC8vIGNvbmZpcm1fb3BlcmF0aW9uIGluIGNvbmZpcm0gbGlzdHMgPSBhZHZpc29yeSBtYXJrZXIgKHByZXNlcnZlIOKAlCBpbmVydCBpbiBlbmZvcmNlIHBhdGgsXG4gIC8vICAgcmVhZCBhdCBydW50aW1lIGJ5IGZpbmRDb25maXJtQWR2aXNvcnlFbGVtZW50cygpLiBTYWZlIGJlY2F1c2Ugc2tpcEVsZW1lbnRQb2xpY2llc1xuICAvLyAgIHByZXZlbnRzIHJlc29sdmVFbGVtZW50UG9saWN5KCkgZnJvbSBldmVyIGV2YWx1YXRpbmcgY29uZmlybV9vcGVyYXRpb24gYXMgYW4gb3BlcmF0aW9uLilcbiAgLy8gY29uZmlybV9vcGVyYXRpb24gaW4gYWxsb3cgbGlzdHMgPSByZWR1bmRhbnQgd2l0aCByb3V0ZSBkZWZhdWx0IEFVVE9fQVBQUk9WRSAoc3RyaXApXG4gIGNvbnN0IG9wc1RvU3RyaXAgPSBsaXN0TmFtZSA9PT0gJ2FsbG93J1xuICAgID8gbmV3IFNldChbLi4uVU5HQVRBQkxFX09QRVJBVElPTlMsICdjb25maXJtX29wZXJhdGlvbiddKVxuICAgIDogVU5HQVRBQkxFX09QRVJBVElPTlM7XG5cbiAgY29uc3Qgc3RyaXBwZWQgPSBvcGVyYXRpb25zLmZpbHRlcihvcCA9PiB7XG4gICAgaWYgKG9wc1RvU3RyaXAuaGFzKG9wKSkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBbR2F0ZWtlZXBlcl0gU3RyaXBwZWQgXCIke29wfVwiIGZyb20gJHtsaXN0TmFtZX0gbGlzdCBpbiAke2VsZW1lbnRUeXBlfSBcIiR7ZWxlbWVudE5hbWV9XCIg4oCUIGAgK1xuICAgICAgICBgZ2F0ZWtlZXBlciBpbmZyYXN0cnVjdHVyZSBvcGVyYXRpb25zIGNhbm5vdCBiZSBnYXRlZCBieSBlbGVtZW50IHBvbGljaWVzIChJc3N1ZSAjNzU4KWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbiAgcmV0dXJuIHN0cmlwcGVkLmxlbmd0aCA+IDAgPyBzdHJpcHBlZCA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplR2F0ZWtlZXBlclBvbGljeShcbiAgcmF3UG9saWN5OiB1bmtub3duLFxuICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICBlbGVtZW50VHlwZTogc3RyaW5nLFxuKTogRWxlbWVudEdhdGVrZWVwZXJQb2xpY3kgfCB1bmRlZmluZWQge1xuICBpZiAoIXJhd1BvbGljeSB8fCB0eXBlb2YgcmF3UG9saWN5ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFdyYXAgaW4gYSBtZXRhZGF0YSBlbnZlbG9wZSBzbyBwYXJzZUVsZW1lbnRQb2xpY3kgY2FuIGV4dHJhY3QgaXRcbiAgICBjb25zdCB2YWxpZGF0ZWQgPSBwYXJzZUVsZW1lbnRQb2xpY3koeyBnYXRla2VlcGVyOiByYXdQb2xpY3kgfSk7XG4gICAgaWYgKHZhbGlkYXRlZCkge1xuICAgICAgLy8gSXNzdWUgIzc1ODogU3RyaXAgZ2F0ZWtlZXBlciBpbmZyYXN0cnVjdHVyZSBvcGVyYXRpb25zIGZyb20gZWxlbWVudCBwb2xpY2llc1xuICAgICAgLy8gdG8gcHJldmVudCBjYXNjYWRpbmcgY29uZmlybWF0aW9uIGxvb3BzXG4gICAgICB2YWxpZGF0ZWQuYWxsb3cgPSBzdHJpcFVuZ2F0YWJsZSh2YWxpZGF0ZWQuYWxsb3csICdhbGxvdycsIGVsZW1lbnROYW1lLCBlbGVtZW50VHlwZSk7XG4gICAgICB2YWxpZGF0ZWQuY29uZmlybSA9IHN0cmlwVW5nYXRhYmxlKHZhbGlkYXRlZC5jb25maXJtLCAnY29uZmlybScsIGVsZW1lbnROYW1lLCBlbGVtZW50VHlwZSk7XG4gICAgICB2YWxpZGF0ZWQuZGVueSA9IHN0cmlwVW5nYXRhYmxlKHZhbGlkYXRlZC5kZW55LCAnZGVueScsIGVsZW1lbnROYW1lLCBlbGVtZW50VHlwZSk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgTG9hZGVkIGdhdGVrZWVwZXIgcG9saWN5IGZvciAke2VsZW1lbnRUeXBlfSBcIiR7ZWxlbWVudE5hbWV9XCJgLCB7XG4gICAgICAgIGFsbG93OiB2YWxpZGF0ZWQuYWxsb3c/Lmxlbmd0aCA/PyAwLFxuICAgICAgICBjb25maXJtOiB2YWxpZGF0ZWQuY29uZmlybT8ubGVuZ3RoID8/IDAsXG4gICAgICAgIGRlbnk6IHZhbGlkYXRlZC5kZW55Py5sZW5ndGggPz8gMCxcbiAgICAgICAgaGFzU2NvcGVSZXN0cmljdGlvbnM6ICEhdmFsaWRhdGVkLnNjb3BlUmVzdHJpY3Rpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnWUFNTF9QQVJTSU5HX1dBUk5JTkcnLFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiBgJHtlbGVtZW50VHlwZX0uZGVzZXJpYWxpemVgLFxuICAgICAgZGV0YWlsczogYE1hbGZvcm1lZCBnYXRla2VlcGVyIHBvbGljeSBpbiBcIiR7ZWxlbWVudE5hbWV9XCIgc3RyaXBwZWQgZHVyaW5nIGxvYWQ6ICR7bWVzc2FnZX1gLFxuICAgIH0pO1xuICAgIGxvZ2dlci53YXJuKGBTdHJpcHBlZCBtYWxmb3JtZWQgZ2F0ZWtlZXBlciBwb2xpY3kgZnJvbSAke2VsZW1lbnRUeXBlfSBcIiR7ZWxlbWVudE5hbWV9XCI6ICR7bWVzc2FnZX1gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
|
|
576
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudFBvbGljaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFDTCxlQUFlLEVBSWYsbUJBQW1CLEdBQ3BCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0csT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQTRDM0U7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFNBQWlCLEVBQ2pCLGNBQStCLEVBQy9CLGlCQUEwQjtJQUUxQixvREFBb0Q7SUFDcEQsSUFBSSxjQUFjLEdBQUcseUJBQXlCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUQsSUFBSSxhQUFpQyxDQUFDO0lBQ3RDLElBQUksYUFBbUQsQ0FBQztJQUN4RCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDekIsOEZBQThGO0lBQzlGLGdGQUFnRjtJQUNoRixJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMvQixzRkFBc0Y7SUFDdEYsTUFBTSxtQkFBbUIsR0FBMEQsRUFBRSxDQUFDO0lBRXRGLDhDQUE4QztJQUM5QyxLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLFNBQVM7UUFD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LDZDQUE2QyxXQUFXLEtBQUssV0FBVyxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDckcsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVsZW1lbnQgUG9saWNpZXNcbiAqXG4gKiBIYW5kbGVzIGVsZW1lbnQtYmFzZWQgYWNjZXNzIGNvbnRyb2wgZm9yIHRoZSBHYXRla2VlcGVyLlxuICogQWxsb3dzIEFOWSBEb2xsaG91c2VNQ1AgZWxlbWVudCB0byBkZWZpbmUgcG9saWNpZXMgaW4gaXRzIG1ldGFkYXRhXG4gKiB0aGF0IG92ZXJyaWRlIG9yIHJlc3RyaWN0IHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwb2xpY2llcy5cbiAqXG4gKiBQb2xpY3kgUmVzb2x1dGlvbiBPcmRlcjpcbiAqIDEuIEFjdGl2ZSBlbGVtZW50IGRlbnkgbGlzdCAoaGlnaGVzdCBwcmlvcml0eSAtIGJsb2NrcyBvcGVyYXRpb24pXG4gKiAyLiBBY3RpdmUgZWxlbWVudCBjb25maXJtIGxpc3QgKHJlcXVpcmVzIGNvbmZpcm1hdGlvbilcbiAqIDMuIEFjdGl2ZSBlbGVtZW50IGFsbG93IGxpc3QgKGF1dG8tYXBwcm92ZXMpXG4gKiA0LiBPcGVyYXRpb24gZGVmYXVsdCBwZXJtaXNzaW9uIChmYWxsYmFjaylcbiAqL1xuXG5pbXBvcnQge1xuICBQZXJtaXNzaW9uTGV2ZWwsXG4gIHR5cGUgRWxlbWVudEdhdGVrZWVwZXJQb2xpY3ksXG4gIHR5cGUgQ2xpQXBwcm92YWxQb2xpY3ksXG4gIHR5cGUgR2F0ZWtlZXBlckRlY2lzaW9uLFxuICBHYXRla2VlcGVyRXJyb3JDb2RlLFxufSBmcm9tICcuLi9HYXRla2VlcGVyVHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFBlcm1pc3Npb25MZXZlbCwgY2FuT3BlcmF0aW9uQmVFbGV2YXRlZCwgZ2V0T3BlcmF0aW9uUG9saWN5IH0gZnJvbSAnLi9PcGVyYXRpb25Qb2xpY2llcy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IE1BWF9HTE9CX1BBVFRFUk5fTEVOR1RIIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcGF0dGVybk1hdGNoZXIuanMnO1xuXG4vKipcbiAqIE1ldGFkYXRhIHN0cnVjdHVyZSBmb3IgZWxlbWVudHMgd2l0aCBHYXRla2VlcGVyIHBvbGljaWVzLlxuICogVGhlICdnYXRla2VlcGVyJyBmaWVsZCBpcyBvcHRpb25hbCBhbmQgY29udGFpbnMgcG9saWN5IGRlZmluaXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRNZXRhZGF0YVdpdGhQb2xpY3kge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBnYXRla2VlcGVyPzogRWxlbWVudEdhdGVrZWVwZXJQb2xpY3k7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKlxuICogQWN0aXZlIGVsZW1lbnQgZm9yIHBvbGljeSBldmFsdWF0aW9uLlxuICogUmVwcmVzZW50cyBhbiBlbGVtZW50IGN1cnJlbnRseSBhY3RpdmUgaW4gdGhlIHNlc3Npb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlRWxlbWVudCB7XG4gIHR5cGU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBtZXRhZGF0YTogRWxlbWVudE1ldGFkYXRhV2l0aFBvbGljeTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgZWxlbWVudCBwb2xpY3kgcmVzb2x1dGlvbi5cbiAqIENvbnRhaW5zIHRoZSBlZmZlY3RpdmUgcGVybWlzc2lvbiBsZXZlbCBhbmQgcG9saWN5IHNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50UG9saWN5UmVzdWx0IHtcbiAgLyoqIEVmZmVjdGl2ZSBwZXJtaXNzaW9uIGxldmVsIGFmdGVyIGVsZW1lbnQgcG9saWN5IGFwcGxpY2F0aW9uICovXG4gIHBlcm1pc3Npb25MZXZlbDogUGVybWlzc2lvbkxldmVsO1xuICAvKiogV2hpY2ggZWxlbWVudCdzIHBvbGljeSBkZXRlcm1pbmVkIHRoaXMgcmVzdWx0ICovXG4gIHNvdXJjZUVsZW1lbnQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3BlY2lmaWMgcG9saWN5IGZpZWxkIHRoYXQgbWF0Y2hlZCAoYWxsb3cvY29uZmlybS9kZW55KSAqL1xuICBtYXRjaGVkUG9saWN5PzogJ2FsbG93JyB8ICdjb25maXJtJyB8ICdkZW55JyB8ICdzY29wZV9yZXN0cmljdGlvbic7XG4gIC8qKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIGJsb2NrZWQgYnkgc2NvcGUgcmVzdHJpY3Rpb25zICovXG4gIHNjb3BlQmxvY2tlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbGVtZW50cyB0aGF0IHdhbnRlZCB0byBhdXRvLWFwcHJvdmUgdGhpcyBvcGVyYXRpb24gYnV0IHdlcmUgb3ZlcnJpZGRlblxuICAgKiBieSBhIGhpZ2hlci1wcmlvcml0eSBjb25maXJtIG9yIGRlbnkgcG9saWN5IGZyb20gYW5vdGhlciBlbGVtZW50LlxuICAgKiBJc3N1ZSAjNjc0OiBhbGxvdyBjYW5ub3Qgb3ZlcnJpZGUgY29uZmlybS5cbiAgICovXG4gIGNvbmZsaWN0aW5nRWxlbWVudHM/OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgd2FudGVkTGV2ZWw6IFBlcm1pc3Npb25MZXZlbCB9Pjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlZmZlY3RpdmUgcGVybWlzc2lvbiBsZXZlbCBmb3IgYW4gb3BlcmF0aW9uXG4gKiBjb25zaWRlcmluZyBhbGwgYWN0aXZlIGVsZW1lbnRzIGFuZCB0aGVpciBwb2xpY2llcy5cbiAqXG4gKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiB0byBjaGVja1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnRzIC0gQ3VycmVudGx5IGFjdGl2ZSBlbGVtZW50cyB3aXRoIHRoZWlyIG1ldGFkYXRhXG4gKiBAcGFyYW0gdGFyZ2V0RWxlbWVudFR5cGUgLSBPcHRpb25hbCBlbGVtZW50IHR5cGUgYmVpbmcgb3BlcmF0ZWQgb25cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBwb2xpY3kgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRWxlbWVudFBvbGljeShcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIGFjdGl2ZUVsZW1lbnRzOiBBY3RpdmVFbGVtZW50W10sXG4gIHRhcmdldEVsZW1lbnRUeXBlPzogc3RyaW5nXG4pOiBFbGVtZW50UG9saWN5UmVzdWx0IHtcbiAgLy8gU3RhcnQgd2l0aCB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGVybWlzc2lvbiBsZXZlbFxuICBsZXQgZWZmZWN0aXZlTGV2ZWwgPSBnZXREZWZhdWx0UGVybWlzc2lvbkxldmVsKG9wZXJhdGlvbik7XG4gIGxldCBzb3VyY2VFbGVtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBtYXRjaGVkUG9saWN5OiBFbGVtZW50UG9saWN5UmVzdWx0WydtYXRjaGVkUG9saWN5J107XG4gIGxldCBzY29wZUJsb2NrZWQgPSBmYWxzZTtcbiAgLy8gSXNzdWUgIzY3NDogVHJhY2sgd2hldGhlciBDT05GSVJNIHdhcyBzZXQgYnkgYW4gZWxlbWVudCBwb2xpY3kgKG5vdCBqdXN0IHRoZSByb3V0ZSBkZWZhdWx0KVxuICAvLyBhbGxvdyBjYW4gb3ZlcnJpZGUgdGhlIHJvdXRlIGRlZmF1bHQgYnV0IE5PVCBhbm90aGVyIGVsZW1lbnQncyBjb25maXJtIHBvbGljeVxuICBsZXQgY29uZmlybWVkQnlFbGVtZW50ID0gZmFsc2U7XG4gIC8vIFRyYWNrIGVsZW1lbnRzIHRoYXQgd2FudGVkIGFsbG93IGJ1dCB3ZXJlIG92ZXJyaWRkZW4gYnkgYW4gZWxlbWVudC1zZXQgY29uZmlybS9kZW55XG4gIGNvbnN0IGNvbmZsaWN0aW5nRWxlbWVudHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB3YW50ZWRMZXZlbDogUGVybWlzc2lvbkxldmVsIH0+ID0gW107XG5cbiAgLy8gQ2hlY2sgZWFjaCBhY3RpdmUgZWxlbWVudCdzIHBvbGljeSBpbiBvcmRlclxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWN0aXZlRWxlbWVudHMpIHtcbiAgICBjb25zdCBwb2xpY3kgPSBlbGVtZW50Lm1ldGFkYXRhLmdhdGVrZWVwZXI7XG4gICAgaWYgKCFwb2xpY3kpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIDEuIENoZWNrIGRlbnkgbGlzdCBmaXJzdCAoaGlnaGVzdCBwcmlvcml0eSlcbiAgICBpZiAocG9saWN5LmRlbnk/LmluY2x1ZGVzKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBlcm1pc3Npb25MZXZlbDogUGVybWlzc2lvbkxldmVsLkRFTlksXG4gICAgICAgIHNvdXJjZUVsZW1lbnQ6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgbWF0Y2hlZFBvbGljeTogJ2RlbnknLFxuICAgICAgICBjb25mbGljdGluZ0VsZW1lbnRzOiBjb25mbGljdGluZ0VsZW1lbnRzLmxlbmd0aCA+IDAgPyBjb25mbGljdGluZ0VsZW1lbnRzIDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAyLiBDaGVjayBzY29wZSByZXN0cmljdGlvbnNcbiAgICBpZiAodGFyZ2V0RWxlbWVudFR5cGUgJiYgcG9saWN5LnNjb3BlUmVzdHJpY3Rpb25zKSB7XG4gICAgICBjb25zdCB7IGFsbG93ZWRUeXBlcywgYmxvY2tlZFR5cGVzIH0gPSBwb2xpY3kuc2NvcGVSZXN0cmljdGlvbnM7XG5cbiAgICAgIC8vIElmIGFsbG93ZWRUeXBlcyBpcyBzcGVjaWZpZWQsIHRhcmdldCBtdXN0IGJlIGluIHRoZSBsaXN0XG4gICAgICBpZiAoYWxsb3dlZFR5cGVzICYmICFhbGxvd2VkVHlwZXMuaW5jbHVkZXModGFyZ2V0RWxlbWVudFR5cGUpKSB7XG4gICAgICAgIHNjb3BlQmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHNvdXJjZUVsZW1lbnQgPSBlbGVtZW50Lm5hbWU7XG4gICAgICAgIG1hdGNoZWRQb2xpY3kgPSAnc2NvcGVfcmVzdHJpY3Rpb24nO1xuICAgICAgICBjb250aW51ZTsgLy8gQ2hlY2sgb3RoZXIgZWxlbWVudHMsIG1pZ2h0IGhhdmUgZGlmZmVyZW50IHBvbGljeVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBibG9ja2VkVHlwZXMgaXMgc3BlY2lmaWVkLCB0YXJnZXQgbXVzdCBOT1QgYmUgaW4gdGhlIGxpc3RcbiAgICAgIGlmIChibG9ja2VkVHlwZXM/LmluY2x1ZGVzKHRhcmdldEVsZW1lbnRUeXBlKSkge1xuICAgICAgICBzY29wZUJsb2NrZWQgPSB0cnVlO1xuICAgICAgICBzb3VyY2VFbGVtZW50ID0gZWxlbWVudC5uYW1lO1xuICAgICAgICBtYXRjaGVkUG9saWN5ID0gJ3Njb3BlX3Jlc3RyaWN0aW9uJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gQ2hlY2sgY29uZmlybSBsaXN0IChyZXF1aXJlcyBjb25maXJtYXRpb24pXG4gICAgaWYgKHBvbGljeS5jb25maXJtPy5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAvLyBEb24ndCBkb3duZ3JhZGUgZnJvbSBERU5ZIG9yIENPTkZJUk1fU0lOR0xFX1VTRVxuICAgICAgaWYgKGVmZmVjdGl2ZUxldmVsICE9PSBQZXJtaXNzaW9uTGV2ZWwuREVOWSkge1xuICAgICAgICBlZmZlY3RpdmVMZXZlbCA9IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NFU1NJT047XG4gICAgICAgIGNvbmZpcm1lZEJ5RWxlbWVudCA9IHRydWU7XG4gICAgICAgIHNvdXJjZUVsZW1lbnQgPSBlbGVtZW50Lm5hbWU7XG4gICAgICAgIG1hdGNoZWRQb2xpY3kgPSAnY29uZmlybSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gQ2hlY2sgYWxsb3cgbGlzdCAoYXV0by1hcHByb3ZlcylcbiAgICAvLyBJc3N1ZSAjNjc0OiBhbGxvdyBDQU4gb3ZlcnJpZGUgdGhlIHJvdXRlIGRlZmF1bHQsIGJ1dCBOT1QgYW5vdGhlciBlbGVtZW50J3MgY29uZmlybSBwb2xpY3kuXG4gICAgLy8gUHJpb3JpdHkgaGllcmFyY2h5OiBlbGVtZW50IGRlbnkgPiBlbGVtZW50IGNvbmZpcm0gPiBlbGVtZW50IGFsbG93ID4gcm91dGUgZGVmYXVsdFxuICAgIGlmIChwb2xpY3kuYWxsb3c/LmluY2x1ZGVzKG9wZXJhdGlvbikpIHtcbiAgICAgIC8vIE9ubHkgZWxldmF0ZSBpZiB0aGUgb3BlcmF0aW9uIGFsbG93cyBlbGV2YXRpb25cbiAgICAgIGlmIChjYW5PcGVyYXRpb25CZUVsZXZhdGVkKG9wZXJhdGlvbikpIHtcbiAgICAgICAgaWYgKCFjb25maXJtZWRCeUVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBObyBlbGVtZW50IGhhcyBjb25maXJtZWQgdGhpcyDigJQgc2FmZSB0byBlbGV2YXRlIChvdmVycmlkZXMgcm91dGUgZGVmYXVsdClcbiAgICAgICAgICBlZmZlY3RpdmVMZXZlbCA9IFBlcm1pc3Npb25MZXZlbC5BVVRPX0FQUFJPVkU7XG4gICAgICAgICAgc291cmNlRWxlbWVudCA9IGVsZW1lbnQubmFtZTtcbiAgICAgICAgICBtYXRjaGVkUG9saWN5ID0gJ2FsbG93JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBbm90aGVyIGVsZW1lbnQncyBjb25maXJtIHBvbGljeSB0YWtlcyBwcmlvcml0eSBvdmVyIHRoaXMgYWxsb3dcbiAgICAgICAgICBjb25mbGljdGluZ0VsZW1lbnRzLnB1c2goeyBuYW1lOiBlbGVtZW50Lm5hbWUsIHdhbnRlZExldmVsOiBQZXJtaXNzaW9uTGV2ZWwuQVVUT19BUFBST1ZFIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgc2NvcGUgd2FzIGJsb2NrZWQgYnkgYWxsIGVsZW1lbnRzIHdpdGggcmVzdHJpY3Rpb25zXG4gIGlmIChzY29wZUJsb2NrZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVybWlzc2lvbkxldmVsOiBQZXJtaXNzaW9uTGV2ZWwuREVOWSxcbiAgICAgIHNvdXJjZUVsZW1lbnQsXG4gICAgICBtYXRjaGVkUG9saWN5OiAnc2NvcGVfcmVzdHJpY3Rpb24nLFxuICAgICAgc2NvcGVCbG9ja2VkOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBlcm1pc3Npb25MZXZlbDogZWZmZWN0aXZlTGV2ZWwsXG4gICAgc291cmNlRWxlbWVudCxcbiAgICBtYXRjaGVkUG9saWN5LFxuICAgIGNvbmZsaWN0aW5nRWxlbWVudHM6IGNvbmZsaWN0aW5nRWxlbWVudHMubGVuZ3RoID4gMCA/IGNvbmZsaWN0aW5nRWxlbWVudHMgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgR2F0ZWtlZXBlciBkZWNpc2lvbiBmcm9tIGVsZW1lbnQgcG9saWN5IHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gdGhhdCB3YXMgY2hlY2tlZFxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSBlbGVtZW50IHBvbGljeSByZXNvbHV0aW9uIHJlc3VsdFxuICogQHBhcmFtIHRhcmdldEVsZW1lbnRUeXBlIC0gT3B0aW9uYWwgZWxlbWVudCB0eXBlIGJlaW5nIG9wZXJhdGVkIG9uXG4gKiBAcmV0dXJucyBBIEdhdGVrZWVwZXJEZWNpc2lvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlY2lzaW9uRnJvbVBvbGljeShcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIHJlc3VsdDogRWxlbWVudFBvbGljeVJlc3VsdCxcbiAgdGFyZ2V0RWxlbWVudFR5cGU/OiBzdHJpbmdcbik6IEdhdGVrZWVwZXJEZWNpc2lvbiB7XG4gIGNvbnN0IHsgcGVybWlzc2lvbkxldmVsLCBzb3VyY2VFbGVtZW50LCBzY29wZUJsb2NrZWQsIGNvbmZsaWN0aW5nRWxlbWVudHMgfSA9IHJlc3VsdDtcblxuICAvLyBIYW5kbGUgREVOWVxuICBpZiAocGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuREVOWSkge1xuICAgIGlmIChzY29wZUJsb2NrZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgICBwZXJtaXNzaW9uTGV2ZWwsXG4gICAgICAgIGVycm9yQ29kZTogR2F0ZWtlZXBlckVycm9yQ29kZS5TQ09QRV9SRVNUUklDVElPTixcbiAgICAgICAgcmVhc29uOiBgT3BlcmF0aW9uIFwiJHtvcGVyYXRpb259XCIgaXMgbm90IGFsbG93ZWQgb24gZWxlbWVudCB0eXBlIFwiJHt0YXJnZXRFbGVtZW50VHlwZX1cIiBkdWUgdG8gc2NvcGUgcmVzdHJpY3Rpb25zIGluIGFjdGl2ZSBlbGVtZW50IFwiJHtzb3VyY2VFbGVtZW50fVwiYCxcbiAgICAgICAgc3VnZ2VzdGlvbjogYERlYWN0aXZhdGUgdGhlIGVsZW1lbnQgXCIke3NvdXJjZUVsZW1lbnR9XCIgb3IgdXNlIGEgZGlmZmVyZW50IGVsZW1lbnQgdHlwZWAsXG4gICAgICAgIHBvbGljeVNvdXJjZTogJ2VsZW1lbnRfcG9saWN5JyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgcGVybWlzc2lvbkxldmVsLFxuICAgICAgZXJyb3JDb2RlOiBHYXRla2VlcGVyRXJyb3JDb2RlLkVMRU1FTlRfUE9MSUNZX1ZJT0xBVElPTixcbiAgICAgIHJlYXNvbjogYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGlzIGJsb2NrZWQgYnkgYWN0aXZlIGVsZW1lbnQgXCIke3NvdXJjZUVsZW1lbnR9XCIncyBkZW55IHBvbGljeWAsXG4gICAgICBzdWdnZXN0aW9uOiBgRGVhY3RpdmF0ZSB0aGUgZWxlbWVudCBcIiR7c291cmNlRWxlbWVudH1cIiB0byBwcm9jZWVkIHdpdGggdGhpcyBvcGVyYXRpb25gLFxuICAgICAgcG9saWN5U291cmNlOiAnZWxlbWVudF9wb2xpY3knLFxuICAgIH07XG4gIH1cblxuICAvLyBIYW5kbGUgY29uZmlybWF0aW9uIHJlcXVpcmVkXG4gIGlmIChcbiAgICBwZXJtaXNzaW9uTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NFU1NJT04gfHxcbiAgICBwZXJtaXNzaW9uTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0VcbiAgKSB7XG4gICAgLy8gQnVpbGQgaHVtYW4tcmVhZGFibGUgcmF0aW9uYWxlIGV4cGxhaW5pbmcgV0hZIGNvbmZpcm1hdGlvbiBpcyBuZWVkZWRcbiAgICBjb25zdCBwb2xpY3kgPSBnZXRPcGVyYXRpb25Qb2xpY3kob3BlcmF0aW9uKTtcbiAgICBjb25zdCBsZXZlbExhYmVsID0gcGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFXG4gICAgICA/ICdyZXF1aXJlcyBjb25maXJtYXRpb24gZWFjaCB0aW1lJ1xuICAgICAgOiAncmVxdWlyZXMgY29uZmlybWF0aW9uIG9uY2UgcGVyIHNlc3Npb24nO1xuXG4gICAgbGV0IHJhdGlvbmFsZTogc3RyaW5nO1xuICAgIGlmIChzb3VyY2VFbGVtZW50ICYmIHJlc3VsdC5tYXRjaGVkUG9saWN5ID09PSAnY29uZmlybScpIHtcbiAgICAgIC8vIEVsZW1lbnQgcG9saWN5IGVsZXZhdGVkIHRoaXMgb3BlcmF0aW9uJ3MgY29uZmlybWF0aW9uIHJlcXVpcmVtZW50XG4gICAgICBjb25zdCBwb2xpY3lEZXRhaWwgPSBwb2xpY3k/LnJhdGlvbmFsZSA/IGAgJHtwb2xpY3kucmF0aW9uYWxlfWAgOiAnJztcbiAgICAgIHJhdGlvbmFsZSA9IGBBY3RpdmUgZWxlbWVudCBcIiR7c291cmNlRWxlbWVudH1cIiBwb2xpY3kgcmVxdWlyZXMgY29uZmlybWF0aW9uIGZvciB0aGlzIG9wZXJhdGlvbi4ke3BvbGljeURldGFpbH1gO1xuICAgIH0gZWxzZSBpZiAocG9saWN5Py5yYXRpb25hbGUpIHtcbiAgICAgIC8vIFJvdXRlLWxldmVsIGRlZmF1bHQgd2l0aCBkb2N1bWVudGVkIHJhdGlvbmFsZVxuICAgICAgcmF0aW9uYWxlID0gcG9saWN5LnJhdGlvbmFsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW5kcG9pbnQtbGV2ZWwgZGVmYXVsdCwgbm8gc3BlY2lmaWMgcmF0aW9uYWxlXG4gICAgICByYXRpb25hbGUgPSAnVGhpcyBvcGVyYXRpb24gbW9kaWZpZXMgZGF0YSBhbmQgcmVxdWlyZXMgaHVtYW4gYXBwcm92YWwgYmVmb3JlIHByb2NlZWRpbmcnO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM2NzQ6IFN1cmZhY2UgZWxlbWVudHMgdGhhdCB3YW50ZWQgdG8gYXV0by1hcHByb3ZlIGJ1dCB3ZXJlIG92ZXJyaWRkZW5cbiAgICBjb25zdCBjb25mbGljdE5vdGUgPSBjb25mbGljdGluZ0VsZW1lbnRzICYmIGNvbmZsaWN0aW5nRWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgPyBgIChOb3RlOiAke2NvbmZsaWN0aW5nRWxlbWVudHMubWFwKGUgPT4gYFwiJHtlLm5hbWV9XCJgKS5qb2luKCcsICcpfSB3b3VsZCBhdXRvLWFwcHJvdmUgdGhpcyBidXQgJHtjb25mbGljdGluZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMSA/ICdpcycgOiAnYXJlJ30gb3ZlcnJpZGRlbiBieSB0aGUgY29uZmlybSBwb2xpY3kuKWBcbiAgICAgIDogJyc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWxsb3dlZDogZmFsc2UsXG4gICAgICBwZXJtaXNzaW9uTGV2ZWwsXG4gICAgICBlcnJvckNvZGU6IEdhdGVrZWVwZXJFcnJvckNvZGUuQ09ORklSTUFUSU9OX1JFUVVJUkVELFxuICAgICAgcmVhc29uOiBgT3BlcmF0aW9uIFwiJHtvcGVyYXRpb259XCIgJHtsZXZlbExhYmVsfS4gJHtyYXRpb25hbGV9JHtjb25mbGljdE5vdGV9YCxcbiAgICAgIHN1Z2dlc3Rpb246ICdVc2UgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgdG8gYXBwcm92ZSB0aGlzIG9wZXJhdGlvbicsXG4gICAgICBjb25maXJtYXRpb25QZW5kaW5nOiB0cnVlLFxuICAgICAgcG9saWN5U291cmNlOiBzb3VyY2VFbGVtZW50ID8gJ2VsZW1lbnRfcG9saWN5JyA6ICdvcGVyYXRpb25fZGVmYXVsdCcsXG4gICAgfTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBBVVRPX0FQUFJPVkVcbiAgcmV0dXJuIHtcbiAgICBhbGxvd2VkOiB0cnVlLFxuICAgIHBlcm1pc3Npb25MZXZlbCxcbiAgICByZWFzb246IHNvdXJjZUVsZW1lbnRcbiAgICAgID8gYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGF1dG8tYXBwcm92ZWQgYnkgZWxlbWVudCBcIiR7c291cmNlRWxlbWVudH1cImBcbiAgICAgIDogYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGF1dG8tYXBwcm92ZWQgYnkgZGVmYXVsdCBwb2xpY3lgLFxuICAgIHBvbGljeVNvdXJjZTogc291cmNlRWxlbWVudCA/ICdlbGVtZW50X3BvbGljeScgOiAnb3BlcmF0aW9uX2RlZmF1bHQnLFxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBhIEdhdGVrZWVwZXIgcG9saWN5IGZyb20gZWxlbWVudCBtZXRhZGF0YS5cbiAqXG4gKiBAcGFyYW0gbWV0YWRhdGEgLSBUaGUgZWxlbWVudCBtZXRhZGF0YSB0byBwYXJzZVxuICogQHJldHVybnMgVGhlIHBhcnNlZCBwb2xpY3ksIG9yIHVuZGVmaW5lZCBpZiBubyBwb2xpY3kgaXMgZGVmaW5lZFxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcG9saWN5IGlzIG1hbGZvcm1lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFbGVtZW50UG9saWN5KFxuICBtZXRhZGF0YTogdW5rbm93blxuKTogRWxlbWVudEdhdGVrZWVwZXJQb2xpY3kgfCB1bmRlZmluZWQge1xuICBpZiAoIW1ldGFkYXRhIHx8IHR5cGVvZiBtZXRhZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgbWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBnYXRla2VlcGVyID0gbWV0YS5nYXRla2VlcGVyO1xuXG4gIGlmICghZ2F0ZWtlZXBlcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGdhdGVrZWVwZXIgIT09ICdvYmplY3QnIHx8IGdhdGVrZWVwZXIgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZ2F0ZWtlZXBlciBwb2xpY3k6IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCBwb2xpY3kgPSBnYXRla2VlcGVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8vIFZhbGlkYXRlIGFuZCBleHRyYWN0IGFsbG93IGxpc3RcbiAgY29uc3QgYWxsb3cgPSB2YWxpZGF0ZVN0cmluZ0FycmF5KHBvbGljeS5hbGxvdywgJ2FsbG93Jyk7XG4gIGNvbnN0IGNvbmZpcm0gPSB2YWxpZGF0ZVN0cmluZ0FycmF5KHBvbGljeS5jb25maXJtLCAnY29uZmlybScpO1xuICBjb25zdCBkZW55ID0gdmFsaWRhdGVTdHJpbmdBcnJheShwb2xpY3kuZGVueSwgJ2RlbnknKTtcblxuICAvLyBWYWxpZGF0ZSBzY29wZSByZXN0cmljdGlvbnNcbiAgbGV0IHNjb3BlUmVzdHJpY3Rpb25zOiBFbGVtZW50R2F0ZWtlZXBlclBvbGljeVsnc2NvcGVSZXN0cmljdGlvbnMnXTtcbiAgaWYgKHBvbGljeS5zY29wZVJlc3RyaWN0aW9ucykge1xuICAgIGlmICh0eXBlb2YgcG9saWN5LnNjb3BlUmVzdHJpY3Rpb25zICE9PSAnb2JqZWN0JyB8fCBwb2xpY3kuc2NvcGVSZXN0cmljdGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogc2NvcGVSZXN0cmljdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3Qgc3IgPSBwb2xpY3kuc2NvcGVSZXN0cmljdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgc2NvcGVSZXN0cmljdGlvbnMgPSB7XG4gICAgICBhbGxvd2VkVHlwZXM6IHZhbGlkYXRlU3RyaW5nQXJyYXkoc3IuYWxsb3dlZFR5cGVzLCAnc2NvcGVSZXN0cmljdGlvbnMuYWxsb3dlZFR5cGVzJyksXG4gICAgICBibG9ja2VkVHlwZXM6IHZhbGlkYXRlU3RyaW5nQXJyYXkoc3IuYmxvY2tlZFR5cGVzLCAnc2NvcGVSZXN0cmljdGlvbnMuYmxvY2tlZFR5cGVzJyksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGV4dGVybmFsIHJlc3RyaWN0aW9ucyAoSXNzdWUgIzYyNSBQaGFzZSAyKVxuICBsZXQgZXh0ZXJuYWxSZXN0cmljdGlvbnM6IEVsZW1lbnRHYXRla2VlcGVyUG9saWN5WydleHRlcm5hbFJlc3RyaWN0aW9ucyddO1xuICBpZiAocG9saWN5LmV4dGVybmFsUmVzdHJpY3Rpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBwb2xpY3kuZXh0ZXJuYWxSZXN0cmljdGlvbnMgIT09ICdvYmplY3QnIHx8IHBvbGljeS5leHRlcm5hbFJlc3RyaWN0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCBlciA9IHBvbGljeS5leHRlcm5hbFJlc3RyaWN0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoIWVyLmRlc2NyaXB0aW9uIHx8IHR5cGVvZiBlci5kZXNjcmlwdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogZXh0ZXJuYWxSZXN0cmljdGlvbnMuZGVzY3JpcHRpb24gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIGNvbnN0IGRlbnlQYXR0ZXJucyA9IHZhbGlkYXRlU3RyaW5nQXJyYXkoZXIuZGVueVBhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuZGVueVBhdHRlcm5zJyk7XG4gICAgY29uc3QgY29uZmlybVBhdHRlcm5zID0gdmFsaWRhdGVTdHJpbmdBcnJheShlci5jb25maXJtUGF0dGVybnMsICdleHRlcm5hbFJlc3RyaWN0aW9ucy5jb25maXJtUGF0dGVybnMnKTtcbiAgICBjb25zdCBhbGxvd1BhdHRlcm5zID0gdmFsaWRhdGVTdHJpbmdBcnJheShlci5hbGxvd1BhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuYWxsb3dQYXR0ZXJucycpO1xuICAgIGlmIChkZW55UGF0dGVybnMpIHZhbGlkYXRlUGF0dGVyblN0cmluZ3MoZGVueVBhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuZGVueVBhdHRlcm5zJyk7XG4gICAgaWYgKGNvbmZpcm1QYXR0ZXJucykgdmFsaWRhdGVQYXR0ZXJuU3RyaW5ncyhjb25maXJtUGF0dGVybnMsICdleHRlcm5hbFJlc3RyaWN0aW9ucy5jb25maXJtUGF0dGVybnMnKTtcbiAgICBpZiAoYWxsb3dQYXR0ZXJucykgdmFsaWRhdGVQYXR0ZXJuU3RyaW5ncyhhbGxvd1BhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuYWxsb3dQYXR0ZXJucycpO1xuICAgIC8vIFZhbGlkYXRlIGFwcHJvdmFsUG9saWN5IChJc3N1ZSAjNjI1IFBoYXNlIDMpXG4gICAgbGV0IGFwcHJvdmFsUG9saWN5OiBDbGlBcHByb3ZhbFBvbGljeSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoZXIuYXBwcm92YWxQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBlci5hcHByb3ZhbFBvbGljeSAhPT0gJ29iamVjdCcgfHwgZXIuYXBwcm92YWxQb2xpY3kgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgYXAgPSBlci5hcHByb3ZhbFBvbGljeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZUFwcHJvdmFsXG4gICAgICBsZXQgcmVxdWlyZUFwcHJvdmFsOiAoJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFwLnJlcXVpcmVBcHByb3ZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcC5yZXF1aXJlQXBwcm92YWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS5yZXF1aXJlQXBwcm92YWwgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbGlkTGV2ZWxzID0gbmV3IFNldChbJ21vZGVyYXRlJywgJ2Rhbmdlcm91cyddKTtcbiAgICAgICAgZm9yIChjb25zdCBsZXZlbCBvZiBhcC5yZXF1aXJlQXBwcm92YWwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsICE9PSAnc3RyaW5nJyB8fCAhdmFsaWRMZXZlbHMuaGFzKGxldmVsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS5yZXF1aXJlQXBwcm92YWwgY29udGFpbnMgaW52YWxpZCB2YWx1ZSBcIiR7bGV2ZWx9XCIuIE11c3QgYmUgXCJtb2RlcmF0ZVwiIG9yIFwiZGFuZ2Vyb3VzXCIuYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcXVpcmVBcHByb3ZhbCA9IGFwLnJlcXVpcmVBcHByb3ZhbCBhcyAoJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKVtdO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBkZWZhdWx0U2NvcGVcbiAgICAgIGxldCBkZWZhdWx0U2NvcGU6ICdzaW5nbGUnIHwgJ3Rvb2xfc2Vzc2lvbicgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXAuZGVmYXVsdFNjb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFwLmRlZmF1bHRTY29wZSAhPT0gJ3NpbmdsZScgJiYgYXAuZGVmYXVsdFNjb3BlICE9PSAndG9vbF9zZXNzaW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogZXh0ZXJuYWxSZXN0cmljdGlvbnMuYXBwcm92YWxQb2xpY3kuZGVmYXVsdFNjb3BlIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcInRvb2xfc2Vzc2lvblwiLCBnb3QgXCIke2FwLmRlZmF1bHRTY29wZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHRTY29wZSA9IGFwLmRlZmF1bHRTY29wZTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdHRsU2Vjb25kc1xuICAgICAgbGV0IHR0bFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChhcC50dGxTZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcC50dGxTZWNvbmRzICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzRmluaXRlKGFwLnR0bFNlY29uZHMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXAudHRsU2Vjb25kcyA8IDMwIHx8IGFwLnR0bFNlY29uZHMgPiAzNjAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzIG11c3QgYmUgYmV0d2VlbiAzMCBhbmQgMzYwMCwgZ290ICR7YXAudHRsU2Vjb25kc31gKTtcbiAgICAgICAgfVxuICAgICAgICB0dGxTZWNvbmRzID0gYXAudHRsU2Vjb25kcztcbiAgICAgIH1cblxuICAgICAgYXBwcm92YWxQb2xpY3kgPSB7IHJlcXVpcmVBcHByb3ZhbCwgZGVmYXVsdFNjb3BlLCB0dGxTZWNvbmRzIH07XG4gICAgfVxuXG4gICAgZXh0ZXJuYWxSZXN0cmljdGlvbnMgPSB7XG4gICAgICBkZXNjcmlwdGlvbjogZXIuZGVzY3JpcHRpb24gYXMgc3RyaW5nLFxuICAgICAgZGVueVBhdHRlcm5zLFxuICAgICAgY29uZmlybVBhdHRlcm5zLFxuICAgICAgYWxsb3dQYXR0ZXJucyxcbiAgICAgIGFwcHJvdmFsUG9saWN5LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFsbG93LFxuICAgIGNvbmZpcm0sXG4gICAgZGVueSxcbiAgICBzY29wZVJlc3RyaWN0aW9ucyxcbiAgICBleHRlcm5hbFJlc3RyaWN0aW9ucyxcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgdmFsdWUgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSBmaWVsZE5hbWUgLSBUaGUgZmllbGQgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXNcbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgYXJyYXksIG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZ0FycmF5KFxuICB2YWx1ZTogdW5rbm93bixcbiAgZmllbGROYW1lOiBzdHJpbmdcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogJHtmaWVsZE5hbWV9IG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgfVxuXG4gIGlmICghdmFsdWUuZXZlcnkoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiAke2ZpZWxkTmFtZX0gbXVzdCBjb250YWluIG9ubHkgc3RyaW5nc2ApO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHBhdHRlcm4gc3RyaW5ncyBmb3IgbGVuZ3RoIGFuZCBub24tZW1wdGluZXNzLlxuICpcbiAqIEBwYXJhbSBwYXR0ZXJucyAtIEFycmF5IG9mIHBhdHRlcm4gc3RyaW5ncyB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIEZpZWxkIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFueSBwYXR0ZXJuIGlzIGVtcHR5IG9yIGV4Y2VlZHMgTUFYX0dMT0JfUEFUVEVSTl9MRU5HVEhcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJuU3RyaW5ncyhcbiAgcGF0dGVybnM6IHN0cmluZ1tdLFxuICBmaWVsZE5hbWU6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIGlmICghcGF0dGVybikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiAke2ZpZWxkTmFtZX0gY29udGFpbnMgYW4gZW1wdHkgcGF0dGVybiBzdHJpbmdgKTtcbiAgICB9XG4gICAgaWYgKHBhdHRlcm4ubGVuZ3RoID4gTUFYX0dMT0JfUEFUVEVSTl9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogJHtmaWVsZE5hbWV9IHBhdHRlcm4gZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke01BWF9HTE9CX1BBVFRFUk5fTEVOR1RIfSBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogS25vd24gQ0xJIHRvb2wgbmFtZXMgdXNlZCBpbiBleHRlcm5hbFJlc3RyaWN0aW9ucyBwYXR0ZXJucy5cbiAqIFBhdHRlcm5zIHNob3VsZCBzdGFydCB3aXRoIG9uZSBvZiB0aGVzZSBmb2xsb3dlZCBieSAnOicgdG8gYmUgZWZmZWN0aXZlLlxuICovXG5jb25zdCBLTk9XTl9UT09MX1BSRUZJWEVTID0gbmV3IFNldChbXG4gICdCYXNoJywgJ0VkaXQnLCAnV3JpdGUnLCAnUmVhZCcsICdHbG9iJywgJ0dyZXAnLFxuICAnV2ViRmV0Y2gnLCAnV2ViU2VhcmNoJywgJ05vdGVib29rRWRpdCcsXG5dKTtcblxuLyoqXG4gKiBSZWdleCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBubyBtZWFuaW5nIGluIGdsb2Igc3ludGF4LlxuICogVXNlcnMgd2hvIGluY2x1ZGUgdGhlc2UgbGlrZWx5IGludGVuZCByZWdleCBidXQgdGhlIG1hdGNoZXIgb25seSBzdXBwb3J0cyAqIGFuZCA/LlxuICovXG5jb25zdCBSRUdFWF9TWU5UQVhfUEFUVEVSTiA9IC9bfCgpe31bXFxdXFxcXCteJF0vO1xuXG4vKipcbiAqIEFuYWx5emUgZXh0ZXJuYWxSZXN0cmljdGlvbnMgcGF0dGVybnMgZm9yIGNvbW1vbiBtaXN0YWtlcyBhbmQgc3VzcGljaW91cyBzeW50YXguXG4gKlxuICogUmV0dXJucyBub24tZmF0YWwgd2FybmluZ3MgdG8gaGVscCBMTE1zIGFuZCB1c2VycyB3cml0ZSBlZmZlY3RpdmUgcGF0dGVybnMuXG4gKiBEb2VzIE5PVCB0aHJvdyDigJQgdmFsaWRhdGlvbiBlcnJvcnMgYXJlIGhhbmRsZWQgYnkge0BsaW5rIHZhbGlkYXRlUGF0dGVyblN0cmluZ3N9LlxuICpcbiAqIENoZWNrcyBwZXJmb3JtZWQgKElzc3VlICMxNjY0KTpcbiAqIC0gTWlzc2luZyB0b29sIHByZWZpeCAocGF0dGVybiBkb2Vzbid0IHN0YXJ0IHdpdGggVG9vbE5hbWU6KVxuICogLSBPdmVybHkgYnJvYWQgcGF0dGVybnMgKGJhcmUgYCpgIG9yIGBUb29sTmFtZToqYClcbiAqIC0gUmVnZXggc3ludGF4IHRoYXQgd29uJ3Qgd29yayBpbiBnbG9iIG1hdGNoaW5nXG4gKiAtIExlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICpcbiAqIEBwYXJhbSBwYXR0ZXJucyAtIEFycmF5IG9mIHBhdHRlcm4gc3RyaW5ncyB0byBhbmFseXplXG4gKiBAcGFyYW0gZmllbGROYW1lIC0gRmllbGQgbmFtZSBmb3Igd2FybmluZyBtZXNzYWdlc1xuICogQHJldHVybnMgQXJyYXkgb2Ygd2FybmluZyBtZXNzYWdlcyAoZW1wdHkgaWYgbm8gaXNzdWVzIGZvdW5kKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5hbHl6ZVBhdHRlcm5TeW50YXgoXG4gIHBhdHRlcm5zOiBzdHJpbmdbXSxcbiAgZmllbGROYW1lOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIGFuYWx5emVPbmVQYXR0ZXJuKHBhdHRlcm4sIGZpZWxkTmFtZSwgd2FybmluZ3MpO1xuICB9XG4gIHJldHVybiB3YXJuaW5ncztcbn1cblxuLyoqXG4gKiBBbmFseXplIGEgc2luZ2xlIHBhdHRlcm4gc3RyaW5nIGFuZCBhcHBlbmQgYW55IHdhcm5pbmdzIGZvdW5kLlxuICogRXh0cmFjdGVkIGZyb20ge0BsaW5rIGFuYWx5emVQYXR0ZXJuU3ludGF4fSB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkuXG4gKi9cbmZ1bmN0aW9uIGFuYWx5emVPbmVQYXR0ZXJuKFxuICBwYXR0ZXJuOiBzdHJpbmcsXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICB3YXJuaW5nczogc3RyaW5nW11cbik6IHZvaWQge1xuICAvLyBDaGVjayBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAgaWYgKHBhdHRlcm4gIT09IHBhdHRlcm4udHJpbSgpKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgIGAke2ZpZWxkTmFtZX0gcGF0dGVybiAnJHtwYXR0ZXJufScgaGFzIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSDigJQgdGhpcyBtYXkgcHJldmVudCBleHBlY3RlZCBtYXRjaGVzYFxuICAgICk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgYmFyZSB3aWxkY2FyZCAobWF0Y2hlcyBldmVyeXRoaW5nKVxuICBpZiAocGF0dGVybiA9PT0gJyonKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgIGAke2ZpZWxkTmFtZX0gcGF0dGVybiAnKicgbWF0Y2hlcyBldmVyeXRoaW5nIOKAlCB0aGlzIGlzIGxpa2VseSB1bmludGVudGlvbmFsYFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIHRvb2wgcHJlZml4IGFuZCByZWxhdGVkIGlzc3Vlc1xuICBjb25zdCBjb2xvbkluZGV4ID0gcGF0dGVybi5pbmRleE9mKCc6Jyk7XG4gIGlmIChjb2xvbkluZGV4ID09PSAtMSkge1xuICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICBgJHtmaWVsZE5hbWV9IHBhdHRlcm4gJyR7cGF0dGVybn0nIGhhcyBubyB0b29sIHByZWZpeCAoZS5nLiwgJ0Jhc2g6JywgJ0VkaXQ6JykuIGAgK1xuICAgICAgYFBhdHRlcm5zIGFyZSBtYXRjaGVkIGFnYWluc3QgJ1Rvb2xOYW1lOmlucHV0JyBzdHJpbmdzIGFuZCB3aWxsIG5vdCBtYXRjaCB3aXRob3V0IGEgcHJlZml4LmBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNoZWNrVG9vbFByZWZpeChwYXR0ZXJuLCBjb2xvbkluZGV4LCBmaWVsZE5hbWUsIHdhcm5pbmdzKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciByZWdleCBzeW50YXggdGhhdCB3b24ndCB3b3JrIGluIGdsb2JcbiAgY29uc3QgcmVnZXhDaGFycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGNoIG9mIHBhdHRlcm4pIHtcbiAgICBpZiAoUkVHRVhfU1lOVEFYX1BBVFRFUk4udGVzdChjaCkpIHJlZ2V4Q2hhcnMuYWRkKGNoKTtcbiAgfVxuICBpZiAocmVnZXhDaGFycy5zaXplID4gMCkge1xuICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICBgJHtmaWVsZE5hbWV9IHBhdHRlcm4gJyR7cGF0dGVybn0nIGNvbnRhaW5zIHJlZ2V4IHN5bnRheCAnJHtbLi4ucmVnZXhDaGFyc10uam9pbignLCAnKX0nIOKAlCBgICtcbiAgICAgIGBvbmx5IGdsb2Igd2lsZGNhcmRzICgqIGFuZCA/KSBhcmUgc3VwcG9ydGVkYFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayB0b29sIHByZWZpeCB2YWxpZGl0eSBhbmQgYnJvYWRuZXNzIGZvciBhIHBhdHRlcm4gdGhhdCBjb250YWlucyAnOicuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrVG9vbFByZWZpeChcbiAgcGF0dGVybjogc3RyaW5nLFxuICBjb2xvbkluZGV4OiBudW1iZXIsXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICB3YXJuaW5nczogc3RyaW5nW11cbik6IHZvaWQge1xuICBjb25zdCBwcmVmaXggPSBwYXR0ZXJuLnNsaWNlKDAsIGNvbG9uSW5kZXgpO1xuICBjb25zdCBhZnRlckNvbG9uID0gcGF0dGVybi5zbGljZShjb2xvbkluZGV4ICsgMSk7XG5cbiAgLy8gQ2hlY2sgZm9yIHVua25vd24gdG9vbCBwcmVmaXhcbiAgaWYgKCFLTk9XTl9UT09MX1BSRUZJWEVTLmhhcyhwcmVmaXgpICYmICFwcmVmaXguc3RhcnRzV2l0aCgnbWNwXycpKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgIGAke2ZpZWxkTmFtZX0gcGF0dGVybiAnJHtwYXR0ZXJufScgdXNlcyB1bmtub3duIHRvb2wgcHJlZml4ICcke3ByZWZpeH0nLiBgICtcbiAgICAgIGBLbm93biBwcmVmaXhlczogJHtbLi4uS05PV05fVE9PTF9QUkVGSVhFU10uam9pbignLCAnKX0uIE1DUCB0b29scyB1c2UgJ21jcF8nIHByZWZpeC5gXG4gICAgKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBvdmVybHkgYnJvYWQgVG9vbE5hbWU6KiBwYXR0ZXJuXG4gIGlmIChhZnRlckNvbG9uID09PSAnKicpIHtcbiAgICB3YXJuaW5ncy5wdXNoKFxuICAgICAgYCR7ZmllbGROYW1lfSBwYXR0ZXJuICcke3BhdHRlcm59JyBtYXRjaGVzIEFMTCAke3ByZWZpeH0gb3BlcmF0aW9ucyDigJQgdmVyaWZ5IHRoaXMgaXMgaW50ZW50aW9uYWxgXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhIGdhdGVrZWVwZXIgcG9saWN5IGR1cmluZyBlbGVtZW50IGRlc2VyaWFsaXphdGlvbi5cbiAqXG4gKiBSZXR1cm5zIGEgdmFsaWRhdGVkIHtAbGluayBFbGVtZW50R2F0ZWtlZXBlclBvbGljeX0gaWYgdGhlIHJhdyBkYXRhIGlzXG4gKiBzdHJ1Y3R1cmFsbHkgdmFsaWQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBkYXRhIGlzIGFic2VudCwgZmFsc3ksIG9yXG4gKiBtYWxmb3JtZWQuIE1hbGZvcm1lZCBwb2xpY2llcyBhcmUgbG9nZ2VkIGFzIHNlY3VyaXR5IGV2ZW50cyBhbmQgc3RyaXBwZWRcbiAqIHNvIHRoZXkgbmV2ZXIgcmVhY2ggdGhlIGVuZm9yY2VtZW50IHBpcGVsaW5lLlxuICpcbiAqIFVzZSB0aGlzIGF0IGV2ZXJ5IGRlc2VyaWFsaXphdGlvbiBib3VuZGFyeSAobWFuYWdlciBgcGFyc2VNZXRhZGF0YWAgL1xuICogYHNhbml0aXplTWV0YWRhdGFgIC8gYHBhcnNlTWVtb3J5RmlsZWApIHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgd2VsbC1mb3JtZWRcbiAqIHBvbGljaWVzIHN1cnZpdmUgbG9hZGluZy5cbiAqXG4gKiBAcGFyYW0gcmF3UG9saWN5IC0gVGhlIHJhdyBnYXRla2VlcGVyIHZhbHVlIGZyb20gcGFyc2VkIFlBTUwvSlNPTlxuICogQHBhcmFtIGVsZW1lbnROYW1lIC0gRWxlbWVudCBuYW1lIGZvciBkaWFnbm9zdGljIGxvZ2dpbmdcbiAqIEBwYXJhbSBlbGVtZW50VHlwZSAtIEVsZW1lbnQgdHlwZSBmb3IgZGlhZ25vc3RpYyBsb2dnaW5nXG4gKiBAcmV0dXJucyBWYWxpZGF0ZWQgcG9saWN5IG9yIHVuZGVmaW5lZFxuICpcbiAqIEBzaW5jZSBJc3N1ZSAjNTI0IOKAlCBSdW50aW1lIHZhbGlkYXRpb24gZm9yIGFsbCBlbGVtZW50IHR5cGVzXG4gKi9cbi8qKlxuICogR2F0ZWtlZXBlciBpbmZyYXN0cnVjdHVyZSBvcGVyYXRpb25zIOKAlCB0d28gcmVsYXRlZCBzZXRzIHdpdGggZGlzdGluY3QgcHVycG9zZXMuXG4gKlxuICogVU5HQVRBQkxFX09QRVJBVElPTlM6IE9wZXJhdGlvbnMgdGhhdCBtdXN0IE5FVkVSIGFwcGVhciBpbiBlbGVtZW50IHBvbGljeSBsaXN0cy5cbiAqIFRoZXNlIGFyZSBwdXJlIGludGVybmFsIHBsdW1iaW5nIOKAlCBnYXRpbmcgdGhlbSBzZXJ2ZXMgbm8gc2VjdXJpdHkgcHVycG9zZSBhbmRcbiAqIGJyZWFrcyBjcml0aWNhbCBmbG93cyAodmVyaWZpY2F0aW9uLCBDTEkgYXBwcm92YWwsIHBlcm1pc3Npb24gZXZhbHVhdGlvbikuXG4gKiBTdHJpcHBlZCBmcm9tIEFMTCBwb2xpY3kgbGlzdHMgKGFsbG93LCBjb25maXJtLCBkZW55KSBkdXJpbmcgc2FuaXRpemF0aW9uLlxuICpcbiAqIEdBVEVLRUVQRVJfSU5GUkFfT1BFUkFUSU9OUzogT3BlcmF0aW9ucyB0aGF0IHNraXAgTGF5ZXIgMiAoZWxlbWVudCBwb2xpY3lcbiAqIHJlc29sdXRpb24pIGR1cmluZyBwcmltYXJ5IGVuZm9yY2VtZW50LiBUaGlzIGlzIGEgU1VQRVJTRVQgb2YgVU5HQVRBQkxFX09QRVJBVElPTlNcbiAqIOKAlCBpdCBhZGRzIGNvbmZpcm1fb3BlcmF0aW9uLCB3aGljaCBJUyBhIHZhbGlkIHBvbGljeSB0YXJnZXQgKGRlbnkgPSBudWNsZWFyIHNhbmRib3gpXG4gKiBidXQgbXVzdCBub3QgYmUgZ2F0ZWQgdGhyb3VnaCB0aGUgbm9ybWFsIGVuZm9yY2UoKSBwYXRoICh0aGF0IGNyZWF0ZXMgdGhlXG4gKiBjYXNjYWRpbmcgY29uZmlybWF0aW9uIGxvb3AgZnJvbSBJc3N1ZSAjNzU4KS4gY29uZmlybV9vcGVyYXRpb24ncyBlbGVtZW50IHBvbGljaWVzXG4gKiBhcmUgZW5mb3JjZWQgdGhyb3VnaCBhIHNlcGFyYXRlIGNoZWNrIGluIHRoZSBjb25maXJtIGhhbmRsZXIgaW5zdGVhZC5cbiAqXG4gKiBSZWxhdGlvbnNoaXA6IEdBVEVLRUVQRVJfSU5GUkFfT1BFUkFUSU9OUyA9IFVOR0FUQUJMRV9PUEVSQVRJT05TICsgY29uZmlybV9vcGVyYXRpb25cbiAqIFRoaXMgZGVyaXZhdGlvbiBpcyBleHBsaWNpdCBpbiBjb2RlIHRvIHByZXZlbnQgdGhlIHNldHMgZnJvbSBkcmlmdGluZyBhcGFydC5cbiAqL1xuY29uc3QgVU5HQVRBQkxFX09QRVJBVElPTlMgPSBuZXcgU2V0KFtcbiAgJ3ZlcmlmeV9jaGFsbGVuZ2UnLFxuICAnYXBwcm92ZV9jbGlfcGVybWlzc2lvbicsXG4gICdwZXJtaXNzaW9uX3Byb21wdCcsXG5dKTtcblxuLyoqIERlcml2ZWQgZnJvbSBVTkdBVEFCTEVfT1BFUkFUSU9OUyArIGNvbmZpcm1fb3BlcmF0aW9uLiBTZWUgYmxvY2sgY29tbWVudCBhYm92ZS4gKi9cbmNvbnN0IEdBVEVLRUVQRVJfSU5GUkFfT1BFUkFUSU9OUyA9IG5ldyBTZXQoW1xuICAuLi5VTkdBVEFCTEVfT1BFUkFUSU9OUyxcbiAgJ2NvbmZpcm1fb3BlcmF0aW9uJyxcbl0pO1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIG9wZXJhdGlvbiBpcyBhIGdhdGVrZWVwZXIgaW5mcmFzdHJ1Y3R1cmUgb3BlcmF0aW9uIHRoYXQgc2hvdWxkXG4gKiBza2lwIGVsZW1lbnQgcG9saWN5IGV2YWx1YXRpb24gaW4gdGhlIHByaW1hcnkgZW5mb3JjZW1lbnQgcGF0aC5cbiAqIEV4cG9ydGVkIGZvciB1c2UgYnkgTUNQQVFMSGFuZGxlci4gSXNzdWUgIzc1OC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2F0ZWtlZXBlckluZnJhT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBHQVRFS0VFUEVSX0lORlJBX09QRVJBVElPTlMuaGFzKG9wZXJhdGlvbik7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW55IGFjdGl2ZSBlbGVtZW50cyBkZW55IGNvbmZpcm1fb3BlcmF0aW9uIChudWNsZWFyIHNhbmRib3gpLlxuICogUmV0dXJucyB0aGUgZGVueWluZyBlbGVtZW50IG5hbWUgaWYgZm91bmQsIHVuZGVmaW5lZCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29uZmlybURlbnlpbmdFbGVtZW50KFxuICBhY3RpdmVFbGVtZW50czogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+XG4pOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWN0aXZlRWxlbWVudHMpIHtcbiAgICBjb25zdCBnYXRla2VlcGVyID0gZWxlbWVudC5tZXRhZGF0YT8uZ2F0ZWtlZXBlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZW55TGlzdCA9IGdhdGVrZWVwZXI/LmRlbnk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVueUxpc3QpICYmIGRlbnlMaXN0LmluY2x1ZGVzKCdjb25maXJtX29wZXJhdGlvbicpKSB7XG4gICAgICByZXR1cm4geyBuYW1lOiBlbGVtZW50Lm5hbWUsIHR5cGU6IGVsZW1lbnQudHlwZSB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFueSBhY3RpdmUgZWxlbWVudHMgaGF2ZSBjb25maXJtX29wZXJhdGlvbiBpbiB0aGVpciBjb25maXJtIGxpc3QgKGFkdmlzb3J5KS5cbiAqIFJldHVybnMgdGhlIGVsZW1lbnQgbmFtZXMgdGhhdCByZXF1ZXN0IGFkZGl0aW9uYWwgc2NydXRpbnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29uZmlybUFkdmlzb3J5RWxlbWVudHMoXG4gIGFjdGl2ZUVsZW1lbnRzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT5cbik6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfT4ge1xuICBjb25zdCBhZHZpc29yaWVzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+ID0gW107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhY3RpdmVFbGVtZW50cykge1xuICAgIGNvbnN0IGdhdGVrZWVwZXIgPSBlbGVtZW50Lm1ldGFkYXRhPy5nYXRla2VlcGVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpcm1MaXN0ID0gZ2F0ZWtlZXBlcj8uY29uZmlybTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maXJtTGlzdCkgJiYgY29uZmlybUxpc3QuaW5jbHVkZXMoJ2NvbmZpcm1fb3BlcmF0aW9uJykpIHtcbiAgICAgIGFkdmlzb3JpZXMucHVzaCh7IG5hbWU6IGVsZW1lbnQubmFtZSwgdHlwZTogZWxlbWVudC50eXBlIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYWR2aXNvcmllcztcbn1cblxuLyoqXG4gKiBTdHJpcCB1bmdhdGFibGUgb3BlcmF0aW9ucyBmcm9tIGEgcG9saWN5IGxpc3QgYW5kIGxvZyB3YXJuaW5ncy5cbiAqIFJldHVybnMgdGhlIGZpbHRlcmVkIGxpc3QgKG1heSBiZSBlbXB0eSkuXG4gKlxuICogTm90ZTogY29uZmlybV9vcGVyYXRpb24gaXMgTk9UIHN0cmlwcGVkIGZyb20gZGVueSBsaXN0cyDigJQgaXQncyBhIGxlZ2l0aW1hdGVcbiAqIHNhbmRib3ggbWVjaGFuaXNtLiBJdCBJUyBzdHJpcHBlZCBmcm9tIGFsbG93L2NvbmZpcm0gbGlzdHMgc2luY2UgdGhvc2UgYXJlXG4gKiBoYW5kbGVkIHRocm91Z2ggYWR2aXNvcnkgbWVzc2FnaW5nLCBub3QgdGhyb3VnaCBlbmZvcmNlKCkuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwVW5nYXRhYmxlKFxuICBvcGVyYXRpb25zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgbGlzdE5hbWU6IHN0cmluZyxcbiAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgZWxlbWVudFR5cGU6IHN0cmluZyxcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvcGVyYXRpb25zPy5sZW5ndGgpIHJldHVybiBvcGVyYXRpb25zO1xuXG4gIC8vIGNvbmZpcm1fb3BlcmF0aW9uIGluIGRlbnkgbGlzdHMgPSBudWNsZWFyIHNhbmRib3ggKHByZXNlcnZlKVxuICAvLyBjb25maXJtX29wZXJhdGlvbiBpbiBjb25maXJtIGxpc3RzID0gYWR2aXNvcnkgbWFya2VyIChwcmVzZXJ2ZSDigJQgaW5lcnQgaW4gZW5mb3JjZSBwYXRoLFxuICAvLyAgIHJlYWQgYXQgcnVudGltZSBieSBmaW5kQ29uZmlybUFkdmlzb3J5RWxlbWVudHMoKS4gU2FmZSBiZWNhdXNlIHNraXBFbGVtZW50UG9saWNpZXNcbiAgLy8gICBwcmV2ZW50cyByZXNvbHZlRWxlbWVudFBvbGljeSgpIGZyb20gZXZlciBldmFsdWF0aW5nIGNvbmZpcm1fb3BlcmF0aW9uIGFzIGFuIG9wZXJhdGlvbi4pXG4gIC8vIGNvbmZpcm1fb3BlcmF0aW9uIGluIGFsbG93IGxpc3RzID0gcmVkdW5kYW50IHdpdGggcm91dGUgZGVmYXVsdCBBVVRPX0FQUFJPVkUgKHN0cmlwKVxuICBjb25zdCBvcHNUb1N0cmlwID0gbGlzdE5hbWUgPT09ICdhbGxvdydcbiAgICA/IG5ldyBTZXQoWy4uLlVOR0FUQUJMRV9PUEVSQVRJT05TLCAnY29uZmlybV9vcGVyYXRpb24nXSlcbiAgICA6IFVOR0FUQUJMRV9PUEVSQVRJT05TO1xuXG4gIGNvbnN0IHN0cmlwcGVkID0gb3BlcmF0aW9ucy5maWx0ZXIob3AgPT4ge1xuICAgIGlmIChvcHNUb1N0cmlwLmhhcyhvcCkpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgW0dhdGVrZWVwZXJdIFN0cmlwcGVkIFwiJHtvcH1cIiBmcm9tICR7bGlzdE5hbWV9IGxpc3QgaW4gJHtlbGVtZW50VHlwZX0gXCIke2VsZW1lbnROYW1lfVwiIOKAlCBgICtcbiAgICAgICAgYGdhdGVrZWVwZXIgaW5mcmFzdHJ1Y3R1cmUgb3BlcmF0aW9ucyBjYW5ub3QgYmUgZ2F0ZWQgYnkgZWxlbWVudCBwb2xpY2llcyAoSXNzdWUgIzc1OClgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBzdHJpcHBlZC5sZW5ndGggPiAwID8gc3RyaXBwZWQgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3koXG4gIHJhd1BvbGljeTogdW5rbm93bixcbiAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgZWxlbWVudFR5cGU6IHN0cmluZyxcbik6IEVsZW1lbnRHYXRla2VlcGVyUG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyYXdQb2xpY3kgfHwgdHlwZW9mIHJhd1BvbGljeSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBXcmFwIGluIGEgbWV0YWRhdGEgZW52ZWxvcGUgc28gcGFyc2VFbGVtZW50UG9saWN5IGNhbiBleHRyYWN0IGl0XG4gICAgY29uc3QgdmFsaWRhdGVkID0gcGFyc2VFbGVtZW50UG9saWN5KHsgZ2F0ZWtlZXBlcjogcmF3UG9saWN5IH0pO1xuICAgIGlmICh2YWxpZGF0ZWQpIHtcbiAgICAgIC8vIElzc3VlICM3NTg6IFN0cmlwIGdhdGVrZWVwZXIgaW5mcmFzdHJ1Y3R1cmUgb3BlcmF0aW9ucyBmcm9tIGVsZW1lbnQgcG9saWNpZXNcbiAgICAgIC8vIHRvIHByZXZlbnQgY2FzY2FkaW5nIGNvbmZpcm1hdGlvbiBsb29wc1xuICAgICAgdmFsaWRhdGVkLmFsbG93ID0gc3RyaXBVbmdhdGFibGUodmFsaWRhdGVkLmFsbG93LCAnYWxsb3cnLCBlbGVtZW50TmFtZSwgZWxlbWVudFR5cGUpO1xuICAgICAgdmFsaWRhdGVkLmNvbmZpcm0gPSBzdHJpcFVuZ2F0YWJsZSh2YWxpZGF0ZWQuY29uZmlybSwgJ2NvbmZpcm0nLCBlbGVtZW50TmFtZSwgZWxlbWVudFR5cGUpO1xuICAgICAgdmFsaWRhdGVkLmRlbnkgPSBzdHJpcFVuZ2F0YWJsZSh2YWxpZGF0ZWQuZGVueSwgJ2RlbnknLCBlbGVtZW50TmFtZSwgZWxlbWVudFR5cGUpO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYExvYWRlZCBnYXRla2VlcGVyIHBvbGljeSBmb3IgJHtlbGVtZW50VHlwZX0gXCIke2VsZW1lbnROYW1lfVwiYCwge1xuICAgICAgICBhbGxvdzogdmFsaWRhdGVkLmFsbG93Py5sZW5ndGggPz8gMCxcbiAgICAgICAgY29uZmlybTogdmFsaWRhdGVkLmNvbmZpcm0/Lmxlbmd0aCA/PyAwLFxuICAgICAgICBkZW55OiB2YWxpZGF0ZWQuZGVueT8ubGVuZ3RoID8/IDAsXG4gICAgICAgIGhhc1Njb3BlUmVzdHJpY3Rpb25zOiAhIXZhbGlkYXRlZC5zY29wZVJlc3RyaWN0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdGVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1lBTUxfUEFSU0lOR19XQVJOSU5HJyxcbiAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgIHNvdXJjZTogYCR7ZWxlbWVudFR5cGV9LmRlc2VyaWFsaXplYCxcbiAgICAgIGRldGFpbHM6IGBNYWxmb3JtZWQgZ2F0ZWtlZXBlciBwb2xpY3kgaW4gXCIke2VsZW1lbnROYW1lfVwiIHN0cmlwcGVkIGR1cmluZyBsb2FkOiAke21lc3NhZ2V9YCxcbiAgICB9KTtcbiAgICBsb2dnZXIud2FybihgU3RyaXBwZWQgbWFsZm9ybWVkIGdhdGVrZWVwZXIgcG9saWN5IGZyb20gJHtlbGVtZW50VHlwZX0gXCIke2VsZW1lbnROYW1lfVwiOiAke21lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
|
@@ -22,15 +22,16 @@ export interface PolicyEvaluationContext {
|
|
|
22
22
|
evaluatedElements: Array<{
|
|
23
23
|
type: string;
|
|
24
24
|
name: string;
|
|
25
|
-
matched?: 'allowPatterns' | 'denyPatterns';
|
|
25
|
+
matched?: 'allowPatterns' | 'confirmPatterns' | 'denyPatterns';
|
|
26
26
|
matchedPattern?: string;
|
|
27
27
|
matchedTarget?: string;
|
|
28
28
|
}>;
|
|
29
29
|
decisionChain: string[];
|
|
30
30
|
}
|
|
31
31
|
export interface CliToolPolicyResult {
|
|
32
|
-
behavior: 'allow' | 'deny' | 'evaluate';
|
|
32
|
+
behavior: 'allow' | 'deny' | 'evaluate' | 'confirm';
|
|
33
33
|
message?: string;
|
|
34
|
+
confirmSource?: string;
|
|
34
35
|
policyContext?: PolicyEvaluationContext;
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
@@ -74,8 +75,9 @@ export declare function getStaticPolicyData(): {
|
|
|
74
75
|
/**
|
|
75
76
|
* Evaluate a CLI tool call against active element gatekeeper policies.
|
|
76
77
|
*
|
|
77
|
-
*
|
|
78
|
+
* Four-step evaluation per element (Issue #625 Phase 2, Issue #1660):
|
|
78
79
|
* 1. denyPatterns (highest priority) — first match = immediate deny
|
|
80
|
+
* 1.5. confirmPatterns — first match = immediate confirm (requires approval)
|
|
79
81
|
* 2. allowPatterns — if element defines them, record whether tool matched
|
|
80
82
|
* 3. After all elements: if any had allowPatterns but tool wasn't allowed by any = deny
|
|
81
83
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolClassification.d.ts","sourceRoot":"","sources":["../../../../src/handlers/mcp-aql/policies/ToolClassification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"ToolClassification.d.ts","sourceRoot":"","sources":["../../../../src/handlers/mcp-aql/policies/ToolClassification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;AAE1E,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,aAAa,CAAC;IACzB,wFAAwF;IACxF,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,EAAE,KAAK,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,eAAe,GAAG,iBAAiB,GAAG,cAAc,CAAC;QAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IACH,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,uBAAuB,CAAC;CACzC;AA0OD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,wBAAwB,CAsC1B;AAiHD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,cAAc,EAAE,wBAAwB,GACvC,cAAc,CA0ChB;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB;;;;;;;;;;;;EAYlC;AAID;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,cAAc,EAAE,aAAa,EAAE,GAC9B,mBAAmB,CA2JrB"}
|