@dollhousemcp/mcp-server 1.5.2 → 1.6.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 +56 -0
- package/README.md +494 -111
- package/data/agents/code-reviewer.md +8 -1
- package/data/agents/research-assistant.md +8 -1
- package/data/agents/task-manager.md +8 -1
- package/data/ensembles/business-advisor.md +8 -1
- package/data/ensembles/creative-studio.md +8 -1
- package/data/ensembles/development-team.md +8 -1
- package/data/ensembles/security-analysis-team.md +8 -1
- package/data/memories/conversation-history.md +8 -1
- package/data/memories/learning-progress.md +8 -1
- package/data/memories/project-context.md +8 -1
- package/data/personas/business-consultant.md +8 -1
- package/data/personas/creative-writer.md +8 -1
- package/data/personas/debug-detective.md +8 -1
- package/data/personas/eli5-explainer.md +8 -1
- package/data/personas/security-analyst.md +8 -1
- package/data/personas/technical-analyst.md +8 -1
- package/data/skills/code-review.md +8 -1
- package/data/skills/creative-writing.md +8 -1
- package/data/skills/data-analysis.md +8 -1
- package/data/skills/penetration-testing.md +8 -1
- package/data/skills/research.md +8 -1
- package/data/skills/threat-modeling.md +8 -1
- package/data/skills/translation.md +8 -1
- package/data/templates/code-documentation.md +8 -1
- package/data/templates/email-professional.md +8 -1
- package/data/templates/meeting-notes.md +8 -1
- package/data/templates/penetration-test-report.md +8 -1
- package/data/templates/project-brief.md +8 -1
- package/data/templates/report-executive.md +8 -1
- package/data/templates/security-vulnerability-report.md +8 -1
- package/data/templates/threat-assessment-report.md +8 -1
- package/dist/auth/GitHubAuthManager.d.ts +6 -1
- package/dist/auth/GitHubAuthManager.d.ts.map +1 -1
- package/dist/auth/GitHubAuthManager.js +45 -18
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts +98 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts.map +1 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.js +531 -0
- package/dist/cache/CollectionCache.d.ts.map +1 -1
- package/dist/cache/CollectionCache.js +13 -3
- package/dist/cache/CollectionIndexCache.d.ts +77 -0
- package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
- package/dist/cache/CollectionIndexCache.js +349 -0
- package/dist/cache/LRUCache.d.ts +93 -0
- package/dist/cache/LRUCache.d.ts.map +1 -0
- package/dist/cache/LRUCache.js +299 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +2 -1
- package/dist/collection/CollectionBrowser.d.ts +21 -1
- package/dist/collection/CollectionBrowser.d.ts.map +1 -1
- package/dist/collection/CollectionBrowser.js +130 -10
- package/dist/collection/CollectionIndexManager.d.ts +151 -0
- package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
- package/dist/collection/CollectionIndexManager.js +499 -0
- package/dist/collection/CollectionSearch.d.ts +55 -0
- package/dist/collection/CollectionSearch.d.ts.map +1 -1
- package/dist/collection/CollectionSearch.js +338 -13
- package/dist/collection/CollectionSeeder.d.ts.map +1 -1
- package/dist/collection/CollectionSeeder.js +38 -1
- package/dist/collection/ElementInstaller.d.ts +31 -0
- package/dist/collection/ElementInstaller.d.ts.map +1 -1
- package/dist/collection/ElementInstaller.js +77 -15
- package/dist/collection/PersonaSubmitter.d.ts +1 -1
- package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
- package/dist/collection/PersonaSubmitter.js +2 -2
- package/dist/collection/index.d.ts +1 -0
- package/dist/collection/index.d.ts.map +1 -1
- package/dist/collection/index.js +2 -1
- package/dist/config/ConfigManager.d.ts +78 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +216 -0
- package/dist/config/element-types.d.ts +135 -0
- package/dist/config/element-types.d.ts.map +1 -0
- package/dist/config/element-types.js +108 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/portfolio-constants.d.ts +83 -0
- package/dist/config/portfolio-constants.d.ts.map +1 -0
- package/dist/config/portfolio-constants.js +99 -0
- package/dist/elements/BaseElement.d.ts +14 -2
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +88 -6
- package/dist/elements/agents/Agent.d.ts +10 -1
- package/dist/elements/agents/Agent.d.ts.map +1 -1
- package/dist/elements/agents/Agent.js +66 -19
- package/dist/elements/agents/AgentManager.d.ts +2 -0
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +12 -10
- package/dist/elements/skills/Skill.d.ts +10 -1
- package/dist/elements/skills/Skill.d.ts.map +1 -1
- package/dist/elements/skills/Skill.js +40 -3
- package/dist/elements/skills/SkillManager.d.ts +1 -0
- package/dist/elements/skills/SkillManager.d.ts.map +1 -1
- package/dist/elements/skills/SkillManager.js +10 -4
- package/dist/elements/templates/Template.d.ts +10 -1
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +35 -18
- package/dist/elements/templates/TemplateManager.d.ts +1 -1
- package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
- package/dist/elements/templates/TemplateManager.js +6 -5
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/index.barrel.d.ts +1 -2
- package/dist/index.barrel.d.ts.map +1 -1
- package/dist/index.barrel.js +2 -4
- package/dist/index.d.ts +143 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1883 -310
- package/dist/persona/PersonaElement.d.ts +10 -0
- package/dist/persona/PersonaElement.d.ts.map +1 -1
- package/dist/persona/PersonaElement.js +55 -32
- package/dist/persona/PersonaElementManager.d.ts.map +1 -1
- package/dist/persona/PersonaElementManager.js +13 -11
- package/dist/persona/PersonaLoader.d.ts.map +1 -1
- package/dist/persona/PersonaLoader.js +8 -2
- package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaImporter.js +24 -5
- package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
- package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaSharer.js +198 -22
- package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +499 -7
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
- package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
- package/dist/portfolio/MigrationManager.d.ts.map +1 -1
- package/dist/portfolio/MigrationManager.js +136 -3
- package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
- package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioIndexManager.js +478 -0
- package/dist/portfolio/PortfolioManager.d.ts +5 -0
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +61 -20
- package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioRepoManager.js +337 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
- package/dist/portfolio/UnifiedIndexManager.js +1434 -0
- package/dist/portfolio/index.d.ts +15 -0
- package/dist/portfolio/index.d.ts.map +1 -0
- package/dist/portfolio/index.js +15 -0
- package/dist/portfolio/types.d.ts +7 -0
- package/dist/portfolio/types.d.ts.map +1 -1
- package/dist/portfolio/types.js +6 -1
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +50 -48
- package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
- package/dist/security/audit/SecurityAuditor.js +17 -9
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +19 -3
- package/dist/security/contentValidator.d.ts +2 -0
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +115 -4
- package/dist/security/secureYamlParser.d.ts +1 -0
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +29 -7
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/security/tokenManager.d.ts +1 -1
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +30 -10
- package/dist/server/ServerSetup.d.ts +22 -2
- package/dist/server/ServerSetup.d.ts.map +1 -1
- package/dist/server/ServerSetup.js +77 -12
- package/dist/server/tools/AuthTools.d.ts.map +1 -1
- package/dist/server/tools/AuthTools.js +33 -1
- package/dist/server/tools/BuildInfoTools.d.ts +25 -0
- package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
- package/dist/server/tools/BuildInfoTools.js +36 -0
- package/dist/server/tools/CollectionTools.d.ts.map +1 -1
- package/dist/server/tools/CollectionTools.js +55 -46
- package/dist/server/tools/ConfigTools.d.ts.map +1 -1
- package/dist/server/tools/ConfigTools.js +29 -1
- package/dist/server/tools/PersonaTools.d.ts +4 -2
- package/dist/server/tools/PersonaTools.d.ts.map +1 -1
- package/dist/server/tools/PersonaTools.js +5 -152
- package/dist/server/tools/PortfolioTools.d.ts +12 -0
- package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
- package/dist/server/tools/PortfolioTools.js +221 -0
- package/dist/server/tools/index.d.ts +3 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +4 -2
- package/dist/server/types.d.ts +40 -5
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +1 -1
- package/dist/services/BuildInfoService.d.ts +84 -0
- package/dist/services/BuildInfoService.d.ts.map +1 -0
- package/dist/services/BuildInfoService.js +271 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
- package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
- package/dist/tools/portfolio/types.d.ts +41 -0
- package/dist/tools/portfolio/types.d.ts.map +1 -0
- package/dist/tools/portfolio/types.js +15 -0
- package/dist/types/collection.d.ts +51 -0
- package/dist/types/collection.d.ts.map +1 -1
- package/dist/types/collection.js +1 -1
- package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
- package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
- package/dist/utils/EarlyTerminationSearch.js +164 -0
- package/dist/utils/ErrorHandler.d.ts +86 -0
- package/dist/utils/ErrorHandler.d.ts.map +1 -0
- package/dist/utils/ErrorHandler.js +201 -0
- package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
- package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
- package/dist/utils/FileDiscoveryUtil.js +169 -0
- package/dist/utils/GitHubRateLimiter.d.ts +88 -0
- package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
- package/dist/utils/GitHubRateLimiter.js +315 -0
- package/dist/utils/PerformanceMonitor.d.ts +134 -0
- package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
- package/dist/utils/PerformanceMonitor.js +347 -0
- package/dist/utils/RateLimiter.d.ts.map +1 -0
- package/dist/utils/RateLimiter.js +172 -0
- package/dist/utils/SecureDownloader.d.ts +241 -0
- package/dist/utils/SecureDownloader.d.ts.map +1 -0
- package/dist/utils/SecureDownloader.js +759 -0
- package/dist/utils/ToolCache.d.ts +82 -0
- package/dist/utils/ToolCache.d.ts.map +1 -0
- package/dist/utils/ToolCache.js +196 -0
- package/dist/utils/errorCodes.d.ts +136 -0
- package/dist/utils/errorCodes.d.ts.map +1 -0
- package/dist/utils/errorCodes.js +87 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -1
- package/dist/utils/installation.d.ts +1 -1
- package/dist/utils/installation.d.ts.map +1 -1
- package/dist/utils/installation.js +9 -8
- package/dist/utils/searchUtils.d.ts +31 -0
- package/dist/utils/searchUtils.d.ts.map +1 -1
- package/dist/utils/searchUtils.js +62 -1
- package/package.json +17 -7
- package/dist/config/updateConfig.d.ts +0 -84
- package/dist/config/updateConfig.d.ts.map +0 -1
- package/dist/config/updateConfig.js +0 -148
- package/dist/server/tools/UpdateTools.d.ts +0 -10
- package/dist/server/tools/UpdateTools.d.ts.map +0 -1
- package/dist/server/tools/UpdateTools.js +0 -85
- package/dist/update/BackupManager.d.ts +0 -63
- package/dist/update/BackupManager.d.ts.map +0 -1
- package/dist/update/BackupManager.js +0 -370
- package/dist/update/DependencyChecker.d.ts +0 -41
- package/dist/update/DependencyChecker.d.ts.map +0 -1
- package/dist/update/DependencyChecker.js +0 -132
- package/dist/update/RateLimiter.d.ts.map +0 -1
- package/dist/update/RateLimiter.js +0 -172
- package/dist/update/SignatureVerifier.d.ts +0 -71
- package/dist/update/SignatureVerifier.d.ts.map +0 -1
- package/dist/update/SignatureVerifier.js +0 -214
- package/dist/update/UpdateChecker.d.ts +0 -132
- package/dist/update/UpdateChecker.d.ts.map +0 -1
- package/dist/update/UpdateChecker.js +0 -506
- package/dist/update/UpdateManager.d.ts +0 -60
- package/dist/update/UpdateManager.d.ts.map +0 -1
- package/dist/update/UpdateManager.js +0 -730
- package/dist/update/VersionManager.d.ts +0 -31
- package/dist/update/VersionManager.d.ts.map +0 -1
- package/dist/update/VersionManager.js +0 -181
- package/dist/update/index.d.ts +0 -9
- package/dist/update/index.d.ts.map +0 -1
- package/dist/update/index.js +0 -9
- /package/dist/{update → utils}/RateLimiter.d.ts +0 -0
|
@@ -1,11 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Persona sharing functionality via URLs
|
|
3
|
+
*
|
|
4
|
+
* SECURITY FIX IMPLEMENTED (Defense-in-Depth Validation):
|
|
5
|
+
* 1. CRITICAL: Added validate-before-return pattern in all import methods
|
|
6
|
+
* 2. HIGH: Content security validation using ContentValidator before data return
|
|
7
|
+
* 3. MEDIUM: Size validation to prevent memory exhaustion attacks
|
|
8
|
+
* 4. MEDIUM: Structure validation to prevent malformed data processing
|
|
9
|
+
* 5. DEFENSE-IN-DEPTH: Multiple validation layers before PersonaImporter processing
|
|
10
|
+
*
|
|
11
|
+
* This provides defense-in-depth security by validating content at the earliest
|
|
12
|
+
* possible point before any data is returned to calling code or file operations.
|
|
3
13
|
*/
|
|
4
14
|
import { PersonaExporter } from './PersonaExporter.js';
|
|
5
15
|
import { TokenManager } from '../../security/tokenManager.js';
|
|
6
16
|
import { SecurityError } from '../../security/errors.js';
|
|
7
17
|
import { logger } from '../../utils/logger.js';
|
|
8
|
-
import {
|
|
18
|
+
import { SecurityMonitor } from '../../security/securityMonitor.js';
|
|
19
|
+
import { ErrorHandler, ErrorCategory } from '../../utils/ErrorHandler.js';
|
|
20
|
+
import { ValidationErrorCodes, NetworkErrorCodes } from '../../utils/errorCodes.js';
|
|
21
|
+
import { RateLimiter } from '../../utils/RateLimiter.js';
|
|
22
|
+
import { ContentValidator } from '../../security/contentValidator.js';
|
|
23
|
+
import { validateContentSize } from '../../security/InputValidator.js';
|
|
9
24
|
export class PersonaSharer {
|
|
10
25
|
githubClient;
|
|
11
26
|
currentUser;
|
|
@@ -96,6 +111,7 @@ export class PersonaSharer {
|
|
|
96
111
|
}
|
|
97
112
|
/**
|
|
98
113
|
* Import a persona from a share URL
|
|
114
|
+
* SECURITY FIX: Validate ALL content before returning any data
|
|
99
115
|
*/
|
|
100
116
|
async importFromUrl(url) {
|
|
101
117
|
try {
|
|
@@ -113,11 +129,11 @@ export class PersonaSharer {
|
|
|
113
129
|
}
|
|
114
130
|
// Check if it's a base64 URL
|
|
115
131
|
if (url.includes('#dollhouse-persona=')) {
|
|
116
|
-
return this.importFromBase64Url(url);
|
|
132
|
+
return await this.importFromBase64Url(url);
|
|
117
133
|
}
|
|
118
134
|
// Validate URL for security
|
|
119
135
|
if (!this.validateShareUrl(url)) {
|
|
120
|
-
throw
|
|
136
|
+
throw ErrorHandler.createError('Invalid or potentially malicious URL', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_URL);
|
|
121
137
|
}
|
|
122
138
|
// Try direct fetch with timeout
|
|
123
139
|
const controller = new AbortController();
|
|
@@ -132,20 +148,26 @@ export class PersonaSharer {
|
|
|
132
148
|
});
|
|
133
149
|
clearTimeout(timeoutId);
|
|
134
150
|
if (!response.ok) {
|
|
135
|
-
throw
|
|
151
|
+
throw ErrorHandler.createError(`Request failed with status ${response.status}`, ErrorCategory.NETWORK_ERROR, NetworkErrorCodes.REQUEST_FAILED);
|
|
136
152
|
}
|
|
137
|
-
//
|
|
153
|
+
// ENHANCED SECURITY FIX: Comprehensive Content-Type validation
|
|
138
154
|
const contentType = response.headers.get('content-type');
|
|
139
|
-
|
|
140
|
-
|
|
155
|
+
const contentTypeValidation = this.validateContentType(contentType, 'application/json');
|
|
156
|
+
if (!contentTypeValidation.isValid) {
|
|
157
|
+
throw ErrorHandler.createError(`Invalid response type: ${contentTypeValidation.error}`, ErrorCategory.NETWORK_ERROR, NetworkErrorCodes.INVALID_RESPONSE);
|
|
141
158
|
}
|
|
142
159
|
// Check response size to prevent memory exhaustion
|
|
143
160
|
const contentLength = response.headers.get('content-length');
|
|
144
161
|
const maxSize = 5 * 1024 * 1024; // 5MB max
|
|
145
162
|
if (contentLength && parseInt(contentLength) > maxSize) {
|
|
146
|
-
throw
|
|
163
|
+
throw ErrorHandler.createError('Response too large', ErrorCategory.VALIDATION_ERROR, NetworkErrorCodes.RESPONSE_TOO_LARGE);
|
|
147
164
|
}
|
|
148
165
|
const data = await response.json();
|
|
166
|
+
// SECURITY FIX: Validate content before returning
|
|
167
|
+
const dataValidation = await this.validatePersonaData(data);
|
|
168
|
+
if (!dataValidation.isValid) {
|
|
169
|
+
throw new SecurityError(`Content validation failed: ${dataValidation.error}`);
|
|
170
|
+
}
|
|
149
171
|
return {
|
|
150
172
|
success: true,
|
|
151
173
|
data,
|
|
@@ -205,12 +227,13 @@ export class PersonaSharer {
|
|
|
205
227
|
});
|
|
206
228
|
clearTimeout(timeoutId);
|
|
207
229
|
if (!response.ok) {
|
|
208
|
-
throw
|
|
230
|
+
throw ErrorHandler.createError(`GitHub API error: ${response.status}`, ErrorCategory.NETWORK_ERROR, NetworkErrorCodes.API_ERROR);
|
|
209
231
|
}
|
|
210
|
-
//
|
|
232
|
+
// ENHANCED SECURITY FIX: Comprehensive Content-Type validation for GitHub API
|
|
211
233
|
const contentType = response.headers.get('content-type');
|
|
212
|
-
|
|
213
|
-
|
|
234
|
+
const gistContentTypeValidation = this.validateContentType(contentType, 'application/json');
|
|
235
|
+
if (!gistContentTypeValidation.isValid) {
|
|
236
|
+
throw ErrorHandler.createError(`Invalid GitHub API response type: ${gistContentTypeValidation.error}`, ErrorCategory.NETWORK_ERROR, NetworkErrorCodes.INVALID_RESPONSE);
|
|
214
237
|
}
|
|
215
238
|
const gist = await response.json();
|
|
216
239
|
// Consume the rate limit token after successful request
|
|
@@ -253,12 +276,12 @@ export class PersonaSharer {
|
|
|
253
276
|
// Check rate limit
|
|
254
277
|
const rateLimitStatus = this.githubRateLimiter.checkLimit();
|
|
255
278
|
if (!rateLimitStatus.allowed) {
|
|
256
|
-
throw
|
|
279
|
+
throw ErrorHandler.createError(`GitHub API rate limit exceeded. Please try again in ${Math.ceil(rateLimitStatus.retryAfterMs / 1000)} seconds`, ErrorCategory.NETWORK_ERROR, NetworkErrorCodes.RATE_LIMIT_EXCEEDED);
|
|
257
280
|
}
|
|
258
281
|
const gistUrl = `https://api.github.com/gists/${gistId}`;
|
|
259
282
|
// Validate URL (should always pass for GitHub API)
|
|
260
283
|
if (!this.validateShareUrl(gistUrl)) {
|
|
261
|
-
throw
|
|
284
|
+
throw ErrorHandler.createError('Invalid GitHub API URL', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_URL);
|
|
262
285
|
}
|
|
263
286
|
const controller = new AbortController();
|
|
264
287
|
const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout for API
|
|
@@ -272,17 +295,18 @@ export class PersonaSharer {
|
|
|
272
295
|
});
|
|
273
296
|
clearTimeout(timeoutId);
|
|
274
297
|
if (!response.ok) {
|
|
275
|
-
throw
|
|
298
|
+
throw ErrorHandler.createError(`Failed to fetch gist: ${response.status}`, ErrorCategory.NETWORK_ERROR, NetworkErrorCodes.FETCH_FAILED);
|
|
276
299
|
}
|
|
277
|
-
//
|
|
300
|
+
// ENHANCED SECURITY FIX: Comprehensive Content-Type validation for GitHub API
|
|
278
301
|
const contentType = response.headers.get('content-type');
|
|
279
|
-
|
|
280
|
-
|
|
302
|
+
const gistContentTypeValidation = this.validateContentType(contentType, 'application/json');
|
|
303
|
+
if (!gistContentTypeValidation.isValid) {
|
|
304
|
+
throw ErrorHandler.createError(`Invalid GitHub API response type: ${gistContentTypeValidation.error}`, ErrorCategory.NETWORK_ERROR, NetworkErrorCodes.INVALID_RESPONSE);
|
|
281
305
|
}
|
|
282
306
|
const gist = await response.json();
|
|
283
307
|
const personaFile = gist.files['persona.json'];
|
|
284
308
|
if (!personaFile) {
|
|
285
|
-
throw
|
|
309
|
+
throw ErrorHandler.createError('No persona data found in gist', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_INPUT);
|
|
286
310
|
}
|
|
287
311
|
const data = JSON.parse(personaFile.content);
|
|
288
312
|
// Check expiry
|
|
@@ -292,6 +316,11 @@ export class PersonaSharer {
|
|
|
292
316
|
message: 'This share link has expired'
|
|
293
317
|
};
|
|
294
318
|
}
|
|
319
|
+
// SECURITY FIX: Validate content before returning
|
|
320
|
+
const gistDataValidation = await this.validatePersonaData(data);
|
|
321
|
+
if (!gistDataValidation.isValid) {
|
|
322
|
+
throw new SecurityError(`Content validation failed: ${gistDataValidation.error}`);
|
|
323
|
+
}
|
|
295
324
|
// Consume the rate limit token after successful request
|
|
296
325
|
this.githubRateLimiter.consumeToken();
|
|
297
326
|
return {
|
|
@@ -441,12 +470,12 @@ export class PersonaSharer {
|
|
|
441
470
|
/**
|
|
442
471
|
* Import from base64 URL
|
|
443
472
|
*/
|
|
444
|
-
importFromBase64Url(url) {
|
|
473
|
+
async importFromBase64Url(url) {
|
|
445
474
|
try {
|
|
446
475
|
// Limit base64 length to prevent ReDoS attacks (10KB max for base64 encoded data)
|
|
447
476
|
const match = url.match(/#dollhouse-persona=([A-Za-z0-9+/=]{1,10000})$/);
|
|
448
477
|
if (!match) {
|
|
449
|
-
throw
|
|
478
|
+
throw ErrorHandler.createError('Invalid share URL format', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_FORMAT);
|
|
450
479
|
}
|
|
451
480
|
const base64 = match[1];
|
|
452
481
|
const json = Buffer.from(base64, 'base64').toString('utf-8');
|
|
@@ -458,6 +487,11 @@ export class PersonaSharer {
|
|
|
458
487
|
message: 'This share link has expired'
|
|
459
488
|
};
|
|
460
489
|
}
|
|
490
|
+
// SECURITY FIX: Validate content before returning
|
|
491
|
+
const base64DataValidation = await this.validatePersonaData(data);
|
|
492
|
+
if (!base64DataValidation.isValid) {
|
|
493
|
+
throw new SecurityError(`Content validation failed: ${base64DataValidation.error}`);
|
|
494
|
+
}
|
|
461
495
|
return {
|
|
462
496
|
success: true,
|
|
463
497
|
data,
|
|
@@ -498,5 +532,147 @@ ${url}
|
|
|
498
532
|
|
|
499
533
|
🔒 Privacy: This link is private and will expire automatically.`;
|
|
500
534
|
}
|
|
535
|
+
/**
|
|
536
|
+
* SECURITY FIX: Validate persona data before any processing
|
|
537
|
+
* This provides defense-in-depth validation before content reaches file operations
|
|
538
|
+
*/
|
|
539
|
+
async validatePersonaData(data) {
|
|
540
|
+
try {
|
|
541
|
+
// Basic structure validation
|
|
542
|
+
if (!data || typeof data !== 'object') {
|
|
543
|
+
return { isValid: false, error: 'Invalid data structure' };
|
|
544
|
+
}
|
|
545
|
+
// Validate required fields for persona data
|
|
546
|
+
if (data.metadata && (!data.metadata.name || !data.metadata.description)) {
|
|
547
|
+
return { isValid: false, error: 'Missing required persona metadata' };
|
|
548
|
+
}
|
|
549
|
+
// Validate content if present
|
|
550
|
+
if (data.content) {
|
|
551
|
+
// Size validation
|
|
552
|
+
try {
|
|
553
|
+
validateContentSize(data.content, 100 * 1024); // 100KB limit
|
|
554
|
+
}
|
|
555
|
+
catch (error) {
|
|
556
|
+
return { isValid: false, error: `Content size validation failed: ${error instanceof Error ? error.message : 'Unknown error'}` };
|
|
557
|
+
}
|
|
558
|
+
// Content security validation
|
|
559
|
+
const contentValidation = ContentValidator.validateAndSanitize(data.content);
|
|
560
|
+
if (!contentValidation.isValid && contentValidation.severity === 'critical') {
|
|
561
|
+
return {
|
|
562
|
+
isValid: false,
|
|
563
|
+
error: `Critical security threat detected: ${contentValidation.detectedPatterns?.join(', ')}`
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
// Validate bundle structure if it's a bundle
|
|
568
|
+
if (data.personas && Array.isArray(data.personas)) {
|
|
569
|
+
for (const persona of data.personas) {
|
|
570
|
+
const personaValidation = await this.validatePersonaData(persona);
|
|
571
|
+
if (!personaValidation.isValid) {
|
|
572
|
+
return { isValid: false, error: `Bundle validation failed: ${personaValidation.error}` };
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
return { isValid: true };
|
|
577
|
+
}
|
|
578
|
+
catch (error) {
|
|
579
|
+
return {
|
|
580
|
+
isValid: false,
|
|
581
|
+
error: `Validation error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* ENHANCED SECURITY FIX: Comprehensive Content-Type validation
|
|
587
|
+
* Strengthens MIME type validation with comprehensive security checks
|
|
588
|
+
*/
|
|
589
|
+
validateContentType(contentType, expectedType) {
|
|
590
|
+
// Check if Content-Type header exists
|
|
591
|
+
if (!contentType) {
|
|
592
|
+
return {
|
|
593
|
+
isValid: false,
|
|
594
|
+
error: 'Missing Content-Type header'
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
// Normalize and sanitize the content type
|
|
598
|
+
const normalizedContentType = contentType.toLowerCase().trim();
|
|
599
|
+
const normalizedExpectedType = expectedType.toLowerCase().trim();
|
|
600
|
+
// Validate Content-Type format (basic MIME type structure)
|
|
601
|
+
const mimeTypePattern = /^[a-z0-9][a-z0-9!#$&\-\^_]*\/[a-z0-9][a-z0-9!#$&\-\^_]*(?:\s*;.*)?$/;
|
|
602
|
+
if (!mimeTypePattern.test(normalizedContentType)) {
|
|
603
|
+
return {
|
|
604
|
+
isValid: false,
|
|
605
|
+
error: `Malformed Content-Type header: ${contentType}`
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
// Extract main MIME type (before any parameters like charset)
|
|
609
|
+
const mainType = normalizedContentType.split(';')[0].trim();
|
|
610
|
+
// Security check: Block dangerous MIME types that could bypass validation
|
|
611
|
+
const dangerousMimeTypes = [
|
|
612
|
+
'text/html', // Could contain XSS
|
|
613
|
+
'text/javascript', // Could contain malicious scripts
|
|
614
|
+
'application/javascript', // Could contain malicious scripts
|
|
615
|
+
'text/xml', // Could contain XXE attacks
|
|
616
|
+
'application/xml', // Could contain XXE attacks
|
|
617
|
+
'image/svg+xml', // Could contain XSS in SVG
|
|
618
|
+
'multipart/form-data', // Unexpected for API responses
|
|
619
|
+
'application/x-www-form-urlencoded' // Unexpected for API responses
|
|
620
|
+
];
|
|
621
|
+
if (dangerousMimeTypes.includes(mainType)) {
|
|
622
|
+
SecurityMonitor.logSecurityEvent({
|
|
623
|
+
type: 'CONTENT_INJECTION_ATTEMPT',
|
|
624
|
+
severity: 'HIGH',
|
|
625
|
+
source: 'persona_sharer',
|
|
626
|
+
details: `Dangerous Content-Type detected: ${contentType}`,
|
|
627
|
+
metadata: { contentType, expectedType }
|
|
628
|
+
});
|
|
629
|
+
return {
|
|
630
|
+
isValid: false,
|
|
631
|
+
error: `Dangerous Content-Type not allowed: ${mainType}`
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
// Check if the main type matches expected type
|
|
635
|
+
if (!mainType.includes(normalizedExpectedType)) {
|
|
636
|
+
return {
|
|
637
|
+
isValid: false,
|
|
638
|
+
error: `Content-Type mismatch: expected ${expectedType}, got ${mainType}`
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
// Additional validation for JSON responses
|
|
642
|
+
if (normalizedExpectedType === 'application/json') {
|
|
643
|
+
// Accept various JSON-compatible MIME types
|
|
644
|
+
const acceptableJsonTypes = [
|
|
645
|
+
'application/json',
|
|
646
|
+
'application/vnd.api+json',
|
|
647
|
+
'application/vnd.github.v3+json',
|
|
648
|
+
'text/json' // Some APIs use this (though not standard)
|
|
649
|
+
];
|
|
650
|
+
const isAcceptableJson = acceptableJsonTypes.some(type => mainType === type);
|
|
651
|
+
if (!isAcceptableJson) {
|
|
652
|
+
return {
|
|
653
|
+
isValid: false,
|
|
654
|
+
error: `Unsupported JSON Content-Type: ${mainType}`
|
|
655
|
+
};
|
|
656
|
+
}
|
|
657
|
+
// Validate charset parameter if present
|
|
658
|
+
const charsetMatch = normalizedContentType.match(/charset=([^;\s]+)/);
|
|
659
|
+
if (charsetMatch) {
|
|
660
|
+
const charset = charsetMatch[1].toLowerCase();
|
|
661
|
+
const supportedCharsets = ['utf-8', 'utf8', 'ascii', 'iso-8859-1'];
|
|
662
|
+
if (!supportedCharsets.includes(charset)) {
|
|
663
|
+
return {
|
|
664
|
+
isValid: false,
|
|
665
|
+
error: `Unsupported charset: ${charset}`
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
// Log successful validation for monitoring
|
|
671
|
+
logger.debug('Content-Type validation passed', {
|
|
672
|
+
contentType: mainType,
|
|
673
|
+
expectedType: normalizedExpectedType
|
|
674
|
+
});
|
|
675
|
+
return { isValid: true };
|
|
676
|
+
}
|
|
501
677
|
}
|
|
502
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyc29uYVNoYXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wZXJzb25hL2V4cG9ydC1pbXBvcnQvUGVyc29uYVNoYXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUdILE9BQU8sRUFBRSxlQUFlLEVBQW1CLE1BQU0sc0JBQXNCLENBQUM7QUFFeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBVTFELE1BQU0sT0FBTyxhQUFhO0lBS2Q7SUFDQTtJQUxGLFFBQVEsQ0FBa0I7SUFDMUIsaUJBQWlCLENBQWM7SUFFdkMsWUFDVSxZQUEwQixFQUMxQixXQUEwQjtRQUQxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUVsQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWpELGtFQUFrRTtRQUNsRSw4REFBOEQ7UUFDOUQsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLGNBQWMsRUFBRSxLQUFLLElBQUksQ0FBQztRQUM3RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDdkMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsc0JBQXNCO1lBQzdELFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxTQUFTO1lBQ25DLFVBQVUsRUFBRSxJQUFJLENBQUMsb0NBQW9DO1NBQ3RELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBZ0IsRUFBRSxhQUFxQixDQUFDO1FBQ3pELElBQUksQ0FBQztZQUNILGtEQUFrRDtZQUNsRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDNUMsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBRTFCLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxDQUFDO29CQUNILE1BQU0sVUFBVSxHQUFHLE1BQU0sWUFBWSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNyRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN4QixNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSwwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDL0csTUFBTSxDQUFDLElBQUksQ0FBQyxpRUFBaUUsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO3dCQUN2RywwQ0FBMEM7b0JBQzVDLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUN2QixDQUFDO2dCQUNILENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZiwyREFBMkQ7b0JBQzNELElBQUksS0FBSyxZQUFZLGFBQWEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLHFCQUFxQixFQUFFLENBQUM7d0JBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkRBQTJELEVBQUU7NEJBQ3ZFLEtBQUssRUFBRSwwQ0FBMEM7eUJBQ2xELENBQUMsQ0FBQztvQkFDTCxDQUFDO3lCQUFNLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO3dCQUNsQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDOUUsTUFBTSxDQUFDLElBQUksQ0FBQyxxREFBcUQsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO29CQUM3RixDQUFDO29CQUNELDBDQUEwQztnQkFDNUMsQ0FBQztZQUNILENBQUM7WUFFRCxzQ0FBc0M7WUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFeEQsdUJBQXVCO1lBQ3ZCLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixHQUFHLFVBQVU7Z0JBQ2IsUUFBUSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2dCQUNsQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxXQUFXO2dCQUN6QyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUU7Z0JBQ2hGLFlBQVksRUFBRSxPQUFPO2FBQ3RCLENBQUM7WUFFRixxREFBcUQ7WUFDckQsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUUzRSxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDdkIsT0FBTzt3QkFDTCxPQUFPLEVBQUUsSUFBSTt3QkFDYixHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUk7d0JBQ3BCLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTt3QkFDekIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO3dCQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxHQUFJLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztxQkFDdkUsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELG1EQUFtRDtZQUNuRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFekMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFFcEQsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxPQUFPLEVBQUUsNEJBQTRCLFdBQVcsRUFBRTthQUNuRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBVztRQUM3QixJQUFJLENBQUM7WUFDSCxxQkFBcUI7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPO29CQUNMLE9BQU8sRUFBRSxLQUFLO29CQUNkLE9BQU8sRUFBRSxnQ0FBZ0M7aUJBQzFDLENBQUM7WUFDSixDQUFDO1lBQ0Qsa0NBQWtDO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBRUQsNkJBQTZCO1lBQzdCLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFFRCw0QkFBNEI7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUVELGdDQUFnQztZQUNoQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUI7WUFFakYsSUFBSSxDQUFDO2dCQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDaEMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO29CQUN6QixPQUFPLEVBQUU7d0JBQ1AsWUFBWSxFQUFFLGtCQUFrQjt3QkFDaEMsUUFBUSxFQUFFLGtCQUFrQjtxQkFDN0I7aUJBQ0YsQ0FBQyxDQUFDO2dCQUVILFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ25FLENBQUM7Z0JBRUQsK0JBQStCO2dCQUMvQixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO29CQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7Z0JBQzFELENBQUM7Z0JBRUQsbURBQW1EO2dCQUNuRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVU7Z0JBQzNDLElBQUksYUFBYSxJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztvQkFDdkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO2dCQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQyxPQUFPO29CQUNMLE9BQU8sRUFBRSxJQUFJO29CQUNiLElBQUk7b0JBQ0osT0FBTyxFQUFFLHFDQUFxQztpQkFDL0MsQ0FBQztZQUNKLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUVILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QyxPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE9BQU8sRUFBRSw4QkFBOEIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2FBQ2hHLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFVBQVUsQ0FBQyxXQUFtQixFQUFFLElBQVM7UUFDckQsSUFBSSxDQUFDO1lBQ0gsNkNBQTZDO1lBQzdDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO2dCQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzVCLENBQUM7WUFFRCxtQkFBbUI7WUFDbkIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLGVBQWUsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDO2dCQUM3RixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzVCLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7WUFFbkYsSUFBSSxDQUFDO2dCQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLDhCQUE4QixFQUFFO29CQUMzRCxNQUFNLEVBQUUsTUFBTTtvQkFDZCxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07b0JBQzNCLE9BQU8sRUFBRTt3QkFDUCxlQUFlLEVBQUUsVUFBVSxLQUFLLEVBQUU7d0JBQ2xDLFFBQVEsRUFBRSxnQ0FBZ0M7d0JBQzFDLGNBQWMsRUFBRSxrQkFBa0I7d0JBQ2xDLFlBQVksRUFBRSxrQkFBa0I7cUJBQ2pDO29CQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNuQixXQUFXLEVBQUUseUJBQXlCLFdBQVcsRUFBRTt3QkFDbkQsTUFBTSxFQUFFLEtBQUssRUFBRSw0QkFBNEI7d0JBQzNDLEtBQUssRUFBRTs0QkFDTCxjQUFjLEVBQUU7Z0NBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7NkJBQ3ZDO3lCQUNGO3FCQUNGLENBQUM7aUJBQ0QsQ0FBQyxDQUFDO2dCQUVILFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzFELENBQUM7Z0JBRUQsZ0RBQWdEO2dCQUNoRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO29CQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQ3RELENBQUM7Z0JBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBRW5DLHdEQUF3RDtnQkFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUV0QyxPQUFPO29CQUNMLE9BQU8sRUFBRSxJQUFJO29CQUNiLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2lCQUNoQixDQUFDO1lBQ0osQ0FBQztvQkFBUyxDQUFDO2dCQUNULFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBRUgsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsSUFBUztRQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxxREFBcUQsTUFBTSxFQUFFLENBQUM7UUFFMUUsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsR0FBRztZQUNILFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ3RELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQWM7UUFDekMsSUFBSSxDQUFDO1lBQ0gsbUJBQW1CO1lBQ25CLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BJLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxnQ0FBZ0MsTUFBTSxFQUFFLENBQUM7WUFFekQsbURBQW1EO1lBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7WUFFM0YsSUFBSSxDQUFDO2dCQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRTtvQkFDcEMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO29CQUN6QixPQUFPLEVBQUU7d0JBQ1AsUUFBUSxFQUFFLGdDQUFnQzt3QkFDMUMsWUFBWSxFQUFFLGtCQUFrQjtxQkFDakM7aUJBQ0YsQ0FBQyxDQUFDO2dCQUVILFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzlELENBQUM7Z0JBRUQsZ0RBQWdEO2dCQUNoRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO29CQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQ3RELENBQUM7Z0JBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBRS9DLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO2dCQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUU3QyxlQUFlO2dCQUNmLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUM1RCxPQUFPO3dCQUNMLE9BQU8sRUFBRSxLQUFLO3dCQUNkLE9BQU8sRUFBRSw2QkFBNkI7cUJBQ3ZDLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCx3REFBd0Q7Z0JBQ3hELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFFdEMsT0FBTztvQkFDTCxPQUFPLEVBQUUsSUFBSTtvQkFDYixJQUFJO29CQUNKLE9BQU8sRUFBRSw0Q0FBNEM7aUJBQ3RELENBQUM7WUFDSixDQUFDO29CQUFTLENBQUM7Z0JBQ1QsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFCLENBQUM7UUFFSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekMsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxPQUFPLEVBQUUsK0JBQStCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTthQUNqRyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLEdBQVc7UUFDbEMsSUFBSSxDQUFDO1lBQ0gscUNBQXFDO1lBQ3JDLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDckUsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFNUIsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3RFLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELGtGQUFrRjtZQUNsRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQseUJBQXlCO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFL0MsMENBQTBDO1lBQzFDLE1BQU0sZ0JBQWdCLEdBQUc7Z0JBQ3ZCLFdBQVc7Z0JBQ1gsdUJBQXVCO2dCQUN2QixTQUFTO2dCQUNULEdBQUc7Z0JBQ0gsS0FBSztnQkFDTCxZQUFZO2dCQUNaLE9BQU87Z0JBQ1Asb0JBQW9CO2dCQUNwQiwyQ0FBMkM7YUFDNUMsQ0FBQztZQUVGLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxzREFBc0Q7WUFDdEQsTUFBTSxpQkFBaUIsR0FBRztnQkFDeEIsUUFBUSxFQUFxQyxXQUFXO2dCQUN4RCxPQUFPLEVBQXNDLGtCQUFrQjtnQkFDL0QsYUFBYSxFQUFnQyxrQkFBa0I7Z0JBQy9ELGdDQUFnQyxFQUFXLGtCQUFrQjtnQkFDN0QsYUFBYSxFQUFnQyxhQUFhO2dCQUMxRCxTQUFTLEVBQW9DLGVBQWU7Z0JBQzVELFNBQVMsRUFBb0Msa0JBQWtCO2dCQUMvRCxPQUFPLEVBQXNDLGdCQUFnQjtnQkFDN0QsMEJBQTBCLEVBQWlCLG1CQUFtQjtnQkFDOUQsZ0JBQWdCLEVBQTRCLG9CQUFvQjtnQkFDaEUsb0JBQW9CLEVBQXdCLG9CQUFvQjtnQkFDaEUscUJBQXFCLEVBQXVCLG9CQUFvQjtnQkFDaEUsTUFBTSxFQUF1QyxXQUFXO2dCQUN4RCxzQkFBc0IsQ0FBc0IsWUFBWTthQUN6RCxDQUFDO1lBRUYsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3RELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELGlDQUFpQztZQUNqQyxNQUFNLGlCQUFpQixHQUFHO2dCQUN4QixpQkFBaUIsRUFBTSxnQkFBZ0I7Z0JBQ3ZDLDBCQUEwQjtnQkFDMUIsb0JBQW9CO2dCQUNwQixpQkFBaUIsQ0FBTSxnQkFBZ0I7YUFDeEMsQ0FBQztZQUVGLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCw0REFBNEQ7WUFDNUQsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLGtDQUFrQztnQkFDbEMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO29CQUMvRixNQUFNLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMvRSxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQztZQUVELCtCQUErQjtZQUMvQixJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDM0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsdUNBQXVDO1lBQ3ZDLGtEQUFrRDtZQUNsRCxNQUFNLGNBQWMsR0FBRztnQkFDckIsWUFBWTtnQkFDWixpQkFBaUI7Z0JBQ2pCLGdCQUFnQjtnQkFDaEIsMkJBQTJCO2dCQUMzQixrQkFBa0I7YUFDbkIsQ0FBQztZQUVGLGlDQUFpQztZQUNqQyxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ25ELFFBQVEsS0FBSyxNQUFNLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQ3ZELENBQUM7WUFFRixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3JCLHFEQUFxRDtnQkFDckQsZ0RBQWdEO2dCQUNoRCxNQUFNLGFBQWEsR0FBRyx5Q0FBeUMsQ0FBQztnQkFDaEUsTUFBTSxXQUFXLEdBQUcsc0NBQXNDLENBQUM7Z0JBQzNELE1BQU0sV0FBVyxHQUFHLDZDQUE2QyxDQUFDO2dCQUVsRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDaEYsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztnQkFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDbkQsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFO2dCQUNwQyxRQUFRO2dCQUNSLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsU0FBUyxFQUFFLGVBQWU7YUFDM0IsQ0FBQyxDQUFDO1lBRUgsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztZQUN6RyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUIsQ0FBQyxHQUFXO1FBQ3JDLElBQUksQ0FBQztZQUNILGtGQUFrRjtZQUNsRixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUM5QyxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTlCLGVBQWU7WUFDZixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDNUQsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxPQUFPLEVBQUUsNkJBQTZCO2lCQUN2QyxDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsSUFBSTtnQkFDSixPQUFPLEVBQUUsbUNBQW1DO2FBQzdDLENBQUM7UUFFSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLCtCQUErQixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7YUFDakcsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQUMsR0FBVztRQUMvQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDbEUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLEdBQVcsRUFBRSxTQUFpQjtRQUN2RCxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUvRixPQUFPOzs7RUFHVCxHQUFHOztjQUVTLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLGVBQWU7Ozs7OzZDQUtwQixHQUFHOztnRUFFZ0IsQ0FBQztJQUMvRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBlcnNvbmEgc2hhcmluZyBmdW5jdGlvbmFsaXR5IHZpYSBVUkxzXG4gKi9cblxuaW1wb3J0IHsgUGVyc29uYSB9IGZyb20gJy4uLy4uL3R5cGVzL3BlcnNvbmEuanMnO1xuaW1wb3J0IHsgUGVyc29uYUV4cG9ydGVyLCBFeHBvcnRlZFBlcnNvbmEgfSBmcm9tICcuL1BlcnNvbmFFeHBvcnRlci5qcyc7XG5pbXBvcnQgeyBHaXRIdWJDbGllbnQgfSBmcm9tICcuLi8uLi9jb2xsZWN0aW9uL0dpdEh1YkNsaWVudC5qcyc7XG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlFcnJvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi8uLi91cGRhdGUvUmF0ZUxpbWl0ZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgdXJsPzogc3RyaW5nO1xuICBnaXN0SWQ/OiBzdHJpbmc7XG4gIGV4cGlyZXNBdD86IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUGVyc29uYVNoYXJlciB7XG4gIHByaXZhdGUgZXhwb3J0ZXI6IFBlcnNvbmFFeHBvcnRlcjtcbiAgcHJpdmF0ZSBnaXRodWJSYXRlTGltaXRlcjogUmF0ZUxpbWl0ZXI7XG4gIFxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50LFxuICAgIHByaXZhdGUgY3VycmVudFVzZXI6IHN0cmluZyB8IG51bGxcbiAgKSB7XG4gICAgdGhpcy5leHBvcnRlciA9IG5ldyBQZXJzb25hRXhwb3J0ZXIoY3VycmVudFVzZXIpO1xuICAgIFxuICAgIC8vIEdpdEh1YiBBUEkgcmF0ZSBsaW1pdDogNjAgcmVxdWVzdHMgcGVyIGhvdXIgZm9yIHVuYXV0aGVudGljYXRlZFxuICAgIC8vIDUwMDAgcGVyIGhvdXIgZm9yIGF1dGhlbnRpY2F0ZWQgLSB1c2UgVG9rZW5NYW5hZ2VyIHRvIGNoZWNrXG4gICAgY29uc3QgaGFzVmFsaWRUb2tlbiA9IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbigpICE9PSBudWxsO1xuICAgIHRoaXMuZ2l0aHViUmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoe1xuICAgICAgbWF4UmVxdWVzdHM6IGhhc1ZhbGlkVG9rZW4gPyAxMDAgOiAzMCwgLy8gQ29uc2VydmF0aXZlIGxpbWl0c1xuICAgICAgd2luZG93TXM6IDYwICogNjAgKiAxMDAwLCAvLyAxIGhvdXJcbiAgICAgIG1pbkRlbGF5TXM6IDEwMDAgLy8gTWluaW11bSAxIHNlY29uZCBiZXR3ZWVuIHJlcXVlc3RzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgYSBwZXJzb25hIHZpYSBHaXRIdWIgR2lzdFxuICAgKi9cbiAgYXN5bmMgc2hhcmVQZXJzb25hKHBlcnNvbmE6IFBlcnNvbmEsIGV4cGlyeURheXM6IG51bWJlciA9IDcpOiBQcm9taXNlPFNoYXJlUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIGdpc3QgcGVybWlzc2lvbnMgaWYgdG9rZW4gaXMgYXZhaWxhYmxlXG4gICAgICBjb25zdCB0b2tlbiA9IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbigpO1xuICAgICAgbGV0IGhhc1ZhbGlkVG9rZW4gPSBmYWxzZTtcbiAgICAgIFxuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IGF3YWl0IFRva2VuTWFuYWdlci5lbnN1cmVUb2tlblBlcm1pc3Npb25zKCdnaXN0Jyk7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNhZmVNZXNzYWdlID0gVG9rZW5NYW5hZ2VyLmNyZWF0ZVNhZmVFcnJvck1lc3NhZ2UodmFsaWRhdGlvbi5lcnJvciB8fCAnVW5rbm93biB2YWxpZGF0aW9uIGVycm9yJywgdG9rZW4pO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0dpdEh1YiB0b2tlbiBsYWNrcyBnaXN0IHBlcm1pc3Npb25zLCBmYWxsaW5nIGJhY2sgdG8gYmFzZTY0IFVSTCcsIHsgZXJyb3I6IHNhZmVNZXNzYWdlIH0pO1xuICAgICAgICAgICAgLy8gQ29udGludWUgdG8gZmFsbGJhY2sgaW5zdGVhZCBvZiBmYWlsaW5nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhc1ZhbGlkVG9rZW4gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgcmF0ZSBsaW1pdGluZyBvciBvdGhlciBzZWN1cml0eSBlcnJvcnMgZ3JhY2VmdWxseVxuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ1JBVEVfTElNSVRfRVhDRUVERUQnKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZWQsIGZhbGxpbmcgYmFjayB0byBiYXNlNjQgVVJMJywgeyBcbiAgICAgICAgICAgICAgZXJyb3I6ICdSYXRlIGxpbWl0IGV4Y2VlZGVkIGZvciB0b2tlbiB2YWxpZGF0aW9uJyBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgY29uc3Qgc2FmZU1lc3NhZ2UgPSBUb2tlbk1hbmFnZXIuY3JlYXRlU2FmZUVycm9yTWVzc2FnZShlcnJvci5tZXNzYWdlLCB0b2tlbik7XG4gICAgICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBiYXNlNjQgVVJMJywgeyBlcnJvcjogc2FmZU1lc3NhZ2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENvbnRpbnVlIHRvIGZhbGxiYWNrIGluc3RlYWQgb2YgZmFpbGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEV4cG9ydCBwZXJzb25hIHRvIHN0cnVjdHVyZWQgZm9ybWF0XG4gICAgICBjb25zdCBleHBvcnREYXRhID0gdGhpcy5leHBvcnRlci5leHBvcnRQZXJzb25hKHBlcnNvbmEpO1xuICAgICAgXG4gICAgICAvLyBBZGQgc2hhcmluZyBtZXRhZGF0YVxuICAgICAgY29uc3Qgc2hhcmVEYXRhID0ge1xuICAgICAgICAuLi5leHBvcnREYXRhLFxuICAgICAgICBzaGFyZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBzaGFyZWRCeTogdGhpcy5jdXJyZW50VXNlciB8fCAnYW5vbnltb3VzJyxcbiAgICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShEYXRlLm5vdygpICsgZXhwaXJ5RGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNoYXJlVmVyc2lvbjogJzEuMC4wJ1xuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIEdpdEh1YiBHaXN0IGlmIHRva2VuIGhhcyBwcm9wZXIgcGVybWlzc2lvbnNcbiAgICAgIGlmIChoYXNWYWxpZFRva2VuKSB7XG4gICAgICAgIGNvbnN0IGdpc3RSZXN1bHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUdpc3QocGVyc29uYS5tZXRhZGF0YS5uYW1lLCBzaGFyZURhdGEpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGdpc3RSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgdXJsOiBnaXN0UmVzdWx0LnVybCEsXG4gICAgICAgICAgICBnaXN0SWQ6IGdpc3RSZXN1bHQuZ2lzdElkLFxuICAgICAgICAgICAgZXhwaXJlc0F0OiBzaGFyZURhdGEuZXhwaXJlc0F0LFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5mb3JtYXRTaGFyZVN1Y2Nlc3MoZ2lzdFJlc3VsdC51cmwhLCBzaGFyZURhdGEuZXhwaXJlc0F0KVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2sgdG8gYmFzZTY0IFVSTCBpZiBHaXN0IGZhaWxzIG9yIG5vIHRva2VuXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVCYXNlNjRVcmwoc2hhcmVEYXRhKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zdCBzYWZlTWVzc2FnZSA9IFRva2VuTWFuYWdlci5jcmVhdGVTYWZlRXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1NoYXJlIGVycm9yJywgeyBlcnJvcjogc2FmZU1lc3NhZ2UgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIHNoYXJlIHBlcnNvbmE6ICR7c2FmZU1lc3NhZ2V9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgcGVyc29uYSBmcm9tIGEgc2hhcmUgVVJMXG4gICAqL1xuICBhc3luYyBpbXBvcnRGcm9tVXJsKHVybDogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGRhdGE/OiBhbnk7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIFVSTCBmaXJzdFxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlU2hhcmVVcmwodXJsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIG9yIHVuc2FmZSBVUkwgcHJvdmlkZWQnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgR2l0SHViIEdpc3QgVVJMXG4gICAgICBjb25zdCBnaXN0SWQgPSB0aGlzLmV4dHJhY3RHaXN0SWQodXJsKTtcbiAgICAgIGlmIChnaXN0SWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW1wb3J0RnJvbUdpc3QoZ2lzdElkKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIGJhc2U2NCBVUkxcbiAgICAgIGlmICh1cmwuaW5jbHVkZXMoJyNkb2xsaG91c2UtcGVyc29uYT0nKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRGcm9tQmFzZTY0VXJsKHVybCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIFVSTCBmb3Igc2VjdXJpdHlcbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZVNoYXJlVXJsKHVybCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG9yIHBvdGVudGlhbGx5IG1hbGljaW91cyBVUkwnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IGRpcmVjdCBmZXRjaCB3aXRoIHRpbWVvdXRcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgNTAwMCk7IC8vIDUgc2Vjb25kIHRpbWVvdXRcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnLFxuICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgICAgICAgaWYgKCFjb250ZW50VHlwZSB8fCAhY29udGVudFR5cGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIHR5cGU6IGV4cGVjdGVkIEpTT04nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHJlc3BvbnNlIHNpemUgdG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvblxuICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSA1ICogMTAyNCAqIDEwMjQ7IC8vIDVNQiBtYXhcbiAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggJiYgcGFyc2VJbnQoY29udGVudExlbmd0aCkgPiBtYXhTaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNwb25zZSB0b28gbGFyZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIG1lc3NhZ2U6ICdTdWNjZXNzZnVsbHkgcmV0cmlldmVkIHBlcnNvbmEgZGF0YSdcbiAgICAgICAgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignSW1wb3J0IGZyb20gVVJMIGVycm9yJywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gaW1wb3J0IGZyb20gVVJMOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBHaXRIdWIgR2lzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVHaXN0KHBlcnNvbmFOYW1lOiBzdHJpbmcsIGRhdGE6IGFueSk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyB1cmw/OiBzdHJpbmc7IGdpc3RJZD86IHN0cmluZyB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBUb2tlbk1hbmFnZXIgZm9yIHNlY3VyZSB0b2tlbiBoYW5kbGluZ1xuICAgICAgY29uc3QgdG9rZW4gPSBUb2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW4oKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ05vIHZhbGlkIEdpdEh1YiB0b2tlbiBhdmFpbGFibGUgZm9yIEdpc3QgY3JlYXRpb24nKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgcmF0ZSBsaW1pdFxuICAgICAgY29uc3QgcmF0ZUxpbWl0U3RhdHVzID0gdGhpcy5naXRodWJSYXRlTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgICBpZiAoIXJhdGVMaW1pdFN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBHaXRIdWIgQVBJIHJhdGUgbGltaXQgZXhjZWVkZWQuIFJldHJ5IGFmdGVyICR7cmF0ZUxpbWl0U3RhdHVzLnJldHJ5QWZ0ZXJNc31tc2ApO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIDEwMDAwKTsgLy8gMTAgc2Vjb25kIHRpbWVvdXRcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9naXN0cycsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBEb2xsaG91c2VNQ1AgUGVyc29uYTogJHtwZXJzb25hTmFtZX1gLFxuICAgICAgICAgIHB1YmxpYzogZmFsc2UsIC8vIFByaXZhdGUgZ2lzdCBmb3Igc2VjdXJpdHlcbiAgICAgICAgICBmaWxlczoge1xuICAgICAgICAgICAgJ3BlcnNvbmEuanNvbic6IHtcbiAgICAgICAgICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0SHViIEFQSSBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBDb250ZW50LVR5cGUgZm9yIEdpdEh1YiBBUEkgcmVzcG9uc2VcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gICAgICAgIGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBHaXRIdWIgQVBJIHJlc3BvbnNlIHR5cGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdpc3QgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBDb25zdW1lIHRoZSByYXRlIGxpbWl0IHRva2VuIGFmdGVyIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICB0aGlzLmdpdGh1YlJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIHVybDogZ2lzdC5odG1sX3VybCxcbiAgICAgICAgICBnaXN0SWQ6IGdpc3QuaWRcbiAgICAgICAgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnN0IHNhZmVNZXNzYWdlID0gVG9rZW5NYW5hZ2VyLmNyZWF0ZVNhZmVFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTtcbiAgICAgIGxvZ2dlci5lcnJvcignR2lzdCBjcmVhdGlvbiBlcnJvcicsIHsgZXJyb3I6IHNhZmVNZXNzYWdlIH0pO1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFzZTY0IFVSTCAoZmFsbGJhY2spXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUJhc2U2NFVybChkYXRhOiBhbnkpOiBTaGFyZVJlc3VsdCB7XG4gICAgY29uc3QgYmFzZTY0ID0gdGhpcy5leHBvcnRlci50b0Jhc2U2NChkYXRhKTtcbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9kb2xsaG91c2VtY3AuY29tL2ltcG9ydCNkb2xsaG91c2UtcGVyc29uYT0ke2Jhc2U2NH1gO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgdXJsLFxuICAgICAgZXhwaXJlc0F0OiBkYXRhLmV4cGlyZXNBdCxcbiAgICAgIG1lc3NhZ2U6IHRoaXMuZm9ybWF0U2hhcmVTdWNjZXNzKHVybCwgZGF0YS5leHBpcmVzQXQpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgZnJvbSBHaXRIdWIgR2lzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbXBvcnRGcm9tR2lzdChnaXN0SWQ6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogYW55OyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayByYXRlIGxpbWl0XG4gICAgICBjb25zdCByYXRlTGltaXRTdGF0dXMgPSB0aGlzLmdpdGh1YlJhdGVMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICAgIGlmICghcmF0ZUxpbWl0U3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHaXRIdWIgQVBJIHJhdGUgbGltaXQgZXhjZWVkZWQuIFBsZWFzZSB0cnkgYWdhaW4gaW4gJHtNYXRoLmNlaWwocmF0ZUxpbWl0U3RhdHVzLnJldHJ5QWZ0ZXJNcyEgLyAxMDAwKX0gc2Vjb25kc2ApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBnaXN0VXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vZ2lzdHMvJHtnaXN0SWR9YDtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgVVJMIChzaG91bGQgYWx3YXlzIHBhc3MgZm9yIEdpdEh1YiBBUEkpXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVTaGFyZVVybChnaXN0VXJsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgR2l0SHViIEFQSSBVUkwnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCAxMDAwMCk7IC8vIDEwIHNlY29uZCB0aW1lb3V0IGZvciBBUElcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChnaXN0VXJsLCB7XG4gICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZ2lzdDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBDb250ZW50LVR5cGUgZm9yIEdpdEh1YiBBUEkgcmVzcG9uc2VcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gICAgICAgIGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBHaXRIdWIgQVBJIHJlc3BvbnNlIHR5cGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdpc3QgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGNvbnN0IHBlcnNvbmFGaWxlID0gZ2lzdC5maWxlc1sncGVyc29uYS5qc29uJ107XG4gICAgICAgIFxuICAgICAgICBpZiAoIXBlcnNvbmFGaWxlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBwZXJzb25hIGRhdGEgZm91bmQgaW4gZ2lzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UocGVyc29uYUZpbGUuY29udGVudCk7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBleHBpcnlcbiAgICAgICAgaWYgKGRhdGEuZXhwaXJlc0F0ICYmIG5ldyBEYXRlKGRhdGEuZXhwaXJlc0F0KSA8IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnVGhpcyBzaGFyZSBsaW5rIGhhcyBleHBpcmVkJ1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zdW1lIHRoZSByYXRlIGxpbWl0IHRva2VuIGFmdGVyIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICB0aGlzLmdpdGh1YlJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgbWVzc2FnZTogJ1N1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgcGVyc29uYSBmcm9tIEdpdEh1YidcbiAgICAgICAgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignR2lzdCBpbXBvcnQgZXJyb3InLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBpbXBvcnQgZnJvbSBnaXN0OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBVUkwgZm9yIHNlY3VyaXR5IChwcmV2ZW50IFNTUkYgYXR0YWNrcylcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTaGFyZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAvLyAxLiBVUkwgbGVuZ3RoIGNoZWNrIHRvIHByZXZlbnQgRG9TXG4gICAgICBpZiAodXJsLmxlbmd0aCA+IDIwNDgpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1VSTCBleGNlZWRzIG1heGltdW0gbGVuZ3RoJywgeyB1cmxMZW5ndGg6IHVybC5sZW5ndGggfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgICAgXG4gICAgICAvLyAyLiBQcm90b2NvbCBjaGVjayAtIG9ubHkgYWxsb3cgaHR0cC9odHRwc1xuICAgICAgaWYgKCFbJ2h0dHBzOicsICdodHRwOiddLmluY2x1ZGVzKHBhcnNlZC5wcm90b2NvbCkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgcHJvdG9jb2wgaW4gVVJMJywgeyBwcm90b2NvbDogcGFyc2VkLnByb3RvY29sIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIDMuIFBvcnQgcmVzdHJpY3Rpb25zIC0gYmxvY2sgbm9uLXN0YW5kYXJkIHBvcnRzIHRoYXQgY291bGQgYmUgaW50ZXJuYWwgc2VydmljZXNcbiAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZWQucG9ydCB8fCAocGFyc2VkLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICc0NDMnIDogJzgwJyk7XG4gICAgICBjb25zdCBhbGxvd2VkUG9ydHMgPSBbJzgwJywgJzQ0MycsICc4MDgwJywgJzg0NDMnXTtcbiAgICAgIGlmICghYWxsb3dlZFBvcnRzLmluY2x1ZGVzKHBvcnQpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdCbG9ja2VkIG5vbi1zdGFuZGFyZCBwb3J0JywgeyBwb3J0IH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIDQuIEhvc3RuYW1lIHZhbGlkYXRpb25cbiAgICAgIGNvbnN0IGhvc3RuYW1lID0gcGFyc2VkLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIC8vIEJsb2NrIHZhcmlvdXMgbG9jYWxob3N0IHJlcHJlc2VudGF0aW9uc1xuICAgICAgY29uc3QgYmxvY2tlZEhvc3RuYW1lcyA9IFtcbiAgICAgICAgJ2xvY2FsaG9zdCcsIFxuICAgICAgICAnbG9jYWxob3N0LmxvY2FsZG9tYWluJyxcbiAgICAgICAgJzAuMC4wLjAnLFxuICAgICAgICAnMCcsXG4gICAgICAgICcweDAnLFxuICAgICAgICAnMHgwMDAwMDAwMCcsXG4gICAgICAgICdbOjoxXScsXG4gICAgICAgICdbOjpmZmZmOjEyNy4wLjAuMV0nLFxuICAgICAgICAnWzAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMV0nXG4gICAgICBdO1xuICAgICAgXG4gICAgICBpZiAoYmxvY2tlZEhvc3RuYW1lcy5pbmNsdWRlcyhob3N0bmFtZSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0Jsb2NrZWQgbG9jYWxob3N0IGhvc3RuYW1lJywgeyBob3N0bmFtZSB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBCbG9jayBwcml2YXRlIElQIHJhbmdlcyB3aXRoIGNvbXByZWhlbnNpdmUgcGF0dGVybnNcbiAgICAgIGNvbnN0IHByaXZhdGVJcFBhdHRlcm5zID0gW1xuICAgICAgICAvXjEyN1xcLi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9vcGJhY2tcbiAgICAgICAgL14xMFxcLi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByaXZhdGUgY2xhc3MgQVxuICAgICAgICAvXjE5MlxcLjE2OFxcLi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByaXZhdGUgY2xhc3MgQ1xuICAgICAgICAvXjE3MlxcLigxWzYtOV18MlswLTldfDNbMC0xXSlcXC4vLCAgICAgICAgICAvLyBQcml2YXRlIGNsYXNzIEJcbiAgICAgICAgL14xNjlcXC4yNTRcXC4vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW5rLWxvY2FsXG4gICAgICAgIC9eZmMwMDovaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElQdjYgcHJpdmF0ZVxuICAgICAgICAvXmZlODA6L2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJUHY2IGxpbmstbG9jYWxcbiAgICAgICAgL146OjEkLywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSVB2NiBsb29wYmFja1xuICAgICAgICAvXjo6ZmZmZjowPzo/MD86PzA/Oj8wPyQvaSwgICAgICAgICAgICAgICAgLy8gSVB2NiBtYXBwZWQgSVB2NFxuICAgICAgICAvXjEwMFxcLjZbNC05XVxcLi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2Fycmllci1ncmFkZSBOQVRcbiAgICAgICAgL14xMDBcXC5bNy05XVswLTldXFwuLywgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcnJpZXItZ3JhZGUgTkFUXG4gICAgICAgIC9eMTAwXFwuMVswLTJdWzAtOV1cXC4vLCAgICAgICAgICAgICAgICAgICAgICAvLyBDYXJyaWVyLWdyYWRlIE5BVFxuICAgICAgICAvXjBcXC4vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXJ2ZWRcbiAgICAgICAgL14yNTVcXC4yNTVcXC4yNTVcXC4yNTUkLyAgICAgICAgICAgICAgICAgICAgICAvLyBCcm9hZGNhc3RcbiAgICAgIF07XG4gICAgICBcbiAgICAgIGlmIChwcml2YXRlSXBQYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gcGF0dGVybi50ZXN0KGhvc3RuYW1lKSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0Jsb2NrZWQgcHJpdmF0ZSBJUCByYW5nZScsIHsgaG9zdG5hbWUgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQmxvY2sgY2xvdWQgbWV0YWRhdGEgZW5kcG9pbnRzXG4gICAgICBjb25zdCBtZXRhZGF0YUVuZHBvaW50cyA9IFtcbiAgICAgICAgJzE2OS4yNTQuMTY5LjI1NCcsICAgICAvLyBBV1MvR0NQL0F6dXJlXG4gICAgICAgICdtZXRhZGF0YS5nb29nbGUuaW50ZXJuYWwnLFxuICAgICAgICAnbWV0YWRhdGEuYXp1cmUuY29tJyxcbiAgICAgICAgJzEwMC4xMDAuMTAwLjIwMCcgICAgICAvLyBBbGliYWJhIENsb3VkXG4gICAgICBdO1xuICAgICAgXG4gICAgICBpZiAobWV0YWRhdGFFbmRwb2ludHMuaW5jbHVkZXMoaG9zdG5hbWUpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdCbG9ja2VkIGNsb3VkIG1ldGFkYXRhIGVuZHBvaW50JywgeyBob3N0bmFtZSB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBCbG9jayBudW1lcmljIElQIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvdWxkIGJ5cGFzcyBjaGVja3NcbiAgICAgIGlmICgvXlxcZCskLy50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgICAvLyBDb252ZXJ0IGRlY2ltYWwgdG8gSVAgYW5kIGNoZWNrXG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KGhvc3RuYW1lLCAxMCk7XG4gICAgICAgIGlmIChudW0gPD0gMHhGRkZGRkZGRikge1xuICAgICAgICAgIGNvbnN0IGlwID0gYCR7KG51bSA+Pj4gMjQpICYgMHhGRn0uJHsobnVtID4+PiAxNikgJiAweEZGfS4keyhudW0gPj4+IDgpICYgMHhGRn0uJHtudW0gJiAweEZGfWA7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0Jsb2NrZWQgbnVtZXJpYyBJUCByZXByZXNlbnRhdGlvbicsIHsgaG9zdG5hbWUsIHJlc29sdmVkSXA6IGlwIH0pO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBCbG9jayBoZXggSVAgcmVwcmVzZW50YXRpb25zXG4gICAgICBpZiAoL14weFswLTlhLWZdKyQvaS50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgICBsb2dnZXIud2FybignQmxvY2tlZCBoZXggSVAgcmVwcmVzZW50YXRpb24nLCB7IGhvc3RuYW1lIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGRvbWFpbiBmb3JtYXQgKGJhc2ljIGNoZWNrKVxuICAgICAgLy8gQWxsb3cgR2l0SHViIGRvbWFpbnMgYW5kIGNvbW1vbiBzaGFyZSBwbGF0Zm9ybXNcbiAgICAgIGNvbnN0IHRydXN0ZWREb21haW5zID0gW1xuICAgICAgICAnZ2l0aHViLmNvbScsXG4gICAgICAgICdnaXN0LmdpdGh1Yi5jb20nLCBcbiAgICAgICAgJ2FwaS5naXRodWIuY29tJyxcbiAgICAgICAgJ3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20nLFxuICAgICAgICAnZG9sbGhvdXNlbWNwLmNvbSdcbiAgICAgIF07XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSB0cnVzdGVkIGRvbWFpblxuICAgICAgY29uc3QgaXNUcnVzdGVkRG9tYWluID0gdHJ1c3RlZERvbWFpbnMuc29tZShkb21haW4gPT4gXG4gICAgICAgIGhvc3RuYW1lID09PSBkb21haW4gfHwgaG9zdG5hbWUuZW5kc1dpdGgoYC4ke2RvbWFpbn1gKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgaWYgKCFpc1RydXN0ZWREb21haW4pIHtcbiAgICAgICAgLy8gRm9yIG5vbi10cnVzdGVkIGRvbWFpbnMsIGFwcGx5IHN0cmljdGVyIHZhbGlkYXRpb25cbiAgICAgICAgLy8gTXVzdCBiZSBhIHZhbGlkIGRvbWFpbiBmb3JtYXQsIG5vdCBqdXN0IGFuIElQXG4gICAgICAgIGNvbnN0IGRvbWFpblBhdHRlcm4gPSAvXihbYS16MC05XSsoLVthLXowLTldKykqXFwuKStbYS16XXsyLH0kL2k7XG4gICAgICAgIGNvbnN0IGlwdjRQYXR0ZXJuID0gL15cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfSQvO1xuICAgICAgICBjb25zdCBpcHY2UGF0dGVybiA9IC9eXFxbPyhbMC05YS1mXXswLDR9Oil7Miw3fVswLTlhLWZdezAsNH1cXF0/JC9pO1xuICAgICAgICBcbiAgICAgICAgaWYgKGlwdjRQYXR0ZXJuLnRlc3QoaG9zdG5hbWUpIHx8IGlwdjZQYXR0ZXJuLnRlc3QoaG9zdG5hbWUpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0RpcmVjdCBJUCBhY2Nlc3Mgbm90IGFsbG93ZWQgZm9yIHVudHJ1c3RlZCBzb3VyY2VzJywgeyBob3N0bmFtZSB9KTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICghZG9tYWluUGF0dGVybi50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdJbnZhbGlkIGRvbWFpbiBmb3JtYXQnLCB7IGhvc3RuYW1lIH0pO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ1VSTCB2YWxpZGF0aW9uIHBhc3NlZCcsIHsgXG4gICAgICAgIGhvc3RuYW1lLCBcbiAgICAgICAgcHJvdG9jb2w6IHBhcnNlZC5wcm90b2NvbCxcbiAgICAgICAgaXNUcnVzdGVkOiBpc1RydXN0ZWREb21haW4gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdVUkwgdmFsaWRhdGlvbiBlcnJvcicsIHsgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgZnJvbSBiYXNlNjQgVVJMXG4gICAqL1xuICBwcml2YXRlIGltcG9ydEZyb21CYXNlNjRVcmwodXJsOiBzdHJpbmcpOiB7IHN1Y2Nlc3M6IGJvb2xlYW47IGRhdGE/OiBhbnk7IG1lc3NhZ2U6IHN0cmluZyB9IHtcbiAgICB0cnkge1xuICAgICAgLy8gTGltaXQgYmFzZTY0IGxlbmd0aCB0byBwcmV2ZW50IFJlRG9TIGF0dGFja3MgKDEwS0IgbWF4IGZvciBiYXNlNjQgZW5jb2RlZCBkYXRhKVxuICAgICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goLyNkb2xsaG91c2UtcGVyc29uYT0oW0EtWmEtejAtOSsvPV17MSwxMDAwMH0pJC8pO1xuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2hhcmUgVVJMIGZvcm1hdCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlNjQgPSBtYXRjaFsxXTtcbiAgICAgIGNvbnN0IGpzb24gPSBCdWZmZXIuZnJvbShiYXNlNjQsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xuXG4gICAgICAvLyBDaGVjayBleHBpcnlcbiAgICAgIGlmIChkYXRhLmV4cGlyZXNBdCAmJiBuZXcgRGF0ZShkYXRhLmV4cGlyZXNBdCkgPCBuZXcgRGF0ZSgpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1RoaXMgc2hhcmUgbGluayBoYXMgZXhwaXJlZCdcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgbWVzc2FnZTogJ1N1Y2Nlc3NmdWxseSBkZWNvZGVkIHBlcnNvbmEgZGF0YSdcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gZGVjb2RlIHNoYXJlIFVSTDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBHaXN0IElEIGZyb20gR2l0SHViIFVSTFxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0R2lzdElkKHVybDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goL2dpc3RcXC5naXRodWJcXC5jb21cXC9bXlxcL10rXFwvKFthLWYwLTldKykvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHNoYXJlIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRTaGFyZVN1Y2Nlc3ModXJsOiBzdHJpbmcsIGV4cGlyZXNBdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBleHBpcnlEYXRlID0gbmV3IERhdGUoZXhwaXJlc0F0KTtcbiAgICBjb25zdCBkYXlzVW50aWxFeHBpcnkgPSBNYXRoLmNlaWwoKGV4cGlyeURhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCkpO1xuXG4gICAgcmV0dXJuIGDinIUgU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2hhcmUgbGluayFcblxu8J+UlyBTaGFyZSBVUkw6XG4ke3VybH1cblxu4o+x77iPIEV4cGlyZXM6ICR7ZXhwaXJ5RGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKX0gKCR7ZGF5c1VudGlsRXhwaXJ5fSBkYXlzKVxuXG7wn5OLIFRvIHNoYXJlIHRoaXMgcGVyc29uYTpcbjEuIENvcHkgdGhlIFVSTCBhYm92ZVxuMi4gU2hhcmUgaXQgd2l0aCBvdGhlcnNcbjMuIFRoZXkgY2FuIGltcG9ydCB1c2luZzogaW1wb3J0X2Zyb21fdXJsIFwiJHt1cmx9XCJcblxu8J+UkiBQcml2YWN5OiBUaGlzIGxpbmsgaXMgcHJpdmF0ZSBhbmQgd2lsbCBleHBpcmUgYXV0b21hdGljYWxseS5gO1xuICB9XG59Il19
|
|
678
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyc29uYVNoYXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wZXJzb25hL2V4cG9ydC1pbXBvcnQvUGVyc29uYVNoYXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFtQixNQUFNLHNCQUFzQixDQUFDO0FBRXhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVV2RSxNQUFNLE9BQU8sYUFBYTtJQUtkO0lBQ0E7SUFMRixRQUFRLENBQWtCO0lBQzFCLGlCQUFpQixDQUFjO0lBRXZDLFlBQ1UsWUFBMEIsRUFDMUIsV0FBMEI7UUFEMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWU7UUFFbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVqRCxrRUFBa0U7UUFDbEUsOERBQThEO1FBQzlELE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxjQUFjLEVBQUUsS0FBSyxJ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Q3RFLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLE9BQU87d0JBQ0wsT0FBTyxFQUFFLEtBQUs7d0JBQ2QsS0FBSyxFQUFFLHdCQUF3QixPQUFPLEVBQUU7cUJBQ3pDLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsMkNBQTJDO1FBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUU7WUFDN0MsV0FBVyxFQUFFLFFBQVE7WUFDckIsWUFBWSxFQUFFLHNCQUFzQjtTQUNyQyxDQUFDLENBQUM7UUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGVyc29uYSBzaGFyaW5nIGZ1bmN0aW9uYWxpdHkgdmlhIFVSTHNcbiAqIFxuICogU0VDVVJJVFkgRklYIElNUExFTUVOVEVEIChEZWZlbnNlLWluLURlcHRoIFZhbGlkYXRpb24pOlxuICogMS4gQ1JJVElDQUw6IEFkZGVkIHZhbGlkYXRlLWJlZm9yZS1yZXR1cm4gcGF0dGVybiBpbiBhbGwgaW1wb3J0IG1ldGhvZHNcbiAqIDIuIEhJR0g6IENvbnRlbnQgc2VjdXJpdHkgdmFsaWRhdGlvbiB1c2luZyBDb250ZW50VmFsaWRhdG9yIGJlZm9yZSBkYXRhIHJldHVyblxuICogMy4gTUVESVVNOiBTaXplIHZhbGlkYXRpb24gdG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvbiBhdHRhY2tzXG4gKiA0LiBNRURJVU06IFN0cnVjdHVyZSB2YWxpZGF0aW9uIHRvIHByZXZlbnQgbWFsZm9ybWVkIGRhdGEgcHJvY2Vzc2luZ1xuICogNS4gREVGRU5TRS1JTi1ERVBUSDogTXVsdGlwbGUgdmFsaWRhdGlvbiBsYXllcnMgYmVmb3JlIFBlcnNvbmFJbXBvcnRlciBwcm9jZXNzaW5nXG4gKiBcbiAqIFRoaXMgcHJvdmlkZXMgZGVmZW5zZS1pbi1kZXB0aCBzZWN1cml0eSBieSB2YWxpZGF0aW5nIGNvbnRlbnQgYXQgdGhlIGVhcmxpZXN0XG4gKiBwb3NzaWJsZSBwb2ludCBiZWZvcmUgYW55IGRhdGEgaXMgcmV0dXJuZWQgdG8gY2FsbGluZyBjb2RlIG9yIGZpbGUgb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQgeyBQZXJzb25hIH0gZnJvbSAnLi4vLi4vdHlwZXMvcGVyc29uYS5qcyc7XG5pbXBvcnQgeyBQZXJzb25hRXhwb3J0ZXIsIEV4cG9ydGVkUGVyc29uYSB9IGZyb20gJy4vUGVyc29uYUV4cG9ydGVyLmpzJztcbmltcG9ydCB7IEdpdEh1YkNsaWVudCB9IGZyb20gJy4uLy4uL2NvbGxlY3Rpb24vR2l0SHViQ2xpZW50LmpzJztcbmltcG9ydCB7IFRva2VuTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3Rva2VuTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZXJyb3JzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi4vLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvckNvZGVzLCBOZXR3b3JrRXJyb3JDb2RlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2Vycm9yQ29kZXMuanMnO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi8uLi91dGlscy9SYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUNvbnRlbnRTaXplIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgdXJsPzogc3RyaW5nO1xuICBnaXN0SWQ/OiBzdHJpbmc7XG4gIGV4cGlyZXNBdD86IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUGVyc29uYVNoYXJlciB7XG4gIHByaXZhdGUgZXhwb3J0ZXI6IFBlcnNvbmFFeHBvcnRlcjtcbiAgcHJpdmF0ZSBnaXRodWJSYXRlTGltaXRlcjogUmF0ZUxpbWl0ZXI7XG4gIFxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50LFxuICAgIHByaXZhdGUgY3VycmVudFVzZXI6IHN0cmluZyB8IG51bGxcbiAgKSB7XG4gICAgdGhpcy5leHBvcnRlciA9IG5ldyBQZXJzb25hRXhwb3J0ZXIoY3VycmVudFVzZXIpO1xuICAgIFxuICAgIC8vIEdpdEh1YiBBUEkgcmF0ZSBsaW1pdDogNjAgcmVxdWVzdHMgcGVyIGhvdXIgZm9yIHVuYXV0aGVudGljYXRlZFxuICAgIC8vIDUwMDAgcGVyIGhvdXIgZm9yIGF1dGhlbnRpY2F0ZWQgLSB1c2UgVG9rZW5NYW5hZ2VyIHRvIGNoZWNrXG4gICAgY29uc3QgaGFzVmFsaWRUb2tlbiA9IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbigpICE9PSBudWxsO1xuICAgIHRoaXMuZ2l0aHViUmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoe1xuICAgICAgbWF4UmVxdWVzdHM6IGhhc1ZhbGlkVG9rZW4gPyAxMDAgOiAzMCwgLy8gQ29uc2VydmF0aXZlIGxpbWl0c1xuICAgICAgd2luZG93TXM6IDYwICogNjAgKiAxMDAwLCAvLyAxIGhvdXJcbiAgICAgIG1pbkRlbGF5TXM6IDEwMDAgLy8gTWluaW11bSAxIHNlY29uZCBiZXR3ZWVuIHJlcXVlc3RzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgYSBwZXJzb25hIHZpYSBHaXRIdWIgR2lzdFxuICAgKi9cbiAgYXN5bmMgc2hhcmVQZXJzb25hKHBlcnNvbmE6IFBlcnNvbmEsIGV4cGlyeURheXM6IG51bWJlciA9IDcpOiBQcm9taXNlPFNoYXJlUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIGdpc3QgcGVybWlzc2lvbnMgaWYgdG9rZW4gaXMgYXZhaWxhYmxlXG4gICAgICBjb25zdCB0b2tlbiA9IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbigpO1xuICAgICAgbGV0IGhhc1ZhbGlkVG9rZW4gPSBmYWxzZTtcbiAgICAgIFxuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IGF3YWl0IFRva2VuTWFuYWdlci5lbnN1cmVUb2tlblBlcm1pc3Npb25zKCdnaXN0Jyk7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNhZmVNZXNzYWdlID0gVG9rZW5NYW5hZ2VyLmNyZWF0ZVNhZmVFcnJvck1lc3NhZ2UodmFsaWRhdGlvbi5lcnJvciB8fCAnVW5rbm93biB2YWxpZGF0aW9uIGVycm9yJywgdG9rZW4pO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0dpdEh1YiB0b2tlbiBsYWNrcyBnaXN0IHBlcm1pc3Npb25zLCBmYWxsaW5nIGJhY2sgdG8gYmFzZTY0IFVSTCcsIHsgZXJyb3I6IHNhZmVNZXNzYWdlIH0pO1xuICAgICAgICAgICAgLy8gQ29udGludWUgdG8gZmFsbGJhY2sgaW5zdGVhZCBvZiBmYWlsaW5nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhc1ZhbGlkVG9rZW4gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgcmF0ZSBsaW1pdGluZyBvciBvdGhlciBzZWN1cml0eSBlcnJvcnMgZ3JhY2VmdWxseVxuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ1JBVEVfTElNSVRfRVhDRUVERUQnKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZWQsIGZhbGxpbmcgYmFjayB0byBiYXNlNjQgVVJMJywgeyBcbiAgICAgICAgICAgICAgZXJyb3I6ICdSYXRlIGxpbWl0IGV4Y2VlZGVkIGZvciB0b2tlbiB2YWxpZGF0aW9uJyBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgY29uc3Qgc2FmZU1lc3NhZ2UgPSBUb2tlbk1hbmFnZXIuY3JlYXRlU2FmZUVycm9yTWVzc2FnZShlcnJvci5tZXNzYWdlLCB0b2tlbik7XG4gICAgICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBiYXNlNjQgVVJMJywgeyBlcnJvcjogc2FmZU1lc3NhZ2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENvbnRpbnVlIHRvIGZhbGxiYWNrIGluc3RlYWQgb2YgZmFpbGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEV4cG9ydCBwZXJzb25hIHRvIHN0cnVjdHVyZWQgZm9ybWF0XG4gICAgICBjb25zdCBleHBvcnREYXRhID0gdGhpcy5leHBvcnRlci5leHBvcnRQZXJzb25hKHBlcnNvbmEpO1xuICAgICAgXG4gICAgICAvLyBBZGQgc2hhcmluZyBtZXRhZGF0YVxuICAgICAgY29uc3Qgc2hhcmVEYXRhID0ge1xuICAgICAgICAuLi5leHBvcnREYXRhLFxuICAgICAgICBzaGFyZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBzaGFyZWRCeTogdGhpcy5jdXJyZW50VXNlciB8fCAnYW5vbnltb3VzJyxcbiAgICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShEYXRlLm5vdygpICsgZXhwaXJ5RGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNoYXJlVmVyc2lvbjogJzEuMC4wJ1xuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIEdpdEh1YiBHaXN0IGlmIHRva2VuIGhhcyBwcm9wZXIgcGVybWlzc2lvbnNcbiAgICAgIGlmIChoYXNWYWxpZFRva2VuKSB7XG4gICAgICAgIGNvbnN0IGdpc3RSZXN1bHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUdpc3QocGVyc29uYS5tZXRhZGF0YS5uYW1lLCBzaGFyZURhdGEpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGdpc3RSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgdXJsOiBnaXN0UmVzdWx0LnVybCEsXG4gICAgICAgICAgICBnaXN0SWQ6IGdpc3RSZXN1bHQuZ2lzdElkLFxuICAgICAgICAgICAgZXhwaXJlc0F0OiBzaGFyZURhdGEuZXhwaXJlc0F0LFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5mb3JtYXRTaGFyZVN1Y2Nlc3MoZ2lzdFJlc3VsdC51cmwhLCBzaGFyZURhdGEuZXhwaXJlc0F0KVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2sgdG8gYmFzZTY0IFVSTCBpZiBHaXN0IGZhaWxzIG9yIG5vIHRva2VuXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVCYXNlNjRVcmwoc2hhcmVEYXRhKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zdCBzYWZlTWVzc2FnZSA9IFRva2VuTWFuYWdlci5jcmVhdGVTYWZlRXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1NoYXJlIGVycm9yJywgeyBlcnJvcjogc2FmZU1lc3NhZ2UgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIHNoYXJlIHBlcnNvbmE6ICR7c2FmZU1lc3NhZ2V9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgcGVyc29uYSBmcm9tIGEgc2hhcmUgVVJMXG4gICAqIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgQUxMIGNvbnRlbnQgYmVmb3JlIHJldHVybmluZyBhbnkgZGF0YVxuICAgKi9cbiAgYXN5bmMgaW1wb3J0RnJvbVVybCh1cmw6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogYW55OyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBVUkwgZmlyc3RcbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZVNoYXJlVXJsKHVybCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBvciB1bnNhZmUgVVJMIHByb3ZpZGVkJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIEdpdEh1YiBHaXN0IFVSTFxuICAgICAgY29uc3QgZ2lzdElkID0gdGhpcy5leHRyYWN0R2lzdElkKHVybCk7XG4gICAgICBpZiAoZ2lzdElkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmltcG9ydEZyb21HaXN0KGdpc3RJZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBiYXNlNjQgVVJMXG4gICAgICBpZiAodXJsLmluY2x1ZGVzKCcjZG9sbGhvdXNlLXBlcnNvbmE9JykpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW1wb3J0RnJvbUJhc2U2NFVybCh1cmwpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBVUkwgZm9yIHNlY3VyaXR5XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVTaGFyZVVybCh1cmwpKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignSW52YWxpZCBvciBwb3RlbnRpYWxseSBtYWxpY2lvdXMgVVJMJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1VSTCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyeSBkaXJlY3QgZmV0Y2ggd2l0aCB0aW1lb3V0XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIDUwMDApOyAvLyA1IHNlY29uZCB0aW1lb3V0XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJyxcbiAgICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gLCBFcnJvckNhdGVnb3J5Lk5FVFdPUktfRVJST1IsIE5ldHdvcmtFcnJvckNvZGVzLlJFUVVFU1RfRkFJTEVEKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVOSEFOQ0VEIFNFQ1VSSVRZIEZJWDogQ29tcHJlaGVuc2l2ZSBDb250ZW50LVR5cGUgdmFsaWRhdGlvblxuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgICAgICAgY29uc3QgY29udGVudFR5cGVWYWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICBpZiAoIWNvbnRlbnRUeXBlVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgcmVzcG9uc2UgdHlwZTogJHtjb250ZW50VHlwZVZhbGlkYXRpb24uZXJyb3J9YCwgXG4gICAgICAgICAgICBFcnJvckNhdGVnb3J5Lk5FVFdPUktfRVJST1IsIFxuICAgICAgICAgICAgTmV0d29ya0Vycm9yQ29kZXMuSU5WQUxJRF9SRVNQT05TRVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayByZXNwb25zZSBzaXplIHRvIHByZXZlbnQgbWVtb3J5IGV4aGF1c3Rpb25cbiAgICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpO1xuICAgICAgICBjb25zdCBtYXhTaXplID0gNSAqIDEwMjQgKiAxMDI0OyAvLyA1TUIgbWF4XG4gICAgICAgIGlmIChjb250ZW50TGVuZ3RoICYmIHBhcnNlSW50KGNvbnRlbnRMZW5ndGgpID4gbWF4U2l6ZSkge1xuICAgICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUmVzcG9uc2UgdG9vIGxhcmdlJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBOZXR3b3JrRXJyb3JDb2Rlcy5SRVNQT05TRV9UT09fTEFSR0UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgY29udGVudCBiZWZvcmUgcmV0dXJuaW5nXG4gICAgICAgIGNvbnN0IGRhdGFWYWxpZGF0aW9uID0gYXdhaXQgdGhpcy52YWxpZGF0ZVBlcnNvbmFEYXRhKGRhdGEpO1xuICAgICAgICBpZiAoIWRhdGFWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgQ29udGVudCB2YWxpZGF0aW9uIGZhaWxlZDogJHtkYXRhVmFsaWRhdGlvbi5lcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgbWVzc2FnZTogJ1N1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgcGVyc29uYSBkYXRhJ1xuICAgICAgICB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdJbXBvcnQgZnJvbSBVUkwgZXJyb3InLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBpbXBvcnQgZnJvbSBVUkw6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEdpdEh1YiBHaXN0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUdpc3QocGVyc29uYU5hbWU6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IHVybD86IHN0cmluZzsgZ2lzdElkPzogc3RyaW5nIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIFRva2VuTWFuYWdlciBmb3Igc2VjdXJlIHRva2VuIGhhbmRsaW5nXG4gICAgICBjb25zdCB0b2tlbiA9IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbigpO1xuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICBsb2dnZXIuaW5mbygnTm8gdmFsaWQgR2l0SHViIHRva2VuIGF2YWlsYWJsZSBmb3IgR2lzdCBjcmVhdGlvbicpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayByYXRlIGxpbWl0XG4gICAgICBjb25zdCByYXRlTGltaXRTdGF0dXMgPSB0aGlzLmdpdGh1YlJhdGVMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICAgIGlmICghcmF0ZUxpbWl0U3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEdpdEh1YiBBUEkgcmF0ZSBsaW1pdCBleGNlZWRlZC4gUmV0cnkgYWZ0ZXIgJHtyYXRlTGltaXRTdGF0dXMucmV0cnlBZnRlck1zfW1zYCk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgMTAwMDApOyAvLyAxMCBzZWNvbmQgdGltZW91dFxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL2FwaS5naXRodWIuY29tL2dpc3RzJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uJyxcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYERvbGxob3VzZU1DUCBQZXJzb25hOiAke3BlcnNvbmFOYW1lfWAsXG4gICAgICAgICAgcHVibGljOiBmYWxzZSwgLy8gUHJpdmF0ZSBnaXN0IGZvciBzZWN1cml0eVxuICAgICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgICAncGVyc29uYS5qc29uJzoge1xuICAgICAgICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBHaXRIdWIgQVBJIGVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c31gLCBFcnJvckNhdGVnb3J5Lk5FVFdPUktfRVJST1IsIE5ldHdvcmtFcnJvckNvZGVzLkFQSV9FUlJPUik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFTkhBTkNFRCBTRUNVUklUWSBGSVg6IENvbXByZWhlbnNpdmUgQ29udGVudC1UeXBlIHZhbGlkYXRpb24gZm9yIEdpdEh1YiBBUElcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gICAgICAgIGNvbnN0IGdpc3RDb250ZW50VHlwZVZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlQ29udGVudFR5cGUoY29udGVudFR5cGUsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIGlmICghZ2lzdENvbnRlbnRUeXBlVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgR2l0SHViIEFQSSByZXNwb25zZSB0eXBlOiAke2dpc3RDb250ZW50VHlwZVZhbGlkYXRpb24uZXJyb3J9YCwgXG4gICAgICAgICAgICBFcnJvckNhdGVnb3J5Lk5FVFdPUktfRVJST1IsIFxuICAgICAgICAgICAgTmV0d29ya0Vycm9yQ29kZXMuSU5WQUxJRF9SRVNQT05TRVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBnaXN0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ29uc3VtZSB0aGUgcmF0ZSBsaW1pdCB0b2tlbiBhZnRlciBzdWNjZXNzZnVsIHJlcXVlc3RcbiAgICAgICAgdGhpcy5naXRodWJSYXRlTGltaXRlci5jb25zdW1lVG9rZW4oKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICB1cmw6IGdpc3QuaHRtbF91cmwsXG4gICAgICAgICAgZ2lzdElkOiBnaXN0LmlkXG4gICAgICAgIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zdCBzYWZlTWVzc2FnZSA9IFRva2VuTWFuYWdlci5jcmVhdGVTYWZlRXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0dpc3QgY3JlYXRpb24gZXJyb3InLCB7IGVycm9yOiBzYWZlTWVzc2FnZSB9KTtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhc2U2NCBVUkwgKGZhbGxiYWNrKVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVCYXNlNjRVcmwoZGF0YTogYW55KTogU2hhcmVSZXN1bHQge1xuICAgIGNvbnN0IGJhc2U2NCA9IHRoaXMuZXhwb3J0ZXIudG9CYXNlNjQoZGF0YSk7XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vZG9sbGhvdXNlbWNwLmNvbS9pbXBvcnQjZG9sbGhvdXNlLXBlcnNvbmE9JHtiYXNlNjR9YDtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHVybCxcbiAgICAgIGV4cGlyZXNBdDogZGF0YS5leHBpcmVzQXQsXG4gICAgICBtZXNzYWdlOiB0aGlzLmZvcm1hdFNoYXJlU3VjY2Vzcyh1cmwsIGRhdGEuZXhwaXJlc0F0KVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGZyb20gR2l0SHViIEdpc3RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW1wb3J0RnJvbUdpc3QoZ2lzdElkOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZGF0YT86IGFueTsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgcmF0ZSBsaW1pdFxuICAgICAgY29uc3QgcmF0ZUxpbWl0U3RhdHVzID0gdGhpcy5naXRodWJSYXRlTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgICBpZiAoIXJhdGVMaW1pdFN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgR2l0SHViIEFQSSByYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGluICR7TWF0aC5jZWlsKHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMhIC8gMTAwMCl9IHNlY29uZHNgLCBFcnJvckNhdGVnb3J5Lk5FVFdPUktfRVJST1IsIE5ldHdvcmtFcnJvckNvZGVzLlJBVEVfTElNSVRfRVhDRUVERUQpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBnaXN0VXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vZ2lzdHMvJHtnaXN0SWR9YDtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgVVJMIChzaG91bGQgYWx3YXlzIHBhc3MgZm9yIEdpdEh1YiBBUEkpXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVTaGFyZVVybChnaXN0VXJsKSkge1xuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0ludmFsaWQgR2l0SHViIEFQSSBVUkwnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfVVJMKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCAxMDAwMCk7IC8vIDEwIHNlY29uZCB0aW1lb3V0IGZvciBBUElcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChnaXN0VXJsLCB7XG4gICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZ2lzdDogJHtyZXNwb25zZS5zdGF0dXN9YCwgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SLCBOZXR3b3JrRXJyb3JDb2Rlcy5GRVRDSF9GQUlMRUQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRU5IQU5DRUQgU0VDVVJJVFkgRklYOiBDb21wcmVoZW5zaXZlIENvbnRlbnQtVHlwZSB2YWxpZGF0aW9uIGZvciBHaXRIdWIgQVBJXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuICAgICAgICBjb25zdCBnaXN0Q29udGVudFR5cGVWYWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICBpZiAoIWdpc3RDb250ZW50VHlwZVZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIEdpdEh1YiBBUEkgcmVzcG9uc2UgdHlwZTogJHtnaXN0Q29udGVudFR5cGVWYWxpZGF0aW9uLmVycm9yfWAsIFxuICAgICAgICAgICAgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SLCBcbiAgICAgICAgICAgIE5ldHdvcmtFcnJvckNvZGVzLklOVkFMSURfUkVTUE9OU0VcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ2lzdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgY29uc3QgcGVyc29uYUZpbGUgPSBnaXN0LmZpbGVzWydwZXJzb25hLmpzb24nXTtcbiAgICAgICAgXG4gICAgICAgIGlmICghcGVyc29uYUZpbGUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ05vIHBlcnNvbmEgZGF0YSBmb3VuZCBpbiBnaXN0JywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0lOUFVUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHBlcnNvbmFGaWxlLmNvbnRlbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgZXhwaXJ5XG4gICAgICAgIGlmIChkYXRhLmV4cGlyZXNBdCAmJiBuZXcgRGF0ZShkYXRhLmV4cGlyZXNBdCkgPCBuZXcgRGF0ZSgpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1RoaXMgc2hhcmUgbGluayBoYXMgZXhwaXJlZCdcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU0VDVVJJVFkgRklYOiBWYWxpZGF0ZSBjb250ZW50IGJlZm9yZSByZXR1cm5pbmdcbiAgICAgICAgY29uc3QgZ2lzdERhdGFWYWxpZGF0aW9uID0gYXdhaXQgdGhpcy52YWxpZGF0ZVBlcnNvbmFEYXRhKGRhdGEpO1xuICAgICAgICBpZiAoIWdpc3REYXRhVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoYENvbnRlbnQgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7Z2lzdERhdGFWYWxpZGF0aW9uLmVycm9yfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uc3VtZSB0aGUgcmF0ZSBsaW1pdCB0b2tlbiBhZnRlciBzdWNjZXNzZnVsIHJlcXVlc3RcbiAgICAgICAgdGhpcy5naXRodWJSYXRlTGltaXRlci5jb25zdW1lVG9rZW4oKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIG1lc3NhZ2U6ICdTdWNjZXNzZnVsbHkgcmV0cmlldmVkIHBlcnNvbmEgZnJvbSBHaXRIdWInXG4gICAgICAgIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0dpc3QgaW1wb3J0IGVycm9yJywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gaW1wb3J0IGZyb20gZ2lzdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgVVJMIGZvciBzZWN1cml0eSAocHJldmVudCBTU1JGIGF0dGFja3MpXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2hhcmVVcmwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgLy8gMS4gVVJMIGxlbmd0aCBjaGVjayB0byBwcmV2ZW50IERvU1xuICAgICAgaWYgKHVybC5sZW5ndGggPiAyMDQ4KSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdVUkwgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCcsIHsgdXJsTGVuZ3RoOiB1cmwubGVuZ3RoIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICAgIFxuICAgICAgLy8gMi4gUHJvdG9jb2wgY2hlY2sgLSBvbmx5IGFsbG93IGh0dHAvaHR0cHNcbiAgICAgIGlmICghWydodHRwczonLCAnaHR0cDonXS5pbmNsdWRlcyhwYXJzZWQucHJvdG9jb2wpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdJbnZhbGlkIHByb3RvY29sIGluIFVSTCcsIHsgcHJvdG9jb2w6IHBhcnNlZC5wcm90b2NvbCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyAzLiBQb3J0IHJlc3RyaWN0aW9ucyAtIGJsb2NrIG5vbi1zdGFuZGFyZCBwb3J0cyB0aGF0IGNvdWxkIGJlIGludGVybmFsIHNlcnZpY2VzXG4gICAgICBjb25zdCBwb3J0ID0gcGFyc2VkLnBvcnQgfHwgKHBhcnNlZC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnNDQzJyA6ICc4MCcpO1xuICAgICAgY29uc3QgYWxsb3dlZFBvcnRzID0gWyc4MCcsICc0NDMnLCAnODA4MCcsICc4NDQzJ107XG4gICAgICBpZiAoIWFsbG93ZWRQb3J0cy5pbmNsdWRlcyhwb3J0KSkge1xuICAgICAgICBsb2dnZXIud2FybignQmxvY2tlZCBub24tc3RhbmRhcmQgcG9ydCcsIHsgcG9ydCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyA0LiBIb3N0bmFtZSB2YWxpZGF0aW9uXG4gICAgICBjb25zdCBob3N0bmFtZSA9IHBhcnNlZC5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgXG4gICAgICAvLyBCbG9jayB2YXJpb3VzIGxvY2FsaG9zdCByZXByZXNlbnRhdGlvbnNcbiAgICAgIGNvbnN0IGJsb2NrZWRIb3N0bmFtZXMgPSBbXG4gICAgICAgICdsb2NhbGhvc3QnLCBcbiAgICAgICAgJ2xvY2FsaG9zdC5sb2NhbGRvbWFpbicsXG4gICAgICAgICcwLjAuMC4wJyxcbiAgICAgICAgJzAnLFxuICAgICAgICAnMHgwJyxcbiAgICAgICAgJzB4MDAwMDAwMDAnLFxuICAgICAgICAnWzo6MV0nLFxuICAgICAgICAnWzo6ZmZmZjoxMjcuMC4wLjFdJyxcbiAgICAgICAgJ1swMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDFdJ1xuICAgICAgXTtcbiAgICAgIFxuICAgICAgaWYgKGJsb2NrZWRIb3N0bmFtZXMuaW5jbHVkZXMoaG9zdG5hbWUpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdCbG9ja2VkIGxvY2FsaG9zdCBob3N0bmFtZScsIHsgaG9zdG5hbWUgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQmxvY2sgcHJpdmF0ZSBJUCByYW5nZXMgd2l0aCBjb21wcmVoZW5zaXZlIHBhdHRlcm5zXG4gICAgICBjb25zdCBwcml2YXRlSXBQYXR0ZXJucyA9IFtcbiAgICAgICAgL14xMjdcXC4vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvb3BiYWNrXG4gICAgICAgIC9eMTBcXC4vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcml2YXRlIGNsYXNzIEFcbiAgICAgICAgL14xOTJcXC4xNjhcXC4vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcml2YXRlIGNsYXNzIENcbiAgICAgICAgL14xNzJcXC4oMVs2LTldfDJbMC05XXwzWzAtMV0pXFwuLywgICAgICAgICAgLy8gUHJpdmF0ZSBjbGFzcyBCXG4gICAgICAgIC9eMTY5XFwuMjU0XFwuLywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGluay1sb2NhbFxuICAgICAgICAvXmZjMDA6L2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJUHY2IHByaXZhdGVcbiAgICAgICAgL15mZTgwOi9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSVB2NiBsaW5rLWxvY2FsXG4gICAgICAgIC9eOjoxJC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElQdjYgbG9vcGJhY2tcbiAgICAgICAgL146OmZmZmY6MD86PzA/Oj8wPzo/MD8kL2ksICAgICAgICAgICAgICAgIC8vIElQdjYgbWFwcGVkIElQdjRcbiAgICAgICAgL14xMDBcXC42WzQtOV1cXC4vLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcnJpZXItZ3JhZGUgTkFUXG4gICAgICAgIC9eMTAwXFwuWzctOV1bMC05XVxcLi8sICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXJyaWVyLWdyYWRlIE5BVFxuICAgICAgICAvXjEwMFxcLjFbMC0yXVswLTldXFwuLywgICAgICAgICAgICAgICAgICAgICAgLy8gQ2Fycmllci1ncmFkZSBOQVRcbiAgICAgICAgL14wXFwuLywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2VydmVkXG4gICAgICAgIC9eMjU1XFwuMjU1XFwuMjU1XFwuMjU1JC8gICAgICAgICAgICAgICAgICAgICAgLy8gQnJvYWRjYXN0XG4gICAgICBdO1xuICAgICAgXG4gICAgICBpZiAocHJpdmF0ZUlwUGF0dGVybnMuc29tZShwYXR0ZXJuID0+IHBhdHRlcm4udGVzdChob3N0bmFtZSkpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdCbG9ja2VkIHByaXZhdGUgSVAgcmFuZ2UnLCB7IGhvc3RuYW1lIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEJsb2NrIGNsb3VkIG1ldGFkYXRhIGVuZHBvaW50c1xuICAgICAgY29uc3QgbWV0YWRhdGFFbmRwb2ludHMgPSBbXG4gICAgICAgICcxNjkuMjU0LjE2OS4yNTQnLCAgICAgLy8gQVdTL0dDUC9BenVyZVxuICAgICAgICAnbWV0YWRhdGEuZ29vZ2xlLmludGVybmFsJyxcbiAgICAgICAgJ21ldGFkYXRhLmF6dXJlLmNvbScsXG4gICAgICAgICcxMDAuMTAwLjEwMC4yMDAnICAgICAgLy8gQWxpYmFiYSBDbG91ZFxuICAgICAgXTtcbiAgICAgIFxuICAgICAgaWYgKG1ldGFkYXRhRW5kcG9pbnRzLmluY2x1ZGVzKGhvc3RuYW1lKSkge1xuICAgICAgICBsb2dnZXIud2FybignQmxvY2tlZCBjbG91ZCBtZXRhZGF0YSBlbmRwb2ludCcsIHsgaG9zdG5hbWUgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQmxvY2sgbnVtZXJpYyBJUCByZXByZXNlbnRhdGlvbnMgdGhhdCBjb3VsZCBieXBhc3MgY2hlY2tzXG4gICAgICBpZiAoL15cXGQrJC8udGVzdChob3N0bmFtZSkpIHtcbiAgICAgICAgLy8gQ29udmVydCBkZWNpbWFsIHRvIElQIGFuZCBjaGVja1xuICAgICAgICBjb25zdCBudW0gPSBwYXJzZUludChob3N0bmFtZSwgMTApO1xuICAgICAgICBpZiAobnVtIDw9IDB4RkZGRkZGRkYpIHtcbiAgICAgICAgICBjb25zdCBpcCA9IGAkeyhudW0gPj4+IDI0KSAmIDB4RkZ9LiR7KG51bSA+Pj4gMTYpICYgMHhGRn0uJHsobnVtID4+PiA4KSAmIDB4RkZ9LiR7bnVtICYgMHhGRn1gO1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdCbG9ja2VkIG51bWVyaWMgSVAgcmVwcmVzZW50YXRpb24nLCB7IGhvc3RuYW1lLCByZXNvbHZlZElwOiBpcCB9KTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQmxvY2sgaGV4IElQIHJlcHJlc2VudGF0aW9uc1xuICAgICAgaWYgKC9eMHhbMC05YS1mXSskL2kudGVzdChob3N0bmFtZSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0Jsb2NrZWQgaGV4IElQIHJlcHJlc2VudGF0aW9uJywgeyBob3N0bmFtZSB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBkb21haW4gZm9ybWF0IChiYXNpYyBjaGVjaylcbiAgICAgIC8vIEFsbG93IEdpdEh1YiBkb21haW5zIGFuZCBjb21tb24gc2hhcmUgcGxhdGZvcm1zXG4gICAgICBjb25zdCB0cnVzdGVkRG9tYWlucyA9IFtcbiAgICAgICAgJ2dpdGh1Yi5jb20nLFxuICAgICAgICAnZ2lzdC5naXRodWIuY29tJywgXG4gICAgICAgICdhcGkuZ2l0aHViLmNvbScsXG4gICAgICAgICdyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJyxcbiAgICAgICAgJ2RvbGxob3VzZW1jcC5jb20nXG4gICAgICBdO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgdHJ1c3RlZCBkb21haW5cbiAgICAgIGNvbnN0IGlzVHJ1c3RlZERvbWFpbiA9IHRydXN0ZWREb21haW5zLnNvbWUoZG9tYWluID0+IFxuICAgICAgICBob3N0bmFtZSA9PT0gZG9tYWluIHx8IGhvc3RuYW1lLmVuZHNXaXRoKGAuJHtkb21haW59YClcbiAgICAgICk7XG4gICAgICBcbiAgICAgIGlmICghaXNUcnVzdGVkRG9tYWluKSB7XG4gICAgICAgIC8vIEZvciBub24tdHJ1c3RlZCBkb21haW5zLCBhcHBseSBzdHJpY3RlciB2YWxpZGF0aW9uXG4gICAgICAgIC8vIE11c3QgYmUgYSB2YWxpZCBkb21haW4gZm9ybWF0LCBub3QganVzdCBhbiBJUFxuICAgICAgICBjb25zdCBkb21haW5QYXR0ZXJuID0gL14oW2EtejAtOV0rKC1bYS16MC05XSspKlxcLikrW2Etel17Mix9JC9pO1xuICAgICAgICBjb25zdCBpcHY0UGF0dGVybiA9IC9eXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM30kLztcbiAgICAgICAgY29uc3QgaXB2NlBhdHRlcm4gPSAvXlxcWz8oWzAtOWEtZl17MCw0fTopezIsN31bMC05YS1mXXswLDR9XFxdPyQvaTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpcHY0UGF0dGVybi50ZXN0KGhvc3RuYW1lKSB8fCBpcHY2UGF0dGVybi50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdEaXJlY3QgSVAgYWNjZXNzIG5vdCBhbGxvd2VkIGZvciB1bnRydXN0ZWQgc291cmNlcycsIHsgaG9zdG5hbWUgfSk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIWRvbWFpblBhdHRlcm4udGVzdChob3N0bmFtZSkpIHtcbiAgICAgICAgICBsb2dnZXIud2FybignSW52YWxpZCBkb21haW4gZm9ybWF0JywgeyBob3N0bmFtZSB9KTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdVUkwgdmFsaWRhdGlvbiBwYXNzZWQnLCB7IFxuICAgICAgICBob3N0bmFtZSwgXG4gICAgICAgIHByb3RvY29sOiBwYXJzZWQucHJvdG9jb2wsXG4gICAgICAgIGlzVHJ1c3RlZDogaXNUcnVzdGVkRG9tYWluIFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignVVJMIHZhbGlkYXRpb24gZXJyb3InLCB7IGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGZyb20gYmFzZTY0IFVSTFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbXBvcnRGcm9tQmFzZTY0VXJsKHVybDogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGRhdGE/OiBhbnk7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIExpbWl0IGJhc2U2NCBsZW5ndGggdG8gcHJldmVudCBSZURvUyBhdHRhY2tzICgxMEtCIG1heCBmb3IgYmFzZTY0IGVuY29kZWQgZGF0YSlcbiAgICAgIGNvbnN0IG1hdGNoID0gdXJsLm1hdGNoKC8jZG9sbGhvdXNlLXBlcnNvbmE9KFtBLVphLXowLTkrLz1dezEsMTAwMDB9KSQvKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdJbnZhbGlkIHNoYXJlIFVSTCBmb3JtYXQnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfRk9STUFUKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZTY0ID0gbWF0Y2hbMV07XG4gICAgICBjb25zdCBqc29uID0gQnVmZmVyLmZyb20oYmFzZTY0LCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShqc29uKTtcblxuICAgICAgLy8gQ2hlY2sgZXhwaXJ5XG4gICAgICBpZiAoZGF0YS5leHBpcmVzQXQgJiYgbmV3IERhdGUoZGF0YS5leHBpcmVzQXQpIDwgbmV3IERhdGUoKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdUaGlzIHNoYXJlIGxpbmsgaGFzIGV4cGlyZWQnXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgY29udGVudCBiZWZvcmUgcmV0dXJuaW5nXG4gICAgICBjb25zdCBiYXNlNjREYXRhVmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMudmFsaWRhdGVQZXJzb25hRGF0YShkYXRhKTtcbiAgICAgIGlmICghYmFzZTY0RGF0YVZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgQ29udGVudCB2YWxpZGF0aW9uIGZhaWxlZDogJHtiYXNlNjREYXRhVmFsaWRhdGlvbi5lcnJvcn1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgbWVzc2FnZTogJ1N1Y2Nlc3NmdWxseSBkZWNvZGVkIHBlcnNvbmEgZGF0YSdcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gZGVjb2RlIHNoYXJlIFVSTDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBHaXN0IElEIGZyb20gR2l0SHViIFVSTFxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0R2lzdElkKHVybDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goL2dpc3RcXC5naXRodWJcXC5jb21cXC9bXlxcL10rXFwvKFthLWYwLTldKykvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHNoYXJlIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRTaGFyZVN1Y2Nlc3ModXJsOiBzdHJpbmcsIGV4cGlyZXNBdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBleHBpcnlEYXRlID0gbmV3IERhdGUoZXhwaXJlc0F0KTtcbiAgICBjb25zdCBkYXlzVW50aWxFeHBpcnkgPSBNYXRoLmNlaWwoKGV4cGlyeURhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCkpO1xuXG4gICAgcmV0dXJuIGDinIUgU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2hhcmUgbGluayFcblxu8J+UlyBTaGFyZSBVUkw6XG4ke3VybH1cblxu4o+x77iPIEV4cGlyZXM6ICR7ZXhwaXJ5RGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKX0gKCR7ZGF5c1VudGlsRXhwaXJ5fSBkYXlzKVxuXG7wn5OLIFRvIHNoYXJlIHRoaXMgcGVyc29uYTpcbjEuIENvcHkgdGhlIFVSTCBhYm92ZVxuMi4gU2hhcmUgaXQgd2l0aCBvdGhlcnNcbjMuIFRoZXkgY2FuIGltcG9ydCB1c2luZzogaW1wb3J0X2Zyb21fdXJsIFwiJHt1cmx9XCJcblxu8J+UkiBQcml2YWN5OiBUaGlzIGxpbmsgaXMgcHJpdmF0ZSBhbmQgd2lsbCBleHBpcmUgYXV0b21hdGljYWxseS5gO1xuICB9XG5cbiAgLyoqXG4gICAqIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgcGVyc29uYSBkYXRhIGJlZm9yZSBhbnkgcHJvY2Vzc2luZ1xuICAgKiBUaGlzIHByb3ZpZGVzIGRlZmVuc2UtaW4tZGVwdGggdmFsaWRhdGlvbiBiZWZvcmUgY29udGVudCByZWFjaGVzIGZpbGUgb3BlcmF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVBlcnNvbmFEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8eyBpc1ZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJhc2ljIHN0cnVjdHVyZSB2YWxpZGF0aW9uXG4gICAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcjogJ0ludmFsaWQgZGF0YSBzdHJ1Y3R1cmUnIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkcyBmb3IgcGVyc29uYSBkYXRhXG4gICAgICBpZiAoZGF0YS5tZXRhZGF0YSAmJiAoIWRhdGEubWV0YWRhdGEubmFtZSB8fCAhZGF0YS5tZXRhZGF0YS5kZXNjcmlwdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yOiAnTWlzc2luZyByZXF1aXJlZCBwZXJzb25hIG1ldGFkYXRhJyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBjb250ZW50IGlmIHByZXNlbnRcbiAgICAgIGlmIChkYXRhLmNvbnRlbnQpIHtcbiAgICAgICAgLy8gU2l6ZSB2YWxpZGF0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsaWRhdGVDb250ZW50U2l6ZShkYXRhLmNvbnRlbnQsIDEwMCAqIDEwMjQpOyAvLyAxMDBLQiBsaW1pdFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcjogYENvbnRlbnQgc2l6ZSB2YWxpZGF0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZW50IHNlY3VyaXR5IHZhbGlkYXRpb25cbiAgICAgICAgY29uc3QgY29udGVudFZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoZGF0YS5jb250ZW50KTtcbiAgICAgICAgaWYgKCFjb250ZW50VmFsaWRhdGlvbi5pc1ZhbGlkICYmIGNvbnRlbnRWYWxpZGF0aW9uLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSwgXG4gICAgICAgICAgICBlcnJvcjogYENyaXRpY2FsIHNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZDogJHtjb250ZW50VmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWAgXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBidW5kbGUgc3RydWN0dXJlIGlmIGl0J3MgYSBidW5kbGVcbiAgICAgIGlmIChkYXRhLnBlcnNvbmFzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5wZXJzb25hcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBwZXJzb25hIG9mIGRhdGEucGVyc29uYXMpIHtcbiAgICAgICAgICBjb25zdCBwZXJzb25hVmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMudmFsaWRhdGVQZXJzb25hRGF0YShwZXJzb25hKTtcbiAgICAgICAgICBpZiAoIXBlcnNvbmFWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcjogYEJ1bmRsZSB2YWxpZGF0aW9uIGZhaWxlZDogJHtwZXJzb25hVmFsaWRhdGlvbi5lcnJvcn1gIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgXG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLCBcbiAgICAgICAgZXJyb3I6IGBWYWxpZGF0aW9uIGVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWAgXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFTkhBTkNFRCBTRUNVUklUWSBGSVg6IENvbXByZWhlbnNpdmUgQ29udGVudC1UeXBlIHZhbGlkYXRpb25cbiAgICogU3RyZW5ndGhlbnMgTUlNRSB0eXBlIHZhbGlkYXRpb24gd2l0aCBjb21wcmVoZW5zaXZlIHNlY3VyaXR5IGNoZWNrc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbnRlbnRUeXBlKFxuICAgIGNvbnRlbnRUeXBlOiBzdHJpbmcgfCBudWxsLCBcbiAgICBleHBlY3RlZFR5cGU6IHN0cmluZ1xuICApOiB7IGlzVmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICAgIC8vIENoZWNrIGlmIENvbnRlbnQtVHlwZSBoZWFkZXIgZXhpc3RzXG4gICAgaWYgKCFjb250ZW50VHlwZSkge1xuICAgICAgcmV0dXJuIHsgXG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLCBcbiAgICAgICAgZXJyb3I6ICdNaXNzaW5nIENvbnRlbnQtVHlwZSBoZWFkZXInIFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgYW5kIHNhbml0aXplIHRoZSBjb250ZW50IHR5cGVcbiAgICBjb25zdCBub3JtYWxpemVkQ29udGVudFR5cGUgPSBjb250ZW50VHlwZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBjb25zdCBub3JtYWxpemVkRXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgLy8gVmFsaWRhdGUgQ29udGVudC1UeXBlIGZvcm1hdCAoYmFzaWMgTUlNRSB0eXBlIHN0cnVjdHVyZSlcbiAgICBjb25zdCBtaW1lVHlwZVBhdHRlcm4gPSAvXlthLXowLTldW2EtejAtOSEjJCZcXC1cXF5fXSpcXC9bYS16MC05XVthLXowLTkhIyQmXFwtXFxeX10qKD86XFxzKjsuKik/JC87XG4gICAgaWYgKCFtaW1lVHlwZVBhdHRlcm4udGVzdChub3JtYWxpemVkQ29udGVudFR5cGUpKSB7XG4gICAgICByZXR1cm4geyBcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsIFxuICAgICAgICBlcnJvcjogYE1hbGZvcm1lZCBDb250ZW50LVR5cGUgaGVhZGVyOiAke2NvbnRlbnRUeXBlfWAgXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgbWFpbiBNSU1FIHR5cGUgKGJlZm9yZSBhbnkgcGFyYW1ldGVycyBsaWtlIGNoYXJzZXQpXG4gICAgY29uc3QgbWFpblR5cGUgPSBub3JtYWxpemVkQ29udGVudFR5cGUuc3BsaXQoJzsnKVswXS50cmltKCk7XG4gICAgXG4gICAgLy8gU2VjdXJpdHkgY2hlY2s6IEJsb2NrIGRhbmdlcm91cyBNSU1FIHR5cGVzIHRoYXQgY291bGQgYnlwYXNzIHZhbGlkYXRpb25cbiAgICBjb25zdCBkYW5nZXJvdXNNaW1lVHlwZXMgPSBbXG4gICAgICAndGV4dC9odG1sJywgICAgICAgICAgIC8vIENvdWxkIGNvbnRhaW4gWFNTXG4gICAgICAndGV4dC9qYXZhc2NyaXB0JywgICAgIC8vIENvdWxkIGNvbnRhaW4gbWFsaWNpb3VzIHNjcmlwdHNcbiAgICAgICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywgLy8gQ291bGQgY29udGFpbiBtYWxpY2lvdXMgc2NyaXB0c1xuICAgICAgJ3RleHQveG1sJywgICAgICAgICAgICAvLyBDb3VsZCBjb250YWluIFhYRSBhdHRhY2tzXG4gICAgICAnYXBwbGljYXRpb24veG1sJywgICAgIC8vIENvdWxkIGNvbnRhaW4gWFhFIGF0dGFja3NcbiAgICAgICdpbWFnZS9zdmcreG1sJywgICAgICAgLy8gQ291bGQgY29udGFpbiBYU1MgaW4gU1ZHXG4gICAgICAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsIC8vIFVuZXhwZWN0ZWQgZm9yIEFQSSByZXNwb25zZXNcbiAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIC8vIFVuZXhwZWN0ZWQgZm9yIEFQSSByZXNwb25zZXNcbiAgICBdO1xuXG4gICAgaWYgKGRhbmdlcm91c01pbWVUeXBlcy5pbmNsdWRlcyhtYWluVHlwZSkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdwZXJzb25hX3NoYXJlcicsXG4gICAgICAgIGRldGFpbHM6IGBEYW5nZXJvdXMgQ29udGVudC1UeXBlIGRldGVjdGVkOiAke2NvbnRlbnRUeXBlfWAsXG4gICAgICAgIG1ldGFkYXRhOiB7IGNvbnRlbnRUeXBlLCBleHBlY3RlZFR5cGUgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsIFxuICAgICAgICBlcnJvcjogYERhbmdlcm91cyBDb250ZW50LVR5cGUgbm90IGFsbG93ZWQ6ICR7bWFpblR5cGV9YCBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIG1haW4gdHlwZSBtYXRjaGVzIGV4cGVjdGVkIHR5cGVcbiAgICBpZiAoIW1haW5UeXBlLmluY2x1ZGVzKG5vcm1hbGl6ZWRFeHBlY3RlZFR5cGUpKSB7XG4gICAgICByZXR1cm4geyBcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsIFxuICAgICAgICBlcnJvcjogYENvbnRlbnQtVHlwZSBtaXNtYXRjaDogZXhwZWN0ZWQgJHtleHBlY3RlZFR5cGV9LCBnb3QgJHttYWluVHlwZX1gIFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZm9yIEpTT04gcmVzcG9uc2VzXG4gICAgaWYgKG5vcm1hbGl6ZWRFeHBlY3RlZFR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xuICAgICAgLy8gQWNjZXB0IHZhcmlvdXMgSlNPTi1jb21wYXRpYmxlIE1JTUUgdHlwZXNcbiAgICAgIGNvbnN0IGFjY2VwdGFibGVKc29uVHlwZXMgPSBbXG4gICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgJ2FwcGxpY2F0aW9uL3ZuZC5hcGkranNvbicsXG4gICAgICAgICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAndGV4dC9qc29uJyAvLyBTb21lIEFQSXMgdXNlIHRoaXMgKHRob3VnaCBub3Qgc3RhbmRhcmQpXG4gICAgICBdO1xuICAgICAgXG4gICAgICBjb25zdCBpc0FjY2VwdGFibGVKc29uID0gYWNjZXB0YWJsZUpzb25UeXBlcy5zb21lKHR5cGUgPT4gbWFpblR5cGUgPT09IHR5cGUpO1xuICAgICAgaWYgKCFpc0FjY2VwdGFibGVKc29uKSB7XG4gICAgICAgIHJldHVybiB7IFxuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLCBcbiAgICAgICAgICBlcnJvcjogYFVuc3VwcG9ydGVkIEpTT04gQ29udGVudC1UeXBlOiAke21haW5UeXBlfWAgXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGNoYXJzZXQgcGFyYW1ldGVyIGlmIHByZXNlbnRcbiAgICAgIGNvbnN0IGNoYXJzZXRNYXRjaCA9IG5vcm1hbGl6ZWRDb250ZW50VHlwZS5tYXRjaCgvY2hhcnNldD0oW147XFxzXSspLyk7XG4gICAgICBpZiAoY2hhcnNldE1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGNoYXJzZXQgPSBjaGFyc2V0TWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkQ2hhcnNldHMgPSBbJ3V0Zi04JywgJ3V0ZjgnLCAnYXNjaWknLCAnaXNvLTg4NTktMSddO1xuICAgICAgICBpZiAoIXN1cHBvcnRlZENoYXJzZXRzLmluY2x1ZGVzKGNoYXJzZXQpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSwgXG4gICAgICAgICAgICBlcnJvcjogYFVuc3VwcG9ydGVkIGNoYXJzZXQ6ICR7Y2hhcnNldH1gIFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2cgc3VjY2Vzc2Z1bCB2YWxpZGF0aW9uIGZvciBtb25pdG9yaW5nXG4gICAgbG9nZ2VyLmRlYnVnKCdDb250ZW50LVR5cGUgdmFsaWRhdGlvbiBwYXNzZWQnLCB7IFxuICAgICAgY29udGVudFR5cGU6IG1haW5UeXBlLCBcbiAgICAgIGV4cGVjdGVkVHlwZTogbm9ybWFsaXplZEV4cGVjdGVkVHlwZSBcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTtcbiAgfVxufSJdfQ==
|