@tolle_/tolle-ui 0.0.19-beta → 0.0.22-beta

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.
@@ -21,116 +21,255 @@ export class ThemeService {
21
21
  initializeTheme() {
22
22
  if (!isPlatformBrowser(this.platformId))
23
23
  return;
24
- // 1. Determine Initial Mode (Dark/Light)
24
+ // LOGIC: User Saved Preferences > Config Defaults > System Preference
25
25
  const savedTheme = localStorage.getItem('tolle-theme');
26
+ const savedPrimary = localStorage.getItem('tolle-primary-color');
27
+ const savedRadius = localStorage.getItem('tolle-radius');
26
28
  const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
27
- // Logic: Saved Preference > Config Default > System Preference
28
- const shouldBeDark = savedTheme
29
- ? savedTheme === 'dark'
30
- : (this.config?.darkByDefault ?? systemPrefersDark);
29
+ console.log('Theme initialization:', {
30
+ savedTheme,
31
+ savedPrimary,
32
+ savedRadius,
33
+ config: this.config,
34
+ systemPrefersDark
35
+ });
36
+ // 1. Determine Dark/Light Mode
37
+ // Priority: Saved Theme > Config Default > System Preference
38
+ let shouldBeDark = systemPrefersDark; // Start with system
39
+ if (savedTheme) {
40
+ // User has saved preference
41
+ shouldBeDark = savedTheme === 'dark';
42
+ }
43
+ else if (this.config?.darkByDefault !== undefined) {
44
+ // Use config default if no user preference
45
+ shouldBeDark = this.config.darkByDefault;
46
+ }
47
+ // Apply theme mode
31
48
  if (shouldBeDark) {
32
- this.enableDarkMode();
49
+ this.enableDarkMode(false); // Don't save, we'll save after checking all preferences
33
50
  }
34
51
  else {
35
- this.disableDarkMode();
52
+ this.disableDarkMode(false);
36
53
  }
37
- const savedPrimary = localStorage.getItem('tolle-primary-color');
54
+ // 2. Apply Primary Color
55
+ // Priority: Saved Color > Config Color
38
56
  if (savedPrimary) {
39
- this.setPrimaryColor(savedPrimary, false);
57
+ // User has saved color preference
58
+ this.setPrimaryColor(savedPrimary, false); // Don't save again
40
59
  }
41
60
  else if (this.config?.primaryColor) {
42
- this.setPrimaryColor(this.config.primaryColor, false);
61
+ // Use config default if no user preference
62
+ this.setPrimaryColor(this.config.primaryColor, true); // Save this as user preference
63
+ }
64
+ // 3. Apply Radius
65
+ // Priority: Saved Radius > Config Radius
66
+ if (savedRadius) {
67
+ // User has saved radius preference
68
+ this.setRadius(savedRadius, false);
43
69
  }
44
- if (this.config?.radius) {
45
- this.renderer.setStyle(this.document.documentElement, '--radius', this.config.radius);
70
+ else if (this.config?.radius) {
71
+ // Use config default if no user preference
72
+ this.setRadius(this.config.radius, true);
46
73
  }
47
- // 2. Apply Brand Config - This will generate full palette
48
- if (this.config) {
49
- this.applyBrandConfig(this.config);
74
+ // Save theme mode preference if it came from config or system
75
+ if (!savedTheme) {
76
+ localStorage.setItem('tolle-theme', shouldBeDark ? 'dark' : 'light');
50
77
  }
51
78
  }
52
79
  /**
53
- * Applies the brand identity variables with full shade palette
80
+ * Sets the border radius for all components
54
81
  */
55
- applyBrandConfig(config) {
82
+ setRadius(radius, persist = true) {
56
83
  if (!isPlatformBrowser(this.platformId))
57
84
  return;
58
85
  const root = this.document.documentElement;
59
- // Set primary color if provided
60
- if (config.primaryColor) {
61
- this.renderer.setStyle(root, '--primary', config.primaryColor);
62
- this.generatePrimaryShades(config.primaryColor);
86
+ // Set the CSS variable
87
+ this.renderer.setStyle(root, '--radius', radius);
88
+ // Also update the dynamic styles to include radius calculations
89
+ this.updateRadiusInDynamicStyles(radius);
90
+ // Persist if needed
91
+ if (persist) {
92
+ localStorage.setItem('tolle-radius', radius);
63
93
  }
64
- // Set border radius if provided
65
- if (config.radius) {
66
- this.renderer.setStyle(root, '--radius', config.radius);
94
+ }
95
+ /**
96
+ * Updates the radius calculations in dynamic styles
97
+ */
98
+ updateRadiusInDynamicStyles(radius) {
99
+ const existingStyle = this.document.getElementById(this.styleId);
100
+ if (existingStyle) {
101
+ let css = existingStyle.textContent || '';
102
+ // Update or add radius calculations
103
+ if (css.includes('--radius:')) {
104
+ // Replace existing radius declarations
105
+ css = css.replace(/--radius:[^;]+;/g, `--radius: ${radius};`);
106
+ }
107
+ else {
108
+ // Add radius to the beginning of :root
109
+ css = css.replace(/:root\s*{/, `:root {\n --radius: ${radius};`);
110
+ }
111
+ // Update the calculated radius values in the CSS
112
+ const radiusCalcRegex = /calc\(var\(--radius[^)]+\)/g;
113
+ css = css.replace(radiusCalcRegex, (match) => {
114
+ if (match.includes('- 2px')) {
115
+ return `calc(${radius} - 2px)`;
116
+ }
117
+ else if (match.includes('- 4px')) {
118
+ return `calc(${radius} - 4px)`;
119
+ }
120
+ return match;
121
+ });
122
+ existingStyle.textContent = css;
67
123
  }
68
124
  }
69
125
  /**
70
126
  * Generates full primary color palette (50-900) based on base color
71
- * Uses color-mix() for consistency with your existing approach
72
127
  */
73
128
  generatePrimaryShades(baseColor) {
129
+ // Convert hex to RGB
130
+ const rgb = this.hexToRgb(baseColor);
131
+ const rgbString = rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '37 99 235';
132
+ // Create lighter ring colors in RGB
133
+ const ringLight = this.lightenColor(baseColor, 40);
134
+ const ringLightRgb = this.hexToRgb(ringLight);
135
+ const ringLightRgbString = ringLightRgb ? `${ringLightRgb.r} ${ringLightRgb.g} ${ringLightRgb.b}` : '96 165 250';
136
+ const ringDark = this.lightenColor(baseColor, 20);
137
+ const ringDarkRgb = this.hexToRgb(ringDark);
138
+ const ringDarkRgbString = ringDarkRgb ? `${ringDarkRgb.r} ${ringDarkRgb.g} ${ringDarkRgb.b}` : '147 197 253';
139
+ // Get current radius or use default
140
+ const root = this.document.documentElement;
141
+ const currentRadius = getComputedStyle(root).getPropertyValue('--radius').trim() || '0.5rem';
74
142
  const css = `
143
+ /* Override primary colors - this needs to come AFTER your main CSS */
75
144
  :root {
76
- /* Primary Shades */
77
- --primary-50: color-mix(in srgb, ${baseColor}, white 90%);
78
- --primary-100: color-mix(in srgb, ${baseColor}, white 80%);
79
- --primary-200: color-mix(in srgb, ${baseColor}, white 60%);
80
- --primary-300: color-mix(in srgb, ${baseColor}, white 40%);
81
- --primary-400: color-mix(in srgb, ${baseColor}, white 20%);
82
- --primary-500: ${baseColor};
83
- --primary-600: color-mix(in srgb, ${baseColor}, black 20%);
84
- --primary-700: color-mix(in srgb, ${baseColor}, black 40%);
85
- --primary-800: color-mix(in srgb, ${baseColor}, black 60%);
86
- --primary-900: color-mix(in srgb, ${baseColor}, black 80%);
145
+ /* Primary in RGB format for Tailwind opacity support */
146
+ --primary: ${rgbString};
147
+ --primary-foreground: ${this.getContrastColorRgb(baseColor)};
148
+
149
+ /* Radius */
150
+ --radius: ${currentRadius};
87
151
 
88
- /* Your existing derived colors - updated to use new shades */
89
- --primary-foreground: white;
90
- --secondary: color-mix(in srgb, var(--primary-200), transparent 40%);
91
- --secondary-foreground: var(--primary-900);
92
- --muted: color-mix(in srgb, var(--primary-50), #f3f4f6 50%);
93
- --muted-foreground: color-mix(in srgb, var(--primary-400), #4b5563 60%);
94
- --accent: color-mix(in srgb, var(--primary-100), transparent 70%);
95
- --accent-foreground: var(--primary-700);
96
- --ring: color-mix(in srgb, var(--primary-300), transparent 50%);
152
+ /* Primary shades for light mode */
153
+ --primary-50: ${this.hexToRgbString(this.lightenColor(baseColor, 90))};
154
+ --primary-100: ${this.hexToRgbString(this.lightenColor(baseColor, 80))};
155
+ --primary-200: ${this.hexToRgbString(this.lightenColor(baseColor, 60))};
156
+ --primary-300: ${this.hexToRgbString(this.lightenColor(baseColor, 40))};
157
+ --primary-400: ${this.hexToRgbString(this.lightenColor(baseColor, 20))};
158
+ --primary-500: ${rgbString};
159
+ --primary-600: ${this.hexToRgbString(this.darkenColor(baseColor, 20))};
160
+ --primary-700: ${this.hexToRgbString(this.darkenColor(baseColor, 40))};
161
+ --primary-800: ${this.hexToRgbString(this.darkenColor(baseColor, 60))};
162
+ --primary-900: ${this.hexToRgbString(this.darkenColor(baseColor, 80))};
163
+
164
+ /* Update ring color to be lighter */
165
+ --ring: ${ringLightRgbString};
97
166
  }
98
167
 
99
168
  .dark {
100
- /* Dark mode variants */
101
- --primary-50: color-mix(in srgb, ${baseColor}, black 85%);
102
- --primary-100: color-mix(in srgb, ${baseColor}, black 75%);
103
- --primary-200: color-mix(in srgb, ${baseColor}, black 65%);
104
- --primary-300: color-mix(in srgb, ${baseColor}, black 55%);
105
- --primary-400: color-mix(in srgb, ${baseColor}, black 45%);
106
- --primary-500: ${baseColor};
107
- --primary-600: color-mix(in srgb, ${baseColor}, white 20%);
108
- --primary-700: color-mix(in srgb, ${baseColor}, white 35%);
109
- --primary-800: color-mix(in srgb, ${baseColor}, white 50%);
110
- --primary-900: color-mix(in srgb, ${baseColor}, white 65%);
169
+ /* For dark mode, we keep the primary color but adjust shades */
170
+ --primary: ${rgbString};
171
+ --primary-foreground: ${this.getContrastColorRgb(baseColor)};
172
+
173
+ /* Dark mode shades */
174
+ --primary-50: ${this.hexToRgbString(this.darkenColor(baseColor, 85))};
175
+ --primary-100: ${this.hexToRgbString(this.darkenColor(baseColor, 75))};
176
+ --primary-200: ${this.hexToRgbString(this.darkenColor(baseColor, 65))};
177
+ --primary-300: ${this.hexToRgbString(this.darkenColor(baseColor, 55))};
178
+ --primary-400: ${this.hexToRgbString(this.darkenColor(baseColor, 45))};
179
+ --primary-500: ${rgbString};
180
+ --primary-600: ${this.hexToRgbString(this.lightenColor(baseColor, 20))};
181
+ --primary-700: ${this.hexToRgbString(this.lightenColor(baseColor, 35))};
182
+ --primary-800: ${this.hexToRgbString(this.lightenColor(baseColor, 50))};
183
+ --primary-900: ${this.hexToRgbString(this.lightenColor(baseColor, 65))};
111
184
 
112
- /* Dark mode derived colors */
113
- --primary-foreground: color-mix(in srgb, ${baseColor}, white 90%);
114
- --secondary: color-mix(in srgb, var(--primary-900), transparent 70%);
115
- --secondary-foreground: var(--primary-100);
116
- --muted: color-mix(in srgb, var(--primary-950), #1f2937 50%);
117
- --muted-foreground: color-mix(in srgb, var(--primary-300), #9ca3af 40%);
118
- --accent: color-mix(in srgb, var(--primary-800), transparent 80%);
119
- --accent-foreground: var(--primary-200);
120
- --ring: color-mix(in srgb, var(--primary-600), transparent 60%);
185
+ /* Update ring color for dark mode - lighter variant */
186
+ --ring: ${ringDarkRgbString};
121
187
  }
122
188
  `;
123
189
  this.injectDynamicStyles(css);
124
190
  }
191
+ /**
192
+ * Convert hex color to RGB object
193
+ */
194
+ hexToRgb(hex) {
195
+ // Remove # if present
196
+ const cleanedHex = hex.replace('#', '');
197
+ let r = 0, g = 0, b = 0;
198
+ if (cleanedHex.length === 3) {
199
+ r = parseInt(cleanedHex[0] + cleanedHex[0], 16);
200
+ g = parseInt(cleanedHex[1] + cleanedHex[1], 16);
201
+ b = parseInt(cleanedHex[2] + cleanedHex[2], 16);
202
+ return { r, g, b };
203
+ }
204
+ if (cleanedHex.length === 6) {
205
+ r = parseInt(cleanedHex.substring(0, 2), 16);
206
+ g = parseInt(cleanedHex.substring(2, 4), 16);
207
+ b = parseInt(cleanedHex.substring(4, 6), 16);
208
+ return { r, g, b };
209
+ }
210
+ return null;
211
+ }
212
+ /**
213
+ * Convert hex to RGB string format for CSS (space-separated)
214
+ */
215
+ hexToRgbString(hexColor) {
216
+ const rgb = this.hexToRgb(hexColor);
217
+ return rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '37 99 235';
218
+ }
219
+ /**
220
+ * Get contrast color in RGB format
221
+ */
222
+ getContrastColorRgb(hexColor) {
223
+ const contrast = this.getContrastColor(hexColor);
224
+ const rgb = this.hexToRgb(contrast);
225
+ return rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '255 255 255';
226
+ }
227
+ /**
228
+ * Lighten a hex color by a percentage
229
+ */
230
+ lightenColor(color, percent) {
231
+ const rgb = this.hexToRgb(color);
232
+ if (!rgb)
233
+ return color;
234
+ // Lighten by percentage
235
+ const r = Math.min(255, Math.floor(rgb.r + (255 - rgb.r) * (percent / 100)));
236
+ const g = Math.min(255, Math.floor(rgb.g + (255 - rgb.g) * (percent / 100)));
237
+ const b = Math.min(255, Math.floor(rgb.b + (255 - rgb.b) * (percent / 100)));
238
+ // Convert back to hex
239
+ return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
240
+ }
241
+ /**
242
+ * Darken a hex color by a percentage
243
+ */
244
+ darkenColor(color, percent) {
245
+ const rgb = this.hexToRgb(color);
246
+ if (!rgb)
247
+ return color;
248
+ const factor = 1 - (percent / 100);
249
+ const r = Math.max(0, Math.floor(rgb.r * factor));
250
+ const g = Math.max(0, Math.floor(rgb.g * factor));
251
+ const b = Math.max(0, Math.floor(rgb.b * factor));
252
+ return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;
253
+ }
254
+ /**
255
+ * Calculate contrast color (black or white) based on background color
256
+ */
257
+ getContrastColor(hexColor) {
258
+ const rgb = this.hexToRgb(hexColor);
259
+ if (!rgb)
260
+ return '#ffffff';
261
+ // Calculate relative luminance
262
+ const luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
263
+ // Return black for light colors, white for dark colors
264
+ return luminance > 0.5 ? '#000000' : '#ffffff';
265
+ }
125
266
  injectDynamicStyles(css) {
126
267
  if (!isPlatformBrowser(this.platformId))
127
268
  return;
128
- // Remove existing dynamic styles
129
269
  const existingStyle = this.document.getElementById(this.styleId);
130
270
  if (existingStyle) {
131
271
  existingStyle.remove();
132
272
  }
133
- // Create and inject new styles
134
273
  const styleElement = this.document.createElement('style');
135
274
  styleElement.id = this.styleId;
136
275
  styleElement.textContent = css;
@@ -140,23 +279,29 @@ export class ThemeService {
140
279
  const isCurrentlyDark = this.document.documentElement.classList.contains('dark');
141
280
  isCurrentlyDark ? this.disableDarkMode() : this.enableDarkMode();
142
281
  }
143
- enableDarkMode() {
282
+ enableDarkMode(saveToStorage = true) {
144
283
  this.renderer.addClass(this.document.documentElement, 'dark');
145
- localStorage.setItem('tolle-theme', 'dark');
284
+ if (saveToStorage) {
285
+ localStorage.setItem('tolle-theme', 'dark');
286
+ }
146
287
  this.isDarkSubject.next(true);
147
288
  }
148
- disableDarkMode() {
289
+ disableDarkMode(saveToStorage = true) {
149
290
  this.renderer.removeClass(this.document.documentElement, 'dark');
150
- localStorage.setItem('tolle-theme', 'light');
291
+ if (saveToStorage) {
292
+ localStorage.setItem('tolle-theme', 'light');
293
+ }
151
294
  this.isDarkSubject.next(false);
152
295
  }
153
296
  setPrimaryColor(color, persist = true) {
154
297
  if (!isPlatformBrowser(this.platformId))
155
298
  return;
156
- // Update CSS variables + palette
157
- this.renderer.setStyle(this.document.documentElement, '--primary', color);
158
299
  this.generatePrimaryShades(color);
159
- // Persist user preference
300
+ // Also set inline for immediate update
301
+ const rgb = this.hexToRgb(color);
302
+ if (rgb) {
303
+ this.renderer.setStyle(this.document.documentElement, '--primary', `${rgb.r} ${rgb.g} ${rgb.b}`);
304
+ }
160
305
  if (persist) {
161
306
  localStorage.setItem('tolle-primary-color', color);
162
307
  }
@@ -165,8 +310,71 @@ export class ThemeService {
165
310
  return this.isDarkSubject.value ? 'dark' : 'light';
166
311
  }
167
312
  get primaryColor() {
313
+ if (!isPlatformBrowser(this.platformId))
314
+ return null;
315
+ const root = this.document.documentElement;
316
+ const cssValue = getComputedStyle(root).getPropertyValue('--primary').trim();
317
+ if (cssValue && cssValue !== '') {
318
+ // Convert RGB string back to hex for external use
319
+ const rgbParts = cssValue.split(' ').map(Number);
320
+ if (rgbParts.length === 3) {
321
+ return `#${rgbParts[0].toString(16).padStart(2, '0')}${rgbParts[1].toString(16).padStart(2, '0')}${rgbParts[2].toString(16).padStart(2, '0')}`;
322
+ }
323
+ }
168
324
  return localStorage.getItem('tolle-primary-color');
169
325
  }
326
+ /**
327
+ * Reset to config defaults (clears user preferences)
328
+ */
329
+ resetToConfigDefaults() {
330
+ if (!isPlatformBrowser(this.platformId))
331
+ return;
332
+ // Clear user preferences
333
+ localStorage.removeItem('tolle-theme');
334
+ localStorage.removeItem('tolle-primary-color');
335
+ localStorage.removeItem('tolle-radius');
336
+ // Re-initialize with config defaults
337
+ this.initializeTheme();
338
+ }
339
+ /**
340
+ * Get current user preferences
341
+ */
342
+ getUserPreferences() {
343
+ if (!isPlatformBrowser(this.platformId))
344
+ return null;
345
+ return {
346
+ theme: localStorage.getItem('tolle-theme'),
347
+ primaryColor: localStorage.getItem('tolle-primary-color'),
348
+ radius: localStorage.getItem('tolle-radius')
349
+ };
350
+ }
351
+ /**
352
+ * Clear all user preferences
353
+ */
354
+ clearUserPreferences() {
355
+ if (!isPlatformBrowser(this.platformId))
356
+ return;
357
+ localStorage.removeItem('tolle-theme');
358
+ localStorage.removeItem('tolle-primary-color');
359
+ localStorage.removeItem('tolle-radius');
360
+ // Reset to system defaults (not config defaults)
361
+ const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
362
+ if (systemPrefersDark) {
363
+ this.enableDarkMode(false);
364
+ }
365
+ else {
366
+ this.disableDarkMode(false);
367
+ }
368
+ // Remove CSS variables
369
+ const root = this.document.documentElement;
370
+ this.renderer.removeStyle(root, '--primary');
371
+ this.renderer.removeStyle(root, '--radius');
372
+ // Clear dynamic styles
373
+ const existingStyle = this.document.getElementById(this.styleId);
374
+ if (existingStyle) {
375
+ existingStyle.remove();
376
+ }
377
+ }
170
378
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ThemeService, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: TOLLE_CONFIG, optional: true }, { token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable });
171
379
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ThemeService, providedIn: 'root' });
172
380
  }
@@ -185,4 +393,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
185
393
  type: Inject,
186
394
  args: [TOLLE_CONFIG]
187
395
  }] }, { type: i0.RendererFactory2 }] });
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7O0FBRzNELE1BQU0sT0FBTyxZQUFZO0lBT0s7SUFDRztJQUNhO0lBUnBDLFFBQVEsQ0FBWTtJQUNwQixhQUFhLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDNUQsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEMsT0FBTyxHQUFHLHFCQUFxQixDQUFDO0lBRXhDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFFaEQseUNBQXlDO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxD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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQsIE9wdGlvbmFsLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRPTExFX0NPTkZJRywgVG9sbGVDb25maWcgfSBmcm9tICcuL3RvbGxlLWNvbmZpZyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgVGhlbWVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyO1xuICBwcml2YXRlIGlzRGFya1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgaXNEYXJrJCA9IHRoaXMuaXNEYXJrU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHJpdmF0ZSBzdHlsZUlkID0gJ3RvbGxlLWR5bmFtaWMtdGhlbWUnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVE9MTEVfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVG9sbGVDb25maWcsXG4gICAgcmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyXG4gICkge1xuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgbnVsbCk7XG4gICAgdGhpcy5pbml0aWFsaXplVGhlbWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRoZW1lKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgLy8gMS4gRGV0ZXJtaW5lIEluaXRpYWwgTW9kZSAoRGFyay9MaWdodClcbiAgICBjb25zdCBzYXZlZFRoZW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXRoZW1lJyk7XG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG5cbiAgICAvLyBMb2dpYzogU2F2ZWQgUHJlZmVyZW5jZSA+IENvbmZpZyBEZWZhdWx0ID4gU3lzdGVtIFByZWZlcmVuY2VcbiAgICBjb25zdCBzaG91bGRCZURhcmsgPSBzYXZlZFRoZW1lXG4gICAgICA/IHNhdmVkVGhlbWUgPT09ICdkYXJrJ1xuICAgICAgOiAodGhpcy5jb25maWc/LmRhcmtCeURlZmF1bHQgPz8gc3lzdGVtUHJlZmVyc0RhcmspO1xuXG4gICAgaWYgKHNob3VsZEJlRGFyaykge1xuICAgICAgdGhpcy5lbmFibGVEYXJrTW9kZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVEYXJrTW9kZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHNhdmVkUHJpbWFyeSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG5cbiAgICBpZiAoc2F2ZWRQcmltYXJ5KSB7XG4gICAgICB0aGlzLnNldFByaW1hcnlDb2xvcihzYXZlZFByaW1hcnksIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5wcmltYXJ5Q29sb3IpIHtcbiAgICAgIHRoaXMuc2V0UHJpbWFyeUNvbG9yKHRoaXMuY29uZmlnLnByaW1hcnlDb2xvciwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZz8ucmFkaXVzKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgJy0tcmFkaXVzJyxcbiAgICAgICAgdGhpcy5jb25maWcucmFkaXVzXG4gICAgICApO1xuICAgIH1cbiAgICAvLyAyLiBBcHBseSBCcmFuZCBDb25maWcgLSBUaGlzIHdpbGwgZ2VuZXJhdGUgZnVsbCBwYWxldHRlXG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmFwcGx5QnJhbmRDb25maWcodGhpcy5jb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBicmFuZCBpZGVudGl0eSB2YXJpYWJsZXMgd2l0aCBmdWxsIHNoYWRlIHBhbGV0dGVcbiAgICovXG4gIGFwcGx5QnJhbmRDb25maWcoY29uZmlnOiBUb2xsZUNvbmZpZykge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgLy8gU2V0IHByaW1hcnkgY29sb3IgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLnByaW1hcnlDb2xvcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCAnLS1wcmltYXJ5JywgY29uZmlnLnByaW1hcnlDb2xvcik7XG4gICAgICB0aGlzLmdlbmVyYXRlUHJpbWFyeVNoYWRlcyhjb25maWcucHJpbWFyeUNvbG9yKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgYm9yZGVyIHJhZGl1cyBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcucmFkaXVzKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cycsIGNvbmZpZy5yYWRpdXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgZnVsbCBwcmltYXJ5IGNvbG9yIHBhbGV0dGUgKDUwLTkwMCkgYmFzZWQgb24gYmFzZSBjb2xvclxuICAgKiBVc2VzIGNvbG9yLW1peCgpIGZvciBjb25zaXN0ZW5jeSB3aXRoIHlvdXIgZXhpc3RpbmcgYXBwcm9hY2hcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVQcmltYXJ5U2hhZGVzKGJhc2VDb2xvcjogc3RyaW5nKSB7XG4gICAgY29uc3QgY3NzID0gYFxuICAgICAgOnJvb3Qge1xuICAgICAgICAvKiBQcmltYXJ5IFNoYWRlcyAqL1xuICAgICAgICAtLXByaW1hcnktNTA6IGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0sIHdoaXRlIDkwJSk7XG4gICAgICAgIC0tcHJpbWFyeS0xMDA6IGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0sIHdoaXRlIDgwJSk7XG4gICAgICAgIC0tcHJpbWFyeS0yMDA6IGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0sIHdoaXRlIDYwJSk7XG4gICAgICAgIC0tcHJpbWFyeS0zMDA6IGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0sIHdoaXRlIDQwJSk7XG4gICAgICAgIC0tcHJpbWFyeS00MDA6IGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0sIHdoaXRlIDIwJSk7XG4gICAgICAgIC0tcHJpbWFyeS01MDA6ICR7YmFzZUNvbG9yfTtcbiAgICAgICAgLS1wcmltYXJ5LTYwMDogY29sb3ItbWl4KGluIHNyZ2IsICR7YmFzZUNvbG9yfSwgYmxhY2sgMjAlKTtcbiAgICAgICAgLS1wcmltYXJ5LTcwMDogY29sb3ItbWl4KGluIHNyZ2IsICR7YmFzZUNvbG9yfSwgYmxhY2sgNDAlKTtcbiAgICAgICAgLS1wcmltYXJ5LTgwMDogY29sb3ItbWl4KGluIHNyZ2IsICR7YmFzZUNvbG9yfSwgYmxhY2sgNjAlKTtcbiAgICAgICAgLS1wcmltYXJ5LTkwMDogY29sb3ItbWl4KGluIHNyZ2IsICR7YmFzZUNvbG9yfSwgYmxhY2sgODAlKTtcblxuICAgICAgICAvKiBZb3VyIGV4aXN0aW5nIGRlcml2ZWQgY29sb3JzIC0gdXBkYXRlZCB0byB1c2UgbmV3IHNoYWRlcyAqL1xuICAgICAgICAtLXByaW1hcnktZm9yZWdyb3VuZDogd2hpdGU7XG4gICAgICAgIC0tc2Vjb25kYXJ5OiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tcHJpbWFyeS0yMDApLCB0cmFuc3BhcmVudCA0MCUpO1xuICAgICAgICAtLXNlY29uZGFyeS1mb3JlZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LTkwMCk7XG4gICAgICAgIC0tbXV0ZWQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1wcmltYXJ5LTUwKSwgI2YzZjRmNiA1MCUpO1xuICAgICAgICAtLW11dGVkLWZvcmVncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1wcmltYXJ5LTQwMCksICM0YjU1NjMgNjAlKTtcbiAgICAgICAgLS1hY2NlbnQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1wcmltYXJ5LTEwMCksIHRyYW5zcGFyZW50IDcwJSk7XG4gICAgICAgIC0tYWNjZW50LWZvcmVncm91bmQ6IHZhcigtLXByaW1hcnktNzAwKTtcbiAgICAgICAgLS1yaW5nOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tcHJpbWFyeS0zMDApLCB0cmFuc3BhcmVudCA1MCUpO1xuICAgICAgfVxuXG4gICAgICAuZGFyayB7XG4gICAgICAgIC8qIERhcmsgbW9kZSB2YXJpYW50cyAqL1xuICAgICAgICAtLXByaW1hcnktNTA6IGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0sIGJsYWNrIDg1JSk7XG4gICAgICAgIC0tcHJpbWFyeS0xMDA6IGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0sIGJsYWNrIDc1JSk7XG4gICAgICAgIC0tcHJpbWFyeS0yMDA6IGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0sIGJsYWNrIDY1JSk7XG4gICAgICAgIC0tcHJpbWFyeS0zMDA6IGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0sIGJsYWNrIDU1JSk7XG4gICAgICAgIC0tcHJpbWFyeS00MDA6IGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0sIGJsYWNrIDQ1JSk7XG4gICAgICAgIC0tcHJpbWFyeS01MDA6ICR7YmFzZUNvbG9yfTtcbiAgICAgICAgLS1wcmltYXJ5LTYwMDogY29sb3ItbWl4KGluIHNyZ2IsICR7YmFzZUNvbG9yfSwgd2hpdGUgMjAlKTtcbiAgICAgICAgLS1wcmltYXJ5LTcwMDogY29sb3ItbWl4KGluIHNyZ2IsICR7YmFzZUNvbG9yfSwgd2hpdGUgMzUlKTtcbiAgICAgICAgLS1wcmltYXJ5LTgwMDogY29sb3ItbWl4KGluIHNyZ2IsICR7YmFzZUNvbG9yfSwgd2hpdGUgNTAlKTtcbiAgICAgICAgLS1wcmltYXJ5LTkwMDogY29sb3ItbWl4KGluIHNyZ2IsICR7YmFzZUNvbG9yfSwgd2hpdGUgNjUlKTtcblxuICAgICAgICAvKiBEYXJrIG1vZGUgZGVyaXZlZCBjb2xvcnMgKi9cbiAgICAgICAgLS1wcmltYXJ5LWZvcmVncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0sIHdoaXRlIDkwJSk7XG4gICAgICAgIC0tc2Vjb25kYXJ5OiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tcHJpbWFyeS05MDApLCB0cmFuc3BhcmVudCA3MCUpO1xuICAgICAgICAtLXNlY29uZGFyeS1mb3JlZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LTEwMCk7XG4gICAgICAgIC0tbXV0ZWQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1wcmltYXJ5LTk1MCksICMxZjI5MzcgNTAlKTtcbiAgICAgICAgLS1tdXRlZC1mb3JlZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tcHJpbWFyeS0zMDApLCAjOWNhM2FmIDQwJSk7XG4gICAgICAgIC0tYWNjZW50OiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tcHJpbWFyeS04MDApLCB0cmFuc3BhcmVudCA4MCUpO1xuICAgICAgICAtLWFjY2VudC1mb3JlZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LTIwMCk7XG4gICAgICAgIC0tcmluZzogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXByaW1hcnktNjAwKSwgdHJhbnNwYXJlbnQgNjAlKTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgdGhpcy5pbmplY3REeW5hbWljU3R5bGVzKGNzcyk7XG4gIH1cblxuICBwcml2YXRlIGluamVjdER5bmFtaWNTdHlsZXMoY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSBleGlzdGluZyBkeW5hbWljIHN0eWxlc1xuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGV4aXN0aW5nU3R5bGUucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFuZCBpbmplY3QgbmV3IHN0eWxlc1xuICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZUVsZW1lbnQuaWQgPSB0aGlzLnN0eWxlSWQ7XG4gICAgc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gY3NzO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5oZWFkLCBzdHlsZUVsZW1lbnQpO1xuICB9XG5cbiAgdG9nZ2xlVGhlbWUoKSB7XG4gICAgY29uc3QgaXNDdXJyZW50bHlEYXJrID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkYXJrJyk7XG4gICAgaXNDdXJyZW50bHlEYXJrID8gdGhpcy5kaXNhYmxlRGFya01vZGUoKSA6IHRoaXMuZW5hYmxlRGFya01vZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlRGFya01vZGUoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ2RhcmsnKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnZGFyaycpO1xuICAgIHRoaXMuaXNEYXJrU3ViamVjdC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlRGFya01vZGUoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ2RhcmsnKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnbGlnaHQnKTtcbiAgICB0aGlzLmlzRGFya1N1YmplY3QubmV4dChmYWxzZSk7XG4gIH1cblxuICBzZXRQcmltYXJ5Q29sb3IoY29sb3I6IHN0cmluZywgcGVyc2lzdCA9IHRydWUpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIC8vIFVwZGF0ZSBDU1MgdmFyaWFibGVzICsgcGFsZXR0ZVxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICctLXByaW1hcnknLFxuICAgICAgY29sb3JcbiAgICApO1xuXG4gICAgdGhpcy5nZW5lcmF0ZVByaW1hcnlTaGFkZXMoY29sb3IpO1xuXG4gICAgLy8gUGVyc2lzdCB1c2VyIHByZWZlcmVuY2VcbiAgICBpZiAocGVyc2lzdCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InLCBjb2xvcik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGN1cnJlbnRUaGVtZSgpOiAnZGFyaycgfCAnbGlnaHQnIHtcbiAgICByZXR1cm4gdGhpcy5pc0RhcmtTdWJqZWN0LnZhbHVlID8gJ2RhcmsnIDogJ2xpZ2h0JztcbiAgfVxuXG4gIGdldCBwcmltYXJ5Q29sb3IoKSB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gIH1cbn1cbiJdfQ==
396
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7O0FBRzNELE1BQU0sT0FBTyxZQUFZO0lBT0s7SUFDRztJQUNhO0lBUnBDLFFBQVEsQ0FBWTtJQUNwQixhQUFhLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDNUQsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEMsT0FBTyxHQUFHLHFCQUFxQixDQUFDO0lBRXhDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFFaEQsc0VBQXNFO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxD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QyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdFLHNCQUFzQjtRQUN0QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLEtBQWEsRUFBRSxPQUFlO1FBQ2hELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV2QixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFbEQsT0FBTyxJQUFJLENBQUMs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QixZQUFZLGNBREMsTUFBTTs7NEZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFRN0IsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIFBMQVRGT1JNX0lELCBPcHRpb25hbCwgUmVuZGVyZXIyLCBSZW5kZXJlckZhY3RvcnkyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUT0xMRV9DT05GSUcsIFRvbGxlQ29uZmlnIH0gZnJvbSAnLi90b2xsZS1jb25maWcnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFRoZW1lU2VydmljZSB7XG4gIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgcHJpdmF0ZSBpc0RhcmtTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGlzRGFyayQgPSB0aGlzLmlzRGFya1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHByaXZhdGUgc3R5bGVJZCA9ICd0b2xsZS1keW5hbWljLXRoZW1lJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRPTExFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRvbGxlQ29uZmlnLFxuICAgIHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5MlxuICApIHtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRoZW1lKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUaGVtZSgpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIC8vIExPR0lDOiBVc2VyIFNhdmVkIFByZWZlcmVuY2VzID4gQ29uZmlnIERlZmF1bHRzID4gU3lzdGVtIFByZWZlcmVuY2VcbiAgICBjb25zdCBzYXZlZFRoZW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXRoZW1lJyk7XG4gICAgY29uc3Qgc2F2ZWRQcmltYXJ5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKTtcbiAgICBjb25zdCBzYXZlZFJhZGl1cyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1yYWRpdXMnKTtcbiAgICBjb25zdCBzeXN0ZW1QcmVmZXJzRGFyayA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcztcblxuICAgIGNvbnNvbGUubG9nKCdUaGVtZSBpbml0aWFsaXphdGlvbjonLCB7XG4gICAgICBzYXZlZFRoZW1lLFxuICAgICAgc2F2ZWRQcmltYXJ5LFxuICAgICAgc2F2ZWRSYWRpdXMsXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgc3lzdGVtUHJlZmVyc0RhcmtcbiAgICB9KTtcblxuICAgIC8vIDEuIERldGVybWluZSBEYXJrL0xpZ2h0IE1vZGVcbiAgICAvLyBQcmlvcml0eTogU2F2ZWQgVGhlbWUgPiBDb25maWcgRGVmYXVsdCA+IFN5c3RlbSBQcmVmZXJlbmNlXG4gICAgbGV0IHNob3VsZEJlRGFyayA9IHN5c3RlbVByZWZlcnNEYXJrOyAvLyBTdGFydCB3aXRoIHN5c3RlbVxuXG4gICAgaWYgKHNhdmVkVGhlbWUpIHtcbiAgICAgIC8vIFVzZXIgaGFzIHNhdmVkIHByZWZlcmVuY2VcbiAgICAgIHNob3VsZEJlRGFyayA9IHNhdmVkVGhlbWUgPT09ICdkYXJrJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5kYXJrQnlEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFVzZSBjb25maWcgZGVmYXVsdCBpZiBubyB1c2VyIHByZWZlcmVuY2VcbiAgICAgIHNob3VsZEJlRGFyayA9IHRoaXMuY29uZmlnLmRhcmtCeURlZmF1bHQ7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgdGhlbWUgbW9kZVxuICAgIGlmIChzaG91bGRCZURhcmspIHtcbiAgICAgIHRoaXMuZW5hYmxlRGFya01vZGUoZmFsc2UpOyAvLyBEb24ndCBzYXZlLCB3ZSdsbCBzYXZlIGFmdGVyIGNoZWNraW5nIGFsbCBwcmVmZXJlbmNlc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVEYXJrTW9kZShmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gQXBwbHkgUHJpbWFyeSBDb2xvclxuICAgIC8vIFByaW9yaXR5OiBTYXZlZCBDb2xvciA+IENvbmZpZyBDb2xvclxuICAgIGlmIChzYXZlZFByaW1hcnkpIHtcbiAgICAgIC8vIFVzZXIgaGFzIHNhdmVkIGNvbG9yIHByZWZlcmVuY2VcbiAgICAgIHRoaXMuc2V0UHJpbWFyeUNvbG9yKHNhdmVkUHJpbWFyeSwgZmFsc2UpOyAvLyBEb24ndCBzYXZlIGFnYWluXG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8ucHJpbWFyeUNvbG9yKSB7XG4gICAgICAvLyBVc2UgY29uZmlnIGRlZmF1bHQgaWYgbm8gdXNlciBwcmVmZXJlbmNlXG4gICAgICB0aGlzLnNldFByaW1hcnlDb2xvcih0aGlzLmNvbmZpZy5wcmltYXJ5Q29sb3IsIHRydWUpOyAvLyBTYXZlIHRoaXMgYXMgdXNlciBwcmVmZXJlbmNlXG4gICAgfVxuXG4gICAgLy8gMy4gQXBwbHkgUmFkaXVzXG4gICAgLy8gUHJpb3JpdHk6IFNhdmVkIFJhZGl1cyA+IENvbmZpZyBSYWRpdXNcbiAgICBpZiAoc2F2ZWRSYWRpdXMpIHtcbiAgICAgIC8vIFVzZXIgaGFzIHNhdmVkIHJhZGl1cyBwcmVmZXJlbmNlXG4gICAgICB0aGlzLnNldFJhZGl1cyhzYXZlZFJhZGl1cywgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LnJhZGl1cykge1xuICAgICAgLy8gVXNlIGNvbmZpZyBkZWZhdWx0IGlmIG5vIHVzZXIgcHJlZmVyZW5jZVxuICAgICAgdGhpcy5zZXRSYWRpdXModGhpcy5jb25maWcucmFkaXVzLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBTYXZlIHRoZW1lIG1vZGUgcHJlZmVyZW5jZSBpZiBpdCBjYW1lIGZyb20gY29uZmlnIG9yIHN5c3RlbVxuICAgIGlmICghc2F2ZWRUaGVtZSkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RvbGxlLXRoZW1lJywgc2hvdWxkQmVEYXJrID8gJ2RhcmsnIDogJ2xpZ2h0Jyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBib3JkZXIgcmFkaXVzIGZvciBhbGwgY29tcG9uZW50c1xuICAgKi9cbiAgc2V0UmFkaXVzKHJhZGl1czogc3RyaW5nLCBwZXJzaXN0ID0gdHJ1ZSkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgLy8gU2V0IHRoZSBDU1MgdmFyaWFibGVcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cycsIHJhZGl1cyk7XG5cbiAgICAvLyBBbHNvIHVwZGF0ZSB0aGUgZHluYW1pYyBzdHlsZXMgdG8gaW5jbHVkZSByYWRpdXMgY2FsY3VsYXRpb25zXG4gICAgdGhpcy51cGRhdGVSYWRpdXNJbkR5bmFtaWNTdHlsZXMocmFkaXVzKTtcblxuICAgIC8vIFBlcnNpc3QgaWYgbmVlZGVkXG4gICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS1yYWRpdXMnLCByYWRpdXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSByYWRpdXMgY2FsY3VsYXRpb25zIGluIGR5bmFtaWMgc3R5bGVzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVJhZGl1c0luRHluYW1pY1N0eWxlcyhyYWRpdXM6IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG5cbiAgICBpZiAoZXhpc3RpbmdTdHlsZSkge1xuICAgICAgbGV0IGNzcyA9IGV4aXN0aW5nU3R5bGUudGV4dENvbnRlbnQgfHwgJyc7XG5cbiAgICAgIC8vIFVwZGF0ZSBvciBhZGQgcmFkaXVzIGNhbGN1bGF0aW9uc1xuICAgICAgaWYgKGNzcy5pbmNsdWRlcygnLS1yYWRpdXM6JykpIHtcbiAgICAgICAgLy8gUmVwbGFjZSBleGlzdGluZyByYWRpdXMgZGVjbGFyYXRpb25zXG4gICAgICAgIGNzcyA9IGNzcy5yZXBsYWNlKC8tLXJhZGl1czpbXjtdKzsvZywgYC0tcmFkaXVzOiAke3JhZGl1c307YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBZGQgcmFkaXVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgOnJvb3RcbiAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UoLzpyb290XFxzKnsvLCBgOnJvb3Qge1xcbiAgICAgIC0tcmFkaXVzOiAke3JhZGl1c307YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgY2FsY3VsYXRlZCByYWRpdXMgdmFsdWVzIGluIHRoZSBDU1NcbiAgICAgIGNvbnN0IHJhZGl1c0NhbGNSZWdleCA9IC9jYWxjXFwodmFyXFwoLS1yYWRpdXNbXildK1xcKS9nO1xuICAgICAgY3NzID0gY3NzLnJlcGxhY2UocmFkaXVzQ2FsY1JlZ2V4LCAobWF0Y2gpID0+IHtcbiAgICAgICAgaWYgKG1hdGNoLmluY2x1ZGVzKCctIDJweCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGBjYWxjKCR7cmFkaXVzfSAtIDJweClgO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoLmluY2x1ZGVzKCctIDRweCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGBjYWxjKCR7cmFkaXVzfSAtIDRweClgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH0pO1xuXG4gICAgICBleGlzdGluZ1N0eWxlLnRleHRDb250ZW50ID0gY3NzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgZnVsbCBwcmltYXJ5IGNvbG9yIHBhbGV0dGUgKDUwLTkwMCkgYmFzZWQgb24gYmFzZSBjb2xvclxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZVByaW1hcnlTaGFkZXMoYmFzZUNvbG9yOiBzdHJpbmcpIHtcbiAgICAvLyBDb252ZXJ0IGhleCB0byBSR0JcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGJhc2VDb2xvcik7XG4gICAgY29uc3QgcmdiU3RyaW5nID0gcmdiID8gYCR7cmdiLnJ9ICR7cmdiLmd9ICR7cmdiLmJ9YCA6ICczNyA5OSAyMzUnO1xuXG4gICAgLy8gQ3JlYXRlIGxpZ2h0ZXIgcmluZyBjb2xvcnMgaW4gUkdCXG4gICAgY29uc3QgcmluZ0xpZ2h0ID0gdGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA0MCk7XG4gICAgY29uc3QgcmluZ0xpZ2h0UmdiID0gdGhpcy5oZXhUb1JnYihyaW5nTGlnaHQpO1xuICAgIGNvbnN0IHJpbmdMaWdodFJnYlN0cmluZyA9IHJpbmdMaWdodFJnYiA/IGAke3JpbmdMaWdodFJnYi5yfSAke3JpbmdMaWdodFJnYi5nfSAke3JpbmdMaWdodFJnYi5ifWAgOiAnOTYgMTY1IDI1MCc7XG5cbiAgICBjb25zdCByaW5nRGFyayA9IHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgMjApO1xuICAgIGNvbnN0IHJpbmdEYXJrUmdiID0gdGhpcy5oZXhUb1JnYihyaW5nRGFyayk7XG4gICAgY29uc3QgcmluZ0RhcmtSZ2JTdHJpbmcgPSByaW5nRGFya1JnYiA/IGAke3JpbmdEYXJrUmdiLnJ9ICR7cmluZ0RhcmtSZ2IuZ30gJHtyaW5nRGFya1JnYi5ifWAgOiAnMTQ3IDE5NyAyNTMnO1xuXG4gICAgLy8gR2V0IGN1cnJlbnQgcmFkaXVzIG9yIHVzZSBkZWZhdWx0XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IGN1cnJlbnRSYWRpdXMgPSBnZXRDb21wdXRlZFN0eWxlKHJvb3QpLmdldFByb3BlcnR5VmFsdWUoJy0tcmFkaXVzJykudHJpbSgpIHx8ICcwLjVyZW0nO1xuXG4gICAgY29uc3QgY3NzID0gYFxuICAgICAgLyogT3ZlcnJpZGUgcHJpbWFyeSBjb2xvcnMgLSB0aGlzIG5lZWRzIHRvIGNvbWUgQUZURVIgeW91ciBtYWluIENTUyAqL1xuICAgICAgOnJvb3Qge1xuICAgICAgICAvKiBQcmltYXJ5IGluIFJHQiBmb3JtYXQgZm9yIFRhaWx3aW5kIG9wYWNpdHkgc3VwcG9ydCAqL1xuICAgICAgICAtLXByaW1hcnk6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LWZvcmVncm91bmQ6ICR7dGhpcy5nZXRDb250cmFzdENvbG9yUmdiKGJhc2VDb2xvcil9O1xuXG4gICAgICAgIC8qIFJhZGl1cyAqL1xuICAgICAgICAtLXJhZGl1czogJHtjdXJyZW50UmFkaXVzfTtcblxuICAgICAgICAvKiBQcmltYXJ5IHNoYWRlcyBmb3IgbGlnaHQgbW9kZSAqL1xuICAgICAgICAtLXByaW1hcnktNTA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDkwKSl9O1xuICAgICAgICAtLXByaW1hcnktMTAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA4MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTIwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgNjApKX07XG4gICAgICAgIC0tcHJpbWFyeS0zMDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDQwKSl9O1xuICAgICAgICAtLXByaW1hcnktNDAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAyMCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTUwMDogJHtyZ2JTdHJpbmd9O1xuICAgICAgICAtLXByaW1hcnktNjAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDIwKSl9O1xuICAgICAgICAtLXByaW1hcnktNzAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDQwKSl9O1xuICAgICAgICAtLXByaW1hcnktODAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDYwKSl9O1xuICAgICAgICAtLXByaW1hcnktOTAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDgwKSl9O1xuXG4gICAgICAgIC8qIFVwZGF0ZSByaW5nIGNvbG9yIHRvIGJlIGxpZ2h0ZXIgKi9cbiAgICAgICAgLS1yaW5nOiAke3JpbmdMaWdodFJnYlN0cmluZ307XG4gICAgICB9XG5cbiAgICAgIC5kYXJrIHtcbiAgICAgICAgLyogRm9yIGRhcmsgbW9kZSwgd2Uga2VlcCB0aGUgcHJpbWFyeSBjb2xvciBidXQgYWRqdXN0IHNoYWRlcyAqL1xuICAgICAgICAtLXByaW1hcnk6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LWZvcmVncm91bmQ6ICR7dGhpcy5nZXRDb250cmFzdENvbG9yUmdiKGJhc2VDb2xvcil9O1xuXG4gICAgICAgIC8qIERhcmsgbW9kZSBzaGFkZXMgKi9cbiAgICAgICAgLS1wcmltYXJ5LTUwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDg1KSl9O1xuICAgICAgICAtLXByaW1hcnktMTAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDc1KSl9O1xuICAgICAgICAtLXByaW1hcnktMjAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDY1KSl9O1xuICAgICAgICAtLXByaW1hcnktMzAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDU1KSl9O1xuICAgICAgICAtLXByaW1hcnktNDAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5kYXJrZW5Db2xvcihiYXNlQ29sb3IsIDQ1KSl9O1xuICAgICAgICAtLXByaW1hcnktNTAwOiAke3JnYlN0cmluZ307XG4gICAgICAgIC0tcHJpbWFyeS02MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDIwKSl9O1xuICAgICAgICAtLXByaW1hcnktNzAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAzNSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTgwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgNTApKX07XG4gICAgICAgIC0tcHJpbWFyeS05MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDY1KSl9O1xuXG4gICAgICAgIC8qIFVwZGF0ZSByaW5nIGNvbG9yIGZvciBkYXJrIG1vZGUgLSBsaWdodGVyIHZhcmlhbnQgKi9cbiAgICAgICAgLS1yaW5nOiAke3JpbmdEYXJrUmdiU3RyaW5nfTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgdGhpcy5pbmplY3REeW5hbWljU3R5bGVzKGNzcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBoZXggY29sb3IgdG8gUkdCIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBoZXhUb1JnYihoZXg6IHN0cmluZyk6IHsgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgLy8gUmVtb3ZlICMgaWYgcHJlc2VudFxuICAgIGNvbnN0IGNsZWFuZWRIZXggPSBoZXgucmVwbGFjZSgnIycsICcnKTtcblxuICAgIGxldCByID0gMCwgZyA9IDAsIGIgPSAwO1xuXG4gICAgaWYgKGNsZWFuZWRIZXgubGVuZ3RoID09PSAzKSB7XG4gICAgICByID0gcGFyc2VJbnQoY2xlYW5lZEhleFswXSArIGNsZWFuZWRIZXhbMF0sIDE2KTtcbiAgICAgIGcgPSBwYXJzZUludChjbGVhbmVkSGV4WzFdICsgY2xlYW5lZEhleFsxXSwgMTYpO1xuICAgICAgYiA9IHBhcnNlSW50KGNsZWFuZWRIZXhbMl0gKyBjbGVhbmVkSGV4WzJdLCAxNik7XG4gICAgICByZXR1cm4geyByLCBnLCBiIH07XG4gICAgfVxuXG4gICAgaWYgKGNsZWFuZWRIZXgubGVuZ3RoID09PSA2KSB7XG4gICAgICByID0gcGFyc2VJbnQoY2xlYW5lZEhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcbiAgICAgIGcgPSBwYXJzZUludChjbGVhbmVkSGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xuICAgICAgYiA9IHBhcnNlSW50KGNsZWFuZWRIZXguc3Vic3RyaW5nKDQsIDYpLCAxNik7XG4gICAgICByZXR1cm4geyByLCBnLCBiIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBoZXggdG8gUkdCIHN0cmluZyBmb3JtYXQgZm9yIENTUyAoc3BhY2Utc2VwYXJhdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBoZXhUb1JnYlN0cmluZyhoZXhDb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGhleENvbG9yKTtcbiAgICByZXR1cm4gcmdiID8gYCR7cmdiLnJ9ICR7cmdiLmd9ICR7cmdiLmJ9YCA6ICczNyA5OSAyMzUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb250cmFzdCBjb2xvciBpbiBSR0IgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGdldENvbnRyYXN0Q29sb3JSZ2IoaGV4Q29sb3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29udHJhc3QgPSB0aGlzLmdldENvbnRyYXN0Q29sb3IoaGV4Q29sb3IpO1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoY29udHJhc3QpO1xuICAgIHJldHVybiByZ2IgPyBgJHtyZ2Iucn0gJHtyZ2IuZ30gJHtyZ2IuYn1gIDogJzI1NSAyNTUgMjU1JztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWdodGVuIGEgaGV4IGNvbG9yIGJ5IGEgcGVyY2VudGFnZVxuICAgKi9cbiAgcHJpdmF0ZSBsaWdodGVuQ29sb3IoY29sb3I6IHN0cmluZywgcGVyY2VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcbiAgICBpZiAoIXJnYikgcmV0dXJuIGNvbG9yO1xuXG4gICAgLy8gTGlnaHRlbiBieSBwZXJjZW50YWdlXG4gICAgY29uc3QgciA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyZ2IuciArICgyNTUgLSByZ2IucikgKiAocGVyY2VudCAvIDEwMCkpKTtcbiAgICBjb25zdCBnID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHJnYi5nICsgKDI1NSAtIHJnYi5nKSAqIChwZXJjZW50IC8gMTAwKSkpO1xuICAgIGNvbnN0IGIgPSBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IocmdiLmIgKyAoMjU1IC0gcmdiLmIpICogKHBlcmNlbnQgLyAxMDApKSk7XG5cbiAgICAvLyBDb252ZXJ0IGJhY2sgdG8gaGV4XG4gICAgcmV0dXJuIGAjJHsoKDEgPDwgMjQpICsgKHIgPDwgMTYpICsgKGcgPDwgOCkgKyBiKS50b1N0cmluZygxNikuc2xpY2UoMSl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXJrZW4gYSBoZXggY29sb3IgYnkgYSBwZXJjZW50YWdlXG4gICAqL1xuICBwcml2YXRlIGRhcmtlbkNvbG9yKGNvbG9yOiBzdHJpbmcsIHBlcmNlbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihjb2xvcik7XG4gICAgaWYgKCFyZ2IpIHJldHVybiBjb2xvcjtcblxuICAgIGNvbnN0IGZhY3RvciA9IDEgLSAocGVyY2VudCAvIDEwMCk7XG4gICAgY29uc3QgciA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmdiLnIgKiBmYWN0b3IpKTtcbiAgICBjb25zdCBnID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihyZ2IuZyAqIGZhY3RvcikpO1xuICAgIGNvbnN0IGIgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHJnYi5iICogZmFjdG9yKSk7XG5cbiAgICByZXR1cm4gYCMke3IudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtnLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7Yi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBjb250cmFzdCBjb2xvciAoYmxhY2sgb3Igd2hpdGUpIGJhc2VkIG9uIGJhY2tncm91bmQgY29sb3JcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29udHJhc3RDb2xvcihoZXhDb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGhleENvbG9yKTtcbiAgICBpZiAoIXJnYikgcmV0dXJuICcjZmZmZmZmJztcblxuICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBsdW1pbmFuY2VcbiAgICBjb25zdCBsdW1pbmFuY2UgPSAoMC4yOTkgKiByZ2IuciArIDAuNTg3ICogcmdiLmcgKyAwLjExNCAqIHJnYi5iKSAvIDI1NTtcblxuICAgIC8vIFJldHVybiBibGFjayBmb3IgbGlnaHQgY29sb3JzLCB3aGl0ZSBmb3IgZGFyayBjb2xvcnNcbiAgICByZXR1cm4gbHVtaW5hbmNlID4gMC41ID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmplY3REeW5hbWljU3R5bGVzKGNzczogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICBleGlzdGluZ1N0eWxlLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZUVsZW1lbnQuaWQgPSB0aGlzLnN0eWxlSWQ7XG4gICAgc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gY3NzO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5oZWFkLCBzdHlsZUVsZW1lbnQpO1xuICB9XG5cbiAgdG9nZ2xlVGhlbWUoKSB7XG4gICAgY29uc3QgaXNDdXJyZW50bHlEYXJrID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkYXJrJyk7XG4gICAgaXNDdXJyZW50bHlEYXJrID8gdGhpcy5kaXNhYmxlRGFya01vZGUoKSA6IHRoaXMuZW5hYmxlRGFya01vZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlRGFya01vZGUoc2F2ZVRvU3RvcmFnZSA9IHRydWUpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnZGFyaycpO1xuICAgIGlmIChzYXZlVG9TdG9yYWdlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnZGFyaycpO1xuICAgIH1cbiAgICB0aGlzLmlzRGFya1N1YmplY3QubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZURhcmtNb2RlKHNhdmVUb1N0b3JhZ2UgPSB0cnVlKSB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ2RhcmsnKTtcbiAgICBpZiAoc2F2ZVRvU3RvcmFnZSkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RvbGxlLXRoZW1lJywgJ2xpZ2h0Jyk7XG4gICAgfVxuICAgIHRoaXMuaXNEYXJrU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgfVxuICBzZXRQcmltYXJ5Q29sb3IoY29sb3I6IHN0cmluZywgcGVyc2lzdCA9IHRydWUpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIHRoaXMuZ2VuZXJhdGVQcmltYXJ5U2hhZGVzKGNvbG9yKTtcblxuICAgIC8vIEFsc28gc2V0IGlubGluZSBmb3IgaW1tZWRpYXRlIHVwZGF0ZVxuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoY29sb3IpO1xuICAgIGlmIChyZ2IpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgICAnLS1wcmltYXJ5JyxcbiAgICAgICAgYCR7cmdiLnJ9ICR7cmdiLmd9ICR7cmdiLmJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGVyc2lzdCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InLCBjb2xvcik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGN1cnJlbnRUaGVtZSgpOiAnZGFyaycgfCAnbGlnaHQnIHtcbiAgICByZXR1cm4gdGhpcy5pc0RhcmtTdWJqZWN0LnZhbHVlID8gJ2RhcmsnIDogJ2xpZ2h0JztcbiAgfVxuXG4gIGdldCBwcmltYXJ5Q29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjc3NWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1wcmltYXJ5JykudHJpbSgpO1xuXG4gICAgaWYgKGNzc1ZhbHVlICYmIGNzc1ZhbHVlICE9PSAnJykge1xuICAgICAgLy8gQ29udmVydCBSR0Igc3RyaW5nIGJhY2sgdG8gaGV4IGZvciBleHRlcm5hbCB1c2VcbiAgICAgIGNvbnN0IHJnYlBhcnRzID0gY3NzVmFsdWUuc3BsaXQoJyAnKS5tYXAoTnVtYmVyKTtcbiAgICAgIGlmIChyZ2JQYXJ0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIGAjJHtyZ2JQYXJ0c1swXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke3JnYlBhcnRzWzFdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7cmdiUGFydHNbMl0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0byBjb25maWcgZGVmYXVsdHMgKGNsZWFycyB1c2VyIHByZWZlcmVuY2VzKVxuICAgKi9cbiAgcmVzZXRUb0NvbmZpZ0RlZmF1bHRzKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgLy8gQ2xlYXIgdXNlciBwcmVmZXJlbmNlc1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS10aGVtZScpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvbGxlLXJhZGl1cycpO1xuXG4gICAgLy8gUmUtaW5pdGlhbGl6ZSB3aXRoIGNvbmZpZyBkZWZhdWx0c1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRoZW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBwcmVmZXJlbmNlc1xuICAgKi9cbiAgZ2V0VXNlclByZWZlcmVuY2VzKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGhlbWU6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS10aGVtZScpLFxuICAgICAgcHJpbWFyeUNvbG9yOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpLFxuICAgICAgcmFkaXVzOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcmFkaXVzJylcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCB1c2VyIHByZWZlcmVuY2VzXG4gICAqL1xuICBjbGVhclVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS10aGVtZScpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvbGxlLXJhZGl1cycpO1xuXG4gICAgLy8gUmVzZXQgdG8gc3lzdGVtIGRlZmF1bHRzIChub3QgY29uZmlnIGRlZmF1bHRzKVxuICAgIGNvbnN0IHN5c3RlbVByZWZlcnNEYXJrID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzO1xuICAgIGlmIChzeXN0ZW1QcmVmZXJzRGFyaykge1xuICAgICAgdGhpcy5lbmFibGVEYXJrTW9kZShmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgQ1NTIHZhcmlhYmxlc1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXByaW1hcnknKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXJhZGl1cycpO1xuXG4gICAgLy8gQ2xlYXIgZHluYW1pYyBzdHlsZXNcbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICBleGlzdGluZ1N0eWxlLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIl19