wynkjs 1.0.3 → 1.0.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 (37) hide show
  1. package/README.md +252 -55
  2. package/dist/database.d.ts +1 -1
  3. package/dist/database.js +1 -1
  4. package/dist/decorators/exception.advanced.d.ts +286 -18
  5. package/dist/decorators/exception.advanced.d.ts.map +1 -1
  6. package/dist/decorators/exception.advanced.js +410 -17
  7. package/dist/decorators/exception.decorators.d.ts +92 -2
  8. package/dist/decorators/exception.decorators.d.ts.map +1 -1
  9. package/dist/decorators/exception.decorators.js +120 -5
  10. package/dist/decorators/formatter.decorators.d.ts +93 -0
  11. package/dist/decorators/formatter.decorators.d.ts.map +1 -0
  12. package/dist/decorators/formatter.decorators.js +131 -0
  13. package/dist/decorators/guard.decorators.d.ts +2 -2
  14. package/dist/decorators/http.decorators.d.ts +3 -2
  15. package/dist/decorators/http.decorators.d.ts.map +1 -1
  16. package/dist/decorators/pipe.decorators.d.ts +2 -2
  17. package/dist/decorators/pipe.decorators.d.ts.map +1 -1
  18. package/dist/decorators/pipe.decorators.js +2 -2
  19. package/dist/dto.js +1 -1
  20. package/dist/factory.d.ts +1 -1
  21. package/dist/factory.d.ts.map +1 -1
  22. package/dist/factory.js +55 -6
  23. package/dist/filters/exception.filters.d.ts +124 -0
  24. package/dist/filters/exception.filters.d.ts.map +1 -0
  25. package/dist/filters/exception.filters.js +208 -0
  26. package/dist/index.d.ts +3 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +4 -1
  29. package/dist/pipes/validation.pipe.d.ts +3 -3
  30. package/dist/pipes/validation.pipe.d.ts.map +1 -1
  31. package/dist/pipes/validation.pipe.js +39 -11
  32. package/dist/schema-registry.d.ts +51 -0
  33. package/dist/schema-registry.d.ts.map +1 -0
  34. package/dist/schema-registry.js +134 -0
  35. package/dist/testing/index.d.ts +2 -2
  36. package/dist/testing/index.js +2 -2
  37. package/package.json +8 -3
@@ -5,46 +5,216 @@ import { NotFoundException, UnauthorizedException, ForbiddenException } from "./
5
5
  /**
6
6
  * Advanced Exception Filters for WynkJS Framework
7
7
  * Specialized filters for different error scenarios
8
+ *
9
+ * IMPORTANT: Exception Filter Execution Order
10
+ * ==========================================
11
+ *
12
+ * Filters execute in this order:
13
+ * 1. Method-level filters (@UseFilters() on route method)
14
+ * 2. Controller-level filters (@UseFilters() on controller class)
15
+ * 3. Global filters (app.useGlobalFilters())
16
+ *
17
+ * Within each level, filters execute in the order they are registered.
18
+ *
19
+ * ============================================================================
20
+ * CRITICAL: Understanding Filter Scope
21
+ * ============================================================================
22
+ *
23
+ * Exception filters in WynkJS have NO BUILT-IN FILTERING - they catch ALL
24
+ * exceptions of their type! You must control their scope through placement:
25
+ *
26
+ * ❌ PROBLEM: Type-Specific Filters as Global (Old Behavior)
27
+ * -----------------------------------------------------------
28
+ * Most type-specific filters (AuthenticationExceptionFilter, etc.) catch ALL
29
+ * instances of their exception type across your ENTIRE application!
30
+ *
31
+ * @example
32
+ * // ❌ BAD: These catch ALL exceptions of their type everywhere!
33
+ * app.useGlobalFilters(
34
+ * new AuthenticationExceptionFilter() // Catches ALL 401s
35
+ * );
36
+ *
37
+ * ✅ EXCEPTION: NotFoundExceptionFilter (Smart Filter)
38
+ * ----------------------------------------------------
39
+ * NotFoundExceptionFilter is SMART - it checks if response data exists:
40
+ * - If empty/null/[]/{} → Formats as "Not Found" error
41
+ * - If has data → Passes to next filter
42
+ *
43
+ * This makes it SAFE to use globally!
44
+ *
45
+ * @example
46
+ * // ✅ GOOD: NotFoundExceptionFilter can be used globally
47
+ * app.useGlobalFilters(
48
+ * new NotFoundExceptionFilter(), // Safe! Only formats truly empty 404s
49
+ * new DatabaseExceptionFilter(), // Only catches DB errors
50
+ * new GlobalExceptionFilter() // Catches everything else
51
+ * );
52
+ *
53
+ * ✅ SOLUTION 1: Use on Specific Routes/Controllers (For non-smart filters)
54
+ * --------------------------------------------------------------------------
55
+ * Apply filters where you need custom formatting:
56
+ *
57
+ * @example
58
+ * // ✅ GOOD: Only affects this controller
59
+ * @UseFilters(AuthenticationExceptionFilter)
60
+ * @Controller('/auth')
61
+ * export class AuthController {}
62
+ *
63
+ * ✅ SOLUTION 2: Use Generic Filters Globally
64
+ * --------------------------------------------
65
+ * These filters check exception types and re-throw what they don't handle:
66
+ *
67
+ * @example
68
+ * // ✅ GOOD: Generic filters that filter themselves
69
+ * app.useGlobalFilters(
70
+ * new DatabaseExceptionFilter(), // Only catches DB errors, re-throws HttpExceptions
71
+ * new NotFoundExceptionFilter(), // Smart filter - checks response data
72
+ * new GlobalExceptionFilter() // Catches everything else
73
+ * );
74
+ *
75
+ * Best Practice for Multiple Filters:
76
+ * ------------------------------------
77
+ * When using multiple specialized filters, register them from MOST SPECIFIC to MOST GENERAL:
78
+ *
79
+ * @example
80
+ * // ✅ RECOMMENDED GLOBAL SETUP
81
+ * const app = WynkFactory.create({
82
+ * controllers: [UserController],
83
+ * validationErrorFormatter: new FormatErrorFormatter(), // Handles validation
84
+ * });
85
+ *
86
+ * app.useGlobalFilters(
87
+ * new DatabaseExceptionFilter(), // Handles DB errors only
88
+ * new GlobalExceptionFilter() // Catches everything else
89
+ * );
90
+ *
91
+ * // Then use specific filters on specific routes:
92
+ * @UseFilters(NotFoundExceptionFilter)
93
+ * @Get('/:id')
94
+ * async findOne(@Param('id') id: string) {}
95
+ *
96
+ * How Filters Work:
97
+ * -----------------
98
+ * 1. Each filter checks if it should handle the exception
99
+ * 2. If YES: Returns the formatted error response
100
+ * 3. If NO: Re-throws the exception (using `throw exception`)
101
+ * 4. Next filter in chain catches the re-thrown exception
102
+ *
103
+ * IMPORTANT: Specialized filters now check for HttpException
104
+ * If you throw HttpException or its subclasses (ConflictException, NotFoundException, etc.),
105
+ * these specialized filters will re-throw them to let the default handler process them correctly.
8
106
  */
9
107
  /**
10
108
  * Error Formatter Interface
11
- * Used by ValidationExceptionFilter to format validation errors
109
+ * Used by WynkFactory to format validation errors
110
+ *
111
+ * IMPORTANT: These formatters are passed to WynkFactory.create(), NOT to useGlobalFilters()!
112
+ *
113
+ * @example
114
+ * // CORRECT usage:
115
+ * const app = WynkFactory.create({
116
+ * controllers: [UserController],
117
+ * validationErrorFormatter: new FormatErrorFormatter(), // ✅ Pass here
118
+ * });
119
+ *
120
+ * // WRONG usage:
121
+ * app.useGlobalFilters(
122
+ * new ValidationExceptionFilter(new FormatErrorFormatter()) // ❌ This does nothing!
123
+ * );
12
124
  */
13
125
  export interface ErrorFormatter {
14
126
  format(validationError: any): any;
15
127
  }
16
128
  /**
17
129
  * FormatErrorFormatter - Formats as { field: [messages] } like NestJS
130
+ *
131
+ * Output example:
132
+ * {
133
+ * "statusCode": 400,
134
+ * "message": "Validation failed",
135
+ * "errors": {
136
+ * "email": ["Invalid email address"],
137
+ * "age": ["Must be at least 18"]
138
+ * }
139
+ * }
140
+ *
141
+ * @example
142
+ * const app = WynkFactory.create({
143
+ * controllers: [UserController],
144
+ * validationErrorFormatter: new FormatErrorFormatter(),
145
+ * });
18
146
  */
19
147
  export declare class FormatErrorFormatter implements ErrorFormatter {
20
148
  format(error: any): any;
21
149
  }
22
150
  /**
23
151
  * SimpleErrorFormatter - Formats as simple array of messages
152
+ *
153
+ * Output example:
154
+ * {
155
+ * "statusCode": 400,
156
+ * "message": "Validation failed",
157
+ * "errors": [
158
+ * "Invalid email address",
159
+ * "Must be at least 18"
160
+ * ]
161
+ * }
162
+ *
163
+ * @example
164
+ * const app = WynkFactory.create({
165
+ * controllers: [UserController],
166
+ * validationErrorFormatter: new SimpleErrorFormatter(),
167
+ * });
24
168
  */
25
169
  export declare class SimpleErrorFormatter implements ErrorFormatter {
26
170
  format(error: any): any;
27
171
  }
28
172
  /**
29
173
  * DetailedErrorFormatter - Formats with detailed field info
174
+ *
175
+ * Output example:
176
+ * {
177
+ * "statusCode": 400,
178
+ * "message": "Validation failed",
179
+ * "errors": [
180
+ * {
181
+ * "field": "email",
182
+ * "message": "Invalid email address",
183
+ * "value": "invalid-email",
184
+ * "expected": {...schema...}
185
+ * }
186
+ * ]
187
+ * }
188
+ *
189
+ * @example
190
+ * const app = WynkFactory.create({
191
+ * controllers: [UserController],
192
+ * validationErrorFormatter: new DetailedErrorFormatter(),
193
+ * });
30
194
  */
31
195
  export declare class DetailedErrorFormatter implements ErrorFormatter {
32
196
  format(error: any): any;
33
197
  }
34
198
  /**
35
- * Validation Exception Filter - Handles validation errors with customizable formatting
36
- * @example
37
- * // With FormatErrorFormatter (NestJS-style)
38
- * app.useGlobalFilters(new ValidationExceptionFilter(new FormatErrorFormatter()));
199
+ * Validation Exception Filter - DEPRECATED / NOT RECOMMENDED
39
200
  *
40
- * // With SimpleErrorFormatter
41
- * app.useGlobalFilters(new ValidationExceptionFilter(new SimpleErrorFormatter()));
201
+ * ⚠️ WARNING: This filter is NOT used by WynkJS for validation errors!
42
202
  *
43
- * // With DetailedErrorFormatter
44
- * app.useGlobalFilters(new ValidationExceptionFilter(new DetailedErrorFormatter()));
203
+ * Validation errors are handled directly in the factory's onError hook.
204
+ * To format validation errors, use the validationErrorFormatter option:
45
205
  *
46
- * // Without formatter (default detailed format)
47
- * app.useGlobalFilters(new ValidationExceptionFilter());
206
+ * @example
207
+ * // ✅ CORRECT: Use validationErrorFormatter in factory options
208
+ * const app = WynkFactory.create({
209
+ * controllers: [UserController],
210
+ * validationErrorFormatter: new FormatErrorFormatter(), // This works!
211
+ * });
212
+ *
213
+ * // ❌ WRONG: This does nothing for validation errors
214
+ * app.useGlobalFilters(new ValidationExceptionFilter(new FormatErrorFormatter()));
215
+ *
216
+ * This class is kept for backward compatibility and custom use cases,
217
+ * but it's not part of the standard validation error flow.
48
218
  */
49
219
  export declare class ValidationExceptionFilter implements WynkExceptionFilter {
50
220
  private formatter;
@@ -53,11 +223,38 @@ export declare class ValidationExceptionFilter implements WynkExceptionFilter {
53
223
  private isValidationError;
54
224
  }
55
225
  /**
56
- * Database Exception Filter - Handles database errors
226
+ * Database Exception Filter - Handles database errors ONLY (not HttpExceptions)
227
+ *
228
+ * This filter catches actual database errors (like unique constraint violations,
229
+ * foreign key errors, etc.) and converts them to user-friendly messages.
230
+ *
231
+ * It will NOT catch HttpException or its subclasses (ConflictException, etc.)
232
+ * that you throw manually - those will pass through to be handled correctly.
233
+ *
57
234
  * @example
235
+ * // Use as global filter
236
+ * app.useGlobalFilters(new DatabaseExceptionFilter());
237
+ *
238
+ * // Use on specific controller
58
239
  * @UseFilters(DatabaseExceptionFilter)
59
240
  * @Controller('/users')
60
- * export class UserController {}
241
+ * export class UserController {
242
+ * @Post()
243
+ * async create(@Body() data: any) {
244
+ * // If you throw manually, it passes through:
245
+ * if (await this.userExists(data.email)) {
246
+ * throw new ConflictException('User with this email already exists'); // ✅ Works correctly
247
+ * }
248
+ *
249
+ * // If database throws error, filter catches it:
250
+ * return await this.db.insert(users).values(data); // ❌ DB unique constraint error → caught by filter
251
+ * }
252
+ * }
253
+ *
254
+ * Handles these database error codes:
255
+ * - 23505: Unique constraint violation → 409 Conflict
256
+ * - 23503: Foreign key constraint violation → 400 Bad Request
257
+ * - 23502: Not null constraint violation → 400 Bad Request
61
258
  */
62
259
  export declare class DatabaseExceptionFilter implements WynkExceptionFilter {
63
260
  catch(exception: any, context: ExecutionContext): {
@@ -70,10 +267,20 @@ export declare class DatabaseExceptionFilter implements WynkExceptionFilter {
70
267
  }
71
268
  /**
72
269
  * Authentication Exception Filter - Handles auth errors
270
+ *
271
+ * ⚠️ IMPORTANT: This catches ALL UnauthorizedException instances!
272
+ * Use on specific routes/controllers, not globally.
273
+ *
73
274
  * @example
275
+ * // ✅ GOOD: Use on auth-protected controller
74
276
  * @UseFilters(AuthenticationExceptionFilter)
75
277
  * @Controller('/auth')
76
- * export class AuthController {}
278
+ * export class AuthController {
279
+ * @Post('/login')
280
+ * async login() {
281
+ * throw new UnauthorizedException('Invalid credentials');
282
+ * }
283
+ * }
77
284
  */
78
285
  export declare class AuthenticationExceptionFilter implements WynkExceptionFilter<UnauthorizedException> {
79
286
  catch(exception: UnauthorizedException, context: ExecutionContext): {
@@ -87,10 +294,20 @@ export declare class AuthenticationExceptionFilter implements WynkExceptionFilte
87
294
  }
88
295
  /**
89
296
  * Authorization Exception Filter - Handles permission errors
297
+ *
298
+ * ⚠️ IMPORTANT: This catches ALL ForbiddenException instances!
299
+ * Use on specific routes/controllers, not globally.
300
+ *
90
301
  * @example
302
+ * // ✅ GOOD: Use on admin-only controller
91
303
  * @UseFilters(AuthorizationExceptionFilter)
92
304
  * @Controller('/admin')
93
- * export class AdminController {}
305
+ * export class AdminController {
306
+ * @Get('/users')
307
+ * async getAllUsers() {
308
+ * throw new ForbiddenException('Admin access required');
309
+ * }
310
+ * }
94
311
  */
95
312
  export declare class AuthorizationExceptionFilter implements WynkExceptionFilter<ForbiddenException> {
96
313
  catch(exception: ForbiddenException, context: ExecutionContext): {
@@ -103,11 +320,48 @@ export declare class AuthorizationExceptionFilter implements WynkExceptionFilter
103
320
  };
104
321
  }
105
322
  /**
106
- * Not Found Exception Filter - Handles 404 errors
323
+ * Not Found Exception Filter - Handles 404 errors with smart detection
324
+ *
325
+ * This filter is SMART - it only handles NotFoundExceptionFilter if:
326
+ * 1. The exception is NotFoundException, AND
327
+ * 2. No response data has been set (empty, null, empty array, or empty object)
328
+ *
329
+ * This allows it to be used globally without breaking routes that return
330
+ * legitimate empty responses or have their own error handling.
331
+ *
107
332
  * @example
108
- * @UseFilters(NotFoundExceptionFilter)
333
+ * // ✅ Can be used globally - smart filtering
334
+ * app.useGlobalFilters(
335
+ * new NotFoundExceptionFilter(), // Safe to use globally now!
336
+ * new GlobalExceptionFilter()
337
+ * );
338
+ *
339
+ * @example
340
+ * // Works correctly in all scenarios:
341
+ *
342
+ * // Scenario 1: Empty response with NotFoundException
109
343
  * @Get('/:id')
110
- * async findOne(@Param('id') id: string) {}
344
+ * async findOne(@Param('id') id: string) {
345
+ * const item = await this.service.findOne(id);
346
+ * if (!item) {
347
+ * throw new NotFoundException('Item not found'); // ✅ Caught and formatted by NotFoundExceptionFilter
348
+ * }
349
+ * return item;
350
+ * }
351
+ *
352
+ * // Scenario 2: Valid empty array response
353
+ * @Get('/search')
354
+ * async search(@Query('q') query: string) {
355
+ * const results = await this.service.search(query);
356
+ * return results; // ✅ Returns [] without triggering NotFoundExceptionFilter (no NotFoundException thrown)
357
+ * }
358
+ *
359
+ * // Scenario 3: NotFoundException with existing response data
360
+ * @Get('/custom')
361
+ * async custom() {
362
+ * const data = { message: 'Custom data' };
363
+ * throw new NotFoundException('Not found'); // ✅ Passes through (has response data)
364
+ * }
111
365
  */
112
366
  export declare class NotFoundExceptionFilter implements WynkExceptionFilter<NotFoundException> {
113
367
  catch(exception: NotFoundException, context: ExecutionContext): {
@@ -118,6 +372,12 @@ export declare class NotFoundExceptionFilter implements WynkExceptionFilter<NotF
118
372
  path: any;
119
373
  suggestion: string;
120
374
  };
375
+ /**
376
+ * Check if response has meaningful data
377
+ * Returns false for: null, undefined, {}, [], ""
378
+ * Returns true for: anything else
379
+ */
380
+ private hasResponseData;
121
381
  }
122
382
  /**
123
383
  * Rate Limit Exception Filter - Handles rate limit errors
@@ -186,4 +446,12 @@ export declare class GlobalExceptionFilter implements WynkExceptionFilter {
186
446
  path: any;
187
447
  };
188
448
  }
449
+ /**
450
+ * ============================================================================
451
+ * COMPLETE EXAMPLE: Using Multiple Exception Filters
452
+ * ============================================================================
453
+ *
454
+ * Here's a complete example showing how to properly use multiple exception
455
+ * filters in a WynkJS application with the correct order and behavior.
456
+ */
189
457
  //# sourceMappingURL=exception.advanced.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exception.advanced.d.ts","sourceRoot":"","sources":["../../core/decorators/exception.advanced.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAEL,iBAAiB,EAEjB,qBAAqB,EACrB,kBAAkB,EAEnB,MAAM,wBAAwB,CAAC;AAEhC;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,eAAe,EAAE,GAAG,GAAG,GAAG,CAAC;CACnC;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;CAsBxB;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;CAiBxB;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;CAgCxB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IACnE,OAAO,CAAC,SAAS,CAA+B;gBAEpC,SAAS,CAAC,EAAE,cAAc;IAItC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;IAgC/C,OAAO,CAAC,iBAAiB;CAiB1B;AAED;;;;;;GAMG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;;;;;;;CAiChD;AAED;;;;;;GAMG;AACH,qBAAa,6BACX,YAAW,mBAAmB,CAAC,qBAAqB,CAAC;IAErD,KAAK,CAAC,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;CAalE;AAED;;;;;;GAMG;AACH,qBAAa,4BACX,YAAW,mBAAmB,CAAC,kBAAkB,CAAC;IAElD,KAAK,CAAC,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;CAe/D;AAED;;;;;;GAMG;AACH,qBAAa,uBACX,YAAW,mBAAmB,CAAC,iBAAiB,CAAC;IAEjD,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;CAa9D;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,YAAW,mBAAmB;IAClE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;;CAchD;AAED;;;;;;GAMG;AACH,qBAAa,4BAA6B,YAAW,mBAAmB;IACtE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;;CAchD;AAED;;;;;;GAMG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IACnE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;;;;;;;CAsBhD;AAED;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,mBAAmB;IAC/D,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;CA2BhD"}
1
+ {"version":3,"file":"exception.advanced.d.ts","sourceRoot":"","sources":["../../core/decorators/exception.advanced.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAEL,iBAAiB,EAEjB,qBAAqB,EACrB,kBAAkB,EAEnB,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqGG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,eAAe,EAAE,GAAG,GAAG,GAAG,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;CAsBxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;CAiBxB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;CAgCxB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IACnE,OAAO,CAAC,SAAS,CAA+B;gBAEpC,SAAS,CAAC,EAAE,cAAc;IAItC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;IAgC/C,OAAO,CAAC,iBAAiB;CAiB1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;;;;;;;CAuChD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,6BACX,YAAW,mBAAmB,CAAC,qBAAqB,CAAC;IAErD,KAAK,CAAC,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;CAalE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,4BACX,YAAW,mBAAmB,CAAC,kBAAkB,CAAC;IAElD,KAAK,CAAC,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;CAe/D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,qBAAa,uBACX,YAAW,mBAAmB,CAAC,iBAAiB,CAAC;IAEjD,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;IA2B7D;;;;OAIG;IACH,OAAO,CAAC,eAAe;CAuBxB;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,YAAW,mBAAmB;IAClE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;;CAmBhD;AAED;;;;;;GAMG;AACH,qBAAa,4BAA6B,YAAW,mBAAmB;IACtE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;;CAmBhD;AAED;;;;;;GAMG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IACnE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;;;;;;;CA2BhD;AAED;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,mBAAmB;IAC/D,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;;;;;;;;CA2BhD;AAED;;;;;;;GAOG"}