@uptime.link/statuspage 1.0.74 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist_bundle/bundle.js +4096 -504
  2. package/dist_bundle/bundle.js.map +4 -4
  3. package/dist_ts_web/00_commitinfo_data.js +2 -2
  4. package/dist_ts_web/elements/index.d.ts +3 -0
  5. package/dist_ts_web/elements/index.js +6 -1
  6. package/dist_ts_web/elements/internal/uplinternal-miniheading.d.ts +1 -0
  7. package/dist_ts_web/elements/internal/uplinternal-miniheading.js +78 -28
  8. package/dist_ts_web/elements/upl-statuspage-assetsselector.d.ts +14 -0
  9. package/dist_ts_web/elements/upl-statuspage-assetsselector.demo.d.ts +1 -0
  10. package/dist_ts_web/elements/upl-statuspage-assetsselector.demo.js +575 -0
  11. package/dist_ts_web/elements/upl-statuspage-assetsselector.js +605 -43
  12. package/dist_ts_web/elements/upl-statuspage-footer.d.ts +46 -2
  13. package/dist_ts_web/elements/upl-statuspage-footer.demo.d.ts +1 -0
  14. package/dist_ts_web/elements/upl-statuspage-footer.demo.js +679 -0
  15. package/dist_ts_web/elements/upl-statuspage-footer.js +792 -61
  16. package/dist_ts_web/elements/upl-statuspage-header.d.ts +5 -1
  17. package/dist_ts_web/elements/upl-statuspage-header.demo.d.ts +1 -0
  18. package/dist_ts_web/elements/upl-statuspage-header.demo.js +220 -0
  19. package/dist_ts_web/elements/upl-statuspage-header.js +313 -86
  20. package/dist_ts_web/elements/upl-statuspage-incidents.d.ts +22 -4
  21. package/dist_ts_web/elements/upl-statuspage-incidents.demo.d.ts +1 -0
  22. package/dist_ts_web/elements/upl-statuspage-incidents.demo.js +1147 -0
  23. package/dist_ts_web/elements/upl-statuspage-incidents.js +750 -74
  24. package/dist_ts_web/elements/upl-statuspage-pagetitle.d.ts +15 -0
  25. package/dist_ts_web/elements/upl-statuspage-pagetitle.demo.d.ts +1 -0
  26. package/dist_ts_web/elements/upl-statuspage-pagetitle.demo.js +25 -0
  27. package/dist_ts_web/elements/upl-statuspage-pagetitle.js +148 -0
  28. package/dist_ts_web/elements/upl-statuspage-statsgrid.d.ts +23 -0
  29. package/dist_ts_web/elements/upl-statuspage-statsgrid.demo.d.ts +1 -0
  30. package/dist_ts_web/elements/upl-statuspage-statsgrid.demo.js +295 -0
  31. package/dist_ts_web/elements/upl-statuspage-statsgrid.js +374 -0
  32. package/dist_ts_web/elements/upl-statuspage-statusbar.d.ts +4 -0
  33. package/dist_ts_web/elements/upl-statuspage-statusbar.demo.d.ts +1 -0
  34. package/dist_ts_web/elements/upl-statuspage-statusbar.demo.js +365 -0
  35. package/dist_ts_web/elements/upl-statuspage-statusbar.js +357 -44
  36. package/dist_ts_web/elements/upl-statuspage-statusdetails.d.ts +14 -0
  37. package/dist_ts_web/elements/upl-statuspage-statusdetails.demo.d.ts +1 -0
  38. package/dist_ts_web/elements/upl-statuspage-statusdetails.demo.js +706 -0
  39. package/dist_ts_web/elements/upl-statuspage-statusdetails.js +373 -63
  40. package/dist_ts_web/elements/upl-statuspage-statusmonth.d.ts +15 -0
  41. package/dist_ts_web/elements/upl-statuspage-statusmonth.demo.d.ts +1 -0
  42. package/dist_ts_web/elements/upl-statuspage-statusmonth.demo.js +798 -0
  43. package/dist_ts_web/elements/upl-statuspage-statusmonth.js +474 -100
  44. package/dist_ts_web/interfaces/index.d.ts +84 -0
  45. package/dist_ts_web/interfaces/index.js +4 -0
  46. package/dist_ts_web/pages/index.d.ts +4 -1
  47. package/dist_ts_web/pages/index.js +5 -2
  48. package/dist_ts_web/pages/statuspage-allgreen.d.ts +1 -0
  49. package/dist_ts_web/pages/statuspage-allgreen.js +386 -0
  50. package/dist_ts_web/pages/statuspage-demo.d.ts +1 -0
  51. package/dist_ts_web/pages/statuspage-demo.js +616 -0
  52. package/dist_ts_web/pages/statuspage-maintenance.d.ts +1 -0
  53. package/dist_ts_web/pages/statuspage-maintenance.js +544 -0
  54. package/dist_ts_web/pages/statuspage-outage.d.ts +1 -0
  55. package/dist_ts_web/pages/statuspage-outage.js +543 -0
  56. package/dist_ts_web/styles/shared.styles.d.ts +80 -0
  57. package/dist_ts_web/styles/shared.styles.js +351 -0
  58. package/dist_watch/bundle.js +51691 -32432
  59. package/dist_watch/bundle.js.map +4 -4
  60. package/npmextra.json +9 -3
  61. package/package.json +19 -19
  62. package/readme.hints.md +292 -0
  63. package/readme.md +326 -149
  64. package/readme.plan.md +261 -0
  65. package/ts_web/00_commitinfo_data.ts +1 -1
  66. package/ts_web/elements/index.ts +6 -0
  67. package/ts_web/elements/internal/uplinternal-miniheading.ts +24 -17
  68. package/ts_web/elements/upl-statuspage-assetsselector.demo.ts +607 -0
  69. package/ts_web/elements/upl-statuspage-assetsselector.ts +526 -18
  70. package/ts_web/elements/upl-statuspage-footer.demo.ts +744 -0
  71. package/ts_web/elements/upl-statuspage-footer.ts +608 -30
  72. package/ts_web/elements/upl-statuspage-header.demo.ts +241 -0
  73. package/ts_web/elements/upl-statuspage-header.ts +220 -52
  74. package/ts_web/elements/upl-statuspage-incidents.demo.ts +1216 -0
  75. package/ts_web/elements/upl-statuspage-incidents.ts +649 -26
  76. package/ts_web/elements/upl-statuspage-pagetitle.demo.ts +25 -0
  77. package/ts_web/elements/upl-statuspage-pagetitle.ts +89 -0
  78. package/ts_web/elements/upl-statuspage-statsgrid.demo.ts +315 -0
  79. package/ts_web/elements/upl-statuspage-statsgrid.ts +306 -0
  80. package/ts_web/elements/upl-statuspage-statusbar.demo.ts +393 -0
  81. package/ts_web/elements/upl-statuspage-statusbar.ts +281 -20
  82. package/ts_web/elements/upl-statuspage-statusdetails.demo.ts +754 -0
  83. package/ts_web/elements/upl-statuspage-statusdetails.ts +297 -38
  84. package/ts_web/elements/upl-statuspage-statusmonth.demo.ts +876 -0
  85. package/ts_web/elements/upl-statuspage-statusmonth.ts +397 -76
  86. package/ts_web/interfaces/index.ts +95 -0
  87. package/ts_web/pages/index.ts +4 -1
  88. package/ts_web/pages/statuspage-allgreen.ts +412 -0
  89. package/ts_web/pages/statuspage-demo.ts +653 -0
  90. package/ts_web/pages/statuspage-maintenance.ts +570 -0
  91. package/ts_web/pages/statuspage-outage.ts +568 -0
  92. package/ts_web/styles/shared.styles.ts +367 -0
  93. package/dist_ts_web/pages/page1.d.ts +0 -1
  94. package/dist_ts_web/pages/page1.js +0 -11
  95. package/ts_web/pages/page1.ts +0 -11
@@ -0,0 +1,706 @@
1
+ import { html } from '@design.estate/dees-element';
2
+ export const demoFunc = () => html `
3
+ <style>
4
+ .demo-container {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: 20px;
8
+ }
9
+ .demo-section {
10
+ border: 1px solid #ddd;
11
+ border-radius: 8px;
12
+ padding: 20px;
13
+ background: #f5f5f5;
14
+ }
15
+ .demo-title {
16
+ font-size: 14px;
17
+ font-weight: 600;
18
+ margin-bottom: 16px;
19
+ color: #333;
20
+ }
21
+ .demo-controls {
22
+ display: flex;
23
+ gap: 10px;
24
+ margin-top: 16px;
25
+ flex-wrap: wrap;
26
+ }
27
+ .demo-button {
28
+ padding: 6px 12px;
29
+ border: 1px solid #ddd;
30
+ background: white;
31
+ border-radius: 4px;
32
+ cursor: pointer;
33
+ font-size: 13px;
34
+ }
35
+ .demo-button:hover {
36
+ background: #f0f0f0;
37
+ }
38
+ .demo-button.active {
39
+ background: #2196F3;
40
+ color: white;
41
+ border-color: #2196F3;
42
+ }
43
+ .demo-info {
44
+ margin-top: 12px;
45
+ padding: 12px;
46
+ background: white;
47
+ border-radius: 4px;
48
+ font-size: 13px;
49
+ }
50
+ .stats-grid {
51
+ display: grid;
52
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
53
+ gap: 12px;
54
+ margin-top: 12px;
55
+ }
56
+ .stat-box {
57
+ background: white;
58
+ padding: 12px;
59
+ border-radius: 4px;
60
+ text-align: center;
61
+ }
62
+ .stat-value {
63
+ font-size: 20px;
64
+ font-weight: 600;
65
+ color: #2196F3;
66
+ }
67
+ .stat-label {
68
+ font-size: 12px;
69
+ color: #666;
70
+ margin-top: 4px;
71
+ }
72
+ </style>
73
+
74
+ <div class="demo-container">
75
+ <!-- Time Range Demo -->
76
+ <div class="demo-section">
77
+ <div class="demo-title">Different Time Ranges</div>
78
+ <dees-demowrapper
79
+ .runAfterRender=${async (wrapperElement) => {
80
+ const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails');
81
+ // Generate data for different time ranges
82
+ const generateDataForRange = (hours, pattern = 'stable') => {
83
+ const now = Date.now();
84
+ const data = [];
85
+ // For proper display, we need hourly data points that align with actual hours
86
+ for (let i = hours - 1; i >= 0; i--) {
87
+ // Create timestamp at the start of each hour
88
+ const date = new Date();
89
+ date.setMinutes(0, 0, 0);
90
+ date.setHours(date.getHours() - i);
91
+ const timestamp = date.getTime();
92
+ let status = 'operational';
93
+ let responseTime = 50 + Math.random() * 50;
94
+ let errorRate = 0;
95
+ switch (pattern) {
96
+ case 'degrading':
97
+ // Getting worse over time
98
+ const degradation = (hours - i) / hours;
99
+ if (degradation > 0.7) {
100
+ status = 'major_outage';
101
+ responseTime = 800 + Math.random() * 200;
102
+ errorRate = 0.3 + Math.random() * 0.2;
103
+ }
104
+ else if (degradation > 0.5) {
105
+ status = 'partial_outage';
106
+ responseTime = 500 + Math.random() * 200;
107
+ errorRate = 0.1 + Math.random() * 0.1;
108
+ }
109
+ else if (degradation > 0.3) {
110
+ status = 'degraded';
111
+ responseTime = 200 + Math.random() * 100;
112
+ errorRate = 0.02 + Math.random() * 0.03;
113
+ }
114
+ break;
115
+ case 'improving':
116
+ // Getting better over time
117
+ const improvement = i / hours;
118
+ if (improvement < 0.3) {
119
+ status = 'major_outage';
120
+ responseTime = 800 + Math.random() * 200;
121
+ errorRate = 0.3 + Math.random() * 0.2;
122
+ }
123
+ else if (improvement < 0.5) {
124
+ status = 'partial_outage';
125
+ responseTime = 500 + Math.random() * 200;
126
+ errorRate = 0.1 + Math.random() * 0.1;
127
+ }
128
+ else if (improvement < 0.7) {
129
+ status = 'degraded';
130
+ responseTime = 200 + Math.random() * 100;
131
+ errorRate = 0.02 + Math.random() * 0.03;
132
+ }
133
+ break;
134
+ case 'volatile':
135
+ // Random ups and downs
136
+ const rand = Math.random();
137
+ if (rand < 0.05) {
138
+ status = 'major_outage';
139
+ responseTime = 800 + Math.random() * 200;
140
+ errorRate = 0.3 + Math.random() * 0.2;
141
+ }
142
+ else if (rand < 0.1) {
143
+ status = 'partial_outage';
144
+ responseTime = 500 + Math.random() * 200;
145
+ errorRate = 0.1 + Math.random() * 0.1;
146
+ }
147
+ else if (rand < 0.2) {
148
+ status = 'degraded';
149
+ responseTime = 200 + Math.random() * 100;
150
+ errorRate = 0.02 + Math.random() * 0.03;
151
+ }
152
+ else if (rand < 0.25) {
153
+ status = 'maintenance';
154
+ responseTime = 100 + Math.random() * 50;
155
+ errorRate = 0;
156
+ }
157
+ break;
158
+ default:
159
+ // Stable with occasional hiccups
160
+ if (Math.random() < 0.02) {
161
+ status = 'degraded';
162
+ responseTime = 200 + Math.random() * 100;
163
+ errorRate = 0.01 + Math.random() * 0.02;
164
+ }
165
+ }
166
+ data.push({
167
+ timestamp,
168
+ status,
169
+ responseTime,
170
+ errorRate
171
+ });
172
+ }
173
+ return data;
174
+ };
175
+ // Initial setup
176
+ statusDetails.serviceId = 'api-gateway';
177
+ statusDetails.serviceName = 'API Gateway';
178
+ statusDetails.historyData = generateDataForRange(24);
179
+ // Create controls
180
+ const controls = document.createElement('div');
181
+ controls.className = 'demo-controls';
182
+ const timeRanges = [
183
+ { hours: 24, label: '24 Hours' },
184
+ { hours: 168, label: '7 Days' },
185
+ { hours: 720, label: '30 Days' },
186
+ { hours: 2160, label: '90 Days' }
187
+ ];
188
+ timeRanges.forEach((range, index) => {
189
+ const button = document.createElement('button');
190
+ button.className = 'demo-button' + (index === 0 ? ' active' : '');
191
+ button.textContent = range.label;
192
+ button.onclick = () => {
193
+ // Update active button
194
+ controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active'));
195
+ button.classList.add('active');
196
+ // Load new data with loading state
197
+ statusDetails.loading = true;
198
+ setTimeout(() => {
199
+ statusDetails.historyData = generateDataForRange(range.hours, 'volatile');
200
+ statusDetails.loading = false;
201
+ updateStats();
202
+ }, 500);
203
+ };
204
+ controls.appendChild(button);
205
+ });
206
+ wrapperElement.appendChild(controls);
207
+ // Add statistics display
208
+ const statsDiv = document.createElement('div');
209
+ statsDiv.className = 'stats-grid';
210
+ wrapperElement.appendChild(statsDiv);
211
+ const updateStats = () => {
212
+ const data = statusDetails.historyData || [];
213
+ const operational = data.filter(d => d.status === 'operational').length;
214
+ const avgResponseTime = data.reduce((sum, d) => sum + (d.responseTime || 0), 0) / data.length;
215
+ const uptime = (operational / data.length) * 100;
216
+ const incidents = data.filter(d => d.status !== 'operational' && d.status !== 'maintenance').length;
217
+ statsDiv.innerHTML = `
218
+ <div class="stat-box">
219
+ <div class="stat-value">${uptime.toFixed(2)}%</div>
220
+ <div class="stat-label">Uptime</div>
221
+ </div>
222
+ <div class="stat-box">
223
+ <div class="stat-value">${avgResponseTime.toFixed(0)}ms</div>
224
+ <div class="stat-label">Avg Response Time</div>
225
+ </div>
226
+ <div class="stat-box">
227
+ <div class="stat-value">${incidents}</div>
228
+ <div class="stat-label">Incidents</div>
229
+ </div>
230
+ <div class="stat-box">
231
+ <div class="stat-value">${data.length}</div>
232
+ <div class="stat-label">Data Points</div>
233
+ </div>
234
+ `;
235
+ };
236
+ updateStats();
237
+ // Handle bar clicks
238
+ statusDetails.addEventListener('barClick', (event) => {
239
+ const { timestamp, status, responseTime, errorRate } = event.detail;
240
+ const date = new Date(timestamp);
241
+ alert(`Details for ${date.toLocaleString()}:\n\nStatus: ${status}\nResponse Time: ${responseTime.toFixed(0)}ms\nError Rate: ${(errorRate * 100).toFixed(2)}%`);
242
+ });
243
+ }}
244
+ >
245
+ <upl-statuspage-statusdetails></upl-statuspage-statusdetails>
246
+ </dees-demowrapper>
247
+ </div>
248
+
249
+ <!-- Data Pattern Scenarios -->
250
+ <div class="demo-section">
251
+ <div class="demo-title">Different Data Patterns</div>
252
+ <dees-demowrapper
253
+ .runAfterRender=${async (wrapperElement) => {
254
+ const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails');
255
+ // Pattern generators
256
+ const patterns = {
257
+ stable: () => {
258
+ const data = [];
259
+ for (let i = 47; i >= 0; i--) {
260
+ const date = new Date();
261
+ date.setMinutes(0, 0, 0);
262
+ date.setHours(date.getHours() - i);
263
+ data.push({
264
+ timestamp: date.getTime(),
265
+ status: 'operational',
266
+ responseTime: 40 + Math.random() * 20,
267
+ errorRate: 0
268
+ });
269
+ }
270
+ return data;
271
+ },
272
+ degrading: () => {
273
+ const now = Date.now();
274
+ const data = [];
275
+ for (let i = 47; i >= 0; i--) {
276
+ const degradation = (47 - i) / 47;
277
+ let status = 'operational';
278
+ let responseTime = 50;
279
+ let errorRate = 0;
280
+ if (degradation > 0.8) {
281
+ status = 'major_outage';
282
+ responseTime = 800 + Math.random() * 200;
283
+ errorRate = 0.4;
284
+ }
285
+ else if (degradation > 0.6) {
286
+ status = 'partial_outage';
287
+ responseTime = 500 + Math.random() * 100;
288
+ errorRate = 0.2;
289
+ }
290
+ else if (degradation > 0.4) {
291
+ status = 'degraded';
292
+ responseTime = 200 + Math.random() * 100;
293
+ errorRate = 0.05;
294
+ }
295
+ else {
296
+ responseTime = 50 + degradation * 100;
297
+ }
298
+ data.push({
299
+ timestamp: now - (i * 60 * 60 * 1000),
300
+ status,
301
+ responseTime,
302
+ errorRate
303
+ });
304
+ }
305
+ return data;
306
+ },
307
+ recovering: () => {
308
+ const now = Date.now();
309
+ const data = [];
310
+ for (let i = 47; i >= 0; i--) {
311
+ const recovery = i / 47;
312
+ let status = 'operational';
313
+ let responseTime = 50;
314
+ let errorRate = 0;
315
+ if (recovery < 0.2) {
316
+ status = 'operational';
317
+ responseTime = 50 + Math.random() * 20;
318
+ }
319
+ else if (recovery < 0.4) {
320
+ status = 'degraded';
321
+ responseTime = 150 + Math.random() * 50;
322
+ errorRate = 0.02;
323
+ }
324
+ else if (recovery < 0.7) {
325
+ status = 'partial_outage';
326
+ responseTime = 400 + Math.random() * 100;
327
+ errorRate = 0.15;
328
+ }
329
+ else {
330
+ status = 'major_outage';
331
+ responseTime = 800 + Math.random() * 200;
332
+ errorRate = 0.35;
333
+ }
334
+ data.push({
335
+ timestamp: now - (i * 60 * 60 * 1000),
336
+ status,
337
+ responseTime,
338
+ errorRate
339
+ });
340
+ }
341
+ return data;
342
+ },
343
+ periodic: () => {
344
+ const now = Date.now();
345
+ const data = [];
346
+ for (let i = 47; i >= 0; i--) {
347
+ // Issues every 12 hours
348
+ const hourOfDay = i % 24;
349
+ let status = 'operational';
350
+ let responseTime = 50 + Math.random() * 30;
351
+ let errorRate = 0;
352
+ if (hourOfDay >= 9 && hourOfDay <= 11) {
353
+ // Morning peak
354
+ status = 'degraded';
355
+ responseTime = 200 + Math.random() * 100;
356
+ errorRate = 0.05;
357
+ }
358
+ else if (hourOfDay >= 18 && hourOfDay <= 20) {
359
+ // Evening peak
360
+ status = 'degraded';
361
+ responseTime = 250 + Math.random() * 150;
362
+ errorRate = 0.08;
363
+ }
364
+ data.push({
365
+ timestamp: now - (i * 60 * 60 * 1000),
366
+ status,
367
+ responseTime,
368
+ errorRate
369
+ });
370
+ }
371
+ return data;
372
+ },
373
+ maintenance: () => {
374
+ const now = Date.now();
375
+ const data = [];
376
+ for (let i = 47; i >= 0; i--) {
377
+ let status = 'operational';
378
+ let responseTime = 50 + Math.random() * 30;
379
+ let errorRate = 0;
380
+ // Maintenance window from hour 20-24
381
+ if (i >= 20 && i <= 24) {
382
+ status = 'maintenance';
383
+ responseTime = 0;
384
+ errorRate = 0;
385
+ }
386
+ data.push({
387
+ timestamp: now - (i * 60 * 60 * 1000),
388
+ status,
389
+ responseTime,
390
+ errorRate
391
+ });
392
+ }
393
+ return data;
394
+ }
395
+ };
396
+ // Initial setup
397
+ statusDetails.serviceId = 'web-server';
398
+ statusDetails.serviceName = 'Web Server';
399
+ statusDetails.historyData = patterns.stable();
400
+ // Create controls
401
+ const controls = document.createElement('div');
402
+ controls.className = 'demo-controls';
403
+ Object.entries(patterns).forEach(([name, generator]) => {
404
+ const button = document.createElement('button');
405
+ button.className = 'demo-button' + (name === 'stable' ? ' active' : '');
406
+ button.textContent = name.charAt(0).toUpperCase() + name.slice(1);
407
+ button.onclick = () => {
408
+ controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active'));
409
+ button.classList.add('active');
410
+ statusDetails.loading = true;
411
+ setTimeout(() => {
412
+ statusDetails.historyData = generator();
413
+ statusDetails.loading = false;
414
+ updateInfo(name);
415
+ }, 300);
416
+ };
417
+ controls.appendChild(button);
418
+ });
419
+ wrapperElement.appendChild(controls);
420
+ // Add info display
421
+ const info = document.createElement('div');
422
+ info.className = 'demo-info';
423
+ wrapperElement.appendChild(info);
424
+ const updateInfo = (pattern) => {
425
+ const descriptions = {
426
+ stable: 'Service running smoothly with consistent performance',
427
+ degrading: 'Service health deteriorating over time',
428
+ recovering: 'Service recovering from a major outage',
429
+ periodic: 'Regular performance issues during peak hours (9-11 AM and 6-8 PM)',
430
+ maintenance: 'Scheduled maintenance window (hours 20-24)'
431
+ };
432
+ info.innerHTML = `<strong>Pattern:</strong> ${descriptions[pattern] || pattern}`;
433
+ };
434
+ updateInfo('stable');
435
+ }}
436
+ >
437
+ <upl-statuspage-statusdetails></upl-statuspage-statusdetails>
438
+ </dees-demowrapper>
439
+ </div>
440
+
441
+ <!-- Interactive Real-time Updates -->
442
+ <div class="demo-section">
443
+ <div class="demo-title">Real-time Updates with Manual Control</div>
444
+ <dees-demowrapper
445
+ .runAfterRender=${async (wrapperElement) => {
446
+ const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails');
447
+ // Initialize with recent data
448
+ const now = Date.now();
449
+ const initialData = [];
450
+ for (let i = 23; i >= 0; i--) {
451
+ initialData.push({
452
+ timestamp: now - (i * 60 * 60 * 1000),
453
+ status: 'operational',
454
+ responseTime: 50 + Math.random() * 30,
455
+ errorRate: 0
456
+ });
457
+ }
458
+ statusDetails.serviceId = 'real-time-api';
459
+ statusDetails.serviceName = 'Real-time API';
460
+ statusDetails.historyData = initialData;
461
+ statusDetails.timeRange = '24h';
462
+ // Create controls
463
+ const controls = document.createElement('div');
464
+ controls.className = 'demo-controls';
465
+ controls.innerHTML = `
466
+ <button class="demo-button" id="addHealthy">Add Healthy Point</button>
467
+ <button class="demo-button" id="addDegraded">Add Degraded Point</button>
468
+ <button class="demo-button" id="addOutage">Add Outage Point</button>
469
+ <button class="demo-button" id="simulateSpike">Simulate Traffic Spike</button>
470
+ <button class="demo-button" id="clearData">Clear All Data</button>
471
+ `;
472
+ wrapperElement.appendChild(controls);
473
+ const addDataPoint = (status, responseTime, errorRate = 0) => {
474
+ const data = [...(statusDetails.historyData || [])];
475
+ if (data.length >= 24) {
476
+ data.shift(); // Keep only 24 points
477
+ }
478
+ data.push({
479
+ timestamp: Date.now(),
480
+ status,
481
+ responseTime,
482
+ errorRate
483
+ });
484
+ statusDetails.historyData = data;
485
+ };
486
+ controls.querySelector('#addHealthy')?.addEventListener('click', () => {
487
+ addDataPoint('operational', 50 + Math.random() * 30);
488
+ });
489
+ controls.querySelector('#addDegraded')?.addEventListener('click', () => {
490
+ addDataPoint('degraded', 200 + Math.random() * 100, 0.05);
491
+ });
492
+ controls.querySelector('#addOutage')?.addEventListener('click', () => {
493
+ addDataPoint('major_outage', 800 + Math.random() * 200, 0.5);
494
+ });
495
+ controls.querySelector('#simulateSpike')?.addEventListener('click', () => {
496
+ // Add several degraded points
497
+ for (let i = 0; i < 3; i++) {
498
+ setTimeout(() => {
499
+ addDataPoint('degraded', 300 + Math.random() * 200, 0.1 + Math.random() * 0.1);
500
+ }, i * 1000);
501
+ }
502
+ });
503
+ controls.querySelector('#clearData')?.addEventListener('click', () => {
504
+ statusDetails.historyData = [];
505
+ });
506
+ // Auto-update every 5 seconds
507
+ let autoUpdate = setInterval(() => {
508
+ const rand = Math.random();
509
+ if (rand < 0.8) {
510
+ addDataPoint('operational', 40 + Math.random() * 40);
511
+ }
512
+ else if (rand < 0.95) {
513
+ addDataPoint('degraded', 150 + Math.random() * 100, 0.02);
514
+ }
515
+ else {
516
+ addDataPoint('partial_outage', 400 + Math.random() * 200, 0.15);
517
+ }
518
+ }, 5000);
519
+ // Add toggle for auto-updates
520
+ const autoToggle = document.createElement('button');
521
+ autoToggle.className = 'demo-button active';
522
+ autoToggle.textContent = 'Auto-update: ON';
523
+ autoToggle.style.marginLeft = '10px';
524
+ autoToggle.onclick = () => {
525
+ if (autoUpdate) {
526
+ clearInterval(autoUpdate);
527
+ autoUpdate = null;
528
+ autoToggle.textContent = 'Auto-update: OFF';
529
+ autoToggle.classList.remove('active');
530
+ }
531
+ else {
532
+ autoUpdate = setInterval(() => {
533
+ const rand = Math.random();
534
+ if (rand < 0.8) {
535
+ addDataPoint('operational', 40 + Math.random() * 40);
536
+ }
537
+ else if (rand < 0.95) {
538
+ addDataPoint('degraded', 150 + Math.random() * 100, 0.02);
539
+ }
540
+ else {
541
+ addDataPoint('partial_outage', 400 + Math.random() * 200, 0.15);
542
+ }
543
+ }, 5000);
544
+ autoToggle.textContent = 'Auto-update: ON';
545
+ autoToggle.classList.add('active');
546
+ }
547
+ };
548
+ controls.appendChild(autoToggle);
549
+ // Cleanup on unmount
550
+ wrapperElement.addEventListener('remove', () => {
551
+ if (autoUpdate)
552
+ clearInterval(autoUpdate);
553
+ });
554
+ }}
555
+ >
556
+ <upl-statuspage-statusdetails></upl-statuspage-statusdetails>
557
+ </dees-demowrapper>
558
+ </div>
559
+
560
+ <!-- Edge Cases -->
561
+ <div class="demo-section">
562
+ <div class="demo-title">Edge Cases and Special Scenarios</div>
563
+ <dees-demowrapper
564
+ .runAfterRender=${async (wrapperElement) => {
565
+ const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails');
566
+ const scenarios = {
567
+ noData: {
568
+ name: 'No Data Available',
569
+ data: []
570
+ },
571
+ singlePoint: {
572
+ name: 'Single Data Point',
573
+ data: [{
574
+ timestamp: Date.now(),
575
+ status: 'operational',
576
+ responseTime: 75,
577
+ errorRate: 0
578
+ }]
579
+ },
580
+ allDown: {
581
+ name: 'Complete Outage',
582
+ data: Array.from({ length: 48 }, (_, i) => ({
583
+ timestamp: Date.now() - (i * 60 * 60 * 1000),
584
+ status: 'major_outage',
585
+ responseTime: 0,
586
+ errorRate: 1
587
+ }))
588
+ },
589
+ highLatency: {
590
+ name: 'High Latency Issues',
591
+ data: Array.from({ length: 48 }, (_, i) => ({
592
+ timestamp: Date.now() - (i * 60 * 60 * 1000),
593
+ status: 'operational',
594
+ responseTime: 2000 + Math.random() * 1000,
595
+ errorRate: 0
596
+ }))
597
+ },
598
+ mixedStatuses: {
599
+ name: 'All Status Types',
600
+ data: Array.from({ length: 50 }, (_, i) => {
601
+ const statuses = ['operational', 'degraded', 'partial_outage', 'major_outage', 'maintenance'];
602
+ const status = statuses[i % statuses.length];
603
+ return {
604
+ timestamp: Date.now() - (i * 60 * 60 * 1000),
605
+ status,
606
+ responseTime: status === 'operational' ? 50 : status === 'maintenance' ? 0 : 200 + Math.random() * 600,
607
+ errorRate: status === 'operational' || status === 'maintenance' ? 0 : 0.1 + Math.random() * 0.4
608
+ };
609
+ })
610
+ }
611
+ };
612
+ // Initial scenario
613
+ let currentScenario = 'noData';
614
+ statusDetails.serviceId = 'edge-case-service';
615
+ statusDetails.serviceName = 'Edge Case Service';
616
+ statusDetails.historyData = scenarios[currentScenario].data;
617
+ // Create scenario buttons
618
+ const controls = document.createElement('div');
619
+ controls.className = 'demo-controls';
620
+ Object.entries(scenarios).forEach(([key, scenario]) => {
621
+ const button = document.createElement('button');
622
+ button.className = 'demo-button' + (key === currentScenario ? ' active' : '');
623
+ button.textContent = scenario.name;
624
+ button.onclick = () => {
625
+ controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active'));
626
+ button.classList.add('active');
627
+ currentScenario = key;
628
+ statusDetails.loading = true;
629
+ setTimeout(() => {
630
+ statusDetails.historyData = scenario.data;
631
+ statusDetails.loading = false;
632
+ }, 300);
633
+ };
634
+ controls.appendChild(button);
635
+ });
636
+ wrapperElement.appendChild(controls);
637
+ }}
638
+ >
639
+ <upl-statuspage-statusdetails></upl-statuspage-statusdetails>
640
+ </dees-demowrapper>
641
+ </div>
642
+
643
+ <!-- Loading and Error States -->
644
+ <div class="demo-section">
645
+ <div class="demo-title">Loading and Error Handling</div>
646
+ <dees-demowrapper
647
+ .runAfterRender=${async (wrapperElement) => {
648
+ const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails');
649
+ // Start with loading
650
+ statusDetails.loading = true;
651
+ statusDetails.serviceId = 'loading-demo';
652
+ statusDetails.serviceName = 'Loading Demo Service';
653
+ const controls = document.createElement('div');
654
+ controls.className = 'demo-controls';
655
+ controls.innerHTML = `
656
+ <button class="demo-button" id="toggleLoading">Toggle Loading</button>
657
+ <button class="demo-button" id="loadSuccess">Load Successfully</button>
658
+ <button class="demo-button" id="loadError">Simulate Error</button>
659
+ <button class="demo-button" id="loadSlowly">Load Slowly (3s)</button>
660
+ `;
661
+ wrapperElement.appendChild(controls);
662
+ controls.querySelector('#toggleLoading')?.addEventListener('click', () => {
663
+ statusDetails.loading = !statusDetails.loading;
664
+ });
665
+ controls.querySelector('#loadSuccess')?.addEventListener('click', () => {
666
+ statusDetails.loading = true;
667
+ setTimeout(() => {
668
+ const now = Date.now();
669
+ statusDetails.historyData = Array.from({ length: 24 }, (_, i) => ({
670
+ timestamp: now - (i * 60 * 60 * 1000),
671
+ status: Math.random() > 0.9 ? 'degraded' : 'operational',
672
+ responseTime: 50 + Math.random() * 50,
673
+ errorRate: 0
674
+ }));
675
+ statusDetails.loading = false;
676
+ }, 500);
677
+ });
678
+ controls.querySelector('#loadError')?.addEventListener('click', () => {
679
+ statusDetails.loading = true;
680
+ setTimeout(() => {
681
+ statusDetails.loading = false;
682
+ statusDetails.historyData = [];
683
+ statusDetails.errorMessage = 'Failed to load status data: Connection timeout';
684
+ }, 1500);
685
+ });
686
+ controls.querySelector('#loadSlowly')?.addEventListener('click', () => {
687
+ statusDetails.loading = true;
688
+ setTimeout(() => {
689
+ const now = Date.now();
690
+ statusDetails.historyData = Array.from({ length: 48 }, (_, i) => ({
691
+ timestamp: now - (i * 60 * 60 * 1000),
692
+ status: 'operational',
693
+ responseTime: 45 + Math.random() * 30,
694
+ errorRate: 0
695
+ }));
696
+ statusDetails.loading = false;
697
+ }, 3000);
698
+ });
699
+ }}
700
+ >
701
+ <upl-statuspage-statusdetails></upl-statuspage-statusdetails>
702
+ </dees-demowrapper>
703
+ </div>
704
+ </div>
705
+ `;
706
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsLXN0YXR1c3BhZ2Utc3RhdHVzZGV0YWlscy5kZW1vLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL3VwbC1zdGF0dXNwYWdlLXN0YXR1c2RldGFpbHMuZGVtby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHbkQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBNkVSLEtBQUssRUFBRSxjQUFtQixFQUFFLEVBQUU7SUFDOUMsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBUSxDQUFDO0lBRTFGLDBDQUEwQztJQUMxQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBYSxFQUFFLFVBQTZELFFBQVEsRUFBeUIsRUFBRTtRQUMzSSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEdBQTBCLEVBQUUsQ0FBQztRQUV2Qyw4RUFBOEU7UUFDOUUsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyw2Q0FBNkM7WUFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLElBQUksTUFBTSxHQUFrQyxhQUFhLENBQUM7WUFDMUQsSUFBSSxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDM0MsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBRWxCLFFBQVEsT0FBTyxFQUFFLENBQUM7Z0JBQ2hCLEtBQUssV0FBVztvQkFDZCwwQkFBMEI7b0JBQzFCLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDeEMsSUFBSSxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUM7d0JBQ3RCLE1BQU0sR0FBRyxjQUFjLENBQUM7d0JBQ3hCLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQzt3QkFDekMsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO29CQUN4QyxDQUFDO3lCQUFNLElBQUksV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDO3dCQUM3QixNQUFNLEdBQUcsZ0JBQWdCLENBQUM7d0JBQzFCLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQzt3QkFDekMsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO29CQUN4QyxDQUFDO3lCQUFNLElBQUksV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDO3dCQUM3QixNQUFNLEdBQUcsVUFBVSxDQUFDO3dCQUNwQixZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7d0JBQ3pDLFNBQVMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztvQkFDMUMsQ0FBQztvQkFDRCxNQUFNO2dCQUVSLEtBQUssV0FBVztvQkFDZCwyQkFBMkI7b0JBQzNCLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7b0JBQzlCLElBQUksV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDO3dCQUN0QixNQUFNLEdBQUcsY0FBYyxDQUFDO3dCQUN4QixZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7d0JBQ3pDLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFDeEMsQ0FBQzt5QkFBTSxJQUFJLFdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQzt3QkFDN0IsTUFBTSxHQUFHLGdCQUFnQixDQUFDO3dCQUMxQixZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7d0JBQ3pDLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFDeEMsQ0FBQzt5QkFBTSxJQUFJLFdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQzt3QkFDN0IsTUFBTSxHQUFHLFVBQVUsQ0FBQzt3QkFDcEIsWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO3dCQUN6QyxTQUFTLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7b0JBQzFDLENBQUM7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLFVBQVU7b0JBQ2IsdUJBQXVCO29CQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQzNCLElBQUksSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDO3dCQUNoQixNQUFNLEdBQUcsY0FBYyxDQUFDO3dCQUN4QixZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7d0JBQ3pDLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFDeEMsQ0FBQzt5QkFBTSxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQzt3QkFDdEIsTUFBTSxHQUFHLGdCQUFnQixDQUFDO3dCQUMxQixZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7d0JBQ3pDLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFDeEMsQ0FBQzt5QkFBTSxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQzt3QkFDdEIsTUFBTSxHQUFHLFVBQVUsQ0FBQzt3QkFDcEIsWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO3dCQUN6QyxTQUFTLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7b0JBQzFDLENBQUM7eUJBQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUM7d0JBQ3ZCLE1BQU0sR0FBRyxhQUFhLENBQUM7d0JBQ3ZCLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzt3QkFDeEMsU0FBUyxHQUFHLENBQUMsQ0FBQztvQkFDaEIsQ0FBQztvQkFDRCxNQUFNO2dCQUVSO29CQUNFLGlDQUFpQztvQkFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7d0JBQ3pCLE1BQU0sR0FBRyxVQUFVLENBQUM7d0JBQ3BCLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQzt3QkFDekMsU0FBUyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO29CQUMxQyxDQUFDO1lBQ0wsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ1IsU0FBUztnQkFDVCxNQUFNO2dCQUNOLFlBQVk7Z0JBQ1osU0FBUzthQUNWLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGLGdCQUFnQjtJQUNoQixhQUFhLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQztJQUN4QyxhQUFhLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQztJQUMxQyxhQUFhLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXJELGtCQUFrQjtJQUNsQixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLFFBQVEsQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO0lBRXJDLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1FBQ2hDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO1FBQy9CLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1FBQ2hDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0tBQ2xDLENBQUM7SUFFRixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLFNBQVMsR0FBRyxhQUFhLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUNqQyxNQUFNLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtZQUNwQix1QkFBdUI7WUFDdkIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDekYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFL0IsbUNBQW1DO1lBQ25DLGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQzdCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsYUFBYSxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUMxRSxhQUFhLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDOUIsV0FBVyxFQUFFLENBQUM7WUFDaEIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDO1FBQ0YsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUMsQ0FBQztJQUVILGNBQWMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFckMseUJBQXlCO0lBQ3pCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsUUFBUSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUM7SUFDbEMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVyQyxNQUFNLFdBQVcsR0FBRyxHQUFHLEVBQUU7UUFDdkIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3hFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDOUYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxhQUFhLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFcEcsUUFBUSxDQUFDLFNBQVMsR0FBRzs7MENBRVMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Ozs7MENBSWpCLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDOzs7OzBDQUkxQixTQUFTOzs7OzBDQUlULElBQUksQ0FBQyxNQUFNOzs7YUFHeEMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGLFdBQVcsRUFBRSxDQUFDO0lBRWQsb0JBQW9CO0lBQ3BCLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFrQixFQUFFLEVBQUU7UUFDaEUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDcEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakMsS0FBSyxDQUFDLGVBQWUsSUFBSSxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsTUFBTSxvQkFBb0IsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakssQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDOzs7Ozs7Ozs7OzBCQVVpQixLQUFLLEVBQUUsY0FBbUIsRUFBRSxFQUFFO0lBQzlDLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsOEJBQThCLENBQVEsQ0FBQztJQUUxRixxQkFBcUI7SUFDckIsTUFBTSxRQUFRLEdBQUc7UUFDZixNQUFNLEVBQUUsR0FBRyxFQUFFO1lBQ1gsTUFBTSxJQUFJLEdBQTBCLEVBQUUsQ0FBQztZQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ3pCLE1BQU0sRUFBRSxhQUFhO29CQUNyQixZQUFZLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO29CQUNyQyxTQUFTLEVBQUUsQ0FBQztpQkFDYixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksR0FBMEIsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLE1BQU0sR0FBa0MsYUFBYSxDQUFDO2dCQUMxRCxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFFbEIsSUFBSSxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sR0FBRyxjQUFjLENBQUM7b0JBQ3hCLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFDekMsU0FBUyxHQUFHLEdBQUcsQ0FBQztnQkFDbEIsQ0FBQztxQkFBTSxJQUFJLFdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQztvQkFDN0IsTUFBTSxHQUFHLGdCQUFnQixDQUFDO29CQUMxQixZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7b0JBQ3pDLFNBQVMsR0FBRyxHQUFHLENBQUM7Z0JBQ2xCLENBQUM7cUJBQU0sSUFBSSxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUM7b0JBQzdCLE1BQU0sR0FBRyxVQUFVLENBQUM7b0JBQ3BCLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFDekMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDbkIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFlBQVksR0FBRyxFQUFFLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQztnQkFDeEMsQ0FBQztnQkFFRCxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNSLFNBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7b0JBQ3JDLE1BQU07b0JBQ04sWUFBWTtvQkFDWixTQUFTO2lCQUNWLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxVQUFVLEVBQUUsR0FBRyxFQUFFO1lBQ2YsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxHQUEwQixFQUFFLENBQUM7WUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM3QixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixJQUFJLE1BQU0sR0FBa0MsYUFBYSxDQUFDO2dCQUMxRCxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFFbEIsSUFBSSxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUM7b0JBQ25CLE1BQU0sR0FBRyxhQUFhLENBQUM7b0JBQ3ZCLFlBQVksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDekMsQ0FBQztxQkFBTSxJQUFJLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxHQUFHLFVBQVUsQ0FBQztvQkFDcEIsWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO29CQUN4QyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixDQUFDO3FCQUFNLElBQUksUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDO29CQUMxQixNQUFNLEdBQUcsZ0JBQWdCLENBQUM7b0JBQzFCLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFDekMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDbkIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sR0FBRyxjQUFjLENBQUM7b0JBQ3hCLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFDekMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDbkIsQ0FBQztnQkFFRCxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNSLFNBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7b0JBQ3JDLE1BQU07b0JBQ04sWUFBWTtvQkFDWixTQUFTO2lCQUNWLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ2IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxHQUEwQixFQUFFLENBQUM7WUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM3Qix3QkFBd0I7Z0JBQ3hCLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksTUFBTSxHQUFrQyxhQUFhLENBQUM7Z0JBQzFELElBQUksWUFBWSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBRWxCLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxTQUFTLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ3RDLGVBQWU7b0JBQ2YsTUFBTSxHQUFHLFVBQVUsQ0FBQztvQkFDcEIsWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO29CQUN6QyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixDQUFDO3FCQUFNLElBQUksU0FBUyxJQUFJLEVBQUUsSUFBSSxTQUFTLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQzlDLGVBQWU7b0JBQ2YsTUFBTSxHQUFHLFVBQVUsQ0FBQztvQkFDcEIsWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO29CQUN6QyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixDQUFDO2dCQUVELElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztvQkFDckMsTUFBTTtvQkFDTixZQUFZO29CQUNaLFNBQVM7aUJBQ1YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELFdBQVcsRUFBRSxHQUFHLEVBQUU7WUFDaEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxHQUEwQixFQUFFLENBQUM7WUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM3QixJQUFJLE1BQU0sR0FBa0MsYUFBYSxDQUFDO2dCQUMxRCxJQUFJLFlBQVksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUVsQixxQ0FBcUM7Z0JBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ3ZCLE1BQU0sR0FBRyxhQUFhLENBQUM7b0JBQ3ZCLFlBQVksR0FBRyxDQUFDLENBQUM7b0JBQ2pCLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hCLENBQUM7Z0JBRUQsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDUixTQUFTLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO29CQUNyQyxNQUFNO29CQUNOLFlBQVk7b0JBQ1osU0FBUztpQkFDVixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0tBQ0YsQ0FBQztJQUVGLGdCQUFnQjtJQUNoQixhQUFhLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztJQUN2QyxhQUFhLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztJQUN6QyxhQUFhLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUU5QyxrQkFBa0I7SUFDbEIsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxRQUFRLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQztJQUVyQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUU7UUFDckQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsU0FBUyxHQUFHLGFBQWEsR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEUsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsTUFBTSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUU7WUFDcEIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDekYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFL0IsYUFBYSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDN0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxhQUFhLENBQUMsV0FBVyxHQUFHLFNBQVMsRUFBRSxDQUFDO2dCQUN4QyxhQUFhLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDOUIsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQztRQUNGLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxjQUFjLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXJDLG1CQUFtQjtJQUNuQixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO0lBQzdCLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFakMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRTtRQUNyQyxNQUFNLFlBQVksR0FBRztZQUNuQixNQUFNLEVBQUUsc0RBQXNEO1lBQzlELFNBQVMsRUFBRSx3Q0FBd0M7WUFDbkQsVUFBVSxFQUFFLHdDQUF3QztZQUNwRCxRQUFRLEVBQUUsbUVBQW1FO1lBQzdFLFdBQVcsRUFBRSw0Q0FBNEM7U0FDMUQsQ0FBQztRQUVGLElBQUksQ0FBQyxTQUFTLEdBQUcsNkJBQTZCLFlBQVksQ0FBQyxPQUFvQyxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7SUFDaEgsQ0FBQyxDQUFDO0lBRUYsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7Ozs7Ozs7Ozs7MEJBVWlCLEtBQUssRUFBRSxjQUFtQixFQUFFLEVBQUU7SUFDOUMsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBUSxDQUFDO0lBRTFGLDhCQUE4QjtJQUM5QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkIsTUFBTSxXQUFXLEdBQTBCLEVBQUUsQ0FBQztJQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0IsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNmLFNBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDckMsTUFBTSxFQUFFLGFBQWE7WUFDckIsWUFBWSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUNyQyxTQUFTLEVBQUUsQ0FBQztTQUNiLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxhQUFhLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQztJQUMxQyxhQUFhLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQztJQUM1QyxhQUFhLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUN4QyxhQUFhLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUVoQyxrQkFBa0I7SUFDbEIsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxRQUFRLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQztJQUNyQyxRQUFRLENBQUMsU0FBUyxHQUFHOzs7Ozs7V0FNcEIsQ0FBQztJQUNGLGNBQWMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFckMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFxQyxFQUFFLFlBQW9CLEVBQUUsWUFBb0IsQ0FBQyxFQUFFLEVBQUU7UUFDMUcsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxzQkFBc0I7UUFDdEMsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUM7WUFDUixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQixNQUFNO1lBQ04sWUFBWTtZQUNaLFNBQVM7U0FDVixDQUFDLENBQUM7UUFFSCxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDLENBQUM7SUFFRixRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDcEUsWUFBWSxDQUFDLGFBQWEsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ3JFLFlBQVksQ0FBQyxVQUFVLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUQsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDbkUsWUFBWSxDQUFDLGNBQWMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ3ZFLDhCQUE4QjtRQUM5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxZQUFZLENBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDakYsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNuRSxhQUFhLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztJQUVILDhCQUE4QjtJQUM5QixJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNmLFlBQVksQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO2FBQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDdkIsWUFBWSxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1RCxDQUFDO2FBQU0sQ0FBQztZQUNOLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRVQsOEJBQThCO0lBQzlCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsVUFBVSxDQUFDLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztJQUM1QyxVQUFVLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDO0lBQzNDLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztJQUNyQyxVQUFVLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtRQUN4QixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFCLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDbEIsVUFBVSxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztZQUM1QyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNOLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzNCLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO29CQUNmLFlBQVksQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDdkQsQ0FBQztxQkFBTSxJQUFJLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztvQkFDdkIsWUFBWSxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbEUsQ0FBQztZQUNILENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNULFVBQVUsQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7WUFDM0MsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUMsQ0FBQztJQUNGLFFBQVEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFakMscUJBQXFCO0lBQ3JCLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQzdDLElBQUksVUFBVTtZQUFFLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7Ozs7Ozs7Ozs7MEJBVWlCLEtBQUssRUFBRSxjQUFtQixFQUFFLEVBQUU7SUFDOUMsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBUSxDQUFDO0lBRTFGLE1BQU0sU0FBUyxHQUFHO1FBQ2hCLE1BQU0sRUFBRTtZQUNOLElBQUksRUFBRSxtQkFBbUI7WUFDekIsSUFBSSxFQUFFLEVBQUU7U0FDVDtRQUNELFdBQVcsRUFBRTtZQUNYLElBQUksRUFBRSxtQkFBbUI7WUFDekIsSUFBSSxFQUFFLENBQUM7b0JBQ0wsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQ3JCLE1BQU0sRUFBRSxhQUFzQjtvQkFDOUIsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLFNBQVMsRUFBRSxDQUFDO2lCQUNiLENBQUM7U0FDSDtRQUNELE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxpQkFBaUI7WUFDdkIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUM1QyxNQUFNLEVBQUUsY0FBdUI7Z0JBQy9CLFlBQVksRUFBRSxDQUFDO2dCQUNmLFNBQVMsRUFBRSxDQUFDO2FBQ2IsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxXQUFXLEVBQUU7WUFDWCxJQUFJLEVBQUUscUJBQXFCO1lBQzNCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDMUMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDNUMsTUFBTSxFQUFFLGFBQXNCO2dCQUM5QixZQUFZLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJO2dCQUN6QyxTQUFTLEVBQUUsQ0FBQzthQUNiLENBQUMsQ0FBQztTQUNKO1FBQ0QsYUFBYSxFQUFFO1lBQ2IsSUFBSSxFQUFFLGtCQUFrQjtZQUN4QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEMsTUFBTSxRQUFRLEdBQW9DLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQy9ILE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM3QyxPQUFPO29CQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7b0JBQzVDLE1BQU07b0JBQ04sWUFBWSxFQUFFLE1BQU0sS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUc7b0JBQ3RHLFNBQVMsRUFBRSxNQUFNLEtBQUssYUFBYSxJQUFJLE1BQU0sS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHO2lCQUNoRyxDQUFDO1lBQ0osQ0FBQyxDQUFDO1NBQ0g7S0FDRixDQUFDO0lBRUYsbUJBQW1CO0lBQ25CLElBQUksZUFBZSxHQUFHLFFBQVEsQ0FBQztJQUMvQixhQUFhLENBQUMsU0FBUyxHQUFHLG1CQUFtQixDQUFDO0lBQzlDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7SUFDaEQsYUFBYSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDO0lBRTVELDBCQUEwQjtJQUMxQixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLFFBQVEsQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO0lBRXJDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUNwRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxTQUFTLEdBQUcsYUFBYSxHQUFHLENBQUMsR0FBRyxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5RSxNQUFNLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbkMsTUFBTSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUU7WUFDcEIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDekYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFL0IsZUFBZSxHQUFHLEdBQUcsQ0FBQztZQUN0QixhQUFhLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUM3QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLGFBQWEsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDMUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDO1FBQ0YsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUMsQ0FBQztJQUVILGNBQWMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdkMsQ0FBQzs7Ozs7Ozs7OzswQkFVaUIsS0FBSyxFQUFFLGNBQW1CLEVBQUUsRUFBRTtJQUM5QyxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLDhCQUE4QixDQUFRLENBQUM7SUFFMUYscUJBQXFCO0lBQ3JCLGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQzdCLGFBQWEsQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO0lBQ3pDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsc0JBQXNCLENBQUM7SUFFbkQsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxRQUFRLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQztJQUNyQyxRQUFRLENBQUMsU0FBUyxHQUFHOzs7OztXQUtwQixDQUFDO0lBQ0YsY0FBYyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVyQyxRQUFRLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUN2RSxhQUFhLENBQUMsT0FBTyxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNyRSxhQUFhLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUM3QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLGFBQWEsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hFLFNBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7Z0JBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWE7Z0JBQ3hELFlBQVksRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7Z0JBQ3JDLFNBQVMsRUFBRSxDQUFDO2FBQ2IsQ0FBQyxDQUFDLENBQUM7WUFDSixhQUFhLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNoQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNuRSxhQUFhLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUM3QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsYUFBYSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDOUIsYUFBYSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDL0IsYUFBYSxDQUFDLFlBQVksR0FBRyxnREFBZ0QsQ0FBQztRQUNoRixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNwRSxhQUFhLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUM3QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLGFBQWEsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hFLFNBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7Z0JBQ3JDLE1BQU0sRUFBRSxhQUFhO2dCQUNyQixZQUFZLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO2dCQUNyQyxTQUFTLEVBQUUsQ0FBQzthQUNiLENBQUMsQ0FBQyxDQUFDO1lBQ0osYUFBYSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDaEMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDOzs7Ozs7Q0FNUixDQUFDIn0=