create-mn-app 0.0.6 → 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.
Files changed (37) hide show
  1. package/README.md +193 -39
  2. package/dist/cli.js +20 -9
  3. package/dist/cli.js.map +1 -1
  4. package/dist/create-app.d.ts +3 -1
  5. package/dist/create-app.d.ts.map +1 -1
  6. package/dist/create-app.js +163 -30
  7. package/dist/create-app.js.map +1 -1
  8. package/dist/installers/package-installer.d.ts +1 -1
  9. package/dist/installers/package-installer.d.ts.map +1 -1
  10. package/dist/installers/package-installer.js.map +1 -1
  11. package/dist/utils/error-handler.d.ts +27 -0
  12. package/dist/utils/error-handler.d.ts.map +1 -0
  13. package/dist/utils/error-handler.js +116 -0
  14. package/dist/utils/error-handler.js.map +1 -0
  15. package/dist/utils/git-cloner.d.ts +11 -0
  16. package/dist/utils/git-cloner.d.ts.map +1 -0
  17. package/dist/utils/git-cloner.js +50 -0
  18. package/dist/utils/git-cloner.js.map +1 -0
  19. package/dist/utils/package-manager.d.ts +21 -0
  20. package/dist/utils/package-manager.d.ts.map +1 -0
  21. package/dist/utils/package-manager.js +108 -0
  22. package/dist/utils/package-manager.js.map +1 -0
  23. package/dist/utils/requirement-checker.d.ts +27 -0
  24. package/dist/utils/requirement-checker.d.ts.map +1 -0
  25. package/dist/utils/requirement-checker.js +110 -0
  26. package/dist/utils/requirement-checker.js.map +1 -0
  27. package/dist/utils/setup-guide.d.ts +22 -0
  28. package/dist/utils/setup-guide.d.ts.map +1 -0
  29. package/dist/utils/setup-guide.js +89 -0
  30. package/dist/utils/setup-guide.js.map +1 -0
  31. package/dist/utils/templates.d.ts +36 -0
  32. package/dist/utils/templates.d.ts.map +1 -0
  33. package/dist/utils/templates.js +79 -0
  34. package/dist/utils/templates.js.map +1 -0
  35. package/package.json +3 -3
  36. package/templates/hello-world/package.json.template +1 -0
  37. package/templates/hello-world/src/health-check.ts.template +127 -0
package/README.md CHANGED
@@ -11,26 +11,47 @@ cd my-app
11
11
  npm run setup
12
12
  ```
13
13
 
14
- ## Features
15
-
16
- - **Zero configuration** - Works out of the box with sensible defaults
17
- - 🔧 **Modern tooling** - TypeScript, hot reloading, auto-compilation
18
- - 🛡️ **Best practices** - Secure wallet generation, proper project structure
19
- - 🚀 **Fast setup** - From zero to working app in 60 seconds
20
- - 🎯 **Developer friendly** - Clear error messages, helpful guides
14
+ ## Features
15
+
16
+ - 🎯 **Interactive Setup** - Guided project creation with template selection
17
+ - 📦 **Smart Package Manager** - Auto-detects your preferred package manager (npm/yarn/pnpm/bun)
18
+ - 🏥 **Health Checks** - Verify your environment is ready before development
19
+ - **Zero Configuration** - Works out of the box with sensible defaults
20
+ - 🔧 **Modern Tooling** - TypeScript, hot reloading, auto-compilation
21
+ - 🛡️ **Best Practices** - Secure wallet generation, proper project structure
22
+ - 🚀 **Fast Setup** - From zero to working app in 60 seconds
23
+ - � **Helpful Errors** - Clear error messages with actionable solutions
21
24
  - 📦 **ES Modules** - Modern JavaScript module system
22
- - 🐳 **Docker integration** - Automated proof server setup
25
+ - 🐳 **Docker Integration** - Automated proof server setup
26
+
27
+ ## 🚀 Quick Start
28
+
29
+ ### Interactive Mode (Recommended)
30
+
31
+ ```bash
32
+ npx create-mn-app
33
+ ```
34
+
35
+ You'll be prompted to:
36
+
37
+ 1. **Enter your project name** - Choose a descriptive name for your app
38
+ 2. **Select a template** - Pick from available templates or see what's coming soon
39
+ 3. **Choose configuration** - Package manager, git, and other options
23
40
 
24
- ## Quick Start
41
+ ### Command Line Mode
25
42
 
26
43
  ```bash
27
- # Create a new Midnight app
44
+ # Create with defaults
28
45
  npx create-mn-app my-midnight-app
29
46
 
30
- # Navigate to your project
31
- cd my-midnight-app
47
+ # Create with specific template
48
+ npx create-mn-app my-app --template hello-world
32
49
 
33
- # Setup and deploy your contract
50
+ # Use specific package manager
51
+ npx create-mn-app my-app --use-pnpm
52
+
53
+ # Navigate and setup
54
+ cd my-app
34
55
  npm run setup
35
56
  ```
36
57
 
@@ -46,7 +67,7 @@ Your generated project includes:
46
67
  - 📋 **Environment Config** - `.env` file with network configuration
47
68
  - 🔄 **Git Ready** - Initialized git repository with proper `.gitignore`
48
69
 
49
- ## Available Commands
70
+ ## 📚 Available Commands
50
71
 
51
72
  Once your project is created, you can run:
52
73
 
@@ -58,6 +79,19 @@ Complete setup pipeline:
58
79
  2. Builds TypeScript to JavaScript
59
80
  3. Deploys contracts to the network
60
81
 
82
+ ### `npm run health-check`
83
+
84
+ 🏥 Verify your development environment:
85
+
86
+ - ✓ Node.js version (18+)
87
+ - ✓ Docker availability
88
+ - ✓ Environment configuration
89
+ - ✓ Wallet setup
90
+ - ✓ Dependencies installed
91
+ - ✓ Project built correctly
92
+
93
+ Run this command before development to catch issues early!
94
+
61
95
  ### `npm run cli`
62
96
 
63
97
  Opens an interactive command-line interface to:
@@ -67,6 +101,10 @@ Opens an interactive command-line interface to:
67
101
  - Retrieve stored messages
68
102
  - Test contract functionality
69
103
 
104
+ ### `npm run check-balance`
105
+
106
+ Checks your wallet balance. Useful for verifying if test tokens from the faucet have arrived before deploying.
107
+
70
108
  ### `npm run compile`
71
109
 
72
110
  Compiles your Compact smart contracts from `contracts/` to `contracts/managed/`
@@ -79,10 +117,6 @@ Builds your TypeScript source code to JavaScript in the `dist/` directory
79
117
 
80
118
  Deploys your compiled contract to the Midnight testnet
81
119
 
82
- ### `npm run check-balance`
83
-
84
- Checks your wallet balance. Useful for verifying if test tokens from the faucet have arrived before deploying.
85
-
86
120
  ## Project Structure
87
121
 
88
122
  ```
@@ -104,9 +138,13 @@ my-midnight-app/
104
138
  └── nodemon.json
105
139
  ```
106
140
 
107
- ## Templates
141
+ ## 🎨 Templates
142
+
143
+ Choose from various templates to kickstart your Midnight project:
108
144
 
109
- ### Hello World (Default)
145
+ ### Available Now
146
+
147
+ #### **Hello World** (Default)
110
148
 
111
149
  A simple message storage contract demonstrating:
112
150
 
@@ -115,42 +153,116 @@ A simple message storage contract demonstrating:
115
153
  - Contract deployment
116
154
  - Interactive testing
117
155
 
118
- **More templates coming soon!**
156
+ ```bash
157
+ npx create-mn-app my-app --template hello-world
158
+ ```
159
+
160
+ #### **Counter DApp**
161
+
162
+ Real-world example from midnightntwrk demonstrating:
163
+
164
+ - Increment/decrement state management
165
+ - Zero-knowledge proofs on testnet
166
+ - Compact compiler integration
167
+ - Full CLI interface
168
+
169
+ ```bash
170
+ npx create-mn-app my-counter --template counter
171
+ ```
172
+
173
+ _Automatically cloned from [midnightntwrk/example-counter](https://github.com/midnightntwrk/example-counter)_
174
+
175
+ **Requirements:** Node.js 22+, Docker, Compact compiler
176
+
177
+ ### 🔜 Coming Soon
178
+
179
+ #### **Bulletin Board (Bboard)**
180
+
181
+ Bulletin board with multi-user interactions and privacy patterns
182
+
183
+ #### **Decentralized Exchange (DEX)**
184
+
185
+ Decentralized exchange using OpenZeppelin FungibleToken
186
+
187
+ #### **Midnight Kitties**
119
188
 
120
- ## Requirements
189
+ Full stack DApp using NFT smart contract library (Crypto Kitties on Midnight)
121
190
 
122
- - **Node.js** 18.0.0 or higher
191
+ _These templates are under development. Star the repo to stay updated!_
192
+
193
+ ## ⚙️ Requirements
194
+
195
+ - **Node.js** 22.0.0 or higher (required for all templates)
123
196
  - **Docker** (for running the proof server)
124
- - **npm**, **yarn**, or **pnpm** package manager
197
+ - **npm**, **yarn**, **pnpm**, or **bun** package manager
198
+ - **Compact Compiler** (required for Counter and future templates - CLI will guide installation)
199
+
200
+ > **Note:** The CLI automatically checks Node.js version on startup and will guide you if an upgrade is needed.
201
+
202
+ ## 📦 Package Manager Options
203
+
204
+ The CLI automatically detects your preferred package manager! It checks:
125
205
 
126
- ## Package Manager Options
206
+ 1. Lock files in your directory (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb)
207
+ 2. Environment variables set by your package manager
208
+ 3. Available package managers on your system
127
209
 
128
- You can use your preferred package manager:
210
+ You can also explicitly specify:
129
211
 
130
212
  ```bash
131
- # npm (default)
132
- npx create-mn-app my-app
213
+ # npm
214
+ npx create-mn-app my-app --use-npm
133
215
 
134
216
  # Yarn
135
- npx create-mn-app my-app --yarn
217
+ npx create-mn-app my-app --use-yarn
136
218
 
137
219
  # pnpm
138
- npx create-mn-app my-app --pnpm
220
+ npx create-mn-app my-app --use-pnpm
221
+
222
+ # Bun
223
+ npx create-mn-app my-app --use-bun
139
224
  ```
140
225
 
141
- ## Usage Options
226
+ All commands in the success message will use your chosen package manager! 🎉
227
+
228
+ ## ⚙️ CLI Options
142
229
 
143
230
  ```bash
144
231
  npx create-mn-app [project-name] [options]
145
232
 
233
+ Arguments:
234
+ project-name Name of your project (interactive prompt if omitted)
235
+
146
236
  Options:
147
- --template <name> Specify a template (default: hello-world)
148
- --yarn Use Yarn as package manager
149
- --pnpm Use pnpm as package manager
150
- --npm Use npm as package manager
151
- --skip-install Skip dependency installation
152
- --skip-git Skip git initialization
153
- -h, --help Display help information
237
+ -t, --template <name> Template to use (hello-world, counter, bboard, dex, midnight-kitties)
238
+ --use-npm Use npm as package manager
239
+ --use-yarn Use Yarn as package manager
240
+ --use-pnpm Use pnpm as package manager
241
+ --use-bun Use bun as package manager
242
+ --skip-install Skip dependency installation
243
+ --skip-git Skip git initialization
244
+ --verbose Show detailed output including stack traces
245
+ -h, --help Display help information
246
+ -V, --version Display version number
247
+ ```
248
+
249
+ ### Examples
250
+
251
+ ```bash
252
+ # Interactive mode (recommended)
253
+ npx create-mn-app
254
+
255
+ # With project name
256
+ npx create-mn-app my-midnight-dapp
257
+
258
+ # Specific template and package manager
259
+ npx create-mn-app my-dex --template dex --use-pnpm
260
+
261
+ # Skip installation (for CI/CD)
262
+ npx create-mn-app my-app --skip-install --skip-git
263
+
264
+ # Verbose output for debugging
265
+ npx create-mn-app my-app --verbose
154
266
  ```
155
267
 
156
268
  ## Environment Configuration
@@ -170,7 +282,34 @@ PROOF_SERVER_URL=http://localhost:6300
170
282
 
171
283
  ⚠️ **Important**: Never commit your `.env` file or share your wallet seed phrase!
172
284
 
173
- ## Troubleshooting
285
+ ## 🔧 Troubleshooting
286
+
287
+ ### Node.js version error
288
+
289
+ If you see "Node.js Version Error":
290
+
291
+ ```bash
292
+ # Check your version
293
+ node --version
294
+
295
+ # Install Node.js 22+ from https://nodejs.org
296
+ # Or use nvm:
297
+ nvm install 22
298
+ nvm use 22
299
+ ```
300
+
301
+ The CLI automatically checks for Node.js 22+ before running!
302
+
303
+ ### Environment issues
304
+
305
+ Run the health check to diagnose problems:
306
+
307
+ ```bash
308
+ cd my-app
309
+ npm run health-check
310
+ ```
311
+
312
+ This will show you exactly what needs to be fixed. ✨
174
313
 
175
314
  ### Waiting for faucet funds
176
315
 
@@ -217,6 +356,21 @@ Ensure Docker Desktop is running before starting the development server:
217
356
 
218
357
  ```bash
219
358
  docker --version
359
+
360
+ # If not installed, get it from:
361
+ # https://docker.com
362
+ ```
363
+
364
+ ### Permission errors
365
+
366
+ If you encounter EACCES errors:
367
+
368
+ ```bash
369
+ # Fix npm permissions (recommended)
370
+ # See: https://docs.npmjs.com/resolving-eacces-permissions-errors
371
+
372
+ # Or use a version manager like nvm (better solution)
373
+ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
220
374
  ```
221
375
 
222
376
  ## Learn More
package/dist/cli.js CHANGED
@@ -5,28 +5,39 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const commander_1 = require("commander");
7
7
  const chalk_1 = __importDefault(require("chalk"));
8
- const create_app_1 = require("./create-app");
8
+ const create_app_js_1 = require("./create-app.js");
9
+ const error_handler_js_1 = require("./utils/error-handler.js");
9
10
  const program = new commander_1.Command();
11
+ // Check Node.js version before anything else (require 22+)
12
+ error_handler_js_1.ErrorHandler.checkNodeVersion(22);
10
13
  program
11
14
  .name("create-midnight-app")
12
15
  .description("Create a new Midnight Network application")
13
- .version("1.0.0")
16
+ .version("0.2.0")
14
17
  .argument("[project-directory]", "Directory name for your project")
15
- .option("-t, --template <name>", "Template to use", "hello-world")
16
- .option("--use-npm", "Use npm instead of yarn")
17
- .option("--use-pnpm", "Use pnpm instead of yarn")
18
+ .option("-t, --template <name>", "Template to use (hello-world, counter, bboard, dex, midnight-kitties)")
19
+ .option("--use-npm", "Use npm explicitly")
20
+ .option("--use-yarn", "Use yarn explicitly")
21
+ .option("--use-pnpm", "Use pnpm explicitly")
22
+ .option("--use-bun", "Use bun explicitly")
18
23
  .option("--skip-install", "Skip package installation")
19
24
  .option("--skip-git", "Skip git repository initialization")
20
25
  .option("--verbose", "Show detailed output")
21
26
  .action(async (projectDirectory, options) => {
22
27
  console.log(chalk_1.default.blue.bold("🌙 Create Midnight App\n"));
23
28
  try {
24
- await (0, create_app_1.createApp)(projectDirectory, options);
29
+ await (0, create_app_js_1.createApp)(projectDirectory, options);
25
30
  }
26
31
  catch (error) {
27
- console.error(chalk_1.default.red("✖ Error creating app:"), error instanceof Error ? error.message : error);
28
- if (options.verbose && error instanceof Error) {
29
- console.error(chalk_1.default.gray(error.stack));
32
+ console.error();
33
+ console.error(error_handler_js_1.ErrorHandler.formatError(error instanceof Error ? error : new Error(String(error)), "creating app"));
34
+ if (error instanceof Error) {
35
+ error_handler_js_1.ErrorHandler.suggestSolution(error);
36
+ if (options.verbose && error.stack) {
37
+ console.error(chalk_1.default.gray("Stack trace:"));
38
+ console.error(chalk_1.default.gray(error.stack));
39
+ console.error();
40
+ }
30
41
  }
31
42
  process.exit(1);
32
43
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,6CAAyC;AAEzC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,qBAAqB,CAAC;KAC3B,WAAW,CAAC,2CAA2C,CAAC;KACxD,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;KAClE,MAAM,CAAC,uBAAuB,EAAE,iBAAiB,EAAE,aAAa,CAAC;KACjE,MAAM,CAAC,WAAW,EAAE,yBAAyB,CAAC;KAC9C,MAAM,CAAC,YAAY,EAAE,0BAA0B,CAAC;KAChD,MAAM,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;KACrD,MAAM,CAAC,YAAY,EAAE,oCAAoC,CAAC;KAC1D,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE;IAC1C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,IAAA,sBAAS,EAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAClC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,mDAA4C;AAC5C,+DAAwD;AAExD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,2DAA2D;AAC3D,+BAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AAElC,OAAO;KACJ,IAAI,CAAC,qBAAqB,CAAC;KAC3B,WAAW,CAAC,2CAA2C,CAAC;KACxD,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;KAClE,MAAM,CACL,uBAAuB,EACvB,uEAAuE,CACxE;KACA,MAAM,CAAC,WAAW,EAAE,oBAAoB,CAAC;KACzC,MAAM,CAAC,YAAY,EAAE,qBAAqB,CAAC;KAC3C,MAAM,CAAC,YAAY,EAAE,qBAAqB,CAAC;KAC3C,MAAM,CAAC,WAAW,EAAE,oBAAoB,CAAC;KACzC,MAAM,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;KACrD,MAAM,CAAC,YAAY,EAAE,oCAAoC,CAAC;KAC1D,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE;IAC1C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,IAAA,yBAAS,EAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CACX,+BAAY,CAAC,WAAW,CACtB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACzD,cAAc,CACf,CACF,CAAC;QAEF,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,+BAAY,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAEpC,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAC1C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvC,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1,7 +1,9 @@
1
1
  export interface CreateAppOptions {
2
- template: string;
2
+ template?: string;
3
3
  useNpm?: boolean;
4
+ useYarn?: boolean;
4
5
  usePnpm?: boolean;
6
+ useBun?: boolean;
5
7
  skipInstall?: boolean;
6
8
  skipGit?: boolean;
7
9
  verbose?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"create-app.d.ts","sourceRoot":"","sources":["../src/create-app.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,SAAS,CAC7B,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAwGf"}
1
+ {"version":3,"file":"create-app.d.ts","sourceRoot":"","sources":["../src/create-app.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,SAAS,CAC7B,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CA0If"}