@dollhousemcp/mcp-server 1.7.1 → 1.7.3
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 +22 -0
- package/dist/auth/GitHubAuthManager.js +2 -2
- package/dist/config/ConfigManager.d.ts +158 -25
- package/dist/config/ConfigManager.d.ts.map +1 -1
- package/dist/config/ConfigManager.js +627 -88
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ConfigHandler.d.ts +32 -0
- package/dist/handlers/ConfigHandler.d.ts.map +1 -0
- package/dist/handlers/ConfigHandler.js +202 -0
- package/dist/handlers/SyncHandlerV2.d.ts +42 -0
- package/dist/handlers/SyncHandlerV2.d.ts.map +1 -0
- package/dist/handlers/SyncHandlerV2.js +231 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -3
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts +0 -1
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -1
- package/dist/portfolio/GitHubPortfolioIndexer.js +36 -16
- package/dist/portfolio/PortfolioRepoManager.d.ts +2 -1
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioRepoManager.js +2 -1
- package/dist/portfolio/PortfolioSyncManager.d.ts +127 -0
- package/dist/portfolio/PortfolioSyncManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioSyncManager.js +818 -0
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +54 -2
- package/dist/security/secureYamlParser.d.ts +46 -2
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +47 -3
- package/dist/server/ServerSetup.d.ts.map +1 -1
- package/dist/server/ServerSetup.js +16 -10
- package/dist/server/tools/ConfigToolsV2.d.ts +10 -0
- package/dist/server/tools/ConfigToolsV2.d.ts.map +1 -0
- package/dist/server/tools/ConfigToolsV2.js +110 -0
- 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/utils/logger.d.ts +45 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +202 -9
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitHubPortfolioIndexer.d.ts","sourceRoot":"","sources":["../../src/portfolio/GitHubPortfolioIndexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"GitHubPortfolioIndexer.d.ts","sourceRoot":"","sources":["../../src/portfolio/GitHubPortfolioIndexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOzC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,IAAI,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAC9D,OAAO,CAAC,MAAM,CAAC,YAAY,CAAS;IAEpC,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IAEnD,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,gBAAgB,CAAwB;IAEhD,OAAO;IAQP;;OAEG;WACW,WAAW,IAAI,sBAAsB;IAgBnD;;OAEG;IACU,QAAQ,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkDnE;;OAEG;IACI,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgBlD;;OAEG;IACI,UAAU,IAAI,IAAI;IAUzB;;OAEG;IACI,aAAa,IAAI;QACtB,aAAa,EAAE,OAAO,CAAC;QACvB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC;QACjB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;KACvB;IAUD;;OAEG;YACW,UAAU;IAmDxB;;OAEG;YACW,sBAAsB;IAapC;;OAEG;YACW,gBAAgB;IA0D9B;;OAEG;YACW,aAAa;IAsD3B;;OAEG;YACW,uBAAuB;IA8DrC;;OAEG;YACW,sBAAsB;IAsDpC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA6BhC;;OAEG;YACW,iBAAiB;IAS/B;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAiBzB"}
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
* - Fallback strategy for resilient operation
|
|
10
10
|
* - Performance optimized for 1000+ portfolio elements
|
|
11
11
|
*/
|
|
12
|
-
import { GitHubClient } from '../collection/GitHubClient.js';
|
|
13
12
|
import { PortfolioRepoManager } from './PortfolioRepoManager.js';
|
|
14
13
|
import { ElementType } from './types.js';
|
|
15
14
|
import { logger } from '../utils/logger.js';
|
|
@@ -26,14 +25,12 @@ export class GitHubPortfolioIndexer {
|
|
|
26
25
|
recentUserAction = false;
|
|
27
26
|
actionTimestamp = null;
|
|
28
27
|
actionGracePeriod = 2 * 60 * 1000; // 2 minutes after action
|
|
29
|
-
githubClient;
|
|
30
28
|
portfolioRepoManager;
|
|
31
29
|
apiCache;
|
|
32
30
|
rateLimitTracker;
|
|
33
31
|
constructor() {
|
|
34
32
|
this.apiCache = new APICache(); // Uses default settings
|
|
35
33
|
this.rateLimitTracker = new Map();
|
|
36
|
-
this.githubClient = new GitHubClient(this.apiCache, this.rateLimitTracker);
|
|
37
34
|
this.portfolioRepoManager = new PortfolioRepoManager();
|
|
38
35
|
logger.debug('GitHubPortfolioIndexer created');
|
|
39
36
|
}
|
|
@@ -252,7 +249,9 @@ export class GitHubPortfolioIndexer {
|
|
|
252
249
|
}
|
|
253
250
|
`;
|
|
254
251
|
const variables = { owner: username, name: repository };
|
|
255
|
-
|
|
252
|
+
// GraphQL endpoint not yet implemented with PortfolioRepoManager
|
|
253
|
+
// For now, just throw to fall back to REST
|
|
254
|
+
throw new Error('GraphQL not yet implemented for portfolio operations');
|
|
256
255
|
// Note: This is a simplified GraphQL implementation
|
|
257
256
|
// In a real implementation, you would send POST request with query and variables
|
|
258
257
|
throw new Error('GraphQL implementation not yet complete');
|
|
@@ -263,8 +262,8 @@ export class GitHubPortfolioIndexer {
|
|
|
263
262
|
async fetchWithREST(username, repository) {
|
|
264
263
|
const normalizedUsername = UnicodeValidator.normalize(username).normalizedContent;
|
|
265
264
|
// Get repository info and latest commit
|
|
266
|
-
const repoInfo = await this.
|
|
267
|
-
const latestCommit = await this.
|
|
265
|
+
const repoInfo = await this.portfolioRepoManager.githubRequest(`/repos/${normalizedUsername}/${repository}`);
|
|
266
|
+
const latestCommit = await this.portfolioRepoManager.githubRequest(`/repos/${normalizedUsername}/${repository}/commits/HEAD`);
|
|
268
267
|
// Initialize index
|
|
269
268
|
const index = {
|
|
270
269
|
username: normalizedUsername,
|
|
@@ -279,15 +278,24 @@ export class GitHubPortfolioIndexer {
|
|
|
279
278
|
index.elements.set(elementType, []);
|
|
280
279
|
}
|
|
281
280
|
// Fetch content for each element type
|
|
281
|
+
logger.info(`Fetching content for all element types from GitHub portfolio...`);
|
|
282
282
|
for (const elementType of Object.values(ElementType)) {
|
|
283
283
|
try {
|
|
284
|
+
logger.debug(`Fetching ${elementType} from GitHub...`);
|
|
284
285
|
const entries = await this.fetchElementTypeContent(normalizedUsername, repository, elementType);
|
|
285
286
|
index.elements.set(elementType, entries);
|
|
286
287
|
index.totalElements += entries.length;
|
|
288
|
+
if (entries.length > 0) {
|
|
289
|
+
logger.info(`✅ Found ${entries.length} ${elementType} in GitHub portfolio`);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
logger.debug(`📁 No ${elementType} found (directory may not exist yet)`);
|
|
293
|
+
}
|
|
287
294
|
}
|
|
288
295
|
catch (error) {
|
|
289
|
-
logger.warn(
|
|
290
|
-
error: error instanceof Error ? error.message : String(error)
|
|
296
|
+
logger.warn(`❌ Failed to fetch ${elementType} from GitHub portfolio`, {
|
|
297
|
+
error: error instanceof Error ? error.message : String(error),
|
|
298
|
+
elementType
|
|
291
299
|
});
|
|
292
300
|
// Continue with other element types
|
|
293
301
|
}
|
|
@@ -299,8 +307,8 @@ export class GitHubPortfolioIndexer {
|
|
|
299
307
|
*/
|
|
300
308
|
async fetchElementTypeContent(username, repository, elementType) {
|
|
301
309
|
try {
|
|
302
|
-
// Get directory listing
|
|
303
|
-
const contents = await this.
|
|
310
|
+
// Get directory listing using PortfolioRepoManager
|
|
311
|
+
const contents = await this.portfolioRepoManager.githubRequest(`/repos/${username}/${repository}/contents/${elementType}`);
|
|
304
312
|
if (!Array.isArray(contents)) {
|
|
305
313
|
return [];
|
|
306
314
|
}
|
|
@@ -326,10 +334,20 @@ export class GitHubPortfolioIndexer {
|
|
|
326
334
|
return entries;
|
|
327
335
|
}
|
|
328
336
|
catch (error) {
|
|
329
|
-
// Directory might not exist
|
|
330
|
-
|
|
331
|
-
|
|
337
|
+
// Directory might not exist - check for 404 errors
|
|
338
|
+
// PortfolioRepoManager will throw standard GitHub API errors
|
|
339
|
+
if (error instanceof Error) {
|
|
340
|
+
// Check for 404 Not Found errors from GitHub API
|
|
341
|
+
if (error.message.includes('404') ||
|
|
342
|
+
error.message.includes('Not Found')) {
|
|
343
|
+
logger.debug(`Directory ${elementType} not found in GitHub repository (this is normal if not yet created)`);
|
|
344
|
+
return [];
|
|
345
|
+
}
|
|
346
|
+
// Log the actual error for debugging
|
|
347
|
+
logger.debug(`Error fetching ${elementType}: ${error.message}`);
|
|
332
348
|
}
|
|
349
|
+
// Re-throw other errors
|
|
350
|
+
logger.warn(`Unexpected error fetching ${elementType}:`, error);
|
|
333
351
|
throw error;
|
|
334
352
|
}
|
|
335
353
|
}
|
|
@@ -354,7 +372,9 @@ export class GitHubPortfolioIndexer {
|
|
|
354
372
|
// This is expensive, so only do it for small files or when specifically needed
|
|
355
373
|
if (fileInfo.size && fileInfo.size < 10000) { // Only for files < 10KB
|
|
356
374
|
try {
|
|
357
|
-
|
|
375
|
+
// For download URLs, we need to fetch directly, not through API
|
|
376
|
+
const response = await fetch(fileInfo.download_url);
|
|
377
|
+
const content = await response.text();
|
|
358
378
|
const metadata = this.parseMetadataFromContent(content);
|
|
359
379
|
if (metadata.name)
|
|
360
380
|
entry.name = metadata.name;
|
|
@@ -412,7 +432,7 @@ export class GitHubPortfolioIndexer {
|
|
|
412
432
|
*/
|
|
413
433
|
async getGitHubUsername() {
|
|
414
434
|
try {
|
|
415
|
-
const userInfo = await this.
|
|
435
|
+
const userInfo = await this.portfolioRepoManager.githubRequest('/user');
|
|
416
436
|
return userInfo.login;
|
|
417
437
|
}
|
|
418
438
|
catch (error) {
|
|
@@ -472,4 +492,4 @@ export class GitHubPortfolioIndexer {
|
|
|
472
492
|
return index;
|
|
473
493
|
}
|
|
474
494
|
}
|
|
475
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViUG9ydGZvbGlvSW5kZXhlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vR2l0SHViUG9ydGZvbGlvSW5kZXhlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQW9DaEQsTUFBTSxPQUFPLHNCQUFzQjtJQUN6QixNQUFNLENBQUMsUUFBUSxHQUFrQyxJQUFJLENBQUM7SUFDdEQsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFNUIsS0FBSyxHQUFnQyxJQUFJLENBQUM7SUFDMUMsU0FBUyxHQUFnQixJQUFJLENBQUM7SUFDckIsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsYUFBYTtJQUM1QyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDekIsZUFBZSxHQUFnQixJQUFJLENBQUM7SUFDM0IsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyx5QkFBeUI7SUFFckUsWUFBWSxDQUFlO0lBQzNCLG9CQUFvQixDQUF1QjtJQUMzQyxRQUFRLENBQVc7SUFDbkIs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QUU7WUFDbkIsYUFBYSxFQUFFLENBQUM7WUFDaEIsR0FBRyxFQUFFLEVBQUU7U0FDUixDQUFDO1FBRUYscUNBQXFDO1FBQ3JDLEtBQUssTUFBTSxXQUFXLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3JELEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHaXRIdWIgUG9ydGZvbGlvIEluZGV4ZXIgLSBGZXRjaGVzIGFuZCBpbmRleGVzIHVzZXIncyBHaXRIdWIgcG9ydGZvbGlvIGZvciBmYXN0IHNlYXJjaGluZ1xuICogXG4gKiBGZWF0dXJlczpcbiAqIC0gU2luZ2xldG9uIHBhdHRlcm4gZm9yIGVmZmljaWVudCByZXNvdXJjZSB1c2FnZVxuICogLSBTbWFydCBjYWNoaW5nIHdpdGggVFRMIGFuZCBpbnZhbGlkYXRpb24gYWZ0ZXIgdXNlciBhY3Rpb25zXG4gKiAtIEdyYXBoUUwvUkVTVCBBUEkgaW50ZWdyYXRpb24gZm9yIGVmZmljaWVudCBmZXRjaGluZ1xuICogLSBSYXRlIGxpbWl0aW5nIGFuZCBhdXRoZW50aWNhdGlvbiBoYW5kbGluZ1xuICogLSBGYWxsYmFjayBzdHJhdGVneSBmb3IgcmVzaWxpZW50IG9wZXJhdGlvblxuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6ZWQgZm9yIDEwMDArIHBvcnRmb2xpbyBlbGVtZW50c1xuICovXG5cbmltcG9ydCB7IEdpdEh1YkNsaWVudCB9IGZyb20gJy4uL2NvbGxlY3Rpb24vR2l0SHViQ2xpZW50LmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb1JlcG9NYW5hZ2VyIH0gZnJvbSAnLi9Qb3J0Zm9saW9SZXBvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgQVBJQ2FjaGUgfSBmcm9tICcuLi9jYWNoZS9BUElDYWNoZS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViSW5kZXhFbnRyeSB7XG4gIHBhdGg6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgYXV0aG9yPzogc3RyaW5nO1xuICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gIHNoYTogc3RyaW5nOyAvLyBGaWxlIFNIQSBmb3IgY2hhbmdlIGRldGVjdGlvblxuICBodG1sVXJsOiBzdHJpbmc7IC8vIExpbmsgdG8gR2l0SHViXG4gIGRvd25sb2FkVXJsOiBzdHJpbmc7XG4gIGxhc3RNb2RpZmllZDogRGF0ZTtcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YlBvcnRmb2xpb0luZGV4IHtcbiAgdXNlcm5hbWU6IHN0cmluZztcbiAgcmVwb3NpdG9yeTogc3RyaW5nO1xuICBsYXN0VXBkYXRlZDogRGF0ZTtcbiAgZWxlbWVudHM6IE1hcDxFbGVtZW50VHlwZSwgR2l0SHViSW5kZXhFbnRyeVtdPjtcbiAgdG90YWxFbGVtZW50czogbnVtYmVyO1xuICBzaGE6IHN0cmluZzsgLy8gTGF0ZXN0IGNvbW1pdCBTSEFcbiAgcmF0ZUxpbWl0SW5mbz86IHtcbiAgICByZW1haW5pbmc6IG51bWJlcjtcbiAgICByZXNldFRpbWU6IERhdGU7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViRmV0Y2hPcHRpb25zIHtcbiAgZm9yY2U/OiBib29sZWFuO1xuICBtYXhFbGVtZW50cz86IG51bWJlcjtcbiAgZWxlbWVudFR5cGVzPzogRWxlbWVudFR5cGVbXTtcbiAgdXNlR3JhcGhRTD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBHaXRIdWJQb3J0Zm9saW9JbmRleGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEdpdEh1YlBvcnRmb2xpb0luZGV4ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VMb2NrID0gZmFsc2U7XG4gIFxuICBwcml2YXRlIGNhY2hlOiBHaXRIdWJQb3J0Zm9saW9JbmRleCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RGZXRjaDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHR0bCA9IDE1ICogNjAgKiAxMDAwOyAvLyAxNSBtaW51dGVzXG4gIHByaXZhdGUgcmVjZW50VXNlckFjdGlvbiA9IGZhbHNlO1xuICBwcml2YXRlIGFjdGlvblRpbWVzdGFtcDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFjdGlvbkdyYWNlUGVyaW9kID0gMiAqIDYwICogMTAwMDsgLy8gMiBtaW51dGVzIGFmdGVyIGFjdGlvblxuICBcbiAgcHJpdmF0ZSBnaXRodWJDbGllbnQ6IEdpdEh1YkNsaWVudDtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9SZXBvTWFuYWdlcjogUG9ydGZvbGlvUmVwb01hbmFnZXI7XG4gIHByaXZhdGUgYXBpQ2FjaGU6IEFQSUNhY2hlO1xuICBwcml2YXRlIHJhdGVMaW1pdFRyYWNrZXI6IE1hcDxzdHJpbmcsIG51bWJlcltdPjtcbiAgXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hcGlDYWNoZSA9IG5ldyBBUElDYWNoZSgpOyAvLyBVc2VzIGRlZmF1bHQgc2V0dGluZ3NcbiAgICB0aGlzLnJhdGVMaW1pdFRyYWNrZXIgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5naXRodWJDbGllbnQgPSBuZXcgR2l0SHViQ2xpZW50KHRoaXMuYXBpQ2FjaGUsIHRoaXMucmF0ZUxpbWl0VHJhY2tlcik7XG4gICAgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlciA9IG5ldyBQb3J0Zm9saW9SZXBvTWFuYWdlcigpO1xuICAgIFxuICAgIGxvZ2dlci5kZWJ1ZygnR2l0SHViUG9ydGZvbGlvSW5kZXhlciBjcmVhdGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2luZ2xldG9uIHBhdHRlcm4gd2l0aCB0aHJlYWQgc2FmZXR5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEdpdEh1YlBvcnRmb2xpb0luZGV4ZXIge1xuICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgaWYgKHRoaXMuaW5zdGFuY2VMb2NrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignR2l0SHViUG9ydGZvbGlvSW5kZXhlciBpbnN0YW5jZSBpcyBiZWluZyBjcmVhdGVkIGJ5IGFub3RoZXIgdGhyZWFkJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VMb2NrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBHaXRIdWJQb3J0Zm9saW9JbmRleGVyKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmluc3RhbmNlTG9jayA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWluIG1ldGhvZCB0byBnZXQgR2l0SHViIHBvcnRmb2xpbyBpbmRleFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEluZGV4KGZvcmNlID0gZmFsc2UpOiBQcm9taXNlPEdpdEh1YlBvcnRmb2xpb0luZGV4PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgZnJlc2ggZGF0YVxuICAgICAgaWYgKGZvcmNlIHx8IHRoaXMuc2hvdWxkRmV0Y2hGcmVzaCgpKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoRnJlc2goKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmV0dXJuIGNhY2hlZCBkYXRhIGlmIGF2YWlsYWJsZSBhbmQgdmFsaWRcbiAgICAgIGlmICh0aGlzLmNhY2hlICYmIHRoaXMuaXNDYWNoZVZhbGlkKCkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXR1cm5pbmcgY2FjaGVkIEdpdEh1YiBwb3J0Zm9saW8gaW5kZXgnLCB7XG4gICAgICAgICAgdXNlcm5hbWU6IHRoaXMuY2FjaGUudXNlcm5hbWUsXG4gICAgICAgICAgdG90YWxFbGVtZW50czogdGhpcy5jYWNoZS50b3RhbEVsZW1lbnRzLFxuICAgICAgICAgIGFnZTogdGhpcy5sYXN0RmV0Y2ggPyBEYXRlLm5vdygpIC0gdGhpcy5sYXN0RmV0Y2guZ2V0VGltZSgpIDogJ3Vua25vd24nXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVHJ5IHRvIGZldGNoIGZyZXNoLCBmYWxsIGJhY2sgdG8gc3RhbGUgY2FjaGUgb24gZmFpbHVyZVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hGcmVzaCgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBmZXRjaCBmcmVzaCBHaXRIdWIgcG9ydGZvbGlvIGluZGV4LCBjaGVja2luZyBmb3Igc3RhbGUgY2FjaGUnLCB7XG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJldHVybiBzdGFsZSBjYWNoZSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnUmV0dXJuaW5nIHN0YWxlIEdpdEh1YiBwb3J0Zm9saW8gY2FjaGUgYXMgZmFsbGJhY2snLCB7XG4gICAgICAgICAgICB1c2VybmFtZTogdGhpcy5jYWNoZS51c2VybmFtZSxcbiAgICAgICAgICAgIGFnZTogdGhpcy5sYXN0RmV0Y2ggPyBEYXRlLm5vdygpIC0gdGhpcy5sYXN0RmV0Y2guZ2V0VGltZSgpIDogJ3Vua25vd24nXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFJldHVybiBlbXB0eSBpbmRleCBhcyBsYXN0IHJlc29ydFxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVFbXB0eUluZGV4KCk7XG4gICAgICB9XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdHaXRIdWJQb3J0Zm9saW9JbmRleGVyLmdldEluZGV4JywgZXJyb3IpO1xuICAgICAgXG4gICAgICAvLyBSZXR1cm4gc3RhbGUgY2FjaGUgb3IgZW1wdHkgaW5kZXhcbiAgICAgIGlmICh0aGlzLmNhY2hlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFbXB0eUluZGV4KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEludmFsaWRhdGUgY2FjaGUgYWZ0ZXIgdXNlciBhY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgaW52YWxpZGF0ZUFmdGVyQWN0aW9uKGFjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oJ0ludmFsaWRhdGluZyBHaXRIdWIgcG9ydGZvbGlvIGNhY2hlIGFmdGVyIHVzZXIgYWN0aW9uJywgeyBhY3Rpb24gfSk7XG4gICAgXG4gICAgdGhpcy5yZWNlbnRVc2VyQWN0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGlvblRpbWVzdGFtcCA9IG5ldyBEYXRlKCk7XG4gICAgXG4gICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdQT1JURk9MSU9fQ0FDSEVfSU5WQUxJREFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIuaW52YWxpZGF0ZUFmdGVyQWN0aW9uJyxcbiAgICAgIGRldGFpbHM6IGBDYWNoZSBpbnZhbGlkYXRlZCBhZnRlciB1c2VyIGFjdGlvbjogJHthY3Rpb259YCxcbiAgICAgIG1ldGFkYXRhOiB7IGFjdGlvbiB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNhY2hlZCBkYXRhXG4gICAqL1xuICBwdWJsaWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlID0gbnVsbDtcbiAgICB0aGlzLmxhc3RGZXRjaCA9IG51bGw7XG4gICAgdGhpcy5yZWNlbnRVc2VyQWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5hY3Rpb25UaW1lc3RhbXAgPSBudWxsO1xuICAgIHRoaXMuYXBpQ2FjaGUuY2xlYXIoKTtcbiAgICBcbiAgICBsb2dnZXIuaW5mbygnR2l0SHViIHBvcnRmb2xpbyBjYWNoZSBjbGVhcmVkJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhY2hlIHN0YXRpc3RpY3NcbiAgICovXG4gIHB1YmxpYyBnZXRDYWNoZVN0YXRzKCk6IHtcbiAgICBoYXNDYWNoZWREYXRhOiBib29sZWFuO1xuICAgIGxhc3RGZXRjaDogRGF0ZSB8IG51bGw7XG4gICAgaXNTdGFsZTogYm9vbGVhbjtcbiAgICByZWNlbnRVc2VyQWN0aW9uOiBib29sZWFuO1xuICAgIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc0NhY2hlZERhdGE6IHRoaXMuY2FjaGUgIT09IG51bGwsXG4gICAgICBsYXN0RmV0Y2g6IHRoaXMubGFzdEZldGNoLFxuICAgICAgaXNTdGFsZTogIXRoaXMuaXNDYWNoZVZhbGlkKCksXG4gICAgICByZWNlbnRVc2VyQWN0aW9uOiB0aGlzLnJlY2VudFVzZXJBY3Rpb24sXG4gICAgICB0b3RhbEVsZW1lbnRzOiB0aGlzLmNhY2hlPy50b3RhbEVsZW1lbnRzIHx8IDBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGZyZXNoIGRhdGEgZnJvbSBHaXRIdWJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hGcmVzaCgpOiBQcm9taXNlPEdpdEh1YlBvcnRmb2xpb0luZGV4PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsb2dnZXIuaW5mbygnRmV0Y2hpbmcgZnJlc2ggR2l0SHViIHBvcnRmb2xpbyBpbmRleC4uLicpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgR2l0SHViIHVzZXJuYW1lIGZyb20gdG9rZW5cbiAgICAgIGNvbnN0IHVzZXJuYW1lID0gYXdhaXQgdGhpcy5nZXRHaXRIdWJVc2VybmFtZSgpO1xuICAgICAgY29uc3QgcmVwb3NpdG9yeSA9ICdkb2xsaG91c2UtcG9ydGZvbGlvJztcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgcG9ydGZvbGlvIHJlcG9zaXRvcnkgZXhpc3RzXG4gICAgICBjb25zdCByZXBvRXhpc3RzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5jaGVja1BvcnRmb2xpb0V4aXN0cyh1c2VybmFtZSk7XG4gICAgICBpZiAoIXJlcG9FeGlzdHMpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBkb2VzIG5vdCBleGlzdCcsIHsgdXNlcm5hbWUgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVtcHR5SW5kZXgodXNlcm5hbWUsIHJlcG9zaXRvcnkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGZXRjaCByZXBvc2l0b3J5IGNvbnRlbnQgdXNpbmcgR2l0SHViIEFQSVxuICAgICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmZldGNoUmVwb3NpdG9yeUNvbnRlbnQodXNlcm5hbWUsIHJlcG9zaXRvcnkpO1xuICAgICAgXG4gICAgICAvLyBVcGRhdGUgY2FjaGVcbiAgICAgIHRoaXMuY2FjaGUgPSBpbmRleDtcbiAgICAgIHRoaXMubGFzdEZldGNoID0gbmV3IERhdGUoKTtcbiAgICAgIHRoaXMucmVjZW50VXNlckFjdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5hY3Rpb25UaW1lc3RhbXAgPSBudWxsO1xuICAgICAgXG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBsb2dnZXIuaW5mbygnR2l0SHViIHBvcnRmb2xpbyBpbmRleCBmZXRjaGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgIHRvdGFsRWxlbWVudHM6IGluZGV4LnRvdGFsRWxlbWVudHMsXG4gICAgICAgIGR1cmF0aW9uOiBgJHtkdXJhdGlvbn1tc2AsXG4gICAgICAgIHJhdGVMaW1pdFJlbWFpbmluZzogaW5kZXgucmF0ZUxpbWl0SW5mbz8ucmVtYWluaW5nXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQT1JURk9MSU9fRkVUQ0hfU1VDQ0VTUycsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnR2l0SHViUG9ydGZvbGlvSW5kZXhlci5mZXRjaEZyZXNoJyxcbiAgICAgICAgZGV0YWlsczogYEZldGNoZWQgR2l0SHViIHBvcnRmb2xpbyB3aXRoICR7aW5kZXgudG90YWxFbGVtZW50c30gZWxlbWVudHMgaW4gJHtkdXJhdGlvbn1tc2AsXG4gICAgICAgIG1ldGFkYXRhOiB7IHVzZXJuYW1lLCBkdXJhdGlvbiwgdG90YWxFbGVtZW50czogaW5kZXgudG90YWxFbGVtZW50cyB9XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignR2l0SHViUG9ydGZvbGlvSW5kZXhlci5mZXRjaEZyZXNoJywgZXJyb3IsIHsgZHVyYXRpb24gfSk7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIud3JhcEVycm9yKGVycm9yLCAnRmFpbGVkIHRvIGZldGNoIEdpdEh1YiBwb3J0Zm9saW8gaW5kZXgnLCBFcnJvckNhdGVnb3J5Lk5FVFdPUktfRVJST1IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCByZXBvc2l0b3J5IGNvbnRlbnQgZnJvbSBHaXRIdWIgQVBJXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoUmVwb3NpdG9yeUNvbnRlbnQodXNlcm5hbWU6IHN0cmluZywgcmVwb3NpdG9yeTogc3RyaW5nKTogUHJvbWlzZTxHaXRIdWJQb3J0Zm9saW9JbmRleD4ge1xuICAgIC8vIFRyeSBHcmFwaFFMIGZpcnN0IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UsIGZhbGxiYWNrIHRvIFJFU1RcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hXaXRoR3JhcGhRTCh1c2VybmFtZSwgcmVwb3NpdG9yeSk7XG4gICAgfSBjYXRjaCAoZ3JhcGhxbEVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0dyYXBoUUwgZmV0Y2ggZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gUkVTVCBBUEknLCB7XG4gICAgICAgIGVycm9yOiBncmFwaHFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGdyYXBocWxFcnJvci5tZXNzYWdlIDogU3RyaW5nKGdyYXBocWxFcnJvcilcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaFdpdGhSRVNUKHVzZXJuYW1lLCByZXBvc2l0b3J5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdXNpbmcgR3JhcGhRTCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aEdyYXBoUUwodXNlcm5hbWU6IHN0cmluZywgcmVwb3NpdG9yeTogc3RyaW5nKTogUHJvbWlzZTxHaXRIdWJQb3J0Zm9saW9JbmRleD4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYFxuICAgICAgcXVlcnkgR2V0UG9ydGZvbGlvQ29udGVudCgkb3duZXI6IFN0cmluZyEsICRuYW1lOiBTdHJpbmchKSB7XG4gICAgICAgIHJlcG9zaXRvcnkob3duZXI6ICRvd25lciwgbmFtZTogJG5hbWUpIHtcbiAgICAgICAgICBkZWZhdWx0QnJhbmNoUmVmIHtcbiAgICAgICAgICAgIHRhcmdldCB7XG4gICAgICAgICAgICAgIC4uLiBvbiBDb21taXQge1xuICAgICAgICAgICAgICAgIG9pZFxuICAgICAgICAgICAgICAgIGhpc3RvcnkoZmlyc3Q6IDEpIHtcbiAgICAgICAgICAgICAgICAgIG5vZGVzIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWl0dGVkRGF0ZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3QoZXhwcmVzc2lvbjogXCJIRUFEOlwiKSB7XG4gICAgICAgICAgICAuLi4gb24gVHJlZSB7XG4gICAgICAgICAgICAgIGVudHJpZXMge1xuICAgICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICAgICAgb2JqZWN0IHtcbiAgICAgICAgICAgICAgICAgIC4uLiBvbiBUcmVlIHtcbiAgICAgICAgICAgICAgICAgICAgZW50cmllcyB7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICBvaWRcbiAgICAgICAgICAgICAgICAgICAgICBvYmplY3Qge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uIG9uIEJsb2Ige1xuICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlU2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJhdGVMaW1pdCB7XG4gICAgICAgICAgcmVtYWluaW5nXG4gICAgICAgICAgcmVzZXRBdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgICBcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB7IG93bmVyOiB1c2VybmFtZSwgbmFtZTogcmVwb3NpdG9yeSB9O1xuICAgIFxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5naXRodWJDbGllbnQuZmV0Y2hGcm9tR2l0SHViKCdodHRwczovL2FwaS5naXRodWIuY29tL2dyYXBocWwnLCB0cnVlKTtcbiAgICBcbiAgICAvLyBOb3RlOiBUaGlzIGlzIGEgc2ltcGxpZmllZCBHcmFwaFFMIGltcGxlbWVudGF0aW9uXG4gICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB5b3Ugd291bGQgc2VuZCBQT1NUIHJlcXVlc3Qgd2l0aCBxdWVyeSBhbmQgdmFyaWFibGVzXG4gICAgdGhyb3cgbmV3IEVycm9yKCdHcmFwaFFMIGltcGxlbWVudGF0aW9uIG5vdCB5ZXQgY29tcGxldGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB1c2luZyBSRVNUIEFQSSB3aXRoIHBhZ2luYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hXaXRoUkVTVCh1c2VybmFtZTogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPEdpdEh1YlBvcnRmb2xpb0luZGV4PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVzZXJuYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodXNlcm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIEdldCByZXBvc2l0b3J5IGluZm8gYW5kIGxhdGVzdCBjb21taXRcbiAgICBjb25zdCByZXBvSW5mbyA9IGF3YWl0IHRoaXMuZ2l0aHViQ2xpZW50LmZldGNoRnJvbUdpdEh1YihcbiAgICAgIGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7bm9ybWFsaXplZFVzZXJuYW1lfS8ke3JlcG9zaXRvcnl9YFxuICAgICk7XG4gICAgXG4gICAgY29uc3QgbGF0ZXN0Q29tbWl0ID0gYXdhaXQgdGhpcy5naXRodWJDbGllbnQuZmV0Y2hGcm9tR2l0SHViKFxuICAgICAgYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7cmVwb3NpdG9yeX0vY29tbWl0cy9IRUFEYFxuICAgICk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBpbmRleFxuICAgIGNvbnN0IGluZGV4OiBHaXRIdWJQb3J0Zm9saW9JbmRleCA9IHtcbiAgICAgIHVzZXJuYW1lOiBub3JtYWxpemVkVXNlcm5hbWUsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKGxhdGVzdENvbW1pdC5jb21taXQuY29tbWl0dGVyLmRhdGUpLFxuICAgICAgZWxlbWVudHM6IG5ldyBNYXAoKSxcbiAgICAgIHRvdGFsRWxlbWVudHM6IDAsXG4gICAgICBzaGE6IGxhdGVzdENvbW1pdC5zaGFcbiAgICB9O1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZWxlbWVudCB0eXBlIG1hcHNcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICBpbmRleC5lbGVtZW50cy5zZXQoZWxlbWVudFR5cGUsIFtdKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRmV0Y2ggY29udGVudCBmb3IgZWFjaCBlbGVtZW50IHR5cGVcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5mZXRjaEVsZW1lbnRUeXBlQ29udGVudChub3JtYWxpemVkVXNlcm5hbWUsIHJlcG9zaXRvcnksIGVsZW1lbnRUeXBlKTtcbiAgICAgICAgaW5kZXguZWxlbWVudHMuc2V0KGVsZW1lbnRUeXBlLCBlbnRyaWVzKTtcbiAgICAgICAgaW5kZXgudG90YWxFbGVtZW50cyArPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggJHtlbGVtZW50VHlwZX0gZnJvbSBHaXRIdWIgcG9ydGZvbGlvYCwge1xuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZWxlbWVudCB0eXBlc1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggY29udGVudCBmb3IgYSBzcGVjaWZpYyBlbGVtZW50IHR5cGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hFbGVtZW50VHlwZUNvbnRlbnQoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlXG4gICk6IFByb21pc2U8R2l0SHViSW5kZXhFbnRyeVtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCBkaXJlY3RvcnkgbGlzdGluZ1xuICAgICAgY29uc3QgY29udGVudHMgPSBhd2FpdCB0aGlzLmdpdGh1YkNsaWVudC5mZXRjaEZyb21HaXRIdWIoXG4gICAgICAgIGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7dXNlcm5hbWV9LyR7cmVwb3NpdG9yeX0vY29udGVudHMvJHtlbGVtZW50VHlwZX1gXG4gICAgICApO1xuICAgICAgXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudHMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgZW50cmllczogR2l0SHViSW5kZXhFbnRyeVtdID0gW107XG4gICAgICBjb25zdCBtYXhDb25jdXJyZW50ID0gNTsgLy8gTGltaXQgY29uY3VycmVudCByZXF1ZXN0c1xuICAgICAgXG4gICAgICAvLyBQcm9jZXNzIGZpbGVzIGluIGJhdGNoZXMgdG8gYXZvaWQgcmF0ZSBsaW1pdGluZ1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkgKz0gbWF4Q29uY3VycmVudCkge1xuICAgICAgICBjb25zdCBiYXRjaCA9IGNvbnRlbnRzLnNsaWNlKGksIGkgKyBtYXhDb25jdXJyZW50KTtcbiAgICAgICAgY29uc3QgYmF0Y2hQcm9taXNlcyA9IGJhdGNoXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ2ZpbGUnICYmIGl0ZW0ubmFtZS5lbmRzV2l0aCgnLm1kJykpXG4gICAgICAgICAgLm1hcChpdGVtID0+IHRoaXMuY3JlYXRlR2l0SHViSW5kZXhFbnRyeSh1c2VybmFtZSwgcmVwb3NpdG9yeSwgZWxlbWVudFR5cGUsIGl0ZW0pKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChiYXRjaFByb21pc2VzKTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGJhdGNoUmVzdWx0cykge1xuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQWRkIGRlbGF5IGJldHdlZW4gYmF0Y2hlcyB0byByZXNwZWN0IHJhdGUgbGltaXRzXG4gICAgICAgIGlmIChpICsgbWF4Q29uY3VycmVudCA8IGNvbnRlbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gZW50cmllcztcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEaXJlY3RvcnkgbWlnaHQgbm90IGV4aXN0XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCc0MDQnKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEdpdEh1YiBpbmRleCBlbnRyeSBmcm9tIEFQSSByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVHaXRIdWJJbmRleEVudHJ5KFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcmVwb3NpdG9yeTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBmaWxlSW5mbzogYW55XG4gICk6IFByb21pc2U8R2l0SHViSW5kZXhFbnRyeSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gUGFyc2UgbWV0YWRhdGEgZnJvbSBmaWxlbmFtZSBvciBmZXRjaCBjb250ZW50IGlmIG5lZWRlZFxuICAgICAgY29uc3QgbmFtZSA9IGZpbGVJbmZvLm5hbWUucmVwbGFjZSgnLm1kJywgJycpLnJlcGxhY2UoLy0vZywgJyAnKTtcbiAgICAgIFxuICAgICAgY29uc3QgZW50cnk6IEdpdEh1YkluZGV4RW50cnkgPSB7XG4gICAgICAgIHBhdGg6IGZpbGVJbmZvLnBhdGgsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBzaGE6IGZpbGVJbmZvLnNoYSxcbiAgICAgICAgaHRtbFVybDogZmlsZUluZm8uaHRtbF91cmwsXG4gICAgICAgIGRvd25sb2FkVXJsOiBmaWxlSW5mby5kb3dubG9hZF91cmwsXG4gICAgICAgIGxhc3RNb2RpZmllZDogbmV3IERhdGUoKSwgLy8gR2l0SHViIEFQSSBkb2Vzbid0IHByb3ZpZGUgZmlsZSBtb2RpZmljYXRpb24gdGltZSBkaXJlY3RseVxuICAgICAgICBzaXplOiBmaWxlSW5mby5zaXplIHx8IDBcbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIE9wdGlvbmFsbHkgZmV0Y2ggY29udGVudCB0byBleHRyYWN0IG1ldGFkYXRhXG4gICAgICAvLyBUaGlzIGlzIGV4cGVuc2l2ZSwgc28gb25seSBkbyBpdCBmb3Igc21hbGwgZmlsZXMgb3Igd2hlbiBzcGVjaWZpY2FsbHkgbmVlZGVkXG4gICAgICBpZiAoZmlsZUluZm8uc2l6ZSAmJiBmaWxlSW5mby5zaXplIDwgMTAwMDApIHsgLy8gT25seSBmb3IgZmlsZXMgPCAxMEtCXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZ2l0aHViQ2xpZW50LmZldGNoRnJvbUdpdEh1YihmaWxlSW5mby5kb3dubG9hZF91cmwpO1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5wYXJzZU1ldGFkYXRhRnJvbUNvbnRlbnQoY29udGVudCk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKG1ldGFkYXRhLm5hbWUpIGVudHJ5Lm5hbWUgPSBtZXRhZGF0YS5uYW1lO1xuICAgICAgICAgIGlmIChtZXRhZGF0YS5kZXNjcmlwdGlvbikgZW50cnkuZGVzY3JpcHRpb24gPSBtZXRhZGF0YS5kZXNjcmlwdGlvbjtcbiAgICAgICAgICBpZiAobWV0YWRhdGEudmVyc2lvbikgZW50cnkudmVyc2lvbiA9IG1ldGFkYXRhLnZlcnNpb247XG4gICAgICAgICAgaWYgKG1ldGFkYXRhLmF1dGhvcikgZW50cnkuYXV0aG9yID0gbWV0YWRhdGEuYXV0aG9yO1xuICAgICAgICB9IGNhdGNoIChtZXRhZGF0YUVycm9yKSB7XG4gICAgICAgICAgLy8gTm9uLWNyaXRpY2FsIGVycm9yLCBjb250aW51ZSB3aXRob3V0IG1ldGFkYXRhXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gZmV0Y2ggbWV0YWRhdGEgZm9yIGZpbGUnLCB7XG4gICAgICAgICAgICBwYXRoOiBmaWxlSW5mby5wYXRoLFxuICAgICAgICAgICAgZXJyb3I6IG1ldGFkYXRhRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IG1ldGFkYXRhRXJyb3IubWVzc2FnZSA6IFN0cmluZyhtZXRhZGF0YUVycm9yKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBjcmVhdGUgR2l0SHViIGluZGV4IGVudHJ5Jywge1xuICAgICAgICBwYXRoOiBmaWxlSW5mby5wYXRoLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBtZXRhZGF0YSBmcm9tIGZpbGUgY29udGVudCAoZnJvbnRtYXR0ZXIpXG4gICAqL1xuICBwcml2YXRlIHBhcnNlTWV0YWRhdGFGcm9tQ29udGVudChjb250ZW50OiBzdHJpbmcpOiB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIGF1dGhvcj86IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IGFueSA9IHt9O1xuICAgIFxuICAgIC8vIFNpbXBsZSBmcm9udG1hdHRlciBwYXJzaW5nIChjb3VsZCB1c2UgYSBwcm9wZXIgWUFNTCBwYXJzZXIpXG4gICAgY29uc3QgZnJvbnRtYXR0ZXJNYXRjaCA9IGNvbnRlbnQubWF0Y2goL14tLS1cXG4oW1xcc1xcU10qPylcXG4tLS0vKTtcbiAgICBpZiAoZnJvbnRtYXR0ZXJNYXRjaCkge1xuICAgICAgY29uc3QgZnJvbnRtYXR0ZXIgPSBmcm9udG1hdHRlck1hdGNoWzFdO1xuICAgICAgXG4gICAgICBjb25zdCBuYW1lTWF0Y2ggPSBmcm9udG1hdHRlci5tYXRjaCgvXm5hbWU6XFxzKiguKykkL20pO1xuICAgICAgaWYgKG5hbWVNYXRjaCkgbWV0YWRhdGEubmFtZSA9IG5hbWVNYXRjaFsxXS50cmltKCk7XG4gICAgICBcbiAgICAgIGNvbnN0IGRlc2NNYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9eZGVzY3JpcHRpb246XFxzKiguKykkL20pO1xuICAgICAgaWYgKGRlc2NNYXRjaCkgbWV0YWRhdGEuZGVzY3JpcHRpb24gPSBkZXNjTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgXG4gICAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBmcm9udG1hdHRlci5tYXRjaCgvXnZlcnNpb246XFxzKiguKykkL20pO1xuICAgICAgaWYgKHZlcnNpb25NYXRjaCkgbWV0YWRhdGEudmVyc2lvbiA9IHZlcnNpb25NYXRjaFsxXS50cmltKCk7XG4gICAgICBcbiAgICAgIGNvbnN0IGF1dGhvck1hdGNoID0gZnJvbnRtYXR0ZXIubWF0Y2goL15hdXRob3I6XFxzKiguKykkL20pO1xuICAgICAgaWYgKGF1dGhvck1hdGNoKSBtZXRhZGF0YS5hdXRob3IgPSBhdXRob3JNYXRjaFsxXS50cmltKCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgR2l0SHViIHVzZXJuYW1lIGZyb20gYXV0aGVudGljYXRlZCB0b2tlblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRHaXRIdWJVc2VybmFtZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VySW5mbyA9IGF3YWl0IHRoaXMuZ2l0aHViQ2xpZW50LmZldGNoRnJvbUdpdEh1YignaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2VyJywgdHJ1ZSk7XG4gICAgICByZXR1cm4gdXNlckluZm8ubG9naW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBHaXRIdWIgdXNlcm5hbWUuIFBsZWFzZSBlbnN1cmUgeW91IGFyZSBhdXRoZW50aWNhdGVkIHdpdGggR2l0SHViLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjYWNoZSBpcyB2YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBpc0NhY2hlVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNhY2hlIHx8ICF0aGlzLmxhc3RGZXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gdGhpcy5sYXN0RmV0Y2guZ2V0VGltZSgpO1xuICAgIHJldHVybiBhZ2UgPCB0aGlzLnR0bDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGZldGNoIGZyZXNoIGRhdGFcbiAgICovXG4gIHByaXZhdGUgc2hvdWxkRmV0Y2hGcmVzaCgpOiBib29sZWFuIHtcbiAgICAvLyBBbHdheXMgZmV0Y2ggaWYgbm8gY2FjaGVcbiAgICBpZiAoIXRoaXMuY2FjaGUgfHwgIXRoaXMubGFzdEZldGNoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIHJlY2VudCB1c2VyIGFjdGlvbnNcbiAgICBpZiAodGhpcy5yZWNlbnRVc2VyQWN0aW9uICYmIHRoaXMuYWN0aW9uVGltZXN0YW1wKSB7XG4gICAgICBjb25zdCBhY3Rpb25BZ2UgPSBEYXRlLm5vdygpIC0gdGhpcy5hY3Rpb25UaW1lc3RhbXAuZ2V0VGltZSgpO1xuICAgICAgaWYgKGFjdGlvbkFnZSA8IHRoaXMuYWN0aW9uR3JhY2VQZXJpb2QpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdGZXRjaGluZyBmcmVzaCBkdWUgdG8gcmVjZW50IHVzZXIgYWN0aW9uJywgeyBhY3Rpb25BZ2UgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gR3JhY2UgcGVyaW9kIGV4cGlyZWQsIGNsZWFyIGFjdGlvbiBmbGFnXG4gICAgICAgIHRoaXMucmVjZW50VXNlckFjdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjdGlvblRpbWVzdGFtcCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIFRUTFxuICAgIHJldHVybiAhdGhpcy5pc0NhY2hlVmFsaWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZW1wdHkgaW5kZXggd2hlbiBubyBwb3J0Zm9saW8gZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVtcHR5SW5kZXgodXNlcm5hbWU/OiBzdHJpbmcsIHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBHaXRIdWJQb3J0Zm9saW9JbmRleCB7XG4gICAgY29uc3QgaW5kZXg6IEdpdEh1YlBvcnRmb2xpb0luZGV4ID0ge1xuICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lIHx8ICd1bmtub3duJyxcbiAgICAgIHJlcG9zaXRvcnk6IHJlcG9zaXRvcnkgfHwgJ2RvbGxob3VzZS1wb3J0Zm9saW8nLFxuICAgICAgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICBlbGVtZW50czogbmV3IE1hcCgpLFxuICAgICAgdG90YWxFbGVtZW50czogMCxcbiAgICAgIHNoYTogJydcbiAgICB9O1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZW1wdHkgZWxlbWVudCB0eXBlIG1hcHNcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICBpbmRleC5lbGVtZW50cy5zZXQoZWxlbWVudFR5cGUsIFtdKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59Il19
|
|
495
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViUG9ydGZvbGlvSW5kZXhlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vR2l0SHViUG9ydGZvbGlvSW5kZXhlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBb0NoRCxNQUFNLE9BQU8sc0JBQXNCO0lBQ3pCLE1BQU0sQ0FBQyxRQUFRLEdBQWtDLElBQUksQ0FBQztJQUN0RCxNQUFNLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUU1QixLQUFLLEdBQWdDLElBQUksQ0FBQztJQUMxQyxTQUFTLEdBQWdCLElBQUksQ0FBQztJQUNyQixHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxhQUFhO0lBQzVDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixlQUFlLEdBQWdCLElBQUksQ0FBQztJQUMzQixpQkFBaUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLHlCQUF5QjtJQUVyRSxvQkFBb0IsQ0FBdUI7SUFDM0MsUUFBUSxDQUFXO0lBQ25CLGdCQUFnQixDQUF3QjtJQUVoRDtRQUNFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtRQUN4RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBRXZELE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsV0FBVztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7WUFDeEYsQ0FBQztZQUVELElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDL0MsQ0FBQztvQkFBUyxDQUFDO2dCQUNULElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUs7UUFDakMsSUFBSSxDQUFDO1lBQ0gsOEJBQThCO1lBQzlCLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDakMsQ0FBQztZQUVELDRDQUE0QztZQUM1QyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMseUNBQXlDLEVBQUU7b0JBQ3RELFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7b0JBQzdCLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7b0JBQ3ZDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztpQkFDeEUsQ0FBQyxDQUFDO2dCQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNwQixDQUFDO1lBRUQsMERBQTBEO1lBQzFELElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0VBQXdFLEVBQUU7b0JBQ3BGLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2lCQUM5RCxDQUFDLENBQUM7Z0JBRUgsa0NBQWtDO2dCQUNsQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZixNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxFQUFFO3dCQUNoRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRO3dCQUM3QixHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7cUJBQ3hFLENBQUMsQ0FBQztvQkFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3BCLENBQUM7Z0JBRUQsb0NBQW9DO2dCQUNwQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2pDLENBQUM7UUFFSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLFlBQVksQ0FBQyxRQUFRLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFaEUsb0NBQW9DO1lBQ3BDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNwQixDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0kscUJBQXFCLENBQUMsTUFBYztRQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUVqRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUVsQyxxQ0FBcUM7UUFDckMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQy9CLElBQUksRUFBRSw4QkFBOEI7WUFDcEMsUUFBUSxFQUFFLEtBQUs7WUFDZixNQUFNLEVBQUUsOENBQThDO1lBQ3RELE9BQU8sRUFBRSx3Q0FBd0MsTUFBTSxFQUFFO1lBQ3pELFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRTtTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXRCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhO1FBT2xCLE9BQU87WUFDTCxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJO1lBQ2xDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzdCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxJQUFJLENBQUM7U0FDOUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxVQUFVO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDO1lBQ0gsaUNBQWlDO1lBQ2pDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDaEQsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUM7WUFFekMsdUNBQXVDO1lBQ3ZDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBRUQsNENBQTRDO1lBQzVDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUV0RSxlQUFlO1lBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFFNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxFQUFFO2dCQUN6RCxRQUFRO2dCQUNSLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtnQkFDbEMsUUFBUSxFQUFFLEdBQUcsUUFBUSxJQUFJO2dCQUN6QixrQkFBa0IsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLFNBQVM7YUFDbkQsQ0FBQyxDQUFDO1lBRUgscUJBQXFCO1lBQ3JCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHlCQUF5QjtnQkFDL0IsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLG1DQUFtQztnQkFDM0MsT0FBTyxFQUFFLGlDQUFpQyxLQUFLLENBQUMsYUFBYSxnQkFBZ0IsUUFBUSxJQUFJO2dCQUN6RixRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFO2FBQ3JFLENBQUMsQ0FBQztZQUVILE9BQU8sS0FBSyxDQUFDO1FBRWYsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO1lBQ3hDLFlBQVksQ0FBQyxRQUFRLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNoRixNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLHdDQUF3QyxFQUFFLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3RyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLHNCQUFzQixDQUFDLFFBQWdCLEVBQUUsVUFBa0I7UUFDdkUsNkRBQTZEO1FBQzdELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELEVBQUU7Z0JBQzdELEtBQUssRUFBRSxZQUFZLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2FBQ25GLENBQUMsQ0FBQztZQUVILE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsVUFBa0I7UUFDakUsTUFBTSxLQUFLLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBNENiLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBRXhELGlFQUFpRTtRQUNqRSwyQ0FBMkM7UUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1FBRXhFLG9EQUFvRDtRQUNwRCxpRkFBaUY7UUFDakYsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBZ0IsRUFBRSxVQUFrQjtRQUM5RCxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUVsRix3Q0FBd0M7UUFDeEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUM1RCxVQUFVLGtCQUFrQixJQUFJLFVBQVUsRUFBRSxDQUM3QyxDQUFDO1FBRUYsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUNoRSxVQUFVLGtCQUFrQixJQUFJLFVBQVUsZUFBZSxDQUMxRCxDQUFDO1FBRUYsbUJBQW1CO1FBQ25CLE1BQU0sS0FBSyxHQUF5QjtZQUNsQyxRQUFRLEVBQUUsa0JBQWtCO1lBQzVCLFVBQVU7WUFDVixXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ3pELFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUNuQixhQUFhLEVBQUUsQ0FBQztZQUNoQixHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUc7U0FDdEIsQ0FBQztRQUVGLCtCQUErQjtRQUMvQixLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFFL0UsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxXQUFXLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDaEcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QyxLQUFLLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBRXRDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLE9BQU8sQ0FBQyxNQUFNLElBQUksV0FBVyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUM5RSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLFdBQVcsc0NBQXNDLENBQUMsQ0FBQztnQkFDM0UsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLFdBQVcsd0JBQXdCLEVBQUU7b0JBQ3BFLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUM3RCxXQUFXO2lCQUNaLENBQUMsQ0FBQztnQkFDSCxvQ0FBb0M7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyx1QkFBdUIsQ0FDbkMsUUFBZ0IsRUFDaEIsVUFBa0IsRUFDbEIsV0FBd0I7UUFFeEIsSUFBSSxDQUFDO1lBQ0gsbURBQW1EO1lBQ25ELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FDNUQsVUFBVSxRQUFRLElBQUksVUFBVSxhQUFhLFdBQVcsRUFBRSxDQUMzRCxDQUFDO1lBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBRUQsTUFBTSxPQUFPLEdBQXVCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7WUFFckQsa0RBQWtEO1lBQ2xELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDeEQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLGFBQWEsR0FBRyxLQUFLO3FCQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDakUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBRXJGLE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFFN0QsS0FBSyxNQUFNLE1BQU0sSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDbEMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM3QixDQUFDO2dCQUNILENBQUM7Z0JBRUQsbURBQW1EO2dCQUNuRCxJQUFJLENBQUMsR0FBRyxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUN4QyxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDO1FBRWpCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsbURBQW1EO1lBQ25ELDZEQUE2RDtZQUM3RCxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztnQkFDM0IsaURBQWlEO2dCQUNqRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDN0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztvQkFDeEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLFdBQVcscUVBQXFFLENBQUMsQ0FBQztvQkFDNUcsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFFRCxxQ0FBcUM7Z0JBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLFdBQVcsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNsRSxDQUFDO1lBRUQsd0JBQXdCO1lBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLFdBQVcsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxzQkFBc0IsQ0FDbEMsUUFBZ0IsRUFDaEIsVUFBa0IsRUFDbEIsV0FBd0IsRUFDeEIsUUFBYTtRQUViLElBQUksQ0FBQztZQUNILDBEQUEwRDtZQUMxRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVqRSxNQUFNLEtBQUssR0FBcUI7Z0JBQzlCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsSUFBSTtnQkFDSixXQUFXO2dCQUNYLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztnQkFDakIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRO2dCQUMxQixXQUFXLEVBQUUsUUFBUSxDQUFDLFlBQVk7Z0JBQ2xDLFlBQVksRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLDZEQUE2RDtnQkFDdkYsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQzthQUN6QixDQUFDO1lBRUYsK0NBQStDO1lBQy9DLCtFQUErRTtZQUMvRSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtnQkFDcEUsSUFBSSxDQUFDO29CQUNILGdFQUFnRTtvQkFDaEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNwRCxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUV4RCxJQUFJLFFBQVEsQ0FBQyxJQUFJO3dCQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDOUMsSUFBSSxRQUFRLENBQUMsV0FBVzt3QkFBRSxLQUFLLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7b0JBQ25FLElBQUksUUFBUSxDQUFDLE9BQU87d0JBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO29CQUN2RCxJQUFJLFFBQVEsQ0FBQyxNQUFNO3dCQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDdEQsQ0FBQztnQkFBQyxPQUFPLGFBQWEsRUFBRSxDQUFDO29CQUN2QixnREFBZ0Q7b0JBQ2hELE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUU7d0JBQ2hELElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTt3QkFDbkIsS0FBSyxFQUFFLGFBQWEsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7cUJBQ3RGLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sS0FBSyxDQUFDO1FBRWYsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFO2dCQUNsRCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ25CLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQzlELENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLHdCQUF3QixDQUFDLE9BQWU7UUFNOUMsTUFBTSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBRXpCLDhEQUE4RDtRQUM5RCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNoRSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFeEMsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3ZELElBQUksU0FBUztnQkFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVuRCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDOUQsSUFBSSxTQUFTO2dCQUFFLFFBQVEsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRTFELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM3RCxJQUFJLFlBQVk7Z0JBQUUsUUFBUSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFNUQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzNELElBQUksV0FBVztnQkFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGlCQUFpQjtRQUM3QixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEUsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3hCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xELE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCO1FBQ3RCLDJCQUEyQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2xELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDeEUsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sMENBQTBDO2dCQUMxQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUVELFlBQVk7UUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLFFBQWlCLEVBQUUsVUFBbUI7UUFDN0QsTUFBTSxLQUFLLEdBQXlCO1lBQ2xDLFFBQVEsRUFBRSxRQUFRLElBQUksU0FBUztZQUMvQixVQUFVLEVBQUUsVUFBVSxJQUFJLHFCQUFxQjtZQUMvQyxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDdkIsUUFBUSxFQUFFLElBQUksR0FBRyxFQUFFO1lBQ25CLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLEdBQUcsRUFBRSxFQUFFO1NBQ1IsQ0FBQztRQUVGLHFDQUFxQztRQUNyQyxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2l0SHViIFBvcnRmb2xpbyBJbmRleGVyIC0gRmV0Y2hlcyBhbmQgaW5kZXhlcyB1c2VyJ3MgR2l0SHViIHBvcnRmb2xpbyBmb3IgZmFzdCBzZWFyY2hpbmdcbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIFNpbmdsZXRvbiBwYXR0ZXJuIGZvciBlZmZpY2llbnQgcmVzb3VyY2UgdXNhZ2VcbiAqIC0gU21hcnQgY2FjaGluZyB3aXRoIFRUTCBhbmQgaW52YWxpZGF0aW9uIGFmdGVyIHVzZXIgYWN0aW9uc1xuICogLSBHcmFwaFFML1JFU1QgQVBJIGludGVncmF0aW9uIGZvciBlZmZpY2llbnQgZmV0Y2hpbmdcbiAqIC0gUmF0ZSBsaW1pdGluZyBhbmQgYXV0aGVudGljYXRpb24gaGFuZGxpbmdcbiAqIC0gRmFsbGJhY2sgc3RyYXRlZ3kgZm9yIHJlc2lsaWVudCBvcGVyYXRpb25cbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemVkIGZvciAxMDAwKyBwb3J0Zm9saW8gZWxlbWVudHNcbiAqL1xuXG5pbXBvcnQgeyBQb3J0Zm9saW9SZXBvTWFuYWdlciB9IGZyb20gJy4vUG9ydGZvbGlvUmVwb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgVG9rZW5NYW5hZ2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvdG9rZW5NYW5hZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IEFQSUNhY2hlIH0gZnJvbSAnLi4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkluZGV4RW50cnkge1xuICBwYXRoOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGF1dGhvcj86IHN0cmluZztcbiAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBzaGE6IHN0cmluZzsgLy8gRmlsZSBTSEEgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgaHRtbFVybDogc3RyaW5nOyAvLyBMaW5rIHRvIEdpdEh1YlxuICBkb3dubG9hZFVybDogc3RyaW5nO1xuICBsYXN0TW9kaWZpZWQ6IERhdGU7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJQb3J0Zm9saW9JbmRleCB7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIHJlcG9zaXRvcnk6IHN0cmluZztcbiAgbGFzdFVwZGF0ZWQ6IERhdGU7XG4gIGVsZW1lbnRzOiBNYXA8RWxlbWVudFR5cGUsIEdpdEh1YkluZGV4RW50cnlbXT47XG4gIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgc2hhOiBzdHJpbmc7IC8vIExhdGVzdCBjb21taXQgU0hBXG4gIHJhdGVMaW1pdEluZm8/OiB7XG4gICAgcmVtYWluaW5nOiBudW1iZXI7XG4gICAgcmVzZXRUaW1lOiBEYXRlO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkZldGNoT3B0aW9ucyB7XG4gIGZvcmNlPzogYm9vbGVhbjtcbiAgbWF4RWxlbWVudHM/OiBudW1iZXI7XG4gIGVsZW1lbnRUeXBlcz86IEVsZW1lbnRUeXBlW107XG4gIHVzZUdyYXBoUUw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgR2l0SHViUG9ydGZvbGlvSW5kZXhlciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBHaXRIdWJQb3J0Zm9saW9JbmRleGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlTG9jayA9IGZhbHNlO1xuICBcbiAgcHJpdmF0ZSBjYWNoZTogR2l0SHViUG9ydGZvbGlvSW5kZXggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0RmV0Y2g6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSB0dGwgPSAxNSAqIDYwICogMTAwMDsgLy8gMTUgbWludXRlc1xuICBwcml2YXRlIHJlY2VudFVzZXJBY3Rpb24gPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3Rpb25UaW1lc3RhbXA6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb25HcmFjZVBlcmlvZCA9IDIgKiA2MCAqIDEwMDA7IC8vIDIgbWludXRlcyBhZnRlciBhY3Rpb25cbiAgXG4gIHByaXZhdGUgcG9ydGZvbGlvUmVwb01hbmFnZXI6IFBvcnRmb2xpb1JlcG9NYW5hZ2VyO1xuICBwcml2YXRlIGFwaUNhY2hlOiBBUElDYWNoZTtcbiAgcHJpdmF0ZSByYXRlTGltaXRUcmFja2VyOiBNYXA8c3RyaW5nLCBudW1iZXJbXT47XG4gIFxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYXBpQ2FjaGUgPSBuZXcgQVBJQ2FjaGUoKTsgLy8gVXNlcyBkZWZhdWx0IHNldHRpbmdzXG4gICAgdGhpcy5yYXRlTGltaXRUcmFja2VyID0gbmV3IE1hcCgpO1xuICAgIHRoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIgPSBuZXcgUG9ydGZvbGlvUmVwb01hbmFnZXIoKTtcbiAgICBcbiAgICBsb2dnZXIuZGVidWcoJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIgY3JlYXRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbmdsZXRvbiBwYXR0ZXJuIHdpdGggdGhyZWFkIHNhZmV0eVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBHaXRIdWJQb3J0Zm9saW9JbmRleGVyIHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIGlmICh0aGlzLmluc3RhbmNlTG9jaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIgaW5zdGFuY2UgaXMgYmVpbmcgY3JlYXRlZCBieSBhbm90aGVyIHRocmVhZCcpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmluc3RhbmNlTG9jayA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgR2l0SHViUG9ydGZvbGlvSW5kZXhlcigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZUxvY2sgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogTWFpbiBtZXRob2QgdG8gZ2V0IEdpdEh1YiBwb3J0Zm9saW8gaW5kZXhcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRJbmRleChmb3JjZSA9IGZhbHNlKTogUHJvbWlzZTxHaXRIdWJQb3J0Zm9saW9JbmRleD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIGZyZXNoIGRhdGFcbiAgICAgIGlmIChmb3JjZSB8fCB0aGlzLnNob3VsZEZldGNoRnJlc2goKSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaEZyZXNoKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJldHVybiBjYWNoZWQgZGF0YSBpZiBhdmFpbGFibGUgYW5kIHZhbGlkXG4gICAgICBpZiAodGhpcy5jYWNoZSAmJiB0aGlzLmlzQ2FjaGVWYWxpZCgpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUmV0dXJuaW5nIGNhY2hlZCBHaXRIdWIgcG9ydGZvbGlvIGluZGV4Jywge1xuICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLmNhY2hlLnVzZXJuYW1lLFxuICAgICAgICAgIHRvdGFsRWxlbWVudHM6IHRoaXMuY2FjaGUudG90YWxFbGVtZW50cyxcbiAgICAgICAgICBhZ2U6IHRoaXMubGFzdEZldGNoID8gRGF0ZS5ub3coKSAtIHRoaXMubGFzdEZldGNoLmdldFRpbWUoKSA6ICd1bmtub3duJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFRyeSB0byBmZXRjaCBmcmVzaCwgZmFsbCBiYWNrIHRvIHN0YWxlIGNhY2hlIG9uIGZhaWx1cmVcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoRnJlc2goKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZmV0Y2ggZnJlc2ggR2l0SHViIHBvcnRmb2xpbyBpbmRleCwgY2hlY2tpbmcgZm9yIHN0YWxlIGNhY2hlJywge1xuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZXR1cm4gc3RhbGUgY2FjaGUgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ1JldHVybmluZyBzdGFsZSBHaXRIdWIgcG9ydGZvbGlvIGNhY2hlIGFzIGZhbGxiYWNrJywge1xuICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMuY2FjaGUudXNlcm5hbWUsXG4gICAgICAgICAgICBhZ2U6IHRoaXMubGFzdEZldGNoID8gRGF0ZS5ub3coKSAtIHRoaXMubGFzdEZldGNoLmdldFRpbWUoKSA6ICd1bmtub3duJ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZXR1cm4gZW1wdHkgaW5kZXggYXMgbGFzdCByZXNvcnRcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRW1wdHlJbmRleCgpO1xuICAgICAgfVxuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignR2l0SHViUG9ydGZvbGlvSW5kZXhlci5nZXRJbmRleCcsIGVycm9yKTtcbiAgICAgIFxuICAgICAgLy8gUmV0dXJuIHN0YWxlIGNhY2hlIG9yIGVtcHR5IGluZGV4XG4gICAgICBpZiAodGhpcy5jYWNoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRW1wdHlJbmRleCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlIGNhY2hlIGFmdGVyIHVzZXIgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGludmFsaWRhdGVBZnRlckFjdGlvbihhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKCdJbnZhbGlkYXRpbmcgR2l0SHViIHBvcnRmb2xpbyBjYWNoZSBhZnRlciB1c2VyIGFjdGlvbicsIHsgYWN0aW9uIH0pO1xuICAgIFxuICAgIHRoaXMucmVjZW50VXNlckFjdGlvbiA9IHRydWU7XG4gICAgdGhpcy5hY3Rpb25UaW1lc3RhbXAgPSBuZXcgRGF0ZSgpO1xuICAgIFxuICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgYXVkaXQgdHJhaWxcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0NBQ0hFX0lOVkFMSURBVElPTicsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdHaXRIdWJQb3J0Zm9saW9JbmRleGVyLmludmFsaWRhdGVBZnRlckFjdGlvbicsXG4gICAgICBkZXRhaWxzOiBgQ2FjaGUgaW52YWxpZGF0ZWQgYWZ0ZXIgdXNlciBhY3Rpb246ICR7YWN0aW9ufWAsXG4gICAgICBtZXRhZGF0YTogeyBhY3Rpb24gfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjYWNoZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZSA9IG51bGw7XG4gICAgdGhpcy5sYXN0RmV0Y2ggPSBudWxsO1xuICAgIHRoaXMucmVjZW50VXNlckFjdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuYWN0aW9uVGltZXN0YW1wID0gbnVsbDtcbiAgICB0aGlzLmFwaUNhY2hlLmNsZWFyKCk7XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiBwb3J0Zm9saW8gY2FjaGUgY2xlYXJlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjYWNoZSBzdGF0aXN0aWNzXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FjaGVTdGF0cygpOiB7XG4gICAgaGFzQ2FjaGVkRGF0YTogYm9vbGVhbjtcbiAgICBsYXN0RmV0Y2g6IERhdGUgfCBudWxsO1xuICAgIGlzU3RhbGU6IGJvb2xlYW47XG4gICAgcmVjZW50VXNlckFjdGlvbjogYm9vbGVhbjtcbiAgICB0b3RhbEVsZW1lbnRzOiBudW1iZXI7XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBoYXNDYWNoZWREYXRhOiB0aGlzLmNhY2hlICE9PSBudWxsLFxuICAgICAgbGFzdEZldGNoOiB0aGlzLmxhc3RGZXRjaCxcbiAgICAgIGlzU3RhbGU6ICF0aGlzLmlzQ2FjaGVWYWxpZCgpLFxuICAgICAgcmVjZW50VXNlckFjdGlvbjogdGhpcy5yZWNlbnRVc2VyQWN0aW9uLFxuICAgICAgdG90YWxFbGVtZW50czogdGhpcy5jYWNoZT8udG90YWxFbGVtZW50cyB8fCAwXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBmcmVzaCBkYXRhIGZyb20gR2l0SHViXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoRnJlc2goKTogUHJvbWlzZTxHaXRIdWJQb3J0Zm9saW9JbmRleD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgbG9nZ2VyLmluZm8oJ0ZldGNoaW5nIGZyZXNoIEdpdEh1YiBwb3J0Zm9saW8gaW5kZXguLi4nKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IEdpdEh1YiB1c2VybmFtZSBmcm9tIHRva2VuXG4gICAgICBjb25zdCB1c2VybmFtZSA9IGF3YWl0IHRoaXMuZ2V0R2l0SHViVXNlcm5hbWUoKTtcbiAgICAgIGNvbnN0IHJlcG9zaXRvcnkgPSAnZG9sbGhvdXNlLXBvcnRmb2xpbyc7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIHBvcnRmb2xpbyByZXBvc2l0b3J5IGV4aXN0c1xuICAgICAgY29uc3QgcmVwb0V4aXN0cyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIuY2hlY2tQb3J0Zm9saW9FeGlzdHModXNlcm5hbWUpO1xuICAgICAgaWYgKCFyZXBvRXhpc3RzKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QnLCB7IHVzZXJuYW1lIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVFbXB0eUluZGV4KHVzZXJuYW1lLCByZXBvc2l0b3J5KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRmV0Y2ggcmVwb3NpdG9yeSBjb250ZW50IHVzaW5nIEdpdEh1YiBBUElcbiAgICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5mZXRjaFJlcG9zaXRvcnlDb250ZW50KHVzZXJuYW1lLCByZXBvc2l0b3J5KTtcbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGNhY2hlXG4gICAgICB0aGlzLmNhY2hlID0gaW5kZXg7XG4gICAgICB0aGlzLmxhc3RGZXRjaCA9IG5ldyBEYXRlKCk7XG4gICAgICB0aGlzLnJlY2VudFVzZXJBY3Rpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuYWN0aW9uVGltZXN0YW1wID0gbnVsbDtcbiAgICAgIFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiBwb3J0Zm9saW8gaW5kZXggZmV0Y2hlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICB0b3RhbEVsZW1lbnRzOiBpbmRleC50b3RhbEVsZW1lbnRzLFxuICAgICAgICBkdXJhdGlvbjogYCR7ZHVyYXRpb259bXNgLFxuICAgICAgICByYXRlTGltaXRSZW1haW5pbmc6IGluZGV4LnJhdGVMaW1pdEluZm8/LnJlbWFpbmluZ1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUE9SVEZPTElPX0ZFVENIX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIuZmV0Y2hGcmVzaCcsXG4gICAgICAgIGRldGFpbHM6IGBGZXRjaGVkIEdpdEh1YiBwb3J0Zm9saW8gd2l0aCAke2luZGV4LnRvdGFsRWxlbWVudHN9IGVsZW1lbnRzIGluICR7ZHVyYXRpb259bXNgLFxuICAgICAgICBtZXRhZGF0YTogeyB1c2VybmFtZSwgZHVyYXRpb24sIHRvdGFsRWxlbWVudHM6IGluZGV4LnRvdGFsRWxlbWVudHMgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIuZmV0Y2hGcmVzaCcsIGVycm9yLCB7IGR1cmF0aW9uIH0pO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgJ0ZhaWxlZCB0byBmZXRjaCBHaXRIdWIgcG9ydGZvbGlvIGluZGV4JywgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggcmVwb3NpdG9yeSBjb250ZW50IGZyb20gR2l0SHViIEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlcG9zaXRvcnlDb250ZW50KHVzZXJuYW1lOiBzdHJpbmcsIHJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8R2l0SHViUG9ydGZvbGlvSW5kZXg+IHtcbiAgICAvLyBUcnkgR3JhcGhRTCBmaXJzdCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLCBmYWxsYmFjayB0byBSRVNUXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoV2l0aEdyYXBoUUwodXNlcm5hbWUsIHJlcG9zaXRvcnkpO1xuICAgIH0gY2F0Y2ggKGdyYXBocWxFcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdHcmFwaFFMIGZldGNoIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIFJFU1QgQVBJJywge1xuICAgICAgICBlcnJvcjogZ3JhcGhxbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBncmFwaHFsRXJyb3IubWVzc2FnZSA6IFN0cmluZyhncmFwaHFsRXJyb3IpXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hXaXRoUkVTVCh1c2VybmFtZSwgcmVwb3NpdG9yeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHVzaW5nIEdyYXBoUUwgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFdpdGhHcmFwaFFMKHVzZXJuYW1lOiBzdHJpbmcsIHJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8R2l0SHViUG9ydGZvbGlvSW5kZXg+IHtcbiAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgIHF1ZXJ5IEdldFBvcnRmb2xpb0NvbnRlbnQoJG93bmVyOiBTdHJpbmchLCAkbmFtZTogU3RyaW5nISkge1xuICAgICAgICByZXBvc2l0b3J5KG93bmVyOiAkb3duZXIsIG5hbWU6ICRuYW1lKSB7XG4gICAgICAgICAgZGVmYXVsdEJyYW5jaFJlZiB7XG4gICAgICAgICAgICB0YXJnZXQge1xuICAgICAgICAgICAgICAuLi4gb24gQ29tbWl0IHtcbiAgICAgICAgICAgICAgICBvaWRcbiAgICAgICAgICAgICAgICBoaXN0b3J5KGZpcnN0OiAxKSB7XG4gICAgICAgICAgICAgICAgICBub2RlcyB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZERhdGVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0KGV4cHJlc3Npb246IFwiSEVBRDpcIikge1xuICAgICAgICAgICAgLi4uIG9uIFRyZWUge1xuICAgICAgICAgICAgICBlbnRyaWVzIHtcbiAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgICAgIG9iamVjdCB7XG4gICAgICAgICAgICAgICAgICAuLi4gb24gVHJlZSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXMge1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgb2lkXG4gICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLiBvbiBCbG9iIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVNpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByYXRlTGltaXQge1xuICAgICAgICAgIHJlbWFpbmluZ1xuICAgICAgICAgIHJlc2V0QXRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGA7XG4gICAgXG4gICAgY29uc3QgdmFyaWFibGVzID0geyBvd25lcjogdXNlcm5hbWUsIG5hbWU6IHJlcG9zaXRvcnkgfTtcbiAgICBcbiAgICAvLyBHcmFwaFFMIGVuZHBvaW50IG5vdCB5ZXQgaW1wbGVtZW50ZWQgd2l0aCBQb3J0Zm9saW9SZXBvTWFuYWdlclxuICAgIC8vIEZvciBub3csIGp1c3QgdGhyb3cgdG8gZmFsbCBiYWNrIHRvIFJFU1RcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyYXBoUUwgbm90IHlldCBpbXBsZW1lbnRlZCBmb3IgcG9ydGZvbGlvIG9wZXJhdGlvbnMnKTtcbiAgICBcbiAgICAvLyBOb3RlOiBUaGlzIGlzIGEgc2ltcGxpZmllZCBHcmFwaFFMIGltcGxlbWVudGF0aW9uXG4gICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB5b3Ugd291bGQgc2VuZCBQT1NUIHJlcXVlc3Qgd2l0aCBxdWVyeSBhbmQgdmFyaWFibGVzXG4gICAgdGhyb3cgbmV3IEVycm9yKCdHcmFwaFFMIGltcGxlbWVudGF0aW9uIG5vdCB5ZXQgY29tcGxldGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB1c2luZyBSRVNUIEFQSSB3aXRoIHBhZ2luYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hXaXRoUkVTVCh1c2VybmFtZTogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPEdpdEh1YlBvcnRmb2xpb0luZGV4PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVzZXJuYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodXNlcm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIEdldCByZXBvc2l0b3J5IGluZm8gYW5kIGxhdGVzdCBjb21taXRcbiAgICBjb25zdCByZXBvSW5mbyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIuZ2l0aHViUmVxdWVzdChcbiAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7cmVwb3NpdG9yeX1gXG4gICAgKTtcbiAgICBcbiAgICBjb25zdCBsYXRlc3RDb21taXQgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb1JlcG9NYW5hZ2VyLmdpdGh1YlJlcXVlc3QoXG4gICAgICBgL3JlcG9zLyR7bm9ybWFsaXplZFVzZXJuYW1lfS8ke3JlcG9zaXRvcnl9L2NvbW1pdHMvSEVBRGBcbiAgICApO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgaW5kZXhcbiAgICBjb25zdCBpbmRleDogR2l0SHViUG9ydGZvbGlvSW5kZXggPSB7XG4gICAgICB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZShsYXRlc3RDb21taXQuY29tbWl0LmNvbW1pdHRlci5kYXRlKSxcbiAgICAgIGVsZW1lbnRzOiBuZXcgTWFwKCksXG4gICAgICB0b3RhbEVsZW1lbnRzOiAwLFxuICAgICAgc2hhOiBsYXRlc3RDb21taXQuc2hhXG4gICAgfTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGVsZW1lbnQgdHlwZSBtYXBzXG4gICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgaW5kZXguZWxlbWVudHMuc2V0KGVsZW1lbnRUeXBlLCBbXSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEZldGNoIGNvbnRlbnQgZm9yIGVhY2ggZWxlbWVudCB0eXBlXG4gICAgbG9nZ2VyLmluZm8oYEZldGNoaW5nIGNvbnRlbnQgZm9yIGFsbCBlbGVtZW50IHR5cGVzIGZyb20gR2l0SHViIHBvcnRmb2xpby4uLmApO1xuICAgIFxuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmV0Y2hpbmcgJHtlbGVtZW50VHlwZX0gZnJvbSBHaXRIdWIuLi5gKTtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZmV0Y2hFbGVtZW50VHlwZUNvbnRlbnQobm9ybWFsaXplZFVzZXJuYW1lLCByZXBvc2l0b3J5LCBlbGVtZW50VHlwZSk7XG4gICAgICAgIGluZGV4LmVsZW1lbnRzLnNldChlbGVtZW50VHlwZSwgZW50cmllcyk7XG4gICAgICAgIGluZGV4LnRvdGFsRWxlbWVudHMgKz0gZW50cmllcy5sZW5ndGg7XG4gICAgICAgIFxuICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYOKchSBGb3VuZCAke2VudHJpZXMubGVuZ3RofSAke2VsZW1lbnRUeXBlfSBpbiBHaXRIdWIgcG9ydGZvbGlvYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGDwn5OBIE5vICR7ZWxlbWVudFR5cGV9IGZvdW5kIChkaXJlY3RvcnkgbWF5IG5vdCBleGlzdCB5ZXQpYCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGDinYwgRmFpbGVkIHRvIGZldGNoICR7ZWxlbWVudFR5cGV9IGZyb20gR2l0SHViIHBvcnRmb2xpb2AsIHtcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIGVsZW1lbnRUeXBlXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBDb250aW51ZSB3aXRoIG90aGVyIGVsZW1lbnQgdHlwZXNcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGNvbnRlbnQgZm9yIGEgc3BlY2lmaWMgZWxlbWVudCB0eXBlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoRWxlbWVudFR5cGVDb250ZW50KFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcmVwb3NpdG9yeTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZVxuICApOiBQcm9taXNlPEdpdEh1YkluZGV4RW50cnlbXT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgZGlyZWN0b3J5IGxpc3RpbmcgdXNpbmcgUG9ydGZvbGlvUmVwb01hbmFnZXJcbiAgICAgIGNvbnN0IGNvbnRlbnRzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5naXRodWJSZXF1ZXN0KFxuICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7cmVwb3NpdG9yeX0vY29udGVudHMvJHtlbGVtZW50VHlwZX1gXG4gICAgICApO1xuICAgICAgXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudHMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgZW50cmllczogR2l0SHViSW5kZXhFbnRyeVtdID0gW107XG4gICAgICBjb25zdCBtYXhDb25jdXJyZW50ID0gNTsgLy8gTGltaXQgY29uY3VycmVudCByZXF1ZXN0c1xuICAgICAgXG4gICAgICAvLyBQcm9jZXNzIGZpbGVzIGluIGJhdGNoZXMgdG8gYXZvaWQgcmF0ZSBsaW1pdGluZ1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkgKz0gbWF4Q29uY3VycmVudCkge1xuICAgICAgICBjb25zdCBiYXRjaCA9IGNvbnRlbnRzLnNsaWNlKGksIGkgKyBtYXhDb25jdXJyZW50KTtcbiAgICAgICAgY29uc3QgYmF0Y2hQcm9taXNlcyA9IGJhdGNoXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ2ZpbGUnICYmIGl0ZW0ubmFtZS5lbmRzV2l0aCgnLm1kJykpXG4gICAgICAgICAgLm1hcChpdGVtID0+IHRoaXMuY3JlYXRlR2l0SHViSW5kZXhFbnRyeSh1c2VybmFtZSwgcmVwb3NpdG9yeSwgZWxlbWVudFR5cGUsIGl0ZW0pKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChiYXRjaFByb21pc2VzKTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGJhdGNoUmVzdWx0cykge1xuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQWRkIGRlbGF5IGJldHdlZW4gYmF0Y2hlcyB0byByZXNwZWN0IHJhdGUgbGltaXRzXG4gICAgICAgIGlmIChpICsgbWF4Q29uY3VycmVudCA8IGNvbnRlbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gZW50cmllcztcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEaXJlY3RvcnkgbWlnaHQgbm90IGV4aXN0IC0gY2hlY2sgZm9yIDQwNCBlcnJvcnNcbiAgICAgIC8vIFBvcnRmb2xpb1JlcG9NYW5hZ2VyIHdpbGwgdGhyb3cgc3RhbmRhcmQgR2l0SHViIEFQSSBlcnJvcnNcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciA0MDQgTm90IEZvdW5kIGVycm9ycyBmcm9tIEdpdEh1YiBBUElcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJzQwNCcpIHx8IFxuICAgICAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnTm90IEZvdW5kJykpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYERpcmVjdG9yeSAke2VsZW1lbnRUeXBlfSBub3QgZm91bmQgaW4gR2l0SHViIHJlcG9zaXRvcnkgKHRoaXMgaXMgbm9ybWFsIGlmIG5vdCB5ZXQgY3JlYXRlZClgKTtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIExvZyB0aGUgYWN0dWFsIGVycm9yIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBFcnJvciBmZXRjaGluZyAke2VsZW1lbnRUeXBlfTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBSZS10aHJvdyBvdGhlciBlcnJvcnNcbiAgICAgIGxvZ2dlci53YXJuKGBVbmV4cGVjdGVkIGVycm9yIGZldGNoaW5nICR7ZWxlbWVudFR5cGV9OmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgR2l0SHViIGluZGV4IGVudHJ5IGZyb20gQVBJIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUdpdEh1YkluZGV4RW50cnkoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLFxuICAgIGZpbGVJbmZvOiBhbnlcbiAgKTogUHJvbWlzZTxHaXRIdWJJbmRleEVudHJ5IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBQYXJzZSBtZXRhZGF0YSBmcm9tIGZpbGVuYW1lIG9yIGZldGNoIGNvbnRlbnQgaWYgbmVlZGVkXG4gICAgICBjb25zdCBuYW1lID0gZmlsZUluZm8ubmFtZS5yZXBsYWNlKCcubWQnLCAnJykucmVwbGFjZSgvLS9nLCAnICcpO1xuICAgICAgXG4gICAgICBjb25zdCBlbnRyeTogR2l0SHViSW5kZXhFbnRyeSA9IHtcbiAgICAgICAgcGF0aDogZmlsZUluZm8ucGF0aCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHNoYTogZmlsZUluZm8uc2hhLFxuICAgICAgICBodG1sVXJsOiBmaWxlSW5mby5odG1sX3VybCxcbiAgICAgICAgZG93bmxvYWRVcmw6IGZpbGVJbmZvLmRvd25sb2FkX3VybCxcbiAgICAgICAgbGFzdE1vZGlmaWVkOiBuZXcgRGF0ZSgpLCAvLyBHaXRIdWIgQVBJIGRvZXNuJ3QgcHJvdmlkZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lIGRpcmVjdGx5XG4gICAgICAgIHNpemU6IGZpbGVJbmZvLnNpemUgfHwgMFxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gT3B0aW9uYWxseSBmZXRjaCBjb250ZW50IHRvIGV4dHJhY3QgbWV0YWRhdGFcbiAgICAgIC8vIFRoaXMgaXMgZXhwZW5zaXZlLCBzbyBvbmx5IGRvIGl0IGZvciBzbWFsbCBmaWxlcyBvciB3aGVuIHNwZWNpZmljYWxseSBuZWVkZWRcbiAgICAgIGlmIChmaWxlSW5mby5zaXplICYmIGZpbGVJbmZvLnNpemUgPCAxMDAwMCkgeyAvLyBPbmx5IGZvciBmaWxlcyA8IDEwS0JcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBGb3IgZG93bmxvYWQgVVJMcywgd2UgbmVlZCB0byBmZXRjaCBkaXJlY3RseSwgbm90IHRocm91Z2ggQVBJXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChmaWxlSW5mby5kb3dubG9hZF91cmwpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnBhcnNlTWV0YWRhdGFGcm9tQ29udGVudChjb250ZW50KTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAobWV0YWRhdGEubmFtZSkgZW50cnkubmFtZSA9IG1ldGFkYXRhLm5hbWU7XG4gICAgICAgICAgaWYgKG1ldGFkYXRhLmRlc2NyaXB0aW9uKSBlbnRyeS5kZXNjcmlwdGlvbiA9IG1ldGFkYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICAgIGlmIChtZXRhZGF0YS52ZXJzaW9uKSBlbnRyeS52ZXJzaW9uID0gbWV0YWRhdGEudmVyc2lvbjtcbiAgICAgICAgICBpZiAobWV0YWRhdGEuYXV0aG9yKSBlbnRyeS5hdXRob3IgPSBtZXRhZGF0YS5hdXRob3I7XG4gICAgICAgIH0gY2F0Y2ggKG1ldGFkYXRhRXJyb3IpIHtcbiAgICAgICAgICAvLyBOb24tY3JpdGljYWwgZXJyb3IsIGNvbnRpbnVlIHdpdGhvdXQgbWV0YWRhdGFcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBmZXRjaCBtZXRhZGF0YSBmb3IgZmlsZScsIHtcbiAgICAgICAgICAgIHBhdGg6IGZpbGVJbmZvLnBhdGgsXG4gICAgICAgICAgICBlcnJvcjogbWV0YWRhdGFFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gbWV0YWRhdGFFcnJvci5tZXNzYWdlIDogU3RyaW5nKG1ldGFkYXRhRXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRmFpbGVkIHRvIGNyZWF0ZSBHaXRIdWIgaW5kZXggZW50cnknLCB7XG4gICAgICAgIHBhdGg6IGZpbGVJbmZvLnBhdGgsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIG1ldGFkYXRhIGZyb20gZmlsZSBjb250ZW50IChmcm9udG1hdHRlcilcbiAgICovXG4gIHByaXZhdGUgcGFyc2VNZXRhZGF0YUZyb21Db250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHtcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgYXV0aG9yPzogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBtZXRhZGF0YTogYW55ID0ge307XG4gICAgXG4gICAgLy8gU2ltcGxlIGZyb250bWF0dGVyIHBhcnNpbmcgKGNvdWxkIHVzZSBhIHByb3BlciBZQU1MIHBhcnNlcilcbiAgICBjb25zdCBmcm9udG1hdHRlck1hdGNoID0gY29udGVudC5tYXRjaCgvXi0tLVxcbihbXFxzXFxTXSo/KVxcbi0tLS8pO1xuICAgIGlmIChmcm9udG1hdHRlck1hdGNoKSB7XG4gICAgICBjb25zdCBmcm9udG1hdHRlciA9IGZyb250bWF0dGVyTWF0Y2hbMV07XG4gICAgICBcbiAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9ebmFtZTpcXHMqKC4rKSQvbSk7XG4gICAgICBpZiAobmFtZU1hdGNoKSBtZXRhZGF0YS5uYW1lID0gbmFtZU1hdGNoWzFdLnRyaW0oKTtcbiAgICAgIFxuICAgICAgY29uc3QgZGVzY01hdGNoID0gZnJvbnRtYXR0ZXIubWF0Y2goL15kZXNjcmlwdGlvbjpcXHMqKC4rKSQvbSk7XG4gICAgICBpZiAoZGVzY01hdGNoKSBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IGRlc2NNYXRjaFsxXS50cmltKCk7XG4gICAgICBcbiAgICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9edmVyc2lvbjpcXHMqKC4rKSQvbSk7XG4gICAgICBpZiAodmVyc2lvbk1hdGNoKSBtZXRhZGF0YS52ZXJzaW9uID0gdmVyc2lvbk1hdGNoWzFdLnRyaW0oKTtcbiAgICAgIFxuICAgICAgY29uc3QgYXV0aG9yTWF0Y2ggPSBmcm9udG1hdHRlci5tYXRjaCgvXmF1dGhvcjpcXHMqKC4rKSQvbSk7XG4gICAgICBpZiAoYXV0aG9yTWF0Y2gpIG1ldGFkYXRhLmF1dGhvciA9IGF1dGhvck1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgdXNlcm5hbWUgZnJvbSBhdXRoZW50aWNhdGVkIHRva2VuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEdpdEh1YlVzZXJuYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5naXRodWJSZXF1ZXN0KCcvdXNlcicpO1xuICAgICAgcmV0dXJuIHVzZXJJbmZvLmxvZ2luO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgR2l0SHViIHVzZXJuYW1lLiBQbGVhc2UgZW5zdXJlIHlvdSBhcmUgYXV0aGVudGljYXRlZCB3aXRoIEdpdEh1Yi4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY2FjaGUgaXMgdmFsaWRcbiAgICovXG4gIHByaXZhdGUgaXNDYWNoZVZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jYWNoZSB8fCAhdGhpcy5sYXN0RmV0Y2gpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdEZldGNoLmdldFRpbWUoKTtcbiAgICByZXR1cm4gYWdlIDwgdGhpcy50dGw7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBmZXRjaCBmcmVzaCBkYXRhXG4gICAqL1xuICBwcml2YXRlIHNob3VsZEZldGNoRnJlc2goKTogYm9vbGVhbiB7XG4gICAgLy8gQWx3YXlzIGZldGNoIGlmIG5vIGNhY2hlXG4gICAgaWYgKCF0aGlzLmNhY2hlIHx8ICF0aGlzLmxhc3RGZXRjaCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciByZWNlbnQgdXNlciBhY3Rpb25zXG4gICAgaWYgKHRoaXMucmVjZW50VXNlckFjdGlvbiAmJiB0aGlzLmFjdGlvblRpbWVzdGFtcCkge1xuICAgICAgY29uc3QgYWN0aW9uQWdlID0gRGF0ZS5ub3coKSAtIHRoaXMuYWN0aW9uVGltZXN0YW1wLmdldFRpbWUoKTtcbiAgICAgIGlmIChhY3Rpb25BZ2UgPCB0aGlzLmFjdGlvbkdyYWNlUGVyaW9kKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRmV0Y2hpbmcgZnJlc2ggZHVlIHRvIHJlY2VudCB1c2VyIGFjdGlvbicsIHsgYWN0aW9uQWdlIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdyYWNlIHBlcmlvZCBleHBpcmVkLCBjbGVhciBhY3Rpb24gZmxhZ1xuICAgICAgICB0aGlzLnJlY2VudFVzZXJBY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY3Rpb25UaW1lc3RhbXAgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBUVExcbiAgICByZXR1cm4gIXRoaXMuaXNDYWNoZVZhbGlkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGVtcHR5IGluZGV4IHdoZW4gbm8gcG9ydGZvbGlvIGV4aXN0c1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFbXB0eUluZGV4KHVzZXJuYW1lPzogc3RyaW5nLCByZXBvc2l0b3J5Pzogc3RyaW5nKTogR2l0SHViUG9ydGZvbGlvSW5kZXgge1xuICAgIGNvbnN0IGluZGV4OiBHaXRIdWJQb3J0Zm9saW9JbmRleCA9IHtcbiAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSB8fCAndW5rbm93bicsXG4gICAgICByZXBvc2l0b3J5OiByZXBvc2l0b3J5IHx8ICdkb2xsaG91c2UtcG9ydGZvbGlvJyxcbiAgICAgIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZSgpLFxuICAgICAgZWxlbWVudHM6IG5ldyBNYXAoKSxcbiAgICAgIHRvdGFsRWxlbWVudHM6IDAsXG4gICAgICBzaGE6ICcnXG4gICAgfTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGVtcHR5IGVsZW1lbnQgdHlwZSBtYXBzXG4gICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgaW5kZXguZWxlbWVudHMuc2V0KGVsZW1lbnRUeXBlLCBbXSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBpbmRleDtcbiAgfVxufSJdfQ==
|
|
@@ -33,8 +33,9 @@ export declare class PortfolioRepoManager {
|
|
|
33
33
|
private getTokenAndValidate;
|
|
34
34
|
/**
|
|
35
35
|
* Make authenticated GitHub API request
|
|
36
|
+
* Made public to support GitHubPortfolioIndexer operations
|
|
36
37
|
*/
|
|
37
|
-
|
|
38
|
+
githubRequest(path: string, method?: string, body?: any): Promise<any>;
|
|
38
39
|
/**
|
|
39
40
|
* Check if portfolio repository exists for a user
|
|
40
41
|
* No consent required - this is a read-only operation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PortfolioRepoManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioRepoManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAOzD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAuC;IAClF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAEnE,OAAO,CAAC,KAAK,CAAuB;;IAMpC;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;OAIG;YACW,mBAAmB;IA6BjC
|
|
1
|
+
{"version":3,"file":"PortfolioRepoManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioRepoManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAOzD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAuC;IAClF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAEnE,OAAO,CAAC,KAAK,CAAuB;;IAMpC;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;OAIG;YACW,mBAAmB;IA6BjC;;;OAGG;IACU,aAAa,CACxB,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAc,EACtB,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,GAAG,CAAC;IA2Ef;;;;OAIG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9D;;;OAGG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA+EtF;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA2OnF;;;OAGG;IACG,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CjE;;;OAGG;IACH,OAAO,CAAC,eAAe;IAcvB;;;;OAIG;WACW,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAwBpD;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAQ7B"}
|