@dollhousemcp/mcp-server 2.0.25 → 2.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/auto-dollhouse/portDiscovery.d.ts.map +1 -1
- package/dist/auto-dollhouse/portDiscovery.js +7 -4
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +4 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +18 -1
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +6 -1
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +16 -1
- package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/SchemaDispatcher.js +2 -1
- package/dist/index.js +14 -2
- package/dist/server/tools/BuildInfoTools.d.ts +1 -0
- package/dist/server/tools/BuildInfoTools.d.ts.map +1 -1
- package/dist/server/tools/BuildInfoTools.js +2 -1
- package/dist/server/tools/MCPAQLTools.js +3 -1
- package/dist/services/ActivationStore.d.ts +8 -0
- package/dist/services/ActivationStore.d.ts.map +1 -1
- package/dist/services/ActivationStore.js +28 -29
- package/dist/services/BuildInfoService.d.ts +3 -0
- package/dist/services/BuildInfoService.d.ts.map +1 -1
- package/dist/services/BuildInfoService.js +18 -1
- package/dist/services/sessionIdentity.d.ts +24 -0
- package/dist/services/sessionIdentity.d.ts.map +1 -0
- package/dist/services/sessionIdentity.js +42 -0
- package/dist/utils/permissionAuthority.d.ts +38 -0
- package/dist/utils/permissionAuthority.d.ts.map +1 -0
- package/dist/utils/permissionAuthority.js +341 -0
- package/dist/utils/permissionHooks.d.ts.map +1 -1
- package/dist/utils/permissionHooks.js +10 -1
- package/dist/web/console/UnifiedConsole.d.ts +2 -0
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
- package/dist/web/console/UnifiedConsole.js +3 -1
- package/dist/web/portDiscovery.d.ts +7 -0
- package/dist/web/portDiscovery.d.ts.map +1 -1
- package/dist/web/portDiscovery.js +35 -4
- package/dist/web/public/app.js +28 -4
- package/dist/web/public/index.html +2 -0
- package/dist/web/public/permissions.css +456 -0
- package/dist/web/public/permissions.js +553 -16
- package/dist/web/public/sessions.css +119 -0
- package/dist/web/public/sessions.js +95 -9
- package/dist/web/public/setup.js +56 -4
- package/dist/web/public/styles.css +21 -2
- package/dist/web/routes/permissionRoutes.d.ts +4 -1
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +118 -6
- package/dist/web/routes/setupRoutes.d.ts +18 -0
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +47 -26
- package/dist/web/server.d.ts +4 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +19 -1
- package/package.json +4 -3
- package/scripts/pretooluse-dollhouse.sh +78 -12
- package/scripts/pretooluse-vscode.sh +6 -9
- package/scripts/pretooluse-windsurf.sh +6 -9
- package/server.json +2 -2
|
@@ -13,7 +13,6 @@ import { access, chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
|
13
13
|
import { join, dirname } from 'node:path';
|
|
14
14
|
import { fileURLToPath } from 'node:url';
|
|
15
15
|
import { homedir, platform } from 'node:os';
|
|
16
|
-
import { parse as parseToml } from 'smol-toml';
|
|
17
16
|
const __filename = fileURLToPath(import.meta.url);
|
|
18
17
|
const __dirname = dirname(__filename);
|
|
19
18
|
import { logger } from '../../utils/logger.js';
|
|
@@ -137,35 +136,57 @@ function openInEditor(filePath) {
|
|
|
137
136
|
const OPENABLE_CLIENTS = new Set([
|
|
138
137
|
'claude', 'claude-code', 'cursor', 'cline', 'windsurf', 'lmstudio', 'gemini-cli', 'codex',
|
|
139
138
|
]);
|
|
140
|
-
/**
|
|
141
|
-
|
|
139
|
+
/**
|
|
140
|
+
* Parse a single `[mcp_servers.<name>]` TOML section into a config summary.
|
|
141
|
+
*
|
|
142
|
+
* When `caseSensitive` is true, the section header must match exactly. This is
|
|
143
|
+
* important for Codex because the installer writes `[mcp_servers.dollhousemcp]`
|
|
144
|
+
* in lowercase and we want to prefer that canonical entry over legacy mixed-case
|
|
145
|
+
* sections that may still be present in the file.
|
|
146
|
+
*/
|
|
147
|
+
function parseTomlSectionConfig(sectionName, raw, caseSensitive = false) {
|
|
148
|
+
const escapedSectionName = sectionName.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
|
|
149
|
+
const sectionRegex = new RegExp(String.raw `\[mcp_servers\.${escapedSectionName}\]`, caseSensitive ? '' : 'i');
|
|
150
|
+
const sectionMatch = sectionRegex.exec(raw);
|
|
151
|
+
if (!sectionMatch)
|
|
152
|
+
return null;
|
|
153
|
+
const tomlConfig = { serverName: sectionName };
|
|
154
|
+
const sectionStart = sectionMatch.index + sectionMatch[0].length;
|
|
155
|
+
const nextSection = raw.indexOf('\n[', sectionStart);
|
|
156
|
+
const sectionContent = nextSection > -1 ? raw.slice(sectionStart, nextSection) : raw.slice(sectionStart);
|
|
157
|
+
const commandMatch = /command\s*=\s*"([^"]+)"/.exec(sectionContent);
|
|
158
|
+
const argsMatch = /args\s*=\s*\[([^\]]*)\]/.exec(sectionContent);
|
|
159
|
+
const enabledMatch = /enabled\s*=\s*(true|false)/i.exec(sectionContent);
|
|
160
|
+
if (commandMatch)
|
|
161
|
+
tomlConfig.command = commandMatch[1];
|
|
162
|
+
if (argsMatch) {
|
|
163
|
+
tomlConfig.args = argsMatch[1].split(',').map((arg) => arg.trim().replaceAll('"', ''));
|
|
164
|
+
}
|
|
165
|
+
if (enabledMatch) {
|
|
166
|
+
tomlConfig.enabled = enabledMatch[1].toLowerCase() === 'true';
|
|
167
|
+
}
|
|
168
|
+
return tomlConfig;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Parse a TOML config file for a DollhouseMCP server entry.
|
|
172
|
+
*
|
|
173
|
+
* Detection prefers the canonical lowercase Codex section name first, then
|
|
174
|
+
* falls back to older Dollhouse-related section names so stale configs are
|
|
175
|
+
* still visible in the UI instead of being mistaken for a fresh install.
|
|
176
|
+
*/
|
|
177
|
+
export function parseTomlConfig(raw) {
|
|
142
178
|
if (!raw.toLowerCase().includes('dollhousemcp')) {
|
|
143
179
|
return { installed: false };
|
|
144
180
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
if (!mcpServers || typeof mcpServers !== 'object' || Array.isArray(mcpServers)) {
|
|
149
|
-
return { installed: true, currentConfig: {}, serverKey: 'mcp_servers' };
|
|
150
|
-
}
|
|
151
|
-
const matchingEntry = Object.entries(mcpServers).find(([key]) => key.toLowerCase().includes('dollhousemcp'));
|
|
152
|
-
if (!matchingEntry) {
|
|
153
|
-
return { installed: true, currentConfig: {}, serverKey: 'mcp_servers' };
|
|
154
|
-
}
|
|
155
|
-
const [serverName, serverConfig] = matchingEntry;
|
|
156
|
-
const tomlConfig = { serverName };
|
|
157
|
-
if (serverConfig && typeof serverConfig === 'object' && !Array.isArray(serverConfig)) {
|
|
158
|
-
const { command, args } = serverConfig;
|
|
159
|
-
if (typeof command === 'string')
|
|
160
|
-
tomlConfig.command = command;
|
|
161
|
-
if (Array.isArray(args))
|
|
162
|
-
tomlConfig.args = args;
|
|
163
|
-
}
|
|
164
|
-
return { installed: true, currentConfig: tomlConfig, serverKey: 'mcp_servers' };
|
|
181
|
+
const exactConfig = parseTomlSectionConfig('dollhousemcp', raw, true);
|
|
182
|
+
if (exactConfig) {
|
|
183
|
+
return { installed: true, currentConfig: exactConfig, serverKey: 'mcp_servers' };
|
|
165
184
|
}
|
|
166
|
-
|
|
185
|
+
const sectionMatch = /\[mcp_servers\.([^\]]*dollhousemcp[^\]]*)\]/i.exec(raw);
|
|
186
|
+
if (!sectionMatch)
|
|
167
187
|
return { installed: true, currentConfig: {}, serverKey: 'mcp_servers' };
|
|
168
|
-
}
|
|
188
|
+
const fallbackConfig = parseTomlSectionConfig(sectionMatch[1], raw) ?? { serverName: sectionMatch[1] };
|
|
189
|
+
return { installed: true, currentConfig: fallbackConfig, serverKey: 'mcp_servers' };
|
|
169
190
|
}
|
|
170
191
|
/** Parse a JSON config file for a DollhouseMCP server entry */
|
|
171
192
|
function parseJsonConfig(raw) {
|
|
@@ -1208,4 +1229,4 @@ function runInstallMcp(client, version) {
|
|
|
1208
1229
|
});
|
|
1209
1230
|
});
|
|
1210
1231
|
}
|
|
1211
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBSb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL3JvdXRlcy9zZXR1cFJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsSUFBSSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLElBQUksU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRS9DLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxxQkFBcUIsRUFBb0MsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV2SSxNQUFNLFdBQVcsR0FBRyx5QkFBeUIsQ0FBQztBQUM5QyxNQUFNLGtCQUFrQixHQUFHLHlCQUF5QixDQUFDO0FBQ3JE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QU0sQ0FBQztRQUNQLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7SUFDckQsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxNQUFjLEVBQUUsT0FBZ0I7SUFDckQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLG9CQUFvQixFQUFFLENBQUM7UUFDbkQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEQsTUFBTSxJQUFJLEdBQUc7WUFDWCxHQUFHLFVBQVU7WUFDYiwyQkFBMkIsR0FBRyxFQUFFO1lBQ2hDLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLE9BQU87U0FDUixDQUFDO1FBRUYsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9ELElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDekMsT0FBTztZQUNULENBQUM7WUFDRCxPQUFPLENBQUMsTUFBTSxJQUFJLHlCQUF5QixDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNldHVwIFJvdXRlcyDigJQgQXV0by1pbnN0YWxsIERvbGxob3VzZU1DUCB0byBNQ1AgY2xpZW50c1xuICpcbiAqIFVzZXMgYGluc3RhbGwtbWNwYCAoaHR0cHM6Ly9naXRodWIuY29tL3N1cGVybWVtb3J5YWkvaW5zdGFsbC1tY3ApXG4gKiB0byBpbmplY3Qgc2VydmVyIGNvbmZpZ3VyYXRpb24gaW50byBzdXBwb3J0ZWQgTUNQIGNsaWVudCBjb25maWcgZmlsZXMuXG4gKlxuICogU2VjdXJpdHk6IGxvY2FsaG9zdC1vbmx5IGJpbmRpbmcgKGVuZm9yY2VkIGJ5IHNlcnZlci50cyksIHJhdGUtbGltaXRlZCxcbiAqIGFuZCBjb21tYW5kIGFyZ3VtZW50cyBhcmUgaGFyZGNvZGVkIOKAlCBubyB1c2VyLXN1cHBsaWVkIHNoZWxsIGlucHV0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGV4ZWNGaWxlIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGFjY2Vzc1N5bmMsIGNvbnN0YW50cyBhcyBmc0NvbnN0YW50cyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgYWNjZXNzLCBjaG1vZCwgbWtkaXIsIHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGhvbWVkaXIsIHBsYXRmb3JtIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVRvbWwgfSBmcm9tICdzbW9sLXRvbWwnO1xuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShfX2ZpbGVuYW1lKTtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFBBQ0tBR0VfVkVSU0lPTiB9IGZyb20gJy4uLy4uL2dlbmVyYXRlZC92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmMsIGluc3RhbGxQZXJtaXNzaW9uSG9vaywgdHlwZSBJbnN0YWxsUGVybWlzc2lvbkhvb2tSZXN1bHQgfSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9uSG9va3MuanMnO1xuXG5jb25zdCBHSVRIVUJfUkVQTyA9ICdEb2xsaG91c2VNQ1AvbWNwLXNlcnZlcic7XG5jb25zdCBNQ1BCX0FTU0VUX1BBVFRFUk4gPSAvXmRvbGxob3VzZW1jcC0uKlxcLm1jcGIkLztcbmltcG9ydCB7IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgUG9zdEhvZyB9IGZyb20gJ3Bvc3Rob2ctbm9kZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcblxuZnVuY3Rpb24gaXNNaXNzaW5nUGF0aEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgIGVycm9yXG4gICAgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0J1xuICAgICYmICdjb2RlJyBpbiBlcnJvclxuICAgICYmIChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gJ0VOT0VOVCcsXG4gICk7XG59XG5cbi8vIFBvc3RIb2cgcHJvamVjdCBjYXB0dXJlIGtleSDigJQgd3JpdGUtb25seSBieSBkZXNpZ24sIHNhZmUgdG8gZXhwb3NlIHB1YmxpY2x5LlxuLy8gVGhpcyBrZXkgY2FuIE9OTFkgc2VuZCBldmVudHMgdG8gUG9zdEhvZzsgaXQgY2Fubm90IHJlYWQgZGF0YSwgcXVlcnkgYW5hbHl0aWNzLFxuLy8gY29uZmlndXJlIGRlc3RpbmF0aW9ucywgb3IgYWNjZXNzIGFueSBvdGhlciBQb3N0SG9nIEFQSS4gU2FtZSBrZXkgdXNlZCBpblxuLy8gc3JjL3RlbGVtZXRyeS9PcGVyYXRpb25hbFRlbGVtZXRyeS50cy4gVmVyaWZpZWQgd3JpdGUtb25seSAyMDI2LTA0LTA3LlxuLy8gQ2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBQT1NUSE9HX0FQSV9LRVkgZW52IHZhciBmb3IgY3VzdG9tIFBvc3RIb2cgaW5zdGFsbGF0aW9ucy5cbmNvbnN0IFBPU1RIT0dfUFJPSkVDVF9LRVkgPSBwcm9jZXNzLmVudi5QT1NUSE9HX0FQSV9LRVkgfHwgJ3BoY194RkpLSUhBcVJYMVlMYTBUU2RUR3dHajE5ZDFKZW9YREtqSk5ZcTQ5MnZxJztcbmNvbnN0IExJQ0VOU0VfV09SS0VSX0RJUkVDVF9QQVRIID0gJy9kaXJlY3QtdmVyaWZpY2F0aW9uJztcblxuLyoqIFN1cHBvcnRlZCBjbGllbnQgaWRlbnRpZmllcnMgZm9yIG9uZS1jbGljayBzZXR1cC4gKi9cbmNvbnN0IEFMTE9XRURfQ0xJRU5UUyA9IG5ldyBTZXQoW1xuICAnY2xhdWRlJyxcbiAgJ2NsYXVkZS1jb2RlJyxcbiAgJ2N1cnNvcicsXG4gICd2c2NvZGUnLFxuICAnY2xpbmUnLFxuICAncm9vLWNsaW5lJyxcbiAgJ3dpbmRzdXJmJyxcbiAgJ3dpdHN5JyxcbiAgJ2VuY29udm8nLFxuICAnZ2VtaW5pLWNsaScsXG4gICdnb29zZScsXG4gICd6ZWQnLFxuICAnd2FycCcsXG4gICdjb2RleCcsXG4gICdsbXN0dWRpbycsXG5dKTtcblxudHlwZSBDb25maWdQYXRoQ2xpZW50ID1cbiAgfCAnY2xhdWRlJ1xuICB8ICdjbGF1ZGUtY29kZSdcbiAgfCAnY3Vyc29yJ1xuICB8ICd3aW5kc3VyZidcbiAgfCAnY2xpbmUnXG4gIHwgJ2xtc3R1ZGlvJ1xuICB8ICdnZW1pbmktY2xpJ1xuICB8ICdjb2RleCc7XG5cbnR5cGUgU2V0dXBTdXBwb3J0TGV2ZWwgPVxuICB8ICdmdWxsX25hdGl2ZSdcbiAgfCAncGFydGlhbF9uYXRpdmUnXG4gIHwgJ21jcF9vbmx5J1xuICB8ICd1bnN1cHBvcnRlZCc7XG5cbmNvbnN0IFNFVFVQX1NVUFBPUlRfTEVWRUxTOiBSZWNvcmQ8c3RyaW5nLCBTZXR1cFN1cHBvcnRMZXZlbD4gPSB7XG4gICdjbGF1ZGUnOiAndW5zdXBwb3J0ZWQnLFxuICAnY2xhdWRlLWNvZGUnOiAnZnVsbF9uYXRpdmUnLFxuICAnY3Vyc29yJzogJ3BhcnRpYWxfbmF0aXZlJyxcbiAgJ2NsaW5lJzogJ21jcF9vbmx5JyxcbiAgJ3dpbmRzdXJmJzogJ3BhcnRpYWxfbmF0aXZlJyxcbiAgJ2xtc3R1ZGlvJzogJ21jcF9vbmx5JyxcbiAgJ2dlbWluaS1jbGknOiAncGFydGlhbF9uYXRpdmUnLFxuICAnY29kZXgnOiAncGFydGlhbF9uYXRpdmUnLFxufTtcblxuLyoqIEFsbG93ZWQgcmVsZWFzZSBjaGFubmVscyBmb3IgdGhlIGluc3RhbGwgZW5kcG9pbnQuICovXG5jb25zdCBBTExPV0VEX0lOU1RBTExfQ0hBTk5FTFM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFsnbGF0ZXN0JywgJ2JldGEnLCAncmMnXSk7XG5cbi8qKiBSYXRlIGxpbWl0OiA1IGluc3RhbGxzIHBlciBtaW51dGUgKi9cbmNvbnN0IGluc3RhbGxMaW1pdGVyID0gbmV3IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlcig1LCA2MF8wMDApO1xuXG4vKipcbiAqIEtub3duIGNvbmZpZyBmaWxlIHBhdGhzIHBlciBjbGllbnQuXG4gKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAqL1xuZnVuY3Rpb24gZ2V0Q29uZmlnUGF0aChjbGllbnQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBob21lID0gaG9tZWRpcigpO1xuICBjb25zdCBwbGF0ID0gcGxhdGZvcm0oKTtcblxuICBjb25zdCBwYXRoczogUmVjb3JkPENvbmZpZ1BhdGhDbGllbnQsICgpID0+IHN0cmluZyB8IG51bGw+ID0ge1xuICAgICdjbGF1ZGUnOiAoKSA9PiB7XG4gICAgICBpZiAocGxhdCA9PT0gJ2RhcndpbicpIHJldHVybiBqb2luKGhvbWUsICdMaWJyYXJ5JywgJ0FwcGxpY2F0aW9uIFN1cHBvcnQnLCAnQ2xhdWRlJywgJ2NsYXVkZV9kZXNrdG9wX2NvbmZpZy5qc29uJyk7XG4gICAgICBpZiAocGxhdCA9PT0gJ3dpbjMyJykgcmV0dXJuIGpvaW4ocHJvY2Vzcy5lbnYuQVBQREFUQSB8fCBqb2luKGhvbWUsICdBcHBEYXRhJywgJ1JvYW1pbmcnKSwgJ0NsYXVkZScsICdjbGF1ZGVfZGVza3RvcF9jb25maWcuanNvbicpO1xuICAgICAgcmV0dXJuIGpvaW4oaG9tZSwgJy5jb25maWcnLCAnQ2xhdWRlJywgJ2NsYXVkZV9kZXNrdG9wX2NvbmZpZy5qc29uJyk7XG4gICAgfSxcbiAgICAnY2xhdWRlLWNvZGUnOiAoKSA9PiBqb2luKGhvbWUsICcuY2xhdWRlLmpzb24nKSxcbiAgICAnY3Vyc29yJzogKCkgPT4gam9pbihob21lLCAnLmN1cnNvcicsICdtY3AuanNvbicpLFxuICAgICd3aW5kc3VyZic6ICgpID0+IGpvaW4oaG9tZSwgJy5jb2RlaXVtJywgJ3dpbmRzdXJmJywgJ21jcF9jb25maWcuanNvbicpLFxuICAgICdjbGluZSc6ICgpID0+IHtcbiAgICAgIGlmIChwbGF0ID09PSAnZGFyd2luJykgcmV0dXJuIGpvaW4oaG9tZSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdDb2RlJywgJ1VzZXInLCAnZ2xvYmFsU3RvcmFnZScsICdzYW91ZHJpendhbi5jbGF1ZGUtZGV2JywgJ3NldHRpbmdzJywgJ2NsaW5lX21jcF9zZXR0aW5ncy5qc29uJyk7XG4gICAgICBpZiAocGxhdCA9PT0gJ3dpbjMyJykgcmV0dXJuIGpvaW4ocHJvY2Vzcy5lbnYuQVBQREFUQSB8fCBqb2luKGhvbWUsICdBcHBEYXRhJywgJ1JvYW1pbmcnKSwgJ0NvZGUnLCAnVXNlcicsICdnbG9iYWxTdG9yYWdlJywgJ3Nhb3Vkcml6d2FuLmNsYXVkZS1kZXYnLCAnc2V0dGluZ3MnLCAnY2xpbmVfbWNwX3NldHRpbmdzLmpzb24nKTtcbiAgICAgIHJldHVybiBqb2luKGhvbWUsICcuY29uZmlnJywgJ0NvZGUnLCAnVXNlcicsICdnbG9iYWxTdG9yYWdlJywgJ3Nhb3Vkcml6d2FuLmNsYXVkZS1kZXYnLCAnc2V0dGluZ3MnLCAnY2xpbmVfbWNwX3NldHRpbmdzLmpzb24nKTtcbiAgICB9LFxuICAgICdsbXN0dWRpbyc6ICgpID0+IGpvaW4oaG9tZSwgJy5sbXN0dWRpbycsICdtY3AuanNvbicpLFxuICAgICdnZW1pbmktY2xpJzogKCkgPT4gam9pbihob21lLCAnLmdlbWluaScsICdzZXR0aW5ncy5qc29uJyksXG4gICAgJ2NvZGV4JzogKCkgPT4gam9pbihob21lLCAnLmNvZGV4JywgJ2NvbmZpZy50b21sJyksXG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZXIgPSBwYXRoc1tjbGllbnQgYXMgQ29uZmlnUGF0aENsaWVudF07XG4gIHJldHVybiByZXNvbHZlciA/IHJlc29sdmVyKCkgOiBudWxsO1xufVxuXG4vKipcbiAqIE9wZW4gYSBmaWxlIGluIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IHRleHQgZWRpdG9yLlxuICovXG5mdW5jdGlvbiBvcGVuSW5FZGl0b3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gICAgbGV0IGNtZDogc3RyaW5nO1xuICAgIGxldCBhcmdzOiBzdHJpbmdbXTtcblxuICAgIGlmIChwbGF0ID09PSAnZGFyd2luJykge1xuICAgICAgY21kID0gJ29wZW4nO1xuICAgICAgYXJncyA9IFsnLXQnLCBmaWxlUGF0aF07XG4gICAgfSBlbHNlIGlmIChwbGF0ID09PSAnd2luMzInKSB7XG4gICAgICBjbWQgPSAnbm90ZXBhZCc7XG4gICAgICBhcmdzID0gW2ZpbGVQYXRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY21kID0gJ3hkZy1vcGVuJztcbiAgICAgIGFyZ3MgPSBbZmlsZVBhdGhdO1xuICAgIH1cblxuICAgIGV4ZWNGaWxlKGNtZCwgYXJncywgeyB0aW1lb3V0OiAxMF8wMDAgfSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb3VsZCBub3Qgb3BlbiBlZGl0b3I6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCdPcGVuZWQgaW4gZWRpdG9yLicpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIENsaWVudHMgd2hvc2UgY29uZmlnIGZpbGVzIHdlIGNhbiBsb2NhdGUgYW5kIG9wZW4gKi9cbmNvbnN0IE9QRU5BQkxFX0NMSUVOVFMgPSBuZXcgU2V0KFtcbiAgJ2NsYXVkZScsICdjbGF1ZGUtY29kZScsICdjdXJzb3InLCAnY2xpbmUnLCAnd2luZHN1cmYnLCAnbG1zdHVkaW8nLCAnZ2VtaW5pLWNsaScsICdjb2RleCcsXG5dKTtcblxuLyoqXG4gKiBDcmVhdGUgc2V0dXAgaGFuZGxlcnMgKEV4cHJlc3MgNSBjb21wYXRpYmxlIOKAlCBwbGFpbiBoYW5kbGVyIGZ1bmN0aW9ucywgbm90IFJvdXRlcikuXG4gKi9cbmludGVyZmFjZSBEZXRlY3RSZXN1bHQge1xuICBpbnN0YWxsZWQ6IGJvb2xlYW47XG4gIGNvbmZpZ1BhdGg6IHN0cmluZyB8IG51bGw7XG4gIGN1cnJlbnRDb25maWc/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgc2VydmVyS2V5Pzogc3RyaW5nO1xufVxuXG4vKiogUGFyc2UgYSBUT01MIGNvbmZpZyBmaWxlIGZvciBhIERvbGxob3VzZU1DUCBzZXJ2ZXIgZW50cnkgKi9cbmZ1bmN0aW9uIHBhcnNlVG9tbENvbmZpZyhyYXc6IHN0cmluZyk6IE9taXQ8RGV0ZWN0UmVzdWx0LCAnY29uZmlnUGF0aCc+IHtcbiAgaWYgKCFyYXcudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZG9sbGhvdXNlbWNwJykpIHtcbiAgICByZXR1cm4geyBpbnN0YWxsZWQ6IGZhbHNlIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVG9tbChyYXcpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG1jcFNlcnZlcnMgPSBwYXJzZWQubWNwX3NlcnZlcnM7XG4gICAgaWYgKCFtY3BTZXJ2ZXJzIHx8IHR5cGVvZiBtY3BTZXJ2ZXJzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1jcFNlcnZlcnMpKSB7XG4gICAgICByZXR1cm4geyBpbnN0YWxsZWQ6IHRydWUsIGN1cnJlbnRDb25maWc6IHt9LCBzZXJ2ZXJLZXk6ICdtY3Bfc2VydmVycycgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaGluZ0VudHJ5ID0gT2JqZWN0LmVudHJpZXMobWNwU2VydmVycykuZmluZCgoW2tleV0pID0+XG4gICAgICBrZXkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZG9sbGhvdXNlbWNwJykpO1xuICAgIGlmICghbWF0Y2hpbmdFbnRyeSkge1xuICAgICAgcmV0dXJuIHsgaW5zdGFsbGVkOiB0cnVlLCBjdXJyZW50Q29uZmlnOiB7fSwgc2VydmVyS2V5OiAnbWNwX3NlcnZlcnMnIH07XG4gICAgfVxuXG4gICAgY29uc3QgW3NlcnZlck5hbWUsIHNlcnZlckNvbmZpZ10gPSBtYXRjaGluZ0VudHJ5O1xuICAgIGNvbnN0IHRvbWxDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzZXJ2ZXJOYW1lIH07XG4gICAgaWYgKHNlcnZlckNvbmZpZyAmJiB0eXBlb2Ygc2VydmVyQ29uZmlnID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShzZXJ2ZXJDb25maWcpKSB7XG4gICAgICBjb25zdCB7IGNvbW1hbmQsIGFyZ3MgfSA9IHNlcnZlckNvbmZpZyBhcyB7IGNvbW1hbmQ/OiB1bmtub3duOyBhcmdzPzogdW5rbm93biB9O1xuICAgICAgaWYgKHR5cGVvZiBjb21tYW5kID09PSAnc3RyaW5nJykgdG9tbENvbmZpZy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB0b21sQ29uZmlnLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHJldHVybiB7IGluc3RhbGxlZDogdHJ1ZSwgY3VycmVudENvbmZpZzogdG9tbENvbmZpZywgc2VydmVyS2V5OiAnbWNwX3NlcnZlcnMnIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGluc3RhbGxlZDogdHJ1ZSwgY3VycmVudENvbmZpZzoge30sIHNlcnZlcktleTogJ21jcF9zZXJ2ZXJzJyB9O1xuICB9XG59XG5cbi8qKiBQYXJzZSBhIEpTT04gY29uZmlnIGZpbGUgZm9yIGEgRG9sbGhvdXNlTUNQIHNlcnZlciBlbnRyeSAqL1xuZnVuY3Rpb24gcGFyc2VKc29uQ29uZmlnKHJhdzogc3RyaW5nKTogT21pdDxEZXRlY3RSZXN1bHQsICdjb25maWdQYXRoJz4ge1xuICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnbWNwU2VydmVycycsICdzZXJ2ZXJzJ10pIHtcbiAgICBpZiAocGFyc2VkW2tleV0/LmRvbGxob3VzZW1jcCkge1xuICAgICAgcmV0dXJuIHsgaW5zdGFsbGVkOiB0cnVlLCBjdXJyZW50Q29uZmlnOiBwYXJzZWRba2V5XS5kb2xsaG91c2VtY3AsIHNlcnZlcktleToga2V5IH07XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGluc3RhbGxlZDogZmFsc2UgfTtcbn1cblxuLyoqIENoZWNrIGEgc2luZ2xlIGNsaWVudCBjb25maWcgZmlsZSBmb3IgYW4gZXhpc3RpbmcgRG9sbGhvdXNlTUNQIGVudHJ5ICovXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RDbGllbnQoY2xpZW50OiBzdHJpbmcpOiBQcm9taXNlPERldGVjdFJlc3VsdCB8IG51bGw+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGdldENvbmZpZ1BhdGgoY2xpZW50KTtcbiAgaWYgKCFjb25maWdQYXRoKSByZXR1cm4gbnVsbDtcblxuICB0cnkge1xuICAgIGF3YWl0IGFjY2Vzcyhjb25maWdQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgaW5zdGFsbGVkOiBmYWxzZSwgY29uZmlnUGF0aCB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkRmlsZShjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25maWdQYXRoLmVuZHNXaXRoKCcudG9tbCcpID8gcGFyc2VUb21sQ29uZmlnKHJhdykgOiBwYXJzZUpzb25Db25maWcocmF3KTtcbiAgICByZXR1cm4geyBjb25maWdQYXRoLCAuLi5yZXN1bHQgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgaW5zdGFsbGVkOiBmYWxzZSwgY29uZmlnUGF0aCB9O1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBhIGNsaWVudCBuYW1lIGZyb20gcmVxdWVzdCBib2R5LlxuICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCBjbGllbnQgbmFtZSBvciBudWxsICh3aXRoIGVycm9yIHJlc3BvbnNlIHNlbnQpLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNsaWVudChcbiAgcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBhbGxvd2VkU2V0OiBTZXQ8c3RyaW5nPixcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7IGNsaWVudCB9ID0gcmVxLmJvZHkgYXMgeyBjbGllbnQ/OiBzdHJpbmcgfTtcbiAgaWYgKCFjbGllbnQgfHwgdHlwZW9mIGNsaWVudCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAnTWlzc2luZyByZXF1aXJlZCBmaWVsZDogY2xpZW50JyB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoY2xpZW50KS5ub3JtYWxpemVkQ29udGVudC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgaWYgKCFhbGxvd2VkU2V0Lmhhcyhub3JtYWxpemVkKSkge1xuICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgIGVycm9yOiBgVW5zdXBwb3J0ZWQgY2xpZW50OiAke2NsaWVudH1gLFxuICAgICAgc3VwcG9ydGVkOiBBcnJheS5mcm9tKGFsbG93ZWRTZXQpLFxuICAgIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG50eXBlIFJlcXVlc3RlZEluc3RhbGxWZXJzaW9uUmVzdWx0ID1cbiAgfCB7IGVmZmVjdGl2ZVZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDsgZXJyb3I6IG51bGwgfVxuICB8IHsgZWZmZWN0aXZlVmVyc2lvbjogbnVsbDsgZXJyb3I6IHN0cmluZyB9O1xuXG5mdW5jdGlvbiByZXNvbHZlUmVxdWVzdGVkSW5zdGFsbFZlcnNpb24oYm9keTogdW5rbm93bik6IFJlcXVlc3RlZEluc3RhbGxWZXJzaW9uUmVzdWx0IHtcbiAgY29uc3QgeyB2ZXJzaW9uLCBjaGFubmVsIH0gPSAoYm9keSA/PyB7fSkgYXMgeyB2ZXJzaW9uPzogc3RyaW5nOyBjaGFubmVsPzogc3RyaW5nIH07XG4gIGNvbnN0IG5vcm1hbGl6ZWRWZXJzaW9uID0gdmVyc2lvbiA/IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHZlcnNpb24pLm5vcm1hbGl6ZWRDb250ZW50IDogdW5kZWZpbmVkO1xuICBpZiAobm9ybWFsaXplZFZlcnNpb24gJiYgIS9eXFxkK1xcLlxcZCtcXC5cXGQrLy50ZXN0KG5vcm1hbGl6ZWRWZXJzaW9uKSkge1xuICAgIHJldHVybiB7IGVmZmVjdGl2ZVZlcnNpb246IG51bGwsIGVycm9yOiAnSW52YWxpZCB2ZXJzaW9uIGZvcm1hdC4gRXhwZWN0ZWQgc2VtdmVyIChlLmcuLCAyLjAuMiknIH07XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkQ2hhbm5lbCA9IGNoYW5uZWwgPyBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjaGFubmVsKS5ub3JtYWxpemVkQ29udGVudCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZWZmZWN0aXZlVmVyc2lvbiA9IG5vcm1hbGl6ZWRDaGFubmVsICYmIEFMTE9XRURfSU5TVEFMTF9DSEFOTkVMUy5oYXMobm9ybWFsaXplZENoYW5uZWwpICYmIG5vcm1hbGl6ZWRDaGFubmVsICE9PSAnbGF0ZXN0J1xuICAgID8gbm9ybWFsaXplZENoYW5uZWxcbiAgICA6IG5vcm1hbGl6ZWRWZXJzaW9uO1xuXG4gIHJldHVybiB7IGVmZmVjdGl2ZVZlcnNpb24sIGVycm9yOiBudWxsIH07XG59XG5cbmZ1bmN0aW9uIHRvTnZtTWl0aWdhdGlvbkFwcGxpZWQocmVzdWx0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGFwcGx5TnZtTGF1bmNoZXJJZk5lZWRlZD4+KTogYm9vbGVhbiB8IG51bGwge1xuICBpZiAocmVzdWx0ID09PSAnYXBwbGllZCcpIHJldHVybiB0cnVlO1xuICBpZiAocmVzdWx0ID09PSAnZmFpbGVkJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLy8g4pSA4pSAIExpY2Vuc2UgdmVyaWZpY2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBNU19QRVJfTUlOVVRFID0gNjAgKiAxMDAwO1xuY29uc3QgVkVSSUZJQ0FUSU9OX0NPREVfVFRMX01JTlVURVMgPSAxMDtcbmNvbnN0IFZFUklGSUNBVElPTl9DT0RFX1RUTF9NUyA9IFZFUklGSUNBVElPTl9DT0RFX1RUTF9NSU5VVEVTICogTVNfUEVSX01JTlVURTtcbmNvbnN0IFZFUklGSUNBVElPTl9NQVhfQVRURU1QVFMgPSA1O1xuY29uc3QgTElDRU5TRV9XT1JLRVJfVElNRU9VVF9NUyA9IDhfMDAwO1xuY29uc3QgTElDRU5TRV9XT1JLRVJfRVJST1JfQk9EWV9MSU1JVCA9IDMwMDtcbmNvbnN0IERFRkFVTFRfTElDRU5TRV9XT1JLRVJfVVJMID0gJ2h0dHBzOi8vZG9sbGhvdXNlbWNwLWxpY2Vuc2UtZW1haWwubWljay1lYmEud29ya2Vycy5kZXYnO1xuXG4vKiogR2VuZXJhdGUgYSBjcnlwdG9ncmFwaGljYWxseSByYW5kb20gNi1kaWdpdCB2ZXJpZmljYXRpb24gY29kZS4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlVmVyaWZpY2F0aW9uQ29kZSgpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nKHJhbmRvbUludCgxMDAwMDAsIDk5OTk5OSkpO1xufVxuXG4vKiogQ2hlY2sgaWYgYSB2ZXJpZmljYXRpb24gY29kZSBoYXMgZXhwaXJlZC4gKi9cbmZ1bmN0aW9uIGlzQ29kZUV4cGlyZWQoZXhwaXJlc0F0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5ldyBEYXRlKGV4cGlyZXNBdCkuZ2V0VGltZSgpIDwgRGF0ZS5ub3coKTtcbn1cblxuLy8g4pSA4pSAIExpY2Vuc2UgaGVscGVycyAobW9kdWxlIHNjb3BlIGZvciBTb25hckNsb3VkIFM3NzIxKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuY29uc3QgVkFMSURfTElDRU5TRV9USUVSUyA9IG5ldyBTZXQoWydhZ3BsJywgJ2ZyZWUtY29tbWVyY2lhbCcsICdwYWlkLWNvbW1lcmNpYWwnXSk7XG5jb25zdCBWQUxJRF9SRVZFTlVFX1NDQUxFUyA9IG5ldyBTZXQoWyckMU3igJMkNU0nLCAnJDVN4oCTJDI1TScsICckMjVN4oCTJDEwME0nLCAnJDEwME0rJ10pO1xuLy8gU2FmZSBmcm9tIFJlRG9TOiBpbnB1dCBpcyBwcmUtY2hlY2tlZCB0byDiiaQyNTQgY2hhcnMsIGFuZCB7MSw2NH0vezEsMjUzfS97Miw2M31cbi8vIGJvdW5kcyBwcmV2ZW50IGNhdGFzdHJvcGhpYyBiYWNrdHJhY2tpbmcgb24gYW55IGlucHV0IHdpdGhpbiB0aGF0IGxlbmd0aC5cbmNvbnN0IEVNQUlMX1BBVFRFUk4gPSAvXlteXFxzQF17MSw2NH1AW15cXHNAXXsxLDI1M31cXC5bXlxcc0BdezIsNjN9JC87XG5cbi8qKiBTYW5pdGl6ZSBhIHN0cmluZyBmaWVsZDogdHJpbSwgdHJ1bmNhdGUsIHJldHVybiB1bmRlZmluZWQgaWYgZW1wdHkuICovXG5mdW5jdGlvbiBzYW5pdGl6ZSh2YWw6IHVua25vd24sIG1heExlbjogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnIHx8ICF2YWwudHJpbSgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdmFsLnRyaW0oKS5zbGljZSgwLCBtYXhMZW4pO1xufVxuXG4vKiogVmFsaWRhdGUgZW1haWwgZm9ybWF0IGFuZCBjb21tZXJjaWFsIGFja25vd2xlZGdtZW50cy4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tbWVyY2lhbEZpZWxkcyhib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7IGVtYWlsLCB0ZWxlbWV0cnlBY2tub3dsZWRnZWQgfSA9IGJvZHk7XG4gIGlmICghZW1haWwgfHwgdHlwZW9mIGVtYWlsICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnRW1haWwgYWRkcmVzcyBpcyByZXF1aXJlZCBmb3IgQ29tbWVyY2lhbCBhbmQgRW50ZXJwcmlzZSBsaWNlbnNlcyc7XG4gIH1cbiAgaWYgKGVtYWlsLmxlbmd0aCA+IDI1NCB8fCAhRU1BSUxfUEFUVEVSTi50ZXN0KGVtYWlsKSkge1xuICAgIHJldHVybiAnUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJztcbiAgfVxuICBpZiAoIXRlbGVtZXRyeUFja25vd2xlZGdlZCkge1xuICAgIHJldHVybiAnVGVsZW1ldHJ5IGFja25vd2xlZGdtZW50IGlzIHJlcXVpcmVkIGZvciBDb21tZXJjaWFsIGFuZCBFbnRlcnByaXNlIGxpY2Vuc2VzJztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIFZhbGlkYXRlIGZyZWUtY29tbWVyY2lhbCBzcGVjaWZpYyBmaWVsZHMuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUZyZWVDb21tZXJjaWFsRmllbGRzKGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHsgYXR0cmlidXRpb25BY2tub3dsZWRnZWQsIHJldmVudWVBdHRlc3RlZCB9ID0gYm9keTtcbiAgaWYgKCFhdHRyaWJ1dGlvbkFja25vd2xlZGdlZCkge1xuICAgIHJldHVybiAnQXR0cmlidXRpb24gYWNrbm93bGVkZ21lbnQgaXMgcmVxdWlyZWQgZm9yIENvbW1lcmNpYWwgbGljZW5zZXMnO1xuICB9XG4gIGlmICghcmV2ZW51ZUF0dGVzdGVkKSB7XG4gICAgcmV0dXJuICdSZXZlbnVlIGF0dGVzdGF0aW9uIGlzIHJlcXVpcmVkIGZvciBDb21tZXJjaWFsIGxpY2Vuc2VzJztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIFZhbGlkYXRlIGVudGVycHJpc2Ugc3BlY2lmaWMgZmllbGRzLiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFbnRlcnByaXNlRmllbGRzKGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHsgcmV2ZW51ZVNjYWxlLCBjb21wYW55TmFtZSwgdXNlQ2FzZSB9ID0gYm9keTtcbiAgaWYgKCFyZXZlbnVlU2NhbGUgfHwgIVZBTElEX1JFVkVOVUVfU0NBTEVTLmhhcyhyZXZlbnVlU2NhbGUgYXMgc3RyaW5nKSkge1xuICAgIHJldHVybiBgUmV2ZW51ZSBzY2FsZSBpcyByZXF1aXJlZC4gTXVzdCBiZSBvbmUgb2Y6ICR7Wy4uLlZBTElEX1JFVkVOVUVfU0NBTEVTXS5qb2luKCcsICcpfWA7XG4gIH1cbiAgaWYgKCFjb21wYW55TmFtZSB8fCB0eXBlb2YgY29tcGFueU5hbWUgIT09ICdzdHJpbmcnIHx8ICFjb21wYW55TmFtZS50cmltKCkpIHtcbiAgICByZXR1cm4gJ0NvbXBhbnkgbmFtZSBpcyByZXF1aXJlZCBmb3IgRW50ZXJwcmlzZSBsaWNlbnNlcyc7XG4gIH1cbiAgaWYgKCF1c2VDYXNlIHx8IHR5cGVvZiB1c2VDYXNlICE9PSAnc3RyaW5nJyB8fCAhdXNlQ2FzZS50cmltKCkpIHtcbiAgICByZXR1cm4gJ1VzZSBjYXNlIGlzIHJlcXVpcmVkIGZvciBFbnRlcnByaXNlIGxpY2Vuc2VzJztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIFZhbGlkYXRlIGxpY2Vuc2UgZm9ybSBpbnB1dC4gUmV0dXJucyBlcnJvciBzdHJpbmcgb3IgbnVsbCBpZiB2YWxpZC4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTGljZW5zZUlucHV0KGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHsgdGllciB9ID0gYm9keTtcbiAgaWYgKCF0aWVyIHx8ICFWQUxJRF9MSUNFTlNFX1RJRVJTLmhhcyh0aWVyIGFzIHN0cmluZykpIHtcbiAgICByZXR1cm4gYEludmFsaWQgbGljZW5zZSB0aWVyLiBNdXN0IGJlIG9uZSBvZjogJHtbLi4uVkFMSURfTElDRU5TRV9USUVSU10uam9pbignLCAnKX1gO1xuICB9XG4gIGlmICh0aWVyICE9PSAnYWdwbCcpIHtcbiAgICBjb25zdCBjb21tZXJjaWFsRXJyb3IgPSB2YWxpZGF0ZUNvbW1lcmNpYWxGaWVsZHMoYm9keSk7XG4gICAgaWYgKGNvbW1lcmNpYWxFcnJvcikgcmV0dXJuIGNvbW1lcmNpYWxFcnJvcjtcbiAgfVxuICBpZiAodGllciA9PT0gJ2ZyZWUtY29tbWVyY2lhbCcpIHtcbiAgICBjb25zdCBmcmVlRXJyb3IgPSB2YWxpZGF0ZUZyZWVDb21tZXJjaWFsRmllbGRzKGJvZHkpO1xuICAgIGlmIChmcmVlRXJyb3IpIHJldHVybiBmcmVlRXJyb3I7XG4gIH1cbiAgaWYgKHRpZXIgPT09ICdwYWlkLWNvbW1lcmNpYWwnKSB7XG4gICAgY29uc3QgZW50ZXJwcmlzZUVycm9yID0gdmFsaWRhdGVFbnRlcnByaXNlRmllbGRzKGJvZHkpO1xuICAgIGlmIChlbnRlcnByaXNlRXJyb3IpIHJldHVybiBlbnRlcnByaXNlRXJyb3I7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBCdWlsZCBsaWNlbnNlIGRhdGEgb2JqZWN0IGZyb20gdmFsaWRhdGVkIGlucHV0LiAqL1xuZnVuY3Rpb24gYnVpbGRMaWNlbnNlRGF0YShib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgeyB0aWVyLCBlbWFpbCwgcmV2ZW51ZVNjYWxlLCBjb21wYW55TmFtZSwgdXNlQ2FzZSB9ID0gYm9keTtcbiAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHRpZXIgfTtcbiAgaWYgKHRpZXIgIT09ICdhZ3BsJykge1xuICAgIGRhdGEuZW1haWwgPSBzYW5pdGl6ZShlbWFpbCwgMjU0KTtcbiAgICBkYXRhLmF0dGVzdGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgZGF0YS50ZWxlbWV0cnlSZXF1aXJlZCA9IHRydWU7XG4gIH1cbiAgaWYgKHRpZXIgPT09ICdwYWlkLWNvbW1lcmNpYWwnKSB7XG4gICAgaWYgKHJldmVudWVTY2FsZSkgZGF0YS5yZXZlbnVlU2NhbGUgPSByZXZlbnVlU2NhbGU7XG4gICAgaWYgKGNvbXBhbnlOYW1lKSBkYXRhLmNvbXBhbnlOYW1lID0gc2FuaXRpemUoY29tcGFueU5hbWUsIDIwMCk7XG4gICAgaWYgKHVzZUNhc2UpIGRhdGEudXNlQ2FzZSA9IHNhbml0aXplKHVzZUNhc2UsIDUwMCk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKiBTZW5kIGxpY2Vuc2VfYWN0aXZhdGlvbiBldmVudCB0byBQb3N0SG9nIGZvciBjb21tZXJjaWFsIHRpZXJzLiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FwdHVyZVBvc3RIb2dMaWNlbnNlRXZlbnQobGljZW5zZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBvc3Rob2cgPSBuZXcgUG9zdEhvZyhQT1NUSE9HX1BST0pFQ1RfS0VZLCB7XG4gICAgaG9zdDogcHJvY2Vzcy5lbnYuUE9TVEhPR19IT1NUIHx8ICdodHRwczovL2FwcC5wb3N0aG9nLmNvbScsXG4gICAgZmx1c2hBdDogMSxcbiAgICBmbHVzaEludGVydmFsOiA1MDAwLFxuICB9KTtcbiAgbGV0IGluc3RhbGxJZDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnN0IGlkUGF0aCA9IGpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICcudGVsZW1ldHJ5LWlkJyk7XG4gICAgaW5zdGFsbElkID0gKGF3YWl0IHJlYWRGaWxlKGlkUGF0aCwgJ3V0Zi04JykpLnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgaW5zdGFsbElkID0gdXVpZHY0KCk7XG4gIH1cbiAgY29uc3QgZXZlbnRUeXBlID0gKGxpY2Vuc2VEYXRhLmV2ZW50VHlwZSBhcyBzdHJpbmcpID8/ICdhY3RpdmF0aW9uJztcbiAgcG9zdGhvZy5jYXB0dXJlKHtcbiAgICBkaXN0aW5jdElkOiBpbnN0YWxsSWQsXG4gICAgZXZlbnQ6ICdsaWNlbnNlX2FjdGl2YXRpb24nLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHRpZXI6IGxpY2Vuc2VEYXRhLnRpZXIsXG4gICAgICBlbWFpbDogbGljZW5zZURhdGEuZW1haWwsXG4gICAgICBldmVudF90eXBlOiBldmVudFR5cGUsXG4gICAgICBzZXJ2ZXJfdmVyc2lvbjogUEFDS0FHRV9WRVJTSU9OLFxuICAgICAgb3M6IHBsYXRmb3JtKCksXG4gICAgICAuLi4oZXZlbnRUeXBlID09PSAndmVyaWZpY2F0aW9uJyA/IHtcbiAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IGxpY2Vuc2VEYXRhLnZlcmlmaWNhdGlvbkNvZGUsXG4gICAgICB9IDoge30pLFxuICAgICAgLi4uKGV2ZW50VHlwZSA9PT0gJ2FjdGl2YXRpb24nID8ge1xuICAgICAgICB2ZXJpZmljYXRpb25fdGltZV9tczogbGljZW5zZURhdGEudmVyaWZpY2F0aW9uX3RpbWVfbXMsXG4gICAgICAgIHZlcmlmaWNhdGlvbl90aW1lX3NlY29uZHM6IGxpY2Vuc2VEYXRhLnZlcmlmaWNhdGlvbl90aW1lX21zXG4gICAgICAgICAgPyBNYXRoLnJvdW5kKChsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25fdGltZV9tcyBhcyBudW1iZXIpIC8gMTAwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgIHZlcmlmaWNhdGlvbl9hdHRlbXB0czogbGljZW5zZURhdGEudmVyaWZpY2F0aW9uX2F0dGVtcHRzLFxuICAgICAgfSA6IHt9KSxcbiAgICAgIC4uLihsaWNlbnNlRGF0YS50aWVyID09PSAncGFpZC1jb21tZXJjaWFsJyA/IHtcbiAgICAgICAgcmV2ZW51ZV9zY2FsZTogbGljZW5zZURhdGEucmV2ZW51ZVNjYWxlLFxuICAgICAgICBjb21wYW55X25hbWU6IGxpY2Vuc2VEYXRhLmNvbXBhbnlOYW1lLFxuICAgICAgICB1c2VfY2FzZTogbGljZW5zZURhdGEudXNlQ2FzZSxcbiAgICAgIH0gOiB7fSksXG4gICAgfSxcbiAgfSk7XG4gIGF3YWl0IHBvc3Rob2cuc2h1dGRvd24oKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMaWNlbnNlV29ya2VyUmVxdWVzdEJvZHkoXG4gIGxpY2Vuc2VEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgdmVyaWZpY2F0aW9uQ29kZTogc3RyaW5nLFxuICBkaXN0aW5jdElkOiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGV2ZW50OiAnbGljZW5zZV9hY3RpdmF0aW9uJyxcbiAgICBkaXN0aW5jdF9pZDogZGlzdGluY3RJZCxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICB0aWVyOiBsaWNlbnNlRGF0YS50aWVyLFxuICAgICAgZW1haWw6IGxpY2Vuc2VEYXRhLmVtYWlsLFxuICAgICAgZXZlbnRfdHlwZTogJ3ZlcmlmaWNhdGlvbicsXG4gICAgICB2ZXJpZmljYXRpb25fY29kZTogdmVyaWZpY2F0aW9uQ29kZSxcbiAgICAgIHNlcnZlcl92ZXJzaW9uOiBQQUNLQUdFX1ZFUlNJT04sXG4gICAgICBvczogcGxhdGZvcm0oKSxcbiAgICB9LFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VuZExpY2Vuc2VXb3JrZXJWZXJpZmljYXRpb25FbWFpbChcbiAgbGljZW5zZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmcsXG4gIGRpc3RpbmN0SWQ6IHN0cmluZyxcbik6IFByb21pc2U8eyBvazogdHJ1ZSB9IHwgeyBvazogZmFsc2U7IHN0YXR1cz86IG51bWJlcjsgZXJyb3I6IHN0cmluZzsgcmVzcG9uc2VCb2R5Pzogc3RyaW5nIH0+IHtcbiAgY29uc3Qgd29ya2VyVXJsID0gbmV3IFVSTChMSUNFTlNFX1dPUktFUl9ESVJFQ1RfUEFUSCwgcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0xJQ0VOU0VfV09SS0VSX1VSTCB8fCBERUZBVUxUX0xJQ0VOU0VfV09SS0VSX1VSTCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHdvcmtlclVybCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgYm9keTogYnVpbGRMaWNlbnNlV29ya2VyUmVxdWVzdEJvZHkobGljZW5zZURhdGEsIHZlcmlmaWNhdGlvbkNvZGUsIGRpc3RpbmN0SWQpLFxuICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KExJQ0VOU0VfV09SS0VSX1RJTUVPVVRfTVMpLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvazogZmFsc2UsXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIGVycm9yOiBgd29ya2VyX2h0dHBfJHtyZXNwb25zZS5zdGF0dXN9YCxcbiAgICAgIHJlc3BvbnNlQm9keTogKGF3YWl0IHJlc3BvbnNlLnRleHQoKSkuc2xpY2UoMCwgTElDRU5TRV9XT1JLRVJfRVJST1JfQk9EWV9MSU1JVCksXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAoZXJyb3IubmFtZSA9PT0gJ1RpbWVvdXRFcnJvcicgfHxcbiAgICAgICAgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InIHx8XG4gICAgICAgIGVycm9yLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndGltZW91dCcpIHx8XG4gICAgICAgIGVycm9yLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndGltZWQgb3V0JykpXG4gICAgKSB7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiAnd29ya2VyX3RpbWVvdXQnIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBvazogZmFsc2UsXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGljZW5zZVdvcmtlckZhaWx1cmVNZXNzYWdlKHJlc3VsdDogeyBzdGF0dXM/OiBudW1iZXI7IGVycm9yOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGlmIChyZXN1bHQuc3RhdHVzID09PSA0MDEgfHwgcmVzdWx0LnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgcmV0dXJuICdWZXJpZmljYXRpb24gZW1haWwgc2VydmljZSByZWplY3RlZCB0aGUgcmVxdWVzdC4gUGxlYXNlIGNoZWNrIHRoZSBsb2NhbCBlbWFpbCBkZWxpdmVyeSBjb25maWd1cmF0aW9uIGFuZCB0cnkgYWdhaW4uJztcbiAgfVxuICBpZiAocmVzdWx0LmVycm9yID09PSAnd29ya2VyX3RpbWVvdXQnKSB7XG4gICAgcmV0dXJuICdWZXJpZmljYXRpb24gZW1haWwgc2VydmljZSB0aW1lZCBvdXQuIFBsZWFzZSB0cnkgYWdhaW4gaW4gYSBtb21lbnQuJztcbiAgfVxuICByZXR1cm4gJ1dlIGNvdWxkIG5vdCBzZW5kIHRoZSB2ZXJpZmljYXRpb24gZW1haWwgcmlnaHQgbm93LiBQbGVhc2UgdHJ5IGFnYWluIGluIGEgbW9tZW50Lic7XG59XG5cbmZ1bmN0aW9uIGxvZ0xpY2Vuc2VXb3JrZXJEZWxpdmVyeUZhaWx1cmUoXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgbGljZW5zZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBkZWxpdmVyeVJlc3VsdDogeyBzdGF0dXM/OiBudW1iZXI7IGVycm9yOiBzdHJpbmc7IHJlc3BvbnNlQm9keT86IHN0cmluZyB9LFxuKTogdm9pZCB7XG4gIGxvZ2dlci5lcnJvcihtZXNzYWdlLCB7XG4gICAgZW1haWw6IGxpY2Vuc2VEYXRhLmVtYWlsLFxuICAgIHRpZXI6IGxpY2Vuc2VEYXRhLnRpZXIsXG4gICAgc3RhdHVzOiBkZWxpdmVyeVJlc3VsdC5zdGF0dXMgPz8gbnVsbCxcbiAgICBlcnJvcjogZGVsaXZlcnlSZXN1bHQuZXJyb3IsXG4gICAgcmVzcG9uc2VCb2R5OiBkZWxpdmVyeVJlc3VsdC5yZXNwb25zZUJvZHkgPz8gbnVsbCxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXR1cFJvdXRlcyhvcHRzPzoge1xuICAvKiogT3ZlcnJpZGUgaW5zdGFsbC1tY3AgcnVubmVyLiBGb3IgdGVzdGluZyBvbmx5IOKAlCBwcmVmaXggc2lnbmFscyB0ZXN0LW9ubHkgdXNlLiAqL1xuICBfcnVuSW5zdGFsbE1jcD86IChjbGllbnQ6IHN0cmluZywgdmVyc2lvbj86IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICAvKiogT3ZlcnJpZGUgcGVybWlzc2lvbiBob29rIGluc3RhbGxlci4gRm9yIHRlc3Rpbmcgb25seS4gKi9cbiAgX2luc3RhbGxQZXJtaXNzaW9uSG9vaz86IChjbGllbnQ6IHN0cmluZykgPT4gUHJvbWlzZTxJbnN0YWxsUGVybWlzc2lvbkhvb2tSZXN1bHQ+O1xuICAvKiogU2tpcCB0aGUgc2xpZGluZy13aW5kb3cgcmF0ZSBsaW1pdGVyLiBGb3IgdGVzdGluZyBvbmx5LiAqL1xuICBfc2tpcFJhdGVMaW1pdD86IGJvb2xlYW47XG59KToge1xuICBpbnN0YWxsSGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgb3BlbkNvbmZpZ0hhbmRsZXI6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD47XG4gIHZlcnNpb25IYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBtY3BiUmVkaXJlY3RIYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBkZXRlY3RIYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBnZXRMaWNlbnNlSGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgc2V0TGljZW5zZUhhbmRsZXI6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD47XG4gIHZlcmlmeUxpY2Vuc2VIYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZXNlbmRWZXJpZmljYXRpb25IYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xufSB7XG4gIGNvbnN0IGluc3RhbGxlciA9IG9wdHM/Ll9ydW5JbnN0YWxsTWNwID8/IHJ1bkluc3RhbGxNY3A7XG4gIGNvbnN0IHBlcm1pc3Npb25Ib29rSW5zdGFsbGVyID0gb3B0cz8uX2luc3RhbGxQZXJtaXNzaW9uSG9vayA/PyBpbnN0YWxsUGVybWlzc2lvbkhvb2s7XG4gIGNvbnN0IHNraXBSYXRlTGltaXQgPSBvcHRzPy5fc2tpcFJhdGVMaW1pdCA/PyBmYWxzZTtcbiAgLy8g4pSA4pSAIERldGVjdCBleGlzdGluZyBpbnN0YWxsYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb25zdCBkZXRlY3RIYW5kbGVyID0gYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBjbGllbnRzID0gW1xuICAgICAgeyBpZDogJ2NsYXVkZScsIG5hbWU6ICdDbGF1ZGUgRGVza3RvcCcgfSxcbiAgICAgIHsgaWQ6ICdjbGF1ZGUtY29kZScsIG5hbWU6ICdDbGF1ZGUgQ29kZScgfSxcbiAgICAgIHsgaWQ6ICdjdXJzb3InLCBuYW1lOiAnQ3Vyc29yJyB9LFxuICAgICAgeyBpZDogJ2NsaW5lJywgbmFtZTogJ0NsaW5lJyB9LFxuICAgICAgeyBpZDogJ3dpbmRzdXJmJywgbmFtZTogJ1dpbmRzdXJmJyB9LFxuICAgICAgeyBpZDogJ2xtc3R1ZGlvJywgbmFtZTogJ0xNIFN0dWRpbycgfSxcbiAgICAgIHsgaWQ6ICdnZW1pbmktY2xpJywgbmFtZTogJ0dlbWluaSBDTEknIH0sXG4gICAgICB7IGlkOiAnY29kZXgnLCBuYW1lOiAnQ29kZXgnIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IHJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50cy5tYXAoYXN5bmMgKHsgaWQsIG5hbWUgfSkgPT4ge1xuICAgICAgY29uc3QgZGV0ZWN0aW9uID0gYXdhaXQgZGV0ZWN0Q2xpZW50KGlkKTtcbiAgICAgIGlmIChkZXRlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHN1cHBvcnQ6IHsgbGV2ZWw6IFNFVFVQX1NVUFBPUlRfTEVWRUxTW2lkXSB9LFxuICAgICAgICAgIC4uLmRldGVjdGlvbixcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGlkID09PSAnY2xhdWRlLWNvZGUnIHx8IGlkID09PSAnY3Vyc29yJyB8fCBpZCA9PT0gJ3dpbmRzdXJmJyB8fCBpZCA9PT0gJ2dlbWluaS1jbGknIHx8IGlkID09PSAnY29kZXgnKSB7XG4gICAgICAgICAgY29uc3QgaG9va1N0YXR1cyA9IGF3YWl0IGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmModW5kZWZpbmVkLCBpZCk7XG4gICAgICAgICAgcmVzdWx0Lmhvb2tJbnN0YWxsZWQgPSBob29rU3RhdHVzLmluc3RhbGxlZDtcbiAgICAgICAgICByZXN1bHQuaG9va0Fzc2V0c1ByZXBhcmVkID0gaG9va1N0YXR1cy5hc3NldHNQcmVwYXJlZDtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRzW2lkXSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgICByZXMuanNvbihyZXN1bHRzKTtcbiAgfTtcblxuICAvLyDilIDilIAgT3BlbiBjb25maWcgZmlsZSBpbiBlZGl0b3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IG9wZW5Db25maWdIYW5kbGVyID0gYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDbGllbnQgPSB2YWxpZGF0ZUNsaWVudChyZXEsIHJlcywgT1BFTkFCTEVfQ0xJRU5UUyk7XG4gICAgaWYgKCFub3JtYWxpemVkQ2xpZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBjb25maWdQYXRoID0gZ2V0Q29uZmlnUGF0aChub3JtYWxpemVkQ2xpZW50KTtcbiAgICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6IGBDb25maWcgcGF0aCB1bmtub3duIGZvcjogJHtub3JtYWxpemVkQ2xpZW50fWAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBmaWxlIHdpdGggZW1wdHkgY29udGVudCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldFxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhY2Nlc3MoY29uZmlnUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBta2RpcihkaXJuYW1lKGNvbmZpZ1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGNvbmZpZ1BhdGguZW5kc1dpdGgoJy50b21sJykgPyAnJyA6ICd7fSc7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShjb25maWdQYXRoLCBjb250ZW50ICsgJ1xcbicsICd1dGYtOCcpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW1NldHVwXSBDcmVhdGVkIGVtcHR5IGNvbmZpZzogJHtjb25maWdQYXRofWApO1xuICAgICAgfSBjYXRjaCAobWtFcnIpIHtcbiAgICAgICAgY29uc3QgbXNnID0gbWtFcnIgaW5zdGFuY2VvZiBFcnJvciA/IG1rRXJyLm1lc3NhZ2UgOiBTdHJpbmcobWtFcnIpO1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBgQ291bGQgbm90IGNyZWF0ZSBjb25maWcgZmlsZTogJHttc2d9YCB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIE9wZW5pbmcgY29uZmlnIGZvciAke25vcm1hbGl6ZWRDbGllbnR9OiAke2NvbmZpZ1BhdGh9YCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgb3BlbkluRWRpdG9yKGNvbmZpZ1BhdGgpO1xuICAgICAgcmVzLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBwYXRoOiBjb25maWdQYXRoIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBtZXNzYWdlLCBwYXRoOiBjb25maWdQYXRoIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyDilIDilIAgQXV0by1pbnN0YWxsIHZpYSBpbnN0YWxsLW1jcCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29uc3QgaW5zdGFsbEhhbmRsZXIgPSBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFza2lwUmF0ZUxpbWl0ICYmICFpbnN0YWxsTGltaXRlci50cnlBY3F1aXJlKCkpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdUb28gbWFueSBpbnN0YWxsIHJlcXVlc3RzLiBUcnkgYWdhaW4gaW4gYSBtaW51dGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50ID0gdmFsaWRhdGVDbGllbnQocmVxLCByZXMsIEFMTE9XRURfQ0xJRU5UUyk7XG4gICAgaWYgKCFub3JtYWxpemVkQ2xpZW50KSByZXR1cm47XG5cbiAgICBjb25zdCB7IGVmZmVjdGl2ZVZlcnNpb24sIGVycm9yIH0gPSByZXNvbHZlUmVxdWVzdGVkSW5zdGFsbFZlcnNpb24ocmVxLmJvZHkpO1xuICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvciB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YWcgPSBlZmZlY3RpdmVWZXJzaW9uID8gYEAke2VmZmVjdGl2ZVZlcnNpb259YCA6ICdAbGF0ZXN0JztcbiAgICBsb2dnZXIuaW5mbyhgW1NldHVwXSBJbnN0YWxsaW5nIERvbGxob3VzZU1DUCR7dGFnfSB0byBjbGllbnQ6ICR7bm9ybWFsaXplZENsaWVudH1gKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBub3JtYWxpemVkQ2xpZW50ID09PSAnbG1zdHVkaW8nXG4gICAgICAgID8gYXdhaXQgaW5zdGFsbExtU3R1ZGlvQ29uZmlnKGVmZmVjdGl2ZVZlcnNpb24pXG4gICAgICAgIDogYXdhaXQgaW5zdGFsbGVyKG5vcm1hbGl6ZWRDbGllbnQsIGVmZmVjdGl2ZVZlcnNpb24pO1xuICAgICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gU3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCB0byAke25vcm1hbGl6ZWRDbGllbnR9YCk7XG5cbiAgICAgIC8vIEJlc3QtZWZmb3J0IE5WTSBtaXRpZ2F0aW9uIChtYWNPUy9MaW51eCBvbmx5KS5cbiAgICAgIC8vIEV4dHJhY3RlZCBpbnRvIGFwcGx5TnZtTGF1bmNoZXJJZk5lZWRlZCB0byBrZWVwIHRoaXMgaGFuZGxlcidzXG4gICAgICAvLyBjb2duaXRpdmUgY29tcGxleGl0eSB3aXRoaW4gYm91bmRzIChTb25hckNsb3VkIFMzNzc2KS5cbiAgICAgIGNvbnN0IG52bVJlc3VsdCA9IGF3YWl0IGFwcGx5TnZtTGF1bmNoZXJJZk5lZWRlZChub3JtYWxpemVkQ2xpZW50KTtcblxuICAgICAgY29uc3QgbnZtTWl0aWdhdGlvbkFwcGxpZWQgPSB0b052bU1pdGlnYXRpb25BcHBsaWVkKG52bVJlc3VsdCk7XG5cbiAgICAgIGNvbnN0IGhvb2tJbnN0YWxsID0gYXdhaXQgcGVybWlzc2lvbkhvb2tJbnN0YWxsZXIobm9ybWFsaXplZENsaWVudCk7XG5cbiAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgb3V0cHV0LFxuICAgICAgICBjbGllbnQ6IG5vcm1hbGl6ZWRDbGllbnQsXG4gICAgICAgIHZlcnNpb246IGVmZmVjdGl2ZVZlcnNpb24gfHwgJ2xhdGVzdCcsXG4gICAgICAgIG52bU1pdGlnYXRpb25BcHBsaWVkLFxuICAgICAgICBob29rSW5zdGFsbCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgIGxvZ2dlci53YXJuKGBbU2V0dXBdIEluc3RhbGwgZmFpbGVkIGZvciAke25vcm1hbGl6ZWRDbGllbnR9OiAke21lc3NhZ2V9YCk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogbWVzc2FnZSwgY2xpZW50OiBub3JtYWxpemVkQ2xpZW50IH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyDilIDilIAgVmVyc2lvbiBpbmZvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb25zdCB2ZXJzaW9uSGFuZGxlciA9IGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgbG9jYWwgPSB7XG4gICAgICB2ZXJzaW9uOiBQQUNLQUdFX1ZFUlNJT04sXG4gICAgICBtY3BiVXJsOiBgaHR0cHM6Ly9naXRodWIuY29tLyR7R0lUSFVCX1JFUE99L3JlbGVhc2VzL2Rvd25sb2FkL3Yke1BBQ0tBR0VfVkVSU0lPTn0vZG9sbGhvdXNlbWNwLSR7UEFDS0FHRV9WRVJTSU9OfS5tY3BiYCxcbiAgICB9O1xuXG4gICAgLy8gUXVlcnkgR2l0SHViIGZvciB0aGUgYWN0dWFsIGxhdGVzdCByZWxlYXNlXG4gICAgbGV0IGxhdGVzdCA9IGxvY2FsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBnaFJlcyA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7R0lUSFVCX1JFUE99L3JlbGVhc2VzL2xhdGVzdGAsIHtcbiAgICAgICAgaGVhZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbicsICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC1TZXR1cCcgfSxcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDUwMDApLFxuICAgICAgfSk7XG4gICAgICBpZiAoZ2hSZXMub2spIHtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IGdoUmVzLmpzb24oKSBhcyB7IHRhZ19uYW1lOiBzdHJpbmc7IGFzc2V0czogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGJyb3dzZXJfZG93bmxvYWRfdXJsOiBzdHJpbmcgfT4gfTtcbiAgICAgICAgY29uc3QgbWNwYkFzc2V0ID0gcmVsZWFzZS5hc3NldHMuZmluZChhID0+IE1DUEJfQVNTRVRfUEFUVEVSTi50ZXN0KGEubmFtZSkpO1xuICAgICAgICBsYXRlc3QgPSB7XG4gICAgICAgICAgdmVyc2lvbjogcmVsZWFzZS50YWdfbmFtZS5yZXBsYWNlKC9edi8sICcnKSxcbiAgICAgICAgICBtY3BiVXJsOiBtY3BiQXNzZXQ/LmJyb3dzZXJfZG93bmxvYWRfdXJsIHx8XG4gICAgICAgICAgICBgaHR0cHM6Ly9naXRodWIuY29tLyR7R0lUSFVCX1JFUE99L3JlbGVhc2VzL2Rvd25sb2FkLyR7cmVsZWFzZS50YWdfbmFtZX0vZG9sbGhvdXNlbWNwLSR7cmVsZWFzZS50YWdfbmFtZS5yZXBsYWNlKC9edi8sICcnKX0ubWNwYmAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBHaXRIdWIgdW5yZWFjaGFibGUg4oCUIHVzZSBsb2NhbCB2ZXJzaW9uIGluZm9cbiAgICB9XG5cbiAgICByZXMuanNvbih7XG4gICAgICBydW5uaW5nOiBsb2NhbCxcbiAgICAgIGxhdGVzdCxcbiAgICAgIGlzTGF0ZXN0OiBsb2NhbC52ZXJzaW9uID09PSBsYXRlc3QudmVyc2lvbixcbiAgICB9KTtcbiAgfTtcblxuICAvLyDilIDilIAgLm1jcGIgZG93bmxvYWQgcmVkaXJlY3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IG1jcGJSZWRpcmVjdEhhbmRsZXIgPSBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIFRyeSBHaXRIdWIgQVBJIGZvciB0aGUgYWN0dWFsIGxhdGVzdCAubWNwYiBhc3NldCBVUkxcbiAgICB0cnkge1xuICAgICAgY29uc3QgZ2hSZXMgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke0dJVEhVQl9SRVBPfS9yZWxlYXNlcy9sYXRlc3RgLCB7XG4gICAgICAgIGhlYWRlcnM6IHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24nLCAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AtU2V0dXAnIH0sXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCg1MDAwKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGdoUmVzLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSBhd2FpdCBnaFJlcy5qc29uKCkgYXMgeyB0YWdfbmFtZTogc3RyaW5nOyBhc3NldHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBicm93c2VyX2Rvd25sb2FkX3VybDogc3RyaW5nIH0+IH07XG4gICAgICAgIGNvbnN0IG1jcGJBc3NldCA9IHJlbGVhc2UuYXNzZXRzLmZpbmQoYSA9PiBNQ1BCX0FTU0VUX1BBVFRFUk4udGVzdChhLm5hbWUpKTtcbiAgICAgICAgaWYgKG1jcGJBc3NldCkge1xuICAgICAgICAgIHJlcy5yZWRpcmVjdChtY3BiQXNzZXQuYnJvd3Nlcl9kb3dubG9hZF91cmwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIGNvbnN0cnVjdGVkIFVSTFxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBjb25zdHJ1Y3QgVVJMIGZyb20gcnVubmluZyB2ZXJzaW9uXG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke0dJVEhVQl9SRVBPfS9yZWxlYXNlcy9kb3dubG9hZC92JHtQQUNLQUdFX1ZFUlNJT059L2RvbGxob3VzZW1jcC0ke1BBQ0tBR0VfVkVSU0lPTn0ubWNwYmA7XG4gICAgcmVzLnJlZGlyZWN0KHVybCk7XG4gIH07XG5cbiAgLy8g4pSA4pSAIExpY2Vuc2Ugc2VsZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb25zdCBsaWNlbnNlQ29uZmlnUGF0aCA9IGpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICdsaWNlbnNlLmpzb24nKTtcblxuICBhc3luYyBmdW5jdGlvbiByZWFkTGljZW5zZSgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKGxpY2Vuc2VDb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyB0aWVyOiAnYWdwbCcgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB3cml0ZUxpY2Vuc2UoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkaXIgPSBqb2luKGhvbWVkaXIoKSwgJy5kb2xsaG91c2UnKTtcbiAgICBhd2FpdCBta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHdyaXRlRmlsZShsaWNlbnNlQ29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMiksIHsgbW9kZTogMG82MDAgfSk7XG4gIH1cblxuICBjb25zdCBnZXRMaWNlbnNlSGFuZGxlciA9IGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgbGljZW5zZSA9IGF3YWl0IHJlYWRMaWNlbnNlKCk7XG4gICAgLy8gTmV2ZXIgZXhwb3NlIHZlcmlmaWNhdGlvbiBpbnRlcm5hbHMgdG8gY2xpZW50XG4gICAgY29uc3QgeyB2ZXJpZmljYXRpb25Db2RlOiBfY29kZSwgdmVyaWZpY2F0aW9uQXR0ZW1wdHM6IF9hdHRlbXB0cywgLi4ucHVibGljTGljZW5zZSB9ID0gbGljZW5zZTtcbiAgICByZXMuanNvbihwdWJsaWNMaWNlbnNlKTtcbiAgfTtcblxuICBjb25zdCBsaWNlbnNlUmF0ZUxpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKDUsIDYwXzAwMCk7IC8vIDUgcmVxdWVzdHMvbWludXRlXG5cbiAgY29uc3Qgc2V0TGljZW5zZUhhbmRsZXIgPSBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFsaWNlbnNlUmF0ZUxpbWl0ZXIudHJ5QWNxdWlyZSgpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdzZXR1cFJvdXRlcy5zZXRMaWNlbnNlSGFuZGxlcicsXG4gICAgICAgIGRldGFpbHM6ICdMaWNlbnNlIGVuZHBvaW50IHJhdGUgbGltaXQgZXhjZWVkZWQgKDUgcmVxL21pbiknLFxuICAgICAgfSk7XG4gICAgICByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnVG9vIG1hbnkgbGljZW5zZSByZXF1ZXN0cy4gUGxlYXNlIHRyeSBhZ2FpbiBpbiBhIG1pbnV0ZS4nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSByZXEuYm9keSA/PyB7fTtcbiAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0ZUxpY2Vuc2VJbnB1dChib2R5KTtcbiAgICBpZiAodmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiB2YWxpZGF0aW9uRXJyb3IgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGljZW5zZURhdGEgPSBidWlsZExpY2Vuc2VEYXRhKGJvZHkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChsaWNlbnNlRGF0YS50aWVyID09PSAnYWdwbCcpIHtcbiAgICAgICAgLy8gQUdQTDogYWN0aXZhdGUgaW1tZWRpYXRlbHksIG5vIHZlcmlmaWNhdGlvbiBuZWVkZWRcbiAgICAgICAgbGljZW5zZURhdGEuc3RhdHVzID0gJ2FjdGl2ZSc7XG4gICAgICAgIGF3YWl0IHdyaXRlTGljZW5zZShsaWNlbnNlRGF0YSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbU2V0dXBdIExpY2Vuc2Ugc2V0IHRvIEFHUEwgKGFjdGl2ZSwgbm8gdmVyaWZpY2F0aW9uKScpO1xuICAgICAgICByZXMuanNvbih7IHN1Y2Nlc3M6IHRydWUsIGxpY2Vuc2U6IGxpY2Vuc2VEYXRhIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENvbW1lcmNpYWwgdGllcnM6IHNhdmUgYXMgcGVuZGluZywgZ2VuZXJhdGUgdmVyaWZpY2F0aW9uIGNvZGVcbiAgICAgIGNvbnN0IGNvZGUgPSBnZW5lcmF0ZVZlcmlmaWNhdGlvbkNvZGUoKTtcbiAgICAgIGxpY2Vuc2VEYXRhLnN0YXR1cyA9ICdwZW5kaW5nJztcbiAgICAgIGxpY2Vuc2VEYXRhLnZlcmlmaWNhdGlvbkNvZGUgPSBjb2RlO1xuICAgICAgbGljZW5zZURhdGEudmVyaWZpY2F0aW9uRXhwaXJ5ID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIFZFUklGSUNBVElPTl9DT0RFX1RUTF9NUykudG9JU09TdHJpbmcoKTtcbiAgICAgIGxpY2Vuc2VEYXRhLnZlcmlmaWNhdGlvbkF0dGVtcHRzID0gMDtcbiAgICAgIGxpY2Vuc2VEYXRhLnZlcmlmaWNhdGlvblJlcXVlc3RlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgYXdhaXQgd3JpdGVMaWNlbnNlKGxpY2Vuc2VEYXRhKTtcblxuICAgICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gTGljZW5zZSBwZW5kaW5nIHZlcmlmaWNhdGlvbjogJHtsaWNlbnNlRGF0YS50aWVyfSAoJHtsaWNlbnNlRGF0YS5lbWFpbH0pYCk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTkZJR19VUERBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdzZXR1cFJvdXRlcy5zZXRMaWNlbnNlSGFuZGxlcicsXG4gICAgICAgIGRldGFpbHM6IGBMaWNlbnNlIHZlcmlmaWNhdGlvbiBpbml0aWF0ZWQ6ICR7bGljZW5zZURhdGEudGllcn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIHRpZXI6IGxpY2Vuc2VEYXRhLnRpZXIsXG4gICAgICAgICAgZW1haWw6IGxpY2Vuc2VEYXRhLmVtYWlsLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNlbmQgdmVyaWZpY2F0aW9uIGVtYWlsIGRpcmVjdGx5IHRvIFdvcmtlciBmb3IgaW5zdGFudCBkZWxpdmVyeS5cbiAgICAgIC8vIFBvc3RIb2cgZXZlbnQgYWxzbyBmaXJlcyBmb3IgYW5hbHl0aWNzLCBidXQgdGhlIGVtYWlsIGNhbid0IHdhaXQgZm9yXG4gICAgICAvLyBQb3N0SG9nJ3MgZXZlbnQgcGlwZWxpbmUgKDEtNSBtaW4gZGVsYXkpLlxuICAgICAgY29uc3QgZGVsaXZlcnlSZXN1bHQgPSBhd2FpdCBzZW5kTGljZW5zZVdvcmtlclZlcmlmaWNhdGlvbkVtYWlsKGxpY2Vuc2VEYXRhLCBjb2RlLCAnZGlyZWN0LXZlcmlmaWNhdGlvbicpO1xuICAgICAgaWYgKGRlbGl2ZXJ5UmVzdWx0Lm9rKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIFZlcmlmaWNhdGlvbiBlbWFpbCBzZW50IGRpcmVjdGx5IHZpYSBXb3JrZXI6ICR7bGljZW5zZURhdGEuZW1haWx9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dMaWNlbnNlV29ya2VyRGVsaXZlcnlGYWlsdXJlKCdbU2V0dXBdIFZlcmlmaWNhdGlvbiBlbWFpbCBkZWxpdmVyeSBmYWlsZWQnLCBsaWNlbnNlRGF0YSwgZGVsaXZlcnlSZXN1bHQpO1xuXG4gICAgICAgIGNvbnN0IHsgdmVyaWZpY2F0aW9uQ29kZTogX2MsIHZlcmlmaWNhdGlvbkF0dGVtcHRzOiBfYSwgLi4ucHVibGljRGF0YSB9ID0gbGljZW5zZURhdGE7XG4gICAgICAgIHJlcy5zdGF0dXMoNTAyKS5qc29uKHtcbiAgICAgICAgICBlcnJvcjogZ2V0TGljZW5zZVdvcmtlckZhaWx1cmVNZXNzYWdlKGRlbGl2ZXJ5UmVzdWx0KSxcbiAgICAgICAgICB2ZXJpZmljYXRpb25SZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBsaWNlbnNlOiBwdWJsaWNEYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBbHNvIGZpcmUgUG9zdEhvZyBldmVudCBmb3IgYW5hbHl0aWNzIChub24tYmxvY2tpbmcsIGRlbGF5IGlzIGZpbmUpXG4gICAgICBjYXB0dXJlUG9zdEhvZ0xpY2Vuc2VFdmVudCh7IC4uLmxpY2Vuc2VEYXRhLCB2ZXJpZmljYXRpb25Db2RlOiBjb2RlLCBldmVudFR5cGU6ICd2ZXJpZmljYXRpb24nIH0pLmNhdGNoKFxuICAgICAgICAoZXJyKSA9PiBsb2dnZXIuZGVidWcoYFtTZXR1cF0gUG9zdEhvZyBjYXB0dXJlIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCksXG4gICAgICApO1xuXG4gICAgICAvLyBSZXR1cm4gc3VjY2VzcyB3aXRob3V0IGV4cG9zaW5nIHRoZSBjb2RlXG4gICAgICBjb25zdCB7IHZlcmlmaWNhdGlvbkNvZGU6IF9jLCB2ZXJpZmljYXRpb25BdHRlbXB0czogX2EsIC4uLnB1YmxpY0RhdGEgfSA9IGxpY2Vuc2VEYXRhO1xuICAgICAgcmVzLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBsaWNlbnNlOiBwdWJsaWNEYXRhLCB2ZXJpZmljYXRpb25SZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbU2V0dXBdIEZhaWxlZCB0byBzYXZlIGxpY2Vuc2UnLCB7IGVycm9yIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byBzYXZlIGxpY2Vuc2UgY29uZmlndXJhdGlvbicgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHZlcmlmeVJhdGVMaW1pdGVyID0gbmV3IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlcig1LCA2MF8wMDApOyAvLyA1IGF0dGVtcHRzL21pbnV0ZVxuXG4gIGNvbnN0IHZlcmlmeUxpY2Vuc2VIYW5kbGVyID0gYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghdmVyaWZ5UmF0ZUxpbWl0ZXIudHJ5QWNxdWlyZSgpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdzZXR1cFJvdXRlcy52ZXJpZnlMaWNlbnNlSGFuZGxlcicsXG4gICAgICAgIGRldGFpbHM6ICdWZXJpZmljYXRpb24gZW5kcG9pbnQgcmF0ZSBsaW1pdCBleGNlZWRlZCAoNSByZXEvbWluKScsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdUb28gbWFueSB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFBsZWFzZSB0cnkgYWdhaW4gaW4gYSBtaW51dGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IHJlcS5ib2R5ID8/IHt9O1xuICAgIGlmICghY29kZSB8fCB0eXBlb2YgY29kZSAhPT0gJ3N0cmluZycgfHwgIS9eXFxkezZ9JC8udGVzdChjb2RlKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIDYtZGlnaXQgdmVyaWZpY2F0aW9uIGNvZGUnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpY2Vuc2UgPSBhd2FpdCByZWFkTGljZW5zZSgpO1xuICAgIGlmIChsaWNlbnNlLnN0YXR1cyAhPT0gJ3BlbmRpbmcnKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAnTm8gcGVuZGluZyBsaWNlbnNlIHZlcmlmaWNhdGlvbi4gUGxlYXNlIHN1Ym1pdCB0aGUgbGljZW5zZSBmb3JtIGZpcnN0LicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZXhwaXJ5XG4gICAgaWYgKCFsaWNlbnNlLnZlcmlmaWNhdGlvbkV4cGlyeSB8fCBpc0NvZGVFeHBpcmVkKGxpY2Vuc2UudmVyaWZpY2F0aW9uRXhwaXJ5IGFzIHN0cmluZykpIHtcbiAgICAgIGxpY2Vuc2Uuc3RhdHVzID0gJ2V4cGlyZWQnO1xuICAgICAgYXdhaXQgd3JpdGVMaWNlbnNlKGxpY2Vuc2UpO1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ1ZlcmlmaWNhdGlvbiBjb2RlIGhhcyBleHBpcmVkLiBQbGVhc2Ugc3VibWl0IHRoZSBmb3JtIGFnYWluIHRvIHJlY2VpdmUgYSBuZXcgY29kZS4nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIG1heCBhdHRlbXB0c1xuICAgIGNvbnN0IGF0dGVtcHRzID0gKChsaWNlbnNlLnZlcmlmaWNhdGlvbkF0dGVtcHRzIGFzIG51bWJlcikgPz8gMCkgKyAxO1xuICAgIGlmIChhdHRlbXB0cyA+IFZFUklGSUNBVElPTl9NQVhfQVRURU1QVFMpIHtcbiAgICAgIGxpY2Vuc2Uuc3RhdHVzID0gJ2V4cGlyZWQnO1xuICAgICAgYXdhaXQgd3JpdGVMaWNlbnNlKGxpY2Vuc2UpO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ3NldHVwUm91dGVzLnZlcmlmeUxpY2Vuc2VIYW5kbGVyJyxcbiAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBtYXggYXR0ZW1wdHMgZXhjZWVkZWQgZm9yOiAke2xpY2Vuc2UuZW1haWx9YCxcbiAgICAgIH0pO1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ1RvbyBtYW55IGZhaWxlZCBhdHRlbXB0cy4gUGxlYXNlIHN1Ym1pdCB0aGUgZm9ybSBhZ2FpbiB0byByZWNlaXZlIGEgbmV3IGNvZGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjb2RlXG4gICAgaWYgKGNvZGUgIT09IGxpY2Vuc2UudmVyaWZpY2F0aW9uQ29kZSkge1xuICAgICAgbGljZW5zZS52ZXJpZmljYXRpb25BdHRlbXB0cyA9IGF0dGVtcHRzO1xuICAgICAgYXdhaXQgd3JpdGVMaWNlbnNlKGxpY2Vuc2UpO1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gVkVSSUZJQ0FUSU9OX01BWF9BVFRFTVBUUyAtIGF0dGVtcHRzO1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogYEluY29ycmVjdCB2ZXJpZmljYXRpb24gY29kZS4gJHtyZW1haW5pbmd9IGF0dGVtcHQke3JlbWFpbmluZyA9PT0gMSA/ICcnIDogJ3MnfSByZW1haW5pbmcuYCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGlzIGNvcnJlY3Qg4oCUIGFjdGl2YXRlIGxpY2Vuc2VcbiAgICBjb25zdCB2ZXJpZmllZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEF0ID0gbGljZW5zZS52ZXJpZmljYXRpb25SZXF1ZXN0ZWRBdCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGltZVRvVmVyaWZ5TXMgPSByZXF1ZXN0ZWRBdCA/IERhdGUubm93KCkgLSBuZXcgRGF0ZShyZXF1ZXN0ZWRBdCkuZ2V0VGltZSgpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGF0dGVtcHRzVXNlZCA9ICgobGljZW5zZS52ZXJpZmljYXRpb25BdHRlbXB0cyBhcyBudW1iZXIpID8/IDApICsgMTtcblxuICAgIGxpY2Vuc2Uuc3RhdHVzID0gJ2FjdGl2ZSc7XG4gICAgbGljZW5zZS52ZXJpZmllZEF0ID0gdmVyaWZpZWRBdDtcbiAgICBkZWxldGUgbGljZW5zZS52ZXJpZmljYXRpb25Db2RlO1xuICAgIGRlbGV0ZSBsaWNlbnNlLnZlcmlmaWNhdGlvbkV4cGlyeTtcbiAgICBkZWxldGUgbGljZW5zZS52ZXJpZmljYXRpb25BdHRlbXB0cztcbiAgICBkZWxldGUgbGljZW5zZS52ZXJpZmljYXRpb25SZXF1ZXN0ZWRBdDtcbiAgICBhd2FpdCB3cml0ZUxpY2Vuc2UobGljZW5zZSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgW1NldHVwXSBMaWNlbnNlIHZlcmlmaWVkIGFuZCBhY3RpdmF0ZWQ6ICR7bGljZW5zZS50aWVyfSAoJHtsaWNlbnNlLmVtYWlsfSkg4oCUICR7dGltZVRvVmVyaWZ5TXMgPyBNYXRoLnJvdW5kKHRpbWVUb1ZlcmlmeU1zIC8gMTAwMCkgKyAncycgOiAndW5rbm93bid9LCAke2F0dGVtcHRzVXNlZH0gYXR0ZW1wdChzKWApO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0NPTkZJR19VUERBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ3NldHVwUm91dGVzLnZlcmlmeUxpY2Vuc2VIYW5kbGVyJyxcbiAgICAgIGRldGFpbHM6IGBMaWNlbnNlIGFjdGl2YXRlZCBhZnRlciBlbWFpbCB2ZXJpZmljYXRpb246ICR7bGljZW5zZS50aWVyfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YTogeyB0aWVyOiBsaWNlbnNlLnRpZXIsIGVtYWlsOiBsaWNlbnNlLmVtYWlsIH0sXG4gICAgfSk7XG5cbiAgICAvLyBTZW5kIGNvbmZpcm1hdGlvbiBlbWFpbCArIFBvc3RIb2cgYWN0aXZhdGlvbiBldmVudCB3aXRoIGFuYWx5dGljc1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYXB0dXJlUG9zdEhvZ0xpY2Vuc2VFdmVudCh7XG4gICAgICAgIC4uLmxpY2Vuc2UsXG4gICAgICAgIGV2ZW50VHlwZTogJ2FjdGl2YXRpb24nLFxuICAgICAgICB2ZXJpZmljYXRpb25fdGltZV9tczogdGltZVRvVmVyaWZ5TXMsXG4gICAgICAgIHZlcmlmaWNhdGlvbl9hdHRlbXB0czogYXR0ZW1wdHNVc2VkLFxuICAgICAgICB2ZXJpZmljYXRpb25fbWV0aG9kOiBjb2RlLmxlbmd0aCA9PT0gNiA/ICdjb2RlX29yX2NsaWNrJyA6ICd1bmtub3duJyxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gTGljZW5zZSBhY3RpdmF0aW9uIGV2ZW50IHNlbnQgdG8gUG9zdEhvZzogJHtsaWNlbnNlLnRpZXJ9YCk7XG4gICAgfSBjYXRjaCAocG9zdGhvZ0Vycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gUG9zdEhvZyBjYXB0dXJlIGZhaWxlZDogJHtwb3N0aG9nRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHBvc3Rob2dFcnJvci5tZXNzYWdlIDogU3RyaW5nKHBvc3Rob2dFcnJvcil9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB2ZXJpZmljYXRpb25Db2RlOiBfYywgdmVyaWZpY2F0aW9uQXR0ZW1wdHM6IF9hLCB2ZXJpZmljYXRpb25FeHBpcnk6IF9lLCAuLi5wdWJsaWNMaWNlbnNlIH0gPSBsaWNlbnNlO1xuICAgIHJlcy5qc29uKHsgc3VjY2VzczogdHJ1ZSwgbGljZW5zZTogcHVibGljTGljZW5zZSB9KTtcbiAgfTtcblxuICBjb25zdCByZXNlbmRSYXRlTGltaXRlciA9IG5ldyBTbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIoMywgMTIwXzAwMCk7IC8vIDMgcmVzZW5kcyBwZXIgMiBtaW51dGVzXG5cbiAgY29uc3QgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlciA9IGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFyZXNlbmRSYXRlTGltaXRlci50cnlBY3F1aXJlKCkpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdQbGVhc2Ugd2FpdCBiZWZvcmUgcmVxdWVzdGluZyBhbm90aGVyIGNvZGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaWNlbnNlID0gYXdhaXQgcmVhZExpY2Vuc2UoKTtcbiAgICBpZiAobGljZW5zZS5zdGF0dXMgIT09ICdwZW5kaW5nJyAmJiBsaWNlbnNlLnN0YXR1cyAhPT0gJ2V4cGlyZWQnKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAnTm8gcGVuZGluZyBsaWNlbnNlIHZlcmlmaWNhdGlvbi4nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIG5ldyBjb2RlIGFuZCByZXNldFxuICAgIGNvbnN0IGNvZGUgPSBnZW5lcmF0ZVZlcmlmaWNhdGlvbkNvZGUoKTtcbiAgICBsaWNlbnNlLnN0YXR1cyA9ICdwZW5kaW5nJztcbiAgICBsaWNlbnNlLnZlcmlmaWNhdGlvbkNvZGUgPSBjb2RlO1xuICAgIGxpY2Vuc2UudmVyaWZpY2F0aW9uRXhwaXJ5ID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIFZFUklGSUNBVElPTl9DT0RFX1RUTF9NUykudG9JU09TdHJpbmcoKTtcbiAgICBsaWNlbnNlLnZlcmlmaWNhdGlvbkF0dGVtcHRzID0gMDtcbiAgICBhd2FpdCB3cml0ZUxpY2Vuc2UobGljZW5zZSk7XG5cbiAgICAvLyBTZW5kIHZlcmlmaWNhdGlvbiBlbWFpbCBkaXJlY3RseSB0byBXb3JrZXIgZm9yIGluc3RhbnQgZGVsaXZlcnlcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVsaXZlcnlSZXN1bHQgPSBhd2FpdCBzZW5kTGljZW5zZVdvcmtlclZlcmlmaWNhdGlvbkVtYWlsKGxpY2Vuc2UsIGNvZGUsICdkaXJlY3QtcmVzZW5kJyk7XG4gICAgICBpZiAoIWRlbGl2ZXJ5UmVzdWx0Lm9rKSB7XG4gICAgICAgIGxvZ0xpY2Vuc2VXb3JrZXJEZWxpdmVyeUZhaWx1cmUoJ1tTZXR1cF0gVmVyaWZpY2F0aW9uIHJlc2VuZCBkZWxpdmVyeSBmYWlsZWQnLCBsaWNlbnNlLCBkZWxpdmVyeVJlc3VsdCk7XG4gICAgICAgIHJlcy5zdGF0dXMoNTAyKS5qc29uKHtcbiAgICAgICAgICBlcnJvcjogZ2V0TGljZW5zZVdvcmtlckZhaWx1cmVNZXNzYWdlKGRlbGl2ZXJ5UmVzdWx0KSxcbiAgICAgICAgICB2ZXJpZmljYXRpb25SZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gVmVyaWZpY2F0aW9uIGNvZGUgcmVzZW50IGRpcmVjdGx5IHZpYSBXb3JrZXI6ICR7bGljZW5zZS5lbWFpbH1gKTtcbiAgICB9IGNhdGNoICh3b3JrZXJFcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbU2V0dXBdIFVuZXhwZWN0ZWQgdmVyaWZpY2F0aW9uIHJlc2VuZCBmYWlsdXJlJywge1xuICAgICAgICBlbWFpbDogbGljZW5zZS5lbWFpbCxcbiAgICAgICAgZXJyb3I6IHdvcmtlckVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyB3b3JrZXJFcnJvci5tZXNzYWdlIDogU3RyaW5nKHdvcmtlckVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byByZXNlbmQgdmVyaWZpY2F0aW9uIGNvZGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXMuanNvbih7IHN1Y2Nlc3M6IHRydWUsIG1lc3NhZ2U6ICdBIG5ldyB2ZXJpZmljYXRpb24gY29kZSBoYXMgYmVlbiBzZW50IHRvIHlvdXIgZW1haWwuJyB9KTtcbiAgfTtcblxuICByZXR1cm4geyBpbnN0YWxsSGFuZGxlciwgb3BlbkNvbmZpZ0hhbmRsZXIsIHZlcnNpb25IYW5kbGVyLCBtY3BiUmVkaXJlY3RIYW5kbGVyLCBkZXRlY3RIYW5kbGVyLCBnZXRMaWNlbnNlSGFuZGxlciwgc2V0TGljZW5zZUhhbmRsZXIsIHZlcmlmeUxpY2Vuc2VIYW5kbGVyLCByZXNlbmRWZXJpZmljYXRpb25IYW5kbGVyIH07XG59XG5cbi8vIOKUgOKUgCBJbnN0YWxsIGFuYWx5dGljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBGaXJlLWFuZC1mb3JnZXQgUG9zdEhvZyBldmVudCBmb3IgaW5zdGFsbGF0aW9uIGFuYWx5dGljcy5cbiAqIFVzZXMgdGhlIHNhbWUgaW5zdGFsbCBJRCBhcyB0aGUgbGljZW5zZSB0ZWxlbWV0cnkgc3lzdGVtLlxuICogU2lsZW50bHkgc3dhbGxvd3MgYWxsIGVycm9ycyDigJQgYW5hbHl0aWNzIG11c3QgbmV2ZXIgYnJlYWsgaW5zdGFsbHMuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVJbnN0YWxsQW5hbHl0aWNzKGV2ZW50OiBzdHJpbmcsIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IHBvc3Rob2cgPSBuZXcgUG9zdEhvZyhQT1NUSE9HX1BST0pFQ1RfS0VZLCB7XG4gICAgaG9zdDogcHJvY2Vzcy5lbnYuUE9TVEhPR19IT1NUIHx8ICdodHRwczovL2FwcC5wb3N0aG9nLmNvbScsXG4gICAgZmx1c2hBdDogMSxcbiAgICBmbHVzaEludGVydmFsOiA1MDAwLFxuICB9KTtcbiAgcmVhZEZpbGUoam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJy50ZWxlbWV0cnktaWQnKSwgJ3V0Zi04JylcbiAgICAudGhlbihpZCA9PiBpZC50cmltKCkpXG4gICAgLmNhdGNoKCgpID0+ICdhbm9ueW1vdXMnKVxuICAgIC50aGVuKGluc3RhbGxJZCA9PiB7XG4gICAgICBwb3N0aG9nLmNhcHR1cmUoeyBkaXN0aW5jdElkOiBpbnN0YWxsSWQsIGV2ZW50LCBwcm9wZXJ0aWVzIH0pO1xuICAgICAgcmV0dXJuIHBvc3Rob2cuc2h1dGRvd24oKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiB7IC8qIHRlbGVtZXRyeSBtdXN0IG5ldmVyIHRocm93ICovIH0pO1xufVxuXG4vLyDilIDilIAgTlZNIG1pdGlnYXRpb24gaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIENsYXVkZSBEZXNrdG9wIGhhcyBhIGJ1ZyB3aGVyZSBpdCBzY2FucyB+Ly5udm0vdmVyc2lvbnMvbm9kZS8sIGJ1aWxkcyBhIFBBVEhcbi8vIGZyb20gYWxsIGluc3RhbGxlZCB2ZXJzaW9ucyBpbiBhc2NlbmRpbmcgb3JkZXIgKG9sZGVzdCBmaXJzdCksIGFuZCBydW5zIG5weFxuLy8gdW5kZXIgYW4gb3V0ZGF0ZWQgTm9kZSBldmVuIHdoZW4gYSBuZXdlciB2ZXJzaW9uIGlzIGluc3RhbGxlZCBhbmQgc2VsZWN0ZWQuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvbWNwLXNlcnZlci9pc3N1ZXMvMTkwMlxuLy9cbi8vIEZpeDogd2hlbiBOVk0gaXMgcHJlc2VudCwgY3JlYXRlIGEgc21hbGwgYmFzaCBsYXVuY2hlciB0aGF0IGluaXRpYWxpc2VzIE5WTVxuLy8gcHJvcGVybHkgYmVmb3JlIGRlbGVnYXRpbmcgdG8gbnB4LCB0aGVuIHBhdGNoIHRoZSB3cml0dGVuIE1DUCBjbGllbnQgY29uZmlnXG4vLyB0byB1c2UgdGhhdCBsYXVuY2hlciBpbnN0ZWFkIG9mIGJhcmUgYG5weGAuXG5cbi8qKiBSZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBhcHBseSB0aGUgTlZNIGxhdW5jaGVyIG1pdGlnYXRpb24uICovXG5leHBvcnQgdHlwZSBOdm1MYXVuY2hlclJlc3VsdCA9ICdhcHBsaWVkJyB8ICdub3QtYXBwbGljYWJsZScgfCAnZmFpbGVkJztcblxuLyoqIEpTT04tZm9ybWF0IGNsaWVudHMgZWxpZ2libGUgZm9yIE5WTSBsYXVuY2hlciByZXBhaXIgb24gc3RhcnR1cC4gKi9cbmNvbnN0IEpTT05fRk9STUFUX0NMSUVOVFMgPSBbXG4gICdjbGF1ZGUnLCAnY2xhdWRlLWNvZGUnLCAnY3Vyc29yJywgJ3dpbmRzdXJmJywgJ2xtc3R1ZGlvJywgJ2dlbWluaS1jbGknLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBPcmNoZXN0cmF0ZXMgdGhlIE5WTSBtaXRpZ2F0aW9uOiBkZXRlY3Qg4oaSIGNyZWF0ZSBsYXVuY2hlciDihpIgcGF0Y2ggY29uZmlnIOKGkiB0ZWxlbWV0cnkuXG4gKiBFeHRyYWN0ZWQgZnJvbSBpbnN0YWxsSGFuZGxlciB0byBrZWVwIGl0cyBjb2duaXRpdmUgY29tcGxleGl0eSB3aXRoaW4gU29uYXJDbG91ZCBsaW1pdHMuXG4gKiBSZXR1cm5zIGEgcmVzdWx0IGVudW0gcmF0aGVyIHRoYW4gdGhyb3dpbmcgc28gdGhlIGNhbGxlciBhbHdheXMgZ2V0cyBhIGNsZWFuIHNpZ25hbC5cbiAqXG4gKiBAcGFyYW0gaG9tZSAtIE92ZXJyaWRlIGhvbWUgZGlyZWN0b3J5IChpbmplY3RhYmxlIGZvciB0ZXN0cylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5TnZtTGF1bmNoZXJJZk5lZWRlZChjbGllbnQ6IHN0cmluZywgaG9tZSA9IGhvbWVkaXIoKSk6IFByb21pc2U8TnZtTGF1bmNoZXJSZXN1bHQ+IHtcbiAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIE5WTSBtaXRpZ2F0aW9uIGNoZWNrIGZvciBjbGllbnQ6ICR7Y2xpZW50fWApO1xuICBpZiAoIWF3YWl0IGlzTnZtUHJlc2VudChob21lKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBOVk0gbm90IHByZXNlbnQg4oCUIHNraXBwaW5nIGxhdW5jaGVyIG1pdGlnYXRpb24gZm9yICR7Y2xpZW50fWApO1xuICAgIGNhcHR1cmVJbnN0YWxsQW5hbHl0aWNzKCdudm1fbGF1bmNoZXJfbm90X2FwcGxpY2FibGUnLCB7IGNsaWVudCwgcGxhdGZvcm06IHBsYXRmb3JtKCkgfSk7XG4gICAgcmV0dXJuICdub3QtYXBwbGljYWJsZSc7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB3cmFwcGVyUGF0aCA9IGF3YWl0IGVuc3VyZU52bUxhdW5jaGVyKGhvbWUpO1xuICAgIGF3YWl0IHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXIoY2xpZW50LCB3cmFwcGVyUGF0aCk7XG4gICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gTlZNLWF3YXJlIGxhdW5jaGVyIGFwcGxpZWQgZm9yICR7Y2xpZW50fWApO1xuICAgIGNhcHR1cmVJbnN0YWxsQW5hbHl0aWNzKCdudm1fbGF1bmNoZXJfYXBwbGllZCcsIHsgY2xpZW50LCBwbGF0Zm9ybTogcGxhdGZvcm0oKSB9KTtcbiAgICByZXR1cm4gJ2FwcGxpZWQnO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgW1NldHVwXSBOVk0gbGF1bmNoZXIgc2V0dXAgZmFpbGVkIChub24tZmF0YWwpOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTtcbiAgICBjYXB0dXJlSW5zdGFsbEFuYWx5dGljcygnbnZtX2xhdW5jaGVyX2ZhaWxlZCcsIHtcbiAgICAgIGNsaWVudCxcbiAgICAgIHBsYXRmb3JtOiBwbGF0Zm9ybSgpLFxuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGFydHVwIHJlcGFpcjogcmUtY3JlYXRlcyB0aGUgd3JhcHBlciBhbmQgcmUtcGF0Y2hlcyBhbGwga25vd24gSlNPTi1mb3JtYXRcbiAqIGNsaWVudCBjb25maWdzIG9uIGV2ZXJ5IHNlcnZlciBzdGFydC4gSGFuZGxlcyB0d28gY2FzZXM6XG4gKiAgIDEuIFdyYXBwZXIgd2FzIGRlbGV0ZWQg4oCUIHJlY3JlYXRlcyBpdCBzbyBjb25maWdzIHBvaW50aW5nIHRvIGl0IGtlZXAgd29ya2luZy5cbiAqICAgMi4gUHJlLWV4aXN0aW5nIGluc3RhbGwgKHVzZXIgaW5zdGFsbGVkIGJlZm9yZSB0aGlzIGZpeCBzaGlwcGVkKSDigJQgcGF0Y2hlc1xuICogICAgICBjb25maWdzIHRoYXQgc3RpbGwgdXNlIGJhcmUgYG5weGAuXG4gKlxuICogRmlyZS1hbmQtZm9yZ2V0IGZyb20gc3RhcnRXZWJTZXJ2ZXIuIEFsbCBlcnJvcnMgYXJlIHN3YWxsb3dlZCBhbmQgbG9nZ2VkLlxuICpcbiAqIEBwYXJhbSBob21lICAgICAgICAgICAgICAgLSBPdmVycmlkZSBob21lIGRpcmVjdG9yeSAoaW5qZWN0YWJsZSBmb3IgdGVzdHMpXG4gKiBAcGFyYW0gY29uZmlnUGF0aFJlc29sdmVyIC0gT3ZlcnJpZGUgY29uZmlnIHBhdGggbG9va3VwIChpbmplY3RhYmxlIGZvciB0ZXN0cykuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuIG51bGwgdG8gc2tpcCBhIGNsaWVudCBlbnRpcmVseS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byB0aGUgcHJvZHVjdGlvbiBnZXRDb25maWdQYXRoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwYWlyTnZtTGF1bmNoZXJPblN0YXJ0dXAoXG4gIGhvbWUgPSBob21lZGlyKCksXG4gIGNvbmZpZ1BhdGhSZXNvbHZlcjogKGNsaWVudDogc3RyaW5nKSA9PiBzdHJpbmcgfCBudWxsID0gZ2V0Q29uZmlnUGF0aCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocGxhdGZvcm0oKSA9PT0gJ3dpbjMyJykgcmV0dXJuO1xuICBsb2dnZXIuZGVidWcoJ1tTZXR1cF0gTlZNIGxhdW5jaGVyIHN0YXJ0dXAgcmVwYWlyOiBjaGVja2luZyBmb3IgTlZNLi4uJyk7XG4gIGlmICghYXdhaXQgaXNOdm1QcmVzZW50KGhvbWUpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdbU2V0dXBdIE5WTSBsYXVuY2hlciBzdGFydHVwIHJlcGFpcjogTlZNIG5vdCBwcmVzZW50IOKAlCBub3RoaW5nIHRvIHJlcGFpcicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCB3cmFwcGVyUGF0aDogc3RyaW5nO1xuICB0cnkge1xuICAgIHdyYXBwZXJQYXRoID0gYXdhaXQgZW5zdXJlTnZtTGF1bmNoZXIoaG9tZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBbU2V0dXBdIE5WTSBzdGFydHVwIHJlcGFpcjogY291bGQgbm90IGNyZWF0ZSBsYXVuY2hlcjogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIEpTT05fRk9STUFUX0NMSUVOVFMubWFwKGNsaWVudCA9PiB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gY29uZmlnUGF0aFJlc29sdmVyKGNsaWVudCk7XG4gICAgICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gcmVzb2x2ZXIgcmV0dXJuZWQgbnVsbCDigJQgc2tpcCB0aGlzIGNsaWVudFxuICAgICAgcmV0dXJuIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXIoY2xpZW50LCB3cmFwcGVyUGF0aCwgY29uZmlnUGF0aClcbiAgICAgICAgLmNhdGNoKGVyciA9PlxuICAgICAgICAgIGxvZ2dlci53YXJuKGBbU2V0dXBdIE5WTSBzdGFydHVwIHJlcGFpcjogZmFpbGVkIHRvIHBhdGNoICR7Y2xpZW50fTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YClcbiAgICAgICAgKTtcbiAgICB9KVxuICApO1xuXG4gIGxvZ2dlci5pbmZvKCdbU2V0dXBdIE5WTSBsYXVuY2hlciBzdGFydHVwIHJlcGFpciBjb21wbGV0ZScpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBOVk0gaXMgaW5zdGFsbGVkIG9uIHRoaXMgbWFjaGluZSAobWFjT1MvTGludXggb25seSkuXG4gKiBDaGVja3MgcHJvY2Vzcy5lbnYuTlZNX0RJUiBmaXJzdCAoaGFuZGxlcyBub24tc3RhbmRhcmQgaW5zdGFsbCBsb2NhdGlvbnMpLFxuICogdGhlbiBmYWxscyBiYWNrIHRvIH4vLm52bS5cbiAqXG4gKiBAcGFyYW0gaG9tZSAtIE92ZXJyaWRlIGhvbWUgZGlyZWN0b3J5IChkZWZhdWx0cyB0byBvcy5ob21lZGlyKCk7IGluamVjdGFibGUgZm9yIHRlc3RzKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNOdm1QcmVzZW50KGhvbWUgPSBob21lZGlyKCkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKHBsYXRmb3JtKCkgPT09ICd3aW4zMicpIHJldHVybiBmYWxzZTtcbiAgLy8gQ2hlY2sgY2FuZGlkYXRlcyBpbiBvcmRlcjogZW52IHZhciBvdmVycmlkZSDihpIgZGVmYXVsdCBsb2NhdGlvblxuICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgIHByb2Nlc3MuZW52Lk5WTV9ESVIsXG4gICAgam9pbihob21lLCAnLm52bScpLFxuICBdLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXTtcbiAgZm9yIChjb25zdCBkaXIgb2YgY2FuZGlkYXRlcykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhY2Nlc3Moam9pbihkaXIsICdudm0uc2gnKSk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gTlZNIGRldGVjdGVkIGF0OiAke2Rpcn1gKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggeyAvKiB0cnkgbmV4dCBjYW5kaWRhdGUgKi8gfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBOVk0gbm90IGZvdW5kIChjaGVja2VkOiAke2NhbmRpZGF0ZXMuam9pbignLCAnKX0pYCk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgTlZNIGRpcmVjdG9yeTogcHJvY2Vzcy5lbnYuTlZNX0RJUiBpZiBzZXQsIG90aGVyd2lzZSB+Ly5udm0uXG4gKiBVc2VkIHRvIGhhcmRjb2RlIHRoZSBwYXRoIGluIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBzbyBpdCB3b3JrcyBldmVuIHdoZW5cbiAqIENsYXVkZSBEZXNrdG9wIGRvZXMgbm90IHNvdXJjZSB0aGUgdXNlcidzIHNoZWxsIHByb2ZpbGUuXG4gKlxuICogcHJvY2Vzcy5lbnYuTlZNX0RJUiBpcyB2YWxpZGF0ZWQgYmVmb3JlIHVzZSB0byBwcmV2ZW50IHNoZWxsIGluamVjdGlvbiBpblxuICogdGhlIGdlbmVyYXRlZCB3cmFwcGVyIHNjcmlwdCAob25seSBhYnNvbHV0ZSBwYXRocyB3aXRoIHNhZmUgY2hhcmFjdGVycyBhcmVcbiAqIGFjY2VwdGVkOyB1bnNhZmUgdmFsdWVzIGZhbGwgYmFjayB0byB+Ly5udm0pLlxuICovXG5mdW5jdGlvbiByZXNvbHZlTnZtRGlyKGhvbWUgPSBob21lZGlyKCkpOiBzdHJpbmcge1xuICBjb25zdCBlbnZEaXIgPSBwcm9jZXNzLmVudi5OVk1fRElSO1xuICBpZiAoZW52RGlyICYmIC9eXFwvW1xcdy4vfi1dKyQvLnRlc3QoZW52RGlyKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBOVk0gZGlyIHJlc29sdmVkIGZyb20gTlZNX0RJUiBlbnYgdmFyOiAke2VudkRpcn1gKTtcbiAgICByZXR1cm4gZW52RGlyO1xuICB9XG4gIGlmIChlbnZEaXIpIHtcbiAgICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gTlZNX0RJUiBlbnYgdmFyIHJlamVjdGVkICh1bnNhZmUgcGF0aCk6ICR7ZW52RGlyfSDigJQgZmFsbGluZyBiYWNrIHRvIH4vLm52bWApO1xuICB9XG4gIGNvbnN0IGZhbGxiYWNrID0gam9pbihob21lLCAnLm52bScpO1xuICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gTlZNIGRpciByZXNvbHZlZCB0byBkZWZhdWx0OiAke2ZhbGxiYWNrfWApO1xuICByZXR1cm4gZmFsbGJhY2s7XG59XG5cbi8qKlxuICogQ3JlYXRlcyB+Ly5kb2xsaG91c2UvYmluL2RvbGxob3VzZW1jcC1udm0uc2ggYW5kIHJldHVybnMgaXRzIHBhdGguXG4gKlxuICogVGhlIE5WTSBkaXJlY3RvcnkgaXMgcmVzb2x2ZWQgYXQgZ2VuZXJhdGlvbiB0aW1lIGFuZCBoYXJkY29kZWQgaW50byB0aGVcbiAqIHNjcmlwdC4gVGhpcyBpcyBpbnRlbnRpb25hbDogQ2xhdWRlIERlc2t0b3AgZG9lcyBub3Qgc291cmNlIHRoZSB1c2VyJ3NcbiAqIHNoZWxsIHByb2ZpbGUsIHNvICROVk1fRElSIHdvdWxkIGJlIHVuc2V0IHdoZW4gdGhlIHdyYXBwZXIgcnVucy4gQnlcbiAqIGVtYmVkZGluZyB0aGUgYWJzb2x1dGUgcGF0aCB3ZSBndWFyYW50ZWUgdGhlIGNvcnJlY3QgTlZNIGlzIGZvdW5kLlxuICpcbiAqIFRoZSBzY3JpcHQgc291cmNlcyBOVk0sIHRoZW4gY2hlY2tzIHRoZSBhY3RpdmUgTm9kZSBtYWpvciB2ZXJzaW9uLiBJZiBpdFxuICogaXMgYmVsb3cgMTggKHRoZSBEb2xsaG91c2VNQ1AgbWluaW11bSksIGl0IHRyaWVzIGBudm0gdXNlIG5vZGVgIChoaWdoZXN0XG4gKiBpbnN0YWxsZWQpIHRoZW4gYG52bSB1c2UgLS1sdHNgIGFzIGEgZmFsbGJhY2suIEEgZmluYWwgdmVyc2lvbiBjaGVja1xuICogd3JpdGVzIGEgd2FybmluZyB0byBzdGRlcnIgaWYgdGhlIG5vZGUgaXMgc3RpbGwgdG9vIG9sZCDigJQgdGhhdCB3YXJuaW5nXG4gKiB3aWxsIGFwcGVhciBpbiBDbGF1ZGUgRGVza3RvcCdzIGVycm9yIGxvZy5cbiAqXG4gKiBAcGFyYW0gaG9tZSAgICAgICAtIE92ZXJyaWRlIGhvbWUgZGlyZWN0b3J5IChpbmplY3RhYmxlIGZvciB0ZXN0cylcbiAqIEBwYXJhbSBudm1EaXJPdmVycmlkZSAtIE92ZXJyaWRlIHRoZSByZXNvbHZlZCBOVk0gcGF0aCAoaW5qZWN0YWJsZSBmb3IgdGVzdHMpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVOdm1MYXVuY2hlcihob21lID0gaG9tZWRpcigpLCBudm1EaXJPdmVycmlkZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGJpbkRpciA9IGpvaW4oaG9tZSwgJy5kb2xsaG91c2UnLCAnYmluJyk7XG4gIGNvbnN0IHdyYXBwZXJQYXRoID0gam9pbihiaW5EaXIsICdkb2xsaG91c2VtY3AtbnZtLnNoJyk7XG4gIGNvbnN0IG52bURpciA9IG52bURpck92ZXJyaWRlID8/IHJlc29sdmVOdm1EaXIoaG9tZSk7XG5cbiAgYXdhaXQgbWtkaXIoYmluRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBTaW5nbGUtZXhwcmVzc2lvbiBoZWxwZXIgcmV1c2VkIHR3aWNlIHRvIGdldCB0aGUgTm9kZSBtYWpvciB2ZXJzaW9uLlxuICBjb25zdCBnZXRNYWpvciA9ICdub2RlIC1lIFwicHJvY2Vzcy5zdGRvdXQud3JpdGUoU3RyaW5nKHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdChcXCcuXFwnKVswXSkpXCIgMj4vZGV2L251bGwgfHwgZWNobyBcIjBcIic7XG5cbiAgY29uc3Qgc2NyaXB0ID0gW1xuICAgICcjIS9iaW4vYmFzaCcsXG4gICAgJyMgRG9sbGhvdXNlTUNQIE5WTS1hd2FyZSBsYXVuY2hlcicsXG4gICAgJyMgQXV0by1nZW5lcmF0ZWQgYnkgdGhlIERvbGxob3VzZU1DUCBpbnN0YWxsZXIuJyxcbiAgICAnIyBFbnN1cmVzIHRoZSBjb3JyZWN0IE5vZGUuanMgdmVyc2lvbiBpcyBhY3RpdmUgYmVmb3JlIHJ1bm5pbmcgbnB4LCcsXG4gICAgJyMgd29ya2luZyBhcm91bmQgYSBDbGF1ZGUgRGVza3RvcCBidWcgd2hlcmUgTlZNIFBBVEggb3JkZXJpbmcgY2F1c2VzJyxcbiAgICAnIyBucHggdG8gZXhlY3V0ZSB1bmRlciBhbiBvbGRlciBOb2RlIHZlcnNpb24gKGUuZy4gdjEyKSBldmVuIHdoZW4gYScsXG4gICAgJyMgbmV3ZXIgdmVyc2lvbiBpcyBpbnN0YWxsZWQuJyxcbiAgICAnIyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvbWNwLXNlcnZlci9pc3N1ZXMvMTkwMicsXG4gICAgJycsXG4gICAgYE5WTV9ESVI9XCIke252bURpcn1cImAsXG4gICAgJ2lmIFsgLXMgXCIkTlZNX0RJUi9udm0uc2hcIiBdOyB0aGVuJyxcbiAgICAnICAgICMgc2hlbGxjaGVjayBzb3VyY2U9L2Rldi9udWxsJyxcbiAgICAnICAgIC4gXCIkTlZNX0RJUi9udm0uc2hcIiAyPi9kZXYvbnVsbCcsXG4gICAgJyAgICAjIElmIHRoZSBhY3RpdmUgTm9kZSBpcyBiZWxvdyB2MTggKG1pbmltdW0gZm9yIERvbGxob3VzZU1DUCksJyxcbiAgICBgICAgICMgdHJ5ICdub2RlJyBhbGlhcyAoaGlnaGVzdCBpbnN0YWxsZWQpIHRoZW4gTFRTIGFzIGEgZmFsbGJhY2suYCxcbiAgICBgICAgIE1BSk9SPSQoJHtnZXRNYWpvcn0pYCxcbiAgICAnICAgIGlmIFsgXCIkTUFKT1JcIiAtbHQgMTggXTsgdGhlbicsXG4gICAgJyAgICAgICAgbnZtIHVzZSBub2RlIDI+L2Rldi9udWxsIHx8IG52bSB1c2UgLS1sdHMgMj4vZGV2L251bGwgfHwgdHJ1ZScsXG4gICAgYCAgICAgICAgTUFKT1I9JCgke2dldE1ham9yfSlgLFxuICAgICcgICAgICAgIGlmIFsgXCIkTUFKT1JcIiAtbHQgMTggXTsgdGhlbicsXG4gICAgJyAgICAgICAgICAgIGVjaG8gXCJbRG9sbGhvdXNlTUNQXSBXQVJOSU5HOiBOb2RlLmpzICRNQUpPUiBpcyBiZWxvdyB0aGUgbWluaW11bSAoMTgpLiBEb2xsaG91c2VNQ1AgbWF5IG5vdCBzdGFydCBjb3JyZWN0bHkuXCIgPiYyJyxcbiAgICAnICAgICAgICBmaScsXG4gICAgJyAgICBmaScsXG4gICAgJ2ZpJyxcbiAgICAnJyxcbiAgICAnZXhlYyBucHggXCIkQFwiJyxcbiAgXS5qb2luKCdcXG4nKSArICdcXG4nO1xuXG4gIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBXcml0aW5nIE5WTSBsYXVuY2hlciB3cmFwcGVyIHRvOiAke3dyYXBwZXJQYXRofSAoTlZNX0RJUj0ke252bURpcn0pYCk7XG4gIGF3YWl0IHdyaXRlRmlsZSh3cmFwcGVyUGF0aCwgc2NyaXB0LCAndXRmLTgnKTtcbiAgYXdhaXQgY2htb2Qod3JhcHBlclBhdGgsIDBvNzU1KTtcbiAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIE5WTSBsYXVuY2hlciB3cmFwcGVyIHdyaXR0ZW4gYW5kIG1hZGUgZXhlY3V0YWJsZWApO1xuICByZXR1cm4gd3JhcHBlclBhdGg7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgaW5kZW50YXRpb24gdXNlZCBpbiBhIEpTT04gc3RyaW5nIHNvIHRoZSByZXNlcmlhbGlzZWQgb3V0cHV0XG4gKiBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHN0eWxlIChhdm9pZHMgbm9pc3kgZGlmZnMgaW4gdXNlci1tYWludGFpbmVkIGNvbmZpZ3MpLlxuICogUmV0dXJucyB0aGUgdGFiIGNoYXJhY3RlciBmb3IgdGFiLWluZGVudGVkIGZpbGVzLCBvciB0aGUgbGVhZGluZy1zcGFjZSBjb3VudFxuICogKG1pbmltdW0gMikgZm9yIHNwYWNlLWluZGVudGVkIGZpbGVzLiBEZWZhdWx0cyB0byAyIHdoZW4gdW5kZXRlY3RhYmxlLlxuICovXG5mdW5jdGlvbiBkZXRlY3RJbmRlbnQocmF3OiBzdHJpbmcpOiBudW1iZXIgfCBzdHJpbmcge1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcmF3LnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMCB8fCBsaW5lLnN0YXJ0c1dpdGgoJ3snKSB8fCBsaW5lLnN0YXJ0c1dpdGgoJ30nKSkgY29udGludWU7XG4gICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnXFx0JykpIHJldHVybiAnXFx0JztcbiAgICBpZiAobGluZS5zdGFydHNXaXRoKCcgJykpIHtcbiAgICAgIGNvbnN0IHNwYWNlcyA9IGxpbmUubGVuZ3RoIC0gbGluZS50cmltU3RhcnQoKS5sZW5ndGg7XG4gICAgICBpZiAoc3BhY2VzID49IDIpIHJldHVybiBzcGFjZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiAyO1xufVxuXG4vKipcbiAqIFBhdGNoZXMgdGhlIGRvbGxob3VzZW1jcCBlbnRyeSBpbiBhbiBNQ1AgY2xpZW50J3MgSlNPTiBjb25maWcgdG8gdXNlXG4gKiB0aGUgTlZNLWF3YXJlIGxhdW5jaGVyIGluc3RlYWQgb2YgYmFyZSBgbnB4YC5cbiAqXG4gKiBPbmx5IGFjdHMgb24gSlNPTi1mb3JtYXQgY29uZmlncy4gVE9NTCBjb25maWdzIChjb2RleCkgYXJlIHNraXBwZWQuXG4gKiBTaWxlbnRseSBuby1vcHMgaWYgdGhlIGNvbmZpZyBmaWxlIGlzIG1pc3Npbmcgb3IgdW5yZWFkYWJsZS5cbiAqXG4gKiBAcGFyYW0gY29uZmlnUGF0aE92ZXJyaWRlIC0gVXNlIHRoaXMgcGF0aCBpbnN0ZWFkIG9mIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IChpbmplY3RhYmxlIGZvciB0ZXN0cylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXIoY2xpZW50OiBzdHJpbmcsIHdyYXBwZXJQYXRoOiBzdHJpbmcsIGNvbmZpZ1BhdGhPdmVycmlkZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb25maWdQYXRoID0gY29uZmlnUGF0aE92ZXJyaWRlID8/IGdldENvbmZpZ1BhdGgoY2xpZW50KTtcbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXI6IG5vIGNvbmZpZyBwYXRoIGZvciAke2NsaWVudH0g4oCUIHNraXBwaW5nYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjb25maWdQYXRoLmVuZHNXaXRoKCcudG9tbCcpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXI6IFRPTUwgY29uZmlnIGZvciAke2NsaWVudH0g4oCUIHNraXBwaW5nIChub3QgSlNPTi1mb3JtYXQpYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHJhdzogc3RyaW5nO1xuICB0cnkge1xuICAgIHJhdyA9IGF3YWl0IHJlYWRGaWxlKGNvbmZpZ1BhdGgsICd1dGYtOCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47IC8vIENvbmZpZyBub3QgcmVhZGFibGUg4oCUIGluc3RhbGwtbWNwIG1heSBub3QgaGF2ZSB3cml0dGVuIGl0IHlldFxuICB9XG5cbiAgbGV0IHBhcnNlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47IC8vIE1hbGZvcm1lZCBKU09OIOKAlCBkb24ndCB0b3VjaCBpdFxuICB9XG5cbiAgbGV0IHBhdGNoZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydtY3BTZXJ2ZXJzJywgJ3NlcnZlcnMnXSkge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBwYXJzZWRba2V5XSBhcyBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNlY3Rpb24/LmRvbGxob3VzZW1jcCkge1xuICAgICAgc2VjdGlvbi5kb2xsaG91c2VtY3AuY29tbWFuZCA9IHdyYXBwZXJQYXRoO1xuICAgICAgcGF0Y2hlZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoIXBhdGNoZWQpIHtcbiAgICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gcGF0Y2hDb25maWdGb3JOdm1MYXVuY2hlcjogbm8gZG9sbGhvdXNlbWNwIGVudHJ5IGluICR7Y2xpZW50fSBjb25maWcg4oCUIG5vdGhpbmcgdG8gcGF0Y2hgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBpbmRlbnQgPSBkZXRlY3RJbmRlbnQocmF3KTtcbiAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXI6IHdyaXRpbmcgJHtjbGllbnR9IGNvbmZpZyAoaW5kZW50PSR7SlNPTi5zdHJpbmdpZnkoaW5kZW50KX0pYCk7XG4gIGF3YWl0IHdyaXRlRmlsZShjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShwYXJzZWQsIG51bGwsIGluZGVudCkgKyAnXFxuJywgJ3V0Zi04Jyk7XG4gIGxvZ2dlci5pbmZvKGBbU2V0dXBdIFBhdGNoZWQgJHtjbGllbnR9IGNvbmZpZyB0byB1c2UgTlZNLWF3YXJlIGxhdW5jaGVyOiAke3dyYXBwZXJQYXRofWApO1xufVxuXG5mdW5jdGlvbiBidWlsZE1jcFNlcnZlckVudHJ5KHZlcnNpb24/OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHRhZyA9IHZlcnNpb24gPyBgQCR7dmVyc2lvbn1gIDogJ0BsYXRlc3QnO1xuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6ICducHgnLFxuICAgIGFyZ3M6IFtgQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJHt0YWd9YF0sXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsSnNvbk1jcENsaWVudENvbmZpZyhcbiAgY2xpZW50OiBzdHJpbmcsXG4gIHZlcnNpb24/OiBzdHJpbmcsXG4gIGNvbmZpZ1BhdGhPdmVycmlkZT86IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBjb25maWdQYXRoT3ZlcnJpZGUgPz8gZ2V0Q29uZmlnUGF0aChjbGllbnQpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZyBwYXRoIHVua25vd24gZm9yIGNsaWVudDogJHtjbGllbnR9YCk7XG4gIH1cbiAgaWYgKGNvbmZpZ1BhdGguZW5kc1dpdGgoJy50b21sJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEpTT04gTUNQIGluc3RhbGwgaXMgbm90IHN1cHBvcnRlZCBmb3IgVE9NTCBjbGllbnQ6ICR7Y2xpZW50fWApO1xuICB9XG5cbiAgYXdhaXQgbWtkaXIoZGlybmFtZShjb25maWdQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgbGV0IHJhdyA9ICcnO1xuICBsZXQgcGFyc2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICB0cnkge1xuICAgIHJhdyA9IGF3YWl0IHJlYWRGaWxlKGNvbmZpZ1BhdGgsICd1dGYtOCcpO1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWlzTWlzc2luZ1BhdGhFcnJvcihlcnJvcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIGV4aXN0aW5nIGNvbmZpZyBhdCAke2NvbmZpZ1BhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgcm9vdEtleSA9IGNsaWVudCA9PT0gJ3ZzY29kZScgPyAnc2VydmVycycgOiAnbWNwU2VydmVycyc7XG4gIGNvbnN0IGV4aXN0aW5nUm9vdCA9IHBhcnNlZFtyb290S2V5XTtcbiAgY29uc3Qgcm9vdCA9IGV4aXN0aW5nUm9vdCAmJiB0eXBlb2YgZXhpc3RpbmdSb290ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZ1Jvb3QpXG4gICAgPyBleGlzdGluZ1Jvb3QgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICA6IHt9O1xuXG4gIHJvb3QuZG9sbGhvdXNlbWNwID0gYnVpbGRNY3BTZXJ2ZXJFbnRyeSh2ZXJzaW9uKTtcbiAgcGFyc2VkW3Jvb3RLZXldID0gcm9vdDtcblxuICBjb25zdCBpbmRlbnQgPSByYXcgPyBkZXRlY3RJbmRlbnQocmF3KSA6IDI7XG4gIGF3YWl0IHdyaXRlRmlsZShjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShwYXJzZWQsIG51bGwsIGluZGVudCkgKyAnXFxuJywgJ3V0Zi04Jyk7XG5cbiAgcmV0dXJuIGBJbnN0YWxsZWQgTUNQIHNlcnZlciBcImRvbGxob3VzZW1jcFwiIGluICR7Y2xpZW50fSAoJHtjb25maWdQYXRofSlgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsTG1TdHVkaW9Db25maWcodmVyc2lvbj86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBpbnN0YWxsSnNvbk1jcENsaWVudENvbmZpZygnbG1zdHVkaW8nLCB2ZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBpbnN0YWxsLW1jcCBiaW5hcnkgcGF0aC5cbiAqIFVzZXMgdGhlIGxvY2FsIGRlcGVuZGVuY3kgKG5vZGVfbW9kdWxlcy8uYmluL2luc3RhbGwtbWNwKSBmaXJzdCxcbiAqIGZhbGxzIGJhY2sgdG8gbnB4IGlmIG5vdCBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxNY3BCaW4oKTogeyBjbWQ6IHN0cmluZzsgcHJlZml4QXJnczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IGxvY2FsQmluID0gam9pbihkaXJuYW1lKGRpcm5hbWUoZGlybmFtZShfX2Rpcm5hbWUpKSksICdub2RlX21vZHVsZXMnLCAnLmJpbicsICdpbnN0YWxsLW1jcCcpO1xuICB0cnkge1xuICAgIGFjY2Vzc1N5bmMobG9jYWxCaW4sIGZzQ29uc3RhbnRzLlhfT0spO1xuICAgIHJldHVybiB7IGNtZDogbG9jYWxCaW4sIHByZWZpeEFyZ3M6IFtdIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGNtZDogJ25weCcsIHByZWZpeEFyZ3M6IFsnaW5zdGFsbC1tY3AnXSB9O1xuICB9XG59XG5cbi8qKlxuICogUnVuIGluc3RhbGwtbWNwIHRvIGNvbmZpZ3VyZSBhIHNwZWNpZmljIE1DUCBjbGllbnQuXG4gKlxuICogVXNlcyB0aGUgYnVuZGxlZCBpbnN0YWxsLW1jcCBkZXBlbmRlbmN5IChNSVQsIGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBlcm1lbW9yeWFpL2luc3RhbGwtbWNwKS5cbiAqIENvbW1hbmQgYXJndW1lbnRzIGFyZSBmdWxseSBoYXJkY29kZWQg4oCUIG5vIHVzZXIgaW5wdXQgcmVhY2hlcyB0aGUgc2hlbGwuXG4gKiBleGVjRmlsZSBpcyB1c2VkIChub3QgZXhlYykgdG8gcHJldmVudCBzaGVsbCBpbmplY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHJ1bkluc3RhbGxNY3AoY2xpZW50OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHsgY21kLCBwcmVmaXhBcmdzIH0gPSByZXNvbHZlSW5zdGFsbE1jcEJpbigpO1xuICAgIGNvbnN0IHRhZyA9IHZlcnNpb24gPyBgQCR7dmVyc2lvbn1gIDogJ0BsYXRlc3QnO1xuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAuLi5wcmVmaXhBcmdzLFxuICAgICAgYEBkb2xsaG91c2VtY3AvbWNwLXNlcnZlciR7dGFnfWAsXG4gICAgICAnLS1jbGllbnQnLCBjbGllbnQsXG4gICAgICAnLS1uYW1lJywgJ2RvbGxob3VzZW1jcCcsXG4gICAgICAnLS15ZXMnLFxuICAgIF07XG5cbiAgICBleGVjRmlsZShjbWQsIGFyZ3MsIHsgdGltZW91dDogMzBfMDAwIH0sIChlcnIsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3Ioc3RkZXJyIHx8IGVyci5tZXNzYWdlKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoc3Rkb3V0IHx8ICdJbnN0YWxsYXRpb24gY29tcGxldGVkLicpO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==
|
|
1232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBSb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL3JvdXRlcy9zZXR1cFJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsSUFBSSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTVDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxxQkFBcUIsRUFBb0MsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV2SSxNQUFNLFdBQVcsR0FBRyx5QkFBeUIsQ0FBQztBQUM5QyxNQUFNLGtCQUFrQixHQUFHLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8s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QUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLG9CQUFvQixFQUFFLENBQUM7UUFDbkQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEQsTUFBTSxJQUFJLEdBQUc7WUFDWCxHQUFHLFVBQVU7WUFDYiwyQkFBMkIsR0FBRyxFQUFFO1lBQ2hDLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLE9BQU87U0FDUixDQUFDO1FBRUYsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9ELElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDekMsT0FBTztZQUNULENBQUM7WUFDRCxPQUFPLENBQUMsTUFBTSxJQUFJLHlCQUF5QixDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNldHVwIFJvdXRlcyDigJQgQXV0by1pbnN0YWxsIERvbGxob3VzZU1DUCB0byBNQ1AgY2xpZW50c1xuICpcbiAqIFVzZXMgYGluc3RhbGwtbWNwYCAoaHR0cHM6Ly9naXRodWIuY29tL3N1cGVybWVtb3J5YWkvaW5zdGFsbC1tY3ApXG4gKiB0byBpbmplY3Qgc2VydmVyIGNvbmZpZ3VyYXRpb24gaW50byBzdXBwb3J0ZWQgTUNQIGNsaWVudCBjb25maWcgZmlsZXMuXG4gKlxuICogU2VjdXJpdHk6IGxvY2FsaG9zdC1vbmx5IGJpbmRpbmcgKGVuZm9yY2VkIGJ5IHNlcnZlci50cyksIHJhdGUtbGltaXRlZCxcbiAqIGFuZCBjb21tYW5kIGFyZ3VtZW50cyBhcmUgaGFyZGNvZGVkIOKAlCBubyB1c2VyLXN1cHBsaWVkIHNoZWxsIGlucHV0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGV4ZWNGaWxlIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGFjY2Vzc1N5bmMsIGNvbnN0YW50cyBhcyBmc0NvbnN0YW50cyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgYWNjZXNzLCBjaG1vZCwgbWtkaXIsIHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGhvbWVkaXIsIHBsYXRmb3JtIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKF9fZmlsZW5hbWUpO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgUEFDS0FHRV9WRVJTSU9OIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0UGVybWlzc2lvbkhvb2tTdGF0dXNBc3luYywgaW5zdGFsbFBlcm1pc3Npb25Ib29rLCB0eXBlIEluc3RhbGxQZXJtaXNzaW9uSG9va1Jlc3VsdCB9IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25Ib29rcy5qcyc7XG5cbmNvbnN0IEdJVEhVQl9SRVBPID0gJ0RvbGxob3VzZU1DUC9tY3Atc2VydmVyJztcbmNvbnN0IE1DUEJfQVNTRVRfUEFUVEVSTiA9IC9eZG9sbGhvdXNlbWNwLS4qXFwubWNwYiQvO1xuaW1wb3J0IHsgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBQb3N0SG9nIH0gZnJvbSAncG9zdGhvZy1ub2RlJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuXG5mdW5jdGlvbiBpc01pc3NpbmdQYXRoRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgZXJyb3JcbiAgICAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnXG4gICAgJiYgJ2NvZGUnIGluIGVycm9yXG4gICAgJiYgKGVycm9yIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlID09PSAnRU5PRU5UJyxcbiAgKTtcbn1cblxuLy8gUG9zdEhvZyBwcm9qZWN0IGNhcHR1cmUga2V5IOKAlCB3cml0ZS1vbmx5IGJ5IGRlc2lnbiwgc2FmZSB0byBleHBvc2UgcHVibGljbHkuXG4vLyBUaGlzIGtleSBjYW4gT05MWSBzZW5kIGV2ZW50cyB0byBQb3N0SG9nOyBpdCBjYW5ub3QgcmVhZCBkYXRhLCBxdWVyeSBhbmFseXRpY3MsXG4vLyBjb25maWd1cmUgZGVzdGluYXRpb25zLCBvciBhY2Nlc3MgYW55IG90aGVyIFBvc3RIb2cgQVBJLiBTYW1lIGtleSB1c2VkIGluXG4vLyBzcmMvdGVsZW1ldHJ5L09wZXJhdGlvbmFsVGVsZW1ldHJ5LnRzLiBWZXJpZmllZCB3cml0ZS1vbmx5IDIwMjYtMDQtMDcuXG4vLyBDYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIFBPU1RIT0dfQVBJX0tFWSBlbnYgdmFyIGZvciBjdXN0b20gUG9zdEhvZyBpbnN0YWxsYXRpb25zLlxuY29uc3QgUE9TVEhPR19QUk9KRUNUX0tFWSA9IHByb2Nlc3MuZW52LlBPU1RIT0dfQVBJX0tFWSB8fCAncGhjX3hGSktJSEFxUlgxWUxhMFRTZFRHd0dqMTlkMUplb1hES2pKTllxNDkydnEnO1xuY29uc3QgTElDRU5TRV9XT1JLRVJfRElSRUNUX1BBVEggPSAnL2RpcmVjdC12ZXJpZmljYXRpb24nO1xuXG4vKiogU3VwcG9ydGVkIGNsaWVudCBpZGVudGlmaWVycyBmb3Igb25lLWNsaWNrIHNldHVwLiAqL1xuY29uc3QgQUxMT1dFRF9DTElFTlRTID0gbmV3IFNldChbXG4gICdjbGF1ZGUnLFxuICAnY2xhdWRlLWNvZGUnLFxuICAnY3Vyc29yJyxcbiAgJ3ZzY29kZScsXG4gICdjbGluZScsXG4gICdyb28tY2xpbmUnLFxuICAnd2luZHN1cmYnLFxuICAnd2l0c3knLFxuICAnZW5jb252bycsXG4gICdnZW1pbmktY2xpJyxcbiAgJ2dvb3NlJyxcbiAgJ3plZCcsXG4gICd3YXJwJyxcbiAgJ2NvZGV4JyxcbiAgJ2xtc3R1ZGlvJyxcbl0pO1xuXG50eXBlIENvbmZpZ1BhdGhDbGllbnQgPVxuICB8ICdjbGF1ZGUnXG4gIHwgJ2NsYXVkZS1jb2RlJ1xuICB8ICdjdXJzb3InXG4gIHwgJ3dpbmRzdXJmJ1xuICB8ICdjbGluZSdcbiAgfCAnbG1zdHVkaW8nXG4gIHwgJ2dlbWluaS1jbGknXG4gIHwgJ2NvZGV4JztcblxudHlwZSBTZXR1cFN1cHBvcnRMZXZlbCA9XG4gIHwgJ2Z1bGxfbmF0aXZlJ1xuICB8ICdwYXJ0aWFsX25hdGl2ZSdcbiAgfCAnbWNwX29ubHknXG4gIHwgJ3Vuc3VwcG9ydGVkJztcblxuY29uc3QgU0VUVVBfU1VQUE9SVF9MRVZFTFM6IFJlY29yZDxzdHJpbmcsIFNldHVwU3VwcG9ydExldmVsPiA9IHtcbiAgJ2NsYXVkZSc6ICd1bnN1cHBvcnRlZCcsXG4gICdjbGF1ZGUtY29kZSc6ICdmdWxsX25hdGl2ZScsXG4gICdjdXJzb3InOiAncGFydGlhbF9uYXRpdmUnLFxuICAnY2xpbmUnOiAnbWNwX29ubHknLFxuICAnd2luZHN1cmYnOiAncGFydGlhbF9uYXRpdmUnLFxuICAnbG1zdHVkaW8nOiAnbWNwX29ubHknLFxuICAnZ2VtaW5pLWNsaSc6ICdwYXJ0aWFsX25hdGl2ZScsXG4gICdjb2RleCc6ICdwYXJ0aWFsX25hdGl2ZScsXG59O1xuXG4vKiogQWxsb3dlZCByZWxlYXNlIGNoYW5uZWxzIGZvciB0aGUgaW5zdGFsbCBlbmRwb2ludC4gKi9cbmNvbnN0IEFMTE9XRURfSU5TVEFMTF9DSEFOTkVMUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoWydsYXRlc3QnLCAnYmV0YScsICdyYyddKTtcblxuLyoqIFJhdGUgbGltaXQ6IDUgaW5zdGFsbHMgcGVyIG1pbnV0ZSAqL1xuY29uc3QgaW5zdGFsbExpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKDUsIDYwXzAwMCk7XG5cbi8qKlxuICogS25vd24gY29uZmlnIGZpbGUgcGF0aHMgcGVyIGNsaWVudC5cbiAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLlxuICovXG5mdW5jdGlvbiBnZXRDb25maWdQYXRoKGNsaWVudDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGhvbWUgPSBob21lZGlyKCk7XG4gIGNvbnN0IHBsYXQgPSBwbGF0Zm9ybSgpO1xuXG4gIGNvbnN0IHBhdGhzOiBSZWNvcmQ8Q29uZmlnUGF0aENsaWVudCwgKCkgPT4gc3RyaW5nIHwgbnVsbD4gPSB7XG4gICAgJ2NsYXVkZSc6ICgpID0+IHtcbiAgICAgIGlmIChwbGF0ID09PSAnZGFyd2luJykgcmV0dXJuIGpvaW4oaG9tZSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdDbGF1ZGUnLCAnY2xhdWRlX2Rlc2t0b3BfY29uZmlnLmpzb24nKTtcbiAgICAgIGlmIChwbGF0ID09PSAnd2luMzInKSByZXR1cm4gam9pbihwcm9jZXNzLmVudi5BUFBEQVRBIHx8IGpvaW4oaG9tZSwgJ0FwcERhdGEnLCAnUm9hbWluZycpLCAnQ2xhdWRlJywgJ2NsYXVkZV9kZXNrdG9wX2NvbmZpZy5qc29uJyk7XG4gICAgICByZXR1cm4gam9pbihob21lLCAnLmNvbmZpZycsICdDbGF1ZGUnLCAnY2xhdWRlX2Rlc2t0b3BfY29uZmlnLmpzb24nKTtcbiAgICB9LFxuICAgICdjbGF1ZGUtY29kZSc6ICgpID0+IGpvaW4oaG9tZSwgJy5jbGF1ZGUuanNvbicpLFxuICAgICdjdXJzb3InOiAoKSA9PiBqb2luKGhvbWUsICcuY3Vyc29yJywgJ21jcC5qc29uJyksXG4gICAgJ3dpbmRzdXJmJzogKCkgPT4gam9pbihob21lLCAnLmNvZGVpdW0nLCAnd2luZHN1cmYnLCAnbWNwX2NvbmZpZy5qc29uJyksXG4gICAgJ2NsaW5lJzogKCkgPT4ge1xuICAgICAgaWYgKHBsYXQgPT09ICdkYXJ3aW4nKSByZXR1cm4gam9pbihob21lLCAnTGlicmFyeScsICdBcHBsaWNhdGlvbiBTdXBwb3J0JywgJ0NvZGUnLCAnVXNlcicsICdnbG9iYWxTdG9yYWdlJywgJ3Nhb3Vkcml6d2FuLmNsYXVkZS1kZXYnLCAnc2V0dGluZ3MnLCAnY2xpbmVfbWNwX3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGlmIChwbGF0ID09PSAnd2luMzInKSByZXR1cm4gam9pbihwcm9jZXNzLmVudi5BUFBEQVRBIHx8IGpvaW4oaG9tZSwgJ0FwcERhdGEnLCAnUm9hbWluZycpLCAnQ29kZScsICdVc2VyJywgJ2dsb2JhbFN0b3JhZ2UnLCAnc2FvdWRyaXp3YW4uY2xhdWRlLWRldicsICdzZXR0aW5ncycsICdjbGluZV9tY3Bfc2V0dGluZ3MuanNvbicpO1xuICAgICAgcmV0dXJuIGpvaW4oaG9tZSwgJy5jb25maWcnLCAnQ29kZScsICdVc2VyJywgJ2dsb2JhbFN0b3JhZ2UnLCAnc2FvdWRyaXp3YW4uY2xhdWRlLWRldicsICdzZXR0aW5ncycsICdjbGluZV9tY3Bfc2V0dGluZ3MuanNvbicpO1xuICAgIH0sXG4gICAgJ2xtc3R1ZGlvJzogKCkgPT4gam9pbihob21lLCAnLmxtc3R1ZGlvJywgJ21jcC5qc29uJyksXG4gICAgJ2dlbWluaS1jbGknOiAoKSA9PiBqb2luKGhvbWUsICcuZ2VtaW5pJywgJ3NldHRpbmdzLmpzb24nKSxcbiAgICAnY29kZXgnOiAoKSA9PiBqb2luKGhvbWUsICcuY29kZXgnLCAnY29uZmlnLnRvbWwnKSxcbiAgfTtcblxuICBjb25zdCByZXNvbHZlciA9IHBhdGhzW2NsaWVudCBhcyBDb25maWdQYXRoQ2xpZW50XTtcbiAgcmV0dXJuIHJlc29sdmVyID8gcmVzb2x2ZXIoKSA6IG51bGw7XG59XG5cbi8qKlxuICogT3BlbiBhIGZpbGUgaW4gdGhlIHN5c3RlbSdzIGRlZmF1bHQgdGV4dCBlZGl0b3IuXG4gKi9cbmZ1bmN0aW9uIG9wZW5JbkVkaXRvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBwbGF0ID0gcGxhdGZvcm0oKTtcbiAgICBsZXQgY21kOiBzdHJpbmc7XG4gICAgbGV0IGFyZ3M6IHN0cmluZ1tdO1xuXG4gICAgaWYgKHBsYXQgPT09ICdkYXJ3aW4nKSB7XG4gICAgICBjbWQgPSAnb3Blbic7XG4gICAgICBhcmdzID0gWyctdCcsIGZpbGVQYXRoXTtcbiAgICB9IGVsc2UgaWYgKHBsYXQgPT09ICd3aW4zMicpIHtcbiAgICAgIGNtZCA9ICdub3RlcGFkJztcbiAgICAgIGFyZ3MgPSBbZmlsZVBhdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbWQgPSAneGRnLW9wZW4nO1xuICAgICAgYXJncyA9IFtmaWxlUGF0aF07XG4gICAgfVxuXG4gICAgZXhlY0ZpbGUoY21kLCBhcmdzLCB7IHRpbWVvdXQ6IDEwXzAwMCB9LCAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvdWxkIG5vdCBvcGVuIGVkaXRvcjogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoJ09wZW5lZCBpbiBlZGl0b3IuJyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKiogQ2xpZW50cyB3aG9zZSBjb25maWcgZmlsZXMgd2UgY2FuIGxvY2F0ZSBhbmQgb3BlbiAqL1xuY29uc3QgT1BFTkFCTEVfQ0xJRU5UUyA9IG5ldyBTZXQoW1xuICAnY2xhdWRlJywgJ2NsYXVkZS1jb2RlJywgJ2N1cnNvcicsICdjbGluZScsICd3aW5kc3VyZicsICdsbXN0dWRpbycsICdnZW1pbmktY2xpJywgJ2NvZGV4Jyxcbl0pO1xuXG4vKipcbiAqIENyZWF0ZSBzZXR1cCBoYW5kbGVycyAoRXhwcmVzcyA1IGNvbXBhdGlibGUg4oCUIHBsYWluIGhhbmRsZXIgZnVuY3Rpb25zLCBub3QgUm91dGVyKS5cbiAqL1xuaW50ZXJmYWNlIERldGVjdFJlc3VsdCB7XG4gIGluc3RhbGxlZDogYm9vbGVhbjtcbiAgY29uZmlnUGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgY3VycmVudENvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBzZXJ2ZXJLZXk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyc2UgYSBzaW5nbGUgYFttY3Bfc2VydmVycy48bmFtZT5dYCBUT01MIHNlY3Rpb24gaW50byBhIGNvbmZpZyBzdW1tYXJ5LlxuICpcbiAqIFdoZW4gYGNhc2VTZW5zaXRpdmVgIGlzIHRydWUsIHRoZSBzZWN0aW9uIGhlYWRlciBtdXN0IG1hdGNoIGV4YWN0bHkuIFRoaXMgaXNcbiAqIGltcG9ydGFudCBmb3IgQ29kZXggYmVjYXVzZSB0aGUgaW5zdGFsbGVyIHdyaXRlcyBgW21jcF9zZXJ2ZXJzLmRvbGxob3VzZW1jcF1gXG4gKiBpbiBsb3dlcmNhc2UgYW5kIHdlIHdhbnQgdG8gcHJlZmVyIHRoYXQgY2Fub25pY2FsIGVudHJ5IG92ZXIgbGVnYWN5IG1peGVkLWNhc2VcbiAqIHNlY3Rpb25zIHRoYXQgbWF5IHN0aWxsIGJlIHByZXNlbnQgaW4gdGhlIGZpbGUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVG9tbFNlY3Rpb25Db25maWcoXG4gIHNlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHJhdzogc3RyaW5nLFxuICBjYXNlU2Vuc2l0aXZlID0gZmFsc2UsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwge1xuICBjb25zdCBlc2NhcGVkU2VjdGlvbk5hbWUgPSBzZWN0aW9uTmFtZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG4gIGNvbnN0IHNlY3Rpb25SZWdleCA9IG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BcXFttY3Bfc2VydmVyc1xcLiR7ZXNjYXBlZFNlY3Rpb25OYW1lfVxcXWAsIGNhc2VTZW5zaXRpdmUgPyAnJyA6ICdpJyk7XG4gIGNvbnN0IHNlY3Rpb25NYXRjaCA9IHNlY3Rpb25SZWdleC5leGVjKHJhdyk7XG4gIGlmICghc2VjdGlvbk1hdGNoKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0b21sQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgc2VydmVyTmFtZTogc2VjdGlvbk5hbWUgfTtcbiAgY29uc3Qgc2VjdGlvblN0YXJ0ID0gc2VjdGlvbk1hdGNoLmluZGV4ICsgc2VjdGlvbk1hdGNoWzBdLmxlbmd0aDtcbiAgY29uc3QgbmV4dFNlY3Rpb24gPSByYXcuaW5kZXhPZignXFxuWycsIHNlY3Rpb25TdGFydCk7XG4gIGNvbnN0IHNlY3Rpb25Db250ZW50ID0gbmV4dFNlY3Rpb24gPiAtMSA/IHJhdy5zbGljZShzZWN0aW9uU3RhcnQsIG5leHRTZWN0aW9uKSA6IHJhdy5zbGljZShzZWN0aW9uU3RhcnQpO1xuXG4gIGNvbnN0IGNvbW1hbmRNYXRjaCA9IC9jb21tYW5kXFxzKj1cXHMqXCIoW15cIl0rKVwiLy5leGVjKHNlY3Rpb25Db250ZW50KTtcbiAgY29uc3QgYXJnc01hdGNoID0gL2FyZ3NcXHMqPVxccypcXFsoW15cXF1dKilcXF0vLmV4ZWMoc2VjdGlvbkNvbnRlbnQpO1xuICBjb25zdCBlbmFibGVkTWF0Y2ggPSAvZW5hYmxlZFxccyo9XFxzKih0cnVlfGZhbHNlKS9pLmV4ZWMoc2VjdGlvbkNvbnRlbnQpO1xuXG4gIGlmIChjb21tYW5kTWF0Y2gpIHRvbWxDb25maWcuY29tbWFuZCA9IGNvbW1hbmRNYXRjaFsxXTtcbiAgaWYgKGFyZ3NNYXRjaCkge1xuICAgIHRvbWxDb25maWcuYXJncyA9IGFyZ3NNYXRjaFsxXS5zcGxpdCgnLCcpLm1hcCgoYXJnKSA9PiBhcmcudHJpbSgpLnJlcGxhY2VBbGwoJ1wiJywgJycpKTtcbiAgfVxuICBpZiAoZW5hYmxlZE1hdGNoKSB7XG4gICAgdG9tbENvbmZpZy5lbmFibGVkID0gZW5hYmxlZE1hdGNoWzFdLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbiAgfVxuXG4gIHJldHVybiB0b21sQ29uZmlnO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgVE9NTCBjb25maWcgZmlsZSBmb3IgYSBEb2xsaG91c2VNQ1Agc2VydmVyIGVudHJ5LlxuICpcbiAqIERldGVjdGlvbiBwcmVmZXJzIHRoZSBjYW5vbmljYWwgbG93ZXJjYXNlIENvZGV4IHNlY3Rpb24gbmFtZSBmaXJzdCwgdGhlblxuICogZmFsbHMgYmFjayB0byBvbGRlciBEb2xsaG91c2UtcmVsYXRlZCBzZWN0aW9uIG5hbWVzIHNvIHN0YWxlIGNvbmZpZ3MgYXJlXG4gKiBzdGlsbCB2aXNpYmxlIGluIHRoZSBVSSBpbnN0ZWFkIG9mIGJlaW5nIG1pc3Rha2VuIGZvciBhIGZyZXNoIGluc3RhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRvbWxDb25maWcocmF3OiBzdHJpbmcpOiBPbWl0PERldGVjdFJlc3VsdCwgJ2NvbmZpZ1BhdGgnPiB7XG4gIGlmICghcmF3LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2RvbGxob3VzZW1jcCcpKSB7XG4gICAgcmV0dXJuIHsgaW5zdGFsbGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgZXhhY3RDb25maWcgPSBwYXJzZVRvbWxTZWN0aW9uQ29uZmlnKCdkb2xsaG91c2VtY3AnLCByYXcsIHRydWUpO1xuICBpZiAoZXhhY3RDb25maWcpIHtcbiAgICByZXR1cm4geyBpbnN0YWxsZWQ6IHRydWUsIGN1cnJlbnRDb25maWc6IGV4YWN0Q29uZmlnLCBzZXJ2ZXJLZXk6ICdtY3Bfc2VydmVycycgfTtcbiAgfVxuXG4gIGNvbnN0IHNlY3Rpb25NYXRjaCA9IC9cXFttY3Bfc2VydmVyc1xcLihbXlxcXV0qZG9sbGhvdXNlbWNwW15cXF1dKilcXF0vaS5leGVjKHJhdyk7XG4gIGlmICghc2VjdGlvbk1hdGNoKSByZXR1cm4geyBpbnN0YWxsZWQ6IHRydWUsIGN1cnJlbnRDb25maWc6IHt9LCBzZXJ2ZXJLZXk6ICdtY3Bfc2VydmVycycgfTtcblxuICBjb25zdCBmYWxsYmFja0NvbmZpZyA9IHBhcnNlVG9tbFNlY3Rpb25Db25maWcoc2VjdGlvbk1hdGNoWzFdLCByYXcpID8/IHsgc2VydmVyTmFtZTogc2VjdGlvbk1hdGNoWzFdIH07XG4gIHJldHVybiB7IGluc3RhbGxlZDogdHJ1ZSwgY3VycmVudENvbmZpZzogZmFsbGJhY2tDb25maWcsIHNlcnZlcktleTogJ21jcF9zZXJ2ZXJzJyB9O1xufVxuXG4vKiogUGFyc2UgYSBKU09OIGNvbmZpZyBmaWxlIGZvciBhIERvbGxob3VzZU1DUCBzZXJ2ZXIgZW50cnkgKi9cbmZ1bmN0aW9uIHBhcnNlSnNvbkNvbmZpZyhyYXc6IHN0cmluZyk6IE9taXQ8RGV0ZWN0UmVzdWx0LCAnY29uZmlnUGF0aCc+IHtcbiAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ21jcFNlcnZlcnMnLCAnc2VydmVycyddKSB7XG4gICAgaWYgKHBhcnNlZFtrZXldPy5kb2xsaG91c2VtY3ApIHtcbiAgICAgIHJldHVybiB7IGluc3RhbGxlZDogdHJ1ZSwgY3VycmVudENvbmZpZzogcGFyc2VkW2tleV0uZG9sbGhvdXNlbWNwLCBzZXJ2ZXJLZXk6IGtleSB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBpbnN0YWxsZWQ6IGZhbHNlIH07XG59XG5cbi8qKiBDaGVjayBhIHNpbmdsZSBjbGllbnQgY29uZmlnIGZpbGUgZm9yIGFuIGV4aXN0aW5nIERvbGxob3VzZU1DUCBlbnRyeSAqL1xuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0Q2xpZW50KGNsaWVudDogc3RyaW5nKTogUHJvbWlzZTxEZXRlY3RSZXN1bHQgfCBudWxsPiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBnZXRDb25maWdQYXRoKGNsaWVudCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuIG51bGw7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhY2Nlc3MoY29uZmlnUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGluc3RhbGxlZDogZmFsc2UsIGNvbmZpZ1BhdGggfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcmVzdWx0ID0gY29uZmlnUGF0aC5lbmRzV2l0aCgnLnRvbWwnKSA/IHBhcnNlVG9tbENvbmZpZyhyYXcpIDogcGFyc2VKc29uQ29uZmlnKHJhdyk7XG4gICAgcmV0dXJuIHsgY29uZmlnUGF0aCwgLi4ucmVzdWx0IH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGluc3RhbGxlZDogZmFsc2UsIGNvbmZpZ1BhdGggfTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBub3JtYWxpemUgYSBjbGllbnQgbmFtZSBmcm9tIHJlcXVlc3QgYm9keS5cbiAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgY2xpZW50IG5hbWUgb3IgbnVsbCAod2l0aCBlcnJvciByZXNwb25zZSBzZW50KS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDbGllbnQoXG4gIHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgYWxsb3dlZFNldDogU2V0PHN0cmluZz4sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBjbGllbnQgfSA9IHJlcS5ib2R5IGFzIHsgY2xpZW50Pzogc3RyaW5nIH07XG4gIGlmICghY2xpZW50IHx8IHR5cGVvZiBjbGllbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ01pc3NpbmcgcmVxdWlyZWQgZmllbGQ6IGNsaWVudCcgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNsaWVudCkubm9ybWFsaXplZENvbnRlbnQudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGlmICghYWxsb3dlZFNldC5oYXMobm9ybWFsaXplZCkpIHtcbiAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7XG4gICAgICBlcnJvcjogYFVuc3VwcG9ydGVkIGNsaWVudDogJHtjbGllbnR9YCxcbiAgICAgIHN1cHBvcnRlZDogQXJyYXkuZnJvbShhbGxvd2VkU2V0KSxcbiAgICB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxudHlwZSBSZXF1ZXN0ZWRJbnN0YWxsVmVyc2lvblJlc3VsdCA9XG4gIHwgeyBlZmZlY3RpdmVWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7IGVycm9yOiBudWxsIH1cbiAgfCB7IGVmZmVjdGl2ZVZlcnNpb246IG51bGw7IGVycm9yOiBzdHJpbmcgfTtcblxuZnVuY3Rpb24gcmVzb2x2ZVJlcXVlc3RlZEluc3RhbGxWZXJzaW9uKGJvZHk6IHVua25vd24pOiBSZXF1ZXN0ZWRJbnN0YWxsVmVyc2lvblJlc3VsdCB7XG4gIGNvbnN0IHsgdmVyc2lvbiwgY2hhbm5lbCB9ID0gKGJvZHkgPz8ge30pIGFzIHsgdmVyc2lvbj86IHN0cmluZzsgY2hhbm5lbD86IHN0cmluZyB9O1xuICBjb25zdCBub3JtYWxpemVkVmVyc2lvbiA9IHZlcnNpb24gPyBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh2ZXJzaW9uKS5ub3JtYWxpemVkQ29udGVudCA6IHVuZGVmaW5lZDtcbiAgaWYgKG5vcm1hbGl6ZWRWZXJzaW9uICYmICEvXlxcZCtcXC5cXGQrXFwuXFxkKy8udGVzdChub3JtYWxpemVkVmVyc2lvbikpIHtcbiAgICByZXR1cm4geyBlZmZlY3RpdmVWZXJzaW9uOiBudWxsLCBlcnJvcjogJ0ludmFsaWQgdmVyc2lvbiBmb3JtYXQuIEV4cGVjdGVkIHNlbXZlciAoZS5nLiwgMi4wLjIpJyB9O1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZENoYW5uZWwgPSBjaGFubmVsID8gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoY2hhbm5lbCkubm9ybWFsaXplZENvbnRlbnQgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGVmZmVjdGl2ZVZlcnNpb24gPSBub3JtYWxpemVkQ2hhbm5lbCAmJiBBTExPV0VEX0lOU1RBTExfQ0hBTk5FTFMuaGFzKG5vcm1hbGl6ZWRDaGFubmVsKSAmJiBub3JtYWxpemVkQ2hhbm5lbCAhPT0gJ2xhdGVzdCdcbiAgICA/IG5vcm1hbGl6ZWRDaGFubmVsXG4gICAgOiBub3JtYWxpemVkVmVyc2lvbjtcblxuICByZXR1cm4geyBlZmZlY3RpdmVWZXJzaW9uLCBlcnJvcjogbnVsbCB9O1xufVxuXG5mdW5jdGlvbiB0b052bU1pdGlnYXRpb25BcHBsaWVkKHJlc3VsdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBhcHBseU52bUxhdW5jaGVySWZOZWVkZWQ+Pik6IGJvb2xlYW4gfCBudWxsIHtcbiAgaWYgKHJlc3VsdCA9PT0gJ2FwcGxpZWQnKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHJlc3VsdCA9PT0gJ2ZhaWxlZCcpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIOKUgOKUgCBMaWNlbnNlIHZlcmlmaWNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuY29uc3QgTVNfUEVSX01JTlVURSA9IDYwICogMTAwMDtcbmNvbnN0IFZFUklGSUNBVElPTl9DT0RFX1RUTF9NSU5VVEVTID0gMTA7XG5jb25zdCBWRVJJRklDQVRJT05fQ09ERV9UVExfTVMgPSBWRVJJRklDQVRJT05fQ09ERV9UVExfTUlOVVRFUyAqIE1TX1BFUl9NSU5VVEU7XG5jb25zdCBWRVJJRklDQVRJT05fTUFYX0FUVEVNUFRTID0gNTtcbmNvbnN0IExJQ0VOU0VfV09SS0VSX1RJTUVPVVRfTVMgPSA4XzAwMDtcbmNvbnN0IExJQ0VOU0VfV09SS0VSX0VSUk9SX0JPRFlfTElNSVQgPSAzMDA7XG5jb25zdCBERUZBVUxUX0xJQ0VOU0VfV09SS0VSX1VSTCA9ICdodHRwczovL2RvbGxob3VzZW1jcC1saWNlbnNlLWVtYWlsLm1pY2stZWJhLndvcmtlcnMuZGV2JztcblxuLyoqIEdlbmVyYXRlIGEgY3J5cHRvZ3JhcGhpY2FsbHkgcmFuZG9tIDYtZGlnaXQgdmVyaWZpY2F0aW9uIGNvZGUuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVZlcmlmaWNhdGlvbkNvZGUoKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZyhyYW5kb21JbnQoMTAwMDAwLCA5OTk5OTkpKTtcbn1cblxuLyoqIENoZWNrIGlmIGEgdmVyaWZpY2F0aW9uIGNvZGUgaGFzIGV4cGlyZWQuICovXG5mdW5jdGlvbiBpc0NvZGVFeHBpcmVkKGV4cGlyZXNBdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBuZXcgRGF0ZShleHBpcmVzQXQpLmdldFRpbWUoKSA8IERhdGUubm93KCk7XG59XG5cbi8vIOKUgOKUgCBMaWNlbnNlIGhlbHBlcnMgKG1vZHVsZSBzY29wZSBmb3IgU29uYXJDbG91ZCBTNzcyMSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IFZBTElEX0xJQ0VOU0VfVElFUlMgPSBuZXcgU2V0KFsnYWdwbCcsICdmcmVlLWNvbW1lcmNpYWwnLCAncGFpZC1jb21tZXJjaWFsJ10pO1xuY29uc3QgVkFMSURfUkVWRU5VRV9TQ0FMRVMgPSBuZXcgU2V0KFsnJDFN4oCTJDVNJywgJyQ1TeKAkyQyNU0nLCAnJDI1TeKAkyQxMDBNJywgJyQxMDBNKyddKTtcbi8vIFNhZmUgZnJvbSBSZURvUzogaW5wdXQgaXMgcHJlLWNoZWNrZWQgdG8g4omkMjU0IGNoYXJzLCBhbmQgezEsNjR9L3sxLDI1M30vezIsNjN9XG4vLyBib3VuZHMgcHJldmVudCBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nIG9uIGFueSBpbnB1dCB3aXRoaW4gdGhhdCBsZW5ndGguXG5jb25zdCBFTUFJTF9QQVRURVJOID0gL15bXlxcc0BdezEsNjR9QFteXFxzQF17MSwyNTN9XFwuW15cXHNAXXsyLDYzfSQvO1xuXG4vKiogU2FuaXRpemUgYSBzdHJpbmcgZmllbGQ6IHRyaW0sIHRydW5jYXRlLCByZXR1cm4gdW5kZWZpbmVkIGlmIGVtcHR5LiAqL1xuZnVuY3Rpb24gc2FuaXRpemUodmFsOiB1bmtub3duLCBtYXhMZW46IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsICE9PSAnc3RyaW5nJyB8fCAhdmFsLnRyaW0oKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHZhbC50cmltKCkuc2xpY2UoMCwgbWF4TGVuKTtcbn1cblxuLyoqIFZhbGlkYXRlIGVtYWlsIGZvcm1hdCBhbmQgY29tbWVyY2lhbCBhY2tub3dsZWRnbWVudHMuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbW1lcmNpYWxGaWVsZHMoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBlbWFpbCwgdGVsZW1ldHJ5QWNrbm93bGVkZ2VkIH0gPSBib2R5O1xuICBpZiAoIWVtYWlsIHx8IHR5cGVvZiBlbWFpbCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gJ0VtYWlsIGFkZHJlc3MgaXMgcmVxdWlyZWQgZm9yIENvbW1lcmNpYWwgYW5kIEVudGVycHJpc2UgbGljZW5zZXMnO1xuICB9XG4gIGlmIChlbWFpbC5sZW5ndGggPiAyNTQgfHwgIUVNQUlMX1BBVFRFUk4udGVzdChlbWFpbCkpIHtcbiAgICByZXR1cm4gJ1BsZWFzZSBwcm92aWRlIGEgdmFsaWQgZW1haWwgYWRkcmVzcyc7XG4gIH1cbiAgaWYgKCF0ZWxlbWV0cnlBY2tub3dsZWRnZWQpIHtcbiAgICByZXR1cm4gJ1RlbGVtZXRyeSBhY2tub3dsZWRnbWVudCBpcyByZXF1aXJlZCBmb3IgQ29tbWVyY2lhbCBhbmQgRW50ZXJwcmlzZSBsaWNlbnNlcyc7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBWYWxpZGF0ZSBmcmVlLWNvbW1lcmNpYWwgc3BlY2lmaWMgZmllbGRzLiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGcmVlQ29tbWVyY2lhbEZpZWxkcyhib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7IGF0dHJpYnV0aW9uQWNrbm93bGVkZ2VkLCByZXZlbnVlQXR0ZXN0ZWQgfSA9IGJvZHk7XG4gIGlmICghYXR0cmlidXRpb25BY2tub3dsZWRnZWQpIHtcbiAgICByZXR1cm4gJ0F0dHJpYnV0aW9uIGFja25vd2xlZGdtZW50IGlzIHJlcXVpcmVkIGZvciBDb21tZXJjaWFsIGxpY2Vuc2VzJztcbiAgfVxuICBpZiAoIXJldmVudWVBdHRlc3RlZCkge1xuICAgIHJldHVybiAnUmV2ZW51ZSBhdHRlc3RhdGlvbiBpcyByZXF1aXJlZCBmb3IgQ29tbWVyY2lhbCBsaWNlbnNlcyc7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBWYWxpZGF0ZSBlbnRlcnByaXNlIHNwZWNpZmljIGZpZWxkcy4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRW50ZXJwcmlzZUZpZWxkcyhib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7IHJldmVudWVTY2FsZSwgY29tcGFueU5hbWUsIHVzZUNhc2UgfSA9IGJvZHk7XG4gIGlmICghcmV2ZW51ZVNjYWxlIHx8ICFWQUxJRF9SRVZFTlVFX1NDQUxFUy5oYXMocmV2ZW51ZVNjYWxlIGFzIHN0cmluZykpIHtcbiAgICByZXR1cm4gYFJldmVudWUgc2NhbGUgaXMgcmVxdWlyZWQuIE11c3QgYmUgb25lIG9mOiAke1suLi5WQUxJRF9SRVZFTlVFX1NDQUxFU10uam9pbignLCAnKX1gO1xuICB9XG4gIGlmICghY29tcGFueU5hbWUgfHwgdHlwZW9mIGNvbXBhbnlOYW1lICE9PSAnc3RyaW5nJyB8fCAhY29tcGFueU5hbWUudHJpbSgpKSB7XG4gICAgcmV0dXJuICdDb21wYW55IG5hbWUgaXMgcmVxdWlyZWQgZm9yIEVudGVycHJpc2UgbGljZW5zZXMnO1xuICB9XG4gIGlmICghdXNlQ2FzZSB8fCB0eXBlb2YgdXNlQ2FzZSAhPT0gJ3N0cmluZycgfHwgIXVzZUNhc2UudHJpbSgpKSB7XG4gICAgcmV0dXJuICdVc2UgY2FzZSBpcyByZXF1aXJlZCBmb3IgRW50ZXJwcmlzZSBsaWNlbnNlcyc7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBWYWxpZGF0ZSBsaWNlbnNlIGZvcm0gaW5wdXQuIFJldHVybnMgZXJyb3Igc3RyaW5nIG9yIG51bGwgaWYgdmFsaWQuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUxpY2Vuc2VJbnB1dChib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7IHRpZXIgfSA9IGJvZHk7XG4gIGlmICghdGllciB8fCAhVkFMSURfTElDRU5TRV9USUVSUy5oYXModGllciBhcyBzdHJpbmcpKSB7XG4gICAgcmV0dXJuIGBJbnZhbGlkIGxpY2Vuc2UgdGllci4gTXVzdCBiZSBvbmUgb2Y6ICR7Wy4uLlZBTElEX0xJQ0VOU0VfVElFUlNdLmpvaW4oJywgJyl9YDtcbiAgfVxuICBpZiAodGllciAhPT0gJ2FncGwnKSB7XG4gICAgY29uc3QgY29tbWVyY2lhbEVycm9yID0gdmFsaWRhdGVDb21tZXJjaWFsRmllbGRzKGJvZHkpO1xuICAgIGlmIChjb21tZXJjaWFsRXJyb3IpIHJldHVybiBjb21tZXJjaWFsRXJyb3I7XG4gIH1cbiAgaWYgKHRpZXIgPT09ICdmcmVlLWNvbW1lcmNpYWwnKSB7XG4gICAgY29uc3QgZnJlZUVycm9yID0gdmFsaWRhdGVGcmVlQ29tbWVyY2lhbEZpZWxkcyhib2R5KTtcbiAgICBpZiAoZnJlZUVycm9yKSByZXR1cm4gZnJlZUVycm9yO1xuICB9XG4gIGlmICh0aWVyID09PSAncGFpZC1jb21tZXJjaWFsJykge1xuICAgIGNvbnN0IGVudGVycHJpc2VFcnJvciA9IHZhbGlkYXRlRW50ZXJwcmlzZUZpZWxkcyhib2R5KTtcbiAgICBpZiAoZW50ZXJwcmlzZUVycm9yKSByZXR1cm4gZW50ZXJwcmlzZUVycm9yO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQnVpbGQgbGljZW5zZSBkYXRhIG9iamVjdCBmcm9tIHZhbGlkYXRlZCBpbnB1dC4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGljZW5zZURhdGEoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHsgdGllciwgZW1haWwsIHJldmVudWVTY2FsZSwgY29tcGFueU5hbWUsIHVzZUNhc2UgfSA9IGJvZHk7XG4gIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB0aWVyIH07XG4gIGlmICh0aWVyICE9PSAnYWdwbCcpIHtcbiAgICBkYXRhLmVtYWlsID0gc2FuaXRpemUoZW1haWwsIDI1NCk7XG4gICAgZGF0YS5hdHRlc3RlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGRhdGEudGVsZW1ldHJ5UmVxdWlyZWQgPSB0cnVlO1xuICB9XG4gIGlmICh0aWVyID09PSAncGFpZC1jb21tZXJjaWFsJykge1xuICAgIGlmIChyZXZlbnVlU2NhbGUpIGRhdGEucmV2ZW51ZVNjYWxlID0gcmV2ZW51ZVNjYWxlO1xuICAgIGlmIChjb21wYW55TmFtZSkgZGF0YS5jb21wYW55TmFtZSA9IHNhbml0aXplKGNvbXBhbnlOYW1lLCAyMDApO1xuICAgIGlmICh1c2VDYXNlKSBkYXRhLnVzZUNhc2UgPSBzYW5pdGl6ZSh1c2VDYXNlLCA1MDApO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKiogU2VuZCBsaWNlbnNlX2FjdGl2YXRpb24gZXZlbnQgdG8gUG9zdEhvZyBmb3IgY29tbWVyY2lhbCB0aWVycy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhcHR1cmVQb3N0SG9nTGljZW5zZUV2ZW50KGxpY2Vuc2VEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwb3N0aG9nID0gbmV3IFBvc3RIb2coUE9TVEhPR19QUk9KRUNUX0tFWSwge1xuICAgIGhvc3Q6IHByb2Nlc3MuZW52LlBPU1RIT0dfSE9TVCB8fCAnaHR0cHM6Ly9hcHAucG9zdGhvZy5jb20nLFxuICAgIGZsdXNoQXQ6IDEsXG4gICAgZmx1c2hJbnRlcnZhbDogNTAwMCxcbiAgfSk7XG4gIGxldCBpbnN0YWxsSWQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb25zdCBpZFBhdGggPSBqb2luKGhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAnLnRlbGVtZXRyeS1pZCcpO1xuICAgIGluc3RhbGxJZCA9IChhd2FpdCByZWFkRmlsZShpZFBhdGgsICd1dGYtOCcpKS50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIGluc3RhbGxJZCA9IHV1aWR2NCgpO1xuICB9XG4gIGNvbnN0IGV2ZW50VHlwZSA9IChsaWNlbnNlRGF0YS5ldmVudFR5cGUgYXMgc3RyaW5nKSA/PyAnYWN0aXZhdGlvbic7XG4gIHBvc3Rob2cuY2FwdHVyZSh7XG4gICAgZGlzdGluY3RJZDogaW5zdGFsbElkLFxuICAgIGV2ZW50OiAnbGljZW5zZV9hY3RpdmF0aW9uJyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICB0aWVyOiBsaWNlbnNlRGF0YS50aWVyLFxuICAgICAgZW1haWw6IGxpY2Vuc2VEYXRhLmVtYWlsLFxuICAgICAgZXZlbnRfdHlwZTogZXZlbnRUeXBlLFxuICAgICAgc2VydmVyX3ZlcnNpb246IFBBQ0tBR0VfVkVSU0lPTixcbiAgICAgIG9zOiBwbGF0Zm9ybSgpLFxuICAgICAgLi4uKGV2ZW50VHlwZSA9PT0gJ3ZlcmlmaWNhdGlvbicgPyB7XG4gICAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25Db2RlLFxuICAgICAgfSA6IHt9KSxcbiAgICAgIC4uLihldmVudFR5cGUgPT09ICdhY3RpdmF0aW9uJyA/IHtcbiAgICAgICAgdmVyaWZpY2F0aW9uX3RpbWVfbXM6IGxpY2Vuc2VEYXRhLnZlcmlmaWNhdGlvbl90aW1lX21zLFxuICAgICAgICB2ZXJpZmljYXRpb25fdGltZV9zZWNvbmRzOiBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25fdGltZV9tc1xuICAgICAgICAgID8gTWF0aC5yb3VuZCgobGljZW5zZURhdGEudmVyaWZpY2F0aW9uX3RpbWVfbXMgYXMgbnVtYmVyKSAvIDEwMDApIDogdW5kZWZpbmVkLFxuICAgICAgICB2ZXJpZmljYXRpb25fYXR0ZW1wdHM6IGxpY2Vuc2VEYXRhLnZlcmlmaWNhdGlvbl9hdHRlbXB0cyxcbiAgICAgIH0gOiB7fSksXG4gICAgICAuLi4obGljZW5zZURhdGEudGllciA9PT0gJ3BhaWQtY29tbWVyY2lhbCcgPyB7XG4gICAgICAgIHJldmVudWVfc2NhbGU6IGxpY2Vuc2VEYXRhLnJldmVudWVTY2FsZSxcbiAgICAgICAgY29tcGFueV9uYW1lOiBsaWNlbnNlRGF0YS5jb21wYW55TmFtZSxcbiAgICAgICAgdXNlX2Nhc2U6IGxpY2Vuc2VEYXRhLnVzZUNhc2UsXG4gICAgICB9IDoge30pLFxuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBwb3N0aG9nLnNodXRkb3duKCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGljZW5zZVdvcmtlclJlcXVlc3RCb2R5KFxuICBsaWNlbnNlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHZlcmlmaWNhdGlvbkNvZGU6IHN0cmluZyxcbiAgZGlzdGluY3RJZDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICBldmVudDogJ2xpY2Vuc2VfYWN0aXZhdGlvbicsXG4gICAgZGlzdGluY3RfaWQ6IGRpc3RpbmN0SWQsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgdGllcjogbGljZW5zZURhdGEudGllcixcbiAgICAgIGVtYWlsOiBsaWNlbnNlRGF0YS5lbWFpbCxcbiAgICAgIGV2ZW50X3R5cGU6ICd2ZXJpZmljYXRpb24nLFxuICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IHZlcmlmaWNhdGlvbkNvZGUsXG4gICAgICBzZXJ2ZXJfdmVyc2lvbjogUEFDS0FHRV9WRVJTSU9OLFxuICAgICAgb3M6IHBsYXRmb3JtKCksXG4gICAgfSxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmRMaWNlbnNlV29ya2VyVmVyaWZpY2F0aW9uRW1haWwoXG4gIGxpY2Vuc2VEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgdmVyaWZpY2F0aW9uQ29kZTogc3RyaW5nLFxuICBkaXN0aW5jdElkOiBzdHJpbmcsXG4pOiBQcm9taXNlPHsgb2s6IHRydWUgfSB8IHsgb2s6IGZhbHNlOyBzdGF0dXM/OiBudW1iZXI7IGVycm9yOiBzdHJpbmc7IHJlc3BvbnNlQm9keT86IHN0cmluZyB9PiB7XG4gIGNvbnN0IHdvcmtlclVybCA9IG5ldyBVUkwoTElDRU5TRV9XT1JLRVJfRElSRUNUX1BBVEgsIHByb2Nlc3MuZW52LkRPTExIT1VTRV9MSUNFTlNFX1dPUktFUl9VUkwgfHwgREVGQVVMVF9MSUNFTlNFX1dPUktFUl9VUkwpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh3b3JrZXJVcmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IGJ1aWxkTGljZW5zZVdvcmtlclJlcXVlc3RCb2R5KGxpY2Vuc2VEYXRhLCB2ZXJpZmljYXRpb25Db2RlLCBkaXN0aW5jdElkKSxcbiAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dChMSUNFTlNFX1dPUktFUl9USU1FT1VUX01TKSxcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuIHsgb2s6IHRydWUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb2s6IGZhbHNlLFxuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICBlcnJvcjogYHdvcmtlcl9odHRwXyR7cmVzcG9uc2Uuc3RhdHVzfWAsXG4gICAgICByZXNwb25zZUJvZHk6IChhd2FpdCByZXNwb25zZS50ZXh0KCkpLnNsaWNlKDAsIExJQ0VOU0VfV09SS0VSX0VSUk9SX0JPRFlfTElNSVQpLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgKGVycm9yLm5hbWUgPT09ICdUaW1lb3V0RXJyb3InIHx8XG4gICAgICAgIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fFxuICAgICAgICBlcnJvci5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RpbWVvdXQnKSB8fFxuICAgICAgICBlcnJvci5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RpbWVkIG91dCcpKVxuICAgICkge1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogJ3dvcmtlcl90aW1lb3V0JyB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgb2s6IGZhbHNlLFxuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldExpY2Vuc2VXb3JrZXJGYWlsdXJlTWVzc2FnZShyZXN1bHQ6IHsgc3RhdHVzPzogbnVtYmVyOyBlcnJvcjogc3RyaW5nIH0pOiBzdHJpbmcge1xuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gNDAxIHx8IHJlc3VsdC5zdGF0dXMgPT09IDQwMykge1xuICAgIHJldHVybiAnVmVyaWZpY2F0aW9uIGVtYWlsIHNlcnZpY2UgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIFBsZWFzZSBjaGVjayB0aGUgbG9jYWwgZW1haWwgZGVsaXZlcnkgY29uZmlndXJhdGlvbiBhbmQgdHJ5IGFnYWluLic7XG4gIH1cbiAgaWYgKHJlc3VsdC5lcnJvciA9PT0gJ3dvcmtlcl90aW1lb3V0Jykge1xuICAgIHJldHVybiAnVmVyaWZpY2F0aW9uIGVtYWlsIHNlcnZpY2UgdGltZWQgb3V0LiBQbGVhc2UgdHJ5IGFnYWluIGluIGEgbW9tZW50Lic7XG4gIH1cbiAgcmV0dXJuICdXZSBjb3VsZCBub3Qgc2VuZCB0aGUgdmVyaWZpY2F0aW9uIGVtYWlsIHJpZ2h0IG5vdy4gUGxlYXNlIHRyeSBhZ2FpbiBpbiBhIG1vbWVudC4nO1xufVxuXG5mdW5jdGlvbiBsb2dMaWNlbnNlV29ya2VyRGVsaXZlcnlGYWlsdXJlKFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIGxpY2Vuc2VEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgZGVsaXZlcnlSZXN1bHQ6IHsgc3RhdHVzPzogbnVtYmVyOyBlcnJvcjogc3RyaW5nOyByZXNwb25zZUJvZHk/OiBzdHJpbmcgfSxcbik6IHZvaWQge1xuICBsb2dnZXIuZXJyb3IobWVzc2FnZSwge1xuICAgIGVtYWlsOiBsaWNlbnNlRGF0YS5lbWFpbCxcbiAgICB0aWVyOiBsaWNlbnNlRGF0YS50aWVyLFxuICAgIHN0YXR1czogZGVsaXZlcnlSZXN1bHQuc3RhdHVzID8/IG51bGwsXG4gICAgZXJyb3I6IGRlbGl2ZXJ5UmVzdWx0LmVycm9yLFxuICAgIHJlc3BvbnNlQm9keTogZGVsaXZlcnlSZXN1bHQucmVzcG9uc2VCb2R5ID8/IG51bGwsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2V0dXBSb3V0ZXMob3B0cz86IHtcbiAgLyoqIE92ZXJyaWRlIGluc3RhbGwtbWNwIHJ1bm5lci4gRm9yIHRlc3Rpbmcgb25seSDigJQgcHJlZml4IHNpZ25hbHMgdGVzdC1vbmx5IHVzZS4gKi9cbiAgX3J1bkluc3RhbGxNY3A/OiAoY2xpZW50OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgLyoqIE92ZXJyaWRlIHBlcm1pc3Npb24gaG9vayBpbnN0YWxsZXIuIEZvciB0ZXN0aW5nIG9ubHkuICovXG4gIF9pbnN0YWxsUGVybWlzc2lvbkhvb2s/OiAoY2xpZW50OiBzdHJpbmcpID0+IFByb21pc2U8SW5zdGFsbFBlcm1pc3Npb25Ib29rUmVzdWx0PjtcbiAgLyoqIFNraXAgdGhlIHNsaWRpbmctd2luZG93IHJhdGUgbGltaXRlci4gRm9yIHRlc3Rpbmcgb25seS4gKi9cbiAgX3NraXBSYXRlTGltaXQ/OiBib29sZWFuO1xufSk6IHtcbiAgaW5zdGFsbEhhbmRsZXI6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD47XG4gIG9wZW5Db25maWdIYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB2ZXJzaW9uSGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgbWNwYlJlZGlyZWN0SGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZGV0ZWN0SGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZ2V0TGljZW5zZUhhbmRsZXI6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD47XG4gIHNldExpY2Vuc2VIYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB2ZXJpZnlMaWNlbnNlSGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbn0ge1xuICBjb25zdCBpbnN0YWxsZXIgPSBvcHRzPy5fcnVuSW5zdGFsbE1jcCA/PyBydW5JbnN0YWxsTWNwO1xuICBjb25zdCBwZXJtaXNzaW9uSG9va0luc3RhbGxlciA9IG9wdHM/Ll9pbnN0YWxsUGVybWlzc2lvbkhvb2sgPz8gaW5zdGFsbFBlcm1pc3Npb25Ib29rO1xuICBjb25zdCBza2lwUmF0ZUxpbWl0ID0gb3B0cz8uX3NraXBSYXRlTGltaXQgPz8gZmFsc2U7XG4gIC8vIOKUgOKUgCBEZXRlY3QgZXhpc3RpbmcgaW5zdGFsbGF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29uc3QgZGV0ZWN0SGFuZGxlciA9IGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgY2xpZW50cyA9IFtcbiAgICAgIHsgaWQ6ICdjbGF1ZGUnLCBuYW1lOiAnQ2xhdWRlIERlc2t0b3AnIH0sXG4gICAgICB7IGlkOiAnY2xhdWRlLWNvZGUnLCBuYW1lOiAnQ2xhdWRlIENvZGUnIH0sXG4gICAgICB7IGlkOiAnY3Vyc29yJywgbmFtZTogJ0N1cnNvcicgfSxcbiAgICAgIHsgaWQ6ICdjbGluZScsIG5hbWU6ICdDbGluZScgfSxcbiAgICAgIHsgaWQ6ICd3aW5kc3VyZicsIG5hbWU6ICdXaW5kc3VyZicgfSxcbiAgICAgIHsgaWQ6ICdsbXN0dWRpbycsIG5hbWU6ICdMTSBTdHVkaW8nIH0sXG4gICAgICB7IGlkOiAnZ2VtaW5pLWNsaScsIG5hbWU6ICdHZW1pbmkgQ0xJJyB9LFxuICAgICAgeyBpZDogJ2NvZGV4JywgbmFtZTogJ0NvZGV4JyB9LFxuICAgIF07XG5cbiAgICBjb25zdCByZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudHMubWFwKGFzeW5jICh7IGlkLCBuYW1lIH0pID0+IHtcbiAgICAgIGNvbnN0IGRldGVjdGlvbiA9IGF3YWl0IGRldGVjdENsaWVudChpZCk7XG4gICAgICBpZiAoZGV0ZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBzdXBwb3J0OiB7IGxldmVsOiBTRVRVUF9TVVBQT1JUX0xFVkVMU1tpZF0gfSxcbiAgICAgICAgICAuLi5kZXRlY3Rpb24sXG4gICAgICAgIH07XG4gICAgICAgIGlmIChpZCA9PT0gJ2NsYXVkZS1jb2RlJyB8fCBpZCA9PT0gJ2N1cnNvcicgfHwgaWQgPT09ICd3aW5kc3VyZicgfHwgaWQgPT09ICdnZW1pbmktY2xpJyB8fCBpZCA9PT0gJ2NvZGV4Jykge1xuICAgICAgICAgIGNvbnN0IGhvb2tTdGF0dXMgPSBhd2FpdCBnZXRQZXJtaXNzaW9uSG9va1N0YXR1c0FzeW5jKHVuZGVmaW5lZCwgaWQpO1xuICAgICAgICAgIHJlc3VsdC5ob29rSW5zdGFsbGVkID0gaG9va1N0YXR1cy5pbnN0YWxsZWQ7XG4gICAgICAgICAgcmVzdWx0Lmhvb2tBc3NldHNQcmVwYXJlZCA9IGhvb2tTdGF0dXMuYXNzZXRzUHJlcGFyZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0c1tpZF0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgcmVzLmpzb24ocmVzdWx0cyk7XG4gIH07XG5cbiAgLy8g4pSA4pSAIE9wZW4gY29uZmlnIGZpbGUgaW4gZWRpdG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb25zdCBvcGVuQ29uZmlnSGFuZGxlciA9IGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50ID0gdmFsaWRhdGVDbGllbnQocmVxLCByZXMsIE9QRU5BQkxFX0NMSUVOVFMpO1xuICAgIGlmICghbm9ybWFsaXplZENsaWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGdldENvbmZpZ1BhdGgobm9ybWFsaXplZENsaWVudCk7XG4gICAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiBgQ29uZmlnIHBhdGggdW5rbm93biBmb3I6ICR7bm9ybWFsaXplZENsaWVudH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgZmlsZSB3aXRoIGVtcHR5IGNvbnRlbnQgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXRcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWNjZXNzKGNvbmZpZ1BhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShjb25maWdQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBjb25maWdQYXRoLmVuZHNXaXRoKCcudG9tbCcpID8gJycgOiAne30nO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoY29uZmlnUGF0aCwgY29udGVudCArICdcXG4nLCAndXRmLTgnKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gQ3JlYXRlZCBlbXB0eSBjb25maWc6ICR7Y29uZmlnUGF0aH1gKTtcbiAgICAgIH0gY2F0Y2ggKG1rRXJyKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IG1rRXJyIGluc3RhbmNlb2YgRXJyb3IgPyBta0Vyci5tZXNzYWdlIDogU3RyaW5nKG1rRXJyKTtcbiAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogYENvdWxkIG5vdCBjcmVhdGUgY29uZmlnIGZpbGU6ICR7bXNnfWAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhgW1NldHVwXSBPcGVuaW5nIGNvbmZpZyBmb3IgJHtub3JtYWxpemVkQ2xpZW50fTogJHtjb25maWdQYXRofWApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG9wZW5JbkVkaXRvcihjb25maWdQYXRoKTtcbiAgICAgIHJlcy5qc29uKHsgc3VjY2VzczogdHJ1ZSwgcGF0aDogY29uZmlnUGF0aCB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogbWVzc2FnZSwgcGF0aDogY29uZmlnUGF0aCB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8g4pSA4pSAIEF1dG8taW5zdGFsbCB2aWEgaW5zdGFsbC1tY3Ag4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IGluc3RhbGxIYW5kbGVyID0gYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghc2tpcFJhdGVMaW1pdCAmJiAhaW5zdGFsbExpbWl0ZXIudHJ5QWNxdWlyZSgpKSB7XG4gICAgICByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnVG9vIG1hbnkgaW5zdGFsbCByZXF1ZXN0cy4gVHJ5IGFnYWluIGluIGEgbWludXRlLicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZENsaWVudCA9IHZhbGlkYXRlQ2xpZW50KHJlcSwgcmVzLCBBTExPV0VEX0NMSUVOVFMpO1xuICAgIGlmICghbm9ybWFsaXplZENsaWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBlZmZlY3RpdmVWZXJzaW9uLCBlcnJvciB9ID0gcmVzb2x2ZVJlcXVlc3RlZEluc3RhbGxWZXJzaW9uKHJlcS5ib2R5KTtcbiAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3IgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFnID0gZWZmZWN0aXZlVmVyc2lvbiA/IGBAJHtlZmZlY3RpdmVWZXJzaW9ufWAgOiAnQGxhdGVzdCc7XG4gICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gSW5zdGFsbGluZyBEb2xsaG91c2VNQ1Ake3RhZ30gdG8gY2xpZW50OiAke25vcm1hbGl6ZWRDbGllbnR9YCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gbm9ybWFsaXplZENsaWVudCA9PT0gJ2xtc3R1ZGlvJ1xuICAgICAgICA/IGF3YWl0IGluc3RhbGxMbVN0dWRpb0NvbmZpZyhlZmZlY3RpdmVWZXJzaW9uKVxuICAgICAgICA6IGF3YWl0IGluc3RhbGxlcihub3JtYWxpemVkQ2xpZW50LCBlZmZlY3RpdmVWZXJzaW9uKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIFN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgdG8gJHtub3JtYWxpemVkQ2xpZW50fWApO1xuXG4gICAgICAvLyBCZXN0LWVmZm9ydCBOVk0gbWl0aWdhdGlvbiAobWFjT1MvTGludXggb25seSkuXG4gICAgICAvLyBFeHRyYWN0ZWQgaW50byBhcHBseU52bUxhdW5jaGVySWZOZWVkZWQgdG8ga2VlcCB0aGlzIGhhbmRsZXInc1xuICAgICAgLy8gY29nbml0aXZlIGNvbXBsZXhpdHkgd2l0aGluIGJvdW5kcyAoU29uYXJDbG91ZCBTMzc3NikuXG4gICAgICBjb25zdCBudm1SZXN1bHQgPSBhd2FpdCBhcHBseU52bUxhdW5jaGVySWZOZWVkZWQobm9ybWFsaXplZENsaWVudCk7XG5cbiAgICAgIGNvbnN0IG52bU1pdGlnYXRpb25BcHBsaWVkID0gdG9Odm1NaXRpZ2F0aW9uQXBwbGllZChudm1SZXN1bHQpO1xuXG4gICAgICBjb25zdCBob29rSW5zdGFsbCA9IGF3YWl0IHBlcm1pc3Npb25Ib29rSW5zdGFsbGVyKG5vcm1hbGl6ZWRDbGllbnQpO1xuXG4gICAgICByZXMuanNvbih7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgY2xpZW50OiBub3JtYWxpemVkQ2xpZW50LFxuICAgICAgICB2ZXJzaW9uOiBlZmZlY3RpdmVWZXJzaW9uIHx8ICdsYXRlc3QnLFxuICAgICAgICBudm1NaXRpZ2F0aW9uQXBwbGllZCxcbiAgICAgICAgaG9va0luc3RhbGwsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBsb2dnZXIud2FybihgW1NldHVwXSBJbnN0YWxsIGZhaWxlZCBmb3IgJHtub3JtYWxpemVkQ2xpZW50fTogJHttZXNzYWdlfWApO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1lc3NhZ2UsIGNsaWVudDogbm9ybWFsaXplZENsaWVudCB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8g4pSA4pSAIFZlcnNpb24gaW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29uc3QgdmVyc2lvbkhhbmRsZXIgPSBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGxvY2FsID0ge1xuICAgICAgdmVyc2lvbjogUEFDS0FHRV9WRVJTSU9OLFxuICAgICAgbWNwYlVybDogYGh0dHBzOi8vZ2l0aHViLmNvbS8ke0dJVEhVQl9SRVBPfS9yZWxlYXNlcy9kb3dubG9hZC92JHtQQUNLQUdFX1ZFUlNJT059L2RvbGxob3VzZW1jcC0ke1BBQ0tBR0VfVkVSU0lPTn0ubWNwYmAsXG4gICAgfTtcblxuICAgIC8vIFF1ZXJ5IEdpdEh1YiBmb3IgdGhlIGFjdHVhbCBsYXRlc3QgcmVsZWFzZVxuICAgIGxldCBsYXRlc3QgPSBsb2NhbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZ2hSZXMgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke0dJVEhVQl9SRVBPfS9yZWxlYXNlcy9sYXRlc3RgLCB7XG4gICAgICAgIGhlYWRlcnM6IHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24nLCAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AtU2V0dXAnIH0sXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCg1MDAwKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGdoUmVzLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSBhd2FpdCBnaFJlcy5qc29uKCkgYXMgeyB0YWdfbmFtZTogc3RyaW5nOyBhc3NldHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBicm93c2VyX2Rvd25sb2FkX3VybDogc3RyaW5nIH0+IH07XG4gICAgICAgIGNvbnN0IG1jcGJBc3NldCA9IHJlbGVhc2UuYXNzZXRzLmZpbmQoYSA9PiBNQ1BCX0FTU0VUX1BBVFRFUk4udGVzdChhLm5hbWUpKTtcbiAgICAgICAgbGF0ZXN0ID0ge1xuICAgICAgICAgIHZlcnNpb246IHJlbGVhc2UudGFnX25hbWUucmVwbGFjZSgvXnYvLCAnJyksXG4gICAgICAgICAgbWNwYlVybDogbWNwYkFzc2V0Py5icm93c2VyX2Rvd25sb2FkX3VybCB8fFxuICAgICAgICAgICAgYGh0dHBzOi8vZ2l0aHViLmNvbS8ke0dJVEhVQl9SRVBPfS9yZWxlYXNlcy9kb3dubG9hZC8ke3JlbGVhc2UudGFnX25hbWV9L2RvbGxob3VzZW1jcC0ke3JlbGVhc2UudGFnX25hbWUucmVwbGFjZSgvXnYvLCAnJyl9Lm1jcGJgLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gR2l0SHViIHVucmVhY2hhYmxlIOKAlCB1c2UgbG9jYWwgdmVyc2lvbiBpbmZvXG4gICAgfVxuXG4gICAgcmVzLmpzb24oe1xuICAgICAgcnVubmluZzogbG9jYWwsXG4gICAgICBsYXRlc3QsXG4gICAgICBpc0xhdGVzdDogbG9jYWwudmVyc2lvbiA9PT0gbGF0ZXN0LnZlcnNpb24sXG4gICAgfSk7XG4gIH07XG5cbiAgLy8g4pSA4pSAIC5tY3BiIGRvd25sb2FkIHJlZGlyZWN0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb25zdCBtY3BiUmVkaXJlY3RIYW5kbGVyID0gYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyBUcnkgR2l0SHViIEFQSSBmb3IgdGhlIGFjdHVhbCBsYXRlc3QgLm1jcGIgYXNzZXQgVVJMXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdoUmVzID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtHSVRIVUJfUkVQT30vcmVsZWFzZXMvbGF0ZXN0YCwge1xuICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uJywgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLVNldHVwJyB9LFxuICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoNTAwMCksXG4gICAgICB9KTtcbiAgICAgIGlmIChnaFJlcy5vaykge1xuICAgICAgICBjb25zdCByZWxlYXNlID0gYXdhaXQgZ2hSZXMuanNvbigpIGFzIHsgdGFnX25hbWU6IHN0cmluZzsgYXNzZXRzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgYnJvd3Nlcl9kb3dubG9hZF91cmw6IHN0cmluZyB9PiB9O1xuICAgICAgICBjb25zdCBtY3BiQXNzZXQgPSByZWxlYXNlLmFzc2V0cy5maW5kKGEgPT4gTUNQQl9BU1NFVF9QQVRURVJOLnRlc3QoYS5uYW1lKSk7XG4gICAgICAgIGlmIChtY3BiQXNzZXQpIHtcbiAgICAgICAgICByZXMucmVkaXJlY3QobWNwYkFzc2V0LmJyb3dzZXJfZG93bmxvYWRfdXJsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBjb25zdHJ1Y3RlZCBVUkxcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogY29uc3RydWN0IFVSTCBmcm9tIHJ1bm5pbmcgdmVyc2lvblxuICAgIGNvbnN0IHVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtHSVRIVUJfUkVQT30vcmVsZWFzZXMvZG93bmxvYWQvdiR7UEFDS0FHRV9WRVJTSU9OfS9kb2xsaG91c2VtY3AtJHtQQUNLQUdFX1ZFUlNJT059Lm1jcGJgO1xuICAgIHJlcy5yZWRpcmVjdCh1cmwpO1xuICB9O1xuXG4gIC8vIOKUgOKUgCBMaWNlbnNlIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29uc3QgbGljZW5zZUNvbmZpZ1BhdGggPSBqb2luKGhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAnbGljZW5zZS5qc29uJyk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVhZExpY2Vuc2UoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkRmlsZShsaWNlbnNlQ29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgdGllcjogJ2FncGwnIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVMaWNlbnNlKGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGlyID0gam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJyk7XG4gICAgYXdhaXQgbWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUobGljZW5zZUNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpLCB7IG1vZGU6IDBvNjAwIH0pO1xuICB9XG5cbiAgY29uc3QgZ2V0TGljZW5zZUhhbmRsZXIgPSBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGxpY2Vuc2UgPSBhd2FpdCByZWFkTGljZW5zZSgpO1xuICAgIC8vIE5ldmVyIGV4cG9zZSB2ZXJpZmljYXRpb24gaW50ZXJuYWxzIHRvIGNsaWVudFxuICAgIGNvbnN0IHsgdmVyaWZpY2F0aW9uQ29kZTogX2NvZGUsIHZlcmlmaWNhdGlvbkF0dGVtcHRzOiBfYXR0ZW1wdHMsIC4uLnB1YmxpY0xpY2Vuc2UgfSA9IGxpY2Vuc2U7XG4gICAgcmVzLmpzb24ocHVibGljTGljZW5zZSk7XG4gIH07XG5cbiAgY29uc3QgbGljZW5zZVJhdGVMaW1pdGVyID0gbmV3IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlcig1LCA2MF8wMDApOyAvLyA1IHJlcXVlc3RzL21pbnV0ZVxuXG4gIGNvbnN0IHNldExpY2Vuc2VIYW5kbGVyID0gYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghbGljZW5zZVJhdGVMaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnc2V0dXBSb3V0ZXMuc2V0TGljZW5zZUhhbmRsZXInLFxuICAgICAgICBkZXRhaWxzOiAnTGljZW5zZSBlbmRwb2ludCByYXRlIGxpbWl0IGV4Y2VlZGVkICg1IHJlcS9taW4pJyxcbiAgICAgIH0pO1xuICAgICAgcmVzLnN0YXR1cyg0MjkpLmpzb24oeyBlcnJvcjogJ1RvbyBtYW55IGxpY2Vuc2UgcmVxdWVzdHMuIFBsZWFzZSB0cnkgYWdhaW4gaW4gYSBtaW51dGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gcmVxLmJvZHkgPz8ge307XG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGVMaWNlbnNlSW5wdXQoYm9keSk7XG4gICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogdmFsaWRhdGlvbkVycm9yIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpY2Vuc2VEYXRhID0gYnVpbGRMaWNlbnNlRGF0YShib2R5KTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAobGljZW5zZURhdGEudGllciA9PT0gJ2FncGwnKSB7XG4gICAgICAgIC8vIEFHUEw6IGFjdGl2YXRlIGltbWVkaWF0ZWx5LCBubyB2ZXJpZmljYXRpb24gbmVlZGVkXG4gICAgICAgIGxpY2Vuc2VEYXRhLnN0YXR1cyA9ICdhY3RpdmUnO1xuICAgICAgICBhd2FpdCB3cml0ZUxpY2Vuc2UobGljZW5zZURhdGEpO1xuICAgICAgICBsb2dnZXIuaW5mbygnW1NldHVwXSBMaWNlbnNlIHNldCB0byBBR1BMIChhY3RpdmUsIG5vIHZlcmlmaWNhdGlvbiknKTtcbiAgICAgICAgcmVzLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBsaWNlbnNlOiBsaWNlbnNlRGF0YSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDb21tZXJjaWFsIHRpZXJzOiBzYXZlIGFzIHBlbmRpbmcsIGdlbmVyYXRlIHZlcmlmaWNhdGlvbiBjb2RlXG4gICAgICBjb25zdCBjb2RlID0gZ2VuZXJhdGVWZXJpZmljYXRpb25Db2RlKCk7XG4gICAgICBsaWNlbnNlRGF0YS5zdGF0dXMgPSAncGVuZGluZyc7XG4gICAgICBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25Db2RlID0gY29kZTtcbiAgICAgIGxpY2Vuc2VEYXRhLnZlcmlmaWNhdGlvbkV4cGlyeSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBWRVJJRklDQVRJT05fQ09ERV9UVExfTVMpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25BdHRlbXB0cyA9IDA7XG4gICAgICBsaWNlbnNlRGF0YS52ZXJpZmljYXRpb25SZXF1ZXN0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHdyaXRlTGljZW5zZShsaWNlbnNlRGF0YSk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIExpY2Vuc2UgcGVuZGluZyB2ZXJpZmljYXRpb246ICR7bGljZW5zZURhdGEudGllcn0gKCR7bGljZW5zZURhdGEuZW1haWx9KWApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05GSUdfVVBEQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnc2V0dXBSb3V0ZXMuc2V0TGljZW5zZUhhbmRsZXInLFxuICAgICAgICBkZXRhaWxzOiBgTGljZW5zZSB2ZXJpZmljYXRpb24gaW5pdGlhdGVkOiAke2xpY2Vuc2VEYXRhLnRpZXJ9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICB0aWVyOiBsaWNlbnNlRGF0YS50aWVyLFxuICAgICAgICAgIGVtYWlsOiBsaWNlbnNlRGF0YS5lbWFpbCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZW5kIHZlcmlmaWNhdGlvbiBlbWFpbCBkaXJlY3RseSB0byBXb3JrZXIgZm9yIGluc3RhbnQgZGVsaXZlcnkuXG4gICAgICAvLyBQb3N0SG9nIGV2ZW50IGFsc28gZmlyZXMgZm9yIGFuYWx5dGljcywgYnV0IHRoZSBlbWFpbCBjYW4ndCB3YWl0IGZvclxuICAgICAgLy8gUG9zdEhvZydzIGV2ZW50IHBpcGVsaW5lICgxLTUgbWluIGRlbGF5KS5cbiAgICAgIGNvbnN0IGRlbGl2ZXJ5UmVzdWx0ID0gYXdhaXQgc2VuZExpY2Vuc2VXb3JrZXJWZXJpZmljYXRpb25FbWFpbChsaWNlbnNlRGF0YSwgY29kZSwgJ2RpcmVjdC12ZXJpZmljYXRpb24nKTtcbiAgICAgIGlmIChkZWxpdmVyeVJlc3VsdC5vaykge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW1NldHVwXSBWZXJpZmljYXRpb24gZW1haWwgc2VudCBkaXJlY3RseSB2aWEgV29ya2VyOiAke2xpY2Vuc2VEYXRhLmVtYWlsfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nTGljZW5zZVdvcmtlckRlbGl2ZXJ5RmFpbHVyZSgnW1NldHVwXSBWZXJpZmljYXRpb24gZW1haWwgZGVsaXZlcnkgZmFpbGVkJywgbGljZW5zZURhdGEsIGRlbGl2ZXJ5UmVzdWx0KTtcblxuICAgICAgICBjb25zdCB7IHZlcmlmaWNhdGlvbkNvZGU6IF9jLCB2ZXJpZmljYXRpb25BdHRlbXB0czogX2EsIC4uLnB1YmxpY0RhdGEgfSA9IGxpY2Vuc2VEYXRhO1xuICAgICAgICByZXMuc3RhdHVzKDUwMikuanNvbih7XG4gICAgICAgICAgZXJyb3I6IGdldExpY2Vuc2VXb3JrZXJGYWlsdXJlTWVzc2FnZShkZWxpdmVyeVJlc3VsdCksXG4gICAgICAgICAgdmVyaWZpY2F0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgbGljZW5zZTogcHVibGljRGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQWxzbyBmaXJlIFBvc3RIb2cgZXZlbnQgZm9yIGFuYWx5dGljcyAobm9uLWJsb2NraW5nLCBkZWxheSBpcyBmaW5lKVxuICAgICAgY2FwdHVyZVBvc3RIb2dMaWNlbnNlRXZlbnQoeyAuLi5saWNlbnNlRGF0YSwgdmVyaWZpY2F0aW9uQ29kZTogY29kZSwgZXZlbnRUeXBlOiAndmVyaWZpY2F0aW9uJyB9KS5jYXRjaChcbiAgICAgICAgKGVycikgPT4gbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIFBvc3RIb2cgY2FwdHVyZSBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApLFxuICAgICAgKTtcblxuICAgICAgLy8gUmV0dXJuIHN1Y2Nlc3Mgd2l0aG91dCBleHBvc2luZyB0aGUgY29kZVxuICAgICAgY29uc3QgeyB2ZXJpZmljYXRpb25Db2RlOiBfYywgdmVyaWZpY2F0aW9uQXR0ZW1wdHM6IF9hLCAuLi5wdWJsaWNEYXRhIH0gPSBsaWNlbnNlRGF0YTtcbiAgICAgIHJlcy5qc29uKHsgc3VjY2VzczogdHJ1ZSwgbGljZW5zZTogcHVibGljRGF0YSwgdmVyaWZpY2F0aW9uUmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW1NldHVwXSBGYWlsZWQgdG8gc2F2ZSBsaWNlbnNlJywgeyBlcnJvciB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6ICdGYWlsZWQgdG8gc2F2ZSBsaWNlbnNlIGNvbmZpZ3VyYXRpb24nIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB2ZXJpZnlSYXRlTGltaXRlciA9IG5ldyBTbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIoNSwgNjBfMDAwKTsgLy8gNSBhdHRlbXB0cy9taW51dGVcblxuICBjb25zdCB2ZXJpZnlMaWNlbnNlSGFuZGxlciA9IGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIXZlcmlmeVJhdGVMaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnc2V0dXBSb3V0ZXMudmVyaWZ5TGljZW5zZUhhbmRsZXInLFxuICAgICAgICBkZXRhaWxzOiAnVmVyaWZpY2F0aW9uIGVuZHBvaW50IHJhdGUgbGltaXQgZXhjZWVkZWQgKDUgcmVxL21pbiknLFxuICAgICAgfSk7XG4gICAgICByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnVG9vIG1hbnkgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBQbGVhc2UgdHJ5IGFnYWluIGluIGEgbWludXRlLicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSByZXEuYm9keSA/PyB7fTtcbiAgICBpZiAoIWNvZGUgfHwgdHlwZW9mIGNvZGUgIT09ICdzdHJpbmcnIHx8ICEvXlxcZHs2fSQvLnRlc3QoY29kZSkpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCA2LWRpZ2l0IHZlcmlmaWNhdGlvbiBjb2RlJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaWNlbnNlID0gYXdhaXQgcmVhZExpY2Vuc2UoKTtcbiAgICBpZiAobGljZW5zZS5zdGF0dXMgIT09ICdwZW5kaW5nJykge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ05vIHBlbmRpbmcgbGljZW5zZSB2ZXJpZmljYXRpb24uIFBsZWFzZSBzdWJtaXQgdGhlIGxpY2Vuc2UgZm9ybSBmaXJzdC4nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGV4cGlyeVxuICAgIGlmICghbGljZW5zZS52ZXJpZmljYXRpb25FeHBpcnkgfHwgaXNDb2RlRXhwaXJlZChsaWNlbnNlLnZlcmlmaWNhdGlvbkV4cGlyeSBhcyBzdHJpbmcpKSB7XG4gICAgICBsaWNlbnNlLnN0YXR1cyA9ICdleHBpcmVkJztcbiAgICAgIGF3YWl0IHdyaXRlTGljZW5zZShsaWNlbnNlKTtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdWZXJpZmljYXRpb24gY29kZSBoYXMgZXhwaXJlZC4gUGxlYXNlIHN1Ym1pdCB0aGUgZm9ybSBhZ2FpbiB0byByZWNlaXZlIGEgbmV3IGNvZGUuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBtYXggYXR0ZW1wdHNcbiAgICBjb25zdCBhdHRlbXB0cyA9ICgobGljZW5zZS52ZXJpZmljYXRpb25BdHRlbXB0cyBhcyBudW1iZXIpID8/IDApICsgMTtcbiAgICBpZiAoYXR0ZW1wdHMgPiBWRVJJRklDQVRJT05fTUFYX0FUVEVNUFRTKSB7XG4gICAgICBsaWNlbnNlLnN0YXR1cyA9ICdleHBpcmVkJztcbiAgICAgIGF3YWl0IHdyaXRlTGljZW5zZShsaWNlbnNlKTtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdzZXR1cFJvdXRlcy52ZXJpZnlMaWNlbnNlSGFuZGxlcicsXG4gICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gbWF4IGF0dGVtcHRzIGV4Y2VlZGVkIGZvcjogJHtsaWNlbnNlLmVtYWlsfWAsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdUb28gbWFueSBmYWlsZWQgYXR0ZW1wdHMuIFBsZWFzZSBzdWJtaXQgdGhlIGZvcm0gYWdhaW4gdG8gcmVjZWl2ZSBhIG5ldyBjb2RlLicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY29kZVxuICAgIGlmIChjb2RlICE9PSBsaWNlbnNlLnZlcmlmaWNhdGlvbkNvZGUpIHtcbiAgICAgIGxpY2Vuc2UudmVyaWZpY2F0aW9uQXR0ZW1wdHMgPSBhdHRlbXB0cztcbiAgICAgIGF3YWl0IHdyaXRlTGljZW5zZShsaWNlbnNlKTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IFZFUklGSUNBVElPTl9NQVhfQVRURU1QVFMgLSBhdHRlbXB0cztcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6IGBJbmNvcnJlY3QgdmVyaWZpY2F0aW9uIGNvZGUuICR7cmVtYWluaW5nfSBhdHRlbXB0JHtyZW1haW5pbmcgPT09IDEgPyAnJyA6ICdzJ30gcmVtYWluaW5nLmAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29kZSBpcyBjb3JyZWN0IOKAlCBhY3RpdmF0ZSBsaWNlbnNlXG4gICAgY29uc3QgdmVyaWZpZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICBjb25zdCByZXF1ZXN0ZWRBdCA9IGxpY2Vuc2UudmVyaWZpY2F0aW9uUmVxdWVzdGVkQXQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRpbWVUb1ZlcmlmeU1zID0gcmVxdWVzdGVkQXQgPyBEYXRlLm5vdygpIC0gbmV3IERhdGUocmVxdWVzdGVkQXQpLmdldFRpbWUoKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBhdHRlbXB0c1VzZWQgPSAoKGxpY2Vuc2UudmVyaWZpY2F0aW9uQXR0ZW1wdHMgYXMgbnVtYmVyKSA/PyAwKSArIDE7XG5cbiAgICBsaWNlbnNlLnN0YXR1cyA9ICdhY3RpdmUnO1xuICAgIGxpY2Vuc2UudmVyaWZpZWRBdCA9IHZlcmlmaWVkQXQ7XG4gICAgZGVsZXRlIGxpY2Vuc2UudmVyaWZpY2F0aW9uQ29kZTtcbiAgICBkZWxldGUgbGljZW5zZS52ZXJpZmljYXRpb25FeHBpcnk7XG4gICAgZGVsZXRlIGxpY2Vuc2UudmVyaWZpY2F0aW9uQXR0ZW1wdHM7XG4gICAgZGVsZXRlIGxpY2Vuc2UudmVyaWZpY2F0aW9uUmVxdWVzdGVkQXQ7XG4gICAgYXdhaXQgd3JpdGVMaWNlbnNlKGxpY2Vuc2UpO1xuXG4gICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gTGljZW5zZSB2ZXJpZmllZCBhbmQgYWN0aXZhdGVkOiAke2xpY2Vuc2UudGllcn0gKCR7bGljZW5zZS5lbWFpbH0pIOKAlCAke3RpbWVUb1ZlcmlmeU1zID8gTWF0aC5yb3VuZCh0aW1lVG9WZXJpZnlNcyAvIDEwMDApICsgJ3MnIDogJ3Vua25vd24nfSwgJHthdHRlbXB0c1VzZWR9IGF0dGVtcHQocylgKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdDT05GSUdfVVBEQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdzZXR1cFJvdXRlcy52ZXJpZnlMaWNlbnNlSGFuZGxlcicsXG4gICAgICBkZXRhaWxzOiBgTGljZW5zZSBhY3RpdmF0ZWQgYWZ0ZXIgZW1haWwgdmVyaWZpY2F0aW9uOiAke2xpY2Vuc2UudGllcn1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHsgdGllcjogbGljZW5zZS50aWVyLCBlbWFpbDogbGljZW5zZS5lbWFpbCB9LFxuICAgIH0pO1xuXG4gICAgLy8gU2VuZCBjb25maXJtYXRpb24gZW1haWwgKyBQb3N0SG9nIGFjdGl2YXRpb24gZXZlbnQgd2l0aCBhbmFseXRpY3NcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2FwdHVyZVBvc3RIb2dMaWNlbnNlRXZlbnQoe1xuICAgICAgICAuLi5saWNlbnNlLFxuICAgICAgICBldmVudFR5cGU6ICdhY3RpdmF0aW9uJyxcbiAgICAgICAgdmVyaWZpY2F0aW9uX3RpbWVfbXM6IHRpbWVUb1ZlcmlmeU1zLFxuICAgICAgICB2ZXJpZmljYXRpb25fYXR0ZW1wdHM6IGF0dGVtcHRzVXNlZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uX21ldGhvZDogY29kZS5sZW5ndGggPT09IDYgPyAnY29kZV9vcl9jbGljaycgOiAndW5rbm93bicsXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIExpY2Vuc2UgYWN0aXZhdGlvbiBldmVudCBzZW50IHRvIFBvc3RIb2c6ICR7bGljZW5zZS50aWVyfWApO1xuICAgIH0gY2F0Y2ggKHBvc3Rob2dFcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIFBvc3RIb2cgY2FwdHVyZSBmYWlsZWQ6ICR7cG9zdGhvZ0Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBwb3N0aG9nRXJyb3IubWVzc2FnZSA6IFN0cmluZyhwb3N0aG9nRXJyb3IpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdmVyaWZpY2F0aW9uQ29kZTogX2MsIHZlcmlmaWNhdGlvbkF0dGVtcHRzOiBfYSwgdmVyaWZpY2F0aW9uRXhwaXJ5OiBfZSwgLi4ucHVibGljTGljZW5zZSB9ID0gbGljZW5zZTtcbiAgICByZXMuanNvbih7IHN1Y2Nlc3M6IHRydWUsIGxpY2Vuc2U6IHB1YmxpY0xpY2Vuc2UgfSk7XG4gIH07XG5cbiAgY29uc3QgcmVzZW5kUmF0ZUxpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKDMsIDEyMF8wMDApOyAvLyAzIHJlc2VuZHMgcGVyIDIgbWludXRlc1xuXG4gIGNvbnN0IHJlc2VuZFZlcmlmaWNhdGlvbkhhbmRsZXIgPSBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghcmVzZW5kUmF0ZUxpbWl0ZXIudHJ5QWNxdWlyZSgpKSB7XG4gICAgICByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnUGxlYXNlIHdhaXQgYmVmb3JlIHJlcXVlc3RpbmcgYW5vdGhlciBjb2RlLicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGljZW5zZSA9IGF3YWl0IHJlYWRMaWNlbnNlKCk7XG4gICAgaWYgKGxpY2Vuc2Uuc3RhdHVzICE9PSAncGVuZGluZycgJiYgbGljZW5zZS5zdGF0dXMgIT09ICdleHBpcmVkJykge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ05vIHBlbmRpbmcgbGljZW5zZSB2ZXJpZmljYXRpb24uJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBuZXcgY29kZSBhbmQgcmVzZXRcbiAgICBjb25zdCBjb2RlID0gZ2VuZXJhdGVWZXJpZmljYXRpb25Db2RlKCk7XG4gICAgbGljZW5zZS5zdGF0dXMgPSAncGVuZGluZyc7XG4gICAgbGljZW5zZS52ZXJpZmljYXRpb25Db2RlID0gY29kZTtcbiAgICBsaWNlbnNlLnZlcmlmaWNhdGlvbkV4cGlyeSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBWRVJJRklDQVRJT05fQ09ERV9UVExfTVMpLnRvSVNPU3RyaW5nKCk7XG4gICAgbGljZW5zZS52ZXJpZmljYXRpb25BdHRlbXB0cyA9IDA7XG4gICAgYXdhaXQgd3JpdGVMaWNlbnNlKGxpY2Vuc2UpO1xuXG4gICAgLy8gU2VuZCB2ZXJpZmljYXRpb24gZW1haWwgZGlyZWN0bHkgdG8gV29ya2VyIGZvciBpbnN0YW50IGRlbGl2ZXJ5XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlbGl2ZXJ5UmVzdWx0ID0gYXdhaXQgc2VuZExpY2Vuc2VXb3JrZXJWZXJpZmljYXRpb25FbWFpbChsaWNlbnNlLCBjb2RlLCAnZGlyZWN0LXJlc2VuZCcpO1xuICAgICAgaWYgKCFkZWxpdmVyeVJlc3VsdC5vaykge1xuICAgICAgICBsb2dMaWNlbnNlV29ya2VyRGVsaXZlcnlGYWlsdXJlKCdbU2V0dXBdIFZlcmlmaWNhdGlvbiByZXNlbmQgZGVsaXZlcnkgZmFpbGVkJywgbGljZW5zZSwgZGVsaXZlcnlSZXN1bHQpO1xuICAgICAgICByZXMuc3RhdHVzKDUwMikuanNvbih7XG4gICAgICAgICAgZXJyb3I6IGdldExpY2Vuc2VXb3JrZXJGYWlsdXJlTWVzc2FnZShkZWxpdmVyeVJlc3VsdCksXG4gICAgICAgICAgdmVyaWZpY2F0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIFZlcmlmaWNhdGlvbiBjb2RlIHJlc2VudCBkaXJlY3RseSB2aWEgV29ya2VyOiAke2xpY2Vuc2UuZW1haWx9YCk7XG4gICAgfSBjYXRjaCAod29ya2VyRXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW1NldHVwXSBVbmV4cGVjdGVkIHZlcmlmaWNhdGlvbiByZXNlbmQgZmFpbHVyZScsIHtcbiAgICAgICAgZW1haWw6IGxpY2Vuc2UuZW1haWwsXG4gICAgICAgIGVycm9yOiB3b3JrZXJFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gd29ya2VyRXJyb3IubWVzc2FnZSA6IFN0cmluZyh3b3JrZXJFcnJvciksXG4gICAgICB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6ICdGYWlsZWQgdG8gcmVzZW5kIHZlcmlmaWNhdGlvbiBjb2RlLicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBtZXNzYWdlOiAnQSBuZXcgdmVyaWZpY2F0aW9uIGNvZGUgaGFzIGJlZW4gc2VudCB0byB5b3VyIGVtYWlsLicgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHsgaW5zdGFsbEhhbmRsZXIsIG9wZW5Db25maWdIYW5kbGVyLCB2ZXJzaW9uSGFuZGxlciwgbWNwYlJlZGlyZWN0SGFuZGxlciwgZGV0ZWN0SGFuZGxlciwgZ2V0TGljZW5zZUhhbmRsZXIsIHNldExpY2Vuc2VIYW5kbGVyLCB2ZXJpZnlMaWNlbnNlSGFuZGxlciwgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlciB9O1xufVxuXG4vLyDilIDilIAgSW5zdGFsbCBhbmFseXRpY3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmlyZS1hbmQtZm9yZ2V0IFBvc3RIb2cgZXZlbnQgZm9yIGluc3RhbGxhdGlvbiBhbmFseXRpY3MuXG4gKiBVc2VzIHRoZSBzYW1lIGluc3RhbGwgSUQgYXMgdGhlIGxpY2Vuc2UgdGVsZW1ldHJ5IHN5c3RlbS5cbiAqIFNpbGVudGx5IHN3YWxsb3dzIGFsbCBlcnJvcnMg4oCUIGFuYWx5dGljcyBtdXN0IG5ldmVyIGJyZWFrIGluc3RhbGxzLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlSW5zdGFsbEFuYWx5dGljcyhldmVudDogc3RyaW5nLCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICBjb25zdCBwb3N0aG9nID0gbmV3IFBvc3RIb2coUE9TVEhPR19QUk9KRUNUX0tFWSwge1xuICAgIGhvc3Q6IHByb2Nlc3MuZW52LlBPU1RIT0dfSE9TVCB8fCAnaHR0cHM6Ly9hcHAucG9zdGhvZy5jb20nLFxuICAgIGZsdXNoQXQ6IDEsXG4gICAgZmx1c2hJbnRlcnZhbDogNTAwMCxcbiAgfSk7XG4gIHJlYWRGaWxlKGpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICcudGVsZW1ldHJ5LWlkJyksICd1dGYtOCcpXG4gICAgLnRoZW4oaWQgPT4gaWQudHJpbSgpKVxuICAgIC5jYXRjaCgoKSA9PiAnYW5vbnltb3VzJylcbiAgICAudGhlbihpbnN0YWxsSWQgPT4ge1xuICAgICAgcG9zdGhvZy5jYXB0dXJlKHsgZGlzdGluY3RJZDogaW5zdGFsbElkLCBldmVudCwgcHJvcGVydGllcyB9KTtcbiAgICAgIHJldHVybiBwb3N0aG9nLnNodXRkb3duKCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKCkgPT4geyAvKiB0ZWxlbWV0cnkgbXVzdCBuZXZlciB0aHJvdyAqLyB9KTtcbn1cblxuLy8g4pSA4pSAIE5WTSBtaXRpZ2F0aW9uIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDbGF1ZGUgRGVza3RvcCBoYXMgYSBidWcgd2hlcmUgaXQgc2NhbnMgfi8ubnZtL3ZlcnNpb25zL25vZGUvLCBidWlsZHMgYSBQQVRIXG4vLyBmcm9tIGFsbCBpbnN0YWxsZWQgdmVyc2lvbnMgaW4gYXNjZW5kaW5nIG9yZGVyIChvbGRlc3QgZmlyc3QpLCBhbmQgcnVucyBucHhcbi8vIHVuZGVyIGFuIG91dGRhdGVkIE5vZGUgZXZlbiB3aGVuIGEgbmV3ZXIgdmVyc2lvbiBpcyBpbnN0YWxsZWQgYW5kIHNlbGVjdGVkLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXIvaXNzdWVzLzE5MDJcbi8vXG4vLyBGaXg6IHdoZW4gTlZNIGlzIHByZXNlbnQsIGNyZWF0ZSBhIHNtYWxsIGJhc2ggbGF1bmNoZXIgdGhhdCBpbml0aWFsaXNlcyBOVk1cbi8vIHByb3Blcmx5IGJlZm9yZSBkZWxlZ2F0aW5nIHRvIG5weCwgdGhlbiBwYXRjaCB0aGUgd3JpdHRlbiBNQ1AgY2xpZW50IGNvbmZpZ1xuLy8gdG8gdXNlIHRoYXQgbGF1bmNoZXIgaW5zdGVhZCBvZiBiYXJlIGBucHhgLlxuXG4vKiogUmVzdWx0IG9mIGF0dGVtcHRpbmcgdG8gYXBwbHkgdGhlIE5WTSBsYXVuY2hlciBtaXRpZ2F0aW9uLiAqL1xuZXhwb3J0IHR5cGUgTnZtTGF1bmNoZXJSZXN1bHQgPSAnYXBwbGllZCcgfCAnbm90LWFwcGxpY2FibGUnIHwgJ2ZhaWxlZCc7XG5cbi8qKiBKU09OLWZvcm1hdCBjbGllbnRzIGVsaWdpYmxlIGZvciBOVk0gbGF1bmNoZXIgcmVwYWlyIG9uIHN0YXJ0dXAuICovXG5jb25zdCBKU09OX0ZPUk1BVF9DTElFTlRTID0gW1xuICAnY2xhdWRlJywgJ2NsYXVkZS1jb2RlJywgJ2N1cnNvcicsICd3aW5kc3VyZicsICdsbXN0dWRpbycsICdnZW1pbmktY2xpJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogT3JjaGVzdHJhdGVzIHRoZSBOVk0gbWl0aWdhdGlvbjogZGV0ZWN0IOKGkiBjcmVhdGUgbGF1bmNoZXIg4oaSIHBhdGNoIGNvbmZpZyDihpIgdGVsZW1ldHJ5LlxuICogRXh0cmFjdGVkIGZyb20gaW5zdGFsbEhhbmRsZXIgdG8ga2VlcCBpdHMgY29nbml0aXZlIGNvbXBsZXhpdHkgd2l0aGluIFNvbmFyQ2xvdWQgbGltaXRzLlxuICogUmV0dXJucyBhIHJlc3VsdCBlbnVtIHJhdGhlciB0aGFuIHRocm93aW5nIHNvIHRoZSBjYWxsZXIgYWx3YXlzIGdldHMgYSBjbGVhbiBzaWduYWwuXG4gKlxuICogQHBhcmFtIGhvbWUgLSBPdmVycmlkZSBob21lIGRpcmVjdG9yeSAoaW5qZWN0YWJsZSBmb3IgdGVzdHMpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU52bUxhdW5jaGVySWZOZWVkZWQoY2xpZW50OiBzdHJpbmcsIGhvbWUgPSBob21lZGlyKCkpOiBQcm9taXNlPE52bUxhdW5jaGVyUmVzdWx0PiB7XG4gIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBOVk0gbWl0aWdhdGlvbiBjaGVjayBmb3IgY2xpZW50OiAke2NsaWVudH1gKTtcbiAgaWYgKCFhd2FpdCBpc052bVByZXNlbnQoaG9tZSkpIHtcbiAgICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gTlZNIG5vdCBwcmVzZW50IOKAlCBza2lwcGluZyBsYXVuY2hlciBtaXRpZ2F0aW9uIGZvciAke2NsaWVudH1gKTtcbiAgICBjYXB0dXJlSW5zdGFsbEFuYWx5dGljcygnbnZtX2xhdW5jaGVyX25vdF9hcHBsaWNhYmxlJywgeyBjbGllbnQsIHBsYXRmb3JtOiBwbGF0Zm9ybSgpIH0pO1xuICAgIHJldHVybiAnbm90LWFwcGxpY2FibGUnO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgd3JhcHBlclBhdGggPSBhd2FpdCBlbnN1cmVOdm1MYXVuY2hlcihob21lKTtcbiAgICBhd2FpdCBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyKGNsaWVudCwgd3JhcHBlclBhdGgpO1xuICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIE5WTS1hd2FyZSBsYXVuY2hlciBhcHBsaWVkIGZvciAke2NsaWVudH1gKTtcbiAgICBjYXB0dXJlSW5zdGFsbEFuYWx5dGljcygnbnZtX2xhdW5jaGVyX2FwcGxpZWQnLCB7IGNsaWVudCwgcGxhdGZvcm06IHBsYXRmb3JtKCkgfSk7XG4gICAgcmV0dXJuICdhcHBsaWVkJztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFtTZXR1cF0gTlZNIGxhdW5jaGVyIHNldHVwIGZhaWxlZCAobm9uLWZhdGFsKTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG4gICAgY2FwdHVyZUluc3RhbGxBbmFseXRpY3MoJ252bV9sYXVuY2hlcl9mYWlsZWQnLCB7XG4gICAgICBjbGllbnQsXG4gICAgICBwbGF0Zm9ybTogcGxhdGZvcm0oKSxcbiAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnR1cCByZXBhaXI6IHJlLWNyZWF0ZXMgdGhlIHdyYXBwZXIgYW5kIHJlLXBhdGNoZXMgYWxsIGtub3duIEpTT04tZm9ybWF0XG4gKiBjbGllbnQgY29uZmlncyBvbiBldmVyeSBzZXJ2ZXIgc3RhcnQuIEhhbmRsZXMgdHdvIGNhc2VzOlxuICogICAxLiBXcmFwcGVyIHdhcyBkZWxldGVkIOKAlCByZWNyZWF0ZXMgaXQgc28gY29uZmlncyBwb2ludGluZyB0byBpdCBrZWVwIHdvcmtpbmcuXG4gKiAgIDIuIFByZS1leGlzdGluZyBpbnN0YWxsICh1c2VyIGluc3RhbGxlZCBiZWZvcmUgdGhpcyBmaXggc2hpcHBlZCkg4oCUIHBhdGNoZXNcbiAqICAgICAgY29uZmlncyB0aGF0IHN0aWxsIHVzZSBiYXJlIGBucHhgLlxuICpcbiAqIEZpcmUtYW5kLWZvcmdldCBmcm9tIHN0YXJ0V2ViU2VydmVyLiBBbGwgZXJyb3JzIGFyZSBzd2FsbG93ZWQgYW5kIGxvZ2dlZC5cbiAqXG4gKiBAcGFyYW0gaG9tZSAgICAgICAgICAgICAgIC0gT3ZlcnJpZGUgaG9tZSBkaXJlY3RvcnkgKGluamVjdGFibGUgZm9yIHRlc3RzKVxuICogQHBhcmFtIGNvbmZpZ1BhdGhSZXNvbHZlciAtIE92ZXJyaWRlIGNvbmZpZyBwYXRoIGxvb2t1cCAoaW5qZWN0YWJsZSBmb3IgdGVzdHMpLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybiBudWxsIHRvIHNraXAgYSBjbGllbnQgZW50aXJlbHkuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gdGhlIHByb2R1Y3Rpb24gZ2V0Q29uZmlnUGF0aC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcGFpck52bUxhdW5jaGVyT25TdGFydHVwKFxuICBob21lID0gaG9tZWRpcigpLFxuICBjb25maWdQYXRoUmVzb2x2ZXI6IChjbGllbnQ6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbCA9IGdldENvbmZpZ1BhdGgsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHBsYXRmb3JtKCkgPT09ICd3aW4zMicpIHJldHVybjtcbiAgbG9nZ2VyLmRlYnVnKCdbU2V0dXBdIE5WTSBsYXVuY2hlciBzdGFydHVwIHJlcGFpcjogY2hlY2tpbmcgZm9yIE5WTS4uLicpO1xuICBpZiAoIWF3YWl0IGlzTnZtUHJlc2VudChob21lKSkge1xuICAgIGxvZ2dlci5kZWJ1ZygnW1NldHVwXSBOVk0gbGF1bmNoZXIgc3RhcnR1cCByZXBhaXI6IE5WTSBub3QgcHJlc2VudCDigJQgbm90aGluZyB0byByZXBhaXInKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgd3JhcHBlclBhdGg6IHN0cmluZztcbiAgdHJ5IHtcbiAgICB3cmFwcGVyUGF0aCA9IGF3YWl0IGVuc3VyZU52bUxhdW5jaGVyKGhvbWUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgW1NldHVwXSBOVk0gc3RhcnR1cCByZXBhaXI6IGNvdWxkIG5vdCBjcmVhdGUgbGF1bmNoZXI6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICBKU09OX0ZPUk1BVF9DTElFTlRTLm1hcChjbGllbnQgPT4ge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGNvbmZpZ1BhdGhSZXNvbHZlcihjbGllbnQpO1xuICAgICAgaWYgKCFjb25maWdQYXRoKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIHJlc29sdmVyIHJldHVybmVkIG51bGwg4oCUIHNraXAgdGhpcyBjbGllbnRcbiAgICAgIHJldHVybiBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyKGNsaWVudCwgd3JhcHBlclBhdGgsIGNvbmZpZ1BhdGgpXG4gICAgICAgIC5jYXRjaChlcnIgPT5cbiAgICAgICAgICBsb2dnZXIud2FybihgW1NldHVwXSBOVk0gc3RhcnR1cCByZXBhaXI6IGZhaWxlZCB0byBwYXRjaCAke2NsaWVudH06ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApXG4gICAgICAgICk7XG4gICAgfSlcbiAgKTtcblxuICBsb2dnZXIuaW5mbygnW1NldHVwXSBOVk0gbGF1bmNoZXIgc3RhcnR1cCByZXBhaXIgY29tcGxldGUnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgTlZNIGlzIGluc3RhbGxlZCBvbiB0aGlzIG1hY2hpbmUgKG1hY09TL0xpbnV4IG9ubHkpLlxuICogQ2hlY2tzIHByb2Nlc3MuZW52Lk5WTV9ESVIgZmlyc3QgKGhhbmRsZXMgbm9uLXN0YW5kYXJkIGluc3RhbGwgbG9jYXRpb25zKSxcbiAqIHRoZW4gZmFsbHMgYmFjayB0byB+Ly5udm0uXG4gKlxuICogQHBhcmFtIGhvbWUgLSBPdmVycmlkZSBob21lIGRpcmVjdG9yeSAoZGVmYXVsdHMgdG8gb3MuaG9tZWRpcigpOyBpbmplY3RhYmxlIGZvciB0ZXN0cylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzTnZtUHJlc2VudChob21lID0gaG9tZWRpcigpKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChwbGF0Zm9ybSgpID09PSAnd2luMzInKSByZXR1cm4gZmFsc2U7XG4gIC8vIENoZWNrIGNhbmRpZGF0ZXMgaW4gb3JkZXI6IGVudiB2YXIgb3ZlcnJpZGUg4oaSIGRlZmF1bHQgbG9jYXRpb25cbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICBwcm9jZXNzLmVudi5OVk1fRElSLFxuICAgIGpvaW4oaG9tZSwgJy5udm0nKSxcbiAgXS5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG4gIGZvciAoY29uc3QgZGlyIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWNjZXNzKGpvaW4oZGlyLCAnbnZtLnNoJykpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIE5WTSBkZXRlY3RlZCBhdDogJHtkaXJ9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHsgLyogdHJ5IG5leHQgY2FuZGlkYXRlICovIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gTlZNIG5vdCBmb3VuZCAoY2hlY2tlZDogJHtjYW5kaWRhdGVzLmpvaW4oJywgJyl9KWApO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIE5WTSBkaXJlY3Rvcnk6IHByb2Nlc3MuZW52Lk5WTV9ESVIgaWYgc2V0LCBvdGhlcndpc2Ugfi8ubnZtLlxuICogVXNlZCB0byBoYXJkY29kZSB0aGUgcGF0aCBpbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgc28gaXQgd29ya3MgZXZlbiB3aGVuXG4gKiBDbGF1ZGUgRGVza3RvcCBkb2VzIG5vdCBzb3VyY2UgdGhlIHVzZXIncyBzaGVsbCBwcm9maWxlLlxuICpcbiAqIHByb2Nlc3MuZW52Lk5WTV9ESVIgaXMgdmFsaWRhdGVkIGJlZm9yZSB1c2UgdG8gcHJldmVudCBzaGVsbCBpbmplY3Rpb24gaW5cbiAqIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBzY3JpcHQgKG9ubHkgYWJzb2x1dGUgcGF0aHMgd2l0aCBzYWZlIGNoYXJhY3RlcnMgYXJlXG4gKiBhY2NlcHRlZDsgdW5zYWZlIHZhbHVlcyBmYWxsIGJhY2sgdG8gfi8ubnZtKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU52bURpcihob21lID0gaG9tZWRpcigpKTogc3RyaW5nIHtcbiAgY29uc3QgZW52RGlyID0gcHJvY2Vzcy5lbnYuTlZNX0RJUjtcbiAgaWYgKGVudkRpciAmJiAvXlxcL1tcXHcuL34tXSskLy50ZXN0KGVudkRpcikpIHtcbiAgICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gTlZNIGRpciByZXNvbHZlZCBmcm9tIE5WTV9ESVIgZW52IHZhcjogJHtlbnZEaXJ9YCk7XG4gICAgcmV0dXJuIGVudkRpcjtcbiAgfVxuICBpZiAoZW52RGlyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIE5WTV9ESVIgZW52IHZhciByZWplY3RlZCAodW5zYWZlIHBhdGgpOiAke2VudkRpcn0g4oCUIGZhbGxpbmcgYmFjayB0byB+Ly5udm1gKTtcbiAgfVxuICBjb25zdCBmYWxsYmFjayA9IGpvaW4oaG9tZSwgJy5udm0nKTtcbiAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIE5WTSBkaXIgcmVzb2x2ZWQgdG8gZGVmYXVsdDogJHtmYWxsYmFja31gKTtcbiAgcmV0dXJuIGZhbGxiYWNrO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgfi8uZG9sbGhvdXNlL2Jpbi9kb2xsaG91c2VtY3AtbnZtLnNoIGFuZCByZXR1cm5zIGl0cyBwYXRoLlxuICpcbiAqIFRoZSBOVk0gZGlyZWN0b3J5IGlzIHJlc29sdmVkIGF0IGdlbmVyYXRpb24gdGltZSBhbmQgaGFyZGNvZGVkIGludG8gdGhlXG4gKiBzY3JpcHQuIFRoaXMgaXMgaW50ZW50aW9uYWw6IENsYXVkZSBEZXNrdG9wIGRvZXMgbm90IHNvdXJjZSB0aGUgdXNlcidzXG4gKiBzaGVsbCBwcm9maWxlLCBzbyAkTlZNX0RJUiB3b3VsZCBiZSB1bnNldCB3aGVuIHRoZSB3cmFwcGVyIHJ1bnMuIEJ5XG4gKiBlbWJlZGRpbmcgdGhlIGFic29sdXRlIHBhdGggd2UgZ3VhcmFudGVlIHRoZSBjb3JyZWN0IE5WTSBpcyBmb3VuZC5cbiAqXG4gKiBUaGUgc2NyaXB0IHNvdXJjZXMgTlZNLCB0aGVuIGNoZWNrcyB0aGUgYWN0aXZlIE5vZGUgbWFqb3IgdmVyc2lvbi4gSWYgaXRcbiAqIGlzIGJlbG93IDE4ICh0aGUgRG9sbGhvdXNlTUNQIG1pbmltdW0pLCBpdCB0cmllcyBgbnZtIHVzZSBub2RlYCAoaGlnaGVzdFxuICogaW5zdGFsbGVkKSB0aGVuIGBudm0gdXNlIC0tbHRzYCBhcyBhIGZhbGxiYWNrLiBBIGZpbmFsIHZlcnNpb24gY2hlY2tcbiAqIHdyaXRlcyBhIHdhcm5pbmcgdG8gc3RkZXJyIGlmIHRoZSBub2RlIGlzIHN0aWxsIHRvbyBvbGQg4oCUIHRoYXQgd2FybmluZ1xuICogd2lsbCBhcHBlYXIgaW4gQ2xhdWRlIERlc2t0b3AncyBlcnJvciBsb2cuXG4gKlxuICogQHBhcmFtIGhvbWUgICAgICAgLSBPdmVycmlkZSBob21lIGRpcmVjdG9yeSAoaW5qZWN0YWJsZSBmb3IgdGVzdHMpXG4gKiBAcGFyYW0gbnZtRGlyT3ZlcnJpZGUgLSBPdmVycmlkZSB0aGUgcmVzb2x2ZWQgTlZNIHBhdGggKGluamVjdGFibGUgZm9yIHRlc3RzKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTnZtTGF1bmNoZXIoaG9tZSA9IGhvbWVkaXIoKSwgbnZtRGlyT3ZlcnJpZGU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBiaW5EaXIgPSBqb2luKGhvbWUsICcuZG9sbGhvdXNlJywgJ2JpbicpO1xuICBjb25zdCB3cmFwcGVyUGF0aCA9IGpvaW4oYmluRGlyLCAnZG9sbGhvdXNlbWNwLW52bS5zaCcpO1xuICBjb25zdCBudm1EaXIgPSBudm1EaXJPdmVycmlkZSA/PyByZXNvbHZlTnZtRGlyKGhvbWUpO1xuXG4gIGF3YWl0IG1rZGlyKGJpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgLy8gU2luZ2xlLWV4cHJlc3Npb24gaGVscGVyIHJldXNlZCB0d2ljZSB0byBnZXQgdGhlIE5vZGUgbWFqb3IgdmVyc2lvbi5cbiAgY29uc3QgZ2V0TWFqb3IgPSAnbm9kZSAtZSBcInByb2Nlc3Muc3Rkb3V0LndyaXRlKFN0cmluZyhwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoXFwnLlxcJylbMF0pKVwiIDI+L2Rldi9udWxsIHx8IGVjaG8gXCIwXCInO1xuXG4gIGNvbnN0IHNjcmlwdCA9IFtcbiAgICAnIyEvYmluL2Jhc2gnLFxuICAgICcjIERvbGxob3VzZU1DUCBOVk0tYXdhcmUgbGF1bmNoZXInLFxuICAgICcjIEF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBEb2xsaG91c2VNQ1AgaW5zdGFsbGVyLicsXG4gICAgJyMgRW5zdXJlcyB0aGUgY29ycmVjdCBOb2RlLmpzIHZlcnNpb24gaXMgYWN0aXZlIGJlZm9yZSBydW5uaW5nIG5weCwnLFxuICAgICcjIHdvcmtpbmcgYXJvdW5kIGEgQ2xhdWRlIERlc2t0b3AgYnVnIHdoZXJlIE5WTSBQQVRIIG9yZGVyaW5nIGNhdXNlcycsXG4gICAgJyMgbnB4IHRvIGV4ZWN1dGUgdW5kZXIgYW4gb2xkZXIgTm9kZSB2ZXJzaW9uIChlLmcuIHYxMikgZXZlbiB3aGVuIGEnLFxuICAgICcjIG5ld2VyIHZlcnNpb24gaXMgaW5zdGFsbGVkLicsXG4gICAgJyMgU2VlOiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXIvaXNzdWVzLzE5MDInLFxuICAgICcnLFxuICAgIGBOVk1fRElSPVwiJHtudm1EaXJ9XCJgLFxuICAgICdpZiBbIC1zIFwiJE5WTV9ESVIvbnZtLnNoXCIgXTsgdGhlbicsXG4gICAgJyAgICAjIHNoZWxsY2hlY2sgc291cmNlPS9kZXYvbnVsbCcsXG4gICAgJyAgICAuIFwiJE5WTV9ESVIvbnZtLnNoXCIgMj4vZGV2L251bGwnLFxuICAgICcgICAgIyBJZiB0aGUgYWN0aXZlIE5vZGUgaXMgYmVsb3cgdjE4IChtaW5pbXVtIGZvciBEb2xsaG91c2VNQ1ApLCcsXG4gICAgYCAgICAjIHRyeSAnbm9kZScgYWxpYXMgKGhpZ2hlc3QgaW5zdGFsbGVkKSB0aGVuIExUUyBhcyBhIGZhbGxiYWNrLmAsXG4gICAgYCAgICBNQUpPUj0kKCR7Z2V0TWFqb3J9KWAsXG4gICAgJyAgICBpZiBbIFwiJE1BSk9SXCIgLWx0IDE4IF07IHRoZW4nLFxuICAgICcgICAgICAgIG52bSB1c2Ugbm9kZSAyPi9kZXYvbnVsbCB8fCBudm0gdXNlIC0tbHRzIDI+L2Rldi9udWxsIHx8IHRydWUnLFxuICAgIGAgICAgICAgIE1BSk9SPSQoJHtnZXRNYWpvcn0pYCxcbiAgICAnICAgICAgICBpZiBbIFwiJE1BSk9SXCIgLWx0IDE4IF07IHRoZW4nLFxuICAgICcgICAgICAgICAgICBlY2hvIFwiW0RvbGxob3VzZU1DUF0gV0FSTklORzogTm9kZS5qcyAkTUFKT1IgaXMgYmVsb3cgdGhlIG1pbmltdW0gKDE4KS4gRG9sbGhvdXNlTUNQIG1heSBub3Qgc3RhcnQgY29ycmVjdGx5LlwiID4mMicsXG4gICAgJyAgICAgICAgZmknLFxuICAgICcgICAgZmknLFxuICAgICdmaScsXG4gICAgJycsXG4gICAgJ2V4ZWMgbnB4IFwiJEBcIicsXG4gIF0uam9pbignXFxuJykgKyAnXFxuJztcblxuICBsb2dnZXIuZGVidWcoYFtTZXR1cF0gV3JpdGluZyBOVk0gbGF1bmNoZXIgd3JhcHBlciB0bzogJHt3cmFwcGVyUGF0aH0gKE5WTV9ESVI9JHtudm1EaXJ9KWApO1xuICBhd2FpdCB3cml0ZUZpbGUod3JhcHBlclBhdGgsIHNjcmlwdCwgJ3V0Zi04Jyk7XG4gIGF3YWl0IGNobW9kKHdyYXBwZXJQYXRoLCAwbzc1NSk7XG4gIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBOVk0gbGF1bmNoZXIgd3JhcHBlciB3cml0dGVuIGFuZCBtYWRlIGV4ZWN1dGFibGVgKTtcbiAgcmV0dXJuIHdyYXBwZXJQYXRoO1xufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIGluZGVudGF0aW9uIHVzZWQgaW4gYSBKU09OIHN0cmluZyBzbyB0aGUgcmVzZXJpYWxpc2VkIG91dHB1dFxuICogcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzdHlsZSAoYXZvaWRzIG5vaXN5IGRpZmZzIGluIHVzZXItbWFpbnRhaW5lZCBjb25maWdzKS5cbiAqIFJldHVybnMgdGhlIHRhYiBjaGFyYWN0ZXIgZm9yIHRhYi1pbmRlbnRlZCBmaWxlcywgb3IgdGhlIGxlYWRpbmctc3BhY2UgY291bnRcbiAqIChtaW5pbXVtIDIpIGZvciBzcGFjZS1pbmRlbnRlZCBmaWxlcy4gRGVmYXVsdHMgdG8gMiB3aGVuIHVuZGV0ZWN0YWJsZS5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0SW5kZW50KHJhdzogc3RyaW5nKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHJhdy5zcGxpdCgnXFxuJykpIHtcbiAgICBpZiAobGluZS5sZW5ndGggPT09IDAgfHwgbGluZS5zdGFydHNXaXRoKCd7JykgfHwgbGluZS5zdGFydHNXaXRoKCd9JykpIGNvbnRpbnVlO1xuICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJ1xcdCcpKSByZXR1cm4gJ1xcdCc7XG4gICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnICcpKSB7XG4gICAgICBjb25zdCBzcGFjZXMgPSBsaW5lLmxlbmd0aCAtIGxpbmUudHJpbVN0YXJ0KCkubGVuZ3RoO1xuICAgICAgaWYgKHNwYWNlcyA+PSAyKSByZXR1cm4gc3BhY2VzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMjtcbn1cblxuLyoqXG4gKiBQYXRjaGVzIHRoZSBkb2xsaG91c2VtY3AgZW50cnkgaW4gYW4gTUNQIGNsaWVudCdzIEpTT04gY29uZmlnIHRvIHVzZVxuICogdGhlIE5WTS1hd2FyZSBsYXVuY2hlciBpbnN0ZWFkIG9mIGJhcmUgYG5weGAuXG4gKlxuICogT25seSBhY3RzIG9uIEpTT04tZm9ybWF0IGNvbmZpZ3MuIFRPTUwgY29uZmlncyAoY29kZXgpIGFyZSBza2lwcGVkLlxuICogU2lsZW50bHkgbm8tb3BzIGlmIHRoZSBjb25maWcgZmlsZSBpcyBtaXNzaW5nIG9yIHVucmVhZGFibGUuXG4gKlxuICogQHBhcmFtIGNvbmZpZ1BhdGhPdmVycmlkZSAtIFVzZSB0aGlzIHBhdGggaW5zdGVhZCBvZiB0aGUgcGxhdGZvcm0gZGVmYXVsdCAoaW5qZWN0YWJsZSBmb3IgdGVzdHMpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyKGNsaWVudDogc3RyaW5nLCB3cmFwcGVyUGF0aDogc3RyaW5nLCBjb25maWdQYXRoT3ZlcnJpZGU/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGNvbmZpZ1BhdGhPdmVycmlkZSA/PyBnZXRDb25maWdQYXRoKGNsaWVudCk7XG4gIGlmICghY29uZmlnUGF0aCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyOiBubyBjb25maWcgcGF0aCBmb3IgJHtjbGllbnR9IOKAlCBza2lwcGluZ2ApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoY29uZmlnUGF0aC5lbmRzV2l0aCgnLnRvbWwnKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyOiBUT01MIGNvbmZpZyBmb3IgJHtjbGllbnR9IOKAlCBza2lwcGluZyAobm90IEpTT04tZm9ybWF0KWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCByYXc6IHN0cmluZztcbiAgdHJ5IHtcbiAgICByYXcgPSBhd2FpdCByZWFkRmlsZShjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuOyAvLyBDb25maWcgbm90IHJlYWRhYmxlIOKAlCBpbnN0YWxsLW1jcCBtYXkgbm90IGhhdmUgd3JpdHRlbiBpdCB5ZXRcbiAgfVxuXG4gIGxldCBwYXJzZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuOyAvLyBNYWxmb3JtZWQgSlNPTiDigJQgZG9uJ3QgdG91Y2ggaXRcbiAgfVxuXG4gIGxldCBwYXRjaGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnbWNwU2VydmVycycsICdzZXJ2ZXJzJ10pIHtcbiAgICBjb25zdCBzZWN0aW9uID0gcGFyc2VkW2tleV0gYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChzZWN0aW9uPy5kb2xsaG91c2VtY3ApIHtcbiAgICAgIHNlY3Rpb24uZG9sbGhvdXNlbWNwLmNvbW1hbmQgPSB3cmFwcGVyUGF0aDtcbiAgICAgIHBhdGNoZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFwYXRjaGVkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBbU2V0dXBdIHBhdGNoQ29uZmlnRm9yTnZtTGF1bmNoZXI6IG5vIGRvbGxob3VzZW1jcCBlbnRyeSBpbiAke2NsaWVudH0gY29uZmlnIOKAlCBub3RoaW5nIHRvIHBhdGNoYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaW5kZW50ID0gZGV0ZWN0SW5kZW50KHJhdyk7XG4gIGxvZ2dlci5kZWJ1ZyhgW1NldHVwXSBwYXRjaENvbmZpZ0Zvck52bUxhdW5jaGVyOiB3cml0aW5nICR7Y2xpZW50fSBjb25maWcgKGluZGVudD0ke0pTT04uc3RyaW5naWZ5KGluZGVudCl9KWApO1xuICBhd2FpdCB3cml0ZUZpbGUoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCBpbmRlbnQpICsgJ1xcbicsICd1dGYtOCcpO1xuICBsb2dnZXIuaW5mbyhgW1NldHVwXSBQYXRjaGVkICR7Y2xpZW50fSBjb25maWcgdG8gdXNlIE5WTS1hd2FyZSBsYXVuY2hlcjogJHt3cmFwcGVyUGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRNY3BTZXJ2ZXJFbnRyeSh2ZXJzaW9uPzogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCB0YWcgPSB2ZXJzaW9uID8gYEAke3ZlcnNpb259YCA6ICdAbGF0ZXN0JztcbiAgcmV0dXJuIHtcbiAgICBjb21tYW5kOiAnbnB4JyxcbiAgICBhcmdzOiBbYEBkb2xsaG91c2VtY3AvbWNwLXNlcnZlciR7dGFnfWBdLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEpzb25NY3BDbGllbnRDb25maWcoXG4gIGNsaWVudDogc3RyaW5nLFxuICB2ZXJzaW9uPzogc3RyaW5nLFxuICBjb25maWdQYXRoT3ZlcnJpZGU/OiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb25maWdQYXRoID0gY29uZmlnUGF0aE92ZXJyaWRlID8/IGdldENvbmZpZ1BhdGgoY2xpZW50KTtcbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb25maWcgcGF0aCB1bmtub3duIGZvciBjbGllbnQ6ICR7Y2xpZW50fWApO1xuICB9XG4gIGlmIChjb25maWdQYXRoLmVuZHNXaXRoKCcudG9tbCcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBKU09OIE1DUCBpbnN0YWxsIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFRPTUwgY2xpZW50OiAke2NsaWVudH1gKTtcbiAgfVxuXG4gIGF3YWl0IG1rZGlyKGRpcm5hbWUoY29uZmlnUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGxldCByYXcgPSAnJztcbiAgbGV0IHBhcnNlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgdHJ5IHtcbiAgICByYXcgPSBhd2FpdCByZWFkRmlsZShjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFpc01pc3NpbmdQYXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwYXJzZSBleGlzdGluZyBjb25maWcgYXQgJHtjb25maWdQYXRofWApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJvb3RLZXkgPSBjbGllbnQgPT09ICd2c2NvZGUnID8gJ3NlcnZlcnMnIDogJ21jcFNlcnZlcnMnO1xuICBjb25zdCBleGlzdGluZ1Jvb3QgPSBwYXJzZWRbcm9vdEtleV07XG4gIGNvbnN0IHJvb3QgPSBleGlzdGluZ1Jvb3QgJiYgdHlwZW9mIGV4aXN0aW5nUm9vdCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmdSb290KVxuICAgID8gZXhpc3RpbmdSb290IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgOiB7fTtcblxuICByb290LmRvbGxob3VzZW1jcCA9IGJ1aWxkTWNwU2VydmVyRW50cnkodmVyc2lvbik7XG4gIHBhcnNlZFtyb290S2V5XSA9IHJvb3Q7XG5cbiAgY29uc3QgaW5kZW50ID0gcmF3ID8gZGV0ZWN0SW5kZW50KHJhdykgOiAyO1xuICBhd2FpdCB3cml0ZUZpbGUoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCBpbmRlbnQpICsgJ1xcbicsICd1dGYtOCcpO1xuXG4gIHJldHVybiBgSW5zdGFsbGVkIE1DUCBzZXJ2ZXIgXCJkb2xsaG91c2VtY3BcIiBpbiAke2NsaWVudH0gKCR7Y29uZmlnUGF0aH0pYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbExtU3R1ZGlvQ29uZmlnKHZlcnNpb24/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gaW5zdGFsbEpzb25NY3BDbGllbnRDb25maWcoJ2xtc3R1ZGlvJywgdmVyc2lvbik7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgaW5zdGFsbC1tY3AgYmluYXJ5IHBhdGguXG4gKiBVc2VzIHRoZSBsb2NhbCBkZXBlbmRlbmN5IChub2RlX21vZHVsZXMvLmJpbi9pbnN0YWxsLW1jcCkgZmlyc3QsXG4gKiBmYWxscyBiYWNrIHRvIG5weCBpZiBub3QgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVJbnN0YWxsTWNwQmluKCk6IHsgY21kOiBzdHJpbmc7IHByZWZpeEFyZ3M6IHN0cmluZ1tdIH0ge1xuICBjb25zdCBsb2NhbEJpbiA9IGpvaW4oZGlybmFtZShkaXJuYW1lKGRpcm5hbWUoX19kaXJuYW1lKSkpLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nLCAnaW5zdGFsbC1tY3AnKTtcbiAgdHJ5IHtcbiAgICBhY2Nlc3NTeW5jKGxvY2FsQmluLCBmc0NvbnN0YW50cy5YX09LKTtcbiAgICByZXR1cm4geyBjbWQ6IGxvY2FsQmluLCBwcmVmaXhBcmdzOiBbXSB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBjbWQ6ICducHgnLCBwcmVmaXhBcmdzOiBbJ2luc3RhbGwtbWNwJ10gfTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1biBpbnN0YWxsLW1jcCB0byBjb25maWd1cmUgYSBzcGVjaWZpYyBNQ1AgY2xpZW50LlxuICpcbiAqIFVzZXMgdGhlIGJ1bmRsZWQgaW5zdGFsbC1tY3AgZGVwZW5kZW5jeSAoTUlULCBodHRwczovL2dpdGh1Yi5jb20vc3VwZXJtZW1vcnlhaS9pbnN0YWxsLW1jcCkuXG4gKiBDb21tYW5kIGFyZ3VtZW50cyBhcmUgZnVsbHkgaGFyZGNvZGVkIOKAlCBubyB1c2VyIGlucHV0IHJlYWNoZXMgdGhlIHNoZWxsLlxuICogZXhlY0ZpbGUgaXMgdXNlZCAobm90IGV4ZWMpIHRvIHByZXZlbnQgc2hlbGwgaW5qZWN0aW9uLlxuICovXG5mdW5jdGlvbiBydW5JbnN0YWxsTWNwKGNsaWVudDogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB7IGNtZCwgcHJlZml4QXJncyB9ID0gcmVzb2x2ZUluc3RhbGxNY3BCaW4oKTtcbiAgICBjb25zdCB0YWcgPSB2ZXJzaW9uID8gYEAke3ZlcnNpb259YCA6ICdAbGF0ZXN0JztcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgLi4ucHJlZml4QXJncyxcbiAgICAgIGBAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIke3RhZ31gLFxuICAgICAgJy0tY2xpZW50JywgY2xpZW50LFxuICAgICAgJy0tbmFtZScsICdkb2xsaG91c2VtY3AnLFxuICAgICAgJy0teWVzJyxcbiAgICBdO1xuXG4gICAgZXhlY0ZpbGUoY21kLCBhcmdzLCB7IHRpbWVvdXQ6IDMwXzAwMCB9LCAoZXJyLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKHN0ZGVyciB8fCBlcnIubWVzc2FnZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHN0ZG91dCB8fCAnSW5zdGFsbGF0aW9uIGNvbXBsZXRlZC4nKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
|