@nlabs/lex 1.52.16 → 1.52.18
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/lib/commands/serverless/serverless.js +169 -30
- package/package.json +1 -1
- package/webpack.config.js +22 -2
|
@@ -6,7 +6,8 @@ import chalk from 'chalk';
|
|
|
6
6
|
import express from 'express';
|
|
7
7
|
import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
8
8
|
import { homedir } from 'os';
|
|
9
|
-
import { resolve as pathResolve, join } from 'path';
|
|
9
|
+
import { resolve as pathResolve, join, isAbsolute } from 'path';
|
|
10
|
+
import { pathToFileURL } from 'url';
|
|
10
11
|
import { WebSocketServer } from 'ws';
|
|
11
12
|
import { LexConfig, getPackageDir } from '../../LexConfig.js';
|
|
12
13
|
import { createSpinner, removeFiles } from '../../utils/app.js';
|
|
@@ -90,24 +91,130 @@ const displayServerStatus = (httpPort, httpsPort, wsPort, host, quiet, publicIp)
|
|
|
90
91
|
};
|
|
91
92
|
const loadHandler = async (handlerPath, outputDir)=>{
|
|
92
93
|
try {
|
|
93
|
-
|
|
94
|
-
|
|
94
|
+
console.log(`[Serverless] Parsing handler path: ${handlerPath}`);
|
|
95
|
+
// Parse AWS Lambda handler format: "path/to/file.exportName" or "file.exportName"
|
|
96
|
+
// Examples: "index.handler", "handlers/api.handler", "src/index.default"
|
|
97
|
+
const handlerParts = handlerPath.split('.');
|
|
98
|
+
console.log('[Serverless] Handler parts after split:', handlerParts);
|
|
99
|
+
let filePath;
|
|
100
|
+
let exportName = null;
|
|
101
|
+
if (handlerParts.length > 1) {
|
|
102
|
+
// AWS Lambda format: "file.exportName"
|
|
103
|
+
// Take the last part as export name, rest as file path
|
|
104
|
+
// Handle cases like "index.handler" -> file: "index", export: "handler"
|
|
105
|
+
// Or "handlers/api.handler" -> file: "handlers/api", export: "handler"
|
|
106
|
+
exportName = handlerParts[handlerParts.length - 1] || null;
|
|
107
|
+
filePath = handlerParts.slice(0, -1).join('.');
|
|
108
|
+
console.log(`[Serverless] Parsed AWS Lambda format - filePath: "${filePath}", exportName: "${exportName}"`);
|
|
109
|
+
} else {
|
|
110
|
+
// Simple format: just the file path
|
|
111
|
+
filePath = handlerPath;
|
|
112
|
+
console.log(`[Serverless] Simple format - filePath: "${filePath}"`);
|
|
113
|
+
}
|
|
114
|
+
// Ensure filePath doesn't have the export name in it
|
|
115
|
+
if (filePath.includes('.handler') || filePath.includes('.default')) {
|
|
116
|
+
console.error(`[Serverless] WARNING: filePath still contains export name! filePath: "${filePath}"`);
|
|
117
|
+
// Try to fix it - remove the last part if it looks like an export name
|
|
118
|
+
const pathParts = filePath.split('.');
|
|
119
|
+
if (pathParts.length > 1) {
|
|
120
|
+
const lastPart = pathParts[pathParts.length - 1];
|
|
121
|
+
if ([
|
|
122
|
+
'handler',
|
|
123
|
+
'default',
|
|
124
|
+
'index'
|
|
125
|
+
].includes(lastPart) && !exportName) {
|
|
126
|
+
exportName = lastPart;
|
|
127
|
+
filePath = pathParts.slice(0, -1).join('.');
|
|
128
|
+
console.log(`[Serverless] Fixed - filePath: "${filePath}", exportName: "${exportName}"`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Handle both relative paths and absolute paths
|
|
133
|
+
let fullPath;
|
|
134
|
+
if (isAbsolute(filePath)) {
|
|
135
|
+
fullPath = filePath;
|
|
136
|
+
} else {
|
|
137
|
+
fullPath = pathResolve(outputDir, filePath);
|
|
138
|
+
}
|
|
139
|
+
console.log(`[Serverless] Resolved fullPath (before extensions): ${fullPath}`);
|
|
140
|
+
// Try different extensions if file doesn't exist
|
|
95
141
|
if (!existsSync(fullPath)) {
|
|
142
|
+
const extensions = [
|
|
143
|
+
'.js',
|
|
144
|
+
'.mjs',
|
|
145
|
+
'.cjs'
|
|
146
|
+
];
|
|
147
|
+
const pathWithoutExt = fullPath.replace(/\.(js|mjs|cjs)$/, '');
|
|
148
|
+
console.log(`[Serverless] Trying extensions. Base path: ${pathWithoutExt}`);
|
|
149
|
+
for (const ext of extensions){
|
|
150
|
+
const candidatePath = pathWithoutExt + ext;
|
|
151
|
+
console.log(`[Serverless] Checking: ${candidatePath} (exists: ${existsSync(candidatePath)})`);
|
|
152
|
+
if (existsSync(candidatePath)) {
|
|
153
|
+
fullPath = candidatePath;
|
|
154
|
+
console.log(`[Serverless] Found file with extension: ${fullPath}`);
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
console.log(`[Serverless] File exists without trying extensions: ${fullPath}`);
|
|
160
|
+
}
|
|
161
|
+
console.log(`[Serverless] Final fullPath: ${fullPath}`);
|
|
162
|
+
console.log(`[Serverless] Export name: ${exportName || 'default/handler'}`);
|
|
163
|
+
console.log(`[Serverless] File exists: ${existsSync(fullPath)}`);
|
|
164
|
+
if (!existsSync(fullPath)) {
|
|
165
|
+
console.error(`[Serverless] Handler file not found: ${fullPath}`);
|
|
166
|
+
console.error(`[Serverless] Output directory: ${outputDir}`);
|
|
167
|
+
console.error(`[Serverless] Handler path from config: ${handlerPath}`);
|
|
96
168
|
throw new Error(`Handler file not found: ${fullPath}`);
|
|
97
169
|
}
|
|
98
170
|
// Dynamic import of the handler with better error handling
|
|
171
|
+
// Add .js extension if importing TypeScript compiled output
|
|
172
|
+
const importPath = fullPath.endsWith('.ts') ? fullPath.replace(/\.ts$/, '.js') : fullPath;
|
|
99
173
|
try {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
log(`
|
|
174
|
+
// Convert to file:// URL for ES module imports (required for absolute paths)
|
|
175
|
+
// Use pathToFileURL to ensure proper file:// URL format
|
|
176
|
+
const importUrl = pathToFileURL(importPath).href;
|
|
177
|
+
console.log(`[Serverless] Importing handler from: ${importUrl}`);
|
|
178
|
+
console.log(`[Serverless] File path: ${importPath}`);
|
|
179
|
+
// Use import() with the file URL
|
|
180
|
+
// Note: If the handler file has import errors (like missing dependencies),
|
|
181
|
+
// those will surface here, but that's a handler code issue, not a loader issue
|
|
182
|
+
const handlerModule = await import(importUrl);
|
|
183
|
+
console.log(`[Serverless] Handler module loaded successfully. Exports: ${Object.keys(handlerModule).join(', ')}`);
|
|
184
|
+
// Get the handler based on export name or try defaults
|
|
185
|
+
let handler;
|
|
186
|
+
if (exportName) {
|
|
187
|
+
handler = handlerModule[exportName];
|
|
188
|
+
if (!handler) {
|
|
189
|
+
console.error(`[Serverless] Export "${exportName}" not found in module. Available exports: ${Object.keys(handlerModule).join(', ')}`);
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
} else {
|
|
193
|
+
// Try default, handler, or the module itself
|
|
194
|
+
handler = handlerModule.default || handlerModule.handler || handlerModule;
|
|
195
|
+
}
|
|
196
|
+
console.log(`[Serverless] Handler found: ${typeof handler}, isFunction: ${typeof handler === 'function'}`);
|
|
197
|
+
if (typeof handler !== 'function') {
|
|
198
|
+
console.error(`[Serverless] Handler is not a function. Type: ${typeof handler}, Value:`, handler);
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
104
201
|
return handler;
|
|
105
202
|
} catch (importError) {
|
|
106
|
-
|
|
203
|
+
console.error(`[Serverless] Import error for handler ${handlerPath}:`, importError.message);
|
|
204
|
+
console.error('[Serverless] Import error stack:', importError.stack);
|
|
205
|
+
// Check if this is a dependency resolution error (common with ES modules)
|
|
206
|
+
if (importError.message && importError.message.includes('Cannot find module')) {
|
|
207
|
+
console.error('[Serverless] This appears to be a dependency resolution error.');
|
|
208
|
+
console.error('[Serverless] The handler file exists, but one of its imports is failing.');
|
|
209
|
+
console.error('[Serverless] Check that all dependencies in the handler file are properly installed.');
|
|
210
|
+
console.error(`[Serverless] Handler file: ${importPath}`);
|
|
211
|
+
console.error('[Serverless] Make sure the handler and its dependencies are compiled correctly.');
|
|
212
|
+
}
|
|
107
213
|
return null;
|
|
108
214
|
}
|
|
109
215
|
} catch (error) {
|
|
110
|
-
|
|
216
|
+
console.error(`[Serverless] Error loading handler ${handlerPath}:`, error.message);
|
|
217
|
+
console.error('[Serverless] Error stack:', error.stack);
|
|
111
218
|
return null;
|
|
112
219
|
}
|
|
113
220
|
};
|
|
@@ -304,28 +411,29 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
304
411
|
const url = req.url || '/';
|
|
305
412
|
const method = req.method || 'GET';
|
|
306
413
|
const pathname = req.path || url.split('?')[0]; // Extract pathname without query string
|
|
307
|
-
log
|
|
414
|
+
// Always log requests (not affected by quiet flag for debugging)
|
|
415
|
+
console.log(`[Serverless] ${method} ${url} (pathname: ${pathname})`);
|
|
308
416
|
// Find matching function
|
|
309
417
|
let matchedFunction = null;
|
|
310
418
|
if (config.functions) {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
419
|
+
const functionNames = Object.keys(config.functions);
|
|
420
|
+
console.log(`[Serverless] Available functions: ${functionNames.join(', ')}`);
|
|
421
|
+
console.log('[Serverless] Config functions:', JSON.stringify(config.functions, null, 2));
|
|
314
422
|
for (const [functionName, functionConfig] of Object.entries(config.functions)){
|
|
315
423
|
if (functionConfig.events) {
|
|
316
424
|
for (const event of functionConfig.events){
|
|
317
425
|
if (event.http) {
|
|
318
426
|
const eventPath = event.http.path || '/';
|
|
319
|
-
const eventMethod = event.http.method || 'GET';
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
}
|
|
427
|
+
const eventMethod = (event.http.method || 'GET').toUpperCase();
|
|
428
|
+
const requestMethod = method.toUpperCase();
|
|
429
|
+
console.log(`[Serverless] Checking function ${functionName}: path="${eventPath}", method="${eventMethod}" against pathname="${pathname}", method="${requestMethod}"`);
|
|
323
430
|
// Improved path matching - compare pathname without query string
|
|
324
|
-
|
|
431
|
+
// Normalize paths (remove trailing slashes for comparison)
|
|
432
|
+
const normalizedEventPath = eventPath.replace(/\/$/, '') || '/';
|
|
433
|
+
const normalizedPathname = pathname.replace(/\/$/, '') || '/';
|
|
434
|
+
if (normalizedEventPath === normalizedPathname && eventMethod === requestMethod) {
|
|
325
435
|
matchedFunction = functionName;
|
|
326
|
-
|
|
327
|
-
log(`Matched function: ${matchedFunction}`, 'info', false);
|
|
328
|
-
}
|
|
436
|
+
console.log(`[Serverless] ✓ Matched function: ${matchedFunction}`);
|
|
329
437
|
break;
|
|
330
438
|
}
|
|
331
439
|
}
|
|
@@ -336,15 +444,15 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
336
444
|
}
|
|
337
445
|
}
|
|
338
446
|
} else {
|
|
339
|
-
|
|
340
|
-
log('No functions found in config', 'info', false);
|
|
341
|
-
}
|
|
447
|
+
console.log('[Serverless] No functions found in config');
|
|
342
448
|
}
|
|
343
449
|
if (matchedFunction && config.functions[matchedFunction]) {
|
|
344
450
|
// Resolve handler path relative to output directory
|
|
345
451
|
const handlerPath = config.functions[matchedFunction].handler;
|
|
452
|
+
console.log(`[Serverless] Loading handler: ${handlerPath} from outputDir: ${outputDir}`);
|
|
346
453
|
const handler = await loadHandler(handlerPath, outputDir);
|
|
347
454
|
if (handler) {
|
|
455
|
+
console.log(`[Serverless] Handler loaded successfully, type: ${typeof handler}`);
|
|
348
456
|
const wrappedHandler = captureConsoleLogs(handler, quiet);
|
|
349
457
|
const event = {
|
|
350
458
|
body: req.body,
|
|
@@ -364,7 +472,9 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
364
472
|
memoryLimitInMB: '128'
|
|
365
473
|
};
|
|
366
474
|
try {
|
|
475
|
+
console.log('[Serverless] Calling handler with event:', JSON.stringify(event, null, 2));
|
|
367
476
|
const result = await wrappedHandler(event, context);
|
|
477
|
+
console.log('[Serverless] Handler returned:', JSON.stringify(result, null, 2));
|
|
368
478
|
if (result && typeof result === 'object' && result.statusCode) {
|
|
369
479
|
res.status(result.statusCode);
|
|
370
480
|
if (result.headers) {
|
|
@@ -377,17 +487,23 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
377
487
|
res.json(result);
|
|
378
488
|
}
|
|
379
489
|
} catch (error) {
|
|
490
|
+
console.error('[Serverless] Handler error:', error.message);
|
|
491
|
+
console.error('[Serverless] Handler error stack:', error.stack);
|
|
380
492
|
log(`Handler error: ${error.message}`, 'error', false);
|
|
381
493
|
res.status(500).json({
|
|
382
494
|
error: error.message
|
|
383
495
|
});
|
|
384
496
|
}
|
|
385
497
|
} else {
|
|
498
|
+
console.error(`[Serverless] Handler not found for function: ${matchedFunction}`);
|
|
499
|
+
console.error(`[Serverless] Handler path: ${handlerPath}, Output dir: ${outputDir}`);
|
|
386
500
|
res.status(404).json({
|
|
387
501
|
error: 'Handler not found'
|
|
388
502
|
});
|
|
389
503
|
}
|
|
390
504
|
} else {
|
|
505
|
+
console.error(`[Serverless] Function not found for pathname: ${pathname}, method: ${method}`);
|
|
506
|
+
console.error(`[Serverless] Available functions: ${config.functions ? Object.keys(config.functions).join(', ') : 'none'}`);
|
|
391
507
|
res.status(404).json({
|
|
392
508
|
error: 'Function not found'
|
|
393
509
|
});
|
|
@@ -582,18 +698,41 @@ export const serverless = async (cmd, callback = ()=>({}))=>{
|
|
|
582
698
|
try {
|
|
583
699
|
// Use getPackageDir to handle npm workspaces correctly
|
|
584
700
|
const packageDir = getPackageDir();
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
701
|
+
// Try multiple config file formats
|
|
702
|
+
const configFormats = config ? [
|
|
703
|
+
config
|
|
704
|
+
] : [
|
|
705
|
+
pathResolve(packageDir, 'lex.config.mjs'),
|
|
706
|
+
pathResolve(packageDir, 'lex.config.js'),
|
|
707
|
+
pathResolve(packageDir, 'lex.config.cjs'),
|
|
708
|
+
pathResolve(packageDir, 'lex.config.ts')
|
|
709
|
+
];
|
|
710
|
+
let configPath = null;
|
|
711
|
+
for (const candidatePath of configFormats){
|
|
712
|
+
if (existsSync(candidatePath)) {
|
|
713
|
+
configPath = candidatePath;
|
|
714
|
+
break;
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
if (configPath) {
|
|
718
|
+
log(`Loading serverless config from: ${configPath}`, 'info', quiet);
|
|
588
719
|
const configModule = await import(configPath);
|
|
589
720
|
serverlessConfig = configModule.default?.serverless || configModule.serverless || {};
|
|
590
721
|
log('Serverless config loaded successfully', 'info', quiet);
|
|
591
|
-
|
|
722
|
+
const functionNames = Object.keys(serverlessConfig.functions || {});
|
|
723
|
+
log(`Loaded functions: ${functionNames.length > 0 ? functionNames.join(', ') : 'none'}`, 'info', quiet);
|
|
724
|
+
// Debug: Print full config if debug mode
|
|
725
|
+
if (debug) {
|
|
726
|
+
log(`Full serverless config: ${JSON.stringify(serverlessConfig, null, 2)}`, 'info', false);
|
|
727
|
+
}
|
|
592
728
|
} else {
|
|
593
|
-
log(`No serverless config found
|
|
729
|
+
log(`No serverless config found. Tried: ${configFormats.join(', ')}`, 'warn', quiet);
|
|
594
730
|
}
|
|
595
731
|
} catch (error) {
|
|
596
732
|
log(`Error loading serverless config: ${error.message}`, 'error', quiet);
|
|
733
|
+
if (debug) {
|
|
734
|
+
log(`Config error stack: ${error.stack}`, 'error', false);
|
|
735
|
+
}
|
|
597
736
|
// Don't exit, continue with empty config
|
|
598
737
|
}
|
|
599
738
|
// Merge config with command line options
|
|
@@ -668,4 +807,4 @@ export const serverless = async (cmd, callback = ()=>({}))=>{
|
|
|
668
807
|
}
|
|
669
808
|
};
|
|
670
809
|
|
|
671
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zZXJ2ZXJsZXNzL3NlcnZlcmxlc3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2hvbWVkaXJ9IGZyb20gJ29zJztcbmltcG9ydCB7cmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZSwgam9pbn0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1dlYlNvY2tldFNlcnZlcn0gZnJvbSAnd3MnO1xuXG5pbXBvcnQge0xleENvbmZpZywgZ2V0UGFja2FnZURpcn0gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lciwgcmVtb3ZlRmlsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJsZXNzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBodHRwUG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlbW92ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VQdWJsaWNJcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbiAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpPT4gdm9pZDtcblxuaW50ZXJmYWNlIFB1YmxpY0lwQ2FjaGUge1xuICBpcDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NIYW5kbGVyIHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuICByZWFkb25seSBldmVudHM/OiBBcnJheTx7XG4gICAgcmVhZG9ubHkgaHR0cD86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgICB9O1xuICAgIHJlYWRvbmx5IHdlYnNvY2tldD86IHtcbiAgICAgIHJlYWRvbmx5IHJvdXRlPzogc3RyaW5nO1xuICAgIH07XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgU2VydmVybGVzc0NvbmZpZyB7XG4gIHJlYWRvbmx5IGN1c3RvbT86IHtcbiAgICByZWFkb25seSAnc2VydmVybGVzcy1vZmZsaW5lJz86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xuICAgIH07XG4gIH07XG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IFJlY29yZDxzdHJpbmcsIFNlcnZlcmxlc3NIYW5kbGVyPjtcbn1cblxuY29uc3QgZ2V0Q2FjaGVEaXIgPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgY2FjaGVEaXIgPSBqb2luKGhvbWVkaXIoKSwgJy5sZXgtY2FjaGUnKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVEaXIpKSB7XG4gICAgbWtkaXJTeW5jKGNhY2hlRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gIH1cbiAgcmV0dXJuIGNhY2hlRGlyO1xufTtcblxuY29uc3QgZ2V0Q2FjaGVQYXRoID0gKCk6IHN0cmluZyA9PiBqb2luKGdldENhY2hlRGlyKCksICdwdWJsaWMtaXAuanNvbicpO1xuXG5jb25zdCByZWFkUHVibGljSXBDYWNoZSA9ICgpOiBQdWJsaWNJcENhY2hlIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNhY2hlUGF0aCA9IGdldENhY2hlUGF0aCgpO1xuICBpZighZXhpc3RzU3luYyhjYWNoZVBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGNhY2hlRGF0YSA9IHJlYWRGaWxlU3luYyhjYWNoZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSBKU09OLnBhcnNlKGNhY2hlRGF0YSk7XG5cbiAgICAvLyBDaGVjayBpZiBjYWNoZSBpcyBvbGRlciB0aGFuIDEgd2Vla1xuICAgIGNvbnN0IG9uZVdlZWtNcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGlmKERhdGUubm93KCkgLSBjYWNoZS50aW1lc3RhbXAgPiBvbmVXZWVrTXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZTtcbiAgfSBjYXRjaHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuY29uc3Qgd3JpdGVQdWJsaWNJcENhY2hlID0gKGlwOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgY2FjaGVQYXRoID0gZ2V0Q2FjaGVQYXRoKCk7XG4gIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0ge1xuICAgIGlwLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICB9O1xuICB3cml0ZUZpbGVTeW5jKGNhY2hlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY2FjaGUsIG51bGwsIDIpKTtcbn07XG5cbmNvbnN0IGZldGNoUHVibGljSXAgPSAoZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgaWYoIWZvcmNlUmVmcmVzaCkge1xuICAgIGNvbnN0IGNhY2hlZCA9IHJlYWRQdWJsaWNJcENhY2hlKCk7XG4gICAgaWYoY2FjaGVkKSB7XG4gICAgICByZXNvbHZlKGNhY2hlZC5pcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIGZldGNoIGluc3RlYWQgb2YgaHR0cHNcbiAgZmV0Y2goJ2h0dHBzOi8vYXBpLmlwaWZ5Lm9yZycpXG4gICAgLnRoZW4oKHJlcykgPT4gcmVzLnRleHQoKSlcbiAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgaXAgPSBkYXRhLnRyaW0oKTtcbiAgICAgIGlmKGlwKSB7XG4gICAgICAgIHdyaXRlUHVibGljSXBDYWNoZShpcCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGlwKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpO1xufSk7XG5cbmNvbnN0IGRpc3BsYXlTZXJ2ZXJTdGF0dXMgPSAoXG4gIGh0dHBQb3J0OiBudW1iZXIsXG4gIGh0dHBzUG9ydDogbnVtYmVyLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgaG9zdDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbixcbiAgcHVibGljSXA/OiBzdHJpbmdcbikgPT4ge1xuICBpZihxdWlldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGh0dHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH1gO1xuICBjb25zdCBodHRwc1VybCA9IGBodHRwczovLyR7aG9zdH06JHtodHRwc1BvcnR9YDtcbiAgY29uc3Qgd3NVcmwgPSBgd3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG4gIGNvbnN0IHdzc1VybCA9IGB3c3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG5cbiAgbGV0IHVybExpbmVzID0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFA6Jyl9ICAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cFVybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFBTOicpfSAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cHNVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdXZWJTb2NrZXQ6Jyl9ICR7Y2hhbGsudW5kZXJsaW5lKHdzVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignV1NTOicpfSAgICAgICAke2NoYWxrLnVuZGVybGluZSh3c3NVcmwpfVxcbmA7XG5cbiAgaWYocHVibGljSXApIHtcbiAgICB1cmxMaW5lcyArPSBgXFxuJHtjaGFsay5ncmVlbignUHVibGljOicpfSAgICAke2NoYWxrLnVuZGVybGluZShgaHR0cDovLyR7cHVibGljSXB9OiR7aHR0cFBvcnR9YCl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c0JveCA9IGJveGVuKFxuICAgIGAke2NoYWxrLmN5YW4uYm9sZCgn8J+agCBTZXJ2ZXJsZXNzIERldmVsb3BtZW50IFNlcnZlciBSdW5uaW5nJyl9XFxuXFxuJHt1cmxMaW5lc31cXG5gICtcbiAgICBgJHtjaGFsay55ZWxsb3coJ1ByZXNzIEN0cmwrQyB0byBzdG9wIHRoZSBzZXJ2ZXInKX1gLFxuICAgIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyMxYTFhMWEnLFxuICAgICAgYm9yZGVyQ29sb3I6ICdjeWFuJyxcbiAgICAgIGJvcmRlclN0eWxlOiAncm91bmQnLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgcGFkZGluZzogMVxuICAgIH1cbiAgKTtcblxuICBjb25zb2xlLmxvZyhgXFxuJHtzdGF0dXNCb3h9XFxuYCk7XG59O1xuXG5jb25zdCBsb2FkSGFuZGxlciA9IGFzeW5jIChoYW5kbGVyUGF0aDogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aFJlc29sdmUob3V0cHV0RGlyLCBoYW5kbGVyUGF0aCk7XG4gICAgbG9nKGBMb2FkaW5nIGhhbmRsZXIgZnJvbTogJHtmdWxsUGF0aH1gLCAnaW5mbycsIGZhbHNlKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIYW5kbGVyIGZpbGUgbm90IGZvdW5kOiAke2Z1bGxQYXRofWApO1xuICAgIH1cblxuICAgIC8vIER5bmFtaWMgaW1wb3J0IG9mIHRoZSBoYW5kbGVyIHdpdGggYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoZnVsbFBhdGgpO1xuICAgICAgbG9nKGBIYW5kbGVyIG1vZHVsZSBsb2FkZWQ6ICR7T2JqZWN0LmtleXMoaGFuZGxlck1vZHVsZSl9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyTW9kdWxlLmRlZmF1bHQgfHwgaGFuZGxlck1vZHVsZS5oYW5kbGVyIHx8IGhhbmRsZXJNb2R1bGU7XG4gICAgICBsb2coYEhhbmRsZXIgZm91bmQ6ICR7dHlwZW9mIGhhbmRsZXJ9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgIH0gY2F0Y2goaW1wb3J0RXJyb3IpIHtcbiAgICAgIGxvZyhgSW1wb3J0IGVycm9yIGZvciBoYW5kbGVyICR7aGFuZGxlclBhdGh9OiAke2ltcG9ydEVycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBFcnJvciBsb2FkaW5nIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGNhcHR1cmVDb25zb2xlTG9ncyA9IChoYW5kbGVyOiAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KT0+IFByb21pc2U8YW55PiwgcXVpZXQ6IGJvb2xlYW4pID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm4gaGFuZGxlcjtcbiAgfVxuXG4gIHJldHVybiBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgLy8gQ2FwdHVyZSBjb25zb2xlLmxvZywgY29uc29sZS5lcnJvciwgZXRjLlxuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVXYXJuID0gY29uc29sZS53YXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUluZm8gPSBjb25zb2xlLmluZm87XG5cbiAgICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc29sZS5sb2cgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0xPR10gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbRVJST1JdICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVFcnJvciguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS53YXJuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtXQVJOXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlV2FybiguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtJTkZPXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlSW5mbyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAvLyBPdXRwdXQgY2FwdHVyZWQgbG9nc1xuICAgICAgaWYobG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJy0tLSBIYW5kbGVyIENvbnNvbGUgT3V0cHV0IC0tLScpKTtcbiAgICAgICAgbG9ncy5mb3JFYWNoKChsb2cpID0+IGNvbnNvbGUubG9nKGNoYWxrLmdyYXkobG9nKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCctLS0gRW5kIEhhbmRsZXIgQ29uc29sZSBPdXRwdXQgLS0tJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGNvbnNvbGUgbWV0aG9kc1xuICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICBjb25zb2xlLmVycm9yID0gb3JpZ2luYWxDb25zb2xlRXJyb3I7XG4gICAgICBjb25zb2xlLndhcm4gPSBvcmlnaW5hbENvbnNvbGVXYXJuO1xuICAgICAgY29uc29sZS5pbmZvID0gb3JpZ2luYWxDb25zb2xlSW5mbztcbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBjcmVhdGVFeHByZXNzU2VydmVyID0gYXN5bmMgKFxuICBjb25maWc6IFNlcnZlcmxlc3NDb25maWcsXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICBodHRwUG9ydDogbnVtYmVyLFxuICBob3N0OiBzdHJpbmcsXG4gIHF1aWV0OiBib29sZWFuLFxuICBkZWJ1ZzogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAvLyBFbmFibGUgQ09SU1xuICBhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsICcqJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcycsICdHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBQQVRDSCwgT1BUSU9OUycpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnLCAnKicpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJywgJ3RydWUnKTtcblxuICAgIGlmKHJlcS5tZXRob2QgPT09ICdPUFRJT05TJykge1xuICAgICAgcmVzLnNlbmRTdGF0dXMoMjAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUGFyc2UgSlNPTiBib2RpZXNcbiAgYXBwLnVzZShleHByZXNzLmpzb24oKSk7XG5cbiAgLy8gTG9hZCBHcmFwaFFMIGhhbmRsZXJcbiAgY29uc3QgbG9hZEdyYXBoUUxTY2hlbWEgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBmaW5kIGEgR3JhcGhRTCBoYW5kbGVyXG4gICAgICBsZXQgZ3JhcGhxbEhhbmRsZXIgPSBudWxsO1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCAmJiBldmVudC5odHRwLnBhdGgpIHtcbiAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBHcmFwaFFMIGVuZHBvaW50c1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHAucGF0aCA9PT0gJy9wdWJsaWMnIHx8IGV2ZW50Lmh0dHAucGF0aCA9PT0gJy9ncmFwaHFsJykge1xuICAgICAgICAgICAgICAgICAgZ3JhcGhxbEhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihmdW5jdGlvbkNvbmZpZy5oYW5kbGVyLCBvdXRwdXREaXIpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgICAgbG9nKCdGb3VuZCBHcmFwaFFMIGhhbmRsZXInLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgcmV0dXJuIGdyYXBocWxIYW5kbGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgbG9nKGBFcnJvciBsb2FkaW5nIEdyYXBoUUwgaGFuZGxlcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvLyBTZXQgdXAgR3JhcGhRTCBoYW5kbGVyIGZvciBHcmFwaFFMIHJlcXVlc3RzXG4gIHRyeSB7XG4gICAgY29uc3QgZ3JhcGhxbEhhbmRsZXIgPSBhd2FpdCBsb2FkR3JhcGhRTFNjaGVtYSgpO1xuICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAvLyBGaW5kIHRoZSBHcmFwaFFMIHBhdGggZnJvbSB0aGUgc2VydmVybGVzcyBjb25maWdcbiAgICAgIGxldCBncmFwaHFsUGF0aCA9ICcvZ3JhcGhxbCc7IC8vIGRlZmF1bHQgZmFsbGJhY2tcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBmb3IoY29uc3QgW19mdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuZnVuY3Rpb25zKSkge1xuICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBpZihldmVudD8uaHR0cD8ucGF0aCkge1xuICAgICAgICAgICAgICAgIGdyYXBocWxQYXRoID0gZXZlbnQuaHR0cC5wYXRoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGdyYXBocWxQYXRoICE9PSAnL2dyYXBocWwnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHVwIEdyYXBoUUwgZW5kcG9pbnQgd2l0aCBlbmhhbmNlZCBjb25zb2xlLmxvZyBjYXB0dXJlXG4gICAgICBhcHAudXNlKGdyYXBocWxQYXRoLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgLy8gR3JhcGhRTCBEZWJ1ZyBMb2dnaW5nXG4gICAgICAgIGlmKGRlYnVnICYmIHJlcS5ib2R5ICYmIHJlcS5ib2R5LnF1ZXJ5KSB7XG4gICAgICAgICAgbG9nKCfwn5SNIEdyYXBoUUwgRGVidWcgTW9kZTogQW5hbHl6aW5nIHJlcXVlc3QuLi4nLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBsb2coYPCfk50gR3JhcGhRTCBRdWVyeTogJHtyZXEuYm9keS5xdWVyeX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBpZihyZXEuYm9keS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGxvZyhg8J+TiiBHcmFwaFFMIFZhcmlhYmxlczogJHtKU09OLnN0cmluZ2lmeShyZXEuYm9keS52YXJpYWJsZXMsIG51bGwsIDIpfWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihyZXEuYm9keS5vcGVyYXRpb25OYW1lKSB7XG4gICAgICAgICAgICBsb2coYPCfj7fvuI8gIEdyYXBoUUwgT3BlcmF0aW9uOiAke3JlcS5ib2R5Lm9wZXJhdGlvbk5hbWV9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5oYW5jZWQgY29uc29sZS5sb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgY29uc3QgbG9nczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjb25zb2xlLmxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9nTWVzc2FnZSA9IGFyZ3MubWFwKChhcmcpID0+XG4gICAgICAgICAgICAodHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIDIpIDogU3RyaW5nKGFyZykpXG4gICAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgICAgbG9ncy5wdXNoKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyhgW0dyYXBoUUxdICR7bG9nTWVzc2FnZX1gKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDcmVhdGUgY29udGV4dCBmb3IgdGhlIGhhbmRsZXJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ2dyYXBocWwnLFxuICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogJyRMQVRFU1QnLFxuICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiAnYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpncmFwaHFsJyxcbiAgICAgICAgICBsb2dHcm91cE5hbWU6ICcvYXdzL2xhbWJkYS9ncmFwaHFsJyxcbiAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICByZXEsXG4gICAgICAgICAgcmVzXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gV3JhcCBoYW5kbGVyIHdpdGggY29uc29sZSBsb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhncmFwaHFsSGFuZGxlciwgcXVpZXQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGUgaGFuZGxlciB3aXRoIEdyYXBoUUwgcGFyYW1ldGVyc1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBwZWRIYW5kbGVyKHtcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcS5ib2R5KSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgICAgICAgaHR0cE1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgcGF0aDogZ3JhcGhxbFBhdGgsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHt9XG4gICAgICAgICAgfSwgY29udGV4dCk7XG5cbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgdGhlIHJlc3VsdFxuICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICBpZihyZXN1bHQuaGVhZGVycykge1xuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICAgICAgbG9nKGBHcmFwaFFMIGhhbmRsZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsb2coYEdyYXBoUUwgZW5kcG9pbnQgYXZhaWxhYmxlIGF0IGh0dHA6Ly8ke2hvc3R9OiR7aHR0cFBvcnR9JHtncmFwaHFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIHNldHRpbmcgdXAgR3JhcGhRTDogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIGZvciBub24tR3JhcGhRTCByb3V0ZXMgLSBoYW5kbGUgYWxsIHJlbWFpbmluZyByb3V0ZXNcbiAgYXBwLnVzZSgnLycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSByZXEudXJsIHx8ICcvJztcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2QgfHwgJ0dFVCc7XG4gICAgICBjb25zdCBwYXRobmFtZSA9IHJlcS5wYXRoIHx8IHVybC5zcGxpdCgnPycpWzBdOyAvLyBFeHRyYWN0IHBhdGhuYW1lIHdpdGhvdXQgcXVlcnkgc3RyaW5nXG5cbiAgICAgIGxvZyhgJHttZXRob2R9ICR7dXJsfSAocGF0aG5hbWU6ICR7cGF0aG5hbWV9KWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICAvLyBGaW5kIG1hdGNoaW5nIGZ1bmN0aW9uXG4gICAgICBsZXQgbWF0Y2hlZEZ1bmN0aW9uID0gbnVsbDtcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZyhgQXZhaWxhYmxlIGZ1bmN0aW9uczogJHtPYmplY3Qua2V5cyhjb25maWcuZnVuY3Rpb25zKS5qb2luKCcsICcpfWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGF0aCA9IGV2ZW50Lmh0dHAucGF0aCB8fCAnLyc7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRNZXRob2QgPSBldmVudC5odHRwLm1ldGhvZCB8fCAnR0VUJztcblxuICAgICAgICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICBsb2coYENoZWNraW5nIGZ1bmN0aW9uICR7ZnVuY3Rpb25OYW1lfTogcGF0aD0ke2V2ZW50UGF0aH0sIG1ldGhvZD0ke2V2ZW50TWV0aG9kfSBhZ2FpbnN0IHBhdGhuYW1lPSR7cGF0aG5hbWV9LCBtZXRob2Q9JHttZXRob2R9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSW1wcm92ZWQgcGF0aCBtYXRjaGluZyAtIGNvbXBhcmUgcGF0aG5hbWUgd2l0aG91dCBxdWVyeSBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZihldmVudFBhdGggJiYgZXZlbnRQYXRoID09PSBwYXRobmFtZSAmJiBldmVudE1ldGhvZCA9PT0gbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICBsb2coYE1hdGNoZWQgZnVuY3Rpb246ICR7bWF0Y2hlZEZ1bmN0aW9ufWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZygnTm8gZnVuY3Rpb25zIGZvdW5kIGluIGNvbmZpZycsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbiAmJiBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0pIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBoYW5kbGVyIHBhdGggcmVsYXRpdmUgdG8gb3V0cHV0IGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBoYW5kbGVyUGF0aCA9IGNvbmZpZy5mdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXS5oYW5kbGVyO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoaGFuZGxlclBhdGgsIG91dHB1dERpcik7XG5cbiAgICAgICAgaWYoaGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGhhbmRsZXIsIHF1aWV0KTtcblxuICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAgYm9keTogcmVxLmJvZHksXG4gICAgICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycyxcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHBhdGg6IHVybCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyczogcmVxLnF1ZXJ5XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBtYXRjaGVkRnVuY3Rpb24sXG4gICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgbG9nU3RyZWFtTmFtZTogJ3Rlc3QtbG9nLXN0cmVhbScsXG4gICAgICAgICAgICBtZW1vcnlMaW1pdEluTUI6ICcxMjgnXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3cmFwcGVkSGFuZGxlcihldmVudCwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXNDb2RlKTtcbiAgICAgICAgICAgICAgaWYocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzLnNlbmQocmVzdWx0LmJvZHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coYEhhbmRsZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtlcnJvcjogJ0Z1bmN0aW9uIG5vdCBmb3VuZCd9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYFJvdXRlIGhhbmRsaW5nIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXBwO1xufTtcblxuY29uc3QgY3JlYXRlV2ViU29ja2V0U2VydmVyID0gKFxuICBjb25maWc6IFNlcnZlcmxlc3NDb25maWcsXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIGRlYnVnOiBib29sZWFuXG4pID0+IHtcbiAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7cG9ydDogd3NQb3J0fSk7XG5cbiAgd3NzLm9uKCdjb25uZWN0aW9uJywgYXN5bmMgKHdzLCByZXEpID0+IHtcbiAgICBsb2coYFdlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkOiAke3JlcS51cmx9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICB3cy5vbignbWVzc2FnZScsIGFzeW5jIChtZXNzYWdlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIC8vIEZpbmQgbWF0Y2hpbmcgV2ViU29ja2V0IGZ1bmN0aW9uXG4gICAgICAgIGxldCBtYXRjaGVkRnVuY3Rpb24gPSBudWxsO1xuXG4gICAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50LndlYnNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSBldmVudC53ZWJzb2NrZXQucm91dGUgfHwgJyRjb25uZWN0JztcbiAgICAgICAgICAgICAgICAgIGlmKHJvdXRlID09PSAnJGRlZmF1bHQnIHx8IHJvdXRlID09PSBkYXRhLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbiAmJiBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0pIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dLmhhbmRsZXIsIG91dHB1dERpcik7XG5cbiAgICAgICAgICBpZihoYW5kbGVyKSB7XG4gICAgICAgICAgICAvLyBXcmFwIGhhbmRsZXIgd2l0aCBjb25zb2xlIGxvZyBjYXB0dXJlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhoYW5kbGVyLCBxdWlldCk7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgICAgYm9keTogZGF0YS5ib2R5IHx8IG51bGwsXG4gICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGB3czovL2xvY2FsaG9zdDoke3dzUG9ydH1gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6ICd0ZXN0LWNvbm5lY3Rpb24taWQnLFxuICAgICAgICAgICAgICAgIHJvdXRlS2V5OiBkYXRhLmFjdGlvbiB8fCAnJGRlZmF1bHQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiAoKSA9PiAzMDAwMCxcbiAgICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGUgTGFtYmRhIHJlc3BvbnNlIGZvcm1hdCBmb3IgV2ViU29ja2V0XG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIExhbWJkYSByZXNwb25zZSBvYmplY3QsIGV4dHJhY3QgdGhlIGJvZHlcbiAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHJlc3VsdC5ib2R5IHx8ICcnO1xuICAgICAgICAgICAgICB3cy5zZW5kKGJvZHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRpcmVjdCByZXNwb25zZSwgc3RyaW5naWZ5IGl0XG4gICAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogJ1dlYlNvY2tldCBmdW5jdGlvbiBub3QgZm91bmQnfSkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxvZyhgV2ViU29ja2V0IGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogZXJyb3IubWVzc2FnZX0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIGxvZygnV2ViU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkJywgJ2luZm8nLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB3c3M7XG59O1xuXG5jb25zdCBsb2FkRW52RmlsZSA9IChlbnZQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGlmKCFleGlzdHNTeW5jKGVudlBhdGgpKSB7XG4gICAgcmV0dXJuIGVudlZhcnM7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGVudkNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGVudkNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG5cbiAgICAgIC8vIFNraXAgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzXG4gICAgICBpZighdHJpbW1lZExpbmUgfHwgdHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBLRVk9dmFsdWUgZm9ybWF0XG4gICAgICBjb25zdCBlcXVhbEluZGV4ID0gdHJpbW1lZExpbmUuaW5kZXhPZignPScpO1xuICAgICAgaWYoZXF1YWxJbmRleCA+IDApIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc3Vic3RyaW5nKDAsIGVxdWFsSW5kZXgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0cmltbWVkTGluZS5zdWJzdHJpbmcoZXF1YWxJbmRleCArIDEpLnRyaW0oKTtcblxuICAgICAgICAvLyBSZW1vdmUgcXVvdGVzIGlmIHByZXNlbnRcbiAgICAgICAgY29uc3QgY2xlYW5WYWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpO1xuXG4gICAgICAgIGlmKGtleSkge1xuICAgICAgICAgIGVudlZhcnNba2V5XSA9IGNsZWFuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFdhcm5pbmc6IENvdWxkIG5vdCBsb2FkIC5lbnYgZmlsZSBhdCAke2VudlBhdGh9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ3dhcm4nLCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gZW52VmFycztcbn07XG5cbmV4cG9ydCBjb25zdCBzZXJ2ZXJsZXNzID0gYXN5bmMgKFxuICBjbWQ6IFNlcnZlcmxlc3NPcHRpb25zLFxuICBjYWxsYmFjazogU2VydmVybGVzc0NhbGxiYWNrID0gKCkgPT4gKHt9KVxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge1xuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBjb25maWcsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICBob3N0ID0gJ2xvY2FsaG9zdCcsXG4gICAgaHR0cFBvcnQgPSA1MDAwLFxuICAgIGh0dHBzUG9ydCA9IDUwMDEsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICByZW1vdmUgPSBmYWxzZSxcbiAgICB0ZXN0ID0gZmFsc2UsXG4gICAgdXNlUHVibGljSXAsXG4gICAgdmFyaWFibGVzLFxuICAgIHdzUG9ydCA9IDUwMDJcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IHN0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG5cbiAgY29uc3Qge291dHB1dEZ1bGxQYXRofSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgLy8gTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAuZW52IGZpbGVzXG4gIGNvbnN0IGVudlBhdGhzID0gW1xuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52JyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYubG9jYWwnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5kZXZlbG9wbWVudCcpXG4gIF07XG5cbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAvLyBMb2FkIGZyb20gLmVudiBmaWxlcyBpbiBvcmRlciAobGF0ZXIgZmlsZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzKVxuICBmb3IoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGZpbGVFbnZWYXJzID0gbG9hZEVudkZpbGUoZW52UGF0aCk7XG4gICAgaWYoT2JqZWN0LmtleXMoZmlsZUVudlZhcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZyhgTG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tOiAke2VudlBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICAgIGVudlZhcnMgPSB7Li4uZW52VmFycywgLi4uZmlsZUVudlZhcnN9O1xuICB9XG5cbiAgLy8gU3RhcnQgd2l0aCBkZWZhdWx0IE5PREVfRU5WIGFuZCBsb2FkZWQgLmVudiB2YXJpYWJsZXNcbiAgbGV0IHZhcmlhYmxlc09iajogb2JqZWN0ID0ge05PREVfRU5WOiAnZGV2ZWxvcG1lbnQnLCAuLi5lbnZWYXJzfTtcblxuICAvLyBPdmVycmlkZSB3aXRoIGNvbW1hbmQgbGluZSB2YXJpYWJsZXMgaWYgcHJvdmlkZWRcbiAgaWYodmFyaWFibGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaVZhcnMgPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgICB2YXJpYWJsZXNPYmogPSB7Li4udmFyaWFibGVzT2JqLCAuLi5jbGlWYXJzfTtcbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3B0aW9uIGlzIG5vdCBhIHZhbGlkIEpTT04gb2JqZWN0LmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzcy5lbnYgPSB7Li4ucHJvY2Vzcy5lbnYsIC4uLnZhcmlhYmxlc09ian07XG5cbiAgLy8gSWYgaW4gdGVzdCBtb2RlLCBleGl0IGVhcmx5IGFmdGVyIGxvYWRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gIGlmKHRlc3QpIHtcbiAgICBsb2coJ1Rlc3QgbW9kZTogRW52aXJvbm1lbnQgdmFyaWFibGVzIGxvYWRlZCwgZXhpdGluZycsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQ2xlYW5pbmcgb3V0cHV0IGRpcmVjdG9yeS4uLicpO1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKG91dHB1dEZ1bGxQYXRoIHx8ICcnKTtcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBjbGVhbmVkIG91dHB1dCBkaXJlY3RvcnkhJyk7XG4gIH1cblxuICAvLyBMb2FkIHNlcnZlcmxlc3MgY29uZmlndXJhdGlvblxuICBsZXQgc2VydmVybGVzc0NvbmZpZzogU2VydmVybGVzc0NvbmZpZyA9IHt9O1xuXG4gIHRyeSB7XG4gICAgLy8gVXNlIGdldFBhY2thZ2VEaXIgdG8gaGFuZGxlIG5wbSB3b3Jrc3BhY2VzIGNvcnJlY3RseVxuICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBnZXRQYWNrYWdlRGlyKCk7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGNvbmZpZyB8fCBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCAnbGV4LmNvbmZpZy5tanMnKTtcbiAgICBsb2coYExvYWRpbmcgc2VydmVybGVzcyBjb25maWcgZnJvbTogJHtjb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgaWYoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgY29uc3QgY29uZmlnTW9kdWxlID0gYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpO1xuICAgICAgc2VydmVybGVzc0NvbmZpZyA9IGNvbmZpZ01vZHVsZS5kZWZhdWx0Py5zZXJ2ZXJsZXNzIHx8IGNvbmZpZ01vZHVsZS5zZXJ2ZXJsZXNzIHx8IHt9O1xuICAgICAgbG9nKCdTZXJ2ZXJsZXNzIGNvbmZpZyBsb2FkZWQgc3VjY2Vzc2Z1bGx5JywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBsb2coYExvYWRlZCBmdW5jdGlvbnM6ICR7T2JqZWN0LmtleXMoc2VydmVybGVzc0NvbmZpZy5mdW5jdGlvbnMgfHwge30pLmpvaW4oJywgJyl9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgTm8gc2VydmVybGVzcyBjb25maWcgZm91bmQgYXQgJHtjb25maWdQYXRofSwgdXNpbmcgZGVmYXVsdHNgLCAnd2FybicsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIGxvYWRpbmcgc2VydmVybGVzcyBjb25maWc6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgLy8gRG9uJ3QgZXhpdCwgY29udGludWUgd2l0aCBlbXB0eSBjb25maWdcbiAgfVxuXG4gIC8vIE1lcmdlIGNvbmZpZyB3aXRoIGNvbW1hbmQgbGluZSBvcHRpb25zXG4gIGNvbnN0IGZpbmFsQ29uZmlnOiBTZXJ2ZXJsZXNzQ29uZmlnID0ge1xuICAgIC4uLnNlcnZlcmxlc3NDb25maWcsXG4gICAgY3VzdG9tOiB7XG4gICAgICAnc2VydmVybGVzcy1vZmZsaW5lJzoge1xuICAgICAgICBjb3JzOiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uY29ycyAhPT0gZmFsc2UsXG4gICAgICAgIGhvc3Q6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5ob3N0IHx8IGhvc3QsXG4gICAgICAgIGh0dHBQb3J0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uaHR0cFBvcnQgfHwgaHR0cFBvcnQsXG4gICAgICAgIGh0dHBzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/Lmh0dHBzUG9ydCB8fCBodHRwc1BvcnQsXG4gICAgICAgIHdzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/LndzUG9ydCB8fCB3c1BvcnRcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb3V0cHV0RGlyID0gb3V0cHV0RnVsbFBhdGggfHwgJ2xpYic7XG4gIGxvZyhgVXNpbmcgb3V0cHV0IGRpcmVjdG9yeTogJHtvdXRwdXREaXJ9YCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KCdTdGFydGluZyBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4uLicpO1xuXG4gICAgY29uc3QgaHR0cFBvcnQgPSBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaHR0cFBvcnQhO1xuICAgIGNvbnN0IHdzUG9ydCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS53c1BvcnQhO1xuICAgIGNvbnN0IGhvc3QgPSBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaG9zdCE7XG5cbiAgICBsb2coYENyZWF0aW5nIEhUVFAgc2VydmVyIG9uICR7aG9zdH06JHtodHRwUG9ydH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICBsb2coYENyZWF0aW5nIFdlYlNvY2tldCBzZXJ2ZXIgb24gcG9ydCAke3dzUG9ydH1gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgIC8vIENyZWF0ZSBFeHByZXNzIHNlcnZlclxuICAgIGNvbnN0IGV4cHJlc3NBcHAgPSBhd2FpdCBjcmVhdGVFeHByZXNzU2VydmVyKFxuICAgICAgZmluYWxDb25maWcsXG4gICAgICBvdXRwdXREaXIsXG4gICAgICBodHRwUG9ydCxcbiAgICAgIGhvc3QsXG4gICAgICBxdWlldCxcbiAgICAgIGRlYnVnXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBXZWJTb2NrZXQgc2VydmVyXG4gICAgY29uc3Qgd3NTZXJ2ZXIgPSBjcmVhdGVXZWJTb2NrZXRTZXJ2ZXIoXG4gICAgICBmaW5hbENvbmZpZyxcbiAgICAgIG91dHB1dERpcixcbiAgICAgIHdzUG9ydCxcbiAgICAgIHF1aWV0LFxuICAgICAgZGVidWdcbiAgICApO1xuXG4gICAgLy8gSGFuZGxlIHNlcnZlciBlcnJvcnNcbiAgICB3c1NlcnZlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZyhgV2ViU29ja2V0IHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IFdlYlNvY2tldCBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0IEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3Qgc2VydmVyID0gZXhwcmVzc0FwcC5saXN0ZW4oaHR0cFBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgc3RhcnRlZC4nKTtcblxuICAgICAgZGlzcGxheVNlcnZlclN0YXR1cyhcbiAgICAgICAgaHR0cFBvcnQsXG4gICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICB3c1BvcnQsXG4gICAgICAgIGhvc3QsXG4gICAgICAgIHF1aWV0XG4gICAgICApO1xuXG4gICAgICBmZXRjaFB1YmxpY0lwKHVzZVB1YmxpY0lwKS50aGVuKChwdWJsaWNJcCkgPT4ge1xuICAgICAgICBpZihwdWJsaWNJcCkge1xuICAgICAgICAgIGRpc3BsYXlTZXJ2ZXJTdGF0dXMoXG4gICAgICAgICAgICBodHRwUG9ydCxcbiAgICAgICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICAgICAgd3NQb3J0LFxuICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgIHF1aWV0LFxuICAgICAgICAgICAgcHVibGljSXBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBFeHByZXNzIHNlcnZlciBlcnJvcnNcbiAgICBzZXJ2ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBsb2coYEV4cHJlc3Mgc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgRXhwcmVzcyBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBncmFjZWZ1bCBzaHV0ZG93blxuICAgIGNvbnN0IHNodXRkb3duID0gKCkgPT4ge1xuICAgICAgbG9nKCdcXG5TaHV0dGluZyBkb3duIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIHdzU2VydmVyLmNsb3NlKCk7XG4gICAgICBjYWxsYmFjaygwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbignU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG5cbiAgICAvLyBLZWVwIHRoZSBwcm9jZXNzIGFsaXZlXG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcblxuICAgIGxvZygnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgaXMgcnVubmluZy4gUHJlc3MgQ3RybCtDIHRvIHN0b3AuJywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAvLyBEb24ndCBjYWxsIGNhbGxiYWNrIGhlcmUsIGxldCB0aGUgcHJvY2VzcyBzdGF5IGFsaXZlXG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuJyk7XG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07Il0sIm5hbWVzIjpbImJveGVuIiwiY2hhbGsiLCJleHByZXNzIiwicmVhZEZpbGVTeW5jIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsIndyaXRlRmlsZVN5bmMiLCJob21lZGlyIiwicmVzb2x2ZSIsInBhdGhSZXNvbHZlIiwiam9pbiIsIldlYlNvY2tldFNlcnZlciIsIkxleENvbmZpZyIsImdldFBhY2thZ2VEaXIiLCJjcmVhdGVTcGlubmVyIiwicmVtb3ZlRmlsZXMiLCJsb2ciLCJnZXRDYWNoZURpciIsImNhY2hlRGlyIiwicmVjdXJzaXZlIiwiZ2V0Q2FjaGVQYXRoIiwicmVhZFB1YmxpY0lwQ2FjaGUiLCJjYWNoZVBhdGgiLCJjYWNoZURhdGEiLCJjYWNoZSIsIkpTT04iLCJwYXJzZSIsIm9uZVdlZWtNcyIsIkRhdGUiLCJub3ciLCJ0aW1lc3RhbXAiLCJ3cml0ZVB1YmxpY0lwQ2FjaGUiLCJpcCIsInN0cmluZ2lmeSIsImZldGNoUHVibGljSXAiLCJmb3JjZVJlZnJlc2giLCJQcm9taXNlIiwiY2FjaGVkIiwiZmV0Y2giLCJ0aGVuIiwicmVzIiwidGV4dCIsImRhdGEiLCJ0cmltIiwiY2F0Y2giLCJ1bmRlZmluZWQiLCJkaXNwbGF5U2VydmVyU3RhdHVzIiwiaHR0cFBvcnQiLCJodHRwc1BvcnQiLCJ3c1BvcnQiLCJob3N0IiwicXVpZXQiLCJwdWJsaWNJcCIsImh0dHBVcmwiLCJodHRwc1VybCIsIndzVXJsIiwid3NzVXJsIiwidXJsTGluZXMiLCJncmVlbiIsInVuZGVybGluZSIsInN0YXR1c0JveCIsImN5YW4iLCJib2xkIiwieWVsbG93IiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJTdHlsZSIsIm1hcmdpbiIsInBhZGRpbmciLCJjb25zb2xlIiwibG9hZEhhbmRsZXIiLCJoYW5kbGVyUGF0aCIsIm91dHB1dERpciIsImZ1bGxQYXRoIiwiRXJyb3IiLCJoYW5kbGVyTW9kdWxlIiwiT2JqZWN0Iiwia2V5cyIsImhhbmRsZXIiLCJkZWZhdWx0IiwiaW1wb3J0RXJyb3IiLCJtZXNzYWdlIiwiZXJyb3IiLCJjYXB0dXJlQ29uc29sZUxvZ3MiLCJldmVudCIsImNvbnRleHQiLCJvcmlnaW5hbENvbnNvbGVMb2ciLCJvcmlnaW5hbENvbnNvbGVFcnJvciIsIm9yaWdpbmFsQ29uc29sZVdhcm4iLCJ3YXJuIiwib3JpZ2luYWxDb25zb2xlSW5mbyIsImluZm8iLCJsb2dzIiwiYXJncyIsInB1c2giLCJyZXN1bHQiLCJsZW5ndGgiLCJncmF5IiwiZm9yRWFjaCIsImNyZWF0ZUV4cHJlc3NTZXJ2ZXIiLCJjb25maWciLCJkZWJ1ZyIsImFwcCIsInVzZSIsInJlcSIsIm5leHQiLCJoZWFkZXIiLCJtZXRob2QiLCJzZW5kU3RhdHVzIiwianNvbiIsImxvYWRHcmFwaFFMU2NoZW1hIiwiZ3JhcGhxbEhhbmRsZXIiLCJmdW5jdGlvbnMiLCJmdW5jdGlvbk5hbWUiLCJmdW5jdGlvbkNvbmZpZyIsImVudHJpZXMiLCJldmVudHMiLCJodHRwIiwicGF0aCIsImdyYXBocWxQYXRoIiwiX2Z1bmN0aW9uTmFtZSIsImJvZHkiLCJxdWVyeSIsInZhcmlhYmxlcyIsIm9wZXJhdGlvbk5hbWUiLCJsb2dNZXNzYWdlIiwibWFwIiwiYXJnIiwiU3RyaW5nIiwiYXdzUmVxdWVzdElkIiwiZnVuY3Rpb25WZXJzaW9uIiwiZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzIiwiaW52b2tlZEZ1bmN0aW9uQXJuIiwibG9nR3JvdXBOYW1lIiwibG9nU3RyZWFtTmFtZSIsIndyYXBwZWRIYW5kbGVyIiwiaGVhZGVycyIsImh0dHBNZXRob2QiLCJxdWVyeVN0cmluZ1BhcmFtZXRlcnMiLCJzdGF0dXNDb2RlIiwic3RhdHVzIiwia2V5IiwidmFsdWUiLCJzZXRIZWFkZXIiLCJzZW5kIiwidXJsIiwicGF0aG5hbWUiLCJzcGxpdCIsIm1hdGNoZWRGdW5jdGlvbiIsImV2ZW50UGF0aCIsImV2ZW50TWV0aG9kIiwibWVtb3J5TGltaXRJbk1CIiwiY3JlYXRlV2ViU29ja2V0U2VydmVyIiwid3NzIiwicG9ydCIsIm9uIiwid3MiLCJ0b1N0cmluZyIsIndlYnNvY2tldCIsInJvdXRlIiwiYWN0aW9uIiwicmVxdWVzdENvbnRleHQiLCJhcGlHYXRld2F5IiwiZW5kcG9pbnQiLCJjb25uZWN0aW9uSWQiLCJyb3V0ZUtleSIsImxvYWRFbnZGaWxlIiwiZW52UGF0aCIsImVudlZhcnMiLCJlbnZDb250ZW50IiwibGluZXMiLCJsaW5lIiwidHJpbW1lZExpbmUiLCJzdGFydHNXaXRoIiwiZXF1YWxJbmRleCIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJjbGVhblZhbHVlIiwicmVwbGFjZSIsInNlcnZlcmxlc3MiLCJjbWQiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJyZW1vdmUiLCJ0ZXN0IiwidXNlUHVibGljSXAiLCJzcGlubmVyIiwicGFyc2VDb25maWciLCJvdXRwdXRGdWxsUGF0aCIsImVudlBhdGhzIiwicHJvY2VzcyIsImN3ZCIsImZpbGVFbnZWYXJzIiwidmFyaWFibGVzT2JqIiwiTk9ERV9FTlYiLCJjbGlWYXJzIiwiX2Vycm9yIiwiZW52Iiwic3RhcnQiLCJzdWNjZWVkIiwic2VydmVybGVzc0NvbmZpZyIsInBhY2thZ2VEaXIiLCJjb25maWdQYXRoIiwiY29uZmlnTW9kdWxlIiwiZmluYWxDb25maWciLCJjdXN0b20iLCJjb3JzIiwiZXhwcmVzc0FwcCIsIndzU2VydmVyIiwiZmFpbCIsInNlcnZlciIsImxpc3RlbiIsInNodXRkb3duIiwiY2xvc2UiLCJzdGRpbiIsInJlc3VtZSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsT0FBT0EsV0FBVyxRQUFRO0FBQzFCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixPQUFPQyxhQUFhLFVBQVU7QUFDOUIsU0FBUUMsWUFBWSxFQUFFQyxVQUFVLEVBQUVDLFNBQVMsRUFBRUMsYUFBYSxRQUFPLEtBQUs7QUFDdEUsU0FBUUMsT0FBTyxRQUFPLEtBQUs7QUFDM0IsU0FBUUMsV0FBV0MsV0FBVyxFQUFFQyxJQUFJLFFBQU8sT0FBTztBQUNsRCxTQUFRQyxlQUFlLFFBQU8sS0FBSztBQUVuQyxTQUFRQyxTQUFTLEVBQUVDLGFBQWEsUUFBTyxxQkFBcUI7QUFDNUQsU0FBUUMsYUFBYSxFQUFFQyxXQUFXLFFBQU8scUJBQXFCO0FBQzlELFNBQVFDLEdBQUcsUUFBTyxxQkFBcUI7QUFtRHZDLE1BQU1DLGNBQWM7SUFDbEIsTUFBTUMsV0FBV1IsS0FBS0gsV0FBVztJQUNqQyxJQUFHLENBQUNILFdBQVdjLFdBQVc7UUFDeEJiLFVBQVVhLFVBQVU7WUFBQ0MsV0FBVztRQUFJO0lBQ3RDO0lBQ0EsT0FBT0Q7QUFDVDtBQUVBLE1BQU1FLGVBQWUsSUFBY1YsS0FBS08sZUFBZTtBQUV2RCxNQUFNSSxvQkFBb0I7SUFDeEIsTUFBTUMsWUFBWUY7SUFDbEIsSUFBRyxDQUFDaEIsV0FBV2tCLFlBQVk7UUFDekIsT0FBTztJ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
|
|
810
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zZXJ2ZXJsZXNzL3NlcnZlcmxlc3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2hvbWVkaXJ9IGZyb20gJ29zJztcbmltcG9ydCB7cmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZSwgam9pbiwgaXNBYnNvbHV0ZX0gZnJvbSAncGF0aCc7XG5pbXBvcnQge3BhdGhUb0ZpbGVVUkx9IGZyb20gJ3VybCc7XG5pbXBvcnQge1dlYlNvY2tldFNlcnZlcn0gZnJvbSAnd3MnO1xuXG5pbXBvcnQge0xleENvbmZpZywgZ2V0UGFja2FnZURpcn0gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lciwgcmVtb3ZlRmlsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJsZXNzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBodHRwUG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlbW92ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VQdWJsaWNJcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbiAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpPT4gdm9pZDtcblxuaW50ZXJmYWNlIFB1YmxpY0lwQ2FjaGUge1xuICBpcDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NIYW5kbGVyIHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuICByZWFkb25seSBldmVudHM/OiBBcnJheTx7XG4gICAgcmVhZG9ubHkgaHR0cD86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgICB9O1xuICAgIHJlYWRvbmx5IHdlYnNvY2tldD86IHtcbiAgICAgIHJlYWRvbmx5IHJvdXRlPzogc3RyaW5nO1xuICAgIH07XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgU2VydmVybGVzc0NvbmZpZyB7XG4gIHJlYWRvbmx5IGN1c3RvbT86IHtcbiAgICByZWFkb25seSAnc2VydmVybGVzcy1vZmZsaW5lJz86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xuICAgIH07XG4gIH07XG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IFJlY29yZDxzdHJpbmcsIFNlcnZlcmxlc3NIYW5kbGVyPjtcbn1cblxuY29uc3QgZ2V0Q2FjaGVEaXIgPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgY2FjaGVEaXIgPSBqb2luKGhvbWVkaXIoKSwgJy5sZXgtY2FjaGUnKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVEaXIpKSB7XG4gICAgbWtkaXJTeW5jKGNhY2hlRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gIH1cbiAgcmV0dXJuIGNhY2hlRGlyO1xufTtcblxuY29uc3QgZ2V0Q2FjaGVQYXRoID0gKCk6IHN0cmluZyA9PiBqb2luKGdldENhY2hlRGlyKCksICdwdWJsaWMtaXAuanNvbicpO1xuXG5jb25zdCByZWFkUHVibGljSXBDYWNoZSA9ICgpOiBQdWJsaWNJcENhY2hlIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNhY2hlUGF0aCA9IGdldENhY2hlUGF0aCgpO1xuICBpZighZXhpc3RzU3luYyhjYWNoZVBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGNhY2hlRGF0YSA9IHJlYWRGaWxlU3luYyhjYWNoZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSBKU09OLnBhcnNlKGNhY2hlRGF0YSk7XG5cbiAgICAvLyBDaGVjayBpZiBjYWNoZSBpcyBvbGRlciB0aGFuIDEgd2Vla1xuICAgIGNvbnN0IG9uZVdlZWtNcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGlmKERhdGUubm93KCkgLSBjYWNoZS50aW1lc3RhbXAgPiBvbmVXZWVrTXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZTtcbiAgfSBjYXRjaHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuY29uc3Qgd3JpdGVQdWJsaWNJcENhY2hlID0gKGlwOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgY2FjaGVQYXRoID0gZ2V0Q2FjaGVQYXRoKCk7XG4gIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0ge1xuICAgIGlwLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICB9O1xuICB3cml0ZUZpbGVTeW5jKGNhY2hlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY2FjaGUsIG51bGwsIDIpKTtcbn07XG5cbmNvbnN0IGZldGNoUHVibGljSXAgPSAoZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgaWYoIWZvcmNlUmVmcmVzaCkge1xuICAgIGNvbnN0IGNhY2hlZCA9IHJlYWRQdWJsaWNJcENhY2hlKCk7XG4gICAgaWYoY2FjaGVkKSB7XG4gICAgICByZXNvbHZlKGNhY2hlZC5pcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIGZldGNoIGluc3RlYWQgb2YgaHR0cHNcbiAgZmV0Y2goJ2h0dHBzOi8vYXBpLmlwaWZ5Lm9yZycpXG4gICAgLnRoZW4oKHJlcykgPT4gcmVzLnRleHQoKSlcbiAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgaXAgPSBkYXRhLnRyaW0oKTtcbiAgICAgIGlmKGlwKSB7XG4gICAgICAgIHdyaXRlUHVibGljSXBDYWNoZShpcCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGlwKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpO1xufSk7XG5cbmNvbnN0IGRpc3BsYXlTZXJ2ZXJTdGF0dXMgPSAoXG4gIGh0dHBQb3J0OiBudW1iZXIsXG4gIGh0dHBzUG9ydDogbnVtYmVyLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgaG9zdDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbixcbiAgcHVibGljSXA/OiBzdHJpbmdcbikgPT4ge1xuICBpZihxdWlldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGh0dHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH1gO1xuICBjb25zdCBodHRwc1VybCA9IGBodHRwczovLyR7aG9zdH06JHtodHRwc1BvcnR9YDtcbiAgY29uc3Qgd3NVcmwgPSBgd3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG4gIGNvbnN0IHdzc1VybCA9IGB3c3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG5cbiAgbGV0IHVybExpbmVzID0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFA6Jyl9ICAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cFVybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFBTOicpfSAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cHNVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdXZWJTb2NrZXQ6Jyl9ICR7Y2hhbGsudW5kZXJsaW5lKHdzVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignV1NTOicpfSAgICAgICAke2NoYWxrLnVuZGVybGluZSh3c3NVcmwpfVxcbmA7XG5cbiAgaWYocHVibGljSXApIHtcbiAgICB1cmxMaW5lcyArPSBgXFxuJHtjaGFsay5ncmVlbignUHVibGljOicpfSAgICAke2NoYWxrLnVuZGVybGluZShgaHR0cDovLyR7cHVibGljSXB9OiR7aHR0cFBvcnR9YCl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c0JveCA9IGJveGVuKFxuICAgIGAke2NoYWxrLmN5YW4uYm9sZCgn8J+agCBTZXJ2ZXJsZXNzIERldmVsb3BtZW50IFNlcnZlciBSdW5uaW5nJyl9XFxuXFxuJHt1cmxMaW5lc31cXG5gICtcbiAgICBgJHtjaGFsay55ZWxsb3coJ1ByZXNzIEN0cmwrQyB0byBzdG9wIHRoZSBzZXJ2ZXInKX1gLFxuICAgIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyMxYTFhMWEnLFxuICAgICAgYm9yZGVyQ29sb3I6ICdjeWFuJyxcbiAgICAgIGJvcmRlclN0eWxlOiAncm91bmQnLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgcGFkZGluZzogMVxuICAgIH1cbiAgKTtcblxuICBjb25zb2xlLmxvZyhgXFxuJHtzdGF0dXNCb3h9XFxuYCk7XG59O1xuXG5jb25zdCBsb2FkSGFuZGxlciA9IGFzeW5jIChoYW5kbGVyUGF0aDogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gUGFyc2luZyBoYW5kbGVyIHBhdGg6ICR7aGFuZGxlclBhdGh9YCk7XG5cbiAgICAvLyBQYXJzZSBBV1MgTGFtYmRhIGhhbmRsZXIgZm9ybWF0OiBcInBhdGgvdG8vZmlsZS5leHBvcnROYW1lXCIgb3IgXCJmaWxlLmV4cG9ydE5hbWVcIlxuICAgIC8vIEV4YW1wbGVzOiBcImluZGV4LmhhbmRsZXJcIiwgXCJoYW5kbGVycy9hcGkuaGFuZGxlclwiLCBcInNyYy9pbmRleC5kZWZhdWx0XCJcbiAgICBjb25zdCBoYW5kbGVyUGFydHMgPSBoYW5kbGVyUGF0aC5zcGxpdCgnLicpO1xuICAgIGNvbnNvbGUubG9nKCdbU2VydmVybGVzc10gSGFuZGxlciBwYXJ0cyBhZnRlciBzcGxpdDonLCBoYW5kbGVyUGFydHMpO1xuXG4gICAgbGV0IGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgbGV0IGV4cG9ydE5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYoaGFuZGxlclBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIEFXUyBMYW1iZGEgZm9ybWF0OiBcImZpbGUuZXhwb3J0TmFtZVwiXG4gICAgICAvLyBUYWtlIHRoZSBsYXN0IHBhcnQgYXMgZXhwb3J0IG5hbWUsIHJlc3QgYXMgZmlsZSBwYXRoXG4gICAgICAvLyBIYW5kbGUgY2FzZXMgbGlrZSBcImluZGV4LmhhbmRsZXJcIiAtPiBmaWxlOiBcImluZGV4XCIsIGV4cG9ydDogXCJoYW5kbGVyXCJcbiAgICAgIC8vIE9yIFwiaGFuZGxlcnMvYXBpLmhhbmRsZXJcIiAtPiBmaWxlOiBcImhhbmRsZXJzL2FwaVwiLCBleHBvcnQ6IFwiaGFuZGxlclwiXG4gICAgICBleHBvcnROYW1lID0gaGFuZGxlclBhcnRzW2hhbmRsZXJQYXJ0cy5sZW5ndGggLSAxXSB8fCBudWxsO1xuICAgICAgZmlsZVBhdGggPSBoYW5kbGVyUGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gUGFyc2VkIEFXUyBMYW1iZGEgZm9ybWF0IC0gZmlsZVBhdGg6IFwiJHtmaWxlUGF0aH1cIiwgZXhwb3J0TmFtZTogXCIke2V4cG9ydE5hbWV9XCJgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2ltcGxlIGZvcm1hdDoganVzdCB0aGUgZmlsZSBwYXRoXG4gICAgICBmaWxlUGF0aCA9IGhhbmRsZXJQYXRoO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBTaW1wbGUgZm9ybWF0IC0gZmlsZVBhdGg6IFwiJHtmaWxlUGF0aH1cImApO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBmaWxlUGF0aCBkb2Vzbid0IGhhdmUgdGhlIGV4cG9ydCBuYW1lIGluIGl0XG4gICAgaWYoZmlsZVBhdGguaW5jbHVkZXMoJy5oYW5kbGVyJykgfHwgZmlsZVBhdGguaW5jbHVkZXMoJy5kZWZhdWx0JykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBXQVJOSU5HOiBmaWxlUGF0aCBzdGlsbCBjb250YWlucyBleHBvcnQgbmFtZSEgZmlsZVBhdGg6IFwiJHtmaWxlUGF0aH1cImApO1xuICAgICAgLy8gVHJ5IHRvIGZpeCBpdCAtIHJlbW92ZSB0aGUgbGFzdCBwYXJ0IGlmIGl0IGxvb2tzIGxpa2UgYW4gZXhwb3J0IG5hbWVcbiAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IGZpbGVQYXRoLnNwbGl0KCcuJyk7XG4gICAgICBpZihwYXRoUGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmKFsnaGFuZGxlcicsICdkZWZhdWx0JywgJ2luZGV4J10uaW5jbHVkZXMobGFzdFBhcnQpICYmICFleHBvcnROYW1lKSB7XG4gICAgICAgICAgZXhwb3J0TmFtZSA9IGxhc3RQYXJ0O1xuICAgICAgICAgIGZpbGVQYXRoID0gcGF0aFBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKCcuJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaXhlZCAtIGZpbGVQYXRoOiBcIiR7ZmlsZVBhdGh9XCIsIGV4cG9ydE5hbWU6IFwiJHtleHBvcnROYW1lfVwiYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYm90aCByZWxhdGl2ZSBwYXRocyBhbmQgYWJzb2x1dGUgcGF0aHNcbiAgICBsZXQgZnVsbFBhdGg6IHN0cmluZztcbiAgICBpZihpc0Fic29sdXRlKGZpbGVQYXRoKSkge1xuICAgICAgZnVsbFBhdGggPSBmaWxlUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsbFBhdGggPSBwYXRoUmVzb2x2ZShvdXRwdXREaXIsIGZpbGVQYXRoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBSZXNvbHZlZCBmdWxsUGF0aCAoYmVmb3JlIGV4dGVuc2lvbnMpOiAke2Z1bGxQYXRofWApO1xuXG4gICAgLy8gVHJ5IGRpZmZlcmVudCBleHRlbnNpb25zIGlmIGZpbGUgZG9lc24ndCBleGlzdFxuICAgIGlmKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmpzJywgJy5tanMnLCAnLmNqcyddO1xuICAgICAgY29uc3QgcGF0aFdpdGhvdXRFeHQgPSBmdWxsUGF0aC5yZXBsYWNlKC9cXC4oanN8bWpzfGNqcykkLywgJycpO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBUcnlpbmcgZXh0ZW5zaW9ucy4gQmFzZSBwYXRoOiAke3BhdGhXaXRob3V0RXh0fWApO1xuICAgICAgZm9yKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZVBhdGggPSBwYXRoV2l0aG91dEV4dCArIGV4dDtcbiAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBDaGVja2luZzogJHtjYW5kaWRhdGVQYXRofSAoZXhpc3RzOiAke2V4aXN0c1N5bmMoY2FuZGlkYXRlUGF0aCl9KWApO1xuICAgICAgICBpZihleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICAgICAgZnVsbFBhdGggPSBjYW5kaWRhdGVQYXRoO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gRm91bmQgZmlsZSB3aXRoIGV4dGVuc2lvbjogJHtmdWxsUGF0aH1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEZpbGUgZXhpc3RzIHdpdGhvdXQgdHJ5aW5nIGV4dGVuc2lvbnM6ICR7ZnVsbFBhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaW5hbCBmdWxsUGF0aDogJHtmdWxsUGF0aH1gKTtcbiAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEV4cG9ydCBuYW1lOiAke2V4cG9ydE5hbWUgfHwgJ2RlZmF1bHQvaGFuZGxlcid9YCk7XG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaWxlIGV4aXN0czogJHtleGlzdHNTeW5jKGZ1bGxQYXRoKX1gKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgZmlsZSBub3QgZm91bmQ6ICR7ZnVsbFBhdGh9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gT3V0cHV0IGRpcmVjdG9yeTogJHtvdXRwdXREaXJ9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBwYXRoIGZyb20gY29uZmlnOiAke2hhbmRsZXJQYXRofWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIYW5kbGVyIGZpbGUgbm90IGZvdW5kOiAke2Z1bGxQYXRofWApO1xuICAgIH1cblxuICAgIC8vIER5bmFtaWMgaW1wb3J0IG9mIHRoZSBoYW5kbGVyIHdpdGggYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgLy8gQWRkIC5qcyBleHRlbnNpb24gaWYgaW1wb3J0aW5nIFR5cGVTY3JpcHQgY29tcGlsZWQgb3V0cHV0XG4gICAgY29uc3QgaW1wb3J0UGF0aCA9IGZ1bGxQYXRoLmVuZHNXaXRoKCcudHMnKSA/IGZ1bGxQYXRoLnJlcGxhY2UoL1xcLnRzJC8sICcuanMnKSA6IGZ1bGxQYXRoO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnZlcnQgdG8gZmlsZTovLyBVUkwgZm9yIEVTIG1vZHVsZSBpbXBvcnRzIChyZXF1aXJlZCBmb3IgYWJzb2x1dGUgcGF0aHMpXG4gICAgICAvLyBVc2UgcGF0aFRvRmlsZVVSTCB0byBlbnN1cmUgcHJvcGVyIGZpbGU6Ly8gVVJMIGZvcm1hdFxuICAgICAgY29uc3QgaW1wb3J0VXJsID0gcGF0aFRvRmlsZVVSTChpbXBvcnRQYXRoKS5ocmVmO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBJbXBvcnRpbmcgaGFuZGxlciBmcm9tOiAke2ltcG9ydFVybH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gRmlsZSBwYXRoOiAke2ltcG9ydFBhdGh9YCk7XG5cbiAgICAgIC8vIFVzZSBpbXBvcnQoKSB3aXRoIHRoZSBmaWxlIFVSTFxuICAgICAgLy8gTm90ZTogSWYgdGhlIGhhbmRsZXIgZmlsZSBoYXMgaW1wb3J0IGVycm9ycyAobGlrZSBtaXNzaW5nIGRlcGVuZGVuY2llcyksXG4gICAgICAvLyB0aG9zZSB3aWxsIHN1cmZhY2UgaGVyZSwgYnV0IHRoYXQncyBhIGhhbmRsZXIgY29kZSBpc3N1ZSwgbm90IGEgbG9hZGVyIGlzc3VlXG4gICAgICBjb25zdCBoYW5kbGVyTW9kdWxlID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEhhbmRsZXIgbW9kdWxlIGxvYWRlZCBzdWNjZXNzZnVsbHkuIEV4cG9ydHM6ICR7T2JqZWN0LmtleXMoaGFuZGxlck1vZHVsZSkuam9pbignLCAnKX1gKTtcblxuICAgICAgLy8gR2V0IHRoZSBoYW5kbGVyIGJhc2VkIG9uIGV4cG9ydCBuYW1lIG9yIHRyeSBkZWZhdWx0c1xuICAgICAgbGV0IGhhbmRsZXI6IGFueTtcbiAgICAgIGlmKGV4cG9ydE5hbWUpIHtcbiAgICAgICAgaGFuZGxlciA9IGhhbmRsZXJNb2R1bGVbZXhwb3J0TmFtZV07XG4gICAgICAgIGlmKCFoYW5kbGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEV4cG9ydCBcIiR7ZXhwb3J0TmFtZX1cIiBub3QgZm91bmQgaW4gbW9kdWxlLiBBdmFpbGFibGUgZXhwb3J0czogJHtPYmplY3Qua2V5cyhoYW5kbGVyTW9kdWxlKS5qb2luKCcsICcpfWApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUcnkgZGVmYXVsdCwgaGFuZGxlciwgb3IgdGhlIG1vZHVsZSBpdHNlbGZcbiAgICAgICAgaGFuZGxlciA9IGhhbmRsZXJNb2R1bGUuZGVmYXVsdCB8fCBoYW5kbGVyTW9kdWxlLmhhbmRsZXIgfHwgaGFuZGxlck1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIGZvdW5kOiAke3R5cGVvZiBoYW5kbGVyfSwgaXNGdW5jdGlvbjogJHt0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJ31gKTtcblxuICAgICAgaWYodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgaXMgbm90IGEgZnVuY3Rpb24uIFR5cGU6ICR7dHlwZW9mIGhhbmRsZXJ9LCBWYWx1ZTpgLCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgIH0gY2F0Y2goaW1wb3J0RXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEltcG9ydCBlcnJvciBmb3IgaGFuZGxlciAke2hhbmRsZXJQYXRofTpgLCBpbXBvcnRFcnJvci5tZXNzYWdlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBJbXBvcnQgZXJyb3Igc3RhY2s6JywgaW1wb3J0RXJyb3Iuc3RhY2spO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9yIChjb21tb24gd2l0aCBFUyBtb2R1bGVzKVxuICAgICAgaWYoaW1wb3J0RXJyb3IubWVzc2FnZSAmJiBpbXBvcnRFcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDYW5ub3QgZmluZCBtb2R1bGUnKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gVGhpcyBhcHBlYXJzIHRvIGJlIGEgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9yLicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gVGhlIGhhbmRsZXIgZmlsZSBleGlzdHMsIGJ1dCBvbmUgb2YgaXRzIGltcG9ydHMgaXMgZmFpbGluZy4nKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIENoZWNrIHRoYXQgYWxsIGRlcGVuZGVuY2llcyBpbiB0aGUgaGFuZGxlciBmaWxlIGFyZSBwcm9wZXJseSBpbnN0YWxsZWQuJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIGZpbGU6ICR7aW1wb3J0UGF0aH1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIE1ha2Ugc3VyZSB0aGUgaGFuZGxlciBhbmQgaXRzIGRlcGVuZGVuY2llcyBhcmUgY29tcGlsZWQgY29ycmVjdGx5LicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3I6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBFcnJvciBsb2FkaW5nIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06YCwgZXJyb3IubWVzc2FnZSk7XG4gICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIEVycm9yIHN0YWNrOicsIGVycm9yLnN0YWNrKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuY29uc3QgY2FwdHVyZUNvbnNvbGVMb2dzID0gKGhhbmRsZXI6IChldmVudDogYW55LCBjb250ZXh0OiBhbnkpPT4gUHJvbWlzZTxhbnk+LCBxdWlldDogYm9vbGVhbikgPT4ge1xuICBpZihxdWlldCkge1xuICAgIHJldHVybiBoYW5kbGVyO1xuICB9XG5cbiAgcmV0dXJuIGFzeW5jIChldmVudDogYW55LCBjb250ZXh0OiBhbnkpID0+IHtcbiAgICAvLyBDYXB0dXJlIGNvbnNvbGUubG9nLCBjb25zb2xlLmVycm9yLCBldGMuXG4gICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlTG9nID0gY29uc29sZS5sb2c7XG4gICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlRXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZVdhcm4gPSBjb25zb2xlLndhcm47XG4gICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlSW5mbyA9IGNvbnNvbGUuaW5mbztcblxuICAgIGNvbnN0IGxvZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zb2xlLmxvZyA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbTE9HXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlTG9nKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICBjb25zb2xlLmVycm9yID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtFUlJPUl0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUVycm9yKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICBjb25zb2xlLndhcm4gPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW1dBUk5dICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVXYXJuKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICBjb25zb2xlLmluZm8gPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0lORk9dICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVJbmZvKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihldmVudCwgY29udGV4dCk7XG5cbiAgICAgIC8vIE91dHB1dCBjYXB0dXJlZCBsb2dzXG4gICAgICBpZihsb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnLS0tIEhhbmRsZXIgQ29uc29sZSBPdXRwdXQgLS0tJykpO1xuICAgICAgICBsb2dzLmZvckVhY2goKGxvZykgPT4gY29uc29sZS5sb2coY2hhbGsuZ3JheShsb2cpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJy0tLSBFbmQgSGFuZGxlciBDb25zb2xlIE91dHB1dCAtLS0nKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgY29uc29sZSBtZXRob2RzXG4gICAgICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZUxvZztcbiAgICAgIGNvbnNvbGUuZXJyb3IgPSBvcmlnaW5hbENvbnNvbGVFcnJvcjtcbiAgICAgIGNvbnNvbGUud2FybiA9IG9yaWdpbmFsQ29uc29sZVdhcm47XG4gICAgICBjb25zb2xlLmluZm8gPSBvcmlnaW5hbENvbnNvbGVJbmZvO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IGNyZWF0ZUV4cHJlc3NTZXJ2ZXIgPSBhc3luYyAoXG4gIGNvbmZpZzogU2VydmVybGVzc0NvbmZpZyxcbiAgb3V0cHV0RGlyOiBzdHJpbmcsXG4gIGh0dHBQb3J0OiBudW1iZXIsXG4gIGhvc3Q6IHN0cmluZyxcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIGRlYnVnOiBib29sZWFuXG4pID0+IHtcbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4gIC8vIEVuYWJsZSBDT1JTXG4gIGFwcC51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonKTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJywgJ0dFVCwgUE9TVCwgUFVULCBERUxFVEUsIFBBVENILCBPUFRJT05TJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycycsICcqJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHMnLCAndHJ1ZScpO1xuXG4gICAgaWYocmVxLm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgICByZXMuc2VuZFN0YXR1cygyMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0KCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBQYXJzZSBKU09OIGJvZGllc1xuICBhcHAudXNlKGV4cHJlc3MuanNvbigpKTtcblxuICAvLyBMb2FkIEdyYXBoUUwgaGFuZGxlclxuICBjb25zdCBsb2FkR3JhcGhRTFNjaGVtYSA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBHcmFwaFFMIGhhbmRsZXJcbiAgICAgIGxldCBncmFwaHFsSGFuZGxlciA9IG51bGw7XG5cbiAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgZm9yKGNvbnN0IFtmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuZnVuY3Rpb25zKSkge1xuICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBpZihldmVudC5odHRwICYmIGV2ZW50Lmh0dHAucGF0aCkge1xuICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIEdyYXBoUUwgZW5kcG9pbnRzXG4gICAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cC5wYXRoID09PSAnL3B1YmxpYycgfHwgZXZlbnQuaHR0cC5wYXRoID09PSAnL2dyYXBocWwnKSB7XG4gICAgICAgICAgICAgICAgICBncmFwaHFsSGFuZGxlciA9IGF3YWl0IGxvYWRIYW5kbGVyKGZ1bmN0aW9uQ29uZmlnLmhhbmRsZXIsIG91dHB1dERpcik7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihncmFwaHFsSGFuZGxlcikge1xuICAgICAgICBsb2coJ0ZvdW5kIEdyYXBoUUwgaGFuZGxlcicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICByZXR1cm4gZ3JhcGhxbEhhbmRsZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYEVycm9yIGxvYWRpbmcgR3JhcGhRTCBoYW5kbGVyOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNldCB1cCBHcmFwaFFMIGhhbmRsZXIgZm9yIEdyYXBoUUwgcmVxdWVzdHNcbiAgdHJ5IHtcbiAgICBjb25zdCBncmFwaHFsSGFuZGxlciA9IGF3YWl0IGxvYWRHcmFwaFFMU2NoZW1hKCk7XG4gICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgIC8vIEZpbmQgdGhlIEdyYXBoUUwgcGF0aCBmcm9tIHRoZSBzZXJ2ZXJsZXNzIGNvbmZpZ1xuICAgICAgbGV0IGdyYXBocWxQYXRoID0gJy9ncmFwaHFsJzsgLy8gZGVmYXVsdCBmYWxsYmFja1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbX2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Py5odHRwPy5wYXRoKSB7XG4gICAgICAgICAgICAgICAgZ3JhcGhxbFBhdGggPSBldmVudC5odHRwLnBhdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZ3JhcGhxbFBhdGggIT09ICcvZ3JhcGhxbCcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgR3JhcGhRTCBlbmRwb2ludCB3aXRoIGVuaGFuY2VkIGNvbnNvbGUubG9nIGNhcHR1cmVcbiAgICAgIGFwcC51c2UoZ3JhcGhxbFBhdGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICAvLyBHcmFwaFFMIERlYnVnIExvZ2dpbmdcbiAgICAgICAgaWYoZGVidWcgJiYgcmVxLmJvZHkgJiYgcmVxLmJvZHkucXVlcnkpIHtcbiAgICAgICAgICBsb2coJ/CflI0gR3JhcGhRTCBEZWJ1ZyBNb2RlOiBBbmFseXppbmcgcmVxdWVzdC4uLicsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIGxvZyhg8J+TnSBHcmFwaFFMIFF1ZXJ5OiAke3JlcS5ib2R5LnF1ZXJ5fWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIGlmKHJlcS5ib2R5LnZhcmlhYmxlcykge1xuICAgICAgICAgICAgbG9nKGDwn5OKIEdyYXBoUUwgVmFyaWFibGVzOiAke0pTT04uc3RyaW5naWZ5KHJlcS5ib2R5LnZhcmlhYmxlcywgbnVsbCwgMil9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlcS5ib2R5Lm9wZXJhdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIGxvZyhg8J+Pt++4jyAgR3JhcGhRTCBPcGVyYXRpb246ICR7cmVxLmJvZHkub3BlcmF0aW9uTmFtZX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmhhbmNlZCBjb25zb2xlLmxvZyBjYXB0dXJlXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGNvbnNvbGUubG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dNZXNzYWdlID0gYXJncy5tYXAoKGFyZykgPT5cbiAgICAgICAgICAgICh0eXBlb2YgYXJnID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGFyZywgbnVsbCwgMikgOiBTdHJpbmcoYXJnKSlcbiAgICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgICBsb2dzLnB1c2gobG9nTWVzc2FnZSk7XG4gICAgICAgICAgb3JpZ2luYWxDb25zb2xlTG9nKGBbR3JhcGhRTF0gJHtsb2dNZXNzYWdlfWApO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENyZWF0ZSBjb250ZXh0IGZvciB0aGUgaGFuZGxlclxuICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAnZ3JhcGhxbCcsXG4gICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiAoKSA9PiAzMDAwMCxcbiAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46ICdhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOmdyYXBocWwnLFxuICAgICAgICAgIGxvZ0dyb3VwTmFtZTogJy9hd3MvbGFtYmRhL2dyYXBocWwnLFxuICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgIHJlcSxcbiAgICAgICAgICByZXNcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBXcmFwIGhhbmRsZXIgd2l0aCBjb25zb2xlIGxvZyBjYXB0dXJlXG4gICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGdyYXBocWxIYW5kbGVyLCBxdWlldCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBDYWxsIHRoZSBoYW5kbGVyIHdpdGggR3JhcGhRTCBwYXJhbWV0ZXJzXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoe1xuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxLmJvZHkpLFxuICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICAgICAgICBodHRwTWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBwYXRoOiBncmFwaHFsUGF0aCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyczoge31cbiAgICAgICAgICB9LCBjb250ZXh0KTtcblxuICAgICAgICAgIC8vIFJlc3RvcmUgY29uc29sZS5sb2dcbiAgICAgICAgICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZUxvZztcblxuICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcmVzdWx0XG4gICAgICAgICAgaWYocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdC5zdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXNDb2RlKTtcbiAgICAgICAgICAgIGlmKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5oZWFkZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnNlbmQocmVzdWx0LmJvZHkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMuanNvbihyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgIC8vIFJlc3RvcmUgY29uc29sZS5sb2dcbiAgICAgICAgICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZUxvZztcbiAgICAgICAgICBsb2coYEdyYXBoUUwgaGFuZGxlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxvZyhgR3JhcGhRTCBlbmRwb2ludCBhdmFpbGFibGUgYXQgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH0ke2dyYXBocWxQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgRXJyb3Igc2V0dGluZyB1cCBHcmFwaFFMOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgZm9yIG5vbi1HcmFwaFFMIHJvdXRlcyAtIGhhbmRsZSBhbGwgcmVtYWluaW5nIHJvdXRlc1xuICBhcHAudXNlKCcvJywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IHJlcS51cmwgfHwgJy8nO1xuICAgICAgY29uc3QgbWV0aG9kID0gcmVxLm1ldGhvZCB8fCAnR0VUJztcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gcmVxLnBhdGggfHwgdXJsLnNwbGl0KCc/JylbMF07IC8vIEV4dHJhY3QgcGF0aG5hbWUgd2l0aG91dCBxdWVyeSBzdHJpbmdcblxuICAgICAgLy8gQWx3YXlzIGxvZyByZXF1ZXN0cyAobm90IGFmZmVjdGVkIGJ5IHF1aWV0IGZsYWcgZm9yIGRlYnVnZ2luZylcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gJHttZXRob2R9ICR7dXJsfSAocGF0aG5hbWU6ICR7cGF0aG5hbWV9KWApO1xuXG4gICAgICAvLyBGaW5kIG1hdGNoaW5nIGZ1bmN0aW9uXG4gICAgICBsZXQgbWF0Y2hlZEZ1bmN0aW9uID0gbnVsbDtcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gT2JqZWN0LmtleXMoY29uZmlnLmZ1bmN0aW9ucyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gQXZhaWxhYmxlIGZ1bmN0aW9uczogJHtmdW5jdGlvbk5hbWVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2VydmVybGVzc10gQ29uZmlnIGZ1bmN0aW9uczonLCBKU09OLnN0cmluZ2lmeShjb25maWcuZnVuY3Rpb25zLCBudWxsLCAyKSk7XG5cbiAgICAgICAgZm9yKGNvbnN0IFtmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuZnVuY3Rpb25zKSkge1xuICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBpZihldmVudC5odHRwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRQYXRoID0gZXZlbnQuaHR0cC5wYXRoIHx8ICcvJztcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudE1ldGhvZCA9IChldmVudC5odHRwLm1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0TWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIENoZWNraW5nIGZ1bmN0aW9uICR7ZnVuY3Rpb25OYW1lfTogcGF0aD1cIiR7ZXZlbnRQYXRofVwiLCBtZXRob2Q9XCIke2V2ZW50TWV0aG9kfVwiIGFnYWluc3QgcGF0aG5hbWU9XCIke3BhdGhuYW1lfVwiLCBtZXRob2Q9XCIke3JlcXVlc3RNZXRob2R9XCJgKTtcblxuICAgICAgICAgICAgICAgIC8vIEltcHJvdmVkIHBhdGggbWF0Y2hpbmcgLSBjb21wYXJlIHBhdGhuYW1lIHdpdGhvdXQgcXVlcnkgc3RyaW5nXG4gICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGhzIChyZW1vdmUgdHJhaWxpbmcgc2xhc2hlcyBmb3IgY29tcGFyaXNvbilcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRXZlbnRQYXRoID0gZXZlbnRQYXRoLnJlcGxhY2UoL1xcLyQvLCAnJykgfHwgJy8nO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRobmFtZSA9IHBhdGhuYW1lLnJlcGxhY2UoL1xcLyQvLCAnJykgfHwgJy8nO1xuXG4gICAgICAgICAgICAgICAgaWYobm9ybWFsaXplZEV2ZW50UGF0aCA9PT0gbm9ybWFsaXplZFBhdGhuYW1lICYmIGV2ZW50TWV0aG9kID09PSByZXF1ZXN0TWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIOKckyBNYXRjaGVkIGZ1bmN0aW9uOiAke21hdGNoZWRGdW5jdGlvbn1gKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihtYXRjaGVkRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTZXJ2ZXJsZXNzXSBObyBmdW5jdGlvbnMgZm91bmQgaW4gY29uZmlnJyk7XG4gICAgICB9XG5cbiAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbiAmJiBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0pIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBoYW5kbGVyIHBhdGggcmVsYXRpdmUgdG8gb3V0cHV0IGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBoYW5kbGVyUGF0aCA9IGNvbmZpZy5mdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXS5oYW5kbGVyO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIExvYWRpbmcgaGFuZGxlcjogJHtoYW5kbGVyUGF0aH0gZnJvbSBvdXRwdXREaXI6ICR7b3V0cHV0RGlyfWApO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoaGFuZGxlclBhdGgsIG91dHB1dERpcik7XG5cbiAgICAgICAgaWYoaGFuZGxlcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gSGFuZGxlciBsb2FkZWQgc3VjY2Vzc2Z1bGx5LCB0eXBlOiAke3R5cGVvZiBoYW5kbGVyfWApO1xuICAgICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGhhbmRsZXIsIHF1aWV0KTtcblxuICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAgYm9keTogcmVxLmJvZHksXG4gICAgICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycyxcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHBhdGg6IHVybCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyczogcmVxLnF1ZXJ5XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBtYXRjaGVkRnVuY3Rpb24sXG4gICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgbG9nU3RyZWFtTmFtZTogJ3Rlc3QtbG9nLXN0cmVhbScsXG4gICAgICAgICAgICBtZW1vcnlMaW1pdEluTUI6ICcxMjgnXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1NlcnZlcmxlc3NdIENhbGxpbmcgaGFuZGxlciB3aXRoIGV2ZW50OicsIEpTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3cmFwcGVkSGFuZGxlcihldmVudCwgY29udGV4dCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1NlcnZlcmxlc3NdIEhhbmRsZXIgcmV0dXJuZWQ6JywgSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG5cbiAgICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXNDb2RlKTtcbiAgICAgICAgICAgICAgaWYocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzLnNlbmQocmVzdWx0LmJvZHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBIYW5kbGVyIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIEhhbmRsZXIgZXJyb3Igc3RhY2s6JywgZXJyb3Iuc3RhY2spO1xuICAgICAgICAgICAgbG9nKGBIYW5kbGVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIG5vdCBmb3VuZCBmb3IgZnVuY3Rpb246ICR7bWF0Y2hlZEZ1bmN0aW9ufWApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIHBhdGg6ICR7aGFuZGxlclBhdGh9LCBPdXRwdXQgZGlyOiAke291dHB1dERpcn1gKTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7ZXJyb3I6ICdIYW5kbGVyIG5vdCBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEZ1bmN0aW9uIG5vdCBmb3VuZCBmb3IgcGF0aG5hbWU6ICR7cGF0aG5hbWV9LCBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gQXZhaWxhYmxlIGZ1bmN0aW9uczogJHtjb25maWcuZnVuY3Rpb25zID8gT2JqZWN0LmtleXMoY29uZmlnLmZ1bmN0aW9ucykuam9pbignLCAnKSA6ICdub25lJ31gKTtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnRnVuY3Rpb24gbm90IGZvdW5kJ30pO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGxvZyhgUm91dGUgaGFuZGxpbmcgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBhcHA7XG59O1xuXG5jb25zdCBjcmVhdGVXZWJTb2NrZXRTZXJ2ZXIgPSAoXG4gIGNvbmZpZzogU2VydmVybGVzc0NvbmZpZyxcbiAgb3V0cHV0RGlyOiBzdHJpbmcsXG4gIHdzUG9ydDogbnVtYmVyLFxuICBxdWlldDogYm9vbGVhbixcbiAgZGVidWc6IGJvb2xlYW5cbikgPT4ge1xuICBjb25zdCB3c3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiB3c1BvcnR9KTtcblxuICB3c3Mub24oJ2Nvbm5lY3Rpb24nLCBhc3luYyAod3MsIHJlcSkgPT4ge1xuICAgIGxvZyhgV2ViU29ja2V0IGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQ6ICR7cmVxLnVybH1gLCAnaW5mbycsIGZhbHNlKTtcblxuICAgIHdzLm9uKCdtZXNzYWdlJywgYXN5bmMgKG1lc3NhZ2UpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgLy8gRmluZCBtYXRjaGluZyBXZWJTb2NrZXQgZnVuY3Rpb25cbiAgICAgICAgbGV0IG1hdGNoZWRGdW5jdGlvbiA9IG51bGw7XG5cbiAgICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYoZXZlbnQud2Vic29ja2V0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZSA9IGV2ZW50LndlYnNvY2tldC5yb3V0ZSB8fCAnJGNvbm5lY3QnO1xuICAgICAgICAgICAgICAgICAgaWYocm91dGUgPT09ICckZGVmYXVsdCcgfHwgcm91dGUgPT09IGRhdGEuYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGdW5jdGlvbiA9IGZ1bmN0aW9uTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihtYXRjaGVkRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uICYmIGNvbmZpZy5mdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXSkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0uaGFuZGxlciwgb3V0cHV0RGlyKTtcblxuICAgICAgICAgIGlmKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIC8vIFdyYXAgaGFuZGxlciB3aXRoIGNvbnNvbGUgbG9nIGNhcHR1cmVcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGhhbmRsZXIsIHF1aWV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAgICBib2R5OiBkYXRhLmJvZHkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICBhcGlHYXRld2F5OiB7XG4gICAgICAgICAgICAgICAgICBlbmRwb2ludDogYHdzOi8vbG9jYWxob3N0OiR7d3NQb3J0fWBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogJ3Rlc3QtY29ubmVjdGlvbi1pZCcsXG4gICAgICAgICAgICAgICAgcm91dGVLZXk6IGRhdGEuYWN0aW9uIHx8ICckZGVmYXVsdCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBtYXRjaGVkRnVuY3Rpb24sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogJyRMQVRFU1QnLFxuICAgICAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwLFxuICAgICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgICAgICBtZW1vcnlMaW1pdEluTUI6ICcxMjgnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3cmFwcGVkSGFuZGxlcihldmVudCwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSBMYW1iZGEgcmVzcG9uc2UgZm9ybWF0IGZvciBXZWJTb2NrZXRcbiAgICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgTGFtYmRhIHJlc3BvbnNlIG9iamVjdCwgZXh0cmFjdCB0aGUgYm9keVxuICAgICAgICAgICAgICBjb25zdCBib2R5ID0gcmVzdWx0LmJvZHkgfHwgJyc7XG4gICAgICAgICAgICAgIHdzLnNlbmQoYm9keSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IHJlc3BvbnNlLCBzdHJpbmdpZnkgaXRcbiAgICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7ZXJyb3I6ICdIYW5kbGVyIG5vdCBmb3VuZCd9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnV2ViU29ja2V0IGZ1bmN0aW9uIG5vdCBmb3VuZCd9KSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgbG9nKGBXZWJTb2NrZXQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiBlcnJvci5tZXNzYWdlfSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgbG9nKCdXZWJTb2NrZXQgY29ubmVjdGlvbiBjbG9zZWQnLCAnaW5mbycsIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHdzcztcbn07XG5cbmNvbnN0IGxvYWRFbnZGaWxlID0gKGVudlBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgaWYoIWV4aXN0c1N5bmMoZW52UGF0aCkpIHtcbiAgICByZXR1cm4gZW52VmFycztcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZW52Q29udGVudCA9IHJlYWRGaWxlU3luYyhlbnZQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGxpbmVzID0gZW52Q29udGVudC5zcGxpdCgnXFxuJyk7XG5cbiAgICBmb3IoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcblxuICAgICAgLy8gU2tpcCBlbXB0eSBsaW5lcyBhbmQgY29tbWVudHNcbiAgICAgIGlmKCF0cmltbWVkTGluZSB8fCB0cmltbWVkTGluZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIEtFWT12YWx1ZSBmb3JtYXRcbiAgICAgIGNvbnN0IGVxdWFsSW5kZXggPSB0cmltbWVkTGluZS5pbmRleE9mKCc9Jyk7XG4gICAgICBpZihlcXVhbEluZGV4ID4gMCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0cmltbWVkTGluZS5zdWJzdHJpbmcoMCwgZXF1YWxJbmRleCkudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRyaW1tZWRMaW5lLnN1YnN0cmluZyhlcXVhbEluZGV4ICsgMSkudHJpbSgpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBxdW90ZXMgaWYgcHJlc2VudFxuICAgICAgICBjb25zdCBjbGVhblZhbHVlID0gdmFsdWUucmVwbGFjZSgvXltcIiddfFtcIiddJC9nLCAnJyk7XG5cbiAgICAgICAgaWYoa2V5KSB7XG4gICAgICAgICAgZW52VmFyc1trZXldID0gY2xlYW5WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgV2FybmluZzogQ291bGQgbm90IGxvYWQgLmVudiBmaWxlIGF0ICR7ZW52UGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiBlbnZWYXJzO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlcnZlcmxlc3MgPSBhc3luYyAoXG4gIGNtZDogU2VydmVybGVzc09wdGlvbnMsXG4gIGNhbGxiYWNrOiBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoKSA9PiAoe30pXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7XG4gICAgY2xpTmFtZSA9ICdMZXgnLFxuICAgIGNvbmZpZyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIGhvc3QgPSAnbG9jYWxob3N0JyxcbiAgICBodHRwUG9ydCA9IDUwMDAsXG4gICAgaHR0cHNQb3J0ID0gNTAwMSxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIHJlbW92ZSA9IGZhbHNlLFxuICAgIHRlc3QgPSBmYWxzZSxcbiAgICB1c2VQdWJsaWNJcCxcbiAgICB2YXJpYWJsZXMsXG4gICAgd3NQb3J0ID0gNTAwMlxuICB9ID0gY21kO1xuXG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBsb2coYCR7Y2xpTmFtZX0gc3RhcnRpbmcgc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBjb25zdCB7b3V0cHV0RnVsbFBhdGh9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAvLyBMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIC5lbnYgZmlsZXNcbiAgY29uc3QgZW52UGF0aHMgPSBbXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5sb2NhbCcpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52LmRldmVsb3BtZW50JylcbiAgXTtcblxuICBsZXQgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIC8vIExvYWQgZnJvbSAuZW52IGZpbGVzIGluIG9yZGVyIChsYXRlciBmaWxlcyBvdmVycmlkZSBlYXJsaWVyIG9uZXMpXG4gIGZvcihjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3QgZmlsZUVudlZhcnMgPSBsb2FkRW52RmlsZShlbnZQYXRoKTtcbiAgICBpZihPYmplY3Qua2V5cyhmaWxlRW52VmFycykubGVuZ3RoID4gMCkge1xuICAgICAgbG9nKGBMb2FkZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb206ICR7ZW52UGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gICAgZW52VmFycyA9IHsuLi5lbnZWYXJzLCAuLi5maWxlRW52VmFyc307XG4gIH1cblxuICAvLyBTdGFydCB3aXRoIGRlZmF1bHQgTk9ERV9FTlYgYW5kIGxvYWRlZCAuZW52IHZhcmlhYmxlc1xuICBsZXQgdmFyaWFibGVzT2JqOiBvYmplY3QgPSB7Tk9ERV9FTlY6ICdkZXZlbG9wbWVudCcsIC4uLmVudlZhcnN9O1xuXG4gIC8vIE92ZXJyaWRlIHdpdGggY29tbWFuZCBsaW5lIHZhcmlhYmxlcyBpZiBwcm92aWRlZFxuICBpZih2YXJpYWJsZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpVmFycyA9IEpTT04ucGFyc2UodmFyaWFibGVzKTtcbiAgICAgIHZhcmlhYmxlc09iaiA9IHsuLi52YXJpYWJsZXNPYmosIC4uLmNsaVZhcnN9O1xuICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEVudmlyb25tZW50IHZhcmlhYmxlcyBvcHRpb24gaXMgbm90IGEgdmFsaWQgSlNPTiBvYmplY3QuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzLmVudiA9IHsuLi5wcm9jZXNzLmVudiwgLi4udmFyaWFibGVzT2JqfTtcblxuICAvLyBJZiBpbiB0ZXN0IG1vZGUsIGV4aXQgZWFybHkgYWZ0ZXIgbG9hZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgaWYodGVzdCkge1xuICAgIGxvZygnVGVzdCBtb2RlOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgbG9hZGVkLCBleGl0aW5nJywgJ2luZm8nLCBxdWlldCk7XG4gICAgY2FsbGJhY2soMCk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZihyZW1vdmUpIHtcbiAgICBzcGlubmVyLnN0YXJ0KCdDbGVhbmluZyBvdXRwdXQgZGlyZWN0b3J5Li4uJyk7XG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMob3V0cHV0RnVsbFBhdGggfHwgJycpO1xuICAgIHNwaW5uZXIuc3VjY2VlZCgnU3VjY2Vzc2Z1bGx5IGNsZWFuZWQgb3V0cHV0IGRpcmVjdG9yeSEnKTtcbiAgfVxuXG4gIC8vIExvYWQgc2VydmVybGVzcyBjb25maWd1cmF0aW9uXG4gIGxldCBzZXJ2ZXJsZXNzQ29uZmlnOiBTZXJ2ZXJsZXNzQ29uZmlnID0ge307XG5cbiAgdHJ5IHtcbiAgICAvLyBVc2UgZ2V0UGFja2FnZURpciB0byBoYW5kbGUgbnBtIHdvcmtzcGFjZXMgY29ycmVjdGx5XG4gICAgY29uc3QgcGFja2FnZURpciA9IGdldFBhY2thZ2VEaXIoKTtcblxuICAgIC8vIFRyeSBtdWx0aXBsZSBjb25maWcgZmlsZSBmb3JtYXRzXG4gICAgY29uc3QgY29uZmlnRm9ybWF0cyA9IGNvbmZpZyA/IFtjb25maWddIDogW1xuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcubWpzJyksXG4gICAgICBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCAnbGV4LmNvbmZpZy5qcycpLFxuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcuY2pzJyksXG4gICAgICBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCAnbGV4LmNvbmZpZy50cycpXG4gICAgXTtcblxuICAgIGxldCBjb25maWdQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBmb3IoY29uc3QgY2FuZGlkYXRlUGF0aCBvZiBjb25maWdGb3JtYXRzKSB7XG4gICAgICBpZihleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICAgIGNvbmZpZ1BhdGggPSBjYW5kaWRhdGVQYXRoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihjb25maWdQYXRoKSB7XG4gICAgICBsb2coYExvYWRpbmcgc2VydmVybGVzcyBjb25maWcgZnJvbTogJHtjb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgY29uc3QgY29uZmlnTW9kdWxlID0gYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpO1xuICAgICAgc2VydmVybGVzc0NvbmZpZyA9IGNvbmZpZ01vZHVsZS5kZWZhdWx0Py5zZXJ2ZXJsZXNzIHx8IGNvbmZpZ01vZHVsZS5zZXJ2ZXJsZXNzIHx8IHt9O1xuICAgICAgbG9nKCdTZXJ2ZXJsZXNzIGNvbmZpZyBsb2FkZWQgc3VjY2Vzc2Z1bGx5JywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gT2JqZWN0LmtleXMoc2VydmVybGVzc0NvbmZpZy5mdW5jdGlvbnMgfHwge30pO1xuICAgICAgbG9nKGBMb2FkZWQgZnVuY3Rpb25zOiAke2Z1bmN0aW9uTmFtZXMubGVuZ3RoID4gMCA/IGZ1bmN0aW9uTmFtZXMuam9pbignLCAnKSA6ICdub25lJ31gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgLy8gRGVidWc6IFByaW50IGZ1bGwgY29uZmlnIGlmIGRlYnVnIG1vZGVcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgRnVsbCBzZXJ2ZXJsZXNzIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShzZXJ2ZXJsZXNzQ29uZmlnLCBudWxsLCAyKX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGBObyBzZXJ2ZXJsZXNzIGNvbmZpZyBmb3VuZC4gVHJpZWQ6ICR7Y29uZmlnRm9ybWF0cy5qb2luKCcsICcpfWAsICd3YXJuJywgcXVpZXQpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgRXJyb3IgbG9hZGluZyBzZXJ2ZXJsZXNzIGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBpZihkZWJ1Zykge1xuICAgICAgbG9nKGBDb25maWcgZXJyb3Igc3RhY2s6ICR7ZXJyb3Iuc3RhY2t9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgIH1cbiAgICAvLyBEb24ndCBleGl0LCBjb250aW51ZSB3aXRoIGVtcHR5IGNvbmZpZ1xuICB9XG5cbiAgLy8gTWVyZ2UgY29uZmlnIHdpdGggY29tbWFuZCBsaW5lIG9wdGlvbnNcbiAgY29uc3QgZmluYWxDb25maWc6IFNlcnZlcmxlc3NDb25maWcgPSB7XG4gICAgLi4uc2VydmVybGVzc0NvbmZpZyxcbiAgICBjdXN0b206IHtcbiAgICAgICdzZXJ2ZXJsZXNzLW9mZmxpbmUnOiB7XG4gICAgICAgIGNvcnM6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5jb3JzICE9PSBmYWxzZSxcbiAgICAgICAgaG9zdDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/Lmhvc3QgfHwgaG9zdCxcbiAgICAgICAgaHR0cFBvcnQ6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5odHRwUG9ydCB8fCBodHRwUG9ydCxcbiAgICAgICAgaHR0cHNQb3J0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uaHR0cHNQb3J0IHx8IGh0dHBzUG9ydCxcbiAgICAgICAgd3NQb3J0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8ud3NQb3J0IHx8IHdzUG9ydFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvdXRwdXREaXIgPSBvdXRwdXRGdWxsUGF0aCB8fCAnbGliJztcbiAgbG9nKGBVc2luZyBvdXRwdXQgZGlyZWN0b3J5OiAke291dHB1dERpcn1gLCAnaW5mbycsIHF1aWV0KTtcblxuICB0cnkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ1N0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJyk7XG5cbiAgICBjb25zdCBodHRwUG9ydCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwUG9ydCE7XG4gICAgY29uc3Qgd3NQb3J0ID0gZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLndzUG9ydCE7XG4gICAgY29uc3QgaG9zdCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5ob3N0ITtcblxuICAgIGxvZyhgQ3JlYXRpbmcgSFRUUCBzZXJ2ZXIgb24gJHtob3N0fToke2h0dHBQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuICAgIGxvZyhgQ3JlYXRpbmcgV2ViU29ja2V0IHNlcnZlciBvbiBwb3J0ICR7d3NQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgLy8gQ3JlYXRlIEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3QgZXhwcmVzc0FwcCA9IGF3YWl0IGNyZWF0ZUV4cHJlc3NTZXJ2ZXIoXG4gICAgICBmaW5hbENvbmZpZyxcbiAgICAgIG91dHB1dERpcixcbiAgICAgIGh0dHBQb3J0LFxuICAgICAgaG9zdCxcbiAgICAgIHF1aWV0LFxuICAgICAgZGVidWdcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIFdlYlNvY2tldCBzZXJ2ZXJcbiAgICBjb25zdCB3c1NlcnZlciA9IGNyZWF0ZVdlYlNvY2tldFNlcnZlcihcbiAgICAgIGZpbmFsQ29uZmlnLFxuICAgICAgb3V0cHV0RGlyLFxuICAgICAgd3NQb3J0LFxuICAgICAgcXVpZXQsXG4gICAgICBkZWJ1Z1xuICAgICk7XG5cbiAgICAvLyBIYW5kbGUgc2VydmVyIGVycm9yc1xuICAgIHdzU2VydmVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgbG9nKGBXZWJTb2NrZXQgc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgV2ViU29ja2V0IHNlcnZlci4nKTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuXG4gICAgLy8gU3RhcnQgRXhwcmVzcyBzZXJ2ZXJcbiAgICBjb25zdCBzZXJ2ZXIgPSBleHByZXNzQXBwLmxpc3RlbihodHRwUG9ydCwgaG9zdCwgKCkgPT4ge1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdTZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlciBzdGFydGVkLicpO1xuXG4gICAgICBkaXNwbGF5U2VydmVyU3RhdHVzKFxuICAgICAgICBodHRwUG9ydCxcbiAgICAgICAgZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLmh0dHBzUG9ydCEsXG4gICAgICAgIHdzUG9ydCxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcXVpZXRcbiAgICAgICk7XG5cbiAgICAgIGZldGNoUHVibGljSXAodXNlUHVibGljSXApLnRoZW4oKHB1YmxpY0lwKSA9PiB7XG4gICAgICAgIGlmKHB1YmxpY0lwKSB7XG4gICAgICAgICAgZGlzcGxheVNlcnZlclN0YXR1cyhcbiAgICAgICAgICAgIGh0dHBQb3J0LFxuICAgICAgICAgICAgZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLmh0dHBzUG9ydCEsXG4gICAgICAgICAgICB3c1BvcnQsXG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgcXVpZXQsXG4gICAgICAgICAgICBwdWJsaWNJcFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIEV4cHJlc3Mgc2VydmVyIGVycm9yc1xuICAgIHNlcnZlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZyhgRXhwcmVzcyBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBzdGFydCBFeHByZXNzIHNlcnZlci4nKTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIGdyYWNlZnVsIHNodXRkb3duXG4gICAgY29uc3Qgc2h1dGRvd24gPSAoKSA9PiB7XG4gICAgICBsb2coJ1xcblNodXR0aW5nIGRvd24gc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuLi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIHNlcnZlci5jbG9zZSgpO1xuICAgICAgd3NTZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIGNhbGxiYWNrKDApO1xuICAgIH07XG5cbiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbignU0lHVEVSTScsIHNodXRkb3duKTtcblxuICAgIC8vIEtlZXAgdGhlIHByb2Nlc3MgYWxpdmVcbiAgICBwcm9jZXNzLnN0ZGluLnJlc3VtZSgpO1xuXG4gICAgbG9nKCdTZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlciBpcyBydW5uaW5nLiBQcmVzcyBDdHJsK0MgdG8gc3RvcC4nLCAnaW5mbycsIHF1aWV0KTtcblxuICAgIC8vIERvbid0IGNhbGwgY2FsbGJhY2sgaGVyZSwgbGV0IHRoZSBwcm9jZXNzIHN0YXkgYWxpdmVcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBzdGFydCBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4nKTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTsiXSwibmFtZXMiOlsiYm94ZW4iLCJjaGFsayIsImV4cHJlc3MiLCJyZWFkRmlsZVN5bmMiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwid3JpdGVGaWxlU3luYyIsImhvbWVkaXIiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJqb2luIiwiaXNBYnNvbHV0ZSIsInBhdGhUb0ZpbGVVUkwiLCJXZWJTb2NrZXRTZXJ2ZXIiLCJMZXhDb25maWciLCJnZXRQYWNrYWdlRGlyIiwiY3JlYXRlU3Bpbm5lciIsInJlbW92ZUZpbGVzIiwibG9nIiwiZ2V0Q2FjaGVEaXIiLCJjYWNoZURpciIsInJlY3Vyc2l2ZSIsImdldENhY2hlUGF0aCIsInJlYWRQdWJsaWNJcENhY2hlIiwiY2FjaGVQYXRoIiwiY2FjaGVEYXRhIiwiY2FjaGUiLCJKU09OIiwicGFyc2UiLCJvbmVXZWVrTXMiLCJEYXRlIiwibm93IiwidGltZXN0YW1wIiwid3JpdGVQdWJsaWNJcENhY2hlIiwiaXAiLCJzdHJpbmdpZnkiLCJmZXRjaFB1YmxpY0lwIiwiZm9yY2VSZWZyZXNoIiwiUHJvbWlzZSIsImNhY2hlZCIsImZldGNoIiwidGhlbiIsInJlcyIsInRleHQiLCJkYXRhIiwidHJpbSIsImNhdGNoIiwidW5kZWZpbmVkIiwiZGlzcGxheVNlcnZlclN0YXR1cyIsImh0dHBQb3J0IiwiaHR0cHNQb3J0Iiwid3NQb3J0IiwiaG9zdCIsInF1aWV0IiwicHVibGljSXAiLCJodHRwVXJsIiwiaHR0cHNVcmwiLCJ3c1VybCIsIndzc1VybCIsInVybExpbmVzIiwiZ3JlZW4iLCJ1bmRlcmxpbmUiLCJzdGF0dXNCb3giLCJjeWFuIiwiYm9sZCIsInllbGxvdyIsImJhY2tncm91bmRDb2xvciIsImJvcmRlckNvbG9yIiwiYm9yZGVyU3R5bGUiLCJtYXJnaW4iLCJwYWRkaW5nIiwiY29uc29sZSIsImxvYWRIYW5kbGVyIiwiaGFuZGxlclBhdGgiLCJvdXRwdXREaXIiLCJoYW5kbGVyUGFydHMiLCJzcGxpdCIsImZpbGVQYXRoIiwiZXhwb3J0TmFtZSIsImxlbmd0aCIsInNsaWNlIiwiaW5jbHVkZXMiLCJlcnJvciIsInBhdGhQYXJ0cyIsImxhc3RQYXJ0IiwiZnVsbFBhdGgiLCJleHRlbnNpb25zIiwicGF0aFdpdGhvdXRFeHQiLCJyZXBsYWNlIiwiZXh0IiwiY2FuZGlkYXRlUGF0aCIsIkVycm9yIiwiaW1wb3J0UGF0aCIsImVuZHNXaXRoIiwiaW1wb3J0VXJsIiwiaHJlZiIsImhhbmRsZXJNb2R1bGUiLCJPYmplY3QiLCJrZXlzIiwiaGFuZGxlciIsImRlZmF1bHQiLCJpbXBvcnRFcnJvciIsIm1lc3NhZ2UiLCJzdGFjayIsImNhcHR1cmVDb25zb2xlTG9ncyIsImV2ZW50IiwiY29udGV4dCIsIm9yaWdpbmFsQ29uc29sZUxvZyIsIm9yaWdpbmFsQ29uc29sZUVycm9yIiwib3JpZ2luYWxDb25zb2xlV2FybiIsIndhcm4iLCJvcmlnaW5hbENvbnNvbGVJbmZvIiwiaW5mbyIsImxvZ3MiLCJhcmdzIiwicHVzaCIsInJlc3VsdCIsImdyYXkiLCJmb3JFYWNoIiwiY3JlYXRlRXhwcmVzc1NlcnZlciIsImNvbmZpZyIsImRlYnVnIiwiYXBwIiwidXNlIiwicmVxIiwibmV4dCIsImhlYWRlciIsIm1ldGhvZCIsInNlbmRTdGF0dXMiLCJqc29uIiwibG9hZEdyYXBoUUxTY2hlbWEiLCJncmFwaHFsSGFuZGxlciIsImZ1bmN0aW9ucyIsImZ1bmN0aW9uTmFtZSIsImZ1bmN0aW9uQ29uZmlnIiwiZW50cmllcyIsImV2ZW50cyIsImh0dHAiLCJwYXRoIiwiZ3JhcGhxbFBhdGgiLCJfZnVuY3Rpb25OYW1lIiwiYm9keSIsInF1ZXJ5IiwidmFyaWFibGVzIiwib3BlcmF0aW9uTmFtZSIsImxvZ01lc3NhZ2UiLCJtYXAiLCJhcmciLCJTdHJpbmciLCJhd3NSZXF1ZXN0SWQiLCJmdW5jdGlvblZlcnNpb24iLCJnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXMiLCJpbnZva2VkRnVuY3Rpb25Bcm4iLCJsb2dHcm91cE5hbWUiLCJsb2dTdHJlYW1OYW1lIiwid3JhcHBlZEhhbmRsZXIiLCJoZWFkZXJzIiwiaHR0cE1ldGhvZCIsInF1ZXJ5U3RyaW5nUGFyYW1ldGVycyIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJrZXkiLCJ2YWx1ZSIsInNldEhlYWRlciIsInNlbmQiLCJ1cmwiLCJwYXRobmFtZSIsIm1hdGNoZWRGdW5jdGlvbiIsImZ1bmN0aW9uTmFtZXMiLCJldmVudFBhdGgiLCJldmVudE1ldGhvZCIsInRvVXBwZXJDYXNlIiwicmVxdWVzdE1ldGhvZCIsIm5vcm1hbGl6ZWRFdmVudFBhdGgiLCJub3JtYWxpemVkUGF0aG5hbWUiLCJtZW1vcnlMaW1pdEluTUIiLCJjcmVhdGVXZWJTb2NrZXRTZXJ2ZXIiLCJ3c3MiLCJwb3J0Iiwib24iLCJ3cyIsInRvU3RyaW5nIiwid2Vic29ja2V0Iiwicm91dGUiLCJhY3Rpb24iLCJyZXF1ZXN0Q29udGV4dCIsImFwaUdhdGV3YXkiLCJlbmRwb2ludCIsImNvbm5lY3Rpb25JZCIsInJvdXRlS2V5IiwibG9hZEVudkZpbGUiLCJlbnZQYXRoIiwiZW52VmFycyIsImVudkNvbnRlbnQiLCJsaW5lcyIsImxpbmUiLCJ0cmltbWVkTGluZSIsInN0YXJ0c1dpdGgiLCJlcXVhbEluZGV4IiwiaW5kZXhPZiIsInN1YnN0cmluZyIsImNsZWFuVmFsdWUiLCJzZXJ2ZXJsZXNzIiwiY21kIiwiY2FsbGJhY2siLCJjbGlOYW1lIiwicmVtb3ZlIiwidGVzdCIsInVzZVB1YmxpY0lwIiwic3Bpbm5lciIsInBhcnNlQ29uZmlnIiwib3V0cHV0RnVsbFBhdGgiLCJlbnZQYXRocyIsInByb2Nlc3MiLCJjd2QiLCJmaWxlRW52VmFycyIsInZhcmlhYmxlc09iaiIsIk5PREVfRU5WIiwiY2xpVmFycyIsIl9lcnJvciIsImVudiIsInN0YXJ0Iiwic3VjY2VlZCIsInNlcnZlcmxlc3NDb25maWciLCJwYWNrYWdlRGlyIiwiY29uZmlnRm9ybWF0cyIsImNvbmZpZ1BhdGgiLCJjb25maWdNb2R1bGUiLCJmaW5hbENvbmZpZyIsImN1c3RvbSIsImNvcnMiLCJleHByZXNzQXBwIiwid3NTZXJ2ZXIiLCJmYWlsIiwic2VydmVyIiwibGlzdGVuIiwic2h1dGRvd24iLCJjbG9zZSIsInN0ZGluIiwicmVzdW1lIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLE9BQU9DLGFBQWEsVUFBVTtBQUM5QixTQUFRQyxZQUFZLEVBQUVDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxhQUFhLFFBQU8sS0FBSztBQUN0RSxTQUFRQyxPQUFPLFFBQU8sS0FBSztBQUMzQixTQUFRQyxXQUFXQyxXQUFXLEVBQUVDLElBQUksRUFBRUMsVUFBVSxRQUFPLE9BQU87QUFDOUQsU0FBUUMsYUFBYSxRQUFPLE1BQU07QUFDbEMsU0FBUUMsZUFBZSxRQUFPLEtBQUs7QUFFbkMsU0FBUUMsU0FBUyxFQUFFQyxhQUFhLFFBQU8scUJBQXFCO0FBQzVELFNBQVFDLGFBQWEsRUFBRUMsV0FBVyxRQUFPLHFCQUFxQjtBQUM5RCxTQUFRQyxHQUFHLFFBQU8scUJBQXFCO0FBbUR2QyxNQUFNQyxjQUFjO0lBQ2xCLE1BQU1DLFdBQVdWLEtBQUtILFdBQVc7SUFDakMsSUFBRyxDQUFDSCxXQUFXZ0IsV0FBVztRQUN4QmYsVUFBVWUsVUFBVTtZQUFDQyxXQUFXO1FBQUk7SUFDdEM7SUFDQSxPQUFPRDtBQUNUO0FBRUEsTUFBTUUsZUFB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
|
package/package.json
CHANGED
package/webpack.config.js
CHANGED
|
@@ -486,7 +486,16 @@ export default (webpackEnv, webpackOptions) => {
|
|
|
486
486
|
{
|
|
487
487
|
loader: cssLoaderPath,
|
|
488
488
|
options: {
|
|
489
|
-
importLoaders: 1
|
|
489
|
+
importLoaders: 1,
|
|
490
|
+
url: {
|
|
491
|
+
filter: (url, resourcePath) => {
|
|
492
|
+
if(url.startsWith('/')) {
|
|
493
|
+
return false;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
return true;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
490
499
|
}
|
|
491
500
|
},
|
|
492
501
|
{
|
|
@@ -498,7 +507,18 @@ export default (webpackEnv, webpackOptions) => {
|
|
|
498
507
|
addDependencyTo: webpack,
|
|
499
508
|
path: [relativeNodePath('', dirName)]
|
|
500
509
|
}),
|
|
501
|
-
postcssUrl(
|
|
510
|
+
postcssUrl({
|
|
511
|
+
// Skip processing absolute URLs (starting with /) - let them pass through as-is
|
|
512
|
+
filter: (asset) => {
|
|
513
|
+
const url = asset.url || '';
|
|
514
|
+
// If URL starts with /, it's an absolute path - don't process it
|
|
515
|
+
if(url.startsWith('/')) {
|
|
516
|
+
return false;
|
|
517
|
+
}
|
|
518
|
+
// Process relative URLs
|
|
519
|
+
return true;
|
|
520
|
+
}
|
|
521
|
+
}),
|
|
502
522
|
postcssFor(),
|
|
503
523
|
postcssPercentage({
|
|
504
524
|
floor: true,
|