@brainfish-ai/devdoc 0.1.25 → 0.1.27
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/README.md +2 -2
- package/dist/cli/commands/create.d.ts +3 -0
- package/dist/cli/commands/create.js +180 -15
- package/dist/cli/commands/dev.js +41 -77
- package/package.json +6 -6
- package/renderer/app/api/docs/route.ts +6 -2
- package/renderer/app/icon.svg +4 -0
- package/renderer/components/docs-viewer/content/doc-page.tsx +17 -2
- package/renderer/components/docs-viewer/content/not-found-page.tsx +330 -0
- package/renderer/components/docs-viewer/index.tsx +56 -4
- package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +20 -0
- package/renderer/app/favicon.ico +0 -0
- package/templates/basic/README.md +0 -139
- package/templates/basic/assets/favicon.svg +0 -4
- package/templates/basic/assets/logo.svg +0 -9
- package/templates/basic/docs.json +0 -47
- package/templates/basic/guides/configuration.mdx +0 -149
- package/templates/basic/guides/overview.mdx +0 -96
- package/templates/basic/index.mdx +0 -39
- package/templates/basic/package.json +0 -14
- package/templates/basic/quickstart.mdx +0 -92
- package/templates/basic/vercel.json +0 -6
- package/templates/graphql/README.md +0 -139
- package/templates/graphql/api-reference/schema.graphql +0 -305
- package/templates/graphql/assets/favicon.svg +0 -4
- package/templates/graphql/assets/logo.svg +0 -9
- package/templates/graphql/docs.json +0 -54
- package/templates/graphql/guides/configuration.mdx +0 -149
- package/templates/graphql/guides/overview.mdx +0 -96
- package/templates/graphql/index.mdx +0 -39
- package/templates/graphql/package.json +0 -14
- package/templates/graphql/quickstart.mdx +0 -92
- package/templates/graphql/vercel.json +0 -6
- package/templates/openapi/README.md +0 -139
- package/templates/openapi/api-reference/openapi.json +0 -419
- package/templates/openapi/assets/favicon.svg +0 -4
- package/templates/openapi/assets/logo.svg +0 -9
- package/templates/openapi/docs.json +0 -61
- package/templates/openapi/guides/configuration.mdx +0 -149
- package/templates/openapi/guides/overview.mdx +0 -96
- package/templates/openapi/index.mdx +0 -39
- package/templates/openapi/package.json +0 -14
- package/templates/openapi/quickstart.mdx +0 -92
- package/templates/openapi/vercel.json +0 -6
package/README.md
CHANGED
|
@@ -393,10 +393,10 @@ npx @brainfish-ai/devdoc build
|
|
|
393
393
|
|
|
394
394
|
```bash
|
|
395
395
|
# Clone the repo
|
|
396
|
-
git clone https://github.com/brainfish/
|
|
396
|
+
git clone https://github.com/brainfish-ai/devdoc-platform
|
|
397
397
|
|
|
398
398
|
# Install dependencies
|
|
399
|
-
cd
|
|
399
|
+
cd devdoc-platform
|
|
400
400
|
npm install
|
|
401
401
|
|
|
402
402
|
# Build and test the CLI
|
|
@@ -2,14 +2,17 @@ declare const TEMPLATES: {
|
|
|
2
2
|
readonly basic: {
|
|
3
3
|
readonly name: "Basic";
|
|
4
4
|
readonly description: "Simple documentation site with guides and pages";
|
|
5
|
+
readonly color: "#10b981";
|
|
5
6
|
};
|
|
6
7
|
readonly openapi: {
|
|
7
8
|
readonly name: "OpenAPI";
|
|
8
9
|
readonly description: "Documentation with REST API reference (OpenAPI/Swagger)";
|
|
10
|
+
readonly color: "#10b981";
|
|
9
11
|
};
|
|
10
12
|
readonly graphql: {
|
|
11
13
|
readonly name: "GraphQL";
|
|
12
14
|
readonly description: "Documentation with GraphQL API playground";
|
|
15
|
+
readonly color: "#e535ab";
|
|
13
16
|
};
|
|
14
17
|
};
|
|
15
18
|
type TemplateType = keyof typeof TEMPLATES;
|
|
@@ -40,21 +40,27 @@ exports.create = create;
|
|
|
40
40
|
const child_process_1 = require("child_process");
|
|
41
41
|
const path_1 = __importDefault(require("path"));
|
|
42
42
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
43
|
+
const giget_1 = require("giget");
|
|
43
44
|
const logger_1 = require("../../utils/logger");
|
|
44
45
|
const constants_1 = require("../../constants");
|
|
45
|
-
//
|
|
46
|
+
// Remote template repository - single starter template
|
|
47
|
+
const TEMPLATE_REPO = 'github:brainfish-ai/devdoc/templates/starter';
|
|
48
|
+
// Available template types (all use the same starter template, just different configs)
|
|
46
49
|
const TEMPLATES = {
|
|
47
50
|
basic: {
|
|
48
51
|
name: 'Basic',
|
|
49
52
|
description: 'Simple documentation site with guides and pages',
|
|
53
|
+
color: '#10b981',
|
|
50
54
|
},
|
|
51
55
|
openapi: {
|
|
52
56
|
name: 'OpenAPI',
|
|
53
57
|
description: 'Documentation with REST API reference (OpenAPI/Swagger)',
|
|
58
|
+
color: '#10b981',
|
|
54
59
|
},
|
|
55
60
|
graphql: {
|
|
56
61
|
name: 'GraphQL',
|
|
57
62
|
description: 'Documentation with GraphQL API playground',
|
|
63
|
+
color: '#e535ab',
|
|
58
64
|
},
|
|
59
65
|
};
|
|
60
66
|
// Simple prompt helper using readline
|
|
@@ -185,6 +191,139 @@ function getPackageManager() {
|
|
|
185
191
|
}
|
|
186
192
|
return 'npm';
|
|
187
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Generate docs.json configuration based on template type
|
|
196
|
+
*/
|
|
197
|
+
function generateDocsConfig(projectName, templateType) {
|
|
198
|
+
const formattedName = formatProjectName(projectName);
|
|
199
|
+
const template = TEMPLATES[templateType];
|
|
200
|
+
// Base configuration (shared across all templates)
|
|
201
|
+
const baseConfig = {
|
|
202
|
+
$schema: 'https://devdoc.sh/docs.json',
|
|
203
|
+
name: formattedName,
|
|
204
|
+
favicon: '/favicon.svg',
|
|
205
|
+
logo: {
|
|
206
|
+
light: '/logo.svg',
|
|
207
|
+
dark: '/logo.svg',
|
|
208
|
+
},
|
|
209
|
+
colors: {
|
|
210
|
+
primary: template.color,
|
|
211
|
+
},
|
|
212
|
+
navigation: {
|
|
213
|
+
tabs: [],
|
|
214
|
+
global: {
|
|
215
|
+
anchors: [
|
|
216
|
+
{
|
|
217
|
+
anchor: 'GitHub',
|
|
218
|
+
href: 'https://github.com/your-org/your-repo',
|
|
219
|
+
icon: 'github-logo',
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
// Documentation tab (always present)
|
|
226
|
+
const docsTab = {
|
|
227
|
+
tab: 'Documentation',
|
|
228
|
+
type: 'docs',
|
|
229
|
+
groups: [
|
|
230
|
+
{
|
|
231
|
+
group: 'Getting Started',
|
|
232
|
+
icon: 'rocket-launch',
|
|
233
|
+
pages: ['index', 'quickstart'],
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
group: 'Guides',
|
|
237
|
+
icon: 'book-open',
|
|
238
|
+
pages: ['guides/overview', 'guides/configuration'],
|
|
239
|
+
},
|
|
240
|
+
],
|
|
241
|
+
};
|
|
242
|
+
baseConfig.navigation.tabs.push(docsTab);
|
|
243
|
+
// Add API reference tab based on template type
|
|
244
|
+
if (templateType === 'openapi') {
|
|
245
|
+
baseConfig.navigation.tabs.push({
|
|
246
|
+
tab: 'API Reference',
|
|
247
|
+
type: 'openapi',
|
|
248
|
+
path: '/api-reference',
|
|
249
|
+
versions: [
|
|
250
|
+
{ version: 'v1', spec: 'api-reference/openapi.json', default: true },
|
|
251
|
+
],
|
|
252
|
+
groups: [
|
|
253
|
+
{
|
|
254
|
+
group: 'Overview',
|
|
255
|
+
icon: 'book-open',
|
|
256
|
+
pages: [
|
|
257
|
+
'api-reference/introduction',
|
|
258
|
+
'api-reference/authentication',
|
|
259
|
+
'api-reference/errors',
|
|
260
|
+
],
|
|
261
|
+
},
|
|
262
|
+
],
|
|
263
|
+
});
|
|
264
|
+
// Add API playground config
|
|
265
|
+
baseConfig.api = {
|
|
266
|
+
baseUrl: 'https://api.example.com',
|
|
267
|
+
playground: {
|
|
268
|
+
mode: 'show',
|
|
269
|
+
},
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
else if (templateType === 'graphql') {
|
|
273
|
+
baseConfig.navigation.tabs.push({
|
|
274
|
+
tab: 'GraphQL API',
|
|
275
|
+
type: 'graphql',
|
|
276
|
+
path: '/graphql-api',
|
|
277
|
+
schema: 'api-reference/schema.graphql',
|
|
278
|
+
endpoint: 'https://api.example.com/graphql',
|
|
279
|
+
groups: [
|
|
280
|
+
{
|
|
281
|
+
group: 'Overview',
|
|
282
|
+
icon: 'book-open',
|
|
283
|
+
pages: [
|
|
284
|
+
'api-reference/introduction',
|
|
285
|
+
'api-reference/authentication',
|
|
286
|
+
],
|
|
287
|
+
},
|
|
288
|
+
],
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
return baseConfig;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Clean up unused API files based on template type
|
|
295
|
+
*/
|
|
296
|
+
function cleanupUnusedFiles(resolvedPath, templateType) {
|
|
297
|
+
const apiRefPath = path_1.default.join(resolvedPath, 'api-reference');
|
|
298
|
+
if (templateType === 'basic') {
|
|
299
|
+
// Remove entire api-reference folder for basic template
|
|
300
|
+
if (fs_extra_1.default.existsSync(apiRefPath)) {
|
|
301
|
+
fs_extra_1.default.removeSync(apiRefPath);
|
|
302
|
+
logger_1.logger.debug('Removed api-reference folder (not needed for basic template)');
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else if (templateType === 'openapi') {
|
|
306
|
+
// Remove GraphQL schema for OpenAPI template
|
|
307
|
+
const graphqlSchema = path_1.default.join(apiRefPath, 'schema.graphql');
|
|
308
|
+
if (fs_extra_1.default.existsSync(graphqlSchema)) {
|
|
309
|
+
fs_extra_1.default.removeSync(graphqlSchema);
|
|
310
|
+
logger_1.logger.debug('Removed schema.graphql (not needed for OpenAPI template)');
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
else if (templateType === 'graphql') {
|
|
314
|
+
// Remove OpenAPI spec and errors.mdx for GraphQL template
|
|
315
|
+
const openapiSpec = path_1.default.join(apiRefPath, 'openapi.json');
|
|
316
|
+
const errorsFile = path_1.default.join(apiRefPath, 'errors.mdx');
|
|
317
|
+
if (fs_extra_1.default.existsSync(openapiSpec)) {
|
|
318
|
+
fs_extra_1.default.removeSync(openapiSpec);
|
|
319
|
+
logger_1.logger.debug('Removed openapi.json (not needed for GraphQL template)');
|
|
320
|
+
}
|
|
321
|
+
if (fs_extra_1.default.existsSync(errorsFile)) {
|
|
322
|
+
fs_extra_1.default.removeSync(errorsFile);
|
|
323
|
+
logger_1.logger.debug('Removed errors.mdx (not needed for GraphQL template)');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
188
327
|
async function create(projectDirectory, options) {
|
|
189
328
|
console.log();
|
|
190
329
|
logger_1.logger.info('🐟 Create DevDoc Doc');
|
|
@@ -277,15 +416,30 @@ async function create(projectDirectory, options) {
|
|
|
277
416
|
console.log();
|
|
278
417
|
// Create project directory
|
|
279
418
|
fs_extra_1.default.ensureDirSync(resolvedPath);
|
|
280
|
-
//
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
419
|
+
// Download template from remote repository (always use starter template)
|
|
420
|
+
logger_1.logger.info('Downloading template...');
|
|
421
|
+
try {
|
|
422
|
+
// Try to download from remote repository first
|
|
423
|
+
await (0, giget_1.downloadTemplate)(TEMPLATE_REPO, {
|
|
424
|
+
dir: resolvedPath,
|
|
425
|
+
force: true,
|
|
426
|
+
});
|
|
427
|
+
logger_1.logger.success('Downloaded starter template');
|
|
428
|
+
}
|
|
429
|
+
catch (downloadError) {
|
|
430
|
+
// Fall back to local templates (for development or offline usage)
|
|
431
|
+
logger_1.logger.debug(`Remote download failed: ${downloadError}`);
|
|
432
|
+
logger_1.logger.info('Falling back to local template...');
|
|
433
|
+
const templateDir = path_1.default.join(__dirname, '..', '..', '..', 'templates', 'starter');
|
|
434
|
+
if (!fs_extra_1.default.existsSync(templateDir)) {
|
|
435
|
+
logger_1.logger.error('Template "starter" not found');
|
|
436
|
+
logger_1.logger.debug(`Looked for template at: ${templateDir}`);
|
|
437
|
+
logger_1.logger.debug('Remote source: ' + TEMPLATE_REPO);
|
|
438
|
+
process.exit(1);
|
|
439
|
+
}
|
|
440
|
+
fs_extra_1.default.copySync(templateDir, resolvedPath, { overwrite: true });
|
|
441
|
+
logger_1.logger.success('Copied local template');
|
|
286
442
|
}
|
|
287
|
-
logger_1.logger.info('Copying template files...');
|
|
288
|
-
fs_extra_1.default.copySync(templateDir, resolvedPath, { overwrite: true });
|
|
289
443
|
// Update package.json with project name
|
|
290
444
|
const pkgPath = path_1.default.join(resolvedPath, 'package.json');
|
|
291
445
|
if (fs_extra_1.default.existsSync(pkgPath)) {
|
|
@@ -293,13 +447,24 @@ async function create(projectDirectory, options) {
|
|
|
293
447
|
pkg.name = projectName;
|
|
294
448
|
fs_extra_1.default.writeJsonSync(pkgPath, pkg, { spaces: 2 });
|
|
295
449
|
}
|
|
296
|
-
//
|
|
450
|
+
// Generate docs.json based on template type
|
|
451
|
+
const docsConfig = generateDocsConfig(projectName, template);
|
|
297
452
|
const docsPath = path_1.default.join(resolvedPath, 'docs.json');
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
453
|
+
fs_extra_1.default.writeJsonSync(docsPath, docsConfig, { spaces: 2 });
|
|
454
|
+
logger_1.logger.success(`Generated docs.json for ${selectedTemplate.name} template`);
|
|
455
|
+
// Update theme.json with template color
|
|
456
|
+
const themePath = path_1.default.join(resolvedPath, 'theme.json');
|
|
457
|
+
if (fs_extra_1.default.existsSync(themePath)) {
|
|
458
|
+
const theme = fs_extra_1.default.readJsonSync(themePath);
|
|
459
|
+
theme.colors = {
|
|
460
|
+
primary: selectedTemplate.color,
|
|
461
|
+
primaryLight: selectedTemplate.color,
|
|
462
|
+
primaryDark: selectedTemplate.color,
|
|
463
|
+
};
|
|
464
|
+
fs_extra_1.default.writeJsonSync(themePath, theme, { spaces: 2 });
|
|
302
465
|
}
|
|
466
|
+
// Clean up unused files based on template type
|
|
467
|
+
cleanupUnusedFiles(resolvedPath, template);
|
|
303
468
|
// Create .devdoc.json with subdomain (not registered until deploy)
|
|
304
469
|
// The subdomain will only be reserved when the user actually deploys
|
|
305
470
|
const devdocConfigPath = path_1.default.join(resolvedPath, '.devdoc.json');
|
|
@@ -372,4 +537,4 @@ async function create(projectDirectory, options) {
|
|
|
372
537
|
console.log('Happy documenting! 📚');
|
|
373
538
|
console.log();
|
|
374
539
|
}
|
|
375
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9jcmVhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4TEEsd0JBdU5DO0FBclpELGlEQUF5QztBQUN6QyxnREFBd0I7QUFDeEIsd0RBQTBCO0FBQzFCLCtDQUE0QztBQUM1QywrQ0FBa0Q7QUFFbEQsc0JBQXNCO0FBQ3RCLE1BQU0sU0FBUyxHQUFHO0lBQ2hCLEtBQUssRUFBRTtRQUNMLElBQUksRUFBRSxPQUFPO1FBQ2IsV0FBVyxFQUFFLGlEQUFpRDtLQUMvRDtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLHlEQUF5RDtLQUN2RTtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLDJDQUEyQztLQUN6RDtDQUNPLENBQUM7QUFrQlgsc0NBQXNDO0FBQ3RDLEtBQUssVUFBVSxNQUFNLENBQUMsUUFBZ0IsRUFBRSxZQUFxQjtJQUMzRCxNQUFNLFFBQVEsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sZUFBZSxHQUFHLFlBQVk7WUFDbEMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxLQUFLLFlBQVksS0FBSztZQUNuQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksQ0FBQztRQUVwQixFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLEVB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ICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBERUZBVUxUX0FQSV9VUkwgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuXG4vLyBBdmFpbGFibGUgdGVtcGxhdGVzXG5jb25zdCBURU1QTEFURVMgPSB7XG4gIGJhc2ljOiB7XG4gICAgbmFtZTogJ0Jhc2ljJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NpbXBsZSBkb2N1bWVudGF0aW9uIHNpdGUgd2l0aCBndWlkZXMgYW5kIHBhZ2VzJyxcbiAgfSxcbiAgb3BlbmFwaToge1xuICAgIG5hbWU6ICdPcGVuQVBJJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RvY3VtZW50YXRpb24gd2l0aCBSRVNUIEFQSSByZWZlcmVuY2UgKE9wZW5BUEkvU3dhZ2dlciknLFxuICB9LFxuICBncmFwaHFsOiB7XG4gICAgbmFtZTogJ0dyYXBoUUwnLFxuICAgIGRlc2NyaXB0aW9uOiAnRG9jdW1lbnRhdGlvbiB3aXRoIEdyYXBoUUwgQVBJIHBsYXlncm91bmQnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBUZW1wbGF0ZVR5cGUgPSBrZXlvZiB0eXBlb2YgVEVNUExBVEVTO1xuXG5pbnRlcmZhY2UgQ3JlYXRlT3B0aW9ucyB7XG4gIHRlbXBsYXRlPzogVGVtcGxhdGVUeXBlO1xuICBnaXQ/OiBib29sZWFuO1xuICBpbnN0YWxsPzogYm9vbGVhbjtcbiAgdXJsPzogc3RyaW5nO1xuICBzdWJkb21haW4/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDaGVja1N1YmRvbWFpblJlc3BvbnNlIHtcbiAgYXZhaWxhYmxlOiBib29sZWFuO1xuICBlcnJvcj86IHN0cmluZztcbiAgc3VnZ2VzdGlvbj86IHN0cmluZztcbn1cblxuLy8gU2ltcGxlIHByb21wdCBoZWxwZXIgdXNpbmcgcmVhZGxpbmVcbmFzeW5jIGZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlRdWVzdGlvbiA9IGRlZmF1bHRWYWx1ZSBcbiAgICAgID8gYCR7cXVlc3Rpb259ICgke2RlZmF1bHRWYWx1ZX0pOiBgXG4gICAgICA6IGAke3F1ZXN0aW9ufTogYDtcbiAgICBcbiAgICBybC5xdWVzdGlvbihkaXNwbGF5UXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkgfHwgZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdFNlbGVjdChxdWVzdGlvbjogc3RyaW5nLCBjaG9pY2VzOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc29sZS5sb2coYFxcbiR7cXVlc3Rpb259XFxuYCk7XG4gIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpKSA9PiB7XG4gICAgY29uc29sZS5sb2coYCAgJHtpICsgMX0uICR7Y2hvaWNlLmxhYmVsfWApO1xuICB9KTtcbiAgY29uc29sZS5sb2coKTtcbiAgXG4gIGNvbnN0IHJlYWRsaW5lID0gYXdhaXQgaW1wb3J0KCdyZWFkbGluZScpO1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmwucXVlc3Rpb24oJ0VudGVyIG51bWJlcjogJywgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoYW5zd2VyLnRyaW0oKSwgMTApIC0gMTtcbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgY2hvaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzb2x2ZShjaG9pY2VzW2luZGV4XS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IHRvIGZpcnN0IGNob2ljZVxuICAgICAgICByZXNvbHZlKGNob2ljZXNbMF0udmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvbXB0Q29uZmlybShxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWUgPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGhpbnQgPSBkZWZhdWx0VmFsdWUgPyAnW1kvbl0nIDogJ1t5L05dJztcbiAgICBybC5xdWVzdGlvbihgJHtxdWVzdGlvbn0gJHtoaW50fTogYCwgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBhbnN3ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAobm9ybWFsaXplZCA9PT0gJycpIHtcbiAgICAgICAgcmVzb2x2ZShkZWZhdWx0VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShub3JtYWxpemVkID09PSAneScgfHwgbm9ybWFsaXplZCA9PT0gJ3llcycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9qZWN0TmFtZShuYW1lOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1Byb2plY3QgbmFtZSBpcyByZXF1aXJlZCcgfTtcbiAgfVxuICBcbiAgLy8gQ2hlY2sgZm9yIHZhbGlkIG5wbSBwYWNrYWdlIG5hbWVcbiAgaWYgKCEvXlthLXowLTldW2EtejAtOS0uX10qJC9pLnRlc3QobmFtZSkpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnSW52YWxpZCBwcm9qZWN0IG5hbWUuIFVzZSBsb3dlcmNhc2UgbGV0dGVycywgbnVtYmVycywgYW5kIGRhc2hlcy4nIH07XG4gIH1cbiAgXG4gIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG59XG5cbi8qKlxuICogQmFzaWMgc3ViZG9tYWluIGZvcm1hdCB2YWxpZGF0aW9uIChzZXJ2ZXIgZG9lcyBmdWxsIHZhbGlkYXRpb24gaW5jbHVkaW5nIGJsYWNrbGlzdClcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN1YmRvbWFpbkZvcm1hdChzdWJkb21haW46IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICBpZiAoIXN1YmRvbWFpbikge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gaXMgcmVxdWlyZWQnIH07XG4gIH1cbiAgXG4gIGlmIChzdWJkb21haW4ubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnMnIH07XG4gIH1cbiAgXG4gIGlmIChzdWJkb21haW4ubGVuZ3RoID4gNjMpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3QgYmUgNjMgY2hhcmFjdGVycyBvciBsZXNzJyB9O1xuICB9XG4gIFxuICBpZiAoIS9eW2EtejAtOV0oW2EtejAtOS1dKlthLXowLTldKT8kLy50ZXN0KHN1YmRvbWFpbikpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIGFscGhhbnVtZXJpYywgY2FuIGNvbnRhaW4gaHlwaGVucycgfTtcbiAgfVxuICBcbiAgaWYgKC8tLS8udGVzdChzdWJkb21haW4pKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBjYW5ub3QgY29udGFpbiBjb25zZWN1dGl2ZSBoeXBoZW5zJyB9O1xuICB9XG4gIFxuICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xufVxuXG4vKipcbiAqIENoZWNrIHN1YmRvbWFpbiBhdmFpbGFiaWxpdHkgdmlhIEFQSSAoYWxzbyB2YWxpZGF0ZXMgYWdhaW5zdCBzZXJ2ZXIgYmxhY2tsaXN0KVxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja1N1YmRvbWFpbkF2YWlsYWJpbGl0eShcbiAgc3ViZG9tYWluOiBzdHJpbmcsXG4gIGFwaVVybDogc3RyaW5nXG4pOiBQcm9taXNlPENoZWNrU3ViZG9tYWluUmVzcG9uc2U+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL3N1YmRvbWFpbnMvY2hlY2tgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHN1YmRvbWFpbiB9KSxcbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2hlY2tTdWJkb21haW5SZXNwb25zZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZiBBUEkgaXMgdW5hdmFpbGFibGUsIGFsbG93IHByb2NlZWRpbmcgKHdpbGwgZmFpbCBhdCByZWdpc3RyYXRpb24gaWYgaW52YWxpZClcbiAgICByZXR1cm4geyBhdmFpbGFibGU6IHRydWUgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRQcm9qZWN0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmFtZVxuICAgIC5yZXBsYWNlKC8tL2csICcgJylcbiAgICAucmVwbGFjZSgvXFxiXFx3L2csIChjaGFyKSA9PiBjaGFyLnRvVXBwZXJDYXNlKCkpO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlTWFuYWdlcigpOiBzdHJpbmcge1xuICBjb25zdCB1c2VyQWdlbnQgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3VzZXJfYWdlbnQgfHwgJyc7XG4gIFxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoJ3lhcm4nKSkge1xuICAgIHJldHVybiAneWFybic7XG4gIH1cbiAgXG4gIGlmICh1c2VyQWdlbnQuc3RhcnRzV2l0aCgncG5wbScpKSB7XG4gICAgcmV0dXJuICdwbnBtJztcbiAgfVxuICBcbiAgcmV0dXJuICducG0nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlKHByb2plY3REaXJlY3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCwgb3B0aW9uczogQ3JlYXRlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuaW5mbygn8J+QnyBDcmVhdGUgRGV2RG9jIERvYycpO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIGNvbnN0IGFwaVVybCA9IG9wdGlvbnMudXJsIHx8IHByb2Nlc3MuZW52LkRFVkRPQ19BUElfVVJMIHx8IERFRkFVTFRfQVBJX1VSTDtcblxuICAvLyBHZXQgcHJvamVjdCBuYW1lIGlmIG5vdCBwcm92aWRlZFxuICBsZXQgcHJvamVjdFBhdGggPSBwcm9qZWN0RGlyZWN0b3J5O1xuXG4gIGlmICghcHJvamVjdFBhdGgpIHtcbiAgICBwcm9qZWN0UGF0aCA9IGF3YWl0IHByb21wdCgnV2hhdCBpcyB5b3VyIHByb2plY3QgbmFtZWQ/JywgJ215LWRvY3MnKTtcbiAgICBcbiAgICBpZiAoIXByb2plY3RQYXRoKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1Byb2plY3QgbmFtZSBpcyByZXF1aXJlZCcpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHByb2plY3QgbmFtZVxuICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVQcm9qZWN0TmFtZShwcm9qZWN0UGF0aCk7XG4gIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgIGxvZ2dlci5lcnJvcih2YWxpZGF0aW9uLmVycm9yIHx8ICdJbnZhbGlkIHByb2plY3QgbmFtZScpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIEdldCB0ZW1wbGF0ZSBzZWxlY3Rpb24gaWYgbm90IHByb3ZpZGVkXG4gIGxldCB0ZW1wbGF0ZTogVGVtcGxhdGVUeXBlID0gb3B0aW9ucy50ZW1wbGF0ZSB8fCAnYmFzaWMnO1xuICBcbiAgaWYgKCFvcHRpb25zLnRlbXBsYXRlKSB7XG4gICAgY29uc3QgdGVtcGxhdGVDaG9pY2VzID0gT2JqZWN0LmVudHJpZXMoVEVNUExBVEVTKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgIHZhbHVlOiBrZXksXG4gICAgICBsYWJlbDogYCR7dmFsdWUubmFtZX0gLSAke3ZhbHVlLmRlc2NyaXB0aW9ufWAsXG4gICAgfSkpO1xuXG4gICAgdGVtcGxhdGUgPSBhd2FpdCBwcm9tcHRTZWxlY3QoJ1doaWNoIHRlbXBsYXRlIHdvdWxkIHlvdSBsaWtlIHRvIHVzZT8nLCB0ZW1wbGF0ZUNob2ljZXMpIGFzIFRlbXBsYXRlVHlwZTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgZnVsbCBwYXRoXG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0UGF0aCk7XG4gIGNvbnN0IHByb2plY3ROYW1lID0gcGF0aC5iYXNlbmFtZShyZXNvbHZlZFBhdGgpO1xuICBjb25zdCBzbHVnID0gcHJvamVjdE5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuXG4gIC8vIEdldCBzdWJkb21haW4gLSBwcm9tcHQgaWYgbm90IHByb3ZpZGVkXG4gIGxldCBzdWJkb21haW4gPSBvcHRpb25zLnN1YmRvbWFpbjtcbiAgXG4gIGlmICghc3ViZG9tYWluKSB7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBzdWJkb21haW4gPSBhd2FpdCBwcm9tcHQoYEVudGVyIHN1YmRvbWFpbiBmb3IgeW91ciBkb2NzICgke3NsdWd9LmRldmRvYy5zaClgLCBzbHVnKTtcbiAgICBzdWJkb21haW4gPSBzdWJkb21haW4udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgc3ViZG9tYWluIGZvcm1hdCBsb2NhbGx5XG4gIGNvbnN0IGZvcm1hdENoZWNrID0gaXNWYWxpZFN1YmRvbWFpbkZvcm1hdChzdWJkb21haW4pO1xuICBpZiAoIWZvcm1hdENoZWNrLnZhbGlkKSB7XG4gICAgbG9nZ2VyLmVycm9yKGZvcm1hdENoZWNrLmVycm9yISk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gQ2hlY2sgc3ViZG9tYWluIGF2YWlsYWJpbGl0eSB2aWEgQVBJIChzZXJ2ZXIgdmFsaWRhdGVzIGJsYWNrbGlzdClcbiAgLy8gTG9vcCB1bnRpbCB3ZSBmaW5kIGFuIGF2YWlsYWJsZSBzdWJkb21haW5cbiAgbGV0IHN1YmRvbWFpbkF2YWlsYWJsZSA9IGZhbHNlO1xuICB3aGlsZSAoIXN1YmRvbWFpbkF2YWlsYWJsZSkge1xuICAgIGxvZ2dlci5pbmZvKGBDaGVja2luZyBpZiAke3N1YmRvbWFpbn0uZGV2ZG9jLnNoIGlzIGF2YWlsYWJsZS4uLmApO1xuICAgIGNvbnN0IGF2YWlsYWJpbGl0eSA9IGF3YWl0IGNoZWNrU3ViZG9tYWluQXZhaWxhYmlsaXR5KHN1YmRvbWFpbiwgYXBpVXJsKTtcbiAgICBcbiAgICBpZiAoIWF2YWlsYWJpbGl0eS5hdmFpbGFibGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBsb2dnZXIud2FybihhdmFpbGFiaWxpdHkuZXJyb3IgfHwgYFN1YmRvbWFpbiBcIiR7c3ViZG9tYWlufVwiIGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgIFxuICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGF2YWlsYWJpbGl0eS5zdWdnZXN0aW9uIHx8IGAke3N1YmRvbWFpbn0tZG9jc2A7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgbG9nZ2VyLmluZm8oYFN1Z2dlc3Rpb246ICR7c3VnZ2VzdGlvbn0uZGV2ZG9jLnNoYCk7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgXG4gICAgICAvLyBQcm9tcHQgZm9yIG5ldyBzdWJkb21haW5cbiAgICAgIHN1YmRvbWFpbiA9IGF3YWl0IHByb21wdCgnRW50ZXIgYSBkaWZmZXJlbnQgc3ViZG9tYWluJywgc3VnZ2VzdGlvbik7XG4gICAgICBzdWJkb21haW4gPSBzdWJkb21haW4udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBmb3JtYXRcbiAgICAgIGNvbnN0IGZvcm1hdENoZWNrID0gaXNWYWxpZFN1YmRvbWFpbkZvcm1hdChzdWJkb21haW4pO1xuICAgICAgaWYgKCFmb3JtYXRDaGVjay52YWxpZCkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoZm9ybWF0Q2hlY2suZXJyb3IhKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1YmRvbWFpbkF2YWlsYWJsZSA9IHRydWU7XG4gICAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTICR7c3ViZG9tYWlufS5kZXZkb2Muc2ggaXMgYXZhaWxhYmxlIWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIGRpcmVjdG9yeSBleGlzdHNcbiAgaWYgKGZzLmV4aXN0c1N5bmMocmVzb2x2ZWRQYXRoKSkge1xuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMocmVzb2x2ZWRQYXRoKTtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgb3ZlcndyaXRlID0gYXdhaXQgcHJvbXB0Q29uZmlybShgRGlyZWN0b3J5ICR7cHJvamVjdE5hbWV9IGlzIG5vdCBlbXB0eS4gQ29udGludWUgYW55d2F5P2AsIGZhbHNlKTtcbiAgICAgIFxuICAgICAgaWYgKCFvdmVyd3JpdGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdPcGVyYXRpb24gY2FuY2VsbGVkJyk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzZWxlY3RlZFRlbXBsYXRlID0gVEVNUExBVEVTW3RlbXBsYXRlXTtcbiAgY29uc29sZS5sb2coKTtcbiAgbG9nZ2VyLmluZm8oYENyZWF0aW5nIGEgbmV3ICR7c2VsZWN0ZWRUZW1wbGF0ZS5uYW1lfSBEZXZEb2MgZG9jdW1lbnRhdGlvbiBzaXRlIGluICR7cmVzb2x2ZWRQYXRofWApO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIC8vIENyZWF0ZSBwcm9qZWN0IGRpcmVjdG9yeVxuICBmcy5lbnN1cmVEaXJTeW5jKHJlc29sdmVkUGF0aCk7XG5cbiAgLy8gQ29weSB0ZW1wbGF0ZVxuICBjb25zdCB0ZW1wbGF0ZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICd0ZW1wbGF0ZXMnLCB0ZW1wbGF0ZSk7XG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcGxhdGVEaXIpKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBUZW1wbGF0ZSBcIiR7dGVtcGxhdGV9XCIgbm90IGZvdW5kYCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBMb29rZWQgZm9yIHRlbXBsYXRlIGF0OiAke3RlbXBsYXRlRGlyfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKCdDb3B5aW5nIHRlbXBsYXRlIGZpbGVzLi4uJyk7XG4gIGZzLmNvcHlTeW5jKHRlbXBsYXRlRGlyLCByZXNvbHZlZFBhdGgsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuXG4gIC8vIFVwZGF0ZSBwYWNrYWdlLmpzb24gd2l0aCBwcm9qZWN0IG5hbWVcbiAgY29uc3QgcGtnUGF0aCA9IHBhdGguam9pbihyZXNvbHZlZFBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGtnUGF0aCkpIHtcbiAgICBjb25zdCBwa2cgPSBmcy5yZWFkSnNvblN5bmMocGtnUGF0aCk7XG4gICAgcGtnLm5hbWUgPSBwcm9qZWN0TmFtZTtcbiAgICBmcy53cml0ZUpzb25TeW5jKHBrZ1BhdGgsIHBrZywgeyBzcGFjZXM6IDIgfSk7XG4gIH1cblxuICAvLyBVcGRhdGUgZG9jcy5qc29uIHdpdGggcHJvamVjdCBuYW1lXG4gIGNvbnN0IGRvY3NQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkUGF0aCwgJ2RvY3MuanNvbicpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhkb2NzUGF0aCkpIHtcbiAgICBjb25zdCBkb2NzID0gZnMucmVhZEpzb25TeW5jKGRvY3NQYXRoKTtcbiAgICBkb2NzLm5hbWUgPSBmb3JtYXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7XG4gICAgZnMud3JpdGVKc29uU3luYyhkb2NzUGF0aCwgZG9jcywgeyBzcGFjZXM6IDIgfSk7XG4gIH1cblxuICAvLyBDcmVhdGUgLmRldmRvYy5qc29uIHdpdGggc3ViZG9tYWluIChub3QgcmVnaXN0ZXJlZCB1bnRpbCBkZXBsb3kpXG4gIC8vIFRoZSBzdWJkb21haW4gd2lsbCBvbmx5IGJlIHJlc2VydmVkIHdoZW4gdGhlIHVzZXIgYWN0dWFsbHkgZGVwbG95c1xuICBjb25zdCBkZXZkb2NDb25maWdQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkUGF0aCwgJy5kZXZkb2MuanNvbicpO1xuICBcbiAgY29uc3QgZGV2ZG9jQ29uZmlnID0ge1xuICAgIHByb2plY3RJZDogYCR7c2x1Z30tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCl9YCxcbiAgICBuYW1lOiBmb3JtYXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSksXG4gICAgc2x1Zzogc2x1ZyxcbiAgICBzdWJkb21haW46IHN1YmRvbWFpbixcbiAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAvLyBOb3RlOiBObyBhcGlLZXkgLSBzdWJkb21haW4gaXMgbm90IHJlc2VydmVkIHVudGlsIGRlcGxveVxuICB9O1xuICBmcy53cml0ZUpzb25TeW5jKGRldmRvY0NvbmZpZ1BhdGgsIGRldmRvY0NvbmZpZywgeyBzcGFjZXM6IDIgfSk7XG4gIGxvZ2dlci5zdWNjZXNzKCdDcmVhdGVkIC5kZXZkb2MuanNvbicpO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZygnICBTdWJkb21haW46JywgYCR7c3ViZG9tYWlufS5kZXZkb2Muc2hgKTtcbiAgY29uc29sZS5sb2coJyAgU3RhdHVzOicsICdOb3QgeWV0IGRlcGxveWVkIChzdWJkb21haW4gd2lsbCBiZSByZXNlcnZlZCBvbiBmaXJzdCBkZXBsb3kpJyk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBnaXRcbiAgaWYgKG9wdGlvbnMuZ2l0ICE9PSBmYWxzZSkge1xuICAgIGxvZ2dlci5pbmZvKCdJbml0aWFsaXppbmcgZ2l0IHJlcG9zaXRvcnkuLi4nKTtcbiAgICB0cnkge1xuICAgICAgZXhlY1N5bmMoJ2dpdCBpbml0JywgeyBjd2Q6IHJlc29sdmVkUGF0aCwgc3RkaW86ICdpZ25vcmUnIH0pO1xuICAgICAgZXhlY1N5bmMoJ2dpdCBhZGQgLUEnLCB7IGN3ZDogcmVzb2x2ZWRQYXRoLCBzdGRpbzogJ2lnbm9yZScgfSk7XG4gICAgICBleGVjU3luYygnZ2l0IGNvbW1pdCAtbSBcIkluaXRpYWwgY29tbWl0IGZyb20gZGV2ZG9jIGNyZWF0ZVwiJywge1xuICAgICAgICBjd2Q6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgICAgfSk7XG4gICAgICBsb2dnZXIuc3VjY2VzcygnR2l0IHJlcG9zaXRvcnkgaW5pdGlhbGl6ZWQnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGxvZ2dlci53YXJuKCdDb3VsZCBub3QgaW5pdGlhbGl6ZSBnaXQgcmVwb3NpdG9yeScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEluc3RhbGwgZGVwZW5kZW5jaWVzXG4gIGlmIChvcHRpb25zLmluc3RhbGwgIT09IGZhbHNlKSB7XG4gICAgbG9nZ2VyLmluZm8oJ0luc3RhbGxpbmcgZGVwZW5kZW5jaWVzLi4uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gZ2V0UGFja2FnZU1hbmFnZXIoKTtcbiAgICAgIGV4ZWNTeW5jKGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCwge1xuICAgICAgICBjd2Q6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoJ0RlcGVuZGVuY2llcyBpbnN0YWxsZWQnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGxvZ2dlci53YXJuKCdDb3VsZCBub3QgaW5zdGFsbCBkZXBlbmRlbmNpZXMnKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdWNjZXNzIG1lc3NhZ2VcbiAgY29uc29sZS5sb2coKTtcbiAgbG9nZ2VyLnN1Y2Nlc3MoYENyZWF0ZWQgJHtwcm9qZWN0TmFtZX0gYXQgJHtyZXNvbHZlZFBhdGh9YCk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCdZb3VyIGRvY3Mgd2lsbCBiZSBhdmFpbGFibGUgYXQ6Jyk7XG4gIGNvbnNvbGUubG9nKGAgIGh0dHBzOi8vJHtzdWJkb21haW59LmRldmRvYy5zaGApO1xuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuaW5mbygnTm90ZTogVGhlIHN1YmRvbWFpbiB3aWxsIGJlIHJlc2VydmVkIHdoZW4geW91IHJ1biBcImRldmRvYyBkZXBsb3lcIicpO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZygnSW5zaWRlIHRoYXQgZGlyZWN0b3J5LCB5b3UgY2FuIHJ1biBzZXZlcmFsIGNvbW1hbmRzOicpO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZygnICBucG0gcnVuIGRldicpO1xuICBjb25zb2xlLmxvZygnICAgIFN0YXJ0cyB0aGUgZGV2ZWxvcG1lbnQgc2VydmVyLicpO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZygnICBkZXZkb2MgZGVwbG95Jyk7XG4gIGNvbnNvbGUubG9nKCcgICAgRGVwbG95cyBhbmQgY2xhaW1zIHlvdXIgc3ViZG9tYWluLicpO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZygnV2Ugc3VnZ2VzdCB0aGF0IHlvdSBiZWdpbiBieSB0eXBpbmc6Jyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKGAgIGNkICR7cHJvamVjdE5hbWV9YCk7XG4gIGNvbnNvbGUubG9nKCcgIG5wbSBydW4gZGV2Jyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCdIYXBweSBkb2N1bWVudGluZyEg8J+TmicpO1xuICBjb25zb2xlLmxvZygpO1xufVxuIl19
|
|
540
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9jcmVhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnVkEsd0JBb1BDO0FBcGtCRCxpREFBeUM7QUFDekMsZ0RBQXdCO0FBQ3hCLHdEQUEwQjtBQUMxQixpQ0FBeUM7QUFDekMsK0NBQTRDO0FBQzVDLCtDQUFrRDtBQUVsRCx1REFBdUQ7QUFDdkQsTUFBTSxhQUFhLEdBQUcsOENBQThDLENBQUM7QUFFckUsdUZBQXVGO0FBQ3ZGLE1BQU0sU0FBUyxHQUFHO0lBQ2hCLEtBQUssRUFBRTtRQUNMLElBQUksRUFBRSxPQUFPO1FBQ2IsV0FBVyxFQUFFLGlEQUFpRDtRQUM5RCxLQUFLLEVBQUUsU0FBUztLQUNqQjtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLHlEQUF5RDtRQUN0RSxLQUFLLEVBQUUsU0FBUztLQUNqQjtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLDJDQUEyQztRQUN4RCxLQUFLLEVBQUUsU0FBUztLQUNqQjtDQUNPLENBQUM7QUFrQlgsc0NBQXNDO0FBQ3RDLEtBQUssVUFBVSxNQUFNLENBQUMsUUFBZ0IsRUFBRSxZQUFxQjtJQUMzRCxNQUFNLFFBQVEsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sZUFBZSxHQUFHLFlBQVk7WUFDbEMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxLQUFLLFlBQVksS0FBSztZQUNuQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksQ0FBQztRQUVwQixFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsS0FBSyxVQUFVLFlBQVksQ0FBQyxRQUFnQixFQUFFLE9BQTJDO0lBQ3ZGLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDO0lBQy9CLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFZCxNQUFNLFFBQVEsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN2QyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sMEJBQTBCO2dCQUMxQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxhQUFhLENBQUMsUUFBZ0IsRUFBRSxZQUFZLEdBQUcsS0FBSztJQUNqRSxNQUFNLFFBQVEsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDOUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzlDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQyxJQUFJLFVBQVUsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsVUFBVSxLQUFLLEdBQUcsSUFBSSxVQUFVLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDdEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxJQUFZO0lBQ3ZDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSwwQkFBMEIsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFRCxtQ0FBbUM7SUFDbkMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxtRUFBbUUsRUFBRSxDQUFDO0lBQ3RHLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsc0JBQXNCLENBQUMsU0FBaUI7SUFDL0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUseUNBQXlDLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSx5Q0FBeUMsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFRCxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLHFFQUFxRSxFQUFFLENBQUM7SUFDeEcsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSw4Q0FBOEMsRUFBRSxDQUFDO0lBQ2pGLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSwwQkFBMEIsQ0FDdkMsU0FBaUIsRUFDakIsTUFBYztJQUVkLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSx1QkFBdUIsRUFBRTtZQUM3RCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUNwQyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQTRCLENBQUM7UUFDL0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGlGQUFpRjtRQUNqRixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sSUFBSTtTQUNSLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1NBQ2xCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFTLGlCQUFpQjtJQUN4QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLEVBQUUsQ0FBQztJQUUxRCxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxXQUFtQixFQUFFLFlBQTBCO0lBQ3pFLE1BQU0sYUFBYSxHQUFHLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUV6QyxtREFBbUQ7SUFDbkQsTUFBTSxVQUFVLEdBQUc7UUFDakIsT0FBTyxFQUFFLDZCQUE2QjtRQUN0QyxJQUFJLEVBQUUsYUFBYTtRQUNuQixPQUFPLEVBQUUsY0FBYztRQUN2QixJQUFJLEVBQUU7WUFDSixLQUFLLEVBQUUsV0FBVztZQUNsQixJQUFJLEVBQUUsV0FBVztTQUNsQjtRQUNELE1BQU0sRUFBRTtZQUNOLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSztTQUN4QjtRQUNELFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRSxFQUFjO1lBQ3BCLE1BQU0sRUFBRTtnQkFDTixPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsTUFBTSxFQUFFLFFBQVE7d0JBQ2hCLElBQUksRUFBRSx1Q0FBdUM7d0JBQzdDLElBQUksRUFBRSxhQUFhO3FCQUNwQjtpQkFDRjthQUNGO1NBQ0Y7S0FDRixDQUFDO0lBRUYscUNBQXFDO0lBQ3JDLE1BQU0sT0FBTyxHQUFHO1FBQ2QsR0FBRyxFQUFFLGVBQWU7UUFDcEIsSUFBSSxFQUFFLE1BQU07UUFDWixNQUFNLEVBQUU7WUFDTjtnQkFDRSxLQUFLLEVBQUUsaUJBQWlCO2dCQUN4QixJQUFJLEVBQUUsZUFBZTtnQkFDckIsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQzthQUMvQjtZQUNEO2dCQUNFLEtBQUssRUFBRSxRQUFRO2dCQUNmLElBQUksRUFBRSxXQUFXO2dCQUNqQixLQUFLLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQzthQUNuRDtTQUNGO0tBQ0YsQ0FBQztJQUVGLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV6QywrQ0FBK0M7SUFDL0MsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDL0IsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzlCLEdBQUcsRUFBRSxlQUFlO1lBQ3BCLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixRQUFRLEVBQUU7Z0JBQ1IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO2FBQ3JFO1lBQ0QsTUFBTSxFQUFFO2dCQUNOO29CQUNFLEtBQUssRUFBRSxVQUFVO29CQUNqQixJQUFJLEVBQUUsV0FBVztvQkFDakIsS0FBSyxFQUFFO3dCQUNMLDRCQUE0Qjt3QkFDNUIsOEJBQThCO3dCQUM5QixzQkFBc0I7cUJBQ3ZCO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCw0QkFBNEI7UUFDM0IsVUFBa0IsQ0FBQyxHQUFHLEdBQUc7WUFDeEIsT0FBTyxFQUFFLHlCQUF5QjtZQUNsQyxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLE1BQU07YUFDYjtTQUNGLENBQUM7SUFDSixDQUFDO1NBQU0sSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzlCLEdBQUcsRUFBRSxhQUFhO1lBQ2xCLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLGNBQWM7WUFDcEIsTUFBTSxFQUFFLDhCQUE4QjtZQUN0QyxRQUFRLEVBQUUsaUNBQWlDO1lBQzNDLE1BQU0sRUFBRTtnQkFDTjtvQkFDRSxLQUFLLEVBQUUsVUFBVTtvQkFDakIsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLEtBQUssRUFBRTt3QkFDTCw0QkFBNEI7d0JBQzVCLDhCQUE4QjtxQkFDL0I7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFlBQW9CLEVBQUUsWUFBMEI7SUFDMUUsTUFBTSxVQUFVLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFNUQsSUFBSSxZQUFZLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDN0Isd0RBQXdEO1FBQ3hELElBQUksa0JBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM5QixrQkFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixlQUFNLENBQUMsS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDL0UsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0Qyw2Q0FBNkM7UUFDN0MsTUFBTSxhQUFhLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM5RCxJQUFJLGtCQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDakMsa0JBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0IsZUFBTSxDQUFDLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQzNFLENBQUM7SUFDSCxDQUFDO1NBQU0sSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEMsMERBQTBEO1FBQzFELE1BQU0sV0FBVyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sVUFBVSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3ZELElBQUksa0JBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUMvQixrQkFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMzQixlQUFNLENBQUMsS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELElBQUksa0JBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM5QixrQkFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixlQUFNLENBQUMsS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDdkUsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRU0sS0FBSyxVQUFVLE1BQU0sQ0FBQyxnQkFBb0MsRUFBRSxPQUFzQjtJQUN2RixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDZCxlQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDcEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRWQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSwyQkFBZSxDQUFDO0lBRTVFLG1DQUFtQztJQUNuQyxJQUFJLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQztJQUVuQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsV0FBVyxHQUFHLE1BQU0sTUFBTSxDQUFDLDZCQUE2QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXJFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixlQUFNLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDekMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixNQUFNLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLGVBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELHlDQUF5QztJQUN6QyxJQUFJLFFBQVEsR0FBaUIsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUM7SUFFekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QixNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLEtBQUssRUFBRSxHQUFHO1lBQ1YsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksTUFBTSxLQUFLLENBQUMsV0FBVyxFQUFFO1NBQzlDLENBQUMsQ0FBQyxDQUFDO1FBRUosUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLHVDQUF1QyxFQUFFLGVBQWUsQ0FBaUIsQ0FBQztJQUMxRyxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLGNBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0MsTUFBTSxXQUFXLEdBQUcsY0FBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXpGLHlDQUF5QztJQUN6QyxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBRWxDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLFNBQVMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxrQ0FBa0MsSUFBSSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEYsU0FBUyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELG9DQUFvQztJQUNwQyxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLGVBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQU0sQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSw0Q0FBNEM7SUFDNUMsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDL0IsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsZUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLFNBQVMsNEJBQTRCLENBQUMsQ0FBQztRQUNsRSxNQUFNLFlBQVksR0FBRyxNQUFNLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6RSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLGVBQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxjQUFjLFNBQVMsb0JBQW9CLENBQUMsQ0FBQztZQUUvRSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsVUFBVSxJQUFJLEdBQUcsU0FBUyxPQUFPLENBQUM7WUFDbEUsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsZUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLFVBQVUsWUFBWSxDQUFDLENBQUM7WUFDbkQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBRWQsMkJBQTJCO1lBQzNCLFNBQVMsR0FBRyxNQUFNLE1BQU0sQ0FBQyw2QkFBNkIsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNwRSxTQUFTLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV0RixrQkFBa0I7WUFDbEIsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsZUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBTSxDQUFDLENBQUM7Z0JBQ2pDLFNBQVM7WUFDWCxDQUFDO1lBRUQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7YUFBTSxDQUFDO1lBQ04sa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBQzFCLGVBQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLDBCQUEwQixDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLGtCQUFFLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLFNBQVMsR0FBRyxNQUFNLGFBQWEsQ0FBQyxhQUFhLFdBQVcsaUNBQWlDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFeEcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLGVBQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDZCxlQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixnQkFBZ0IsQ0FBQyxJQUFJLGlDQUFpQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3BHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUVkLDJCQUEyQjtJQUMzQixrQkFBRSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUUvQix5RUFBeUU7SUFDekUsZUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBRXZDLElBQUksQ0FBQztRQUNILCtDQUErQztRQUMvQyxNQUFNLElBQUEsd0JBQWdCLEVBQUMsYUFBYSxFQUFFO1lBQ3BDLEdBQUcsRUFBRSxZQUFZO1lBQ2pCLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsZUFBTSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFBQyxPQUFPLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLGtFQUFrRTtRQUNsRSxlQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELGVBQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUVqRCxNQUFNLFdBQVcsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFbkYsSUFBSSxDQUFDLGtCQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsZUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQzdDLGVBQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDdkQsZUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxhQUFhLENBQUMsQ0FBQztZQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFFRCxrQkFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUQsZUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsTUFBTSxPQUFPLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDeEQsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLGtCQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO1FBQ3ZCLGtCQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3RCxNQUFNLFFBQVEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0RCxrQkFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEQsZUFBTSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsZ0JBQWdCLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQztJQUU1RSx3Q0FBd0M7SUFDeEMsTUFBTSxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDeEQsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLGtCQUFFLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLEtBQUssQ0FBQyxNQUFNLEdBQUc7WUFDYixPQUFPLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztZQUMvQixZQUFZLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztZQUNwQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztTQUNwQyxDQUFDO1FBQ0Ysa0JBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCwrQ0FBK0M7SUFDL0Msa0JBQWtCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTNDLG1FQUFtRTtJQUNuRSxxRUFBcUU7SUFDckUsTUFBTSxnQkFBZ0IsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUVqRSxNQUFNLFlBQVksR0FBRztRQUNuQixTQUFTLEVBQUUsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ2xFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7UUFDcEMsSUFBSSxFQUFFLElBQUk7UUFDVixTQUFTLEVBQUUsU0FBUztRQUNwQixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7UUFDbkMsMkRBQTJEO0tBQzVELENBQUM7SUFDRixrQkFBRSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoRSxlQUFNLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDdkMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxTQUFTLFlBQVksQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLCtEQUErRCxDQUFDLENBQUM7SUFFMUYsaUJBQWlCO0lBQ2pCLElBQUksT0FBTyxDQUFDLEdBQUcsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUMxQixlQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDO1lBQ0gsSUFBQSx3QkFBUSxFQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDN0QsSUFBQSx3QkFBUSxFQUFDLFlBQVksRUFBRSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDL0QsSUFBQSx3QkFBUSxFQUFDLG1EQUFtRCxFQUFFO2dCQUM1RCxHQUFHLEVBQUUsWUFBWTtnQkFDakIsS0FBSyxFQUFFLFFBQVE7YUFDaEIsQ0FBQyxDQUFDO1lBQ0gsZUFBTSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxlQUFNLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzlCLGVBQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUM7WUFDSCxNQUFNLGNBQWMsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNDLElBQUEsd0JBQVEsRUFBQyxHQUFHLGNBQWMsVUFBVSxFQUFFO2dCQUNwQyxHQUFHLEVBQUUsWUFBWTtnQkFDakIsS0FBSyxFQUFFLFNBQVM7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsZUFBTSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxlQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsZUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLFdBQVcsT0FBTyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzVELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsU0FBUyxZQUFZLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDZCxlQUFNLENBQUMsSUFBSSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7SUFDakYsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDdEQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDN0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGRvd25sb2FkVGVtcGxhdGUgfSBmcm9tICdnaWdldCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgREVGQVVMVF9BUElfVVJMIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcblxuLy8gUmVtb3RlIHRlbXBsYXRlIHJlcG9zaXRvcnkgLSBzaW5nbGUgc3RhcnRlciB0ZW1wbGF0ZVxuY29uc3QgVEVNUExBVEVfUkVQTyA9ICdnaXRodWI6YnJhaW5maXNoLWFpL2RldmRvYy90ZW1wbGF0ZXMvc3RhcnRlcic7XG5cbi8vIEF2YWlsYWJsZSB0ZW1wbGF0ZSB0eXBlcyAoYWxsIHVzZSB0aGUgc2FtZSBzdGFydGVyIHRlbXBsYXRlLCBqdXN0IGRpZmZlcmVudCBjb25maWdzKVxuY29uc3QgVEVNUExBVEVTID0ge1xuICBiYXNpYzoge1xuICAgIG5hbWU6ICdCYXNpYycsXG4gICAgZGVzY3JpcHRpb246ICdTaW1wbGUgZG9jdW1lbnRhdGlvbiBzaXRlIHdpdGggZ3VpZGVzIGFuZCBwYWdlcycsXG4gICAgY29sb3I6ICcjMTBiOTgxJyxcbiAgfSxcbiAgb3BlbmFwaToge1xuICAgIG5hbWU6ICdPcGVuQVBJJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RvY3VtZW50YXRpb24gd2l0aCBSRVNUIEFQSSByZWZlcmVuY2UgKE9wZW5BUEkvU3dhZ2dlciknLFxuICAgIGNvbG9yOiAnIzEwYjk4MScsXG4gIH0sXG4gIGdyYXBocWw6IHtcbiAgICBuYW1lOiAnR3JhcGhRTCcsXG4gICAgZGVzY3JpcHRpb246ICdEb2N1bWVudGF0aW9uIHdpdGggR3JhcGhRTCBBUEkgcGxheWdyb3VuZCcsXG4gICAgY29sb3I6ICcjZTUzNWFiJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVtcGxhdGVUeXBlID0ga2V5b2YgdHlwZW9mIFRFTVBMQVRFUztcblxuaW50ZXJmYWNlIENyZWF0ZU9wdGlvbnMge1xuICB0ZW1wbGF0ZT86IFRlbXBsYXRlVHlwZTtcbiAgZ2l0PzogYm9vbGVhbjtcbiAgaW5zdGFsbD86IGJvb2xlYW47XG4gIHVybD86IHN0cmluZztcbiAgc3ViZG9tYWluPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hlY2tTdWJkb21haW5SZXNwb25zZSB7XG4gIGF2YWlsYWJsZTogYm9vbGVhbjtcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIHN1Z2dlc3Rpb24/OiBzdHJpbmc7XG59XG5cbi8vIFNpbXBsZSBwcm9tcHQgaGVscGVyIHVzaW5nIHJlYWRsaW5lXG5hc3luYyBmdW5jdGlvbiBwcm9tcHQocXVlc3Rpb246IHN0cmluZywgZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVhZGxpbmUgPSBhd2FpdCBpbXBvcnQoJ3JlYWRsaW5lJyk7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBkaXNwbGF5UXVlc3Rpb24gPSBkZWZhdWx0VmFsdWUgXG4gICAgICA/IGAke3F1ZXN0aW9ufSAoJHtkZWZhdWx0VmFsdWV9KTogYFxuICAgICAgOiBgJHtxdWVzdGlvbn06IGA7XG4gICAgXG4gICAgcmwucXVlc3Rpb24oZGlzcGxheVF1ZXN0aW9uLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpIHx8IGRlZmF1bHRWYWx1ZSB8fCAnJyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRTZWxlY3QocXVlc3Rpb246IHN0cmluZywgY2hvaWNlczogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnNvbGUubG9nKGBcXG4ke3F1ZXN0aW9ufVxcbmApO1xuICBjaG9pY2VzLmZvckVhY2goKGNob2ljZSwgaSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGAgICR7aSArIDF9LiAke2Nob2ljZS5sYWJlbH1gKTtcbiAgfSk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIFxuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJsLnF1ZXN0aW9uKCdFbnRlciBudW1iZXI6ICcsIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGFuc3dlci50cmltKCksIDEwKSAtIDE7XG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlc29sdmUoY2hvaWNlc1tpbmRleF0udmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0byBmaXJzdCBjaG9pY2VcbiAgICAgICAgcmVzb2x2ZShjaG9pY2VzWzBdLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdENvbmZpcm0ocXVlc3Rpb246IHN0cmluZywgZGVmYXVsdFZhbHVlID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcmVhZGxpbmUgPSBhd2FpdCBpbXBvcnQoJ3JlYWRsaW5lJyk7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBoaW50ID0gZGVmYXVsdFZhbHVlID8gJ1tZL25dJyA6ICdbeS9OXSc7XG4gICAgcmwucXVlc3Rpb24oYCR7cXVlc3Rpb259ICR7aGludH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gYW5zd2VyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWQgPT09ICcnKSB7XG4gICAgICAgIHJlc29sdmUoZGVmYXVsdFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUobm9ybWFsaXplZCA9PT0gJ3knIHx8IG5vcm1hbGl6ZWQgPT09ICd5ZXMnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvamVjdE5hbWUobmFtZTogc3RyaW5nKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gIGlmICghbmFtZSkge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdQcm9qZWN0IG5hbWUgaXMgcmVxdWlyZWQnIH07XG4gIH1cbiAgXG4gIC8vIENoZWNrIGZvciB2YWxpZCBucG0gcGFja2FnZSBuYW1lXG4gIGlmICghL15bYS16MC05XVthLXowLTktLl9dKiQvaS50ZXN0KG5hbWUpKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ0ludmFsaWQgcHJvamVjdCBuYW1lLiBVc2UgbG93ZXJjYXNlIGxldHRlcnMsIG51bWJlcnMsIGFuZCBkYXNoZXMuJyB9O1xuICB9XG4gIFxuICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xufVxuXG4vKipcbiAqIEJhc2ljIHN1YmRvbWFpbiBmb3JtYXQgdmFsaWRhdGlvbiAoc2VydmVyIGRvZXMgZnVsbCB2YWxpZGF0aW9uIGluY2x1ZGluZyBibGFja2xpc3QpXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTdWJkb21haW5Gb3JtYXQoc3ViZG9tYWluOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgaWYgKCFzdWJkb21haW4pIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIGlzIHJlcXVpcmVkJyB9O1xuICB9XG4gIFxuICBpZiAoc3ViZG9tYWluLmxlbmd0aCA8IDMpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3QgYmUgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzJyB9O1xuICB9XG4gIFxuICBpZiAoc3ViZG9tYWluLmxlbmd0aCA+IDYzKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBtdXN0IGJlIDYzIGNoYXJhY3RlcnMgb3IgbGVzcycgfTtcbiAgfVxuICBcbiAgaWYgKCEvXlthLXowLTldKFthLXowLTktXSpbYS16MC05XSk/JC8udGVzdChzdWJkb21haW4pKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBtdXN0IHN0YXJ0IGFuZCBlbmQgd2l0aCBhbHBoYW51bWVyaWMsIGNhbiBjb250YWluIGh5cGhlbnMnIH07XG4gIH1cbiAgXG4gIGlmICgvLS0vLnRlc3Qoc3ViZG9tYWluKSkge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gY2Fubm90IGNvbnRhaW4gY29uc2VjdXRpdmUgaHlwaGVucycgfTtcbiAgfVxuICBcbiAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBDaGVjayBzdWJkb21haW4gYXZhaWxhYmlsaXR5IHZpYSBBUEkgKGFsc28gdmFsaWRhdGVzIGFnYWluc3Qgc2VydmVyIGJsYWNrbGlzdClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tTdWJkb21haW5BdmFpbGFiaWxpdHkoXG4gIHN1YmRvbWFpbjogc3RyaW5nLFxuICBhcGlVcmw6IHN0cmluZ1xuKTogUHJvbWlzZTxDaGVja1N1YmRvbWFpblJlc3BvbnNlPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9zdWJkb21haW5zL2NoZWNrYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzdWJkb21haW4gfSksXG4gICAgfSk7XG4gICAgXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENoZWNrU3ViZG9tYWluUmVzcG9uc2U7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgQVBJIGlzIHVuYXZhaWxhYmxlLCBhbGxvdyBwcm9jZWVkaW5nICh3aWxsIGZhaWwgYXQgcmVnaXN0cmF0aW9uIGlmIGludmFsaWQpXG4gICAgcmV0dXJuIHsgYXZhaWxhYmxlOiB0cnVlIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0UHJvamVjdE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWVcbiAgICAucmVwbGFjZSgvLS9nLCAnICcpXG4gICAgLnJlcGxhY2UoL1xcYlxcdy9nLCAoY2hhcikgPT4gY2hhci50b1VwcGVyQ2FzZSgpKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2FnZU1hbmFnZXIoKTogc3RyaW5nIHtcbiAgY29uc3QgdXNlckFnZW50ID0gcHJvY2Vzcy5lbnYubnBtX2NvbmZpZ191c2VyX2FnZW50IHx8ICcnO1xuICBcbiAgaWYgKHVzZXJBZ2VudC5zdGFydHNXaXRoKCd5YXJuJykpIHtcbiAgICByZXR1cm4gJ3lhcm4nO1xuICB9XG4gIFxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoJ3BucG0nKSkge1xuICAgIHJldHVybiAncG5wbSc7XG4gIH1cbiAgXG4gIHJldHVybiAnbnBtJztcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBkb2NzLmpzb24gY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0ZW1wbGF0ZSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRG9jc0NvbmZpZyhwcm9qZWN0TmFtZTogc3RyaW5nLCB0ZW1wbGF0ZVR5cGU6IFRlbXBsYXRlVHlwZSk6IG9iamVjdCB7XG4gIGNvbnN0IGZvcm1hdHRlZE5hbWUgPSBmb3JtYXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7XG4gIGNvbnN0IHRlbXBsYXRlID0gVEVNUExBVEVTW3RlbXBsYXRlVHlwZV07XG4gIFxuICAvLyBCYXNlIGNvbmZpZ3VyYXRpb24gKHNoYXJlZCBhY3Jvc3MgYWxsIHRlbXBsYXRlcylcbiAgY29uc3QgYmFzZUNvbmZpZyA9IHtcbiAgICAkc2NoZW1hOiAnaHR0cHM6Ly9kZXZkb2Muc2gvZG9jcy5qc29uJyxcbiAgICBuYW1lOiBmb3JtYXR0ZWROYW1lLFxuICAgIGZhdmljb246ICcvZmF2aWNvbi5zdmcnLFxuICAgIGxvZ286IHtcbiAgICAgIGxpZ2h0OiAnL2xvZ28uc3ZnJyxcbiAgICAgIGRhcms6ICcvbG9nby5zdmcnLFxuICAgIH0sXG4gICAgY29sb3JzOiB7XG4gICAgICBwcmltYXJ5OiB0ZW1wbGF0ZS5jb2xvcixcbiAgICB9LFxuICAgIG5hdmlnYXRpb246IHtcbiAgICAgIHRhYnM6IFtdIGFzIG9iamVjdFtdLFxuICAgICAgZ2xvYmFsOiB7XG4gICAgICAgIGFuY2hvcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbmNob3I6ICdHaXRIdWInLFxuICAgICAgICAgICAgaHJlZjogJ2h0dHBzOi8vZ2l0aHViLmNvbS95b3VyLW9yZy95b3VyLXJlcG8nLFxuICAgICAgICAgICAgaWNvbjogJ2dpdGh1Yi1sb2dvJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIERvY3VtZW50YXRpb24gdGFiIChhbHdheXMgcHJlc2VudClcbiAgY29uc3QgZG9jc1RhYiA9IHtcbiAgICB0YWI6ICdEb2N1bWVudGF0aW9uJyxcbiAgICB0eXBlOiAnZG9jcycsXG4gICAgZ3JvdXBzOiBbXG4gICAgICB7XG4gICAgICAgIGdyb3VwOiAnR2V0dGluZyBTdGFydGVkJyxcbiAgICAgICAgaWNvbjogJ3JvY2tldC1sYXVuY2gnLFxuICAgICAgICBwYWdlczogWydpbmRleCcsICdxdWlja3N0YXJ0J10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBncm91cDogJ0d1aWRlcycsXG4gICAgICAgIGljb246ICdib29rLW9wZW4nLFxuICAgICAgICBwYWdlczogWydndWlkZXMvb3ZlcnZpZXcnLCAnZ3VpZGVzL2NvbmZpZ3VyYXRpb24nXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcblxuICBiYXNlQ29uZmlnLm5hdmlnYXRpb24udGFicy5wdXNoKGRvY3NUYWIpO1xuXG4gIC8vIEFkZCBBUEkgcmVmZXJlbmNlIHRhYiBiYXNlZCBvbiB0ZW1wbGF0ZSB0eXBlXG4gIGlmICh0ZW1wbGF0ZVR5cGUgPT09ICdvcGVuYXBpJykge1xuICAgIGJhc2VDb25maWcubmF2aWdhdGlvbi50YWJzLnB1c2goe1xuICAgICAgdGFiOiAnQVBJIFJlZmVyZW5jZScsXG4gICAgICB0eXBlOiAnb3BlbmFwaScsXG4gICAgICBwYXRoOiAnL2FwaS1yZWZlcmVuY2UnLFxuICAgICAgdmVyc2lvbnM6IFtcbiAgICAgICAgeyB2ZXJzaW9uOiAndjEnLCBzcGVjOiAnYXBpLXJlZmVyZW5jZS9vcGVuYXBpLmpzb24nLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICBdLFxuICAgICAgZ3JvdXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBncm91cDogJ092ZXJ2aWV3JyxcbiAgICAgICAgICBpY29uOiAnYm9vay1vcGVuJyxcbiAgICAgICAgICBwYWdlczogW1xuICAgICAgICAgICAgJ2FwaS1yZWZlcmVuY2UvaW50cm9kdWN0aW9uJyxcbiAgICAgICAgICAgICdhcGktcmVmZXJlbmNlL2F1dGhlbnRpY2F0aW9uJyxcbiAgICAgICAgICAgICdhcGktcmVmZXJlbmNlL2Vycm9ycycsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgQVBJIHBsYXlncm91bmQgY29uZmlnXG4gICAgKGJhc2VDb25maWcgYXMgYW55KS5hcGkgPSB7XG4gICAgICBiYXNlVXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLFxuICAgICAgcGxheWdyb3VuZDoge1xuICAgICAgICBtb2RlOiAnc2hvdycsXG4gICAgICB9LFxuICAgIH07XG4gIH0gZWxzZSBpZiAodGVtcGxhdGVUeXBlID09PSAnZ3JhcGhxbCcpIHtcbiAgICBiYXNlQ29uZmlnLm5hdmlnYXRpb24udGFicy5wdXNoKHtcbiAgICAgIHRhYjogJ0dyYXBoUUwgQVBJJyxcbiAgICAgIHR5cGU6ICdncmFwaHFsJyxcbiAgICAgIHBhdGg6ICcvZ3JhcGhxbC1hcGknLFxuICAgICAgc2NoZW1hOiAnYXBpLXJlZmVyZW5jZS9zY2hlbWEuZ3JhcGhxbCcsXG4gICAgICBlbmRwb2ludDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tL2dyYXBocWwnLFxuICAgICAgZ3JvdXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBncm91cDogJ092ZXJ2aWV3JyxcbiAgICAgICAgICBpY29uOiAnYm9vay1vcGVuJyxcbiAgICAgICAgICBwYWdlczogW1xuICAgICAgICAgICAgJ2FwaS1yZWZlcmVuY2UvaW50cm9kdWN0aW9uJyxcbiAgICAgICAgICAgICdhcGktcmVmZXJlbmNlL2F1dGhlbnRpY2F0aW9uJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBiYXNlQ29uZmlnO1xufVxuXG4vKipcbiAqIENsZWFuIHVwIHVudXNlZCBBUEkgZmlsZXMgYmFzZWQgb24gdGVtcGxhdGUgdHlwZVxuICovXG5mdW5jdGlvbiBjbGVhbnVwVW51c2VkRmlsZXMocmVzb2x2ZWRQYXRoOiBzdHJpbmcsIHRlbXBsYXRlVHlwZTogVGVtcGxhdGVUeXBlKTogdm9pZCB7XG4gIGNvbnN0IGFwaVJlZlBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRQYXRoLCAnYXBpLXJlZmVyZW5jZScpO1xuICBcbiAgaWYgKHRlbXBsYXRlVHlwZSA9PT0gJ2Jhc2ljJykge1xuICAgIC8vIFJlbW92ZSBlbnRpcmUgYXBpLXJlZmVyZW5jZSBmb2xkZXIgZm9yIGJhc2ljIHRlbXBsYXRlXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYXBpUmVmUGF0aCkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoYXBpUmVmUGF0aCk7XG4gICAgICBsb2dnZXIuZGVidWcoJ1JlbW92ZWQgYXBpLXJlZmVyZW5jZSBmb2xkZXIgKG5vdCBuZWVkZWQgZm9yIGJhc2ljIHRlbXBsYXRlKScpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0ZW1wbGF0ZVR5cGUgPT09ICdvcGVuYXBpJykge1xuICAgIC8vIFJlbW92ZSBHcmFwaFFMIHNjaGVtYSBmb3IgT3BlbkFQSSB0ZW1wbGF0ZVxuICAgIGNvbnN0IGdyYXBocWxTY2hlbWEgPSBwYXRoLmpvaW4oYXBpUmVmUGF0aCwgJ3NjaGVtYS5ncmFwaHFsJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZ3JhcGhxbFNjaGVtYSkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoZ3JhcGhxbFNjaGVtYSk7XG4gICAgICBsb2dnZXIuZGVidWcoJ1JlbW92ZWQgc2NoZW1hLmdyYXBocWwgKG5vdCBuZWVkZWQgZm9yIE9wZW5BUEkgdGVtcGxhdGUpJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRlbXBsYXRlVHlwZSA9PT0gJ2dyYXBocWwnKSB7XG4gICAgLy8gUmVtb3ZlIE9wZW5BUEkgc3BlYyBhbmQgZXJyb3JzLm1keCBmb3IgR3JhcGhRTCB0ZW1wbGF0ZVxuICAgIGNvbnN0IG9wZW5hcGlTcGVjID0gcGF0aC5qb2luKGFwaVJlZlBhdGgsICdvcGVuYXBpLmpzb24nKTtcbiAgICBjb25zdCBlcnJvcnNGaWxlID0gcGF0aC5qb2luKGFwaVJlZlBhdGgsICdlcnJvcnMubWR4Jyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMob3BlbmFwaVNwZWMpKSB7XG4gICAgICBmcy5yZW1vdmVTeW5jKG9wZW5hcGlTcGVjKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZlZCBvcGVuYXBpLmpzb24gKG5vdCBuZWVkZWQgZm9yIEdyYXBoUUwgdGVtcGxhdGUpJyk7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKGVycm9yc0ZpbGUpKSB7XG4gICAgICBmcy5yZW1vdmVTeW5jKGVycm9yc0ZpbGUpO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmVkIGVycm9ycy5tZHggKG5vdCBuZWVkZWQgZm9yIEdyYXBoUUwgdGVtcGxhdGUpJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGUocHJvamVjdERpcmVjdG9yeTogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcHRpb25zOiBDcmVhdGVPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGxvZ2dlci5pbmZvKCfwn5CfIENyZWF0ZSBEZXZEb2MgRG9jJyk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgY29uc3QgYXBpVXJsID0gb3B0aW9ucy51cmwgfHwgcHJvY2Vzcy5lbnYuREVWRE9DX0FQSV9VUkwgfHwgREVGQVVMVF9BUElfVVJMO1xuXG4gIC8vIEdldCBwcm9qZWN0IG5hbWUgaWYgbm90IHByb3ZpZGVkXG4gIGxldCBwcm9qZWN0UGF0aCA9IHByb2plY3REaXJlY3Rvcnk7XG5cbiAgaWYgKCFwcm9qZWN0UGF0aCkge1xuICAgIHByb2plY3RQYXRoID0gYXdhaXQgcHJvbXB0KCdXaGF0IGlzIHlvdXIgcHJvamVjdCBuYW1lZD8nLCAnbXktZG9jcycpO1xuICAgIFxuICAgIGlmICghcHJvamVjdFBhdGgpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignUHJvamVjdCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgcHJvamVjdCBuYW1lXG4gIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZVByb2plY3ROYW1lKHByb2plY3RQYXRoKTtcbiAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgbG9nZ2VyLmVycm9yKHZhbGlkYXRpb24uZXJyb3IgfHwgJ0ludmFsaWQgcHJvamVjdCBuYW1lJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gR2V0IHRlbXBsYXRlIHNlbGVjdGlvbiBpZiBub3QgcHJvdmlkZWRcbiAgbGV0IHRlbXBsYXRlOiBUZW1wbGF0ZVR5cGUgPSBvcHRpb25zLnRlbXBsYXRlIHx8ICdiYXNpYyc7XG4gIFxuICBpZiAoIW9wdGlvbnMudGVtcGxhdGUpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZUNob2ljZXMgPSBPYmplY3QuZW50cmllcyhURU1QTEFURVMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgdmFsdWU6IGtleSxcbiAgICAgIGxhYmVsOiBgJHt2YWx1ZS5uYW1lfSAtICR7dmFsdWUuZGVzY3JpcHRpb259YCxcbiAgICB9KSk7XG5cbiAgICB0ZW1wbGF0ZSA9IGF3YWl0IHByb21wdFNlbGVjdCgnV2hpY2ggdGVtcGxhdGUgd291bGQgeW91IGxpa2UgdG8gdXNlPycsIHRlbXBsYXRlQ2hvaWNlcykgYXMgVGVtcGxhdGVUeXBlO1xuICB9XG5cbiAgLy8gUmVzb2x2ZSBmdWxsIHBhdGhcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3RQYXRoKTtcbiAgY29uc3QgcHJvamVjdE5hbWUgPSBwYXRoLmJhc2VuYW1lKHJlc29sdmVkUGF0aCk7XG4gIGNvbnN0IHNsdWcgPSBwcm9qZWN0TmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG5cbiAgLy8gR2V0IHN1YmRvbWFpbiAtIHByb21wdCBpZiBub3QgcHJvdmlkZWRcbiAgbGV0IHN1YmRvbWFpbiA9IG9wdGlvbnMuc3ViZG9tYWluO1xuICBcbiAgaWYgKCFzdWJkb21haW4pIHtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIHN1YmRvbWFpbiA9IGF3YWl0IHByb21wdChgRW50ZXIgc3ViZG9tYWluIGZvciB5b3VyIGRvY3MgKCR7c2x1Z30uZGV2ZG9jLnNoKWAsIHNsdWcpO1xuICAgIHN1YmRvbWFpbiA9IHN1YmRvbWFpbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBzdWJkb21haW4gZm9ybWF0IGxvY2FsbHlcbiAgY29uc3QgZm9ybWF0Q2hlY2sgPSBpc1ZhbGlkU3ViZG9tYWluRm9ybWF0KHN1YmRvbWFpbik7XG4gIGlmICghZm9ybWF0Q2hlY2sudmFsaWQpIHtcbiAgICBsb2dnZXIuZXJyb3IoZm9ybWF0Q2hlY2suZXJyb3IhKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyBDaGVjayBzdWJkb21haW4gYXZhaWxhYmlsaXR5IHZpYSBBUEkgKHNlcnZlciB2YWxpZGF0ZXMgYmxhY2tsaXN0KVxuICAvLyBMb29wIHVudGlsIHdlIGZpbmQgYW4gYXZhaWxhYmxlIHN1YmRvbWFpblxuICBsZXQgc3ViZG9tYWluQXZhaWxhYmxlID0gZmFsc2U7XG4gIHdoaWxlICghc3ViZG9tYWluQXZhaWxhYmxlKSB7XG4gICAgbG9nZ2VyLmluZm8oYENoZWNraW5nIGlmICR7c3ViZG9tYWlufS5kZXZkb2Muc2ggaXMgYXZhaWxhYmxlLi4uYCk7XG4gICAgY29uc3QgYXZhaWxhYmlsaXR5ID0gYXdhaXQgY2hlY2tTdWJkb21haW5BdmFpbGFiaWxpdHkoc3ViZG9tYWluLCBhcGlVcmwpO1xuICAgIFxuICAgIGlmICghYXZhaWxhYmlsaXR5LmF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIGxvZ2dlci53YXJuKGF2YWlsYWJpbGl0eS5lcnJvciB8fCBgU3ViZG9tYWluIFwiJHtzdWJkb21haW59XCIgaXMgbm90IGF2YWlsYWJsZWApO1xuICAgICAgXG4gICAgICBjb25zdCBzdWdnZXN0aW9uID0gYXZhaWxhYmlsaXR5LnN1Z2dlc3Rpb24gfHwgYCR7c3ViZG9tYWlufS1kb2NzYDtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBsb2dnZXIuaW5mbyhgU3VnZ2VzdGlvbjogJHtzdWdnZXN0aW9ufS5kZXZkb2Muc2hgKTtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBcbiAgICAgIC8vIFByb21wdCBmb3IgbmV3IHN1YmRvbWFpblxuICAgICAgc3ViZG9tYWluID0gYXdhaXQgcHJvbXB0KCdFbnRlciBhIGRpZmZlcmVudCBzdWJkb21haW4nLCBzdWdnZXN0aW9uKTtcbiAgICAgIHN1YmRvbWFpbiA9IHN1YmRvbWFpbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGZvcm1hdFxuICAgICAgY29uc3QgZm9ybWF0Q2hlY2sgPSBpc1ZhbGlkU3ViZG9tYWluRm9ybWF0KHN1YmRvbWFpbik7XG4gICAgICBpZiAoIWZvcm1hdENoZWNrLnZhbGlkKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihmb3JtYXRDaGVjay5lcnJvciEpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3ViZG9tYWluQXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgJHtzdWJkb21haW59LmRldmRvYy5zaCBpcyBhdmFpbGFibGUhYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgZGlyZWN0b3J5IGV4aXN0c1xuICBpZiAoZnMuZXhpc3RzU3luYyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhyZXNvbHZlZFBhdGgpO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvdmVyd3JpdGUgPSBhd2FpdCBwcm9tcHRDb25maXJtKGBEaXJlY3RvcnkgJHtwcm9qZWN0TmFtZX0gaXMgbm90IGVtcHR5LiBDb250aW51ZSBhbnl3YXk/YCwgZmFsc2UpO1xuICAgICAgXG4gICAgICBpZiAoIW92ZXJ3cml0ZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ09wZXJhdGlvbiBjYW5jZWxsZWQnKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlbGVjdGVkVGVtcGxhdGUgPSBURU1QTEFURVNbdGVtcGxhdGVdO1xuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuaW5mbyhgQ3JlYXRpbmcgYSBuZXcgJHtzZWxlY3RlZFRlbXBsYXRlLm5hbWV9IERldkRvYyBkb2N1bWVudGF0aW9uIHNpdGUgaW4gJHtyZXNvbHZlZFBhdGh9YCk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgLy8gQ3JlYXRlIHByb2plY3QgZGlyZWN0b3J5XG4gIGZzLmVuc3VyZURpclN5bmMocmVzb2x2ZWRQYXRoKTtcblxuICAvLyBEb3dubG9hZCB0ZW1wbGF0ZSBmcm9tIHJlbW90ZSByZXBvc2l0b3J5IChhbHdheXMgdXNlIHN0YXJ0ZXIgdGVtcGxhdGUpXG4gIGxvZ2dlci5pbmZvKCdEb3dubG9hZGluZyB0ZW1wbGF0ZS4uLicpO1xuICBcbiAgdHJ5IHtcbiAgICAvLyBUcnkgdG8gZG93bmxvYWQgZnJvbSByZW1vdGUgcmVwb3NpdG9yeSBmaXJzdFxuICAgIGF3YWl0IGRvd25sb2FkVGVtcGxhdGUoVEVNUExBVEVfUkVQTywge1xuICAgICAgZGlyOiByZXNvbHZlZFBhdGgsXG4gICAgICBmb3JjZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBsb2dnZXIuc3VjY2VzcygnRG93bmxvYWRlZCBzdGFydGVyIHRlbXBsYXRlJyk7XG4gIH0gY2F0Y2ggKGRvd25sb2FkRXJyb3IpIHtcbiAgICAvLyBGYWxsIGJhY2sgdG8gbG9jYWwgdGVtcGxhdGVzIChmb3IgZGV2ZWxvcG1lbnQgb3Igb2ZmbGluZSB1c2FnZSlcbiAgICBsb2dnZXIuZGVidWcoYFJlbW90ZSBkb3dubG9hZCBmYWlsZWQ6ICR7ZG93bmxvYWRFcnJvcn1gKTtcbiAgICBsb2dnZXIuaW5mbygnRmFsbGluZyBiYWNrIHRvIGxvY2FsIHRlbXBsYXRlLi4uJyk7XG4gICAgXG4gICAgY29uc3QgdGVtcGxhdGVEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAndGVtcGxhdGVzJywgJ3N0YXJ0ZXInKTtcbiAgICBcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcGxhdGVEaXIpKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1RlbXBsYXRlIFwic3RhcnRlclwiIG5vdCBmb3VuZCcpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBMb29rZWQgZm9yIHRlbXBsYXRlIGF0OiAke3RlbXBsYXRlRGlyfWApO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdGUgc291cmNlOiAnICsgVEVNUExBVEVfUkVQTyk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZnMuY29weVN5bmModGVtcGxhdGVEaXIsIHJlc29sdmVkUGF0aCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ0NvcGllZCBsb2NhbCB0ZW1wbGF0ZScpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHBhY2thZ2UuanNvbiB3aXRoIHByb2plY3QgbmFtZVxuICBjb25zdCBwa2dQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwa2dQYXRoKSkge1xuICAgIGNvbnN0IHBrZyA9IGZzLnJlYWRKc29uU3luYyhwa2dQYXRoKTtcbiAgICBwa2cubmFtZSA9IHByb2plY3ROYW1lO1xuICAgIGZzLndyaXRlSnNvblN5bmMocGtnUGF0aCwgcGtnLCB7IHNwYWNlczogMiB9KTtcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIGRvY3MuanNvbiBiYXNlZCBvbiB0ZW1wbGF0ZSB0eXBlXG4gIGNvbnN0IGRvY3NDb25maWcgPSBnZW5lcmF0ZURvY3NDb25maWcocHJvamVjdE5hbWUsIHRlbXBsYXRlKTtcbiAgY29uc3QgZG9jc1BhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRQYXRoLCAnZG9jcy5qc29uJyk7XG4gIGZzLndyaXRlSnNvblN5bmMoZG9jc1BhdGgsIGRvY3NDb25maWcsIHsgc3BhY2VzOiAyIH0pO1xuICBsb2dnZXIuc3VjY2VzcyhgR2VuZXJhdGVkIGRvY3MuanNvbiBmb3IgJHtzZWxlY3RlZFRlbXBsYXRlLm5hbWV9IHRlbXBsYXRlYCk7XG5cbiAgLy8gVXBkYXRlIHRoZW1lLmpzb24gd2l0aCB0ZW1wbGF0ZSBjb2xvclxuICBjb25zdCB0aGVtZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRQYXRoLCAndGhlbWUuanNvbicpO1xuICBpZiAoZnMuZXhpc3RzU3luYyh0aGVtZVBhdGgpKSB7XG4gICAgY29uc3QgdGhlbWUgPSBmcy5yZWFkSnNvblN5bmModGhlbWVQYXRoKTtcbiAgICB0aGVtZS5jb2xvcnMgPSB7XG4gICAgICBwcmltYXJ5OiBzZWxlY3RlZFRlbXBsYXRlLmNvbG9yLFxuICAgICAgcHJpbWFyeUxpZ2h0OiBzZWxlY3RlZFRlbXBsYXRlLmNvbG9yLFxuICAgICAgcHJpbWFyeURhcms6IHNlbGVjdGVkVGVtcGxhdGUuY29sb3IsXG4gICAgfTtcbiAgICBmcy53cml0ZUpzb25TeW5jKHRoZW1lUGF0aCwgdGhlbWUsIHsgc3BhY2VzOiAyIH0pO1xuICB9XG5cbiAgLy8gQ2xlYW4gdXAgdW51c2VkIGZpbGVzIGJhc2VkIG9uIHRlbXBsYXRlIHR5cGVcbiAgY2xlYW51cFVudXNlZEZpbGVzKHJlc29sdmVkUGF0aCwgdGVtcGxhdGUpO1xuXG4gIC8vIENyZWF0ZSAuZGV2ZG9jLmpzb24gd2l0aCBzdWJkb21haW4gKG5vdCByZWdpc3RlcmVkIHVudGlsIGRlcGxveSlcbiAgLy8gVGhlIHN1YmRvbWFpbiB3aWxsIG9ubHkgYmUgcmVzZXJ2ZWQgd2hlbiB0aGUgdXNlciBhY3R1YWxseSBkZXBsb3lzXG4gIGNvbnN0IGRldmRvY0NvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRQYXRoLCAnLmRldmRvYy5qc29uJyk7XG4gIFxuICBjb25zdCBkZXZkb2NDb25maWcgPSB7XG4gICAgcHJvamVjdElkOiBgJHtzbHVnfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA4KX1gLFxuICAgIG5hbWU6IGZvcm1hdFByb2plY3ROYW1lKHByb2plY3ROYW1lKSxcbiAgICBzbHVnOiBzbHVnLFxuICAgIHN1YmRvbWFpbjogc3ViZG9tYWluLFxuICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIC8vIE5vdGU6IE5vIGFwaUtleSAtIHN1YmRvbWFpbiBpcyBub3QgcmVzZXJ2ZWQgdW50aWwgZGVwbG95XG4gIH07XG4gIGZzLndyaXRlSnNvblN5bmMoZGV2ZG9jQ29uZmlnUGF0aCwgZGV2ZG9jQ29uZmlnLCB7IHNwYWNlczogMiB9KTtcbiAgbG9nZ2VyLnN1Y2Nlc3MoJ0NyZWF0ZWQgLmRldmRvYy5qc29uJyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCcgIFN1YmRvbWFpbjonLCBgJHtzdWJkb21haW59LmRldmRvYy5zaGApO1xuICBjb25zb2xlLmxvZygnICBTdGF0dXM6JywgJ05vdCB5ZXQgZGVwbG95ZWQgKHN1YmRvbWFpbiB3aWxsIGJlIHJlc2VydmVkIG9uIGZpcnN0IGRlcGxveSknKTtcblxuICAvLyBJbml0aWFsaXplIGdpdFxuICBpZiAob3B0aW9ucy5naXQgIT09IGZhbHNlKSB7XG4gICAgbG9nZ2VyLmluZm8oJ0luaXRpYWxpemluZyBnaXQgcmVwb3NpdG9yeS4uLicpO1xuICAgIHRyeSB7XG4gICAgICBleGVjU3luYygnZ2l0IGluaXQnLCB7IGN3ZDogcmVzb2x2ZWRQYXRoLCBzdGRpbzogJ2lnbm9yZScgfSk7XG4gICAgICBleGVjU3luYygnZ2l0IGFkZCAtQScsIHsgY3dkOiByZXNvbHZlZFBhdGgsIHN0ZGlvOiAnaWdub3JlJyB9KTtcbiAgICAgIGV4ZWNTeW5jKCdnaXQgY29tbWl0IC1tIFwiSW5pdGlhbCBjb21taXQgZnJvbSBkZXZkb2MgY3JlYXRlXCInLCB7XG4gICAgICAgIGN3ZDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCdHaXQgcmVwb3NpdG9yeSBpbml0aWFsaXplZCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgbG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCBpbml0aWFsaXplIGdpdCByZXBvc2l0b3J5Jyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5zdGFsbCBkZXBlbmRlbmNpZXNcbiAgaWYgKG9wdGlvbnMuaW5zdGFsbCAhPT0gZmFsc2UpIHtcbiAgICBsb2dnZXIuaW5mbygnSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuLi4nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlcigpO1xuICAgICAgZXhlY1N5bmMoYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgLCB7XG4gICAgICAgIGN3ZDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBsb2dnZXIuc3VjY2VzcygnRGVwZW5kZW5jaWVzIGluc3RhbGxlZCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgbG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCBpbnN0YWxsIGRlcGVuZGVuY2llcycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN1Y2Nlc3MgbWVzc2FnZVxuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuc3VjY2VzcyhgQ3JlYXRlZCAke3Byb2plY3ROYW1lfSBhdCAke3Jlc29sdmVkUGF0aH1gKTtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coJ1lvdXIgZG9jcyB3aWxsIGJlIGF2YWlsYWJsZSBhdDonKTtcbiAgY29uc29sZS5sb2coYCAgaHR0cHM6Ly8ke3N1YmRvbWFpbn0uZGV2ZG9jLnNoYCk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGxvZ2dlci5pbmZvKCdOb3RlOiBUaGUgc3ViZG9tYWluIHdpbGwgYmUgcmVzZXJ2ZWQgd2hlbiB5b3UgcnVuIFwiZGV2ZG9jIGRlcGxveVwiJyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCdJbnNpZGUgdGhhdCBkaXJlY3RvcnksIHlvdSBjYW4gcnVuIHNldmVyYWwgY29tbWFuZHM6Jyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCcgIG5wbSBydW4gZGV2Jyk7XG4gIGNvbnNvbGUubG9nKCcgICAgU3RhcnRzIHRoZSBkZXZlbG9wbWVudCBzZXJ2ZXIuJyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCcgIGRldmRvYyBkZXBsb3knKTtcbiAgY29uc29sZS5sb2coJyAgICBEZXBsb3lzIGFuZCBjbGFpbXMgeW91ciBzdWJkb21haW4uJyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCdXZSBzdWdnZXN0IHRoYXQgeW91IGJlZ2luIGJ5IHR5cGluZzonKTtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coYCAgY2QgJHtwcm9qZWN0TmFtZX1gKTtcbiAgY29uc29sZS5sb2coJyAgbnBtIHJ1biBkZXYnKTtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coJ0hhcHB5IGRvY3VtZW50aW5nISDwn5OaJyk7XG4gIGNvbnNvbGUubG9nKCk7XG59XG4iXX0=
|