@neuroequality/neuroadapt-ai
Version:
AI-powered accessibility personalization for neurodivergent users
1 lines • 31.9 kB
Source Map (JSON)
{"version":3,"file":"behavior-analytics-DOSpG3Xv.cjs","sources":["../src/types/common.ts","../src/analytics/behavior-analytics.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * User interaction types for behavior tracking\n */\nexport const UserInteractionSchema = z.object({\n timestamp: z.number(),\n type: z.enum(['click', 'scroll', 'focus', 'blur', 'keypress', 'resize', 'preference_change']),\n target: z.string().optional(),\n value: z.unknown().optional(),\n context: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type UserInteraction = z.infer<typeof UserInteractionSchema>;\n\n/**\n * Prediction confidence levels\n */\nexport type ConfidenceLevel = 'low' | 'medium' | 'high' | 'very_high';\n\n/**\n * AI model capabilities\n */\nexport interface ModelCapabilities {\n textGeneration: boolean;\n textAnalysis: boolean;\n codeGeneration: boolean;\n reasoning: boolean;\n streaming: boolean;\n functionCalling: boolean;\n vision: boolean;\n}\n\n/**\n * AI provider configuration\n */\nexport interface AIProviderConfig {\n apiKey?: string;\n baseURL?: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n timeout?: number;\n retries?: number;\n}\n\n/**\n * Prediction result with confidence scoring\n */\nexport interface PredictionResult<T = unknown> {\n prediction: T;\n confidence: ConfidenceLevel;\n score: number; // 0-1\n reasoning?: string;\n alternatives?: Array<{\n value: T;\n score: number;\n reasoning?: string;\n }>;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Adaptation suggestion from AI\n */\nexport interface AdaptationSuggestion {\n type: 'sensory' | 'cognitive' | 'preference' | 'content';\n target: string;\n action: 'enable' | 'disable' | 'adjust' | 'replace';\n value?: unknown;\n reasoning: string;\n confidence: ConfidenceLevel;\n priority: 'low' | 'medium' | 'high' | 'urgent';\n estimatedImpact: number; // 0-1\n}\n\n/**\n * Learning model state\n */\nexport interface ModelState {\n version: string;\n trainingData: number; // Number of samples\n lastUpdated: number;\n accuracy?: number;\n features: string[];\n hyperparameters?: Record<string, unknown>;\n}\n\n/**\n * Streaming response chunk\n */\nexport interface StreamChunk {\n id: string;\n type: 'token' | 'function_call' | 'done' | 'error';\n content: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n}\n\n/**\n * Analytics event for user behavior\n */\nexport const AnalyticsEventSchema = z.object({\n eventId: z.string().uuid(),\n userId: z.string().optional(),\n sessionId: z.string(),\n timestamp: z.number(),\n event: z.string(),\n properties: z.record(z.string(), z.unknown()).optional(),\n preferences: z.record(z.string(), z.unknown()).optional(),\n context: z.object({\n userAgent: z.string().optional(),\n viewport: z.object({\n width: z.number(),\n height: z.number(),\n }).optional(),\n url: z.string().optional(),\n referrer: z.string().optional(),\n }).optional(),\n});\n\nexport type AnalyticsEvent = z.infer<typeof AnalyticsEventSchema>;\n\n/**\n * Feature extraction result\n */\nexport interface FeatureVector {\n features: Record<string, number>;\n metadata?: Record<string, unknown>;\n timestamp: number;\n}\n\n/**\n * Training data point\n */\nexport interface TrainingData {\n input: FeatureVector;\n output: unknown;\n feedback?: number; // -1 to 1\n weight?: number; // Importance weight\n}\n\n/**\n * Model performance metrics\n */\nexport interface ModelMetrics {\n accuracy: number;\n precision: number;\n recall: number;\n f1Score: number;\n auc?: number;\n confusionMatrix?: number[][];\n sampleSize: number;\n lastEvaluated: number;\n} ","import { EventEmitter } from 'eventemitter3';\nimport { z } from 'zod';\nimport type { \n UserInteraction, \n AnalyticsEvent\n} from '../types/common.js';\nimport { \n AnalyticsEventSchema,\n UserInteractionSchema \n} from '../types/common.js';\n\n/**\n * Events emitted by BehaviorAnalytics\n */\nexport interface BehaviorAnalyticsEvents {\n 'pattern-detected': (pattern: BehaviorPattern) => void;\n 'anomaly-detected': (anomaly: BehaviorAnomaly) => void;\n 'insight-generated': (insight: BehaviorInsight) => void;\n 'data-collected': (event: AnalyticsEvent) => void;\n 'error': (error: Error) => void;\n}\n\n/**\n * Configuration for behavior analytics\n */\nexport interface BehaviorAnalyticsConfig {\n sessionTimeout?: number; // milliseconds\n maxSessionEvents?: number;\n enableRealTimeAnalysis?: boolean;\n patternDetectionThreshold?: number;\n anomalyDetectionSensitivity?: number;\n privacyMode?: boolean;\n bufferSize?: number;\n}\n\n/**\n * Detected behavior pattern\n */\nexport interface BehaviorPattern {\n id: string;\n type: 'navigation' | 'interaction' | 'preference' | 'temporal';\n pattern: string;\n confidence: number;\n frequency: number;\n contexts: string[];\n impact: 'positive' | 'negative' | 'neutral';\n recommendations: string[];\n}\n\n/**\n * Behavior anomaly detection\n */\nexport interface BehaviorAnomaly {\n id: string;\n type: 'sudden_change' | 'unusual_pattern' | 'performance_degradation' | 'accessibility_issue';\n description: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n affectedMetrics: string[];\n timestamp: number;\n context: Record<string, unknown>;\n}\n\n/**\n * Generated behavioral insight\n */\nexport interface BehaviorInsight {\n id: string;\n category: 'usability' | 'accessibility' | 'performance' | 'engagement';\n title: string;\n description: string;\n evidence: string[];\n actionItems: string[];\n priority: number; // 0-1\n confidence: number; // 0-1\n}\n\n/**\n * Session analytics data\n */\ninterface SessionData {\n sessionId: string;\n startTime: number;\n endTime?: number;\n events: AnalyticsEvent[];\n interactions: UserInteraction[];\n metadata: Record<string, unknown>;\n}\n\n/**\n * Interaction metrics\n */\ninterface InteractionMetrics {\n totalInteractions: number;\n interactionRate: number; // per minute\n avgTimeBetweenInteractions: number;\n dominantInteractionTypes: string[];\n errorRate: number;\n completionRate: number;\n}\n\n/**\n * Engagement metrics\n */\ninterface EngagementMetrics {\n sessionDuration: number;\n bounceRate: number;\n pageViews: number;\n scrollDepth: number;\n clickThroughRate: number;\n taskCompletionRate: number;\n}\n\n/**\n * BehaviorAnalytics tracks and analyzes user behavior patterns for accessibility insights\n */\nexport class BehaviorAnalytics extends EventEmitter<BehaviorAnalyticsEvents> {\n private config: Required<BehaviorAnalyticsConfig>;\n private currentSession: SessionData | null = null;\n private sessions: SessionData[] = [];\n private eventBuffer: AnalyticsEvent[] = [];\n private patternCache: Map<string, BehaviorPattern> = new Map();\n private anomalyBaselines: Map<string, number> = new Map();\n private sessionTimeout: NodeJS.Timeout | undefined;\n\n constructor(config: BehaviorAnalyticsConfig = {}) {\n super();\n\n this.config = {\n sessionTimeout: config.sessionTimeout || 1800000, // 30 minutes\n maxSessionEvents: config.maxSessionEvents || 1000,\n enableRealTimeAnalysis: config.enableRealTimeAnalysis ?? true,\n patternDetectionThreshold: config.patternDetectionThreshold || 0.7,\n anomalyDetectionSensitivity: config.anomalyDetectionSensitivity || 0.8,\n privacyMode: config.privacyMode ?? true,\n bufferSize: config.bufferSize || 100,\n };\n }\n\n /**\n * Start a new analytics session\n */\n startSession(sessionId?: string): string {\n const id = sessionId || this.generateSessionId();\n \n // End current session if exists\n if (this.currentSession) {\n this.endSession();\n }\n\n this.currentSession = {\n sessionId: id,\n startTime: Date.now(),\n events: [],\n interactions: [],\n metadata: {\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'unknown',\n viewport: this.getViewportInfo(),\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n },\n };\n\n this.resetSessionTimeout();\n return id;\n }\n\n /**\n * End current session\n */\n endSession(): void {\n if (!this.currentSession) return;\n\n this.currentSession.endTime = Date.now();\n this.sessions.push({ ...this.currentSession });\n\n // Limit stored sessions\n if (this.sessions.length > 50) {\n this.sessions = this.sessions.slice(-50);\n }\n\n // Generate session insights\n if (this.config.enableRealTimeAnalysis) {\n this.analyzeSession(this.currentSession);\n }\n\n this.currentSession = null;\n this.clearSessionTimeout();\n }\n\n /**\n * Track user interaction\n */\n trackInteraction(interaction: UserInteraction): void {\n try {\n // Validate interaction\n UserInteractionSchema.parse(interaction);\n\n if (!this.currentSession) {\n this.startSession();\n }\n\n this.currentSession!.interactions.push(interaction);\n this.resetSessionTimeout();\n\n // Create analytics event\n const event: AnalyticsEvent = {\n eventId: crypto.randomUUID(),\n sessionId: this.currentSession!.sessionId,\n timestamp: interaction.timestamp,\n event: `interaction.${interaction.type}`,\n properties: {\n target: interaction.target,\n value: interaction.value,\n },\n context: interaction.context,\n };\n\n this.trackEvent(event);\n\n // Real-time pattern detection\n if (this.config.enableRealTimeAnalysis) {\n this.detectRealTimePatterns();\n }\n } catch (error) {\n this.emit('error', error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Track custom analytics event\n */\n trackEvent(event: Partial<AnalyticsEvent>): void {\n try {\n const fullEvent: AnalyticsEvent = {\n eventId: event.eventId || crypto.randomUUID(),\n sessionId: event.sessionId || this.currentSession?.sessionId || 'no-session',\n timestamp: event.timestamp || Date.now(),\n event: event.event || 'unknown',\n properties: event.properties,\n context: event.context,\n };\n\n // Validate event\n AnalyticsEventSchema.parse(fullEvent);\n\n if (this.currentSession) {\n this.currentSession.events.push(fullEvent);\n }\n\n this.eventBuffer.push(fullEvent);\n \n // Limit buffer size\n if (this.eventBuffer.length > this.config.bufferSize) {\n this.eventBuffer = this.eventBuffer.slice(-this.config.bufferSize);\n }\n\n this.emit('data-collected', fullEvent);\n } catch (error) {\n this.emit('error', error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Track preference change\n */\n trackPreferenceChange(\n preferences: Record<string, unknown>,\n context?: Record<string, unknown>\n ): void {\n const interaction: UserInteraction = {\n timestamp: Date.now(),\n type: 'preference_change',\n value: preferences,\n context,\n };\n\n this.trackInteraction(interaction);\n }\n\n /**\n * Get interaction metrics for current session\n */\n getSessionMetrics(): InteractionMetrics | null {\n if (!this.currentSession) return null;\n\n const interactions = this.currentSession.interactions;\n const sessionDuration = Date.now() - this.currentSession.startTime;\n\n return this.calculateInteractionMetrics(interactions, sessionDuration);\n }\n\n /**\n * Get engagement metrics for current session\n */\n getEngagementMetrics(): EngagementMetrics | null {\n if (!this.currentSession) return null;\n\n const events = this.currentSession.events;\n const sessionDuration = Date.now() - this.currentSession.startTime;\n\n return this.calculateEngagementMetrics(events, sessionDuration);\n }\n\n /**\n * Analyze behavior patterns across sessions\n */\n analyzeBehaviorPatterns(): BehaviorPattern[] {\n const patterns: BehaviorPattern[] = [];\n\n // Analyze navigation patterns\n patterns.push(...this.detectNavigationPatterns());\n\n // Analyze interaction patterns\n patterns.push(...this.detectInteractionPatterns());\n\n // Analyze temporal patterns\n patterns.push(...this.detectTemporalPatterns());\n\n // Cache patterns\n patterns.forEach(pattern => {\n this.patternCache.set(pattern.id, pattern);\n });\n\n return patterns;\n }\n\n /**\n * Generate behavioral insights\n */\n generateInsights(): BehaviorInsight[] {\n const insights: BehaviorInsight[] = [];\n\n // Accessibility insights\n insights.push(...this.generateAccessibilityInsights());\n\n // Usability insights\n insights.push(...this.generateUsabilityInsights());\n\n // Performance insights\n insights.push(...this.generatePerformanceInsights());\n\n // Engagement insights\n insights.push(...this.generateEngagementInsights());\n\n // Emit insights\n insights.forEach(insight => {\n this.emit('insight-generated', insight);\n });\n\n return insights;\n }\n\n /**\n * Export analytics data\n */\n exportData(options: { format?: 'json' | 'csv'; includeInteractions?: boolean } = {}): string {\n const data = {\n sessions: this.sessions.map(session => ({\n ...session,\n interactions: options.includeInteractions ? session.interactions : [],\n })),\n patterns: Array.from(this.patternCache.values()),\n summary: this.generateSummaryStatistics(),\n };\n\n if (options.format === 'csv') {\n return this.convertToCSV(data);\n }\n\n return JSON.stringify(data, null, 2);\n }\n\n /**\n * Clear all analytics data\n */\n clearData(): void {\n this.sessions = [];\n this.eventBuffer = [];\n this.patternCache.clear();\n this.anomalyBaselines.clear();\n if (this.currentSession) {\n this.endSession();\n }\n }\n\n /**\n * Clean up and stop analytics\n */\n destroy(): void {\n this.endSession();\n this.clearSessionTimeout();\n this.removeAllListeners();\n }\n\n // Private methods\n\n private generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private getViewportInfo(): { width: number; height: number } {\n if (typeof window !== 'undefined') {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n return { width: 0, height: 0 };\n }\n\n private resetSessionTimeout(): void {\n this.clearSessionTimeout();\n this.sessionTimeout = setTimeout(() => {\n this.endSession();\n }, this.config.sessionTimeout);\n }\n\n private clearSessionTimeout(): void {\n if (this.sessionTimeout) {\n clearTimeout(this.sessionTimeout);\n this.sessionTimeout = undefined;\n }\n }\n\n private calculateInteractionMetrics(\n interactions: UserInteraction[],\n sessionDuration: number\n ): InteractionMetrics {\n const interactionRate = (interactions.length / sessionDuration) * 60000; // per minute\n \n let totalTimeDiff = 0;\n for (let i = 1; i < interactions.length; i++) {\n totalTimeDiff += interactions[i].timestamp - interactions[i - 1].timestamp;\n }\n const avgTimeBetweenInteractions = totalTimeDiff / Math.max(1, interactions.length - 1);\n\n const typeCount = new Map<string, number>();\n interactions.forEach(interaction => {\n typeCount.set(interaction.type, (typeCount.get(interaction.type) || 0) + 1);\n });\n\n const dominantTypes = Array.from(typeCount.entries())\n .sort(([, a], [, b]) => b - a)\n .slice(0, 3)\n .map(([type]) => type);\n\n return {\n totalInteractions: interactions.length,\n interactionRate,\n avgTimeBetweenInteractions,\n dominantInteractionTypes: dominantTypes,\n errorRate: 0, // Would calculate based on error events\n completionRate: 0.85, // Placeholder - would calculate based on goal completion\n };\n }\n\n private calculateEngagementMetrics(\n events: AnalyticsEvent[],\n sessionDuration: number\n ): EngagementMetrics {\n const pageViews = events.filter(e => e.event.includes('page')).length;\n const scrollEvents = events.filter(e => e.event.includes('scroll')).length;\n const clickEvents = events.filter(e => e.event.includes('click')).length;\n\n return {\n sessionDuration,\n bounceRate: pageViews <= 1 ? 1 : 0,\n pageViews,\n scrollDepth: Math.min(scrollEvents / 10, 1), // Normalized\n clickThroughRate: clickEvents / Math.max(1, pageViews),\n taskCompletionRate: 0.8, // Placeholder\n };\n }\n\n private detectRealTimePatterns(): void {\n if (!this.currentSession || this.currentSession.interactions.length < 5) return;\n\n const recentInteractions = this.currentSession.interactions.slice(-10);\n \n // Detect rapid scrolling pattern\n const scrolls = recentInteractions.filter(i => i.type === 'scroll');\n if (scrolls.length > 5) {\n const pattern: BehaviorPattern = {\n id: `rapid_scroll_${Date.now()}`,\n type: 'interaction',\n pattern: 'rapid_scrolling',\n confidence: 0.8,\n frequency: scrolls.length / recentInteractions.length,\n contexts: ['current_session'],\n impact: 'negative',\n recommendations: ['Enable motion reduction', 'Increase content chunking'],\n };\n \n this.emit('pattern-detected', pattern);\n }\n }\n\n private analyzeSession(session: SessionData): void {\n const endTime = session.endTime || Date.now();\n const metrics = this.calculateInteractionMetrics(\n session.interactions,\n endTime - session.startTime\n );\n\n // Detect anomalies\n if (metrics.interactionRate > 10) { // Very high interaction rate\n const anomaly: BehaviorAnomaly = {\n id: `high_interaction_rate_${session.sessionId}`,\n type: 'unusual_pattern',\n description: 'Unusually high interaction rate detected',\n severity: 'medium',\n affectedMetrics: ['interaction_rate'],\n timestamp: endTime,\n context: { sessionId: session.sessionId, rate: metrics.interactionRate },\n };\n \n this.emit('anomaly-detected', anomaly);\n }\n }\n\n private detectNavigationPatterns(): BehaviorPattern[] {\n // Analyze navigation patterns across sessions\n // This is a simplified implementation\n return [\n {\n id: 'common_navigation_path',\n type: 'navigation',\n pattern: 'home -> settings -> preferences',\n confidence: 0.75,\n frequency: 0.6,\n contexts: ['multiple_sessions'],\n impact: 'positive',\n recommendations: ['Optimize preferences access'],\n },\n ];\n }\n\n private detectInteractionPatterns(): BehaviorPattern[] {\n // Analyze interaction patterns\n return [\n {\n id: 'preference_adjustment_frequency',\n type: 'preference',\n pattern: 'frequent_font_size_changes',\n confidence: 0.8,\n frequency: 0.4,\n contexts: ['accessibility_settings'],\n impact: 'neutral',\n recommendations: ['Provide font size presets', 'Add visual preview'],\n },\n ];\n }\n\n private detectTemporalPatterns(): BehaviorPattern[] {\n // Analyze temporal usage patterns\n return [\n {\n id: 'time_of_day_usage',\n type: 'temporal',\n pattern: 'evening_high_contrast_preference',\n confidence: 0.7,\n frequency: 0.5,\n contexts: ['evening_sessions'],\n impact: 'positive',\n recommendations: ['Auto-enable high contrast in evening'],\n },\n ];\n }\n\n private generateAccessibilityInsights(): BehaviorInsight[] {\n return [\n {\n id: 'font_size_insight',\n category: 'accessibility',\n title: 'Font Size Optimization Opportunity',\n description: 'Users frequently adjust font size, indicating default may be suboptimal',\n evidence: ['High frequency of font size changes', 'Consistent upward adjustments'],\n actionItems: ['Increase default font size', 'Add font size presets'],\n priority: 0.8,\n confidence: 0.75,\n },\n ];\n }\n\n private generateUsabilityInsights(): BehaviorInsight[] {\n return [\n {\n id: 'navigation_efficiency',\n category: 'usability',\n title: 'Settings Access Could Be Streamlined',\n description: 'Users take multiple steps to reach accessibility settings',\n evidence: ['Long navigation paths to preferences', 'Multiple back-and-forth patterns'],\n actionItems: ['Add accessibility quick toggle', 'Improve settings discoverability'],\n priority: 0.6,\n confidence: 0.7,\n },\n ];\n }\n\n private generatePerformanceInsights(): BehaviorInsight[] {\n return [\n {\n id: 'interaction_lag',\n category: 'performance',\n title: 'Potential Input Lag Detected',\n description: 'Longer than expected intervals between user actions and responses',\n evidence: ['Delayed interaction patterns', 'Repeated identical actions'],\n actionItems: ['Optimize response times', 'Add loading indicators'],\n priority: 0.7,\n confidence: 0.65,\n },\n ];\n }\n\n private generateEngagementInsights(): BehaviorInsight[] {\n return [\n {\n id: 'session_length',\n category: 'engagement',\n title: 'Positive Engagement with Accessibility Features',\n description: 'Users spend significant time exploring accessibility options',\n evidence: ['Long sessions in accessibility settings', 'Multiple feature trials'],\n actionItems: ['Highlight successful adaptations', 'Provide usage tips'],\n priority: 0.5,\n confidence: 0.8,\n },\n ];\n }\n\n private generateSummaryStatistics(): Record<string, unknown> {\n const totalSessions = this.sessions.length;\n const totalInteractions = this.sessions.reduce((sum, s) => sum + s.interactions.length, 0);\n const avgSessionDuration = this.sessions.reduce(\n (sum, s) => sum + ((s.endTime || Date.now()) - s.startTime),\n 0\n ) / Math.max(1, totalSessions);\n\n return {\n totalSessions,\n totalInteractions,\n avgSessionDuration,\n avgInteractionsPerSession: totalInteractions / Math.max(1, totalSessions),\n patternsDetected: this.patternCache.size,\n };\n }\n\n private convertToCSV(data: any): string {\n // Simplified CSV conversion\n const headers = ['sessionId', 'startTime', 'endTime', 'interactionCount', 'eventCount'];\n const rows = data.sessions.map((session: SessionData): (string | number)[] => [\n session.sessionId,\n session.startTime,\n session.endTime || '',\n session.interactions.length,\n session.events.length,\n ]);\n\n return [headers.join(','), ...rows.map(row => row.join(','))].join('\\n');\n }\n} "],"names":["UserInteractionSchema","z","AnalyticsEventSchema","BehaviorAnalytics","EventEmitter","config","sessionId","id","interaction","event","error","fullEvent","preferences","context","interactions","sessionDuration","events","patterns","pattern","insights","insight","options","data","session","interactionRate","totalTimeDiff","i","avgTimeBetweenInteractions","typeCount","dominantTypes","a","b","type","pageViews","e","scrollEvents","clickEvents","recentInteractions","scrolls","endTime","metrics","anomaly","totalSessions","totalInteractions","sum","s","avgSessionDuration","headers","rows","row"],"mappings":"+DAKaA,EAAwBC,EAAAA,EAAE,OAAO,CAC5C,UAAWA,EAAAA,EAAE,OAAA,EACb,KAAMA,EAAAA,EAAE,KAAK,CAAC,QAAS,SAAU,QAAS,OAAQ,WAAY,SAAU,mBAAmB,CAAC,EAC5F,OAAQA,EAAAA,EAAE,OAAA,EAAS,SAAA,EACnB,MAAOA,EAAAA,EAAE,QAAA,EAAU,SAAA,EACnB,QAASA,EAAAA,EAAE,OAAOA,EAAAA,EAAE,OAAA,EAAUA,EAAAA,EAAE,QAAA,CAAS,EAAE,SAAA,CAC7C,CAAC,EA2FYC,EAAuBD,EAAAA,EAAE,OAAO,CAC3C,QAASA,EAAAA,EAAE,OAAA,EAAS,KAAA,EACpB,OAAQA,EAAAA,EAAE,OAAA,EAAS,SAAA,EACnB,UAAWA,EAAAA,EAAE,OAAA,EACb,UAAWA,EAAAA,EAAE,OAAA,EACb,MAAOA,EAAAA,EAAE,OAAA,EACT,WAAYA,EAAAA,EAAE,OAAOA,IAAE,OAAA,EAAUA,IAAE,SAAS,EAAE,SAAA,EAC9C,YAAaA,EAAAA,EAAE,OAAOA,IAAE,OAAA,EAAUA,IAAE,SAAS,EAAE,SAAA,EAC/C,QAASA,EAAAA,EAAE,OAAO,CAChB,UAAWA,EAAAA,EAAE,OAAA,EAAS,SAAA,EACtB,SAAUA,EAAAA,EAAE,OAAO,CACjB,MAAOA,EAAAA,EAAE,OAAA,EACT,OAAQA,EAAAA,EAAE,OAAA,CAAO,CAClB,EAAE,SAAA,EACH,IAAKA,EAAAA,EAAE,OAAA,EAAS,SAAA,EAChB,SAAUA,EAAAA,EAAE,OAAA,EAAS,SAAA,CAAS,CAC/B,EAAE,SAAA,CACL,CAAC,ECJM,MAAME,UAA0BC,EAAAA,YAAsC,CAS3E,YAAYC,EAAkC,GAAI,CAChD,MAAA,EARF,KAAQ,eAAqC,KAC7C,KAAQ,SAA0B,CAAA,EAClC,KAAQ,YAAgC,CAAA,EACxC,KAAQ,iBAAiD,IACzD,KAAQ,qBAA4C,IAMlD,KAAK,OAAS,CACZ,eAAgBA,EAAO,gBAAkB,KACzC,iBAAkBA,EAAO,kBAAoB,IAC7C,uBAAwBA,EAAO,wBAA0B,GACzD,0BAA2BA,EAAO,2BAA6B,GAC/D,4BAA6BA,EAAO,6BAA+B,GACnE,YAAaA,EAAO,aAAe,GACnC,WAAYA,EAAO,YAAc,GAAA,CAErC,CAKA,aAAaC,EAA4B,CACvC,MAAMC,EAAKD,GAAa,KAAK,kBAAA,EAG7B,OAAI,KAAK,gBACP,KAAK,WAAA,EAGP,KAAK,eAAiB,CACpB,UAAWC,EACX,UAAW,KAAK,IAAA,EAChB,OAAQ,CAAA,EACR,aAAc,CAAA,EACd,SAAU,CACR,UAAW,OAAO,UAAc,IAAc,UAAU,UAAY,UACpE,SAAU,KAAK,gBAAA,EACf,SAAU,KAAK,eAAA,EAAiB,kBAAkB,QAAA,CACpD,EAGF,KAAK,oBAAA,EACEA,CACT,CAKA,YAAmB,CACZ,KAAK,iBAEV,KAAK,eAAe,QAAU,KAAK,IAAA,EACnC,KAAK,SAAS,KAAK,CAAE,GAAG,KAAK,eAAgB,EAGzC,KAAK,SAAS,OAAS,KACzB,KAAK,SAAW,KAAK,SAAS,MAAM,GAAG,GAIrC,KAAK,OAAO,wBACd,KAAK,eAAe,KAAK,cAAc,EAGzC,KAAK,eAAiB,KACtB,KAAK,oBAAA,EACP,CAKA,iBAAiBC,EAAoC,CACnD,GAAI,CAEFR,EAAsB,MAAMQ,CAAW,EAElC,KAAK,gBACR,KAAK,aAAA,EAGP,KAAK,eAAgB,aAAa,KAAKA,CAAW,EAClD,KAAK,oBAAA,EAGL,MAAMC,EAAwB,CAC5B,QAAS,OAAO,WAAA,EAChB,UAAW,KAAK,eAAgB,UAChC,UAAWD,EAAY,UACvB,MAAO,eAAeA,EAAY,IAAI,GACtC,WAAY,CACV,OAAQA,EAAY,OACpB,MAAOA,EAAY,KAAA,EAErB,QAASA,EAAY,OAAA,EAGvB,KAAK,WAAWC,CAAK,EAGjB,KAAK,OAAO,wBACd,KAAK,uBAAA,CAET,OAASC,EAAO,CACd,KAAK,KAAK,QAASA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,CAAC,CAC9E,CACF,CAKA,WAAWD,EAAsC,CAC/C,GAAI,CACF,MAAME,EAA4B,CAChC,QAASF,EAAM,SAAW,OAAO,WAAA,EACjC,UAAWA,EAAM,WAAa,KAAK,gBAAgB,WAAa,aAChE,UAAWA,EAAM,WAAa,KAAK,IAAA,EACnC,MAAOA,EAAM,OAAS,UACtB,WAAYA,EAAM,WAClB,QAASA,EAAM,OAAA,EAIjBP,EAAqB,MAAMS,CAAS,EAEhC,KAAK,gBACP,KAAK,eAAe,OAAO,KAAKA,CAAS,EAG3C,KAAK,YAAY,KAAKA,CAAS,EAG3B,KAAK,YAAY,OAAS,KAAK,OAAO,aACxC,KAAK,YAAc,KAAK,YAAY,MAAM,CAAC,KAAK,OAAO,UAAU,GAGnE,KAAK,KAAK,iBAAkBA,CAAS,CACvC,OAASD,EAAO,CACd,KAAK,KAAK,QAASA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,CAAC,CAC9E,CACF,CAKA,sBACEE,EACAC,EACM,CACN,MAAML,EAA+B,CACnC,UAAW,KAAK,IAAA,EAChB,KAAM,oBACN,MAAOI,EACP,QAAAC,CAAA,EAGF,KAAK,iBAAiBL,CAAW,CACnC,CAKA,mBAA+C,CAC7C,GAAI,CAAC,KAAK,eAAgB,OAAO,KAEjC,MAAMM,EAAe,KAAK,eAAe,aACnCC,EAAkB,KAAK,IAAA,EAAQ,KAAK,eAAe,UAEzD,OAAO,KAAK,4BAA4BD,EAAcC,CAAe,CACvE,CAKA,sBAAiD,CAC/C,GAAI,CAAC,KAAK,eAAgB,OAAO,KAEjC,MAAMC,EAAS,KAAK,eAAe,OAC7BD,EAAkB,KAAK,IAAA,EAAQ,KAAK,eAAe,UAEzD,OAAO,KAAK,2BAA2BC,EAAQD,CAAe,CAChE,CAKA,yBAA6C,CAC3C,MAAME,EAA8B,CAAA,EAGpC,OAAAA,EAAS,KAAK,GAAG,KAAK,yBAAA,CAA0B,EAGhDA,EAAS,KAAK,GAAG,KAAK,0BAAA,CAA2B,EAGjDA,EAAS,KAAK,GAAG,KAAK,uBAAA,CAAwB,EAG9CA,EAAS,QAAQC,GAAW,CAC1B,KAAK,aAAa,IAAIA,EAAQ,GAAIA,CAAO,CAC3C,CAAC,EAEMD,CACT,CAKA,kBAAsC,CACpC,MAAME,EAA8B,CAAA,EAGpC,OAAAA,EAAS,KAAK,GAAG,KAAK,8BAAA,CAA+B,EAGrDA,EAAS,KAAK,GAAG,KAAK,0BAAA,CAA2B,EAGjDA,EAAS,KAAK,GAAG,KAAK,4BAAA,CAA6B,EAGnDA,EAAS,KAAK,GAAG,KAAK,2BAAA,CAA4B,EAGlDA,EAAS,QAAQC,GAAW,CAC1B,KAAK,KAAK,oBAAqBA,CAAO,CACxC,CAAC,EAEMD,CACT,CAKA,WAAWE,EAAsE,GAAY,CAC3F,MAAMC,EAAO,CACX,SAAU,KAAK,SAAS,IAAIC,IAAY,CACtC,GAAGA,EACH,aAAcF,EAAQ,oBAAsBE,EAAQ,aAAe,CAAA,CAAC,EACpE,EACF,SAAU,MAAM,KAAK,KAAK,aAAa,QAAQ,EAC/C,QAAS,KAAK,0BAAA,CAA0B,EAG1C,OAAIF,EAAQ,SAAW,MACd,KAAK,aAAaC,CAAI,EAGxB,KAAK,UAAUA,EAAM,KAAM,CAAC,CACrC,CAKA,WAAkB,CAChB,KAAK,SAAW,CAAA,EAChB,KAAK,YAAc,CAAA,EACnB,KAAK,aAAa,MAAA,EAClB,KAAK,iBAAiB,MAAA,EAClB,KAAK,gBACP,KAAK,WAAA,CAET,CAKA,SAAgB,CACd,KAAK,WAAA,EACL,KAAK,oBAAA,EACL,KAAK,mBAAA,CACP,CAIQ,mBAA4B,CAClC,MAAO,WAAW,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,EACzE,CAEQ,iBAAqD,CAC3D,OAAI,OAAO,OAAW,IACb,CACL,MAAO,OAAO,WACd,OAAQ,OAAO,WAAA,EAGZ,CAAE,MAAO,EAAG,OAAQ,CAAA,CAC7B,CAEQ,qBAA4B,CAClC,KAAK,oBAAA,EACL,KAAK,eAAiB,WAAW,IAAM,CACrC,KAAK,WAAA,CACP,EAAG,KAAK,OAAO,cAAc,CAC/B,CAEQ,qBAA4B,CAC9B,KAAK,iBACP,aAAa,KAAK,cAAc,EAChC,KAAK,eAAiB,OAE1B,CAEQ,4BACNR,EACAC,EACoB,CACpB,MAAMS,EAAmBV,EAAa,OAASC,EAAmB,IAElE,IAAIU,EAAgB,EACpB,QAASC,EAAI,EAAGA,EAAIZ,EAAa,OAAQY,IACvCD,GAAiBX,EAAaY,CAAC,EAAE,UAAYZ,EAAaY,EAAI,CAAC,EAAE,UAEnE,MAAMC,EAA6BF,EAAgB,KAAK,IAAI,EAAGX,EAAa,OAAS,CAAC,EAEhFc,MAAgB,IACtBd,EAAa,QAAQN,GAAe,CAClCoB,EAAU,IAAIpB,EAAY,MAAOoB,EAAU,IAAIpB,EAAY,IAAI,GAAK,GAAK,CAAC,CAC5E,CAAC,EAED,MAAMqB,EAAgB,MAAM,KAAKD,EAAU,SAAS,EACjD,KAAK,CAAC,EAAGE,CAAC,EAAG,CAAA,CAAGC,CAAC,IAAMA,EAAID,CAAC,EAC5B,MAAM,EAAG,CAAC,EACV,IAAI,CAAC,CAACE,CAAI,IAAMA,CAAI,EAEvB,MAAO,CACL,kBAAmBlB,EAAa,OAChC,gBAAAU,EACA,2BAAAG,EACA,yBAA0BE,EAC1B,UAAW,EACX,eAAgB,GAAA,CAEpB,CAEQ,2BACNb,EACAD,EACmB,CACnB,MAAMkB,EAAYjB,EAAO,OAAOkB,GAAKA,EAAE,MAAM,SAAS,MAAM,CAAC,EAAE,OACzDC,EAAenB,EAAO,OAAOkB,GAAKA,EAAE,MAAM,SAAS,QAAQ,CAAC,EAAE,OAC9DE,EAAcpB,EAAO,OAAOkB,GAAKA,EAAE,MAAM,SAAS,OAAO,CAAC,EAAE,OAElE,MAAO,CACL,gBAAAnB,EACA,WAAYkB,GAAa,EAAI,EAAI,EACjC,UAAAA,EACA,YAAa,KAAK,IAAIE,EAAe,GAAI,CAAC,EAC1C,iBAAkBC,EAAc,KAAK,IAAI,EAAGH,CAAS,EACrD,mBAAoB,EAAA,CAExB,CAEQ,wBAA+B,CACrC,GAAI,CAAC,KAAK,gBAAkB,KAAK,eAAe,aAAa,OAAS,EAAG,OAEzE,MAAMI,EAAqB,KAAK,eAAe,aAAa,MAAM,GAAG,EAG/DC,EAAUD,EAAmB,OAAOX,GAAKA,EAAE,OAAS,QAAQ,EAClE,GAAIY,EAAQ,OAAS,EAAG,CACtB,MAAMpB,EAA2B,CAC/B,GAAI,gBAAgB,KAAK,IAAA,CAAK,GAC9B,KAAM,cACN,QAAS,kBACT,WAAY,GACZ,UAAWoB,EAAQ,OAASD,EAAmB,OAC/C,SAAU,CAAC,iBAAiB,EAC5B,OAAQ,WACR,gBAAiB,CAAC,0BAA2B,2BAA2B,CAAA,EAG1E,KAAK,KAAK,mBAAoBnB,CAAO,CACvC,CACF,CAEQ,eAAeK,EAA4B,CACjD,MAAMgB,EAAUhB,EAAQ,SAAW,KAAK,IAAA,EAClCiB,EAAU,KAAK,4BACnBjB,EAAQ,aACRgB,EAAUhB,EAAQ,SAAA,EAIpB,GAAIiB,EAAQ,gBAAkB,GAAI,CAChC,MAAMC,EAA2B,CAC/B,GAAI,yBAAyBlB,EAAQ,SAAS,GAC9C,KAAM,kBACN,YAAa,2CACb,SAAU,SACV,gBAAiB,CAAC,kBAAkB,EACpC,UAAWgB,EACX,QAAS,CAAE,UAAWhB,EAAQ,UAAW,KAAMiB,EAAQ,eAAA,CAAgB,EAGzE,KAAK,KAAK,mBAAoBC,CAAO,CACvC,CACF,CAEQ,0BAA8C,CAGpD,MAAO,CACL,CACE,GAAI,yBACJ,KAAM,aACN,QAAS,kCACT,WAAY,IACZ,UAAW,GACX,SAAU,CAAC,mBAAmB,EAC9B,OAAQ,WACR,gBAAiB,CAAC,6BAA6B,CAAA,CACjD,CAEJ,CAEQ,2BAA+C,CAErD,MAAO,CACL,CACE,GAAI,kCACJ,KAAM,aACN,QAAS,6BACT,WAAY,GACZ,UAAW,GACX,SAAU,CAAC,wBAAwB,EACnC,OAAQ,UACR,gBAAiB,CAAC,4BAA6B,oBAAoB,CAAA,CACrE,CAEJ,CAEQ,wBAA4C,CAElD,MAAO,CACL,CACE,GAAI,oBACJ,KAAM,WACN,QAAS,mCACT,WAAY,GACZ,UAAW,GACX,SAAU,CAAC,kBAAkB,EAC7B,OAAQ,WACR,gBAAiB,CAAC,sCAAsC,CAAA,CAC1D,CAEJ,CAEQ,+BAAmD,CACzD,MAAO,CACL,CACE,GAAI,oBACJ,SAAU,gBACV,MAAO,qCACP,YAAa,0EACb,SAAU,CAAC,sCAAuC,+BAA+B,EACjF,YAAa,CAAC,6BAA8B,uBAAuB,EACnE,SAAU,GACV,WAAY,GAAA,CACd,CAEJ,CAEQ,2BAA+C,CACrD,MAAO,CACL,CACE,GAAI,wBACJ,SAAU,YACV,MAAO,uCACP,YAAa,4DACb,SAAU,CAAC,uCAAwC,kCAAkC,EACrF,YAAa,CAAC,iCAAkC,kCAAkC,EAClF,SAAU,GACV,WAAY,EAAA,CACd,CAEJ,CAEQ,6BAAiD,CACvD,MAAO,CACL,CACE,GAAI,kBACJ,SAAU,cACV,MAAO,+BACP,YAAa,oEACb,SAAU,CAAC,+BAAgC,4BAA4B,EACvE,YAAa,CAAC,0BAA2B,wBAAwB,EACjE,SAAU,GACV,WAAY,GAAA,CACd,CAEJ,CAEQ,4BAAgD,CACtD,MAAO,CACL,CACE,GAAI,iBACJ,SAAU,aACV,MAAO,kDACP,YAAa,+DACb,SAAU,CAAC,0CAA2C,yBAAyB,EAC/E,YAAa,CAAC,mCAAoC,oBAAoB,EACtE,SAAU,GACV,WAAY,EAAA,CACd,CAEJ,CAEQ,2BAAqD,CAC3D,MAAMC,EAAgB,KAAK,SAAS,OAC9BC,EAAoB,KAAK,SAAS,OAAO,CAACC,EAAKC,IAAMD,EAAMC,EAAE,aAAa,OAAQ,CAAC,EACnFC,EAAqB,KAAK,SAAS,OACvC,CAACF,EAAKC,IAAMD,IAAQC,EAAE,SAAW,KAAK,IAAA,GAASA,EAAE,WACjD,CAAA,EACE,KAAK,IAAI,EAAGH,CAAa,EAE7B,MAAO,CACL,cAAAA,EACA,kBAAAC,EACA,mBAAAG,EACA,0BAA2BH,EAAoB,KAAK,IAAI,EAAGD,CAAa,EACxE,iBAAkB,KAAK,aAAa,IAAA,CAExC,CAEQ,aAAapB,EAAmB,CAEtC,MAAMyB,EAAU,CAAC,YAAa,YAAa,UAAW,mBAAoB,YAAY,EAChFC,EAAO1B,EAAK,SAAS,IAAKC,GAA8C,CAC5EA,EAAQ,UACRA,EAAQ,UACRA,EAAQ,SAAW,GACnBA,EAAQ,aAAa,OACrBA,EAAQ,OAAO,MAAA,CAChB,EAED,MAAO,CAACwB,EAAQ,KAAK,GAAG,EAAG,GAAGC,EAAK,IAAIC,GAAOA,EAAI,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK;AAAA,CAAI,CACzE,CACF"}