{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils/url.ts","../src/utils/cookies.ts","../src/utils/http.ts","../src/utils/jwt.ts","../src/client.ts"],"sourcesContent":["import { BrowserEndevreClient, EndevreClient, createBrowserClient, createClient } from \"./client\";\n\nexport default {\n  createClient,\n  createBrowserClient\n};\n\nexport { EndevreClient, BrowserEndevreClient, createClient, createBrowserClient };\n\n// Export types for TypeScript users\nexport type {\n  JwtPayload,\n  ExchangeResult,\n  RefreshResult,\n  UserInfoResult,\n  CreateAuthUrlParams,\n  Scopes\n} from \"./types\";\n\n\n","export const ID_API_BASE = \"https://idapi.endevre.com/services\";\n\nexport const EXCHANGE_URL = `${ID_API_BASE}/exchange`;\nexport const USERINFO_URL = `${ID_API_BASE}/getuserinfo`;\nexport const REFRESH_URL = `${ID_API_BASE}/refreshtoken`;\nexport const REVOKE_REFRESH_TOKEN_URL = `${ID_API_BASE}/revokerefreshtoken`;\nexport const PUBLIC_KEY_URL = `${ID_API_BASE}/publickey`;\n\nexport const SSO_EXCHANGE_REDIRECT_BASE = \"https://id.endevre.com/ssoexchange\";\nexport const SSO_LOGIN_BASE = \"https://id.endevre.com/ssologin\";\n","export function assertBrowser(): void {\n  if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n    throw new Error(\"This function must be called in a browser environment\");\n  }\n}\n\nexport function getUrlParam(paramName: string, url?: string): string | undefined {\n  let targetUrl: string;\n\n  if (url) {\n    targetUrl = url;\n  } else {\n    assertBrowser();\n    targetUrl = window.location.href;\n  }\n  const { searchParams } = new URL(targetUrl);\n  const value = searchParams.get(paramName);\n  return value === null ? undefined : value;\n}\n\nexport function buildRedirectUrl(base: string, params: Record<string, string | number | boolean | undefined>): string {\n  const url = new URL(base);\n  for (const [key, value] of Object.entries(params)) {\n    if (value === undefined) continue;\n    url.searchParams.set(key, String(value));\n  }\n  return url.toString();\n}\n\n\n","export type SameSitePolicy = \"Lax\" | \"Strict\" | \"None\";\n\nexport interface CookieOptions {\n  expiresAt?: Date;\n  maxAgeSeconds?: number;\n  path?: string;\n  domain?: string;\n  secure?: boolean;\n  sameSite?: SameSitePolicy;\n}\n\nfunction isBrowser(): boolean {\n  return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\nexport function setCookie(name: string, value: string, options: CookieOptions = {}): void {\n  if (!isBrowser()) {\n    throw new Error(\"setCookie can only be used in a browser environment\");\n  }\n\n  const encoded = encodeURIComponent(value);\n  const parts: string[] = [`${name}=${encoded}`];\n\n  if (options.maxAgeSeconds != null) {\n    parts.push(`Max-Age=${Math.max(0, Math.floor(options.maxAgeSeconds))}`);\n  }\n\n  if (options.expiresAt) {\n    parts.push(`Expires=${options.expiresAt.toUTCString()}`);\n  }\n\n  parts.push(`Path=${options.path ?? \"/\"}`);\n\n  if (options.domain) {\n    parts.push(`Domain=${options.domain}`);\n  }\n\n  const isHttps = isBrowser() && window.location && window.location.protocol === \"https:\";\n  const secure = options.secure ?? isHttps;\n  if (secure) {\n    parts.push(\"Secure\");\n  }\n\n  const sameSite = options.sameSite ?? \"Lax\";\n  parts.push(`SameSite=${sameSite}`);\n\n  document.cookie = parts.join(\"; \");\n}\n\nexport function getCookie(name: string): string | undefined {\n  if (!isBrowser()) {\n    throw new Error(\"getCookie can only be used in a browser environment\");\n  }\n\n  const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n  for (const cookie of cookies) {\n    const [k, ...rest] = cookie.split(\"=\");\n    if (k === name) {\n      try {\n        return decodeURIComponent(rest.join(\"=\"));\n      } catch {\n        return rest.join(\"=\");\n      }\n    }\n  }\n  return undefined;\n}\n\nexport function deleteCookie(name: string, path: string = \"/\", domain?: string): void {\n  if (!isBrowser()) {\n    throw new Error(\"deleteCookie can only be used in a browser environment\");\n  }\n  const parts: string[] = [`${name}=`, `Expires=Thu, 01 Jan 1970 00:00:00 GMT`, `Path=${path}`];\n  if (domain) parts.push(`Domain=${domain}`);\n  const isHttps = window.location && window.location.protocol === \"https:\";\n  if (isHttps) parts.push(\"Secure\");\n  parts.push(\"SameSite=Lax\");\n  document.cookie = parts.join(\"; \");\n}\n\n\n","export interface JsonRequestOptions<TBody> {\n  method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n  body?: TBody;\n  headers?: Record<string, string>;\n}\n\nexport async function fetchJson<TResponse, TBody = unknown>(url: string, options: JsonRequestOptions<TBody> = {}): Promise<TResponse> {\n  const fetchFn: typeof fetch | undefined = typeof fetch === \"function\" ? fetch : undefined;\n\n  if (!fetchFn) {\n    throw new Error(\"Global fetch API is not available in this environment\");\n  }\n\n  const { method = \"POST\", body, headers } = options;\n  const response = await fetchFn(url, {\n    method,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...(headers ?? {})\n    },\n    body: body != null ? JSON.stringify(body) : undefined,\n    credentials: \"include\"\n  });\n\n  const contentType = response.headers.get(\"content-type\") || \"\";\n  const isJson = contentType.includes(\"application/json\");\n  if (!response.ok) {\n    let errorMessage = `HTTP ${response.status}`;\n    if (isJson) {\n      try {\n        const data = await response.json();\n        errorMessage = (data && (data.error_message || data.message || data.error)) || errorMessage;\n      } catch {}\n    } else {\n      try {\n        const text = await response.text();\n        if (text) errorMessage = text;\n      } catch {}\n    }\n    throw new Error(errorMessage);\n  }\n\n  if (isJson) {\n    return (await response.json()) as TResponse;\n  }\n  // Fallback: try parse as text, then as any\n  const text = await response.text();\n  try {\n    return JSON.parse(text) as TResponse;\n  } catch {\n    return (text as unknown) as TResponse;\n  }\n}\n\n\n","import { JwtPayload } from \"../types\";\nimport { PUBLIC_KEY_URL } from \"../constants\";\nimport { fetchJson } from \"./http\";\nimport { importSPKI, jwtVerify, decodeJwt } from \"jose\";\n\n/**\n * Decodes a JWT token without verification\n * @param token JWT token string\n * @returns Decoded JWT payload\n */\nexport function decodeJWT(token: string): JwtPayload {\n  try {\n    const decoded = decodeJwt(token);\n    return decoded as unknown as JwtPayload;\n  } catch (error) {\n    throw new Error(`Failed to decode JWT: ${error instanceof Error ? error.message : 'Unknown error'}`);\n  }\n}\n\n/**\n * Checks if a JWT token is expired\n * @param token JWT token string or decoded payload\n * @returns true if token is expired\n */\nexport function isJWTExpired(token: string | JwtPayload): boolean {\n  try {\n    const payload = typeof token === 'string' ? decodeJWT(token) : token;\n    const now = Math.floor(Date.now() / 1000);\n    return payload.exp < now;\n  } catch {\n    return true; // Consider invalid tokens as expired\n  }\n}\n\n/**\n * Extracts user data from JWT token\n * @param token JWT token string\n * @returns User data from the token\n */\nexport function getUserDataFromJWT(token: string): JwtPayload['user_data'] {\n  const payload = decodeJWT(token);\n  return payload.user_data;\n}\n\n/**\n * Checks if a token is a JWT (vs opaque token)\n * @param token Token string\n * @returns true if token appears to be a JWT\n */\nexport function isJWT(token: string): boolean {\n  try {\n    const parts = token.split('.');\n    return parts.length === 3 && parts.every(part => part.length > 0);\n  } catch {\n    return false;\n  }\n}\n\n// Extended caching for public key - much longer TTL\nlet publicKeyCache: { key: string; timestamp: number } | null = null;\nconst PUBLIC_KEY_CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours cache\n\n/**\n * Fetches the raw PEM public key for JWT verification\n * @returns PEM public key string\n */\nexport async function fetchPublicKey(forceRefresh = false): Promise<string> {\n  // Check if we have a valid cached key and not forcing refresh\n  if (!forceRefresh && publicKeyCache && (Date.now() - publicKeyCache.timestamp) < PUBLIC_KEY_CACHE_TTL) {\n    return publicKeyCache.key;\n  }\n\n  // Fetch fresh key\n  const response = await fetch(PUBLIC_KEY_URL);\n  if (!response.ok) {\n    throw new Error(`Failed to fetch public key: ${response.status}`);\n  }\n  \n  const publicKey = await response.text();\n  \n  // Cache the key\n  publicKeyCache = {\n    key: publicKey,\n    timestamp: Date.now()\n  };\n  \n  return publicKey;\n}\n\n/**\n * JWT signature verification using jose library\n * Works in both browser and Node.js environments\n * @param token JWT token to verify\n * @param publicKey PEM public key string\n * @returns Promise<boolean> indicating if signature is valid\n */\nexport async function verifyJWTSignature(token: string, publicKey: string): Promise<boolean> {\n  try {\n    const cryptoKey = await importSPKI(publicKey, 'RS256');\n    await jwtVerify(token, cryptoKey);\n    return true;\n  } catch (error) {\n    console.error('JWT signature verification failed:', error);\n    return false;\n  }\n}\n\n/**\n * Comprehensive JWT validation including expiration and signature\n * @param token JWT token to validate\n * @param publicKey Optional PEM public key for signature verification\n * @returns Promise<boolean> indicating if token is valid\n */\nexport async function validateJWT(token: string, publicKey?: string): Promise<boolean> {\n  try {\n    // Check format\n    if (!isJWT(token)) {\n      return false;\n    }\n\n    // Check expiration\n    if (isJWTExpired(token)) {\n      return false;\n    }\n\n    // Verify signature if public key is provided\n    if (publicKey) {\n      return await verifyJWTSignature(token, publicKey);\n    }\n\n    return true;\n  } catch {\n    return false;\n  }\n}","import { EXCHANGE_URL, REFRESH_URL, REVOKE_REFRESH_TOKEN_URL, SSO_EXCHANGE_REDIRECT_BASE, SSO_LOGIN_BASE, USERINFO_URL } from \"./constants\";\nimport { buildRedirectUrl, getUrlParam } from \"./utils/url\";\nimport { deleteCookie, setCookie } from \"./utils/cookies\";\nimport { CreateAuthUrlParams, ExchangeResult, RefreshResult, RevokeRefreshTokenResult, UserInfoResult } from \"./types\";\nimport { fetchJson } from \"./utils/http\";\nimport { getUserDataFromJWT, isJWT, validateJWT, fetchPublicKey } from \"./utils/jwt\";\n\nexport interface EndevreClientOptions {\n  cookiePrefix?: string;\n  cookieDomain?: string;\n  cookieSecure?: boolean;\n  cookieSameSite?: \"Lax\" | \"Strict\" | \"None\";\n  defaultOrigin?: string;\n  defaultReturnURL?: string;\n  onRedirect?: (url: string) => void;\n}\n\ninterface RequestOriginOptions {\n  origin?: string;\n}\n\nexport interface ExchangeOptions extends RequestOriginOptions {\n  names?: {\n    token?: string;\n    refresh?: string;\n    scopes?: string;\n    expire?: string;\n  };\n  shouldRedirect?: boolean;\n  jwt?: boolean; // New: defaults to true for JWT mode\n}\n\nexport interface CookieOptions extends ExchangeOptions {\n  onRedirect?: (url: string) => void;\n  isWildcardDomain?: boolean;\n}\n\nexport interface GetUserInfoOptions {\n  token?: string;\n}\n\nexport interface RefreshTokenOptions extends RequestOriginOptions {\n  token?: string;\n  refresh?: string;\n  names?: {\n    token?: string;\n    refresh?: string;\n    scopes?: string;\n    expire?: string;\n  };\n  jwt?: boolean; // New: defaults to true for JWT mode\n}\n\nexport interface RevokeRefreshTokenOptions extends RequestOriginOptions {\n  refresh?: string;\n}\n\nexport class EndevreClient {\n  private readonly clientId: string;\n  private readonly clientSecret?: string;\n  private readonly opts: {\n    cookiePrefix: string;\n    cookieDomain?: string;\n    cookieSecure?: boolean;\n    cookieSameSite: \"Lax\" | \"Strict\" | \"None\";\n    defaultOrigin?: string;\n    defaultReturnURL?: string;\n    onRedirect?: (url: string) => void;\n  };\n  private cookieNames: { token: string; refresh: string; scopes: string; expire: string };\n\n  constructor(clientId: string, clientSecret?: string, options?: EndevreClientOptions) {\n    if (!clientId) {\n      throw new Error(\"clientId is required\");\n    }\n    this.clientId = clientId;\n    this.clientSecret = clientSecret;\n    this.opts = {\n      cookiePrefix: options?.cookiePrefix ?? \"endevre_id_\",\n      cookieDomain: options?.cookieDomain,\n      cookieSecure: options?.cookieSecure,\n      cookieSameSite: options?.cookieSameSite ?? \"Lax\",\n      defaultOrigin: options?.defaultOrigin,\n      defaultReturnURL: options?.defaultReturnURL,\n      onRedirect: options?.onRedirect\n    };\n    this.cookieNames = { token: \"token\", refresh: \"refresh\", scopes: \"scopes\", expire: \"expire\" };\n  }\n\n  private requireSecret(operation: string): string {\n    if (!this.clientSecret) {\n      throw new Error(`${operation} requires a client secret. Use createClient with a secret or provide one when constructing EndevreClient.`);\n    }\n    return this.clientSecret;\n  }\n\n  private resolveOrigin(provided?: string): string {\n    if (provided) return provided;\n    if (this.opts.defaultOrigin) return this.opts.defaultOrigin;\n    if (typeof window !== \"undefined\" && typeof window.location?.origin === \"string\") {\n      return window.location.origin;\n    }\n    throw new Error(\"Origin is required for this request. Provide it via options.origin or defaultOrigin when constructing the client.\");\n  }\n\n  private cookieName(name: string): string {\n    return `${this.opts.cookiePrefix}${name}`;\n  }\n\n  // Overloads\n  async exchange(): Promise<ExchangeResult>;\n  async exchange(options: ExchangeOptions): Promise<ExchangeResult>;\n  async exchange(code: string): Promise<ExchangeResult>;\n  async exchange(code: string, options: ExchangeOptions): Promise<ExchangeResult>;\n  async exchange(\n    codeOrOptions?: string | ExchangeOptions,\n    maybeOptions?: ExchangeOptions\n  ): Promise<ExchangeResult> {\n    let code: string | undefined;\n    let options: ExchangeOptions | undefined;\n\n    if (typeof codeOrOptions === \"string\") {\n      code = codeOrOptions;\n      options = maybeOptions;\n    } else {\n      options = codeOrOptions;\n      code = getUrlParam(\"code\");\n    }\n\n    if (!code) {\n      if (typeof window === \"undefined\") {\n        throw new Error(\"Missing 'code' for exchange() in a non-browser environment. Pass the authorization code explicitly.\");\n      }\n      code = getUrlParam(\"code\");\n      if (!code) {\n        throw new Error(\"Missing 'code' for exchange()\");\n      }\n    }\n\n    const useJWT = options?.jwt ?? true; // Default to JWT mode\n    const secret = this.requireSecret(\"exchange\");\n    const origin = this.resolveOrigin(options?.origin);\n    \n    const payload = {\n      clientid: this.clientId,\n      secret,\n      code,\n      jwt: useJWT\n    };\n\n    const result = await fetchJson<ExchangeResult>(EXCHANGE_URL, {\n      method: \"POST\",\n      body: payload,\n      headers: {\n        Origin: origin\n      }\n    });\n\n    return result;\n  }\n\n  setClientCookies(result: ExchangeResult, pairingID?: string, options?: CookieOptions): void {\n    const shouldRedirect = options?.shouldRedirect ?? true;\n    if (shouldRedirect && !pairingID) {\n      throw new Error(\"Missing 'pairingID' for setClientCookies()\");\n    }\n\n    // make sure result contains all the required fields\n    if (!result.token || !result.refresh || !result.scopes || !result.expire) {\n      throw new Error(\"Missing required fields in result\");\n    }\n\n    const names = { ...this.cookieNames, ...(options?.names ?? {}) };\n    this.cookieNames = names;\n\n    const expiresSeconds = typeof result.expire === \"number\" ? result.expire : 0;\n    const expiresAt = expiresSeconds > 0 ? new Date(Date.now() + expiresSeconds * 1000) : undefined;\n\n    setCookie(this.cookieName(names.token), result.token, {\n      expiresAt,\n      domain: options?.isWildcardDomain ? `.${this.opts.cookieDomain}` : this.opts.cookieDomain,\n      secure: this.opts.cookieSecure,\n      sameSite: this.opts.cookieSameSite\n    });\n\n    setCookie(this.cookieName(names.refresh), result.refresh, {\n      expiresAt,\n      domain: options?.isWildcardDomain ? `.${this.opts.cookieDomain}` : this.opts.cookieDomain,\n      secure: this.opts.cookieSecure,\n      sameSite: this.opts.cookieSameSite\n    });\n\n    setCookie(this.cookieName(names.scopes), Array.isArray(result.scopes) ? result.scopes.join(\" \") : String(result.scopes), {\n      expiresAt,\n      domain: options?.isWildcardDomain ? `.${this.opts.cookieDomain}` : this.opts.cookieDomain,\n      secure: this.opts.cookieSecure,\n      sameSite: this.opts.cookieSameSite\n    });\n\n    setCookie(this.cookieName(names.expire), String(result.expire), {\n      expiresAt,\n      domain: options?.isWildcardDomain ? `.${this.opts.cookieDomain}` : this.opts.cookieDomain,\n      secure: this.opts.cookieSecure,\n      sameSite: this.opts.cookieSameSite\n    });\n\n    if (options?.isWildcardDomain) {\n      // set a cookie for determining that this is a wildcard domain\n      setCookie(this.cookieName(\"endevre_id_isWildcardDomain\"), \"true\", {\n        expiresAt,\n        domain: options?.isWildcardDomain ? `.${this.opts.cookieDomain}` : this.opts.cookieDomain,\n        secure: this.opts.cookieSecure,\n        sameSite: this.opts.cookieSameSite\n      });\n    } else {\n      // delete the cookie if it exists\n      deleteCookie(this.cookieName(\"isWildcardDomain\"));\n    }\n\n    if (shouldRedirect && pairingID) {\n      const redirectUrl = buildRedirectUrl(SSO_EXCHANGE_REDIRECT_BASE, { pairingID });\n      if (typeof window !== \"undefined\" && typeof window.location !== \"undefined\") {\n        window.location.replace(redirectUrl);\n      } else if (options?.onRedirect) {\n        options.onRedirect(redirectUrl);\n      } else if (this.opts.onRedirect) {\n        this.opts.onRedirect(redirectUrl);\n      } else {\n        throw new Error(\"Redirect requested but no browser environment is available. Provide an onRedirect handler or disable redirect.\");\n      }\n    }\n  }\n\n  createAuthUrl(args: CreateAuthUrlParams): string {\n    // Ensure finalredirecturi is last in redirectURIs\n    const provided = Array.isArray(args.redirecturis) ? args.redirecturis : [];\n    const finalUri = String(args.finalredirecturi || \"\").trim();\n    const normalized = provided.map((s) => String(s).trim()).filter(Boolean);\n    const filtered = normalized.filter((u) => u !== finalUri);\n    const redirectURIs = [...filtered, finalUri].join(\",\");\n\n    const url = new URL(SSO_LOGIN_BASE);\n    if (args.pairingID) {\n      url.searchParams.set(\"pairingID\", String(args.pairingID));\n    }\n    url.searchParams.set(\"clientID\", this.clientId);\n    url.searchParams.set(\"redirectURIs\", redirectURIs);\n\n    // pass through any extra args\n    for (const [k, v] of Object.entries(args)) {\n      if (k === \"finalredirecturi\" || k === \"redirecturis\" || k === \"pairingID\") continue;\n      if (v == null) continue;\n      url.searchParams.set(k, String(v));\n    }\n    return url.toString();\n  }\n\n  // Overloads for getUserInfo\n  async getUserInfo(): Promise<UserInfoResult>;\n  async getUserInfo(options: GetUserInfoOptions): Promise<UserInfoResult>;\n  async getUserInfo(token: string): Promise<UserInfoResult>;\n  async getUserInfo(tokenOrOptions?: string | GetUserInfoOptions): Promise<UserInfoResult> {\n    let token: string;\n\n    if (typeof tokenOrOptions === \"string\") {\n      token = tokenOrOptions;\n    } else {\n      token = tokenOrOptions?.token ?? this.getToken();\n    }\n\n    // Check if token is JWT format\n    if (isJWT(token)) {\n      try {\n        // First attempt: Use cached public key\n        let publicKey = await fetchPublicKey();\n        let isValid = await validateJWT(token, publicKey);\n        \n        // If signature fails, try refreshing the public key once\n        if (!isValid) {\n          console.log('JWT verification failed with cached key, refreshing public key...');\n          publicKey = await fetchPublicKey(true); // Force refresh\n          isValid = await validateJWT(token, publicKey);\n        }\n        \n        if (!isValid) {\n          throw new Error('Invalid JWT token after key refresh');\n        }\n        \n        // Extract user data from verified JWT\n        return getUserDataFromJWT(token);\n      } catch (error) {\n        console.warn('JWT verification failed, falling back to API call:', error);\n        // Fall through to API call for legacy behavior\n      }\n    }\n\n    // For opaque tokens or JWT verification failure, use the API\n    const payload = {\n      clientid: this.clientId,\n      token\n    };\n    const result = await fetchJson<UserInfoResult>(USERINFO_URL, {\n      method: \"POST\",\n      body: payload\n    });\n    return result;\n  }\n\n  // Overloads for refreshToken\n  async refreshToken(): Promise<RefreshResult>;\n  async refreshToken(options: RefreshTokenOptions): Promise<RefreshResult>;\n  async refreshToken(refresh: string): Promise<RefreshResult>;\n  async refreshToken(refresh: string, options: RefreshTokenOptions): Promise<RefreshResult>;\n  async refreshToken(\n    refreshOrOptions?: string | RefreshTokenOptions,\n    maybeOptions?: RefreshTokenOptions\n  ): Promise<RefreshResult> {\n    let refresh: string;\n    let options: RefreshTokenOptions | undefined;\n\n    if (typeof refreshOrOptions === \"string\") {\n      refresh = refreshOrOptions;\n      options = maybeOptions;\n    } else {\n      options = refreshOrOptions;\n      refresh = options?.refresh ?? this.getRefresh();\n    }\n\n    const useJWT = options?.jwt ?? true; // Default to JWT mode\n    \n    const secret = this.requireSecret(\"refreshToken\");\n    const origin = this.resolveOrigin(options?.origin);\n    const payload = {\n      clientid: this.clientId,\n      secret,\n      refresh,\n      jwt: useJWT\n    };\n\n    const result = await fetchJson<RefreshResult>(REFRESH_URL, {\n      method: \"POST\",\n      body: payload,\n      headers: {\n        Origin: origin\n      }\n    });\n\n    return result;\n  }\n\n  // Overloads for revokeRefreshToken\n  async revokeRefreshToken(): Promise<RevokeRefreshTokenResult>;\n  async revokeRefreshToken(options: RevokeRefreshTokenOptions): Promise<RevokeRefreshTokenResult>;\n  async revokeRefreshToken(refresh: string): Promise<RevokeRefreshTokenResult>;\n  async revokeRefreshToken(refresh: string, options: RevokeRefreshTokenOptions): Promise<RevokeRefreshTokenResult>;\n  async revokeRefreshToken(\n    refreshOrOptions?: string | RevokeRefreshTokenOptions,\n    maybeOptions?: RevokeRefreshTokenOptions\n  ): Promise<RevokeRefreshTokenResult> {\n    let refresh: string;\n    let options: RevokeRefreshTokenOptions | undefined;\n\n    if (typeof refreshOrOptions === \"string\") {\n      refresh = refreshOrOptions;\n      options = maybeOptions;\n    } else {\n      options = refreshOrOptions;\n      refresh = options?.refresh ?? this.getRefresh();\n    }\n\n    const secret = this.requireSecret(\"revokeRefreshToken\");\n    const origin = this.resolveOrigin(options?.origin);\n    \n    const payload = {\n      clientid: this.clientId,\n      secret,\n      refresh\n    };\n\n    const result = await fetchJson<RevokeRefreshTokenResult>(REVOKE_REFRESH_TOKEN_URL, {\n      method: \"POST\",\n      body: payload,\n      headers: {\n        Origin: origin\n      }\n    });\n\n    return result;\n  }\n\n  private getToken(): string {\n    const token = this.getCookieValue(this.cookieNames.token);\n    if (!token) throw new Error(\"No token found. Call exchange() first.\");\n    return token;\n  }\n\n  private getRefresh(): string {\n    const refresh = this.getCookieValue(this.cookieNames.refresh);\n    if (!refresh) throw new Error(\"No refresh token found. Call exchange() first.\");\n    return refresh;\n  }\n\n  private getCookieValue(key: string): string | undefined {\n    try {\n      const value = (document.cookie || \"\").split(\"; \").find((c) => c.startsWith(`${this.cookieName(key)}=`));\n      if (!value) return undefined;\n      const [, v] = value.split(\"=\");\n      return decodeURIComponent(v);\n    } catch {\n      return undefined;\n    }\n  }\n\n  areCookiesSet(required: Array<\"token\" | \"refresh\" | \"scopes\" | \"expire\"> = [\"token\", \"refresh\"]): boolean {\n    for (const key of required) {\n      const cookieValue = this.getCookieValue(this.cookieNames[key]);\n      if (!cookieValue) return false;\n    }\n    return true;\n  }\n\n  logout(params?: { returnURL?: string; onRedirect?: (url: string) => void }): void {\n    // Clear cookies for auth keys\n    const names = this.cookieNames;\n    const keys = [names.token, names.refresh, names.scopes, names.expire];\n    const isBrowserEnv = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n    if (isBrowserEnv) {\n      for (const key of keys) {\n        try {\n          setCookie(this.cookieName(key), \"\", { expiresAt: new Date(0), path: \"/\", domain: this.opts.cookieDomain });\n        } catch {}\n      }\n    }\n    const redirectTarget = params?.returnURL ?? this.opts.defaultReturnURL ?? (typeof window !== \"undefined\" ? window.location.origin : undefined);\n    const redirectHandler = params?.onRedirect ?? this.opts.onRedirect;\n\n    if (typeof window !== \"undefined\" && redirectTarget) {\n      window.location.replace(redirectTarget);\n    } else if (redirectTarget && redirectHandler) {\n      redirectHandler(redirectTarget);\n    }\n  }\n}\n\nexport function createClient(clientId: string, secret: string, options?: EndevreClientOptions): EndevreClient {\n  return new EndevreClient(clientId, secret, options);\n}\n\nexport class BrowserEndevreClient extends EndevreClient {\n  constructor(clientId: string, options?: EndevreClientOptions) {\n    super(clientId, undefined, options);\n  }\n}\n\nexport function createBrowserClient(clientId: string, options?: EndevreClientOptions): BrowserEndevreClient {\n  return new BrowserEndevreClient(clientId, options);\n}\n\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,cAAc;AAEpB,IAAM,eAAe,GAAG,WAAW;AACnC,IAAM,eAAe,GAAG,WAAW;AACnC,IAAM,cAAc,GAAG,WAAW;AAClC,IAAM,2BAA2B,GAAG,WAAW;AAC/C,IAAM,iBAAiB,GAAG,WAAW;AAErC,IAAM,6BAA6B;AACnC,IAAM,iBAAiB;;;ACTvB,SAAS,gBAAsB;AACpC,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aAAa;AACpE,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AACF;AAEO,SAAS,YAAY,WAAmB,KAAkC;AAC/E,MAAI;AAEJ,MAAI,KAAK;AACP,gBAAY;AAAA,EACd,OAAO;AACL,kBAAc;AACd,gBAAY,OAAO,SAAS;AAAA,EAC9B;AACA,QAAM,EAAE,aAAa,IAAI,IAAI,IAAI,SAAS;AAC1C,QAAM,QAAQ,aAAa,IAAI,SAAS;AACxC,SAAO,UAAU,OAAO,SAAY;AACtC;AAEO,SAAS,iBAAiB,MAAc,QAAuE;AACpH,QAAM,MAAM,IAAI,IAAI,IAAI;AACxB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,OAAW;AACzB,QAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,EACzC;AACA,SAAO,IAAI,SAAS;AACtB;;;AChBA,SAAS,YAAqB;AAC5B,SAAO,OAAO,WAAW,eAAe,OAAO,aAAa;AAC9D;AAEO,SAAS,UAAU,MAAc,OAAe,UAAyB,CAAC,GAAS;AACxF,MAAI,CAAC,UAAU,GAAG;AAChB,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAEA,QAAM,UAAU,mBAAmB,KAAK;AACxC,QAAM,QAAkB,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE;AAE7C,MAAI,QAAQ,iBAAiB,MAAM;AACjC,UAAM,KAAK,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,aAAa,CAAC,CAAC,EAAE;AAAA,EACxE;AAEA,MAAI,QAAQ,WAAW;AACrB,UAAM,KAAK,WAAW,QAAQ,UAAU,YAAY,CAAC,EAAE;AAAA,EACzD;AAEA,QAAM,KAAK,QAAQ,QAAQ,QAAQ,GAAG,EAAE;AAExC,MAAI,QAAQ,QAAQ;AAClB,UAAM,KAAK,UAAU,QAAQ,MAAM,EAAE;AAAA,EACvC;AAEA,QAAM,UAAU,UAAU,KAAK,OAAO,YAAY,OAAO,SAAS,aAAa;AAC/E,QAAM,SAAS,QAAQ,UAAU;AACjC,MAAI,QAAQ;AACV,UAAM,KAAK,QAAQ;AAAA,EACrB;AAEA,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,KAAK,YAAY,QAAQ,EAAE;AAEjC,WAAS,SAAS,MAAM,KAAK,IAAI;AACnC;AAqBO,SAAS,aAAa,MAAc,OAAe,KAAK,QAAuB;AACpF,MAAI,CAAC,UAAU,GAAG;AAChB,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,QAAM,QAAkB,CAAC,GAAG,IAAI,KAAK,yCAAyC,QAAQ,IAAI,EAAE;AAC5F,MAAI,OAAQ,OAAM,KAAK,UAAU,MAAM,EAAE;AACzC,QAAM,UAAU,OAAO,YAAY,OAAO,SAAS,aAAa;AAChE,MAAI,QAAS,OAAM,KAAK,QAAQ;AAChC,QAAM,KAAK,cAAc;AACzB,WAAS,SAAS,MAAM,KAAK,IAAI;AACnC;;;ACxEA,eAAsB,UAAsC,KAAa,UAAqC,CAAC,GAAuB;AACpI,QAAM,UAAoC,OAAO,UAAU,aAAa,QAAQ;AAEhF,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEA,QAAM,EAAE,SAAS,QAAQ,MAAM,QAAQ,IAAI;AAC3C,QAAM,WAAW,MAAM,QAAQ,KAAK;AAAA,IAClC;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,GAAI,WAAW,CAAC;AAAA,IAClB;AAAA,IACA,MAAM,QAAQ,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,IAC5C,aAAa;AAAA,EACf,CAAC;AAED,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,QAAM,SAAS,YAAY,SAAS,kBAAkB;AACtD,MAAI,CAAC,SAAS,IAAI;AAChB,QAAI,eAAe,QAAQ,SAAS,MAAM;AAC1C,QAAI,QAAQ;AACV,UAAI;AACF,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,uBAAgB,SAAS,KAAK,iBAAiB,KAAK,WAAW,KAAK,UAAW;AAAA,MACjF,QAAQ;AAAA,MAAC;AAAA,IACX,OAAO;AACL,UAAI;AACF,cAAMA,QAAO,MAAM,SAAS,KAAK;AACjC,YAAIA,MAAM,gBAAeA;AAAA,MAC3B,QAAQ;AAAA,MAAC;AAAA,IACX;AACA,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AAEA,MAAI,QAAQ;AACV,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAQ;AAAA,EACV;AACF;;;ACjDA,kBAAiD;AAO1C,SAAS,UAAU,OAA2B;AACnD,MAAI;AACF,UAAM,cAAU,uBAAU,KAAK;AAC/B,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACrG;AACF;AAOO,SAAS,aAAa,OAAqC;AAChE,MAAI;AACF,UAAM,UAAU,OAAO,UAAU,WAAW,UAAU,KAAK,IAAI;AAC/D,UAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACxC,WAAO,QAAQ,MAAM;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,SAAS,mBAAmB,OAAwC;AACzE,QAAM,UAAU,UAAU,KAAK;AAC/B,SAAO,QAAQ;AACjB;AAOO,SAAS,MAAM,OAAwB;AAC5C,MAAI;AACF,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,WAAO,MAAM,WAAW,KAAK,MAAM,MAAM,UAAQ,KAAK,SAAS,CAAC;AAAA,EAClE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,IAAI,iBAA4D;AAChE,IAAM,uBAAuB,KAAK,KAAK,KAAK;AAM5C,eAAsB,eAAe,eAAe,OAAwB;AAE1E,MAAI,CAAC,gBAAgB,kBAAmB,KAAK,IAAI,IAAI,eAAe,YAAa,sBAAsB;AACrG,WAAO,eAAe;AAAA,EACxB;AAGA,QAAM,WAAW,MAAM,MAAM,cAAc;AAC3C,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,+BAA+B,SAAS,MAAM,EAAE;AAAA,EAClE;AAEA,QAAM,YAAY,MAAM,SAAS,KAAK;AAGtC,mBAAiB;AAAA,IACf,KAAK;AAAA,IACL,WAAW,KAAK,IAAI;AAAA,EACtB;AAEA,SAAO;AACT;AASA,eAAsB,mBAAmB,OAAe,WAAqC;AAC3F,MAAI;AACF,UAAM,YAAY,UAAM,wBAAW,WAAW,OAAO;AACrD,cAAM,uBAAU,OAAO,SAAS;AAChC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,sCAAsC,KAAK;AACzD,WAAO;AAAA,EACT;AACF;AAQA,eAAsB,YAAY,OAAe,WAAsC;AACrF,MAAI;AAEF,QAAI,CAAC,MAAM,KAAK,GAAG;AACjB,aAAO;AAAA,IACT;AAGA,QAAI,aAAa,KAAK,GAAG;AACvB,aAAO;AAAA,IACT;AAGA,QAAI,WAAW;AACb,aAAO,MAAM,mBAAmB,OAAO,SAAS;AAAA,IAClD;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC7EO,IAAM,gBAAN,MAAoB;AAAA,EAczB,YAAY,UAAkB,cAAuB,SAAgC;AACnF,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,SAAK,OAAO;AAAA,MACV,cAAc,SAAS,gBAAgB;AAAA,MACvC,cAAc,SAAS;AAAA,MACvB,cAAc,SAAS;AAAA,MACvB,gBAAgB,SAAS,kBAAkB;AAAA,MAC3C,eAAe,SAAS;AAAA,MACxB,kBAAkB,SAAS;AAAA,MAC3B,YAAY,SAAS;AAAA,IACvB;AACA,SAAK,cAAc,EAAE,OAAO,SAAS,SAAS,WAAW,QAAQ,UAAU,QAAQ,SAAS;AAAA,EAC9F;AAAA,EAEQ,cAAc,WAA2B;AAC/C,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,MAAM,GAAG,SAAS,2GAA2G;AAAA,IACzI;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,cAAc,UAA2B;AAC/C,QAAI,SAAU,QAAO;AACrB,QAAI,KAAK,KAAK,cAAe,QAAO,KAAK,KAAK;AAC9C,QAAI,OAAO,WAAW,eAAe,OAAO,OAAO,UAAU,WAAW,UAAU;AAChF,aAAO,OAAO,SAAS;AAAA,IACzB;AACA,UAAM,IAAI,MAAM,mHAAmH;AAAA,EACrI;AAAA,EAEQ,WAAW,MAAsB;AACvC,WAAO,GAAG,KAAK,KAAK,YAAY,GAAG,IAAI;AAAA,EACzC;AAAA,EAOA,MAAM,SACJ,eACA,cACyB;AACzB,QAAI;AACJ,QAAI;AAEJ,QAAI,OAAO,kBAAkB,UAAU;AACrC,aAAO;AACP,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU;AACV,aAAO,YAAY,MAAM;AAAA,IAC3B;AAEA,QAAI,CAAC,MAAM;AACT,UAAI,OAAO,WAAW,aAAa;AACjC,cAAM,IAAI,MAAM,qGAAqG;AAAA,MACvH;AACA,aAAO,YAAY,MAAM;AACzB,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,OAAO;AAC/B,UAAM,SAAS,KAAK,cAAc,UAAU;AAC5C,UAAM,SAAS,KAAK,cAAc,SAAS,MAAM;AAEjD,UAAM,UAAU;AAAA,MACd,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP;AAEA,UAAM,SAAS,MAAM,UAA0B,cAAc;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB,QAAwB,WAAoB,SAA+B;AAC1F,UAAM,iBAAiB,SAAS,kBAAkB;AAClD,QAAI,kBAAkB,CAAC,WAAW;AAChC,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAGA,QAAI,CAAC,OAAO,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,UAAU,CAAC,OAAO,QAAQ;AACxE,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,UAAM,QAAQ,EAAE,GAAG,KAAK,aAAa,GAAI,SAAS,SAAS,CAAC,EAAG;AAC/D,SAAK,cAAc;AAEnB,UAAM,iBAAiB,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAC3E,UAAM,YAAY,iBAAiB,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,iBAAiB,GAAI,IAAI;AAEtF,cAAU,KAAK,WAAW,MAAM,KAAK,GAAG,OAAO,OAAO;AAAA,MACpD;AAAA,MACA,QAAQ,SAAS,mBAAmB,IAAI,KAAK,KAAK,YAAY,KAAK,KAAK,KAAK;AAAA,MAC7E,QAAQ,KAAK,KAAK;AAAA,MAClB,UAAU,KAAK,KAAK;AAAA,IACtB,CAAC;AAED,cAAU,KAAK,WAAW,MAAM,OAAO,GAAG,OAAO,SAAS;AAAA,MACxD;AAAA,MACA,QAAQ,SAAS,mBAAmB,IAAI,KAAK,KAAK,YAAY,KAAK,KAAK,KAAK;AAAA,MAC7E,QAAQ,KAAK,KAAK;AAAA,MAClB,UAAU,KAAK,KAAK;AAAA,IACtB,CAAC;AAED,cAAU,KAAK,WAAW,MAAM,MAAM,GAAG,MAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,OAAO,KAAK,GAAG,IAAI,OAAO,OAAO,MAAM,GAAG;AAAA,MACvH;AAAA,MACA,QAAQ,SAAS,mBAAmB,IAAI,KAAK,KAAK,YAAY,KAAK,KAAK,KAAK;AAAA,MAC7E,QAAQ,KAAK,KAAK;AAAA,MAClB,UAAU,KAAK,KAAK;AAAA,IACtB,CAAC;AAED,cAAU,KAAK,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,MAAM,GAAG;AAAA,MAC9D;AAAA,MACA,QAAQ,SAAS,mBAAmB,IAAI,KAAK,KAAK,YAAY,KAAK,KAAK,KAAK;AAAA,MAC7E,QAAQ,KAAK,KAAK;AAAA,MAClB,UAAU,KAAK,KAAK;AAAA,IACtB,CAAC;AAED,QAAI,SAAS,kBAAkB;AAE7B,gBAAU,KAAK,WAAW,6BAA6B,GAAG,QAAQ;AAAA,QAChE;AAAA,QACA,QAAQ,SAAS,mBAAmB,IAAI,KAAK,KAAK,YAAY,KAAK,KAAK,KAAK;AAAA,QAC7E,QAAQ,KAAK,KAAK;AAAA,QAClB,UAAU,KAAK,KAAK;AAAA,MACtB,CAAC;AAAA,IACH,OAAO;AAEL,mBAAa,KAAK,WAAW,kBAAkB,CAAC;AAAA,IAClD;AAEA,QAAI,kBAAkB,WAAW;AAC/B,YAAM,cAAc,iBAAiB,4BAA4B,EAAE,UAAU,CAAC;AAC9E,UAAI,OAAO,WAAW,eAAe,OAAO,OAAO,aAAa,aAAa;AAC3E,eAAO,SAAS,QAAQ,WAAW;AAAA,MACrC,WAAW,SAAS,YAAY;AAC9B,gBAAQ,WAAW,WAAW;AAAA,MAChC,WAAW,KAAK,KAAK,YAAY;AAC/B,aAAK,KAAK,WAAW,WAAW;AAAA,MAClC,OAAO;AACL,cAAM,IAAI,MAAM,gHAAgH;AAAA,MAClI;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,MAAmC;AAE/C,UAAM,WAAW,MAAM,QAAQ,KAAK,YAAY,IAAI,KAAK,eAAe,CAAC;AACzE,UAAM,WAAW,OAAO,KAAK,oBAAoB,EAAE,EAAE,KAAK;AAC1D,UAAM,aAAa,SAAS,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACvE,UAAM,WAAW,WAAW,OAAO,CAAC,MAAM,MAAM,QAAQ;AACxD,UAAM,eAAe,CAAC,GAAG,UAAU,QAAQ,EAAE,KAAK,GAAG;AAErD,UAAM,MAAM,IAAI,IAAI,cAAc;AAClC,QAAI,KAAK,WAAW;AAClB,UAAI,aAAa,IAAI,aAAa,OAAO,KAAK,SAAS,CAAC;AAAA,IAC1D;AACA,QAAI,aAAa,IAAI,YAAY,KAAK,QAAQ;AAC9C,QAAI,aAAa,IAAI,gBAAgB,YAAY;AAGjD,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,UAAI,MAAM,sBAAsB,MAAM,kBAAkB,MAAM,YAAa;AAC3E,UAAI,KAAK,KAAM;AACf,UAAI,aAAa,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IACnC;AACA,WAAO,IAAI,SAAS;AAAA,EACtB;AAAA,EAMA,MAAM,YAAY,gBAAuE;AACvF,QAAI;AAEJ,QAAI,OAAO,mBAAmB,UAAU;AACtC,cAAQ;AAAA,IACV,OAAO;AACL,cAAQ,gBAAgB,SAAS,KAAK,SAAS;AAAA,IACjD;AAGA,QAAI,MAAM,KAAK,GAAG;AAChB,UAAI;AAEF,YAAI,YAAY,MAAM,eAAe;AACrC,YAAI,UAAU,MAAM,YAAY,OAAO,SAAS;AAGhD,YAAI,CAAC,SAAS;AACZ,kBAAQ,IAAI,mEAAmE;AAC/E,sBAAY,MAAM,eAAe,IAAI;AACrC,oBAAU,MAAM,YAAY,OAAO,SAAS;AAAA,QAC9C;AAEA,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI,MAAM,qCAAqC;AAAA,QACvD;AAGA,eAAO,mBAAmB,KAAK;AAAA,MACjC,SAAS,OAAO;AACd,gBAAQ,KAAK,sDAAsD,KAAK;AAAA,MAE1E;AAAA,IACF;AAGA,UAAM,UAAU;AAAA,MACd,UAAU,KAAK;AAAA,MACf;AAAA,IACF;AACA,UAAM,SAAS,MAAM,UAA0B,cAAc;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAOA,MAAM,aACJ,kBACA,cACwB;AACxB,QAAI;AACJ,QAAI;AAEJ,QAAI,OAAO,qBAAqB,UAAU;AACxC,gBAAU;AACV,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU;AACV,gBAAU,SAAS,WAAW,KAAK,WAAW;AAAA,IAChD;AAEA,UAAM,SAAS,SAAS,OAAO;AAE/B,UAAM,SAAS,KAAK,cAAc,cAAc;AAChD,UAAM,SAAS,KAAK,cAAc,SAAS,MAAM;AACjD,UAAM,UAAU;AAAA,MACd,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP;AAEA,UAAM,SAAS,MAAM,UAAyB,aAAa;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAOA,MAAM,mBACJ,kBACA,cACmC;AACnC,QAAI;AACJ,QAAI;AAEJ,QAAI,OAAO,qBAAqB,UAAU;AACxC,gBAAU;AACV,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU;AACV,gBAAU,SAAS,WAAW,KAAK,WAAW;AAAA,IAChD;AAEA,UAAM,SAAS,KAAK,cAAc,oBAAoB;AACtD,UAAM,SAAS,KAAK,cAAc,SAAS,MAAM;AAEjD,UAAM,UAAU;AAAA,MACd,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,UAAoC,0BAA0B;AAAA,MACjF,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,WAAmB;AACzB,UAAM,QAAQ,KAAK,eAAe,KAAK,YAAY,KAAK;AACxD,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,wCAAwC;AACpE,WAAO;AAAA,EACT;AAAA,EAEQ,aAAqB;AAC3B,UAAM,UAAU,KAAK,eAAe,KAAK,YAAY,OAAO;AAC5D,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,gDAAgD;AAC9E,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,KAAiC;AACtD,QAAI;AACF,YAAM,SAAS,SAAS,UAAU,IAAI,MAAM,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,WAAW,GAAG,CAAC,GAAG,CAAC;AACtG,UAAI,CAAC,MAAO,QAAO;AACnB,YAAM,CAAC,EAAE,CAAC,IAAI,MAAM,MAAM,GAAG;AAC7B,aAAO,mBAAmB,CAAC;AAAA,IAC7B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,cAAc,WAA6D,CAAC,SAAS,SAAS,GAAY;AACxG,eAAW,OAAO,UAAU;AAC1B,YAAM,cAAc,KAAK,eAAe,KAAK,YAAY,GAAG,CAAC;AAC7D,UAAI,CAAC,YAAa,QAAO;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAA2E;AAEhF,UAAM,QAAQ,KAAK;AACnB,UAAM,OAAO,CAAC,MAAM,OAAO,MAAM,SAAS,MAAM,QAAQ,MAAM,MAAM;AACpE,UAAM,eAAe,OAAO,WAAW,eAAe,OAAO,aAAa;AAE1E,QAAI,cAAc;AAChB,iBAAW,OAAO,MAAM;AACtB,YAAI;AACF,oBAAU,KAAK,WAAW,GAAG,GAAG,IAAI,EAAE,WAAW,oBAAI,KAAK,CAAC,GAAG,MAAM,KAAK,QAAQ,KAAK,KAAK,aAAa,CAAC;AAAA,QAC3G,QAAQ;AAAA,QAAC;AAAA,MACX;AAAA,IACF;AACA,UAAM,iBAAiB,QAAQ,aAAa,KAAK,KAAK,qBAAqB,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AACpI,UAAM,kBAAkB,QAAQ,cAAc,KAAK,KAAK;AAExD,QAAI,OAAO,WAAW,eAAe,gBAAgB;AACnD,aAAO,SAAS,QAAQ,cAAc;AAAA,IACxC,WAAW,kBAAkB,iBAAiB;AAC5C,sBAAgB,cAAc;AAAA,IAChC;AAAA,EACF;AACF;AAEO,SAAS,aAAa,UAAkB,QAAgB,SAA+C;AAC5G,SAAO,IAAI,cAAc,UAAU,QAAQ,OAAO;AACpD;AAEO,IAAM,uBAAN,cAAmC,cAAc;AAAA,EACtD,YAAY,UAAkB,SAAgC;AAC5D,UAAM,UAAU,QAAW,OAAO;AAAA,EACpC;AACF;AAEO,SAAS,oBAAoB,UAAkB,SAAsD;AAC1G,SAAO,IAAI,qBAAqB,UAAU,OAAO;AACnD;;;ANvcA,IAAO,gBAAQ;AAAA,EACb;AAAA,EACA;AACF;","names":["text"]}