rtaskmaster-mcp 0.2.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 RBuildAI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,244 @@
1
+ # RTaskmaster MCP
2
+
3
+ A task master MCP (Model Context Protocol) server for AI-driven development in VS Code, Cursor, and other MCP-compatible editors.
4
+
5
+ [![npm version](https://badge.fury.io/js/rtaskmaster-mcp.svg)](https://www.npmjs.com/package/rtaskmaster-mcp)
6
+
7
+ ## Features
8
+
9
+ - 📋 **Task Management**: Create, update, list, and organize tasks
10
+ - 🎯 **Subtasks**: Break down complex tasks into manageable subtasks
11
+ - 📊 **Status Tracking**: Track progress with status updates (pending, in-progress, done, blocked, deferred)
12
+ - 🏷️ **Priority Levels**: Organize by priority (high, medium, low)
13
+ - 🔗 **Dependencies**: Define task dependencies
14
+ - 💾 **JSON Storage**: Simple file-based storage in `.rtaskmaster/tasks.json`
15
+ - 🤖 **AI-Ready**: Designed to work seamlessly with GitHub Copilot, Claude, and other AI assistants
16
+
17
+ ## Quick Install for VS Code
18
+
19
+ ### Option 1: NPX (Recommended - No Install Required)
20
+
21
+ Add to your VS Code MCP configuration at `.vscode/mcp.json` in your project:
22
+
23
+ ```json
24
+ {
25
+ "servers": {
26
+ "rtaskmaster": {
27
+ "command": "npx",
28
+ "args": ["-y", "rtaskmaster-mcp"],
29
+ "type": "stdio"
30
+ }
31
+ }
32
+ }
33
+ ```
34
+
35
+ ### Option 2: Global Install
36
+
37
+ ```bash
38
+ npm install -g rtaskmaster-mcp
39
+ ```
40
+
41
+ Then add to `.vscode/mcp.json`:
42
+
43
+ ```json
44
+ {
45
+ "servers": {
46
+ "rtaskmaster": {
47
+ "command": "rtaskmaster-mcp",
48
+ "type": "stdio"
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ ### Option 3: Cursor IDE
55
+
56
+ Add to `~/.cursor/mcp.json` or your project's `.cursor/mcp.json`:
57
+
58
+ ```json
59
+ {
60
+ "mcpServers": {
61
+ "rtaskmaster": {
62
+ "command": "npx",
63
+ "args": ["-y", "rtaskmaster-mcp"]
64
+ }
65
+ }
66
+ }
67
+ ```
68
+
69
+ ## 📖 AI Agent Instructions
70
+
71
+ For AI agents (GitHub Copilot, Claude, etc.) to work effectively with RTaskmaster, reference the instructions file:
72
+
73
+ **Location**: `.github/instructions.md` in this repository
74
+
75
+ The instructions file provides:
76
+
77
+ - ✅ Getting started workflow
78
+ - ✅ Task lifecycle management
79
+ - ✅ Best practices for AI agents
80
+ - ✅ TASKS.md checklist format
81
+ - ✅ Example sessions
82
+
83
+ ### Quick Workflow for AI Agents
84
+
85
+ 1. **Initialize**: `rtaskmaster_init` at project start
86
+ 2. **Create tasks**: Break down requirements into tasks
87
+ 3. **Generate checklist**: `rtaskmaster_generate_tasks_md` for human-readable view
88
+ 4. **Work loop**: `rtaskmaster_next_task` → work → `rtaskmaster_set_status` → repeat
89
+ 5. **Track progress**: `rtaskmaster_stats` to see completion
90
+
91
+ ## Available MCP Tools
92
+
93
+ | Tool | Description |
94
+ | ------------------------------ | -------------------------------------------- |
95
+ | `rtaskmaster_init` | Initialize RTaskmaster in a project |
96
+ | `rtaskmaster_get_tasks` | Get all tasks with optional filtering |
97
+ | `rtaskmaster_get_task` | Get a specific task by ID |
98
+ | `rtaskmaster_create_task` | Create a new task |
99
+ | `rtaskmaster_update_task` | Update an existing task |
100
+ | `rtaskmaster_delete_task` | Delete a task |
101
+ | `rtaskmaster_set_status` | Update task status |
102
+ | `rtaskmaster_add_subtask` | Add a subtask to a task |
103
+ | `rtaskmaster_next_task` | Get the next task to work on |
104
+ | `rtaskmaster_stats` | Get project statistics |
105
+ | `rtaskmaster_generate_tasks_md` | Generate a human-readable TASKS.md checklist |
106
+ | `rtaskmaster_parse_prd` | Parse requirements/PRD files to create tasks |
107
+ | `rtaskmaster_bulk_status` | Update multiple task statuses at once |
108
+
109
+ ## 📋 TASKS.md Checklist File
110
+
111
+ RTaskmaster can generate a human-readable `TASKS.md` file that serves as a visual checklist:
112
+
113
+ ```markdown
114
+ # Project Tasks
115
+
116
+ ## 📊 Progress
117
+
118
+ | Status | Count |
119
+ | -------------- | ----- |
120
+ | ✅ Done | 2 |
121
+ | 🔄 In Progress | 1 |
122
+ | ⏳ Pending | 3 |
123
+ | **Total** | **6** |
124
+
125
+ **Completion: 33%**
126
+
127
+ ---
128
+
129
+ ## ✅ Tasks
130
+
131
+ ### 🔴 High Priority
132
+
133
+ - [x] Set up project structure (#1)
134
+ - [ ] 🔄 Implement authentication (#2)
135
+ - [x] Set up OAuth (#2.1)
136
+ - [ ] Add JWT tokens (#2.2)
137
+
138
+ ### 🟡 Medium Priority
139
+
140
+ - [ ] Add user profile page (#3)
141
+ ```
142
+
143
+ Generate this file anytime using `rtaskmaster_generate_tasks_md`.
144
+
145
+ ## Task Structure
146
+
147
+ Tasks are stored in `.rtaskmaster/tasks.json`:
148
+
149
+ ```json
150
+ {
151
+ "version": "1.0.0",
152
+ "projectName": "My Project",
153
+ "tasks": [
154
+ {
155
+ "id": "1",
156
+ "title": "Implement authentication",
157
+ "description": "Add user authentication system",
158
+ "status": "pending",
159
+ "priority": "high",
160
+ "dependencies": [],
161
+ "subtasks": [
162
+ {
163
+ "id": "1",
164
+ "title": "Set up OAuth",
165
+ "status": "pending"
166
+ }
167
+ ],
168
+ "details": "Implementation notes here...",
169
+ "testStrategy": "How to verify this task...",
170
+ "createdAt": "2026-01-13T10:00:00.000Z",
171
+ "updatedAt": "2026-01-13T10:00:00.000Z"
172
+ }
173
+ ],
174
+ "lastUpdated": "2026-01-13T10:00:00.000Z"
175
+ }
176
+ ```
177
+
178
+ ## Usage Examples
179
+
180
+ Once configured, interact through your AI assistant:
181
+
182
+ ```
183
+ Initialize taskmaster in this project
184
+
185
+ Create a task to implement user authentication with high priority
186
+
187
+ Show me all pending tasks
188
+
189
+ What's the next task I should work on?
190
+
191
+ Mark task 1 as in-progress
192
+
193
+ Add a subtask to task 1: "Set up database schema"
194
+ ```
195
+
196
+ ## Task Statuses
197
+
198
+ | Status | Description |
199
+ | ------------- | ------------------------------------- |
200
+ | `pending` | Task not yet started |
201
+ | `in-progress` | Currently being worked on |
202
+ | `done` | Completed |
203
+ | `blocked` | Cannot proceed (waiting on something) |
204
+ | `deferred` | Postponed for later |
205
+
206
+ ## Priority Levels
207
+
208
+ | Priority | Description |
209
+ | -------- | ------------------------- |
210
+ | `high` | Urgent/critical tasks |
211
+ | `medium` | Normal priority (default) |
212
+ | `low` | Can wait |
213
+
214
+ ## Development
215
+
216
+ ```bash
217
+ # Clone the repo
218
+ git clone https://github.com/RagnarPitla/RTaskmaster-rbuildai-mcp.git
219
+ cd RTaskmaster-rbuildai-mcp
220
+
221
+ # Install dependencies
222
+ npm install
223
+
224
+ # Build
225
+ npm run build
226
+
227
+ # Watch mode for development
228
+ npm run dev
229
+
230
+ # Test with MCP Inspector
231
+ npm run inspector
232
+ ```
233
+
234
+ ## Contributing
235
+
236
+ Contributions are welcome! Please feel free to submit a Pull Request.
237
+
238
+ ## License
239
+
240
+ MIT
241
+
242
+ ## Author
243
+
244
+ RBuildAI - [GitHub](https://github.com/RagnarPitla)
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Core module exports
3
+ */
4
+ export * from './types.js';
5
+ export * from './storage.js';
6
+ export * from './task-manager.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Core module exports
3
+ */
4
+ export * from './types.js';
5
+ export * from './storage.js';
6
+ export * from './task-manager.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Task Storage - File-based JSON storage for tasks
3
+ */
4
+ import type { Task, TaskStore } from './types.js';
5
+ export declare class TaskStorage {
6
+ private projectRoot;
7
+ private tasksPath;
8
+ constructor(projectRoot: string);
9
+ /**
10
+ * Check if RTaskmaster is initialized in the project
11
+ */
12
+ isInitialized(): boolean;
13
+ /**
14
+ * Initialize RTaskmaster in the project
15
+ */
16
+ initialize(projectName?: string): TaskStore;
17
+ /**
18
+ * Load task store from disk
19
+ */
20
+ load(): TaskStore;
21
+ /**
22
+ * Save task store to disk
23
+ */
24
+ save(store: TaskStore): void;
25
+ /**
26
+ * Get all tasks
27
+ */
28
+ getTasks(): Task[];
29
+ /**
30
+ * Save all tasks
31
+ */
32
+ saveTasks(tasks: Task[]): void;
33
+ /**
34
+ * Get project root
35
+ */
36
+ getProjectRoot(): string;
37
+ }
38
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/core/storage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMlD,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;gBAEd,WAAW,EAAE,MAAM;IAK/B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS;IAyB3C;;OAEG;IACH,IAAI,IAAI,SAAS;IAWjB;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAM5B;;OAEG;IACH,QAAQ,IAAI,IAAI,EAAE;IAIlB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAM9B;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Task Storage - File-based JSON storage for tasks
3
+ */
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
6
+ const RTASKMASTER_DIR = '.rtaskmaster';
7
+ const TASKS_FILE = 'tasks.json';
8
+ const VERSION = '1.0.0';
9
+ export class TaskStorage {
10
+ projectRoot;
11
+ tasksPath;
12
+ constructor(projectRoot) {
13
+ this.projectRoot = projectRoot;
14
+ this.tasksPath = path.join(projectRoot, RTASKMASTER_DIR, TASKS_FILE);
15
+ }
16
+ /**
17
+ * Check if RTaskmaster is initialized in the project
18
+ */
19
+ isInitialized() {
20
+ return fs.existsSync(this.tasksPath);
21
+ }
22
+ /**
23
+ * Initialize RTaskmaster in the project
24
+ */
25
+ initialize(projectName) {
26
+ const rtaskmasterDir = path.join(this.projectRoot, RTASKMASTER_DIR);
27
+ if (!fs.existsSync(rtaskmasterDir)) {
28
+ fs.mkdirSync(rtaskmasterDir, { recursive: true });
29
+ }
30
+ const store = {
31
+ version: VERSION,
32
+ projectName: projectName || path.basename(this.projectRoot),
33
+ tasks: [],
34
+ lastUpdated: new Date().toISOString(),
35
+ };
36
+ this.save(store);
37
+ // Create .gitignore in .rtaskmaster if it doesn't exist
38
+ const gitignorePath = path.join(rtaskmasterDir, '.gitignore');
39
+ if (!fs.existsSync(gitignorePath)) {
40
+ fs.writeFileSync(gitignorePath, '# RTaskmaster files to ignore\n');
41
+ }
42
+ return store;
43
+ }
44
+ /**
45
+ * Load task store from disk
46
+ */
47
+ load() {
48
+ if (!this.isInitialized()) {
49
+ throw new Error('RTaskmaster is not initialized in this project. Run rtaskmaster_init first.');
50
+ }
51
+ const content = fs.readFileSync(this.tasksPath, 'utf-8');
52
+ return JSON.parse(content);
53
+ }
54
+ /**
55
+ * Save task store to disk
56
+ */
57
+ save(store) {
58
+ store.lastUpdated = new Date().toISOString();
59
+ const content = JSON.stringify(store, null, 2);
60
+ fs.writeFileSync(this.tasksPath, content, 'utf-8');
61
+ }
62
+ /**
63
+ * Get all tasks
64
+ */
65
+ getTasks() {
66
+ return this.load().tasks;
67
+ }
68
+ /**
69
+ * Save all tasks
70
+ */
71
+ saveTasks(tasks) {
72
+ const store = this.load();
73
+ store.tasks = tasks;
74
+ this.save(store);
75
+ }
76
+ /**
77
+ * Get project root
78
+ */
79
+ getProjectRoot() {
80
+ return this.projectRoot;
81
+ }
82
+ }
83
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/core/storage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,MAAM,eAAe,GAAG,cAAc,CAAC;AACvC,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,OAAO,WAAW;IACd,WAAW,CAAS;IACpB,SAAS,CAAS;IAE1B,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,WAAoB;QAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAEpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,KAAK,GAAc;YACvB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;YAC3D,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjB,wDAAwD;QACxD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,iCAAiC,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,KAAgB;QACnB,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAa;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Task Manager - Core business logic for task operations
3
+ */
4
+ import type { Task, Subtask, TaskStatus, TaskFilter, TaskStats, CreateTaskInput, UpdateTaskInput, CreateSubtaskInput } from './types.js';
5
+ export declare class TaskManager {
6
+ private storage;
7
+ constructor(projectRoot: string);
8
+ /**
9
+ * Check if initialized
10
+ */
11
+ isInitialized(): boolean;
12
+ /**
13
+ * Initialize Ragnar
14
+ */
15
+ initialize(projectName?: string): import("./types.js").TaskStore;
16
+ /**
17
+ * Generate next task ID
18
+ */
19
+ private generateTaskId;
20
+ /**
21
+ * Generate next subtask ID
22
+ */
23
+ private generateSubtaskId;
24
+ /**
25
+ * Get all tasks with optional filtering
26
+ */
27
+ getTasks(filter?: TaskFilter): Task[];
28
+ /**
29
+ * Get a task by ID (supports dot notation for subtasks: "1.2")
30
+ */
31
+ getTask(taskId: string): Task | Subtask | null;
32
+ /**
33
+ * Get parent task (for subtask operations)
34
+ */
35
+ getParentTask(taskId: string): Task | null;
36
+ /**
37
+ * Create a new task
38
+ */
39
+ createTask(input: CreateTaskInput): Task;
40
+ /**
41
+ * Update an existing task
42
+ */
43
+ updateTask(taskId: string, input: UpdateTaskInput): Task | null;
44
+ /**
45
+ * Delete a task
46
+ */
47
+ deleteTask(taskId: string): boolean;
48
+ /**
49
+ * Set task status
50
+ */
51
+ setStatus(taskId: string, status: TaskStatus): Task | Subtask | null;
52
+ /**
53
+ * Add a subtask to a task
54
+ */
55
+ addSubtask(taskId: string, input: CreateSubtaskInput): Subtask | null;
56
+ /**
57
+ * Get the next task to work on
58
+ * Prioritizes: in-progress > high priority pending > medium > low
59
+ * Only returns tasks with satisfied dependencies
60
+ */
61
+ getNextTask(): Task | null;
62
+ /**
63
+ * Get task statistics
64
+ */
65
+ getStats(): TaskStats;
66
+ }
67
+ //# sourceMappingURL=task-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-manager.d.ts","sourceRoot":"","sources":["../../src/core/task-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,IAAI,EACJ,OAAO,EACP,UAAU,EACV,UAAU,EACV,SAAS,EACT,eAAe,EACf,eAAe,EACf,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAc;gBAEjB,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM;IAI/B;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,EAAE;IAiBrC;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI;IAc9C;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAM1C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAwBxC;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAmB/D;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAiBnC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI;IA+BpE;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,GAAG,IAAI;IAuBrE;;;;OAIG;IACH,WAAW,IAAI,IAAI,GAAG,IAAI;IAuC1B;;OAEG;IACH,QAAQ,IAAI,SAAS;CAkBtB"}