@dollhousemcp/mcp-server 2.0.11 → 2.0.12-rc.2

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.
Files changed (93) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/config/ConfigManager.d.ts +34 -0
  3. package/dist/config/ConfigManager.d.ts.map +1 -1
  4. package/dist/config/ConfigManager.js +46 -1
  5. package/dist/config/env.d.ts +18 -0
  6. package/dist/config/env.d.ts.map +1 -1
  7. package/dist/config/env.js +89 -2
  8. package/dist/di/Container.d.ts +1 -0
  9. package/dist/di/Container.d.ts.map +1 -1
  10. package/dist/di/Container.js +38 -2
  11. package/dist/elements/agents/AgentManager.js +2 -2
  12. package/dist/generated/version.d.ts +2 -2
  13. package/dist/generated/version.d.ts.map +1 -1
  14. package/dist/generated/version.js +3 -3
  15. package/dist/handlers/mcp-aql/GatekeeperSession.d.ts.map +1 -1
  16. package/dist/handlers/mcp-aql/GatekeeperSession.js +3 -2
  17. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  18. package/dist/handlers/mcp-aql/MCPAQLHandler.js +11 -3
  19. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  20. package/dist/handlers/mcp-aql/OperationSchema.js +11 -6
  21. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  22. package/dist/handlers/mcp-aql/policies/ToolClassification.js +8 -1
  23. package/dist/index.js +53 -3
  24. package/dist/security/InputNormalizer.d.ts +4 -6
  25. package/dist/security/InputNormalizer.d.ts.map +1 -1
  26. package/dist/security/InputNormalizer.js +10 -16
  27. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  28. package/dist/security/audit/config/suppressions.js +26 -1
  29. package/dist/security/constants.d.ts +7 -0
  30. package/dist/security/constants.d.ts.map +1 -1
  31. package/dist/security/constants.js +10 -1
  32. package/dist/security/contentValidator.d.ts.map +1 -1
  33. package/dist/security/contentValidator.js +14 -6
  34. package/dist/security/encryption/PatternEncryptor.d.ts.map +1 -1
  35. package/dist/security/encryption/PatternEncryptor.js +18 -10
  36. package/dist/security/securityMonitor.d.ts +1 -1
  37. package/dist/security/securityMonitor.d.ts.map +1 -1
  38. package/dist/security/securityMonitor.js +1 -1
  39. package/dist/security/tokenManager.d.ts +18 -2
  40. package/dist/security/tokenManager.d.ts.map +1 -1
  41. package/dist/security/tokenManager.js +47 -15
  42. package/dist/security/validators/unicodeValidator.d.ts +4 -5
  43. package/dist/security/validators/unicodeValidator.d.ts.map +1 -1
  44. package/dist/security/validators/unicodeValidator.js +19 -20
  45. package/dist/services/VerificationNotifier.d.ts.map +1 -1
  46. package/dist/services/VerificationNotifier.js +15 -13
  47. package/dist/services/validation/GenericElementValidator.js +5 -5
  48. package/dist/web/console/IngestRoutes.d.ts +14 -2
  49. package/dist/web/console/IngestRoutes.d.ts.map +1 -1
  50. package/dist/web/console/IngestRoutes.js +69 -5
  51. package/dist/web/console/LeaderElection.d.ts +37 -3
  52. package/dist/web/console/LeaderElection.d.ts.map +1 -1
  53. package/dist/web/console/LeaderElection.js +67 -7
  54. package/dist/web/console/LeaderForwardingSink.d.ts +19 -3
  55. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
  56. package/dist/web/console/LeaderForwardingSink.js +44 -9
  57. package/dist/web/console/PromotionManager.d.ts +29 -0
  58. package/dist/web/console/PromotionManager.d.ts.map +1 -0
  59. package/dist/web/console/PromotionManager.js +94 -0
  60. package/dist/web/console/SessionNames.d.ts +7 -0
  61. package/dist/web/console/SessionNames.d.ts.map +1 -1
  62. package/dist/web/console/SessionNames.js +10 -1
  63. package/dist/web/console/UnifiedConsole.d.ts +26 -1
  64. package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
  65. package/dist/web/console/UnifiedConsole.js +143 -20
  66. package/dist/web/portDiscovery.d.ts +4 -3
  67. package/dist/web/portDiscovery.d.ts.map +1 -1
  68. package/dist/web/portDiscovery.js +7 -5
  69. package/dist/web/public/app.js +35 -18
  70. package/dist/web/public/consoleAuth.js +152 -0
  71. package/dist/web/public/index.html +243 -9
  72. package/dist/web/public/logs.js +1 -1
  73. package/dist/web/public/metrics.js +3 -3
  74. package/dist/web/public/permissions.js +1 -1
  75. package/dist/web/public/security.css +396 -0
  76. package/dist/web/public/security.js +393 -0
  77. package/dist/web/public/sessions.css +54 -4
  78. package/dist/web/public/sessions.js +46 -6
  79. package/dist/web/public/setup.css +439 -0
  80. package/dist/web/public/setup.js +490 -18
  81. package/dist/web/public/styles.css +10 -0
  82. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  83. package/dist/web/routes/permissionRoutes.js +8 -3
  84. package/dist/web/routes/setupRoutes.d.ts +4 -0
  85. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  86. package/dist/web/routes/setupRoutes.js +418 -7
  87. package/dist/web/routes.d.ts.map +1 -1
  88. package/dist/web/routes.js +9 -5
  89. package/dist/web/server.d.ts +49 -3
  90. package/dist/web/server.d.ts.map +1 -1
  91. package/dist/web/server.js +282 -82
  92. package/package.json +11 -2
  93. package/server.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.0.11-rc.1] - 2026-04-08
4
+
5
+ Release candidate for v2.0.11 — console auth, permissions, licensing, port 41715, channel selector
6
+
7
+ ## [Unreleased] — Phase 2 authenticated console
8
+
9
+ ### Breaking: Web console default port moved from 3939 → 41715
10
+
11
+ The authenticated web console (Phase 2 and later) binds to port **41715** by default, not 3939. The associated state files now live at:
12
+
13
+ - `~/.dollhouse/run/console-leader.auth.lock` (was `console-leader.lock`)
14
+ - `~/.dollhouse/run/console-token.auth.json` (was `console-token.json`)
15
+
16
+ **Why:** Pre-authentication DollhouseMCP installations (≤ 2.0.x) continue to use port 3939 and the legacy file paths. The port + filename separation lets a legacy installation and an authenticated installation coexist on the same machine with zero interference — different ports, different lock files, different token files, independent leader-election spaces. This avoids a confusing "security popping on and off" UX when a user has both a pre-auth Claude Desktop install and an authenticated Claude Code install running simultaneously.
17
+
18
+ **Configurability:** The port, lock file path, and token file path are now all driven by env vars with a single source of truth in `src/config/env.ts`. Changing any of them is a one-line edit — no hunt-and-peck across the codebase:
19
+
20
+ | Env var | Default |
21
+ |---|---|
22
+ | `DOLLHOUSE_WEB_CONSOLE_PORT` | `41715` |
23
+ | `DOLLHOUSE_CONSOLE_LEADER_LOCK_FILE` | `~/.dollhouse/run/console-leader.auth.lock` |
24
+ | `DOLLHOUSE_CONSOLE_TOKEN_FILE` | `~/.dollhouse/run/console-token.auth.json` |
25
+
26
+ Port 41715 spells "AILIS" on a phone keypad — the AI Layer Interface Specification.
27
+
28
+ **Legacy detection:** When the authenticated console starts, it checks for an active legacy (pre-auth) DollhouseMCP process on port 3939 and logs a warning if one is found, explaining the coexistence and the differing security posture.
29
+
30
+ **Consumer impact:**
31
+ - **DollhouseBridge**: will need a matching port update when it consumes Phase 2 features — tracking issue filed
32
+ - **User bookmarks / shell scripts**: update `localhost:3939` references to `localhost:41715` (or set `DOLLHOUSE_WEB_CONSOLE_PORT` to whatever you prefer)
33
+ - **Docs**: all `docs/guides/*.md` references updated
34
+ - **Nothing breaks silently**: the auth console simply isn't on 3939 anymore; the legacy console continues to work there untouched
35
+
3
36
  ## [2.0.7] - 2026-04-02
4
37
 
5
38
  ### Clean terminal output for `--web` mode
@@ -191,6 +191,32 @@ export interface WizardConfig {
191
191
  lastSeenVersion?: string;
192
192
  skippedSections?: string[];
193
193
  }
194
+ export type LicenseTier = 'agpl' | 'free-commercial' | 'paid-commercial';
195
+ export interface LicenseConfig {
196
+ tier: LicenseTier;
197
+ email?: string;
198
+ attestedAt?: string;
199
+ telemetryRequired?: boolean;
200
+ revenueScale?: string;
201
+ companyName?: string;
202
+ useCase?: string;
203
+ }
204
+ /** Branded type for validated port numbers (1024–65535). */
205
+ export type PortNumber = number & {
206
+ readonly __brand: 'PortNumber';
207
+ };
208
+ /** Validate and brand a port number. Returns undefined if invalid. */
209
+ export declare function validatePort(value: unknown): PortNumber | undefined;
210
+ export interface ConsoleConfig {
211
+ /**
212
+ * Web console port (1024–65535). Resolution hierarchy:
213
+ * 1. --port CLI flag (standalone --web mode only)
214
+ * 2. This config value (~/.dollhouse/config.yml → console.port)
215
+ * 3. DOLLHOUSE_WEB_CONSOLE_PORT env var
216
+ * 4. Default: 41715
217
+ */
218
+ port: number;
219
+ }
194
220
  export interface SourcePriorityConfigData {
195
221
  order: string[];
196
222
  stop_on_first: boolean;
@@ -208,6 +234,8 @@ export interface DollhouseConfig {
208
234
  wizard: WizardConfig;
209
235
  autoLoad: AutoLoadConfig;
210
236
  retentionPolicy: RetentionPolicyConfig;
237
+ license: LicenseConfig;
238
+ console: ConsoleConfig;
211
239
  source_priority?: SourcePriorityConfigData;
212
240
  }
213
241
  export interface ConfigUpdateResult {
@@ -228,6 +256,12 @@ export declare class ConfigManager {
228
256
  private config;
229
257
  private readonly fileOperations;
230
258
  private os;
259
+ /**
260
+ * Extract console.port from raw YAML config content without full
261
+ * ConfigManager initialization. Uses FAILSAFE_SCHEMA for security
262
+ * (no code execution). Returns undefined if not found or invalid.
263
+ */
264
+ static readPortFromYaml(yamlContent: string): number | undefined;
231
265
  constructor(fileOperations: IFileOperationsService, osModule: typeof os);
232
266
  /**
233
267
  * Get default configuration
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,16 @@ import { logger } from '../utils/logger.js';
17
17
  import { SecureYamlParser } from '../security/secureYamlParser.js';
18
18
  import { validatePropertyPath, safeSetProperty, createSafeObject, safeHasOwnProperty } from '../utils/securityUtils.js';
19
19
  import { env } from './env.js';
20
+ /** Validate and brand a port number. Returns undefined if invalid. */
21
+ export function validatePort(value) {
22
+ const num = typeof value === 'string' ? Number(value) : value;
23
+ if (typeof num !== 'number' || !Number.isFinite(num))
24
+ return undefined;
25
+ const port = Math.floor(num);
26
+ if (port < 1024 || port > 65535)
27
+ return undefined;
28
+ return port;
29
+ }
20
30
  export class ConfigManager {
21
31
  configDir;
22
32
  configPath;
@@ -24,6 +34,24 @@ export class ConfigManager {
24
34
  config = null;
25
35
  fileOperations;
26
36
  os;
37
+ /**
38
+ * Extract console.port from raw YAML config content without full
39
+ * ConfigManager initialization. Uses FAILSAFE_SCHEMA for security
40
+ * (no code execution). Returns undefined if not found or invalid.
41
+ */
42
+ static readPortFromYaml(yamlContent) {
43
+ try {
44
+ const parsed = yaml.load(yamlContent, { schema: yaml.FAILSAFE_SCHEMA });
45
+ const raw = parsed?.console?.port;
46
+ if (raw === undefined || raw === null)
47
+ return undefined;
48
+ const port = Number(raw);
49
+ return Number.isFinite(port) ? port : undefined;
50
+ }
51
+ catch {
52
+ return undefined;
53
+ }
54
+ }
27
55
  constructor(fileOperations, osModule) {
28
56
  this.fileOperations = fileOperations;
29
57
  this.os = osModule;
@@ -138,6 +166,12 @@ export class ConfigManager {
138
166
  completed: false,
139
167
  dismissed: false
140
168
  },
169
+ license: {
170
+ tier: 'agpl'
171
+ },
172
+ console: {
173
+ port: 41715
174
+ },
141
175
  /**
142
176
  * Retention Policy Configuration (Issue #51)
143
177
  * IMPORTANT: Disabled by default - nothing is auto-deleted without explicit consent.
@@ -358,6 +392,17 @@ export class ConfigManager {
358
392
  }
359
393
  // SECURITY: Validate path to prevent prototype pollution
360
394
  validatePropertyPath(path, 'path');
395
+ // Runtime validation for known typed settings (#1840)
396
+ if (path === 'console.port') {
397
+ const validated = validatePort(value);
398
+ if (!validated) {
399
+ return {
400
+ success: false,
401
+ message: `Invalid port: ${value}. Must be an integer between 1024 and 65535.`,
402
+ };
403
+ }
404
+ value = validated;
405
+ }
361
406
  const keys = path.split('.');
362
407
  let current = this.config;
363
408
  const previousValue = this.getSetting(path);
@@ -849,4 +894,4 @@ export class ConfigManager {
849
894
  });
850
895
  }
851
896
  }
852
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvQ29uZmlnTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ25CLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQTRPL0IsTUFBTSxPQUFPLGFBQWE7SUFDaEIsU0FBUyxDQUFTO0lBQ2xCLFVBQVUsQ0FBUztJQUNuQixVQUFVLENBQVM7SUFDbkIsTUFBTSxHQUEyQixJQUFJLENBQUM7SUFDN0IsY0FBYyxDQUF5QjtJQUNoRCxFQUFFLENBQVk7SUFFdEIsWUFBWSxjQUFzQyxFQUFFLFFBQW1CO1FBQ3JFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDO1FBRW5CLCtEQUErRDtRQUMvRCx5RUFBeUU7UUFDekUsOERBQThEO1FBQzlELElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzRCxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO1FBQy9DLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFD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QUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFM0Qsa0NBQWtDO1FBQ2xDLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDbEMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLGdCQUFnQixDQUFDO1FBQ2pELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQzFCLE1BQU0sRUFBRSxDQUFDO1lBQ1QsU0FBUyxFQUFFLEdBQUc7WUFDZCxNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uZmlnTWFuYWdlciAtIENlbnRyYWxpemVkIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBmb3IgRG9sbGhvdXNlTUNQXG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBZQU1MLWJhc2VkIGNvbmZpZ3VyYXRpb24gZmlsZVxuICogLSBEZWZhdWx0IHZhbHVlcyB3aXRoIHVzZXIgb3ZlcnJpZGVzXG4gKiAtIE1pZ3JhdGlvbiBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICogLSBWYWxpZGF0aW9uIGFuZCB0eXBlIHNhZmV0eVxuICogLSBBdG9taWMgdXBkYXRlcyB3aXRoIGJhY2t1cFxuICogLSBQcml2YWN5LWZpcnN0IGRlZmF1bHRzXG4gKiAtIE9BdXRoIGNsaWVudCBJRCBzdG9yYWdlIGZvciBNQ1AgY2xpZW50IGludGVncmF0aW9uXG4gKi9cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVQcm9wZXJ0eVBhdGgsXG4gIHNhZmVTZXRQcm9wZXJ0eSxcbiAgY3JlYXRlU2FmZU9iamVjdCxcbiAgc2FmZUhhc093blByb3BlcnR5XG59IGZyb20gJy4uL3V0aWxzL3NlY3VyaXR5VXRpbHMuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnYuanMnO1xuaW1wb3J0IHsgSUZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckNvbmZpZyB7XG4gIHVzZXJuYW1lOiBzdHJpbmcgfCBudWxsO1xuICBlbWFpbDogc3RyaW5nIHwgbnVsbDtcbiAgZGlzcGxheV9uYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YlBvcnRmb2xpb0NvbmZpZyB7XG4gIHJlcG9zaXRvcnlfdXJsOiBzdHJpbmcgfCBudWxsO1xuICByZXBvc2l0b3J5X25hbWU6IHN0cmluZztcbiAgZGVmYXVsdF9icmFuY2g6IHN0cmluZztcbiAgYXV0b19jcmVhdGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViQXV0aENvbmZpZyB7XG4gIHVzZV9vYXV0aDogYm9vbGVhbjtcbiAgdG9rZW5fc291cmNlOiAnZW52aXJvbm1lbnQnIHwgJ29hdXRoJyB8ICdjb25maWcnO1xuICBjbGllbnRfaWQ/OiBzdHJpbmc7IC8vIE9BdXRoIGNsaWVudCBJRCBmb3IgR2l0SHViIEFwcFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkNvbmZpZyB7XG4gIHBvcnRmb2xpbzogR2l0SHViUG9ydGZvbGlvQ29uZmlnO1xuICBhdXRoOiBHaXRIdWJBdXRoQ29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNJbmRpdmlkdWFsQ29uZmlnIHtcbiAgcmVxdWlyZV9jb25maXJtYXRpb246IGJvb2xlYW47XG4gIHNob3dfZGlmZl9iZWZvcmVfc3luYzogYm9vbGVhbjtcbiAgdHJhY2tfdmVyc2lvbnM6IGJvb2xlYW47XG4gIGtlZXBfaGlzdG9yeTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNCdWxrQ29uZmlnIHtcbiAgdXBsb2FkX2VuYWJsZWQ6IGJvb2xlYW47XG4gIGRvd25sb2FkX2VuYWJsZWQ6IGJvb2xlYW47XG4gIHJlcXVpcmVfcHJldmlldzogYm9vbGVhbjtcbiAgcmVzcGVjdF9sb2NhbF9vbmx5OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNQcml2YWN5Q29uZmlnIHtcbiAgc2Nhbl9mb3Jfc2VjcmV0czogYm9vbGVhbjtcbiAgc2Nhbl9mb3JfcGlpOiBib29sZWFuO1xuICB3YXJuX29uX3NlbnNpdGl2ZTogYm9vbGVhbjtcbiAgZXhjbHVkZWRfcGF0dGVybnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNDb25maWcge1xuICBlbmFibGVkOiBib29sZWFuO1xuICBpbmRpdmlkdWFsOiBTeW5jSW5kaXZpZHVhbENvbmZpZztcbiAgYnVsazogU3luY0J1bGtDb25maWc7XG4gIHByaXZhY3k6IFN5bmNQcml2YWN5Q29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25Db25maWcge1xuICBhdXRvX3N1Ym1pdDogYm9vbGVhbjtcbiAgcmVxdWlyZV9yZXZpZXc6IGJvb2xlYW47XG4gIGFkZF9hdHRyaWJ1dGlvbjogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRvTG9hZENvbmZpZyB7XG4gIGVuYWJsZWQ6IGJvb2xlYW47XG4gIG1heFRva2VuQnVkZ2V0OiBudW1iZXI7XG4gIG1heFNpbmdsZU1lbW9yeVRva2Vucz86IG51bWJlcjtcbiAgc3VwcHJlc3NMYXJnZU1lbW9yeVdhcm5pbmdzPzogYm9vbGVhbjtcbiAgbWVtb3JpZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFJldGVudGlvbiBQb2xpY3kgQ29uZmlndXJhdGlvbiAoSXNzdWUgIzUxKVxuICpcbiAqIENvbnRyb2xzIGF1dG9tYXRpYyBkZWxldGlvbiBvZiBleHBpcmVkIG1lbW9yeSBlbnRyaWVzLlxuICogSU1QT1JUQU5UOiBEaXNhYmxlZCBieSBkZWZhdWx0IC0gbm90aGluZyBpcyBhdXRvLWRlbGV0ZWQgd2l0aG91dCBleHBsaWNpdCBjb25zZW50LlxuICpcbiAqIFVzZSBjYXNlczpcbiAqIC0gTGVnYWwvY29tcGxpYW5jZTogTGF3IGZpcm1zLCBhY2NvdW50YW50cyAoNy15ZWFyIHJldGVudGlvbilcbiAqIC0gUHJpdmFjeS1mb2N1c2VkOiBTaWduYWwtbGlrZSBhdXRvLWV4cGlyaW5nIG1lc3NhZ2VzXG4gKiAtIFN0b3JhZ2UgbWFuYWdlbWVudDogQ2xlYW51cCBvZiBvbGQgbG9nc1xuICogLSBHRFBSOiBSaWdodC10by1iZS1mb3Jnb3R0ZW4gaW1wbGVtZW50YXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0ZW50aW9uUG9saWN5Q29uZmlnIHtcbiAgLyoqXG4gICAqIE1hc3RlciBzd2l0Y2ggZm9yIHJldGVudGlvbiBlbmZvcmNlbWVudC5cbiAgICogSWYgZmFsc2UsIG5vIGF1dG9tYXRpYyByZXRlbnRpb24gZW5mb3JjZW1lbnQgaGFwcGVucyBhbnl3aGVyZS5cbiAgICogRGVmYXVsdDogZmFsc2UgKG5vdGhpbmcgYXV0by1kZWxldGVkKVxuICAgKi9cbiAgZW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiByZXRlbnRpb24gZW5mb3JjZW1lbnQgaGFwcGVuczpcbiAgICogLSAnZGlzYWJsZWQnOiBOZXZlciBlbmZvcmNlIGF1dG9tYXRpY2FsbHkgKG9ubHkgdmlhIGV4cGxpY2l0IGNvbW1hbmQpXG4gICAqIC0gJ21hbnVhbCc6IE9ubHkgd2hlbiB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdHMgZW5mb3JjZW1lbnRcbiAgICogLSAnb25fbG9hZCc6IEVuZm9yY2Ugd2hlbiBtZW1vcnkgaXMgbG9hZGVkIChDVVJSRU5UIEJFSEFWSU9SIC0gbm90IHJlY29tbWVuZGVkKVxuICAgKiAtICdzY2hlZHVsZWQnOiBSdW4gb24gYSBzY2hlZHVsZSAoZnV0dXJlIGltcGxlbWVudGF0aW9uKVxuICAgKi9cbiAgZW5mb3JjZW1lbnRfbW9kZTogJ2Rpc2FibGVkJyB8ICdtYW51YWwnIHwgJ29uX2xvYWQnIHwgJ3NjaGVkdWxlZCc7XG5cbiAgLyoqXG4gICAqIFNhZmV0eSBjb250cm9scyB0byBwcmV2ZW50IGFjY2lkZW50YWwgZGF0YSBsb3NzXG4gICAqL1xuICBzYWZldHk6IHtcbiAgICAvKiogUmVxdWlyZSBleHBsaWNpdCBjb25maXJtYXRpb24gYmVmb3JlIGFueSBkZWxldGlvbiAqL1xuICAgIHJlcXVpcmVfY29uZmlybWF0aW9uOiBib29sZWFuO1xuICAgIC8qKiBBbHdheXMgcHJldmlldyB3aGF0IHdvdWxkIGJlIGRlbGV0ZWQgYmVmb3JlIGRvaW5nIGl0ICovXG4gICAgZHJ5X3J1bl9maXJzdDogYm9vbGVhbjtcbiAgICAvKiogU2hvdyB3YXJuaW5nIHdoZW4gZW50cmllcyBhcmUgYXBwcm9hY2hpbmcgZXhwaXJhdGlvbiAqL1xuICAgIHdhcm5fb25fZXhwaXJpbmc6IGJvb2xlYW47XG4gICAgLyoqIERheXMgYmVmb3JlIGV4cGlyYXRpb24gdG8gc3RhcnQgd2FybmluZyAqL1xuICAgIHdhcm5pbmdfdGhyZXNob2xkX2RheXM6IG51bWJlcjtcbiAgfTtcblxuICAvKipcbiAgICogQXVkaXQgYW5kIGxvZ2dpbmdcbiAgICovXG4gIGF1ZGl0OiB7XG4gICAgLyoqIExvZyBhbGwgcmV0ZW50aW9uIGRlbGV0aW9ucyBmb3IgYXVkaXQgdHJhaWwgKi9cbiAgICBsb2dfZGVsZXRpb25zOiBib29sZWFuO1xuICAgIC8qKiBLZWVwIGRlbGV0ZWQgZW50cmllcyBpbiBhIGJhY2t1cCBiZWZvcmUgcGVybWFuZW50IHJlbW92YWwgKi9cbiAgICBiYWNrdXBfYmVmb3JlX2RlbGV0ZTogYm9vbGVhbjtcbiAgICAvKiogRGF5cyB0byBrZWVwIGJhY2t1cHMgb2YgZGVsZXRlZCBlbnRyaWVzICovXG4gICAgYmFja3VwX3JldGVudGlvbl9kYXlzOiBudW1iZXI7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgVFRMIHNldHRpbmdzIHdoZW4gY3JlYXRpbmcgbmV3IG1lbW9yaWVzXG4gICAqIE5vdGU6IFRoZXNlIGFyZSBkZWZhdWx0cyBvbmx5IC0gaW5kaXZpZHVhbCBtZW1vcmllcyBjYW4gb3ZlcnJpZGVcbiAgICovXG4gIGRlZmF1bHRzOiB7XG4gICAgLyoqIERlZmF1bHQgVFRMIGluIGRheXMgZm9yIG5ldyBtZW1vcnkgZW50cmllcyAqL1xuICAgIHR0bF9kYXlzOiBudW1iZXI7XG4gICAgLyoqIE1heGltdW0gZW50cmllcyBiZWZvcmUgY2FwYWNpdHkgZW5mb3JjZW1lbnQgKi9cbiAgICBtYXhfZW50cmllczogbnVtYmVyO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhcGFiaWxpdHlJbmRleFJlc291cmNlc0NvbmZpZyB7XG4gIGFkdmVydGlzZV9yZXNvdXJjZXM6IGJvb2xlYW47XG4gIHZhcmlhbnRzOiB7XG4gICAgc3VtbWFyeTogYm9vbGVhbjtcbiAgICBmdWxsOiBib29sZWFuO1xuICAgIHN0YXRzOiBib29sZWFuO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVuaGFuY2VkSW5kZXhDb25maWcge1xuICBlbmFibGVkOiBib29sZWFuO1xuICBsaW1pdHM6IHtcbiAgICBtYXhUcmlnZ2Vyc1BlckVsZW1lbnQ6IG51bWJlcjtcbiAgICBtYXhUcmlnZ2VyTGVuZ3RoOiBudW1iZXI7XG4gICAgbWF4S2V5d29yZHNUb0NoZWNrOiBudW1iZXI7XG4gIH07XG4gIHRlbGVtZXRyeToge1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgc2FtcGxlUmF0ZTogbnVtYmVyO1xuICAgIG1ldHJpY3NJbnRlcnZhbDogbnVtYmVyO1xuICB9O1xuICB2ZXJiUGF0dGVybnM/OiB7XG4gICAgY3VzdG9tUHJlZml4ZXM/OiBzdHJpbmdbXTtcbiAgICBjdXN0b21TdWZmaXhlcz86IHN0cmluZ1tdO1xuICAgIGV4Y2x1ZGVkTm91bnM/OiBzdHJpbmdbXTtcbiAgfTtcbiAgYmFja2dyb3VuZEFuYWx5c2lzPzoge1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgc2NhbkludGVydmFsOiBudW1iZXI7XG4gICAgbWF4Q29uY3VycmVudFNjYW5zOiBudW1iZXI7XG4gIH07XG4gIHJlc291cmNlcz86IENhcGFiaWxpdHlJbmRleFJlc291cmNlc0NvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50c0NvbmZpZyB7XG4gIGF1dG9fYWN0aXZhdGU6IHtcbiAgICBwZXJzb25hcz86IHN0cmluZ1tdO1xuICAgIHNraWxscz86IHN0cmluZ1tdO1xuICAgIHRlbXBsYXRlcz86IHN0cmluZ1tdO1xuICAgIGFnZW50cz86IHN0cmluZ1tdO1xuICAgIG1lbW9yaWVzPzogc3RyaW5nW107XG4gICAgZW5zZW1ibGVzPzogc3RyaW5nW107XG4gIH07XG4gIGRlZmF1bHRfZWxlbWVudF9kaXI6IHN0cmluZztcbiAgZW5oYW5jZWRfaW5kZXg/OiBFbmhhbmNlZEluZGV4Q29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc3BsYXlDb25maWcge1xuICBwZXJzb25hX2luZGljYXRvcnM6IHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIHN0eWxlOiAnZnVsbCcgfCAnbWluaW1hbCcgfCAnY29tcGFjdCcgfCAnY3VzdG9tJztcbiAgICBpbmNsdWRlX2Vtb2ppOiBib29sZWFuO1xuICB9O1xuICB2ZXJib3NlX2xvZ2dpbmc6IGJvb2xlYW47XG4gIHNob3dfcHJvZ3Jlc3M6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l6YXJkQ29uZmlnIHtcbiAgY29tcGxldGVkOiBib29sZWFuOyAgICAgIC8vIFdpemFyZCB3YXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZFxuICBkaXNtaXNzZWQ6IGJvb2xlYW47ICAgICAgLy8gVXNlciBjaG9zZSBcIkRvbid0IHNob3cgYWdhaW5cIlxuICBjb21wbGV0ZWRBdD86IHN0cmluZzsgICAgLy8gSVNPIHRpbWVzdGFtcCB3aGVuIGNvbXBsZXRlZFxuICB2ZXJzaW9uPzogc3RyaW5nOyAgICAgICAgLy8gV2l6YXJkIHZlcnNpb24gZm9yIGZ1dHVyZSB1cGRhdGVzIChkZXByZWNhdGVkIC0gdXNlIGxhc3RTZWVuVmVyc2lvbilcbiAgbGFzdFNlZW5WZXJzaW9uPzogc3RyaW5nOyAvLyBMYXN0IHZlcnNpb24gd2hlcmUgdXNlciBzYXcgdGhlIHdpemFyZFxuICBza2lwcGVkU2VjdGlvbnM/OiBzdHJpbmdbXTsgLy8gVHJhY2sgd2hpY2ggc2VjdGlvbnMgd2VyZSBza2lwcGVkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlUHJpb3JpdHlDb25maWdEYXRhIHtcbiAgb3JkZXI6IHN0cmluZ1tdOyAgLy8gQXJyYXkgb2YgJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nXG4gIHN0b3Bfb25fZmlyc3Q6IGJvb2xlYW47XG4gIGNoZWNrX2FsbF9mb3JfdXBkYXRlczogYm9vbGVhbjtcbiAgZmFsbGJhY2tfb25fZXJyb3I6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9sbGhvdXNlQ29uZmlnIHtcbiAgdmVyc2lvbjogc3RyaW5nO1xuICB1c2VyOiBVc2VyQ29uZmlnO1xuICBnaXRodWI6IEdpdEh1YkNvbmZpZztcbiAgc3luYzogU3luY0NvbmZpZztcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZztcbiAgZWxlbWVudHM6IEVsZW1lbnRzQ29uZmlnO1xuICBkaXNwbGF5OiBEaXNwbGF5Q29uZmlnO1xuICB3aXphcmQ6IFdpemFyZENvbmZpZztcbiAgYXV0b0xvYWQ6IEF1dG9Mb2FkQ29uZmlnO1xuICByZXRlbnRpb25Qb2xpY3k6IFJldGVudGlvblBvbGljeUNvbmZpZztcbiAgc291cmNlX3ByaW9yaXR5PzogU291cmNlUHJpb3JpdHlDb25maWdEYXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ1VwZGF0ZVJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgcHJldmlvdXNWYWx1ZT86IGFueTtcbiAgbmV3VmFsdWU/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnQWN0aW9uUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkYXRhPzogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmlnTWFuYWdlciB7XG4gIHByaXZhdGUgY29uZmlnRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgY29uZmlnUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGJhY2t1cFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBjb25maWc6IERvbGxob3VzZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVPcGVyYXRpb25zOiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuICBwcml2YXRlIG9zOiB0eXBlb2Ygb3M7XG5cbiAgY29uc3RydWN0b3IoZmlsZU9wZXJhdGlvbnM6IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UsIG9zTW9kdWxlOiB0eXBlb2Ygb3MpIHtcbiAgICB0aGlzLmZpbGVPcGVyYXRpb25zID0gZmlsZU9wZXJhdGlvbnM7XG4gICAgdGhpcy5vcyA9IG9zTW9kdWxlO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBwYXRocyAtIHVzZSB0ZXN0IGRpcmVjdG9yeSBpZiBpbiB0ZXN0IGVudmlyb25tZW50XG4gICAgLy8gTk9URTogVXNpbmcgcHJvY2Vzcy5lbnYgZGlyZWN0bHkgaGVyZSAobm90IGNhY2hlZCBlbnYuVEVTVF9DT05GSUdfRElSKVxuICAgIC8vIHRvIGFsbG93IHRlc3RzIHRvIGR5bmFtaWNhbGx5IG92ZXJyaWRlIHRoZSBjb25maWcgZGlyZWN0b3J5XG4gICAgaWYgKGVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnICYmIHByb2Nlc3MuZW52LlRFU1RfQ09ORklHX0RJUikge1xuICAgICAgdGhpcy5jb25maWdEaXIgPSBwcm9jZXNzLmVudi5URVNUX0NPTkZJR19ESVI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnRGlyID0gcGF0aC5qb2luKHRoaXMub3MuaG9tZWRpcigpLCAnLmRvbGxob3VzZScpO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBwYXRoLmpvaW4odGhpcy5jb25maWdEaXIsICdjb25maWcueW1sJyk7XG4gICAgdGhpcy5iYWNrdXBQYXRoID0gcGF0aC5qb2luKHRoaXMuY29uZmlnRGlyLCAnY29uZmlnLnltbC5iYWNrdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGdldERlZmF1bHRDb25maWcoKTogRG9sbGhvdXNlQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdXNlcm5hbWU6IG51bGwsXG4gICAgICAgIGVtYWlsOiBudWxsLFxuICAgICAgICBkaXNwbGF5X25hbWU6IG51bGxcbiAgICAgIH0sXG4gICAgICBnaXRodWI6IHtcbiAgICAgICAgcG9ydGZvbGlvOiB7XG4gICAgICAgICAgcmVwb3NpdG9yeV91cmw6IG51bGwsXG4gICAgICAgICAgcmVwb3NpdG9yeV9uYW1lOiBlbnYuR0lUSFVCX1JFUE9TSVRPUlkgfHwgJ2RvbGxob3VzZS1wb3J0Zm9saW8nLFxuICAgICAgICAgIGRlZmF1bHRfYnJhbmNoOiAnbWFpbicsXG4gICAgICAgICAgYXV0b19jcmVhdGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgIHVzZV9vYXV0aDogdHJ1ZSxcbiAgICAgICAgICB0b2tlbl9zb3VyY2U6ICdlbnZpcm9ubWVudCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN5bmM6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsIC8vIFByaXZhY3kgZmlyc3QgLSBvZmYgYnkgZGVmYXVsdFxuICAgICAgICBpbmRpdmlkdWFsOiB7XG4gICAgICAgICAgcmVxdWlyZV9jb25maXJtYXRpb246IHRydWUsXG4gICAgICAgICAgc2hvd19kaWZmX2JlZm9yZV9zeW5jOiB0cnVlLFxuICAgICAgICAgIHRyYWNrX3ZlcnNpb25zOiB0cnVlLFxuICAgICAgICAgIGtlZXBfaGlzdG9yeTogMTBcbiAgICAgICAgfSxcbiAgICAgICAgYnVsazoge1xuICAgICAgICAgIHVwbG9hZF9lbmFibGVkOiBmYWxzZSwgLy8gUmVxdWlyZXMgZXhwbGljaXQgZW5hYmxlbWVudFxuICAgICAgICAgIGRvd25sb2FkX2VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIHJlcXVpcmVfcHJldmlldzogdHJ1ZSxcbiAgICAgICAgICByZXNwZWN0X2xvY2FsX29ubHk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgcHJpdmFjeToge1xuICAgICAgICAgIHNjYW5fZm9yX3NlY3JldHM6IHRydWUsXG4gICAgICAgICAgc2Nhbl9mb3JfcGlpOiB0cnVlLFxuICAgICAgICAgIHdhcm5fb25fc2Vuc2l0aXZlOiB0cnVlLFxuICAgICAgICAgIGV4Y2x1ZGVkX3BhdHRlcm5zOiBbXG4gICAgICAgICAgICAnKi5zZWNyZXQnLFxuICAgICAgICAgICAgJyotcHJpdmF0ZS4qJyxcbiAgICAgICAgICAgICdjcmVkZW50aWFscy8qKicsXG4gICAgICAgICAgICAncGVyc29uYWwvKionXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY29sbGVjdGlvbjoge1xuICAgICAgICBhdXRvX3N1Ym1pdDogZmFsc2UsIC8vIE5ldmVyIGF1dG8tc3VibWl0XG4gICAgICAgIHJlcXVpcmVfcmV2aWV3OiB0cnVlLFxuICAgICAgICBhZGRfYXR0cmlidXRpb246IHRydWVcbiAgICAgIH0sXG4gICAgICBhdXRvTG9hZDoge1xuICAgICAgICBlbmFibGVkOiB0cnVlLCAvLyBBdXRvLWxvYWQgYmFzZWxpbmUgbWVtb3JpZXMgYnkgZGVmYXVsdFxuICAgICAgICBtYXhUb2tlbkJ1ZGdldDogNTAwMCxcbiAgICAgICAgbWF4U2luZ2xlTWVtb3J5VG9rZW5zOiB1bmRlZmluZWQsXG4gICAgICAgIHN1cHByZXNzTGFyZ2VNZW1vcnlXYXJuaW5nczogZmFsc2UsXG4gICAgICAgIG1lbW9yaWVzOiBbXSAvLyBDb25maWd1cmVkIHZpYSBtZW1vcnkgZmlsZXMgd2l0aCBhdXRvTG9hZCBmbGFnXG4gICAgICB9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgYXV0b19hY3RpdmF0ZToge30sXG4gICAgICAgIGRlZmF1bHRfZWxlbWVudF9kaXI6IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ3BvcnRmb2xpbycpLFxuICAgICAgICBlbmhhbmNlZF9pbmRleDoge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgbGltaXRzOiB7XG4gICAgICAgICAgICBtYXhUcmlnZ2Vyc1BlckVsZW1lbnQ6IDUwLFxuICAgICAgICAgICAgbWF4VHJpZ2dlckxlbmd0aDogNTAsXG4gICAgICAgICAgICBtYXhLZXl3b3Jkc1RvQ2hlY2s6IDEwMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGVsZW1ldHJ5OiB7XG4gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwgIC8vIE9wdC1pbiBvbmx5XG4gICAgICAgICAgICBzYW1wbGVSYXRlOiAwLjEsXG4gICAgICAgICAgICBtZXRyaWNzSW50ZXJ2YWw6IDYwMDAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvdXJjZXM6IHtcbiAgICAgICAgICAgIGFkdmVydGlzZV9yZXNvdXJjZXM6IGZhbHNlLCAvLyBEZWZhdWx0OiBzYWZlLCBkaXNhYmxlZFxuICAgICAgICAgICAgdmFyaWFudHM6IHtcbiAgICAgICAgICAgICAgc3VtbWFyeTogZmFsc2UsICAvLyB+MSwyNTQgdG9rZW5zIC0gT3B0LWluIHJlcXVpcmVkXG4gICAgICAgICAgICAgIGZ1bGw6IGZhbHNlLCAgICAgLy8gfjQ4LDMwNiB0b2tlbnMgLSBPcHQtaW4gcmVxdWlyZWRcbiAgICAgICAgICAgICAgc3RhdHM6IHRydWUgICAgICAvLyB+NTAgdG9rZW5zIC0gU2FmZSBieSBkZWZhdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheToge1xuICAgICAgICBwZXJzb25hX2luZGljYXRvcnM6IHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIHN0eWxlOiAnbWluaW1hbCcsXG4gICAgICAgICAgaW5jbHVkZV9lbW9qaTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICB2ZXJib3NlX2xvZ2dpbmc6IGZhbHNlLFxuICAgICAgICBzaG93X3Byb2dyZXNzOiB0cnVlXG4gICAgICB9LFxuICAgICAgd2l6YXJkOiB7XG4gICAgICAgIGNvbXBsZXRlZDogZmFsc2UsXG4gICAgICAgIGRpc21pc3NlZDogZmFsc2VcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIFJldGVudGlvbiBQb2xpY3kgQ29uZmlndXJhdGlvbiAoSXNzdWUgIzUxKVxuICAgICAgICogSU1QT1JUQU5UOiBEaXNhYmxlZCBieSBkZWZhdWx0IC0gbm90aGluZyBpcyBhdXRvLWRlbGV0ZWQgd2l0aG91dCBleHBsaWNpdCBjb25zZW50LlxuICAgICAgICogVXNlcnMgbXVzdCBleHBsaWNpdGx5IGVuYWJsZSByZXRlbnRpb24gZW5mb3JjZW1lbnQgaWYgdGhleSB3YW50IGF1dG9tYXRpYyBjbGVhbnVwLlxuICAgICAgICovXG4gICAgICByZXRlbnRpb25Qb2xpY3k6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsICAgICAgICAgICAgICAgICAgICAvLyBESVNBQkxFRCBieSBkZWZhdWx0IC0gbm8gYXV0by1kZWxldGlvblxuICAgICAgICBlbmZvcmNlbWVudF9tb2RlOiAnZGlzYWJsZWQnLCAgICAgICAvLyBPbmx5IG1hbnVhbCBlbmZvcmNlbWVudCBhbGxvd2VkXG4gICAgICAgIHNhZmV0eToge1xuICAgICAgICAgIHJlcXVpcmVfY29uZmlybWF0aW9uOiB0cnVlLCAgICAgICAvLyBBbHdheXMgcmVxdWlyZSBjb25maXJtYXRpb25cbiAgICAgICAgICBkcnlfcnVuX2ZpcnN0OiB0cnVlLCAgICAgICAgICAgICAgLy8gQWx3YXlzIHByZXZpZXcgYmVmb3JlIGRlbGV0aW5nXG4gICAgICAgICAgd2Fybl9vbl9leHBpcmluZzogdHJ1ZSwgICAgICAgICAgIC8vIFdhcm4gd2hlbiBlbnRyaWVzIGFwcHJvYWNoaW5nIGV4cGlyYXRpb25cbiAgICAgICAgICB3YXJuaW5nX3RocmVzaG9sZF9kYXlzOiA3ICAgICAgICAgLy8gV2FybiA3IGRheXMgYmVmb3JlIGV4cGlyYXRpb25cbiAgICAgICAgfSxcbiAgICAgICAgYXVkaXQ6IHtcbiAgICAgICAgICBsb2dfZGVsZXRpb25zOiB0cnVlLCAgICAgICAgICAgICAgLy8gTG9nIGFsbCBkZWxldGlvbnNcbiAgICAgICAgICBiYWNrdXBfYmVmb3JlX2RlbGV0ZTogdHJ1ZSwgICAgICAgLy8gQmFja3VwIGRlbGV0ZWQgZW50cmllc1xuICAgICAgICAgIGJhY2t1cF9yZXRlbnRpb25fZGF5czogMzAgICAgICAgICAvLyBLZWVwIGJhY2t1cHMgZm9yIDMwIGRheXNcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICB0dGxfZGF5czogMzAsICAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCAzMC1kYXkgVFRMIChpZiBlbmFibGVkKVxuICAgICAgICAgIG1heF9lbnRyaWVzOiAxMDAwICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IG1heCBlbnRyaWVzIHBlciBtZW1vcnlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBbHdheXMgcmVsb2FkIGNvbmZpZyBmcm9tIGRpc2sgaWYgaXQgZXhpc3RzLCBldmVuIGlmIHdlIGhhdmUgZGVmYXVsdHMgaW4gbWVtb3J5XG4gICAgLy8gVGhpcyBlbnN1cmVzIHdlIHBpY2sgdXAgYW55IG1hbnVhbCBlZGl0cyBvciBzYXZlZCBzZXR0aW5nc1xuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgY29uZmlnIGRpcmVjdG9yeSBleGlzdHMgd2l0aCBwcm9wZXIgcGVybWlzc2lvbnMgKDBvNzAwID0gb3duZXIgb25seSlcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuY29uZmlnRGlyKTtcbiAgICAgIC8vIFNldCBwZXJtaXNzaW9ucyBvbiB0aGUgZGlyZWN0b3J5XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKHRoaXMuY29uZmlnRGlyLCAwbzcwMCwge1xuICAgICAgICBzb3VyY2U6ICdDb25maWdNYW5hZ2VyLmluaXRpYWxpemUnXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gTG9hZCBvciBjcmVhdGUgY29uZmlnXG4gICAgICBpZiAoYXdhaXQgdGhpcy5jb25maWdFeGlzdHMoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRDb25maWcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBkZWZhdWx0IGNvbmZpZ1xuICAgICAgICB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpO1xuICAgICAgICBcbiAgICAgICAgLy8gVHJ5IHRvIG1pZ3JhdGUgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICAgICAgYXdhaXQgdGhpcy5taWdyYXRlRnJvbUVudmlyb25tZW50KCk7XG4gICAgICAgIFxuICAgICAgICAvLyBTYXZlIHRoZSBjb25maWdcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlQ29uZmlnKCk7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuaW5mbygnQ3JlYXRlZCBuZXcgY29uZmlndXJhdGlvbiBmaWxlJywge1xuICAgICAgICAgIHBhdGg6IHRoaXMuY29uZmlnUGF0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIC8vIFVzZSBkZWZhdWx0cyBpbiBtZW1vcnlcbiAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZENvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUodGhpcy5jb25maWdQYXRoLCB7XG4gICAgICAgIHNvdXJjZTogJ0NvbmZpZ01hbmFnZXIubG9hZENvbmZpZydcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvKipcbiAgICAgICAqIElNUE9SVEFOVDogUGFyc2VyIFNlbGVjdGlvbiBmb3IgRGlmZmVyZW50IEZpbGUgVHlwZXNcbiAgICAgICAqIFxuICAgICAgICogV2UgdXNlIERJRkZFUkVOVCBwYXJzZXJzIGZvciBkaWZmZXJlbnQgZmlsZSB0eXBlczpcbiAgICAgICAqIFxuICAgICAgICogMS4ganMteWFtbCAodXNlZCBoZXJlKSAtIEZvciBQVVJFIFlBTUwgZmlsZXM6XG4gICAgICAgKiAgICAtIENvbmZpZ3VyYXRpb24gZmlsZXMgKGNvbmZpZy55bWwpXG4gICAgICAgKiAgICAtIERhdGEgZmlsZXMgd2l0aG91dCBtYXJrZG93biBjb250ZW50XG4gICAgICAgKiAgICAtIEFueSAueW1sIG9yIC55YW1sIGZpbGUgdGhhdCdzIGp1c3QgWUFNTFxuICAgICAgICogICAgRXhhbXBsZSBmb3JtYXQ6XG4gICAgICAgKiAgICBgYGB5YW1sXG4gICAgICAgKiAgICB2ZXJzaW9uOiAxLjAuMFxuICAgICAgICogICAgdXNlcjpcbiAgICAgICAqICAgICAgdXNlcm5hbWU6IGpvaG5kb2VcbiAgICAgICAqICAgICAgZW1haWw6IGpvaG5AZXhhbXBsZS5jb21cbiAgICAgICAqICAgIGBgYFxuICAgICAgICogXG4gICAgICAgKiAyLiBTZWN1cmVZYW1sUGFyc2VyIC0gRm9yIE1BUktET1dOIGZpbGVzIHdpdGggWUFNTCBmcm9udG1hdHRlcjpcbiAgICAgICAqICAgIC0gUGVyc29uYSBmaWxlcyAoKi5tZCBpbiBwZXJzb25hcy8pXG4gICAgICAgKiAgICAtIFNraWxsIGZpbGVzICgqLm1kIGluIHNraWxscy8pXG4gICAgICAgKiAgICAtIFRlbXBsYXRlIGZpbGVzICgqLm1kIGluIHRlbXBsYXRlcy8pXG4gICAgICAgKiAgICAtIEFueSAubWQgZmlsZSB3aXRoIGZyb250bWF0dGVyIGJldHdlZW4gLS0tIG1hcmtlcnNcbiAgICAgICAqICAgIEV4YW1wbGUgZm9ybWF0OlxuICAgICAgICogICAgYGBgbWFya2Rvd25cbiAgICAgICAqICAgIC0tLVxuICAgICAgICogICAgbmFtZTogQ3JlYXRpdmUgV3JpdGVyXG4gICAgICAgKiAgICBkZXNjcmlwdGlvbjogQSBjcmVhdGl2ZSBhc3Npc3RhbnRcbiAgICAgICAqICAgIC0tLVxuICAgICAgICogICAgIyBJbnN0cnVjdGlvbnNcbiAgICAgICAqICAgIFlvdSBhcmUgYSBjcmVhdGl2ZSB3cml0ZXIuLi5cbiAgICAgICAqICAgIGBgYFxuICAgICAgICogXG4gICAgICAgKiBUaGUgY29uZmlnIGZpbGUgaXMgUFVSRSBZQU1MLCBzbyB3ZSB1c2UganMteWFtbCBkaXJlY3RseSB3aXRoIEZBSUxTQUZFX1NDSEVNQVxuICAgICAgICogZm9yIHNlY3VyaXR5IChwcmV2ZW50cyBjb2RlIGV4ZWN1dGlvbiB2aWEgWUFNTCB0YWdzKS5cbiAgICAgICAqIFNFQ1VSSVRZOiBUaGlzIGlzIE5PVCBhIHZ1bG5lcmFiaWxpdHkgLSBGQUlMU0FGRV9TQ0hFTUEgcHJldmVudHMgY29kZSBleGVjdXRpb25cbiAgICAgICAqL1xuICAgICAgbGV0IGxvYWRlZERhdGE6IGFueTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFVzaW5nIHlhbWwgd2l0aCBGQUlMU0FGRV9TQ0hFTUEgaXMgc2VjdXJlIC0gcHJldmVudHMgY29kZSBleGVjdXRpb25cbiAgICAgICAgbG9hZGVkRGF0YSA9IHlhbWwubG9hZChjb250ZW50LCB7XG4gICAgICAgICAgc2NoZW1hOiB5YW1sLkZBSUxTQUZFX1NDSEVNQSAvLyBTYWZlIHNjaGVtYSBwcmV2ZW50cyBjb2RlIGV4ZWN1dGlvblxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKHlhbWxFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgWUFNTCBpbiBjb25maWd1cmF0aW9uIGZpbGU6ICR7eWFtbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyB5YW1sRXJyb3IubWVzc2FnZSA6IFN0cmluZyh5YW1sRXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoIWxvYWRlZERhdGEgfHwgdHlwZW9mIGxvYWRlZERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25maWd1cmF0aW9uIGZvcm1hdCcpO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmRlYnVnKCdMb2FkZWQgY29uZmlnIGZyb20gZmlsZScsIHtcbiAgICAgICAgdXNlcm5hbWU6IGxvYWRlZERhdGEudXNlcj8udXNlcm5hbWUsXG4gICAgICAgIGVtYWlsOiBsb2FkZWREYXRhLnVzZXI/LmVtYWlsLFxuICAgICAgICBzeW5jRW5hYmxlZDogbG9hZGVkRGF0YS5zeW5jPy5lbmFibGVkXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlV2l0aERlZmF1bHRzKGxvYWRlZERhdGEpO1xuICAgICAgXG4gICAgICAvLyBGaXggYW55IHN0cmluZyBib29sZWFucyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBzYXZlZCBpbmNvcnJlY3RseVxuICAgICAgdGhpcy5maXhDb25maWdUeXBlcygpO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ0NvbmZpZ3VyYXRpb24gbG9hZGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMuY29uZmlnLnVzZXIudXNlcm5hbWUsXG4gICAgICAgIHN5bmNFbmFibGVkOiB0aGlzLmNvbmZpZy5zeW5jLmVuYWJsZWRcbiAgICAgIH0pO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGxvYWQgY29uZmlndXJhdGlvbicsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY29uZmlnIGZpbGUgZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbmZpZ0V4aXN0cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHModGhpcy5jb25maWdQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgR2l0SHViIE9BdXRoIGNsaWVudCBJRFxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgY29uZmlnIGZpbGVcbiAgICovXG4gIHB1YmxpYyBnZXRHaXRIdWJDbGllbnRJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBOT1RFOiBET0xMSE9VU0VfR0lUSFVCX0NMSUVOVF9JRCBpcyBub3QgaW4gY2VudHJhbGl6ZWQgZW52IGNvbmZpZ1xuICAgIC8vIGFzIGl0J3MgYW4gb3B0aW9uYWwgZmVhdHVyZSBmbGFnLCBzbyB3ZSBzdGlsbCB1c2UgcHJvY2Vzcy5lbnYgaGVyZVxuICAgIGNvbnN0IGVudkNsaWVudElkID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0dJVEhVQl9DTElFTlRfSUQ7XG4gICAgaWYgKGVudkNsaWVudElkKSB7XG4gICAgICByZXR1cm4gZW52Q2xpZW50SWQ7XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIGNvbmZpZyBmaWxlXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnPy5naXRodWI/LmF1dGg/LmNsaWVudF9pZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBHaXRIdWIgT0F1dGggY2xpZW50IElEIGluIGNvbmZpZyBmaWxlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0R2l0SHViQ2xpZW50SWQoY2xpZW50SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghQ29uZmlnTWFuYWdlci52YWxpZGF0ZUNsaWVudElkKGNsaWVudElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBHaXRIdWIgY2xpZW50IElEIGZvcm1hdC4gRXhwZWN0ZWQgZm9ybWF0OiBPdjIzbGkgZm9sbG93ZWQgYnkgYXQgbGVhc3QgMTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgKGUuZy4sIE92MjNsaUFCQ0RFRkdISUpLTE1OKWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgZ2l0aHViLmF1dGggb2JqZWN0IGV4aXN0c1xuICAgIGlmICghdGhpcy5jb25maWcuZ2l0aHViKSB7XG4gICAgICB0aGlzLmNvbmZpZy5naXRodWIgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKS5naXRodWI7XG4gICAgfVxuICAgIGlmICghdGhpcy5jb25maWcuZ2l0aHViLmF1dGgpIHtcbiAgICAgIHRoaXMuY29uZmlnLmdpdGh1Yi5hdXRoID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCkuZ2l0aHViLmF1dGg7XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWcuZ2l0aHViLmF1dGguY2xpZW50X2lkID0gY2xpZW50SWQ7XG4gICAgYXdhaXQgdGhpcy5zYXZlQ29uZmlnKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXRDb25maWcoKTogRG9sbGhvdXNlQ29uZmlnIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZ3VyYXRpb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzcGVjaWZpYyBzZXR0aW5nIHVzaW5nIGRvdCBub3RhdGlvblxuICAgKi9cbiAgcHVibGljIGdldFNldHRpbmc8VD4ocGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICBsZXQgdmFsdWU6IGFueSA9IHRoaXMuY29uZmlnO1xuICAgIFxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdmFsdWUgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBzZXR0aW5nIHVzaW5nIGRvdCBub3RhdGlvblxuICAgKiBTRUNVUklUWSBGSVggKFBSICM4OTUpOiBBZGRlZCBwcm90b3R5cGUgcG9sbHV0aW9uIHByb3RlY3Rpb25cbiAgICogUHJldmlvdXNseTogRGlyZWN0IHByb3BlcnR5IGFzc2lnbm1lbnQgYWxsb3dlZCBfX3Byb3RvX18gaW5qZWN0aW9uXG4gICAqIE5vdzogVmFsaWRhdGVzIGtleXMgYWdhaW5zdCBmb3JiaWRkZW4gcHJvcGVydGllcyBiZWZvcmUgYXNzaWdubWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVNldHRpbmcocGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxDb25maWdVcGRhdGVSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIHBhdGggdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgdmFsaWRhdGVQcm9wZXJ0eVBhdGgocGF0aCwgJ3BhdGgnKTtcblxuICAgIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgbGV0IGN1cnJlbnQ6IGFueSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLmdldFNldHRpbmcocGF0aCk7XG5cbiAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgcGFyZW50IG9iamVjdCB1c2luZyBzZWN1cml0eSB1dGlsaXRpZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgLy8gU0VDVVJJVFk6IFVzZSBzYWZlIHByb3BlcnR5IGNoZWNrIGFuZCBjcmVhdGUgcHJvdG90eXBlLWxlc3Mgb2JqZWN0c1xuICAgICAgaWYgKCFzYWZlSGFzT3duUHJvcGVydHkoY3VycmVudCwga2V5KSkge1xuICAgICAgICBjdXJyZW50W2tleV0gPSBjcmVhdGVTYWZlT2JqZWN0KCk7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgdmFsdWUgdXNpbmcgc2VjdXJlIHByb3BlcnR5IHNldHRlclxuICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgc2FmZVNldFByb3BlcnR5KGN1cnJlbnQsIGxhc3RLZXksIHZhbHVlKTtcbiAgICBcbiAgICAvLyBTYXZlIHRoZSBjb25maWd1cmF0aW9uXG4gICAgYXdhaXQgdGhpcy5zYXZlQ29uZmlnKCk7XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ0NvbmZpZ3VyYXRpb24gc2V0dGluZyB1cGRhdGVkJywge1xuICAgICAgcGF0aCxcbiAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgICBuZXdWYWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBTZXR0aW5nICcke3BhdGh9JyB1cGRhdGVkIHN1Y2Nlc3NmdWxseWAsXG4gICAgICBwcmV2aW91c1ZhbHVlLFxuICAgICAgbmV3VmFsdWU6IHZhbHVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBHaXRIdWIgT0F1dGggY2xpZW50IElEIGZvcm1hdFxuICAgKiBDbGllbnQgSURzIHN0YXJ0IHdpdGggXCJPdjIzbGlcIiBmb2xsb3dlZCBieSBhdCBsZWFzdCAxNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgKiBcbiAgICogQHBhcmFtIGNsaWVudElkIC0gVGhlIGNsaWVudCBJRCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZhbGlkLCBmYWxzZSBvdGhlcndpc2VcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIENvbmZpZ01hbmFnZXIudmFsaWRhdGVDbGllbnRJZChcIk92MjNsaUFCQ0RFRkdISUpLTE1OMTIzNDU2XCIpIC8vIHRydWVcbiAgICogQ29uZmlnTWFuYWdlci52YWxpZGF0ZUNsaWVudElkKFwiaW52YWxpZFwiKSAvLyBmYWxzZVxuICAgKiBDb25maWdNYW5hZ2VyLnZhbGlkYXRlQ2xpZW50SWQoXCJPdjIzbGlcIikgLy8gZmFsc2UgKHRvbyBzaG9ydClcbiAgICogQ29uZmlnTWFuYWdlci52YWxpZGF0ZUNsaWVudElkKFwiWHYyM2xpQUJDREVGR0hJSktMTU5cIikgLy8gZmFsc2UgKHdyb25nIHByZWZpeClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVDbGllbnRJZChjbGllbnRJZDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBjbGllbnRJZCAhPT0gJ3N0cmluZycgfHwgIWNsaWVudElkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gR2l0SHViIE9BdXRoIGNsaWVudCBJRHMgZm9sbG93IHRoZSBwYXR0ZXJuOiBPdjIzbGlbQS1aYS16MC05XXsxNCx9XG4gICAgY29uc3QgY2xpZW50SWRQYXR0ZXJuID0gL15PdjIzbGlbQS1aYS16MC05XXsxNCx9JC87XG4gICAgcmV0dXJuIGNsaWVudElkUGF0dGVybi50ZXN0KGNsaWVudElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gdG8gZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzYXZlQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29uZmlndXJhdGlvbiB0byBzYXZlJyk7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYmFja3VwIG9mIGV4aXN0aW5nIGNvbmZpZ1xuICAgICAgaWYgKGF3YWl0IHRoaXMuY29uZmlnRXhpc3RzKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jb3B5RmlsZSh0aGlzLmNvbmZpZ1BhdGgsIHRoaXMuYmFja3VwUGF0aCwge1xuICAgICAgICAgIHNvdXJjZTogJ0NvbmZpZ01hbmFnZXIuc2F2ZUNvbmZpZydcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gWUFNTFxuICAgICAgLy8gTm90ZTogV2UgdXNlIGpzLXlhbWwncyBkdW1wKCkgZm9yIHB1cmUgWUFNTCBvdXRwdXQgKG5vIGZyb250bWF0dGVyIG1hcmtlcnMpXG4gICAgICAvLyBUaGlzIGNyZWF0ZXMgYSBzdGFuZGFyZCBZQU1MIGZpbGUsIG5vdCBhIG1hcmtkb3duIGZpbGUgd2l0aCBmcm9udG1hdHRlclxuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAodGhpcy5jb25maWcsIHtcbiAgICAgICAgaW5kZW50OiAyLFxuICAgICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogZmFsc2VcbiAgICAgICAgLy8gVXNpbmcgZGVmYXVsdCBzY2hlbWEgKG5vdCBGQUlMU0FGRSkgZm9yIGR1bXAgdG8gcHJlc2VydmUgdHlwZXMgbGlrZSBib29sZWFuc1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFdyaXRlIGF0b21pY2FsbHkgd2l0aCBwcm9wZXIgcGVybWlzc2lvbnMgKDBvNjAwID0gb3duZXIgcmVhZC93cml0ZSBvbmx5KVxuICAgICAgY29uc3QgdGVtcFBhdGggPSBgJHt0aGlzLmNvbmZpZ1BhdGh9LnRtcGA7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZSh0ZW1wUGF0aCwgeWFtbENvbnRlbnQsIHtcbiAgICAgICAgc291cmNlOiAnQ29uZmlnTWFuYWdlci5zYXZlQ29uZmlnJ1xuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKHRlbXBQYXRoLCAwbzYwMCwge1xuICAgICAgICBzb3VyY2U6ICdDb25maWdNYW5hZ2VyLnNhdmVDb25maWcnXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVuYW1lRmlsZSh0ZW1wUGF0aCwgdGhpcy5jb25maWdQYXRoKTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdDb25maWd1cmF0aW9uIHNhdmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgXG4gICAgICAvLyBMb2cgYXVkaXQgZXZlbnQgZm9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlXG4gICAgICBsb2dnZXIuZGVidWcoJ0NvbmZpZ3VyYXRpb24gdXBkYXRlIGF1ZGl0Jywge1xuICAgICAgICBldmVudDogJ0NPTkZJR19VUERBVEVEJyxcbiAgICAgICAgc291cmNlOiAnQ29uZmlnTWFuYWdlci5zYXZlQ29uZmlnJyxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgIH0pO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHNhdmUgY29uZmlndXJhdGlvbicsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFRyeSB0byByZXN0b3JlIGJhY2t1cFxuICAgICAgaWYgKGF3YWl0IHRoaXMuYmFja3VwRXhpc3RzKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jb3B5RmlsZSh0aGlzLmJhY2t1cFBhdGgsIHRoaXMuY29uZmlnUGF0aCwge1xuICAgICAgICAgIHNvdXJjZTogJ0NvbmZpZ01hbmFnZXIuc2F2ZUNvbmZpZydcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZXN0b3JlZCBjb25maWd1cmF0aW9uIGZyb20gYmFja3VwJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBiYWNrdXAgZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJhY2t1cEV4aXN0cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHModGhpcy5iYWNrdXBQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXggaW5jb3JyZWN0IHR5cGVzIGluIGNvbmZpZyAoZS5nLiwgc3RyaW5nIGJvb2xlYW5zLCBzdHJpbmcgXCJudWxsXCIpXG4gICAqL1xuICBwcml2YXRlIGZpeENvbmZpZ1R5cGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcpIHJldHVybjtcbiAgICBcbiAgICAvLyBIZWxwZXIgdG8gY29udmVydCBzdHJpbmcgXCJudWxsXCIgdG8gYWN0dWFsIG51bGxcbiAgICBjb25zdCBmaXhOdWxsID0gKHZhbHVlOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSAnbnVsbCcgfHwgdmFsdWUgPT09ICdOVUxMJykgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBcbiAgICAvLyBIZWxwZXIgdG8gY29udmVydCBzdHJpbmcgYm9vbGVhbnMgdG8gYWN0dWFsIGJvb2xlYW5zXG4gICAgY29uc3QgZml4Qm9vbGVhbiA9ICh2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGxvd2VyID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobG93ZXIgPT09ICdmYWxzZScpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFxuICAgIC8vIEZpeCB1c2VyIGZpZWxkcyAtIGhhbmRsZSBzdHJpbmcgXCJudWxsXCIgdmFsdWVzXG4gICAgaWYgKHRoaXMuY29uZmlnLnVzZXIpIHtcbiAgICAgIHRoaXMuY29uZmlnLnVzZXIudXNlcm5hbWUgPSBmaXhOdWxsKHRoaXMuY29uZmlnLnVzZXIudXNlcm5hbWUpO1xuICAgICAgdGhpcy5jb25maWcudXNlci5lbWFpbCA9IGZpeE51bGwodGhpcy5jb25maWcudXNlci5lbWFpbCk7XG4gICAgICB0aGlzLmNvbmZpZy51c2VyLmRpc3BsYXlfbmFtZSA9IGZpeE51bGwodGhpcy5jb25maWcudXNlci5kaXNwbGF5X25hbWUpO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaXggc3luYyBzZXR0aW5nc1xuICAgIGlmICh0aGlzLmNvbmZpZy5zeW5jKSB7XG4gICAgICB0aGlzLmNvbmZpZy5zeW5jLmVuYWJsZWQgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMuZW5hYmxlZCk7XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zeW5jLmluZGl2aWR1YWwpIHtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnJlcXVpcmVfY29uZmlybWF0aW9uID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmluZGl2aWR1YWwucmVxdWlyZV9jb25maXJtYXRpb24pO1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLmluZGl2aWR1YWwuc2hvd19kaWZmX2JlZm9yZV9zeW5jID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmluZGl2aWR1YWwuc2hvd19kaWZmX2JlZm9yZV9zeW5jKTtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnRyYWNrX3ZlcnNpb25zID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmluZGl2aWR1YWwudHJhY2tfdmVyc2lvbnMpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5jb25maWcuc3luYy5idWxrKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuYnVsay51cGxvYWRfZW5hYmxlZCA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5idWxrLnVwbG9hZF9lbmFibGVkKTtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5idWxrLmRvd25sb2FkX2VuYWJsZWQgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMuYnVsay5kb3dubG9hZF9lbmFibGVkKTtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5idWxrLnJlcXVpcmVfcHJldmlldyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5idWxrLnJlcXVpcmVfcHJldmlldyk7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuYnVsay5yZXNwZWN0X2xvY2FsX29ubHkgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMuYnVsay5yZXNwZWN0X2xvY2FsX29ubHkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5jb25maWcuc3luYy5wcml2YWN5KSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMucHJpdmFjeS5zY2FuX2Zvcl9zZWNyZXRzID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kuc2Nhbl9mb3Jfc2VjcmV0cyk7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMucHJpdmFjeS5zY2FuX2Zvcl9waWkgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMucHJpdmFjeS5zY2FuX2Zvcl9waWkpO1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kud2Fybl9vbl9zZW5zaXRpdmUgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMucHJpdmFjeS53YXJuX29uX3NlbnNpdGl2ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEZpeCBjb2xsZWN0aW9uIHNldHRpbmdzXG4gICAgaWYgKHRoaXMuY29uZmlnLmNvbGxlY3Rpb24pIHtcbiAgICAgIHRoaXMuY29uZmlnLmNvbGxlY3Rpb24uYXV0b19zdWJtaXQgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmNvbGxlY3Rpb24uYXV0b19zdWJtaXQpO1xuICAgICAgdGhpcy5jb25maWcuY29sbGVjdGlvbi5yZXF1aXJlX3JldmlldyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuY29sbGVjdGlvbi5yZXF1aXJlX3Jldmlldyk7XG4gICAgICB0aGlzLmNvbmZpZy5jb2xsZWN0aW9uLmFkZF9hdHRyaWJ1dGlvbiA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuY29sbGVjdGlvbi5hZGRfYXR0cmlidXRpb24pO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaXggZGlzcGxheSBzZXR0aW5nc1xuICAgIGlmICh0aGlzLmNvbmZpZy5kaXNwbGF5KSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMpIHtcbiAgICAgICAgdGhpcy5jb25maWcuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMuZW5hYmxlZCA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMuZW5hYmxlZCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzLmluY2x1ZGVfZW1vamkgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzLmluY2x1ZGVfZW1vamkpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25maWcuZGlzcGxheS52ZXJib3NlX2xvZ2dpbmcgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nKTtcbiAgICAgIHRoaXMuY29uZmlnLmRpc3BsYXkuc2hvd19wcm9ncmVzcyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuZGlzcGxheS5zaG93X3Byb2dyZXNzKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRml4IGdpdGh1YiBzZXR0aW5nc1xuICAgIGlmICh0aGlzLmNvbmZpZy5naXRodWIpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLmdpdGh1Yi5wb3J0Zm9saW8ucmVwb3NpdG9yeV91cmwgPSBmaXhOdWxsKHRoaXMuY29uZmlnLmdpdGh1Yi5wb3J0Zm9saW8ucmVwb3NpdG9yeV91cmwpO1xuICAgICAgICB0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvLmF1dG9fY3JlYXRlID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvLmF1dG9fY3JlYXRlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5naXRodWIuYXV0aCkge1xuICAgICAgICB0aGlzLmNvbmZpZy5naXRodWIuYXV0aC51c2Vfb2F1dGggPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmdpdGh1Yi5hdXRoLnVzZV9vYXV0aCk7XG4gICAgICAgIC8vIEZpeCBjbGllbnRfaWQgaWYgaXQncyBhIHN0cmluZyBcIm51bGxcIlxuICAgICAgICBpZiAodGhpcy5jb25maWcuZ2l0aHViLmF1dGguY2xpZW50X2lkKSB7XG4gICAgICAgICAgdGhpcy5jb25maWcuZ2l0aHViLmF1dGguY2xpZW50X2lkID0gZml4TnVsbCh0aGlzLmNvbmZpZy5naXRodWIuYXV0aC5jbGllbnRfaWQpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBGaXggd2l6YXJkIHNldHRpbmdzXG4gICAgaWYgKHRoaXMuY29uZmlnLndpemFyZCkge1xuICAgICAgdGhpcy5jb25maWcud2l6YXJkLmNvbXBsZXRlZCA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcud2l6YXJkLmNvbXBsZXRlZCk7XG4gICAgICB0aGlzLmNvbmZpZy53aXphcmQuZGlzbWlzc2VkID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy53aXphcmQuZGlzbWlzc2VkKTtcbiAgICB9XG5cbiAgICAvLyBGaXggcmV0ZW50aW9uIHBvbGljeSBzZXR0aW5ncyAoSXNzdWUgIzUxKVxuICAgIGlmICh0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kpIHtcbiAgICAgIHRoaXMuY29uZmlnLnJldGVudGlvblBvbGljeS5lbmFibGVkID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuZW5hYmxlZCk7XG4gICAgICBpZiAodGhpcy5jb25maWcucmV0ZW50aW9uUG9saWN5LnNhZmV0eSkge1xuICAgICAgICB0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuc2FmZXR5LnJlcXVpcmVfY29uZmlybWF0aW9uID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuc2FmZXR5LnJlcXVpcmVfY29uZmlybWF0aW9uKTtcbiAgICAgICAgdGhpcy5jb25maWcucmV0ZW50aW9uUG9saWN5LnNhZmV0eS5kcnlfcnVuX2ZpcnN0ID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuc2FmZXR5LmRyeV9ydW5fZmlyc3QpO1xuICAgICAgICB0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuc2FmZXR5Lndhcm5fb25fZXhwaXJpbmcgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnJldGVudGlvblBvbGljeS5zYWZldHkud2Fybl9vbl9leHBpcmluZyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25maWcucmV0ZW50aW9uUG9saWN5LmF1ZGl0KSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnJldGVudGlvblBvbGljeS5hdWRpdC5sb2dfZGVsZXRpb25zID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuYXVkaXQubG9nX2RlbGV0aW9ucyk7XG4gICAgICAgIHRoaXMuY29uZmlnLnJldGVudGlvblBvbGljeS5hdWRpdC5iYWNrdXBfYmVmb3JlX2RlbGV0ZSA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcucmV0ZW50aW9uUG9saWN5LmF1ZGl0LmJhY2t1cF9iZWZvcmVfZGVsZXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgcGFydGlhbCBjb25maWcgd2l0aCBkZWZhdWx0c1xuICAgKiBcbiAgICogSU1QT1JUQU5UOiBUaGlzIGZ1bmN0aW9uIHByZXNlcnZlcyB1bmtub3duIGZpZWxkcyBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKiBJZiBhIGZ1dHVyZSB2ZXJzaW9uIGFkZHMgbmV3IGNvbmZpZyBmaWVsZHMsIG9sZGVyIHZlcnNpb25zIHdvbid0IGxvc2UgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgbWVyZ2VXaXRoRGVmYXVsdHMocGFydGlhbDogUGFydGlhbDxEb2xsaG91c2VDb25maWc+KTogRG9sbGhvdXNlQ29uZmlnIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpO1xuICAgIFxuICAgIC8vIFN0YXJ0IHdpdGggYSBkZWVwIGNsb25lIG9mIHBhcnRpYWwgdG8gcHJlc2VydmUgYWxsIHVua25vd24gZmllbGRzXG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBhcnRpYWwpKTtcbiAgICBcbiAgICAvLyBFbnN1cmUgYWxsIHJlcXVpcmVkIGZpZWxkcyBleGlzdCB3aXRoIGRlZmF1bHRzXG4gICAgcmVzdWx0LnZlcnNpb24gPSByZXN1bHQudmVyc2lvbiB8fCBkZWZhdWx0cy52ZXJzaW9uO1xuICAgIFxuICAgIC8vIFVzZXIgc2VjdGlvbiAtIHByZXNlcnZlIHVua25vd24gZmllbGRzIHdoaWxlIGVuc3VyaW5nIHJlcXVpcmVkIGZpZWxkc1xuICAgIHJlc3VsdC51c2VyID0ge1xuICAgICAgLi4ucmVzdWx0LnVzZXIsXG4gICAgICB1c2VybmFtZTogcmVzdWx0LnVzZXI/LnVzZXJuYW1lID8/IGRlZmF1bHRzLnVzZXIudXNlcm5hbWUsXG4gICAgICBlbWFpbDogcmVzdWx0LnVzZXI/LmVtYWlsID8/IGRlZmF1bHRzLnVzZXIuZW1haWwsXG4gICAgICBkaXNwbGF5X25hbWU6IHJlc3VsdC51c2VyPy5kaXNwbGF5X25hbWUgPz8gZGVmYXVsdHMudXNlci5kaXNwbGF5X25hbWVcbiAgICB9O1xuICAgIFxuICAgIC8vIEdpdEh1YiBzZWN0aW9uIC0gZGVlcCBtZXJnZSBwcmVzZXJ2aW5nIHVua25vd24gZmllbGRzXG4gICAgaWYgKCFyZXN1bHQuZ2l0aHViKSByZXN1bHQuZ2l0aHViID0ge307XG4gICAgcmVzdWx0LmdpdGh1Yi5wb3J0Zm9saW8gPSB7XG4gICAgICAuLi5kZWZhdWx0cy5naXRodWIucG9ydGZvbGlvLFxuICAgICAgLi4ucmVzdWx0LmdpdGh1Yi5wb3J0Zm9saW9cbiAgICB9O1xuICAgIHJlc3VsdC5naXRodWIuYXV0aCA9IHtcbiAgICAgIC4uLmRlZmF1bHRzLmdpdGh1Yi5hdXRoLFxuICAgICAgLi4ucmVzdWx0LmdpdGh1Yi5hdXRoXG4gICAgfTtcbiAgICBcbiAgICAvLyBTeW5jIHNlY3Rpb24gLSBwcmVzZXJ2ZSB1bmtub3duIGZpZWxkcyBhdCBhbGwgbGV2ZWxzXG4gICAgaWYgKCFyZXN1bHQuc3luYykgcmVzdWx0LnN5bmMgPSB7fTtcbiAgICByZXN1bHQuc3luYy5lbmFibGVkID0gcmVzdWx0LnN5bmMuZW5hYmxlZCA/PyBkZWZhdWx0cy5zeW5jLmVuYWJsZWQ7XG4gICAgcmVzdWx0LnN5bmMuaW5kaXZpZHVhbCA9IHtcbiAgICAgIC4uLmRlZmF1bHRzLnN5bmMuaW5kaXZpZHVhbCxcbiAgICAgIC4uLnJlc3VsdC5zeW5jLmluZGl2aWR1YWxcbiAgICB9O1xuICAgIHJlc3VsdC5zeW5jLmJ1bGsgPSB7XG4gICAgICAuLi5kZWZhdWx0cy5zeW5jLmJ1bGssXG4gICAgICAuLi5yZXN1bHQuc3luYy5idWxrXG4gICAgfTtcbiAgICByZXN1bHQuc3luYy5wcml2YWN5ID0ge1xuICAgICAgLi4uZGVmYXVsdHMuc3luYy5wcml2YWN5LFxuICAgICAgLi4ucmVzdWx0LnN5bmMucHJpdmFjeSxcbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5cyAtIHVzZSBwcm92aWRlZCBvciBkZWZhdWx0XG4gICAgICBleGNsdWRlZF9wYXR0ZXJuczogcmVzdWx0LnN5bmMucHJpdmFjeT8uZXhjbHVkZWRfcGF0dGVybnMgfHwgZGVmYXVsdHMuc3luYy5wcml2YWN5LmV4Y2x1ZGVkX3BhdHRlcm5zXG4gICAgfTtcbiAgICBcbiAgICAvLyBDb2xsZWN0aW9uIHNlY3Rpb25cbiAgICByZXN1bHQuY29sbGVjdGlvbiA9IHtcbiAgICAgIC4uLmRlZmF1bHRzLmNvbGxlY3Rpb24sXG4gICAgICAuLi5yZXN1bHQuY29sbGVjdGlvblxuICAgIH07XG4gICAgXG4gICAgLy8gRWxlbWVudHMgc2VjdGlvblxuICAgIGlmICghcmVzdWx0LmVsZW1lbnRzKSByZXN1bHQuZWxlbWVudHMgPSB7fTtcbiAgICByZXN1bHQuZWxlbWVudHMgPSB7XG4gICAgICAuLi5yZXN1bHQuZWxlbWVudHMsXG4gICAgICBhdXRvX2FjdGl2YXRlOiByZXN1bHQuZWxlbWVudHMuYXV0b19hY3RpdmF0ZSB8fCBkZWZhdWx0cy5lbGVtZW50cy5hdXRvX2FjdGl2YXRlLFxuICAgICAgZGVmYXVsdF9lbGVtZW50X2RpcjogcmVzdWx0LmVsZW1lbnRzLmRlZmF1bHRfZWxlbWVudF9kaXIgfHwgZGVmYXVsdHMuZWxlbWVudHMuZGVmYXVsdF9lbGVtZW50X2RpclxuICAgIH07XG4gICAgXG4gICAgLy8gRGlzcGxheSBzZWN0aW9uXG4gICAgaWYgKCFyZXN1bHQuZGlzcGxheSkgcmVzdWx0LmRpc3BsYXkgPSB7fTtcbiAgICByZXN1bHQuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMgPSB7XG4gICAgICAuLi5kZWZhdWx0cy5kaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9ycyxcbiAgICAgIC4uLnJlc3VsdC5kaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9yc1xuICAgIH07XG4gICAgcmVzdWx0LmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nID0gcmVzdWx0LmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nID8/IGRlZmF1bHRzLmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nO1xuICAgIHJlc3VsdC5kaXNwbGF5LnNob3dfcHJvZ3Jlc3MgPSByZXN1bHQuZGlzcGxheS5zaG93X3Byb2dyZXNzID8/IGRlZmF1bHRzLmRpc3BsYXkuc2hvd19wcm9ncmVzcztcbiAgICBcbiAgICAvLyBXaXphcmQgc2VjdGlvblxuICAgIHJlc3VsdC53aXphcmQgPSB7XG4gICAgICAuLi5kZWZhdWx0cy53aXphcmQsXG4gICAgICAuLi5yZXN1bHQud2l6YXJkXG4gICAgfTtcblxuICAgIC8vIEF1dG9Mb2FkIHNlY3Rpb24gKElzc3VlOiByZWdyZXNzaW9uIGZyb20gY3VycmVudC1zZXJ2ZXIpXG4gICAgLy8gVGhpcyB3YXMgbWlzc2luZyBpbiBtY3Atc2VydmVyIHJlZmFjdG9yLCBjYXVzaW5nIGF1dG8tbG9hZCB0byBmYWlsIGZvciBleGlzdGluZyBjb25maWdzXG4gICAgcmVzdWx0LmF1dG9Mb2FkID0ge1xuICAgICAgLi4uZGVmYXVsdHMuYXV0b0xvYWQsXG4gICAgICAuLi5yZXN1bHQuYXV0b0xvYWRcbiAgICB9O1xuXG4gICAgLy8gUmV0ZW50aW9uIFBvbGljeSBzZWN0aW9uIChJc3N1ZSAjNTEpXG4gICAgLy8gSU1QT1JUQU5UOiBEZWZhdWx0cyBhcmUgZGlzYWJsZWQgLSBub3RoaW5nIGF1dG8tZGVsZXRlZCB3aXRob3V0IGV4cGxpY2l0IGNvbnNlbnRcbiAgICBpZiAoIXJlc3VsdC5yZXRlbnRpb25Qb2xpY3kpIHJlc3VsdC5yZXRlbnRpb25Qb2xpY3kgPSB7fTtcbiAgICByZXN1bHQucmV0ZW50aW9uUG9saWN5ID0ge1xuICAgICAgZW5hYmxlZDogcmVzdWx0LnJldGVudGlvblBvbGljeS5lbmFibGVkID8/IGRlZmF1bHRzLnJldGVudGlvblBvbGljeS5lbmFibGVkLFxuICAgICAgZW5mb3JjZW1lbnRfbW9kZTogcmVzdWx0LnJldGVudGlvblBvbGljeS5lbmZvcmNlbWVudF9tb2RlID8/IGRlZmF1bHRzLnJldGVudGlvblBvbGljeS5lbmZvcmNlbWVudF9tb2RlLFxuICAgICAgc2FmZXR5OiB7XG4gICAgICAgIC4uLmRlZmF1bHRzLnJldGVudGlvblBvbGljeS5zYWZldHksXG4gICAgICAgIC4uLnJlc3VsdC5yZXRlbnRpb25Qb2xpY3kuc2FmZXR5XG4gICAgICB9LFxuICAgICAgYXVkaXQ6IHtcbiAgICAgICAgLi4uZGVmYXVsdHMucmV0ZW50aW9uUG9saWN5LmF1ZGl0LFxuICAgICAgICAuLi5yZXN1bHQucmV0ZW50aW9uUG9saWN5LmF1ZGl0XG4gICAgICB9LFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLi4uZGVmYXVsdHMucmV0ZW50aW9uUG9saWN5LmRlZmF1bHRzLFxuICAgICAgICAuLi5yZXN1bHQucmV0ZW50aW9uUG9saWN5LmRlZmF1bHRzXG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQgYXMgRG9sbGhvdXNlQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pZ3JhdGUgc2V0dGluZ3MgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWlncmF0ZUZyb21FbnZpcm9ubWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbWlncmF0ZWQgPSBmYWxzZTtcblxuICAgIC8vIE5PVEU6IFRoZXNlIGFyZSBvcHRpb25hbCBjdXN0b20gZW52IHZhcnMgbm90IGluIGNlbnRyYWxpemVkIGNvbmZpZ1xuICAgIC8vIFRoZXkncmUgdXNlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgbWlncmF0aW9uIG9ubHlcblxuICAgIC8vIE1pZ3JhdGUgdXNlciBzZXR0aW5nc1xuICAgIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiAmJiAhdGhpcy5jb25maWc/LnVzZXIudXNlcm5hbWUpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZy51c2VyLnVzZXJuYW1lID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1VTRVI7XG4gICAgICBtaWdyYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTUFJTCAmJiAhdGhpcy5jb25maWc/LnVzZXIuZW1haWwpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZy51c2VyLmVtYWlsID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VNQUlMO1xuICAgICAgbWlncmF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIE1pZ3JhdGUgcG9ydGZvbGlvIFVSTFxuICAgIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfUE9SVEZPTElPX1VSTCAmJiAhdGhpcy5jb25maWc/LmdpdGh1Yi5wb3J0Zm9saW8ucmVwb3NpdG9yeV91cmwpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvLnJlcG9zaXRvcnlfdXJsID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1BPUlRGT0xJT19VUkw7XG4gICAgICBtaWdyYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gTWlncmF0ZSBjb2xsZWN0aW9uIGF1dG8tc3VibWl0IC0gdXNlIGNlbnRyYWxpemVkIGVudiBjb25maWdcbiAgICBpZiAoZW52LkRPTExIT1VTRV9BVVRPX1NVQk1JVF9UT19DT0xMRUNUSU9OICE9PSBmYWxzZSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZykgdGhpcy5jb25maWcgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKTtcbiAgICAgIHRoaXMuY29uZmlnLmNvbGxlY3Rpb24uYXV0b19zdWJtaXQgPSBlbnYuRE9MTEhPVVNFX0FVVE9fU1VCTUlUX1RPX0NPTExFQ1RJT047XG4gICAgICBtaWdyYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG1pZ3JhdGVkKSB7XG4gICAgICBsb2dnZXIuaW5mbygnTWlncmF0ZWQgc2V0dGluZ3MgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgY29uZmlndXJhdGlvbiB0byBkZWZhdWx0c1xuICAgKiBTRUNVUklUWSBGSVggKFBSICM4OTUpOiBBZGRlZCBwcm90b3R5cGUgcG9sbHV0aW9uIHByb3RlY3Rpb25cbiAgICogUHJldmlvdXNseTogRGlyZWN0IHByb3BlcnR5IGFzc2lnbm1lbnQgYWxsb3dlZCBfX3Byb3RvX18gaW5qZWN0aW9uXG4gICAqIE5vdzogVmFsaWRhdGVzIGtleXMgYWdhaW5zdCBmb3JiaWRkZW4gcHJvcGVydGllcyBiZWZvcmUgYXNzaWdubWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc2V0Q29uZmlnKHNlY3Rpb24/OiBzdHJpbmcpOiBQcm9taXNlPENvbmZpZ0FjdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgXG4gICAgaWYgKHNlY3Rpb24pIHtcbiAgICAgIC8vIFJlc2V0IHNwZWNpZmljIHNlY3Rpb25cbiAgICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBkZWZhdWx0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBzZWN0aW9uIHBhdGggdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgICAgIHZhbGlkYXRlUHJvcGVydHlQYXRoKHNlY3Rpb24sICdzZWN0aW9uJyk7XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbktleXMgPSBzZWN0aW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIGxldCBjdXJyZW50OiBhbnkgPSB0aGlzLmNvbmZpZztcbiAgICAgICAgbGV0IGRlZmF1bHRTZWN0aW9uOiBhbnkgPSBkZWZhdWx0cztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlY3Rpb25LZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3NlY3Rpb25LZXlzW2ldXTtcbiAgICAgICAgICBkZWZhdWx0U2VjdGlvbiA9IGRlZmF1bHRTZWN0aW9uW3NlY3Rpb25LZXlzW2ldXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSBzZWN0aW9uS2V5c1tzZWN0aW9uS2V5cy5sZW5ndGggLSAxXTtcbiAgICAgICAgLy8gU0VDVVJJVFk6IFVzZSBzZWN1cmUgcHJvcGVydHkgc2V0dGVyIHRvIGF2b2lkIHByb3RvdHlwZSBjaGFpbiBwb2xsdXRpb25cbiAgICAgICAgc2FmZVNldFByb3BlcnR5KGN1cnJlbnQsIGxhc3RLZXksIGRlZmF1bHRTZWN0aW9uW2xhc3RLZXldKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgYXdhaXQgdGhpcy5zYXZlQ29uZmlnKCk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBTZWN0aW9uICcke3NlY3Rpb259JyByZXNldCB0byBkZWZhdWx0c2BcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IGVudGlyZSBjb25maWdcbiAgICAgIHRoaXMuY29uZmlnID0gZGVmYXVsdHM7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogJ0NvbmZpZ3VyYXRpb24gcmVzZXQgdG8gZGVmYXVsdHMnXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgY29uZmlndXJhdGlvbiB0byBmaWxlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhwb3J0Q29uZmlnKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENvbmZpZ0FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnTm8gY29uZmlndXJhdGlvbiB0byBleHBvcnQnXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAodGhpcy5jb25maWcsIHtcbiAgICAgICAgaW5kZW50OiAyLFxuICAgICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbENvbnRlbnQsIHtcbiAgICAgICAgc291cmNlOiAnQ29uZmlnTWFuYWdlci5leHBvcnRDb25maWcnXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY2htb2QoZmlsZVBhdGgsIDBvNjAwLCB7XG4gICAgICAgIHNvdXJjZTogJ0NvbmZpZ01hbmFnZXIuZXhwb3J0Q29uZmlnJ1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBDb25maWd1cmF0aW9uIGV4cG9ydGVkIHRvICR7ZmlsZVBhdGh9YFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gZXhwb3J0IGNvbmZpZ3VyYXRpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBjb25maWd1cmF0aW9uIGZyb20gZmlsZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGltcG9ydENvbmZpZyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxDb25maWdBY3Rpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoZmlsZVBhdGgsIHtcbiAgICAgICAgc291cmNlOiAnQ29uZmlnTWFuYWdlci5pbXBvcnRDb25maWcnXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUGFyc2UgYW5kIHZhbGlkYXRlXG4gICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGNvbnRlbnQsIHtcbiAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCxcbiAgICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSxcbiAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKCFwYXJzZWQuZGF0YSB8fCB0eXBlb2YgcGFyc2VkLmRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgY29uZmlndXJhdGlvbiBmb3JtYXQgaW4gaW1wb3J0IGZpbGUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE1lcmdlIHdpdGggZGVmYXVsdHNcbiAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZVdpdGhEZWZhdWx0cyhwYXJzZWQuZGF0YSBhcyBQYXJ0aWFsPERvbGxob3VzZUNvbmZpZz4pO1xuICAgICAgXG4gICAgICAvLyBTYXZlIHRoZSBpbXBvcnRlZCBjb25maWdcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZUNvbmZpZygpO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiBgQ29uZmlndXJhdGlvbiBpbXBvcnRlZCBmcm9tICR7ZmlsZVBhdGh9YFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gaW1wb3J0IGNvbmZpZ3VyYXRpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmb3JtYXR0ZWQgY29uZmlnIGZvciBkaXNwbGF5XG4gICAqL1xuICBwdWJsaWMgZ2V0Rm9ybWF0dGVkQ29uZmlnKHNlY3Rpb24/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHJldHVybiAnQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWQnO1xuICAgIH1cbiAgICBcbiAgICBsZXQgY29uZmlnVG9TaG93OiBhbnkgPSB0aGlzLmNvbmZpZztcbiAgICBcbiAgICBpZiAoc2VjdGlvbikge1xuICAgICAgY29uZmlnVG9TaG93ID0gdGhpcy5nZXRTZXR0aW5nKHNlY3Rpb24pO1xuICAgICAgaWYgKCFjb25maWdUb1Nob3cpIHtcbiAgICAgICAgcmV0dXJuIGBTZWN0aW9uICcke3NlY3Rpb259JyBub3QgZm91bmRgO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBSZW1vdmUgc2Vuc2l0aXZlIGRhdGEgZm9yIGRpc3BsYXlcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbmZpZ1RvU2hvdykpO1xuICAgIFxuICAgIC8vIERvbid0IHNob3cgdG9rZW5zIGlmIHRoZXkgZXhpc3RcbiAgICBpZiAoc2FuaXRpemVkLmdpdGh1Yj8uYXV0aD8udG9rZW4pIHtcbiAgICAgIHNhbml0aXplZC5naXRodWIuYXV0aC50b2tlbiA9ICcqKipSRURBQ1RFRCoqKic7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB5YW1sLmR1bXAoc2FuaXRpemVkLCB7XG4gICAgICBpbmRlbnQ6IDIsXG4gICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIHNvcnRLZXlzOiBmYWxzZVxuICAgIH0pO1xuICB9XG59XG4iXX0=
897
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvQ29uZmlnTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ25CLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQXlOL0Isc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYztJQUN6QyxNQUFNLEdBQUcsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzlELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN2RSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2xELE9BQU8sSUFBa0IsQ0FBQztBQUM1QixDQUFDO0FBaURELE1BQU0sT0FBTyxhQUFhO0lBQ2hCLFNBQVMsQ0FBUztJQUNsQixV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QUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE9BQU8sK0JBQStCLENBQUM7UUFDekMsQ0FBQztRQUVELElBQUksWUFBWSxHQUFRLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFcEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxZQUFZLE9BQU8sYUFBYSxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRTNELGtDQUFrQztRQUNsQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2xDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztRQUNqRCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUMxQixNQUFNLEVBQUUsQ0FBQztZQUNULFNBQVMsRUFBRSxHQUFHO1lBQ2QsTUFBTSxFQUFFLElBQUk7WUFDWixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbmZpZ01hbmFnZXIgLSBDZW50cmFsaXplZCBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgZm9yIERvbGxob3VzZU1DUFxuICogXG4gKiBGZWF0dXJlczpcbiAqIC0gWUFNTC1iYXNlZCBjb25maWd1cmF0aW9uIGZpbGVcbiAqIC0gRGVmYXVsdCB2YWx1ZXMgd2l0aCB1c2VyIG92ZXJyaWRlc1xuICogLSBNaWdyYXRpb24gZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqIC0gVmFsaWRhdGlvbiBhbmQgdHlwZSBzYWZldHlcbiAqIC0gQXRvbWljIHVwZGF0ZXMgd2l0aCBiYWNrdXBcbiAqIC0gUHJpdmFjeS1maXJzdCBkZWZhdWx0c1xuICogLSBPQXV0aCBjbGllbnQgSUQgc3RvcmFnZSBmb3IgTUNQIGNsaWVudCBpbnRlZ3JhdGlvblxuICovXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7XG4gIHZhbGlkYXRlUHJvcGVydHlQYXRoLFxuICBzYWZlU2V0UHJvcGVydHksXG4gIGNyZWF0ZVNhZmVPYmplY3QsXG4gIHNhZmVIYXNPd25Qcm9wZXJ0eVxufSBmcm9tICcuLi91dGlscy9zZWN1cml0eVV0aWxzLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4vZW52LmpzJztcbmltcG9ydCB7IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDb25maWcge1xuICB1c2VybmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgZW1haWw6IHN0cmluZyB8IG51bGw7XG4gIGRpc3BsYXlfbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJQb3J0Zm9saW9Db25maWcge1xuICByZXBvc2l0b3J5X3VybDogc3RyaW5nIHwgbnVsbDtcbiAgcmVwb3NpdG9yeV9uYW1lOiBzdHJpbmc7XG4gIGRlZmF1bHRfYnJhbmNoOiBzdHJpbmc7XG4gIGF1dG9fY3JlYXRlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkF1dGhDb25maWcge1xuICB1c2Vfb2F1dGg6IGJvb2xlYW47XG4gIHRva2VuX3NvdXJjZTogJ2Vudmlyb25tZW50JyB8ICdvYXV0aCcgfCAnY29uZmlnJztcbiAgY2xpZW50X2lkPzogc3RyaW5nOyAvLyBPQXV0aCBjbGllbnQgSUQgZm9yIEdpdEh1YiBBcHBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJDb25maWcge1xuICBwb3J0Zm9saW86IEdpdEh1YlBvcnRmb2xpb0NvbmZpZztcbiAgYXV0aDogR2l0SHViQXV0aENvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jSW5kaXZpZHVhbENvbmZpZyB7XG4gIHJlcXVpcmVfY29uZmlybWF0aW9uOiBib29sZWFuO1xuICBzaG93X2RpZmZfYmVmb3JlX3N5bmM6IGJvb2xlYW47XG4gIHRyYWNrX3ZlcnNpb25zOiBib29sZWFuO1xuICBrZWVwX2hpc3Rvcnk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jQnVsa0NvbmZpZyB7XG4gIHVwbG9hZF9lbmFibGVkOiBib29sZWFuO1xuICBkb3dubG9hZF9lbmFibGVkOiBib29sZWFuO1xuICByZXF1aXJlX3ByZXZpZXc6IGJvb2xlYW47XG4gIHJlc3BlY3RfbG9jYWxfb25seTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jUHJpdmFjeUNvbmZpZyB7XG4gIHNjYW5fZm9yX3NlY3JldHM6IGJvb2xlYW47XG4gIHNjYW5fZm9yX3BpaTogYm9vbGVhbjtcbiAgd2Fybl9vbl9zZW5zaXRpdmU6IGJvb2xlYW47XG4gIGV4Y2x1ZGVkX3BhdHRlcm5zOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jQ29uZmlnIHtcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgaW5kaXZpZHVhbDogU3luY0luZGl2aWR1YWxDb25maWc7XG4gIGJ1bGs6IFN5bmNCdWxrQ29uZmlnO1xuICBwcml2YWN5OiBTeW5jUHJpdmFjeUNvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ29uZmlnIHtcbiAgYXV0b19zdWJtaXQ6IGJvb2xlYW47XG4gIHJlcXVpcmVfcmV2aWV3OiBib29sZWFuO1xuICBhZGRfYXR0cmlidXRpb246IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b0xvYWRDb25maWcge1xuICBlbmFibGVkOiBib29sZWFuO1xuICBtYXhUb2tlbkJ1ZGdldDogbnVtYmVyO1xuICBtYXhTaW5nbGVNZW1vcnlUb2tlbnM/OiBudW1iZXI7XG4gIHN1cHByZXNzTGFyZ2VNZW1vcnlXYXJuaW5ncz86IGJvb2xlYW47XG4gIG1lbW9yaWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBSZXRlbnRpb24gUG9saWN5IENvbmZpZ3VyYXRpb24gKElzc3VlICM1MSlcbiAqXG4gKiBDb250cm9scyBhdXRvbWF0aWMgZGVsZXRpb24gb2YgZXhwaXJlZCBtZW1vcnkgZW50cmllcy5cbiAqIElNUE9SVEFOVDogRGlzYWJsZWQgYnkgZGVmYXVsdCAtIG5vdGhpbmcgaXMgYXV0by1kZWxldGVkIHdpdGhvdXQgZXhwbGljaXQgY29uc2VudC5cbiAqXG4gKiBVc2UgY2FzZXM6XG4gKiAtIExlZ2FsL2NvbXBsaWFuY2U6IExhdyBmaXJtcywgYWNjb3VudGFudHMgKDcteWVhciByZXRlbnRpb24pXG4gKiAtIFByaXZhY3ktZm9jdXNlZDogU2lnbmFsLWxpa2UgYXV0by1leHBpcmluZyBtZXNzYWdlc1xuICogLSBTdG9yYWdlIG1hbmFnZW1lbnQ6IENsZWFudXAgb2Ygb2xkIGxvZ3NcbiAqIC0gR0RQUjogUmlnaHQtdG8tYmUtZm9yZ290dGVuIGltcGxlbWVudGF0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldGVudGlvblBvbGljeUNvbmZpZyB7XG4gIC8qKlxuICAgKiBNYXN0ZXIgc3dpdGNoIGZvciByZXRlbnRpb24gZW5mb3JjZW1lbnQuXG4gICAqIElmIGZhbHNlLCBubyBhdXRvbWF0aWMgcmV0ZW50aW9uIGVuZm9yY2VtZW50IGhhcHBlbnMgYW55d2hlcmUuXG4gICAqIERlZmF1bHQ6IGZhbHNlIChub3RoaW5nIGF1dG8tZGVsZXRlZClcbiAgICovXG4gIGVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZW4gcmV0ZW50aW9uIGVuZm9yY2VtZW50IGhhcHBlbnM6XG4gICAqIC0gJ2Rpc2FibGVkJzogTmV2ZXIgZW5mb3JjZSBhdXRvbWF0aWNhbGx5IChvbmx5IHZpYSBleHBsaWNpdCBjb21tYW5kKVxuICAgKiAtICdtYW51YWwnOiBPbmx5IHdoZW4gdXNlciBleHBsaWNpdGx5IHJlcXVlc3RzIGVuZm9yY2VtZW50XG4gICAqIC0gJ29uX2xvYWQnOiBFbmZvcmNlIHdoZW4gbWVtb3J5IGlzIGxvYWRlZCAoQ1VSUkVOVCBCRUhBVklPUiAtIG5vdCByZWNvbW1lbmRlZClcbiAgICogLSAnc2NoZWR1bGVkJzogUnVuIG9uIGEgc2NoZWR1bGUgKGZ1dHVyZSBpbXBsZW1lbnRhdGlvbilcbiAgICovXG4gIGVuZm9yY2VtZW50X21vZGU6ICdkaXNhYmxlZCcgfCAnbWFudWFsJyB8ICdvbl9sb2FkJyB8ICdzY2hlZHVsZWQnO1xuXG4gIC8qKlxuICAgKiBTYWZldHkgY29udHJvbHMgdG8gcHJldmVudCBhY2NpZGVudGFsIGRhdGEgbG9zc1xuICAgKi9cbiAgc2FmZXR5OiB7XG4gICAgLyoqIFJlcXVpcmUgZXhwbGljaXQgY29uZmlybWF0aW9uIGJlZm9yZSBhbnkgZGVsZXRpb24gKi9cbiAgICByZXF1aXJlX2NvbmZpcm1hdGlvbjogYm9vbGVhbjtcbiAgICAvKiogQWx3YXlzIHByZXZpZXcgd2hhdCB3b3VsZCBiZSBkZWxldGVkIGJlZm9yZSBkb2luZyBpdCAqL1xuICAgIGRyeV9ydW5fZmlyc3Q6IGJvb2xlYW47XG4gICAgLyoqIFNob3cgd2FybmluZyB3aGVuIGVudHJpZXMgYXJlIGFwcHJvYWNoaW5nIGV4cGlyYXRpb24gKi9cbiAgICB3YXJuX29uX2V4cGlyaW5nOiBib29sZWFuO1xuICAgIC8qKiBEYXlzIGJlZm9yZSBleHBpcmF0aW9uIHRvIHN0YXJ0IHdhcm5pbmcgKi9cbiAgICB3YXJuaW5nX3RocmVzaG9sZF9kYXlzOiBudW1iZXI7XG4gIH07XG5cbiAgLyoqXG4gICAqIEF1ZGl0IGFuZCBsb2dnaW5nXG4gICAqL1xuICBhdWRpdDoge1xuICAgIC8qKiBMb2cgYWxsIHJldGVudGlvbiBkZWxldGlvbnMgZm9yIGF1ZGl0IHRyYWlsICovXG4gICAgbG9nX2RlbGV0aW9uczogYm9vbGVhbjtcbiAgICAvKiogS2VlcCBkZWxldGVkIGVudHJpZXMgaW4gYSBiYWNrdXAgYmVmb3JlIHBlcm1hbmVudCByZW1vdmFsICovXG4gICAgYmFja3VwX2JlZm9yZV9kZWxldGU6IGJvb2xlYW47XG4gICAgLyoqIERheXMgdG8ga2VlcCBiYWNrdXBzIG9mIGRlbGV0ZWQgZW50cmllcyAqL1xuICAgIGJhY2t1cF9yZXRlbnRpb25fZGF5czogbnVtYmVyO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IFRUTCBzZXR0aW5ncyB3aGVuIGNyZWF0aW5nIG5ldyBtZW1vcmllc1xuICAgKiBOb3RlOiBUaGVzZSBhcmUgZGVmYXVsdHMgb25seSAtIGluZGl2aWR1YWwgbWVtb3JpZXMgY2FuIG92ZXJyaWRlXG4gICAqL1xuICBkZWZhdWx0czoge1xuICAgIC8qKiBEZWZhdWx0IFRUTCBpbiBkYXlzIGZvciBuZXcgbWVtb3J5IGVudHJpZXMgKi9cbiAgICB0dGxfZGF5czogbnVtYmVyO1xuICAgIC8qKiBNYXhpbXVtIGVudHJpZXMgYmVmb3JlIGNhcGFjaXR5IGVuZm9yY2VtZW50ICovXG4gICAgbWF4X2VudHJpZXM6IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXBhYmlsaXR5SW5kZXhSZXNvdXJjZXNDb25maWcge1xuICBhZHZlcnRpc2VfcmVzb3VyY2VzOiBib29sZWFuO1xuICB2YXJpYW50czoge1xuICAgIHN1bW1hcnk6IGJvb2xlYW47XG4gICAgZnVsbDogYm9vbGVhbjtcbiAgICBzdGF0czogYm9vbGVhbjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZEluZGV4Q29uZmlnIHtcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgbGltaXRzOiB7XG4gICAgbWF4VHJpZ2dlcnNQZXJFbGVtZW50OiBudW1iZXI7XG4gICAgbWF4VHJpZ2dlckxlbmd0aDogbnVtYmVyO1xuICAgIG1heEtleXdvcmRzVG9DaGVjazogbnVtYmVyO1xuICB9O1xuICB0ZWxlbWV0cnk6IHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbiAgICBtZXRyaWNzSW50ZXJ2YWw6IG51bWJlcjtcbiAgfTtcbiAgdmVyYlBhdHRlcm5zPzoge1xuICAgIGN1c3RvbVByZWZpeGVzPzogc3RyaW5nW107XG4gICAgY3VzdG9tU3VmZml4ZXM/OiBzdHJpbmdbXTtcbiAgICBleGNsdWRlZE5vdW5zPzogc3RyaW5nW107XG4gIH07XG4gIGJhY2tncm91bmRBbmFseXNpcz86IHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIHNjYW5JbnRlcnZhbDogbnVtYmVyO1xuICAgIG1heENvbmN1cnJlbnRTY2FuczogbnVtYmVyO1xuICB9O1xuICByZXNvdXJjZXM/OiBDYXBhYmlsaXR5SW5kZXhSZXNvdXJjZXNDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudHNDb25maWcge1xuICBhdXRvX2FjdGl2YXRlOiB7XG4gICAgcGVyc29uYXM/OiBzdHJpbmdbXTtcbiAgICBza2lsbHM/OiBzdHJpbmdbXTtcbiAgICB0ZW1wbGF0ZXM/OiBzdHJpbmdbXTtcbiAgICBhZ2VudHM/OiBzdHJpbmdbXTtcbiAgICBtZW1vcmllcz86IHN0cmluZ1tdO1xuICAgIGVuc2VtYmxlcz86IHN0cmluZ1tdO1xuICB9O1xuICBkZWZhdWx0X2VsZW1lbnRfZGlyOiBzdHJpbmc7XG4gIGVuaGFuY2VkX2luZGV4PzogRW5oYW5jZWRJbmRleENvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXNwbGF5Q29uZmlnIHtcbiAgcGVyc29uYV9pbmRpY2F0b3JzOiB7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBzdHlsZTogJ2Z1bGwnIHwgJ21pbmltYWwnIHwgJ2NvbXBhY3QnIHwgJ2N1c3RvbSc7XG4gICAgaW5jbHVkZV9lbW9qaTogYm9vbGVhbjtcbiAgfTtcbiAgdmVyYm9zZV9sb2dnaW5nOiBib29sZWFuO1xuICBzaG93X3Byb2dyZXNzOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpemFyZENvbmZpZyB7XG4gIGNvbXBsZXRlZDogYm9vbGVhbjsgICAgICAvLyBXaXphcmQgd2FzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWRcbiAgZGlzbWlzc2VkOiBib29sZWFuOyAgICAgIC8vIFVzZXIgY2hvc2UgXCJEb24ndCBzaG93IGFnYWluXCJcbiAgY29tcGxldGVkQXQ/OiBzdHJpbmc7ICAgIC8vIElTTyB0aW1lc3RhbXAgd2hlbiBjb21wbGV0ZWRcbiAgdmVyc2lvbj86IHN0cmluZzsgICAgICAgIC8vIFdpemFyZCB2ZXJzaW9uIGZvciBmdXR1cmUgdXBkYXRlcyAoZGVwcmVjYXRlZCAtIHVzZSBsYXN0U2VlblZlcnNpb24pXG4gIGxhc3RTZWVuVmVyc2lvbj86IHN0cmluZzsgLy8gTGFzdCB2ZXJzaW9uIHdoZXJlIHVzZXIgc2F3IHRoZSB3aXphcmRcbiAgc2tpcHBlZFNlY3Rpb25zPzogc3RyaW5nW107IC8vIFRyYWNrIHdoaWNoIHNlY3Rpb25zIHdlcmUgc2tpcHBlZFxufVxuXG5leHBvcnQgdHlwZSBMaWNlbnNlVGllciA9ICdhZ3BsJyB8ICdmcmVlLWNvbW1lcmNpYWwnIHwgJ3BhaWQtY29tbWVyY2lhbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGljZW5zZUNvbmZpZyB7XG4gIHRpZXI6IExpY2Vuc2VUaWVyO1xuICBlbWFpbD86IHN0cmluZzsgICAgICAgICAgICAvLyBSZXF1aXJlZCBmb3IgY29tbWVyY2lhbCB0aWVyc1xuICBhdHRlc3RlZEF0Pzogc3RyaW5nOyAgICAgICAvLyBJU08gdGltZXN0YW1wIG9mIGF0dGVzdGF0aW9uXG4gIHRlbGVtZXRyeVJlcXVpcmVkPzogYm9vbGVhbjsgLy8gdHJ1ZSBmb3IgY29tbWVyY2lhbCB0aWVycyAobGljZW5zZSBjb25kaXRpb24pXG4gIHJldmVudWVTY2FsZT86IHN0cmluZzsgICAgIC8vIFBhaWQgY29tbWVyY2lhbDogXCIkMU3igJMkNU1cIiwgXCIkNU3igJMkMjVNXCIsIGV0Yy5cbiAgY29tcGFueU5hbWU/OiBzdHJpbmc7ICAgICAgLy8gUGFpZCBjb21tZXJjaWFsOiByZXF1aXJlZFxuICB1c2VDYXNlPzogc3RyaW5nOyAgICAgICAgICAvLyBQYWlkIGNvbW1lcmNpYWw6IHJlcXVpcmVkXG59XG5cbi8qKiBCcmFuZGVkIHR5cGUgZm9yIHZhbGlkYXRlZCBwb3J0IG51bWJlcnMgKDEwMjTigJM2NTUzNSkuICovXG5leHBvcnQgdHlwZSBQb3J0TnVtYmVyID0gbnVtYmVyICYgeyByZWFkb25seSBfX2JyYW5kOiAnUG9ydE51bWJlcicgfTtcblxuLyoqIFZhbGlkYXRlIGFuZCBicmFuZCBhIHBvcnQgbnVtYmVyLiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBpbnZhbGlkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUG9ydCh2YWx1ZTogdW5rbm93bik6IFBvcnROdW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBudW0gPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gTnVtYmVyKHZhbHVlKSA6IHZhbHVlO1xuICBpZiAodHlwZW9mIG51bSAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0Zpbml0ZShudW0pKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwb3J0ID0gTWF0aC5mbG9vcihudW0pO1xuICBpZiAocG9ydCA8IDEwMjQgfHwgcG9ydCA+IDY1NTM1KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcG9ydCBhcyBQb3J0TnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnNvbGVDb25maWcge1xuICAvKipcbiAgICogV2ViIGNvbnNvbGUgcG9ydCAoMTAyNOKAkzY1NTM1KS4gUmVzb2x1dGlvbiBoaWVyYXJjaHk6XG4gICAqICAgMS4gLS1wb3J0IENMSSBmbGFnIChzdGFuZGFsb25lIC0td2ViIG1vZGUgb25seSlcbiAgICogICAyLiBUaGlzIGNvbmZpZyB2YWx1ZSAofi8uZG9sbGhvdXNlL2NvbmZpZy55bWwg4oaSIGNvbnNvbGUucG9ydClcbiAgICogICAzLiBET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVCBlbnYgdmFyXG4gICAqICAgNC4gRGVmYXVsdDogNDE3MTVcbiAgICovXG4gIHBvcnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb3VyY2VQcmlvcml0eUNvbmZpZ0RhdGEge1xuICBvcmRlcjogc3RyaW5nW107ICAvLyBBcnJheSBvZiAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbidcbiAgc3RvcF9vbl9maXJzdDogYm9vbGVhbjtcbiAgY2hlY2tfYWxsX2Zvcl91cGRhdGVzOiBib29sZWFuO1xuICBmYWxsYmFja19vbl9lcnJvcjogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb2xsaG91c2VDb25maWcge1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHVzZXI6IFVzZXJDb25maWc7XG4gIGdpdGh1YjogR2l0SHViQ29uZmlnO1xuICBzeW5jOiBTeW5jQ29uZmlnO1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uQ29uZmlnO1xuICBlbGVtZW50czogRWxlbWVudHNDb25maWc7XG4gIGRpc3BsYXk6IERpc3BsYXlDb25maWc7XG4gIHdpemFyZDogV2l6YXJkQ29uZmlnO1xuICBhdXRvTG9hZDogQXV0b0xvYWRDb25maWc7XG4gIHJldGVudGlvblBvbGljeTogUmV0ZW50aW9uUG9saWN5Q29uZmlnO1xuICBsaWNlbnNlOiBMaWNlbnNlQ29uZmlnO1xuICBjb25zb2xlOiBDb25zb2xlQ29uZmlnO1xuICBzb3VyY2VfcHJpb3JpdHk/OiBTb3VyY2VQcmlvcml0eUNvbmZpZ0RhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnVXBkYXRlUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBwcmV2aW91c1ZhbHVlPzogYW55O1xuICBuZXdWYWx1ZT86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWdBY3Rpb25SZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRhdGE/OiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb25maWdNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBjb25maWdEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSBjb25maWdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgYmFja3VwUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGNvbmZpZzogRG9sbGhvdXNlQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU9wZXJhdGlvbnM6IElGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByaXZhdGUgb3M6IHR5cGVvZiBvcztcblxuICAvKipcbiAgICogRXh0cmFjdCBjb25zb2xlLnBvcnQgZnJvbSByYXcgWUFNTCBjb25maWcgY29udGVudCB3aXRob3V0IGZ1bGxcbiAgICogQ29uZmlnTWFuYWdlciBpbml0aWFsaXphdGlvbi4gVXNlcyBGQUlMU0FGRV9TQ0hFTUEgZm9yIHNlY3VyaXR5XG4gICAqIChubyBjb2RlIGV4ZWN1dGlvbikuIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZCBvciBpbnZhbGlkLlxuICAgKi9cbiAgc3RhdGljIHJlYWRQb3J0RnJvbVlhbWwoeWFtbENvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZCh5YW1sQ29udGVudCwgeyBzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BIH0pIGFzIFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsO1xuICAgICAgY29uc3QgcmF3ID0gcGFyc2VkPy5jb25zb2xlPy5wb3J0O1xuICAgICAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3KTtcbiAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocG9ydCkgPyBwb3J0IDogdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihmaWxlT3BlcmF0aW9uczogSUZpbGVPcGVyYXRpb25zU2VydmljZSwgb3NNb2R1bGU6IHR5cGVvZiBvcykge1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBmaWxlT3BlcmF0aW9ucztcbiAgICB0aGlzLm9zID0gb3NNb2R1bGU7XG5cbiAgICAvLyBJbml0aWFsaXplIHBhdGhzIC0gdXNlIHRlc3QgZGlyZWN0b3J5IGlmIGluIHRlc3QgZW52aXJvbm1lbnRcbiAgICAvLyBOT1RFOiBVc2luZyBwcm9jZXNzLmVudiBkaXJlY3RseSBoZXJlIChub3QgY2FjaGVkIGVudi5URVNUX0NPTkZJR19ESVIpXG4gICAgLy8gdG8gYWxsb3cgdGVzdHMgdG8gZHluYW1pY2FsbHkgb3ZlcnJpZGUgdGhlIGNvbmZpZyBkaXJlY3RvcnlcbiAgICBpZiAoZW52Lk5PREVfRU5WID09PSAndGVzdCcgJiYgcHJvY2Vzcy5lbnYuVEVTVF9DT05GSUdfRElSKSB7XG4gICAgICB0aGlzLmNvbmZpZ0RpciA9IHByb2Nlc3MuZW52LlRFU1RfQ09ORklHX0RJUjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWdEaXIgPSBwYXRoLmpvaW4odGhpcy5vcy5ob21lZGlyKCksICcuZG9sbGhvdXNlJyk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnUGF0aCA9IHBhdGguam9pbih0aGlzLmNvbmZpZ0RpciwgJ2NvbmZpZy55bWwnKTtcbiAgICB0aGlzLmJhY2t1cFBhdGggPSBwYXRoLmpvaW4odGhpcy5jb25maWdEaXIsICdjb25maWcueW1sLmJhY2t1cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0RGVmYXVsdENvbmZpZygpOiBEb2xsaG91c2VDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuICAgICAgdXNlcjoge1xuICAgICAgICB1c2VybmFtZTogbnVsbCxcbiAgICAgICAgZW1haWw6IG51bGwsXG4gICAgICAgIGRpc3BsYXlfbmFtZTogbnVsbFxuICAgICAgfSxcbiAgICAgIGdpdGh1Yjoge1xuICAgICAgICBwb3J0Zm9saW86IHtcbiAgICAgICAgICByZXBvc2l0b3J5X3VybDogbnVsbCxcbiAgICAgICAgICByZXBvc2l0b3J5X25hbWU6IGVudi5HSVRIVUJfUkVQT1NJVE9SWSB8fCAnZG9sbGhvdXNlLXBvcnRmb2xpbycsXG4gICAgICAgICAgZGVmYXVsdF9icmFuY2g6ICdtYWluJyxcbiAgICAgICAgICBhdXRvX2NyZWF0ZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgdXNlX29hdXRoOiB0cnVlLFxuICAgICAgICAgIHRva2VuX3NvdXJjZTogJ2Vudmlyb25tZW50J1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc3luYzoge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSwgLy8gUHJpdmFjeSBmaXJzdCAtIG9mZiBieSBkZWZhdWx0XG4gICAgICAgIGluZGl2aWR1YWw6IHtcbiAgICAgICAgICByZXF1aXJlX2NvbmZpcm1hdGlvbjogdHJ1ZSxcbiAgICAgICAgICBzaG93X2RpZmZfYmVmb3JlX3N5bmM6IHRydWUsXG4gICAgICAgICAgdHJhY2tfdmVyc2lvbnM6IHRydWUsXG4gICAgICAgICAga2VlcF9oaXN0b3J5OiAxMFxuICAgICAgICB9LFxuICAgICAgICBidWxrOiB7XG4gICAgICAgICAgdXBsb2FkX2VuYWJsZWQ6IGZhbHNlLCAvLyBSZXF1aXJlcyBleHBsaWNpdCBlbmFibGVtZW50XG4gICAgICAgICAgZG93bmxvYWRfZW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgcmVxdWlyZV9wcmV2aWV3OiB0cnVlLFxuICAgICAgICAgIHJlc3BlY3RfbG9jYWxfb25seTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBwcml2YWN5OiB7XG4gICAgICAgICAgc2Nhbl9mb3Jfc2VjcmV0czogdHJ1ZSxcbiAgICAgICAgICBzY2FuX2Zvcl9waWk6IHRydWUsXG4gICAgICAgICAgd2Fybl9vbl9zZW5zaXRpdmU6IHRydWUsXG4gICAgICAgICAgZXhjbHVkZWRfcGF0dGVybnM6IFtcbiAgICAgICAgICAgICcqLnNlY3JldCcsXG4gICAgICAgICAgICAnKi1wcml2YXRlLionLFxuICAgICAgICAgICAgJ2NyZWRlbnRpYWxzLyoqJyxcbiAgICAgICAgICAgICdwZXJzb25hbC8qKidcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgIGF1dG9fc3VibWl0OiBmYWxzZSwgLy8gTmV2ZXIgYXV0by1zdWJtaXRcbiAgICAgICAgcmVxdWlyZV9yZXZpZXc6IHRydWUsXG4gICAgICAgIGFkZF9hdHRyaWJ1dGlvbjogdHJ1ZVxuICAgICAgfSxcbiAgICAgIGF1dG9Mb2FkOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsIC8vIEF1dG8tbG9hZCBiYXNlbGluZSBtZW1vcmllcyBieSBkZWZhdWx0XG4gICAgICAgIG1heFRva2VuQnVkZ2V0OiA1MDAwLFxuICAgICAgICBtYXhTaW5nbGVNZW1vcnlUb2tlbnM6IHVuZGVmaW5lZCxcbiAgICAgICAgc3VwcHJlc3NMYXJnZU1lbW9yeVdhcm5pbmdzOiBmYWxzZSxcbiAgICAgICAgbWVtb3JpZXM6IFtdIC8vIENvbmZpZ3VyZWQgdmlhIG1lbW9yeSBmaWxlcyB3aXRoIGF1dG9Mb2FkIGZsYWdcbiAgICAgIH0sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICBhdXRvX2FjdGl2YXRlOiB7fSxcbiAgICAgICAgZGVmYXVsdF9lbGVtZW50X2RpcjogcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAncG9ydGZvbGlvJyksXG4gICAgICAgIGVuaGFuY2VkX2luZGV4OiB7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBsaW1pdHM6IHtcbiAgICAgICAgICAgIG1heFRyaWdnZXJzUGVyRWxlbWVudDogNTAsXG4gICAgICAgICAgICBtYXhUcmlnZ2VyTGVuZ3RoOiA1MCxcbiAgICAgICAgICAgIG1heEtleXdvcmRzVG9DaGVjazogMTAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0ZWxlbWV0cnk6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLCAgLy8gT3B0LWluIG9ubHlcbiAgICAgICAgICAgIHNhbXBsZVJhdGU6IDAuMSxcbiAgICAgICAgICAgIG1ldHJpY3NJbnRlcnZhbDogNjAwMDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc291cmNlczoge1xuICAgICAgICAgICAgYWR2ZXJ0aXNlX3Jlc291cmNlczogZmFsc2UsIC8vIERlZmF1bHQ6IHNhZmUsIGRpc2FibGVkXG4gICAgICAgICAgICB2YXJpYW50czoge1xuICAgICAgICAgICAgICBzdW1tYXJ5OiBmYWxzZSwgIC8vIH4xLDI1NCB0b2tlbnMgLSBPcHQtaW4gcmVxdWlyZWRcbiAgICAgICAgICAgICAgZnVsbDogZmFsc2UsICAgICAvLyB+NDgsMzA2IHRva2VucyAtIE9wdC1pbiByZXF1aXJlZFxuICAgICAgICAgICAgICBzdGF0czogdHJ1ZSAgICAgIC8vIH41MCB0b2tlbnMgLSBTYWZlIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIHBlcnNvbmFfaW5kaWNhdG9yczoge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3R5bGU6ICdtaW5pbWFsJyxcbiAgICAgICAgICBpbmNsdWRlX2Vtb2ppOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHZlcmJvc2VfbG9nZ2luZzogZmFsc2UsXG4gICAgICAgIHNob3dfcHJvZ3Jlc3M6IHRydWVcbiAgICAgIH0sXG4gICAgICB3aXphcmQ6IHtcbiAgICAgICAgY29tcGxldGVkOiBmYWxzZSxcbiAgICAgICAgZGlzbWlzc2VkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIGxpY2Vuc2U6IHtcbiAgICAgICAgdGllcjogJ2FncGwnXG4gICAgICB9LFxuICAgICAgY29uc29sZToge1xuICAgICAgICBwb3J0OiA0MTcxNVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogUmV0ZW50aW9uIFBvbGljeSBDb25maWd1cmF0aW9uIChJc3N1ZSAjNTEpXG4gICAgICAgKiBJTVBPUlRBTlQ6IERpc2FibGVkIGJ5IGRlZmF1bHQgLSBub3RoaW5nIGlzIGF1dG8tZGVsZXRlZCB3aXRob3V0IGV4cGxpY2l0IGNvbnNlbnQuXG4gICAgICAgKiBVc2VycyBtdXN0IGV4cGxpY2l0bHkgZW5hYmxlIHJldGVudGlvbiBlbmZvcmNlbWVudCBpZiB0aGV5IHdhbnQgYXV0b21hdGljIGNsZWFudXAuXG4gICAgICAgKi9cbiAgICAgIHJldGVudGlvblBvbGljeToge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSwgICAgICAgICAgICAgICAgICAgIC8vIERJU0FCTEVEIGJ5IGRlZmF1bHQgLSBubyBhdXRvLWRlbGV0aW9uXG4gICAgICAgIGVuZm9yY2VtZW50X21vZGU6ICdkaXNhYmxlZCcsICAgICAgIC8vIE9ubHkgbWFudWFsIGVuZm9yY2VtZW50IGFsbG93ZWRcbiAgICAgICAgc2FmZXR5OiB7XG4gICAgICAgICAgcmVxdWlyZV9jb25maXJtYXRpb246IHRydWUsICAgICAgIC8vIEFsd2F5cyByZXF1aXJlIGNvbmZpcm1hdGlvblxuICAgICAgICAgIGRyeV9ydW5fZmlyc3Q6IHRydWUsICAgICAgICAgICAgICAvLyBBbHdheXMgcHJldmlldyBiZWZvcmUgZGVsZXRpbmdcbiAgICAgICAgICB3YXJuX29uX2V4cGlyaW5nOiB0cnVlLCAgICAgICAgICAgLy8gV2FybiB3aGVuIGVudHJpZXMgYXBwcm9hY2hpbmcgZXhwaXJhdGlvblxuICAgICAgICAgIHdhcm5pbmdfdGhyZXNob2xkX2RheXM6IDcgICAgICAgICAvLyBXYXJuIDcgZGF5cyBiZWZvcmUgZXhwaXJhdGlvblxuICAgICAgICB9LFxuICAgICAgICBhdWRpdDoge1xuICAgICAgICAgIGxvZ19kZWxldGlvbnM6IHRydWUsICAgICAgICAgICAgICAvLyBMb2cgYWxsIGRlbGV0aW9uc1xuICAgICAgICAgIGJhY2t1cF9iZWZvcmVfZGVsZXRlOiB0cnVlLCAgICAgICAvLyBCYWNrdXAgZGVsZXRlZCBlbnRyaWVzXG4gICAgICAgICAgYmFja3VwX3JldGVudGlvbl9kYXlzOiAzMCAgICAgICAgIC8vIEtlZXAgYmFja3VwcyBmb3IgMzAgZGF5c1xuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgIHR0bF9kYXlzOiAzMCwgICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IDMwLWRheSBUVEwgKGlmIGVuYWJsZWQpXG4gICAgICAgICAgbWF4X2VudHJpZXM6IDEwMDAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgbWF4IGVudHJpZXMgcGVyIG1lbW9yeVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEFsd2F5cyByZWxvYWQgY29uZmlnIGZyb20gZGlzayBpZiBpdCBleGlzdHMsIGV2ZW4gaWYgd2UgaGF2ZSBkZWZhdWx0cyBpbiBtZW1vcnlcbiAgICAvLyBUaGlzIGVuc3VyZXMgd2UgcGljayB1cCBhbnkgbWFudWFsIGVkaXRzIG9yIHNhdmVkIHNldHRpbmdzXG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBjb25maWcgZGlyZWN0b3J5IGV4aXN0cyB3aXRoIHByb3BlciBwZXJtaXNzaW9ucyAoMG83MDAgPSBvd25lciBvbmx5KVxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5jb25maWdEaXIpO1xuICAgICAgLy8gU2V0IHBlcm1pc3Npb25zIG9uIHRoZSBkaXJlY3RvcnlcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY2htb2QodGhpcy5jb25maWdEaXIsIDBvNzAwLCB7XG4gICAgICAgIHNvdXJjZTogJ0NvbmZpZ01hbmFnZXIuaW5pdGlhbGl6ZSdcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBMb2FkIG9yIGNyZWF0ZSBjb25maWdcbiAgICAgIGlmIChhd2FpdCB0aGlzLmNvbmZpZ0V4aXN0cygpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZENvbmZpZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGRlZmF1bHQgY29uZmlnXG4gICAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBUcnkgdG8gbWlncmF0ZSBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgICAgICBhd2FpdCB0aGlzLm1pZ3JhdGVGcm9tRW52aXJvbm1lbnQoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNhdmUgdGhlIGNvbmZpZ1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci5pbmZvKCdDcmVhdGVkIG5ldyBjb25maWd1cmF0aW9uIGZpbGUnLCB7XG4gICAgICAgICAgcGF0aDogdGhpcy5jb25maWdQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24nLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgLy8gVXNlIGRlZmF1bHRzIGluIG1lbW9yeVxuICAgICAgdGhpcy5jb25maWcgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIGZyb20gZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZSh0aGlzLmNvbmZpZ1BhdGgsIHtcbiAgICAgICAgc291cmNlOiAnQ29uZmlnTWFuYWdlci5sb2FkQ29uZmlnJ1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8qKlxuICAgICAgICogSU1QT1JUQU5UOiBQYXJzZXIgU2VsZWN0aW9uIGZvciBEaWZmZXJlbnQgRmlsZSBUeXBlc1xuICAgICAgICogXG4gICAgICAgKiBXZSB1c2UgRElGRkVSRU5UIHBhcnNlcnMgZm9yIGRpZmZlcmVudCBmaWxlIHR5cGVzOlxuICAgICAgICogXG4gICAgICAgKiAxLiBqcy15YW1sICh1c2VkIGhlcmUpIC0gRm9yIFBVUkUgWUFNTCBmaWxlczpcbiAgICAgICAqICAgIC0gQ29uZmlndXJhdGlvbiBmaWxlcyAoY29uZmlnLnltbClcbiAgICAgICAqICAgIC0gRGF0YSBmaWxlcyB3aXRob3V0IG1hcmtkb3duIGNvbnRlbnRcbiAgICAgICAqICAgIC0gQW55IC55bWwgb3IgLnlhbWwgZmlsZSB0aGF0J3MganVzdCBZQU1MXG4gICAgICAgKiAgICBFeGFtcGxlIGZvcm1hdDpcbiAgICAgICAqICAgIGBgYHlhbWxcbiAgICAgICAqICAgIHZlcnNpb246IDEuMC4wXG4gICAgICAgKiAgICB1c2VyOlxuICAgICAgICogICAgICB1c2VybmFtZTogam9obmRvZVxuICAgICAgICogICAgICBlbWFpbDogam9obkBleGFtcGxlLmNvbVxuICAgICAgICogICAgYGBgXG4gICAgICAgKiBcbiAgICAgICAqIDIuIFNlY3VyZVlhbWxQYXJzZXIgLSBGb3IgTUFSS0RPV04gZmlsZXMgd2l0aCBZQU1MIGZyb250bWF0dGVyOlxuICAgICAgICogICAgLSBQZXJzb25hIGZpbGVzICgqLm1kIGluIHBlcnNvbmFzLylcbiAgICAgICAqICAgIC0gU2tpbGwgZmlsZXMgKCoubWQgaW4gc2tpbGxzLylcbiAgICAgICAqICAgIC0gVGVtcGxhdGUgZmlsZXMgKCoubWQgaW4gdGVtcGxhdGVzLylcbiAgICAgICAqICAgIC0gQW55IC5tZCBmaWxlIHdpdGggZnJvbnRtYXR0ZXIgYmV0d2VlbiAtLS0gbWFya2Vyc1xuICAgICAgICogICAgRXhhbXBsZSBmb3JtYXQ6XG4gICAgICAgKiAgICBgYGBtYXJrZG93blxuICAgICAgICogICAgLS0tXG4gICAgICAgKiAgICBuYW1lOiBDcmVhdGl2ZSBXcml0ZXJcbiAgICAgICAqICAgIGRlc2NyaXB0aW9uOiBBIGNyZWF0aXZlIGFzc2lzdGFudFxuICAgICAgICogICAgLS0tXG4gICAgICAgKiAgICAjIEluc3RydWN0aW9uc1xuICAgICAgICogICAgWW91IGFyZSBhIGNyZWF0aXZlIHdyaXRlci4uLlxuICAgICAgICogICAgYGBgXG4gICAgICAgKiBcbiAgICAgICAqIFRoZSBjb25maWcgZmlsZSBpcyBQVVJFIFlBTUwsIHNvIHdlIHVzZSBqcy15YW1sIGRpcmVjdGx5IHdpdGggRkFJTFNBRkVfU0NIRU1BXG4gICAgICAgKiBmb3Igc2VjdXJpdHkgKHByZXZlbnRzIGNvZGUgZXhlY3V0aW9uIHZpYSBZQU1MIHRhZ3MpLlxuICAgICAgICogU0VDVVJJVFk6IFRoaXMgaXMgTk9UIGEgdnVsbmVyYWJpbGl0eSAtIEZBSUxTQUZFX1NDSEVNQSBwcmV2ZW50cyBjb2RlIGV4ZWN1dGlvblxuICAgICAgICovXG4gICAgICBsZXQgbG9hZGVkRGF0YTogYW55O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVXNpbmcgeWFtbCB3aXRoIEZBSUxTQUZFX1NDSEVNQSBpcyBzZWN1cmUgLSBwcmV2ZW50cyBjb2RlIGV4ZWN1dGlvblxuICAgICAgICBsb2FkZWREYXRhID0geWFtbC5sb2FkKGNvbnRlbnQsIHtcbiAgICAgICAgICBzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BIC8vIFNhZmUgc2NoZW1hIHByZXZlbnRzIGNvZGUgZXhlY3V0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoeWFtbEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBZQU1MIGluIGNvbmZpZ3VyYXRpb24gZmlsZTogJHt5YW1sRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHlhbWxFcnJvci5tZXNzYWdlIDogU3RyaW5nKHlhbWxFcnJvcil9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICghbG9hZGVkRGF0YSB8fCB0eXBlb2YgbG9hZGVkRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb24gZm9ybWF0Jyk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoJ0xvYWRlZCBjb25maWcgZnJvbSBmaWxlJywge1xuICAgICAgICB1c2VybmFtZTogbG9hZGVkRGF0YS51c2VyPy51c2VybmFtZSxcbiAgICAgICAgZW1haWw6IGxvYWRlZERhdGEudXNlcj8uZW1haWwsXG4gICAgICAgIHN5bmNFbmFibGVkOiBsb2FkZWREYXRhLnN5bmM/LmVuYWJsZWRcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VXaXRoRGVmYXVsdHMobG9hZGVkRGF0YSk7XG4gICAgICBcbiAgICAgIC8vIEZpeCBhbnkgc3RyaW5nIGJvb2xlYW5zIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIHNhdmVkIGluY29ycmVjdGx5XG4gICAgICB0aGlzLmZpeENvbmZpZ1R5cGVzKCk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5kZWJ1ZygnQ29uZmlndXJhdGlvbiBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICB1c2VybmFtZTogdGhpcy5jb25maWcudXNlci51c2VybmFtZSxcbiAgICAgICAgc3luY0VuYWJsZWQ6IHRoaXMuY29uZmlnLnN5bmMuZW5hYmxlZFxuICAgICAgfSk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBjb25maWd1cmF0aW9uJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjb25maWcgZmlsZSBleGlzdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29uZmlnRXhpc3RzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyh0aGlzLmNvbmZpZ1BhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgT0F1dGggY2xpZW50IElEXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBjb25maWcgZmlsZVxuICAgKi9cbiAgcHVibGljIGdldEdpdEh1YkNsaWVudElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIE5PVEU6IERPTExIT1VTRV9HSVRIVUJfQ0xJRU5UX0lEIGlzIG5vdCBpbiBjZW50cmFsaXplZCBlbnYgY29uZmlnXG4gICAgLy8gYXMgaXQncyBhbiBvcHRpb25hbCBmZWF0dXJlIGZsYWcsIHNvIHdlIHN0aWxsIHVzZSBwcm9jZXNzLmVudiBoZXJlXG4gICAgY29uc3QgZW52Q2xpZW50SWQgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfR0lUSFVCX0NMSUVOVF9JRDtcbiAgICBpZiAoZW52Q2xpZW50SWQpIHtcbiAgICAgIHJldHVybiBlbnZDbGllbnRJZDtcbiAgICB9XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gY29uZmlnIGZpbGVcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LmdpdGh1Yj8uYXV0aD8uY2xpZW50X2lkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IEdpdEh1YiBPQXV0aCBjbGllbnQgSUQgaW4gY29uZmlnIGZpbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRHaXRIdWJDbGllbnRJZChjbGllbnRJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFDb25maWdNYW5hZ2VyLnZhbGlkYXRlQ2xpZW50SWQoY2xpZW50SWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIEdpdEh1YiBjbGllbnQgSUQgZm9ybWF0LiBFeHBlY3RlZCBmb3JtYXQ6IE92MjNsaSBmb2xsb3dlZCBieSBhdCBsZWFzdCAxNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyAoZS5nLiwgT3YyM2xpQUJDREVGR0hJSktMTU4pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBnaXRodWIuYXV0aCBvYmplY3QgZXhpc3RzXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5naXRodWIpIHtcbiAgICAgIHRoaXMuY29uZmlnLmdpdGh1YiA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpLmdpdGh1YjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5naXRodWIuYXV0aCkge1xuICAgICAgdGhpcy5jb25maWcuZ2l0aHViLmF1dGggPSB0aGlzLmdldERlZmF1bHRDb25maWcoKS5naXRodWIuYXV0aDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZy5naXRodWIuYXV0aC5jbGllbnRfaWQgPSBjbGllbnRJZDtcbiAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGdldENvbmZpZygpOiBEb2xsaG91c2VDb25maWcge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNwZWNpZmljIHNldHRpbmcgdXNpbmcgZG90IG5vdGF0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0U2V0dGluZzxUPihwYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCB2YWx1ZTogYW55ID0gdGhpcy5jb25maWc7XG4gICAgXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB2YWx1ZSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHNwZWNpZmljIHNldHRpbmcgdXNpbmcgZG90IG5vdGF0aW9uXG4gICAqIFNFQ1VSSVRZIEZJWCAoUFIgIzg5NSk6IEFkZGVkIHByb3RvdHlwZSBwb2xsdXRpb24gcHJvdGVjdGlvblxuICAgKiBQcmV2aW91c2x5OiBEaXJlY3QgcHJvcGVydHkgYXNzaWdubWVudCBhbGxvd2VkIF9fcHJvdG9fXyBpbmplY3Rpb25cbiAgICogTm93OiBWYWxpZGF0ZXMga2V5cyBhZ2FpbnN0IGZvcmJpZGRlbiBwcm9wZXJ0aWVzIGJlZm9yZSBhc3NpZ25tZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlU2V0dGluZyhwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPENvbmZpZ1VwZGF0ZVJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTRUNVUklUWTogVmFsaWRhdGUgcGF0aCB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICB2YWxpZGF0ZVByb3BlcnR5UGF0aChwYXRoLCAncGF0aCcpO1xuXG4gICAgLy8gUnVudGltZSB2YWxpZGF0aW9uIGZvciBrbm93biB0eXBlZCBzZXR0aW5ncyAoIzE4NDApXG4gICAgaWYgKHBhdGggPT09ICdjb25zb2xlLnBvcnQnKSB7XG4gICAgICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZGF0ZVBvcnQodmFsdWUpO1xuICAgICAgaWYgKCF2YWxpZGF0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCBwb3J0OiAke3ZhbHVlfS4gTXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMTAyNCBhbmQgNjU1MzUuYCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdmFsaWRhdGVkO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgbGV0IGN1cnJlbnQ6IGFueSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLmdldFNldHRpbmcocGF0aCk7XG5cbiAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgcGFyZW50IG9iamVjdCB1c2luZyBzZWN1cml0eSB1dGlsaXRpZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgLy8gU0VDVVJJVFk6IFVzZSBzYWZlIHByb3BlcnR5IGNoZWNrIGFuZCBjcmVhdGUgcHJvdG90eXBlLWxlc3Mgb2JqZWN0c1xuICAgICAgaWYgKCFzYWZlSGFzT3duUHJvcGVydHkoY3VycmVudCwga2V5KSkge1xuICAgICAgICBjdXJyZW50W2tleV0gPSBjcmVhdGVTYWZlT2JqZWN0KCk7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgdmFsdWUgdXNpbmcgc2VjdXJlIHByb3BlcnR5IHNldHRlclxuICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgc2FmZVNldFByb3BlcnR5KGN1cnJlbnQsIGxhc3RLZXksIHZhbHVlKTtcbiAgICBcbiAgICAvLyBTYXZlIHRoZSBjb25maWd1cmF0aW9uXG4gICAgYXdhaXQgdGhpcy5zYXZlQ29uZmlnKCk7XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ0NvbmZpZ3VyYXRpb24gc2V0dGluZyB1cGRhdGVkJywge1xuICAgICAgcGF0aCxcbiAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgICBuZXdWYWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBTZXR0aW5nICcke3BhdGh9JyB1cGRhdGVkIHN1Y2Nlc3NmdWxseWAsXG4gICAgICBwcmV2aW91c1ZhbHVlLFxuICAgICAgbmV3VmFsdWU6IHZhbHVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBHaXRIdWIgT0F1dGggY2xpZW50IElEIGZvcm1hdFxuICAgKiBDbGllbnQgSURzIHN0YXJ0IHdpdGggXCJPdjIzbGlcIiBmb2xsb3dlZCBieSBhdCBsZWFzdCAxNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgKiBcbiAgICogQHBhcmFtIGNsaWVudElkIC0gVGhlIGNsaWVudCBJRCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZhbGlkLCBmYWxzZSBvdGhlcndpc2VcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIENvbmZpZ01hbmFnZXIudmFsaWRhdGVDbGllbnRJZChcIk92MjNsaUFCQ0RFRkdISUpLTE1OMTIzNDU2XCIpIC8vIHRydWVcbiAgICogQ29uZmlnTWFuYWdlci52YWxpZGF0ZUNsaWVudElkKFwiaW52YWxpZFwiKSAvLyBmYWxzZVxuICAgKiBDb25maWdNYW5hZ2VyLnZhbGlkYXRlQ2xpZW50SWQoXCJPdjIzbGlcIikgLy8gZmFsc2UgKHRvbyBzaG9ydClcbiAgICogQ29uZmlnTWFuYWdlci52YWxpZGF0ZUNsaWVudElkKFwiWHYyM2xpQUJDREVGR0hJSktMTU5cIikgLy8gZmFsc2UgKHdyb25nIHByZWZpeClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVDbGllbnRJZChjbGllbnRJZDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBjbGllbnRJZCAhPT0gJ3N0cmluZycgfHwgIWNsaWVudElkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gR2l0SHViIE9BdXRoIGNsaWVudCBJRHMgZm9sbG93IHRoZSBwYXR0ZXJuOiBPdjIzbGlbQS1aYS16MC05XXsxNCx9XG4gICAgY29uc3QgY2xpZW50SWRQYXR0ZXJuID0gL15PdjIzbGlbQS1aYS16MC05XXsxNCx9JC87XG4gICAgcmV0dXJuIGNsaWVudElkUGF0dGVybi50ZXN0KGNsaWVudElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gdG8gZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzYXZlQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29uZmlndXJhdGlvbiB0byBzYXZlJyk7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYmFja3VwIG9mIGV4aXN0aW5nIGNvbmZpZ1xuICAgICAgaWYgKGF3YWl0IHRoaXMuY29uZmlnRXhpc3RzKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jb3B5RmlsZSh0aGlzLmNvbmZpZ1BhdGgsIHRoaXMuYmFja3VwUGF0aCwge1xuICAgICAgICAgIHNvdXJjZTogJ0NvbmZpZ01hbmFnZXIuc2F2ZUNvbmZpZydcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gWUFNTFxuICAgICAgLy8gTm90ZTogV2UgdXNlIGpzLXlhbWwncyBkdW1wKCkgZm9yIHB1cmUgWUFNTCBvdXRwdXQgKG5vIGZyb250bWF0dGVyIG1hcmtlcnMpXG4gICAgICAvLyBUaGlzIGNyZWF0ZXMgYSBzdGFuZGFyZCBZQU1MIGZpbGUsIG5vdCBhIG1hcmtkb3duIGZpbGUgd2l0aCBmcm9udG1hdHRlclxuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAodGhpcy5jb25maWcsIHtcbiAgICAgICAgaW5kZW50OiAyLFxuICAgICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogZmFsc2VcbiAgICAgICAgLy8gVXNpbmcgZGVmYXVsdCBzY2hlbWEgKG5vdCBGQUlMU0FGRSkgZm9yIGR1bXAgdG8gcHJlc2VydmUgdHlwZXMgbGlrZSBib29sZWFuc1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFdyaXRlIGF0b21pY2FsbHkgd2l0aCBwcm9wZXIgcGVybWlzc2lvbnMgKDBvNjAwID0gb3duZXIgcmVhZC93cml0ZSBvbmx5KVxuICAgICAgY29uc3QgdGVtcFBhdGggPSBgJHt0aGlzLmNvbmZpZ1BhdGh9LnRtcGA7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZSh0ZW1wUGF0aCwgeWFtbENvbnRlbnQsIHtcbiAgICAgICAgc291cmNlOiAnQ29uZmlnTWFuYWdlci5zYXZlQ29uZmlnJ1xuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKHRlbXBQYXRoLCAwbzYwMCwge1xuICAgICAgICBzb3VyY2U6ICdDb25maWdNYW5hZ2VyLnNhdmVDb25maWcnXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVuYW1lRmlsZSh0ZW1wUGF0aCwgdGhpcy5jb25maWdQYXRoKTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdDb25maWd1cmF0aW9uIHNhdmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgXG4gICAgICAvLyBMb2cgYXVkaXQgZXZlbnQgZm9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlXG4gICAgICBsb2dnZXIuZGVidWcoJ0NvbmZpZ3VyYXRpb24gdXBkYXRlIGF1ZGl0Jywge1xuICAgICAgICBldmVudDogJ0NPTkZJR19VUERBVEVEJyxcbiAgICAgICAgc291cmNlOiAnQ29uZmlnTWFuYWdlci5zYXZlQ29uZmlnJyxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgIH0pO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHNhdmUgY29uZmlndXJhdGlvbicsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFRyeSB0byByZXN0b3JlIGJhY2t1cFxuICAgICAgaWYgKGF3YWl0IHRoaXMuYmFja3VwRXhpc3RzKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jb3B5RmlsZSh0aGlzLmJhY2t1cFBhdGgsIHRoaXMuY29uZmlnUGF0aCwge1xuICAgICAgICAgIHNvdXJjZTogJ0NvbmZpZ01hbmFnZXIuc2F2ZUNvbmZpZydcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZXN0b3JlZCBjb25maWd1cmF0aW9uIGZyb20gYmFja3VwJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBiYWNrdXAgZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJhY2t1cEV4aXN0cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHModGhpcy5iYWNrdXBQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXggaW5jb3JyZWN0IHR5cGVzIGluIGNvbmZpZyAoZS5nLiwgc3RyaW5nIGJvb2xlYW5zLCBzdHJpbmcgXCJudWxsXCIpXG4gICAqL1xuICBwcml2YXRlIGZpeENvbmZpZ1R5cGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcpIHJldHVybjtcbiAgICBcbiAgICAvLyBIZWxwZXIgdG8gY29udmVydCBzdHJpbmcgXCJudWxsXCIgdG8gYWN0dWFsIG51bGxcbiAgICBjb25zdCBmaXhOdWxsID0gKHZhbHVlOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSAnbnVsbCcgfHwgdmFsdWUgPT09ICdOVUxMJykgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBcbiAgICAvLyBIZWxwZXIgdG8gY29udmVydCBzdHJpbmcgYm9vbGVhbnMgdG8gYWN0dWFsIGJvb2xlYW5zXG4gICAgY29uc3QgZml4Qm9vbGVhbiA9ICh2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGxvd2VyID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobG93ZXIgPT09ICdmYWxzZScpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFxuICAgIC8vIEZpeCB1c2VyIGZpZWxkcyAtIGhhbmRsZSBzdHJpbmcgXCJudWxsXCIgdmFsdWVzXG4gICAgaWYgKHRoaXMuY29uZmlnLnVzZXIpIHtcbiAgICAgIHRoaXMuY29uZmlnLnVzZXIudXNlcm5hbWUgPSBmaXhOdWxsKHRoaXMuY29uZmlnLnVzZXIudXNlcm5hbWUpO1xuICAgICAgdGhpcy5jb25maWcudXNlci5lbWFpbCA9IGZpeE51bGwodGhpcy5jb25maWcudXNlci5lbWFpbCk7XG4gICAgICB0aGlzLmNvbmZpZy51c2VyLmRpc3BsYXlfbmFtZSA9IGZpeE51bGwodGhpcy5jb25maWcudXNlci5kaXNwbGF5X25hbWUpO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaXggc3luYyBzZXR0aW5nc1xuICAgIGlmICh0aGlzLmNvbmZpZy5zeW5jKSB7XG4gICAgICB0aGlzLmNvbmZpZy5zeW5jLmVuYWJsZWQgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMuZW5hYmxlZCk7XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zeW5jLmluZGl2aWR1YWwpIHtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnJlcXVpcmVfY29uZmlybWF0aW9uID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmluZGl2aWR1YWwucmVxdWlyZV9jb25maXJtYXRpb24pO1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLmluZGl2aWR1YWwuc2hvd19kaWZmX2JlZm9yZV9zeW5jID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmluZGl2aWR1YWwuc2hvd19kaWZmX2JlZm9yZV9zeW5jKTtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnRyYWNrX3ZlcnNpb25zID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmluZGl2aWR1YWwudHJhY2tfdmVyc2lvbnMpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5jb25maWcuc3luYy5idWxrKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuYnVsay51cGxvYWRfZW5hYmxlZCA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5idWxrLnVwbG9hZF9lbmFibGVkKTtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5idWxrLmRvd25sb2FkX2VuYWJsZWQgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMuYnVsay5kb3dubG9hZF9lbmFibGVkKTtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5idWxrLnJlcXVpcmVfcHJldmlldyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5idWxrLnJlcXVpcmVfcHJldmlldyk7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuYnVsay5yZXNwZWN0X2xvY2FsX29ubHkgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMuYnVsay5yZXNwZWN0X2xvY2FsX29ubHkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5jb25maWcuc3luYy5wcml2YWN5KSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMucHJpdmFjeS5zY2FuX2Zvcl9zZWNyZXRzID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kuc2Nhbl9mb3Jfc2VjcmV0cyk7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMucHJpdmFjeS5zY2FuX2Zvcl9waWkgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMucHJpdmFjeS5zY2FuX2Zvcl9waWkpO1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kud2Fybl9vbl9zZW5zaXRpdmUgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMucHJpdmFjeS53YXJuX29uX3NlbnNpdGl2ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEZpeCBjb2xsZWN0aW9uIHNldHRpbmdzXG4gICAgaWYgKHRoaXMuY29uZmlnLmNvbGxlY3Rpb24pIHtcbiAgICAgIHRoaXMuY29uZmlnLmNvbGxlY3Rpb24uYXV0b19zdWJtaXQgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmNvbGxlY3Rpb24uYXV0b19zdWJtaXQpO1xuICAgICAgdGhpcy5jb25maWcuY29sbGVjdGlvbi5yZXF1aXJlX3JldmlldyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuY29sbGVjdGlvbi5yZXF1aXJlX3Jldmlldyk7XG4gICAgICB0aGlzLmNvbmZpZy5jb2xsZWN0aW9uLmFkZF9hdHRyaWJ1dGlvbiA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuY29sbGVjdGlvbi5hZGRfYXR0cmlidXRpb24pO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaXggZGlzcGxheSBzZXR0aW5nc1xuICAgIGlmICh0aGlzLmNvbmZpZy5kaXNwbGF5KSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMpIHtcbiAgICAgICAgdGhpcy5jb25maWcuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMuZW5hYmxlZCA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMuZW5hYmxlZCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzLmluY2x1ZGVfZW1vamkgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzLmluY2x1ZGVfZW1vamkpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25maWcuZGlzcGxheS52ZXJib3NlX2xvZ2dpbmcgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nKTtcbiAgICAgIHRoaXMuY29uZmlnLmRpc3BsYXkuc2hvd19wcm9ncmVzcyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuZGlzcGxheS5zaG93X3Byb2dyZXNzKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRml4IGdpdGh1YiBzZXR0aW5nc1xuICAgIGlmICh0aGlzLmNvbmZpZy5naXRodWIpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLmdpdGh1Yi5wb3J0Zm9saW8ucmVwb3NpdG9yeV91cmwgPSBmaXhOdWxsKHRoaXMuY29uZmlnLmdpdGh1Yi5wb3J0Zm9saW8ucmVwb3NpdG9yeV91cmwpO1xuICAgICAgICB0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvLmF1dG9fY3JlYXRlID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvLmF1dG9fY3JlYXRlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5naXRodWIuYXV0aCkge1xuICAgICAgICB0aGlzLmNvbmZpZy5naXRodWIuYXV0aC51c2Vfb2F1dGggPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmdpdGh1Yi5hdXRoLnVzZV9vYXV0aCk7XG4gICAgICAgIC8vIEZpeCBjbGllbnRfaWQgaWYgaXQncyBhIHN0cmluZyBcIm51bGxcIlxuICAgICAgICBpZiAodGhpcy5jb25maWcuZ2l0aHViLmF1dGguY2xpZW50X2lkKSB7XG4gICAgICAgICAgdGhpcy5jb25maWcuZ2l0aHViLmF1dGguY2xpZW50X2lkID0gZml4TnVsbCh0aGlzLmNvbmZpZy5naXRodWIuYXV0aC5jbGllbnRfaWQpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBGaXggd2l6YXJkIHNldHRpbmdzXG4gICAgaWYgKHRoaXMuY29uZmlnLndpemFyZCkge1xuICAgICAgdGhpcy5jb25maWcud2l6YXJkLmNvbXBsZXRlZCA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcud2l6YXJkLmNvbXBsZXRlZCk7XG4gICAgICB0aGlzLmNvbmZpZy53aXphcmQuZGlzbWlzc2VkID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy53aXphcmQuZGlzbWlzc2VkKTtcbiAgICB9XG5cbiAgICAvLyBGaXggcmV0ZW50aW9uIHBvbGljeSBzZXR0aW5ncyAoSXNzdWUgIzUxKVxuICAgIGlmICh0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kpIHtcbiAgICAgIHRoaXMuY29uZmlnLnJldGVudGlvblBvbGljeS5lbmFibGVkID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuZW5hYmxlZCk7XG4gICAgICBpZiAodGhpcy5jb25maWcucmV0ZW50aW9uUG9saWN5LnNhZmV0eSkge1xuICAgICAgICB0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuc2FmZXR5LnJlcXVpcmVfY29uZmlybWF0aW9uID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuc2FmZXR5LnJlcXVpcmVfY29uZmlybWF0aW9uKTtcbiAgICAgICAgdGhpcy5jb25maWcucmV0ZW50aW9uUG9saWN5LnNhZmV0eS5kcnlfcnVuX2ZpcnN0ID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuc2FmZXR5LmRyeV9ydW5fZmlyc3QpO1xuICAgICAgICB0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuc2FmZXR5Lndhcm5fb25fZXhwaXJpbmcgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnJldGVudGlvblBvbGljeS5zYWZldHkud2Fybl9vbl9leHBpcmluZyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25maWcucmV0ZW50aW9uUG9saWN5LmF1ZGl0KSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnJldGVudGlvblBvbGljeS5hdWRpdC5sb2dfZGVsZXRpb25zID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5yZXRlbnRpb25Qb2xpY3kuYXVkaXQubG9nX2RlbGV0aW9ucyk7XG4gICAgICAgIHRoaXMuY29uZmlnLnJldGVudGlvblBvbGljeS5hdWRpdC5iYWNrdXBfYmVmb3JlX2RlbGV0ZSA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcucmV0ZW50aW9uUG9saWN5LmF1ZGl0LmJhY2t1cF9iZWZvcmVfZGVsZXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgcGFydGlhbCBjb25maWcgd2l0aCBkZWZhdWx0c1xuICAgKiBcbiAgICogSU1QT1JUQU5UOiBUaGlzIGZ1bmN0aW9uIHByZXNlcnZlcyB1bmtub3duIGZpZWxkcyBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKiBJZiBhIGZ1dHVyZSB2ZXJzaW9uIGFkZHMgbmV3IGNvbmZpZyBmaWVsZHMsIG9sZGVyIHZlcnNpb25zIHdvbid0IGxvc2UgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgbWVyZ2VXaXRoRGVmYXVsdHMocGFydGlhbDogUGFydGlhbDxEb2xsaG91c2VDb25maWc+KTogRG9sbGhvdXNlQ29uZmlnIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpO1xuICAgIFxuICAgIC8vIFN0YXJ0IHdpdGggYSBkZWVwIGNsb25lIG9mIHBhcnRpYWwgdG8gcHJlc2VydmUgYWxsIHVua25vd24gZmllbGRzXG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBhcnRpYWwpKTtcbiAgICBcbiAgICAvLyBFbnN1cmUgYWxsIHJlcXVpcmVkIGZpZWxkcyBleGlzdCB3aXRoIGRlZmF1bHRzXG4gICAgcmVzdWx0LnZlcnNpb24gPSByZXN1bHQudmVyc2lvbiB8fCBkZWZhdWx0cy52ZXJzaW9uO1xuICAgIFxuICAgIC8vIFVzZXIgc2VjdGlvbiAtIHByZXNlcnZlIHVua25vd24gZmllbGRzIHdoaWxlIGVuc3VyaW5nIHJlcXVpcmVkIGZpZWxkc1xuICAgIHJlc3VsdC51c2VyID0ge1xuICAgICAgLi4ucmVzdWx0LnVzZXIsXG4gICAgICB1c2VybmFtZTogcmVzdWx0LnVzZXI/LnVzZXJuYW1lID8/IGRlZmF1bHRzLnVzZXIudXNlcm5hbWUsXG4gICAgICBlbWFpbDogcmVzdWx0LnVzZXI/LmVtYWlsID8/IGRlZmF1bHRzLnVzZXIuZW1haWwsXG4gICAgICBkaXNwbGF5X25hbWU6IHJlc3VsdC51c2VyPy5kaXNwbGF5X25hbWUgPz8gZGVmYXVsdHMudXNlci5kaXNwbGF5X25hbWVcbiAgICB9O1xuICAgIFxuICAgIC8vIEdpdEh1YiBzZWN0aW9uIC0gZGVlcCBtZXJnZSBwcmVzZXJ2aW5nIHVua25vd24gZmllbGRzXG4gICAgaWYgKCFyZXN1bHQuZ2l0aHViKSByZXN1bHQuZ2l0aHViID0ge307XG4gICAgcmVzdWx0LmdpdGh1Yi5wb3J0Zm9saW8gPSB7XG4gICAgICAuLi5kZWZhdWx0cy5naXRodWIucG9ydGZvbGlvLFxuICAgICAgLi4ucmVzdWx0LmdpdGh1Yi5wb3J0Zm9saW9cbiAgICB9O1xuICAgIHJlc3VsdC5naXRodWIuYXV0aCA9IHtcbiAgICAgIC4uLmRlZmF1bHRzLmdpdGh1Yi5hdXRoLFxuICAgICAgLi4ucmVzdWx0LmdpdGh1Yi5hdXRoXG4gICAgfTtcbiAgICBcbiAgICAvLyBTeW5jIHNlY3Rpb24gLSBwcmVzZXJ2ZSB1bmtub3duIGZpZWxkcyBhdCBhbGwgbGV2ZWxzXG4gICAgaWYgKCFyZXN1bHQuc3luYykgcmVzdWx0LnN5bmMgPSB7fTtcbiAgICByZXN1bHQuc3luYy5lbmFibGVkID0gcmVzdWx0LnN5bmMuZW5hYmxlZCA/PyBkZWZhdWx0cy5zeW5jLmVuYWJsZWQ7XG4gICAgcmVzdWx0LnN5bmMuaW5kaXZpZHVhbCA9IHtcbiAgICAgIC4uLmRlZmF1bHRzLnN5bmMuaW5kaXZpZHVhbCxcbiAgICAgIC4uLnJlc3VsdC5zeW5jLmluZGl2aWR1YWxcbiAgICB9O1xuICAgIHJlc3VsdC5zeW5jLmJ1bGsgPSB7XG4gICAgICAuLi5kZWZhdWx0cy5zeW5jLmJ1bGssXG4gICAgICAuLi5yZXN1bHQuc3luYy5idWxrXG4gICAgfTtcbiAgICByZXN1bHQuc3luYy5wcml2YWN5ID0ge1xuICAgICAgLi4uZGVmYXVsdHMuc3luYy5wcml2YWN5LFxuICAgICAgLi4ucmVzdWx0LnN5bmMucHJpdmFjeSxcbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5cyAtIHVzZSBwcm92aWRlZCBvciBkZWZhdWx0XG4gICAgICBleGNsdWRlZF9wYXR0ZXJuczogcmVzdWx0LnN5bmMucHJpdmFjeT8uZXhjbHVkZWRfcGF0dGVybnMgfHwgZGVmYXVsdHMuc3luYy5wcml2YWN5LmV4Y2x1ZGVkX3BhdHRlcm5zXG4gICAgfTtcbiAgICBcbiAgICAvLyBDb2xsZWN0aW9uIHNlY3Rpb25cbiAgICByZXN1bHQuY29sbGVjdGlvbiA9IHtcbiAgICAgIC4uLmRlZmF1bHRzLmNvbGxlY3Rpb24sXG4gICAgICAuLi5yZXN1bHQuY29sbGVjdGlvblxuICAgIH07XG4gICAgXG4gICAgLy8gRWxlbWVudHMgc2VjdGlvblxuICAgIGlmICghcmVzdWx0LmVsZW1lbnRzKSByZXN1bHQuZWxlbWVudHMgPSB7fTtcbiAgICByZXN1bHQuZWxlbWVudHMgPSB7XG4gICAgICAuLi5yZXN1bHQuZWxlbWVudHMsXG4gICAgICBhdXRvX2FjdGl2YXRlOiByZXN1bHQuZWxlbWVudHMuYXV0b19hY3RpdmF0ZSB8fCBkZWZhdWx0cy5lbGVtZW50cy5hdXRvX2FjdGl2YXRlLFxuICAgICAgZGVmYXVsdF9lbGVtZW50X2RpcjogcmVzdWx0LmVsZW1lbnRzLmRlZmF1bHRfZWxlbWVudF9kaXIgfHwgZGVmYXVsdHMuZWxlbWVudHMuZGVmYXVsdF9lbGVtZW50X2RpclxuICAgIH07XG4gICAgXG4gICAgLy8gRGlzcGxheSBzZWN0aW9uXG4gICAgaWYgKCFyZXN1bHQuZGlzcGxheSkgcmVzdWx0LmRpc3BsYXkgPSB7fTtcbiAgICByZXN1bHQuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMgPSB7XG4gICAgICAuLi5kZWZhdWx0cy5kaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9ycyxcbiAgICAgIC4uLnJlc3VsdC5kaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9yc1xuICAgIH07XG4gICAgcmVzdWx0LmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nID0gcmVzdWx0LmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nID8/IGRlZmF1bHRzLmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nO1xuICAgIHJlc3VsdC5kaXNwbGF5LnNob3dfcHJvZ3Jlc3MgPSByZXN1bHQuZGlzcGxheS5zaG93X3Byb2dyZXNzID8/IGRlZmF1bHRzLmRpc3BsYXkuc2hvd19wcm9ncmVzcztcbiAgICBcbiAgICAvLyBXaXphcmQgc2VjdGlvblxuICAgIHJlc3VsdC53aXphcmQgPSB7XG4gICAgICAuLi5kZWZhdWx0cy53aXphcmQsXG4gICAgICAuLi5yZXN1bHQud2l6YXJkXG4gICAgfTtcblxuICAgIC8vIEF1dG9Mb2FkIHNlY3Rpb24gKElzc3VlOiByZWdyZXNzaW9uIGZyb20gY3VycmVudC1zZXJ2ZXIpXG4gICAgLy8gVGhpcyB3YXMgbWlzc2luZyBpbiBtY3Atc2VydmVyIHJlZmFjdG9yLCBjYXVzaW5nIGF1dG8tbG9hZCB0byBmYWlsIGZvciBleGlzdGluZyBjb25maWdzXG4gICAgcmVzdWx0LmF1dG9Mb2FkID0ge1xuICAgICAgLi4uZGVmYXVsdHMuYXV0b0xvYWQsXG4gICAgICAuLi5yZXN1bHQuYXV0b0xvYWRcbiAgICB9O1xuXG4gICAgLy8gUmV0ZW50aW9uIFBvbGljeSBzZWN0aW9uIChJc3N1ZSAjNTEpXG4gICAgLy8gSU1QT1JUQU5UOiBEZWZhdWx0cyBhcmUgZGlzYWJsZWQgLSBub3RoaW5nIGF1dG8tZGVsZXRlZCB3aXRob3V0IGV4cGxpY2l0IGNvbnNlbnRcbiAgICBpZiAoIXJlc3VsdC5yZXRlbnRpb25Qb2xpY3kpIHJlc3VsdC5yZXRlbnRpb25Qb2xpY3kgPSB7fTtcbiAgICByZXN1bHQucmV0ZW50aW9uUG9saWN5ID0ge1xuICAgICAgZW5hYmxlZDogcmVzdWx0LnJldGVudGlvblBvbGljeS5lbmFibGVkID8/IGRlZmF1bHRzLnJldGVudGlvblBvbGljeS5lbmFibGVkLFxuICAgICAgZW5mb3JjZW1lbnRfbW9kZTogcmVzdWx0LnJldGVudGlvblBvbGljeS5lbmZvcmNlbWVudF9tb2RlID8/IGRlZmF1bHRzLnJldGVudGlvblBvbGljeS5lbmZvcmNlbWVudF9tb2RlLFxuICAgICAgc2FmZXR5OiB7XG4gICAgICAgIC4uLmRlZmF1bHRzLnJldGVudGlvblBvbGljeS5zYWZldHksXG4gICAgICAgIC4uLnJlc3VsdC5yZXRlbnRpb25Qb2xpY3kuc2FmZXR5XG4gICAgICB9LFxuICAgICAgYXVkaXQ6IHtcbiAgICAgICAgLi4uZGVmYXVsdHMucmV0ZW50aW9uUG9saWN5LmF1ZGl0LFxuICAgICAgICAuLi5yZXN1bHQucmV0ZW50aW9uUG9saWN5LmF1ZGl0XG4gICAgICB9LFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLi4uZGVmYXVsdHMucmV0ZW50aW9uUG9saWN5LmRlZmF1bHRzLFxuICAgICAgICAuLi5yZXN1bHQucmV0ZW50aW9uUG9saWN5LmRlZmF1bHRzXG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQgYXMgRG9sbGhvdXNlQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pZ3JhdGUgc2V0dGluZ3MgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWlncmF0ZUZyb21FbnZpcm9ubWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbWlncmF0ZWQgPSBmYWxzZTtcblxuICAgIC8vIE5PVEU6IFRoZXNlIGFyZSBvcHRpb25hbCBjdXN0b20gZW52IHZhcnMgbm90IGluIGNlbnRyYWxpemVkIGNvbmZpZ1xuICAgIC8vIFRoZXkncmUgdXNlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgbWlncmF0aW9uIG9ubHlcblxuICAgIC8vIE1pZ3JhdGUgdXNlciBzZXR0aW5nc1xuICAgIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiAmJiAhdGhpcy5jb25maWc/LnVzZXIudXNlcm5hbWUpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZy51c2VyLnVzZXJuYW1lID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1VTRVI7XG4gICAgICBtaWdyYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTUFJTCAmJiAhdGhpcy5jb25maWc/LnVzZXIuZW1haWwpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZy51c2VyLmVtYWlsID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VNQUlMO1xuICAgICAgbWlncmF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIE1pZ3JhdGUgcG9ydGZvbGlvIFVSTFxuICAgIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfUE9SVEZPTElPX1VSTCAmJiAhdGhpcy5jb25maWc/LmdpdGh1Yi5wb3J0Zm9saW8ucmVwb3NpdG9yeV91cmwpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvLnJlcG9zaXRvcnlfdXJsID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1BPUlRGT0xJT19VUkw7XG4gICAgICBtaWdyYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gTWlncmF0ZSBjb2xsZWN0aW9uIGF1dG8tc3VibWl0IC0gdXNlIGNlbnRyYWxpemVkIGVudiBjb25maWdcbiAgICBpZiAoZW52LkRPTExIT1VTRV9BVVRPX1NVQk1JVF9UT19DT0xMRUNUSU9OICE9PSBmYWxzZSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZykgdGhpcy5jb25maWcgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKTtcbiAgICAgIHRoaXMuY29uZmlnLmNvbGxlY3Rpb24uYXV0b19zdWJtaXQgPSBlbnYuRE9MTEhPVVNFX0FVVE9fU1VCTUlUX1RPX0NPTExFQ1RJT047XG4gICAgICBtaWdyYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG1pZ3JhdGVkKSB7XG4gICAgICBsb2dnZXIuaW5mbygnTWlncmF0ZWQgc2V0dGluZ3MgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgY29uZmlndXJhdGlvbiB0byBkZWZhdWx0c1xuICAgKiBTRUNVUklUWSBGSVggKFBSICM4OTUpOiBBZGRlZCBwcm90b3R5cGUgcG9sbHV0aW9uIHByb3RlY3Rpb25cbiAgICogUHJldmlvdXNseTogRGlyZWN0IHByb3BlcnR5IGFzc2lnbm1lbnQgYWxsb3dlZCBfX3Byb3RvX18gaW5qZWN0aW9uXG4gICAqIE5vdzogVmFsaWRhdGVzIGtleXMgYWdhaW5zdCBmb3JiaWRkZW4gcHJvcGVydGllcyBiZWZvcmUgYXNzaWdubWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc2V0Q29uZmlnKHNlY3Rpb24/OiBzdHJpbmcpOiBQcm9taXNlPENvbmZpZ0FjdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgXG4gICAgaWYgKHNlY3Rpb24pIHtcbiAgICAgIC8vIFJlc2V0IHNwZWNpZmljIHNlY3Rpb25cbiAgICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBkZWZhdWx0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBzZWN0aW9uIHBhdGggdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgICAgIHZhbGlkYXRlUHJvcGVydHlQYXRoKHNlY3Rpb24sICdzZWN0aW9uJyk7XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbktleXMgPSBzZWN0aW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIGxldCBjdXJyZW50OiBhbnkgPSB0aGlzLmNvbmZpZztcbiAgICAgICAgbGV0IGRlZmF1bHRTZWN0aW9uOiBhbnkgPSBkZWZhdWx0cztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlY3Rpb25LZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3NlY3Rpb25LZXlzW2ldXTtcbiAgICAgICAgICBkZWZhdWx0U2VjdGlvbiA9IGRlZmF1bHRTZWN0aW9uW3NlY3Rpb25LZXlzW2ldXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSBzZWN0aW9uS2V5c1tzZWN0aW9uS2V5cy5sZW5ndGggLSAxXTtcbiAgICAgICAgLy8gU0VDVVJJVFk6IFVzZSBzZWN1cmUgcHJvcGVydHkgc2V0dGVyIHRvIGF2b2lkIHByb3RvdHlwZSBjaGFpbiBwb2xsdXRpb25cbiAgICAgICAgc2FmZVNldFByb3BlcnR5KGN1cnJlbnQsIGxhc3RLZXksIGRlZmF1bHRTZWN0aW9uW2xhc3RLZXldKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgYXdhaXQgdGhpcy5zYXZlQ29uZmlnKCk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBTZWN0aW9uICcke3NlY3Rpb259JyByZXNldCB0byBkZWZhdWx0c2BcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IGVudGlyZSBjb25maWdcbiAgICAgIHRoaXMuY29uZmlnID0gZGVmYXVsdHM7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogJ0NvbmZpZ3VyYXRpb24gcmVzZXQgdG8gZGVmYXVsdHMnXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgY29uZmlndXJhdGlvbiB0byBmaWxlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhwb3J0Q29uZmlnKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENvbmZpZ0FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnTm8gY29uZmlndXJhdGlvbiB0byBleHBvcnQnXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAodGhpcy5jb25maWcsIHtcbiAgICAgICAgaW5kZW50OiAyLFxuICAgICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbENvbnRlbnQsIHtcbiAgICAgICAgc291cmNlOiAnQ29uZmlnTWFuYWdlci5leHBvcnRDb25maWcnXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY2htb2QoZmlsZVBhdGgsIDBvNjAwLCB7XG4gICAgICAgIHNvdXJjZTogJ0NvbmZpZ01hbmFnZXIuZXhwb3J0Q29uZmlnJ1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBDb25maWd1cmF0aW9uIGV4cG9ydGVkIHRvICR7ZmlsZVBhdGh9YFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gZXhwb3J0IGNvbmZpZ3VyYXRpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBjb25maWd1cmF0aW9uIGZyb20gZmlsZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGltcG9ydENvbmZpZyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxDb25maWdBY3Rpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoZmlsZVBhdGgsIHtcbiAgICAgICAgc291cmNlOiAnQ29uZmlnTWFuYWdlci5pbXBvcnRDb25maWcnXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUGFyc2UgYW5kIHZhbGlkYXRlXG4gICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGNvbnRlbnQsIHtcbiAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCxcbiAgICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSxcbiAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKCFwYXJzZWQuZGF0YSB8fCB0eXBlb2YgcGFyc2VkLmRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgY29uZmlndXJhdGlvbiBmb3JtYXQgaW4gaW1wb3J0IGZpbGUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE1lcmdlIHdpdGggZGVmYXVsdHNcbiAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZVdpdGhEZWZhdWx0cyhwYXJzZWQuZGF0YSBhcyBQYXJ0aWFsPERvbGxob3VzZUNvbmZpZz4pO1xuICAgICAgXG4gICAgICAvLyBTYXZlIHRoZSBpbXBvcnRlZCBjb25maWdcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZUNvbmZpZygpO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiBgQ29uZmlndXJhdGlvbiBpbXBvcnRlZCBmcm9tICR7ZmlsZVBhdGh9YFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gaW1wb3J0IGNvbmZpZ3VyYXRpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmb3JtYXR0ZWQgY29uZmlnIGZvciBkaXNwbGF5XG4gICAqL1xuICBwdWJsaWMgZ2V0Rm9ybWF0dGVkQ29uZmlnKHNlY3Rpb24/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHJldHVybiAnQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWQnO1xuICAgIH1cbiAgICBcbiAgICBsZXQgY29uZmlnVG9TaG93OiBhbnkgPSB0aGlzLmNvbmZpZztcbiAgICBcbiAgICBpZiAoc2VjdGlvbikge1xuICAgICAgY29uZmlnVG9TaG93ID0gdGhpcy5nZXRTZXR0aW5nKHNlY3Rpb24pO1xuICAgICAgaWYgKCFjb25maWdUb1Nob3cpIHtcbiAgICAgICAgcmV0dXJuIGBTZWN0aW9uICcke3NlY3Rpb259JyBub3QgZm91bmRgO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBSZW1vdmUgc2Vuc2l0aXZlIGRhdGEgZm9yIGRpc3BsYXlcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbmZpZ1RvU2hvdykpO1xuICAgIFxuICAgIC8vIERvbid0IHNob3cgdG9rZW5zIGlmIHRoZXkgZXhpc3RcbiAgICBpZiAoc2FuaXRpemVkLmdpdGh1Yj8uYXV0aD8udG9rZW4pIHtcbiAgICAgIHNhbml0aXplZC5naXRodWIuYXV0aC50b2tlbiA9ICcqKipSRURBQ1RFRCoqKic7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB5YW1sLmR1bXAoc2FuaXRpemVkLCB7XG4gICAgICBpbmRlbnQ6IDIsXG4gICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIHNvcnRLZXlzOiBmYWxzZVxuICAgIH0pO1xuICB9XG59XG4iXX0=