bobs-workshop 0.1.4

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 (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +252 -0
  3. package/bin/bobs-mcp.js +130 -0
  4. package/dist/api/taskLogger.js +106 -0
  5. package/dist/api/taskLogger.js.map +1 -0
  6. package/dist/cli/checker.js +401 -0
  7. package/dist/cli/checker.js.map +1 -0
  8. package/dist/cli/cleanup.js +131 -0
  9. package/dist/cli/cleanup.js.map +1 -0
  10. package/dist/cli/debug.js +157 -0
  11. package/dist/cli/debug.js.map +1 -0
  12. package/dist/cli/health.js +97 -0
  13. package/dist/cli/health.js.map +1 -0
  14. package/dist/cli/setup.js +81 -0
  15. package/dist/cli/setup.js.map +1 -0
  16. package/dist/cli/workshop.js +42 -0
  17. package/dist/cli/workshop.js.map +1 -0
  18. package/dist/dashboard/server.js +1206 -0
  19. package/dist/dashboard/server.js.map +1 -0
  20. package/dist/index.js +757 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/prompts/architect.js +157 -0
  23. package/dist/prompts/architect.js.map +1 -0
  24. package/dist/prompts/debugger.js +201 -0
  25. package/dist/prompts/debugger.js.map +1 -0
  26. package/dist/prompts/engineer.js +171 -0
  27. package/dist/prompts/engineer.js.map +1 -0
  28. package/dist/prompts/orchestrator.js +225 -0
  29. package/dist/prompts/orchestrator.js.map +1 -0
  30. package/dist/prompts/reviewer.js +199 -0
  31. package/dist/prompts/reviewer.js.map +1 -0
  32. package/dist/services/activitySummarizer.js +353 -0
  33. package/dist/services/activitySummarizer.js.map +1 -0
  34. package/dist/services/changeValidator.js +396 -0
  35. package/dist/services/changeValidator.js.map +1 -0
  36. package/dist/services/claudeOrchestrator.js +343 -0
  37. package/dist/services/claudeOrchestrator.js.map +1 -0
  38. package/dist/services/fileMonitor.js +250 -0
  39. package/dist/services/fileMonitor.js.map +1 -0
  40. package/dist/services/implementationSummarizer.js +306 -0
  41. package/dist/services/implementationSummarizer.js.map +1 -0
  42. package/dist/services/liveMonitor.js +315 -0
  43. package/dist/services/liveMonitor.js.map +1 -0
  44. package/dist/services/mcpAuditLogger.js +104 -0
  45. package/dist/services/mcpAuditLogger.js.map +1 -0
  46. package/dist/services/mcpLogger.js +223 -0
  47. package/dist/services/mcpLogger.js.map +1 -0
  48. package/dist/services/tmuxManager.js +541 -0
  49. package/dist/services/tmuxManager.js.map +1 -0
  50. package/dist/tools/approvalTools.js +244 -0
  51. package/dist/tools/approvalTools.js.map +1 -0
  52. package/dist/tools/autoDebugger.js +147 -0
  53. package/dist/tools/autoDebugger.js.map +1 -0
  54. package/dist/tools/cleanupService.js +221 -0
  55. package/dist/tools/cleanupService.js.map +1 -0
  56. package/dist/tools/dashboardTools.js +359 -0
  57. package/dist/tools/dashboardTools.js.map +1 -0
  58. package/dist/tools/developmentNudges.js +336 -0
  59. package/dist/tools/developmentNudges.js.map +1 -0
  60. package/dist/tools/gitTools.js +741 -0
  61. package/dist/tools/gitTools.js.map +1 -0
  62. package/dist/tools/orchestratorTools.js +765 -0
  63. package/dist/tools/orchestratorTools.js.map +1 -0
  64. package/dist/tools/searchTools.js +788 -0
  65. package/dist/tools/searchTools.js.map +1 -0
  66. package/dist/tools/specTools.js +350 -0
  67. package/dist/tools/specTools.js.map +1 -0
  68. package/dist/tools/tmuxTools.js +100 -0
  69. package/dist/tools/tmuxTools.js.map +1 -0
  70. package/dist/tools/workRecorder.js +215 -0
  71. package/dist/tools/workRecorder.js.map +1 -0
  72. package/dist/tools/worktreeTools.js +705 -0
  73. package/dist/tools/worktreeTools.js.map +1 -0
  74. package/dist/utils/__tests__/integration.test.js +57 -0
  75. package/dist/utils/__tests__/integration.test.js.map +1 -0
  76. package/dist/utils/__tests__/serverDetection.test.js +151 -0
  77. package/dist/utils/__tests__/serverDetection.test.js.map +1 -0
  78. package/dist/utils/errorHandling.js +336 -0
  79. package/dist/utils/errorHandling.js.map +1 -0
  80. package/dist/utils/processManager.js +172 -0
  81. package/dist/utils/processManager.js.map +1 -0
  82. package/dist/utils/reliability.js +263 -0
  83. package/dist/utils/reliability.js.map +1 -0
  84. package/dist/utils/responseFormatter.js +250 -0
  85. package/dist/utils/responseFormatter.js.map +1 -0
  86. package/dist/utils/serverDetection.js +133 -0
  87. package/dist/utils/serverDetection.js.map +1 -0
  88. package/dist/utils/specMigration.js +105 -0
  89. package/dist/utils/specMigration.js.map +1 -0
  90. package/dist/validation/schemas.js +299 -0
  91. package/dist/validation/schemas.js.map +1 -0
  92. package/package.json +79 -0
  93. package/scripts/init-workspace.js +63 -0
  94. package/scripts/install-search-tools.js +116 -0
@@ -0,0 +1,157 @@
1
+ // src/cli/debug.ts
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ export async function runDebug() {
7
+ console.log('šŸ”§ Bob\'s Workshop Debug Information\n');
8
+ console.log('━'.repeat(50));
9
+ try {
10
+ // Basic system information
11
+ console.log('\nšŸ’» System Information:');
12
+ console.log(` Node.js: ${process.version}`);
13
+ console.log(` Platform: ${process.platform} ${process.arch}`);
14
+ console.log(` Working Directory: ${process.cwd()}`);
15
+ console.log(` Process ID: ${process.pid}`);
16
+ console.log(` Uptime: ${Math.floor(process.uptime())}s`);
17
+ // Memory usage
18
+ const memUsage = process.memoryUsage();
19
+ console.log('\nšŸ’¾ Memory Usage:');
20
+ console.log(` RSS: ${Math.round(memUsage.rss / 1024 / 1024)}MB`);
21
+ console.log(` Heap Used: ${Math.round(memUsage.heapUsed / 1024 / 1024)}MB`);
22
+ console.log(` Heap Total: ${Math.round(memUsage.heapTotal / 1024 / 1024)}MB`);
23
+ console.log(` External: ${Math.round(memUsage.external / 1024 / 1024)}MB`);
24
+ // Environment variables
25
+ console.log('\nšŸŒ Environment:');
26
+ console.log(` NODE_ENV: ${process.env.NODE_ENV || 'not set'}`);
27
+ console.log(` PATH length: ${(process.env.PATH || '').split(':').length} entries`);
28
+ // Project structure
29
+ console.log('\nšŸ“ Project Structure:');
30
+ await checkProjectStructure();
31
+ // Dependencies
32
+ console.log('\nšŸ“¦ Dependencies:');
33
+ await checkDependencies();
34
+ // Bob's Workshop specific
35
+ console.log('\nšŸ”§ Bob\'s Workshop:');
36
+ await checkBobWorkshop();
37
+ // Process information
38
+ console.log('\nāš™ļø Process Information:');
39
+ console.log(` Arguments: ${process.argv.slice(2).join(' ') || 'none'}`);
40
+ console.log(` Exit handlers: ${process.listenerCount('exit')}`);
41
+ console.log(` Error handlers: ${process.listenerCount('error')}`);
42
+ console.log('\n━'.repeat(50));
43
+ console.log('šŸŽ‰ Debug information collected successfully!');
44
+ console.log('\nUse this information for troubleshooting or bug reports.');
45
+ }
46
+ catch (error) {
47
+ console.log('\nāŒ Error collecting debug information:');
48
+ console.log(` ${error instanceof Error ? error.message : String(error)}`);
49
+ }
50
+ }
51
+ async function checkProjectStructure() {
52
+ const projectRoot = process.cwd();
53
+ const items = [
54
+ 'package.json',
55
+ 'src/',
56
+ 'dist/',
57
+ '.bob/',
58
+ 'node_modules/',
59
+ 'public/',
60
+ 'bin/'
61
+ ];
62
+ for (const item of items) {
63
+ const itemPath = path.join(projectRoot, item);
64
+ try {
65
+ const exists = await fs.pathExists(itemPath);
66
+ const icon = exists ? 'āœ…' : 'āŒ';
67
+ console.log(` ${icon} ${item}`);
68
+ if (exists && item.endsWith('/')) {
69
+ const stat = await fs.stat(itemPath);
70
+ if (stat.isDirectory()) {
71
+ const files = await fs.readdir(itemPath);
72
+ console.log(` (${files.length} items)`);
73
+ }
74
+ }
75
+ }
76
+ catch (error) {
77
+ console.log(` ā“ ${item} (check failed)`);
78
+ }
79
+ }
80
+ }
81
+ async function checkDependencies() {
82
+ try {
83
+ const packagePath = path.join(process.cwd(), 'package.json');
84
+ const packageData = await fs.readJson(packagePath);
85
+ console.log(` Package: ${packageData.name}@${packageData.version}`);
86
+ const deps = packageData.dependencies || {};
87
+ const devDeps = packageData.devDependencies || {};
88
+ console.log(` Dependencies: ${Object.keys(deps).length}`);
89
+ console.log(` Dev Dependencies: ${Object.keys(devDeps).length}`);
90
+ // Check critical dependencies
91
+ const critical = ['@modelcontextprotocol/sdk', 'express', 'chokidar'];
92
+ for (const dep of critical) {
93
+ const hasIt = dep in deps || dep in devDeps;
94
+ const icon = hasIt ? 'āœ…' : 'āŒ';
95
+ console.log(` ${icon} ${dep}`);
96
+ }
97
+ }
98
+ catch (error) {
99
+ console.log(` āŒ Cannot read package.json: ${error}`);
100
+ }
101
+ }
102
+ async function checkBobWorkshop() {
103
+ const projectRoot = process.cwd();
104
+ // Check .bob directory
105
+ const bobDir = path.join(projectRoot, '.bob');
106
+ try {
107
+ const exists = await fs.pathExists(bobDir);
108
+ console.log(` .bob directory: ${exists ? 'āœ… exists' : 'āŒ missing'}`);
109
+ if (exists) {
110
+ const specsDir = path.join(bobDir, 'specs');
111
+ const specsExists = await fs.pathExists(specsDir);
112
+ console.log(` .bob/specs: ${specsExists ? 'āœ… exists' : 'āŒ missing'}`);
113
+ if (specsExists) {
114
+ const indexFile = path.join(specsDir, 'index.json');
115
+ const indexExists = await fs.pathExists(indexFile);
116
+ console.log(` specs index: ${indexExists ? 'āœ… exists' : 'āŒ missing'}`);
117
+ if (indexExists) {
118
+ const index = await fs.readJson(indexFile);
119
+ const specCount = index.specs ? index.specs.length : 0;
120
+ console.log(` specs count: ${specCount}`);
121
+ }
122
+ }
123
+ }
124
+ }
125
+ catch (error) {
126
+ console.log(` āŒ Error checking .bob: ${error}`);
127
+ }
128
+ // Check build status
129
+ const distDir = path.join(projectRoot, 'dist');
130
+ try {
131
+ const distExists = await fs.pathExists(distDir);
132
+ console.log(` Build status: ${distExists ? 'āœ… built' : 'āŒ not built'}`);
133
+ if (distExists) {
134
+ const mainFile = path.join(distDir, 'index.js');
135
+ const mainExists = await fs.pathExists(mainFile);
136
+ console.log(` Main file: ${mainExists ? 'āœ… exists' : 'āŒ missing'}`);
137
+ }
138
+ }
139
+ catch (error) {
140
+ console.log(` āŒ Error checking build: ${error}`);
141
+ }
142
+ // Check manifest
143
+ const manifestPath = path.join(projectRoot, 'public/.well-known/mcp/manifest.json');
144
+ try {
145
+ const manifestExists = await fs.pathExists(manifestPath);
146
+ console.log(` MCP manifest: ${manifestExists ? 'āœ… exists' : 'āŒ missing'}`);
147
+ if (manifestExists) {
148
+ const manifest = await fs.readJson(manifestPath);
149
+ const toolCount = manifest.tools ? Object.keys(manifest.tools).length : 0;
150
+ console.log(` MCP tools: ${toolCount}`);
151
+ }
152
+ }
153
+ catch (error) {
154
+ console.log(` āŒ Error checking manifest: ${error}`);
155
+ }
156
+ }
157
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/cli/debug.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ // src/cli/health.ts
2
+ import { globalHealthChecker } from '../utils/reliability.js';
3
+ export async function runHealthCheck() {
4
+ console.log('šŸ”§ Bob\'s Workshop Health Check\n');
5
+ console.log('━'.repeat(50));
6
+ try {
7
+ // Initialize health checks (similar to MCP server)
8
+ await initializeHealthChecks();
9
+ // Run all health checks
10
+ const healthResults = await globalHealthChecker.checkHealth();
11
+ const isHealthy = globalHealthChecker.isHealthy();
12
+ // Get error statistics (simplified for CLI)
13
+ const errorStats = { total: 0, by_category: {}, by_severity: {} };
14
+ // Get system information
15
+ const systemInfo = {
16
+ uptime: process.uptime(),
17
+ memory_usage: process.memoryUsage(),
18
+ node_version: process.version,
19
+ platform: process.platform,
20
+ pid: process.pid
21
+ };
22
+ // Display results
23
+ console.log('\nšŸ„ Health Check Results:\n');
24
+ // System Information
25
+ console.log('šŸ“Š System Information:');
26
+ console.log(` Node.js: ${systemInfo.node_version}`);
27
+ console.log(` Platform: ${systemInfo.platform}`);
28
+ console.log(` Uptime: ${Math.floor(systemInfo.uptime)}s`);
29
+ console.log(` Memory: ${Math.round(systemInfo.memory_usage.rss / 1024 / 1024)}MB RSS\n`);
30
+ // Component Health
31
+ console.log('šŸ” Component Health:');
32
+ for (const [component, healthy] of Object.entries(healthResults)) {
33
+ const icon = healthy ? 'āœ…' : 'āŒ';
34
+ const status = healthy ? 'healthy' : 'degraded';
35
+ console.log(` ${icon} ${component}: ${status}`);
36
+ }
37
+ // Error Statistics
38
+ console.log('\nšŸ“ˆ Error Statistics:');
39
+ console.log(' āœ… Error tracking via CLI (check MCP for detailed stats)');
40
+ // Overall Status
41
+ console.log('\n━'.repeat(50));
42
+ if (isHealthy) {
43
+ console.log('šŸŽ‰ Bob\'s Workshop is healthy and operational!');
44
+ console.log('\nAll systems are functioning properly.');
45
+ }
46
+ else {
47
+ console.log('āš ļø Bob\'s Workshop has some health issues.');
48
+ console.log('\nSome components may need attention.');
49
+ }
50
+ }
51
+ catch (error) {
52
+ console.log('\nāŒ Health check failed:');
53
+ console.log(` Error: ${error instanceof Error ? error.message : String(error)}`);
54
+ console.log('\nšŸ”§ Basic system information:');
55
+ console.log(` Node.js: ${process.version}`);
56
+ console.log(` Platform: ${process.platform}`);
57
+ console.log(` Uptime: ${Math.floor(process.uptime())}s`);
58
+ }
59
+ }
60
+ async function initializeHealthChecks() {
61
+ // MCP server health check
62
+ globalHealthChecker.register('mcp_server', async () => {
63
+ try {
64
+ // Basic functionality check
65
+ return process.uptime() > 0;
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ });
71
+ // File system health check
72
+ globalHealthChecker.register('file_system', async () => {
73
+ try {
74
+ const fs = await import('fs-extra');
75
+ const path = await import('path');
76
+ const testPath = path.resolve(process.cwd(), '.bob');
77
+ await fs.ensureDir(testPath);
78
+ return true;
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ });
84
+ // Dashboard service check
85
+ globalHealthChecker.register('dashboard', async () => {
86
+ try {
87
+ // Check if we can create the dashboard server
88
+ const { createDashboardServer } = await import('../dashboard/server.js');
89
+ const app = createDashboardServer();
90
+ return app !== null;
91
+ }
92
+ catch {
93
+ return false;
94
+ }
95
+ });
96
+ }
97
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/cli/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ // src/cli/setup.ts
2
+ import { exec } from 'child_process';
3
+ import { promisify } from 'util';
4
+ import { existsSync } from 'fs';
5
+ import path from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ import fs from 'fs-extra';
8
+ const execAsync = promisify(exec);
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ export async function runSetup() {
11
+ console.log('šŸ”§ Bob\'s Workshop MCP Setup');
12
+ console.log('This will help you configure Bob\'s Workshop for Claude Code integration.\n');
13
+ console.log('━'.repeat(60));
14
+ try {
15
+ // Quick verification that everything is installed
16
+ await quickVerification();
17
+ // Generate MCP client config
18
+ await generateMcpConfig();
19
+ console.log('\nšŸŽ‰ MCP Configuration completed!');
20
+ console.log('\nšŸ“‹ Next steps:');
21
+ console.log('1. Copy the configuration from claude-mcp-config.json');
22
+ console.log('2. Add it to your Claude Code MCP settings');
23
+ console.log('3. Restart Claude Code');
24
+ console.log('4. Use Bob\'s Workshop tools in your chats!');
25
+ console.log('');
26
+ console.log('šŸ’” You can also run:');
27
+ console.log(' bobs workshop # Launch the dashboard');
28
+ console.log(' bobs --check # Verify installation');
29
+ }
30
+ catch (error) {
31
+ console.error('\nāŒ Setup failed:', error instanceof Error ? error.message : String(error));
32
+ console.log('\nTry running: bobs --check');
33
+ process.exit(1);
34
+ }
35
+ }
36
+ async function quickVerification() {
37
+ console.log('\nšŸ” Verifying Bob\'s Workshop installation...');
38
+ const projectRoot = path.resolve(__dirname, '../..');
39
+ const criticalFiles = [
40
+ 'dist/index.js',
41
+ 'dist/dashboard/server.js'
42
+ ];
43
+ for (const file of criticalFiles) {
44
+ const filePath = path.join(projectRoot, file);
45
+ if (!existsSync(filePath)) {
46
+ throw new Error(`Installation incomplete - missing: ${file}. Try reinstalling with: npm install -g bobs-workshop`);
47
+ }
48
+ }
49
+ console.log(' āœ… Installation verified');
50
+ }
51
+ async function generateMcpConfig() {
52
+ console.log('\n5ļøāƒ£ Generating MCP configuration...');
53
+ const projectRoot = path.resolve(__dirname, '../..');
54
+ const configPath = path.join(projectRoot, 'claude-mcp-config.json');
55
+ const config = {
56
+ "mcpServers": {
57
+ "bobs-mcp": {
58
+ "command": "node",
59
+ "args": [path.join(projectRoot, "dist/index.js")],
60
+ "cwd": projectRoot,
61
+ "env": {
62
+ "NODE_ENV": "production"
63
+ }
64
+ }
65
+ }
66
+ };
67
+ try {
68
+ await fs.writeJson(configPath, config, { spaces: 2 });
69
+ console.log(' šŸ“„ MCP configuration generated');
70
+ console.log(` šŸ“ Location: ${configPath}`);
71
+ console.log('\n šŸ’” To use with Claude Code:');
72
+ console.log(' 1. Copy the contents of claude-mcp-config.json');
73
+ console.log(' 2. Add to your Claude Code MCP settings');
74
+ console.log(' 3. Restart Claude Code');
75
+ }
76
+ catch (error) {
77
+ console.log(' āš ļø Could not generate MCP config file');
78
+ console.log(' šŸ’” You can create this manually in your Claude Code settings');
79
+ }
80
+ }
81
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from 'child_process';
3
+ import { join, dirname } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ export async function runWorkshop() {
8
+ console.log('šŸ”§ Starting Bob\'s Workshop dashboard...\n');
9
+ try {
10
+ // Get the path to the dashboard server
11
+ const dashboardPath = join(__dirname, '../dashboard/server.js');
12
+ // Spawn the dashboard process
13
+ const dashboardProcess = spawn('node', [dashboardPath], {
14
+ stdio: 'inherit',
15
+ cwd: process.cwd()
16
+ });
17
+ // Handle process exit
18
+ dashboardProcess.on('close', (code) => {
19
+ if (code !== 0) {
20
+ console.log(`\nāŒ Bob's Workshop dashboard exited with code ${code}`);
21
+ }
22
+ else {
23
+ console.log(`\nāœ… Bob's Workshop dashboard stopped gracefully`);
24
+ }
25
+ });
26
+ // Handle SIGINT (Ctrl+C) to gracefully shutdown
27
+ process.on('SIGINT', () => {
28
+ console.log('\nšŸ›‘ Stopping Bob\'s Workshop dashboard...');
29
+ dashboardProcess.kill('SIGINT');
30
+ });
31
+ // Handle SIGTERM
32
+ process.on('SIGTERM', () => {
33
+ console.log('\nšŸ›‘ Stopping Bob\'s Workshop dashboard...');
34
+ dashboardProcess.kill('SIGTERM');
35
+ });
36
+ }
37
+ catch (error) {
38
+ console.error('āŒ Failed to start Bob\'s Workshop dashboard:', error instanceof Error ? error.message : String(error));
39
+ process.exit(1);
40
+ }
41
+ }
42
+ //# sourceMappingURL=workshop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workshop.js","sourceRoot":"","sources":["../../src/cli/workshop.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;QAEhE,8BAA8B;QAC9B,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE;YACtD,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;QAEH,sBAAsB;QACtB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACpC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,gDAAgD;QAChD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IAEL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}