@performance-agent/mcp-server 1.0.1 → 1.0.6

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 (45) hide show
  1. package/README.md +400 -25
  2. package/dist/index.d.ts +14 -4
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +783 -47
  5. package/dist/index.js.map +1 -1
  6. package/dist/prompts/jmx_prompt.txt +262 -0
  7. package/dist/prompts/prompts/jmx_prompt.txt +262 -0
  8. package/dist/tools/azure-infra/config-parser.d.ts +14 -0
  9. package/dist/tools/azure-infra/config-parser.d.ts.map +1 -0
  10. package/dist/tools/azure-infra/config-parser.js +361 -0
  11. package/dist/tools/azure-infra/config-parser.js.map +1 -0
  12. package/dist/tools/azure-infra/index.d.ts +52 -0
  13. package/dist/tools/azure-infra/index.d.ts.map +1 -0
  14. package/dist/tools/azure-infra/index.js +448 -0
  15. package/dist/tools/azure-infra/index.js.map +1 -0
  16. package/dist/tools/azure-infra/terraform-generator.d.ts +19 -0
  17. package/dist/tools/azure-infra/terraform-generator.d.ts.map +1 -0
  18. package/dist/tools/azure-infra/terraform-generator.js +458 -0
  19. package/dist/tools/azure-infra/terraform-generator.js.map +1 -0
  20. package/dist/tools/azure-infra/types.d.ts +123 -0
  21. package/dist/tools/azure-infra/types.d.ts.map +1 -0
  22. package/dist/tools/azure-infra/types.js +95 -0
  23. package/dist/tools/azure-infra/types.js.map +1 -0
  24. package/dist/tools/cloud-executor/index.d.ts +78 -0
  25. package/dist/tools/cloud-executor/index.d.ts.map +1 -0
  26. package/dist/tools/cloud-executor/index.js +528 -0
  27. package/dist/tools/cloud-executor/index.js.map +1 -0
  28. package/dist/tools/cloud-executor/result-analyzer.d.ts +65 -0
  29. package/dist/tools/cloud-executor/result-analyzer.d.ts.map +1 -0
  30. package/dist/tools/cloud-executor/result-analyzer.js +367 -0
  31. package/dist/tools/cloud-executor/result-analyzer.js.map +1 -0
  32. package/dist/tools/cloud-executor/vm-metrics.d.ts +87 -0
  33. package/dist/tools/cloud-executor/vm-metrics.d.ts.map +1 -0
  34. package/dist/tools/cloud-executor/vm-metrics.js +506 -0
  35. package/dist/tools/cloud-executor/vm-metrics.js.map +1 -0
  36. package/dist/tools/jmx-generator/index.d.ts +20 -0
  37. package/dist/tools/jmx-generator/index.d.ts.map +1 -0
  38. package/dist/tools/jmx-generator/index.js +115 -0
  39. package/dist/tools/jmx-generator/index.js.map +1 -0
  40. package/dist/tools/jmx-generator/sanitizer.d.ts +19 -0
  41. package/dist/tools/jmx-generator/sanitizer.d.ts.map +1 -0
  42. package/dist/tools/jmx-generator/sanitizer.js +166 -0
  43. package/dist/tools/jmx-generator/sanitizer.js.map +1 -0
  44. package/package.json +5 -2
  45. package/scripts/copy-prompts.js +46 -0
@@ -0,0 +1,367 @@
1
+ /**
2
+ * Performance Test Result Analyzer
3
+ *
4
+ * Provides detailed analysis of JMeter test results including:
5
+ * - Request statistics (throughput, response times, error rates)
6
+ * - Performance trends over time
7
+ * - Azure VM metrics during test execution (CPU, memory, disk, network)
8
+ */
9
+ import { execSync } from 'child_process';
10
+ import * as fs from 'fs';
11
+ import { getVMMetrics } from './vm-metrics.js';
12
+ /**
13
+ * Execute a command and return output
14
+ */
15
+ function runCommand(command, options = {}) {
16
+ try {
17
+ const result = execSync(command, {
18
+ encoding: 'utf-8',
19
+ timeout: options.timeout || 60000,
20
+ cwd: options.cwd,
21
+ stdio: ['pipe', 'pipe', 'pipe'],
22
+ });
23
+ return result.trim();
24
+ }
25
+ catch (error) {
26
+ throw new Error(`Command failed: ${command}\n${error.message}`);
27
+ }
28
+ }
29
+ /**
30
+ * Parse JTL file and extract detailed statistics
31
+ */
32
+ function parseJTLFile(jtlPath) {
33
+ const content = fs.readFileSync(jtlPath, 'utf-8');
34
+ const lines = content.split('\n').filter(line => line.trim() && !line.startsWith('timeStamp'));
35
+ const requests = [];
36
+ const responseTimes = [];
37
+ let totalBytes = 0;
38
+ let successCount = 0;
39
+ let failCount = 0;
40
+ let minTime = Infinity;
41
+ let maxTime = 0;
42
+ let minTimestamp = Infinity;
43
+ let maxTimestamp = 0;
44
+ lines.forEach(line => {
45
+ const parts = line.split(',');
46
+ if (parts.length >= 4) {
47
+ const timestamp = parseInt(parts[0], 10);
48
+ const elapsed = parseInt(parts[1], 10);
49
+ const label = parts[2];
50
+ const responseCode = parts[3];
51
+ const success = parts[7] === 'true' && (responseCode.startsWith('2') || responseCode.startsWith('3'));
52
+ const bytes = parseInt(parts[9] || '0', 10);
53
+ requests.push({ timestamp, elapsed, label, responseCode, success, bytes });
54
+ responseTimes.push(elapsed);
55
+ totalBytes += bytes;
56
+ if (success)
57
+ successCount++;
58
+ else
59
+ failCount++;
60
+ if (elapsed < minTime)
61
+ minTime = elapsed;
62
+ if (elapsed > maxTime)
63
+ maxTime = elapsed;
64
+ if (timestamp < minTimestamp)
65
+ minTimestamp = timestamp;
66
+ if (timestamp > maxTimestamp)
67
+ maxTimestamp = timestamp;
68
+ }
69
+ });
70
+ const totalRequests = requests.length;
71
+ const testDurationSeconds = totalRequests > 0 ? (maxTimestamp - minTimestamp) / 1000 : 0;
72
+ const throughput = testDurationSeconds > 0 ? totalRequests / testDurationSeconds : 0;
73
+ // Calculate percentiles
74
+ const sortedTimes = [...responseTimes].sort((a, b) => a - b);
75
+ const p50 = sortedTimes[Math.floor(sortedTimes.length * 0.50)] || 0;
76
+ const p90 = sortedTimes[Math.floor(sortedTimes.length * 0.90)] || 0;
77
+ const p95 = sortedTimes[Math.floor(sortedTimes.length * 0.95)] || 0;
78
+ const p99 = sortedTimes[Math.floor(sortedTimes.length * 0.99)] || 0;
79
+ const avgResponseTime = totalRequests > 0 ? responseTimes.reduce((a, b) => a + b, 0) / totalRequests : 0;
80
+ const errorRate = totalRequests > 0 ? (failCount / totalRequests) * 100 : 0;
81
+ return {
82
+ requests,
83
+ summary: {
84
+ totalRequests,
85
+ successfulRequests: successCount,
86
+ failedRequests: failCount,
87
+ errorRate,
88
+ avgResponseTime,
89
+ minResponseTime: minTime === Infinity ? 0 : minTime,
90
+ maxResponseTime: maxTime,
91
+ p50ResponseTime: p50,
92
+ p90ResponseTime: p90,
93
+ p95ResponseTime: p95,
94
+ p99ResponseTime: p99,
95
+ throughput,
96
+ testDurationSeconds,
97
+ },
98
+ };
99
+ }
100
+ /**
101
+ * Group requests by label and calculate per-endpoint statistics
102
+ */
103
+ function calculateRequestBreakdown(requests) {
104
+ const breakdown = new Map();
105
+ requests.forEach(req => {
106
+ if (!breakdown.has(req.label)) {
107
+ breakdown.set(req.label, {
108
+ label: req.label,
109
+ count: 0,
110
+ totalTime: 0,
111
+ minTime: Infinity,
112
+ maxTime: 0,
113
+ errorCount: 0,
114
+ times: [],
115
+ });
116
+ }
117
+ const entry = breakdown.get(req.label);
118
+ entry.count++;
119
+ entry.totalTime += req.elapsed;
120
+ entry.times.push(req.elapsed);
121
+ if (req.elapsed < entry.minTime)
122
+ entry.minTime = req.elapsed;
123
+ if (req.elapsed > entry.maxTime)
124
+ entry.maxTime = req.elapsed;
125
+ if (!req.success)
126
+ entry.errorCount++;
127
+ });
128
+ return Array.from(breakdown.values()).map(entry => ({
129
+ label: entry.label,
130
+ count: entry.count,
131
+ avgTime: entry.totalTime / entry.count,
132
+ minTime: entry.minTime === Infinity ? 0 : entry.minTime,
133
+ maxTime: entry.maxTime,
134
+ errorCount: entry.errorCount,
135
+ errorRate: (entry.errorCount / entry.count) * 100,
136
+ }));
137
+ }
138
+ /**
139
+ * Fetch Azure VM metrics during test execution using getVMMetrics tool
140
+ */
141
+ async function fetchAzureVMMetrics(resourceGroup, vmName, startTime, endTime) {
142
+ try {
143
+ console.error('Fetching VM metrics using getVMMetrics tool...');
144
+ const vmMetricsResult = await getVMMetrics({
145
+ resourceGroup: resourceGroup,
146
+ vmName: vmName,
147
+ timeRange: 'custom',
148
+ startTime: startTime.toISOString(),
149
+ endTime: endTime.toISOString(),
150
+ metrics: ['all']
151
+ });
152
+ if (!vmMetricsResult.success) {
153
+ console.error('Failed to fetch VM metrics:', vmMetricsResult);
154
+ return { available: false };
155
+ }
156
+ const metrics = vmMetricsResult.metrics;
157
+ // Transform VM metrics to match TestResultAnalysis interface
158
+ const cpuUsage = metrics.cpu && metrics.cpu.average !== null ? {
159
+ avg: metrics.cpu.average,
160
+ max: metrics.cpu.maximum || metrics.cpu.average,
161
+ min: metrics.cpu.minimum || metrics.cpu.average,
162
+ } : undefined;
163
+ const memoryUsage = metrics.memory && metrics.memory.average !== null ? {
164
+ avg: metrics.memory.average,
165
+ max: metrics.memory.maximum || metrics.memory.average,
166
+ min: metrics.memory.minimum || metrics.memory.average,
167
+ } : undefined;
168
+ const networkIO = metrics.network ? {
169
+ inboundMBps: metrics.network.bytesIn?.average || 0,
170
+ outboundMBps: metrics.network.bytesOut?.average || 0,
171
+ } : undefined;
172
+ const diskIO = metrics.disk ? {
173
+ readMBps: metrics.disk.readBytes?.average || 0,
174
+ writeMBps: metrics.disk.writeBytes?.average || 0,
175
+ } : undefined;
176
+ return {
177
+ available: cpuUsage !== undefined || memoryUsage !== undefined || networkIO !== undefined || diskIO !== undefined,
178
+ cpuUsage,
179
+ memoryUsage,
180
+ networkIO,
181
+ diskIO,
182
+ };
183
+ }
184
+ catch (error) {
185
+ console.error('Error fetching VM metrics:', error.message);
186
+ return { available: false };
187
+ }
188
+ }
189
+ /**
190
+ * Generate insights and recommendations based on test results and VM metrics
191
+ */
192
+ function generateInsights(summary, requestBreakdown, vmMetrics) {
193
+ const insights = [];
194
+ const recommendations = [];
195
+ // Performance insights
196
+ if (summary.errorRate === 0) {
197
+ insights.push('✅ All requests completed successfully with 0% error rate');
198
+ }
199
+ else if (summary.errorRate < 5) {
200
+ insights.push(`⚠️ Low error rate detected (${summary.errorRate.toFixed(2)}%) - may need investigation`);
201
+ recommendations.push('Investigate failed requests to identify potential issues');
202
+ }
203
+ else {
204
+ insights.push(`❌ High error rate detected (${summary.errorRate.toFixed(2)}%) - requires immediate attention`);
205
+ recommendations.push('Review application logs and error responses to identify root cause');
206
+ }
207
+ // Response time analysis
208
+ if (summary.avgResponseTime < 200) {
209
+ insights.push('⚡ Excellent response times - API is performing very well');
210
+ }
211
+ else if (summary.avgResponseTime < 500) {
212
+ insights.push('✅ Good response times - API performance is acceptable');
213
+ }
214
+ else if (summary.avgResponseTime < 1000) {
215
+ insights.push('⚠️ Moderate response times - consider optimization');
216
+ recommendations.push('Profile slow endpoints and optimize database queries or API calls');
217
+ }
218
+ else {
219
+ insights.push('🐌 Slow response times detected - performance optimization needed');
220
+ recommendations.push('Implement caching, optimize database queries, or scale resources');
221
+ }
222
+ // Percentile analysis
223
+ if (summary.p99ResponseTime > summary.avgResponseTime * 3) {
224
+ insights.push(`📊 High variance in response times (P99: ${summary.p99ResponseTime.toFixed(0)}ms vs Avg: ${summary.avgResponseTime.toFixed(0)}ms)`);
225
+ recommendations.push('Investigate outliers - some requests are taking significantly longer');
226
+ }
227
+ // Throughput analysis
228
+ if (summary.throughput > 0) {
229
+ insights.push(`📈 Throughput: ${summary.throughput.toFixed(2)} requests/second over ${summary.testDurationSeconds.toFixed(0)}s`);
230
+ }
231
+ // Per-endpoint analysis
232
+ if (requestBreakdown) {
233
+ const slowestEndpoint = requestBreakdown.reduce((prev, curr) => curr.avgTime > prev.avgTime ? curr : prev);
234
+ if (slowestEndpoint.avgTime > 1000) {
235
+ insights.push(`🎯 Slowest endpoint: ${slowestEndpoint.label} (${slowestEndpoint.avgTime.toFixed(0)}ms avg)`);
236
+ recommendations.push(`Optimize the ${slowestEndpoint.label} endpoint - it's the bottleneck`);
237
+ }
238
+ const errorEndpoints = requestBreakdown.filter(r => r.errorRate > 0);
239
+ if (errorEndpoints.length > 0) {
240
+ insights.push(`⚠️ ${errorEndpoints.length} endpoint(s) have errors`);
241
+ errorEndpoints.forEach(ep => {
242
+ recommendations.push(`Fix errors in ${ep.label} (${ep.errorRate.toFixed(1)}% error rate)`);
243
+ });
244
+ }
245
+ }
246
+ // VM metrics analysis with highlighting for abnormal values
247
+ if (vmMetrics?.available) {
248
+ if (vmMetrics.cpuUsage) {
249
+ const cpuAvg = vmMetrics.cpuUsage.avg.toFixed(1);
250
+ const cpuMax = vmMetrics.cpuUsage.max.toFixed(1);
251
+ if (vmMetrics.cpuUsage.max > 80) {
252
+ insights.push(`🔴 **CRITICAL**: VM CPU Usage - Avg ${cpuAvg}%, Max ${cpuMax}% (VERY HIGH!)`);
253
+ recommendations.push('⚠️ URGENT: CPU utilization exceeded 80% - upgrade to a larger VM size immediately to avoid performance degradation');
254
+ }
255
+ else if (vmMetrics.cpuUsage.avg > 70) {
256
+ insights.push(`🟠 **WARNING**: VM CPU Usage - Avg ${cpuAvg}%, Max ${cpuMax}% (High)`);
257
+ recommendations.push('⚠️ CPU utilization is high - consider upgrading to a larger VM size to maintain headroom');
258
+ }
259
+ else if (vmMetrics.cpuUsage.avg < 20) {
260
+ insights.push(`💻 VM CPU Usage: Avg ${cpuAvg}%, Max ${cpuMax}% (Underutilized)`);
261
+ recommendations.push('💰 CPU utilization is low - consider downsizing VM to reduce costs while maintaining performance');
262
+ }
263
+ else {
264
+ insights.push(`✅ VM CPU Usage: Avg ${cpuAvg}%, Max ${cpuMax}% (Normal)`);
265
+ }
266
+ }
267
+ if (vmMetrics.memoryUsage) {
268
+ const memAvg = vmMetrics.memoryUsage.avg.toFixed(1);
269
+ const memMax = vmMetrics.memoryUsage.max.toFixed(1);
270
+ if (vmMetrics.memoryUsage.max > 90) {
271
+ insights.push(`🔴 **CRITICAL**: VM Memory Usage - Avg ${memAvg}%, Max ${memMax}% (VERY HIGH!)`);
272
+ recommendations.push('⚠️ URGENT: Memory usage exceeded 90% - increase VM memory immediately or risk out-of-memory errors');
273
+ }
274
+ else if (vmMetrics.memoryUsage.avg > 80) {
275
+ insights.push(`🟠 **WARNING**: VM Memory Usage - Avg ${memAvg}%, Max ${memMax}% (High)`);
276
+ recommendations.push('⚠️ Memory usage is high - consider increasing VM memory or optimizing application memory consumption');
277
+ }
278
+ else {
279
+ insights.push(`✅ VM Memory Usage: Avg ${memAvg}%, Max ${memMax}% (Normal)`);
280
+ }
281
+ }
282
+ if (vmMetrics.networkIO) {
283
+ const netIn = vmMetrics.networkIO.inboundMBps.toFixed(2);
284
+ const netOut = vmMetrics.networkIO.outboundMBps.toFixed(2);
285
+ if (vmMetrics.networkIO.inboundMBps > 100 || vmMetrics.networkIO.outboundMBps > 100) {
286
+ insights.push(`🟠 **WARNING**: High Network Traffic - ${netIn} MB/s in, ${netOut} MB/s out`);
287
+ recommendations.push('⚠️ Network bandwidth is high - ensure VM network tier can handle the load or consider upgrading');
288
+ }
289
+ else {
290
+ insights.push(`🌐 Network I/O: ${netIn} MB/s in, ${netOut} MB/s out (Normal)`);
291
+ }
292
+ }
293
+ if (vmMetrics.diskIO) {
294
+ const diskRead = vmMetrics.diskIO.readMBps.toFixed(2);
295
+ const diskWrite = vmMetrics.diskIO.writeMBps.toFixed(2);
296
+ if (vmMetrics.diskIO.readMBps > 50 || vmMetrics.diskIO.writeMBps > 50) {
297
+ insights.push(`🟠 **WARNING**: High Disk I/O - ${diskRead} MB/s read, ${diskWrite} MB/s write`);
298
+ recommendations.push('⚠️ Disk I/O is high - consider using Premium SSD or optimizing disk operations');
299
+ }
300
+ else {
301
+ insights.push(`💾 Disk I/O: ${diskRead} MB/s read, ${diskWrite} MB/s write (Normal)`);
302
+ }
303
+ }
304
+ }
305
+ else {
306
+ insights.push('ℹ️ VM metrics not available - ensure Azure Monitor is enabled and VM has been running during test period');
307
+ recommendations.push('Enable Azure Monitor diagnostics on the VM to collect performance metrics for future tests');
308
+ }
309
+ return { insights, recommendations };
310
+ }
311
+ /**
312
+ * Main function: Analyze performance test results
313
+ */
314
+ export async function analyzeTestResults(resultFilePath, resourceGroup, vmName, testStartTime, testEndTime) {
315
+ try {
316
+ // Validate result file exists
317
+ if (!fs.existsSync(resultFilePath)) {
318
+ throw new Error(`Result file not found: ${resultFilePath}`);
319
+ }
320
+ console.error(`Analyzing test results from: ${resultFilePath}`);
321
+ // Parse JTL file
322
+ const { requests, summary } = parseJTLFile(resultFilePath);
323
+ // Calculate per-request breakdown
324
+ const requestBreakdown = calculateRequestBreakdown(requests);
325
+ // Fetch VM metrics if available
326
+ let vmMetrics;
327
+ if (resourceGroup && vmName && testStartTime && testEndTime) {
328
+ console.error('Fetching Azure VM metrics...');
329
+ vmMetrics = await fetchAzureVMMetrics(resourceGroup, vmName, new Date(testStartTime), new Date(testEndTime));
330
+ }
331
+ // Generate insights and recommendations
332
+ const { insights, recommendations } = generateInsights(summary, requestBreakdown, vmMetrics);
333
+ return {
334
+ success: true,
335
+ resultFile: resultFilePath,
336
+ summary,
337
+ requestBreakdown,
338
+ vmMetrics,
339
+ insights,
340
+ recommendations,
341
+ };
342
+ }
343
+ catch (error) {
344
+ return {
345
+ success: false,
346
+ error: error.message,
347
+ summary: {
348
+ totalRequests: 0,
349
+ successfulRequests: 0,
350
+ failedRequests: 0,
351
+ errorRate: 0,
352
+ avgResponseTime: 0,
353
+ minResponseTime: 0,
354
+ maxResponseTime: 0,
355
+ p50ResponseTime: 0,
356
+ p90ResponseTime: 0,
357
+ p95ResponseTime: 0,
358
+ p99ResponseTime: 0,
359
+ throughput: 0,
360
+ testDurationSeconds: 0,
361
+ },
362
+ insights: [],
363
+ recommendations: [],
364
+ };
365
+ }
366
+ }
367
+ //# sourceMappingURL=result-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-analyzer.js","sourceRoot":"","sources":["../../../src/tools/cloud-executor/result-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Azure VM Metrics Fetcher
3
+ *
4
+ * Fetches performance metrics (CPU, Memory, Network, Disk) from Azure Monitor
5
+ * for VMs provisioned during performance testing.
6
+ */
7
+ export interface VMMetricsConfig {
8
+ resourceGroup: string;
9
+ vmName?: string;
10
+ timeRange?: '1h' | '6h' | '24h' | 'custom';
11
+ startTime?: string;
12
+ endTime?: string;
13
+ metrics?: Array<'cpu' | 'memory' | 'network' | 'disk' | 'all'>;
14
+ terraformDir?: string;
15
+ }
16
+ export interface VMMetrics {
17
+ success: boolean;
18
+ resourceGroup: string;
19
+ vmName: string;
20
+ timeRange: string;
21
+ startTime: string;
22
+ endTime: string;
23
+ metrics: {
24
+ cpu?: {
25
+ average: number;
26
+ maximum: number;
27
+ minimum: number;
28
+ unit: string;
29
+ datapoints: number;
30
+ status: 'normal' | 'warning' | 'critical';
31
+ analysis: string;
32
+ };
33
+ memory?: {
34
+ average: number;
35
+ maximum: number;
36
+ minimum: number;
37
+ unit: string;
38
+ datapoints: number;
39
+ status: 'normal' | 'warning' | 'critical';
40
+ analysis: string;
41
+ };
42
+ network?: {
43
+ bytesIn: {
44
+ total: number;
45
+ average: number;
46
+ maximum: number;
47
+ unit: string;
48
+ };
49
+ bytesOut: {
50
+ total: number;
51
+ average: number;
52
+ maximum: number;
53
+ unit: string;
54
+ };
55
+ status: 'normal' | 'warning' | 'critical';
56
+ analysis: string;
57
+ };
58
+ disk?: {
59
+ readBytes: {
60
+ total: number;
61
+ average: number;
62
+ maximum: number;
63
+ unit: string;
64
+ };
65
+ writeBytes: {
66
+ total: number;
67
+ average: number;
68
+ maximum: number;
69
+ unit: string;
70
+ };
71
+ iops: {
72
+ read: number;
73
+ write: number;
74
+ };
75
+ status: 'normal' | 'warning' | 'critical';
76
+ analysis: string;
77
+ };
78
+ };
79
+ anomalies: string[];
80
+ summary: string;
81
+ error?: string;
82
+ }
83
+ /**
84
+ * Fetch VM metrics from Azure Monitor
85
+ */
86
+ export declare function getVMMetrics(config: VMMetricsConfig): Promise<VMMetrics>;
87
+ //# sourceMappingURL=vm-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vm-metrics.d.ts","sourceRoot":"","sources":["../../../src/tools/cloud-executor/vm-metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,GAAG,CAAC,EAAE;YACJ,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;YAC1C,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,MAAM,CAAC,EAAE;YACP,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;YAC1C,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,OAAO,CAAC,EAAE;YACR,OAAO,EAAE;gBACP,KAAK,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,MAAM,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;YACF,QAAQ,EAAE;gBACR,KAAK,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,MAAM,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;YACF,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;YAC1C,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,IAAI,CAAC,EAAE;YACL,SAAS,EAAE;gBACT,KAAK,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,MAAM,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;YACF,UAAU,EAAE;gBACV,KAAK,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,MAAM,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;YACF,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM,CAAC;gBACb,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;YACF,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;YAC1C,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;KACH,CAAC;IACF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6HD;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAyb9E"}