mcp-perforce-server 3.1.0 → 3.3.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/README.md CHANGED
@@ -1,217 +1,202 @@
1
- # MCP Perforce Server
2
-
3
- [![npm version](https://badge.fury.io/js/mcp-perforce-server.svg)](https://www.npmjs.com/package/mcp-perforce-server)
4
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
- [![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen)](https://nodejs.org/)
6
- [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue)](https://www.typescriptlang.org/)
7
- [![MCPAmpel](https://img.shields.io/endpoint?url=https://mcpampel.com/badge/iPraBhu/mcp-perforce-server.json)](https://mcpampel.com/repo/iPraBhu/mcp-perforce-server)
8
-
9
- MCP server for Perforce (P4) with safe defaults, fast execution, and structured JSON responses.
10
-
11
- > Developed with vibe coding for practical Perforce automation workflows.
12
-
13
- New to MCP servers? See [What is MCP (Model Context Protocol)?](https://adevguide.com/ai-engineering/llm-agents/what-is-mcp-model-context-protocol/).
14
-
15
- ## Workflow Speed
16
-
17
- This server includes composite tools that combine multiple Perforce calls into one request so review and sync workflows complete faster with fewer MCP round trips.
18
-
19
- - `p4.review.bundle`: pending review changelists with optional details and reviewers in one call
20
- - `p4.change.inspect`: changelist inspection bundle (`describe` + `fixes` + `reviews` + optional diff + optional `filelog`)
21
- - `p4.path.synccheck`: branch/path sync drift analysis (`interchanges` + optional `integrated`)
22
-
23
- To return actual changelist diff content via MCP:
24
-
25
- - `p4.describe` with `includeDiff=true` (optional `diffFormat`: `u`, `c`, `n`, `s`)
26
- - `p4.change.inspect` with `includeDiff=true`
27
-
28
- ## Install
29
-
30
- ```bash
31
- npm install -g mcp-perforce-server
32
- ```
33
-
34
- ## Quick Start
35
-
36
- 1. Make sure `p4` is installed and available in `PATH`.
37
- 2. Configure Perforce credentials using either `.p4config` in your workspace/project root, or MCP `env` variables.
38
- 3. Add MCP server config in your IDE/client.
39
-
40
- ### Example `.p4config`
41
-
42
- ```ini
43
- P4PORT=perforce-server:1666
44
- P4USER=your-username
45
- P4CLIENT=your-workspace-name
46
- P4PASSWD=your-password
47
- ```
48
-
49
- ### Global Install MCP Config (Default Safe Profile)
50
-
51
- ```json
52
- {
53
- "mcpServers": {
54
- "perforce": {
55
- "command": "mcp-perforce-server"
56
- }
57
- }
58
- }
59
- ```
60
-
61
- ### Local Repo MCP Config (Default Safe Profile)
62
-
63
- ```json
64
- {
65
- "mcpServers": {
66
- "perforce": {
67
- "command": "node",
68
- "args": ["/absolute/path/to/mcp-perforce-server/dist/server.js"]
69
- }
70
- }
71
- }
72
- ```
73
-
74
- ### MCP Config (Default Safe Profile + Credentials in `env`)
75
-
76
- ```json
77
- {
78
- "mcpServers": {
79
- "perforce": {
80
- "command": "mcp-perforce-server",
81
- "env": {
82
- "P4PORT": "ssl:perforce.example.com:1666",
83
- "P4USER": "your-username",
84
- "P4CLIENT": "your-workspace-name",
85
- "P4PASSWD": "your-password-or-ticket"
86
- }
87
- }
88
- }
89
- }
90
- ```
91
-
92
- Defaults are already safe: `P4_READONLY_MODE=true` and `P4_DISABLE_DELETE=true` unless explicitly set to `false`.
93
-
94
- If you want to pin these explicitly in your client config:
95
-
96
- ```json
97
- {
98
- "mcpServers": {
99
- "perforce": {
100
- "command": "mcp-perforce-server",
101
- "env": {
102
- "P4_READONLY_MODE": "true",
103
- "P4_DISABLE_DELETE": "true",
104
- "LOG_LEVEL": "error"
105
- }
106
- }
107
- }
108
- }
109
- ```
110
-
111
- Windows `args` example:
112
-
113
- ```json
114
- {
115
- "mcpServers": {
116
- "perforce": {
117
- "command": "node",
118
- "args": ["C:\\Tools\\git-projects\\mcp-perforce-server\\dist\\server.js"]
119
- }
120
- }
121
- }
122
- ```
123
-
124
- ## Default Access Model
125
-
126
- | Setting | Default | Effect |
127
- |---|---|---|
128
- | `P4_READONLY_MODE` | `true` | Blocks all write-capable tools. |
129
- | `P4_DISABLE_DELETE` | `true` | Blocks `p4.delete` even when write mode is enabled. |
130
-
131
- Write-capable tools blocked when `P4_READONLY_MODE=true`:
132
-
133
- | Tool |
134
- |---|
135
- | `p4.add`, `p4.edit`, `p4.delete`, `p4.revert`, `p4.sync` |
136
- | `p4.changelist.create`, `p4.changelist.update`, `p4.changelist.submit`, `p4.submit` |
137
- | `p4.resolve`, `p4.shelve`, `p4.unshelve` |
138
- | `p4.copy`, `p4.move`, `p4.integrate`, `p4.merge` |
139
-
140
- ## Server Configuration Reference
141
-
142
- ### Runtime, Safety, and Performance
143
-
144
- | Variable | Default | Description |
145
- |---|---|---|
146
- | `P4_READONLY_MODE` | `true` | Read-only by default. Set to `false` to enable write-capable tools. |
147
- | `P4_DISABLE_DELETE` | `true` | Delete operations are disabled by default. Set to `false` to allow `p4.delete`. |
148
- | `P4_PATH` | `p4` / `p4.exe` | Custom path to Perforce CLI executable. |
149
- | `P4CONFIG` | `.p4config` | `.p4config` file name used for upward discovery. |
150
- | `LOG_LEVEL` | `warn` | Logging level: `error`, `warn`, `info`, `debug`. |
151
- | `P4_PRETTY_JSON` | `false` | Pretty-print JSON responses when `true`. |
152
- | `P4_PERFORMANCE_MODE` | `fast` | Preset: `fast`, `balanced`, `secure`. |
153
- | `P4_TIMEOUT_MS` | `5000` / `10000` / `15000` | Command timeout in ms (`fast` / `balanced` / `secure`). |
154
- | `P4_CONFIG_CACHE_TTL` | `600000` / `300000` / `300000` | `.p4config` cache TTL in ms (`fast` / `balanced` / `secure`). |
155
- | `P4_RESPONSE_CACHE` | `true` | Enable/disable read-result response cache. |
156
- | `P4_RESPONSE_CACHE_TTL_MS` | `5000` / `3000` / `1000` | Response cache TTL in ms (`fast` / `balanced` / `secure`). |
157
- | `P4_RESPONSE_CACHE_TTL_MAP` | unset | Per-tool cache TTL overrides (for example `p4.info=30000,p4.review=2000`). |
158
- | `P4_RESPONSE_CACHE_MAX_ENTRIES` | `400` / `250` / `100` | Max cached read responses (`fast` / `balanced` / `secure`). |
159
- | `P4_NEGATIVE_CACHE` | `true` | Cache predictable read errors for a short TTL to avoid repeated retries. |
160
- | `P4_NEGATIVE_CACHE_TTL_MS` | `5000` | Negative-cache TTL in milliseconds. |
161
- | `P4_WORKFLOW_CONCURRENCY` | `6` | Max concurrent subcalls used by composite workflow tools. |
162
- | `P4_LOG_PERF_METRICS` | `false` | Enable periodic performance snapshots (cache hit rate, p50/p95 latency, subcall totals). |
163
- | `P4_LOG_PERF_METRICS_INTERVAL_MS` | `60000` | Interval for performance snapshot logs in milliseconds. |
164
- | `P4_PERF_METRICS_SAMPLE_SIZE` | `200` | Rolling sample size per tool used to compute p50/p95 latency. |
165
- | `P4_ENABLE_AUDIT_LOGGING` | `false` / `false` / `true` | Override audit logging (`fast` / `balanced` / `secure`). |
166
- | `P4_ENABLE_RATE_LIMITING` | `false` / `false` / `true` | Override rate limiting (`fast` / `balanced` / `secure`). |
167
- | `P4_ENABLE_MEMORY_LIMITS` | `false` / `true` / `true` | Override memory-limit checks (`fast` / `balanced` / `secure`). |
168
- | `P4_ENABLE_INPUT_SANITIZATION` | `true` | Input sanitization is enabled unless set to `false`. |
169
- | `P4_MAX_MEMORY_MB` | `512` | Memory limit for command execution and checks. |
170
- | `P4_AUDIT_RETENTION_DAYS` | `90` | Number of days audit entries are retained. |
171
- | `P4_RATE_LIMIT_REQUESTS` | `100` | Max requests per rate-limit window. |
172
- | `P4_RATE_LIMIT_WINDOW_MS` | `600000` | Rate-limit window in milliseconds. |
173
- | `P4_RATE_LIMIT_BLOCK_MS` | `3600000` | Block duration in milliseconds after exceeding limit. |
174
-
175
- ### Perforce Connection Variables
176
-
177
- | Variable | Required | Description |
178
- |---|---|---|
179
- | `P4PORT` | Yes | Perforce server address (for example `ssl:perforce.example.com:1666`). |
180
- | `P4USER` | Yes | Perforce username. |
181
- | `P4CLIENT` | Yes | Perforce client/workspace name. |
182
- | `P4PASSWD` | No | Password or ticket (masked in server output). |
183
- | `P4CHARSET` | No | Character set (for example `utf8`). |
184
- | `P4COMMANDCHARSET` | No | Command charset override. |
185
- | `P4LANGUAGE` | No | Localized language setting. |
186
- | `P4DIFF` | No | Custom diff tool command. |
187
- | `P4MERGE` | No | Custom merge tool command. |
188
- | `P4EDITOR` | No | Editor for changelist descriptions/spec forms. |
189
-
190
- ## Tool Coverage
191
-
192
- - 55 MCP tools covering repository info, file operations, changelists, merge/resolve, review workflows, workflow composites, search, users/clients, jobs, labels/streams, analytics, and compliance.
193
- - Composite workflow tools are included to reduce request count and speed up common review/sync flows.
194
- - Includes both:
195
- - `p4.diff` for workspace/local vs depot diff.
196
- - `p4.diff2` for depot-to-depot server-side diff.
197
- - **Tool naming**: All tools use dot notation (e.g., `p4.changes`), but the server also accepts underscore notation (e.g., `p4_changes`) for compatibility with clients that transform tool names.
198
-
199
- ## Documentation
200
-
201
- - Detailed tool reference: [docs/TOOLS_REFERENCE.md](docs/TOOLS_REFERENCE.md)
202
- - Docs index: [docs/README.md](docs/README.md)
203
- - IDE/client setup examples: [MCP_CONFIG_EXAMPLES.md](MCP_CONFIG_EXAMPLES.md)
204
- - Perforce setup notes: [PERFORCE_SETUP.md](PERFORCE_SETUP.md)
205
-
206
- ## Development
207
-
208
- ```bash
209
- npm install
210
- npm run build
211
- npm test
212
- npm run test:integration
213
- ```
214
-
215
- ## License
216
-
217
- MIT
1
+ # MCP Perforce Server
2
+
3
+ [![npm version](https://badge.fury.io/js/mcp-perforce-server.svg)](https://www.npmjs.com/package/mcp-perforce-server)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen)](https://nodejs.org/)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue)](https://www.typescriptlang.org/)
7
+ [![MCPAmpel](https://img.shields.io/endpoint?url=https://mcpampel.com/badge/iPraBhu/mcp-perforce-server.json)](https://mcpampel.com/repo/iPraBhu/mcp-perforce-server)
8
+
9
+ `mcp-perforce-server` is a Model Context Protocol server for Perforce (`p4`) with safe defaults, structured JSON responses, and both native-style and MCP-optimized workflows.
10
+
11
+ It is designed for AI assistants and IDE integrations that need Perforce access without relying on brittle shell scripting.
12
+
13
+ ## What It Provides
14
+
15
+ - 59 MCP tools across repository inspection, file operations, changelists, reviews, jobs, labels, streams, analytics, and compliance.
16
+ - Safe-by-default runtime behavior:
17
+ - `P4_READONLY_MODE=true`
18
+ - `P4_DISABLE_DELETE=true`
19
+ - Batch-capable inputs for the tool surface where native `p4` supports multi-target usage.
20
+ - MCP-specific composite helpers that reduce round trips for common review and search workflows.
21
+ - Structured responses with `ok`, `result`, optional `error`, optional `warnings`, and `configUsed`.
22
+ - MCP clients see underscore-safe tool names, for example `p4_changes`.
23
+ - Incoming calls also accept the historical dotted names, for example `p4.changes`.
24
+
25
+ ## Highlighted Workflows
26
+
27
+ The server includes higher-level helpers on top of raw `p4` commands.
28
+
29
+ - `p4.review.bundle`: pending review changelists with optional details and reviewers
30
+ - `p4.change.inspect`: `describe` + `fixes` + `reviews` + optional diff + optional file history
31
+ - `p4.path.synccheck`: drift and sync-state analysis between two depot paths
32
+ - `p4.file.inspect`: per-file metadata, history, optional content, and optional blame
33
+ - `p4.workspace.snapshot`: workspace info, status, optional config, opened files, and recent changes
34
+ - `p4.search.inspect`: grouped search results with optional file metadata and content previews
35
+ - `p4.review.prepare`: explicit or discovered changelists prepared into review-ready bundles
36
+
37
+ ## Install
38
+
39
+ ```bash
40
+ npm install -g mcp-perforce-server
41
+ ```
42
+
43
+ Requirements:
44
+
45
+ - Node.js 18+
46
+ - Perforce CLI available as `p4` or `p4.exe`
47
+ - Valid Perforce environment via `.p4config` or MCP `env`
48
+
49
+ ## Quick Start
50
+
51
+ 1. Install the Perforce CLI and ensure `p4` is on `PATH`.
52
+ 2. Configure Perforce credentials in `.p4config` or via MCP `env`.
53
+ 3. Add the server to your MCP client.
54
+ 4. Start in the default safe profile before enabling any write-capable tools.
55
+
56
+ Example `.p4config`:
57
+
58
+ ```ini
59
+ P4PORT=ssl:perforce.example.com:1666
60
+ P4USER=your-username
61
+ P4CLIENT=your-workspace-name
62
+ P4PASSWD=your-password-or-ticket
63
+ ```
64
+
65
+ Example MCP config using the globally installed server:
66
+
67
+ ```json
68
+ {
69
+ "mcpServers": {
70
+ "perforce": {
71
+ "command": "mcp-perforce-server"
72
+ }
73
+ }
74
+ }
75
+ ```
76
+
77
+ Example MCP config with explicit credentials:
78
+
79
+ ```json
80
+ {
81
+ "mcpServers": {
82
+ "perforce": {
83
+ "command": "mcp-perforce-server",
84
+ "env": {
85
+ "P4PORT": "ssl:perforce.example.com:1666",
86
+ "P4USER": "your-username",
87
+ "P4CLIENT": "your-workspace-name",
88
+ "P4PASSWD": "your-password-or-ticket",
89
+ "P4_READONLY_MODE": "true",
90
+ "P4_DISABLE_DELETE": "true"
91
+ }
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ Windows local-repo example:
98
+
99
+ ```json
100
+ {
101
+ "mcpServers": {
102
+ "perforce": {
103
+ "command": "node",
104
+ "args": ["C:\\Tools\\git-projects\\mcp-perforce-server\\dist\\server.js"]
105
+ }
106
+ }
107
+ }
108
+ ```
109
+
110
+ ## Safety Model
111
+
112
+ The default runtime profile is conservative.
113
+
114
+ | Setting | Default | Effect |
115
+ |---|---|---|
116
+ | `P4_READONLY_MODE` | `true` | Blocks write-capable tools. |
117
+ | `P4_DISABLE_DELETE` | `true` | Blocks `p4.delete` even when write mode is enabled. |
118
+
119
+ Write-capable tools include:
120
+
121
+ - `p4.add`, `p4.edit`, `p4.delete`, `p4.revert`, `p4.sync`
122
+ - `p4.changelist.create`, `p4.changelist.update`, `p4.changelist.submit`, `p4.submit`
123
+ - `p4.resolve`, `p4.shelve`, `p4.unshelve`
124
+ - `p4.copy`, `p4.move`, `p4.integrate`, `p4.merge`
125
+
126
+ ## Tool Surface
127
+
128
+ Major categories:
129
+
130
+ - Repository and workspace inspection
131
+ - File operations and diffing
132
+ - Changelists and submissions
133
+ - Merge, shelving, and resolve flows
134
+ - Search and discovery
135
+ - Review and workflow composites
136
+ - Users, clients, streams, labels, jobs, and fixes
137
+ - Compliance, audit, and operational diagnostics
138
+
139
+ Notable native parity improvements:
140
+
141
+ - Batch-style inputs for commands such as `sync`, `opened`, `filelog`, `annotate`, `grep`, `files`, `dirs`, `print`, `fstat`, `sizes`, `have`, `users`, `streams`, `jobs`, and `fixes`
142
+ - Expanded native flag coverage for tools such as `sync`, `interchanges`, `fstat`, `files`, `dirs`, `streams`, `clients`, `labels`, `jobs`, and `sizes`
143
+ - Support for both workspace-facing and depot-to-depot diffing via `p4.diff` and `p4.diff2`
144
+
145
+ ## Configuration
146
+
147
+ Most installations only need a small set of variables.
148
+
149
+ | Variable | Default | Purpose |
150
+ |---|---|---|
151
+ | `P4_READONLY_MODE` | `true` | Keep the server read-only by default. |
152
+ | `P4_DISABLE_DELETE` | `true` | Prevent delete operations unless explicitly enabled. |
153
+ | `P4CONFIG` | `.p4config` | Config file name used during upward discovery. |
154
+ | `P4_PATH` | `p4` / `p4.exe` | Custom path to the Perforce CLI. |
155
+ | `P4_PERFORMANCE_MODE` | `fast` | Preset: `fast`, `balanced`, `secure`. |
156
+ | `P4_WORKFLOW_CONCURRENCY` | `6` | Max concurrent subcalls for composite tools. |
157
+ | `P4_RESPONSE_CACHE` | `true` | Enable read-response caching. |
158
+ | `P4_RESPONSE_CACHE_TTL_MAP` | unset | Per-tool cache TTL overrides. |
159
+ | `LOG_LEVEL` | `warn` | Server log level. |
160
+
161
+ Perforce connection variables:
162
+
163
+ - `P4PORT`
164
+ - `P4USER`
165
+ - `P4CLIENT`
166
+ - `P4PASSWD`
167
+ - `P4CHARSET`
168
+ - `P4COMMANDCHARSET`
169
+ - `P4LANGUAGE`
170
+
171
+ For full configuration tables and examples, see:
172
+
173
+ - [PERFORCE_SETUP.md](PERFORCE_SETUP.md)
174
+ - [MCP_CONFIG_EXAMPLES.md](MCP_CONFIG_EXAMPLES.md)
175
+
176
+ ## Development
177
+
178
+ ```bash
179
+ npm install
180
+ npm run build
181
+ npm test
182
+ npm run test:integration
183
+ ```
184
+
185
+ Current verification baseline:
186
+
187
+ - `npm run build`
188
+ - `npm test`
189
+ - `npm run test:integration`
190
+
191
+ ## Documentation
192
+
193
+ - Tool catalog and descriptions: [AGENTS.md](AGENTS.md)
194
+ - Docs index: [docs/README.md](docs/README.md)
195
+ - Perforce setup: [PERFORCE_SETUP.md](PERFORCE_SETUP.md)
196
+ - MCP client config examples: [MCP_CONFIG_EXAMPLES.md](MCP_CONFIG_EXAMPLES.md)
197
+ - Publishing workflow: [PUBLISHING.md](PUBLISHING.md)
198
+ - Release notes draft: [RELEASE_NOTES.md](RELEASE_NOTES.md)
199
+
200
+ ## License
201
+
202
+ MIT
package/dist/p4/parse.js CHANGED
@@ -249,7 +249,7 @@ function parseInterchangesOutput(output) {
249
249
  }
250
250
  continue;
251
251
  }
252
- const headerMatch = line.match(/^Change\s+(\d+)\s+on\s+(\S+)\s+by\s+(.+?)@(.+?)(?:\s+'(.*)')?$/);
252
+ const headerMatch = line.match(/^Change\s+(\d+)\s+on\s+(.+?)\s+by\s+(.+?)@(.+?)(?:\s+'(.*)')?$/);
253
253
  if (headerMatch) {
254
254
  finalizeCurrent();
255
255
  const [, change, date, user, client, description] = headerMatch;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AA4OA,cAAM,iBAAiB;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IACpE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6C;IAClF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAyE;IAC5G,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAGtC;IACF,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAqE;IAC/G,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6C;IAClF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAGjC;IACF,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAMzC;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiC;IAC/D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuC;IAC5E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2C;IAC3E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAwD;IAC9F,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA8C;IACjF,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgE;IACtG,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,UAAU,CAAK;;IA2BvB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,qBAAqB;IAiE7B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,sBAAsB;YAwBhB,WAAW;YAWX,sBAAsB;IA6CpC,OAAO,CAAC,iBAAiB;IA44CnB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAM3B;AA+ED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAsPA,cAAM,iBAAiB;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IACpE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6C;IAClF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAyE;IAC5G,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAGtC;IACF,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAqE;IAC/G,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6C;IAClF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAGjC;IACF,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAMzC;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiC;IAC/D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuC;IAC5E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2C;IAC3E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAwD;IAC9F,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA8C;IACjF,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgE;IACtG,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,UAAU,CAAK;;IA2BvB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,qBAAqB;IAiE7B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,sBAAsB;YAwBhB,WAAW;YAWX,sBAAsB;IA6CpC,OAAO,CAAC,iBAAiB;IAu8DnB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAM3B;AA+ED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}