@rendomnet/apiservice 1.3.7 → 1.4.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/ApiKeyAuthProvider.ts","../src/CacheManager.ts","../src/RetryManager.ts","../src/HookManager.ts","../src/HttpClient.ts","../src/FetchError.ts","../src/form.ts","../src/AccountManager.ts"],"sourcesContent":["import { \n AuthProvider,\n ApiCallParams,\n HookSettings,\n StatusCode,\n Token,\n OAuthToken\n} from './types';\nimport { ApiKeyAuthProvider } from './ApiKeyAuthProvider';\nimport {\n CacheManager,\n RetryManager,\n HookManager,\n HttpClient,\n AccountManager\n} from './components';\n\n/**\n * ApiService - Core API service for making authenticated API calls\n * with caching, retry, and hook support.\n */\nclass ApiService {\n public provider: string; // Service provider name\n private authProvider: AuthProvider;\n private baseUrl: string = ''; // Default base URL\n \n // Component managers\n private cacheManager: CacheManager;\n private retryManager: RetryManager;\n private hookManager: HookManager;\n private httpClient: HttpClient;\n private accountManager: AccountManager;\n \n // Default max attempts for API calls\n private maxAttempts = 10;\n\n constructor() {\n this.provider = '';\n this.authProvider = {} as AuthProvider;\n \n // Initialize component managers\n this.cacheManager = new CacheManager();\n this.retryManager = new RetryManager();\n this.hookManager = new HookManager();\n this.httpClient = new HttpClient();\n this.accountManager = new AccountManager();\n }\n\n /**\n * Setup the API service\n */\n public setup({\n provider,\n authProvider,\n hooks = {},\n cacheTime,\n baseUrl = '',\n }: {\n provider: string;\n authProvider: AuthProvider;\n hooks?: Record<StatusCode, HookSettings | null>;\n cacheTime: number;\n baseUrl?: string;\n }) {\n this.provider = provider;\n this.authProvider = authProvider;\n this.baseUrl = baseUrl;\n \n // Create a copy of hooks to avoid modifying the input\n const finalHooks: Record<StatusCode, HookSettings> = {};\n \n // Apply default 401 handler if:\n // 1. No 401 hook is explicitly defined (or is explicitly null)\n // 2. AuthProvider has a refresh method\n if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {\n finalHooks[401] = this.createDefaultAuthRefreshHandler();\n }\n \n // Add user-defined hooks (skipping null/undefined values)\n for (const [statusCode, hook] of Object.entries(hooks)) {\n if (hook) {\n finalHooks[statusCode] = hook;\n }\n }\n \n // Set the hooks if we have any\n if (Object.keys(finalHooks).length > 0) {\n this.hookManager.setHooks(finalHooks);\n }\n \n if (typeof cacheTime !== 'undefined') {\n this.cacheManager.setCacheTime(cacheTime);\n }\n }\n \n /**\n * Create a default handler for 401 (Unauthorized) errors\n * that implements standard credential refresh behavior\n */\n private createDefaultAuthRefreshHandler(): HookSettings {\n return {\n shouldRetry: true,\n useRetryDelay: true,\n preventConcurrentCalls: true,\n maxRetries: 1,\n handler: async (accountId) => {\n try {\n console.log(`🔄 Using default auth refresh handler for ${accountId}`);\n if (!this.authProvider.refresh) {\n throw new Error('No refresh method available on auth provider');\n }\n // You may want to store refresh token in account data or pass it in another way\n // For now, assume refresh token is managed internally by the provider\n await this.authProvider.refresh(accountId);\n return {};\n } catch (error) {\n console.error(`Auth refresh failed for ${accountId}:`, error);\n throw error;\n }\n },\n onMaxRetriesExceeded: async (accountId, error) => {\n console.error(`Authentication failed after refresh attempt for ${accountId}:`, error);\n }\n };\n }\n \n /**\n * Set the maximum number of retry attempts\n */\n public setMaxAttempts(attempts: number): void {\n this.maxAttempts = attempts;\n }\n\n /**\n * Update account data\n */\n public updateAccountData(accountId: string, data: Partial<Record<string, any>>): void {\n this.accountManager.updateAccountData(accountId, data);\n }\n\n /**\n * Make an API call with all features (caching, retry, hooks)\n */\n public async call(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n // Use 'default' as fallback if accountId is not provided\n // and use default baseUrl if not provided\n const params: ApiCallParams = {\n ...apiCallParams,\n accountId: apiCallParams.accountId || 'default',\n base: apiCallParams.base || this.baseUrl,\n };\n\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n params.queryParams = urlParams;\n }\n\n console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);\n \n // Check cache first\n const cachedData = this.cacheManager.getFromCache(params);\n if (cachedData) return cachedData;\n\n // Make the API call with retry capability\n const result = await this.makeRequestWithRetry(params);\n \n // Cache the result\n this.cacheManager.saveToCache(params, result);\n \n return result;\n }\n\n /**\n * Legacy method for backward compatibility\n * @deprecated Use call() instead\n */\n public async makeApiCall(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n return this.call(apiCallParams);\n }\n\n /**\n * Make a request with retry capability\n */\n private async makeRequestWithRetry(apiCallParams: ApiCallParams): Promise<any> {\n const { accountId, abortSignal } = apiCallParams;\n let attempts = 0;\n const statusRetries: Record<StatusCode, number> = {};\n let currentParams = { ...apiCallParams };\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n currentParams.queryParams = urlParams;\n }\n // Main retry loop\n while (attempts < this.maxAttempts) {\n if (abortSignal?.aborted) {\n throw new Error('Request aborted');\n }\n attempts++;\n \n try {\n // Get authentication headers if needed\n const authHeaders: Record<string, string> = apiCallParams.useAuth !== false\n ? await this.authProvider.getAuthHeaders(accountId)\n : {};\n // Merge auth headers into params.headers\n currentParams.headers = {\n ...(currentParams.headers || {}),\n ...authHeaders,\n };\n \n // Verify we have authentication if required\n if (\n apiCallParams.useAuth !== false &&\n Object.keys(authHeaders).length === 0 &&\n !(\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n )\n ) {\n throw new Error(`${this.provider} credentials not found for account ID ${accountId}`);\n }\n \n // Make the actual API call\n const response = await this.httpClient.makeRequest(currentParams, {});\n \n // Success - update account status and return result\n this.accountManager.setLastRequestFailed(accountId, false);\n return response;\n } \n catch (error: any) {\n const status = error?.status;\n \n // If no hook exists for this error, or we shouldn't retry, throw\n if (!this.hookManager.shouldRetry(status)) {\n throw error;\n }\n \n // Track retries for this status code\n statusRetries[status] = (statusRetries[status] || 0) + 1;\n const activeHook = this.hookManager.getHook(status);\n const maxRetries = activeHook?.maxRetries ?? this.retryManager.getDefaultMaxRetries();\n \n // Check if we've exceeded retries for this status\n if (statusRetries[status] > maxRetries) {\n await this.hookManager.handleRetryFailure(accountId, status, error);\n this.accountManager.setLastRequestFailed(accountId, true);\n throw error;\n }\n \n // Process the hook to get updated params\n try {\n const hookResult = await this.hookManager.processHook(accountId, status, error);\n if (hookResult) {\n currentParams = { ...currentParams, ...hookResult };\n }\n } \n catch (hookError) {\n this.accountManager.setLastRequestFailed(accountId, true);\n throw hookError;\n }\n \n // Wait before retrying if needed\n if (activeHook?.useRetryDelay) {\n await this.retryManager.calculateAndDelay({\n attempt: statusRetries[status],\n response: error.response,\n hook: activeHook,\n });\n }\n }\n }\n \n // If we've reached here, we've exceeded our maximum attempts\n this.accountManager.setLastRequestFailed(accountId, true);\n throw new Error(`Exceeded maximum attempts (${this.maxAttempts}) for API call to ${accountId}`);\n }\n\n /**\n * Set the cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheManager.setCacheTime(milliseconds);\n }\n\n /**\n * Clear the cache\n */\n public clearCache(): void {\n this.cacheManager.clearCache();\n }\n}\n\nexport default ApiService;\n","import { AuthProvider, ApiKeyAuthProviderOptions } from './types';\n\nexport class ApiKeyAuthProvider implements AuthProvider {\n private apiKey: string;\n private headerName?: string;\n private queryParamName?: string;\n\n constructor(options: ApiKeyAuthProviderOptions) {\n this.apiKey = options.apiKey;\n this.headerName = options.headerName;\n this.queryParamName = options.queryParamName;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.headerName) {\n return { [this.headerName]: this.apiKey };\n }\n // If using query param, return empty headers (handled elsewhere)\n return {};\n }\n\n // For API key, refresh is not supported\n} ","import { ApiCallParams } from './types';\n\n/**\n * Handles caching of API responses\n */\nexport class CacheManager {\n private cache: Map<string, { data: any; timestamp: number }> = new Map();\n private cacheTime = 20000; // Default cache time of 20 seconds\n\n /**\n * Get data from cache if available and not expired\n */\n public getFromCache(apiCallParams: ApiCallParams): any {\n const requestKey = this.getRequestKey(apiCallParams);\n const currentCacheTime = apiCallParams.cacheTime ?? this.cacheTime;\n const cached = this.cache.get(requestKey);\n \n if (cached && (Date.now() - cached.timestamp < currentCacheTime)) {\n return cached.data;\n }\n \n return null;\n }\n\n /**\n * Save data to cache\n */\n public saveToCache(apiCallParams: ApiCallParams, data: any): void {\n const requestKey = this.getRequestKey(apiCallParams);\n this.cache.set(requestKey, { \n data, \n timestamp: Date.now() \n });\n }\n\n /**\n * Generate a unique key for caching based on request parameters\n */\n private getRequestKey(apiCallParams: ApiCallParams): string {\n const { accountId, method, route, base, queryParams, body, data } = apiCallParams;\n return JSON.stringify({\n accountId,\n method,\n route,\n base,\n queryParams,\n body: body || data,\n });\n }\n\n /**\n * Set the default cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheTime = milliseconds;\n }\n\n /**\n * Clear the entire cache\n */\n public clearCache(): void {\n this.cache.clear();\n }\n} ","import { DelayStrategy, HookSettings } from './types';\n\n/**\n * Handles retry logic and delay strategies for failed API calls\n */\nexport class RetryManager {\n private defaultMaxDelay = 60000; // Default max delay of 1 minute\n private defaultMaxRetries = 4;\n\n /**\n * Default exponential backoff strategy with full jitter\n */\n private defaultDelayStrategy: DelayStrategy = {\n calculate: (attempt: number, response?: any) => {\n // Check for Retry-After header\n const retryAfter = this.getRetryAfterValue(response);\n if (retryAfter) return retryAfter;\n \n // Exponential backoff with full jitter\n const baseDelay = 1000; // 1 second\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n return Math.floor(Math.random() * exponentialDelay);\n },\n };\n\n /**\n * Calculate and wait for appropriate delay time before retry\n */\n public async calculateAndDelay(params: {\n attempt: number;\n response?: any;\n hook: HookSettings;\n }): Promise<void> {\n const { attempt, response, hook } = params;\n const delayStrategy = hook.delayStrategy || this.defaultDelayStrategy;\n const maxDelay = hook.maxDelay || this.defaultMaxDelay;\n\n const calculatedDelay = delayStrategy.calculate(attempt, response);\n const finalDelay = Math.min(calculatedDelay, maxDelay);\n\n console.log(`🔄 Waiting for ${finalDelay / 1000} seconds before retrying.`);\n await new Promise(resolve => setTimeout(resolve, finalDelay));\n }\n\n /**\n * Extract retry-after value from response\n */\n private getRetryAfterValue(response?: any): number | null {\n if (!response?.headers?.get) return null;\n \n const retryAfter = response.headers.get('Retry-After');\n if (!retryAfter) return null;\n \n // Handle numeric retry-after\n const parsedDelay = parseInt(retryAfter, 10);\n if (!isNaN(parsedDelay)) {\n return parsedDelay * 1000;\n }\n \n // Handle date retry-after\n const date = new Date(retryAfter).getTime();\n const now = Date.now();\n if (date > now) {\n return date - now;\n }\n \n return null;\n }\n \n /**\n * Get the default maximum number of retries\n */\n public getDefaultMaxRetries(): number {\n return this.defaultMaxRetries;\n }\n \n /**\n * Set the default maximum number of retries\n */\n public setDefaultMaxRetries(maxRetries: number): void {\n this.defaultMaxRetries = maxRetries;\n }\n \n /**\n * Set the default maximum delay between retries\n */\n public setDefaultMaxDelay(maxDelay: number): void {\n this.defaultMaxDelay = maxDelay;\n }\n} ","import { HookSettings, StatusCode } from './types';\n\n/**\n * Manages hooks for different status codes and their processing\n */\nexport class HookManager {\n private hooks: Record<StatusCode, HookSettings> = {};\n private hookPromises: Record<string, Promise<object>> = {};\n\n /**\n * Set hooks for different status codes\n */\n public setHooks(hooks: Record<StatusCode, HookSettings>): void {\n this.hooks = { ...this.hooks, ...hooks };\n }\n\n /**\n * Get a hook for a specific status code\n */\n public getHook(status: StatusCode): HookSettings | undefined {\n return this.hooks[status];\n }\n\n /**\n * Process a hook for a specific status code\n */\n public async processHook(\n accountId: string,\n status: StatusCode,\n error: any\n ): Promise<Record<string, any> | null> {\n const hook = this.hooks[status];\n if (!hook || !hook.handler) return null;\n \n const hookKey = `${accountId || 'default'}-${status}`;\n \n try {\n // Handle waiting for existing hook call if needed\n if (hook.preventConcurrentCalls) {\n if (!this.hookPromises[hookKey]) {\n this.hookPromises[hookKey] = Promise.resolve(\n hook.handler(accountId, error.response) || {}\n );\n }\n \n const result = await this.hookPromises[hookKey];\n delete this.hookPromises[hookKey];\n return result;\n } \n \n // Otherwise just call the hook directly\n return await hook.handler(accountId, error.response) || {};\n } \n catch (hookError) {\n console.error(`Hook handler failed for status ${status}:`, hookError);\n \n if (hook.onHandlerError) {\n await hook.onHandlerError(accountId, hookError);\n }\n \n throw hookError;\n }\n }\n\n /**\n * Handle a retry failure with the appropriate hook\n */\n public async handleRetryFailure(accountId: string, status: StatusCode, error: any): Promise<void> {\n const hook = this.hooks[status];\n if (hook?.onMaxRetriesExceeded) {\n await hook.onMaxRetriesExceeded(accountId, error);\n }\n }\n\n /**\n * Check if a hook exists and should retry for a given status\n */\n public shouldRetry(status: StatusCode): boolean {\n const hook = this.hooks[status];\n return !!hook && !!hook.shouldRetry;\n }\n} ","import qs from 'qs';\nimport { ApiCallParams, Token } from './types';\nimport { FetchError } from './FetchError';\nimport { deserializeForm } from './form';\n\n/**\n * Handles HTTP requests to external APIs\n */\nexport class HttpClient {\n /**\n * Make an HTTP request\n */\n public async makeRequest(apiParams: ApiCallParams, authToken: Token | Record<string, any>): Promise<any> {\n const {\n accountId,\n method,\n route,\n base,\n body,\n data,\n headers,\n queryParams,\n contentType = 'application/json',\n accessToken: forcedAccessToken,\n useAuth = true,\n files,\n abortSignal,\n } = apiParams;\n \n // Build URL and request body\n const normalizedMethod = method?.toUpperCase() as 'GET' | 'POST' | 'PUT' | 'DELETE';\n \n // Process query params\n let finalQueryParams: Record<string, any> = {};\n \n // Handle existing query params (support both URLSearchParams and object)\n if (queryParams) {\n if (queryParams instanceof URLSearchParams) {\n queryParams.forEach((val, key) => {\n finalQueryParams[key] = val;\n });\n } else {\n finalQueryParams = { ...(queryParams as any) };\n }\n }\n \n // For GET requests, merge body/data into query params\n if (normalizedMethod === 'GET') {\n if (body) {\n finalQueryParams = { ...finalQueryParams, ...body };\n }\n if (data) {\n finalQueryParams = { ...finalQueryParams, ...data };\n }\n }\n\n const url = this.buildUrl(base, route, finalQueryParams);\n const requestBody = body || data;\n \n // Handle file uploads\n const formData = this.prepareFormData(files);\n \n // Create fetch options\n const fetchOptions = this.buildFetchOptions({\n method: normalizedMethod,\n body: requestBody,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n });\n\n // Make the request\n try {\n console.log(`🔄 Making API call to ${url}`);\n const response = await fetch(url, fetchOptions);\n return await this.handleResponse(response);\n } catch (error: any) {\n // also console log error code such as 401 ....\n console.error('🔄 Error making API call:', error, 'status:', error?.status);\n throw error;\n }\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(base: string | undefined, route?: string, queryParams?: any): string {\n const baseUrl = base || '';\n let url = `${baseUrl}${route || ''}`;\n if (queryParams && Object.keys(queryParams).length > 0) {\n url += `?${qs.stringify(queryParams)}`;\n }\n return url;\n }\n\n /**\n * Prepare form data for file uploads\n */\n private prepareFormData(files?: File[]): FormData | null {\n if (!files) return null;\n \n const formData = deserializeForm(files);\n // Use a workaround for TypeScript FormData entries() issue\n const entries = formData as any;\n for (let [key, value] of entries.entries()) {\n console.log(`formdata ${key}:`, value);\n }\n return formData;\n }\n\n /**\n * Build fetch options for request\n */\n private buildFetchOptions({\n method,\n body,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n }: {\n method: string;\n body: any;\n formData: FormData | null;\n contentType: string;\n authToken: any;\n forcedAccessToken?: string;\n useAuth: boolean;\n headers?: Record<string, string>;\n abortSignal?: AbortSignal;\n }): RequestInit {\n const allowedMethods = ['POST', 'PUT', 'PATCH'];\n \n return {\n method,\n signal: abortSignal,\n headers: {\n ...(useAuth && { \n Authorization: `Bearer ${forcedAccessToken || authToken.access_token}` \n }),\n ...(!formData && { 'content-type': contentType }),\n ...(headers || {}),\n },\n body: body && allowedMethods.includes(method) \n ? JSON.stringify(body) \n : (formData || null),\n };\n }\n\n /**\n * Handle API response\n */\n private async handleResponse(response: Response): Promise<any> {\n let data = null;\n try {\n data = await response.json();\n console.log('🔄 Response data:', data);\n } catch (error) {\n // Response wasn't JSON, continue with null data\n }\n \n if (!response.ok) {\n throw new FetchError(response, data);\n }\n \n return data;\n }\n} ","export class FetchError extends Error {\n name: string = 'FetchError';\n status: number;\n code: string;\n message: string;\n data: any;\n\n constructor(response: Response, data: any = {}, code: string = 'FETCH_ERROR') {\n super();\n const defaultMessage = 'An unspecified error occurred';\n\n const getMessage = (data: any, locations: string[]): string | null =>\n locations\n .map((item) => {\n const parts = item.split('.');\n let value = data;\n for (const part of parts) {\n value = value?.[part];\n }\n return value;\n })\n .find((message) => typeof message === 'string') || null;\n\n const messageFromData = getMessage(data, [\n 'error.errors.0.message',\n 'error.message',\n 'error',\n 'message',\n ]);\n\n this.message = messageFromData || response.statusText || defaultMessage;\n this.status = response.status;\n this.code = code;\n this.data = data;\n this.message = this.message || defaultMessage;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function deserializeForm(src: any): FormData {\n const fd = new FormData();\n switch (src.cls) {\n case 'FormData': {\n for (const [key, items] of src.value) {\n for (const item of items) {\n let deserializedItem = deserializeForm(item);\n if (deserializedItem instanceof FormData) {\n // Use a workaround for TypeScript FormData entries() issue\n const entries = deserializedItem as any;\n for (const [subKey, subValue] of entries.entries()) {\n fd.append(`${key}[${subKey}]`, subValue);\n }\n } else {\n fd.append(key, deserializedItem);\n }\n }\n }\n break;\n }\n case 'Blob':\n case 'File': {\n const { type, name, lastModified } = src;\n const binStr = atob(src.value);\n const arr = new Uint8Array(binStr.length);\n for (let i = 0; i < binStr.length; i++) arr[i] = binStr.charCodeAt(i);\n const data = [arr.buffer];\n const fileOrBlob =\n src.cls === 'File'\n ? new File(data, name, { type, lastModified })\n : new Blob(data, { type });\n fd.append('file', fileOrBlob);\n break;\n }\n case 'json': {\n fd.append('json', JSON.stringify(JSON.parse(src.value)));\n break;\n }\n default:\n throw new Error('Unsupported type for deserialization');\n }\n return fd;\n}\n","import { AccountData } from './types';\n\n/**\n * Manages account data and state\n */\nexport class AccountManager {\n private accounts: Record<string, AccountData> = {};\n private readonly DEFAULT_ACCOUNT = 'default';\n\n /**\n * Update account data for a specific account\n */\n public updateAccountData(accountId: string = this.DEFAULT_ACCOUNT, data: Partial<AccountData>): void {\n this.accounts[accountId] = { \n ...this.accounts[accountId], \n ...data \n };\n }\n\n /**\n * Get account data for a specific account\n */\n public getAccountData(accountId: string = this.DEFAULT_ACCOUNT): AccountData {\n return this.accounts[accountId] || {};\n }\n\n /**\n * Check if an account's last request failed\n */\n public didLastRequestFail(accountId: string = this.DEFAULT_ACCOUNT): boolean {\n return !!this.accounts[accountId]?.lastFailed;\n }\n\n /**\n * Set account's last request as failed\n */\n public setLastRequestFailed(accountId: string = this.DEFAULT_ACCOUNT, failed: boolean = true): void {\n this.updateAccountData(accountId, { lastFailed: failed });\n }\n\n /**\n * Update the last request time for an account\n */\n public updateLastRequestTime(accountId: string = this.DEFAULT_ACCOUNT): void {\n this.updateAccountData(accountId, { lastRequestTime: Date.now() });\n }\n} "],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,qBAAN,MAAiD;AAAA,EAKtD,YAAY,SAAoC;AAC9C,SAAK,SAAS,QAAQ;AACtB,SAAK,aAAa,QAAQ;AAC1B,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AAAA,EAEA,MAAM,iBAAkD;AACtD,QAAI,KAAK,YAAY;AACnB,aAAO,EAAE,CAAC,KAAK,UAAU,GAAG,KAAK,OAAO;AAAA,IAC1C;AAEA,WAAO,CAAC;AAAA,EACV;AAAA;AAGF;;;ACjBO,IAAM,eAAN,MAAmB;AAAA,EAAnB;AACL,SAAQ,QAAuD,oBAAI,IAAI;AACvE,SAAQ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb,aAAa,eAAmC;AAZzD;AAaI,UAAM,aAAa,KAAK,cAAc,aAAa;AACnD,UAAM,oBAAmB,mBAAc,cAAd,YAA2B,KAAK;AACzD,UAAM,SAAS,KAAK,MAAM,IAAI,UAAU;AAExC,QAAI,UAAW,KAAK,IAAI,IAAI,OAAO,YAAY,kBAAmB;AAChE,aAAO,OAAO;AAAA,IAChB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,eAA8B,MAAiB;AAChE,UAAM,aAAa,KAAK,cAAc,aAAa;AACnD,SAAK,MAAM,IAAI,YAAY;AAAA,MACzB;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,eAAsC;AAC1D,UAAM,EAAE,WAAW,QAAQ,OAAO,MAAM,aAAa,MAAM,KAAK,IAAI;AACpE,WAAO,KAAK,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,QAAQ;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,aAAa,cAA4B;AAC9C,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKO,aAAmB;AACxB,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;;;AC1DO,IAAM,eAAN,MAAmB;AAAA,EAAnB;AACL,SAAQ,kBAAkB;AAC1B;AAAA,SAAQ,oBAAoB;AAK5B;AAAA;AAAA;AAAA,SAAQ,uBAAsC;AAAA,MAC5C,WAAW,CAAC,SAAiB,aAAmB;AAE9C,cAAM,aAAa,KAAK,mBAAmB,QAAQ;AACnD,YAAI,WAAY,QAAO;AAGvB,cAAM,YAAY;AAClB,cAAM,mBAAmB,YAAY,KAAK,IAAI,GAAG,UAAU,CAAC;AAC5D,eAAO,KAAK,MAAM,KAAK,OAAO,IAAI,gBAAgB;AAAA,MACpD;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,kBAAkB,QAIb;AAChB,UAAM,EAAE,SAAS,UAAU,KAAK,IAAI;AACpC,UAAM,gBAAgB,KAAK,iBAAiB,KAAK;AACjD,UAAM,WAAW,KAAK,YAAY,KAAK;AAEvC,UAAM,kBAAkB,cAAc,UAAU,SAAS,QAAQ;AACjE,UAAM,aAAa,KAAK,IAAI,iBAAiB,QAAQ;AAErD,YAAQ,IAAI,yBAAkB,aAAa,GAAI,2BAA2B;AAC1E,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,UAAU,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,UAA+B;AA/C5D;AAgDI,QAAI,GAAC,0CAAU,YAAV,mBAAmB,KAAK,QAAO;AAEpC,UAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AACrD,QAAI,CAAC,WAAY,QAAO;AAGxB,UAAM,cAAc,SAAS,YAAY,EAAE;AAC3C,QAAI,CAAC,MAAM,WAAW,GAAG;AACvB,aAAO,cAAc;AAAA,IACvB;AAGA,UAAM,OAAO,IAAI,KAAK,UAAU,EAAE,QAAQ;AAC1C,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,OAAO,KAAK;AACd,aAAO,OAAO;AAAA,IAChB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,uBAA+B;AACpC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,qBAAqB,YAA0B;AACpD,SAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAmB,UAAwB;AAChD,SAAK,kBAAkB;AAAA,EACzB;AACF;;;ACpFO,IAAM,cAAN,MAAkB;AAAA,EAAlB;AACL,SAAQ,QAA0C,CAAC;AACnD,SAAQ,eAAgD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlD,SAAS,OAA+C;AAC7D,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,MAAM;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ,QAA8C;AAC3D,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,YACX,WACA,QACA,OACqC;AACrC,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,CAAC,QAAQ,CAAC,KAAK,QAAS,QAAO;AAEnC,UAAM,UAAU,GAAG,aAAa,SAAS,IAAI,MAAM;AAEnD,QAAI;AAEF,UAAI,KAAK,wBAAwB;AAC/B,YAAI,CAAC,KAAK,aAAa,OAAO,GAAG;AAC/B,eAAK,aAAa,OAAO,IAAI,QAAQ;AAAA,YACnC,KAAK,QAAQ,WAAW,MAAM,QAAQ,KAAK,CAAC;AAAA,UAC9C;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,KAAK,aAAa,OAAO;AAC9C,eAAO,KAAK,aAAa,OAAO;AAChC,eAAO;AAAA,MACT;AAGA,aAAO,MAAM,KAAK,QAAQ,WAAW,MAAM,QAAQ,KAAK,CAAC;AAAA,IAC3D,SACO,WAAW;AAChB,cAAQ,MAAM,kCAAkC,MAAM,KAAK,SAAS;AAEpE,UAAI,KAAK,gBAAgB;AACvB,cAAM,KAAK,eAAe,WAAW,SAAS;AAAA,MAChD;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAmB,WAAmB,QAAoB,OAA2B;AAChG,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,6BAAM,sBAAsB;AAC9B,YAAM,KAAK,qBAAqB,WAAW,KAAK;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,QAA6B;AAC9C,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,WAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK;AAAA,EAC1B;AACF;;;ACjFA,gBAAe;;;ACAR,IAAM,aAAN,cAAyB,MAAM;AAAA,EAOpC,YAAY,UAAoB,OAAY,CAAC,GAAG,OAAe,eAAe;AAC5E,UAAM;AAPR,gBAAe;AAQb,UAAM,iBAAiB;AAEvB,UAAM,aAAa,CAACA,OAAW,cAC7B,UACG,IAAI,CAAC,SAAS;AACb,YAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,UAAI,QAAQA;AACZ,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,+BAAQ;AAAA,MAClB;AACA,aAAO;AAAA,IACT,CAAC,EACA,KAAK,CAAC,YAAY,OAAO,YAAY,QAAQ,KAAK;AAEvD,UAAM,kBAAkB,WAAW,MAAM;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,SAAK,UAAU,mBAAmB,SAAS,cAAc;AACzD,SAAK,SAAS,SAAS;AACvB,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU,KAAK,WAAW;AAC/B,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;;;ACrCO,SAAS,gBAAgB,KAAoB;AAClD,QAAM,KAAK,IAAI,SAAS;AACxB,UAAQ,IAAI,KAAK;AAAA,IACf,KAAK,YAAY;AACf,iBAAW,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO;AACpC,mBAAW,QAAQ,OAAO;AACxB,cAAI,mBAAmB,gBAAgB,IAAI;AAC3C,cAAI,4BAA4B,UAAU;AAExC,kBAAM,UAAU;AAChB,uBAAW,CAAC,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,GAAG;AAClD,iBAAG,OAAO,GAAG,GAAG,IAAI,MAAM,KAAK,QAAQ;AAAA,YACzC;AAAA,UACF,OAAO;AACL,eAAG,OAAO,KAAK,gBAAgB;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,QAAQ;AACX,YAAM,EAAE,MAAM,MAAM,aAAa,IAAI;AACrC,YAAM,SAAS,KAAK,IAAI,KAAK;AAC7B,YAAM,MAAM,IAAI,WAAW,OAAO,MAAM;AACxC,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,KAAI,CAAC,IAAI,OAAO,WAAW,CAAC;AACpE,YAAM,OAAO,CAAC,IAAI,MAAM;AACxB,YAAM,aACJ,IAAI,QAAQ,SACR,IAAI,KAAK,MAAM,MAAM,EAAE,MAAM,aAAa,CAAC,IAC3C,IAAI,KAAK,MAAM,EAAE,KAAK,CAAC;AAC7B,SAAG,OAAO,QAAQ,UAAU;AAC5B;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,SAAG,OAAO,QAAQ,KAAK,UAAU,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC;AACvD;AAAA,IACF;AAAA,IACA;AACE,YAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AACA,SAAO;AACT;;;AFlCO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA,EAItB,MAAa,YAAY,WAA0B,WAAsD;AACvG,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,aAAa;AAAA,MACb,UAAU;AAAA,MACV;AAAA,MACA;AAAA,IACF,IAAI;AAGJ,UAAM,mBAAmB,iCAAQ;AAGjC,QAAI,mBAAwC,CAAC;AAG7C,QAAI,aAAa;AACf,UAAI,uBAAuB,iBAAiB;AAC1C,oBAAY,QAAQ,CAAC,KAAK,QAAQ;AAChC,2BAAiB,GAAG,IAAI;AAAA,QAC1B,CAAC;AAAA,MACH,OAAO;AACL,2BAAmB,EAAE,GAAI,YAAoB;AAAA,MAC/C;AAAA,IACF;AAGA,QAAI,qBAAqB,OAAO;AAC9B,UAAI,MAAM;AACR,2BAAmB,EAAE,GAAG,kBAAkB,GAAG,KAAK;AAAA,MACpD;AACA,UAAI,MAAM;AACR,2BAAmB,EAAE,GAAG,kBAAkB,GAAG,KAAK;AAAA,MACpD;AAAA,IACF;AAEA,UAAM,MAAM,KAAK,SAAS,MAAM,OAAO,gBAAgB;AACvD,UAAM,cAAc,QAAQ;AAG5B,UAAM,WAAW,KAAK,gBAAgB,KAAK;AAG3C,UAAM,eAAe,KAAK,kBAAkB;AAAA,MAC1C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,QAAI;AACF,cAAQ,IAAI,gCAAyB,GAAG,EAAE;AAC1C,YAAM,WAAW,MAAM,MAAM,KAAK,YAAY;AAC9C,aAAO,MAAM,KAAK,eAAe,QAAQ;AAAA,IAC3C,SAAS,OAAY;AAEnB,cAAQ,MAAM,oCAA6B,OAAO,WAAW,+BAAO,MAAM;AAC1E,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,MAA0B,OAAgB,aAA2B;AACpF,UAAM,UAAU,QAAQ;AACxB,QAAI,MAAM,GAAG,OAAO,GAAG,SAAS,EAAE;AAClC,QAAI,eAAe,OAAO,KAAK,WAAW,EAAE,SAAS,GAAG;AACtD,aAAO,IAAI,UAAAC,QAAG,UAAU,WAAW,CAAC;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAiC;AACvD,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,WAAW,gBAAgB,KAAK;AAEtC,UAAM,UAAU;AAChB,aAAS,CAAC,KAAK,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAC1C,cAAQ,IAAI,YAAY,GAAG,KAAK,KAAK;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAUgB;AACd,UAAM,iBAAiB,CAAC,QAAQ,OAAO,OAAO;AAE9C,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,GAAI,WAAW;AAAA,UACb,eAAe,UAAU,qBAAqB,UAAU,YAAY;AAAA,QACtE;AAAA,QACA,GAAI,CAAC,YAAY,EAAE,gBAAgB,YAAY;AAAA,QAC/C,GAAI,WAAW,CAAC;AAAA,MAClB;AAAA,MACA,MAAM,QAAQ,eAAe,SAAS,MAAM,IACxC,KAAK,UAAU,IAAI,IAClB,YAAY;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAe,UAAkC;AAC7D,QAAI,OAAO;AACX,QAAI;AACF,aAAO,MAAM,SAAS,KAAK;AAC3B,cAAQ,IAAI,4BAAqB,IAAI;AAAA,IACvC,SAAS,OAAO;AAAA,IAEhB;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,WAAW,UAAU,IAAI;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;AGzKO,IAAM,iBAAN,MAAqB;AAAA,EAArB;AACL,SAAQ,WAAwC,CAAC;AACjD,SAAiB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,kBAAkB,YAAoB,KAAK,iBAAiB,MAAkC;AACnG,SAAK,SAAS,SAAS,IAAI;AAAA,MACzB,GAAG,KAAK,SAAS,SAAS;AAAA,MAC1B,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,eAAe,YAAoB,KAAK,iBAA8B;AAC3E,WAAO,KAAK,SAAS,SAAS,KAAK,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAmB,YAAoB,KAAK,iBAA0B;AA7B/E;AA8BI,WAAO,CAAC,GAAC,UAAK,SAAS,SAAS,MAAvB,mBAA0B;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKO,qBAAqB,YAAoB,KAAK,iBAAiB,SAAkB,MAAY;AAClG,SAAK,kBAAkB,WAAW,EAAE,YAAY,OAAO,CAAC;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKO,sBAAsB,YAAoB,KAAK,iBAAuB;AAC3E,SAAK,kBAAkB,WAAW,EAAE,iBAAiB,KAAK,IAAI,EAAE,CAAC;AAAA,EACnE;AACF;;;ARzBA,IAAM,aAAN,MAAiB;AAAA,EAef,cAAc;AAZd,SAAQ,UAAkB;AAU1B;AAAA,SAAQ,cAAc;AAGpB,SAAK,WAAW;AAChB,SAAK,eAAe,CAAC;AAGrB,SAAK,eAAe,IAAI,aAAa;AACrC,SAAK,eAAe,IAAI,aAAa;AACrC,SAAK,cAAc,IAAI,YAAY;AACnC,SAAK,aAAa,IAAI,WAAW;AACjC,SAAK,iBAAiB,IAAI,eAAe;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKO,MAAM;AAAA,IACX;AAAA,IACA;AAAA,IACA,QAAQ,CAAC;AAAA,IACT;AAAA,IACA,UAAU;AAAA,EACZ,GAMG;AACD,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,SAAK,UAAU;AAGf,UAAM,aAA+C,CAAC;AAKtD,QAAI,MAAM,GAAG,MAAM,UAAa,OAAO,KAAK,aAAa,YAAY,YAAY;AAC/E,iBAAW,GAAG,IAAI,KAAK,gCAAgC;AAAA,IACzD;AAGA,eAAW,CAAC,YAAY,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,UAAI,MAAM;AACR,mBAAW,UAAU,IAAI;AAAA,MAC3B;AAAA,IACF;AAGA,QAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACtC,WAAK,YAAY,SAAS,UAAU;AAAA,IACtC;AAEA,QAAI,OAAO,cAAc,aAAa;AACpC,WAAK,aAAa,aAAa,SAAS;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kCAAgD;AACtD,WAAO;AAAA,MACL,aAAa;AAAA,MACb,eAAe;AAAA,MACf,wBAAwB;AAAA,MACxB,YAAY;AAAA,MACZ,SAAS,OAAO,cAAc;AAC5B,YAAI;AACF,kBAAQ,IAAI,oDAA6C,SAAS,EAAE;AACpE,cAAI,CAAC,KAAK,aAAa,SAAS;AAC9B,kBAAM,IAAI,MAAM,8CAA8C;AAAA,UAChE;AAGA,gBAAM,KAAK,aAAa,QAAQ,SAAS;AACzC,iBAAO,CAAC;AAAA,QACV,SAAS,OAAO;AACd,kBAAQ,MAAM,2BAA2B,SAAS,KAAK,KAAK;AAC5D,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,sBAAsB,OAAO,WAAW,UAAU;AAChD,gBAAQ,MAAM,mDAAmD,SAAS,KAAK,KAAK;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,eAAe,UAAwB;AAC5C,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAkB,WAAmB,MAA0C;AACpF,SAAK,eAAe,kBAAkB,WAAW,IAAI;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,KAAK,eAAmH;AAGnI,UAAM,SAAwB;AAAA,MAC5B,GAAG;AAAA,MACH,WAAW,cAAc,aAAa;AAAA,MACtC,MAAM,cAAc,QAAQ,KAAK;AAAA,IACnC;AAGA,QACE,KAAK,wBAAwB,sBAC5B,KAAK,aAAqB,gBAC3B;AACA,YAAM,iBAAkB,KAAK,aAAqB;AAClD,YAAM,SAAU,KAAK,aAAqB;AAC1C,YAAM,YAAY,OAAO,cAAc,IAAI,gBAAgB,OAAO,WAAW,IAAI,IAAI,gBAAgB;AACrG,gBAAU,IAAI,gBAAgB,MAAM;AACpC,aAAO,cAAc;AAAA,IACvB;AAEA,YAAQ,IAAI,sBAAe,KAAK,UAAU,OAAO,WAAW,OAAO,QAAQ,OAAO,KAAK;AAGvF,UAAM,aAAa,KAAK,aAAa,aAAa,MAAM;AACxD,QAAI,WAAY,QAAO;AAGvB,UAAM,SAAS,MAAM,KAAK,qBAAqB,MAAM;AAGrD,SAAK,aAAa,YAAY,QAAQ,MAAM;AAE5C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,YAAY,eAAmH;AAC1I,WAAO,KAAK,KAAK,aAAa;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,eAA4C;AA9LjF;AA+LI,UAAM,EAAE,WAAW,YAAY,IAAI;AACnC,QAAI,WAAW;AACf,UAAM,gBAA4C,CAAC;AACnD,QAAI,gBAAgB,EAAE,GAAG,cAAc;AAEvC,QACE,KAAK,wBAAwB,sBAC5B,KAAK,aAAqB,gBAC3B;AACA,YAAM,iBAAkB,KAAK,aAAqB;AAClD,YAAM,SAAU,KAAK,aAAqB;AAC1C,YAAM,YAAY,cAAc,cAAc,IAAI,gBAAgB,cAAc,WAAW,IAAI,IAAI,gBAAgB;AACnH,gBAAU,IAAI,gBAAgB,MAAM;AACpC,oBAAc,cAAc;AAAA,IAC9B;AAEA,WAAO,WAAW,KAAK,aAAa;AAClC,UAAI,2CAAa,SAAS;AACxB,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACnC;AACA;AAEA,UAAI;AAEF,cAAM,cAAsC,cAAc,YAAY,QAClE,MAAM,KAAK,aAAa,eAAe,SAAS,IAChD,CAAC;AAEL,sBAAc,UAAU;AAAA,UACtB,GAAI,cAAc,WAAW,CAAC;AAAA,UAC9B,GAAG;AAAA,QACL;AAGA,YACE,cAAc,YAAY,SAC1B,OAAO,KAAK,WAAW,EAAE,WAAW,KACpC,EACE,KAAK,wBAAwB,sBAC5B,KAAK,aAAqB,iBAE7B;AACA,gBAAM,IAAI,MAAM,GAAG,KAAK,QAAQ,yCAAyC,SAAS,EAAE;AAAA,QACtF;AAGA,cAAM,WAAW,MAAM,KAAK,WAAW,YAAY,eAAe,CAAC,CAAC;AAGpE,aAAK,eAAe,qBAAqB,WAAW,KAAK;AACzD,eAAO;AAAA,MACT,SACO,OAAY;AACjB,cAAM,SAAS,+BAAO;AAGtB,YAAI,CAAC,KAAK,YAAY,YAAY,MAAM,GAAG;AACzC,gBAAM;AAAA,QACR;AAGA,sBAAc,MAAM,KAAK,cAAc,MAAM,KAAK,KAAK;AACvD,cAAM,aAAa,KAAK,YAAY,QAAQ,MAAM;AAClD,cAAM,cAAa,8CAAY,eAAZ,YAA0B,KAAK,aAAa,qBAAqB;AAGpF,YAAI,cAAc,MAAM,IAAI,YAAY;AACtC,gBAAM,KAAK,YAAY,mBAAmB,WAAW,QAAQ,KAAK;AAClE,eAAK,eAAe,qBAAqB,WAAW,IAAI;AACxD,gBAAM;AAAA,QACR;AAGA,YAAI;AACF,gBAAM,aAAa,MAAM,KAAK,YAAY,YAAY,WAAW,QAAQ,KAAK;AAC9E,cAAI,YAAY;AACd,4BAAgB,EAAE,GAAG,eAAe,GAAG,WAAW;AAAA,UACpD;AAAA,QACF,SACO,WAAW;AAChB,eAAK,eAAe,qBAAqB,WAAW,IAAI;AACxD,gBAAM;AAAA,QACR;AAGA,YAAI,yCAAY,eAAe;AAC7B,gBAAM,KAAK,aAAa,kBAAkB;AAAA,YACxC,SAAS,cAAc,MAAM;AAAA,YAC7B,UAAU,MAAM;AAAA,YAChB,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,SAAK,eAAe,qBAAqB,WAAW,IAAI;AACxD,UAAM,IAAI,MAAM,8BAA8B,KAAK,WAAW,qBAAqB,SAAS,EAAE;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA,EAKO,aAAa,cAA4B;AAC9C,SAAK,aAAa,aAAa,YAAY;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKO,aAAmB;AACxB,SAAK,aAAa,WAAW;AAAA,EAC/B;AACF;AAEA,IAAO,gBAAQ;","names":["data","qs"]}