@dollhousemcp/mcp-server 1.7.4 → 1.8.1
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 +118 -0
- package/README.github.md +90 -1
- package/README.md +1 -1
- package/README.md.backup +90 -1
- package/README.npm.md +1 -1
- package/dist/collection/CollectionBrowser.js +2 -2
- package/dist/collection/CollectionSearch.js +3 -3
- package/dist/collection/PersonaDetails.js +2 -2
- package/dist/config/ConfigManager.d.ts +20 -0
- package/dist/config/ConfigManager.d.ts.map +1 -1
- package/dist/config/ConfigManager.js +48 -4
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ConfigHandler.d.ts +30 -0
- package/dist/handlers/ConfigHandler.d.ts.map +1 -1
- package/dist/handlers/ConfigHandler.js +149 -21
- package/dist/index.d.ts +4 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +73 -52
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -1
- package/dist/portfolio/GitHubPortfolioIndexer.js +8 -5
- package/dist/portfolio/PortfolioIndexManager.d.ts +1 -1
- package/dist/portfolio/PortfolioIndexManager.js +2 -2
- package/dist/portfolio/PortfolioRepoManager.d.ts +16 -2
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioRepoManager.js +95 -18
- package/dist/portfolio/PortfolioSyncManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioSyncManager.js +23 -15
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +11 -1
- package/dist/server/ServerSetup.d.ts.map +1 -1
- package/dist/server/ServerSetup.js +11 -6
- package/dist/server/tools/CollectionTools.js +6 -6
- package/dist/server/tools/ConfigTools.js +2 -2
- package/dist/server/tools/ConfigToolsV2.js +5 -5
- package/dist/server/tools/PortfolioTools.d.ts.map +1 -1
- package/dist/server/tools/PortfolioTools.js +16 -5
- package/dist/server/types.d.ts +2 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +1 -1
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -1
- package/dist/tools/portfolio/submitToPortfolioTool.js +6 -5
- package/package.json +7 -6
|
@@ -14,12 +14,23 @@ import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
|
|
|
14
14
|
import { SecurityMonitor } from '../security/securityMonitor.js';
|
|
15
15
|
import { ErrorHandler, ErrorCategory } from '../utils/ErrorHandler.js';
|
|
16
16
|
export class PortfolioRepoManager {
|
|
17
|
-
static
|
|
17
|
+
static DEFAULT_PORTFOLIO_REPO_NAME = 'dollhouse-portfolio';
|
|
18
18
|
static DEFAULT_DESCRIPTION = 'My DollhouseMCP element portfolio';
|
|
19
19
|
static GITHUB_API_BASE = 'https://api.github.com';
|
|
20
20
|
token = null;
|
|
21
|
-
|
|
21
|
+
repositoryName;
|
|
22
|
+
constructor(repositoryName) {
|
|
22
23
|
// Token will be retrieved when needed
|
|
24
|
+
// Support custom repository names or use default
|
|
25
|
+
this.repositoryName = repositoryName ||
|
|
26
|
+
process.env.TEST_GITHUB_REPO ||
|
|
27
|
+
PortfolioRepoManager.DEFAULT_PORTFOLIO_REPO_NAME;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the configured repository name
|
|
31
|
+
*/
|
|
32
|
+
getRepositoryName() {
|
|
33
|
+
return this.repositoryName;
|
|
23
34
|
}
|
|
24
35
|
/**
|
|
25
36
|
* Set the GitHub token for API calls
|
|
@@ -88,8 +99,24 @@ export class PortfolioRepoManager {
|
|
|
88
99
|
if (response.status === 404) {
|
|
89
100
|
return null; // Not found is often expected
|
|
90
101
|
}
|
|
91
|
-
|
|
102
|
+
// Check if response is ok BEFORE trying to parse JSON
|
|
92
103
|
if (!response.ok) {
|
|
104
|
+
// Try to parse error details if response is JSON
|
|
105
|
+
let data = {};
|
|
106
|
+
// HTTP headers are case-insensitive, check both cases for robustness
|
|
107
|
+
const contentType = response.headers.get('content-type') || response.headers.get('Content-Type');
|
|
108
|
+
if (contentType && contentType.toLowerCase().includes('application/json')) {
|
|
109
|
+
try {
|
|
110
|
+
data = await response.json();
|
|
111
|
+
}
|
|
112
|
+
catch (jsonError) {
|
|
113
|
+
// JSON parsing failed for error response - continue with empty data
|
|
114
|
+
// This can happen if GitHub returns malformed JSON or content-type mismatch
|
|
115
|
+
if (process.env.DEBUG) {
|
|
116
|
+
console.debug('Failed to parse JSON error response:', jsonError);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
93
120
|
// Create error with status code attached for better classification
|
|
94
121
|
let errorMessage = data.message || `GitHub API error: ${response.status}`;
|
|
95
122
|
let errorCode = 'PORTFOLIO_SYNC_005'; // Default
|
|
@@ -125,6 +152,8 @@ export class PortfolioRepoManager {
|
|
|
125
152
|
error.code = errorCode;
|
|
126
153
|
throw error;
|
|
127
154
|
}
|
|
155
|
+
// Parse JSON only after we know response is ok
|
|
156
|
+
const data = await response.json();
|
|
128
157
|
return data;
|
|
129
158
|
}
|
|
130
159
|
/**
|
|
@@ -136,7 +165,7 @@ export class PortfolioRepoManager {
|
|
|
136
165
|
// MEDIUM FIX: Normalize username to prevent Unicode attacks
|
|
137
166
|
const normalizedUsername = UnicodeValidator.normalize(username).normalizedContent;
|
|
138
167
|
try {
|
|
139
|
-
const repo = await this.githubRequest(`/repos/${normalizedUsername}/${
|
|
168
|
+
const repo = await this.githubRequest(`/repos/${normalizedUsername}/${this.repositoryName}`);
|
|
140
169
|
return repo !== null;
|
|
141
170
|
}
|
|
142
171
|
catch (error) {
|
|
@@ -171,7 +200,7 @@ export class PortfolioRepoManager {
|
|
|
171
200
|
metadata: { username: normalizedUsername }
|
|
172
201
|
});
|
|
173
202
|
// Check if portfolio already exists
|
|
174
|
-
const existingRepo = await this.githubRequest(`/repos/${normalizedUsername}/${
|
|
203
|
+
const existingRepo = await this.githubRequest(`/repos/${normalizedUsername}/${this.repositoryName}`);
|
|
175
204
|
if (existingRepo && existingRepo.html_url) {
|
|
176
205
|
logger.info(`Portfolio already exists for ${normalizedUsername}`);
|
|
177
206
|
return existingRepo.html_url;
|
|
@@ -179,7 +208,7 @@ export class PortfolioRepoManager {
|
|
|
179
208
|
// Create the portfolio repository
|
|
180
209
|
try {
|
|
181
210
|
const repo = await this.githubRequest('/user/repos', 'POST', {
|
|
182
|
-
name:
|
|
211
|
+
name: this.repositoryName,
|
|
183
212
|
description: PortfolioRepoManager.DEFAULT_DESCRIPTION,
|
|
184
213
|
private: false,
|
|
185
214
|
auto_init: true
|
|
@@ -194,7 +223,7 @@ export class PortfolioRepoManager {
|
|
|
194
223
|
logger.info(`Portfolio repository already exists for ${normalizedUsername} (race condition handled)`);
|
|
195
224
|
// Re-check for the existing repository and return its URL
|
|
196
225
|
try {
|
|
197
|
-
const existingRepo = await this.githubRequest(`/repos/${normalizedUsername}/${
|
|
226
|
+
const existingRepo = await this.githubRequest(`/repos/${normalizedUsername}/${this.repositoryName}`);
|
|
198
227
|
if (existingRepo && existingRepo.html_url) {
|
|
199
228
|
return existingRepo.html_url;
|
|
200
229
|
}
|
|
@@ -224,9 +253,9 @@ export class PortfolioRepoManager {
|
|
|
224
253
|
}
|
|
225
254
|
// Validate element before saving
|
|
226
255
|
this.validateElement(element);
|
|
227
|
-
//
|
|
228
|
-
|
|
229
|
-
const username =
|
|
256
|
+
// CRITICAL FIX: Use authenticated user's username, NOT element author (Issue #913)
|
|
257
|
+
// The portfolio belongs to the authenticated user, not the element's author
|
|
258
|
+
const username = await this.getUsername();
|
|
230
259
|
logger.info(`User consented to save element ${element.id} to portfolio`);
|
|
231
260
|
// LOW FIX: Add security audit logging for element save (DMCP-SEC-006)
|
|
232
261
|
SecurityMonitor.logSecurityEvent({
|
|
@@ -255,7 +284,7 @@ export class PortfolioRepoManager {
|
|
|
255
284
|
// First, check if file exists to determine if this is create or update
|
|
256
285
|
let existingFile = null;
|
|
257
286
|
try {
|
|
258
|
-
existingFile = await this.githubRequest(`/repos/${username}/${
|
|
287
|
+
existingFile = await this.githubRequest(`/repos/${username}/${this.repositoryName}/contents/${filePath}`);
|
|
259
288
|
}
|
|
260
289
|
catch (checkError) {
|
|
261
290
|
// IMPORTANT: Authentication and rate limit errors must be re-thrown!
|
|
@@ -288,7 +317,7 @@ export class PortfolioRepoManager {
|
|
|
288
317
|
});
|
|
289
318
|
// Return the existing file URL instead of creating duplicate commit
|
|
290
319
|
const existingUrl = existingFile.html_url ||
|
|
291
|
-
`https://github.com/${username}/${
|
|
320
|
+
`https://github.com/${username}/${this.repositoryName}/blob/main/${filePath}`;
|
|
292
321
|
return existingUrl;
|
|
293
322
|
}
|
|
294
323
|
}
|
|
@@ -305,7 +334,7 @@ export class PortfolioRepoManager {
|
|
|
305
334
|
if (existingFile && existingFile.sha) {
|
|
306
335
|
requestBody.sha = existingFile.sha;
|
|
307
336
|
}
|
|
308
|
-
const result = await this.githubRequest(`/repos/${username}/${
|
|
337
|
+
const result = await this.githubRequest(`/repos/${username}/${this.repositoryName}/contents/${filePath}`, 'PUT', requestBody);
|
|
309
338
|
// FIX: GitHub API response structure varies - handle all cases
|
|
310
339
|
// The response may have commit data at different levels or not at all
|
|
311
340
|
if (!result) {
|
|
@@ -328,7 +357,7 @@ export class PortfolioRepoManager {
|
|
|
328
357
|
}
|
|
329
358
|
// Path 3: Generate URL from response data
|
|
330
359
|
else if (result.content?.path) {
|
|
331
|
-
commitUrl = `https://github.com/${username}/${
|
|
360
|
+
commitUrl = `https://github.com/${username}/${this.repositoryName}/blob/main/${result.content.path}`;
|
|
332
361
|
}
|
|
333
362
|
// Path 4: Fallback to repository URL (guaranteed to be set)
|
|
334
363
|
else {
|
|
@@ -338,7 +367,7 @@ export class PortfolioRepoManager {
|
|
|
338
367
|
hasCommit: !!result.commit,
|
|
339
368
|
hasContent: !!result.content
|
|
340
369
|
});
|
|
341
|
-
commitUrl = `https://github.com/${username}/${
|
|
370
|
+
commitUrl = `https://github.com/${username}/${this.repositoryName}/tree/main/${element.type}`;
|
|
342
371
|
}
|
|
343
372
|
logger.debug('Successfully saved element to GitHub portfolio', {
|
|
344
373
|
element: element.id,
|
|
@@ -449,14 +478,14 @@ These elements can be imported into your DollhouseMCP installation.
|
|
|
449
478
|
---
|
|
450
479
|
*Generated by DollhouseMCP*
|
|
451
480
|
`;
|
|
452
|
-
await this.githubRequest(`/repos/${username}/${
|
|
481
|
+
await this.githubRequest(`/repos/${username}/${this.repositoryName}/contents/README.md`, 'PUT', {
|
|
453
482
|
message: 'Initialize portfolio structure',
|
|
454
483
|
content: Buffer.from(readmeContent).toString('base64')
|
|
455
484
|
});
|
|
456
485
|
// Create directory placeholders
|
|
457
486
|
const directories = ['personas', 'skills', 'templates', 'agents', 'memories', 'ensembles'];
|
|
458
487
|
for (const dir of directories) {
|
|
459
|
-
await this.githubRequest(`/repos/${username}/${
|
|
488
|
+
await this.githubRequest(`/repos/${username}/${this.repositoryName}/contents/${dir}/.gitkeep`, 'PUT', {
|
|
460
489
|
message: `Create ${dir} directory`,
|
|
461
490
|
content: Buffer.from('').toString('base64')
|
|
462
491
|
});
|
|
@@ -512,5 +541,53 @@ These elements can be imported into your DollhouseMCP installation.
|
|
|
512
541
|
// Fallback to basic markdown format
|
|
513
542
|
return `# ${element.metadata.name}\n\n${element.metadata.description || ''}`;
|
|
514
543
|
}
|
|
544
|
+
/**
|
|
545
|
+
* Get the authenticated user's username
|
|
546
|
+
*/
|
|
547
|
+
async getUsername() {
|
|
548
|
+
const response = await this.githubRequest('/user');
|
|
549
|
+
if (!response || !response.login) {
|
|
550
|
+
throw new Error('Failed to get GitHub username');
|
|
551
|
+
}
|
|
552
|
+
return response.login;
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Get file content from GitHub repository
|
|
556
|
+
* Used for pull operations to download elements
|
|
557
|
+
*/
|
|
558
|
+
async getFileContent(path, username, repository) {
|
|
559
|
+
try {
|
|
560
|
+
// Use provided username/repository or defaults
|
|
561
|
+
const repoUser = username || await this.getUsername();
|
|
562
|
+
const repoName = repository || this.repositoryName;
|
|
563
|
+
logger.info('Fetching file content from GitHub', {
|
|
564
|
+
path,
|
|
565
|
+
username: repoUser,
|
|
566
|
+
repository: repoName
|
|
567
|
+
});
|
|
568
|
+
const response = await this.githubRequest(`/repos/${repoUser}/${repoName}/contents/${path}`);
|
|
569
|
+
if (!response || !response.content) {
|
|
570
|
+
throw new Error(`No content found at path: ${path}`);
|
|
571
|
+
}
|
|
572
|
+
// Decode base64 content
|
|
573
|
+
const decodedContent = Buffer.from(response.content, 'base64').toString('utf-8');
|
|
574
|
+
return decodedContent;
|
|
575
|
+
}
|
|
576
|
+
catch (error) {
|
|
577
|
+
logger.error('Failed to get file content from GitHub', {
|
|
578
|
+
error,
|
|
579
|
+
path
|
|
580
|
+
});
|
|
581
|
+
if (error instanceof Error) {
|
|
582
|
+
if (error.message.includes('404')) {
|
|
583
|
+
throw new Error(`File not found at path: ${path}`);
|
|
584
|
+
}
|
|
585
|
+
if (error.message.includes('401') || error.message.includes('403')) {
|
|
586
|
+
throw new Error(`Authentication failed. Please check your GitHub token.`);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
throw error;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
515
592
|
}
|
|
516
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvUmVwb01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUdILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFRdkUsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixNQUFNLENBQVUsbUJBQW1CLEdBQUcscUJBQXFCLENBQUM7SUFDNUQsTUFBTSxDQUFVLG1CQUFtQixHQUFHLG1DQUFtQyxDQUFDO0lBQzFFLE1BQU0sQ0FBVSxlQUFlLEdBQUcsd0JBQXdCLENBQUM7SUFFM0QsS0FBSyxHQUFrQixJQUFJLENBQUM7SUFFcEM7UUFDRSxzQ0FBc0M7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLG1CQUFtQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUVELG9F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R0FBRyxDQUFDLENBQUMsMEJBQTBCO1FBRTNELG9EQUFvRDtRQUNwRCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUM7UUFFMUUsa0RBQWtEO1FBQ2xELE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFbkUsNERBQTREO1FBQzVELHVEQUF1RDtRQUN2RCxnRUFBZ0U7UUFDaEUsTUFBTSxRQUFRLEdBQUcsYUFBYTthQUMzQixXQUFXLEVBQUU7YUFDYixPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQzthQUMzQixPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFFLHdCQUF3QjthQUM1QyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMseUJBQXlCO1FBRWhELDZEQUE2RDtRQUM3RCxPQUFPLFFBQVEsSUFBSSxTQUFTLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssb0JBQW9CLENBQUMsT0FBaUI7UUFDNUMsaURBQWlEO1FBQ2pELElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzdCLENBQUM7UUFDRCxvQ0FBb0M7UUFDcEMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQy9FLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvcnRmb2xpb1JlcG9NYW5hZ2VyIC0gTWFuYWdlcyBHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcmllcyBmb3IgZWxlbWVudCBzdG9yYWdlXG4gKiBcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gRVhQTElDSVQgQ09OU0VOVCByZXF1aXJlZCBmb3IgYWxsIG9wZXJhdGlvbnNcbiAqIC0gQ3JlYXRlcyBwb3J0Zm9saW8gcmVwb3NpdG9yaWVzIGluIHVzZXIncyBHaXRIdWIgYWNjb3VudFxuICogLSBTYXZlcyBlbGVtZW50cyB0byBhcHByb3ByaWF0ZSBkaXJlY3Rvcmllc1xuICogLSBIYW5kbGVzIEFQSSBmYWlsdXJlcyBncmFjZWZ1bGx5XG4gKiAtIFByb3ZpZGVzIGF1ZGl0IGxvZ2dpbmcgZm9yIGNvbnNlbnQgZGVjaXNpb25zXG4gKi9cblxuaW1wb3J0IHsgSUVsZW1lbnQgfSBmcm9tICcuLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlciwgRXJyb3JDYXRlZ29yeSB9IGZyb20gJy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydGZvbGlvUmVwb09wdGlvbnMge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcHJpdmF0ZT86IGJvb2xlYW47XG4gIGF1dG9faW5pdD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBQb3J0Zm9saW9SZXBvTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFBPUlRGT0xJT19SRVBPX05BTUUgPSAnZG9sbGhvdXNlLXBvcnRmb2xpbyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfREVTQ1JJUFRJT04gPSAnTXkgRG9sbGhvdXNlTUNQIGVsZW1lbnQgcG9ydGZvbGlvJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0lUSFVCX0FQSV9CQVNFID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nO1xuICBcbiAgcHJpdmF0ZSB0b2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gVG9rZW4gd2lsbCBiZSByZXRyaWV2ZWQgd2hlbiBuZWVkZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIEdpdEh1YiB0b2tlbiBmb3IgQVBJIGNhbGxzXG4gICAqIFVzZWQgd2hlbiB0b2tlbiBpcyBhbHJlYWR5IGF2YWlsYWJsZSBmcm9tIFRva2VuTWFuYWdlclxuICAgKi9cbiAgcHVibGljIHNldFRva2VuKHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IEdpdEh1YiB0b2tlbiBmb3IgQVBJIGNhbGxzIHdpdGggdmFsaWRhdGlvblxuICAgKiBTRUNVUklUWSBGSVg6IEFkZGVkIHRva2VuIHZhbGlkYXRpb24gdG8gcHJldmVudCB0b2tlbiB2YWxpZGF0aW9uIGJ5cGFzcyAoRE1DUC1TRUMtMDAyKVxuICAgKiBNZXRob2QgbmFtZSBpbmNsdWRlcyAndmFsaWRhdGUnIHRvIHNhdGlzZnkgc2VjdXJpdHkgc2Nhbm5lciBwYXR0ZXJuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFRva2VuQW5kVmFsaWRhdGUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMudG9rZW4pIHtcbiAgICAgIHRoaXMudG9rZW4gPSBhd2FpdCBUb2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW5Bc3luYygpO1xuICAgICAgaWYgKCF0aGlzLnRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignR2l0SHViIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLiBQbGVhc2UgdXNlIHNldHVwX2dpdGh1Yl9hdXRoIGZpcnN0LicpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFZhbGlkYXRlIHRva2VuIGJlZm9yZSB1c2UgdG8gcHJldmVudCBieXBhc3MgYXR0YWNrc1xuICAgICAgLy8gVXNpbmcgdmFsaWRhdGVUb2tlblNjb3BlcyB3aXRoIG1pbmltYWwgcmVxdWlyZWQgc2NvcGVzIGZvciBwb3J0Zm9saW8gb3BlcmF0aW9uc1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IFRva2VuTWFuYWdlci52YWxpZGF0ZVRva2VuU2NvcGVzKHRoaXMudG9rZW4sIHtcbiAgICAgICAgcmVxdWlyZWQ6IFsncHVibGljX3JlcG8nXSAvLyBNaW5pbXVtIHNjb3BlIG5lZWRlZCBmb3IgcG9ydGZvbGlvIG9wZXJhdGlvbnNcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aGlzLnRva2VuID0gbnVsbDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9yIGV4cGlyZWQgR2l0SHViIHRva2VuOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3IgfHwgJ1BsZWFzZSByZS1hdXRoZW50aWNhdGUuJ31gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTE9XIEZJWDogQWRkIGF1ZGl0IGxvZ2dpbmcgZm9yIHNlY3VyaXR5IG9wZXJhdGlvbnMgKERNQ1AtU0VDLTAwNilcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnUG9ydGZvbGlvUmVwb01hbmFnZXIuZ2V0VG9rZW4nLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIHRva2VuIHZhbGlkYXRlZCBzdWNjZXNzZnVsbHkgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYXV0aGVudGljYXRlZCBHaXRIdWIgQVBJIHJlcXVlc3RcbiAgICogTWFkZSBwdWJsaWMgdG8gc3VwcG9ydCBHaXRIdWJQb3J0Zm9saW9JbmRleGVyIG9wZXJhdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnaXRodWJSZXF1ZXN0KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBtZXRob2Q6IHN0cmluZyA9ICdHRVQnLFxuICAgIGJvZHk/OiBhbnlcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuZ2V0VG9rZW5BbmRWYWxpZGF0ZSgpO1xuICAgIGNvbnN0IHVybCA9IGAke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLkdJVEhVQl9BUElfQkFTRX0ke3BhdGh9YDtcbiAgICBcbiAgICBjb25zdCBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdGlvbnMpO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHJlc3BvbnNlIGV4aXN0cyBiZWZvcmUgYWNjZXNzaW5nIHByb3BlcnRpZXNcbiAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdObyByZXNwb25zZSByZWNlaXZlZCBmcm9tIEdpdEh1YiBBUEknKTtcbiAgICAgIGVycm9yLnN0YXR1cyA9IDA7XG4gICAgICBlcnJvci5jb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwNSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gTm90IGZvdW5kIGlzIG9mdGVuIGV4cGVjdGVkXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIC8vIENyZWF0ZSBlcnJvciB3aXRoIHN0YXR1cyBjb2RlIGF0dGFjaGVkIGZvciBiZXR0ZXIgY2xhc3NpZmljYXRpb25cbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2UgfHwgYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWA7XG4gICAgICBsZXQgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwNSc7IC8vIERlZmF1bHRcbiAgICAgIFxuICAgICAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBmYWlsZWQuIFBsZWFzZSBjaGVjayB5b3VyIHRva2VuLic7XG4gICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2U/LmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGBHaXRIdWIgQVBJIHJhdGUgbGltaXQgZXhjZWVkZWQ6ICR7ZGF0YS5tZXNzYWdlfWA7XG4gICAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA2JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEdpdEh1YiBBUEkgYWNjZXNzIGZvcmJpZGRlbjogJHtkYXRhLm1lc3NhZ2UgfHwgJ2luc3VmZmljaWVudCBwZXJtaXNzaW9ucyd9YDtcbiAgICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDEnOyAvLyBUcmVhdCBhcyBhdXRoIGlzc3VlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQyMjpcbiAgICAgICAgICAvLyBWYWxpZGF0aW9uIGZhaWxlZCAtIG9mdGVuIG1lYW5zIHJlcG9zaXRvcnkgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgUmVwb3NpdG9yeSB2YWxpZGF0aW9uIGZhaWxlZDogJHtkYXRhLm1lc3NhZ2UgfHwgJ25hbWUgYWxyZWFkeSBleGlzdHMgb24gdGhpcyBhY2NvdW50J31gO1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDMnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnR2l0SHViIEFQSSBzZXJ2ZXIgZXJyb3IuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJztcbiAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA1JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgR2l0SHViIEFQSSBlcnJvciAoJHtyZXNwb25zZS5zdGF0dXN9KTogJHtkYXRhLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWA7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIGVycm9yLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgIGVycm9yLmNvZGUgPSBlcnJvckNvZGU7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBleGlzdHMgZm9yIGEgdXNlclxuICAgKiBObyBjb25zZW50IHJlcXVpcmVkIC0gdGhpcyBpcyBhIHJlYWQtb25seSBvcGVyYXRpb25cbiAgICogU0VDVVJJVFkgRklYOiBBZGRlZCBVbmljb2RlIG5vcm1hbGl6YXRpb24gZm9yIHVzZXIgaW5wdXQgKERNQ1AtU0VDLTAwNClcbiAgICovXG4gIGFzeW5jIGNoZWNrUG9ydGZvbGlvRXhpc3RzKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3NcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmdpdGh1YlJlcXVlc3QoXG4gICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlcG8gIT09IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgZG9lc24ndCBleGlzdCBvciBBUEkgZXJyb3IgLSBib3RoIHJldHVybiBmYWxzZVxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9SZXBvTWFuYWdlci5jaGVja0lmUmVwb0V4aXN0cycsIGVycm9yLCB7IHVzZXJuYW1lIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgd2l0aCBFWFBMSUNJVCB1c2VyIGNvbnNlbnRcbiAgICogQHRocm93cyBFcnJvciBpZiB1c2VyIGRlY2xpbmVzIGNvbnNlbnQgb3IgaWYgY29uc2VudCBpcyBub3QgcHJvdmlkZWRcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvcnRmb2xpbyh1c2VybmFtZTogc3RyaW5nLCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgKERNQ1AtU0VDLTAwNClcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IFZhbGlkYXRlIGNvbnNlbnQgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgIGlmIChjb25zZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uc2VudCBpcyByZXF1aXJlZCBmb3IgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25zZW50KSB7XG4gICAgICBsb2dnZXIuaW5mbyhgVXNlciBkZWNsaW5lZCBwb3J0Zm9saW8gY3JlYXRpb24gZm9yICR7dXNlcm5hbWV9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gTG9nIGNvbnNlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbiBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgXG4gICAgLy8gTE9XIEZJWDogQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpbycsXG4gICAgICBkZXRhaWxzOiBgVXNlciAke25vcm1hbGl6ZWRVc2VybmFtZX0gY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbmAsXG4gICAgICBtZXRhZGF0YTogeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgKTtcbiAgICBcbiAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZXhpc3RpbmdSZXBvLmh0bWxfdXJsO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgJy91c2VyL3JlcG9zJyxcbiAgICAgICAgJ1BPU1QnLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogUG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogUG9ydGZvbGlvUmVwb01hbmFnZXIuREVGQVVMVF9ERVNDUklQVElPTixcbiAgICAgICAgICBwcml2YXRlOiBmYWxzZSxcbiAgICAgICAgICBhdXRvX2luaXQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBwb3J0Zm9saW8gc3RydWN0dXJlXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlUG9ydGZvbGlvU3RydWN0dXJlKG5vcm1hbGl6ZWRVc2VybmFtZSk7XG5cbiAgICAgIHJldHVybiByZXBvLmh0bWxfdXJsO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIEhhbmRsZSByYWNlIGNvbmRpdGlvbjogaWYgcmVwb3NpdG9yeSB3YXMgY3JlYXRlZCBiZXR3ZWVuIG91ciBjaGVjayBhbmQgY3JlYXRpb24gYXR0ZW1wdFxuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbmFtZSBhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBQb3J0Zm9saW8gcmVwb3NpdG9yeSBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9IChyYWNlIGNvbmRpdGlvbiBoYW5kbGVkKWApO1xuICAgICAgICBcbiAgICAgICAgLy8gUmUtY2hlY2sgZm9yIHRoZSBleGlzdGluZyByZXBvc2l0b3J5IGFuZCByZXR1cm4gaXRzIFVSTFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nUmVwby5odG1sX3VybDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHJlY2hlY2tFcnJvcikge1xuICAgICAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignUG9ydGZvbGlvUmVwb01hbmFnZXIucmVjaGVja0V4aXN0aW5nUmVwbycsIHJlY2hlY2tFcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBnZXQgdGhlIGV4aXN0aW5nIHJlcG8sIHRocm93IGEgbW9yZSBzcGVjaWZpYyBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBvcnRmb2xpbyByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzIGZvciAke25vcm1hbGl6ZWRVc2VybmFtZX0uIFBsZWFzZSBjaGVjayB5b3VyIEdpdEh1YiBhY2NvdW50LmApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpb1JlcG8nLCBlcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgYEZhaWxlZCB0byBjcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgZm9yICR7bm9ybWFsaXplZFVzZXJuYW1lfS4gJHtlcnJvci5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yIG9jY3VycmVkLid9YCwgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbyB3aXRoIEVYUExJQ0lUIHVzZXIgY29uc2VudFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHVzZXIgZGVjbGluZXMgY29uc2VudCBvciBlbGVtZW50IGlzIGludmFsaWRcbiAgICovXG4gIGFzeW5jIHNhdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBDUklUSUNBTDogVmFsaWRhdGUgY29uc2VudCBpcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgaWYgKGNvbnNlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zZW50IGlzIHJlcXVpcmVkIHRvIHNhdmUgZWxlbWVudCcpO1xuICAgIH1cblxuICAgIGlmICghY29uc2VudCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFVzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50ICR7ZWxlbWVudC5pZH0gdG8gcG9ydGZvbGlvYCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgYmVmb3JlIHNhdmluZ1xuICAgIHRoaXMudmFsaWRhdGVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgLy8gTUVESVVNIEZJWDogTm9ybWFsaXplIHVzZXJuYW1lIGZyb20gZWxlbWVudCBtZXRhZGF0YSAoRE1DUC1TRUMtMDA0KVxuICAgIGNvbnN0IHJhd1VzZXJuYW1lID0gZWxlbWVudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyc7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShyYXdVc2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHNhdmUgZWxlbWVudCAke2VsZW1lbnQuaWR9IHRvIHBvcnRmb2xpb2ApO1xuICAgIFxuICAgIC8vIExPVyBGSVg6IEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBlbGVtZW50IHNhdmUgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnNhdmVFbGVtZW50JyxcbiAgICAgIGRldGFpbHM6IGBVc2VyIGNvbnNlbnRlZCB0byBzYXZlIGVsZW1lbnQgJHtlbGVtZW50LmlkfSB0byBwb3J0Zm9saW9gLFxuICAgICAgbWV0YWRhdGE6IHsgXG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgdXNlcm5hbWUgXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBmaWxlIHBhdGggYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgLy8gRklYOiBEb24ndCBhZGQgJ3MnIC0gZWxlbWVudC50eXBlIGlzIGFscmVhZHkgcGx1cmFsIChlLmcuLCAncGVyc29uYXMnLCAnc2tpbGxzJylcbiAgICBjb25zdCBmaWxlTmFtZSA9IFBvcnRmb2xpb1JlcG9NYW5hZ2VyLmdlbmVyYXRlRmlsZU5hbWUoZWxlbWVudC5tZXRhZGF0YS5uYW1lKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGAke2VsZW1lbnQudHlwZX0vJHtmaWxlTmFtZX0ubWRgO1xuXG4gICAgLy8gUHJlcGFyZSBjb250ZW50IChjb3VsZCBiZSBtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmZvcm1hdEVsZW1lbnRDb250ZW50KGVsZW1lbnQpO1xuICAgIFxuICAgIC8vIERJQUdOT1NUSUM6IExvZyBjb250ZW50IHNpemUgYmVmb3JlIHNlbmRpbmcgdG8gR2l0SHViXG4gICAgbG9nZ2VyLmRlYnVnKGBbQ09OVEVOVC1UUkFDRV0gU2F2aW5nIGVsZW1lbnQgJHtlbGVtZW50LmlkfSB0byBHaXRIdWIgLSBjb250ZW50IHNpemU6ICR7Y29udGVudC5sZW5ndGh9IGNoYXJzYCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBbQ09OVEVOVC1UUkFDRV0gRmlyc3QgMjAwIGNoYXJzOiAke2NvbnRlbnQuc3Vic3RyaW5nKDAsIDIwMCl9YCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBbQ09OVEVOVC1UUkFDRV0gTGFzdCAyMDAgY2hhcnM6ICR7Y29udGVudC5zdWJzdHJpbmcoTWF0aC5tYXgoMCwgY29udGVudC5sZW5ndGggLSAyMDApKX1gKTtcblxuICAgIC8vIFNhdmUgdG8gR2l0SHViXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpcnN0LCBjaGVjayBpZiBmaWxlIGV4aXN0cyB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBjcmVhdGUgb3IgdXBkYXRlXG4gICAgICBsZXQgZXhpc3RpbmdGaWxlID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4aXN0aW5nRmlsZSA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vY29udGVudHMvJHtmaWxlUGF0aH1gXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChjaGVja0Vycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gSU1QT1JUQU5UOiBBdXRoZW50aWNhdGlvbiBhbmQgcmF0ZSBsaW1pdCBlcnJvcnMgbXVzdCBiZSByZS10aHJvd24hXG4gICAgICAgIC8vIFRoZXNlIGFyZSBOT1QgXCJmaWxlIGRvZXNuJ3QgZXhpc3RcIiBzY2VuYXJpb3MgLSB0aGV5IGluZGljYXRlIHdlIGNhbid0XG4gICAgICAgIC8vIGFjY2VzcyB0aGUgQVBJIGF0IGFsbC4gT25seSA0MDQgKGFuZCBzaW1pbGFyKSBzaG91bGQgYmUgdHJlYXRlZCBhcyBcbiAgICAgICAgLy8gXCJmaWxlIGRvZXNuJ3QgZXhpc3RcIi4gVGhpcyBlbnN1cmVzIGF1dGggZXJyb3JzIGFyZSBwcm9wZXJseSByZXBvcnRlZFxuICAgICAgICAvLyB3aXRoIGNvcnJlY3QgZXJyb3IgY29kZXMgKGUuZy4sIFBPUlRGT0xJT19TWU5DXzAwMSBmb3IgYXV0aCBmYWlsdXJlcykuXG4gICAgICAgIC8vIFNlZSBQUiAjODQ2IGFuZCB0ZXN0OiBwb3J0Zm9saW8tc2luZ2xlLXVwbG9hZC5xYS50ZXN0LnRzXG4gICAgICAgIGlmIChjaGVja0Vycm9yLnN0YXR1cyA9PT0gNDAxIHx8IGNoZWNrRXJyb3IuY29kZSA9PT0gJ1BPUlRGT0xJT19TWU5DXzAwMScpIHtcbiAgICAgICAgICB0aHJvdyBjaGVja0Vycm9yOyAvLyBBdXRoZW50aWNhdGlvbiBlcnJvciAtIGRvbid0IGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrRXJyb3Iuc3RhdHVzID09PSA0MDMgfHwgY2hlY2tFcnJvci5jb2RlID09PSAnUE9SVEZPTElPX1NZTkNfMDA2Jykge1xuICAgICAgICAgIHRocm93IGNoZWNrRXJyb3I7IC8vIFJhdGUgbGltaXQgb3IgcGVybWlzc2lvbiBlcnJvciAtIGRvbid0IGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIG90aGVyIGVycm9ycyAobGlrZSA0MDQpLCBhc3N1bWUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBjb250aW51ZVxuICAgICAgICAvLyB3aXRoIGZpbGUgY3JlYXRpb24uIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGZsb3cgZm9yIG5ldyBmaWxlcy5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlIGNoZWNrIHJldHVybmVkIGVycm9yIChsaWtlbHkgZG9lc24ndCBleGlzdCk6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIGV4aXN0aW5nRmlsZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIERVUExJQ0FURSBERVRFQ1RJT04gKElzc3VlICM3OTIpOiBDaGVjayBpZiBjb250ZW50IGlzIGlkZW50aWNhbFxuICAgICAgaWYgKGV4aXN0aW5nRmlsZSAmJiBleGlzdGluZ0ZpbGUuY29udGVudCkge1xuICAgICAgICAvLyBEZWNvZGUgZXhpc3RpbmcgY29udGVudCBmcm9tIGJhc2U2NFxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBCdWZmZXIuZnJvbShleGlzdGluZ0ZpbGUuY29udGVudCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ29tcGFyZSB3aXRoIG5ldyBjb250ZW50XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IGNvbnRlbnQpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnU2tpcHBpbmcgZHVwbGljYXRlIHBvcnRmb2xpbyB1cGxvYWQgLSBjb250ZW50IGlkZW50aWNhbCcsIHtcbiAgICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgIGVsZW1lbnROYW1lOiBlbGVtZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICBmaWxlUGF0aFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFJldHVybiB0aGUgZXhpc3RpbmcgZmlsZSBVUkwgaW5zdGVhZCBvZiBjcmVhdGluZyBkdXBsaWNhdGUgY29tbWl0XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdVcmwgPSBleGlzdGluZ0ZpbGUuaHRtbF91cmwgfHwgXG4gICAgICAgICAgICBgaHR0cHM6Ly9naXRodWIuY29tLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vYmxvYi9tYWluLyR7ZmlsZVBhdGh9YDtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdVcmw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIG9yIHVwZGF0ZSB0aGUgZmlsZSAob25seSBpZiBjb250ZW50IGlzIGRpZmZlcmVudClcbiAgICAgIC8vIERFQlVHOiBMb2cgd2hhdCB3ZSdyZSBhYm91dCB0byBzZW5kXG4gICAgICBsb2dnZXIuZGVidWcoYFtERUJVR10gQ3JlYXRpbmcvdXBkYXRpbmcgZmlsZS4gZXhpc3RpbmdGaWxlOiAkeyEhZXhpc3RpbmdGaWxlfSwgc2hhOiAke2V4aXN0aW5nRmlsZT8uc2hhfWApO1xuICAgICAgXG4gICAgICBjb25zdCByZXF1ZXN0Qm9keTogYW55ID0ge1xuICAgICAgICBtZXNzYWdlOiBleGlzdGluZ0ZpbGUgPyBcbiAgICAgICAgICBgVXBkYXRlICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfSBpbiBwb3J0Zm9saW9gIDogXG4gICAgICAgICAgYEFkZCAke2VsZW1lbnQubWV0YWRhdGEubmFtZX0gdG8gcG9ydGZvbGlvYCxcbiAgICAgICAgY29udGVudDogQnVmZmVyLmZyb20oY29udGVudCkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgc2hhIGlmIHdlIGhhdmUgYW4gZXhpc3RpbmcgZmlsZSB3aXRoIGEgc2hhXG4gICAgICBpZiAoZXhpc3RpbmdGaWxlICYmIGV4aXN0aW5nRmlsZS5zaGEpIHtcbiAgICAgICAgcmVxdWVzdEJvZHkuc2hhID0gZXhpc3RpbmdGaWxlLnNoYTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vY29udGVudHMvJHtmaWxlUGF0aH1gLFxuICAgICAgICAnUFVUJyxcbiAgICAgICAgcmVxdWVzdEJvZHlcbiAgICAgICk7XG5cbiAgICAgIC8vIEZJWDogR2l0SHViIEFQSSByZXNwb25zZSBzdHJ1Y3R1cmUgdmFyaWVzIC0gaGFuZGxlIGFsbCBjYXNlc1xuICAgICAgLy8gVGhlIHJlc3BvbnNlIG1heSBoYXZlIGNvbW1pdCBkYXRhIGF0IGRpZmZlcmVudCBsZXZlbHMgb3Igbm90IGF0IGFsbFxuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdbUE9SVEZPTElPX1NZTkNfMDA0XSBHaXRIdWIgQVBJIHJldHVybmVkIG51bGwgcmVzcG9uc2UnLCB7XG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudC5pZCxcbiAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICBmaWxlUGF0aFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUE9SVEZPTElPX1NZTkNfMDA0XSBHaXRIdWIgQVBJIHJldHVybmVkIG51bGwgcmVzcG9uc2UgZm9yICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgbXVsdGlwbGUgcGF0aHMgdG8gZ2V0IHRoZSBjb21taXQgVVJMXG4gICAgICBsZXQgY29tbWl0VXJsOiBzdHJpbmc7XG4gICAgICBcbiAgICAgIC8vIFBhdGggMTogcmVzdWx0LmNvbW1pdC5odG1sX3VybCAoc3RhbmRhcmQgZm9yIGNvbnRlbnQgQVBJKVxuICAgICAgaWYgKHJlc3VsdC5jb21taXQ/Lmh0bWxfdXJsKSB7XG4gICAgICAgIGNvbW1pdFVybCA9IHJlc3VsdC5jb21taXQuaHRtbF91cmw7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDI6IHJlc3VsdC5jb250ZW50Lmh0bWxfdXJsIChzb21lIEFQSSByZXNwb25zZXMpXG4gICAgICBlbHNlIGlmIChyZXN1bHQuY29udGVudD8uaHRtbF91cmwpIHtcbiAgICAgICAgY29tbWl0VXJsID0gcmVzdWx0LmNvbnRlbnQuaHRtbF91cmw7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDM6IEdlbmVyYXRlIFVSTCBmcm9tIHJlc3BvbnNlIGRhdGFcbiAgICAgIGVsc2UgaWYgKHJlc3VsdC5jb250ZW50Py5wYXRoKSB7XG4gICAgICAgIGNvbW1pdFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHt1c2VybmFtZX0vJHtQb3J0Zm9saW9SZXBvTWFuYWdlci5QT1JURk9MSU9fUkVQT19OQU1FfS9ibG9iL21haW4vJHtyZXN1bHQuY29udGVudC5wYXRofWA7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDQ6IEZhbGxiYWNrIHRvIHJlcG9zaXRvcnkgVVJMIChndWFyYW50ZWVkIHRvIGJlIHNldClcbiAgICAgIGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybignW1BPUlRGT0xJT19TWU5DXzAwNF0gQ291bGQgbm90IGV4dHJhY3QgY29tbWl0IFVSTCBmcm9tIEdpdEh1YiByZXNwb25zZSwgdXNpbmcgZmFsbGJhY2snLCB7XG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudC5pZCxcbiAgICAgICAgICByZXNwb25zZUtleXM6IE9iamVjdC5rZXlzKHJlc3VsdCksXG4gICAgICAgICAgaGFzQ29tbWl0OiAhIXJlc3VsdC5jb21taXQsXG4gICAgICAgICAgaGFzQ29udGVudDogISFyZXN1bHQuY29udGVudFxuICAgICAgICB9KTtcbiAgICAgICAgY29tbWl0VXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3VzZXJuYW1lfS8ke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLlBPUlRGT0xJT19SRVBPX05BTUV9L3RyZWUvbWFpbi8ke2VsZW1lbnQudHlwZX1gO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoJ1N1Y2Nlc3NmdWxseSBzYXZlZCBlbGVtZW50IHRvIEdpdEh1YiBwb3J0Zm9saW8nLCB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgY29tbWl0VXJsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbW1pdFVybDtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBVc2UgZXJyb3IgY29kZSBpZiBhbHJlYWR5IHNldCBieSBnaXRodWJSZXF1ZXN0XG4gICAgICBsZXQgZXJyb3JDb2RlID0gZXJyb3IuY29kZSB8fCAnUE9SVEZPTElPX1NZTkNfMDA1JzsgLy8gRGVmYXVsdCBuZXR3b3JrIGVycm9yXG4gICAgICBsZXQgZW5oYW5jZWRNZXNzYWdlID0gJ0ZhaWxlZCB0byBzYXZlIGVsZW1lbnQgdG8gcG9ydGZvbGlvJztcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZXJyb3Igc3RhdHVzIGZpcnN0IChtb3JlIHJlbGlhYmxlIHRoYW4gbWVzc2FnZSBwYXJzaW5nKVxuICAgICAgaWYgKGVycm9yLnN0YXR1cykge1xuICAgICAgICBzd2l0Y2ggKGVycm9yLnN0YXR1cykge1xuICAgICAgICAgIGNhc2UgNDAxOlxuICAgICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMSc7XG4gICAgICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSAnR2l0SHViIGF1dGhlbnRpY2F0aW9uIGZhaWxlZC4gUGxlYXNlIHJlLWF1dGhlbnRpY2F0ZS4nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSkge1xuICAgICAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA2JztcbiAgICAgICAgICAgICAgZW5oYW5jZWRNZXNzYWdlID0gJ0dpdEh1YiBBUEkgcmF0ZSBsaW1pdCBleGNlZWRlZC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMSc7XG4gICAgICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgQVBJIGFjY2VzcyBmb3JiaWRkZW4uIENoZWNrIHRva2VuIHBlcm1pc3Npb25zLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQwNDpcbiAgICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDInO1xuICAgICAgICAgICAgZW5oYW5jZWRNZXNzYWdlID0gJ0dpdEh1YiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBub3QgZm91bmQuIFBsZWFzZSBydW4gaW5pdF9wb3J0Zm9saW8gZmlyc3QuJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDIyOlxuICAgICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMyc7XG4gICAgICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSAnUmVwb3NpdG9yeSB2YWxpZGF0aW9uIGZhaWxlZC4nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGVycm9yIGNvZGUgZnJvbSBnaXRodWJSZXF1ZXN0IGlmIHNldFxuICAgICAgICAgICAgaWYgKCFlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFlcnJvci5jb2RlKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBtZXNzYWdlIHBhcnNpbmcgb25seSBpZiBubyBzdGF0dXMgY29kZSBhdmFpbGFibGVcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCc0MDEnKSB8fCBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnYXV0aGVudGljYXRpb24nKSkge1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDEnO1xuICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgYXV0aGVudGljYXRpb24gZmFpbGVkLiBQbGVhc2UgcmUtYXV0aGVudGljYXRlLic7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJzQwNCcpIHx8IGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdub3QgZm91bmQnKSkge1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDInO1xuICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnkgbm90IGZvdW5kLiBQbGVhc2UgcnVuIGluaXRfcG9ydGZvbGlvIGZpcnN0Lic7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJzQwMycpIHx8IGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA2JztcbiAgICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSAnR2l0SHViIEFQSSByYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLic7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ0Nhbm5vdCByZWFkIHByb3BlcnRpZXMnKSkge1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDQnO1xuICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9IGBHaXRIdWIgQVBJIHJlc3BvbnNlIHBhcnNpbmcgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxvZ2dlci5lcnJvcihgWyR7ZXJyb3JDb2RlfV0gJHtlbmhhbmNlZE1lc3NhZ2V9YCwgeyBcbiAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgb3JpZ2luYWxFcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgZXJyb3JTdGF0dXM6IGVycm9yLnN0YXR1cyxcbiAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9SZXBvTWFuYWdlci5zYXZlRWxlbWVudFRvUmVwbycsIGVycm9yLCB7IFxuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgIGVycm9yU3RhdHVzOiBlcnJvci5zdGF0dXNcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBUaHJvdyBlcnJvciB3aXRoIGNvZGUgZm9yIGJldHRlciBoYW5kbGluZyB1cHN0cmVhbVxuICAgICAgY29uc3Qgd3JhcHBlZEVycm9yID0gRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgYFske2Vycm9yQ29kZX1dICR7ZW5oYW5jZWRNZXNzYWdlfWAsIEVycm9yQ2F0ZWdvcnkuTkVUV09SS19FUlJPUik7XG4gICAgICAod3JhcHBlZEVycm9yIGFzIGFueSkuY29kZSA9IGVycm9yQ29kZTtcbiAgICAgICh3cmFwcGVkRXJyb3IgYXMgYW55KS5zdGF0dXMgPSBlcnJvci5zdGF0dXM7XG4gICAgICB0aHJvdyB3cmFwcGVkRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGluaXRpYWwgcG9ydGZvbGlvIHN0cnVjdHVyZSB3aXRoIFJFQURNRSBhbmQgZGlyZWN0b3JpZXNcbiAgICogU0VDVVJJVFk6IFVzZXJuYW1lIGFscmVhZHkgbm9ybWFsaXplZCBieSBjYWxsaW5nIG1ldGhvZHNcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlUG9ydGZvbGlvU3RydWN0dXJlKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDcmVhdGUgUkVBRE1FLm1kXG4gICAgY29uc3QgcmVhZG1lQ29udGVudCA9IGAjIERvbGxob3VzZU1DUCBQb3J0Zm9saW9cblxuVGhpcyBpcyBteSBwZXJzb25hbCBjb2xsZWN0aW9uIG9mIERvbGxob3VzZU1DUCBlbGVtZW50cy5cblxuIyMgU3RydWN0dXJlXG5cbi0gKipwZXJzb25hcy8qKiAtIEJlaGF2aW9yYWwgcHJvZmlsZXNcbi0gKipza2lsbHMvKiogLSBEaXNjcmV0ZSBjYXBhYmlsaXRpZXMgIFxuLSAqKnRlbXBsYXRlcy8qKiAtIFJldXNhYmxlIGNvbnRlbnQgc3RydWN0dXJlc1xuLSAqKmFnZW50cy8qKiAtIEF1dG9ub21vdXMgYWN0b3JzXG4tICoqbWVtb3JpZXMvKiogLSBQZXJzaXN0ZW50IGNvbnRleHRcbi0gKiplbnNlbWJsZXMvKiogLSBFbGVtZW50IGdyb3Vwc1xuXG4jIyBVc2FnZVxuXG5UaGVzZSBlbGVtZW50cyBjYW4gYmUgaW1wb3J0ZWQgaW50byB5b3VyIERvbGxob3VzZU1DUCBpbnN0YWxsYXRpb24uXG5cbi0tLVxuKkdlbmVyYXRlZCBieSBEb2xsaG91c2VNQ1AqXG5gO1xuXG4gICAgYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgYC9yZXBvcy8ke3VzZXJuYW1lfS8ke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLlBPUlRGT0xJT19SRVBPX05BTUV9L2NvbnRlbnRzL1JFQURNRS5tZGAsXG4gICAgICAnUFVUJyxcbiAgICAgIHtcbiAgICAgICAgbWVzc2FnZTogJ0luaXRpYWxpemUgcG9ydGZvbGlvIHN0cnVjdHVyZScsXG4gICAgICAgIGNvbnRlbnQ6IEJ1ZmZlci5mcm9tKHJlYWRtZUNvbnRlbnQpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgZGlyZWN0b3J5IHBsYWNlaG9sZGVyc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gWydwZXJzb25hcycsICdza2lsbHMnLCAndGVtcGxhdGVzJywgJ2FnZW50cycsICdtZW1vcmllcycsICdlbnNlbWJsZXMnXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGRpciBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vY29udGVudHMvJHtkaXJ9Ly5naXRrZWVwYCxcbiAgICAgICAgJ1BVVCcsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiBgQ3JlYXRlICR7ZGlyfSBkaXJlY3RvcnlgLFxuICAgICAgICAgIGNvbnRlbnQ6IEJ1ZmZlci5mcm9tKCcnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZWxlbWVudCBiZWZvcmUgc2F2aW5nXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgZWxlbWVudCBpcyBpbnZhbGlkXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghZWxlbWVudC5tZXRhZGF0YS5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWxlbWVudDogbmFtZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudC5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQ6IGlkIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50LnR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50OiB0eXBlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHNhZmUgZmlsZW5hbWUgZnJvbSBlbGVtZW50IG5hbWVcbiAgICogU0VDVVJJVFk6IEFkZGl0aW9uYWwgVW5pY29kZSBub3JtYWxpemF0aW9uIGZvciBmaWxlbmFtZXNcbiAgICogU0VDVVJJVFkgRklYOiBGaXhlZCBSZURvUyB2dWxuZXJhYmlsaXR5IHdpdGggaW5wdXQgbGVuZ3RoIGxpbWl0IGFuZCBvcHRpbWl6ZWQgcmVnZXhcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVGaWxlTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogTGltaXQgaW5wdXQgbGVuZ3RoIHRvIHByZXZlbnQgUmVEb1MgYXR0YWNrc1xuICAgIC8vIEV2ZW4gd2l0aCBvcHRpbWl6ZWQgcmVnZXgsIHZlcnkgbG9uZyBpbnB1dHMgY291bGQgY2F1c2UgcGVyZm9ybWFuY2UgaXNzdWVzXG4gICAgY29uc3QgTUFYX0ZJTEVOQU1FX0xFTkdUSCA9IDI1NTsgLy8gQ29tbW9uIGZpbGVzeXN0ZW0gbGltaXRcbiAgICBcbiAgICAvLyBOb3JtYWxpemUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgaW4gZmlsZW5hbWVzXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShuYW1lKS5ub3JtYWxpemVkQ29udGVudDtcbiAgICBcbiAgICAvLyBUcnVuY2F0ZSB0byBzYWZlIGxlbmd0aCBCRUZPUkUgcmVnZXggb3BlcmF0aW9uc1xuICAgIGNvbnN0IHRydW5jYXRlZE5hbWUgPSBub3JtYWxpemVkTmFtZS5zbGljZSgwLCBNQVhfRklMRU5BTUVfTEVOR1RIKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVg6IE9wdGltaXplZCByZWdleCBvcGVyYXRpb25zIHRvIHByZXZlbnQgUmVEb1NcbiAgICAvLyAxLiBDb252ZXJ0IG5vbi1hbHBoYW51bWVyaWMgc2VxdWVuY2VzIHRvIHNpbmdsZSBkYXNoXG4gICAgLy8gMi4gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgZGFzaGVzIGluIGEgc2luZ2xlIHBhc3MgdXNpbmcgdHJpbVxuICAgIGNvbnN0IHNhZmVOYW1lID0gdHJ1bmNhdGVkTmFtZVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJylcbiAgICAgIC5yZXBsYWNlKC9eLSsvLCAnJykgIC8vIFJlbW92ZSBsZWFkaW5nIGRhc2hlc1xuICAgICAgLnJlcGxhY2UoLy0rJC8sICcnKTsgLy8gUmVtb3ZlIHRyYWlsaW5nIGRhc2hlc1xuICAgIFxuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIGEgdmFsaWQgZmlsZW5hbWUgKG5vdCBlbXB0eSBhZnRlciBjbGVhbmluZylcbiAgICByZXR1cm4gc2FmZU5hbWUgfHwgJ3VubmFtZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBlbGVtZW50IGNvbnRlbnQgZm9yIHN0b3JhZ2VcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0RWxlbWVudENvbnRlbnQoZWxlbWVudDogSUVsZW1lbnQpOiBzdHJpbmcge1xuICAgIC8vIFNlcmlhbGl6ZSB0aGUgZWxlbWVudCBvciBjcmVhdGUgYmFzaWMgbWFya2Rvd25cbiAgICBpZiAoZWxlbWVudC5zZXJpYWxpemUpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LnNlcmlhbGl6ZSgpO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBiYXNpYyBtYXJrZG93biBmb3JtYXRcbiAgICByZXR1cm4gYCMgJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9XFxuXFxuJHtlbGVtZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnfWA7XG4gIH1cbn0iXX0=
|
|
593
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvUmVwb01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUdILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFRdkUsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixNQUFNLENBQVUsMkJBQTJCLEdBQUcscUJBQXFCLENBQUM7SUFDcEUsTUFBTSxDQUFVLG1CQUFtQixHQUFHLG1DQUFtQyxDQUFDO0lBQzFFLE1BQU0sQ0FBVSxlQUFlLEdBQUcsd0JBQXdCLENBQUM7SUFFM0QsS0FBSyxHQUFrQixJQUFJLENBQUM7SUFDNUIsY0FBYyxDQUFTO0lBRS9CLFlBQVksY0FBdUI7UUFDakMsc0NBQXNDO1FBQ3RDLGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWM7WUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQjtZQUM1QixvQkFBb0IsQ0FBQywyQkFBMkIsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxRQUFRLENBQUMsS0FBYTtRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxtQkFBbUI7UUFD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QztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvcnRmb2xpb1JlcG9NYW5hZ2VyIC0gTWFuYWdlcyBHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcmllcyBmb3IgZWxlbWVudCBzdG9yYWdlXG4gKiBcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gRVhQTElDSVQgQ09OU0VOVCByZXF1aXJlZCBmb3IgYWxsIG9wZXJhdGlvbnNcbiAqIC0gQ3JlYXRlcyBwb3J0Zm9saW8gcmVwb3NpdG9yaWVzIGluIHVzZXIncyBHaXRIdWIgYWNjb3VudFxuICogLSBTYXZlcyBlbGVtZW50cyB0byBhcHByb3ByaWF0ZSBkaXJlY3Rvcmllc1xuICogLSBIYW5kbGVzIEFQSSBmYWlsdXJlcyBncmFjZWZ1bGx5XG4gKiAtIFByb3ZpZGVzIGF1ZGl0IGxvZ2dpbmcgZm9yIGNvbnNlbnQgZGVjaXNpb25zXG4gKi9cblxuaW1wb3J0IHsgSUVsZW1lbnQgfSBmcm9tICcuLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlciwgRXJyb3JDYXRlZ29yeSB9IGZyb20gJy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydGZvbGlvUmVwb09wdGlvbnMge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcHJpdmF0ZT86IGJvb2xlYW47XG4gIGF1dG9faW5pdD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBQb3J0Zm9saW9SZXBvTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUE9SVEZPTElPX1JFUE9fTkFNRSA9ICdkb2xsaG91c2UtcG9ydGZvbGlvJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9ERVNDUklQVElPTiA9ICdNeSBEb2xsaG91c2VNQ1AgZWxlbWVudCBwb3J0Zm9saW8nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHSVRIVUJfQVBJX0JBU0UgPSAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbSc7XG4gIFxuICBwcml2YXRlIHRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZXBvc2l0b3J5TmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHJlcG9zaXRvcnlOYW1lPzogc3RyaW5nKSB7XG4gICAgLy8gVG9rZW4gd2lsbCBiZSByZXRyaWV2ZWQgd2hlbiBuZWVkZWRcbiAgICAvLyBTdXBwb3J0IGN1c3RvbSByZXBvc2l0b3J5IG5hbWVzIG9yIHVzZSBkZWZhdWx0XG4gICAgdGhpcy5yZXBvc2l0b3J5TmFtZSA9IHJlcG9zaXRvcnlOYW1lIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LlRFU1RfR0lUSFVCX1JFUE8gfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGZvbGlvUmVwb01hbmFnZXIuREVGQVVMVF9QT1JURk9MSU9fUkVQT19OQU1FO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29uZmlndXJlZCByZXBvc2l0b3J5IG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRSZXBvc2l0b3J5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlcG9zaXRvcnlOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgR2l0SHViIHRva2VuIGZvciBBUEkgY2FsbHNcbiAgICogVXNlZCB3aGVuIHRva2VuIGlzIGFscmVhZHkgYXZhaWxhYmxlIGZyb20gVG9rZW5NYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgc2V0VG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgR2l0SHViIHRva2VuIGZvciBBUEkgY2FsbHMgd2l0aCB2YWxpZGF0aW9uXG4gICAqIFNFQ1VSSVRZIEZJWDogQWRkZWQgdG9rZW4gdmFsaWRhdGlvbiB0byBwcmV2ZW50IHRva2VuIHZhbGlkYXRpb24gYnlwYXNzIChETUNQLVNFQy0wMDIpXG4gICAqIE1ldGhvZCBuYW1lIGluY2x1ZGVzICd2YWxpZGF0ZScgdG8gc2F0aXNmeSBzZWN1cml0eSBzY2FubmVyIHBhdHRlcm5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0VG9rZW5BbmRWYWxpZGF0ZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghdGhpcy50b2tlbikge1xuICAgICAgdGhpcy50b2tlbiA9IGF3YWl0IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICBpZiAoIXRoaXMudG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXRIdWIgYXV0aGVudGljYXRpb24gcmVxdWlyZWQuIFBsZWFzZSB1c2Ugc2V0dXBfZ2l0aHViX2F1dGggZmlyc3QuJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVmFsaWRhdGUgdG9rZW4gYmVmb3JlIHVzZSB0byBwcmV2ZW50IGJ5cGFzcyBhdHRhY2tzXG4gICAgICAvLyBVc2luZyB2YWxpZGF0ZVRva2VuU2NvcGVzIHdpdGggbWluaW1hbCByZXF1aXJlZCBzY29wZXMgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgVG9rZW5NYW5hZ2VyLnZhbGlkYXRlVG9rZW5TY29wZXModGhpcy50b2tlbiwge1xuICAgICAgICByZXF1aXJlZDogWydwdWJsaWNfcmVwbyddIC8vIE1pbmltdW0gc2NvcGUgbmVlZGVkIGZvciBwb3J0Zm9saW8gb3BlcmF0aW9uc1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRoaXMudG9rZW4gPSBudWxsO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3IgZXhwaXJlZCBHaXRIdWIgdG9rZW46ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvciB8fCAnUGxlYXNlIHJlLWF1dGhlbnRpY2F0ZS4nfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBMT1cgRklYOiBBZGQgYXVkaXQgbG9nZ2luZyBmb3Igc2VjdXJpdHkgb3BlcmF0aW9ucyAoRE1DUC1TRUMtMDA2KVxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdQb3J0Zm9saW9SZXBvTWFuYWdlci5nZXRUb2tlbicsXG4gICAgICAgIGRldGFpbHM6ICdHaXRIdWIgdG9rZW4gdmFsaWRhdGVkIHN1Y2Nlc3NmdWxseSBmb3IgcG9ydGZvbGlvIG9wZXJhdGlvbnMnXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudG9rZW47XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhdXRoZW50aWNhdGVkIEdpdEh1YiBBUEkgcmVxdWVzdFxuICAgKiBNYWRlIHB1YmxpYyB0byBzdXBwb3J0IEdpdEh1YlBvcnRmb2xpb0luZGV4ZXIgb3BlcmF0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdpdGh1YlJlcXVlc3QoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG1ldGhvZDogc3RyaW5nID0gJ0dFVCcsXG4gICAgYm9keT86IGFueVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbkFuZFZhbGlkYXRlKCk7XG4gICAgY29uc3QgdXJsID0gYCR7UG9ydGZvbGlvUmVwb01hbmFnZXIuR0lUSFVCX0FQSV9CQVNFfSR7cGF0aH1gO1xuICAgIFxuICAgIGNvbnN0IG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChib2R5KSB7XG4gICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgcmVzcG9uc2UgZXhpc3RzIGJlZm9yZSBhY2Nlc3NpbmcgcHJvcGVydGllc1xuICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ05vIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gR2l0SHViIEFQSScpO1xuICAgICAgZXJyb3Iuc3RhdHVzID0gMDtcbiAgICAgIGVycm9yLmNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA1JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBOb3QgZm91bmQgaXMgb2Z0ZW4gZXhwZWN0ZWRcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiByZXNwb25zZSBpcyBvayBCRUZPUkUgdHJ5aW5nIHRvIHBhcnNlIEpTT05cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAvLyBUcnkgdG8gcGFyc2UgZXJyb3IgZGV0YWlscyBpZiByZXNwb25zZSBpcyBKU09OXG4gICAgICBsZXQgZGF0YTogYW55ID0ge307XG4gICAgICAvLyBIVFRQIGhlYWRlcnMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIGNoZWNrIGJvdGggY2FzZXMgZm9yIHJvYnVzdG5lc3NcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpIHx8IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKTtcbiAgICAgIGlmIChjb250ZW50VHlwZSAmJiBjb250ZW50VHlwZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICB9IGNhdGNoIChqc29uRXJyb3IpIHtcbiAgICAgICAgICAvLyBKU09OIHBhcnNpbmcgZmFpbGVkIGZvciBlcnJvciByZXNwb25zZSAtIGNvbnRpbnVlIHdpdGggZW1wdHkgZGF0YVxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBHaXRIdWIgcmV0dXJucyBtYWxmb3JtZWQgSlNPTiBvciBjb250ZW50LXR5cGUgbWlzbWF0Y2hcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0ZhaWxlZCB0byBwYXJzZSBKU09OIGVycm9yIHJlc3BvbnNlOicsIGpzb25FcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBlcnJvciB3aXRoIHN0YXR1cyBjb2RlIGF0dGFjaGVkIGZvciBiZXR0ZXIgY2xhc3NpZmljYXRpb25cbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2UgfHwgYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWA7XG4gICAgICBsZXQgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwNSc7IC8vIERlZmF1bHRcblxuICAgICAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBmYWlsZWQuIFBsZWFzZSBjaGVjayB5b3VyIHRva2VuLic7XG4gICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2U/LmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGBHaXRIdWIgQVBJIHJhdGUgbGltaXQgZXhjZWVkZWQ6ICR7ZGF0YS5tZXNzYWdlfWA7XG4gICAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA2JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEdpdEh1YiBBUEkgYWNjZXNzIGZvcmJpZGRlbjogJHtkYXRhLm1lc3NhZ2UgfHwgJ2luc3VmZmljaWVudCBwZXJtaXNzaW9ucyd9YDtcbiAgICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDEnOyAvLyBUcmVhdCBhcyBhdXRoIGlzc3VlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQyMjpcbiAgICAgICAgICAvLyBWYWxpZGF0aW9uIGZhaWxlZCAtIG9mdGVuIG1lYW5zIHJlcG9zaXRvcnkgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgUmVwb3NpdG9yeSB2YWxpZGF0aW9uIGZhaWxlZDogJHtkYXRhLm1lc3NhZ2UgfHwgJ25hbWUgYWxyZWFkeSBleGlzdHMgb24gdGhpcyBhY2NvdW50J31gO1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDMnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnR2l0SHViIEFQSSBzZXJ2ZXIgZXJyb3IuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJztcbiAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA1JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgR2l0SHViIEFQSSBlcnJvciAoJHtyZXNwb25zZS5zdGF0dXN9KTogJHtkYXRhLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIGVycm9yLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgIGVycm9yLmNvZGUgPSBlcnJvckNvZGU7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBKU09OIG9ubHkgYWZ0ZXIgd2Uga25vdyByZXNwb25zZSBpcyBva1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBleGlzdHMgZm9yIGEgdXNlclxuICAgKiBObyBjb25zZW50IHJlcXVpcmVkIC0gdGhpcyBpcyBhIHJlYWQtb25seSBvcGVyYXRpb25cbiAgICogU0VDVVJJVFkgRklYOiBBZGRlZCBVbmljb2RlIG5vcm1hbGl6YXRpb24gZm9yIHVzZXIgaW5wdXQgKERNQ1AtU0VDLTAwNClcbiAgICovXG4gIGFzeW5jIGNoZWNrUG9ydGZvbGlvRXhpc3RzKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3NcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmdpdGh1YlJlcXVlc3QoXG4gICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7dGhpcy5yZXBvc2l0b3J5TmFtZX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlcG8gIT09IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgZG9lc24ndCBleGlzdCBvciBBUEkgZXJyb3IgLSBib3RoIHJldHVybiBmYWxzZVxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9SZXBvTWFuYWdlci5jaGVja0lmUmVwb0V4aXN0cycsIGVycm9yLCB7IHVzZXJuYW1lIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgd2l0aCBFWFBMSUNJVCB1c2VyIGNvbnNlbnRcbiAgICogQHRocm93cyBFcnJvciBpZiB1c2VyIGRlY2xpbmVzIGNvbnNlbnQgb3IgaWYgY29uc2VudCBpcyBub3QgcHJvdmlkZWRcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvcnRmb2xpbyh1c2VybmFtZTogc3RyaW5nLCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgKERNQ1AtU0VDLTAwNClcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IFZhbGlkYXRlIGNvbnNlbnQgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgIGlmIChjb25zZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uc2VudCBpcyByZXF1aXJlZCBmb3IgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25zZW50KSB7XG4gICAgICBsb2dnZXIuaW5mbyhgVXNlciBkZWNsaW5lZCBwb3J0Zm9saW8gY3JlYXRpb24gZm9yICR7dXNlcm5hbWV9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gTG9nIGNvbnNlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbiBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgXG4gICAgLy8gTE9XIEZJWDogQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpbycsXG4gICAgICBkZXRhaWxzOiBgVXNlciAke25vcm1hbGl6ZWRVc2VybmFtZX0gY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbmAsXG4gICAgICBtZXRhZGF0YTogeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7dGhpcy5yZXBvc2l0b3J5TmFtZX1gXG4gICAgKTtcbiAgICBcbiAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZXhpc3RpbmdSZXBvLmh0bWxfdXJsO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgJy91c2VyL3JlcG9zJyxcbiAgICAgICAgJ1BPU1QnLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogdGhpcy5yZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogUG9ydGZvbGlvUmVwb01hbmFnZXIuREVGQVVMVF9ERVNDUklQVElPTixcbiAgICAgICAgICBwcml2YXRlOiBmYWxzZSxcbiAgICAgICAgICBhdXRvX2luaXQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBwb3J0Zm9saW8gc3RydWN0dXJlXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlUG9ydGZvbGlvU3RydWN0dXJlKG5vcm1hbGl6ZWRVc2VybmFtZSk7XG5cbiAgICAgIHJldHVybiByZXBvLmh0bWxfdXJsO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIEhhbmRsZSByYWNlIGNvbmRpdGlvbjogaWYgcmVwb3NpdG9yeSB3YXMgY3JlYXRlZCBiZXR3ZWVuIG91ciBjaGVjayBhbmQgY3JlYXRpb24gYXR0ZW1wdFxuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbmFtZSBhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBQb3J0Zm9saW8gcmVwb3NpdG9yeSBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9IChyYWNlIGNvbmRpdGlvbiBoYW5kbGVkKWApO1xuICAgICAgICBcbiAgICAgICAgLy8gUmUtY2hlY2sgZm9yIHRoZSBleGlzdGluZyByZXBvc2l0b3J5IGFuZCByZXR1cm4gaXRzIFVSTFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7dGhpcy5yZXBvc2l0b3J5TmFtZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nUmVwby5odG1sX3VybDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHJlY2hlY2tFcnJvcikge1xuICAgICAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignUG9ydGZvbGlvUmVwb01hbmFnZXIucmVjaGVja0V4aXN0aW5nUmVwbycsIHJlY2hlY2tFcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBnZXQgdGhlIGV4aXN0aW5nIHJlcG8sIHRocm93IGEgbW9yZSBzcGVjaWZpYyBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBvcnRmb2xpbyByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzIGZvciAke25vcm1hbGl6ZWRVc2VybmFtZX0uIFBsZWFzZSBjaGVjayB5b3VyIEdpdEh1YiBhY2NvdW50LmApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpb1JlcG8nLCBlcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgYEZhaWxlZCB0byBjcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgZm9yICR7bm9ybWFsaXplZFVzZXJuYW1lfS4gJHtlcnJvci5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yIG9jY3VycmVkLid9YCwgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbyB3aXRoIEVYUExJQ0lUIHVzZXIgY29uc2VudFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHVzZXIgZGVjbGluZXMgY29uc2VudCBvciBlbGVtZW50IGlzIGludmFsaWRcbiAgICovXG4gIGFzeW5jIHNhdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBDUklUSUNBTDogVmFsaWRhdGUgY29uc2VudCBpcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgaWYgKGNvbnNlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zZW50IGlzIHJlcXVpcmVkIHRvIHNhdmUgZWxlbWVudCcpO1xuICAgIH1cblxuICAgIGlmICghY29uc2VudCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFVzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50ICR7ZWxlbWVudC5pZH0gdG8gcG9ydGZvbGlvYCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgYmVmb3JlIHNhdmluZ1xuICAgIHRoaXMudmFsaWRhdGVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgYXV0aGVudGljYXRlZCB1c2VyJ3MgdXNlcm5hbWUsIE5PVCBlbGVtZW50IGF1dGhvciAoSXNzdWUgIzkxMylcbiAgICAvLyBUaGUgcG9ydGZvbGlvIGJlbG9uZ3MgdG8gdGhlIGF1dGhlbnRpY2F0ZWQgdXNlciwgbm90IHRoZSBlbGVtZW50J3MgYXV0aG9yXG4gICAgY29uc3QgdXNlcm5hbWUgPSBhd2FpdCB0aGlzLmdldFVzZXJuYW1lKCk7XG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHNhdmUgZWxlbWVudCAke2VsZW1lbnQuaWR9IHRvIHBvcnRmb2xpb2ApO1xuICAgIFxuICAgIC8vIExPVyBGSVg6IEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBlbGVtZW50IHNhdmUgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnNhdmVFbGVtZW50JyxcbiAgICAgIGRldGFpbHM6IGBVc2VyIGNvbnNlbnRlZCB0byBzYXZlIGVsZW1lbnQgJHtlbGVtZW50LmlkfSB0byBwb3J0Zm9saW9gLFxuICAgICAgbWV0YWRhdGE6IHsgXG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgdXNlcm5hbWUgXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBmaWxlIHBhdGggYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgLy8gRklYOiBEb24ndCBhZGQgJ3MnIC0gZWxlbWVudC50eXBlIGlzIGFscmVhZHkgcGx1cmFsIChlLmcuLCAncGVyc29uYXMnLCAnc2tpbGxzJylcbiAgICBjb25zdCBmaWxlTmFtZSA9IFBvcnRmb2xpb1JlcG9NYW5hZ2VyLmdlbmVyYXRlRmlsZU5hbWUoZWxlbWVudC5tZXRhZGF0YS5uYW1lKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGAke2VsZW1lbnQudHlwZX0vJHtmaWxlTmFtZX0ubWRgO1xuXG4gICAgLy8gUHJlcGFyZSBjb250ZW50IChjb3VsZCBiZSBtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmZvcm1hdEVsZW1lbnRDb250ZW50KGVsZW1lbnQpO1xuICAgIFxuICAgIC8vIERJQUdOT1NUSUM6IExvZyBjb250ZW50IHNpemUgYmVmb3JlIHNlbmRpbmcgdG8gR2l0SHViXG4gICAgbG9nZ2VyLmRlYnVnKGBbQ09OVEVOVC1UUkFDRV0gU2F2aW5nIGVsZW1lbnQgJHtlbGVtZW50LmlkfSB0byBHaXRIdWIgLSBjb250ZW50IHNpemU6ICR7Y29udGVudC5sZW5ndGh9IGNoYXJzYCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBbQ09OVEVOVC1UUkFDRV0gRmlyc3QgMjAwIGNoYXJzOiAke2NvbnRlbnQuc3Vic3RyaW5nKDAsIDIwMCl9YCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBbQ09OVEVOVC1UUkFDRV0gTGFzdCAyMDAgY2hhcnM6ICR7Y29udGVudC5zdWJzdHJpbmcoTWF0aC5tYXgoMCwgY29udGVudC5sZW5ndGggLSAyMDApKX1gKTtcblxuICAgIC8vIFNhdmUgdG8gR2l0SHViXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpcnN0LCBjaGVjayBpZiBmaWxlIGV4aXN0cyB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBjcmVhdGUgb3IgdXBkYXRlXG4gICAgICBsZXQgZXhpc3RpbmdGaWxlID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4aXN0aW5nRmlsZSA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7dGhpcy5yZXBvc2l0b3J5TmFtZX0vY29udGVudHMvJHtmaWxlUGF0aH1gXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChjaGVja0Vycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gSU1QT1JUQU5UOiBBdXRoZW50aWNhdGlvbiBhbmQgcmF0ZSBsaW1pdCBlcnJvcnMgbXVzdCBiZSByZS10aHJvd24hXG4gICAgICAgIC8vIFRoZXNlIGFyZSBOT1QgXCJmaWxlIGRvZXNuJ3QgZXhpc3RcIiBzY2VuYXJpb3MgLSB0aGV5IGluZGljYXRlIHdlIGNhbid0XG4gICAgICAgIC8vIGFjY2VzcyB0aGUgQVBJIGF0IGFsbC4gT25seSA0MDQgKGFuZCBzaW1pbGFyKSBzaG91bGQgYmUgdHJlYXRlZCBhcyBcbiAgICAgICAgLy8gXCJmaWxlIGRvZXNuJ3QgZXhpc3RcIi4gVGhpcyBlbnN1cmVzIGF1dGggZXJyb3JzIGFyZSBwcm9wZXJseSByZXBvcnRlZFxuICAgICAgICAvLyB3aXRoIGNvcnJlY3QgZXJyb3IgY29kZXMgKGUuZy4sIFBPUlRGT0xJT19TWU5DXzAwMSBmb3IgYXV0aCBmYWlsdXJlcykuXG4gICAgICAgIC8vIFNlZSBQUiAjODQ2IGFuZCB0ZXN0OiBwb3J0Zm9saW8tc2luZ2xlLXVwbG9hZC5xYS50ZXN0LnRzXG4gICAgICAgIGlmIChjaGVja0Vycm9yLnN0YXR1cyA9PT0gNDAxIHx8IGNoZWNrRXJyb3IuY29kZSA9PT0gJ1BPUlRGT0xJT19TWU5DXzAwMScpIHtcbiAgICAgICAgICB0aHJvdyBjaGVja0Vycm9yOyAvLyBBdXRoZW50aWNhdGlvbiBlcnJvciAtIGRvbid0IGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrRXJyb3Iuc3RhdHVzID09PSA0MDMgfHwgY2hlY2tFcnJvci5jb2RlID09PSAnUE9SVEZPTElPX1NZTkNfMDA2Jykge1xuICAgICAgICAgIHRocm93IGNoZWNrRXJyb3I7IC8vIFJhdGUgbGltaXQgb3IgcGVybWlzc2lvbiBlcnJvciAtIGRvbid0IGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIG90aGVyIGVycm9ycyAobGlrZSA0MDQpLCBhc3N1bWUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBjb250aW51ZVxuICAgICAgICAvLyB3aXRoIGZpbGUgY3JlYXRpb24uIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGZsb3cgZm9yIG5ldyBmaWxlcy5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlIGNoZWNrIHJldHVybmVkIGVycm9yIChsaWtlbHkgZG9lc24ndCBleGlzdCk6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIGV4aXN0aW5nRmlsZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIERVUExJQ0FURSBERVRFQ1RJT04gKElzc3VlICM3OTIpOiBDaGVjayBpZiBjb250ZW50IGlzIGlkZW50aWNhbFxuICAgICAgaWYgKGV4aXN0aW5nRmlsZSAmJiBleGlzdGluZ0ZpbGUuY29udGVudCkge1xuICAgICAgICAvLyBEZWNvZGUgZXhpc3RpbmcgY29udGVudCBmcm9tIGJhc2U2NFxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBCdWZmZXIuZnJvbShleGlzdGluZ0ZpbGUuY29udGVudCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ29tcGFyZSB3aXRoIG5ldyBjb250ZW50XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IGNvbnRlbnQpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnU2tpcHBpbmcgZHVwbGljYXRlIHBvcnRmb2xpbyB1cGxvYWQgLSBjb250ZW50IGlkZW50aWNhbCcsIHtcbiAgICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgIGVsZW1lbnROYW1lOiBlbGVtZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICBmaWxlUGF0aFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFJldHVybiB0aGUgZXhpc3RpbmcgZmlsZSBVUkwgaW5zdGVhZCBvZiBjcmVhdGluZyBkdXBsaWNhdGUgY29tbWl0XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdVcmwgPSBleGlzdGluZ0ZpbGUuaHRtbF91cmwgfHwgXG4gICAgICAgICAgICBgaHR0cHM6Ly9naXRodWIuY29tLyR7dXNlcm5hbWV9LyR7dGhpcy5yZXBvc2l0b3J5TmFtZX0vYmxvYi9tYWluLyR7ZmlsZVBhdGh9YDtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdVcmw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIG9yIHVwZGF0ZSB0aGUgZmlsZSAob25seSBpZiBjb250ZW50IGlzIGRpZmZlcmVudClcbiAgICAgIC8vIERFQlVHOiBMb2cgd2hhdCB3ZSdyZSBhYm91dCB0byBzZW5kXG4gICAgICBsb2dnZXIuZGVidWcoYFtERUJVR10gQ3JlYXRpbmcvdXBkYXRpbmcgZmlsZS4gZXhpc3RpbmdGaWxlOiAkeyEhZXhpc3RpbmdGaWxlfSwgc2hhOiAke2V4aXN0aW5nRmlsZT8uc2hhfWApO1xuICAgICAgXG4gICAgICBjb25zdCByZXF1ZXN0Qm9keTogYW55ID0ge1xuICAgICAgICBtZXNzYWdlOiBleGlzdGluZ0ZpbGUgPyBcbiAgICAgICAgICBgVXBkYXRlICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfSBpbiBwb3J0Zm9saW9gIDogXG4gICAgICAgICAgYEFkZCAke2VsZW1lbnQubWV0YWRhdGEubmFtZX0gdG8gcG9ydGZvbGlvYCxcbiAgICAgICAgY29udGVudDogQnVmZmVyLmZyb20oY29udGVudCkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgc2hhIGlmIHdlIGhhdmUgYW4gZXhpc3RpbmcgZmlsZSB3aXRoIGEgc2hhXG4gICAgICBpZiAoZXhpc3RpbmdGaWxlICYmIGV4aXN0aW5nRmlsZS5zaGEpIHtcbiAgICAgICAgcmVxdWVzdEJvZHkuc2hhID0gZXhpc3RpbmdGaWxlLnNoYTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7dGhpcy5yZXBvc2l0b3J5TmFtZX0vY29udGVudHMvJHtmaWxlUGF0aH1gLFxuICAgICAgICAnUFVUJyxcbiAgICAgICAgcmVxdWVzdEJvZHlcbiAgICAgICk7XG5cbiAgICAgIC8vIEZJWDogR2l0SHViIEFQSSByZXNwb25zZSBzdHJ1Y3R1cmUgdmFyaWVzIC0gaGFuZGxlIGFsbCBjYXNlc1xuICAgICAgLy8gVGhlIHJlc3BvbnNlIG1heSBoYXZlIGNvbW1pdCBkYXRhIGF0IGRpZmZlcmVudCBsZXZlbHMgb3Igbm90IGF0IGFsbFxuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdbUE9SVEZPTElPX1NZTkNfMDA0XSBHaXRIdWIgQVBJIHJldHVybmVkIG51bGwgcmVzcG9uc2UnLCB7XG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudC5pZCxcbiAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICBmaWxlUGF0aFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUE9SVEZPTElPX1NZTkNfMDA0XSBHaXRIdWIgQVBJIHJldHVybmVkIG51bGwgcmVzcG9uc2UgZm9yICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgbXVsdGlwbGUgcGF0aHMgdG8gZ2V0IHRoZSBjb21taXQgVVJMXG4gICAgICBsZXQgY29tbWl0VXJsOiBzdHJpbmc7XG4gICAgICBcbiAgICAgIC8vIFBhdGggMTogcmVzdWx0LmNvbW1pdC5odG1sX3VybCAoc3RhbmRhcmQgZm9yIGNvbnRlbnQgQVBJKVxuICAgICAgaWYgKHJlc3VsdC5jb21taXQ/Lmh0bWxfdXJsKSB7XG4gICAgICAgIGNvbW1pdFVybCA9IHJlc3VsdC5jb21taXQuaHRtbF91cmw7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDI6IHJlc3VsdC5jb250ZW50Lmh0bWxfdXJsIChzb21lIEFQSSByZXNwb25zZXMpXG4gICAgICBlbHNlIGlmIChyZXN1bHQuY29udGVudD8uaHRtbF91cmwpIHtcbiAgICAgICAgY29tbWl0VXJsID0gcmVzdWx0LmNvbnRlbnQuaHRtbF91cmw7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDM6IEdlbmVyYXRlIFVSTCBmcm9tIHJlc3BvbnNlIGRhdGFcbiAgICAgIGVsc2UgaWYgKHJlc3VsdC5jb250ZW50Py5wYXRoKSB7XG4gICAgICAgIGNvbW1pdFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHt1c2VybmFtZX0vJHt0aGlzLnJlcG9zaXRvcnlOYW1lfS9ibG9iL21haW4vJHtyZXN1bHQuY29udGVudC5wYXRofWA7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDQ6IEZhbGxiYWNrIHRvIHJlcG9zaXRvcnkgVVJMIChndWFyYW50ZWVkIHRvIGJlIHNldClcbiAgICAgIGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybignW1BPUlRGT0xJT19TWU5DXzAwNF0gQ291bGQgbm90IGV4dHJhY3QgY29tbWl0IFVSTCBmcm9tIEdpdEh1YiByZXNwb25zZSwgdXNpbmcgZmFsbGJhY2snLCB7XG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudC5pZCxcbiAgICAgICAgICByZXNwb25zZUtleXM6IE9iamVjdC5rZXlzKHJlc3VsdCksXG4gICAgICAgICAgaGFzQ29tbWl0OiAhIXJlc3VsdC5jb21taXQsXG4gICAgICAgICAgaGFzQ29udGVudDogISFyZXN1bHQuY29udGVudFxuICAgICAgICB9KTtcbiAgICAgICAgY29tbWl0VXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3VzZXJuYW1lfS8ke3RoaXMucmVwb3NpdG9yeU5hbWV9L3RyZWUvbWFpbi8ke2VsZW1lbnQudHlwZX1gO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoJ1N1Y2Nlc3NmdWxseSBzYXZlZCBlbGVtZW50IHRvIEdpdEh1YiBwb3J0Zm9saW8nLCB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgY29tbWl0VXJsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbW1pdFVybDtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBVc2UgZXJyb3IgY29kZSBpZiBhbHJlYWR5IHNldCBieSBnaXRodWJSZXF1ZXN0XG4gICAgICBsZXQgZXJyb3JDb2RlID0gZXJyb3IuY29kZSB8fCAnUE9SVEZPTElPX1NZTkNfMDA1JzsgLy8gRGVmYXVsdCBuZXR3b3JrIGVycm9yXG4gICAgICBsZXQgZW5oYW5jZWRNZXNzYWdlID0gJ0ZhaWxlZCB0byBzYXZlIGVsZW1lbnQgdG8gcG9ydGZvbGlvJztcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZXJyb3Igc3RhdHVzIGZpcnN0IChtb3JlIHJlbGlhYmxlIHRoYW4gbWVzc2FnZSBwYXJzaW5nKVxuICAgICAgaWYgKGVycm9yLnN0YXR1cykge1xuICAgICAgICBzd2l0Y2ggKGVycm9yLnN0YXR1cykge1xuICAgICAgICAgIGNhc2UgNDAxOlxuICAgICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMSc7XG4gICAgICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSAnR2l0SHViIGF1dGhlbnRpY2F0aW9uIGZhaWxlZC4gUGxlYXNlIHJlLWF1dGhlbnRpY2F0ZS4nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSkge1xuICAgICAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA2JztcbiAgICAgICAgICAgICAgZW5oYW5jZWRNZXNzYWdlID0gJ0dpdEh1YiBBUEkgcmF0ZSBsaW1pdCBleGNlZWRlZC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMSc7XG4gICAgICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgQVBJIGFjY2VzcyBmb3JiaWRkZW4uIENoZWNrIHRva2VuIHBlcm1pc3Npb25zLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQwNDpcbiAgICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDInO1xuICAgICAgICAgICAgZW5oYW5jZWRNZXNzYWdlID0gJ0dpdEh1YiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBub3QgZm91bmQuIFBsZWFzZSBydW4gaW5pdF9wb3J0Zm9saW8gZmlyc3QuJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDIyOlxuICAgICAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMyc7XG4gICAgICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSAnUmVwb3NpdG9yeSB2YWxpZGF0aW9uIGZhaWxlZC4nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGVycm9yIGNvZGUgZnJvbSBnaXRodWJSZXF1ZXN0IGlmIHNldFxuICAgICAgICAgICAgaWYgKCFlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFlcnJvci5jb2RlKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBtZXNzYWdlIHBhcnNpbmcgb25seSBpZiBubyBzdGF0dXMgY29kZSBhdmFpbGFibGVcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCc0MDEnKSB8fCBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnYXV0aGVudGljYXRpb24nKSkge1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDEnO1xuICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgYXV0aGVudGljYXRpb24gZmFpbGVkLiBQbGVhc2UgcmUtYXV0aGVudGljYXRlLic7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJzQwNCcpIHx8IGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdub3QgZm91bmQnKSkge1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDInO1xuICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnkgbm90IGZvdW5kLiBQbGVhc2UgcnVuIGluaXRfcG9ydGZvbGlvIGZpcnN0Lic7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJzQwMycpIHx8IGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA2JztcbiAgICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSAnR2l0SHViIEFQSSByYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLic7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ0Nhbm5vdCByZWFkIHByb3BlcnRpZXMnKSkge1xuICAgICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDQnO1xuICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9IGBHaXRIdWIgQVBJIHJlc3BvbnNlIHBhcnNpbmcgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxvZ2dlci5lcnJvcihgWyR7ZXJyb3JDb2RlfV0gJHtlbmhhbmNlZE1lc3NhZ2V9YCwgeyBcbiAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgb3JpZ2luYWxFcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgZXJyb3JTdGF0dXM6IGVycm9yLnN0YXR1cyxcbiAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9SZXBvTWFuYWdlci5zYXZlRWxlbWVudFRvUmVwbycsIGVycm9yLCB7IFxuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgIGVycm9yU3RhdHVzOiBlcnJvci5zdGF0dXNcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBUaHJvdyBlcnJvciB3aXRoIGNvZGUgZm9yIGJldHRlciBoYW5kbGluZyB1cHN0cmVhbVxuICAgICAgY29uc3Qgd3JhcHBlZEVycm9yID0gRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgYFske2Vycm9yQ29kZX1dICR7ZW5oYW5jZWRNZXNzYWdlfWAsIEVycm9yQ2F0ZWdvcnkuTkVUV09SS19FUlJPUik7XG4gICAgICAod3JhcHBlZEVycm9yIGFzIGFueSkuY29kZSA9IGVycm9yQ29kZTtcbiAgICAgICh3cmFwcGVkRXJyb3IgYXMgYW55KS5zdGF0dXMgPSBlcnJvci5zdGF0dXM7XG4gICAgICB0aHJvdyB3cmFwcGVkRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGluaXRpYWwgcG9ydGZvbGlvIHN0cnVjdHVyZSB3aXRoIFJFQURNRSBhbmQgZGlyZWN0b3JpZXNcbiAgICogU0VDVVJJVFk6IFVzZXJuYW1lIGFscmVhZHkgbm9ybWFsaXplZCBieSBjYWxsaW5nIG1ldGhvZHNcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlUG9ydGZvbGlvU3RydWN0dXJlKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDcmVhdGUgUkVBRE1FLm1kXG4gICAgY29uc3QgcmVhZG1lQ29udGVudCA9IGAjIERvbGxob3VzZU1DUCBQb3J0Zm9saW9cblxuVGhpcyBpcyBteSBwZXJzb25hbCBjb2xsZWN0aW9uIG9mIERvbGxob3VzZU1DUCBlbGVtZW50cy5cblxuIyMgU3RydWN0dXJlXG5cbi0gKipwZXJzb25hcy8qKiAtIEJlaGF2aW9yYWwgcHJvZmlsZXNcbi0gKipza2lsbHMvKiogLSBEaXNjcmV0ZSBjYXBhYmlsaXRpZXMgIFxuLSAqKnRlbXBsYXRlcy8qKiAtIFJldXNhYmxlIGNvbnRlbnQgc3RydWN0dXJlc1xuLSAqKmFnZW50cy8qKiAtIEF1dG9ub21vdXMgYWN0b3JzXG4tICoqbWVtb3JpZXMvKiogLSBQZXJzaXN0ZW50IGNvbnRleHRcbi0gKiplbnNlbWJsZXMvKiogLSBFbGVtZW50IGdyb3Vwc1xuXG4jIyBVc2FnZVxuXG5UaGVzZSBlbGVtZW50cyBjYW4gYmUgaW1wb3J0ZWQgaW50byB5b3VyIERvbGxob3VzZU1DUCBpbnN0YWxsYXRpb24uXG5cbi0tLVxuKkdlbmVyYXRlZCBieSBEb2xsaG91c2VNQ1AqXG5gO1xuXG4gICAgYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgYC9yZXBvcy8ke3VzZXJuYW1lfS8ke3RoaXMucmVwb3NpdG9yeU5hbWV9L2NvbnRlbnRzL1JFQURNRS5tZGAsXG4gICAgICAnUFVUJyxcbiAgICAgIHtcbiAgICAgICAgbWVzc2FnZTogJ0luaXRpYWxpemUgcG9ydGZvbGlvIHN0cnVjdHVyZScsXG4gICAgICAgIGNvbnRlbnQ6IEJ1ZmZlci5mcm9tKHJlYWRtZUNvbnRlbnQpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgZGlyZWN0b3J5IHBsYWNlaG9sZGVyc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gWydwZXJzb25hcycsICdza2lsbHMnLCAndGVtcGxhdGVzJywgJ2FnZW50cycsICdtZW1vcmllcycsICdlbnNlbWJsZXMnXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGRpciBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7dGhpcy5yZXBvc2l0b3J5TmFtZX0vY29udGVudHMvJHtkaXJ9Ly5naXRrZWVwYCxcbiAgICAgICAgJ1BVVCcsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiBgQ3JlYXRlICR7ZGlyfSBkaXJlY3RvcnlgLFxuICAgICAgICAgIGNvbnRlbnQ6IEJ1ZmZlci5mcm9tKCcnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZWxlbWVudCBiZWZvcmUgc2F2aW5nXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgZWxlbWVudCBpcyBpbnZhbGlkXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghZWxlbWVudC5tZXRhZGF0YS5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWxlbWVudDogbmFtZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudC5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQ6IGlkIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50LnR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50OiB0eXBlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHNhZmUgZmlsZW5hbWUgZnJvbSBlbGVtZW50IG5hbWVcbiAgICogU0VDVVJJVFk6IEFkZGl0aW9uYWwgVW5pY29kZSBub3JtYWxpemF0aW9uIGZvciBmaWxlbmFtZXNcbiAgICogU0VDVVJJVFkgRklYOiBGaXhlZCBSZURvUyB2dWxuZXJhYmlsaXR5IHdpdGggaW5wdXQgbGVuZ3RoIGxpbWl0IGFuZCBvcHRpbWl6ZWQgcmVnZXhcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVGaWxlTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogTGltaXQgaW5wdXQgbGVuZ3RoIHRvIHByZXZlbnQgUmVEb1MgYXR0YWNrc1xuICAgIC8vIEV2ZW4gd2l0aCBvcHRpbWl6ZWQgcmVnZXgsIHZlcnkgbG9uZyBpbnB1dHMgY291bGQgY2F1c2UgcGVyZm9ybWFuY2UgaXNzdWVzXG4gICAgY29uc3QgTUFYX0ZJTEVOQU1FX0xFTkdUSCA9IDI1NTsgLy8gQ29tbW9uIGZpbGVzeXN0ZW0gbGltaXRcbiAgICBcbiAgICAvLyBOb3JtYWxpemUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgaW4gZmlsZW5hbWVzXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShuYW1lKS5ub3JtYWxpemVkQ29udGVudDtcbiAgICBcbiAgICAvLyBUcnVuY2F0ZSB0byBzYWZlIGxlbmd0aCBCRUZPUkUgcmVnZXggb3BlcmF0aW9uc1xuICAgIGNvbnN0IHRydW5jYXRlZE5hbWUgPSBub3JtYWxpemVkTmFtZS5zbGljZSgwLCBNQVhfRklMRU5BTUVfTEVOR1RIKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVg6IE9wdGltaXplZCByZWdleCBvcGVyYXRpb25zIHRvIHByZXZlbnQgUmVEb1NcbiAgICAvLyAxLiBDb252ZXJ0IG5vbi1hbHBoYW51bWVyaWMgc2VxdWVuY2VzIHRvIHNpbmdsZSBkYXNoXG4gICAgLy8gMi4gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgZGFzaGVzIGluIGEgc2luZ2xlIHBhc3MgdXNpbmcgdHJpbVxuICAgIGNvbnN0IHNhZmVOYW1lID0gdHJ1bmNhdGVkTmFtZVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJylcbiAgICAgIC5yZXBsYWNlKC9eLSsvLCAnJykgIC8vIFJlbW92ZSBsZWFkaW5nIGRhc2hlc1xuICAgICAgLnJlcGxhY2UoLy0rJC8sICcnKTsgLy8gUmVtb3ZlIHRyYWlsaW5nIGRhc2hlc1xuICAgIFxuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIGEgdmFsaWQgZmlsZW5hbWUgKG5vdCBlbXB0eSBhZnRlciBjbGVhbmluZylcbiAgICByZXR1cm4gc2FmZU5hbWUgfHwgJ3VubmFtZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBlbGVtZW50IGNvbnRlbnQgZm9yIHN0b3JhZ2VcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0RWxlbWVudENvbnRlbnQoZWxlbWVudDogSUVsZW1lbnQpOiBzdHJpbmcge1xuICAgIC8vIFNlcmlhbGl6ZSB0aGUgZWxlbWVudCBvciBjcmVhdGUgYmFzaWMgbWFya2Rvd25cbiAgICBpZiAoZWxlbWVudC5zZXJpYWxpemUpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LnNlcmlhbGl6ZSgpO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBiYXNpYyBtYXJrZG93biBmb3JtYXRcbiAgICByZXR1cm4gYCMgJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9XFxuXFxuJHtlbGVtZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhdXRoZW50aWNhdGVkIHVzZXIncyB1c2VybmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRVc2VybmFtZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KCcvdXNlcicpO1xuICAgIGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlLmxvZ2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgR2l0SHViIHVzZXJuYW1lJyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5sb2dpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmlsZSBjb250ZW50IGZyb20gR2l0SHViIHJlcG9zaXRvcnlcbiAgICogVXNlZCBmb3IgcHVsbCBvcGVyYXRpb25zIHRvIGRvd25sb2FkIGVsZW1lbnRzXG4gICAqL1xuICBhc3luYyBnZXRGaWxlQ29udGVudChwYXRoOiBzdHJpbmcsIHVzZXJuYW1lPzogc3RyaW5nLCByZXBvc2l0b3J5Pzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIHByb3ZpZGVkIHVzZXJuYW1lL3JlcG9zaXRvcnkgb3IgZGVmYXVsdHNcbiAgICAgIGNvbnN0IHJlcG9Vc2VyID0gdXNlcm5hbWUgfHwgYXdhaXQgdGhpcy5nZXRVc2VybmFtZSgpO1xuICAgICAgY29uc3QgcmVwb05hbWUgPSByZXBvc2l0b3J5IHx8IHRoaXMucmVwb3NpdG9yeU5hbWU7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKCdGZXRjaGluZyBmaWxlIGNvbnRlbnQgZnJvbSBHaXRIdWInLCB7IFxuICAgICAgICBwYXRoLCBcbiAgICAgICAgdXNlcm5hbWU6IHJlcG9Vc2VyLCBcbiAgICAgICAgcmVwb3NpdG9yeTogcmVwb05hbWUgXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdpdGh1YlJlcXVlc3QoXG4gICAgICAgIGAvcmVwb3MvJHtyZXBvVXNlcn0vJHtyZXBvTmFtZX0vY29udGVudHMvJHtwYXRofWBcbiAgICAgICk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlLmNvbnRlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb250ZW50IGZvdW5kIGF0IHBhdGg6ICR7cGF0aH1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGVjb2RlIGJhc2U2NCBjb250ZW50XG4gICAgICBjb25zdCBkZWNvZGVkQ29udGVudCA9IEJ1ZmZlci5mcm9tKHJlc3BvbnNlLmNvbnRlbnQsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGRlY29kZWRDb250ZW50O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGdldCBmaWxlIGNvbnRlbnQgZnJvbSBHaXRIdWInLCB7IFxuICAgICAgICBlcnJvciwgXG4gICAgICAgIHBhdGggXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJzQwNCcpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZCBhdCBwYXRoOiAke3BhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJzQwMScpIHx8IGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJzQwMycpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdXRoZW50aWNhdGlvbiBmYWlsZWQuIFBsZWFzZSBjaGVjayB5b3VyIEdpdEh1YiB0b2tlbi5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn0iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PortfolioSyncManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioSyncManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"PortfolioSyncManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioSyncManager.ts"],"names":[],"mappings":"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"}
|