@dollhousemcp/mcp-server 1.9.4 → 1.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.9.5] - 2025-09-19
4
+
5
+ ### Fixed
6
+ - **Memory YAML Parsing**: Fixed memory files not displaying correct names for pure YAML format
7
+ - Memory files saved by v1.9.3+ are pure YAML without frontmatter markers
8
+ - MemoryManager.load() now detects pure YAML and wraps it for SecureYamlParser compatibility
9
+ - Added proper handling for nested metadata structure (data.metadata || data)
10
+ - Fixed entries loading to look in correct location (parsed.data.entries)
11
+ - Added edge case handling for empty memory files
12
+ - Fixes issue where v1.9.3/v1.9.4 memory files showed as "Unnamed Memory"
13
+
14
+ ### Enhanced
15
+ - **Test Coverage**: Added comprehensive tests for memory file format handling
16
+ - Test for pure YAML files without frontmatter markers
17
+ - Test for files with frontmatter (backward compatibility)
18
+ - Test for empty file handling
19
+ - Test for mixed formats in same directory
20
+ - All 40 MemoryManager tests now passing
21
+
22
+ ### Technical Details
23
+ - SecureYamlParser is designed for markdown files with YAML frontmatter
24
+ - Memory files are pure YAML, requiring format detection and wrapping
25
+ - Solution maintains backward compatibility while fixing the core issue
26
+
3
27
  ## [1.9.4] - 2025-09-19
4
28
 
5
29
  ### Fixed
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryManager.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/MemoryManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAe,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAavD,qBAAa,aAAc,YAAW,eAAe,CAAC,MAAM,CAAC;IAC3D,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,gBAAgB,CAAkC;IAI1D,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,yBAAyB,CAAa;;IAO9C;;;;;;;;;OASG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA6F7C;;;;;;OAMG;YACW,kBAAkB;IAyBhC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;;;;OAKG;YACW,cAAc;IAkC5B;;;;;;;;;OASG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0F7D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA6D/B;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKhF;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK1E;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B7C;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhD;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhE;;;;;;;;;;OAUG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,MAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IA0EpF;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBrD;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IAIlD;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAqBvC;;OAEG;IACH,cAAc,IAAI,WAAW;IAI7B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAM1B;;;;;;;;OAQG;YACW,sBAAsB;IAgCpC,OAAO,CAAC,eAAe;IAmCvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAM3B"}
1
+ {"version":3,"file":"MemoryManager.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/MemoryManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAe,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAavD,qBAAa,aAAc,YAAW,eAAe,CAAC,MAAM,CAAC;IAC3D,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,gBAAgB,CAAkC;IAI1D,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,yBAAyB,CAAa;;IAO9C;;;;;;;;;OASG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0H7C;;;;;;OAMG;YACW,kBAAkB;IAyBhC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;;;;OAKG;YACW,cAAc;IAkC5B;;;;;;;;;OASG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0F7D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA6D/B;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKhF;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK1E;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B7C;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhD;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhE;;;;;;;;;;OAUG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,MAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IA0EpF;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBrD;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IAIlD;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAqBvC;;OAEG;IACH,cAAc,IAAI,WAAW;IAI7B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAM1B;;;;;;;;OAQG;YACW,sBAAsB;IAgCpC,OAAO,CAAC,eAAe;IAwCvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAM3B"}
@@ -84,23 +84,51 @@ export class MemoryManager {
84
84
  // HIGH SEVERITY FIX: Use SecureYamlParser to prevent YAML injection attacks
85
85
  // Previously: Could use unsafe YAML parsing
86
86
  // Now: Uses SecureYamlParser which validates content and prevents malicious patterns
87
- const parsed = SecureYamlParser.parse(content, {
88
- maxYamlSize: MEMORY_CONSTANTS.MAX_YAML_SIZE,
89
- validateContent: true
90
- });
87
+ // Memory files are pure YAML (unlike other elements which are markdown with frontmatter)
88
+ // Check if this is pure YAML (doesn't start with frontmatter markers)
89
+ let parsed;
90
+ // Efficient format detection without creating trimmed copy
91
+ let firstNonWhitespace = 0;
92
+ while (firstNonWhitespace < content.length && /\s/.test(content[firstNonWhitespace])) {
93
+ firstNonWhitespace++;
94
+ }
95
+ // Handle empty content edge case
96
+ if (firstNonWhitespace === content.length) {
97
+ // Empty or all whitespace file - create minimal valid structure
98
+ parsed = { data: {}, content: '' };
99
+ }
100
+ else if (!content.startsWith('---', firstNonWhitespace)) {
101
+ // Pure YAML file - wrap it with frontmatter markers for SecureYamlParser
102
+ const wrappedContent = `---\n${content}\n---\n`;
103
+ const parseResult = SecureYamlParser.parse(wrappedContent, {
104
+ maxYamlSize: MEMORY_CONSTANTS.MAX_YAML_SIZE,
105
+ validateContent: true
106
+ });
107
+ // For pure YAML, the entire content becomes the data, no markdown content
108
+ parsed = { data: parseResult.data, content: '' };
109
+ }
110
+ else {
111
+ // File with frontmatter (shouldn't happen for memories, but handle it)
112
+ parsed = SecureYamlParser.parse(content, {
113
+ maxYamlSize: MEMORY_CONSTANTS.MAX_YAML_SIZE,
114
+ validateContent: true
115
+ });
116
+ }
91
117
  // Extract metadata and content
92
118
  const { metadata, content: memoryContent } = this.parseMemoryFile(parsed);
93
119
  // Create memory instance
94
120
  const memory = new Memory(metadata);
95
121
  // Load saved entries if present
96
- if (parsed.data && parsed.data.entries) {
122
+ // Memory files have entries as a top-level key in the YAML
123
+ const entries = parsed.data?.entries;
124
+ if (entries) {
97
125
  memory.deserialize(JSON.stringify({
98
126
  id: memory.id,
99
127
  type: memory.type,
100
128
  version: memory.version,
101
129
  metadata: memory.metadata,
102
130
  extensions: memory.extensions,
103
- entries: parsed.data.entries
131
+ entries: entries
104
132
  }));
105
133
  }
106
134
  // Cache the loaded memory
@@ -585,27 +613,30 @@ export class MemoryManager {
585
613
  // For markdown files with YAML frontmatter, the structure is:
586
614
  // parsed.data = YAML frontmatter values
587
615
  // parsed.content = markdown content after frontmatter
616
+ // For pure YAML memory files, we need to check if metadata is directly in data
588
617
  const yamlData = parsed.data || {};
618
+ // Memory files saved by the system have metadata as a top-level key
619
+ const metadataSource = yamlData.metadata || yamlData;
589
620
  // Extract metadata with validation
590
621
  const metadata = {
591
- name: sanitizeInput(yamlData.name || 'Unnamed Memory', 100),
592
- description: yamlData.description ?
593
- sanitizeInput(yamlData.description, 500) :
622
+ name: sanitizeInput(metadataSource.name || 'Unnamed Memory', 100),
623
+ description: metadataSource.description ?
624
+ sanitizeInput(metadataSource.description, 500) :
594
625
  '',
595
- version: yamlData.version || '1.0.0',
596
- author: yamlData.author,
597
- created: yamlData.created,
598
- modified: new Date().toISOString(),
599
- tags: Array.isArray(yamlData.tags) ?
600
- yamlData.tags.map((tag) => sanitizeInput(tag, MEMORY_CONSTANTS.MAX_TAG_LENGTH)) :
626
+ version: metadataSource.version || '1.0.0',
627
+ author: metadataSource.author,
628
+ created: metadataSource.created,
629
+ modified: metadataSource.modified || new Date().toISOString(),
630
+ tags: Array.isArray(metadataSource.tags) ?
631
+ metadataSource.tags.map((tag) => sanitizeInput(tag, MEMORY_CONSTANTS.MAX_TAG_LENGTH)) :
601
632
  [],
602
- storageBackend: yamlData.storage_backend || yamlData.storageBackend || MEMORY_CONSTANTS.DEFAULT_STORAGE_BACKEND,
603
- retentionDays: yamlData.retention_policy?.default ?
604
- this.parseRetentionDays(yamlData.retention_policy.default) :
605
- (yamlData.retentionDays || MEMORY_CONSTANTS.DEFAULT_RETENTION_DAYS),
606
- privacyLevel: yamlData.privacy_level || yamlData.privacyLevel || MEMORY_CONSTANTS.DEFAULT_PRIVACY_LEVEL,
607
- searchable: yamlData.searchable !== false,
608
- maxEntries: yamlData.maxEntries || MEMORY_CONSTANTS.MAX_ENTRIES_DEFAULT
633
+ storageBackend: metadataSource.storage_backend || metadataSource.storageBackend || MEMORY_CONSTANTS.DEFAULT_STORAGE_BACKEND,
634
+ retentionDays: metadataSource.retention_policy?.default ?
635
+ this.parseRetentionDays(metadataSource.retention_policy.default) :
636
+ (metadataSource.retentionDays || MEMORY_CONSTANTS.DEFAULT_RETENTION_DAYS),
637
+ privacyLevel: metadataSource.privacy_level || metadataSource.privacyLevel || MEMORY_CONSTANTS.DEFAULT_PRIVACY_LEVEL,
638
+ searchable: metadataSource.searchable !== false,
639
+ maxEntries: metadataSource.maxEntries || MEMORY_CONSTANTS.MAX_ENTRIES_DEFAULT
609
640
  };
610
641
  // Extract content (if any)
611
642
  const content = parsed.content || '';
@@ -623,4 +654,4 @@ export class MemoryManager {
623
654
  return match ? parseInt(match[1]) : MEMORY_CONSTANTS.DEFAULT_RETENTION_DAYS;
624
655
  }
625
656
  }
626
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUErQixNQUFNLGFBQWEsQ0FBQztBQUdsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFakMsTUFBTSxPQUFPLGFBQWE7SUFDaEIsZ0JBQWdCLENBQW1CO0lBQ25DLFdBQVcsQ0FBUztJQUNwQixXQUFXLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDN0MsZ0JBQWdCLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFMUQsOEVBQThFO0lBQzlFLDJDQUEyQztJQUNuQyxnQkFBZ0IsR0FBb0IsSUFBSSxDQUFDO0lBQ3pDLHlCQUF5QixHQUFXLENBQUMsQ0FBQztJQUU5QztRQUNFLElBQUksQ0FBQyxn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QyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQztJQUM5RSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeU1hbmFnZXIgLSBJbXBsZW1lbnRhdGlvbiBvZiBJRWxlbWVudE1hbmFnZXIgZm9yIE1lbW9yeSBlbGVtZW50c1xuICogSGFuZGxlcyBDUlVEIG9wZXJhdGlvbnMgYW5kIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGZvciBtZW1vcmllcyBpbXBsZW1lbnRpbmcgSUVsZW1lbnRcbiAqIFxuICogRklYRVMgSU1QTEVNRU5URUQ6XG4gKiAxLiBDUklUSUNBTDogRml4ZWQgcmFjZSBjb25kaXRpb25zIGluIGZpbGUgb3BlcmF0aW9ucyBieSB1c2luZyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyByZWFkcy93cml0ZXNcbiAqIDIuIEhJR0g6IEZpeGVkIHVudmFsaWRhdGVkIFlBTUwgcGFyc2luZyB2dWxuZXJhYmlsaXR5IGJ5IHVzaW5nIFNlY3VyZVlhbWxQYXJzZXJcbiAqIDMuIE1FRElVTTogQWxsIHVzZXIgaW5wdXRzIGFyZSBub3cgdmFsaWRhdGVkIGFuZCBzYW5pdGl6ZWRcbiAqIDQuIE1FRElVTTogQXVkaXQgbG9nZ2luZyBhZGRlZCBmb3Igc2VjdXJpdHkgb3BlcmF0aW9uc1xuICogNS4gTUVESVVNOiBQYXRoIHZhbGlkYXRpb24gcHJldmVudHMgZGlyZWN0b3J5IHRyYXZlcnNhbCBhdHRhY2tzXG4gKi9cblxuaW1wb3J0IHsgTWVtb3J5LCBNZW1vcnlNZXRhZGF0YSwgTWVtb3J5RW50cnkgfSBmcm9tICcuL01lbW9yeS5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBNRU1PUllfQ09OU1RBTlRTLCBNRU1PUllfU0VDVVJJVFlfRVZFTlRTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcblxuZXhwb3J0IGNsYXNzIE1lbW9yeU1hbmFnZXIgaW1wbGVtZW50cyBJRWxlbWVudE1hbmFnZXI8TWVtb3J5PiB7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJpdmF0ZSBtZW1vcmllc0Rpcjogc3RyaW5nO1xuICBwcml2YXRlIG1lbW9yeUNhY2hlOiBNYXA8c3RyaW5nLCBNZW1vcnk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbnRlbnRIYXNoSW5kZXg6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbiAgLy8gUEVSRk9STUFOQ0UgSU1QUk9WRU1FTlQ6IENhY2hlIGZvciBkYXRlIGZvbGRlcnMgdG8gYXZvaWQgZGlyZWN0b3J5IHNjYW5uaW5nXG4gIC8vIEludmFsaWRhdGVkIHdoZW4gbmV3IGZvbGRlcnMgYXJlIGNyZWF0ZWRcbiAgcHJpdmF0ZSBkYXRlRm9sZGVyc0NhY2hlOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRhdGVGb2xkZXJzQ2FjaGVUaW1lc3RhbXA6IG51bWJlciA9IDA7XG4gIFxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgdGhpcy5tZW1vcmllc0RpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLk1FTU9SWSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBMb2FkIGEgbWVtb3J5IGZyb20gZmlsZVxuICAgKiBTRUNVUklUWSBGSVggIzE6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKCkgaW5zdGVhZCBvZiBmcy5yZWFkRmlsZSgpXG4gICAqIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGFuZCBlbnN1cmUgYXRvbWljIGZpbGUgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgbWVtb3J5IGZpbGUgdG8gbG9hZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgbG9hZGVkIE1lbW9yeSBpbnN0YW5jZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBmaWxlIGNhbm5vdCBiZSBmb3VuZCBvciBwYXRoIHZhbGlkYXRpb24gZmFpbHNcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gWUFNTCBwYXJzaW5nIGZhaWxzIG9yIGNvbnRlbnQgaXMgbWFsZm9ybWVkXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIG1lbW9yeSB2YWxpZGF0aW9uIGZhaWxzIGFmdGVyIGxvYWRpbmdcbiAgICovXG4gIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8TWVtb3J5PiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBmdWxsUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgcmVsYXRpdmUgcGF0aCAobm8gZGF0ZSBmb2xkZXIpXG4gICAgICBpZiAoIWZpbGVQYXRoLmluY2x1ZGVzKHBhdGguc2VwKSB8fCAhZmlsZVBhdGgubWF0Y2goL15cXGR7NH0tXFxkezJ9LVxcZHsyfS8pKSB7XG4gICAgICAgIC8vIFNlYXJjaCBpbiBkYXRlIGZvbGRlcnNcbiAgICAgICAgY29uc3QgZGF0ZUZvbGRlcnMgPSBhd2FpdCB0aGlzLmdldERhdGVGb2xkZXJzKCk7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgZGF0ZUZvbGRlciBvZiBkYXRlRm9sZGVycykge1xuICAgICAgICAgIGNvbnN0IHRlc3RQYXRoID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsIGRhdGVGb2xkZXIsIGZpbGVQYXRoKTtcbiAgICAgICAgICBpZiAoYXdhaXQgZnMuYWNjZXNzKHRlc3RQYXRoKS50aGVuKCgpID0+IHRydWUpLmNhdGNoKCgpID0+IGZhbHNlKSkge1xuICAgICAgICAgICAgZnVsbFBhdGggPSB0ZXN0UGF0aDtcbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gcm9vdCBkaXJlY3RvcnkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZHVyaW5nIHRyYW5zaXRpb25cbiAgICAgICAgICBmdWxsUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZ1bGxQYXRoID0gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIGZ1bGxQYXRoIGlzIGRlZmluZWRcbiAgICAgIGlmICghZnVsbFBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVzb2x2ZSBwYXRoOiAke2ZpbGVQYXRofWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5tZW1vcnlDYWNoZS5nZXQoZnVsbFBhdGgpO1xuICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBhdG9taWMgZmlsZSByZWFkIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgICAvLyBQcmV2aW91c2x5OiBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZnVsbFBhdGgsICd1dGYtOCcpO1xuICAgICAgLy8gTm93OiBVc2VzIEZpbGVMb2NrTWFuYWdlciB3aXRoIHByb3BlciBlbmNvZGluZyBvYmplY3QgZm9ybWF0XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKGZ1bGxQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgXG4gICAgICAvLyBISUdIIFNFVkVSSVRZIEZJWDogVXNlIFNlY3VyZVlhbWxQYXJzZXIgdG8gcHJldmVudCBZQU1MIGluamVjdGlvbiBhdHRhY2tzXG4gICAgICAvLyBQcmV2aW91c2x5OiBDb3VsZCB1c2UgdW5zYWZlIFlBTUwgcGFyc2luZ1xuICAgICAgLy8gTm93OiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgd2hpY2ggdmFsaWRhdGVzIGNvbnRlbnQgYW5kIHByZXZlbnRzIG1hbGljaW91cyBwYXR0ZXJuc1xuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShjb250ZW50LCB7XG4gICAgICAgIG1heFlhbWxTaXplOiBNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkUsXG4gICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIEV4dHJhY3QgbWV0YWRhdGEgYW5kIGNvbnRlbnRcbiAgICAgIGNvbnN0IHsgbWV0YWRhdGEsIGNvbnRlbnQ6IG1lbW9yeUNvbnRlbnQgfSA9IHRoaXMucGFyc2VNZW1vcnlGaWxlKHBhcnNlZCk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBtZW1vcnkgaW5zdGFuY2VcbiAgICAgIGNvbnN0IG1lbW9yeSA9IG5ldyBNZW1vcnkobWV0YWRhdGEpO1xuICAgICAgXG4gICAgICAvLyBMb2FkIHNhdmVkIGVudHJpZXMgaWYgcHJlc2VudFxuICAgICAgaWYgKHBhcnNlZC5kYXRhICYmIHBhcnNlZC5kYXRhLmVudHJpZXMpIHtcbiAgICAgICAgbWVtb3J5LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBpZDogbWVtb3J5LmlkLFxuICAgICAgICAgIHR5cGU6IG1lbW9yeS50eXBlLFxuICAgICAgICAgIHZlcnNpb246IG1lbW9yeS52ZXJzaW9uLFxuICAgICAgICAgIG1ldGFkYXRhOiBtZW1vcnkubWV0YWRhdGEsXG4gICAgICAgICAgZXh0ZW5zaW9uczogbWVtb3J5LmV4dGVuc2lvbnMsXG4gICAgICAgICAgZW50cmllczogcGFyc2VkLmRhdGEuZW50cmllc1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENhY2hlIHRoZSBsb2FkZWQgbWVtb3J5XG4gICAgICB0aGlzLm1lbW9yeUNhY2hlLnNldChmdWxsUGF0aCwgbWVtb3J5KTtcbiAgICAgIFxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgbG9hZFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9MT0FERUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5sb2FkJyxcbiAgICAgICAgZGV0YWlsczogYExvYWRlZCBtZW1vcnkgZnJvbSAke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfWBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gbWVtb3J5O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfTE9BRF9GQUlMRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5sb2FkJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBsb2FkIG1lbW9yeSBmcm9tICR7ZmlsZVBhdGh9OiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBtZW1vcnk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGRhdGUtYmFzZWQgcGF0aCBmb3IgbWVtb3J5IHN0b3JhZ2VcbiAgICogQ3JlYXRlcyBZWVlZLU1NLUREIGZvbGRlciBzdHJ1Y3R1cmUgdG8gcHJldmVudCBmbGF0IGRpcmVjdG9yeSBpc3N1ZXNcbiAgICogQHBhcmFtIGVsZW1lbnQgTWVtb3J5IGVsZW1lbnQgdG8gc2F2ZVxuICAgKiBAcGFyYW0gZmlsZU5hbWUgT3B0aW9uYWwgY3VzdG9tIGZpbGVuYW1lXG4gICAqIEByZXR1cm5zIEZ1bGwgcGF0aCB0byBtZW1vcnkgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU1lbW9yeVBhdGgoZWxlbWVudDogTWVtb3J5LCBmaWxlTmFtZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgZGF0ZUZvbGRlciA9IGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICBjb25zdCBkYXRlUGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCBkYXRlRm9sZGVyKTtcblxuICAgIC8vIEVuc3VyZSBkYXRlIGZvbGRlciBleGlzdHNcbiAgICBhd2FpdCBmcy5ta2RpcihkYXRlUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBQRVJGT1JNQU5DRSBJTVBST1ZFTUVOVDogSW52YWxpZGF0ZSBkYXRlIGZvbGRlcnMgY2FjaGUgc2luY2Ugd2UgY3JlYXRlZCBhIG5ldyBmb2xkZXJcbiAgICB0aGlzLmRhdGVGb2xkZXJzQ2FjaGUgPSBudWxsO1xuXG4gICAgLy8gR2VuZXJhdGUgZmlsZW5hbWVcbiAgICBjb25zdCBiYXNlTmFtZSA9IGZpbGVOYW1lIHx8IGAke2VsZW1lbnQubWV0YWRhdGEubmFtZT8udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJykgfHwgJ21lbW9yeSd9LnlhbWxgO1xuICAgIGxldCBmaW5hbE5hbWUgPSBiYXNlTmFtZTtcbiAgICBsZXQgdmVyc2lvbiA9IDE7XG5cbiAgICAvLyBIYW5kbGUgY29sbGlzaW9ucyB3aXRoIHZlcnNpb24gc3VmZml4XG4gICAgd2hpbGUgKGF3YWl0IGZzLmFjY2VzcyhwYXRoLmpvaW4oZGF0ZVBhdGgsIGZpbmFsTmFtZSkpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpKSB7XG4gICAgICB2ZXJzaW9uKys7XG4gICAgICBmaW5hbE5hbWUgPSBiYXNlTmFtZS5yZXBsYWNlKCcueWFtbCcsIGAtdiR7dmVyc2lvbn0ueWFtbGApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoLmpvaW4oZGF0ZVBhdGgsIGZpbmFsTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIFNIQS0yNTYgaGFzaCBvZiBtZW1vcnkgY29udGVudCBmb3IgZGVkdXBsaWNhdGlvblxuICAgKiBJbXBsZW1lbnRzIElzc3VlICM5OTQgLSBDb250ZW50LWJhc2VkIGRlZHVwbGljYXRpb25cbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlQ29udGVudEhhc2goZWxlbWVudDogTWVtb3J5KTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbWV0YWRhdGE6IGVsZW1lbnQubWV0YWRhdGEsXG4gICAgICBlbnRyaWVzOiBKU09OLnBhcnNlKGVsZW1lbnQuc2VyaWFsaXplKCkpLmVudHJpZXNcbiAgICB9KTtcbiAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZGF0ZSBmb2xkZXJzIGluIG1lbW9yaWVzIGRpcmVjdG9yeVxuICAgKiBQRVJGT1JNQU5DRSBJTVBST1ZFTUVOVDogVXNlcyBjYWNoZSB0byBhdm9pZCByZXBlYXRlZCBkaXJlY3Rvcnkgc2Nhbm5pbmdcbiAgICogQ2FjaGUgaXMgaW52YWxpZGF0ZWQgd2hlbiBuZXcgZm9sZGVycyBhcmUgY3JlYXRlZCBvciBhZnRlciA2MCBzZWNvbmRzXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGRhdGUgZm9sZGVyIG5hbWVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldERhdGVGb2xkZXJzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IENBQ0hFX1RUTCA9IDYwMDAwOyAvLyA2MCBzZWNvbmRzXG5cbiAgICAvLyBSZXR1cm4gY2FjaGVkIHJlc3VsdCBpZiB2YWxpZFxuICAgIGlmICh0aGlzLmRhdGVGb2xkZXJzQ2FjaGUgIT09IG51bGwgJiZcbiAgICAgICAgKG5vdyAtIHRoaXMuZGF0ZUZvbGRlcnNDYWNoZVRpbWVzdGFtcCkgPCBDQUNIRV9UVEwpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGVGb2xkZXJzQ2FjaGU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHRoaXMubWVtb3JpZXNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IGZvbGRlcnMgPSBlbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSAmJiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdChlbnRyeS5uYW1lKSlcbiAgICAgICAgLm1hcChlbnRyeSA9PiBlbnRyeS5uYW1lKVxuICAgICAgICAuc29ydCgpXG4gICAgICAgIC5yZXZlcnNlKCk7IC8vIE1vc3QgcmVjZW50IGZpcnN0XG5cbiAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuZGF0ZUZvbGRlcnNDYWNoZSA9IGZvbGRlcnM7XG4gICAgICB0aGlzLmRhdGVGb2xkZXJzQ2FjaGVUaW1lc3RhbXAgPSBub3c7XG5cbiAgICAgIHJldHVybiBmb2xkZXJzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgLy8gQ2FjaGUgZW1wdHkgcmVzdWx0XG4gICAgICAgIHRoaXMuZGF0ZUZvbGRlcnNDYWNoZSA9IFtdO1xuICAgICAgICB0aGlzLmRhdGVGb2xkZXJzQ2FjaGVUaW1lc3RhbXAgPSBub3c7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGEgbWVtb3J5IHRvIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGVsZW1lbnQgTWVtb3J5IGVsZW1lbnQgdG8gc2F2ZVxuICAgKiBAcGFyYW0gZmlsZVBhdGggT3B0aW9uYWwgY3VzdG9tIGZpbGUgcGF0aCwgZGVmYXVsdHMgdG8gZGF0ZS1iYXNlZCBwYXRoXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNhdmUgaXMgY29tcGxldGVcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gbWVtb3J5IHZhbGlkYXRpb24gZmFpbHMgYmVmb3JlIHNhdmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwYXRoIHZhbGlkYXRpb24gZmFpbHMgb3IgZmlsZSBzeXN0ZW0gZXJyb3JzIG9jY3VyXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGF0b21pYyB3cml0ZSBvcGVyYXRpb24gZmFpbHNcbiAgICovXG4gIGFzeW5jIHNhdmUoZWxlbWVudDogTWVtb3J5LCBmaWxlUGF0aD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBlbGVtZW50XG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtZW1vcnk6ICR7dmFsaWRhdGlvbi5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIGNvbnRlbnQgaGFzaCBmb3IgZGVkdXBsaWNhdGlvblxuICAgICAgY29uc3QgY29udGVudEhhc2ggPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRIYXNoKGVsZW1lbnQpO1xuICAgICAgY29uc3QgZXhpc3RpbmdQYXRoID0gdGhpcy5jb250ZW50SGFzaEluZGV4LmdldChjb250ZW50SGFzaCk7XG5cbiAgICAgIGlmIChleGlzdGluZ1BhdGgpIHtcbiAgICAgICAgLy8gTG9nIGR1cGxpY2F0ZSBkZXRlY3Rpb25cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdNRU1PUllfRFVQTElDQVRFX0RFVEVDVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRHVwbGljYXRlIGNvbnRlbnQgZGV0ZWN0ZWQuIEV4aXN0aW5nOiAke2V4aXN0aW5nUGF0aH1gXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSBkYXRlLWJhc2VkIHBhdGggaWYgbm90IHByb3ZpZGVkXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGZpbGVQYXRoXG4gICAgICAgID8gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2VuZXJhdGVNZW1vcnlQYXRoKGVsZW1lbnQpO1xuXG4gICAgICAvLyBFbnN1cmUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMgKGZvciBkYXRlIGZvbGRlcnMpXG4gICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUoZnVsbFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgLy8gR2V0IG1lbW9yeSBzdGF0aXN0aWNzXG4gICAgICBjb25zdCBzdGF0cyA9IGVsZW1lbnQuZ2V0U3RhdHMoKTtcbiAgICAgIFxuICAgICAgLy8gUHJlcGFyZSBkYXRhIGZvciBzYXZpbmdcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIG1ldGFkYXRhOiBlbGVtZW50Lm1ldGFkYXRhLFxuICAgICAgICBleHRlbnNpb25zOiBlbGVtZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIHN0YXRzOiB7XG4gICAgICAgICAgdG90YWxFbnRyaWVzOiBzdGF0cy50b3RhbEVudHJpZXMsXG4gICAgICAgICAgdG90YWxTaXplOiBzdGF0cy50b3RhbFNpemUsXG4gICAgICAgICAgb2xkZXN0RW50cnk6IHN0YXRzLm9sZGVzdEVudHJ5Py50b0lTT1N0cmluZygpLFxuICAgICAgICAgIG5ld2VzdEVudHJ5OiBzdGF0cy5uZXdlc3RFbnRyeT8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB0b3BUYWdzOiBBcnJheS5mcm9tKHN0YXRzLnRhZ0ZyZXF1ZW5jeS5lbnRyaWVzKCkpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYlsxXSAtIGFbMV0pXG4gICAgICAgICAgICAuc2xpY2UoMCwgMTApXG4gICAgICAgICAgICAubWFwKChbdGFnLCBjb3VudF0pID0+ICh7IHRhZywgY291bnQgfSkpXG4gICAgICAgIH0sXG4gICAgICAgIGVudHJpZXM6IEpTT04ucGFyc2UoZWxlbWVudC5zZXJpYWxpemUoKSkuZW50cmllc1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYOiBVc2Ugc2VjdXJlIFlBTUwgZHVtcGluZyB3aXRoIHNhZmV0eSBvcHRpb25zXG4gICAgICAvLyBQcmV2aW91c2x5OiBDb3VsZCBhbGxvdyBkYW5nZXJvdXMgWUFNTCBmZWF0dXJlc1xuICAgICAgLy8gTm93OiBVc2VzIEZBSUxTQUZFX1NDSEVNQSBhbmQgc2VjdXJpdHkgb3B0aW9ucyB0byBwcmV2ZW50IGNvZGUgZXhlY3V0aW9uXG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChkYXRhLCB7XG4gICAgICAgIHNjaGVtYTogeWFtbC5GQUlMU0FGRV9TQ0hFTUEsXG4gICAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgICAgc2tpcEludmFsaWQ6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgYXRvbWljIGZpbGUgd3JpdGUgdG8gcHJldmVudCBjb3JydXB0aW9uXG4gICAgICAvLyBQcmV2aW91c2x5OiBhd2FpdCBmcy53cml0ZUZpbGUoZnVsbFBhdGgsIHlhbWxDb250ZW50LCAndXRmLTgnKTtcbiAgICAgIC8vIE5vdzogVXNlcyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyB3cml0ZSB3aXRoIHByb3BlciBlbmNvZGluZ1xuICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShmdWxsUGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBjYWNoZVxuICAgICAgdGhpcy5tZW1vcnlDYWNoZS5zZXQoZnVsbFBhdGgsIGVsZW1lbnQpO1xuXG4gICAgICAvLyBVcGRhdGUgY29udGVudCBoYXNoIGluZGV4XG4gICAgICB0aGlzLmNvbnRlbnRIYXNoSW5kZXguc2V0KGNvbnRlbnRIYXNoLCBmdWxsUGF0aCk7XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHNhdmVcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfU0FWRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgZGV0YWlsczogYFNhdmVkIG1lbW9yeSB0byAke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfSB3aXRoICR7c3RhdHMudG90YWxFbnRyaWVzfSBlbnRyaWVzYFxuICAgICAgfSk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBzYXZlIG1lbW9yeSB0byAke2ZpbGVQYXRofTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNhdmUgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIExpc3QgYWxsIGF2YWlsYWJsZSBtZW1vcmllc1xuICAgKi9cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgY29uc3QgbWVtb3JpZXM6IE1lbW9yeVtdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gR2V0IGFsbCBkYXRlIGZvbGRlcnNcbiAgICAgIGNvbnN0IGRhdGVGb2xkZXJzID0gYXdhaXQgdGhpcy5nZXREYXRlRm9sZGVycygpO1xuXG4gICAgICAvLyBBbHNvIGNoZWNrIHJvb3QgZGlyZWN0b3J5IGZvciBhbnkgbWVtb3J5IGZpbGVzXG4gICAgICAvLyBNZW1vcnkgZmlsZXMgc2hvdWxkIGJlIC55YW1sIGZvcm1hdCBvbmx5XG4gICAgICBjb25zdCByb290RmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHRoaXMubWVtb3JpZXNEaXIpXG4gICAgICAgIC50aGVuKGZpbGVzID0+IGZpbGVzLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy55YW1sJykpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gW10pO1xuXG4gICAgICAvLyBQcm9jZXNzIHJvb3QgZmlsZXMgZmlyc3QgKGxlZ2FjeSlcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiByb290RmlsZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtZW1vcnkgPSBhd2FpdCB0aGlzLmxvYWQoZmlsZSk7XG4gICAgICAgICAgbWVtb3JpZXMucHVzaChtZW1vcnkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0xJU1RfSVRFTV9GQUlMRUQsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxpc3QnLFxuICAgICAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBsb2FkICR7ZmlsZX06ICR7ZXJyb3J9YFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgZGF0ZSBmb2xkZXJzXG4gICAgICBmb3IgKGNvbnN0IGRhdGVGb2xkZXIgb2YgZGF0ZUZvbGRlcnMpIHtcbiAgICAgICAgY29uc3QgZm9sZGVyUGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCBkYXRlRm9sZGVyKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGZvbGRlclBhdGgpXG4gICAgICAgICAgLnRoZW4oZmlsZXMgPT4gZmlsZXMuZmlsdGVyKGYgPT4gZi5lbmRzV2l0aCgnLnlhbWwnKSkpXG4gICAgICAgICAgLmNhdGNoKCgpID0+IFtdKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWVtb3J5ID0gYXdhaXQgdGhpcy5sb2FkKHBhdGguam9pbihkYXRlRm9sZGVyLCBmaWxlKSk7XG4gICAgICAgICAgICBtZW1vcmllcy5wdXNoKG1lbW9yeSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfTElTVF9JVEVNX0ZBSUxFRCxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxpc3QnLFxuICAgICAgICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGxvYWQgJHtkYXRlRm9sZGVyfS8ke2ZpbGV9OiAke2Vycm9yfWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVtb3JpZXM7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIC8vIERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IHlldFxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaW5kIG1lbW9yaWVzIG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kKHByZWRpY2F0ZTogKGVsZW1lbnQ6IE1lbW9yeSkgPT4gYm9vbGVhbik6IFByb21pc2U8TWVtb3J5IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gbWVtb3JpZXMuZmluZChwcmVkaWNhdGUpO1xuICB9XG4gIFxuICAvKipcbiAgICogRmluZCBtdWx0aXBsZSBtZW1vcmllcyBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZE1hbnkocHJlZGljYXRlOiAoZWxlbWVudDogTWVtb3J5KSA9PiBib29sZWFuKTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIGNvbnN0IG1lbW9yaWVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIG1lbW9yaWVzLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG4gIFxuICAvKipcbiAgICogRGVsZXRlIGEgbWVtb3J5IGZpbGVcbiAgICogU0VDVVJJVFk6IFZhbGlkYXRlcyBwYXRoIGFuZCBsb2dzIGRlbGV0aW9uXG4gICAqL1xuICBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZnVsbFBhdGgpO1xuICAgICAgXG4gICAgICAvLyBEZWxldGUgdGhlIGZpbGVcbiAgICAgIGF3YWl0IGZzLnVubGluayhmdWxsUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlXG4gICAgICB0aGlzLm1lbW9yeUNhY2hlLmRlbGV0ZShmdWxsUGF0aCk7XG4gICAgICBcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfREVMRVRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICAgIGRldGFpbHM6IGBEZWxldGVkIG1lbW9yeSBmaWxlOiAke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfWBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIG5vdCBhbiBlcnJvciBmb3IgZGVsZXRlIG9wZXJhdGlvblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG1lbW9yeSBmaWxlIGV4aXN0c1xuICAgKi9cbiAgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZ1bGxQYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBtZW1vcnkgd2l0aCBtZXRhZGF0YVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPE1lbW9yeU1ldGFkYXRhPik6IFByb21pc2U8TWVtb3J5PiB7XG4gICAgcmV0dXJuIG5ldyBNZW1vcnkobWV0YWRhdGEpO1xuICB9XG4gIFxuICAvKipcbiAgICogSW1wb3J0IGEgbWVtb3J5IGZyb20gSlNPTi9ZQU1MIHN0cmluZ1xuICAgKiBTRUNVUklUWTogRnVsbCB2YWxpZGF0aW9uIG9mIGltcG9ydGVkIGNvbnRlbnRcbiAgICogQHBhcmFtIGRhdGEgSlNPTiBvciBZQU1MIHN0cmluZyBjb250YWluaW5nIG1lbW9yeSBkYXRhXG4gICAqIEBwYXJhbSBmb3JtYXQgRm9ybWF0IG9mIHRoZSBpbnB1dCBkYXRhICgnanNvbicgb3IgJ3lhbWwnKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgaW1wb3J0ZWQgTWVtb3J5IGluc3RhbmNlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIEpTT04vWUFNTCBwYXJzaW5nIGZhaWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGltcG9ydGVkIGRhdGEgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHNcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gWUFNTCBjb250ZW50IGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIHNpemVcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gaW1wb3J0ZWQgbWVtb3J5IGZhaWxzIHZhbGlkYXRpb25cbiAgICovXG4gIGFzeW5jIGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyA9ICd5YW1sJyk6IFByb21pc2U8TWVtb3J5PiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBwYXJzZWQ6IGFueTtcbiAgICAgIFxuICAgICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBISUdIIFNFVkVSSVRZIEZJWDogVXNlIHNlY3VyZSBZQU1MIHBhcnNpbmdcbiAgICAgICAgLy8gTWVtb3J5IGltcG9ydCBleHBlY3RzIHB1cmUgWUFNTCAobm90IGZyb250bWF0dGVyKSwgc28gd2UgcGFyc2UgaXQgc2VjdXJlbHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBGaXJzdCB2YWxpZGF0ZSB0aGUgWUFNTCBjb250ZW50IHNpemVcbiAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWUFNTCBjb250ZW50IGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIHNpemUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgd3JhcHBlciB0byB1c2UgU2VjdXJlWWFtbFBhcnNlciB3aXRoIHB1cmUgWUFNTFxuICAgICAgICAgIC8vIEFkZCBtaW5pbWFsIGZyb250bWF0dGVyIG1hcmtlcnMgdG8gc2F0aXNmeSBwYXJzZXJcbiAgICAgICAgICBjb25zdCB3cmFwcGVkWWFtbCA9IGAtLS1cXG4ke2RhdGF9XFxuLS0tXFxuYDtcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2Uod3JhcHBlZFlhbWwsIHtcbiAgICAgICAgICAgIG1heFlhbWxTaXplOiBNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkUsXG4gICAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBwYXJzZWQgZGF0YSAod2lsbCBiZSBpbiB0aGUgJ2RhdGEnIHByb3BlcnR5KVxuICAgICAgICAgIHBhcnNlZCA9IHBhcnNlUmVzdWx0LmRhdGE7XG4gICAgICAgICAgXG4gICAgICAgIH0gY2F0Y2ggKHlhbWxFcnJvcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBZQU1MOiAke3lhbWxFcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gVmFsaWRhdGUgaXQncyBhbiBvYmplY3RcbiAgICAgICAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lBTUwgbXVzdCBjb250YWluIGFuIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgc3RydWN0dXJlcyBmcm9tIFlBTUwgcGFyc2luZ1xuICAgICAgbGV0IG1ldGFkYXRhID0gcGFyc2VkLm1ldGFkYXRhO1xuICAgICAgbGV0IGVudHJpZXMgPSBwYXJzZWQuZW50cmllcyB8fCAocGFyc2VkLmRhdGEgJiYgcGFyc2VkLmRhdGEuZW50cmllcyk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkc1xuICAgICAgaWYgKCFtZXRhZGF0YSB8fCAhbWV0YWRhdGEubmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBtdXN0IGhhdmUgbWV0YWRhdGEgd2l0aCBuYW1lJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBtZW1vcnkgaW5zdGFuY2VcbiAgICAgIGNvbnN0IG1lbW9yeSA9IG5ldyBNZW1vcnkobWV0YWRhdGEpO1xuICAgICAgXG4gICAgICAvLyBMb2FkIGVudHJpZXMgaWYgcHJlc2VudFxuICAgICAgaWYgKGVudHJpZXMpIHtcbiAgICAgICAgbWVtb3J5LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBpZDogbWVtb3J5LmlkLFxuICAgICAgICAgIHR5cGU6IG1lbW9yeS50eXBlLFxuICAgICAgICAgIHZlcnNpb246IG1lbW9yeS52ZXJzaW9uLFxuICAgICAgICAgIG1ldGFkYXRhOiBtZW1vcnkubWV0YWRhdGEsXG4gICAgICAgICAgZXh0ZW5zaW9uczogbWVtb3J5LmV4dGVuc2lvbnMsXG4gICAgICAgICAgZW50cmllczogZW50cmllc1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiBtZW1vcnk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9JTVBPUlRfRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gaW1wb3J0IG1lbW9yeTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGltcG9ydCBtZW1vcnk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRXhwb3J0IGEgbWVtb3J5IHRvIFlBTUwgc3RyaW5nXG4gICAqL1xuICBhc3luYyBleHBvcnRFbGVtZW50KGVsZW1lbnQ6IE1lbW9yeSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgc3RhdHMgPSBlbGVtZW50LmdldFN0YXRzKCk7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG1ldGFkYXRhOiBlbGVtZW50Lm1ldGFkYXRhLFxuICAgICAgZXh0ZW5zaW9uczogZWxlbWVudC5leHRlbnNpb25zLFxuICAgICAgc3RhdHM6IHtcbiAgICAgICAgdG90YWxFbnRyaWVzOiBzdGF0cy50b3RhbEVudHJpZXMsXG4gICAgICAgIHRvdGFsU2l6ZTogc3RhdHMudG90YWxTaXplLFxuICAgICAgICBvbGRlc3RFbnRyeTogc3RhdHMub2xkZXN0RW50cnk/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIG5ld2VzdEVudHJ5OiBzdGF0cy5uZXdlc3RFbnRyeT8udG9JU09TdHJpbmcoKVxuICAgICAgfSxcbiAgICAgIGVudHJpZXM6IEpTT04ucGFyc2UoZWxlbWVudC5zZXJpYWxpemUoKSkuZW50cmllc1xuICAgIH07XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYOiBVc2Ugc2VjdXJlIFlBTUwgZHVtcGluZ1xuICAgIHJldHVybiB5YW1sLmR1bXAoZGF0YSwge1xuICAgICAgc2NoZW1hOiB5YW1sLkZBSUxTQUZFX1NDSEVNQSxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIHNraXBJbnZhbGlkOiB0cnVlLFxuICAgICAgc29ydEtleXM6IHRydWVcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgbWVtb3J5IGVsZW1lbnRcbiAgICovXG4gIHZhbGlkYXRlKGVsZW1lbnQ6IE1lbW9yeSk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gZWxlbWVudC52YWxpZGF0ZSgpO1xuICB9XG4gIFxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIHJlc29sdmUgYSBmaWxlIHBhdGhcbiAgICogU0VDVVJJVFk6IFByZXZlbnRzIGRpcmVjdG9yeSB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKi9cbiAgdmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgLy8gUGVyZm9ybSBzeW5jaHJvbm91cyB2YWxpZGF0aW9uIGNoZWNrc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIHBhdGggdHJhdmVyc2FsIGF0dGVtcHRzXG4gICAgICBpZiAobm9ybWFsaXplZC5pbmNsdWRlcygnLi4nKSB8fCBwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbnN1cmUgcHJvcGVyIGV4dGVuc2lvblxuICAgICAgaWYgKCFub3JtYWxpemVkLmVuZHNXaXRoKCcubWQnKSAmJiAhbm9ybWFsaXplZC5lbmRzV2l0aCgnLnlhbWwnKSAmJiAhbm9ybWFsaXplZC5lbmRzV2l0aCgnLnltbCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBlbGVtZW50IHR5cGUgdGhpcyBtYW5hZ2VyIGhhbmRsZXNcbiAgICovXG4gIGdldEVsZW1lbnRUeXBlKCk6IEVsZW1lbnRUeXBlIHtcbiAgICByZXR1cm4gRWxlbWVudFR5cGUuTUVNT1JZO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgbWVtb3J5IGZpbGVzXG4gICAqL1xuICBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcueWFtbCc7XG4gIH1cbiAgXG4gIC8vIFByaXZhdGUgaGVscGVyIG1ldGhvZHNcbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgcmVzb2x2ZSBhIGZpbGUgcGF0aCB0byBwcmV2ZW50IHNlY3VyaXR5IGlzc3Vlc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB2YWxpZGF0ZSBhbmQgcmVzb2x2ZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdmFsaWRhdGVkIGZ1bGwgcGF0aFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwYXRoIGNvbnRhaW5zIHRyYXZlcnNhbCBhdHRlbXB0cyAoLi4vKVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwYXRoIGlzIGFic29sdXRlIG9yIGludmFsaWRcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gZmlsZSBleHRlbnNpb24gaXMgbm90IGFsbG93ZWQgKC5tZCwgLnlhbWwsIC55bWwpXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHJlc29sdmVkIHBhdGggd291bGQgYmUgb3V0c2lkZSBtZW1vcmllcyBkaXJlY3RvcnlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IENvbXByZWhlbnNpdmUgcGF0aCB2YWxpZGF0aW9uXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKTtcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgICBpZiAobm9ybWFsaXplZC5pbmNsdWRlcygnLi4nKSB8fCBwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZCkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgQmxvY2tlZCBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0OiAke2ZpbGVQYXRofWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZpbGUgcGF0aDogUGF0aCB0cmF2ZXJzYWwgZGV0ZWN0ZWQnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIHByb3BlciBleHRlbnNpb24gLSBtZW1vcmllcyBzaG91bGQgb25seSBiZSAueWFtbCBvciAueW1sXG4gICAgaWYgKCFub3JtYWxpemVkLmVuZHNXaXRoKCcueWFtbCcpICYmICFub3JtYWxpemVkLmVuZHNXaXRoKCcueW1sJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IGZpbGVzIG11c3QgaGF2ZSAueWFtbCBvciAueW1sIGV4dGVuc2lvbicpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb25zdHJ1Y3QgZnVsbCBwYXRoXG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0Rpciwgbm9ybWFsaXplZCk7XG4gICAgXG4gICAgLy8gVmVyaWZ5IGl0J3Mgd2l0aGluIG1lbW9yaWVzIGRpcmVjdG9yeVxuICAgIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm1lbW9yaWVzRGlyLCBmdWxsUGF0aCk7XG4gICAgaWYgKHJlbGF0aXZlLnN0YXJ0c1dpdGgoJy4uJykgfHwgcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIHBhdGggbXVzdCBiZSB3aXRoaW4gbWVtb3JpZXMgZGlyZWN0b3J5Jyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBmdWxsUGF0aDtcbiAgfVxuICBcbiAgcHJpdmF0ZSBwYXJzZU1lbW9yeUZpbGUocGFyc2VkOiBhbnkpOiB7IG1ldGFkYXRhOiBNZW1vcnlNZXRhZGF0YTsgY29udGVudDogc3RyaW5nIH0ge1xuICAgIC8vIEZJWDogU2VjdXJlWWFtbFBhcnNlciByZXR1cm5zIGRhdGEgaW4gJ2RhdGEnIHByb3BlcnR5LCBub3QgJ21ldGFkYXRhJ1xuICAgIC8vIEZvciBtYXJrZG93biBmaWxlcyB3aXRoIFlBTUwgZnJvbnRtYXR0ZXIsIHRoZSBzdHJ1Y3R1cmUgaXM6XG4gICAgLy8gcGFyc2VkLmRhdGEgPSBZQU1MIGZyb250bWF0dGVyIHZhbHVlc1xuICAgIC8vIHBhcnNlZC5jb250ZW50ID0gbWFya2Rvd24gY29udGVudCBhZnRlciBmcm9udG1hdHRlclxuICAgIGNvbnN0IHlhbWxEYXRhID0gcGFyc2VkLmRhdGEgfHwge307XG5cbiAgICAvLyBFeHRyYWN0IG1ldGFkYXRhIHdpdGggdmFsaWRhdGlvblxuICAgIGNvbnN0IG1ldGFkYXRhOiBNZW1vcnlNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IHNhbml0aXplSW5wdXQoeWFtbERhdGEubmFtZSB8fCAnVW5uYW1lZCBNZW1vcnknLCAxMDApLFxuICAgICAgZGVzY3JpcHRpb246IHlhbWxEYXRhLmRlc2NyaXB0aW9uID9cbiAgICAgICAgc2FuaXRpemVJbnB1dCh5YW1sRGF0YS5kZXNjcmlwdGlvbiwgNTAwKSA6XG4gICAgICAgICcnLFxuICAgICAgdmVyc2lvbjogeWFtbERhdGEudmVyc2lvbiB8fCAnMS4wLjAnLFxuICAgICAgYXV0aG9yOiB5YW1sRGF0YS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiB5YW1sRGF0YS5jcmVhdGVkLFxuICAgICAgbW9kaWZpZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRhZ3M6IEFycmF5LmlzQXJyYXkoeWFtbERhdGEudGFncykgP1xuICAgICAgICB5YW1sRGF0YS50YWdzLm1hcCgodGFnOiBzdHJpbmcpID0+IHNhbml0aXplSW5wdXQodGFnLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9UQUdfTEVOR1RIKSkgOlxuICAgICAgICBbXSxcbiAgICAgIHN0b3JhZ2VCYWNrZW5kOiB5YW1sRGF0YS5zdG9yYWdlX2JhY2tlbmQgfHwgeWFtbERhdGEuc3RvcmFnZUJhY2tlbmQgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1NUT1JBR0VfQkFDS0VORCxcbiAgICAgIHJldGVudGlvbkRheXM6IHlhbWxEYXRhLnJldGVudGlvbl9wb2xpY3k/LmRlZmF1bHQgP1xuICAgICAgICB0aGlzLnBhcnNlUmV0ZW50aW9uRGF5cyh5YW1sRGF0YS5yZXRlbnRpb25fcG9saWN5LmRlZmF1bHQpIDpcbiAgICAgICAgKHlhbWxEYXRhLnJldGVudGlvbkRheXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1JFVEVOVElPTl9EQVlTKSxcbiAgICAgIHByaXZhY3lMZXZlbDogeWFtbERhdGEucHJpdmFjeV9sZXZlbCB8fCB5YW1sRGF0YS5wcml2YWN5TGV2ZWwgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1BSSVZBQ1lfTEVWRUwsXG4gICAgICBzZWFyY2hhYmxlOiB5YW1sRGF0YS5zZWFyY2hhYmxlICE9PSBmYWxzZSxcbiAgICAgIG1heEVudHJpZXM6IHlhbWxEYXRhLm1heEVudHJpZXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUXG4gICAgfTtcblxuICAgIC8vIEV4dHJhY3QgY29udGVudCAoaWYgYW55KVxuICAgIGNvbnN0IGNvbnRlbnQgPSBwYXJzZWQuY29udGVudCB8fCAnJztcblxuICAgIHJldHVybiB7IG1ldGFkYXRhLCBjb250ZW50IH07XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIHBhcnNlIHJldGVudGlvbiBkYXlzIGZyb20gdmFyaW91cyBmb3JtYXRzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUmV0ZW50aW9uRGF5cyhyZXRlbnRpb246IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiByZXRlbnRpb24gPT09ICdudW1iZXInKSByZXR1cm4gcmV0ZW50aW9uO1xuICAgIGlmIChyZXRlbnRpb24gPT09ICdwZXJtYW5lbnQnIHx8IHJldGVudGlvbiA9PT0gJ3BlcnBldHVhbCcpIHJldHVybiA5OTk5OTk7XG4gICAgY29uc3QgbWF0Y2ggPSByZXRlbnRpb24ubWF0Y2goLyhcXGQrKVxccypkYXlzPy9pKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBwYXJzZUludChtYXRjaFsxXSkgOiBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUkVURU5USU9OX0RBWVM7XG4gIH1cbn0iXX0=
657
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUErQixNQUFNLGFBQWEsQ0FBQztBQUdsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFakMsTUFBTSxPQUFPLGFBQWE7SUFDaEIsZ0JBQWdCLENBQW1CO0lBQ25DLFdBQVcsQ0FBUztJQUNwQixXQUFXLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDN0MsZ0JBQWdCLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFMUQsOEVBQThFO0lBQzlFLDJDQUEyQztJQUNuQyxnQkFBZ0IsR0FBb0IsSUFBSSxDQUFDO0lBQ3pDLHlCQUF5QixHQUFXLENBQUMsQ0FBQztJQUU5QztRQUNFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQWdCO1FBQ3pCLElBQUksQ0FBQztZQUNILElBQUksUUFBNEIsQ0FBQztZQUVqQyxpREFBaUQ7WUFDakQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7Z0JBQzFFLHlCQUF5QjtnQkFDekIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2hELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFFbEIsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDckMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDbkUsSUFBSSxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUNsRSxRQUFRLEdBQUcsUUFBUSxDQUFDO3dCQUNwQixLQUFLLEdBQUcsSUFBSSxDQUFDO3dCQUNiLE1BQU07b0JBQ1IsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDWCwyRUFBMkU7b0JBQzNFLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekQsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUVELDZCQUE2QjtZQUM3QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBRUQsb0JBQW9CO1lBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUVELGdFQUFnRTtZQUNoRSxvRUFBb0U7WUFDcEUsK0RBQStEO1lBQy9ELE1BQU0sT0FBTyxHQUFHLE1BQU0sZUFBZSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUV0Riw0RUFBNEU7WUFDNUUsNENBQTRDO1lBQzVDLHFGQUFxRjtZQUVyRix5RkFBeUY7WUFDekYsc0VBQXNFO1lBQ3RFLElBQUksTUFBVyxDQUFDO1lBRWhCLDJEQUEyRDtZQUMzRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztZQUMzQixPQUFPLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JGLGtCQUFrQixFQUFFLENBQUM7WUFDdkIsQ0FBQztZQUVELGlDQUFpQztZQUNqQyxJQUFJLGtCQUFrQixLQUFLLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDMUMsZ0VBQWdFO2dCQUNoRSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNyQyxDQUFDO2lCQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7Z0JBQzFELHlFQUF5RTtnQkFDekUsTUFBTSxjQUFjLEdBQUcsUUFBUSxPQUFPLFNBQVMsQ0FBQztnQkFDaEQsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRTtvQkFDekQsV0FBVyxFQUFFLGdCQUFnQixDQUFDLGFBQWE7b0JBQzNDLGVBQWUsRUFBRSxJQUFJO2lCQUN0QixDQUFDLENBQUM7Z0JBQ0gsMEVBQTBFO2dCQUMxRSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDbkQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHVFQUF1RTtnQkFDdkUsTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7b0JBQ3ZDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxhQUFhO29CQUMzQyxlQUFlLEVBQUUsSUFBSTtpQkFDdEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELCtCQUErQjtZQUMvQixNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTFFLHlCQUF5QjtZQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVwQyxnQ0FBZ0M7WUFDaEMsMkRBQTJEO1lBQzNELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO1lBQ3JDLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNoQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0JBQ2IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUNqQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87b0JBQ3ZCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtvQkFDekIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO29CQUM3QixPQUFPLEVBQUUsT0FBTztpQkFDakIsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDO1lBRUQsMEJBQTBCO1lBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV2QyxzQkFBc0I7WUFDdEIsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsc0JBQXNCLENBQUMsYUFBYTtnQkFDMUMsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLG9CQUFvQjtnQkFDNUIsT0FBTyxFQUFFLHNCQUFzQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2FBQ3pELENBQUMsQ0FBQztZQUVILE9BQU8sTUFBTSxDQUFDO1FBRWhCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCO2dCQUMvQyxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsTUFBTSxFQUFFLG9CQUFvQjtnQkFDNUIsT0FBTyxFQUFFLDhCQUE4QixRQUFRLEtBQUssS0FBSyxFQUFFO2FBQzVELENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBZSxFQUFFLFFBQWlCO1FBQ2pFLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDeEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEksTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXpELDRCQUE0QjtRQUM1QixNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFOUMsdUZBQXVGO1FBQ3ZGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFFN0Isb0JBQW9CO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLFFBQVEsSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksUUFBUSxPQUFPLENBQUM7UUFDN0csSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUVoQix3Q0FBd0M7UUFDeEMsT0FBTyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0YsT0FBTyxFQUFFLENBQUM7WUFDVixTQUFTLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxPQUFPLE9BQU8sQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxvQkFBb0IsQ0FBQyxPQUFlO1FBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDN0IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU87U0FDakQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLGNBQWM7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLGFBQWE7UUFFdEMsZ0NBQWdDO1FBQ2hDLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUk7WUFDOUIsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDdkQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0IsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDNUUsTUFBTSxPQUFPLEdBQUcsT0FBTztpQkFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzlFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7aUJBQ3hCLElBQUksRUFBRTtpQkFDTixPQUFPLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQjtZQUVsQyxtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztZQUNoQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsR0FBRyxDQUFDO1lBRXJDLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSyxLQUFhLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNyQyxxQkFBcUI7Z0JBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxHQUFHLENBQUM7Z0JBQ3JDLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWUsRUFBRSxRQUFpQjtRQUMzQyxJQUFJLENBQUM7WUFDSCxtQkFBbUI7WUFDbkIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUYsQ0FBQztZQUVELDJDQUEyQztZQUMzQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUU1RCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQiwwQkFBMEI7Z0JBQzFCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDL0IsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsTUFBTSxFQUFFLG9CQUFvQjtvQkFDNUIsT0FBTyxFQUFFLHlDQUF5QyxZQUFZLEVBQUU7aUJBQ2pFLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCwyQ0FBMkM7WUFDM0MsTUFBTSxRQUFRLEdBQUcsUUFBUTtnQkFDdkIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTNDLG9EQUFvRDtZQUNwRCxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRTVELHdCQUF3QjtZQUN4QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFakMsMEJBQTBCO1lBQzFCLE1BQU0sSUFBSSxHQUFHO2dCQUNYLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtnQkFDMUIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO2dCQUM5QixLQUFLLEVBQUU7b0JBQ0wsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO29CQUNoQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7b0JBQzFCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRTtvQkFDN0MsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFO29CQUM3QyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO3lCQUM5QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUMzQixLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt5QkFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2lCQUMzQztnQkFDRCxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPO2FBQ2pELENBQUM7WUFFRiw0REFBNEQ7WUFDNUQsa0RBQWtEO1lBQ2xELDJFQUEyRTtZQUMzRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDbEMsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUM1QixNQUFNLEVBQUUsSUFBSTtnQkFDWixXQUFXLEVBQUUsSUFBSTtnQkFDakIsUUFBUSxFQUFFLElBQUk7YUFDZixDQUFDLENBQUM7WUFFSCw0REFBNEQ7WUFDNUQsa0VBQWtFO1lBQ2xFLGtFQUFrRTtZQUNsRSxNQUFNLGVBQWUsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRXBGLGVBQWU7WUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFeEMsNEJBQTRCO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRWpELHNCQUFzQjtZQUN0QixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxZQUFZO2dCQUN6QyxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsb0JBQW9CO2dCQUM1QixPQUFPLEVBQUUsbUJBQW1CLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxDQUFDLFlBQVksVUFBVTthQUN6RixDQUFDLENBQUM7UUFFTCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHNCQUFzQixDQUFDLGtCQUFrQjtnQkFDL0MsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLE1BQU0sRUFBRSxvQkFBb0I7Z0JBQzVCLE9BQU8sRUFBRSw0QkFBNEIsUUFBUSxLQUFLLEtBQUssRUFBRTthQUMxRCxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUM7WUFDSCx1QkFBdUI7WUFDdkIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFaEQsaURBQWlEO1lBQ2pELDJDQUEyQztZQUMzQyxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztpQkFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDckQsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRW5CLG9DQUFvQztZQUNwQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUM7b0JBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QixDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsZUFBZSxDQUFDLGdCQUFnQixDQUFDO3dCQUMvQixJQUFJLEVBQUUsc0JBQXNCLENBQUMsdUJBQXVCO3dCQUNwRCxRQUFRLEVBQUUsS0FBSzt3QkFDZixNQUFNLEVBQUUsb0JBQW9CO3dCQUM1QixPQUFPLEVBQUUsa0JBQWtCLElBQUksS0FBSyxLQUFLLEVBQUU7cUJBQzVDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUVELHVCQUF1QjtZQUN2QixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzNELE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7cUJBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7cUJBQ3JELEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFbkIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDO3dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUM1RCxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN4QixDQUFDO29CQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7d0JBQ2YsZUFBZSxDQUFDLGdCQUFnQixDQUFDOzRCQUMvQixJQUFJLEVBQUUsc0JBQXNCLENBQUMsdUJBQXVCOzRCQUNwRCxRQUFRLEVBQUUsS0FBSzs0QkFDZixNQUFNLEVBQUUsb0JBQW9COzRCQUM1QixPQUFPLEVBQUUsa0JBQWtCLFVBQVUsSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO3lCQUMxRCxDQUFDLENBQUM7b0JBQ0wsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDO1FBRWxCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSyxLQUFhLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNyQyw4QkFBOEI7Z0JBQzlCLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBdUM7UUFDaEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBdUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQWdCO1FBQzNCLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTdELHVCQUF1QjtZQUN2QixNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFMUIsa0JBQWtCO1lBQ2xCLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUUxQixvQkFBb0I7WUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbEMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsc0JBQXNCLENBQUMsY0FBYztnQkFDM0MsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSxzQkFBc0I7Z0JBQzlCLE9BQU8sRUFBRSx3QkFBd0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTthQUMzRCxDQUFDLENBQUM7UUFFTCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUssS0FBYSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDckMsd0RBQXdEO2dCQUN4RCxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBZ0I7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0QsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBaUM7UUFDNUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBWSxFQUFFLFNBQTBCLE1BQU07UUFDaEUsSUFBSSxDQUFDO1lBQ0gsSUFBSSxNQUFXLENBQUM7WUFFaEIsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLENBQUM7aUJBQU0sQ0FBQztnQkFDTiw2Q0FBNkM7Z0JBQzdDLDZFQUE2RTtnQkFDN0UsSUFBSSxDQUFDO29CQUNILHVDQUF1QztvQkFDdkMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7b0JBQy9ELENBQUM7b0JBRUQsMERBQTBEO29CQUMxRCxvREFBb0Q7b0JBQ3BELE1BQU0sV0FBVyxHQUFHLFFBQVEsSUFBSSxTQUFTLENBQUM7b0JBRTFDLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7d0JBQ3RELFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxhQUFhO3dCQUMzQyxlQUFlLEVBQUUsSUFBSTtxQkFDdEIsQ0FBQyxDQUFDO29CQUVILDJEQUEyRDtvQkFDM0QsTUFBTSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBRTVCLENBQUM7Z0JBQUMsT0FBTyxTQUFTLEVBQUUsQ0FBQztvQkFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDaEQsQ0FBQztnQkFFRCwwQkFBMEI7Z0JBQzFCLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztnQkFDakQsQ0FBQztZQUNILENBQUM7WUFFRCxnREFBZ0Q7WUFDaEQsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUMvQixJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXJFLDJCQUEyQjtZQUMzQixJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUVELHlCQUF5QjtZQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVwQywwQkFBMEI7WUFDMUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ2hDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtvQkFDYixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ2pCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztvQkFDdkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO29CQUN6QixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7b0JBQzdCLE9BQU8sRUFBRSxPQUFPO2lCQUNqQixDQUFDLENBQUMsQ0FBQztZQUNOLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUVoQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHNCQUFzQixDQUFDLG9CQUFvQjtnQkFDakQsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSw2QkFBNkI7Z0JBQ3JDLE9BQU8sRUFBRSw0QkFBNEIsS0FBSyxFQUFFO2FBQzdDLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBZTtRQUNqQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUc7WUFDWCxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQzlCLEtBQUssRUFBRTtnQkFDTCxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7Z0JBQ2hDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFO2dCQUM3QyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUU7YUFDOUM7WUFDRCxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPO1NBQ2pELENBQUM7UUFFRix3Q0FBd0M7UUFDeEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDNUIsTUFBTSxFQUFFLElBQUk7WUFDWixXQUFXLEVBQUUsSUFBSTtZQUNqQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxPQUFlO1FBQ3RCLE9BQU8sT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLENBQUMsUUFBZ0I7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsd0NBQXdDO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFNUMsb0NBQW9DO1lBQ3BDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELDBCQUEwQjtZQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ2pHLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCO1FBQ2QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELHlCQUF5QjtJQUV6Qjs7Ozs7Ozs7T0FRRztJQUNLLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxRQUFnQjtRQUNuRCw4Q0FBOEM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1QyxvQ0FBb0M7UUFDcEMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM3RCxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSx3QkFBd0I7Z0JBQzlCLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixNQUFNLEVBQUUsc0NBQXNDO2dCQUM5QyxPQUFPLEVBQUUsbUNBQW1DLFFBQVEsRUFBRTthQUN2RCxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELGtFQUFrRTtRQUNsRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNsRSxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFekQsd0NBQXdDO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMzRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUFXO1FBQ2pDLHdFQUF3RTtRQUN4RSw4REFBOEQ7UUFDOUQsd0NBQXdDO1FBQ3hDLHNEQUFzRDtRQUV0RCwrRUFBK0U7UUFDL0UsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFFbkMsb0VBQW9FO1FBQ3BFLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDO1FBRXJELG1DQUFtQztRQUNuQyxNQUFNLFFBQVEsR0FBbUI7WUFDL0IsSUFBSSxFQUFFLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLEdBQUcsQ0FBQztZQUNqRSxXQUFXLEVBQUUsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN2QyxhQUFhLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxFQUFFO1lBQ0osT0FBTyxFQUFFLGNBQWMsQ0FBQyxPQUFPLElBQUksT0FBTztZQUMxQyxNQUFNLEVBQUUsY0FBYyxDQUFDLE1BQU07WUFDN0IsT0FBTyxFQUFFLGNBQWMsQ0FBQyxPQUFPO1lBQy9CLFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQzdELElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9GLEVBQUU7WUFDSixjQUFjLEVBQUUsY0FBYyxDQUFDLGVBQWUsSUFBSSxjQUFjLENBQUMsY0FBYyxJQUFJLGdCQUFnQixDQUFDLHVCQUF1QjtZQUMzSCxhQUFhLEVBQUUsY0FBYyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ2xFLENBQUMsY0FBYyxDQUFDLGFBQWEsSUFBSSxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQztZQUMzRSxZQUFZLEVBQUUsY0FBYyxDQUFDLGFBQWEsSUFBSSxjQUFjLENBQUMsWUFBWSxJQUFJLGdCQUFnQixDQUFDLHFCQUFxQjtZQUNuSCxVQUFVLEVBQUUsY0FBYyxDQUFDLFVBQVUsS0FBSyxLQUFLO1lBQy9DLFVBQVUsRUFBRSxjQUFjLENBQUMsVUFBVSxJQUFJLGdCQUFnQixDQUFDLG1CQUFtQjtTQUM5RSxDQUFDO1FBRUYsMkJBQTJCO1FBQzNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBRXJDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsU0FBMEI7UUFDbkQsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDcEQsSUFBSSxTQUFTLEtBQUssV0FBVyxJQUFJLFNBQVMsS0FBSyxXQUFXO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFDMUUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDO0lBQzlFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVtb3J5TWFuYWdlciAtIEltcGxlbWVudGF0aW9uIG9mIElFbGVtZW50TWFuYWdlciBmb3IgTWVtb3J5IGVsZW1lbnRzXG4gKiBIYW5kbGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgZm9yIG1lbW9yaWVzIGltcGxlbWVudGluZyBJRWxlbWVudFxuICogXG4gKiBGSVhFUyBJTVBMRU1FTlRFRDpcbiAqIDEuIENSSVRJQ0FMOiBGaXhlZCByYWNlIGNvbmRpdGlvbnMgaW4gZmlsZSBvcGVyYXRpb25zIGJ5IHVzaW5nIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIHJlYWRzL3dyaXRlc1xuICogMi4gSElHSDogRml4ZWQgdW52YWxpZGF0ZWQgWUFNTCBwYXJzaW5nIHZ1bG5lcmFiaWxpdHkgYnkgdXNpbmcgU2VjdXJlWWFtbFBhcnNlclxuICogMy4gTUVESVVNOiBBbGwgdXNlciBpbnB1dHMgYXJlIG5vdyB2YWxpZGF0ZWQgYW5kIHNhbml0aXplZFxuICogNC4gTUVESVVNOiBBdWRpdCBsb2dnaW5nIGFkZGVkIGZvciBzZWN1cml0eSBvcGVyYXRpb25zXG4gKiA1LiBNRURJVU06IFBhdGggdmFsaWRhdGlvbiBwcmV2ZW50cyBkaXJlY3RvcnkgdHJhdmVyc2FsIGF0dGFja3NcbiAqL1xuXG5pbXBvcnQgeyBNZW1vcnksIE1lbW9yeU1ldGFkYXRhLCBNZW1vcnlFbnRyeSB9IGZyb20gJy4vTWVtb3J5LmpzJztcbmltcG9ydCB7IElFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IE1FTU9SWV9DT05TVEFOVFMsIE1FTU9SWV9TRUNVUklUWV9FVkVOVFMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5leHBvcnQgY2xhc3MgTWVtb3J5TWFuYWdlciBpbXBsZW1lbnRzIElFbGVtZW50TWFuYWdlcjxNZW1vcnk+IHtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcml2YXRlIG1lbW9yaWVzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgbWVtb3J5Q2FjaGU6IE1hcDxzdHJpbmcsIE1lbW9yeT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgY29udGVudEhhc2hJbmRleDogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcblxuICAvLyBQRVJGT1JNQU5DRSBJTVBST1ZFTUVOVDogQ2FjaGUgZm9yIGRhdGUgZm9sZGVycyB0byBhdm9pZCBkaXJlY3Rvcnkgc2Nhbm5pbmdcbiAgLy8gSW52YWxpZGF0ZWQgd2hlbiBuZXcgZm9sZGVycyBhcmUgY3JlYXRlZFxuICBwcml2YXRlIGRhdGVGb2xkZXJzQ2FjaGU6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGF0ZUZvbGRlcnNDYWNoZVRpbWVzdGFtcDogbnVtYmVyID0gMDtcbiAgXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLm1lbW9yaWVzRGlyID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuTUVNT1JZKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIExvYWQgYSBtZW1vcnkgZnJvbSBmaWxlXG4gICAqIFNFQ1VSSVRZIEZJWCAjMTogVXNlcyBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoKSBpbnN0ZWFkIG9mIGZzLnJlYWRGaWxlKClcbiAgICogdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgYW5kIGVuc3VyZSBhdG9taWMgZmlsZSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIHRvIHRoZSBtZW1vcnkgZmlsZSB0byBsb2FkXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBsb2FkZWQgTWVtb3J5IGluc3RhbmNlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGZpbGUgY2Fubm90IGJlIGZvdW5kIG9yIHBhdGggdmFsaWRhdGlvbiBmYWlsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBZQU1MIHBhcnNpbmcgZmFpbHMgb3IgY29udGVudCBpcyBtYWxmb3JtZWRcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gbWVtb3J5IHZhbGlkYXRpb24gZmFpbHMgYWZ0ZXIgbG9hZGluZ1xuICAgKi9cbiAgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxNZW1vcnk+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGZ1bGxQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSByZWxhdGl2ZSBwYXRoIChubyBkYXRlIGZvbGRlcilcbiAgICAgIGlmICghZmlsZVBhdGguaW5jbHVkZXMocGF0aC5zZXApIHx8ICFmaWxlUGF0aC5tYXRjaCgvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9LykpIHtcbiAgICAgICAgLy8gU2VhcmNoIGluIGRhdGUgZm9sZGVyc1xuICAgICAgICBjb25zdCBkYXRlRm9sZGVycyA9IGF3YWl0IHRoaXMuZ2V0RGF0ZUZvbGRlcnMoKTtcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBkYXRlRm9sZGVyIG9mIGRhdGVGb2xkZXJzKSB7XG4gICAgICAgICAgY29uc3QgdGVzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgZGF0ZUZvbGRlciwgZmlsZVBhdGgpO1xuICAgICAgICAgIGlmIChhd2FpdCBmcy5hY2Nlc3ModGVzdFBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpKSB7XG4gICAgICAgICAgICBmdWxsUGF0aCA9IHRlc3RQYXRoO1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgIC8vIEZhbGwgYmFjayB0byByb290IGRpcmVjdG9yeSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBkdXJpbmcgdHJhbnNpdGlvblxuICAgICAgICAgIGZ1bGxQYXRoID0gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnVsbFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgZnVsbFBhdGggaXMgZGVmaW5lZFxuICAgICAgaWYgKCFmdWxsUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZXNvbHZlIHBhdGg6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0XG4gICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLm1lbW9yeUNhY2hlLmdldChmdWxsUGF0aCk7XG4gICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGF0b21pYyBmaWxlIHJlYWQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIHdpdGggcHJvcGVyIGVuY29kaW5nIG9iamVjdCBmb3JtYXRcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoZnVsbFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIEhJR0ggU0VWRVJJVFkgRklYOiBVc2UgU2VjdXJlWWFtbFBhcnNlciB0byBwcmV2ZW50IFlBTUwgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIC8vIFByZXZpb3VzbHk6IENvdWxkIHVzZSB1bnNhZmUgWUFNTCBwYXJzaW5nXG4gICAgICAvLyBOb3c6IFVzZXMgU2VjdXJlWWFtbFBhcnNlciB3aGljaCB2YWxpZGF0ZXMgY29udGVudCBhbmQgcHJldmVudHMgbWFsaWNpb3VzIHBhdHRlcm5zXG5cbiAgICAgIC8vIE1lbW9yeSBmaWxlcyBhcmUgcHVyZSBZQU1MICh1bmxpa2Ugb3RoZXIgZWxlbWVudHMgd2hpY2ggYXJlIG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXIpXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIHB1cmUgWUFNTCAoZG9lc24ndCBzdGFydCB3aXRoIGZyb250bWF0dGVyIG1hcmtlcnMpXG4gICAgICBsZXQgcGFyc2VkOiBhbnk7XG5cbiAgICAgIC8vIEVmZmljaWVudCBmb3JtYXQgZGV0ZWN0aW9uIHdpdGhvdXQgY3JlYXRpbmcgdHJpbW1lZCBjb3B5XG4gICAgICBsZXQgZmlyc3ROb25XaGl0ZXNwYWNlID0gMDtcbiAgICAgIHdoaWxlIChmaXJzdE5vbldoaXRlc3BhY2UgPCBjb250ZW50Lmxlbmd0aCAmJiAvXFxzLy50ZXN0KGNvbnRlbnRbZmlyc3ROb25XaGl0ZXNwYWNlXSkpIHtcbiAgICAgICAgZmlyc3ROb25XaGl0ZXNwYWNlKys7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBlbXB0eSBjb250ZW50IGVkZ2UgY2FzZVxuICAgICAgaWYgKGZpcnN0Tm9uV2hpdGVzcGFjZSA9PT0gY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgLy8gRW1wdHkgb3IgYWxsIHdoaXRlc3BhY2UgZmlsZSAtIGNyZWF0ZSBtaW5pbWFsIHZhbGlkIHN0cnVjdHVyZVxuICAgICAgICBwYXJzZWQgPSB7IGRhdGE6IHt9LCBjb250ZW50OiAnJyB9O1xuICAgICAgfSBlbHNlIGlmICghY29udGVudC5zdGFydHNXaXRoKCctLS0nLCBmaXJzdE5vbldoaXRlc3BhY2UpKSB7XG4gICAgICAgIC8vIFB1cmUgWUFNTCBmaWxlIC0gd3JhcCBpdCB3aXRoIGZyb250bWF0dGVyIG1hcmtlcnMgZm9yIFNlY3VyZVlhbWxQYXJzZXJcbiAgICAgICAgY29uc3Qgd3JhcHBlZENvbnRlbnQgPSBgLS0tXFxuJHtjb250ZW50fVxcbi0tLVxcbmA7XG4gICAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZSh3cmFwcGVkQ29udGVudCwge1xuICAgICAgICAgIG1heFlhbWxTaXplOiBNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkUsXG4gICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBGb3IgcHVyZSBZQU1MLCB0aGUgZW50aXJlIGNvbnRlbnQgYmVjb21lcyB0aGUgZGF0YSwgbm8gbWFya2Rvd24gY29udGVudFxuICAgICAgICBwYXJzZWQgPSB7IGRhdGE6IHBhcnNlUmVzdWx0LmRhdGEsIGNvbnRlbnQ6ICcnIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGaWxlIHdpdGggZnJvbnRtYXR0ZXIgKHNob3VsZG4ndCBoYXBwZW4gZm9yIG1lbW9yaWVzLCBidXQgaGFuZGxlIGl0KVxuICAgICAgICBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGNvbnRlbnQsIHtcbiAgICAgICAgICBtYXhZYW1sU2l6ZTogTUVNT1JZX0NPTlNUQU5UUy5NQVhfWUFNTF9TSVpFLFxuICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBtZXRhZGF0YSBhbmQgY29udGVudFxuICAgICAgY29uc3QgeyBtZXRhZGF0YSwgY29udGVudDogbWVtb3J5Q29udGVudCB9ID0gdGhpcy5wYXJzZU1lbW9yeUZpbGUocGFyc2VkKTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIG1lbW9yeSBpbnN0YW5jZVxuICAgICAgY29uc3QgbWVtb3J5ID0gbmV3IE1lbW9yeShtZXRhZGF0YSk7XG4gICAgICBcbiAgICAgIC8vIExvYWQgc2F2ZWQgZW50cmllcyBpZiBwcmVzZW50XG4gICAgICAvLyBNZW1vcnkgZmlsZXMgaGF2ZSBlbnRyaWVzIGFzIGEgdG9wLWxldmVsIGtleSBpbiB0aGUgWUFNTFxuICAgICAgY29uc3QgZW50cmllcyA9IHBhcnNlZC5kYXRhPy5lbnRyaWVzO1xuICAgICAgaWYgKGVudHJpZXMpIHtcbiAgICAgICAgbWVtb3J5LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBpZDogbWVtb3J5LmlkLFxuICAgICAgICAgIHR5cGU6IG1lbW9yeS50eXBlLFxuICAgICAgICAgIHZlcnNpb246IG1lbW9yeS52ZXJzaW9uLFxuICAgICAgICAgIG1ldGFkYXRhOiBtZW1vcnkubWV0YWRhdGEsXG4gICAgICAgICAgZXh0ZW5zaW9uczogbWVtb3J5LmV4dGVuc2lvbnMsXG4gICAgICAgICAgZW50cmllczogZW50cmllc1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENhY2hlIHRoZSBsb2FkZWQgbWVtb3J5XG4gICAgICB0aGlzLm1lbW9yeUNhY2hlLnNldChmdWxsUGF0aCwgbWVtb3J5KTtcbiAgICAgIFxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgbG9hZFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9MT0FERUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5sb2FkJyxcbiAgICAgICAgZGV0YWlsczogYExvYWRlZCBtZW1vcnkgZnJvbSAke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfWBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gbWVtb3J5O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfTE9BRF9GQUlMRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5sb2FkJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBsb2FkIG1lbW9yeSBmcm9tICR7ZmlsZVBhdGh9OiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBtZW1vcnk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGRhdGUtYmFzZWQgcGF0aCBmb3IgbWVtb3J5IHN0b3JhZ2VcbiAgICogQ3JlYXRlcyBZWVlZLU1NLUREIGZvbGRlciBzdHJ1Y3R1cmUgdG8gcHJldmVudCBmbGF0IGRpcmVjdG9yeSBpc3N1ZXNcbiAgICogQHBhcmFtIGVsZW1lbnQgTWVtb3J5IGVsZW1lbnQgdG8gc2F2ZVxuICAgKiBAcGFyYW0gZmlsZU5hbWUgT3B0aW9uYWwgY3VzdG9tIGZpbGVuYW1lXG4gICAqIEByZXR1cm5zIEZ1bGwgcGF0aCB0byBtZW1vcnkgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU1lbW9yeVBhdGgoZWxlbWVudDogTWVtb3J5LCBmaWxlTmFtZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgZGF0ZUZvbGRlciA9IGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICBjb25zdCBkYXRlUGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCBkYXRlRm9sZGVyKTtcblxuICAgIC8vIEVuc3VyZSBkYXRlIGZvbGRlciBleGlzdHNcbiAgICBhd2FpdCBmcy5ta2RpcihkYXRlUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBQRVJGT1JNQU5DRSBJTVBST1ZFTUVOVDogSW52YWxpZGF0ZSBkYXRlIGZvbGRlcnMgY2FjaGUgc2luY2Ugd2UgY3JlYXRlZCBhIG5ldyBmb2xkZXJcbiAgICB0aGlzLmRhdGVGb2xkZXJzQ2FjaGUgPSBudWxsO1xuXG4gICAgLy8gR2VuZXJhdGUgZmlsZW5hbWVcbiAgICBjb25zdCBiYXNlTmFtZSA9IGZpbGVOYW1lIHx8IGAke2VsZW1lbnQubWV0YWRhdGEubmFtZT8udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJykgfHwgJ21lbW9yeSd9LnlhbWxgO1xuICAgIGxldCBmaW5hbE5hbWUgPSBiYXNlTmFtZTtcbiAgICBsZXQgdmVyc2lvbiA9IDE7XG5cbiAgICAvLyBIYW5kbGUgY29sbGlzaW9ucyB3aXRoIHZlcnNpb24gc3VmZml4XG4gICAgd2hpbGUgKGF3YWl0IGZzLmFjY2VzcyhwYXRoLmpvaW4oZGF0ZVBhdGgsIGZpbmFsTmFtZSkpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpKSB7XG4gICAgICB2ZXJzaW9uKys7XG4gICAgICBmaW5hbE5hbWUgPSBiYXNlTmFtZS5yZXBsYWNlKCcueWFtbCcsIGAtdiR7dmVyc2lvbn0ueWFtbGApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoLmpvaW4oZGF0ZVBhdGgsIGZpbmFsTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIFNIQS0yNTYgaGFzaCBvZiBtZW1vcnkgY29udGVudCBmb3IgZGVkdXBsaWNhdGlvblxuICAgKiBJbXBsZW1lbnRzIElzc3VlICM5OTQgLSBDb250ZW50LWJhc2VkIGRlZHVwbGljYXRpb25cbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlQ29udGVudEhhc2goZWxlbWVudDogTWVtb3J5KTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbWV0YWRhdGE6IGVsZW1lbnQubWV0YWRhdGEsXG4gICAgICBlbnRyaWVzOiBKU09OLnBhcnNlKGVsZW1lbnQuc2VyaWFsaXplKCkpLmVudHJpZXNcbiAgICB9KTtcbiAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZGF0ZSBmb2xkZXJzIGluIG1lbW9yaWVzIGRpcmVjdG9yeVxuICAgKiBQRVJGT1JNQU5DRSBJTVBST1ZFTUVOVDogVXNlcyBjYWNoZSB0byBhdm9pZCByZXBlYXRlZCBkaXJlY3Rvcnkgc2Nhbm5pbmdcbiAgICogQ2FjaGUgaXMgaW52YWxpZGF0ZWQgd2hlbiBuZXcgZm9sZGVycyBhcmUgY3JlYXRlZCBvciBhZnRlciA2MCBzZWNvbmRzXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGRhdGUgZm9sZGVyIG5hbWVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldERhdGVGb2xkZXJzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IENBQ0hFX1RUTCA9IDYwMDAwOyAvLyA2MCBzZWNvbmRzXG5cbiAgICAvLyBSZXR1cm4gY2FjaGVkIHJlc3VsdCBpZiB2YWxpZFxuICAgIGlmICh0aGlzLmRhdGVGb2xkZXJzQ2FjaGUgIT09IG51bGwgJiZcbiAgICAgICAgKG5vdyAtIHRoaXMuZGF0ZUZvbGRlcnNDYWNoZVRpbWVzdGFtcCkgPCBDQUNIRV9UVEwpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGVGb2xkZXJzQ2FjaGU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHRoaXMubWVtb3JpZXNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IGZvbGRlcnMgPSBlbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSAmJiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdChlbnRyeS5uYW1lKSlcbiAgICAgICAgLm1hcChlbnRyeSA9PiBlbnRyeS5uYW1lKVxuICAgICAgICAuc29ydCgpXG4gICAgICAgIC5yZXZlcnNlKCk7IC8vIE1vc3QgcmVjZW50IGZpcnN0XG5cbiAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuZGF0ZUZvbGRlcnNDYWNoZSA9IGZvbGRlcnM7XG4gICAgICB0aGlzLmRhdGVGb2xkZXJzQ2FjaGVUaW1lc3RhbXAgPSBub3c7XG5cbiAgICAgIHJldHVybiBmb2xkZXJzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgLy8gQ2FjaGUgZW1wdHkgcmVzdWx0XG4gICAgICAgIHRoaXMuZGF0ZUZvbGRlcnNDYWNoZSA9IFtdO1xuICAgICAgICB0aGlzLmRhdGVGb2xkZXJzQ2FjaGVUaW1lc3RhbXAgPSBub3c7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGEgbWVtb3J5IHRvIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGVsZW1lbnQgTWVtb3J5IGVsZW1lbnQgdG8gc2F2ZVxuICAgKiBAcGFyYW0gZmlsZVBhdGggT3B0aW9uYWwgY3VzdG9tIGZpbGUgcGF0aCwgZGVmYXVsdHMgdG8gZGF0ZS1iYXNlZCBwYXRoXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNhdmUgaXMgY29tcGxldGVcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gbWVtb3J5IHZhbGlkYXRpb24gZmFpbHMgYmVmb3JlIHNhdmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwYXRoIHZhbGlkYXRpb24gZmFpbHMgb3IgZmlsZSBzeXN0ZW0gZXJyb3JzIG9jY3VyXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGF0b21pYyB3cml0ZSBvcGVyYXRpb24gZmFpbHNcbiAgICovXG4gIGFzeW5jIHNhdmUoZWxlbWVudDogTWVtb3J5LCBmaWxlUGF0aD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBlbGVtZW50XG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtZW1vcnk6ICR7dmFsaWRhdGlvbi5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIGNvbnRlbnQgaGFzaCBmb3IgZGVkdXBsaWNhdGlvblxuICAgICAgY29uc3QgY29udGVudEhhc2ggPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRIYXNoKGVsZW1lbnQpO1xuICAgICAgY29uc3QgZXhpc3RpbmdQYXRoID0gdGhpcy5jb250ZW50SGFzaEluZGV4LmdldChjb250ZW50SGFzaCk7XG5cbiAgICAgIGlmIChleGlzdGluZ1BhdGgpIHtcbiAgICAgICAgLy8gTG9nIGR1cGxpY2F0ZSBkZXRlY3Rpb25cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdNRU1PUllfRFVQTElDQVRFX0RFVEVDVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRHVwbGljYXRlIGNvbnRlbnQgZGV0ZWN0ZWQuIEV4aXN0aW5nOiAke2V4aXN0aW5nUGF0aH1gXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSBkYXRlLWJhc2VkIHBhdGggaWYgbm90IHByb3ZpZGVkXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGZpbGVQYXRoXG4gICAgICAgID8gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2VuZXJhdGVNZW1vcnlQYXRoKGVsZW1lbnQpO1xuXG4gICAgICAvLyBFbnN1cmUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMgKGZvciBkYXRlIGZvbGRlcnMpXG4gICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUoZnVsbFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgLy8gR2V0IG1lbW9yeSBzdGF0aXN0aWNzXG4gICAgICBjb25zdCBzdGF0cyA9IGVsZW1lbnQuZ2V0U3RhdHMoKTtcbiAgICAgIFxuICAgICAgLy8gUHJlcGFyZSBkYXRhIGZvciBzYXZpbmdcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIG1ldGFkYXRhOiBlbGVtZW50Lm1ldGFkYXRhLFxuICAgICAgICBleHRlbnNpb25zOiBlbGVtZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIHN0YXRzOiB7XG4gICAgICAgICAgdG90YWxFbnRyaWVzOiBzdGF0cy50b3RhbEVudHJpZXMsXG4gICAgICAgICAgdG90YWxTaXplOiBzdGF0cy50b3RhbFNpemUsXG4gICAgICAgICAgb2xkZXN0RW50cnk6IHN0YXRzLm9sZGVzdEVudHJ5Py50b0lTT1N0cmluZygpLFxuICAgICAgICAgIG5ld2VzdEVudHJ5OiBzdGF0cy5uZXdlc3RFbnRyeT8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB0b3BUYWdzOiBBcnJheS5mcm9tKHN0YXRzLnRhZ0ZyZXF1ZW5jeS5lbnRyaWVzKCkpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYlsxXSAtIGFbMV0pXG4gICAgICAgICAgICAuc2xpY2UoMCwgMTApXG4gICAgICAgICAgICAubWFwKChbdGFnLCBjb3VudF0pID0+ICh7IHRhZywgY291bnQgfSkpXG4gICAgICAgIH0sXG4gICAgICAgIGVudHJpZXM6IEpTT04ucGFyc2UoZWxlbWVudC5zZXJpYWxpemUoKSkuZW50cmllc1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYOiBVc2Ugc2VjdXJlIFlBTUwgZHVtcGluZyB3aXRoIHNhZmV0eSBvcHRpb25zXG4gICAgICAvLyBQcmV2aW91c2x5OiBDb3VsZCBhbGxvdyBkYW5nZXJvdXMgWUFNTCBmZWF0dXJlc1xuICAgICAgLy8gTm93OiBVc2VzIEZBSUxTQUZFX1NDSEVNQSBhbmQgc2VjdXJpdHkgb3B0aW9ucyB0byBwcmV2ZW50IGNvZGUgZXhlY3V0aW9uXG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChkYXRhLCB7XG4gICAgICAgIHNjaGVtYTogeWFtbC5GQUlMU0FGRV9TQ0hFTUEsXG4gICAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgICAgc2tpcEludmFsaWQ6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgYXRvbWljIGZpbGUgd3JpdGUgdG8gcHJldmVudCBjb3JydXB0aW9uXG4gICAgICAvLyBQcmV2aW91c2x5OiBhd2FpdCBmcy53cml0ZUZpbGUoZnVsbFBhdGgsIHlhbWxDb250ZW50LCAndXRmLTgnKTtcbiAgICAgIC8vIE5vdzogVXNlcyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyB3cml0ZSB3aXRoIHByb3BlciBlbmNvZGluZ1xuICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShmdWxsUGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBjYWNoZVxuICAgICAgdGhpcy5tZW1vcnlDYWNoZS5zZXQoZnVsbFBhdGgsIGVsZW1lbnQpO1xuXG4gICAgICAvLyBVcGRhdGUgY29udGVudCBoYXNoIGluZGV4XG4gICAgICB0aGlzLmNvbnRlbnRIYXNoSW5kZXguc2V0KGNvbnRlbnRIYXNoLCBmdWxsUGF0aCk7XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHNhdmVcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfU0FWRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgZGV0YWlsczogYFNhdmVkIG1lbW9yeSB0byAke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfSB3aXRoICR7c3RhdHMudG90YWxFbnRyaWVzfSBlbnRyaWVzYFxuICAgICAgfSk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBzYXZlIG1lbW9yeSB0byAke2ZpbGVQYXRofTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNhdmUgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIExpc3QgYWxsIGF2YWlsYWJsZSBtZW1vcmllc1xuICAgKi9cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgY29uc3QgbWVtb3JpZXM6IE1lbW9yeVtdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gR2V0IGFsbCBkYXRlIGZvbGRlcnNcbiAgICAgIGNvbnN0IGRhdGVGb2xkZXJzID0gYXdhaXQgdGhpcy5nZXREYXRlRm9sZGVycygpO1xuXG4gICAgICAvLyBBbHNvIGNoZWNrIHJvb3QgZGlyZWN0b3J5IGZvciBhbnkgbWVtb3J5IGZpbGVzXG4gICAgICAvLyBNZW1vcnkgZmlsZXMgc2hvdWxkIGJlIC55YW1sIGZvcm1hdCBvbmx5XG4gICAgICBjb25zdCByb290RmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHRoaXMubWVtb3JpZXNEaXIpXG4gICAgICAgIC50aGVuKGZpbGVzID0+IGZpbGVzLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy55YW1sJykpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gW10pO1xuXG4gICAgICAvLyBQcm9jZXNzIHJvb3QgZmlsZXMgZmlyc3QgKGxlZ2FjeSlcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiByb290RmlsZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtZW1vcnkgPSBhd2FpdCB0aGlzLmxvYWQoZmlsZSk7XG4gICAgICAgICAgbWVtb3JpZXMucHVzaChtZW1vcnkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0xJU1RfSVRFTV9GQUlMRUQsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxpc3QnLFxuICAgICAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBsb2FkICR7ZmlsZX06ICR7ZXJyb3J9YFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgZGF0ZSBmb2xkZXJzXG4gICAgICBmb3IgKGNvbnN0IGRhdGVGb2xkZXIgb2YgZGF0ZUZvbGRlcnMpIHtcbiAgICAgICAgY29uc3QgZm9sZGVyUGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCBkYXRlRm9sZGVyKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGZvbGRlclBhdGgpXG4gICAgICAgICAgLnRoZW4oZmlsZXMgPT4gZmlsZXMuZmlsdGVyKGYgPT4gZi5lbmRzV2l0aCgnLnlhbWwnKSkpXG4gICAgICAgICAgLmNhdGNoKCgpID0+IFtdKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWVtb3J5ID0gYXdhaXQgdGhpcy5sb2FkKHBhdGguam9pbihkYXRlRm9sZGVyLCBmaWxlKSk7XG4gICAgICAgICAgICBtZW1vcmllcy5wdXNoKG1lbW9yeSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfTElTVF9JVEVNX0ZBSUxFRCxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxpc3QnLFxuICAgICAgICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGxvYWQgJHtkYXRlRm9sZGVyfS8ke2ZpbGV9OiAke2Vycm9yfWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVtb3JpZXM7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIC8vIERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IHlldFxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaW5kIG1lbW9yaWVzIG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kKHByZWRpY2F0ZTogKGVsZW1lbnQ6IE1lbW9yeSkgPT4gYm9vbGVhbik6IFByb21pc2U8TWVtb3J5IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gbWVtb3JpZXMuZmluZChwcmVkaWNhdGUpO1xuICB9XG4gIFxuICAvKipcbiAgICogRmluZCBtdWx0aXBsZSBtZW1vcmllcyBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZE1hbnkocHJlZGljYXRlOiAoZWxlbWVudDogTWVtb3J5KSA9PiBib29sZWFuKTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIGNvbnN0IG1lbW9yaWVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIG1lbW9yaWVzLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG4gIFxuICAvKipcbiAgICogRGVsZXRlIGEgbWVtb3J5IGZpbGVcbiAgICogU0VDVVJJVFk6IFZhbGlkYXRlcyBwYXRoIGFuZCBsb2dzIGRlbGV0aW9uXG4gICAqL1xuICBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZnVsbFBhdGgpO1xuICAgICAgXG4gICAgICAvLyBEZWxldGUgdGhlIGZpbGVcbiAgICAgIGF3YWl0IGZzLnVubGluayhmdWxsUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlXG4gICAgICB0aGlzLm1lbW9yeUNhY2hlLmRlbGV0ZShmdWxsUGF0aCk7XG4gICAgICBcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfREVMRVRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICAgIGRldGFpbHM6IGBEZWxldGVkIG1lbW9yeSBmaWxlOiAke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfWBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIG5vdCBhbiBlcnJvciBmb3IgZGVsZXRlIG9wZXJhdGlvblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG1lbW9yeSBmaWxlIGV4aXN0c1xuICAgKi9cbiAgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZ1bGxQYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBtZW1vcnkgd2l0aCBtZXRhZGF0YVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPE1lbW9yeU1ldGFkYXRhPik6IFByb21pc2U8TWVtb3J5PiB7XG4gICAgcmV0dXJuIG5ldyBNZW1vcnkobWV0YWRhdGEpO1xuICB9XG4gIFxuICAvKipcbiAgICogSW1wb3J0IGEgbWVtb3J5IGZyb20gSlNPTi9ZQU1MIHN0cmluZ1xuICAgKiBTRUNVUklUWTogRnVsbCB2YWxpZGF0aW9uIG9mIGltcG9ydGVkIGNvbnRlbnRcbiAgICogQHBhcmFtIGRhdGEgSlNPTiBvciBZQU1MIHN0cmluZyBjb250YWluaW5nIG1lbW9yeSBkYXRhXG4gICAqIEBwYXJhbSBmb3JtYXQgRm9ybWF0IG9mIHRoZSBpbnB1dCBkYXRhICgnanNvbicgb3IgJ3lhbWwnKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgaW1wb3J0ZWQgTWVtb3J5IGluc3RhbmNlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIEpTT04vWUFNTCBwYXJzaW5nIGZhaWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGltcG9ydGVkIGRhdGEgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHNcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gWUFNTCBjb250ZW50IGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIHNpemVcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gaW1wb3J0ZWQgbWVtb3J5IGZhaWxzIHZhbGlkYXRpb25cbiAgICovXG4gIGFzeW5jIGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyA9ICd5YW1sJyk6IFByb21pc2U8TWVtb3J5PiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBwYXJzZWQ6IGFueTtcbiAgICAgIFxuICAgICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBISUdIIFNFVkVSSVRZIEZJWDogVXNlIHNlY3VyZSBZQU1MIHBhcnNpbmdcbiAgICAgICAgLy8gTWVtb3J5IGltcG9ydCBleHBlY3RzIHB1cmUgWUFNTCAobm90IGZyb250bWF0dGVyKSwgc28gd2UgcGFyc2UgaXQgc2VjdXJlbHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBGaXJzdCB2YWxpZGF0ZSB0aGUgWUFNTCBjb250ZW50IHNpemVcbiAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWUFNTCBjb250ZW50IGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIHNpemUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgd3JhcHBlciB0byB1c2UgU2VjdXJlWWFtbFBhcnNlciB3aXRoIHB1cmUgWUFNTFxuICAgICAgICAgIC8vIEFkZCBtaW5pbWFsIGZyb250bWF0dGVyIG1hcmtlcnMgdG8gc2F0aXNmeSBwYXJzZXJcbiAgICAgICAgICBjb25zdCB3cmFwcGVkWWFtbCA9IGAtLS1cXG4ke2RhdGF9XFxuLS0tXFxuYDtcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2Uod3JhcHBlZFlhbWwsIHtcbiAgICAgICAgICAgIG1heFlhbWxTaXplOiBNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkUsXG4gICAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBwYXJzZWQgZGF0YSAod2lsbCBiZSBpbiB0aGUgJ2RhdGEnIHByb3BlcnR5KVxuICAgICAgICAgIHBhcnNlZCA9IHBhcnNlUmVzdWx0LmRhdGE7XG4gICAgICAgICAgXG4gICAgICAgIH0gY2F0Y2ggKHlhbWxFcnJvcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBZQU1MOiAke3lhbWxFcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gVmFsaWRhdGUgaXQncyBhbiBvYmplY3RcbiAgICAgICAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lBTUwgbXVzdCBjb250YWluIGFuIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgc3RydWN0dXJlcyBmcm9tIFlBTUwgcGFyc2luZ1xuICAgICAgbGV0IG1ldGFkYXRhID0gcGFyc2VkLm1ldGFkYXRhO1xuICAgICAgbGV0IGVudHJpZXMgPSBwYXJzZWQuZW50cmllcyB8fCAocGFyc2VkLmRhdGEgJiYgcGFyc2VkLmRhdGEuZW50cmllcyk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkc1xuICAgICAgaWYgKCFtZXRhZGF0YSB8fCAhbWV0YWRhdGEubmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBtdXN0IGhhdmUgbWV0YWRhdGEgd2l0aCBuYW1lJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBtZW1vcnkgaW5zdGFuY2VcbiAgICAgIGNvbnN0IG1lbW9yeSA9IG5ldyBNZW1vcnkobWV0YWRhdGEpO1xuICAgICAgXG4gICAgICAvLyBMb2FkIGVudHJpZXMgaWYgcHJlc2VudFxuICAgICAgaWYgKGVudHJpZXMpIHtcbiAgICAgICAgbWVtb3J5LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBpZDogbWVtb3J5LmlkLFxuICAgICAgICAgIHR5cGU6IG1lbW9yeS50eXBlLFxuICAgICAgICAgIHZlcnNpb246IG1lbW9yeS52ZXJzaW9uLFxuICAgICAgICAgIG1ldGFkYXRhOiBtZW1vcnkubWV0YWRhdGEsXG4gICAgICAgICAgZXh0ZW5zaW9uczogbWVtb3J5LmV4dGVuc2lvbnMsXG4gICAgICAgICAgZW50cmllczogZW50cmllc1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiBtZW1vcnk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9JTVBPUlRfRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gaW1wb3J0IG1lbW9yeTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGltcG9ydCBtZW1vcnk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRXhwb3J0IGEgbWVtb3J5IHRvIFlBTUwgc3RyaW5nXG4gICAqL1xuICBhc3luYyBleHBvcnRFbGVtZW50KGVsZW1lbnQ6IE1lbW9yeSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgc3RhdHMgPSBlbGVtZW50LmdldFN0YXRzKCk7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG1ldGFkYXRhOiBlbGVtZW50Lm1ldGFkYXRhLFxuICAgICAgZXh0ZW5zaW9uczogZWxlbWVudC5leHRlbnNpb25zLFxuICAgICAgc3RhdHM6IHtcbiAgICAgICAgdG90YWxFbnRyaWVzOiBzdGF0cy50b3RhbEVudHJpZXMsXG4gICAgICAgIHRvdGFsU2l6ZTogc3RhdHMudG90YWxTaXplLFxuICAgICAgICBvbGRlc3RFbnRyeTogc3RhdHMub2xkZXN0RW50cnk/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIG5ld2VzdEVudHJ5OiBzdGF0cy5uZXdlc3RFbnRyeT8udG9JU09TdHJpbmcoKVxuICAgICAgfSxcbiAgICAgIGVudHJpZXM6IEpTT04ucGFyc2UoZWxlbWVudC5zZXJpYWxpemUoKSkuZW50cmllc1xuICAgIH07XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYOiBVc2Ugc2VjdXJlIFlBTUwgZHVtcGluZ1xuICAgIHJldHVybiB5YW1sLmR1bXAoZGF0YSwge1xuICAgICAgc2NoZW1hOiB5YW1sLkZBSUxTQUZFX1NDSEVNQSxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIHNraXBJbnZhbGlkOiB0cnVlLFxuICAgICAgc29ydEtleXM6IHRydWVcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgbWVtb3J5IGVsZW1lbnRcbiAgICovXG4gIHZhbGlkYXRlKGVsZW1lbnQ6IE1lbW9yeSk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gZWxlbWVudC52YWxpZGF0ZSgpO1xuICB9XG4gIFxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIHJlc29sdmUgYSBmaWxlIHBhdGhcbiAgICogU0VDVVJJVFk6IFByZXZlbnRzIGRpcmVjdG9yeSB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKi9cbiAgdmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgLy8gUGVyZm9ybSBzeW5jaHJvbm91cyB2YWxpZGF0aW9uIGNoZWNrc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIHBhdGggdHJhdmVyc2FsIGF0dGVtcHRzXG4gICAgICBpZiAobm9ybWFsaXplZC5pbmNsdWRlcygnLi4nKSB8fCBwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbnN1cmUgcHJvcGVyIGV4dGVuc2lvblxuICAgICAgaWYgKCFub3JtYWxpemVkLmVuZHNXaXRoKCcubWQnKSAmJiAhbm9ybWFsaXplZC5lbmRzV2l0aCgnLnlhbWwnKSAmJiAhbm9ybWFsaXplZC5lbmRzV2l0aCgnLnltbCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBlbGVtZW50IHR5cGUgdGhpcyBtYW5hZ2VyIGhhbmRsZXNcbiAgICovXG4gIGdldEVsZW1lbnRUeXBlKCk6IEVsZW1lbnRUeXBlIHtcbiAgICByZXR1cm4gRWxlbWVudFR5cGUuTUVNT1JZO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgbWVtb3J5IGZpbGVzXG4gICAqL1xuICBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcueWFtbCc7XG4gIH1cbiAgXG4gIC8vIFByaXZhdGUgaGVscGVyIG1ldGhvZHNcbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgcmVzb2x2ZSBhIGZpbGUgcGF0aCB0byBwcmV2ZW50IHNlY3VyaXR5IGlzc3Vlc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB2YWxpZGF0ZSBhbmQgcmVzb2x2ZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdmFsaWRhdGVkIGZ1bGwgcGF0aFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwYXRoIGNvbnRhaW5zIHRyYXZlcnNhbCBhdHRlbXB0cyAoLi4vKVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwYXRoIGlzIGFic29sdXRlIG9yIGludmFsaWRcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gZmlsZSBleHRlbnNpb24gaXMgbm90IGFsbG93ZWQgKC5tZCwgLnlhbWwsIC55bWwpXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHJlc29sdmVkIHBhdGggd291bGQgYmUgb3V0c2lkZSBtZW1vcmllcyBkaXJlY3RvcnlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IENvbXByZWhlbnNpdmUgcGF0aCB2YWxpZGF0aW9uXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKTtcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgICBpZiAobm9ybWFsaXplZC5pbmNsdWRlcygnLi4nKSB8fCBwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZCkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgQmxvY2tlZCBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0OiAke2ZpbGVQYXRofWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZpbGUgcGF0aDogUGF0aCB0cmF2ZXJzYWwgZGV0ZWN0ZWQnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIHByb3BlciBleHRlbnNpb24gLSBtZW1vcmllcyBzaG91bGQgb25seSBiZSAueWFtbCBvciAueW1sXG4gICAgaWYgKCFub3JtYWxpemVkLmVuZHNXaXRoKCcueWFtbCcpICYmICFub3JtYWxpemVkLmVuZHNXaXRoKCcueW1sJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IGZpbGVzIG11c3QgaGF2ZSAueWFtbCBvciAueW1sIGV4dGVuc2lvbicpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb25zdHJ1Y3QgZnVsbCBwYXRoXG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0Rpciwgbm9ybWFsaXplZCk7XG4gICAgXG4gICAgLy8gVmVyaWZ5IGl0J3Mgd2l0aGluIG1lbW9yaWVzIGRpcmVjdG9yeVxuICAgIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm1lbW9yaWVzRGlyLCBmdWxsUGF0aCk7XG4gICAgaWYgKHJlbGF0aXZlLnN0YXJ0c1dpdGgoJy4uJykgfHwgcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIHBhdGggbXVzdCBiZSB3aXRoaW4gbWVtb3JpZXMgZGlyZWN0b3J5Jyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBmdWxsUGF0aDtcbiAgfVxuICBcbiAgcHJpdmF0ZSBwYXJzZU1lbW9yeUZpbGUocGFyc2VkOiBhbnkpOiB7IG1ldGFkYXRhOiBNZW1vcnlNZXRhZGF0YTsgY29udGVudDogc3RyaW5nIH0ge1xuICAgIC8vIEZJWDogU2VjdXJlWWFtbFBhcnNlciByZXR1cm5zIGRhdGEgaW4gJ2RhdGEnIHByb3BlcnR5LCBub3QgJ21ldGFkYXRhJ1xuICAgIC8vIEZvciBtYXJrZG93biBmaWxlcyB3aXRoIFlBTUwgZnJvbnRtYXR0ZXIsIHRoZSBzdHJ1Y3R1cmUgaXM6XG4gICAgLy8gcGFyc2VkLmRhdGEgPSBZQU1MIGZyb250bWF0dGVyIHZhbHVlc1xuICAgIC8vIHBhcnNlZC5jb250ZW50ID0gbWFya2Rvd24gY29udGVudCBhZnRlciBmcm9udG1hdHRlclxuXG4gICAgLy8gRm9yIHB1cmUgWUFNTCBtZW1vcnkgZmlsZXMsIHdlIG5lZWQgdG8gY2hlY2sgaWYgbWV0YWRhdGEgaXMgZGlyZWN0bHkgaW4gZGF0YVxuICAgIGNvbnN0IHlhbWxEYXRhID0gcGFyc2VkLmRhdGEgfHwge307XG5cbiAgICAvLyBNZW1vcnkgZmlsZXMgc2F2ZWQgYnkgdGhlIHN5c3RlbSBoYXZlIG1ldGFkYXRhIGFzIGEgdG9wLWxldmVsIGtleVxuICAgIGNvbnN0IG1ldGFkYXRhU291cmNlID0geWFtbERhdGEubWV0YWRhdGEgfHwgeWFtbERhdGE7XG5cbiAgICAvLyBFeHRyYWN0IG1ldGFkYXRhIHdpdGggdmFsaWRhdGlvblxuICAgIGNvbnN0IG1ldGFkYXRhOiBNZW1vcnlNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IHNhbml0aXplSW5wdXQobWV0YWRhdGFTb3VyY2UubmFtZSB8fCAnVW5uYW1lZCBNZW1vcnknLCAxMDApLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhU291cmNlLmRlc2NyaXB0aW9uID9cbiAgICAgICAgc2FuaXRpemVJbnB1dChtZXRhZGF0YVNvdXJjZS5kZXNjcmlwdGlvbiwgNTAwKSA6XG4gICAgICAgICcnLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGFTb3VyY2UudmVyc2lvbiB8fCAnMS4wLjAnLFxuICAgICAgYXV0aG9yOiBtZXRhZGF0YVNvdXJjZS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBtZXRhZGF0YVNvdXJjZS5jcmVhdGVkLFxuICAgICAgbW9kaWZpZWQ6IG1ldGFkYXRhU291cmNlLm1vZGlmaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRhZ3M6IEFycmF5LmlzQXJyYXkobWV0YWRhdGFTb3VyY2UudGFncykgP1xuICAgICAgICBtZXRhZGF0YVNvdXJjZS50YWdzLm1hcCgodGFnOiBzdHJpbmcpID0+IHNhbml0aXplSW5wdXQodGFnLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9UQUdfTEVOR1RIKSkgOlxuICAgICAgICBbXSxcbiAgICAgIHN0b3JhZ2VCYWNrZW5kOiBtZXRhZGF0YVNvdXJjZS5zdG9yYWdlX2JhY2tlbmQgfHwgbWV0YWRhdGFTb3VyY2Uuc3RvcmFnZUJhY2tlbmQgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1NUT1JBR0VfQkFDS0VORCxcbiAgICAgIHJldGVudGlvbkRheXM6IG1ldGFkYXRhU291cmNlLnJldGVudGlvbl9wb2xpY3k/LmRlZmF1bHQgP1xuICAgICAgICB0aGlzLnBhcnNlUmV0ZW50aW9uRGF5cyhtZXRhZGF0YVNvdXJjZS5yZXRlbnRpb25fcG9saWN5LmRlZmF1bHQpIDpcbiAgICAgICAgKG1ldGFkYXRhU291cmNlLnJldGVudGlvbkRheXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1JFVEVOVElPTl9EQVlTKSxcbiAgICAgIHByaXZhY3lMZXZlbDogbWV0YWRhdGFTb3VyY2UucHJpdmFjeV9sZXZlbCB8fCBtZXRhZGF0YVNvdXJjZS5wcml2YWN5TGV2ZWwgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1BSSVZBQ1lfTEVWRUwsXG4gICAgICBzZWFyY2hhYmxlOiBtZXRhZGF0YVNvdXJjZS5zZWFyY2hhYmxlICE9PSBmYWxzZSxcbiAgICAgIG1heEVudHJpZXM6IG1ldGFkYXRhU291cmNlLm1heEVudHJpZXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUXG4gICAgfTtcblxuICAgIC8vIEV4dHJhY3QgY29udGVudCAoaWYgYW55KVxuICAgIGNvbnN0IGNvbnRlbnQgPSBwYXJzZWQuY29udGVudCB8fCAnJztcblxuICAgIHJldHVybiB7IG1ldGFkYXRhLCBjb250ZW50IH07XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIHBhcnNlIHJldGVudGlvbiBkYXlzIGZyb20gdmFyaW91cyBmb3JtYXRzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUmV0ZW50aW9uRGF5cyhyZXRlbnRpb246IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiByZXRlbnRpb24gPT09ICdudW1iZXInKSByZXR1cm4gcmV0ZW50aW9uO1xuICAgIGlmIChyZXRlbnRpb24gPT09ICdwZXJtYW5lbnQnIHx8IHJldGVudGlvbiA9PT0gJ3BlcnBldHVhbCcpIHJldHVybiA5OTk5OTk7XG4gICAgY29uc3QgbWF0Y2ggPSByZXRlbnRpb24ubWF0Y2goLyhcXGQrKVxccypkYXlzPy9pKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBwYXJzZUludChtYXRjaFsxXSkgOiBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUkVURU5USU9OX0RBWVM7XG4gIH1cbn0iXX0=
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export declare const PACKAGE_VERSION = "1.9.4";
6
- export declare const BUILD_TIMESTAMP = "2025-09-19T23:32:05.704Z";
5
+ export declare const PACKAGE_VERSION = "1.9.5";
6
+ export declare const BUILD_TIMESTAMP = "2025-09-20T00:22:16.552Z";
7
7
  export declare const BUILD_TYPE: 'npm' | 'git';
8
8
  export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
9
9
  //# sourceMappingURL=version.d.ts.map
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export const PACKAGE_VERSION = '1.9.4';
6
- export const BUILD_TIMESTAMP = '2025-09-19T23:32:05.704Z';
5
+ export const PACKAGE_VERSION = '1.9.5';
6
+ export const BUILD_TIMESTAMP = '2025-09-20T00:22:16.552Z';
7
7
  export const BUILD_TYPE = 'npm';
8
8
  export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcxLjkuNCc7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjUtMDktMTlUMjM6MzI6MDUuNzA0Wic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcxLjkuNSc7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjUtMDktMjBUMDA6MjI6MTYuNTUyWic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "1.9.4",
3
+ "version": "1.9.5",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",