xypriss 2.3.7 → 3.0.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 (32) hide show
  1. package/README.md +21 -19
  2. package/dist/cjs/mods/security/src/index.js +1 -1
  3. package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js +2 -2
  4. package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
  5. package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js +51 -2
  6. package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js.map +1 -1
  7. package/dist/cjs/src/middleware/built-in/security/BrowserOnlyProtector.js +550 -0
  8. package/dist/cjs/src/middleware/built-in/security/BrowserOnlyProtector.js.map +1 -0
  9. package/dist/cjs/src/middleware/built-in/security/TerminalOnlyProtector.js +477 -0
  10. package/dist/cjs/src/middleware/built-in/security/TerminalOnlyProtector.js.map +1 -0
  11. package/dist/cjs/src/middleware/security-middleware.js +221 -80
  12. package/dist/cjs/src/middleware/security-middleware.js.map +1 -1
  13. package/dist/cjs/src/server/components/fastapi/templates/redirectTemp.js +1 -1
  14. package/dist/cjs/src/server/const/default.js +1 -1
  15. package/dist/cjs/src/server/const/default.js.map +1 -1
  16. package/dist/esm/mods/security/src/index.js +1 -1
  17. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +2 -2
  18. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
  19. package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js +51 -2
  20. package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js.map +1 -1
  21. package/dist/esm/src/middleware/built-in/security/BrowserOnlyProtector.js +548 -0
  22. package/dist/esm/src/middleware/built-in/security/BrowserOnlyProtector.js.map +1 -0
  23. package/dist/esm/src/middleware/built-in/security/TerminalOnlyProtector.js +475 -0
  24. package/dist/esm/src/middleware/built-in/security/TerminalOnlyProtector.js.map +1 -0
  25. package/dist/esm/src/middleware/security-middleware.js +221 -80
  26. package/dist/esm/src/middleware/security-middleware.js.map +1 -1
  27. package/dist/esm/src/server/components/fastapi/templates/redirectTemp.js +1 -1
  28. package/dist/esm/src/server/const/default.js +1 -1
  29. package/dist/esm/src/server/const/default.js.map +1 -1
  30. package/dist/index.d.ts +187 -6
  31. package/package.json +6 -5
  32. package/scripts/install-memory-cli.js +1 -1
@@ -0,0 +1,548 @@
1
+ import { Logger } from '../../../../shared/logger/Logger.js';
2
+
3
+ /**
4
+ * Browser-Only Protector - Enhanced Edition
5
+ * Aggressively blocks non-browser requests while avoiding false positives
6
+ * Uses multi-layered validation with scoring system
7
+ */
8
+ class BrowserOnlyProtector {
9
+ constructor(options = {}, logger) {
10
+ this.BROWSER_SCORE_THRESHOLD = 3; // Minimum score to pass as browser
11
+ this.config = {
12
+ requireSecFetch: true,
13
+ blockAutomationTools: true,
14
+ requireComplexAccept: false,
15
+ allowOriginRequests: true,
16
+ errorMessage: "Browser access required. Direct API access blocked.",
17
+ statusCode: 403,
18
+ debug: false,
19
+ ...options,
20
+ };
21
+ // Only set customValidator if explicitly provided
22
+ if (options.customValidator !== undefined) {
23
+ this.config.customValidator = options.customValidator;
24
+ }
25
+ // Initialize logger
26
+ this.logger =
27
+ logger ||
28
+ new Logger({
29
+ enabled: true,
30
+ level: "debug",
31
+ components: { security: true },
32
+ types: { debug: true },
33
+ });
34
+ }
35
+ /**
36
+ * Get the browser-only middleware function
37
+ */
38
+ getMiddleware() {
39
+ return (req, res, next) => {
40
+ this.handleRequest(req, res, next);
41
+ };
42
+ }
43
+ /**
44
+ * Handle incoming request and determine if it's from a browser
45
+ */
46
+ handleRequest(req, res, next) {
47
+ this.logger.debug("security", "BrowOn called for request");
48
+ if (this.config.debug) {
49
+ this.logger.debug("security", "BrowOn analyzing request", {
50
+ secFetchDest: req.headers["sec-fetch-dest"],
51
+ secFetchMode: req.headers["sec-fetch-mode"],
52
+ secFetchSite: req.headers["sec-fetch-site"],
53
+ });
54
+ }
55
+ // Custom validator takes precedence (if provided)
56
+ if (this.config.customValidator &&
57
+ typeof this.config.customValidator === "function") {
58
+ if (!this.config.customValidator(req)) {
59
+ return this.blockRequest(res, "BROWSER_ONLY", "Custom validator failed");
60
+ }
61
+ return next();
62
+ }
63
+ // CRITICAL: Block if automation tool is detected (highest priority)
64
+ if (this.config.blockAutomationTools &&
65
+ this.isDefinitelyAutomationTool(req)) {
66
+ return this.blockRequest(res, "AUTOMATION_TOOL_DETECTED", "Request from known automation tool");
67
+ }
68
+ // Check for Sec-Fetch headers (modern browsers only)
69
+ if (this.config.requireSecFetch) {
70
+ const hasSecFetch = this.hasSecFetchHeaders(req);
71
+ if (hasSecFetch) {
72
+ // Validate Sec-Fetch headers are legitimate (not spoofed)
73
+ if (this.validateSecFetchHeaders(req)) {
74
+ if (this.config.debug) {
75
+ this.logger.debug("security", "BrowserOnly valid Sec-Fetch headers - allowing request");
76
+ }
77
+ return next();
78
+ }
79
+ else {
80
+ // Sec-Fetch headers present but invalid - suspicious
81
+ if (this.config.debug) {
82
+ this.logger.debug("security", "BrowserOnly invalid Sec-Fetch headers detected - potential spoofing");
83
+ }
84
+ return this.blockRequest(res, "INVALID_SEC_FETCH", "Sec-Fetch headers present but invalid");
85
+ }
86
+ }
87
+ // No Sec-Fetch headers - use scoring system to determine if browser
88
+ const browserScore = this.calculateBrowserScore(req);
89
+ if (this.config.debug) {
90
+ this.logger.debug("security", `BrowserOnly browser score: ${browserScore.total}/${this.BROWSER_SCORE_THRESHOLD} (need ${this.BROWSER_SCORE_THRESHOLD} to pass)`);
91
+ this.logger.debug("security", "BrowserOnly score breakdown", browserScore.breakdown);
92
+ }
93
+ if (browserScore.total >= this.BROWSER_SCORE_THRESHOLD) {
94
+ if (this.config.debug) {
95
+ this.logger.debug("security", "BrowserOnly browser score passed - allowing request");
96
+ }
97
+ return next();
98
+ }
99
+ // Failed browser score check
100
+ return this.blockRequest(res, "INSUFFICIENT_BROWSER_INDICATORS", `Browser score ${browserScore.total}/${this.BROWSER_SCORE_THRESHOLD} - not enough browser characteristics`);
101
+ }
102
+ // Sec-Fetch check disabled, allow all requests
103
+ next();
104
+ }
105
+ /**
106
+ * Check if request has Sec-Fetch headers
107
+ */
108
+ hasSecFetchHeaders(req) {
109
+ return !!(req.headers["sec-fetch-dest"] ||
110
+ req.headers["sec-fetch-mode"] ||
111
+ req.headers["sec-fetch-site"] ||
112
+ req.headers["sec-fetch-user"]);
113
+ }
114
+ /**
115
+ * Validate Sec-Fetch headers are consistent and legitimate
116
+ */
117
+ validateSecFetchHeaders(req) {
118
+ const dest = req.headers["sec-fetch-dest"];
119
+ const mode = req.headers["sec-fetch-mode"];
120
+ const site = req.headers["sec-fetch-site"];
121
+ const user = req.headers["sec-fetch-user"];
122
+ // Must have at least dest and mode
123
+ if (!dest || !mode) {
124
+ return false;
125
+ }
126
+ // Validate dest values (common legitimate values)
127
+ const validDest = [
128
+ "document",
129
+ "empty",
130
+ "iframe",
131
+ "image",
132
+ "script",
133
+ "style",
134
+ "font",
135
+ "audio",
136
+ "video",
137
+ "manifest",
138
+ "object",
139
+ "embed",
140
+ "worker",
141
+ "sharedworker",
142
+ "serviceworker",
143
+ ];
144
+ if (!validDest.includes(dest)) {
145
+ return false;
146
+ }
147
+ // Validate mode values
148
+ const validMode = [
149
+ "navigate",
150
+ "cors",
151
+ "no-cors",
152
+ "same-origin",
153
+ "websocket",
154
+ ];
155
+ if (!validMode.includes(mode)) {
156
+ return false;
157
+ }
158
+ // Validate site values
159
+ if (site &&
160
+ !["same-origin", "same-site", "cross-site", "none"].includes(site)) {
161
+ return false;
162
+ }
163
+ // Validate user values (should be ?1 if present)
164
+ if (user !== undefined && user !== "?1") {
165
+ return false;
166
+ }
167
+ // Cross-validate consistency
168
+ if (mode === "navigate" && dest !== "document" && dest !== "iframe") {
169
+ return false; // Navigate mode should only be for documents/iframes
170
+ }
171
+ if (user === "?1" && mode !== "navigate") {
172
+ return false; // User activation only makes sense for navigation
173
+ }
174
+ return true;
175
+ }
176
+ /**
177
+ * Definitively identify automation tools (aggressive blocking)
178
+ */
179
+ isDefinitelyAutomationTool(req) {
180
+ const userAgent = (req.headers["user-agent"] || "").toLowerCase();
181
+ const accept = req.headers["accept"] || "";
182
+ if (this.config.debug) {
183
+ this.logger.debug("security", "BrowserOnly checking automation tool detection", {
184
+ userAgent,
185
+ accept,
186
+ });
187
+ }
188
+ // Known automation tool patterns (comprehensive list)
189
+ const automationPatterns = [
190
+ /\bcurl\/\d+/i,
191
+ /\bwget\/\d+/i,
192
+ /\bpostman/i,
193
+ /\binsomnia/i,
194
+ /\bhttpie/i,
195
+ /\bpython-requests/i,
196
+ /\baxios/i,
197
+ /\bnode-fetch/i,
198
+ /\bundici/i,
199
+ /\bsuperagent/i,
200
+ /\bneedle/i,
201
+ /\bhyperquest/i,
202
+ /\bwreck/i,
203
+ /\brestify/i,
204
+ /\bgot\//i,
205
+ /^python[\/-]/i,
206
+ /^java[\/-]/i,
207
+ /^go-http-client/i,
208
+ /^ruby/i,
209
+ /^php/i,
210
+ /\bpycurl/i,
211
+ /\blibwww-perl/i,
212
+ /\blibcurl/i,
213
+ /\bhttp\.rb/i,
214
+ /\bhttpclient/i,
215
+ /\bapache-httpclient/i,
216
+ /\bokhttp/i,
217
+ /\bretrofit/i,
218
+ /\bunirest/i,
219
+ /\brest-client/i,
220
+ /\bhttparty/i,
221
+ /\bfetch\//i,
222
+ /\bscraper/i,
223
+ /\bbot\b/i,
224
+ /\bcrawler/i,
225
+ /\bspider/i,
226
+ /\bpuppeteer/i,
227
+ /\bplaywright/i,
228
+ /\bselenium/i,
229
+ /\bphantomjs/i,
230
+ /\bheadless/i,
231
+ ];
232
+ // Check user agent
233
+ for (const pattern of automationPatterns) {
234
+ if (pattern.test(userAgent)) {
235
+ if (this.config.debug) {
236
+ this.logger.debug("security", "BrowserOnly automation tool detected", {
237
+ pattern: pattern.toString(),
238
+ userAgent,
239
+ });
240
+ }
241
+ return true;
242
+ }
243
+ }
244
+ // Suspicious: Empty user agent
245
+ if (!userAgent || userAgent.trim() === "") {
246
+ return true;
247
+ }
248
+ // Suspicious: Too short user agent (< 20 chars usually means custom/scripted)
249
+ if (userAgent.length < 20 && !this.isKnownShortBrowserUA(userAgent)) {
250
+ return true;
251
+ }
252
+ // Suspicious: Accept */* with empty or simple user agent
253
+ if (accept === "*/*" && userAgent.length < 50) {
254
+ return true;
255
+ }
256
+ // Suspicious: User agent contains only version numbers and basic text
257
+ if (/^[a-z0-9\.\-\/\s]+$/i.test(userAgent) && userAgent.length < 30) {
258
+ return true;
259
+ }
260
+ return false;
261
+ }
262
+ /**
263
+ * Check if user agent is a known short legitimate browser UA
264
+ */
265
+ isKnownShortBrowserUA(userAgent) {
266
+ // Some mobile browsers or minimal browsers have shorter UAs
267
+ const knownShort = [/^opera/i, /^lynx/i];
268
+ return knownShort.some((pattern) => pattern.test(userAgent));
269
+ }
270
+ /**
271
+ * Calculate browser legitimacy score using multiple indicators
272
+ */
273
+ calculateBrowserScore(req) {
274
+ const breakdown = {};
275
+ let total = 0;
276
+ // 1. User Agent Analysis (0-2 points)
277
+ const uaScore = this.scoreUserAgent(req);
278
+ breakdown["userAgent"] = uaScore;
279
+ total += uaScore;
280
+ // 2. Accept Header Analysis (0-1 points)
281
+ const acceptScore = this.scoreAcceptHeader(req);
282
+ breakdown["accept"] = acceptScore;
283
+ total += acceptScore;
284
+ // 3. Accept-Language (0-1 points)
285
+ const langScore = this.scoreAcceptLanguage(req);
286
+ breakdown["acceptLanguage"] = langScore;
287
+ total += langScore;
288
+ // 4. Accept-Encoding (0-1 points)
289
+ const encodingScore = this.scoreAcceptEncoding(req);
290
+ breakdown["acceptEncoding"] = encodingScore;
291
+ total += encodingScore;
292
+ // 5. Origin/Referer (0-1 points)
293
+ const originScore = this.scoreOriginReferer(req);
294
+ breakdown["originReferer"] = originScore;
295
+ total += originScore;
296
+ // 6. Connection headers (0-1 points)
297
+ const connectionScore = this.scoreConnectionHeaders(req);
298
+ breakdown["connection"] = connectionScore;
299
+ total += connectionScore;
300
+ // 7. Cache-Control (0-1 points)
301
+ const cacheScore = this.scoreCacheControl(req);
302
+ breakdown["cache"] = cacheScore;
303
+ total += cacheScore;
304
+ // 8. DNT/Upgrade-Insecure-Requests (0-1 points)
305
+ const privacyScore = this.scorePrivacyHeaders(req);
306
+ breakdown["privacy"] = privacyScore;
307
+ total += privacyScore;
308
+ return { total, breakdown };
309
+ }
310
+ /**
311
+ * Score User-Agent header (0-2 points)
312
+ */
313
+ scoreUserAgent(req) {
314
+ const ua = req.headers["user-agent"] || "";
315
+ let score = 0;
316
+ // Must contain browser indicators
317
+ if (/\b(Mozilla|Chrome|Safari|Firefox|Edge|Opera|Trident)\b/i.test(ua)) {
318
+ score += 1;
319
+ }
320
+ // Must be long and complex (typical browser UAs are 100+ chars)
321
+ if (ua.length > 80) {
322
+ score += 1;
323
+ }
324
+ // Contains platform info (Windows, Macintosh, Linux, Android, iOS)
325
+ if (/\b(Windows|Macintosh|Linux|Android|iPhone|iPad)\b/i.test(ua)) {
326
+ score += 0.5;
327
+ }
328
+ // Contains rendering engine (AppleWebKit, Gecko, Blink)
329
+ if (/\b(AppleWebKit|Gecko|Blink|rv:)\b/i.test(ua)) {
330
+ score += 0.5;
331
+ }
332
+ return Math.min(score, 2);
333
+ }
334
+ /**
335
+ * Score Accept header (0-1 points)
336
+ */
337
+ scoreAcceptHeader(req) {
338
+ const accept = req.headers["accept"] || "";
339
+ // Browsers send complex Accept headers
340
+ if (accept.includes("text/html") &&
341
+ accept.includes("application/xhtml+xml")) {
342
+ return 1;
343
+ }
344
+ // At least multiple MIME types
345
+ if (accept.split(",").length >= 3) {
346
+ return 0.5;
347
+ }
348
+ return 0;
349
+ }
350
+ /**
351
+ * Score Accept-Language header (0-1 points)
352
+ */
353
+ scoreAcceptLanguage(req) {
354
+ const lang = req.headers["accept-language"];
355
+ if (!lang) {
356
+ return 0;
357
+ }
358
+ // Browsers send detailed language preferences with quality values
359
+ if (lang.includes("q=") || lang.split(",").length >= 2) {
360
+ return 1;
361
+ }
362
+ // At least has a language code
363
+ if (lang.length >= 2) {
364
+ return 0.5;
365
+ }
366
+ return 0;
367
+ }
368
+ /**
369
+ * Score Accept-Encoding header (0-1 points)
370
+ */
371
+ scoreAcceptEncoding(req) {
372
+ const encoding = req.headers["accept-encoding"];
373
+ if (!encoding) {
374
+ return 0;
375
+ }
376
+ // Browsers support multiple compression formats
377
+ const hasGzip = encoding.includes("gzip");
378
+ const hasDeflate = encoding.includes("deflate");
379
+ const hasBr = encoding.includes("br");
380
+ if ((hasGzip && hasDeflate) || hasBr) {
381
+ return 1;
382
+ }
383
+ if (hasGzip || hasDeflate) {
384
+ return 0.5;
385
+ }
386
+ return 0;
387
+ }
388
+ /**
389
+ * Score Origin/Referer headers (0-1 points)
390
+ */
391
+ scoreOriginReferer(req) {
392
+ const origin = req.headers["origin"];
393
+ const referer = req.headers["referer"];
394
+ // Origin header (CORS request from browser)
395
+ if (origin && this.config.allowOriginRequests) {
396
+ // Validate it's a proper URL
397
+ if (this.isValidUrl(origin)) {
398
+ return 1;
399
+ }
400
+ }
401
+ // Referer header (navigation from another page)
402
+ if (referer && this.isValidUrl(referer)) {
403
+ return 1;
404
+ }
405
+ return 0;
406
+ }
407
+ /**
408
+ * Score Connection headers (0-1 points)
409
+ */
410
+ scoreConnectionHeaders(req) {
411
+ const connection = req.headers["connection"];
412
+ const upgrade = req.headers["upgrade-insecure-requests"];
413
+ // Browsers typically send keep-alive
414
+ if (connection && connection.toLowerCase().includes("keep-alive")) {
415
+ return 0.5;
416
+ }
417
+ // Upgrade-Insecure-Requests is browser-specific
418
+ if (upgrade === "1") {
419
+ return 1;
420
+ }
421
+ return 0;
422
+ }
423
+ /**
424
+ * Score Cache-Control header (0-1 points)
425
+ */
426
+ scoreCacheControl(req) {
427
+ const cache = req.headers["cache-control"];
428
+ if (!cache) {
429
+ return 0;
430
+ }
431
+ // Browsers send various cache directives
432
+ if (cache.includes("max-age") ||
433
+ cache.includes("no-cache") ||
434
+ cache.includes("no-store")) {
435
+ return 1;
436
+ }
437
+ return 0;
438
+ }
439
+ /**
440
+ * Score privacy-related headers (0-1 points)
441
+ */
442
+ scorePrivacyHeaders(req) {
443
+ const dnt = req.headers["dnt"];
444
+ const gpc = req.headers["sec-gpc"];
445
+ const upgradeInsecure = req.headers["upgrade-insecure-requests"];
446
+ // DNT (Do Not Track)
447
+ if (dnt === "1") {
448
+ return 1;
449
+ }
450
+ // GPC (Global Privacy Control)
451
+ if (gpc === "1") {
452
+ return 1;
453
+ }
454
+ // Upgrade-Insecure-Requests
455
+ if (upgradeInsecure === "1") {
456
+ return 1;
457
+ }
458
+ return 0;
459
+ }
460
+ /**
461
+ * Validate if string is a proper URL
462
+ */
463
+ isValidUrl(url) {
464
+ try {
465
+ const parsed = new URL(url);
466
+ return parsed.protocol === "http:" || parsed.protocol === "https:";
467
+ }
468
+ catch {
469
+ return false;
470
+ }
471
+ }
472
+ /**
473
+ * Check if request shows browser-like characteristics (legacy method - kept for compatibility)
474
+ */
475
+ isLikelyBrowserRequest(req) {
476
+ const score = this.calculateBrowserScore(req);
477
+ return score.total >= this.BROWSER_SCORE_THRESHOLD;
478
+ }
479
+ /**
480
+ * Check if User-Agent indicates an automation tool (legacy method - kept for compatibility)
481
+ */
482
+ isAutomationTool(userAgent) {
483
+ return this.isDefinitelyAutomationTool({
484
+ headers: { "user-agent": userAgent },
485
+ });
486
+ }
487
+ /**
488
+ * Check if Accept header is complex enough for a browser (legacy method)
489
+ */
490
+ hasComplexAcceptHeader(accept) {
491
+ if (!accept || accept === "*/*") {
492
+ return false;
493
+ }
494
+ const acceptParts = accept.split(",").map((s) => s.trim());
495
+ return acceptParts.length >= 3 && accept.includes("text/html");
496
+ }
497
+ /**
498
+ * Check for other browser indicators (legacy method)
499
+ */
500
+ hasBrowserIndicators(req) {
501
+ const score = this.calculateBrowserScore(req);
502
+ return score.total >= this.BROWSER_SCORE_THRESHOLD;
503
+ }
504
+ /**
505
+ * Block the request with appropriate error response
506
+ */
507
+ blockRequest(res, code, details) {
508
+ // Generic error message for security (don't reveal implementation details)
509
+ const isDevelopment = this.config.debug;
510
+ const response = {
511
+ error: isDevelopment ? this.config.errorMessage : "Access denied",
512
+ timestamp: new Date().toISOString(),
513
+ code: "NEHONIXYPBROw01",
514
+ };
515
+ // Add XyPriss-specific info for developers in development/debug mode
516
+ if (isDevelopment) {
517
+ response.xypriss = {
518
+ module: "BrowserOnly",
519
+ code,
520
+ details,
521
+ userAgent: res.req?.headers["user-agent"]?.substring(0, 100),
522
+ };
523
+ }
524
+ if (this.config.debug) {
525
+ this.logger.debug("security", "BrowserOnly blocking request", {
526
+ code,
527
+ details,
528
+ userAgent: res.req?.headers["user-agent"]?.substring(0, 100),
529
+ });
530
+ }
531
+ res.status(this.config.statusCode).json(response);
532
+ }
533
+ /**
534
+ * Update configuration
535
+ */
536
+ updateConfig(newConfig) {
537
+ this.config = { ...this.config, ...newConfig };
538
+ }
539
+ /**
540
+ * Get current configuration
541
+ */
542
+ getConfig() {
543
+ return { ...this.config };
544
+ }
545
+ }
546
+
547
+ export { BrowserOnlyProtector };
548
+ //# sourceMappingURL=BrowserOnlyProtector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserOnlyProtector.js","sources":["../../../../../../src/middleware/built-in/security/BrowserOnlyProtector.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;;;;AAIG;MAuBU,oBAAoB,CAAA;IAK7B,WAAY,CAAA,OAAA,GAA6B,EAAE,EAAE,MAAe,EAAA;AAH3C,QAAA,IAAA,CAAA,uBAAuB,GAAG,CAAC,CAAC;QAIzC,IAAI,CAAC,MAAM,GAAG;AACV,YAAA,eAAe,EAAE,IAAI;AACrB,YAAA,oBAAoB,EAAE,IAAI;AAC1B,YAAA,oBAAoB,EAAE,KAAK;AAC3B,YAAA,mBAAmB,EAAE,IAAI;AACzB,YAAA,YAAY,EAAE,qDAAqD;AACnE,YAAA,UAAU,EAAE,GAAG;AACf,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,GAAG,OAAO;SACb,CAAC;;AAGF,QAAA,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;SACzD;;AAGD,QAAA,IAAI,CAAC,MAAM;YACP,MAAM;AACN,gBAAA,IAAI,MAAM,CAAC;AACP,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,KAAK,EAAE,OAAO;AACd,oBAAA,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC9B,oBAAA,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;AACzB,iBAAA,CAAC,CAAC;KACV;AAED;;AAEG;IACI,aAAa,GAAA;AAChB,QAAA,OAAO,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,KAAI;YACrC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACvC,SAAC,CAAC;KACL;AAED;;AAEG;AACK,IAAA,aAAa,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAA;QAC/C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;AAE3D,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,0BAA0B,EAAE;AACtD,gBAAA,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAC3C,gBAAA,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAC3C,gBAAA,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAC9C,aAAA,CAAC,CAAC;SACN;;AAGD,QAAA,IACI,IAAI,CAAC,MAAM,CAAC,eAAe;YAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,KAAK,UAAU,EACnD;YACE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;gBACnC,OAAO,IAAI,CAAC,YAAY,CACpB,GAAG,EACH,cAAc,EACd,yBAAyB,CAC5B,CAAC;aACL;YACD,OAAO,IAAI,EAAE,CAAC;SACjB;;AAGD,QAAA,IACI,IAAI,CAAC,MAAM,CAAC,oBAAoB;AAChC,YAAA,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,EACtC;YACE,OAAO,IAAI,CAAC,YAAY,CACpB,GAAG,EACH,0BAA0B,EAC1B,oCAAoC,CACvC,CAAC;SACL;;AAGD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAEjD,IAAI,WAAW,EAAE;;AAEb,gBAAA,IAAI,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE;AACnC,oBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;wBACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,UAAU,EACV,wDAAwD,CAC3D,CAAC;qBACL;oBACD,OAAO,IAAI,EAAE,CAAC;iBACjB;qBAAM;;AAEH,oBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;wBACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,UAAU,EACV,qEAAqE,CACxE,CAAC;qBACL;oBACD,OAAO,IAAI,CAAC,YAAY,CACpB,GAAG,EACH,mBAAmB,EACnB,uCAAuC,CAC1C,CAAC;iBACL;aACJ;;YAGD,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAErD,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,UAAU,EACV,8BAA8B,YAAY,CAAC,KAAK,CAAI,CAAA,EAAA,IAAI,CAAC,uBAAuB,CAAA,OAAA,EAAU,IAAI,CAAC,uBAAuB,CAAW,SAAA,CAAA,CACpI,CAAC;AACF,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,UAAU,EACV,6BAA6B,EAC7B,YAAY,CAAC,SAAS,CACzB,CAAC;aACL;YAED,IAAI,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,uBAAuB,EAAE;AACpD,gBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;oBACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,UAAU,EACV,qDAAqD,CACxD,CAAC;iBACL;gBACD,OAAO,IAAI,EAAE,CAAC;aACjB;;AAGD,YAAA,OAAO,IAAI,CAAC,YAAY,CACpB,GAAG,EACH,iCAAiC,EACjC,CAAA,cAAA,EAAiB,YAAY,CAAC,KAAK,CAAI,CAAA,EAAA,IAAI,CAAC,uBAAuB,CAAA,qCAAA,CAAuC,CAC7G,CAAC;SACL;;AAGD,QAAA,IAAI,EAAE,CAAC;KACV;AAED;;AAEG;AACK,IAAA,kBAAkB,CAAC,GAAQ,EAAA;QAC/B,OAAO,CAAC,EACJ,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAC7B,YAAA,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAC7B,YAAA,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAC7B,YAAA,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAChC,CAAC;KACL;AAED;;AAEG;AACK,IAAA,uBAAuB,CAAC,GAAQ,EAAA;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;;AAG3C,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;AAChB,YAAA,OAAO,KAAK,CAAC;SAChB;;AAGD,QAAA,MAAM,SAAS,GAAG;YACd,UAAU;YACV,OAAO;YACP,QAAQ;YACR,OAAO;YACP,QAAQ;YACR,OAAO;YACP,MAAM;YACN,OAAO;YACP,OAAO;YACP,UAAU;YACV,QAAQ;YACR,OAAO;YACP,QAAQ;YACR,cAAc;YACd,eAAe;SAClB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC3B,YAAA,OAAO,KAAK,CAAC;SAChB;;AAGD,QAAA,MAAM,SAAS,GAAG;YACd,UAAU;YACV,MAAM;YACN,SAAS;YACT,aAAa;YACb,WAAW;SACd,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC3B,YAAA,OAAO,KAAK,CAAC;SAChB;;AAGD,QAAA,IACI,IAAI;AACJ,YAAA,CAAC,CAAC,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EACpE;AACE,YAAA,OAAO,KAAK,CAAC;SAChB;;QAGD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE;AACrC,YAAA,OAAO,KAAK,CAAC;SAChB;;AAGD,QAAA,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,EAAE;YACjE,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,UAAU,EAAE;YACtC,OAAO,KAAK,CAAC;SAChB;AAED,QAAA,OAAO,IAAI,CAAC;KACf;AAED;;AAEG;AACK,IAAA,0BAA0B,CAAC,GAAQ,EAAA;AACvC,QAAA,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AAE3C,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,UAAU,EACV,gDAAgD,EAChD;gBACI,SAAS;gBACT,MAAM;AACT,aAAA,CACJ,CAAC;SACL;;AAGD,QAAA,MAAM,kBAAkB,GAAG;YACvB,cAAc;YACd,cAAc;YACd,YAAY;YACZ,aAAa;YACb,WAAW;YACX,oBAAoB;YACpB,UAAU;YACV,eAAe;YACf,WAAW;YACX,eAAe;YACf,WAAW;YACX,eAAe;YACf,UAAU;YACV,YAAY;YACZ,UAAU;YACV,eAAe;YACf,aAAa;YACb,kBAAkB;YAClB,QAAQ;YACR,OAAO;YACP,WAAW;YACX,gBAAgB;YAChB,YAAY;YACZ,aAAa;YACb,eAAe;YACf,sBAAsB;YACtB,WAAW;YACX,aAAa;YACb,YAAY;YACZ,gBAAgB;YAChB,aAAa;YACb,YAAY;YACZ,YAAY;YACZ,UAAU;YACV,YAAY;YACZ,WAAW;YACX,cAAc;YACd,eAAe;YACf,aAAa;YACb,cAAc;YACd,aAAa;SAChB,CAAC;;AAGF,QAAA,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE;AACtC,YAAA,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AACzB,gBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;oBACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,UAAU,EACV,sCAAsC,EACtC;AACI,wBAAA,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;wBAC3B,SAAS;AACZ,qBAAA,CACJ,CAAC;iBACL;AACD,gBAAA,OAAO,IAAI,CAAC;aACf;SACJ;;QAGD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AACvC,YAAA,OAAO,IAAI,CAAC;SACf;;AAGD,QAAA,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE;AACjE,YAAA,OAAO,IAAI,CAAC;SACf;;QAGD,IAAI,MAAM,KAAK,KAAK,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE;AAC3C,YAAA,OAAO,IAAI,CAAC;SACf;;AAGD,QAAA,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE;AACjE,YAAA,OAAO,IAAI,CAAC;SACf;AAED,QAAA,OAAO,KAAK,CAAC;KAChB;AAED;;AAEG;AACK,IAAA,qBAAqB,CAAC,SAAiB,EAAA;;AAE3C,QAAA,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzC,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;KAChE;AAED;;AAEG;AACK,IAAA,qBAAqB,CAAC,GAAQ,EAAA;QAIlC,MAAM,SAAS,GAA2B,EAAE,CAAC;QAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;;QAGd,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACzC,QAAA,SAAS,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;QACjC,KAAK,IAAI,OAAO,CAAC;;QAGjB,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChD,QAAA,SAAS,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC;QAClC,KAAK,IAAI,WAAW,CAAC;;QAGrB,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAChD,QAAA,SAAS,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAAC;QACxC,KAAK,IAAI,SAAS,CAAC;;QAGnB,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACpD,QAAA,SAAS,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAC;QAC5C,KAAK,IAAI,aAAa,CAAC;;QAGvB,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACjD,QAAA,SAAS,CAAC,eAAe,CAAC,GAAG,WAAW,CAAC;QACzC,KAAK,IAAI,WAAW,CAAC;;QAGrB,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;AACzD,QAAA,SAAS,CAAC,YAAY,CAAC,GAAG,eAAe,CAAC;QAC1C,KAAK,IAAI,eAAe,CAAC;;QAGzB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAC/C,QAAA,SAAS,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;QAChC,KAAK,IAAI,UAAU,CAAC;;QAGpB,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACnD,QAAA,SAAS,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC;QACpC,KAAK,IAAI,YAAY,CAAC;AAEtB,QAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;KAC/B;AAED;;AAEG;AACK,IAAA,cAAc,CAAC,GAAQ,EAAA;QAC3B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;;AAGd,QAAA,IACI,yDAAyD,CAAC,IAAI,CAAC,EAAE,CAAC,EACpE;YACE,KAAK,IAAI,CAAC,CAAC;SACd;;AAGD,QAAA,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE;YAChB,KAAK,IAAI,CAAC,CAAC;SACd;;AAGD,QAAA,IAAI,oDAAoD,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YAC/D,KAAK,IAAI,GAAG,CAAC;SAChB;;AAGD,QAAA,IAAI,oCAAoC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YAC/C,KAAK,IAAI,GAAG,CAAC;SAChB;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;KAC7B;AAED;;AAEG;AACK,IAAA,iBAAiB,CAAC,GAAQ,EAAA;QAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;;AAG3C,QAAA,IACI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;AAC5B,YAAA,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAC1C;AACE,YAAA,OAAO,CAAC,CAAC;SACZ;;QAGD,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE;AAC/B,YAAA,OAAO,GAAG,CAAC;SACd;AAED,QAAA,OAAO,CAAC,CAAC;KACZ;AAED;;AAEG;AACK,IAAA,mBAAmB,CAAC,GAAQ,EAAA;QAChC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAE5C,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,OAAO,CAAC,CAAC;SACZ;;AAGD,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE;AACpD,YAAA,OAAO,CAAC,CAAC;SACZ;;AAGD,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;AAClB,YAAA,OAAO,GAAG,CAAC;SACd;AAED,QAAA,OAAO,CAAC,CAAC;KACZ;AAED;;AAEG;AACK,IAAA,mBAAmB,CAAC,GAAQ,EAAA;QAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAEhD,IAAI,CAAC,QAAQ,EAAE;AACX,YAAA,OAAO,CAAC,CAAC;SACZ;;QAGD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEtC,IAAI,CAAC,OAAO,IAAI,UAAU,KAAK,KAAK,EAAE;AAClC,YAAA,OAAO,CAAC,CAAC;SACZ;AAED,QAAA,IAAI,OAAO,IAAI,UAAU,EAAE;AACvB,YAAA,OAAO,GAAG,CAAC;SACd;AAED,QAAA,OAAO,CAAC,CAAC;KACZ;AAED;;AAEG;AACK,IAAA,kBAAkB,CAAC,GAAQ,EAAA;QAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;;QAGvC,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE;;AAE3C,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AACzB,gBAAA,OAAO,CAAC,CAAC;aACZ;SACJ;;QAGD,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AACrC,YAAA,OAAO,CAAC,CAAC;SACZ;AAED,QAAA,OAAO,CAAC,CAAC;KACZ;AAED;;AAEG;AACK,IAAA,sBAAsB,CAAC,GAAQ,EAAA;QACnC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;;AAGzD,QAAA,IAAI,UAAU,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AAC/D,YAAA,OAAO,GAAG,CAAC;SACd;;AAGD,QAAA,IAAI,OAAO,KAAK,GAAG,EAAE;AACjB,YAAA,OAAO,CAAC,CAAC;SACZ;AAED,QAAA,OAAO,CAAC,CAAC;KACZ;AAED;;AAEG;AACK,IAAA,iBAAiB,CAAC,GAAQ,EAAA;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAE3C,IAAI,CAAC,KAAK,EAAE;AACR,YAAA,OAAO,CAAC,CAAC;SACZ;;AAGD,QAAA,IACI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;AACzB,YAAA,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;AAC1B,YAAA,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC5B;AACE,YAAA,OAAO,CAAC,CAAC;SACZ;AAED,QAAA,OAAO,CAAC,CAAC;KACZ;AAED;;AAEG;AACK,IAAA,mBAAmB,CAAC,GAAQ,EAAA;QAChC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;;AAGjE,QAAA,IAAI,GAAG,KAAK,GAAG,EAAE;AACb,YAAA,OAAO,CAAC,CAAC;SACZ;;AAGD,QAAA,IAAI,GAAG,KAAK,GAAG,EAAE;AACb,YAAA,OAAO,CAAC,CAAC;SACZ;;AAGD,QAAA,IAAI,eAAe,KAAK,GAAG,EAAE;AACzB,YAAA,OAAO,CAAC,CAAC;SACZ;AAED,QAAA,OAAO,CAAC,CAAC;KACZ;AAED;;AAEG;AACK,IAAA,UAAU,CAAC,GAAW,EAAA;AAC1B,QAAA,IAAI;AACA,YAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;SACtE;AAAC,QAAA,MAAM;AACJ,YAAA,OAAO,KAAK,CAAC;SAChB;KACJ;AAED;;AAEG;AACK,IAAA,sBAAsB,CAAC,GAAQ,EAAA;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAC9C,QAAA,OAAO,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,uBAAuB,CAAC;KACtD;AAED;;AAEG;AACK,IAAA,gBAAgB,CAAC,SAAiB,EAAA;QACtC,OAAO,IAAI,CAAC,0BAA0B,CAAC;AACnC,YAAA,OAAO,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;AACvC,SAAA,CAAC,CAAC;KACN;AAED;;AAEG;AACK,IAAA,sBAAsB,CAAC,MAAc,EAAA;AACzC,QAAA,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE;AAC7B,YAAA,OAAO,KAAK,CAAC;SAChB;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3D,QAAA,OAAO,WAAW,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;KAClE;AAED;;AAEG;AACK,IAAA,oBAAoB,CAAC,GAAQ,EAAA;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAC9C,QAAA,OAAO,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,uBAAuB,CAAC;KACtD;AAED;;AAEG;AACK,IAAA,YAAY,CAAC,GAAQ,EAAE,IAAY,EAAE,OAAgB,EAAA;;AAEzD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAExC,QAAA,MAAM,QAAQ,GAAQ;AAClB,YAAA,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,eAAe;AACjE,YAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,YAAA,IAAI,EAAE,iBAAiB;SAC1B,CAAC;;QAGF,IAAI,aAAa,EAAE;YACf,QAAQ,CAAC,OAAO,GAAG;AACf,gBAAA,MAAM,EAAE,aAAa;gBACrB,IAAI;gBACJ,OAAO;AACP,gBAAA,SAAS,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;aAC/D,CAAC;SACL;AAED,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,8BAA8B,EAAE;gBAC1D,IAAI;gBACJ,OAAO;AACP,gBAAA,SAAS,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;AAC/D,aAAA,CAAC,CAAC;SACN;AAED,QAAA,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACrD;AAED;;AAEG;AACI,IAAA,YAAY,CAAC,SAAqC,EAAA;AACrD,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;KAClD;AAED;;AAEG;IACI,SAAS,GAAA;AACZ,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;KAC7B;AACJ;;;;"}