UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 23 kB
{"version":3,"file":"error-boundary.cjs","sources":["../../../../../src/components/auth/common/error-boundary.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Error Boundary Component\n *\n * React error boundary with authentication-specific error handling,\n * organization theming, and recovery mechanisms.\n */\n\n\"use client\";\n\nimport { Button, Card, CardBody, CardHeader } from \"@/components/ui\";\nimport { motion } from \"framer-motion\";\nimport React from \"react\";\nimport { useConfig } from \"../../../hooks/use-config\";\nimport { useTheme } from \"../../../hooks/use-theme\";\n\n// ============================================================================\n// Error Boundary Types\n// ============================================================================\n\nexport interface ErrorBoundaryProps {\n\t/**\n\t * Child components to wrap\n\t */\n\tchildren: React.ReactNode;\n\n\t/**\n\t * Fallback component to render on error\n\t */\n\tfallback?: React.ComponentType<ErrorFallbackProps>;\n\n\t/**\n\t * Error handler callback\n\t */\n\tonError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n\n\t/**\n\t * Whether to show error details\n\t */\n\tshowDetails?: boolean;\n\n\t/**\n\t * Whether to show retry button\n\t */\n\tshowRetry?: boolean;\n\n\t/**\n\t * Custom retry handler\n\t */\n\tonRetry?: () => void;\n\n\t/**\n\t * Error boundary title\n\t */\n\ttitle?: string;\n\n\t/**\n\t * Error boundary subtitle\n\t */\n\tsubtitle?: string;\n\n\t/**\n\t * Custom className\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Whether to log errors to console\n\t */\n\tlogErrors?: boolean;\n\n\t/**\n\t * Whether to report errors to external service\n\t */\n\treportErrors?: boolean;\n\n\t/**\n\t * Error reporting endpoint\n\t */\n\terrorReportingUrl?: string;\n}\n\nexport interface ErrorFallbackProps {\n\t/**\n\t * The error that occurred\n\t */\n\terror: Error;\n\n\t/**\n\t * Error information from React\n\t */\n\terrorInfo: React.ErrorInfo;\n\n\t/**\n\t * Function to reset the error boundary\n\t */\n\tresetError: () => void;\n\n\t/**\n\t * Whether to show error details\n\t */\n\tshowDetails?: boolean;\n\n\t/**\n\t * Custom title\n\t */\n\ttitle?: string;\n\n\t/**\n\t * Custom subtitle\n\t */\n\tsubtitle?: string;\n\n\t/**\n\t * Custom className\n\t */\n\tclassName?: string;\n}\n\ninterface ErrorBoundaryState {\n\thasError: boolean;\n\terror: Error | null;\n\terrorInfo: React.ErrorInfo | null;\n\terrorId: string;\n}\n\n// ============================================================================\n// Default Error Fallback Component\n// ============================================================================\n\nfunction DefaultErrorFallback({\n\terror,\n\terrorInfo,\n\tresetError,\n\tshowDetails = false,\n\ttitle = \"Something went wrong\",\n\tsubtitle = \"An unexpected error occurred while processing your request.\",\n\tclassName = \"\",\n}: ErrorFallbackProps) {\n\tconst { getColorValue } = useTheme();\n\tconst { organizationSettings } = useConfig();\n\n\tconst [showDetailsState, setShowDetailsState] = React.useState(false);\n\n\t// Error categorization\n\tconst errorType = React.useMemo(() => {\n\t\tconst message = error.message.toLowerCase();\n\n\t\tif (message.includes(\"network\") || message.includes(\"fetch\")) {\n\t\t\treturn \"network\";\n\t\t}\n\t\tif (message.includes(\"auth\") || message.includes(\"unauthorized\")) {\n\t\t\treturn \"auth\";\n\t\t}\n\t\tif (message.includes(\"permission\") || message.includes(\"forbidden\")) {\n\t\t\treturn \"permission\";\n\t\t}\n\t\tif (message.includes(\"timeout\")) {\n\t\t\treturn \"timeout\";\n\t\t}\n\t\treturn \"unknown\";\n\t}, [error.message]);\n\n\t// Error-specific messages\n\tconst errorMessages = {\n\t\tnetwork: {\n\t\t\ttitle: \"Connection Problem\",\n\t\t\tsubtitle: \"Please check your internet connection and try again.\",\n\t\t\taction: \"Retry\",\n\t\t},\n\t\tauth: {\n\t\t\ttitle: \"Authentication Error\",\n\t\t\tsubtitle: \"Please sign in again to continue.\",\n\t\t\taction: \"Sign In\",\n\t\t},\n\t\tpermission: {\n\t\t\ttitle: \"Access Denied\",\n\t\t\tsubtitle: \"You don't have permission to access this resource.\",\n\t\t\taction: \"Go Back\",\n\t\t},\n\t\ttimeout: {\n\t\t\ttitle: \"Request Timeout\",\n\t\t\tsubtitle: \"The request took too long to complete. Please try again.\",\n\t\t\taction: \"Retry\",\n\t\t},\n\t\tunknown: {\n\t\t\ttitle,\n\t\t\tsubtitle,\n\t\t\taction: \"Retry\",\n\t\t},\n\t};\n\n\tconst errorMessage = errorMessages[errorType];\n\n\t// Error icon based on type\n\tconst getErrorIcon = () => {\n\t\tswitch (errorType) {\n\t\t\tcase \"network\":\n\t\t\t\treturn (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclassName=\"w-12 h-12 text-warning-500\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\td=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.732-.833-2.5 0L4.732 16.5c-.77.833.192 2.5 1.732 2.5z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t);\n\t\t\tcase \"auth\":\n\t\t\t\treturn (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclassName=\"w-12 h-12 text-danger-500\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\td=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t);\n\t\t\tcase \"permission\":\n\t\t\t\treturn (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclassName=\"w-12 h-12 text-warning-500\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\td=\"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728L5.636 5.636m12.728 12.728L5.636 5.636\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t);\n\t\t\tcase \"timeout\":\n\t\t\t\treturn (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclassName=\"w-12 h-12 text-warning-500\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\td=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclassName=\"w-12 h-12 text-danger-500\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\td=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.732-.833-2.5 0L4.732 16.5c-.77.833.192 2.5 1.732 2.5z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t<motion.div\n\t\t\tinitial={{ opacity: 0, y: 20 }}\n\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\tclassName={`flex items-center justify-center min-h-64 p-4 ${className}`}\n\t\t>\n\t\t\t<Card className=\"w-full max-w-md\">\n\t\t\t\t<CardHeader className=\"flex flex-col items-center text-center\">\n\t\t\t\t\t{/* Organization Logo */}\n\t\t\t\t\t{organizationSettings?.branding?.logoUrl && (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={organizationSettings.branding.logoUrl}\n\t\t\t\t\t\t\talt=\"Logo\"\n\t\t\t\t\t\t\tclassName=\"h-8 w-auto mb-4\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Error Icon */}\n\t\t\t\t\t<div className=\"mb-4\">{getErrorIcon()}</div>\n\n\t\t\t\t\t{/* Error Title */}\n\t\t\t\t\t<h3 className=\"text-xl font-semibold text-foreground mb-2\">\n\t\t\t\t\t\t{errorMessage.title}\n\t\t\t\t\t</h3>\n\n\t\t\t\t\t{/* Error Subtitle */}\n\t\t\t\t\t<p className=\"text-default-500 text-sm mb-4\">\n\t\t\t\t\t\t{errorMessage.subtitle}\n\t\t\t\t\t</p>\n\t\t\t\t</CardHeader>\n\n\t\t\t\t<CardBody className=\"pt-0\">\n\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t{/* Action Buttons */}\n\t\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\t\t\tvariant=\"solid\"\n\t\t\t\t\t\t\t\tsize=\"lg\"\n\t\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t\t\tonPress={resetError}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{errorMessage.action}\n\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t{showDetails && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"light\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tonPress={() => setShowDetailsState(!showDetailsState)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{showDetailsState ? \"Hide Details\" : \"Show Details\"}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Error Details */}\n\t\t\t\t\t\t{showDetails && showDetailsState && (\n\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, height: 0 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, height: \"auto\" }}\n\t\t\t\t\t\t\t\texit={{ opacity: 0, height: 0 }}\n\t\t\t\t\t\t\t\tclassName=\"mt-4 p-3 bg-default-100 dark:bg-default-800 rounded-lg\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs font-medium text-default-600\">\n\t\t\t\t\t\t\t\t\t\t\tError Message:\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-default-500 mt-1 font-mono\">\n\t\t\t\t\t\t\t\t\t\t\t{error.message}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{error.stack && (\n\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs font-medium text-default-600\">\n\t\t\t\t\t\t\t\t\t\t\t\tStack Trace:\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<pre className=\"text-xs text-default-500 mt-1 overflow-auto max-h-32 font-mono\">\n\t\t\t\t\t\t\t\t\t\t\t\t{error.stack}\n\t\t\t\t\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</CardBody>\n\t\t\t</Card>\n\t\t</motion.div>\n\t);\n}\n\n// ============================================================================\n// Error Boundary Class Component\n// ============================================================================\n\nexport class ErrorBoundary extends React.Component<\n\tErrorBoundaryProps,\n\tErrorBoundaryState\n> {\n\tprivate retryTimeoutId: NodeJS.Timeout | null = null;\n\n\tconstructor(props: ErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\thasError: false,\n\t\t\terror: null,\n\t\t\terrorInfo: null,\n\t\t\terrorId: \"\",\n\t\t};\n\t}\n\n\tstatic getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n\t\treturn {\n\t\t\thasError: true,\n\t\t\terror,\n\t\t\terrorId: Date.now().toString(36) + Math.random().toString(36).substr(2),\n\t\t};\n\t}\n\n\tcomponentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n\t\tconst {\n\t\t\tonError,\n\t\t\tlogErrors = true,\n\t\t\treportErrors = false,\n\t\t\terrorReportingUrl,\n\t\t} = this.props;\n\n\t\t// Update state with error info\n\t\tthis.setState({\n\t\t\terrorInfo,\n\t\t});\n\n\t\t// Log error to console\n\t\tif (logErrors) {\n\t\t\tconsole.group(\"🚨 Error Boundary Caught Error\");\n\t\t\tconsole.error(\"Error:\", error);\n\t\t\tconsole.error(\"Error Info:\", errorInfo);\n\t\t\tconsole.error(\"Component Stack:\", errorInfo.componentStack);\n\t\t\tconsole.groupEnd();\n\t\t}\n\n\t\t// Call custom error handler\n\t\tonError?.(error, errorInfo);\n\n\t\t// Report error to external service\n\t\tif (reportErrors && errorReportingUrl) {\n\t\t\tthis.reportError(error, errorInfo);\n\t\t}\n\t}\n\n\tprivate reportError = async (error: Error, errorInfo: React.ErrorInfo) => {\n\t\tconst { errorReportingUrl } = this.props;\n\n\t\tif (!errorReportingUrl) return;\n\n\t\ttry {\n\t\t\tawait fetch(errorReportingUrl, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\terror: {\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\tstack: error.stack,\n\t\t\t\t\t\tname: error.name,\n\t\t\t\t\t},\n\t\t\t\t\terrorInfo,\n\t\t\t\t\terrorId: this.state.errorId,\n\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\tuserAgent: navigator.userAgent,\n\t\t\t\t\turl: window.location.href,\n\t\t\t\t}),\n\t\t\t});\n\t\t} catch (reportingError) {\n\t\t\tconsole.error(\"Failed to report error:\", reportingError);\n\t\t}\n\t};\n\n\tprivate resetError = () => {\n\t\tconst { onRetry } = this.props;\n\n\t\t// Clear any existing retry timeout\n\t\tif (this.retryTimeoutId) {\n\t\t\tclearTimeout(this.retryTimeoutId);\n\t\t}\n\n\t\t// Reset state\n\t\tthis.setState({\n\t\t\thasError: false,\n\t\t\terror: null,\n\t\t\terrorInfo: null,\n\t\t\terrorId: \"\",\n\t\t});\n\n\t\t// Call custom retry handler\n\t\tonRetry?.();\n\t};\n\n\trender() {\n\t\tconst { hasError, error, errorInfo } = this.state;\n\t\tconst {\n\t\t\tchildren,\n\t\t\tfallback: Fallback = DefaultErrorFallback,\n\t\t\tshowDetails = false,\n\t\t\ttitle,\n\t\t\tsubtitle,\n\t\t\tclassName,\n\t\t} = this.props;\n\n\t\tif (hasError && error) {\n\t\t\treturn (\n\t\t\t\t<Fallback\n\t\t\t\t\terror={error}\n\t\t\t\t\terrorInfo={errorInfo!}\n\t\t\t\t\tresetError={this.resetError}\n\t\t\t\t\tshowDetails={showDetails}\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tsubtitle={subtitle}\n\t\t\t\t\tclassName={className}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\treturn children;\n\t}\n}\n\n// ============================================================================\n// Async Error Boundary Hook\n// ============================================================================\n\nexport function useAsyncError() {\n\tconst [error, setError] = React.useState<Error | null>(null);\n\n\tconst throwError = React.useCallback((error: Error) => {\n\t\tsetError(error);\n\t}, []);\n\n\tReact.useEffect(() => {\n\t\tif (error) {\n\t\t\tthrow error;\n\t\t}\n\t}, [error]);\n\n\treturn throwError;\n}\n\n// ============================================================================\n// Error Boundary Wrapper Component\n// ============================================================================\n\nexport function withErrorBoundary<P extends object>(\n\tComponent: React.ComponentType<P>,\n\terrorBoundaryProps?: Partial<ErrorBoundaryProps>,\n) {\n\tconst WrappedComponent = (props: P) => (\n\t\t<ErrorBoundary {...errorBoundaryProps}>\n\t\t\t<Component {...props} />\n\t\t</ErrorBoundary>\n\t);\n\n\tWrappedComponent.displayName = `withErrorBoundary(${Component.displayName || Component.name})`;\n\n\treturn WrappedComponent;\n}\n\n// ============================================================================\n// Auth-Specific Error Boundaries\n// ============================================================================\n\nexport function AuthErrorBoundary({\n\tchildren,\n\t...props\n}: Omit<ErrorBoundaryProps, \"title\" | \"subtitle\">) {\n\treturn (\n\t\t<ErrorBoundary\n\t\t\ttitle=\"Authentication Error\"\n\t\t\tsubtitle=\"There was a problem with the authentication process.\"\n\t\t\tshowDetails={process.env.NODE_ENV === \"development\"}\n\t\t\treportErrors={process.env.NODE_ENV === \"production\"}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</ErrorBoundary>\n\t);\n}\n\nexport function FormErrorBoundary({\n\tchildren,\n\t...props\n}: Omit<ErrorBoundaryProps, \"title\" | \"subtitle\">) {\n\treturn (\n\t\t<ErrorBoundary\n\t\t\ttitle=\"Form Error\"\n\t\t\tsubtitle=\"There was a problem processing your form submission.\"\n\t\t\tshowDetails={process.env.NODE_ENV === \"development\"}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</ErrorBoundary>\n\t);\n}\n\nexport function ApiErrorBoundary({\n\tchildren,\n\t...props\n}: Omit<ErrorBoundaryProps, \"title\" | \"subtitle\">) {\n\treturn (\n\t\t<ErrorBoundary\n\t\t\ttitle=\"Service Error\"\n\t\t\tsubtitle=\"There was a problem connecting to our services.\"\n\t\t\tshowDetails={process.env.NODE_ENV === \"development\"}\n\t\t\treportErrors={process.env.NODE_ENV === \"production\"}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</ErrorBoundary>\n\t);\n}\n\n// ============================================================================\n// Export\n// ============================================================================\n\nexport default ErrorBoundary;\n"],"names":["DefaultErrorFallback","error","errorInfo","resetError","showDetails","title","subtitle","className","getColorValue","useTheme","organizationSettings","useConfig","showDetailsState","setShowDetailsState","React","errorType","message","errorMessage","getErrorIcon","jsx","motion","jsxs","Card","CardHeader","CardBody","Button","ErrorBoundary","props","__publicField","errorReportingUrl","reportingError","onRetry","onError","logErrors","reportErrors","hasError","children","Fallback","useAsyncError","setError","throwError","withErrorBoundary","Component","errorBoundaryProps","WrappedComponent","AuthErrorBoundary","FormErrorBoundary","ApiErrorBoundary","error_boundary_default"],"mappings":"ukBAiIA,SAASA,EAAqB,CAC7B,MAAAC,EACA,UAAAC,EACA,WAAAC,EACA,YAAAC,EAAc,GACd,MAAAC,EAAQ,uBACR,SAAAC,EAAW,8DACX,UAAAC,EAAY,EACb,EAAuB,CAChB,KAAA,CAAE,cAAAC,CAAc,EAAIC,WAAS,EAC7B,CAAE,qBAAAC,CAAqB,EAAIC,YAAU,EAErC,CAACC,EAAkBC,CAAmB,EAAIC,EAAAA,QAAM,SAAS,EAAK,EAG9DC,EAAYD,UAAM,QAAQ,IAAM,CAC/B,MAAAE,EAAUf,EAAM,QAAQ,YAAY,EAE1C,OAAIe,EAAQ,SAAS,SAAS,GAAKA,EAAQ,SAAS,OAAO,EACnD,UAEJA,EAAQ,SAAS,MAAM,GAAKA,EAAQ,SAAS,cAAc,EACvD,OAEJA,EAAQ,SAAS,YAAY,GAAKA,EAAQ,SAAS,WAAW,EAC1D,aAEJA,EAAQ,SAAS,SAAS,EACtB,UAED,SAAA,EACL,CAACf,EAAM,OAAO,CAAC,EA+BZgB,EA5BgB,CACrB,QAAS,CACR,MAAO,qBACP,SAAU,uDACV,OAAQ,OACT,EACA,KAAM,CACL,MAAO,uBACP,SAAU,oCACV,OAAQ,SACT,EACA,WAAY,CACX,MAAO,gBACP,SAAU,qDACV,OAAQ,SACT,EACA,QAAS,CACR,MAAO,kBACP,SAAU,2DACV,OAAQ,OACT,EACA,QAAS,CACR,MAAAZ,EACA,SAAAC,EACA,OAAQ,OAAA,CAEV,EAEmCS,CAAS,EAGtCG,EAAe,IAAM,CAC1B,OAAQH,EAAW,CAClB,IAAK,UAEH,OAAAI,EAAA,IAAC,MAAA,CACA,UAAU,6BACV,KAAK,OACL,OAAO,eACP,QAAQ,YAER,SAAAA,EAAA,IAAC,OAAA,CACA,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,yIAAA,CAAA,CACH,CACD,EAEF,IAAK,OAEH,OAAAA,EAAA,IAAC,MAAA,CACA,UAAU,4BACV,KAAK,OACL,OAAO,eACP,QAAQ,YAER,SAAAA,EAAA,IAAC,OAAA,CACA,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,sGAAA,CAAA,CACH,CACD,EAEF,IAAK,aAEH,OAAAA,EAAA,IAAC,MAAA,CACA,UAAU,6BACV,KAAK,OACL,OAAO,eACP,QAAQ,YAER,SAAAA,EAAA,IAAC,OAAA,CACA,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,wFAAA,CAAA,CACH,CACD,EAEF,IAAK,UAEH,OAAAA,EAAA,IAAC,MAAA,CACA,UAAU,6BACV,KAAK,OACL,OAAO,eACP,QAAQ,YAER,SAAAA,EAAA,IAAC,OAAA,CACA,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,6CAAA,CAAA,CACH,CACD,EAEF,QAEE,OAAAA,EAAA,IAAC,MAAA,CACA,UAAU,4BACV,KAAK,OACL,OAAO,eACP,QAAQ,YAER,SAAAA,EAAA,IAAC,OAAA,CACA,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,yIAAA,CAAA,CACH,CACD,CAAA,CAGJ,EAGC,OAAAA,EAAA,IAACC,EAAAA,OAAO,IAAP,CACA,QAAS,CAAE,QAAS,EAAG,EAAG,EAAG,EAC7B,QAAS,CAAE,QAAS,EAAG,EAAG,CAAE,EAC5B,UAAW,iDAAiDb,CAAS,GAErE,SAAAc,EAAA,KAACC,EAAK,KAAA,CAAA,UAAU,kBACf,SAAA,CAACD,EAAAA,KAAAE,EAAAA,WAAA,CAAW,UAAU,yCAEpB,SAAA,CAAAb,GAAsB,UAAU,SAChCS,EAAA,IAAC,MAAA,CACA,IAAKT,EAAqB,SAAS,QACnC,IAAI,OACJ,UAAU,iBAAA,CACX,EAIAS,EAAA,IAAA,MAAA,CAAI,UAAU,OAAQ,aAAe,EAGrCA,EAAA,IAAA,KAAA,CAAG,UAAU,6CACZ,WAAa,MACf,EAGCA,EAAA,IAAA,IAAA,CAAE,UAAU,gCACX,WAAa,QACf,CAAA,CAAA,EACD,QAECK,EAAS,SAAA,CAAA,UAAU,OACnB,SAACH,EAAA,KAAA,MAAA,CAAI,UAAU,YAEd,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAF,EAAA,IAACM,EAAA,OAAA,CACA,MAAM,UACN,QAAQ,QACR,KAAK,KACL,UAAU,SACV,QAAStB,EAER,SAAac,EAAA,MAAA,CACf,EAECb,GACAe,EAAA,IAACM,EAAA,OAAA,CACA,QAAQ,QACR,KAAK,KACL,QAAS,IAAMZ,EAAoB,CAACD,CAAgB,EAEnD,WAAmB,eAAiB,cAAA,CAAA,CACtC,EAEF,EAGCR,GAAeQ,GACfO,EAAA,IAACC,EAAAA,OAAO,IAAP,CACA,QAAS,CAAE,QAAS,EAAG,OAAQ,CAAE,EACjC,QAAS,CAAE,QAAS,EAAG,OAAQ,MAAO,EACtC,KAAM,CAAE,QAAS,EAAG,OAAQ,CAAE,EAC9B,UAAU,yDAEV,SAAAC,EAAA,KAAC,MAAI,CAAA,UAAU,YACd,SAAA,CAAAA,OAAC,MACA,CAAA,SAAA,CAACF,EAAA,IAAA,OAAA,CAAK,UAAU,uCAAuC,SAEvD,iBAAA,EACCA,EAAA,IAAA,IAAA,CAAE,UAAU,0CACX,WAAM,OACR,CAAA,CAAA,EACD,EAEClB,EAAM,OACNoB,EAAAA,KAAC,MACA,CAAA,SAAA,CAACF,EAAA,IAAA,OAAA,CAAK,UAAU,uCAAuC,SAEvD,eAAA,EACCA,EAAA,IAAA,MAAA,CAAI,UAAU,iEACb,WAAM,KACR,CAAA,CAAA,CACD,CAAA,CAAA,CAEF,CAAA,CAAA,CAAA,CACD,CAAA,CAEF,CACD,CAAA,CAAA,CACD,CAAA,CAAA,CACD,CAEF,CAMO,MAAMO,UAAsBZ,UAAM,SAGvC,CAGD,YAAYa,EAA2B,CACtC,MAAMA,CAAK,EAHZC,EAAA,KAAQ,iBAAwC,IAAA,EAmDxCA,EAAA,KAAA,cAAc,MAAO3B,EAAcC,IAA+B,CACnE,KAAA,CAAE,kBAAA2B,GAAsB,KAAK,MAEnC,GAAKA,EAED,GAAA,CACH,MAAM,MAAMA,EAAmB,CAC9B,OAAQ,OACR,QAAS,CACR,eAAgB,kBACjB,EACA,KAAM,KAAK,UAAU,CACpB,MAAO,CACN,QAAS5B,EAAM,QACf,MAAOA,EAAM,MACb,KAAMA,EAAM,IACb,EACA,UAAAC,EACA,QAAS,KAAK,MAAM,QACpB,UAAW,IAAI,KAAK,EAAE,YAAY,EAClC,UAAW,UAAU,UACrB,IAAK,OAAO,SAAS,IACrB,CAAA,CAAA,CACD,QACO4B,EAAgB,CAChB,QAAA,MAAM,0BAA2BA,CAAc,CAAA,CACxD,CACD,EAEAF,EAAA,KAAQ,aAAa,IAAM,CACpB,KAAA,CAAE,QAAAG,GAAY,KAAK,MAGrB,KAAK,gBACR,aAAa,KAAK,cAAc,EAIjC,KAAK,SAAS,CACb,SAAU,GACV,MAAO,KACP,UAAW,KACX,QAAS,EAAA,CACT,EAGSA,IAAA,CAAA,CACX,EA9FC,KAAK,MAAQ,CACZ,SAAU,GACV,MAAO,KACP,UAAW,KACX,QAAS,EACV,CAAA,CAGD,OAAO,yBAAyB9B,EAA2C,CACnE,MAAA,CACN,SAAU,GACV,MAAAA,EACA,QAAS,KAAK,MAAM,SAAS,EAAE,EAAI,KAAK,OAAS,EAAA,SAAS,EAAE,EAAE,OAAO,CAAC,CACvE,CAAA,CAGD,kBAAkBA,EAAcC,EAA4B,CACrD,KAAA,CACL,QAAA8B,EACA,UAAAC,EAAY,GACZ,aAAAC,EAAe,GACf,kBAAAL,GACG,KAAK,MAGT,KAAK,SAAS,CACb,UAAA3B,CAAA,CACA,EAGG+B,IACH,QAAQ,MAAM,gCAAgC,EACtC,QAAA,MAAM,SAAUhC,CAAK,EACrB,QAAA,MAAM,cAAeC,CAAS,EAC9B,QAAA,MAAM,mBAAoBA,EAAU,cAAc,EAC1D,QAAQ,SAAS,GAIlB8B,IAAU/B,EAAOC,CAAS,EAGtBgC,GAAgBL,GACd,KAAA,YAAY5B,EAAOC,CAAS,CAClC,CAoDD,QAAS,CACR,KAAM,CAAE,SAAAiC,EAAU,MAAAlC,EAAO,UAAAC,GAAc,KAAK,MACtC,CACL,SAAAkC,EACA,SAAUC,EAAWrC,EACrB,YAAAI,EAAc,GACd,MAAAC,EACA,SAAAC,EACA,UAAAC,GACG,KAAK,MAET,OAAI4B,GAAYlC,EAEdkB,EAAA,IAACkB,EAAA,CACA,MAAApC,EACA,UAAAC,EACA,WAAY,KAAK,WACjB,YAAAE,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,CAAA,CACD,EAIK6B,CAAA,CAET,CAMO,SAASE,GAAgB,CAC/B,KAAM,CAACrC,EAAOsC,CAAQ,EAAIzB,EAAAA,QAAM,SAAuB,IAAI,EAErD0B,EAAa1B,EAAAA,QAAM,YAAab,GAAiB,CACtDsC,EAAStC,CAAK,CACf,EAAG,EAAE,EAELa,OAAAA,EAAA,QAAM,UAAU,IAAM,CACrB,GAAIb,EACG,MAAAA,CACP,EACE,CAACA,CAAK,CAAC,EAEHuC,CACR,CAMO,SAASC,EACfC,EACAC,EACC,CACK,MAAAC,EAAoBjB,GACxBR,EAAAA,IAAAO,EAAA,CAAe,GAAGiB,EAClB,SAACxB,EAAA,IAAAuB,EAAA,CAAW,GAAGf,CAAA,CAAO,CACvB,CAAA,EAGD,OAAAiB,EAAiB,YAAc,qBAAqBF,EAAU,aAAeA,EAAU,IAAI,IAEpFE,CACR,CAMO,SAASC,EAAkB,CACjC,SAAAT,EACA,GAAGT,CACJ,EAAmD,CAEjD,OAAAR,EAAA,IAACO,EAAA,CACA,MAAM,uBACN,SAAS,uDACT,YAAa,QAAQ,IAAI,WAAa,cACtC,aAAc,QAAQ,IAAI,WAAa,aACtC,GAAGC,EAEH,SAAAS,CAAA,CACF,CAEF,CAEO,SAASU,EAAkB,CACjC,SAAAV,EACA,GAAGT,CACJ,EAAmD,CAEjD,OAAAR,EAAA,IAACO,EAAA,CACA,MAAM,aACN,SAAS,uDACT,YAAa,QAAQ,IAAI,WAAa,cACrC,GAAGC,EAEH,SAAAS,CAAA,CACF,CAEF,CAEO,SAASW,EAAiB,CAChC,SAAAX,EACA,GAAGT,CACJ,EAAmD,CAEjD,OAAAR,EAAA,IAACO,EAAA,CACA,MAAM,gBACN,SAAS,kDACT,YAAa,QAAQ,IAAI,WAAa,cACtC,aAAc,QAAQ,IAAI,WAAa,aACtC,GAAGC,EAEH,SAAAS,CAAA,CACF,CAEF,CAMA,IAAOY,EAAQtB"}