@burdenoff/website-sdk 2026.724.4 → 2026.724.6
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.
- package/dist/content/index.js.map +1 -1
- package/dist/content/index.mjs.map +1 -1
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -8
- package/dist/index.mjs.map +1 -1
- package/dist/store/index.js +8 -8
- package/dist/store/index.js.map +1 -1
- package/dist/store/index.mjs +8 -8
- package/dist/store/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/content/Markdown.tsx","../../src/client/security.ts","../../src/client/graphql-client.ts","../../src/client/provider.tsx","../../src/product/product-provider.tsx","../../src/content/content-provider.tsx","../../src/seo/page-head.tsx","../../src/content/blog.tsx","../../src/content/case-studies.tsx","../../src/utils/cn.ts","../../src/ui/button.tsx","../../src/ui/input.tsx","../../src/content/changelog.tsx","../../src/content/utils.ts","../../src/content/press-kit.tsx","../../src/content/contracts.tsx"],"names":["jsx","ReactMarkdown","remarkGfm","rehypeSanitize","createContext","useContext","useState","useCallback","useEffect","DOMPurify","Helmet","jsxs","Fragment","useMemo","twMerge","clsx","cva","React","Slot","React2","formatDate","Search","ChevronLeft","ChevronRight","History"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode } from \"react\";\n\nimport ReactMarkdown from \"react-markdown\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport remarkGfm from \"remark-gfm\";\n\nimport type { Components } from \"react-markdown\";\n\nexport interface MarkdownProps {\n /** Markdown source to render. */\n children: string;\n /** Additional classes for the wrapper element. */\n className?: string;\n /** Render without a wrapping block element, suitable for inline content. */\n inline?: boolean;\n /** Optional react-markdown component overrides. */\n components?: Components;\n}\n\nconst defaultComponents: Components = {\n a: ({ href, children, ...props }) => {\n const isExternal =\n typeof href === \"string\" &&\n (href.startsWith(\"http://\") || href.startsWith(\"https://\"));\n return (\n <a\n href={href}\n {...props}\n {...(isExternal\n ? { target: \"_blank\", rel: \"noopener noreferrer\" }\n : { rel: \"noopener noreferrer\" })}\n >\n {children}\n </a>\n );\n },\n};\n\n/**\n * Shared markdown renderer for website content.\n *\n * - Uses `react-markdown` for standards-compliant parsing.\n * - Enables GitHub Flavored Markdown (tables, task lists, strikethrough, autolinks).\n * - Sanitizes HTML via `rehype-sanitize` so raw markup in markdown is stripped.\n * - External links open in a new tab with safe rel attributes.\n */\nexport function Markdown({\n children,\n className,\n inline,\n components,\n}: MarkdownProps): ReactNode {\n const content = (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeSanitize]}\n components={{ ...defaultComponents, ...components }}\n {...(inline ? { disallowedElements: [\"p\"], unwrapDisallowed: true } : {})}\n >\n {children}\n </ReactMarkdown>\n );\n\n if (inline) {\n return <span className={className}>{content}</span>;\n }\n\n return <div className={className}>{content}</div>;\n}\n","const LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"::1\"]);\nconst RESERVED_HEADERS = new Set([\n \"authorization\",\n \"cookie\",\n \"x-actor-id\",\n \"x-actor-type\",\n \"x-consent-granted-by\",\n \"x-consent-scope\",\n \"x-consent-granted-at\",\n \"x-consent-expires-at\",\n]);\n\nexport function validateGatewayUrl(value: string): string {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"Gateway URL must be a valid absolute URL\");\n }\n\n if (url.protocol === \"https:\") {\n return url.toString();\n }\n\n if (\n url.protocol === \"http:\" &&\n LOOPBACK_HOSTS.has(url.hostname.toLowerCase())\n ) {\n return url.toString();\n }\n\n throw new Error(\"Gateway URL must use HTTPS unless it targets localhost\");\n}\n\nexport function sanitizeHeaders(\n headers?: Record<string, string>,\n): Record<string, string> | undefined {\n if (!headers) return undefined;\n\n return Object.fromEntries(\n Object.entries(headers).filter(\n ([key]) => !RESERVED_HEADERS.has(key.toLowerCase()),\n ),\n );\n}\n","/**\n * Lightweight GraphQL client for the Burdenoff Web SDK.\n * Uses native fetch - zero external dependencies.\n * All calls are unauthenticated (public gateway operations only).\n */\n\nimport { sanitizeHeaders, validateGatewayUrl } from \"./security\";\n\nexport interface WebSDKClientConfig {\n /** Global public gateway URL (e.g. \"https://api.burdenoff.com/global/graphql\") */\n gatewayUrl: string;\n /** Platform product ID for scoping operations */\n productId: string;\n /** Product slug (used for public product queries) */\n productSlug?: string;\n /** reCAPTCHA site key (if not fetched from product config) */\n recaptchaSiteKey?: string;\n /** Rybbit analytics site ID */\n rybbitSiteId?: string;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n /**\n * Per-request timeout in ms. Kept below the gateway's operation timeout so a\n * stalled request surfaces as an error the UI can render, instead of leaving\n * a page stuck on loading skeletons forever. Default 12000.\n */\n timeoutMs?: number;\n /**\n * Extra attempts for transient failures (timeout / network / 5xx / 429) on\n * QUERIES ONLY. Mutations are never retried — a retried contact-form or\n * waitlist submit would double-submit. Default 1 (2 attempts total).\n */\n maxRetries?: number;\n}\n\nexport interface GraphQLResponse<T = Record<string, unknown>> {\n data?: T;\n errors?: Array<{\n message: string;\n locations?: Array<{ line: number; column: number }>;\n path?: Array<string | number>;\n extensions?: Record<string, unknown>;\n }>;\n}\n\nexport class WebSDKClient {\n private config: WebSDKClientConfig;\n private queryCache = new Map<\n string,\n { data: GraphQLResponse<unknown>; ts: number }\n >();\n private inflight = new Map<string, Promise<GraphQLResponse<unknown>>>();\n private static CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n private static MAX_CACHE_ENTRIES = 100;\n private static DEFAULT_TIMEOUT_MS = 12_000;\n private static DEFAULT_MAX_RETRIES = 1;\n private static RETRY_BASE_DELAY_MS = 400;\n\n constructor(config: WebSDKClientConfig) {\n this.config = {\n ...config,\n gatewayUrl: validateGatewayUrl(config.gatewayUrl),\n headers: sanitizeHeaders(config.headers),\n };\n }\n\n getConfig(): WebSDKClientConfig {\n return this.config;\n }\n\n /**\n * Execute a GraphQL query (with deduplication and caching)\n */\n async query<T = Record<string, unknown>>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n const cacheKey = JSON.stringify({ query, variables });\n\n // Return cached response if still valid, evict if expired\n const cached = this.queryCache.get(cacheKey);\n if (cached) {\n if (Date.now() - cached.ts < WebSDKClient.CACHE_TTL) {\n return cached.data as GraphQLResponse<T>;\n }\n this.queryCache.delete(cacheKey);\n }\n\n // Deduplicate: if same query is already in-flight, reuse the promise\n const existing = this.inflight.get(cacheKey);\n if (existing) {\n return existing as Promise<GraphQLResponse<T>>;\n }\n\n const promise = this.request<T>(query, variables)\n .then((result) => {\n // Cache successful responses only\n if (result.data && !result.errors?.length) {\n if (this.queryCache.size >= WebSDKClient.MAX_CACHE_ENTRIES) {\n const oldestEntry = this.queryCache.keys().next().value;\n if (oldestEntry) {\n this.queryCache.delete(oldestEntry);\n }\n }\n this.queryCache.set(cacheKey, { data: result, ts: Date.now() });\n }\n return result;\n })\n .finally(() => {\n this.inflight.delete(cacheKey);\n });\n\n this.inflight.set(cacheKey, promise);\n return promise;\n }\n\n /**\n * Execute a GraphQL mutation\n */\n async mutate<T = Record<string, unknown>>(\n mutation: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n // retry=false: a retried mutation could double-submit (contact form,\n // waitlist signup, order). Only the timeout applies here.\n return this.request<T>(mutation, variables, false);\n }\n\n /** HTTP statuses worth another attempt — transient server/edge conditions. */\n private static isRetriableStatus(status: number): boolean {\n return status === 429 || status === 408 || (status >= 500 && status < 600);\n }\n\n private static sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Perform the HTTP call with a hard timeout. Every outcome resolves to a\n * GraphQLResponse — callers never hang, so a UI's `loading` state always\n * settles into data or a renderable error.\n */\n private async attempt<T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n timeoutMs: number,\n ): Promise<{ res: GraphQLResponse<T>; retriable: boolean }> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetch(this.config.gatewayUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-product-id\": this.config.productId,\n ...this.config.headers,\n },\n body: JSON.stringify({ query, variables }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n console.error(\n \"[WebSDK] GraphQL request failed\",\n response.status,\n response.statusText,\n );\n return {\n res: {\n errors: [\n {\n message: `HTTP ${response.status}: ${response.statusText}`,\n extensions: { code: `HTTP_${response.status}` },\n },\n ],\n },\n retriable: WebSDKClient.isRetriableStatus(response.status),\n };\n }\n\n return {\n res: (await response.json()) as GraphQLResponse<T>,\n retriable: false,\n };\n } catch (error) {\n const aborted =\n error instanceof Error &&\n (error.name === \"AbortError\" || controller.signal.aborted);\n const message = aborted\n ? `Request timed out after ${timeoutMs}ms`\n : error instanceof Error\n ? error.message\n : \"Network error\";\n console.error(\"[WebSDK] Network error\", message);\n return {\n res: {\n errors: [\n {\n message,\n extensions: { code: aborted ? \"TIMEOUT\" : \"NETWORK_ERROR\" },\n },\n ],\n },\n // Transport-level failures are worth one more try; a genuine outage\n // just fails twice quickly and still renders an error state.\n retriable: true,\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async request<T>(\n query: string,\n variables?: Record<string, unknown>,\n retry = true,\n ): Promise<GraphQLResponse<T>> {\n const timeoutMs = this.config.timeoutMs ?? WebSDKClient.DEFAULT_TIMEOUT_MS;\n const maxRetries = retry\n ? (this.config.maxRetries ?? WebSDKClient.DEFAULT_MAX_RETRIES)\n : 0;\n\n let last: GraphQLResponse<T> | undefined;\n for (let i = 0; i <= maxRetries; i++) {\n const { res, retriable } = await this.attempt<T>(\n query,\n variables,\n timeoutMs,\n );\n if (!retriable || i === maxRetries) return res;\n last = res;\n // Small backoff with jitter so a burst of clients doesn't retry in lockstep.\n await WebSDKClient.sleep(\n WebSDKClient.RETRY_BASE_DELAY_MS * (i + 1) + Math.random() * 200,\n );\n }\n return last as GraphQLResponse<T>;\n }\n}\n","/**\n * React context provider for the Web SDK client.\n * Wraps the application with WebSDKClient configuration.\n */\n\"use client\";\n\nimport { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { resolveGatewayUrl } from \"./gateway-resolver\";\nimport { WebSDKClient, type WebSDKClientConfig } from \"./graphql-client\";\n\nconst WebSDKContext = createContext<WebSDKClient | null>(null);\n\nexport interface WebSDKProviderProps {\n /** SDK client configuration */\n config: WebSDKClientConfig;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Provider component that makes the WebSDKClient available to all child components.\n *\n * @example\n * ```tsx\n * <WebSDKProvider config={{\n * gatewayUrl: \"https://api.burdenoff.com/global/graphql\",\n * productId: \"your-product-id\",\n * productSlug: \"your-product\",\n * }}>\n * <App />\n * </WebSDKProvider>\n * ```\n */\nexport function WebSDKProvider({ config, children }: WebSDKProviderProps) {\n const client = useMemo(() => {\n const resolvedConfig = {\n ...config,\n gatewayUrl: resolveGatewayUrl(config.gatewayUrl),\n };\n return new WebSDKClient(resolvedConfig);\n }, [config]);\n\n return (\n <WebSDKContext.Provider value={client}>{children}</WebSDKContext.Provider>\n );\n}\n\n/**\n * Hook to access the WebSDKClient instance.\n * Must be used within a WebSDKProvider.\n */\nexport function useWebSDK(): WebSDKClient {\n const client = useContext(WebSDKContext);\n if (!client) {\n throw new Error(\"useWebSDK must be used within a WebSDKProvider\");\n }\n return client;\n}\n\n/**\n * Hook to access the SDK configuration.\n * Useful for components that need config values like productId, recaptchaSiteKey, etc.\n */\nexport function useWebSDKConfig(): WebSDKClientConfig {\n const client = useWebSDK();\n return client.getConfig();\n}\n","/**\n * Product Provider\n *\n * React context and hooks for accessing product metadata from the global tenant service.\n * Fetches product info (name, logo, SEO, contact, reCAPTCHA key, etc.) on mount\n * and provides it to all child components.\n */\n\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useLayoutEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ProductData {\n id: string;\n name: string;\n slug: string;\n description?: string | null;\n status: string;\n logoUrl?: string | null;\n website?: string | null;\n appUrl?: string | null;\n docsUrl?: string | null;\n contactEmail?: string | null;\n supportEmail?: string | null;\n contactPhone?: string | null;\n contactAddress?: string | null;\n seoTitle?: string | null;\n seoDescription?: string | null;\n seoKeywords?: string | null;\n ogImage?: string | null;\n socialLinks?: Record<string, string> | null;\n /**\n * Resource links for the website footer \"Resources\" column\n * (JSON: { docs, community, careers, team, companies, ... }).\n * Same shape as socialLinks. Free-form keys; the ResourceLinks\n * component renders known keys and silently ignores the rest.\n * Backed by Product.resourceLinks on the backend (global-tenant-svc).\n */\n resourceLinks?: Record<string, string> | null;\n recaptchaSiteKey?: string | null;\n rybbitSiteId?: string | null;\n notificationEmail?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface ProductProviderProps {\n /** Child components */\n children: ReactNode;\n /** Optional fallback product data (used while loading) */\n fallback?: Partial<ProductData>;\n}\n\n// ============================================================================\n// GraphQL Query\n// ============================================================================\n\n/**\n * Body of fields requested for every product fetch — shared by the primary\n * query and the legacy-backend fallback below. Kept as a string fragment\n * (not a real GraphQL `fragment` block) so we can append/strip\n * `resourceLinks` without touching anything else.\n */\nconst PRODUCT_FIELDS_BASE = `\n id\n name\n slug\n description\n status\n logoUrl\n website\n appUrl\n docsUrl\n contactEmail\n supportEmail\n contactPhone\n contactAddress\n seoTitle\n seoDescription\n seoKeywords\n ogImage\n socialLinks\n recaptchaSiteKey\n rybbitSiteId\n notificationEmail\n metadata\n`;\n\n/**\n * Primary query — includes the recently-added `resourceLinks` field.\n * Backends that have run the corresponding `global-tenant-svc` migration\n * (PR #64) expose this field; older ones don't, in which case\n * GraphQL validation rejects the whole query with\n * `Cannot query field \"resourceLinks\" on type \"PublicProduct\"`. The fetch\n * helper detects that specific error and transparently retries the\n * fallback below, so the SDK works on both pre- and post-migration\n * deployments without consumer-side gating.\n */\nconst PUBLIC_PRODUCT_QUERY = `\n query PublicProduct($slug: String!) {\n publicProduct(slug: $slug) {\n ${PRODUCT_FIELDS_BASE}\n resourceLinks\n }\n }\n`;\n\n/**\n * Fallback query for older backend deployments. Identical to the primary\n * minus `resourceLinks`. Consumers see `product.resourceLinks === undefined`\n * and any consumer (e.g. `<ResourceLinks/>`) falls through to prop / default\n * resolution paths.\n */\nconst PUBLIC_PRODUCT_QUERY_FALLBACK = `\n query PublicProductFallback($slug: String!) {\n publicProduct(slug: $slug) {\n ${PRODUCT_FIELDS_BASE}\n }\n }\n`;\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface ProductContextValue {\n product: ProductData | null;\n loading: boolean;\n error: string | null;\n hasProvider: boolean;\n refetch: () => void;\n}\n\nconst ProductContext = createContext<ProductContextValue>({\n product: null,\n loading: true,\n error: null,\n hasProvider: false,\n refetch: () => {},\n});\n\n// ============================================================================\n// Provider\n// ============================================================================\n\n/**\n * ProductProvider fetches and provides product metadata to child components.\n * Uses the product slug from WebSDKConfig to fetch from the public API.\n *\n * @example\n * ```tsx\n * <WebSDKProvider config={sdkConfig}>\n * <ProductProvider>\n * <App />\n * </ProductProvider>\n * </WebSDKProvider>\n * ```\n */\nexport function ProductProvider({ children, fallback }: ProductProviderProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const [product, setProduct] = useState<ProductData | null>(\n fallback ? (fallback as ProductData) : null,\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const fetchProduct = useCallback(async () => {\n if (!config.productSlug) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n let result = await client.query<{ publicProduct: ProductData | null }>(\n PUBLIC_PRODUCT_QUERY,\n { slug: config.productSlug },\n );\n\n // Backwards-compat fallback: if the backend's `publicProduct` schema\n // doesn't yet expose `resourceLinks` (deployed before\n // `global-tenant-svc` PR #64), the primary query fails validation\n // with a \"Cannot query field …\" error and `result.data` is null.\n // Retry the fallback query that omits `resourceLinks`; consumers\n // gracefully see `product.resourceLinks === undefined` and fall\n // through their own resolution paths.\n const schemaMissingResourceLinks = result.errors?.some((e) =>\n /Cannot query field [\"']?resourceLinks[\"']?/i.test(e?.message ?? \"\"),\n );\n if (schemaMissingResourceLinks) {\n result = await client.query<{ publicProduct: ProductData | null }>(\n PUBLIC_PRODUCT_QUERY_FALLBACK,\n { slug: config.productSlug },\n );\n }\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Unknown error\");\n } else if (result.data?.publicProduct) {\n setProduct(result.data.publicProduct);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch product\");\n } finally {\n setLoading(false);\n }\n }, [client, config.productSlug]);\n\n // Use useLayoutEffect for earliest possible fetch after commit (before paint).\n // Runs when slug or client changes. Client-side query cache + dedup ensures\n // no duplicate network requests even if React StrictMode fires this twice.\n useLayoutEffect(() => {\n fetchProduct();\n }, [fetchProduct]);\n\n const value = useMemo(\n () => ({\n product,\n loading,\n error,\n hasProvider: true,\n refetch: fetchProduct,\n }),\n [product, loading, error, fetchProduct],\n );\n\n return (\n <ProductContext.Provider value={value}>{children}</ProductContext.Provider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to access the current product data.\n *\n * @example\n * ```tsx\n * const { product, loading } = useProduct();\n * if (loading) return <Loading />;\n * return <h1>{product?.name}</h1>;\n * ```\n */\nexport function useProduct(): ProductContextValue {\n return useContext(ProductContext);\n}\n\n/**\n * Hook to get product-specific configuration.\n * Merges SDK config with fetched product data.\n * Useful for getting reCAPTCHA keys, analytics IDs, etc.\n *\n * @example\n * ```tsx\n * const { recaptchaSiteKey, rybbitSiteId } = useProductConfig();\n * ```\n */\nexport function useProductConfig(): {\n recaptchaSiteKey: string | null;\n rybbitSiteId: string | null;\n contactEmail: string | null;\n supportEmail: string | null;\n notificationEmail: string | null;\n productName: string | null;\n logoUrl: string | null;\n} {\n const { product } = useProduct();\n const config = useWebSDKConfig();\n\n return {\n // Prefer product-level config, fall back to SDK config\n recaptchaSiteKey:\n product?.recaptchaSiteKey ?? config.recaptchaSiteKey ?? null,\n rybbitSiteId: product?.rybbitSiteId ?? config.rybbitSiteId ?? null,\n contactEmail: product?.contactEmail ?? null,\n supportEmail: product?.supportEmail ?? null,\n notificationEmail:\n product?.notificationEmail ?? product?.contactEmail ?? null,\n productName: product?.name ?? null,\n logoUrl: product?.logoUrl ?? null,\n };\n}\n","/**\n * Content Provider\n *\n * React hooks for fetching public content pages from the global tenant service.\n * Content pages include privacy policies, terms of service, blogs, changelogs, etc.\n */\n\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport DOMPurify from \"isomorphic-dompurify\";\n\nimport { Markdown } from \"./Markdown\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ContentPageData {\n id: string;\n title: string;\n slug: string;\n content: string;\n contentFormat: string;\n seoTitle?: string | null;\n seoDescription?: string | null;\n seoKeywords?: string | null;\n lastUpdated: string;\n version: number;\n tags?: string[];\n excerpt?: string | null;\n thumbnail?: string | null;\n author?: string | null;\n publishedAt?: string | null;\n readingTime?: number | null;\n featured?: boolean;\n category?: string | null;\n}\n\nexport interface ContentPageListItem {\n id: string;\n title: string;\n slug: string;\n lastUpdated: string;\n tags?: string[];\n excerpt?: string | null;\n thumbnail?: string | null;\n author?: string | null;\n publishedAt?: string | null;\n readingTime?: number | null;\n featured?: boolean;\n category?: string | null;\n seoDescription?: string | null;\n}\n\nexport interface ContentPageListData {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n}\n\nexport interface UseContentPageOptions {\n /** Whether to use template variable replacement (resolvedContentPage) */\n resolve?: boolean;\n}\n\n// ============================================================================\n// GraphQL Queries\n// ============================================================================\n\nconst PUBLIC_CONTENT_PAGE_QUERY = `\n query PublicContentPage($slug: String!, $productId: String) {\n publicContentPage(slug: $slug, productId: $productId) {\n id\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n version\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n }\n`;\n\nconst PUBLIC_RESOLVED_CONTENT_PAGE_QUERY = `\n query PublicResolvedContentPage($slug: String!, $productId: String!) {\n publicResolvedContentPage(slug: $slug, productId: $productId) {\n id\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n version\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n }\n`;\n\nconst PUBLIC_CONTENT_PAGES_QUERY = `\n query PublicContentPages($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n seoDescription\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to fetch a single public content page by slug.\n *\n * @example\n * ```tsx\n * const { data, loading, error } = useContentPage('privacy-policy');\n * ```\n */\nexport function useContentPage(\n slug: string,\n options?: UseContentPageOptions,\n): {\n data: ContentPageData | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n} {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const [data, setData] = useState<ContentPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPage = useCallback(async () => {\n if (!resolvedProductId) return; // Wait for product to load\n\n setLoading(true);\n setError(null);\n\n try {\n const query = options?.resolve\n ? PUBLIC_RESOLVED_CONTENT_PAGE_QUERY\n : PUBLIC_CONTENT_PAGE_QUERY;\n\n const queryName = options?.resolve\n ? \"publicResolvedContentPage\"\n : \"publicContentPage\";\n\n const result = await client.query<Record<string, ContentPageData | null>>(\n query,\n {\n slug,\n productId: resolvedProductId,\n },\n );\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Unknown error\");\n setData(null);\n } else {\n setData(result.data?.[queryName] ?? null);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch content\");\n setData(null);\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, slug, options?.resolve]);\n\n useEffect(() => {\n fetchPage();\n }, [fetchPage]);\n\n return { data, loading, error, refetch: fetchPage };\n}\n\n/**\n * Hook to fetch a list of public content pages for the current product.\n *\n * @example\n * ```tsx\n * const { data, loading } = useContentPages({ limit: 10 });\n * ```\n */\nexport function useContentPages(options?: {\n limit?: number;\n offset?: number;\n}): {\n data: ContentPageListData | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n} {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const [data, setData] = useState<ContentPageListData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPages = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.query<{\n publicContentPages: ContentPageListData;\n }>(PUBLIC_CONTENT_PAGES_QUERY, {\n productId: config.productId,\n limit: options?.limit ?? 50,\n offset: options?.offset ?? 0,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Unknown error\");\n setData(null);\n } else {\n setData(result.data?.publicContentPages ?? null);\n }\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to fetch content pages\",\n );\n setData(null);\n } finally {\n setLoading(false);\n }\n }, [client, config.productId, options?.limit, options?.offset]);\n\n useEffect(() => {\n fetchPages();\n }, [fetchPages]);\n\n return { data, loading, error, refetch: fetchPages };\n}\n\n/**\n * Content renderer component.\n *\n * - `markdown` (default): renders with the shared {@link Markdown} component\n * (react-markdown + remark-gfm + rehype-sanitize).\n * - `html`: sanitized with DOMPurify before rendering.\n * - anything else: plain-text fallback\n *\n * @example\n * ```tsx\n * <ContentRenderer content={page.content} format={page.contentFormat} />\n * ```\n */\nexport function ContentRenderer({\n content,\n format = \"markdown\",\n className,\n}: {\n content: string;\n format?: string;\n className?: string;\n}) {\n if (format === \"markdown\") {\n return <Markdown className={className}>{content}</Markdown>;\n }\n\n if (format === \"html\") {\n const sanitized = DOMPurify.sanitize(content);\n return (\n <div\n className={className}\n dangerouslySetInnerHTML={{ __html: sanitized }}\n />\n );\n }\n\n // Plain text fallback\n return (\n <div className={className}>\n <pre style={{ whiteSpace: \"pre-wrap\", fontFamily: \"inherit\" }}>\n {content}\n </pre>\n </div>\n );\n}\n","/**\n * PageHead Component\n * Manages dynamic meta tags for SEO optimization on a per-page basis.\n * Supports JSON-LD structured data, Open Graph, Twitter Cards, favicons, and robots directives.\n *\n * @example\n * ```tsx\n * <PageHead\n * title=\"About Us\"\n * description=\"Learn about our mission and team\"\n * productName=\"MyProduct\"\n * keywords=\"about, team, mission\"\n * image=\"/og-about.png\"\n * url=\"https://myproduct.com/about\"\n * favicon=\"/favicon.ico\"\n * robots=\"index, follow\"\n * locale=\"en_US\"\n * twitterHandle=\"@burdenoff\"\n * themeColor=\"#1a1a2e\"\n * structuredData={{\n * \"@context\": \"https://schema.org\",\n * \"@type\": \"WebPage\",\n * name: \"About Us\",\n * }}\n * />\n * ```\n */\n\nimport { Helmet } from \"react-helmet-async\";\n\nexport interface PageHeadProps {\n /** Page title */\n title: string;\n /** Meta description */\n description?: string;\n /** Product/brand name (appended to title) */\n productName?: string;\n /** SEO keywords */\n keywords?: string;\n /** Open Graph image URL */\n image?: string;\n /** Page canonical URL */\n url?: string;\n /** Favicon URL */\n favicon?: string;\n /** Robots directive (e.g., \"index, follow\") */\n robots?: string;\n /** Open Graph locale (e.g., \"en_US\") */\n locale?: string;\n /** Twitter handle (e.g., \"@burdenoff\") */\n twitterHandle?: string;\n /** Theme color for mobile browsers */\n themeColor?: string;\n /** JSON-LD structured data objects */\n structuredData?: Record<string, unknown> | Array<Record<string, unknown>>;\n /** Additional meta tags */\n additionalMeta?: Array<{\n name?: string;\n property?: string;\n content: string;\n }>;\n}\n\nexport function PageHead({\n title,\n description,\n productName,\n keywords,\n image,\n url,\n favicon,\n robots = \"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\",\n locale = \"en_US\",\n twitterHandle,\n themeColor = \"#000000\",\n structuredData,\n additionalMeta,\n}: PageHeadProps) {\n const fullTitle =\n productName && !title.includes(productName)\n ? `${title} | ${productName}`\n : title;\n\n const fullImageUrl =\n image && !image.startsWith(\"http\") && url\n ? `${url.replace(/\\/$/, \"\")}${image}`\n : image;\n\n // Normalize structured data to an array\n const structuredDataItems: Array<Record<string, unknown>> = structuredData\n ? Array.isArray(structuredData)\n ? structuredData\n : [structuredData]\n : [];\n\n return (\n <Helmet>\n {/* Primary Meta Tags */}\n <title>{fullTitle}</title>\n <meta name=\"title\" content={fullTitle} />\n {description && <meta name=\"description\" content={description} />}\n {keywords && <meta name=\"keywords\" content={keywords} />}\n <meta name=\"author\" content=\"Burdenoff Consultancy Services Pvt Ltd\" />\n <meta name=\"robots\" content={robots} />\n\n {/* Canonical URL */}\n {url && <link rel=\"canonical\" href={url} />}\n\n {/* Favicon */}\n {favicon && <link rel=\"icon\" href={favicon} />}\n\n {/* Open Graph / Facebook */}\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={fullTitle} />\n {description && <meta property=\"og:description\" content={description} />}\n {fullImageUrl && <meta property=\"og:image\" content={fullImageUrl} />}\n {url && <meta property=\"og:url\" content={url} />}\n <meta property=\"og:locale\" content={locale} />\n {productName && <meta property=\"og:site_name\" content={productName} />}\n\n {/* Twitter Card */}\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n <meta name=\"twitter:title\" content={fullTitle} />\n {description && <meta name=\"twitter:description\" content={description} />}\n {fullImageUrl && <meta name=\"twitter:image\" content={fullImageUrl} />}\n {twitterHandle && <meta name=\"twitter:creator\" content={twitterHandle} />}\n\n {/* Theme Color */}\n <meta name=\"theme-color\" content={themeColor} />\n\n {/* JSON-LD Structured Data */}\n {structuredDataItems.map((data, index) => (\n <script key={`ld-${index}`} type=\"application/ld+json\">\n {JSON.stringify(data)}\n </script>\n ))}\n\n {/* Additional Meta Tags */}\n {additionalMeta?.map((meta, index) => (\n <meta\n key={`meta-${index}`}\n {...(meta.name ? { name: meta.name } : {})}\n {...(meta.property ? { property: meta.property } : {})}\n content={meta.content}\n />\n ))}\n </Helmet>\n );\n}\n","\"use client\";\n\n/**\n * Blog Components\n *\n * CMS-powered blog list and post pages. Uses ProductContentPage with tag \"blog\".\n *\n * @example\n * ```tsx\n * import { BlogListPage, BlogPostPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/blog\" element={<BlogListPage productName=\"VibeControls\" />} />\n * <Route path=\"/blog/:slug\" element={<BlogPostPage productName=\"VibeControls\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport { ContentRenderer } from \"./content-provider\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { ContentPageData, ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BlogListPageProps {\n productName?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n blogPostBasePath?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n}\n\nexport interface BlogPostPageProps {\n productName?: string;\n blogListUrl?: string;\n /** Back-link label. Default: \"Back to Blog\". Use e.g. \"Back to Press\"\n * when reusing this renderer for a press release at /press/:slug. */\n backLabel?: string;\n className?: string;\n}\n\n// ============================================================================\n// Query\n// ============================================================================\n\nconst BLOG_POSTS_QUERY = `\n query BlogPosts($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n seoDescription\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\nconst BLOG_POST_QUERY = `\n query BlogPost($slug: String!, $productId: String) {\n publicContentPage(slug: $slug, productId: $productId) {\n id\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n tags\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n }\n`;\n\n// ============================================================================\n// BlogCard\n// ============================================================================\n\nfunction BlogCard({\n post,\n basePath = \"/blog\",\n}: {\n post: ContentPageListItem;\n basePath?: string;\n}) {\n const date = post.publishedAt || post.lastUpdated;\n const formattedDate = date\n ? new Date(date).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })\n : \"\";\n // Dead/unreachable thumbnail → placeholder, never a broken-image glyph.\n const [imgError, setImgError] = useState(false);\n\n return (\n <a\n href={`${basePath}/${post.slug}`}\n className=\"group block bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300\"\n >\n {/* Thumbnail */}\n {post.thumbnail && !imgError ? (\n <div className=\"aspect-[16/9] overflow-hidden\">\n <img\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n </div>\n ) : (\n <div className=\"aspect-[16/9] bg-muted/50 flex items-center justify-center\">\n <svg\n className=\"w-12 h-12 text-muted-foreground/20\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\"\n />\n </svg>\n </div>\n )}\n\n <div className=\"p-5 sm:p-6\">\n {/* Category badge */}\n {post.category && (\n <span className=\"inline-block text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-3\">\n {post.category}\n </span>\n )}\n\n {/* Title */}\n <h3 className=\"text-lg font-semibold text-foreground mb-2 group-hover:text-primary transition-colors line-clamp-2\">\n {post.title}\n </h3>\n\n {/* Excerpt */}\n <p className=\"text-sm text-muted-foreground mb-4 line-clamp-3\">\n {post.excerpt || post.seoDescription || \"\"}\n </p>\n\n {/* Footer: author + date + reading time */}\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n {post.author && <span className=\"font-medium\">{post.author}</span>}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n )}\n </div>\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// BlogListPage\n// ============================================================================\n\nexport function BlogListPage(props: BlogListPageProps) {\n const {\n productName,\n heroTitle = \"Blog\",\n heroSubtitle = \"Latest updates, engineering insights, and product news\",\n blogPostBasePath = \"/blog\",\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n\n const [posts, setPosts] = useState<ContentPageListItem[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [offset, setOffset] = useState(0);\n const limit = 12;\n\n const fetchPosts = useCallback(async () => {\n if (!resolvedProductId) return;\n\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n };\n }>(BLOG_POSTS_QUERY, {\n productId: resolvedProductId,\n limit,\n offset,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load posts\");\n return;\n }\n\n // Filter to only blog-tagged posts\n const blogPosts = (result.data?.publicContentPages?.items || []).filter(\n (p) => p.tags?.includes(\"blog\"),\n );\n\n setPosts(blogPosts);\n setTotal(result.data?.publicContentPages?.total || 0);\n setError(null);\n } catch {\n setError(\"Failed to load blog posts\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, offset]);\n\n useEffect(() => {\n fetchPosts();\n }, [fetchPosts]);\n\n // Separate featured and regular posts\n const featuredPosts = posts.filter((p) => p.featured);\n const regularPosts = posts.filter((p) => !p.featured);\n\n return (\n <div className={`w-full ${className}`}>\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n url={typeof window !== \"undefined\" ? window.location.origin + window.location.pathname : undefined}\n />\n )}\n\n {/* Hero */}\n <section className=\"py-16 sm:py-20 md:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center max-w-3xl mx-auto\">\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground\">\n {heroTitle}\n </h1>\n <p className=\"mt-4 text-lg text-muted-foreground\">{heroSubtitle}</p>\n </div>\n </div>\n </section>\n\n {/* Posts */}\n <section className=\"pb-16 sm:pb-20\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n {loading ? (\n <div className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"bg-card border rounded-xl overflow-hidden animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"p-6 space-y-3\">\n <div className=\"h-4 bg-muted rounded w-1/4\" />\n <div className=\"h-6 bg-muted rounded w-3/4\" />\n <div className=\"h-4 bg-muted rounded\" />\n <div className=\"h-4 bg-muted rounded w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n ) : error ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">{error}</p>\n </div>\n ) : posts.length === 0 ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No blog posts yet. Check back soon!\n </p>\n </div>\n ) : (\n <>\n {/* Featured posts (full width) */}\n {featuredPosts.length > 0 && (\n <div className=\"grid md:grid-cols-2 gap-6 sm:gap-8 mb-8\">\n {featuredPosts.map((post) => (\n <BlogCard\n key={post.id}\n post={post}\n basePath={blogPostBasePath}\n />\n ))}\n </div>\n )}\n\n {/* Regular posts (3-column grid) */}\n <div className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8\">\n {regularPosts.map((post) => (\n <BlogCard\n key={post.id}\n post={post}\n basePath={blogPostBasePath}\n />\n ))}\n </div>\n\n {/* Pagination */}\n {total > limit && (\n <div className=\"flex justify-center gap-4 mt-12\">\n <button\n onClick={() => setOffset(Math.max(0, offset - limit))}\n disabled={offset === 0}\n className=\"px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors\"\n >\n Previous\n </button>\n <button\n onClick={() => setOffset(offset + limit)}\n disabled={offset + limit >= total}\n className=\"px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors\"\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </section>\n </div>\n );\n}\n\n// ============================================================================\n// BlogPostPage\n// ============================================================================\n\nexport function BlogPostPage(props: BlogPostPageProps) {\n const {\n productName,\n blogListUrl = \"/blog\",\n backLabel = \"Back to Blog\",\n className = \"\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n\n const [post, setPost] = useState<ContentPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // Get slug from URL\n const slug =\n typeof window !== \"undefined\"\n ? window.location.pathname.split(\"/\").pop() || \"\"\n : \"\";\n\n useEffect(() => {\n if (!slug || !resolvedProductId) return;\n\n async function fetchPost() {\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPage: ContentPageData | null;\n }>(BLOG_POST_QUERY, {\n slug,\n productId: resolvedProductId,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load post\");\n return;\n }\n\n setPost(result.data?.publicContentPage ?? null);\n setError(null);\n } catch {\n setError(\"Failed to load blog post\");\n } finally {\n setLoading(false);\n }\n }\n\n fetchPost();\n }, [client, slug, resolvedProductId]);\n\n if (loading) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-24\">\n <div className=\"animate-pulse space-y-6\">\n <div className=\"h-8 bg-muted rounded w-2/3\" />\n <div className=\"h-4 bg-muted rounded w-1/3\" />\n <div className=\"aspect-[16/9] bg-muted rounded-xl\" />\n <div className=\"space-y-3\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-4 bg-muted rounded\" />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (error || !post) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-24 text-center\">\n <h1 className=\"text-2xl font-bold mb-4\">Post not found</h1>\n <p className=\"text-muted-foreground mb-6\">\n {error || \"This blog post doesn't exist or has been removed.\"}\n </p>\n <a\n href={blogListUrl}\n className=\"text-primary hover:underline font-medium\"\n >\n ← {backLabel}\n </a>\n </div>\n </div>\n );\n }\n\n const date = post.publishedAt || post.lastUpdated;\n const formattedDate = date\n ? new Date(date).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })\n : \"\";\n\n return (\n <div className={`w-full ${className}`}>\n <PageHead\n title={post.seoTitle || post.title}\n description={post.seoDescription || post.excerpt || \"\"}\n productName={productName}\n keywords={post.seoKeywords || \"\"}\n image={post.thumbnail || undefined}\n url={typeof window !== \"undefined\" ? window.location.origin + window.location.pathname : undefined}\n />\n\n <article className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-16 sm:py-20\">\n {/* Back link */}\n <a\n href={blogListUrl}\n className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground mb-8 transition-colors\"\n >\n ← {backLabel}\n </a>\n\n {/* Category */}\n {post.category && (\n <span className=\"inline-block text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-4\">\n {post.category}\n </span>\n )}\n\n {/* Title */}\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground mb-4\">\n {post.title}\n </h1>\n\n {/* Meta */}\n <div className=\"flex items-center gap-3 text-sm text-muted-foreground mb-8\">\n {post.author && (\n <span className=\"font-medium text-foreground\">{post.author}</span>\n )}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n )}\n </div>\n\n {/* Hero image */}\n {post.thumbnail && (\n <div className=\"aspect-[16/9] rounded-xl overflow-hidden mb-10\">\n <img\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full object-cover\"\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"prose prose-gray dark:prose-invert max-w-none\">\n <ContentRenderer content={post.content} format={post.contentFormat} />\n </div>\n </article>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Case Studies Components\n *\n * CMS-powered case-study list and detail pages. Data is sourced from the\n * global tenant service — ProductContentPage records tagged \"case-study\" —\n * exactly like the blog and changelog, so the three stay on the same data path.\n *\n * The list page is designed to shine in BOTH states:\n * - When a product has published stories: a modern, interactive gallery with a\n * featured spotlight, category filtering, and hover-lift cards.\n * - When a product has none yet (the common case for a newly launched\n * product): a warm, professional \"no stories yet\" state that frames the\n * product as early-and-growing and invites the visitor to get in touch —\n * never a dead end, never fabricated traction.\n *\n * `data-cs=\"case-studies-v2\"` on the root is an intentional, minify-safe marker\n * used to confirm which published SDK artifact actually contains this design.\n *\n * @example\n * ```tsx\n * import { CaseStudiesListPage, CaseStudyPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/case-studies\" element={<CaseStudiesListPage productName=\"VibeControls\" />} />\n * <Route path=\"/case-studies/:slug\" element={<CaseStudyPage productName=\"VibeControls\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback, useMemo } from \"react\";\n\nimport { ContentRenderer } from \"./content-provider\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { ContentPageData, ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CaseStudiesListPageProps {\n productName?: string;\n /** Small label above the hero title. Default: \"Customer Stories\". */\n eyebrow?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n caseStudyBasePath?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n /** Where the primary \"get in touch\" CTA points. Default: \"/contact\". */\n contactHref?: string;\n /** Primary CTA label. Default: \"Get in touch\". */\n contactLabel?: string;\n /** Secondary CTA target (shown in the empty state). Default: \"/features\". */\n exploreHref?: string;\n /** Secondary CTA label. Default: \"Explore the product\". */\n exploreLabel?: string;\n /** Heading for the empty state. Falls back to a product-aware default. */\n emptyTitle?: string;\n /** Body copy for the empty state. Falls back to a product-aware default. */\n emptySubtitle?: string;\n}\n\nexport interface CaseStudyPageProps {\n productName?: string;\n caseStudiesListUrl?: string;\n /** Back-link label. Default: \"Back to Case Studies\". */\n backLabel?: string;\n /** Where the closing \"get in touch\" CTA points. Default: \"/contact\". */\n contactHref?: string;\n /** Closing CTA label. Default: \"Get in touch\". */\n contactLabel?: string;\n className?: string;\n}\n\n/** Tag that marks a ProductContentPage as a case study. */\nconst CASE_STUDY_TAG = \"case-study\";\n\n// One-time injected keyframes (scoped class names avoid host collisions).\n// Pure CSS — deliberately no framer-motion (it white-screens under rolldown).\nconst ANIMATION_STYLES = `\n@keyframes csFadeUp { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes csFloat { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-14px); } }\n.cs-fade-up { animation: csFadeUp 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; }\n.cs-float { animation: csFloat 7s ease-in-out infinite; }\n@media (prefers-reduced-motion: reduce) {\n .cs-fade-up, .cs-float { animation: none !important; }\n}\n`;\n\nfunction AnimationStyles() {\n return <style dangerouslySetInnerHTML={{ __html: ANIMATION_STYLES }} />;\n}\n\n// ============================================================================\n// Query\n// ============================================================================\n\nconst CASE_STUDIES_QUERY = `\n query CaseStudies($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n seoDescription\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\nconst CASE_STUDY_QUERY = `\n query CaseStudy($slug: String!, $productId: String) {\n publicContentPage(slug: $slug, productId: $productId) {\n id\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n tags\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n }\n`;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatDate(value?: string | null): string {\n if (!value) return \"\";\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return \"\";\n return d.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n}\n\n/** Thumbnail with graceful placeholder fallback (never a broken-image glyph). */\nfunction Thumbnail({\n src,\n alt,\n className = \"\",\n}: {\n src?: string | null;\n alt: string;\n className?: string;\n}) {\n const [imgError, setImgError] = useState(false);\n if (src && !imgError) {\n return (\n <img\n src={src}\n alt={alt}\n className={className}\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n );\n }\n return (\n <div\n className={`flex items-center justify-center bg-gradient-to-br from-muted/60 to-muted ${className}`}\n aria-hidden=\"true\"\n >\n <svg\n className=\"w-12 h-12 text-muted-foreground/25\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\"\n />\n </svg>\n </div>\n );\n}\n\nfunction MetaRow({\n post,\n className = \"\",\n}: {\n post: ContentPageListItem | ContentPageData;\n className?: string;\n}) {\n const formattedDate = formatDate(post.publishedAt || post.lastUpdated);\n return (\n <div\n className={`flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground ${className}`}\n >\n {post.author && <span className=\"font-medium\">{post.author}</span>}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime ? (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n ) : null}\n </div>\n );\n}\n\n// ============================================================================\n// FeaturedCard — large spotlight for featured case studies\n// ============================================================================\n\nfunction FeaturedCard({\n post,\n basePath,\n}: {\n post: ContentPageListItem;\n basePath: string;\n}) {\n return (\n <a\n href={`${basePath}/${post.slug}`}\n className=\"group relative grid md:grid-cols-2 gap-0 overflow-hidden rounded-2xl border bg-card shadow-sm transition-all duration-300 hover:-translate-y-1 hover:shadow-xl hover:border-primary/40\"\n >\n <div className=\"relative aspect-[16/10] md:aspect-auto md:h-full overflow-hidden\">\n <Thumbnail\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full min-h-[220px] object-cover transition-transform duration-500 group-hover:scale-[1.04]\"\n />\n <span className=\"absolute top-4 left-4 inline-flex items-center gap-1 rounded-full bg-primary px-2.5 py-1 text-xs font-semibold text-primary-foreground shadow-sm\">\n <svg\n className=\"h-3 w-3\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.286 3.957a1 1 0 00.95.69h4.162c.969 0 1.371 1.24.588 1.81l-3.368 2.447a1 1 0 00-.364 1.118l1.287 3.957c.3.921-.755 1.688-1.54 1.118l-3.367-2.447a1 1 0 00-1.176 0l-3.367 2.447c-.784.57-1.838-.197-1.539-1.118l1.286-3.957a1 1 0 00-.363-1.118L2.98 9.384c-.783-.57-.38-1.81.588-1.81h4.162a1 1 0 00.95-.69l1.286-3.957z\" />\n </svg>\n Featured\n </span>\n </div>\n <div className=\"flex flex-col justify-center p-6 sm:p-8\">\n {post.category && (\n <span className=\"mb-3 inline-block w-fit rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary\">\n {post.category}\n </span>\n )}\n <h3 className=\"text-xl sm:text-2xl font-bold text-foreground transition-colors group-hover:text-primary line-clamp-3\">\n {post.title}\n </h3>\n <p className=\"mt-3 text-sm sm:text-base text-muted-foreground line-clamp-3\">\n {post.excerpt || post.seoDescription || \"\"}\n </p>\n <MetaRow post={post} className=\"mt-5\" />\n <span className=\"mt-5 inline-flex items-center gap-1 text-sm font-semibold text-primary\">\n Read the story\n <svg\n className=\"h-4 w-4 transition-transform duration-300 group-hover:translate-x-1\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 4.293a1 1 0 011.414 0l5 5a1 1 0 010 1.414l-5 5a1 1 0 01-1.414-1.414L11.586 10 7.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </span>\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// CaseStudyCard — standard grid card\n// ============================================================================\n\nfunction CaseStudyCard({\n post,\n basePath = \"/case-studies\",\n}: {\n post: ContentPageListItem;\n basePath?: string;\n}) {\n return (\n <a\n href={`${basePath}/${post.slug}`}\n className=\"group flex flex-col overflow-hidden rounded-xl border bg-card transition-all duration-300 hover:-translate-y-1 hover:shadow-lg hover:border-primary/40\"\n >\n <div className=\"aspect-[16/9] overflow-hidden\">\n <Thumbnail\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full object-cover transition-transform duration-500 group-hover:scale-105\"\n />\n </div>\n\n <div className=\"flex flex-1 flex-col p-5 sm:p-6\">\n {post.category && (\n <span className=\"mb-3 inline-block w-fit rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary\">\n {post.category}\n </span>\n )}\n <h3 className=\"mb-2 text-lg font-semibold text-foreground transition-colors group-hover:text-primary line-clamp-2\">\n {post.title}\n </h3>\n <p className=\"mb-4 text-sm text-muted-foreground line-clamp-3\">\n {post.excerpt || post.seoDescription || \"\"}\n </p>\n <MetaRow post={post} className=\"mt-auto\" />\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// EmptyState — warm, professional \"no stories yet\" experience\n// ============================================================================\n\nfunction EmptyState({\n productLabel,\n title,\n subtitle,\n contactHref,\n contactLabel,\n exploreHref,\n exploreLabel,\n}: {\n productLabel: string;\n title: string;\n subtitle: string;\n contactHref: string;\n contactLabel: string;\n exploreHref: string;\n exploreLabel: string;\n}) {\n const highlights = [\n {\n title: \"Real outcomes, real teams\",\n body: `We're partnering with our earliest adopters right now. As they ship results with ${productLabel}, their stories will land here — measured and unembellished.`,\n icon: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z\"\n />\n ),\n },\n {\n title: \"See it on your use case\",\n body: `Want to know how ${productLabel} would work for your team? We'll walk you through exactly what to expect — no pitch, just specifics.`,\n icon: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n ),\n },\n {\n title: \"Be the first story\",\n body: `Building something with ${productLabel} worth talking about? Tell us — the best early stories become the case studies featured on this page.`,\n icon: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.562.562 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.562.562 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\"\n />\n ),\n },\n ];\n\n return (\n <div className=\"cs-fade-up mx-auto max-w-4xl\">\n <div className=\"relative overflow-hidden rounded-3xl border bg-card px-6 py-14 text-center sm:px-12 sm:py-16\">\n {/* Decorative, token-based backdrop */}\n <div\n className=\"pointer-events-none absolute -top-24 -right-16 h-64 w-64 rounded-full bg-primary/10 blur-3xl\"\n aria-hidden=\"true\"\n />\n <div\n className=\"pointer-events-none absolute -bottom-24 -left-16 h-64 w-64 rounded-full bg-primary/5 blur-3xl\"\n aria-hidden=\"true\"\n />\n\n <div className=\"relative\">\n <div className=\"cs-float mx-auto flex h-20 w-20 items-center justify-center rounded-2xl bg-primary/10 text-primary ring-1 ring-primary/20\">\n <svg\n className=\"h-10 w-10\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n </div>\n\n <h2 className=\"mt-8 text-2xl font-bold tracking-tight text-foreground sm:text-3xl\">\n {title}\n </h2>\n <p className=\"mx-auto mt-4 max-w-2xl text-base leading-relaxed text-muted-foreground sm:text-lg\">\n {subtitle}\n </p>\n\n <div className=\"mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row\">\n <a\n href={contactHref}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md sm:w-auto\"\n >\n {contactLabel}\n <svg\n className=\"h-4 w-4\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 4.293a1 1 0 011.414 0l5 5a1 1 0 010 1.414l-5 5a1 1 0 01-1.414-1.414L11.586 10 7.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </a>\n <a\n href={exploreHref}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lg border border-border bg-background px-6 py-3 text-sm font-semibold text-foreground transition-colors hover:bg-muted sm:w-auto\"\n >\n {exploreLabel}\n </a>\n </div>\n </div>\n </div>\n\n {/* Supporting trio */}\n <div className=\"mt-8 grid gap-4 sm:grid-cols-3\">\n {highlights.map((h) => (\n <div\n key={h.title}\n className=\"rounded-2xl border bg-card/60 p-5 text-left transition-colors hover:border-primary/30\"\n >\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <svg\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n {h.icon}\n </svg>\n </div>\n <h3 className=\"mt-4 text-sm font-semibold text-foreground\">\n {h.title}\n </h3>\n <p className=\"mt-1.5 text-sm leading-relaxed text-muted-foreground\">\n {h.body}\n </p>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// CaseStudiesListPage\n// ============================================================================\n\nexport function CaseStudiesListPage(props: CaseStudiesListPageProps) {\n const {\n productName,\n eyebrow = \"Customer Stories\",\n heroTitle = \"Case Studies\",\n heroSubtitle = \"Real-world stories of teams building with our platform.\",\n caseStudyBasePath = \"/case-studies\",\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n contactHref = \"/contact\",\n contactLabel = \"Get in touch\",\n exploreHref = \"/features\",\n exploreLabel = \"Explore the product\",\n emptyTitle,\n emptySubtitle,\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const productLabel = product?.name || productName || \"our platform\";\n\n const [posts, setPosts] = useState<ContentPageListItem[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [offset, setOffset] = useState(0);\n const [activeCategory, setActiveCategory] = useState<string>(\"All\");\n const limit = 12;\n\n const fetchPosts = useCallback(async () => {\n if (!resolvedProductId) return;\n\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n };\n }>(CASE_STUDIES_QUERY, {\n productId: resolvedProductId,\n limit,\n offset,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load case studies\");\n setPosts([]);\n return;\n }\n\n // Filter to only case-study-tagged pages\n const caseStudies = (result.data?.publicContentPages?.items || []).filter(\n (p) => p.tags?.includes(CASE_STUDY_TAG),\n );\n\n setPosts(caseStudies);\n setTotal(result.data?.publicContentPages?.total || 0);\n setError(null);\n } catch {\n // A visitor should never see a raw error on a marketing page — fall\n // through to the encouraging empty state instead of a dead end.\n setError(\"load-failed\");\n setPosts([]);\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, offset]);\n\n useEffect(() => {\n fetchPosts();\n }, [fetchPosts]);\n\n // Distinct categories for the interactive filter (only meaningful with data).\n const categories = useMemo(() => {\n const set = new Set<string>();\n posts.forEach((p) => {\n if (p.category) set.add(p.category);\n });\n return [\"All\", ...Array.from(set)];\n }, [posts]);\n\n const visiblePosts = useMemo(() => {\n if (activeCategory === \"All\") return posts;\n return posts.filter((p) => p.category === activeCategory);\n }, [posts, activeCategory]);\n\n const featuredPosts = visiblePosts.filter((p) => p.featured);\n const regularPosts = visiblePosts.filter((p) => !p.featured);\n\n const hasContent = !loading && !error && posts.length > 0;\n const showEmpty = !loading && (error !== null || posts.length === 0);\n\n const resolvedEmptyTitle = emptyTitle ?? \"Case studies are on the way\";\n const resolvedEmptySubtitle =\n emptySubtitle ??\n `${productLabel} is early in its journey, and we'd rather show you real, measurable results than filler. We're working closely with our first teams now — their stories will be published here soon. In the meantime, we'd love to show you what's possible.`;\n\n return (\n <div className={`w-full ${className}`} data-cs=\"case-studies-v2\">\n <AnimationStyles />\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n />\n )}\n\n {/* Hero */}\n <section className=\"relative overflow-hidden\">\n <div\n className=\"pointer-events-none absolute inset-x-0 -top-32 mx-auto h-72 max-w-3xl rounded-full bg-primary/10 blur-3xl\"\n aria-hidden=\"true\"\n />\n <div className=\"relative mx-auto max-w-7xl px-4 py-16 sm:px-6 sm:py-20 md:py-24 lg:px-8\">\n <div className=\"mx-auto max-w-3xl text-center\">\n <span className=\"inline-flex items-center gap-2 rounded-full border border-primary/20 bg-primary/10 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-primary\">\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary\" />\n {eyebrow}\n </span>\n <h1 className=\"mt-5 text-3xl font-bold tracking-tight text-foreground sm:text-4xl md:text-5xl\">\n {heroTitle}\n </h1>\n <p className=\"mt-4 text-lg text-muted-foreground\">{heroSubtitle}</p>\n </div>\n </div>\n </section>\n\n {/* Body */}\n <section className=\"pb-20 sm:pb-24\">\n <div className=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8\">\n {loading ? (\n <div className=\"grid gap-6 sm:gap-8 md:grid-cols-2 lg:grid-cols-3\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"overflow-hidden rounded-xl border bg-card animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"space-y-3 p-6\">\n <div className=\"h-4 w-1/4 rounded bg-muted\" />\n <div className=\"h-6 w-3/4 rounded bg-muted\" />\n <div className=\"h-4 rounded bg-muted\" />\n <div className=\"h-4 w-1/2 rounded bg-muted\" />\n </div>\n </div>\n ))}\n </div>\n ) : showEmpty ? (\n <EmptyState\n productLabel={productLabel}\n title={resolvedEmptyTitle}\n subtitle={resolvedEmptySubtitle}\n contactHref={contactHref}\n contactLabel={contactLabel}\n exploreHref={exploreHref}\n exploreLabel={exploreLabel}\n />\n ) : hasContent ? (\n <>\n {/* Interactive category filter */}\n {categories.length > 2 && (\n <div className=\"mb-10 flex flex-wrap justify-center gap-2\">\n {categories.map((cat) => (\n <button\n key={cat}\n type=\"button\"\n onClick={() => setActiveCategory(cat)}\n className={`rounded-full border px-4 py-1.5 text-sm font-medium transition-colors ${\n activeCategory === cat\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-border bg-background text-muted-foreground hover:border-primary/40 hover:text-foreground\"\n }`}\n >\n {cat}\n </button>\n ))}\n </div>\n )}\n\n {/* Featured spotlight */}\n {featuredPosts.length > 0 && (\n <div className=\"mb-10 grid gap-6 sm:gap-8 lg:grid-cols-2\">\n {featuredPosts.map((post) => (\n <FeaturedCard\n key={post.id}\n post={post}\n basePath={caseStudyBasePath}\n />\n ))}\n </div>\n )}\n\n {/* Regular grid */}\n {regularPosts.length > 0 && (\n <div className=\"grid gap-6 sm:gap-8 md:grid-cols-2 lg:grid-cols-3\">\n {regularPosts.map((post) => (\n <CaseStudyCard\n key={post.id}\n post={post}\n basePath={caseStudyBasePath}\n />\n ))}\n </div>\n )}\n\n {/* Pagination (only for the full, unfiltered set) */}\n {activeCategory === \"All\" && total > limit && (\n <div className=\"mt-14 flex justify-center gap-4\">\n <button\n onClick={() => setOffset(Math.max(0, offset - limit))}\n disabled={offset === 0}\n className=\"rounded-lg border px-5 py-2.5 text-sm font-medium transition-colors hover:bg-muted disabled:opacity-40\"\n >\n Previous\n </button>\n <button\n onClick={() => setOffset(offset + limit)}\n disabled={offset + limit >= total}\n className=\"rounded-lg border px-5 py-2.5 text-sm font-medium transition-colors hover:bg-muted disabled:opacity-40\"\n >\n Next\n </button>\n </div>\n )}\n\n {/* Closing CTA band */}\n <div className=\"mt-16 overflow-hidden rounded-2xl border bg-gradient-to-br from-primary/10 via-card to-card p-8 text-center sm:p-10\">\n <h2 className=\"text-xl font-bold text-foreground sm:text-2xl\">\n Want results like these?\n </h2>\n <p className=\"mx-auto mt-2 max-w-xl text-sm text-muted-foreground sm:text-base\">\n Tell us about your goals and we’ll show you exactly how{\" \"}\n {productLabel} can help.\n </p>\n <a\n href={contactHref}\n className=\"mt-6 inline-flex items-center justify-center gap-2 rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md\"\n >\n {contactLabel}\n </a>\n </div>\n </>\n ) : null}\n </div>\n </section>\n </div>\n );\n}\n\n// ============================================================================\n// CaseStudyPage (detail)\n// ============================================================================\n\nexport function CaseStudyPage(props: CaseStudyPageProps) {\n const {\n productName,\n caseStudiesListUrl = \"/case-studies\",\n backLabel = \"Back to Case Studies\",\n contactHref = \"/contact\",\n contactLabel = \"Get in touch\",\n className = \"\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const productLabel = product?.name || productName || \"our team\";\n\n const [post, setPost] = useState<ContentPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // Get slug from URL\n const slug =\n typeof window !== \"undefined\"\n ? window.location.pathname.split(\"/\").pop() || \"\"\n : \"\";\n\n useEffect(() => {\n if (!slug || !resolvedProductId) return;\n\n async function fetchPost() {\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPage: ContentPageData | null;\n }>(CASE_STUDY_QUERY, {\n slug,\n productId: resolvedProductId,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load case study\");\n return;\n }\n\n setPost(result.data?.publicContentPage ?? null);\n setError(null);\n } catch {\n setError(\"Failed to load case study\");\n } finally {\n setLoading(false);\n }\n }\n\n fetchPost();\n }, [client, slug, resolvedProductId]);\n\n if (loading) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"mx-auto max-w-4xl px-4 py-24 sm:px-6 lg:px-8\">\n <div className=\"animate-pulse space-y-6\">\n <div className=\"h-8 w-2/3 rounded bg-muted\" />\n <div className=\"h-4 w-1/3 rounded bg-muted\" />\n <div className=\"aspect-[16/9] rounded-xl bg-muted\" />\n <div className=\"space-y-3\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-4 rounded bg-muted\" />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (error || !post) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"mx-auto max-w-2xl px-4 py-24 text-center sm:px-6 lg:px-8\">\n <div className=\"mx-auto flex h-16 w-16 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <svg\n className=\"h-8 w-8\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\"\n />\n </svg>\n </div>\n <h1 className=\"mt-6 text-2xl font-bold text-foreground\">\n Case study not found\n </h1>\n <p className=\"mx-auto mt-3 max-w-md text-muted-foreground\">\n This story isn’t available yet — but there’s plenty more to explore,\n and we’re always happy to talk through what {productLabel} can do.\n </p>\n <div className=\"mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row\">\n <a\n href={caseStudiesListUrl}\n className=\"inline-flex items-center justify-center rounded-lg border px-5 py-2.5 text-sm font-semibold text-foreground transition-colors hover:bg-muted\"\n >\n ← {backLabel}\n </a>\n <a\n href={contactHref}\n className=\"inline-flex items-center justify-center rounded-lg bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground transition-all hover:opacity-90\"\n >\n {contactLabel}\n </a>\n </div>\n </div>\n </div>\n );\n }\n\n const formattedDate = formatDate(post.publishedAt || post.lastUpdated);\n\n return (\n <div className={`w-full ${className}`}>\n <PageHead\n title={post.seoTitle || post.title}\n description={post.seoDescription || post.excerpt || \"\"}\n productName={productName}\n keywords={post.seoKeywords || \"\"}\n />\n\n <article className=\"mx-auto max-w-4xl px-4 py-16 sm:px-6 sm:py-20 lg:px-8\">\n {/* Back link */}\n <a\n href={caseStudiesListUrl}\n className=\"mb-8 inline-flex items-center gap-1 text-sm text-muted-foreground transition-colors hover:text-foreground\"\n >\n ← {backLabel}\n </a>\n\n {/* Category */}\n {post.category && (\n <span className=\"mb-4 inline-block rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary\">\n {post.category}\n </span>\n )}\n\n {/* Title */}\n <h1 className=\"mb-4 text-3xl font-bold tracking-tight text-foreground sm:text-4xl md:text-5xl\">\n {post.title}\n </h1>\n\n {/* Meta */}\n <div className=\"mb-8 flex flex-wrap items-center gap-3 text-sm text-muted-foreground\">\n {post.author && (\n <span className=\"font-medium text-foreground\">{post.author}</span>\n )}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime ? (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n ) : null}\n </div>\n\n {/* Hero image */}\n {post.thumbnail && (\n <div className=\"mb-10 aspect-[16/9] overflow-hidden rounded-xl\">\n <img\n src={post.thumbnail}\n alt={post.title}\n className=\"h-full w-full object-cover\"\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"prose prose-gray max-w-none dark:prose-invert\">\n <ContentRenderer content={post.content} format={post.contentFormat} />\n </div>\n\n {/* Closing CTA */}\n <div className=\"mt-14 rounded-2xl border bg-gradient-to-br from-primary/10 via-card to-card p-8 text-center\">\n <h2 className=\"text-xl font-bold text-foreground\">\n Curious what {productLabel} could do for you?\n </h2>\n <p className=\"mx-auto mt-2 max-w-lg text-sm text-muted-foreground\">\n We’re happy to walk you through it — no pressure, just a\n conversation about your goals.\n </p>\n <a\n href={contactHref}\n className=\"mt-6 inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md\"\n >\n {contactLabel}\n </a>\n </div>\n </article>\n </div>\n );\n}\n","/**\n * Utility function to merge Tailwind CSS classes\n * Combines clsx and tailwind-merge for optimal class handling\n */\n\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge multiple class names intelligently\n * - Handles conditional classes via clsx\n * - Deduplicates and resolves Tailwind conflicts via tailwind-merge\n *\n * @example\n * ```ts\n * cn('px-4 py-2', 'bg-blue-500', { 'text-white': isActive })\n * // => 'px-4 py-2 bg-blue-500 text-white' (if isActive is true)\n * ```\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils/cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"../utils/cn\";\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","\"use client\";\n\n/**\n * Changelog Component\n *\n * CMS-powered changelog. Sources ProductContentPage records tagged \"changelog\"\n * and renders them as a newest-first version timeline (hero + version cards +\n * optional CTA). Each entry's markdown body is rendered inline. Replaces the\n * older per-site static `data/changelog.ts` arrays so releases are managed in\n * the product CMS instead of code.\n *\n * Also supports a prop-driven mode via the `entries` prop for sites that want\n * to source changelog data locally or from another provider. In that mode the\n * component adds search, category filters, and pagination on top of the\n * timeline UI.\n *\n * @example\n * ```tsx\n * import { ChangelogPage } from '@burdenoff/website-sdk'\n *\n * // CMS-powered\n * <Route path=\"/changelog\" element={<ChangelogPage productName=\"VibeControls\" />} />\n *\n * // Prop-driven\n * <ChangelogPage\n * productName=\"VibeControls\"\n * entries={[...]}\n * pageSize={10}\n * />\n * ```\n */\n\nimport { useState, useEffect, useCallback, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { Search, History, ChevronLeft, ChevronRight } from \"lucide-react\";\n\nimport { ContentRenderer } from \"./content-provider\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { cn } from \"../utils/cn\";\n\nimport type { ContentPageData, ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ChangelogEntry {\n /** Release date as an ISO string. */\n date: string;\n /** Version identifier, e.g. \"1.2.0\". */\n version: string;\n /** Entry headline. */\n title: string;\n /** Category used for filtering, e.g. \"feature\", \"fix\", \"improvement\". */\n category: string;\n /** Entry body — plain text, markdown, or a React node. */\n content: ReactNode | string;\n /** Optional tags for search and filtering. */\n tags?: string[];\n}\n\nexport interface ChangelogPageProps {\n productName?: string;\n heroEyebrow?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n /** Optional bottom CTA. Rendered only when ctaHref + ctaLabel are provided. */\n ctaTitle?: string;\n ctaSubtitle?: string;\n ctaHref?: string;\n ctaLabel?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n /**\n * Optional prop-driven entries. When provided, the component skips the CMS\n * fetch and renders these entries with search, category filters, and\n * pagination.\n */\n entries?: ChangelogEntry[];\n /** Number of entries per page in prop-driven mode. Defaults to 10. */\n pageSize?: number;\n}\n\n/** A list item plus its resolved full body. */\ninterface ResolvedChangelogEntry extends ContentPageListItem {\n content?: string;\n contentFormat?: string;\n}\n\n// ============================================================================\n// Queries\n// ============================================================================\n\n/** Tag that marks a ProductContentPage as a changelog entry. */\nconst CHANGELOG_TAG = \"changelog\";\n\nconst CHANGELOG_LIST_QUERY = `\n query ChangelogList($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n excerpt\n seoDescription\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\nconst CHANGELOG_ENTRY_QUERY = `\n query ChangelogEntry($slug: String!, $productId: String) {\n publicContentPage(slug: $slug, productId: $productId) {\n content\n contentFormat\n }\n }\n`;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatDate(value?: string | null): string {\n if (!value) return \"\";\n return new Date(value).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n}\n\nfunction sortByDateDesc(\n a: ResolvedChangelogEntry,\n b: ResolvedChangelogEntry,\n): number {\n const da = new Date(a.publishedAt || a.lastUpdated || 0).getTime();\n const db = new Date(b.publishedAt || b.lastUpdated || 0).getTime();\n return db - da;\n}\n\nfunction normalize(value: string): string {\n return value.toLowerCase().trim();\n}\n\nfunction paginate<T>(items: T[], page: number, pageSize: number): T[] {\n const start = (page - 1) * pageSize;\n return items.slice(start, start + pageSize);\n}\n\nfunction parseEntryDate(date: string): number {\n return new Date(date).getTime();\n}\n\n// ============================================================================\n// CMS-Powered Changelog\n// ============================================================================\n\nfunction useCmsChangelog() {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n\n const [entries, setEntries] = useState<ResolvedChangelogEntry[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchEntries = useCallback(async () => {\n if (!resolvedProductId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n try {\n const listResult = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n };\n }>(CHANGELOG_LIST_QUERY, {\n productId: resolvedProductId,\n limit: 50,\n offset: 0,\n });\n\n if (listResult.errors?.length) {\n setError(listResult.errors[0]?.message ?? \"Failed to load changelog\");\n return;\n }\n\n const changelogItems = (listResult.data?.publicContentPages?.items || [])\n .filter((p) => p.tags?.includes(CHANGELOG_TAG))\n .sort(sortByDateDesc);\n\n // Resolve each entry's full markdown body (list items omit `content`).\n const resolved = await Promise.all(\n changelogItems.map(async (item) => {\n try {\n const detail = await client.query<{\n publicContentPage: Pick<\n ContentPageData,\n \"content\" | \"contentFormat\"\n > | null;\n }>(CHANGELOG_ENTRY_QUERY, {\n slug: item.slug,\n productId: resolvedProductId,\n });\n const page = detail.data?.publicContentPage;\n return {\n ...item,\n content: page?.content,\n contentFormat: page?.contentFormat,\n } as ResolvedChangelogEntry;\n } catch {\n return { ...item } as ResolvedChangelogEntry;\n }\n }),\n );\n\n setEntries(resolved);\n setError(null);\n } catch {\n setError(\"Failed to load changelog\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId]);\n\n useEffect(() => {\n fetchEntries();\n }, [fetchEntries]);\n\n return { entries, loading, error };\n}\n\nfunction CmsTimeline(props: {\n entries: ResolvedChangelogEntry[];\n loading: boolean;\n error: string | null;\n}) {\n const { entries, loading, error } = props;\n\n if (loading) {\n return (\n <div className=\"max-w-3xl mx-auto space-y-12\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"rounded-2xl border border-border/40 bg-card overflow-hidden animate-pulse\"\n >\n <div className=\"p-6 sm:p-8 space-y-4\">\n <div className=\"h-3 bg-muted rounded w-1/3\" />\n <div className=\"h-6 bg-muted rounded w-2/3\" />\n <div className=\"h-4 bg-muted rounded\" />\n <div className=\"h-4 bg-muted rounded w-5/6\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">{error}</p>\n </div>\n );\n }\n\n if (entries.length === 0) {\n return (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No changelog entries yet. Check back soon!\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"max-w-3xl mx-auto space-y-12\">\n {entries.map((entry) => (\n <article\n key={entry.id}\n id={entry.slug}\n className=\"rounded-2xl border border-border/40 bg-card overflow-hidden scroll-mt-24\"\n >\n {entry.thumbnail && (\n <img\n src={entry.thumbnail}\n alt=\"\"\n width={1024}\n height={576}\n loading=\"lazy\"\n decoding=\"async\"\n className=\"w-full aspect-video object-cover border-b border-border/40\"\n />\n )}\n <div className=\"p-6 sm:p-8\">\n <p className=\"text-xs text-muted-foreground mb-2\">\n {entry.publishedAt && (\n <time dateTime={entry.publishedAt}>\n {formatDate(entry.publishedAt || entry.lastUpdated)}\n </time>\n )}\n {entry.author && (\n <>\n {\" · \"}\n {entry.author}\n </>\n )}\n </p>\n <h2 className=\"text-xl sm:text-2xl font-bold text-foreground mb-4\">\n {entry.title}\n </h2>\n {entry.content ? (\n <div className=\"prose prose-sm prose-gray dark:prose-invert max-w-none\">\n <ContentRenderer\n content={entry.content}\n format={entry.contentFormat}\n />\n </div>\n ) : (\n entry.excerpt && (\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {entry.excerpt}\n </p>\n )\n )}\n </div>\n </article>\n ))}\n </div>\n );\n}\n\n// ============================================================================\n// Prop-Driven Changelog\n// ============================================================================\n\nfunction EntryContent({ content }: { content: ReactNode | string }) {\n if (typeof content === \"string\") {\n return (\n <div className=\"prose prose-sm prose-gray dark:prose-invert max-w-none\">\n <ContentRenderer content={content} format=\"markdown\" />\n </div>\n );\n }\n return <div className=\"prose prose-sm max-w-none\">{content}</div>;\n}\n\nfunction EntriesTimeline(props: {\n entries: ChangelogEntry[];\n pageSize: number;\n productName?: string;\n}) {\n const { entries, pageSize, productName } = props;\n const [query, setQuery] = useState(\"\");\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [page, setPage] = useState(1);\n\n const categories = useMemo(\n () => Array.from(new Set(entries.map((e) => e.category))).sort(),\n [entries],\n );\n\n const filtered = useMemo(() => {\n const normalized = normalize(query);\n return entries\n .filter((entry) => {\n if (selectedCategory && entry.category !== selectedCategory) {\n return false;\n }\n if (!normalized) return true;\n const haystack = [\n entry.title,\n entry.version,\n entry.category,\n ...(entry.tags ?? []),\n typeof entry.content === \"string\" ? entry.content : \"\",\n ]\n .join(\" \")\n .toLowerCase();\n return haystack.includes(normalized);\n })\n .sort((a, b) => parseEntryDate(b.date) - parseEntryDate(a.date));\n }, [entries, query, selectedCategory]);\n\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const safePage = Math.min(page, totalPages);\n const pageItems = paginate(filtered, safePage, pageSize);\n\n // Reset to first page when filters change.\n useEffect(() => {\n setPage(1);\n }, [query, selectedCategory]);\n\n if (entries.length === 0) {\n return (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No changelog entries yet. Check back soon!\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"max-w-3xl mx-auto\">\n {/* Controls */}\n <div className=\"mb-8 space-y-4\">\n <div className=\"relative\">\n <Search\n className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n <Input\n type=\"search\"\n placeholder=\"Search releases, features, fixes…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"pl-9\"\n aria-label=\"Search changelog\"\n />\n </div>\n\n {categories.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n onClick={() => setSelectedCategory(null)}\n className={cn(\n \"px-3 py-1 rounded-full text-xs font-medium border transition-colors\",\n selectedCategory === null\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground border-border/60 hover:border-primary/40\",\n )}\n >\n All\n </button>\n {categories.map((category) => (\n <button\n key={category}\n type=\"button\"\n onClick={() => setSelectedCategory(category)}\n className={cn(\n \"px-3 py-1 rounded-full text-xs font-medium border transition-colors\",\n selectedCategory === category\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground border-border/60 hover:border-primary/40\",\n )}\n >\n {category}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Timeline */}\n <div className=\"relative\">\n {/* Vertical timeline line */}\n <div\n className=\"absolute left-[1.125rem] top-3 bottom-3 w-px bg-border/60 hidden sm:block\"\n aria-hidden=\"true\"\n />\n\n <div className=\"space-y-8\">\n {pageItems.map((entry) => (\n <article\n key={`${entry.version}-${entry.date}`}\n className=\"relative sm:pl-12\"\n >\n {/* Timeline dot */}\n <div\n className=\"hidden sm:flex absolute left-2 top-2 h-5 w-5 items-center justify-center rounded-full border-2 border-background bg-primary ring-1 ring-border/40\"\n aria-hidden=\"true\"\n >\n <span className=\"h-2 w-2 rounded-full bg-primary-foreground\" />\n </div>\n\n <div className=\"rounded-2xl border border-border/40 bg-card overflow-hidden\">\n <div className=\"p-6 sm:p-8\">\n <div className=\"flex flex-wrap items-center gap-2 mb-3\">\n <span className=\"inline-flex items-center rounded-md bg-primary/10 px-2 py-1 text-xs font-medium text-primary\">\n {entry.category}\n </span>\n <span className=\"inline-flex items-center rounded-md bg-muted px-2 py-1 text-xs font-mono font-medium text-muted-foreground\">\n v{entry.version}\n </span>\n <time\n className=\"text-xs text-muted-foreground\"\n dateTime={entry.date}\n >\n {formatDate(entry.date)}\n </time>\n </div>\n\n {entry.tags && entry.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mb-3\">\n {entry.tags.map((tag) => (\n <span\n key={tag}\n className=\"text-[10px] uppercase tracking-wide text-muted-foreground bg-background border border-border/40 px-1.5 py-0.5 rounded\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n\n <h2 className=\"text-xl sm:text-2xl font-bold text-foreground mb-4\">\n {entry.title}\n </h2>\n\n <EntryContent content={entry.content} />\n </div>\n </div>\n </article>\n ))}\n </div>\n </div>\n\n {/* Empty state after filtering */}\n {pageItems.length === 0 && (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No entries match your filters.\n </p>\n </div>\n )}\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"mt-10 flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">\n Page {safePage} of {totalPages} · {filtered.length} entries\n </p>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.max(1, p - 1))}\n disabled={safePage <= 1}\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.min(totalPages, p + 1))}\n disabled={safePage >= totalPages}\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )}\n\n {productName && pageItems.length > 0 && (\n <script type=\"application/ld+json\">\n {JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"ItemList\",\n name: `${productName} Changelog`,\n itemListElement: pageItems.map((entry, index) => ({\n \"@type\": \"ListItem\",\n position: (safePage - 1) * pageSize + index + 1,\n name: entry.title,\n description:\n typeof entry.content === \"string\"\n ? entry.content.slice(0, 200)\n : undefined,\n datePublished: entry.date,\n })),\n })}\n </script>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// ChangelogPage\n// ============================================================================\n\nexport function ChangelogPage(props: ChangelogPageProps) {\n const {\n productName,\n heroEyebrow = \"What's new\",\n heroTitle = \"Changelog\",\n heroSubtitle = \"Platform updates, improvements, and announcements — newest first.\",\n ctaTitle,\n ctaSubtitle,\n ctaHref,\n ctaLabel,\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n entries,\n pageSize = 10,\n } = props;\n\n const { product } = useProduct();\n const resolvedProductName = productName || product?.name;\n const cms = useCmsChangelog();\n const showCta = Boolean(ctaHref && ctaLabel);\n const isPropDriven = entries != null;\n\n return (\n <div className={`w-full ${className}`}>\n <PageHead\n title={seoTitle || heroTitle}\n description={seoDescription || heroSubtitle}\n productName={resolvedProductName}\n keywords={seoKeywords}\n />\n\n {/* Hero */}\n <section className=\"py-16 md:py-20 px-4 sm:px-6 lg:px-8 text-center\">\n <div className=\"max-w-3xl mx-auto\">\n <div className=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-primary/10 border border-primary/20 text-xs font-medium text-primary mb-6\">\n <History className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {heroEyebrow}\n </div>\n <h1 className=\"text-4xl sm:text-5xl font-bold text-foreground mb-4\">\n {heroTitle}\n </h1>\n <p className=\"text-lg text-muted-foreground\">{heroSubtitle}</p>\n </div>\n </section>\n\n {/* Timeline */}\n <section className=\"px-4 sm:px-6 lg:px-8 pb-20\">\n {isPropDriven ? (\n <EntriesTimeline\n entries={entries}\n pageSize={pageSize}\n productName={resolvedProductName}\n />\n ) : (\n <CmsTimeline\n entries={cms.entries}\n loading={cms.loading}\n error={cms.error}\n />\n )}\n </section>\n\n {/* CTA (optional) */}\n {showCta && (\n <section className=\"py-14 px-4 sm:px-6 lg:px-8 bg-primary/5 border-t border-border/40\">\n <div className=\"max-w-2xl mx-auto text-center\">\n {ctaTitle && (\n <h2 className=\"text-2xl font-bold text-foreground mb-3\">\n {ctaTitle}\n </h2>\n )}\n {ctaSubtitle && (\n <p className=\"text-muted-foreground mb-7\">{ctaSubtitle}</p>\n )}\n <a\n href={ctaHref}\n className=\"inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:opacity-90 transition-opacity\"\n >\n {ctaLabel}\n </a>\n </div>\n </section>\n )}\n </div>\n );\n}\n","/**\n * Shared content helpers.\n *\n * Used by the file-download content lists (press kit, contracts, …) so that\n * formatting and download behaviour — and any bug fixes — live in one place.\n */\n\n/** Human-readable byte size (e.g. \"1.2 MB\"); empty string when unknown. */\nexport function formatBytes(bytes?: number | null): string {\n if (bytes == null) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n}\n\n/** Minimal shape needed to derive an extension / trigger a download. */\nexport interface DownloadableFile {\n fileUrl: string;\n fileName?: string | null;\n title?: string | null;\n}\n\n/** Uppercased file extension (e.g. \"PDF\"); \"FILE\" when none can be derived. */\nexport function fileExt(file: DownloadableFile): string {\n const name =\n file.fileName || file.fileUrl.split(\"/\").pop()?.split(\"?\")[0] || \"\";\n const ext = name.split(\".\").pop();\n return ext && ext !== name ? ext.toUpperCase() : \"FILE\";\n}\n\n// The HTML `download` attribute is ignored by browsers for cross-origin URLs\n// (files are served from S3/CDN). To actually save the file we fetch it as a\n// blob and trigger a real save; if that's blocked (CORS / network) we fall\n// back to opening it in a new tab — never worse than before.\nexport async function downloadFile(\n e: { preventDefault: () => void },\n file: DownloadableFile,\n): Promise<void> {\n e.preventDefault();\n const openInTab = () =>\n window.open(file.fileUrl, \"_blank\", \"noopener,noreferrer\");\n const name =\n file.fileName ||\n file.fileUrl.split(\"/\").pop()?.split(\"?\")[0] ||\n file.title ||\n \"download\";\n try {\n const res = await fetch(file.fileUrl, { mode: \"cors\" });\n if (!res.ok) {\n openInTab();\n return;\n }\n const blob = await res.blob();\n const objUrl = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = objUrl;\n a.download = name;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(objUrl);\n } catch {\n openInTab();\n }\n}\n","\"use client\";\n\n/**\n * Press Kit Component\n *\n * CMS-powered public press/media kit. Lists downloadable assets (logos,\n * banners, brochures, documents, brand guides) grouped by category, with a\n * media-contact block. Mirrors the BlogListPage architecture.\n *\n * @example\n * ```tsx\n * import { PressKitPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/press\" element={<PressKitPage productName=\"VibeControls\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport { formatBytes, downloadFile } from \"./utils\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type PressKitAssetCategory =\n | \"LOGO\"\n | \"BANNER\"\n | \"SCREENSHOT\"\n | \"BROCHURE\"\n | \"DOCUMENT\"\n | \"PRESS_RELEASE\"\n | \"BRAND_GUIDE\";\n\nexport interface PressKitAsset {\n id: string;\n category: PressKitAssetCategory;\n title: string;\n slug: string;\n description?: string | null;\n fileUrl: string;\n fileName?: string | null;\n fileSize?: number | null;\n mimeType?: string | null;\n thumbnailUrl?: string | null;\n version?: string | null;\n tags: string[];\n sortOrder: number;\n updatedAt: string;\n}\n\nexport interface PressKitPageProps {\n productName?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n /** Media/press contact email shown in the contact block */\n mediaContactEmail?: string;\n /** Optional URL for a \"Download brand kit\" hero CTA (e.g. a zip asset) */\n brandKitUrl?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n /**\n * Show a \"Press Releases\" section (published content pages tagged\n * \"press\") above the downloadable assets. Self-hides when there are\n * none. Default: true.\n */\n showPressReleases?: boolean;\n /**\n * Base path for press-release detail links — `${basePath}/${slug}`.\n * Default: \"/press\".\n */\n pressReleaseBasePath?: string;\n /** Heading for the press-releases section. Default: \"Press Releases\". */\n pressReleasesTitle?: string;\n}\n\n// ============================================================================\n// Query\n// ============================================================================\n\nconst PRESS_KIT_QUERY = `\n query PublicPressKit($productId: String!, $limit: Int, $offset: Int) {\n publicPressKitAssets(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n category\n title\n slug\n description\n fileUrl\n fileName\n fileSize\n mimeType\n thumbnailUrl\n version\n tags\n sortOrder\n updatedAt\n }\n total\n hasMore\n }\n }\n`;\n\n// Press releases are ProductContentPages with primary tag \"press\"\n// (published + public). publicContentPages already filters to\n// isPublished + visibility=PUBLIC server-side; we filter by tag client-side.\nconst PRESS_RELEASES_QUERY = `\n query PublicPressReleases($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n seoDescription\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\nconst CATEGORY_ORDER: PressKitAssetCategory[] = [\n \"LOGO\",\n \"BANNER\",\n \"SCREENSHOT\",\n \"BRAND_GUIDE\",\n \"BROCHURE\",\n \"DOCUMENT\",\n \"PRESS_RELEASE\",\n];\n\nconst CATEGORY_LABELS: Record<PressKitAssetCategory, string> = {\n LOGO: \"Logos\",\n BANNER: \"Banners\",\n SCREENSHOT: \"Screenshots\",\n BRAND_GUIDE: \"Brand Guides\",\n BROCHURE: \"Brochures\",\n DOCUMENT: \"Documents\",\n PRESS_RELEASE: \"Press Releases\",\n};\n\nfunction isImageAsset(a: PressKitAsset): boolean {\n return (a.mimeType || \"\").startsWith(\"image/\");\n}\n\n// ============================================================================\n// PressKitLightbox — image preview modal (Esc / backdrop / ✕ to close,\n// Download inside). Image assets open this; other types open the file.\n// ============================================================================\n\nfunction PressKitLightbox({\n asset,\n onClose,\n}: {\n asset: PressKitAsset | null;\n onClose: () => void;\n}) {\n useEffect(() => {\n if (!asset) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n const prevOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.body.style.overflow = prevOverflow;\n };\n }, [asset, onClose]);\n\n if (!asset) return null;\n const ext =\n (asset.mimeType || \"file\").split(\"/\").pop()?.toUpperCase() || \"FILE\";\n const size = formatBytes(asset.fileSize);\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`${asset.title} preview`}\n onClick={onClose}\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/80 p-4 sm:p-8\"\n >\n <div\n onClick={(e) => e.stopPropagation()}\n className=\"relative flex max-h-full w-full max-w-4xl flex-col overflow-hidden rounded-xl border bg-card shadow-2xl\"\n >\n <div className=\"flex items-start justify-between gap-4 border-b p-4\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">\n {asset.title}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {ext}\n {size ? ` · ${size}` : \"\"}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close preview\"\n className=\"shrink-0 rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <svg\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"flex flex-1 items-center justify-center overflow-auto bg-muted/20 p-4\">\n <img\n src={asset.fileUrl}\n alt={asset.title}\n className=\"max-h-[70vh] w-auto max-w-full object-contain\"\n />\n </div>\n\n <div className=\"flex justify-end border-t p-4\">\n <a\n href={asset.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download\n onClick={(e) => {\n void downloadFile(e, asset);\n }}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90\"\n >\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Download\n </a>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// AssetCard\n// ============================================================================\n\nfunction AssetCard({\n asset,\n onPreview,\n}: {\n asset: PressKitAsset;\n onPreview?: (a: PressKitAsset) => void;\n}) {\n const date = asset.updatedAt\n ? new Date(asset.updatedAt).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })\n : \"\";\n const ext =\n (asset.mimeType || \"file\").split(\"/\").pop()?.toUpperCase() || \"FILE\";\n const size = formatBytes(asset.fileSize);\n // Dead/unreachable thumbnail URLs (stale data, expired CDN, etc.) must\n // degrade to the placeholder instead of a broken-image glyph.\n const [imgError, setImgError] = useState(false);\n\n const thumb =\n asset.thumbnailUrl && !imgError ? (\n <div className=\"aspect-[16/9] overflow-hidden bg-muted/30\">\n <img\n src={asset.thumbnailUrl}\n alt={asset.title}\n className=\"w-full h-full object-contain group-hover:scale-105 transition-transform duration-300\"\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n </div>\n ) : (\n <div className=\"aspect-[16/9] bg-muted/50 flex items-center justify-center\">\n <svg\n className=\"w-12 h-12 text-muted-foreground/20\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\"\n />\n </svg>\n </div>\n );\n\n return (\n <div className=\"group flex flex-col bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300\">\n {/* Image assets open a preview modal; other types open the file. */}\n {onPreview && isImageAsset(asset) ? (\n <button\n type=\"button\"\n onClick={() => onPreview(asset)}\n aria-label={`Preview ${asset.title}`}\n className=\"block w-full text-left cursor-zoom-in\"\n >\n {thumb}\n </button>\n ) : (\n <a\n href={asset.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Open ${asset.title}`}\n className=\"block\"\n >\n {thumb}\n </a>\n )}\n\n <div className=\"flex flex-col flex-1 p-5\">\n <span className=\"inline-block self-start text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-3\">\n {CATEGORY_LABELS[asset.category] ?? asset.category}\n </span>\n <h3 className=\"text-base font-semibold text-foreground mb-1 line-clamp-2\">\n {asset.title}\n </h3>\n {asset.description && (\n <p className=\"text-sm text-muted-foreground mb-3 line-clamp-2\">\n {asset.description}\n </p>\n )}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">{ext}</span>\n {size && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{size}</span>\n </>\n )}\n {date && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{date}</span>\n </>\n )}\n </div>\n <a\n href={asset.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download\n onClick={(e) => {\n void downloadFile(e, asset);\n }}\n className=\"inline-flex items-center gap-1.5 text-sm font-medium text-primary hover:underline\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Download\n </a>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// PressReleaseCard\n// ============================================================================\n\nfunction PressReleaseCard({\n release,\n basePath,\n}: {\n release: ContentPageListItem;\n basePath: string;\n}) {\n const date = release.publishedAt || release.lastUpdated;\n const formattedDate = date\n ? new Date(date).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })\n : \"\";\n // Dead/unreachable thumbnail → placeholder, never a broken-image glyph.\n const [imgError, setImgError] = useState(false);\n\n return (\n <a\n href={`${basePath}/${release.slug}`}\n className=\"group flex flex-col bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300\"\n >\n {release.thumbnail && !imgError ? (\n <div className=\"aspect-[16/9] overflow-hidden bg-muted/30\">\n <img\n src={release.thumbnail}\n alt={release.title}\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n </div>\n ) : (\n <div className=\"aspect-[16/9] bg-muted/50 flex items-center justify-center\">\n <svg\n className=\"w-12 h-12 text-muted-foreground/20\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m-1 13a2 2 0 01-2-2V7m3 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z\"\n />\n </svg>\n </div>\n )}\n\n <div className=\"flex flex-col flex-1 p-5 sm:p-6\">\n {release.category && (\n <span className=\"inline-block self-start text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-3\">\n {release.category}\n </span>\n )}\n <h3 className=\"text-lg font-semibold text-foreground mb-2 group-hover:text-primary transition-colors line-clamp-2\">\n {release.title}\n </h3>\n <p className=\"text-sm text-muted-foreground mb-4 line-clamp-3\">\n {release.excerpt || release.seoDescription || \"\"}\n </p>\n <div className=\"mt-auto flex items-center gap-3 text-xs text-muted-foreground\">\n {release.author && (\n <span className=\"font-medium\">{release.author}</span>\n )}\n {release.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {release.readingTime ? (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{release.readingTime} min read</span>\n </>\n ) : null}\n </div>\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// PressKitPage\n// ============================================================================\n\nexport function PressKitPage(props: PressKitPageProps) {\n const {\n productName,\n heroTitle = \"Press & Media Kit\",\n heroSubtitle = \"Official logos, brand assets, and media resources. Everything you need to write about us.\",\n mediaContactEmail,\n brandKitUrl,\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n showPressReleases = true,\n pressReleaseBasePath = \"/press\",\n pressReleasesTitle = \"Press Releases\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const contactEmail = mediaContactEmail || product?.contactEmail || undefined;\n\n const [assets, setAssets] = useState<PressKitAsset[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [activeCategory, setActiveCategory] = useState<\n PressKitAssetCategory | \"ALL\"\n >(\"ALL\");\n const [releases, setReleases] = useState<ContentPageListItem[]>([]);\n const [releasesLoading, setReleasesLoading] = useState(true);\n const [preview, setPreview] = useState<PressKitAsset | null>(null);\n\n const fetchAssets = useCallback(async () => {\n if (!resolvedProductId) {\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const PAGE_SIZE = 100;\n // Page through every asset instead of hard-capping at one request —\n // products can have more than a single page — but bound the loop so a\n // stuck `hasMore: true` can't spin into unbounded requests.\n const MAX_PAGES = 10;\n const all: PressKitAsset[] = [];\n let offset = 0;\n for (let pageNum = 0; pageNum < MAX_PAGES; pageNum++) {\n const result = await client.query<{\n publicPressKitAssets: { items: PressKitAsset[]; hasMore: boolean };\n }>(PRESS_KIT_QUERY, {\n productId: resolvedProductId,\n limit: PAGE_SIZE,\n offset,\n });\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load press kit\");\n return;\n }\n const page = result.data?.publicPressKitAssets;\n const items = page?.items || [];\n all.push(...items);\n if (!page?.hasMore || items.length === 0) break;\n offset += PAGE_SIZE;\n }\n setAssets(all);\n setError(null);\n } catch {\n setError(\"Failed to load press kit\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId]);\n\n useEffect(() => {\n fetchAssets();\n }, [fetchAssets]);\n\n // Press releases — published content pages tagged \"press\". Failure here\n // must NOT break the press-kit assets page, so errors are swallowed and\n // the section simply self-hides (releases stays empty).\n const fetchReleases = useCallback(async () => {\n if (!resolvedProductId || !showPressReleases) {\n setReleasesLoading(false);\n return;\n }\n setReleasesLoading(true);\n try {\n const PAGE_SIZE = 100;\n // Safety cap: publicContentPages has no server-side tag filter yet,\n // so this pages through ALL content pages then filters \"press\"\n // client-side. Bound it to avoid a runaway loop (stuck hasMore) and\n // unbounded over-fetch on products with many content pages.\n // TODO(follow-up): add a `tags` arg to publicContentPages and drop this.\n const MAX_PAGES = 10;\n const all: ContentPageListItem[] = [];\n let offset = 0;\n for (let pageNum = 0; pageNum < MAX_PAGES; pageNum++) {\n const result = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n hasMore: boolean;\n };\n }>(PRESS_RELEASES_QUERY, {\n productId: resolvedProductId,\n limit: PAGE_SIZE,\n offset,\n });\n if (result.errors?.length) {\n // Clear stale releases so the section self-hides instead of\n // showing outdated cards from a prior product/context.\n setReleases([]);\n return;\n }\n const page = result.data?.publicContentPages;\n const items = page?.items || [];\n all.push(...items);\n if (!page?.hasMore || items.length === 0) break;\n offset += PAGE_SIZE;\n }\n const pressOnly = all\n .filter((p) => p.tags?.includes(\"press\"))\n .sort((a, b) => {\n const da = new Date(a.publishedAt || a.lastUpdated || 0).getTime();\n const db = new Date(b.publishedAt || b.lastUpdated || 0).getTime();\n return db - da; // newest first\n });\n setReleases(pressOnly);\n } catch {\n // Non-fatal — clear stale and let the section self-hide.\n setReleases([]);\n } finally {\n setReleasesLoading(false);\n }\n }, [client, resolvedProductId, showPressReleases]);\n\n useEffect(() => {\n fetchReleases();\n }, [fetchReleases]);\n\n const presentCategories = CATEGORY_ORDER.filter((c) =>\n assets.some((a) => a.category === c),\n );\n const visibleAssets =\n activeCategory === \"ALL\"\n ? assets\n : assets.filter((a) => a.category === activeCategory);\n\n const grouped = (\n activeCategory === \"ALL\" ? presentCategories : [activeCategory]\n )\n .map((cat) => ({\n cat,\n items: visibleAssets\n .filter((a) => a.category === cat)\n .sort((a, b) => a.sortOrder - b.sortOrder),\n }))\n .filter((g) => g.items.length > 0);\n\n return (\n <div className={`w-full ${className}`}>\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n />\n )}\n\n {/* Hero */}\n <section className=\"py-16 sm:py-20 md:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center max-w-3xl mx-auto\">\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground\">\n {heroTitle}\n </h1>\n <p className=\"mt-4 text-lg text-muted-foreground\">{heroSubtitle}</p>\n {(brandKitUrl || contactEmail) && (\n <div className=\"mt-8 flex flex-wrap items-center justify-center gap-4\">\n {brandKitUrl && (\n <a\n href={brandKitUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-2 px-6 py-3 rounded-lg bg-primary text-primary-foreground font-medium hover:opacity-90 transition-opacity\"\n >\n Download brand kit\n </a>\n )}\n {contactEmail && (\n <a\n href={`mailto:${contactEmail}`}\n className=\"inline-flex items-center gap-2 px-6 py-3 rounded-lg border font-medium text-foreground hover:bg-muted transition-colors\"\n >\n Media inquiries\n </a>\n )}\n </div>\n )}\n </div>\n </div>\n </section>\n\n {/* Press Releases — shows a skeleton while loading (no layout shift),\n then the cards; self-hides when there are none. */}\n {showPressReleases && (releasesLoading || releases.length > 0) && (\n <section className=\"pb-16 sm:pb-20\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <h2 className=\"text-xl font-semibold text-foreground mb-6\">\n {pressReleasesTitle}\n </h2>\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n {releasesLoading\n ? [1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"bg-card border rounded-xl overflow-hidden animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"p-5 space-y-3\">\n <div className=\"h-4 bg-muted rounded w-1/4\" />\n <div className=\"h-5 bg-muted rounded w-3/4\" />\n <div className=\"h-4 bg-muted rounded w-1/2\" />\n </div>\n </div>\n ))\n : releases.map((r) => (\n <PressReleaseCard\n key={r.id}\n release={r}\n basePath={pressReleaseBasePath}\n />\n ))}\n </div>\n </div>\n </section>\n )}\n\n {/* Assets */}\n <section className=\"pb-16 sm:pb-20\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n {loading ? (\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"bg-card border rounded-xl overflow-hidden animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"p-5 space-y-3\">\n <div className=\"h-4 bg-muted rounded w-1/4\" />\n <div className=\"h-5 bg-muted rounded w-3/4\" />\n <div className=\"h-4 bg-muted rounded w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n ) : error ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">{error}</p>\n </div>\n ) : assets.length === 0 ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n Press materials are coming soon. For media inquiries\n {contactEmail ? (\n <>\n {\", contact \"}\n <a\n href={`mailto:${contactEmail}`}\n className=\"text-primary hover:underline\"\n >\n {contactEmail}\n </a>\n </>\n ) : (\n \" please reach out to our team\"\n )}\n .\n </p>\n </div>\n ) : (\n <>\n {/* Category tabs */}\n {presentCategories.length > 1 && (\n <div className=\"flex flex-wrap gap-2 mb-10 justify-center\">\n {([\"ALL\", ...presentCategories] as const).map((c) => {\n const active = activeCategory === c;\n return (\n <button\n key={c}\n type=\"button\"\n onClick={() => setActiveCategory(c)}\n className={`px-4 py-2 rounded-full text-sm font-medium transition-colors ${\n active\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground hover:text-foreground\"\n }`}\n >\n {c === \"ALL\"\n ? \"All\"\n : (CATEGORY_LABELS[c as PressKitAssetCategory] ?? c)}\n </button>\n );\n })}\n </div>\n )}\n\n {grouped.map((group) => (\n <div key={group.cat} className=\"mb-12\">\n <h2 className=\"text-xl font-semibold text-foreground mb-5\">\n {CATEGORY_LABELS[group.cat] ?? group.cat}\n </h2>\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n {group.items.map((a) => (\n <AssetCard key={a.id} asset={a} onPreview={setPreview} />\n ))}\n </div>\n </div>\n ))}\n\n {/* Media contact */}\n {contactEmail && (\n <div className=\"mt-8 border-t pt-10 text-center\">\n <h2 className=\"text-lg font-semibold text-foreground mb-2\">\n Media Contact\n </h2>\n <p className=\"text-muted-foreground\">\n For interviews, partnerships, and press inquiries:{\" \"}\n <a\n href={`mailto:${contactEmail}`}\n className=\"text-primary hover:underline\"\n >\n {contactEmail}\n </a>\n </p>\n </div>\n )}\n </>\n )}\n </div>\n </section>\n\n <PressKitLightbox asset={preview} onClose={() => setPreview(null)} />\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Contracts Component\n *\n * CMS-powered public list of downloadable legal contracts. Contracts are\n * stored as press-kit assets with `category: CONTRACT` (files-only, no rich\n * body) and served from the public CDN — same pipeline as the press kit.\n * Renders a simple download list (title + description + download), no preview.\n *\n * @example\n * ```tsx\n * import { ContractsPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/contracts\" element={<ContractsPage productName=\"Burdenoff\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport { formatBytes, fileExt, downloadFile } from \"./utils\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ContractAsset {\n id: string;\n title: string;\n slug: string;\n description?: string | null;\n fileUrl: string;\n fileName?: string | null;\n fileSize?: number | null;\n mimeType?: string | null;\n version?: string | null;\n tags: string[];\n sortOrder: number;\n updatedAt: string;\n}\n\nexport interface ContractsPageProps {\n productName?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n}\n\n// ============================================================================\n// Query — press-kit assets filtered to the CONTRACT category (server-side)\n// ============================================================================\n\nconst CONTRACTS_QUERY = `\n query PublicContracts($productId: String!, $limit: Int, $offset: Int) {\n publicPressKitAssets(productId: $productId, category: CONTRACT, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n description\n fileUrl\n fileName\n fileSize\n mimeType\n version\n tags\n sortOrder\n updatedAt\n }\n hasMore\n }\n }\n`;\n\n// ============================================================================\n// ContractsPage\n// ============================================================================\n\nexport function ContractsPage(props: ContractsPageProps) {\n const {\n productName,\n heroTitle = \"Contracts & Legal Agreements\",\n heroSubtitle = \"Download our standard legal agreements and policies.\",\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const displayName = productName ?? product?.name ?? config.productId;\n\n const [contracts, setContracts] = useState<ContractAsset[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchContracts = useCallback(async () => {\n if (!resolvedProductId) {\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const PAGE_SIZE = 100;\n // Upper bound so a stuck `hasMore: true` (API bug / malformed cursor)\n // can never spin into unbounded requests — mirrors press-kit's guard.\n const MAX_PAGES = 10;\n const all: ContractAsset[] = [];\n let offset = 0;\n for (let pageNum = 0; pageNum < MAX_PAGES; pageNum++) {\n const result = await client.query<{\n publicPressKitAssets: { items: ContractAsset[]; hasMore: boolean };\n }>(CONTRACTS_QUERY, {\n productId: resolvedProductId,\n limit: PAGE_SIZE,\n offset,\n });\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load contracts\");\n return;\n }\n const page = result.data?.publicPressKitAssets;\n const items = page?.items || [];\n all.push(...items);\n if (!page?.hasMore || items.length === 0) break;\n offset += PAGE_SIZE;\n }\n all.sort(\n (a, b) => a.sortOrder - b.sortOrder || a.title.localeCompare(b.title),\n );\n setContracts(all);\n setError(null);\n } catch {\n setError(\"Failed to load contracts\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId]);\n\n useEffect(() => {\n fetchContracts();\n }, [fetchContracts]);\n\n return (\n <div className={`min-h-screen bg-background ${className}`}>\n <PageHead\n title={seoTitle || `Contracts — ${displayName}`}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n />\n\n {/* Hero */}\n <section className=\"border-b border-border bg-muted/30\">\n <div className=\"max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-16 text-center\">\n <h1 className=\"text-4xl md:text-5xl font-bold text-foreground mb-4\">\n {heroTitle}\n </h1>\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto\">\n {heroSubtitle}\n </p>\n </div>\n </section>\n\n <section className=\"max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12\">\n {loading ? (\n <div className=\"flex justify-center py-20\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n ) : error ? (\n <div className=\"text-center py-16\">\n <p className=\"text-sm text-muted-foreground\">{error}</p>\n </div>\n ) : contracts.length === 0 ? (\n <div className=\"text-center py-16\">\n <p className=\"text-base text-muted-foreground\">\n No contracts are available yet.\n </p>\n </div>\n ) : (\n <ul className=\"divide-y divide-border rounded-xl border border-border overflow-hidden bg-card\">\n {contracts.map((c) => {\n const ext = fileExt(c);\n const size = formatBytes(c.fileSize);\n return (\n <li\n key={c.id}\n className=\"flex items-center justify-between gap-4 p-5 hover:bg-muted/40 transition-colors\"\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h3 className=\"text-base font-semibold text-foreground truncate\">\n {c.title}\n </h3>\n {c.version && (\n <span className=\"text-xs font-medium text-primary bg-primary/10 px-2 py-0.5 rounded-full\">\n {c.version}\n </span>\n )}\n </div>\n {c.description && (\n <p className=\"text-sm text-muted-foreground mt-1 line-clamp-2\">\n {c.description}\n </p>\n )}\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">{ext}</span>\n {size && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{size}</span>\n </>\n )}\n </div>\n </div>\n <a\n href={c.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download\n aria-label={`Download ${c.title}`}\n onClick={(e) => {\n void downloadFile(e, c);\n }}\n className=\"flex-shrink-0 inline-flex items-center gap-1.5 text-sm font-medium text-primary-foreground bg-primary hover:opacity-90 px-4 py-2 rounded-lg transition-opacity\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Download\n </a>\n </li>\n );\n })}\n </ul>\n )}\n </section>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/content/Markdown.tsx","../../src/client/security.ts","../../src/client/graphql-client.ts","../../src/client/provider.tsx","../../src/product/product-provider.tsx","../../src/content/content-provider.tsx","../../src/seo/page-head.tsx","../../src/content/blog.tsx","../../src/content/case-studies.tsx","../../src/utils/cn.ts","../../src/ui/button.tsx","../../src/ui/input.tsx","../../src/content/changelog.tsx","../../src/content/utils.ts","../../src/content/press-kit.tsx","../../src/content/contracts.tsx"],"names":["jsx","ReactMarkdown","remarkGfm","rehypeSanitize","createContext","useContext","useState","useCallback","useEffect","DOMPurify","Helmet","jsxs","Fragment","useMemo","twMerge","clsx","cva","React","Slot","React2","formatDate","Search","ChevronLeft","ChevronRight","History"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,IAAM,iBAAA,GAAgC;AAAA,EACpC,GAAG,CAAC,EAAE,MAAM,QAAA,EAAU,GAAG,OAAM,KAAM;AACnC,IAAA,MAAM,UAAA,GACJ,OAAO,IAAA,KAAS,QAAA,KACf,IAAA,CAAK,WAAW,SAAS,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,CAAA;AAC3D,IAAA,uBACEA,cAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACC,GAAG,KAAA;AAAA,QACH,GAAI,UAAA,GACD,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAK,qBAAA,EAAsB,GAC/C,EAAE,GAAA,EAAK,qBAAA,EAAsB;AAAA,QAEhC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF,CAAA;AAUO,SAAS,QAAA,CAAS;AAAA,EACvB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,OAAA,mBACJA,cAAA;AAAA,IAACC,8BAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAe,CAACC,0BAAS,CAAA;AAAA,MACzB,aAAA,EAAe,CAACC,+BAAc,CAAA;AAAA,MAC9B,UAAA,EAAY,EAAE,GAAG,iBAAA,EAAmB,GAAG,UAAA,EAAW;AAAA,MACjD,GAAI,MAAA,GAAS,EAAE,kBAAA,EAAoB,CAAC,GAAG,CAAA,EAAG,gBAAA,EAAkB,IAAA,EAAK,GAAI,EAAC;AAAA,MAEtE;AAAA;AAAA,GACH;AAGF,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBAAOH,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EAC9C;AAEA,EAAA,uBAAOA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAuB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAC7C;;;ACpEA,IAAM,iCAAiB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,WAAA,EAAa,KAAK,CAAC,CAAA;AAChE,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,eAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,sBAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,IAAI,GAAA;AAEJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAI,IAAI,KAAK,CAAA;AAAA,EACrB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,EAC5D;AAEA,EAAA,IAAI,GAAA,CAAI,aAAa,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAEA,EAAA,IACE,GAAA,CAAI,aAAa,OAAA,IACjB,cAAA,CAAe,IAAI,GAAA,CAAI,QAAA,CAAS,WAAA,EAAa,CAAA,EAC7C;AACA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAEA,EAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAC1E;AAEO,SAAS,gBACd,OAAA,EACoC;AACpC,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAA;AAAA,MACtB,CAAC,CAAC,GAAG,CAAA,KAAM,CAAC,gBAAA,CAAiB,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa;AAAA;AACpD,GACF;AACF;;;ACAO,IAAM,aAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EAaxB,YAAY,MAAA,EAA4B;AAZxC,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAA,sBAAiB,GAAA,EAGvB,CAAA;AACF,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAA,sBAAe,GAAA,EAA+C,CAAA;AAQpE,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,UAAA,EAAY,kBAAA,CAAmB,MAAA,CAAO,UAAU,CAAA;AAAA,MAChD,OAAA,EAAS,eAAA,CAAgB,MAAA,CAAO,OAAO;AAAA,KACzC;AAAA,EACF;AAAA,EAEA,SAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CACJ,KAAA,EACA,SAAA,EAC6B;AAC7B,IAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,WAAW,CAAA;AAGpD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AAC3C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,KAAK,GAAA,EAAI,GAAI,MAAA,CAAO,EAAA,GAAK,cAAa,SAAA,EAAW;AACnD,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,QAAQ,CAAA;AAAA,IACjC;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AAC3C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAW,KAAA,EAAO,SAAS,CAAA,CAC7C,IAAA,CAAK,CAAC,MAAA,KAAW;AAEhB,MAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,CAAC,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzC,QAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAA,IAAQ,aAAA,CAAa,iBAAA,EAAmB;AAC1D,UAAA,MAAM,cAAc,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AAClD,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,IAAA,CAAK,UAAA,CAAW,OAAO,WAAW,CAAA;AAAA,UACpC;AAAA,QACF;AACA,QAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAA,EAAU,EAAE,IAAA,EAAM,QAAQ,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,EAAG,CAAA;AAAA,MAChE;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,QAAQ,CAAA;AAAA,IAC/B,CAAC,CAAA;AAEH,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA;AACnC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,QAAA,EACA,SAAA,EAC6B;AAG7B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,QAAA,EAAU,SAAA,EAAW,KAAK,CAAA;AAAA,EACnD;AAAA;AAAA,EAGA,OAAe,kBAAkB,MAAA,EAAyB;AACxD,IAAA,OAAO,WAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAQ,MAAA,IAAU,OAAO,MAAA,GAAS,GAAA;AAAA,EACxE;AAAA,EAEA,OAAe,MAAM,EAAA,EAA2B;AAC9C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,OAAA,CACZ,KAAA,EACA,SAAA,EACA,SAAA,EAC0D;AAC1D,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,OAAO,UAAA,EAAY;AAAA,QACnD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,cAAA,EAAgB,KAAK,MAAA,CAAO,SAAA;AAAA,UAC5B,GAAG,KAAK,MAAA,CAAO;AAAA,SACjB;AAAA,QACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,WAAW,CAAA;AAAA,QACzC,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,iCAAA;AAAA,UACA,QAAA,CAAS,MAAA;AAAA,UACT,QAAA,CAAS;AAAA,SACX;AACA,QAAA,OAAO;AAAA,UACL,GAAA,EAAK;AAAA,YACH,MAAA,EAAQ;AAAA,cACN;AAAA,gBACE,SAAS,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA,CAAA;AAAA,gBACxD,YAAY,EAAE,IAAA,EAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA;AAAG;AAChD;AACF,WACF;AAAA,UACA,SAAA,EAAW,aAAA,CAAa,iBAAA,CAAkB,QAAA,CAAS,MAAM;AAAA,SAC3D;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,GAAA,EAAM,MAAM,QAAA,CAAS,IAAA,EAAK;AAAA,QAC1B,SAAA,EAAW;AAAA,OACb;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UACJ,KAAA,YAAiB,KAAA,KAChB,MAAM,IAAA,KAAS,YAAA,IAAgB,WAAW,MAAA,CAAO,OAAA,CAAA;AACpD,MAAA,MAAM,OAAA,GAAU,UACZ,CAAA,wBAAA,EAA2B,SAAS,OACpC,KAAA,YAAiB,KAAA,GACf,MAAM,OAAA,GACN,eAAA;AACN,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,OAAO,CAAA;AAC/C,MAAA,OAAO;AAAA,QACL,GAAA,EAAK;AAAA,UACH,MAAA,EAAQ;AAAA,YACN;AAAA,cACE,OAAA;AAAA,cACA,UAAA,EAAY,EAAE,IAAA,EAAM,OAAA,GAAU,YAAY,eAAA;AAAgB;AAC5D;AACF,SACF;AAAA;AAAA;AAAA,QAGA,SAAA,EAAW;AAAA,OACb;AAAA,IACF,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,OAAA,CACZ,KAAA,EACA,SAAA,EACA,QAAQ,IAAA,EACqB;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,aAAA,CAAa,kBAAA;AACxD,IAAA,MAAM,aAAa,KAAA,GACd,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,cAAa,mBAAA,GACxC,CAAA;AAEJ,IAAA,IAAI,IAAA;AACJ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,EAAE,GAAA,EAAK,SAAA,EAAU,GAAI,MAAM,IAAA,CAAK,OAAA;AAAA,QACpC,KAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,CAAC,SAAA,IAAa,CAAA,KAAM,UAAA,EAAY,OAAO,GAAA;AAC3C,MAAA,IAAA,GAAO,GAAA;AAEP,MAAA,MAAM,aAAA,CAAa,KAAA;AAAA,QACjB,cAAa,mBAAA,IAAuB,CAAA,GAAI,CAAA,CAAA,GAAK,IAAA,CAAK,QAAO,GAAI;AAAA,OAC/D;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AA1LE,aAAA,CAPW,aAAA,EAOI,WAAA,EAAY,CAAA,GAAI,EAAA,GAAK,GAAA,CAAA;AAAA;AACpC,aAAA,CARW,eAQI,mBAAA,EAAoB,GAAA,CAAA;AACnC,aAAA,CATW,eASI,oBAAA,EAAqB,IAAA,CAAA;AACpC,aAAA,CAVW,eAUI,qBAAA,EAAsB,CAAA,CAAA;AACrC,aAAA,CAXW,eAWI,qBAAA,EAAsB,GAAA,CAAA;AC5CvC,IAAM,aAAA,GAAgBI,oBAAmC,IAAI,CAAA;AAyCtD,SAAS,SAAA,GAA0B;AACxC,EAAA,MAAM,MAAA,GAASC,iBAAW,aAAa,CAAA;AACvC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,eAAA,GAAsC;AACpD,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,OAAO,OAAO,SAAA,EAAU;AAC1B;AC6EA,IAAM,iBAAiBD,mBAAAA,CAAmC;AAAA,EACxD,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS,IAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,WAAA,EAAa,KAAA;AAAA,EACb,SAAS,MAAM;AAAA,EAAC;AAClB,CAAC,CAAA;AA4GM,SAAS,UAAA,GAAkC;AAChD,EAAA,OAAOC,iBAAW,cAAc,CAAA;AAClC;AC7LA,IAAM,yBAAA,GAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAwBlC,IAAM,kCAAA,GAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAwB3C,IAAM,0BAAA,GAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAoC5B,SAAS,cAAA,CACd,MACA,OAAA,EAMA;AACA,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,UAAA,EAAW;AAC/B,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,EAAA,IAAM,MAAA,CAAO,SAAA;AAChD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,eAAiC,IAAI,CAAA;AAC7D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,SAAA,GAAYC,kBAAY,YAAY;AACxC,IAAA,IAAI,CAAC,iBAAA,EAAmB;AAExB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,OAAA,GACnB,kCAAA,GACA,yBAAA;AAEJ,MAAA,MAAM,SAAA,GAAY,OAAA,EAAS,OAAA,GACvB,2BAAA,GACA,mBAAA;AAEJ,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA;AAAA,QAC1B,KAAA;AAAA,QACA;AAAA,UACE,IAAA;AAAA,UACA,SAAA,EAAW;AAAA;AACb,OACF;AAEA,MAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzB,QAAA,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,WAAW,eAAe,CAAA;AACrD,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,GAAO,SAAS,CAAA,IAAK,IAAI,CAAA;AAAA,MAC1C;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,yBAAyB,CAAA;AACvE,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,mBAAmB,IAAA,EAAM,OAAA,EAAS,OAAO,CAAC,CAAA;AAEtD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,SAAS,SAAA,EAAU;AACpD;AAUO,SAAS,gBAAgB,OAAA,EAQ9B;AACA,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIF,eAAqC,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,UAAA,GAAaC,kBAAY,YAAY;AACzC,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAEzB,0BAAA,EAA4B;AAAA,QAC7B,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,KAAA,EAAO,SAAS,KAAA,IAAS,EAAA;AAAA,QACzB,MAAA,EAAQ,SAAS,MAAA,IAAU;AAAA,OAC5B,CAAA;AAED,MAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzB,QAAA,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,WAAW,eAAe,CAAA;AACrD,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,kBAAA,IAAsB,IAAI,CAAA;AAAA,MACjD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA;AAAA,QACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,OACvC;AACA,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,CAAO,WAAW,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,MAAM,CAAC,CAAA;AAE9D,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,SAAS,UAAA,EAAW;AACrD;AAeO,SAAS,eAAA,CAAgB;AAAA,EAC9B,OAAA;AAAA,EACA,MAAA,GAAS,UAAA;AAAA,EACT;AACF,CAAA,EAIG;AACD,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,uBAAOR,cAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAuB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EAClD;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,SAAA,GAAYS,0BAAA,CAAU,QAAA,CAAS,OAAO,CAAA;AAC5C,IAAA,uBACET,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,uBAAA,EAAyB,EAAE,MAAA,EAAQ,SAAA;AAAU;AAAA,KAC/C;AAAA,EAEJ;AAGA,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAY,UAAA,EAAY,UAAA,EAAY,SAAA,EAAU,EACzD,mBACH,CAAA,EACF,CAAA;AAEJ;ACjQO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,GAAS,8EAAA;AAAA,EACT,MAAA,GAAS,OAAA;AAAA,EACT,aAAA;AAAA,EACA,UAAA,GAAa,SAAA;AAAA,EACb,cAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,SAAA,GACJ,WAAA,IAAe,CAAC,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,GACtC,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,WAAW,CAAA,CAAA,GACzB,KAAA;AAEN,EAAA,MAAM,eACJ,KAAA,IAAS,CAAC,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,IAAK,GAAA,GAClC,CAAA,EAAG,GAAA,CAAI,QAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,EAAG,KAAK,CAAA,CAAA,GACjC,KAAA;AAGN,EAAA,MAAM,mBAAA,GAAsD,cAAA,GACxD,KAAA,CAAM,OAAA,CAAQ,cAAc,IAC1B,cAAA,GACA,CAAC,cAAc,CAAA,GACjB,EAAC;AAEL,EAAA,uCACGU,uBAAA,EAAA,EAEC,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,WAAO,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,oBAClBA,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,SAAS,SAAA,EAAW,CAAA;AAAA,IACtC,+BAAeA,cAAAA,CAAC,UAAK,IAAA,EAAK,aAAA,EAAc,SAAS,WAAA,EAAa,CAAA;AAAA,IAC9D,4BAAYA,cAAAA,CAAC,UAAK,IAAA,EAAK,UAAA,EAAW,SAAS,QAAA,EAAU,CAAA;AAAA,oBACtDA,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,SAAQ,wCAAA,EAAyC,CAAA;AAAA,oBACrEA,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,SAAS,MAAA,EAAQ,CAAA;AAAA,IAGpC,uBAAOA,cAAAA,CAAC,UAAK,GAAA,EAAI,WAAA,EAAY,MAAM,GAAA,EAAK,CAAA;AAAA,IAGxC,2BAAWA,cAAAA,CAAC,UAAK,GAAA,EAAI,MAAA,EAAO,MAAM,OAAA,EAAS,CAAA;AAAA,oBAG5CA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAS,SAAA,EAAU,SAAQ,SAAA,EAAU,CAAA;AAAA,oBAC3CA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAS,UAAA,EAAW,SAAS,SAAA,EAAW,CAAA;AAAA,IAC7C,+BAAeA,cAAAA,CAAC,UAAK,QAAA,EAAS,gBAAA,EAAiB,SAAS,WAAA,EAAa,CAAA;AAAA,IACrE,gCAAgBA,cAAAA,CAAC,UAAK,QAAA,EAAS,UAAA,EAAW,SAAS,YAAA,EAAc,CAAA;AAAA,IACjE,uBAAOA,cAAAA,CAAC,UAAK,QAAA,EAAS,QAAA,EAAS,SAAS,GAAA,EAAK,CAAA;AAAA,oBAC9CA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAS,WAAA,EAAY,SAAS,MAAA,EAAQ,CAAA;AAAA,IAC3C,+BAAeA,cAAAA,CAAC,UAAK,QAAA,EAAS,cAAA,EAAe,SAAS,WAAA,EAAa,CAAA;AAAA,oBAGpEA,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,cAAA,EAAe,SAAQ,qBAAA,EAAsB,CAAA;AAAA,oBACxDA,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,eAAA,EAAgB,SAAS,SAAA,EAAW,CAAA;AAAA,IAC9C,+BAAeA,cAAAA,CAAC,UAAK,IAAA,EAAK,qBAAA,EAAsB,SAAS,WAAA,EAAa,CAAA;AAAA,IACtE,gCAAgBA,cAAAA,CAAC,UAAK,IAAA,EAAK,eAAA,EAAgB,SAAS,YAAA,EAAc,CAAA;AAAA,IAClE,iCAAiBA,cAAAA,CAAC,UAAK,IAAA,EAAK,iBAAA,EAAkB,SAAS,aAAA,EAAe,CAAA;AAAA,oBAGvEA,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,aAAA,EAAc,SAAS,UAAA,EAAY,CAAA;AAAA,IAG7C,oBAAoB,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAC9BA,cAAAA,CAAC,QAAA,EAAA,EAA2B,IAAA,EAAK,qBAAA,EAC9B,eAAK,SAAA,CAAU,IAAI,KADT,CAAA,GAAA,EAAM,KAAK,EAExB,CACD,CAAA;AAAA,IAGA,cAAA,EAAgB,GAAA,CAAI,CAAC,IAAA,EAAM,0BAC1BA,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QAEE,GAAI,KAAK,IAAA,GAAO,EAAE,MAAM,IAAA,CAAK,IAAA,KAAS,EAAC;AAAA,QACvC,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAAA,QACpD,SAAS,IAAA,CAAK;AAAA,OAAA;AAAA,MAHT,QAAQ,KAAK,CAAA;AAAA,KAKrB;AAAA,GAAA,EACH,CAAA;AAEJ;AC/FA,IAAM,gBAAA,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAwBzB,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA4BxB,SAAS,QAAA,CAAS;AAAA,EAChB,IAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAGG;AACD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA;AACtC,EAAA,MAAM,gBAAgB,IAAA,GAClB,IAAI,KAAK,IAAI,CAAA,CAAE,mBAAmB,OAAA,EAAS;AAAA,IACzC,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACN,CAAA,GACD,EAAA;AAEJ,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIM,eAAS,KAAK,CAAA;AAE9C,EAAA,uBACEK,eAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAAA,MAC9B,SAAA,EAAU,2HAAA;AAAA,MAGT,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,SAAA,IAAa,CAAC,QAAA,mBAClBX,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAK,IAAA,CAAK,SAAA;AAAA,YACV,KAAK,IAAA,CAAK,KAAA;AAAA,YACV,SAAA,EAAU,oFAAA;AAAA,YACV,OAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI;AAAA;AAAA,WAEnC,CAAA,mBAEAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oCAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,MAAA,EAAO,cAAA;AAAA,YAEP,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,WAAA,EAAa,GAAA;AAAA,gBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,SACF,EACF,CAAA;AAAA,wBAGFW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAEZ,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,4BACJX,cAAAA,CAAC,UAAK,SAAA,EAAU,2FAAA,EACb,eAAK,QAAA,EACR,CAAA;AAAA,0BAIFA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oGAAA,EACX,eAAK,KAAA,EACR,CAAA;AAAA,0BAGAA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDACV,QAAA,EAAA,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,cAAA,IAAkB,EAAA,EAC1C,CAAA;AAAA,0BAGAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACZ,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,0BAAUX,cAAAA,CAAC,UAAK,SAAA,EAAU,aAAA,EAAe,eAAK,MAAA,EAAO,CAAA;AAAA,YAC1D,IAAA,CAAK,UAAU,aAAA,oBACdA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,YAE7C,aAAA,oBAAiBA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,YACtC,IAAA,CAAK,WAAA,oBACJW,eAAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAZ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,8BAC5CW,gBAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,WAAA;AAAA,gBAAY;AAAA,eAAA,EAAS;AAAA,aAAA,EACnC;AAAA,WAAA,EAEJ;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAMO,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,SAAA,GAAY,MAAA;AAAA,IACZ,YAAA,GAAe,wDAAA;AAAA,IACf,gBAAA,GAAmB,OAAA;AAAA,IACnB,SAAA,GAAY,EAAA;AAAA,IACZ,QAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,UAAA,EAAW;AAC/B,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,EAAA,IAAM,MAAA,CAAO,SAAA;AAEhD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIL,cAAAA,CAAgC,EAAE,CAAA;AAC5D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,CAAC,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,EAAA;AAEd,EAAA,MAAM,UAAA,GAAaC,kBAAY,YAAY;AACzC,IAAA,IAAI,CAAC,iBAAA,EAAmB;AAExB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAMzB,gBAAA,EAAkB;AAAA,QACnB,SAAA,EAAW,iBAAA;AAAA,QACX,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzB,QAAA,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,WAAW,sBAAsB,CAAA;AAC5D,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,aAAa,MAAA,CAAO,IAAA,EAAM,kBAAA,EAAoB,KAAA,IAAS,EAAC,EAAG,MAAA;AAAA,QAC/D,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,SAAS,MAAM;AAAA,OAChC;AAEA,MAAA,QAAA,CAAS,SAAS,CAAA;AAClB,MAAA,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM,kBAAA,EAAoB,KAAA,IAAS,CAAC,CAAA;AACpD,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,2BAA2B,CAAA;AAAA,IACtC,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,iBAAA,EAAmB,MAAM,CAAC,CAAA;AAEtC,EAAAC,gBAAU,MAAM;AACd,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AACpD,EAAA,MAAM,eAAe,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,QAAQ,CAAA;AAEpD,EAAA,uBACEG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EAChC,QAAA,EAAA;AAAA,IAAA,QAAA,oBACCX,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,QAAA;AAAA,QACP,aAAa,cAAA,IAAkB,YAAA;AAAA,QAC/B,WAAA;AAAA,QACA,QAAA,EAAU,WAAA;AAAA,QACV,GAAA,EACE,OAAO,MAAA,KAAW,WAAA,GACd,OAAO,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,QAAA,GACzC;AAAA;AAAA,KAER;AAAA,oBAIFA,cAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,2BACjB,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+BAAA,EACb,QAAA,EAAA;AAAA,sBAAAX,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2EAAA,EACX,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,YAAA,EAAa;AAAA,KAAA,EAClE,GACF,CAAA,EACF,CAAA;AAAA,oBAGAA,cAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,gBAAA,EACjB,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACZ,QAAA,EAAA,OAAA,mBACCA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACZ,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBACdW,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,yDAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,0BACxCW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,4BAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,4BAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,4BAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,4BACtCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B;AAAA,WAAA,EAC9C;AAAA;AAAA,OAAA;AAAA,MATK;AAAA,KAWR,CAAA,EACH,CAAA,GACE,KAAA,mBACFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,0BAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAyB,iBAAM,CAAA,EAC9C,CAAA,GACE,KAAA,CAAM,MAAA,KAAW,oBACnBA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBAAwB,QAAA,EAAA,qCAAA,EAErC,CAAA,EACF,CAAA,mBAEAW,gBAAAC,mBAAA,EAAA,EAEG,QAAA,EAAA;AAAA,MAAA,aAAA,CAAc,MAAA,GAAS,CAAA,oBACtBZ,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,qBAClBA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA;AAAA,UACA,QAAA,EAAU;AAAA,SAAA;AAAA,QAFL,IAAA,CAAK;AAAA,OAIb,CAAA,EACH,CAAA;AAAA,sBAIFA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDACZ,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,qBACjBA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA;AAAA,UACA,QAAA,EAAU;AAAA,SAAA;AAAA,QAFL,IAAA,CAAK;AAAA,OAIb,CAAA,EACH,CAAA;AAAA,MAGC,QAAQ,KAAA,oBACPW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,GAAS,KAAK,CAAC,CAAA;AAAA,YACpD,UAAU,MAAA,KAAW,CAAA;AAAA,YACrB,SAAA,EAAU,wGAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,SAAA,CAAU,MAAA,GAAS,KAAK,CAAA;AAAA,YACvC,QAAA,EAAU,SAAS,KAAA,IAAS,KAAA;AAAA,YAC5B,SAAA,EAAU,wGAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EAEJ,GAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAMO,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,WAAA,GAAc,OAAA;AAAA,IACd,SAAA,GAAY,cAAA;AAAA,IACZ,SAAA,GAAY;AAAA,GACd,GAAI,KAAA;AAEJ,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,UAAA,EAAW;AAC/B,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,EAAA,IAAM,MAAA,CAAO,SAAA;AAEhD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIM,eAAiC,IAAI,CAAA;AAC7D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAGtD,EAAA,MAAM,IAAA,GACJ,OAAO,MAAA,KAAW,WAAA,GACd,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA,GAC7C,EAAA;AAEN,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,iBAAA,EAAmB;AAEjC,IAAA,eAAe,SAAA,GAAY;AACzB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAEzB,eAAA,EAAiB;AAAA,UAClB,IAAA;AAAA,UACA,SAAA,EAAW;AAAA,SACZ,CAAA;AAED,QAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzB,UAAA,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,WAAW,qBAAqB,CAAA;AAC3D,UAAA;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,iBAAA,IAAqB,IAAI,CAAA;AAC9C,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,CAAS,0BAA0B,CAAA;AAAA,MACrC,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,EAAM,iBAAiB,CAAC,CAAA;AAEpC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACER,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EACjC,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EACb,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,sBAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,sBAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAoC,CAAA;AAAA,sBACnDA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,sBACpBA,cAAAA,CAAC,SAAY,SAAA,EAAU,sBAAA,EAAA,EAAb,CAAoC,CAC/C,CAAA,EACH;AAAA,KAAA,EACF,GACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,IAAS,CAAC,IAAA,EAAM;AAClB,IAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EACjC,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EACb,QAAA,EAAA;AAAA,sBAAAX,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,sBACtDA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EACV,mBAAS,mDAAA,EACZ,CAAA;AAAA,sBACAW,eAAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,WAAA;AAAA,UACN,SAAA,EAAU,0CAAA;AAAA,UACX,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,YACI;AAAA;AAAA;AAAA;AACL,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA;AACtC,EAAA,MAAM,gBAAgB,IAAA,GAClB,IAAI,KAAK,IAAI,CAAA,CAAE,mBAAmB,OAAA,EAAS;AAAA,IACzC,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACN,CAAA,GACD,EAAA;AAEJ,EAAA,uBACEA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EACjC,QAAA,EAAA;AAAA,oBAAAX,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAA;AAAA,QAC7B,WAAA,EAAa,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,OAAA,IAAW,EAAA;AAAA,QACpD,WAAA;AAAA,QACA,QAAA,EAAU,KAAK,WAAA,IAAe,EAAA;AAAA,QAC9B,KAAA,EAAO,KAAK,SAAA,IAAa,MAAA;AAAA,QACzB,GAAA,EACE,OAAO,MAAA,KAAW,WAAA,GACd,OAAO,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,QAAA,GACzC;AAAA;AAAA,KAER;AAAA,oBAEAW,eAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,uDAAA,EAEjB,QAAA,EAAA;AAAA,sBAAAA,eAAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,WAAA;AAAA,UACN,SAAA,EAAU,2GAAA;AAAA,UACX,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,YACI;AAAA;AAAA;AAAA,OACL;AAAA,MAGC,IAAA,CAAK,4BACJX,cAAAA,CAAC,UAAK,SAAA,EAAU,2FAAA,EACb,eAAK,QAAA,EACR,CAAA;AAAA,sBAIFA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gFAAA,EACX,eAAK,KAAA,EACR,CAAA;AAAA,sBAGAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACZ,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,0BACJX,cAAAA,CAAC,UAAK,SAAA,EAAU,6BAAA,EAA+B,eAAK,MAAA,EAAO,CAAA;AAAA,QAE5D,IAAA,CAAK,UAAU,aAAA,oBACdA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,QAE7C,aAAA,oBAAiBA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,QACtC,IAAA,CAAK,WAAA,oBACJW,eAAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAZ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,0BAC5CW,gBAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,WAAA;AAAA,YAAY;AAAA,WAAA,EAAS;AAAA,SAAA,EACnC;AAAA,OAAA,EAEJ,CAAA;AAAA,MAGC,KAAK,SAAA,oBACJX,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAK,IAAA,CAAK,SAAA;AAAA,UACV,KAAK,IAAA,CAAK,KAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA,OACZ,EACF,CAAA;AAAA,sBAIFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAAA,cAAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,eAAe,CAAA,EACtE;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACzdA,IAAM,cAAA,GAAiB,YAAA;AAIvB,IAAM,gBAAA,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAUzB,SAAS,eAAA,GAAkB;AACzB,EAAA,uBAAOA,cAAAA,CAAC,OAAA,EAAA,EAAM,yBAAyB,EAAE,MAAA,EAAQ,kBAAiB,EAAG,CAAA;AACvE;AAMA,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAwB3B,IAAM,gBAAA,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA4BzB,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,EAAA,IAAI,OAAO,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,GAAG,OAAO,EAAA;AACtC,EAAA,OAAO,CAAA,CAAE,mBAAmB,OAAA,EAAS;AAAA,IACnC,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACN,CAAA;AACH;AAGA,SAAS,SAAA,CAAU;AAAA,EACjB,GAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAIG;AACD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIM,eAAS,KAAK,CAAA;AAC9C,EAAA,IAAI,GAAA,IAAO,CAAC,QAAA,EAAU;AACpB,IAAA,uBACEN,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,GAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI;AAAA;AAAA,KACjC;AAAA,EAEJ;AACA,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,6EAA6E,SAAS,CAAA,CAAA;AAAA,MACjG,aAAA,EAAY,MAAA;AAAA,MAEZ,QAAA,kBAAAA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,oCAAA;AAAA,UACV,IAAA,EAAK,MAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,MAAA,EAAO,cAAA;AAAA,UAEP,QAAA,kBAAAA,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cACf,WAAA,EAAa,GAAA;AAAA,cACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF;AAAA,GACF;AAEJ;AAEA,SAAS,OAAA,CAAQ;AAAA,EACf,IAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAGG;AACD,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,IAAA,CAAK,WAAA,IAAe,KAAK,WAAW,CAAA;AACrE,EAAA,uBACEW,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,6EAA6E,SAAS,CAAA,CAAA;AAAA,MAEhG,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,0BAAUX,cAAAA,CAAC,UAAK,SAAA,EAAU,aAAA,EAAe,eAAK,MAAA,EAAO,CAAA;AAAA,QAC1D,IAAA,CAAK,UAAU,aAAA,oBACdA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,QAE7C,aAAA,oBAAiBA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,QACtC,IAAA,CAAK,WAAA,mBACJW,eAAAA,CAAAC,qBAAA,EACE,QAAA,EAAA;AAAA,0BAAAZ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,0BAC5CW,gBAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,WAAA;AAAA,YAAY;AAAA,WAAA,EAAS;AAAA,SAAA,EACnC,CAAA,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AAMA,SAAS,YAAA,CAAa;AAAA,EACpB,IAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEA,eAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAAA,MAC9B,SAAA,EAAU,wLAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,0BAAAX,cAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAK,IAAA,CAAK,SAAA;AAAA,cACV,KAAK,IAAA,CAAK,KAAA;AAAA,cACV,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAW,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kJAAA,EACd,QAAA,EAAA;AAAA,4BAAAX,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,SAAA;AAAA,gBACV,OAAA,EAAQ,WAAA;AAAA,gBACR,IAAA,EAAK,cAAA;AAAA,gBACL,aAAA,EAAY,MAAA;AAAA,gBAEZ,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oWAAA,EAAqW;AAAA;AAAA,aAC/W;AAAA,YAAM;AAAA,WAAA,EAER;AAAA,SAAA,EACF,CAAA;AAAA,wBACAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,4BACJX,cAAAA,CAAC,UAAK,SAAA,EAAU,iGAAA,EACb,eAAK,QAAA,EACR,CAAA;AAAA,0BAEFA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uGAAA,EACX,eAAK,KAAA,EACR,CAAA;AAAA,0BACAA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gEACV,QAAA,EAAA,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,cAAA,IAAkB,EAAA,EAC1C,CAAA;AAAA,0BACAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,WAAU,MAAA,EAAO,CAAA;AAAA,0BACtCW,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wEAAA,EAAyE,QAAA,EAAA;AAAA,YAAA,gBAAA;AAAA,4BAEvFX,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,qEAAA;AAAA,gBACV,OAAA,EAAQ,WAAA;AAAA,gBACR,IAAA,EAAK,cAAA;AAAA,gBACL,aAAA,EAAY,MAAA;AAAA,gBAEZ,QAAA,kBAAAA,cAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,QAAA,EAAS,SAAA;AAAA,oBACT,CAAA,EAAE,mHAAA;AAAA,oBACF,QAAA,EAAS;AAAA;AAAA;AACX;AAAA;AACF,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAMA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAGG;AACD,EAAA,uBACEW,eAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAAA,MAC9B,SAAA,EAAU,wJAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAK,IAAA,CAAK,SAAA;AAAA,YACV,KAAK,IAAA,CAAK,KAAA;AAAA,YACV,SAAA,EAAU;AAAA;AAAA,SACZ,EACF,CAAA;AAAA,wBAEAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,4BACJX,cAAAA,CAAC,UAAK,SAAA,EAAU,iGAAA,EACb,eAAK,QAAA,EACR,CAAA;AAAA,0BAEFA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oGAAA,EACX,eAAK,KAAA,EACR,CAAA;AAAA,0BACAA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDACV,QAAA,EAAA,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,cAAA,IAAkB,EAAA,EAC1C,CAAA;AAAA,0BACAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,WAAU,SAAA,EAAU;AAAA,SAAA,EAC3C;AAAA;AAAA;AAAA,GACF;AAEJ;AAMA,SAAS,UAAA,CAAW;AAAA,EAClB,YAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB;AAAA,MACE,KAAA,EAAO,2BAAA;AAAA,MACP,IAAA,EAAM,oFAAoF,YAAY,CAAA,iEAAA,CAAA;AAAA,MACtG,sBACEA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,WAAA,EAAa,GAAA;AAAA,UACb,CAAA,EAAE;AAAA;AAAA;AACJ,KAEJ;AAAA,IACA;AAAA,MACE,KAAA,EAAO,yBAAA;AAAA,MACP,IAAA,EAAM,oBAAoB,YAAY,CAAA,yGAAA,CAAA;AAAA,MACtC,sBACEA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,WAAA,EAAa,GAAA;AAAA,UACb,CAAA,EAAE;AAAA;AAAA;AACJ,KAEJ;AAAA,IACA;AAAA,MACE,KAAA,EAAO,oBAAA;AAAA,MACP,IAAA,EAAM,2BAA2B,YAAY,CAAA,0GAAA,CAAA;AAAA,MAC7C,sBACEA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,WAAA,EAAa,GAAA;AAAA,UACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAEJ,GACF;AAEA,EAAA,uBACEW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EAEb,QAAA,EAAA;AAAA,sBAAAX,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,8FAAA;AAAA,UACV,aAAA,EAAY;AAAA;AAAA,OACd;AAAA,sBACAA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,+FAAA;AAAA,UACV,aAAA,EAAY;AAAA;AAAA,OACd;AAAA,sBAEAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2HAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,WAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,MAAA,EAAO,cAAA;AAAA,YACP,aAAA,EAAY,MAAA;AAAA,YAEZ,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,WAAA,EAAa,GAAA;AAAA,gBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,SACF,EACF,CAAA;AAAA,wBAEAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sEACX,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,wBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qFACV,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,wBAEAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,WAAA;AAAA,cACN,SAAA,EAAU,wMAAA;AAAA,cAET,QAAA,EAAA;AAAA,gBAAA,YAAA;AAAA,gCACDX,cAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,SAAA;AAAA,oBACV,OAAA,EAAQ,WAAA;AAAA,oBACR,IAAA,EAAK,cAAA;AAAA,oBACL,aAAA,EAAY,MAAA;AAAA,oBAEZ,QAAA,kBAAAA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,QAAA,EAAS,SAAA;AAAA,wBACT,CAAA,EAAE,mHAAA;AAAA,wBACF,QAAA,EAAS;AAAA;AAAA;AACX;AAAA;AACF;AAAA;AAAA,WACF;AAAA,0BACAA,cAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,WAAA;AAAA,cACN,SAAA,EAAU,+LAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA;AACH,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,qBACfW,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,uFAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kFAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,SAAA;AAAA,cACV,IAAA,EAAK,MAAA;AAAA,cACL,OAAA,EAAQ,WAAA;AAAA,cACR,MAAA,EAAO,cAAA;AAAA,cACP,aAAA,EAAY,MAAA;AAAA,cAEX,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,WACL,EACF,CAAA;AAAA,0BACAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4CAAA,EACX,YAAE,KAAA,EACL,CAAA;AAAA,0BACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sDAAA,EACV,YAAE,IAAA,EACL;AAAA;AAAA,OAAA;AAAA,MAnBK,CAAA,CAAE;AAAA,KAqBV,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAMO,SAAS,oBAAoB,KAAA,EAAiC;AACnE,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,OAAA,GAAU,kBAAA;AAAA,IACV,SAAA,GAAY,cAAA;AAAA,IACZ,YAAA,GAAe,yDAAA;AAAA,IACf,iBAAA,GAAoB,eAAA;AAAA,IACpB,SAAA,GAAY,EAAA;AAAA,IACZ,QAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA,GAAc,UAAA;AAAA,IACd,YAAA,GAAe,cAAA;AAAA,IACf,WAAA,GAAc,WAAA;AAAA,IACd,YAAA,GAAe,qBAAA;AAAA,IACf,UAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,UAAA,EAAW;AAC/B,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,EAAA,IAAM,MAAA,CAAO,SAAA;AAChD,EAAA,MAAM,YAAA,GAAe,OAAA,EAAS,IAAA,IAAQ,WAAA,IAAe,cAAA;AAErD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIM,cAAAA,CAAgC,EAAE,CAAA;AAC5D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,CAAC,CAAA;AACtC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAiB,KAAK,CAAA;AAClE,EAAA,MAAM,KAAA,GAAQ,EAAA;AAEd,EAAA,MAAM,UAAA,GAAaC,kBAAY,YAAY;AACzC,IAAA,IAAI,CAAC,iBAAA,EAAmB;AAExB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAMzB,kBAAA,EAAoB;AAAA,QACrB,SAAA,EAAW,iBAAA;AAAA,QACX,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzB,QAAA,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,WAAW,6BAA6B,CAAA;AACnE,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,eAAe,MAAA,CAAO,IAAA,EAAM,kBAAA,EAAoB,KAAA,IAAS,EAAC,EAAG,MAAA;AAAA,QACjE,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,SAAS,cAAc;AAAA,OACxC;AAEA,MAAA,QAAA,CAAS,WAAW,CAAA;AACpB,MAAA,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM,kBAAA,EAAoB,KAAA,IAAS,CAAC,CAAA;AACpD,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AAGN,MAAA,QAAA,CAAS,aAAa,CAAA;AACtB,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA,IACb,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,iBAAA,EAAmB,MAAM,CAAC,CAAA;AAEtC,EAAAC,gBAAU,MAAM;AACd,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,MAAM,UAAA,GAAaK,cAAQ,MAAM;AAC/B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAM;AACnB,MAAA,IAAI,CAAA,CAAE,QAAA,EAAU,GAAA,CAAI,GAAA,CAAI,EAAE,QAAQ,CAAA;AAAA,IACpC,CAAC,CAAA;AACD,IAAA,OAAO,CAAC,KAAA,EAAO,GAAG,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,YAAA,GAAeA,cAAQ,MAAM;AACjC,IAAA,IAAI,cAAA,KAAmB,OAAO,OAAO,KAAA;AACrC,IAAA,OAAO,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,cAAc,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,KAAA,EAAO,cAAc,CAAC,CAAA;AAE1B,EAAA,MAAM,gBAAgB,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAC3D,EAAA,MAAM,eAAe,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,QAAQ,CAAA;AAE3D,EAAA,MAAM,aAAa,CAAC,OAAA,IAAW,CAAC,KAAA,IAAS,MAAM,MAAA,GAAS,CAAA;AACxD,EAAA,MAAM,YAAY,CAAC,OAAA,KAAY,KAAA,KAAU,IAAA,IAAQ,MAAM,MAAA,KAAW,CAAA,CAAA;AAElE,EAAA,MAAM,qBAAqB,UAAA,IAAc,6BAAA;AACzC,EAAA,MAAM,qBAAA,GACJ,aAAA,IACA,CAAA,EAAG,YAAY,CAAA,iPAAA,CAAA;AAEjB,EAAA,uBACEF,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAU,SAAS,CAAA,CAAA,EAAI,WAAQ,iBAAA,EAC7C,QAAA,EAAA;AAAA,oBAAAX,eAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,IAChB,4BACCA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,QAAA;AAAA,QACP,aAAa,cAAA,IAAkB,YAAA;AAAA,QAC/B,WAAA;AAAA,QACA,QAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBAIFW,eAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EACjB,QAAA,EAAA;AAAA,sBAAAX,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,2GAAA;AAAA,UACV,aAAA,EAAY;AAAA;AAAA,OACd;AAAA,sBACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EACb,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yJAAA,EACd,QAAA,EAAA;AAAA,0BAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,CAAA;AAAA,UACrD;AAAA,SAAA,EACH,CAAA;AAAA,wBACAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kFACX,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,wBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,YAAA,EAAa;AAAA,OAAA,EAClE,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAA,cAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,gBAAA,EACjB,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACZ,QAAA,EAAA,OAAA,mBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACZ,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBACvBW,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,yDAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,0BACxCW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,4BAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,4BAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,4BAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,4BACtCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B;AAAA,WAAA,EAC9C;AAAA;AAAA,OAAA;AAAA,MATK;AAAA,KAWR,CAAA,EACH,CAAA,GACE,SAAA,mBACFA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,YAAA;AAAA,QACA,KAAA,EAAO,kBAAA;AAAA,QACP,QAAA,EAAU,qBAAA;AAAA,QACV,WAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA;AAAA,KACF,GACE,UAAA,mBACFW,eAAAA,CAAAC,qBAAA,EAEG,QAAA,EAAA;AAAA,MAAA,UAAA,CAAW,MAAA,GAAS,CAAA,oBACnBZ,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,qBACfA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,iBAAA,CAAkB,GAAG,CAAA;AAAA,UACpC,SAAA,EAAW,CAAA,sEAAA,EACT,cAAA,KAAmB,GAAA,GACf,sDACA,iGACN,CAAA,CAAA;AAAA,UAEC,QAAA,EAAA;AAAA,SAAA;AAAA,QATI;AAAA,OAWR,CAAA,EACH,CAAA;AAAA,MAID,aAAA,CAAc,MAAA,GAAS,CAAA,oBACtBA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,qBAClBA,cAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UAEC,IAAA;AAAA,UACA,QAAA,EAAU;AAAA,SAAA;AAAA,QAFL,IAAA,CAAK;AAAA,OAIb,CAAA,EACH,CAAA;AAAA,MAID,YAAA,CAAa,MAAA,GAAS,CAAA,oBACrBA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACZ,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,qBACjBA,cAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UAEC,IAAA;AAAA,UACA,QAAA,EAAU;AAAA,SAAA;AAAA,QAFL,IAAA,CAAK;AAAA,OAIb,CAAA,EACH,CAAA;AAAA,MAID,cAAA,KAAmB,SAAS,KAAA,GAAQ,KAAA,oBACnCW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,GAAS,KAAK,CAAC,CAAA;AAAA,YACpD,UAAU,MAAA,KAAW,CAAA;AAAA,YACrB,SAAA,EAAU,wGAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,SAAA,CAAU,MAAA,GAAS,KAAK,CAAA;AAAA,YACvC,QAAA,EAAU,SAAS,KAAA,IAAS,KAAA;AAAA,YAC5B,SAAA,EAAU,wGAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA;AAAA,sBAIFW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qHAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+CAAA,EAAgD,QAAA,EAAA,0BAAA,EAE9D,CAAA;AAAA,wBACAW,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kEAAA,EAAmE,QAAA,EAAA;AAAA,UAAA,8DAAA;AAAA,UACtB,GAAA;AAAA,UACvD,YAAA;AAAA,UAAa;AAAA,SAAA,EAChB,CAAA;AAAA,wBACAX,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,WAAA;AAAA,YACN,SAAA,EAAU,4LAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA;AACH,OAAA,EACF;AAAA,KAAA,EACF,CAAA,GACE,MACN,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAMO,SAAS,cAAc,KAAA,EAA2B;AACvD,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,kBAAA,GAAqB,eAAA;AAAA,IACrB,SAAA,GAAY,sBAAA;AAAA,IACZ,WAAA,GAAc,UAAA;AAAA,IACd,YAAA,GAAe,cAAA;AAAA,IACf,SAAA,GAAY;AAAA,GACd,GAAI,KAAA;AAEJ,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,UAAA,EAAW;AAC/B,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,EAAA,IAAM,MAAA,CAAO,SAAA;AAChD,EAAA,MAAM,YAAA,GAAe,OAAA,EAAS,IAAA,IAAQ,WAAA,IAAe,UAAA;AAErD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIM,eAAiC,IAAI,CAAA;AAC7D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAGtD,EAAA,MAAM,IAAA,GACJ,OAAO,MAAA,KAAW,WAAA,GACd,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA,GAC7C,EAAA;AAEN,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,iBAAA,EAAmB;AAEjC,IAAA,eAAe,SAAA,GAAY;AACzB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAEzB,gBAAA,EAAkB;AAAA,UACnB,IAAA;AAAA,UACA,SAAA,EAAW;AAAA,SACZ,CAAA;AAED,QAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzB,UAAA,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,WAAW,2BAA2B,CAAA;AACjE,UAAA;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,iBAAA,IAAqB,IAAI,CAAA;AAC9C,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,CAAS,2BAA2B,CAAA;AAAA,MACtC,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,EAAM,iBAAiB,CAAC,CAAA;AAEpC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACER,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EACjC,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EACb,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,sBAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,sBAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAoC,CAAA;AAAA,sBACnDA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,sBACpBA,cAAAA,CAAC,SAAY,SAAA,EAAU,sBAAA,EAAA,EAAb,CAAoC,CAC/C,CAAA,EACH;AAAA,KAAA,EACF,GACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,IAAS,CAAC,IAAA,EAAM;AAClB,IAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EACjC,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EACb,QAAA,EAAA;AAAA,sBAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,SAAA;AAAA,UACV,IAAA,EAAK,MAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,MAAA,EAAO,cAAA;AAAA,UACP,aAAA,EAAY,MAAA;AAAA,UAEZ,QAAA,kBAAAA,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cACf,WAAA,EAAa,GAAA;AAAA,cACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,OACF,EACF,CAAA;AAAA,sBACAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CAA0C,QAAA,EAAA,sBAAA,EAExD,CAAA;AAAA,sBACAW,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA8C,QAAA,EAAA;AAAA,QAAA,uIAAA;AAAA,QAEZ,YAAA;AAAA,QAAa;AAAA,OAAA,EAC5D,CAAA;AAAA,sBACAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,kBAAA;AAAA,YACN,SAAA,EAAU,8IAAA;AAAA,YACX,QAAA,EAAA;AAAA,cAAA,SAAA;AAAA,cACI;AAAA;AAAA;AAAA,SACL;AAAA,wBACAX,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,WAAA;AAAA,YACN,SAAA,EAAU,yJAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA;AACH,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,IAAA,CAAK,WAAA,IAAe,KAAK,WAAW,CAAA;AAErE,EAAA,uBACEW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EACjC,QAAA,EAAA;AAAA,oBAAAX,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAA;AAAA,QAC7B,WAAA,EAAa,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,OAAA,IAAW,EAAA;AAAA,QACpD,WAAA;AAAA,QACA,QAAA,EAAU,KAAK,WAAA,IAAe;AAAA;AAAA,KAChC;AAAA,oBAEAW,eAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,uDAAA,EAEjB,QAAA,EAAA;AAAA,sBAAAA,eAAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,kBAAA;AAAA,UACN,SAAA,EAAU,2GAAA;AAAA,UACX,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,YACI;AAAA;AAAA;AAAA,OACL;AAAA,MAGC,IAAA,CAAK,4BACJX,cAAAA,CAAC,UAAK,SAAA,EAAU,2FAAA,EACb,eAAK,QAAA,EACR,CAAA;AAAA,sBAIFA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gFAAA,EACX,eAAK,KAAA,EACR,CAAA;AAAA,sBAGAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACZ,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,0BACJX,cAAAA,CAAC,UAAK,SAAA,EAAU,6BAAA,EAA+B,eAAK,MAAA,EAAO,CAAA;AAAA,QAE5D,IAAA,CAAK,UAAU,aAAA,oBACdA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,QAE7C,aAAA,oBAAiBA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,QACtC,IAAA,CAAK,WAAA,mBACJW,eAAAA,CAAAC,qBAAA,EACE,QAAA,EAAA;AAAA,0BAAAZ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,0BAC5CW,gBAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,WAAA;AAAA,YAAY;AAAA,WAAA,EAAS;AAAA,SAAA,EACnC,CAAA,GACE;AAAA,OAAA,EACN,CAAA;AAAA,MAGC,KAAK,SAAA,oBACJX,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAK,IAAA,CAAK,SAAA;AAAA,UACV,KAAK,IAAA,CAAK,KAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA,OACZ,EACF,CAAA;AAAA,sBAIFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAAA,cAAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,eAAe,CAAA,EACtE,CAAA;AAAA,sBAGAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6FAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA;AAAA,UAAA,eAAA;AAAA,UAClC,YAAA;AAAA,UAAa;AAAA,SAAA,EAC7B,CAAA;AAAA,wBACAX,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uDAAsD,QAAA,EAAA,mGAAA,EAGnE,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,WAAA;AAAA,YACN,SAAA,EAAU,sLAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA;AACH,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC17BO,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAOc,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACdA,IAAM,cAAA,GAAiBC,0BAAA;AAAA,EACrB,uSAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EACE,+DAAA;AAAA,QACF,WAAA,EACE,8EAAA;AAAA,QACF,OAAA,EACE,0FAAA;AAAA,QACF,SAAA,EACE,wEAAA;AAAA,QACF,KAAA,EAAO,8CAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACR;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,eAAA;AAAA,QACT,EAAA,EAAI,6BAAA;AAAA,QACJ,EAAA,EAAI,sBAAA;AAAA,QACJ,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AASA,IAAM,MAAA,GAAeC,gBAAA,CAAA,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,UAAU,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAChE,IAAA,MAAM,IAAA,GAAO,UAAUC,cAAA,GAAO,QAAA;AAC9B,IAAA,uBACElB,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,QAC1D,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AACA,MAAA,CAAO,WAAA,GAAc,QAAA;ACpDrB,IAAM,KAAA,GAAcmB,gBAAA,CAAA,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,MAAM,GAAG,KAAA,IAAS,GAAA,KAAQ;AACtC,IAAA,uBACEnB,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,yWAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AACA,KAAA,CAAM,WAAA,GAAc,OAAA;ACkFpB,IAAM,aAAA,GAAgB,WAAA;AAEtB,IAAM,oBAAA,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAwB7B,IAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAa9B,SAASoB,YAAW,KAAA,EAA+B;AACjD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,OAAO,IAAI,IAAA,CAAK,KAAK,CAAA,CAAE,mBAAmB,OAAA,EAAS;AAAA,IACjD,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACN,CAAA;AACH;AAEA,SAAS,cAAA,CACP,GACA,CAAA,EACQ;AACR,EAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,CAAA,CAAE,eAAe,CAAA,CAAE,WAAA,IAAe,CAAC,CAAA,CAAE,OAAA,EAAQ;AACjE,EAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,CAAA,CAAE,eAAe,CAAA,CAAE,WAAA,IAAe,CAAC,CAAA,CAAE,OAAA,EAAQ;AACjE,EAAA,OAAO,EAAA,GAAK,EAAA;AACd;AAEA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,OAAO,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,EAAK;AAClC;AAEA,SAAS,QAAA,CAAY,KAAA,EAAY,IAAA,EAAc,QAAA,EAAuB;AACpE,EAAA,MAAM,KAAA,GAAA,CAAS,OAAO,CAAA,IAAK,QAAA;AAC3B,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,QAAQ,CAAA;AAC5C;AAEA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,OAAO,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,EAAQ;AAChC;AAMA,SAAS,eAAA,GAAkB;AACzB,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,UAAA,EAAW;AAC/B,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,EAAA,IAAM,MAAA,CAAO,SAAA;AAEhD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAId,cAAAA,CAAmC,EAAE,CAAA;AACnE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAeC,kBAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,KAAA,CAM7B,oBAAA,EAAsB;AAAA,QACvB,SAAA,EAAW,iBAAA;AAAA,QACX,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,IAAI,UAAA,CAAW,QAAQ,MAAA,EAAQ;AAC7B,QAAA,QAAA,CAAS,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAG,WAAW,0BAA0B,CAAA;AACpE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,kBAAkB,UAAA,CAAW,IAAA,EAAM,kBAAA,EAAoB,KAAA,IAAS,EAAC,EACpE,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,QAAA,CAAS,aAAa,CAAC,CAAA,CAC7C,KAAK,cAAc,CAAA;AAGtB,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC7B,cAAA,CAAe,GAAA,CAAI,OAAO,IAAA,KAAS;AACjC,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAKzB,qBAAA,EAAuB;AAAA,cACxB,MAAM,IAAA,CAAK,IAAA;AAAA,cACX,SAAA,EAAW;AAAA,aACZ,CAAA;AACD,YAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAM,iBAAA;AAC1B,YAAA,OAAO;AAAA,cACL,GAAG,IAAA;AAAA,cACH,SAAS,IAAA,EAAM,OAAA;AAAA,cACf,eAAe,IAAA,EAAM;AAAA,aACvB;AAAA,UACF,CAAA,CAAA,MAAQ;AACN,YAAA,OAAO,EAAE,GAAG,IAAA,EAAK;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,OACH;AAEA,MAAA,UAAA,CAAW,QAAQ,CAAA;AACnB,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,0BAA0B,CAAA;AAAA,IACrC,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,iBAAiB,CAAC,CAAA;AAE9B,EAAAC,gBAAU,MAAM;AACd,IAAA,YAAA,EAAa;AAAA,EACf,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM;AACnC;AAEA,SAAS,YAAY,KAAA,EAIlB;AACD,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM,GAAI,KAAA;AAEpC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACER,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,sBACdA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,2EAAA;AAAA,QAEV,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,0BAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,0BAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,0BAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,0BACtCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B;AAAA,SAAA,EAC9C;AAAA,OAAA;AAAA,MARK;AAAA,KAUR,CAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,KAAA,EAAM,CAAA,EAC9C,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,4CAAA,EAErC,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,qBACZW,eAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MAEC,IAAI,KAAA,CAAM,IAAA;AAAA,MACV,SAAA,EAAU,0EAAA;AAAA,MAET,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,6BACLX,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAK,KAAA,CAAM,SAAA;AAAA,YACX,GAAA,EAAI,EAAA;AAAA,YACJ,KAAA,EAAO,IAAA;AAAA,YACP,MAAA,EAAQ,GAAA;AAAA,YACR,OAAA,EAAQ,MAAA;AAAA,YACR,QAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBAEFW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EACV,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,WAAA,oBACLX,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,KAAA,CAAM,WAAA,EACnB,QAAA,EAAAoB,WAAAA,CAAW,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAW,CAAA,EACpD,CAAA;AAAA,YAED,KAAA,CAAM,MAAA,oBACLT,eAAAA,CAAAC,qBAAA,EACG,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,cACA,KAAA,CAAM;AAAA,aAAA,EACT;AAAA,WAAA,EAEJ,CAAA;AAAA,0BACAZ,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oDAAA,EACX,gBAAM,KAAA,EACT,CAAA;AAAA,UACC,MAAM,OAAA,mBACLA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DACb,QAAA,kBAAAA,cAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,SAAS,KAAA,CAAM,OAAA;AAAA,cACf,QAAQ,KAAA,CAAM;AAAA;AAAA,WAChB,EACF,CAAA,GAEA,KAAA,CAAM,OAAA,oBACJA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAAA,EACV,QAAA,EAAA,KAAA,CAAM,OAAA,EACT;AAAA,SAAA,EAGN;AAAA;AAAA,KAAA;AAAA,IA9CK,KAAA,CAAM;AAAA,GAgDd,CAAA,EACH,CAAA;AAEJ;AAMA,SAAS,YAAA,CAAa,EAAE,OAAA,EAAQ,EAAoC;AAClE,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAkB,MAAA,EAAO,UAAA,EAAW,CAAA,EACvD,CAAA;AAAA,EAEJ;AACA,EAAA,uBAAOA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAA6B,QAAA,EAAA,OAAA,EAAQ,CAAA;AAC7D;AAEA,SAAS,gBAAgB,KAAA,EAItB;AACD,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,WAAA,EAAY,GAAI,KAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIM,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAC5E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,CAAC,CAAA;AAElC,EAAA,MAAM,UAAA,GAAaO,aAAAA;AAAA,IACjB,MAAM,KAAA,CAAM,IAAA,CAAK,IAAI,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAC,CAAC,EAAE,IAAA,EAAK;AAAA,IAC/D,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,QAAA,GAAWA,cAAQ,MAAM;AAC7B,IAAA,MAAM,UAAA,GAAa,UAAU,KAAK,CAAA;AAClC,IAAA,OAAO,OAAA,CACJ,MAAA,CAAO,CAAC,KAAA,KAAU;AACjB,MAAA,IAAI,gBAAA,IAAoB,KAAA,CAAM,QAAA,KAAa,gBAAA,EAAkB;AAC3D,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,KAAA,CAAM,KAAA;AAAA,QACN,KAAA,CAAM,OAAA;AAAA,QACN,KAAA,CAAM,QAAA;AAAA,QACN,GAAI,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,QACnB,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GAAW,MAAM,OAAA,GAAU;AAAA,OACtD,CACG,IAAA,CAAK,GAAG,CAAA,CACR,WAAA,EAAY;AACf,MAAA,OAAO,QAAA,CAAS,SAAS,UAAU,CAAA;AAAA,IACrC,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,IAAI,CAAA,GAAI,cAAA,CAAe,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACnE,CAAA,EAAG,CAAC,OAAA,EAAS,KAAA,EAAO,gBAAgB,CAAC,CAAA;AAErC,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,QAAQ,CAAC,CAAA;AACpE,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,UAAU,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA;AAGvD,EAAAL,gBAAU,MAAM;AACd,IAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,EACX,CAAA,EAAG,CAAC,KAAA,EAAO,gBAAgB,CAAC,CAAA;AAE5B,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBACER,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,4CAAA,EAErC,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA;AAAA,UAACqB,kBAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,wEAAA;AAAA,YACV,aAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACArB,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,WAAA,EAAY,wCAAA;AAAA,YACZ,KAAA,EAAO,KAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,SAAA,EAAU,MAAA;AAAA,YACV,YAAA,EAAW;AAAA;AAAA;AACb,OAAA,EACF,CAAA;AAAA,MAEC,WAAW,MAAA,GAAS,CAAA,oBACnBW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,mBAAA,CAAoB,IAAI,CAAA;AAAA,YACvC,SAAA,EAAW,EAAA;AAAA,cACT,qEAAA;AAAA,cACA,gBAAA,KAAqB,OACjB,mDAAA,GACA;AAAA,aACN;AAAA,YACD,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,QACC,UAAA,CAAW,GAAA,CAAI,CAAC,QAAA,qBACfA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,mBAAA,CAAoB,QAAQ,CAAA;AAAA,YAC3C,SAAA,EAAW,EAAA;AAAA,cACT,qEAAA;AAAA,cACA,gBAAA,KAAqB,WACjB,mDAAA,GACA;AAAA,aACN;AAAA,YAEC,QAAA,EAAA;AAAA,WAAA;AAAA,UAVI;AAAA,SAYR;AAAA,OAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAEb,QAAA,EAAA;AAAA,sBAAAX,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,2EAAA;AAAA,UACV,aAAA,EAAY;AAAA;AAAA,OACd;AAAA,sBAEAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,KAAA,qBACdW,eAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,mBAAA;AAAA,UAGV,QAAA,EAAA;AAAA,4BAAAX,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,mJAAA;AAAA,gBACV,aAAA,EAAY,MAAA;AAAA,gBAEZ,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EAA6C;AAAA;AAAA,aAC/D;AAAA,4BAEAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DACb,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,gCAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8FAAA,EACb,gBAAM,QAAA,EACT,CAAA;AAAA,gCACAW,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4GAAA,EAA6G,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBACzH,KAAA,CAAM;AAAA,iBAAA,EACV,CAAA;AAAA,gCACAX,cAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,+BAAA;AAAA,oBACV,UAAU,KAAA,CAAM,IAAA;AAAA,oBAEf,QAAA,EAAAoB,WAAAA,CAAW,KAAA,CAAM,IAAI;AAAA;AAAA;AACxB,eAAA,EACF,CAAA;AAAA,cAEC,MAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,qBACjCpB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,wBACfA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAU,uHAAA;AAAA,kBAET,QAAA,EAAA;AAAA,iBAAA;AAAA,gBAHI;AAAA,eAKR,CAAA,EACH,CAAA;AAAA,8BAGFA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oDAAA,EACX,gBAAM,KAAA,EACT,CAAA;AAAA,8BAEAA,cAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,MAAM,OAAA,EAAS;AAAA,aAAA,EACxC,CAAA,EACF;AAAA;AAAA,SAAA;AAAA,QA/CK,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA;AAAA,OAiDtC,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,SAAA,CAAU,MAAA,KAAW,CAAA,oBACpBA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,4CAErC,CAAA,EACF,CAAA;AAAA,IAID,aAAa,CAAA,oBACZW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QACrC,QAAA;AAAA,QAAS,MAAA;AAAA,QAAK,UAAA;AAAA,QAAW,QAAA;AAAA,QAAI,QAAA,CAAS,MAAA;AAAA,QAAO;AAAA,OAAA,EACrD,CAAA;AAAA,sBACAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,YAChD,UAAU,QAAA,IAAY,CAAA;AAAA,YACtB,YAAA,EAAW,eAAA;AAAA,YAEX,QAAA,kBAAAA,cAAAA,CAACsB,uBAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SACnC;AAAA,wBACAtB,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,KAAK,GAAA,CAAI,UAAA,EAAY,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,YACzD,UAAU,QAAA,IAAY,UAAA;AAAA,YACtB,YAAA,EAAW,WAAA;AAAA,YAEX,QAAA,kBAAAA,cAAAA,CAACuB,wBAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACpC,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAGD,WAAA,IAAe,SAAA,CAAU,MAAA,GAAS,CAAA,oBACjCvB,eAAC,QAAA,EAAA,EAAO,IAAA,EAAK,qBAAA,EACV,QAAA,EAAA,IAAA,CAAK,SAAA,CAAU;AAAA,MACd,UAAA,EAAY,oBAAA;AAAA,MACZ,OAAA,EAAS,UAAA;AAAA,MACT,IAAA,EAAM,GAAG,WAAW,CAAA,UAAA,CAAA;AAAA,MACpB,eAAA,EAAiB,SAAA,CAAU,GAAA,CAAI,CAAC,OAAO,KAAA,MAAW;AAAA,QAChD,OAAA,EAAS,UAAA;AAAA,QACT,QAAA,EAAA,CAAW,QAAA,GAAW,CAAA,IAAK,QAAA,GAAW,KAAA,GAAQ,CAAA;AAAA,QAC9C,MAAM,KAAA,CAAM,KAAA;AAAA,QACZ,WAAA,EACE,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GACrB,MAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAC1B,MAAA;AAAA,QACN,eAAe,KAAA,CAAM;AAAA,OACvB,CAAE;AAAA,KACH,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAMO,SAAS,cAAc,KAAA,EAA2B;AACvD,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,WAAA,GAAc,YAAA;AAAA,IACd,SAAA,GAAY,WAAA;AAAA,IACZ,YAAA,GAAe,wEAAA;AAAA,IACf,QAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,QAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,GAAW;AAAA,GACb,GAAI,KAAA;AAEJ,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,UAAA,EAAW;AAC/B,EAAA,MAAM,mBAAA,GAAsB,eAAe,OAAA,EAAS,IAAA;AACpD,EAAA,MAAM,MAAM,eAAA,EAAgB;AAC5B,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,QAAQ,CAAA;AAC3C,EAAA,MAAM,eAAe,OAAA,IAAW,IAAA;AAEhC,EAAA,uBACEW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EACjC,QAAA,EAAA;AAAA,oBAAAX,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAO,QAAA,IAAY,SAAA;AAAA,QACnB,aAAa,cAAA,IAAkB,YAAA;AAAA,QAC/B,WAAA,EAAa,mBAAA;AAAA,QACb,QAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBAGAA,eAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,mDACjB,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sIAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAACwB,mBAAA,EAAA,EAAQ,SAAA,EAAU,aAAA,EAAc,eAAY,MAAA,EAAO,CAAA;AAAA,QACnD;AAAA,OAAA,EACH,CAAA;AAAA,sBACAxB,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uDACX,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,YAAA,EAAa;AAAA,KAAA,EAC7D,CAAA,EACF,CAAA;AAAA,oBAGAA,cAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,4BAAA,EAChB,yCACCA,cAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA,EAAa;AAAA;AAAA,wBAGfA,cAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,OAAO,GAAA,CAAI;AAAA;AAAA,KACb,EAEJ,CAAA;AAAA,IAGC,OAAA,oBACCA,cAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,qEACjB,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,oBACCX,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CACX,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,MAED,+BACCA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA8B,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,sBAEzDA,cAAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,OAAA;AAAA,UACN,SAAA,EAAU,yJAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;AChrBO,SAAS,YAAY,KAAA,EAA+B;AACzD,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,EAAA;AAC1B,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM,OAAO,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5D,EAAA,OAAO,IAAI,KAAA,GAAQ,IAAA,GAAO,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5C;AAUO,SAAS,QAAQ,IAAA,EAAgC;AACtD,EAAA,MAAM,IAAA,GACJ,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACnE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI;AAChC,EAAA,OAAO,GAAA,IAAO,GAAA,KAAQ,IAAA,GAAO,GAAA,CAAI,aAAY,GAAI,MAAA;AACnD;AAMA,eAAsB,YAAA,CACpB,GACA,IAAA,EACe;AACf,EAAA,CAAA,CAAE,cAAA,EAAe;AACjB,EAAA,MAAM,YAAY,MAChB,MAAA,CAAO,KAAK,IAAA,CAAK,OAAA,EAAS,UAAU,qBAAqB,CAAA;AAC3D,EAAA,MAAM,OACJ,IAAA,CAAK,QAAA,IACL,IAAA,CAAK,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAC3C,KAAK,KAAA,IACL,UAAA;AACF,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA,CAAK,SAAS,EAAE,IAAA,EAAM,QAAQ,CAAA;AACtD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,SAAA,EAAU;AACV,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACvC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,MAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,IAAA;AACb,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,CAAA,CAAE,MAAA,EAAO;AACT,IAAA,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACN,IAAA,SAAA,EAAU;AAAA,EACZ;AACF;ACuBA,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA4BxB,IAAM,oBAAA,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAwB7B,IAAM,cAAA,GAA0C;AAAA,EAC9C,MAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,eAAA,GAAyD;AAAA,EAC7D,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,aAAA;AAAA,EACZ,WAAA,EAAa,cAAA;AAAA,EACb,QAAA,EAAU,WAAA;AAAA,EACV,QAAA,EAAU,WAAA;AAAA,EACV,aAAA,EAAe;AACjB,CAAA;AAEA,SAAS,aAAa,CAAA,EAA2B;AAC/C,EAAA,OAAA,CAAQ,CAAA,CAAE,QAAA,IAAY,EAAA,EAAI,UAAA,CAAW,QAAQ,CAAA;AAC/C;AAOA,SAAS,gBAAA,CAAiB;AAAA,EACxB,KAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAAQ,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAAA,IAClC,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AACzC,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAC7C,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,YAAA;AAAA,IACjC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAEnB,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,GAAA,GAAA,CACH,KAAA,CAAM,QAAA,IAAY,MAAA,EAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,WAAA,EAAY,IAAK,MAAA;AAChE,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA;AAEvC,EAAA,uBACER,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,MAAA;AAAA,MACX,YAAA,EAAY,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,QAAA,CAAA;AAAA,MAC1B,OAAA,EAAS,OAAA;AAAA,MACT,SAAA,EAAU,4EAAA;AAAA,MAEV,QAAA,kBAAAW,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UAClC,SAAA,EAAU,yGAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,gCAAAX,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAA,EACX,gBAAM,KAAA,EACT,CAAA;AAAA,gCACAW,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EACV,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBACA,IAAA,GAAO,CAAA,MAAA,EAAM,IAAI,CAAA,CAAA,GAAK;AAAA,iBAAA,EACzB;AAAA,eAAA,EACF,CAAA;AAAA,8BACAX,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,OAAA;AAAA,kBACT,YAAA,EAAW,eAAA;AAAA,kBACX,SAAA,EAAU,wGAAA;AAAA,kBAEV,QAAA,kBAAAA,cAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,SAAA;AAAA,sBACV,IAAA,EAAK,MAAA;AAAA,sBACL,OAAA,EAAQ,WAAA;AAAA,sBACR,MAAA,EAAO,cAAA;AAAA,sBACP,WAAA,EAAa,CAAA;AAAA,sBAEb,QAAA,kBAAAA,cAAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,aAAA,EAAc,OAAA;AAAA,0BACd,cAAA,EAAe,OAAA;AAAA,0BACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF;AAAA;AACF,aAAA,EACF,CAAA;AAAA,4BAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEACb,QAAA,kBAAAA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,KAAK,KAAA,CAAM,OAAA;AAAA,gBACX,KAAK,KAAA,CAAM,KAAA;AAAA,gBACX,SAAA,EAAU;AAAA;AAAA,aACZ,EACF,CAAA;AAAA,4BAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCACb,QAAA,kBAAAW,eAAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,MAAM,KAAA,CAAM,OAAA;AAAA,gBACZ,MAAA,EAAO,QAAA;AAAA,gBACP,GAAA,EAAI,qBAAA;AAAA,gBACJ,QAAA,EAAQ,IAAA;AAAA,gBACR,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,KAAK,YAAA,CAAa,GAAG,KAAK,CAAA;AAAA,gBAC5B,CAAA;AAAA,gBACA,SAAA,EAAU,kJAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAX,cAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,SAAA;AAAA,sBACV,IAAA,EAAK,MAAA;AAAA,sBACL,OAAA,EAAQ,WAAA;AAAA,sBACR,MAAA,EAAO,cAAA;AAAA,sBACP,WAAA,EAAa,CAAA;AAAA,sBAEb,QAAA,kBAAAA,cAAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,aAAA,EAAc,OAAA;AAAA,0BACd,cAAA,EAAe,OAAA;AAAA,0BACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,mBACF;AAAA,kBAAM;AAAA;AAAA;AAAA,aAER,EACF;AAAA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AAMA,SAAS,SAAA,CAAU;AAAA,EACjB,KAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,GACf,IAAI,KAAK,KAAA,CAAM,SAAS,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS;AAAA,IACpD,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACN,CAAA,GACD,EAAA;AACJ,EAAA,MAAM,GAAA,GAAA,CACH,KAAA,CAAM,QAAA,IAAY,MAAA,EAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,WAAA,EAAY,IAAK,MAAA;AAChE,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA;AAGvC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIM,eAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,KAAA,GACJ,KAAA,CAAM,YAAA,IAAgB,CAAC,QAAA,mBACrBN,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAK,KAAA,CAAM,YAAA;AAAA,MACX,KAAK,KAAA,CAAM,KAAA;AAAA,MACX,SAAA,EAAU,sFAAA;AAAA,MACV,OAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI;AAAA;AAAA,KAEnC,CAAA,mBAEAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DACb,QAAA,kBAAAA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oCAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAO,cAAA;AAAA,MAEP,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,WAAA,EAAa,GAAA;AAAA,UACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,GACF,EACF,CAAA;AAGJ,EAAA,uBACEW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mIAAA,EAEZ,QAAA,EAAA;AAAA,IAAA,SAAA,IAAa,YAAA,CAAa,KAAK,CAAA,mBAC9BX,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,QAC9B,YAAA,EAAY,CAAA,QAAA,EAAW,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,QAClC,SAAA,EAAU,uCAAA;AAAA,QAET,QAAA,EAAA;AAAA;AAAA,wBAGHA,cAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,MAAM,KAAA,CAAM,OAAA;AAAA,QACZ,MAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAI,qBAAA;AAAA,QACJ,YAAA,EAAY,CAAA,KAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,QAC/B,SAAA,EAAU,OAAA;AAAA,QAET,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBAGFW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,sBAAAX,cAAAA,CAAC,UAAK,SAAA,EAAU,sGAAA,EACb,0BAAgB,KAAA,CAAM,QAAQ,CAAA,IAAK,KAAA,CAAM,QAAA,EAC5C,CAAA;AAAA,sBACAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2DAAA,EACX,gBAAM,KAAA,EACT,CAAA;AAAA,MACC,KAAA,CAAM,+BACLA,cAAAA,CAAC,OAAE,SAAA,EAAU,iDAAA,EACV,gBAAM,WAAA,EACT,CAAA;AAAA,sBAEFW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,0BAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,UAClC,IAAA,oBACCW,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAZ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,4BAC5CA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,EAAK;AAAA,WAAA,EACd,CAAA;AAAA,UAED,IAAA,oBACCW,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAZ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,4BAC5CA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,EAAK;AAAA,WAAA,EACd;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACAW,eAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,MAAM,KAAA,CAAM,OAAA;AAAA,YACZ,MAAA,EAAO,QAAA;AAAA,YACP,GAAA,EAAI,qBAAA;AAAA,YACJ,QAAA,EAAQ,IAAA;AAAA,YACR,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,cAAA,KAAK,YAAA,CAAa,GAAG,KAAK,CAAA;AAAA,YAC5B,CAAA;AAAA,YACA,SAAA,EAAU,mFAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAX,cAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,SAAA;AAAA,kBACV,IAAA,EAAK,MAAA;AAAA,kBACL,OAAA,EAAQ,WAAA;AAAA,kBACR,MAAA,EAAO,cAAA;AAAA,kBACP,WAAA,EAAa,CAAA;AAAA,kBAEb,QAAA,kBAAAA,cAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,aAAA,EAAc,OAAA;AAAA,sBACd,cAAA,EAAe,OAAA;AAAA,sBACf,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,eACF;AAAA,cAAM;AAAA;AAAA;AAAA;AAER,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAMA,SAAS,gBAAA,CAAiB;AAAA,EACxB,OAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,WAAA;AAC5C,EAAA,MAAM,gBAAgB,IAAA,GAClB,IAAI,KAAK,IAAI,CAAA,CAAE,mBAAmB,OAAA,EAAS;AAAA,IACzC,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACN,CAAA,GACD,EAAA;AAEJ,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIM,eAAS,KAAK,CAAA;AAE9C,EAAA,uBACEK,eAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,CAAA;AAAA,MACjC,SAAA,EAAU,mIAAA;AAAA,MAET,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,SAAA,IAAa,CAAC,QAAA,mBACrBX,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAK,OAAA,CAAQ,SAAA;AAAA,YACb,KAAK,OAAA,CAAQ,KAAA;AAAA,YACb,SAAA,EAAU,oFAAA;AAAA,YACV,OAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI;AAAA;AAAA,WAEnC,CAAA,mBAEAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oCAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,MAAA,EAAO,cAAA;AAAA,YAEP,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,WAAA,EAAa,GAAA;AAAA,gBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,SACF,EACF,CAAA;AAAA,wBAGFW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAA,CAAQ,4BACPX,cAAAA,CAAC,UAAK,SAAA,EAAU,sGAAA,EACb,kBAAQ,QAAA,EACX,CAAA;AAAA,0BAEFA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oGAAA,EACX,kBAAQ,KAAA,EACX,CAAA;AAAA,0BACAA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDACV,QAAA,EAAA,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,cAAA,IAAkB,EAAA,EAChD,CAAA;AAAA,0BACAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACZ,QAAA,EAAA;AAAA,YAAA,OAAA,CAAQ,0BACPX,cAAAA,CAAC,UAAK,SAAA,EAAU,aAAA,EAAe,kBAAQ,MAAA,EAAO,CAAA;AAAA,YAE/C,OAAA,CAAQ,UAAU,aAAA,oBACjBA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,YAE7C,aAAA,oBAAiBA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,YACtC,OAAA,CAAQ,WAAA,mBACPW,eAAAA,CAAAC,qBAAA,EACE,QAAA,EAAA;AAAA,8BAAAZ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,8BAC5CW,gBAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,gBAAA,OAAA,CAAQ,WAAA;AAAA,gBAAY;AAAA,eAAA,EAAS;AAAA,aAAA,EACtC,CAAA,GACE;AAAA,WAAA,EACN;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAMO,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,SAAA,GAAY,mBAAA;AAAA,IACZ,YAAA,GAAe,2FAAA;AAAA,IACf,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,QAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA,GAAoB,IAAA;AAAA,IACpB,oBAAA,GAAuB,QAAA;AAAA,IACvB,kBAAA,GAAqB;AAAA,GACvB,GAAI,KAAA;AAEJ,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,UAAA,EAAW;AAC/B,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,EAAA,IAAM,MAAA,CAAO,SAAA;AAChD,EAAA,MAAM,YAAA,GAAe,iBAAA,IAAqB,OAAA,EAAS,YAAA,IAAgB,MAAA;AAEnE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIL,cAAAA,CAA0B,EAAE,CAAA;AACxD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAE1C,KAAK,CAAA;AACP,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAgC,EAAE,CAAA;AAClE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA+B,IAAI,CAAA;AAEjE,EAAA,MAAM,WAAA,GAAcC,kBAAY,YAAY;AAC1C,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,GAAA;AAIlB,MAAA,MAAM,SAAA,GAAY,EAAA;AAClB,MAAA,MAAM,MAAuB,EAAC;AAC9B,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,SAAA,EAAW,OAAA,EAAA,EAAW;AACpD,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAEzB,eAAA,EAAiB;AAAA,UAClB,SAAA,EAAW,iBAAA;AAAA,UACX,KAAA,EAAO,SAAA;AAAA,UACP;AAAA,SACD,CAAA;AACD,QAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzB,UAAA,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,WAAW,0BAA0B,CAAA;AAChE,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAM,oBAAA;AAC1B,QAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,KAAA,IAAS,EAAC;AAC9B,QAAA,GAAA,CAAI,IAAA,CAAK,GAAG,KAAK,CAAA;AACjB,QAAA,IAAI,CAAC,IAAA,EAAM,OAAA,IAAW,KAAA,CAAM,WAAW,CAAA,EAAG;AAC1C,QAAA,MAAA,IAAU,SAAA;AAAA,MACZ;AACA,MAAA,SAAA,CAAU,GAAG,CAAA;AACb,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,0BAA0B,CAAA;AAAA,IACrC,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,iBAAiB,CAAC,CAAA;AAE9B,EAAAC,gBAAU,MAAM;AACd,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAKhB,EAAA,MAAM,aAAA,GAAgBD,kBAAY,YAAY;AAC5C,IAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,iBAAA,EAAmB;AAC5C,MAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,MAAA;AAAA,IACF;AACA,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,GAAA;AAMlB,MAAA,MAAM,SAAA,GAAY,EAAA;AAClB,MAAA,MAAM,MAA6B,EAAC;AACpC,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,SAAA,EAAW,OAAA,EAAA,EAAW;AACpD,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAKzB,oBAAA,EAAsB;AAAA,UACvB,SAAA,EAAW,iBAAA;AAAA,UACX,KAAA,EAAO,SAAA;AAAA,UACP;AAAA,SACD,CAAA;AACD,QAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AAGzB,UAAA,WAAA,CAAY,EAAE,CAAA;AACd,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAM,kBAAA;AAC1B,QAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,KAAA,IAAS,EAAC;AAC9B,QAAA,GAAA,CAAI,IAAA,CAAK,GAAG,KAAK,CAAA;AACjB,QAAA,IAAI,CAAC,IAAA,EAAM,OAAA,IAAW,KAAA,CAAM,WAAW,CAAA,EAAG;AAC1C,QAAA,MAAA,IAAU,SAAA;AAAA,MACZ;AACA,MAAA,MAAM,SAAA,GAAY,GAAA,CACf,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,QAAA,CAAS,OAAO,CAAC,CAAA,CACvC,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACd,QAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,CAAA,CAAE,eAAe,CAAA,CAAE,WAAA,IAAe,CAAC,CAAA,CAAE,OAAA,EAAQ;AACjE,QAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,CAAA,CAAE,eAAe,CAAA,CAAE,WAAA,IAAe,CAAC,CAAA,CAAE,OAAA,EAAQ;AACjE,QAAA,OAAO,EAAA,GAAK,EAAA;AAAA,MACd,CAAC,CAAA;AACH,MAAA,WAAA,CAAY,SAAS,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AAEN,MAAA,WAAA,CAAY,EAAE,CAAA;AAAA,IAChB,CAAA,SAAE;AACA,MAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,iBAAA,EAAmB,iBAAiB,CAAC,CAAA;AAEjD,EAAAC,gBAAU,MAAM;AACd,IAAA,aAAA,EAAc;AAAA,EAChB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,oBAAoB,cAAA,CAAe,MAAA;AAAA,IAAO,CAAC,MAC/C,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAC;AAAA,GACrC;AACA,EAAA,MAAM,aAAA,GACJ,cAAA,KAAmB,KAAA,GACf,MAAA,GACA,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,cAAc,CAAA;AAExD,EAAA,MAAM,OAAA,GAAA,CACJ,mBAAmB,KAAA,GAAQ,iBAAA,GAAoB,CAAC,cAAc,CAAA,EAE7D,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACb,GAAA;AAAA,IACA,OAAO,aAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,QAAA,KAAa,GAAG,CAAA,CAChC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS;AAAA,GAC7C,CAAE,EACD,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,SAAS,CAAC,CAAA;AAEnC,EAAA,uBACEG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EAChC,QAAA,EAAA;AAAA,IAAA,QAAA,oBACCX,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,QAAA;AAAA,QACP,aAAa,cAAA,IAAkB,YAAA;AAAA,QAC/B,WAAA;AAAA,QACA,QAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBAIFA,cAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,2BACjB,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+BAAA,EACb,QAAA,EAAA;AAAA,sBAAAX,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2EAAA,EACX,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,MAAA,CAC9D,eAAe,YAAA,qBACfW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uDAAA,EACZ,QAAA,EAAA;AAAA,QAAA,WAAA,oBACCX,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,WAAA;AAAA,YACN,MAAA,EAAO,QAAA;AAAA,YACP,GAAA,EAAI,qBAAA;AAAA,YACJ,SAAA,EAAU,wIAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,QAED,gCACCA,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,UAAU,YAAY,CAAA,CAAA;AAAA,YAC5B,SAAA,EAAU,yHAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EAEJ;AAAA,KAAA,EAEJ,GACF,CAAA,EACF,CAAA;AAAA,IAIC,iBAAA,KAAsB,eAAA,IAAmB,QAAA,CAAS,MAAA,GAAS,sBAC1DA,cAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,gBAAA,EACjB,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,sBAAAX,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4CAAA,EACX,QAAA,EAAA,kBAAA,EACH,CAAA;AAAA,sBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACZ,QAAA,EAAA,eAAA,GACG,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,sBACbW,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,yDAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,4BACxCW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,8BAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,8BAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,8BAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B;AAAA,aAAA,EAC9C;AAAA;AAAA,SAAA;AAAA,QARK;AAAA,OAUR,CAAA,GACD,QAAA,CAAS,GAAA,CAAI,CAAC,sBACZA,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UAEC,OAAA,EAAS,CAAA;AAAA,UACT,QAAA,EAAU;AAAA,SAAA;AAAA,QAFL,CAAA,CAAE;AAAA,OAIV,CAAA,EACP;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAIFA,cAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,gBAAA,EACjB,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACZ,QAAA,EAAA,OAAA,mBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBACvBW,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,yDAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,0BACxCW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,4BAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,4BAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,4BAC5CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B;AAAA,WAAA,EAC9C;AAAA;AAAA,OAAA;AAAA,MARK;AAAA,KAUR,CAAA,EACH,CAAA,GACE,KAAA,mBACFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,KAAA,EAAM,CAAA,EAC9C,CAAA,GACE,MAAA,CAAO,MAAA,KAAW,CAAA,mBACpBA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,kBAAAW,eAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uBAAA,EAAwB,QAAA,EAAA;AAAA,MAAA,sDAAA;AAAA,MAElC,YAAA,mBACCA,eAAAA,CAAAC,mBAAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,YAAA;AAAA,wBACDZ,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,UAAU,YAAY,CAAA,CAAA;AAAA,YAC5B,SAAA,EAAU,8BAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA;AACH,OAAA,EACF,CAAA,GAEA,+BAAA;AAAA,MACA;AAAA,KAAA,EAEJ,CAAA,EACF,CAAA,mBAEAW,eAAAA,CAAAC,qBAAA,EAEG,QAAA,EAAA;AAAA,MAAA,iBAAA,CAAkB,MAAA,GAAS,CAAA,oBAC1BZ,cAAAA,CAAC,SAAI,SAAA,EAAU,2CAAA,EACX,QAAA,EAAA,CAAC,KAAA,EAAO,GAAG,iBAAiB,CAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM;AACnD,QAAA,MAAM,SAAS,cAAA,KAAmB,CAAA;AAClC,QAAA,uBACEA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,iBAAA,CAAkB,CAAC,CAAA;AAAA,YAClC,SAAA,EAAW,CAAA,6DAAA,EACT,MAAA,GACI,oCAAA,GACA,sDACN,CAAA,CAAA;AAAA,YAEC,QAAA,EAAA,CAAA,KAAM,KAAA,GACH,KAAA,GACC,eAAA,CAAgB,CAA0B,CAAA,IAAK;AAAA,WAAA;AAAA,UAX/C;AAAA,SAYP;AAAA,MAEJ,CAAC,CAAA,EACH,CAAA;AAAA,MAGD,OAAA,CAAQ,IAAI,CAAC,KAAA,qBACZW,eAAAA,CAAC,KAAA,EAAA,EAAoB,WAAU,OAAA,EAC7B,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAAC,QAAG,SAAA,EAAU,4CAAA,EACX,0BAAgB,KAAA,CAAM,GAAG,CAAA,IAAK,KAAA,CAAM,GAAA,EACvC,CAAA;AAAA,wBACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACZ,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA,qBAChBA,cAAAA,CAAC,SAAA,EAAA,EAAqB,OAAO,CAAA,EAAG,SAAA,EAAW,cAA3B,CAAA,CAAE,EAAqC,CACxD,CAAA,EACH;AAAA,OAAA,EAAA,EARQ,KAAA,CAAM,GAShB,CACD,CAAA;AAAA,MAGA,YAAA,oBACCW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4CAAA,EAA6C,QAAA,EAAA,eAAA,EAE3D,CAAA;AAAA,wBACAW,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA;AAAA,UAAA,oDAAA;AAAA,UACgB,GAAA;AAAA,0BACnDX,cAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,UAAU,YAAY,CAAA,CAAA;AAAA,cAC5B,SAAA,EAAU,8BAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA;AACH,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,GAEJ,CAAA,EACF,CAAA;AAAA,oBAEAA,eAAC,gBAAA,EAAA,EAAiB,KAAA,EAAO,SAAS,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AAAA,GAAA,EACrE,CAAA;AAEJ;AC1xBA,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA0BjB,SAAS,cAAc,KAAA,EAA2B;AACvD,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,SAAA,GAAY,8BAAA;AAAA,IACZ,YAAA,GAAe,sDAAA;AAAA,IACf,SAAA,GAAY,EAAA;AAAA,IACZ,QAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,UAAA,EAAW;AAC/B,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,EAAA,IAAM,MAAA,CAAO,SAAA;AAChD,EAAA,MAAM,WAAA,GAAc,WAAA,IAAe,OAAA,EAAS,IAAA,IAAQ,MAAA,CAAO,SAAA;AAE3D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIM,cAAAA,CAA0B,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,cAAA,GAAiBC,kBAAY,YAAY;AAC7C,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,GAAA;AAGlB,MAAA,MAAM,SAAA,GAAY,EAAA;AAClB,MAAA,MAAM,MAAuB,EAAC;AAC9B,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,SAAA,EAAW,OAAA,EAAA,EAAW;AACpD,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAEzB,eAAA,EAAiB;AAAA,UAClB,SAAA,EAAW,iBAAA;AAAA,UACX,KAAA,EAAO,SAAA;AAAA,UACP;AAAA,SACD,CAAA;AACD,QAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzB,UAAA,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,WAAW,0BAA0B,CAAA;AAChE,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAM,oBAAA;AAC1B,QAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,KAAA,IAAS,EAAC;AAC9B,QAAA,GAAA,CAAI,IAAA,CAAK,GAAG,KAAK,CAAA;AACjB,QAAA,IAAI,CAAC,IAAA,EAAM,OAAA,IAAW,KAAA,CAAM,WAAW,CAAA,EAAG;AAC1C,QAAA,MAAA,IAAU,SAAA;AAAA,MACZ;AACA,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK;AAAA,OACtE;AACA,MAAA,YAAA,CAAa,GAAG,CAAA;AAChB,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,0BAA0B,CAAA;AAAA,IACrC,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,iBAAiB,CAAC,CAAA;AAE9B,EAAAC,gBAAU,MAAM;AACd,IAAA,cAAA,EAAe;AAAA,EACjB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,uBACEG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,2BAAA,EAA8B,SAAS,CAAA,CAAA,EACrD,QAAA,EAAA;AAAA,oBAAAX,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,QAAA,IAAY,CAAA,iBAAA,EAAe,WAAW,CAAA,CAAA;AAAA,QAC7C,aAAa,cAAA,IAAkB,YAAA;AAAA,QAC/B,WAAA;AAAA,QACA,QAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBAGAA,eAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,sCACjB,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EACb,QAAA,EAAA;AAAA,sBAAAX,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EACX,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDACV,QAAA,EAAA,YAAA,EACH;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAEAA,cAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,8CAAA,EAChB,QAAA,EAAA,OAAA,mBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,SAAI,SAAA,EAAU,gFAAA,EAAiF,CAAA,EAClG,CAAA,GACE,KAAA,mBACFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,KAAA,EAAM,CAAA,EACtD,CAAA,GACE,SAAA,CAAU,MAAA,KAAW,CAAA,mBACvBA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,iCAAA,EAAkC,QAAA,EAAA,iCAAA,EAE/C,CAAA,EACF,CAAA,mBAEAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gFAAA,EACX,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM;AACpB,MAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,CAAE,QAAQ,CAAA;AACnC,MAAA,uBACEW,eAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,iFAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,gCAAAX,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kDAAA,EACX,YAAE,KAAA,EACL,CAAA;AAAA,gBACC,CAAA,CAAE,2BACDA,cAAAA,CAAC,UAAK,SAAA,EAAU,yEAAA,EACb,YAAE,OAAA,EACL;AAAA,eAAA,EAEJ,CAAA;AAAA,cACC,CAAA,CAAE,+BACDA,cAAAA,CAAC,OAAE,SAAA,EAAU,iDAAA,EACV,YAAE,WAAA,EACL,CAAA;AAAA,8BAEFW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACb,QAAA,EAAA;AAAA,gCAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,gBAClC,IAAA,oBACCW,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,kCAAAZ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,kCAC5CA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,EAAK;AAAA,iBAAA,EACd;AAAA,eAAA,EAEJ;AAAA,aAAA,EACF,CAAA;AAAA,4BACAW,eAAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,MAAM,CAAA,CAAE,OAAA;AAAA,gBACR,MAAA,EAAO,QAAA;AAAA,gBACP,GAAA,EAAI,qBAAA;AAAA,gBACJ,QAAA,EAAQ,IAAA;AAAA,gBACR,YAAA,EAAY,CAAA,SAAA,EAAY,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,gBAC/B,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,KAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,gBACxB,CAAA;AAAA,gBACA,SAAA,EAAU,gKAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAX,cAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,SAAA;AAAA,sBACV,IAAA,EAAK,MAAA;AAAA,sBACL,OAAA,EAAQ,WAAA;AAAA,sBACR,MAAA,EAAO,cAAA;AAAA,sBACP,aAAA,EAAY,MAAA;AAAA,sBAEZ,QAAA,kBAAAA,cAAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,aAAA,EAAc,OAAA;AAAA,0BACd,cAAA,EAAe,OAAA;AAAA,0BACf,WAAA,EAAa,CAAA;AAAA,0BACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,mBACF;AAAA,kBAAM;AAAA;AAAA;AAAA;AAER;AAAA,SAAA;AAAA,QAvDK,CAAA,CAAE;AAAA,OAwDT;AAAA,IAEJ,CAAC,GACH,CAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ","file":"index.js","sourcesContent":["import type { ReactNode } from \"react\";\n\nimport ReactMarkdown from \"react-markdown\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport remarkGfm from \"remark-gfm\";\n\nimport type { Components } from \"react-markdown\";\n\nexport interface MarkdownProps {\n /** Markdown source to render. */\n children: string;\n /** Additional classes for the wrapper element. */\n className?: string;\n /** Render without a wrapping block element, suitable for inline content. */\n inline?: boolean;\n /** Optional react-markdown component overrides. */\n components?: Components;\n}\n\nconst defaultComponents: Components = {\n a: ({ href, children, ...props }) => {\n const isExternal =\n typeof href === \"string\" &&\n (href.startsWith(\"http://\") || href.startsWith(\"https://\"));\n return (\n <a\n href={href}\n {...props}\n {...(isExternal\n ? { target: \"_blank\", rel: \"noopener noreferrer\" }\n : { rel: \"noopener noreferrer\" })}\n >\n {children}\n </a>\n );\n },\n};\n\n/**\n * Shared markdown renderer for website content.\n *\n * - Uses `react-markdown` for standards-compliant parsing.\n * - Enables GitHub Flavored Markdown (tables, task lists, strikethrough, autolinks).\n * - Sanitizes HTML via `rehype-sanitize` so raw markup in markdown is stripped.\n * - External links open in a new tab with safe rel attributes.\n */\nexport function Markdown({\n children,\n className,\n inline,\n components,\n}: MarkdownProps): ReactNode {\n const content = (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeSanitize]}\n components={{ ...defaultComponents, ...components }}\n {...(inline ? { disallowedElements: [\"p\"], unwrapDisallowed: true } : {})}\n >\n {children}\n </ReactMarkdown>\n );\n\n if (inline) {\n return <span className={className}>{content}</span>;\n }\n\n return <div className={className}>{content}</div>;\n}\n","const LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"::1\"]);\nconst RESERVED_HEADERS = new Set([\n \"authorization\",\n \"cookie\",\n \"x-actor-id\",\n \"x-actor-type\",\n \"x-consent-granted-by\",\n \"x-consent-scope\",\n \"x-consent-granted-at\",\n \"x-consent-expires-at\",\n]);\n\nexport function validateGatewayUrl(value: string): string {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"Gateway URL must be a valid absolute URL\");\n }\n\n if (url.protocol === \"https:\") {\n return url.toString();\n }\n\n if (\n url.protocol === \"http:\" &&\n LOOPBACK_HOSTS.has(url.hostname.toLowerCase())\n ) {\n return url.toString();\n }\n\n throw new Error(\"Gateway URL must use HTTPS unless it targets localhost\");\n}\n\nexport function sanitizeHeaders(\n headers?: Record<string, string>,\n): Record<string, string> | undefined {\n if (!headers) return undefined;\n\n return Object.fromEntries(\n Object.entries(headers).filter(\n ([key]) => !RESERVED_HEADERS.has(key.toLowerCase()),\n ),\n );\n}\n","/**\n * Lightweight GraphQL client for the Burdenoff Web SDK.\n * Uses native fetch - zero external dependencies.\n * All calls are unauthenticated (public gateway operations only).\n */\n\nimport { sanitizeHeaders, validateGatewayUrl } from \"./security\";\n\nexport interface WebSDKClientConfig {\n /** Global public gateway URL (e.g. \"https://api.burdenoff.com/global/graphql\") */\n gatewayUrl: string;\n /** Platform product ID for scoping operations */\n productId: string;\n /** Product slug (used for public product queries) */\n productSlug?: string;\n /** reCAPTCHA site key (if not fetched from product config) */\n recaptchaSiteKey?: string;\n /** Rybbit analytics site ID */\n rybbitSiteId?: string;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n /**\n * Per-request timeout in ms. Kept below the gateway's operation timeout so a\n * stalled request surfaces as an error the UI can render, instead of leaving\n * a page stuck on loading skeletons forever. Default 12000.\n */\n timeoutMs?: number;\n /**\n * Extra attempts for transient failures (timeout / network / 5xx / 429) on\n * QUERIES ONLY. Mutations are never retried — a retried contact-form or\n * waitlist submit would double-submit. Default 1 (2 attempts total).\n */\n maxRetries?: number;\n}\n\nexport interface GraphQLResponse<T = Record<string, unknown>> {\n data?: T;\n errors?: Array<{\n message: string;\n locations?: Array<{ line: number; column: number }>;\n path?: Array<string | number>;\n extensions?: Record<string, unknown>;\n }>;\n}\n\nexport class WebSDKClient {\n private config: WebSDKClientConfig;\n private queryCache = new Map<\n string,\n { data: GraphQLResponse<unknown>; ts: number }\n >();\n private inflight = new Map<string, Promise<GraphQLResponse<unknown>>>();\n private static CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n private static MAX_CACHE_ENTRIES = 100;\n private static DEFAULT_TIMEOUT_MS = 12_000;\n private static DEFAULT_MAX_RETRIES = 1;\n private static RETRY_BASE_DELAY_MS = 400;\n\n constructor(config: WebSDKClientConfig) {\n this.config = {\n ...config,\n gatewayUrl: validateGatewayUrl(config.gatewayUrl),\n headers: sanitizeHeaders(config.headers),\n };\n }\n\n getConfig(): WebSDKClientConfig {\n return this.config;\n }\n\n /**\n * Execute a GraphQL query (with deduplication and caching)\n */\n async query<T = Record<string, unknown>>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n const cacheKey = JSON.stringify({ query, variables });\n\n // Return cached response if still valid, evict if expired\n const cached = this.queryCache.get(cacheKey);\n if (cached) {\n if (Date.now() - cached.ts < WebSDKClient.CACHE_TTL) {\n return cached.data as GraphQLResponse<T>;\n }\n this.queryCache.delete(cacheKey);\n }\n\n // Deduplicate: if same query is already in-flight, reuse the promise\n const existing = this.inflight.get(cacheKey);\n if (existing) {\n return existing as Promise<GraphQLResponse<T>>;\n }\n\n const promise = this.request<T>(query, variables)\n .then((result) => {\n // Cache successful responses only\n if (result.data && !result.errors?.length) {\n if (this.queryCache.size >= WebSDKClient.MAX_CACHE_ENTRIES) {\n const oldestEntry = this.queryCache.keys().next().value;\n if (oldestEntry) {\n this.queryCache.delete(oldestEntry);\n }\n }\n this.queryCache.set(cacheKey, { data: result, ts: Date.now() });\n }\n return result;\n })\n .finally(() => {\n this.inflight.delete(cacheKey);\n });\n\n this.inflight.set(cacheKey, promise);\n return promise;\n }\n\n /**\n * Execute a GraphQL mutation\n */\n async mutate<T = Record<string, unknown>>(\n mutation: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n // retry=false: a retried mutation could double-submit (contact form,\n // waitlist signup, order). Only the timeout applies here.\n return this.request<T>(mutation, variables, false);\n }\n\n /** HTTP statuses worth another attempt — transient server/edge conditions. */\n private static isRetriableStatus(status: number): boolean {\n return status === 429 || status === 408 || (status >= 500 && status < 600);\n }\n\n private static sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Perform the HTTP call with a hard timeout. Every outcome resolves to a\n * GraphQLResponse — callers never hang, so a UI's `loading` state always\n * settles into data or a renderable error.\n */\n private async attempt<T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n timeoutMs: number,\n ): Promise<{ res: GraphQLResponse<T>; retriable: boolean }> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetch(this.config.gatewayUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-product-id\": this.config.productId,\n ...this.config.headers,\n },\n body: JSON.stringify({ query, variables }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n console.error(\n \"[WebSDK] GraphQL request failed\",\n response.status,\n response.statusText,\n );\n return {\n res: {\n errors: [\n {\n message: `HTTP ${response.status}: ${response.statusText}`,\n extensions: { code: `HTTP_${response.status}` },\n },\n ],\n },\n retriable: WebSDKClient.isRetriableStatus(response.status),\n };\n }\n\n return {\n res: (await response.json()) as GraphQLResponse<T>,\n retriable: false,\n };\n } catch (error) {\n const aborted =\n error instanceof Error &&\n (error.name === \"AbortError\" || controller.signal.aborted);\n const message = aborted\n ? `Request timed out after ${timeoutMs}ms`\n : error instanceof Error\n ? error.message\n : \"Network error\";\n console.error(\"[WebSDK] Network error\", message);\n return {\n res: {\n errors: [\n {\n message,\n extensions: { code: aborted ? \"TIMEOUT\" : \"NETWORK_ERROR\" },\n },\n ],\n },\n // Transport-level failures are worth one more try; a genuine outage\n // just fails twice quickly and still renders an error state.\n retriable: true,\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async request<T>(\n query: string,\n variables?: Record<string, unknown>,\n retry = true,\n ): Promise<GraphQLResponse<T>> {\n const timeoutMs = this.config.timeoutMs ?? WebSDKClient.DEFAULT_TIMEOUT_MS;\n const maxRetries = retry\n ? (this.config.maxRetries ?? WebSDKClient.DEFAULT_MAX_RETRIES)\n : 0;\n\n let last: GraphQLResponse<T> | undefined;\n for (let i = 0; i <= maxRetries; i++) {\n const { res, retriable } = await this.attempt<T>(\n query,\n variables,\n timeoutMs,\n );\n if (!retriable || i === maxRetries) return res;\n last = res;\n // Small backoff with jitter so a burst of clients doesn't retry in lockstep.\n await WebSDKClient.sleep(\n WebSDKClient.RETRY_BASE_DELAY_MS * (i + 1) + Math.random() * 200,\n );\n }\n return last as GraphQLResponse<T>;\n }\n}\n","/**\n * React context provider for the Web SDK client.\n * Wraps the application with WebSDKClient configuration.\n */\n\"use client\";\n\nimport { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { resolveGatewayUrl } from \"./gateway-resolver\";\nimport { WebSDKClient, type WebSDKClientConfig } from \"./graphql-client\";\n\nconst WebSDKContext = createContext<WebSDKClient | null>(null);\n\nexport interface WebSDKProviderProps {\n /** SDK client configuration */\n config: WebSDKClientConfig;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Provider component that makes the WebSDKClient available to all child components.\n *\n * @example\n * ```tsx\n * <WebSDKProvider config={{\n * gatewayUrl: \"https://api.burdenoff.com/global/graphql\",\n * productId: \"your-product-id\",\n * productSlug: \"your-product\",\n * }}>\n * <App />\n * </WebSDKProvider>\n * ```\n */\nexport function WebSDKProvider({ config, children }: WebSDKProviderProps) {\n const client = useMemo(() => {\n const resolvedConfig = {\n ...config,\n gatewayUrl: resolveGatewayUrl(config.gatewayUrl),\n };\n return new WebSDKClient(resolvedConfig);\n }, [config]);\n\n return (\n <WebSDKContext.Provider value={client}>{children}</WebSDKContext.Provider>\n );\n}\n\n/**\n * Hook to access the WebSDKClient instance.\n * Must be used within a WebSDKProvider.\n */\nexport function useWebSDK(): WebSDKClient {\n const client = useContext(WebSDKContext);\n if (!client) {\n throw new Error(\"useWebSDK must be used within a WebSDKProvider\");\n }\n return client;\n}\n\n/**\n * Hook to access the SDK configuration.\n * Useful for components that need config values like productId, recaptchaSiteKey, etc.\n */\nexport function useWebSDKConfig(): WebSDKClientConfig {\n const client = useWebSDK();\n return client.getConfig();\n}\n","/**\n * Product Provider\n *\n * React context and hooks for accessing product metadata from the global tenant service.\n * Fetches product info (name, logo, SEO, contact, reCAPTCHA key, etc.) on mount\n * and provides it to all child components.\n */\n\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useLayoutEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ProductData {\n id: string;\n name: string;\n slug: string;\n description?: string | null;\n status: string;\n logoUrl?: string | null;\n website?: string | null;\n appUrl?: string | null;\n docsUrl?: string | null;\n contactEmail?: string | null;\n supportEmail?: string | null;\n contactPhone?: string | null;\n contactAddress?: string | null;\n seoTitle?: string | null;\n seoDescription?: string | null;\n seoKeywords?: string | null;\n ogImage?: string | null;\n socialLinks?: Record<string, string> | null;\n /**\n * Resource links for the website footer \"Resources\" column\n * (JSON: { docs, community, careers, team, companies, ... }).\n * Same shape as socialLinks. Free-form keys; the ResourceLinks\n * component renders known keys and silently ignores the rest.\n * Backed by Product.resourceLinks on the backend (global-tenant-svc).\n */\n resourceLinks?: Record<string, string> | null;\n recaptchaSiteKey?: string | null;\n rybbitSiteId?: string | null;\n notificationEmail?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface ProductProviderProps {\n /** Child components */\n children: ReactNode;\n /** Optional fallback product data (used while loading) */\n fallback?: Partial<ProductData>;\n}\n\n// ============================================================================\n// GraphQL Query\n// ============================================================================\n\n/**\n * Body of fields requested for every product fetch — shared by the primary\n * query and the legacy-backend fallback below. Kept as a string fragment\n * (not a real GraphQL `fragment` block) so we can append/strip\n * `resourceLinks` without touching anything else.\n */\nconst PRODUCT_FIELDS_BASE = `\n id\n name\n slug\n description\n status\n logoUrl\n website\n appUrl\n docsUrl\n contactEmail\n supportEmail\n contactPhone\n contactAddress\n seoTitle\n seoDescription\n seoKeywords\n ogImage\n socialLinks\n recaptchaSiteKey\n rybbitSiteId\n notificationEmail\n metadata\n`;\n\n/**\n * Primary query — includes the recently-added `resourceLinks` field.\n * Backends that have run the corresponding `global-tenant-svc` migration\n * (PR #64) expose this field; older ones don't, in which case\n * GraphQL validation rejects the whole query with\n * `Cannot query field \"resourceLinks\" on type \"PublicProduct\"`. The fetch\n * helper detects that specific error and transparently retries the\n * fallback below, so the SDK works on both pre- and post-migration\n * deployments without consumer-side gating.\n */\nconst PUBLIC_PRODUCT_QUERY = `\n query PublicProduct($slug: String!) {\n publicProduct(slug: $slug) {\n ${PRODUCT_FIELDS_BASE}\n resourceLinks\n }\n }\n`;\n\n/**\n * Fallback query for older backend deployments. Identical to the primary\n * minus `resourceLinks`. Consumers see `product.resourceLinks === undefined`\n * and any consumer (e.g. `<ResourceLinks/>`) falls through to prop / default\n * resolution paths.\n */\nconst PUBLIC_PRODUCT_QUERY_FALLBACK = `\n query PublicProductFallback($slug: String!) {\n publicProduct(slug: $slug) {\n ${PRODUCT_FIELDS_BASE}\n }\n }\n`;\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface ProductContextValue {\n product: ProductData | null;\n loading: boolean;\n error: string | null;\n hasProvider: boolean;\n refetch: () => void;\n}\n\nconst ProductContext = createContext<ProductContextValue>({\n product: null,\n loading: true,\n error: null,\n hasProvider: false,\n refetch: () => {},\n});\n\n// ============================================================================\n// Provider\n// ============================================================================\n\n/**\n * ProductProvider fetches and provides product metadata to child components.\n * Uses the product slug from WebSDKConfig to fetch from the public API.\n *\n * @example\n * ```tsx\n * <WebSDKProvider config={sdkConfig}>\n * <ProductProvider>\n * <App />\n * </ProductProvider>\n * </WebSDKProvider>\n * ```\n */\nexport function ProductProvider({ children, fallback }: ProductProviderProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const [product, setProduct] = useState<ProductData | null>(\n fallback ? (fallback as ProductData) : null,\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const fetchProduct = useCallback(async () => {\n if (!config.productSlug) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n let result = await client.query<{ publicProduct: ProductData | null }>(\n PUBLIC_PRODUCT_QUERY,\n { slug: config.productSlug },\n );\n\n // Backwards-compat fallback: if the backend's `publicProduct` schema\n // doesn't yet expose `resourceLinks` (deployed before\n // `global-tenant-svc` PR #64), the primary query fails validation\n // with a \"Cannot query field …\" error and `result.data` is null.\n // Retry the fallback query that omits `resourceLinks`; consumers\n // gracefully see `product.resourceLinks === undefined` and fall\n // through their own resolution paths.\n const schemaMissingResourceLinks = result.errors?.some((e) =>\n /Cannot query field [\"']?resourceLinks[\"']?/i.test(e?.message ?? \"\"),\n );\n if (schemaMissingResourceLinks) {\n result = await client.query<{ publicProduct: ProductData | null }>(\n PUBLIC_PRODUCT_QUERY_FALLBACK,\n { slug: config.productSlug },\n );\n }\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Unknown error\");\n } else if (result.data?.publicProduct) {\n setProduct(result.data.publicProduct);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch product\");\n } finally {\n setLoading(false);\n }\n }, [client, config.productSlug]);\n\n // Use useLayoutEffect for earliest possible fetch after commit (before paint).\n // Runs when slug or client changes. Client-side query cache + dedup ensures\n // no duplicate network requests even if React StrictMode fires this twice.\n useLayoutEffect(() => {\n fetchProduct();\n }, [fetchProduct]);\n\n const value = useMemo(\n () => ({\n product,\n loading,\n error,\n hasProvider: true,\n refetch: fetchProduct,\n }),\n [product, loading, error, fetchProduct],\n );\n\n return (\n <ProductContext.Provider value={value}>{children}</ProductContext.Provider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to access the current product data.\n *\n * @example\n * ```tsx\n * const { product, loading } = useProduct();\n * if (loading) return <Loading />;\n * return <h1>{product?.name}</h1>;\n * ```\n */\nexport function useProduct(): ProductContextValue {\n return useContext(ProductContext);\n}\n\n/**\n * Hook to get product-specific configuration.\n * Merges SDK config with fetched product data.\n * Useful for getting reCAPTCHA keys, analytics IDs, etc.\n *\n * @example\n * ```tsx\n * const { recaptchaSiteKey, rybbitSiteId } = useProductConfig();\n * ```\n */\nexport function useProductConfig(): {\n recaptchaSiteKey: string | null;\n rybbitSiteId: string | null;\n contactEmail: string | null;\n supportEmail: string | null;\n notificationEmail: string | null;\n productName: string | null;\n logoUrl: string | null;\n} {\n const { product } = useProduct();\n const config = useWebSDKConfig();\n\n return {\n // Prefer product-level config, fall back to SDK config\n recaptchaSiteKey:\n product?.recaptchaSiteKey ?? config.recaptchaSiteKey ?? null,\n rybbitSiteId: product?.rybbitSiteId ?? config.rybbitSiteId ?? null,\n contactEmail: product?.contactEmail ?? null,\n supportEmail: product?.supportEmail ?? null,\n notificationEmail:\n product?.notificationEmail ?? product?.contactEmail ?? null,\n productName: product?.name ?? null,\n logoUrl: product?.logoUrl ?? null,\n };\n}\n","/**\n * Content Provider\n *\n * React hooks for fetching public content pages from the global tenant service.\n * Content pages include privacy policies, terms of service, blogs, changelogs, etc.\n */\n\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport DOMPurify from \"isomorphic-dompurify\";\n\nimport { Markdown } from \"./Markdown\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ContentPageData {\n id: string;\n title: string;\n slug: string;\n content: string;\n contentFormat: string;\n seoTitle?: string | null;\n seoDescription?: string | null;\n seoKeywords?: string | null;\n lastUpdated: string;\n version: number;\n tags?: string[];\n excerpt?: string | null;\n thumbnail?: string | null;\n author?: string | null;\n publishedAt?: string | null;\n readingTime?: number | null;\n featured?: boolean;\n category?: string | null;\n}\n\nexport interface ContentPageListItem {\n id: string;\n title: string;\n slug: string;\n lastUpdated: string;\n tags?: string[];\n excerpt?: string | null;\n thumbnail?: string | null;\n author?: string | null;\n publishedAt?: string | null;\n readingTime?: number | null;\n featured?: boolean;\n category?: string | null;\n seoDescription?: string | null;\n}\n\nexport interface ContentPageListData {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n}\n\nexport interface UseContentPageOptions {\n /** Whether to use template variable replacement (resolvedContentPage) */\n resolve?: boolean;\n}\n\n// ============================================================================\n// GraphQL Queries\n// ============================================================================\n\nconst PUBLIC_CONTENT_PAGE_QUERY = `\n query PublicContentPage($slug: String!, $productId: String) {\n publicContentPage(slug: $slug, productId: $productId) {\n id\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n version\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n }\n`;\n\nconst PUBLIC_RESOLVED_CONTENT_PAGE_QUERY = `\n query PublicResolvedContentPage($slug: String!, $productId: String!) {\n publicResolvedContentPage(slug: $slug, productId: $productId) {\n id\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n version\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n }\n`;\n\nconst PUBLIC_CONTENT_PAGES_QUERY = `\n query PublicContentPages($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n seoDescription\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to fetch a single public content page by slug.\n *\n * @example\n * ```tsx\n * const { data, loading, error } = useContentPage('privacy-policy');\n * ```\n */\nexport function useContentPage(\n slug: string,\n options?: UseContentPageOptions,\n): {\n data: ContentPageData | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n} {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const [data, setData] = useState<ContentPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPage = useCallback(async () => {\n if (!resolvedProductId) return; // Wait for product to load\n\n setLoading(true);\n setError(null);\n\n try {\n const query = options?.resolve\n ? PUBLIC_RESOLVED_CONTENT_PAGE_QUERY\n : PUBLIC_CONTENT_PAGE_QUERY;\n\n const queryName = options?.resolve\n ? \"publicResolvedContentPage\"\n : \"publicContentPage\";\n\n const result = await client.query<Record<string, ContentPageData | null>>(\n query,\n {\n slug,\n productId: resolvedProductId,\n },\n );\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Unknown error\");\n setData(null);\n } else {\n setData(result.data?.[queryName] ?? null);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch content\");\n setData(null);\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, slug, options?.resolve]);\n\n useEffect(() => {\n fetchPage();\n }, [fetchPage]);\n\n return { data, loading, error, refetch: fetchPage };\n}\n\n/**\n * Hook to fetch a list of public content pages for the current product.\n *\n * @example\n * ```tsx\n * const { data, loading } = useContentPages({ limit: 10 });\n * ```\n */\nexport function useContentPages(options?: {\n limit?: number;\n offset?: number;\n}): {\n data: ContentPageListData | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n} {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const [data, setData] = useState<ContentPageListData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPages = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.query<{\n publicContentPages: ContentPageListData;\n }>(PUBLIC_CONTENT_PAGES_QUERY, {\n productId: config.productId,\n limit: options?.limit ?? 50,\n offset: options?.offset ?? 0,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Unknown error\");\n setData(null);\n } else {\n setData(result.data?.publicContentPages ?? null);\n }\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to fetch content pages\",\n );\n setData(null);\n } finally {\n setLoading(false);\n }\n }, [client, config.productId, options?.limit, options?.offset]);\n\n useEffect(() => {\n fetchPages();\n }, [fetchPages]);\n\n return { data, loading, error, refetch: fetchPages };\n}\n\n/**\n * Content renderer component.\n *\n * - `markdown` (default): renders with the shared {@link Markdown} component\n * (react-markdown + remark-gfm + rehype-sanitize).\n * - `html`: sanitized with DOMPurify before rendering.\n * - anything else: plain-text fallback\n *\n * @example\n * ```tsx\n * <ContentRenderer content={page.content} format={page.contentFormat} />\n * ```\n */\nexport function ContentRenderer({\n content,\n format = \"markdown\",\n className,\n}: {\n content: string;\n format?: string;\n className?: string;\n}) {\n if (format === \"markdown\") {\n return <Markdown className={className}>{content}</Markdown>;\n }\n\n if (format === \"html\") {\n const sanitized = DOMPurify.sanitize(content);\n return (\n <div\n className={className}\n dangerouslySetInnerHTML={{ __html: sanitized }}\n />\n );\n }\n\n // Plain text fallback\n return (\n <div className={className}>\n <pre style={{ whiteSpace: \"pre-wrap\", fontFamily: \"inherit\" }}>\n {content}\n </pre>\n </div>\n );\n}\n","/**\n * PageHead Component\n * Manages dynamic meta tags for SEO optimization on a per-page basis.\n * Supports JSON-LD structured data, Open Graph, Twitter Cards, favicons, and robots directives.\n *\n * @example\n * ```tsx\n * <PageHead\n * title=\"About Us\"\n * description=\"Learn about our mission and team\"\n * productName=\"MyProduct\"\n * keywords=\"about, team, mission\"\n * image=\"/og-about.png\"\n * url=\"https://myproduct.com/about\"\n * favicon=\"/favicon.ico\"\n * robots=\"index, follow\"\n * locale=\"en_US\"\n * twitterHandle=\"@burdenoff\"\n * themeColor=\"#1a1a2e\"\n * structuredData={{\n * \"@context\": \"https://schema.org\",\n * \"@type\": \"WebPage\",\n * name: \"About Us\",\n * }}\n * />\n * ```\n */\n\nimport { Helmet } from \"react-helmet-async\";\n\nexport interface PageHeadProps {\n /** Page title */\n title: string;\n /** Meta description */\n description?: string;\n /** Product/brand name (appended to title) */\n productName?: string;\n /** SEO keywords */\n keywords?: string;\n /** Open Graph image URL */\n image?: string;\n /** Page canonical URL */\n url?: string;\n /** Favicon URL */\n favicon?: string;\n /** Robots directive (e.g., \"index, follow\") */\n robots?: string;\n /** Open Graph locale (e.g., \"en_US\") */\n locale?: string;\n /** Twitter handle (e.g., \"@burdenoff\") */\n twitterHandle?: string;\n /** Theme color for mobile browsers */\n themeColor?: string;\n /** JSON-LD structured data objects */\n structuredData?: Record<string, unknown> | Array<Record<string, unknown>>;\n /** Additional meta tags */\n additionalMeta?: Array<{\n name?: string;\n property?: string;\n content: string;\n }>;\n}\n\nexport function PageHead({\n title,\n description,\n productName,\n keywords,\n image,\n url,\n favicon,\n robots = \"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\",\n locale = \"en_US\",\n twitterHandle,\n themeColor = \"#000000\",\n structuredData,\n additionalMeta,\n}: PageHeadProps) {\n const fullTitle =\n productName && !title.includes(productName)\n ? `${title} | ${productName}`\n : title;\n\n const fullImageUrl =\n image && !image.startsWith(\"http\") && url\n ? `${url.replace(/\\/$/, \"\")}${image}`\n : image;\n\n // Normalize structured data to an array\n const structuredDataItems: Array<Record<string, unknown>> = structuredData\n ? Array.isArray(structuredData)\n ? structuredData\n : [structuredData]\n : [];\n\n return (\n <Helmet>\n {/* Primary Meta Tags */}\n <title>{fullTitle}</title>\n <meta name=\"title\" content={fullTitle} />\n {description && <meta name=\"description\" content={description} />}\n {keywords && <meta name=\"keywords\" content={keywords} />}\n <meta name=\"author\" content=\"Burdenoff Consultancy Services Pvt Ltd\" />\n <meta name=\"robots\" content={robots} />\n\n {/* Canonical URL */}\n {url && <link rel=\"canonical\" href={url} />}\n\n {/* Favicon */}\n {favicon && <link rel=\"icon\" href={favicon} />}\n\n {/* Open Graph / Facebook */}\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={fullTitle} />\n {description && <meta property=\"og:description\" content={description} />}\n {fullImageUrl && <meta property=\"og:image\" content={fullImageUrl} />}\n {url && <meta property=\"og:url\" content={url} />}\n <meta property=\"og:locale\" content={locale} />\n {productName && <meta property=\"og:site_name\" content={productName} />}\n\n {/* Twitter Card */}\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n <meta name=\"twitter:title\" content={fullTitle} />\n {description && <meta name=\"twitter:description\" content={description} />}\n {fullImageUrl && <meta name=\"twitter:image\" content={fullImageUrl} />}\n {twitterHandle && <meta name=\"twitter:creator\" content={twitterHandle} />}\n\n {/* Theme Color */}\n <meta name=\"theme-color\" content={themeColor} />\n\n {/* JSON-LD Structured Data */}\n {structuredDataItems.map((data, index) => (\n <script key={`ld-${index}`} type=\"application/ld+json\">\n {JSON.stringify(data)}\n </script>\n ))}\n\n {/* Additional Meta Tags */}\n {additionalMeta?.map((meta, index) => (\n <meta\n key={`meta-${index}`}\n {...(meta.name ? { name: meta.name } : {})}\n {...(meta.property ? { property: meta.property } : {})}\n content={meta.content}\n />\n ))}\n </Helmet>\n );\n}\n","\"use client\";\n\n/**\n * Blog Components\n *\n * CMS-powered blog list and post pages. Uses ProductContentPage with tag \"blog\".\n *\n * @example\n * ```tsx\n * import { BlogListPage, BlogPostPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/blog\" element={<BlogListPage productName=\"VibeControls\" />} />\n * <Route path=\"/blog/:slug\" element={<BlogPostPage productName=\"VibeControls\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport { ContentRenderer } from \"./content-provider\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { ContentPageData, ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BlogListPageProps {\n productName?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n blogPostBasePath?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n}\n\nexport interface BlogPostPageProps {\n productName?: string;\n blogListUrl?: string;\n /** Back-link label. Default: \"Back to Blog\". Use e.g. \"Back to Press\"\n * when reusing this renderer for a press release at /press/:slug. */\n backLabel?: string;\n className?: string;\n}\n\n// ============================================================================\n// Query\n// ============================================================================\n\nconst BLOG_POSTS_QUERY = `\n query BlogPosts($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n seoDescription\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\nconst BLOG_POST_QUERY = `\n query BlogPost($slug: String!, $productId: String) {\n publicContentPage(slug: $slug, productId: $productId) {\n id\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n tags\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n }\n`;\n\n// ============================================================================\n// BlogCard\n// ============================================================================\n\nfunction BlogCard({\n post,\n basePath = \"/blog\",\n}: {\n post: ContentPageListItem;\n basePath?: string;\n}) {\n const date = post.publishedAt || post.lastUpdated;\n const formattedDate = date\n ? new Date(date).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })\n : \"\";\n // Dead/unreachable thumbnail → placeholder, never a broken-image glyph.\n const [imgError, setImgError] = useState(false);\n\n return (\n <a\n href={`${basePath}/${post.slug}`}\n className=\"group block bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300\"\n >\n {/* Thumbnail */}\n {post.thumbnail && !imgError ? (\n <div className=\"aspect-[16/9] overflow-hidden\">\n <img\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n </div>\n ) : (\n <div className=\"aspect-[16/9] bg-muted/50 flex items-center justify-center\">\n <svg\n className=\"w-12 h-12 text-muted-foreground/20\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\"\n />\n </svg>\n </div>\n )}\n\n <div className=\"p-5 sm:p-6\">\n {/* Category badge */}\n {post.category && (\n <span className=\"inline-block text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-3\">\n {post.category}\n </span>\n )}\n\n {/* Title */}\n <h3 className=\"text-lg font-semibold text-foreground mb-2 group-hover:text-primary transition-colors line-clamp-2\">\n {post.title}\n </h3>\n\n {/* Excerpt */}\n <p className=\"text-sm text-muted-foreground mb-4 line-clamp-3\">\n {post.excerpt || post.seoDescription || \"\"}\n </p>\n\n {/* Footer: author + date + reading time */}\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n {post.author && <span className=\"font-medium\">{post.author}</span>}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n )}\n </div>\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// BlogListPage\n// ============================================================================\n\nexport function BlogListPage(props: BlogListPageProps) {\n const {\n productName,\n heroTitle = \"Blog\",\n heroSubtitle = \"Latest updates, engineering insights, and product news\",\n blogPostBasePath = \"/blog\",\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n\n const [posts, setPosts] = useState<ContentPageListItem[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [offset, setOffset] = useState(0);\n const limit = 12;\n\n const fetchPosts = useCallback(async () => {\n if (!resolvedProductId) return;\n\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n };\n }>(BLOG_POSTS_QUERY, {\n productId: resolvedProductId,\n limit,\n offset,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load posts\");\n return;\n }\n\n // Filter to only blog-tagged posts\n const blogPosts = (result.data?.publicContentPages?.items || []).filter(\n (p) => p.tags?.includes(\"blog\"),\n );\n\n setPosts(blogPosts);\n setTotal(result.data?.publicContentPages?.total || 0);\n setError(null);\n } catch {\n setError(\"Failed to load blog posts\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, offset]);\n\n useEffect(() => {\n fetchPosts();\n }, [fetchPosts]);\n\n // Separate featured and regular posts\n const featuredPosts = posts.filter((p) => p.featured);\n const regularPosts = posts.filter((p) => !p.featured);\n\n return (\n <div className={`w-full ${className}`}>\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n url={\n typeof window !== \"undefined\"\n ? window.location.origin + window.location.pathname\n : undefined\n }\n />\n )}\n\n {/* Hero */}\n <section className=\"py-16 sm:py-20 md:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center max-w-3xl mx-auto\">\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground\">\n {heroTitle}\n </h1>\n <p className=\"mt-4 text-lg text-muted-foreground\">{heroSubtitle}</p>\n </div>\n </div>\n </section>\n\n {/* Posts */}\n <section className=\"pb-16 sm:pb-20\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n {loading ? (\n <div className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"bg-card border rounded-xl overflow-hidden animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"p-6 space-y-3\">\n <div className=\"h-4 bg-muted rounded w-1/4\" />\n <div className=\"h-6 bg-muted rounded w-3/4\" />\n <div className=\"h-4 bg-muted rounded\" />\n <div className=\"h-4 bg-muted rounded w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n ) : error ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">{error}</p>\n </div>\n ) : posts.length === 0 ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No blog posts yet. Check back soon!\n </p>\n </div>\n ) : (\n <>\n {/* Featured posts (full width) */}\n {featuredPosts.length > 0 && (\n <div className=\"grid md:grid-cols-2 gap-6 sm:gap-8 mb-8\">\n {featuredPosts.map((post) => (\n <BlogCard\n key={post.id}\n post={post}\n basePath={blogPostBasePath}\n />\n ))}\n </div>\n )}\n\n {/* Regular posts (3-column grid) */}\n <div className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8\">\n {regularPosts.map((post) => (\n <BlogCard\n key={post.id}\n post={post}\n basePath={blogPostBasePath}\n />\n ))}\n </div>\n\n {/* Pagination */}\n {total > limit && (\n <div className=\"flex justify-center gap-4 mt-12\">\n <button\n onClick={() => setOffset(Math.max(0, offset - limit))}\n disabled={offset === 0}\n className=\"px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors\"\n >\n Previous\n </button>\n <button\n onClick={() => setOffset(offset + limit)}\n disabled={offset + limit >= total}\n className=\"px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors\"\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </section>\n </div>\n );\n}\n\n// ============================================================================\n// BlogPostPage\n// ============================================================================\n\nexport function BlogPostPage(props: BlogPostPageProps) {\n const {\n productName,\n blogListUrl = \"/blog\",\n backLabel = \"Back to Blog\",\n className = \"\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n\n const [post, setPost] = useState<ContentPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // Get slug from URL\n const slug =\n typeof window !== \"undefined\"\n ? window.location.pathname.split(\"/\").pop() || \"\"\n : \"\";\n\n useEffect(() => {\n if (!slug || !resolvedProductId) return;\n\n async function fetchPost() {\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPage: ContentPageData | null;\n }>(BLOG_POST_QUERY, {\n slug,\n productId: resolvedProductId,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load post\");\n return;\n }\n\n setPost(result.data?.publicContentPage ?? null);\n setError(null);\n } catch {\n setError(\"Failed to load blog post\");\n } finally {\n setLoading(false);\n }\n }\n\n fetchPost();\n }, [client, slug, resolvedProductId]);\n\n if (loading) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-24\">\n <div className=\"animate-pulse space-y-6\">\n <div className=\"h-8 bg-muted rounded w-2/3\" />\n <div className=\"h-4 bg-muted rounded w-1/3\" />\n <div className=\"aspect-[16/9] bg-muted rounded-xl\" />\n <div className=\"space-y-3\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-4 bg-muted rounded\" />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (error || !post) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-24 text-center\">\n <h1 className=\"text-2xl font-bold mb-4\">Post not found</h1>\n <p className=\"text-muted-foreground mb-6\">\n {error || \"This blog post doesn't exist or has been removed.\"}\n </p>\n <a\n href={blogListUrl}\n className=\"text-primary hover:underline font-medium\"\n >\n ← {backLabel}\n </a>\n </div>\n </div>\n );\n }\n\n const date = post.publishedAt || post.lastUpdated;\n const formattedDate = date\n ? new Date(date).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })\n : \"\";\n\n return (\n <div className={`w-full ${className}`}>\n <PageHead\n title={post.seoTitle || post.title}\n description={post.seoDescription || post.excerpt || \"\"}\n productName={productName}\n keywords={post.seoKeywords || \"\"}\n image={post.thumbnail || undefined}\n url={\n typeof window !== \"undefined\"\n ? window.location.origin + window.location.pathname\n : undefined\n }\n />\n\n <article className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-16 sm:py-20\">\n {/* Back link */}\n <a\n href={blogListUrl}\n className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground mb-8 transition-colors\"\n >\n ← {backLabel}\n </a>\n\n {/* Category */}\n {post.category && (\n <span className=\"inline-block text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-4\">\n {post.category}\n </span>\n )}\n\n {/* Title */}\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground mb-4\">\n {post.title}\n </h1>\n\n {/* Meta */}\n <div className=\"flex items-center gap-3 text-sm text-muted-foreground mb-8\">\n {post.author && (\n <span className=\"font-medium text-foreground\">{post.author}</span>\n )}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n )}\n </div>\n\n {/* Hero image */}\n {post.thumbnail && (\n <div className=\"aspect-[16/9] rounded-xl overflow-hidden mb-10\">\n <img\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full object-cover\"\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"prose prose-gray dark:prose-invert max-w-none\">\n <ContentRenderer content={post.content} format={post.contentFormat} />\n </div>\n </article>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Case Studies Components\n *\n * CMS-powered case-study list and detail pages. Data is sourced from the\n * global tenant service — ProductContentPage records tagged \"case-study\" —\n * exactly like the blog and changelog, so the three stay on the same data path.\n *\n * The list page is designed to shine in BOTH states:\n * - When a product has published stories: a modern, interactive gallery with a\n * featured spotlight, category filtering, and hover-lift cards.\n * - When a product has none yet (the common case for a newly launched\n * product): a warm, professional \"no stories yet\" state that frames the\n * product as early-and-growing and invites the visitor to get in touch —\n * never a dead end, never fabricated traction.\n *\n * `data-cs=\"case-studies-v2\"` on the root is an intentional, minify-safe marker\n * used to confirm which published SDK artifact actually contains this design.\n *\n * @example\n * ```tsx\n * import { CaseStudiesListPage, CaseStudyPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/case-studies\" element={<CaseStudiesListPage productName=\"VibeControls\" />} />\n * <Route path=\"/case-studies/:slug\" element={<CaseStudyPage productName=\"VibeControls\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback, useMemo } from \"react\";\n\nimport { ContentRenderer } from \"./content-provider\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { ContentPageData, ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CaseStudiesListPageProps {\n productName?: string;\n /** Small label above the hero title. Default: \"Customer Stories\". */\n eyebrow?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n caseStudyBasePath?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n /** Where the primary \"get in touch\" CTA points. Default: \"/contact\". */\n contactHref?: string;\n /** Primary CTA label. Default: \"Get in touch\". */\n contactLabel?: string;\n /** Secondary CTA target (shown in the empty state). Default: \"/features\". */\n exploreHref?: string;\n /** Secondary CTA label. Default: \"Explore the product\". */\n exploreLabel?: string;\n /** Heading for the empty state. Falls back to a product-aware default. */\n emptyTitle?: string;\n /** Body copy for the empty state. Falls back to a product-aware default. */\n emptySubtitle?: string;\n}\n\nexport interface CaseStudyPageProps {\n productName?: string;\n caseStudiesListUrl?: string;\n /** Back-link label. Default: \"Back to Case Studies\". */\n backLabel?: string;\n /** Where the closing \"get in touch\" CTA points. Default: \"/contact\". */\n contactHref?: string;\n /** Closing CTA label. Default: \"Get in touch\". */\n contactLabel?: string;\n className?: string;\n}\n\n/** Tag that marks a ProductContentPage as a case study. */\nconst CASE_STUDY_TAG = \"case-study\";\n\n// One-time injected keyframes (scoped class names avoid host collisions).\n// Pure CSS — deliberately no framer-motion (it white-screens under rolldown).\nconst ANIMATION_STYLES = `\n@keyframes csFadeUp { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes csFloat { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-14px); } }\n.cs-fade-up { animation: csFadeUp 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; }\n.cs-float { animation: csFloat 7s ease-in-out infinite; }\n@media (prefers-reduced-motion: reduce) {\n .cs-fade-up, .cs-float { animation: none !important; }\n}\n`;\n\nfunction AnimationStyles() {\n return <style dangerouslySetInnerHTML={{ __html: ANIMATION_STYLES }} />;\n}\n\n// ============================================================================\n// Query\n// ============================================================================\n\nconst CASE_STUDIES_QUERY = `\n query CaseStudies($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n seoDescription\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\nconst CASE_STUDY_QUERY = `\n query CaseStudy($slug: String!, $productId: String) {\n publicContentPage(slug: $slug, productId: $productId) {\n id\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n tags\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n }\n`;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatDate(value?: string | null): string {\n if (!value) return \"\";\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return \"\";\n return d.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n}\n\n/** Thumbnail with graceful placeholder fallback (never a broken-image glyph). */\nfunction Thumbnail({\n src,\n alt,\n className = \"\",\n}: {\n src?: string | null;\n alt: string;\n className?: string;\n}) {\n const [imgError, setImgError] = useState(false);\n if (src && !imgError) {\n return (\n <img\n src={src}\n alt={alt}\n className={className}\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n );\n }\n return (\n <div\n className={`flex items-center justify-center bg-gradient-to-br from-muted/60 to-muted ${className}`}\n aria-hidden=\"true\"\n >\n <svg\n className=\"w-12 h-12 text-muted-foreground/25\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\"\n />\n </svg>\n </div>\n );\n}\n\nfunction MetaRow({\n post,\n className = \"\",\n}: {\n post: ContentPageListItem | ContentPageData;\n className?: string;\n}) {\n const formattedDate = formatDate(post.publishedAt || post.lastUpdated);\n return (\n <div\n className={`flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground ${className}`}\n >\n {post.author && <span className=\"font-medium\">{post.author}</span>}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime ? (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n ) : null}\n </div>\n );\n}\n\n// ============================================================================\n// FeaturedCard — large spotlight for featured case studies\n// ============================================================================\n\nfunction FeaturedCard({\n post,\n basePath,\n}: {\n post: ContentPageListItem;\n basePath: string;\n}) {\n return (\n <a\n href={`${basePath}/${post.slug}`}\n className=\"group relative grid md:grid-cols-2 gap-0 overflow-hidden rounded-2xl border bg-card shadow-sm transition-all duration-300 hover:-translate-y-1 hover:shadow-xl hover:border-primary/40\"\n >\n <div className=\"relative aspect-[16/10] md:aspect-auto md:h-full overflow-hidden\">\n <Thumbnail\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full min-h-[220px] object-cover transition-transform duration-500 group-hover:scale-[1.04]\"\n />\n <span className=\"absolute top-4 left-4 inline-flex items-center gap-1 rounded-full bg-primary px-2.5 py-1 text-xs font-semibold text-primary-foreground shadow-sm\">\n <svg\n className=\"h-3 w-3\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.286 3.957a1 1 0 00.95.69h4.162c.969 0 1.371 1.24.588 1.81l-3.368 2.447a1 1 0 00-.364 1.118l1.287 3.957c.3.921-.755 1.688-1.54 1.118l-3.367-2.447a1 1 0 00-1.176 0l-3.367 2.447c-.784.57-1.838-.197-1.539-1.118l1.286-3.957a1 1 0 00-.363-1.118L2.98 9.384c-.783-.57-.38-1.81.588-1.81h4.162a1 1 0 00.95-.69l1.286-3.957z\" />\n </svg>\n Featured\n </span>\n </div>\n <div className=\"flex flex-col justify-center p-6 sm:p-8\">\n {post.category && (\n <span className=\"mb-3 inline-block w-fit rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary\">\n {post.category}\n </span>\n )}\n <h3 className=\"text-xl sm:text-2xl font-bold text-foreground transition-colors group-hover:text-primary line-clamp-3\">\n {post.title}\n </h3>\n <p className=\"mt-3 text-sm sm:text-base text-muted-foreground line-clamp-3\">\n {post.excerpt || post.seoDescription || \"\"}\n </p>\n <MetaRow post={post} className=\"mt-5\" />\n <span className=\"mt-5 inline-flex items-center gap-1 text-sm font-semibold text-primary\">\n Read the story\n <svg\n className=\"h-4 w-4 transition-transform duration-300 group-hover:translate-x-1\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 4.293a1 1 0 011.414 0l5 5a1 1 0 010 1.414l-5 5a1 1 0 01-1.414-1.414L11.586 10 7.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </span>\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// CaseStudyCard — standard grid card\n// ============================================================================\n\nfunction CaseStudyCard({\n post,\n basePath = \"/case-studies\",\n}: {\n post: ContentPageListItem;\n basePath?: string;\n}) {\n return (\n <a\n href={`${basePath}/${post.slug}`}\n className=\"group flex flex-col overflow-hidden rounded-xl border bg-card transition-all duration-300 hover:-translate-y-1 hover:shadow-lg hover:border-primary/40\"\n >\n <div className=\"aspect-[16/9] overflow-hidden\">\n <Thumbnail\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full object-cover transition-transform duration-500 group-hover:scale-105\"\n />\n </div>\n\n <div className=\"flex flex-1 flex-col p-5 sm:p-6\">\n {post.category && (\n <span className=\"mb-3 inline-block w-fit rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary\">\n {post.category}\n </span>\n )}\n <h3 className=\"mb-2 text-lg font-semibold text-foreground transition-colors group-hover:text-primary line-clamp-2\">\n {post.title}\n </h3>\n <p className=\"mb-4 text-sm text-muted-foreground line-clamp-3\">\n {post.excerpt || post.seoDescription || \"\"}\n </p>\n <MetaRow post={post} className=\"mt-auto\" />\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// EmptyState — warm, professional \"no stories yet\" experience\n// ============================================================================\n\nfunction EmptyState({\n productLabel,\n title,\n subtitle,\n contactHref,\n contactLabel,\n exploreHref,\n exploreLabel,\n}: {\n productLabel: string;\n title: string;\n subtitle: string;\n contactHref: string;\n contactLabel: string;\n exploreHref: string;\n exploreLabel: string;\n}) {\n const highlights = [\n {\n title: \"Real outcomes, real teams\",\n body: `We're partnering with our earliest adopters right now. As they ship results with ${productLabel}, their stories will land here — measured and unembellished.`,\n icon: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z\"\n />\n ),\n },\n {\n title: \"See it on your use case\",\n body: `Want to know how ${productLabel} would work for your team? We'll walk you through exactly what to expect — no pitch, just specifics.`,\n icon: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n ),\n },\n {\n title: \"Be the first story\",\n body: `Building something with ${productLabel} worth talking about? Tell us — the best early stories become the case studies featured on this page.`,\n icon: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.562.562 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.562.562 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\"\n />\n ),\n },\n ];\n\n return (\n <div className=\"cs-fade-up mx-auto max-w-4xl\">\n <div className=\"relative overflow-hidden rounded-3xl border bg-card px-6 py-14 text-center sm:px-12 sm:py-16\">\n {/* Decorative, token-based backdrop */}\n <div\n className=\"pointer-events-none absolute -top-24 -right-16 h-64 w-64 rounded-full bg-primary/10 blur-3xl\"\n aria-hidden=\"true\"\n />\n <div\n className=\"pointer-events-none absolute -bottom-24 -left-16 h-64 w-64 rounded-full bg-primary/5 blur-3xl\"\n aria-hidden=\"true\"\n />\n\n <div className=\"relative\">\n <div className=\"cs-float mx-auto flex h-20 w-20 items-center justify-center rounded-2xl bg-primary/10 text-primary ring-1 ring-primary/20\">\n <svg\n className=\"h-10 w-10\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n </div>\n\n <h2 className=\"mt-8 text-2xl font-bold tracking-tight text-foreground sm:text-3xl\">\n {title}\n </h2>\n <p className=\"mx-auto mt-4 max-w-2xl text-base leading-relaxed text-muted-foreground sm:text-lg\">\n {subtitle}\n </p>\n\n <div className=\"mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row\">\n <a\n href={contactHref}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md sm:w-auto\"\n >\n {contactLabel}\n <svg\n className=\"h-4 w-4\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 4.293a1 1 0 011.414 0l5 5a1 1 0 010 1.414l-5 5a1 1 0 01-1.414-1.414L11.586 10 7.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </a>\n <a\n href={exploreHref}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lg border border-border bg-background px-6 py-3 text-sm font-semibold text-foreground transition-colors hover:bg-muted sm:w-auto\"\n >\n {exploreLabel}\n </a>\n </div>\n </div>\n </div>\n\n {/* Supporting trio */}\n <div className=\"mt-8 grid gap-4 sm:grid-cols-3\">\n {highlights.map((h) => (\n <div\n key={h.title}\n className=\"rounded-2xl border bg-card/60 p-5 text-left transition-colors hover:border-primary/30\"\n >\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <svg\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n {h.icon}\n </svg>\n </div>\n <h3 className=\"mt-4 text-sm font-semibold text-foreground\">\n {h.title}\n </h3>\n <p className=\"mt-1.5 text-sm leading-relaxed text-muted-foreground\">\n {h.body}\n </p>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// CaseStudiesListPage\n// ============================================================================\n\nexport function CaseStudiesListPage(props: CaseStudiesListPageProps) {\n const {\n productName,\n eyebrow = \"Customer Stories\",\n heroTitle = \"Case Studies\",\n heroSubtitle = \"Real-world stories of teams building with our platform.\",\n caseStudyBasePath = \"/case-studies\",\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n contactHref = \"/contact\",\n contactLabel = \"Get in touch\",\n exploreHref = \"/features\",\n exploreLabel = \"Explore the product\",\n emptyTitle,\n emptySubtitle,\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const productLabel = product?.name || productName || \"our platform\";\n\n const [posts, setPosts] = useState<ContentPageListItem[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [offset, setOffset] = useState(0);\n const [activeCategory, setActiveCategory] = useState<string>(\"All\");\n const limit = 12;\n\n const fetchPosts = useCallback(async () => {\n if (!resolvedProductId) return;\n\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n };\n }>(CASE_STUDIES_QUERY, {\n productId: resolvedProductId,\n limit,\n offset,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load case studies\");\n setPosts([]);\n return;\n }\n\n // Filter to only case-study-tagged pages\n const caseStudies = (result.data?.publicContentPages?.items || []).filter(\n (p) => p.tags?.includes(CASE_STUDY_TAG),\n );\n\n setPosts(caseStudies);\n setTotal(result.data?.publicContentPages?.total || 0);\n setError(null);\n } catch {\n // A visitor should never see a raw error on a marketing page — fall\n // through to the encouraging empty state instead of a dead end.\n setError(\"load-failed\");\n setPosts([]);\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, offset]);\n\n useEffect(() => {\n fetchPosts();\n }, [fetchPosts]);\n\n // Distinct categories for the interactive filter (only meaningful with data).\n const categories = useMemo(() => {\n const set = new Set<string>();\n posts.forEach((p) => {\n if (p.category) set.add(p.category);\n });\n return [\"All\", ...Array.from(set)];\n }, [posts]);\n\n const visiblePosts = useMemo(() => {\n if (activeCategory === \"All\") return posts;\n return posts.filter((p) => p.category === activeCategory);\n }, [posts, activeCategory]);\n\n const featuredPosts = visiblePosts.filter((p) => p.featured);\n const regularPosts = visiblePosts.filter((p) => !p.featured);\n\n const hasContent = !loading && !error && posts.length > 0;\n const showEmpty = !loading && (error !== null || posts.length === 0);\n\n const resolvedEmptyTitle = emptyTitle ?? \"Case studies are on the way\";\n const resolvedEmptySubtitle =\n emptySubtitle ??\n `${productLabel} is early in its journey, and we'd rather show you real, measurable results than filler. We're working closely with our first teams now — their stories will be published here soon. In the meantime, we'd love to show you what's possible.`;\n\n return (\n <div className={`w-full ${className}`} data-cs=\"case-studies-v2\">\n <AnimationStyles />\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n />\n )}\n\n {/* Hero */}\n <section className=\"relative overflow-hidden\">\n <div\n className=\"pointer-events-none absolute inset-x-0 -top-32 mx-auto h-72 max-w-3xl rounded-full bg-primary/10 blur-3xl\"\n aria-hidden=\"true\"\n />\n <div className=\"relative mx-auto max-w-7xl px-4 py-16 sm:px-6 sm:py-20 md:py-24 lg:px-8\">\n <div className=\"mx-auto max-w-3xl text-center\">\n <span className=\"inline-flex items-center gap-2 rounded-full border border-primary/20 bg-primary/10 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-primary\">\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary\" />\n {eyebrow}\n </span>\n <h1 className=\"mt-5 text-3xl font-bold tracking-tight text-foreground sm:text-4xl md:text-5xl\">\n {heroTitle}\n </h1>\n <p className=\"mt-4 text-lg text-muted-foreground\">{heroSubtitle}</p>\n </div>\n </div>\n </section>\n\n {/* Body */}\n <section className=\"pb-20 sm:pb-24\">\n <div className=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8\">\n {loading ? (\n <div className=\"grid gap-6 sm:gap-8 md:grid-cols-2 lg:grid-cols-3\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"overflow-hidden rounded-xl border bg-card animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"space-y-3 p-6\">\n <div className=\"h-4 w-1/4 rounded bg-muted\" />\n <div className=\"h-6 w-3/4 rounded bg-muted\" />\n <div className=\"h-4 rounded bg-muted\" />\n <div className=\"h-4 w-1/2 rounded bg-muted\" />\n </div>\n </div>\n ))}\n </div>\n ) : showEmpty ? (\n <EmptyState\n productLabel={productLabel}\n title={resolvedEmptyTitle}\n subtitle={resolvedEmptySubtitle}\n contactHref={contactHref}\n contactLabel={contactLabel}\n exploreHref={exploreHref}\n exploreLabel={exploreLabel}\n />\n ) : hasContent ? (\n <>\n {/* Interactive category filter */}\n {categories.length > 2 && (\n <div className=\"mb-10 flex flex-wrap justify-center gap-2\">\n {categories.map((cat) => (\n <button\n key={cat}\n type=\"button\"\n onClick={() => setActiveCategory(cat)}\n className={`rounded-full border px-4 py-1.5 text-sm font-medium transition-colors ${\n activeCategory === cat\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-border bg-background text-muted-foreground hover:border-primary/40 hover:text-foreground\"\n }`}\n >\n {cat}\n </button>\n ))}\n </div>\n )}\n\n {/* Featured spotlight */}\n {featuredPosts.length > 0 && (\n <div className=\"mb-10 grid gap-6 sm:gap-8 lg:grid-cols-2\">\n {featuredPosts.map((post) => (\n <FeaturedCard\n key={post.id}\n post={post}\n basePath={caseStudyBasePath}\n />\n ))}\n </div>\n )}\n\n {/* Regular grid */}\n {regularPosts.length > 0 && (\n <div className=\"grid gap-6 sm:gap-8 md:grid-cols-2 lg:grid-cols-3\">\n {regularPosts.map((post) => (\n <CaseStudyCard\n key={post.id}\n post={post}\n basePath={caseStudyBasePath}\n />\n ))}\n </div>\n )}\n\n {/* Pagination (only for the full, unfiltered set) */}\n {activeCategory === \"All\" && total > limit && (\n <div className=\"mt-14 flex justify-center gap-4\">\n <button\n onClick={() => setOffset(Math.max(0, offset - limit))}\n disabled={offset === 0}\n className=\"rounded-lg border px-5 py-2.5 text-sm font-medium transition-colors hover:bg-muted disabled:opacity-40\"\n >\n Previous\n </button>\n <button\n onClick={() => setOffset(offset + limit)}\n disabled={offset + limit >= total}\n className=\"rounded-lg border px-5 py-2.5 text-sm font-medium transition-colors hover:bg-muted disabled:opacity-40\"\n >\n Next\n </button>\n </div>\n )}\n\n {/* Closing CTA band */}\n <div className=\"mt-16 overflow-hidden rounded-2xl border bg-gradient-to-br from-primary/10 via-card to-card p-8 text-center sm:p-10\">\n <h2 className=\"text-xl font-bold text-foreground sm:text-2xl\">\n Want results like these?\n </h2>\n <p className=\"mx-auto mt-2 max-w-xl text-sm text-muted-foreground sm:text-base\">\n Tell us about your goals and we’ll show you exactly how{\" \"}\n {productLabel} can help.\n </p>\n <a\n href={contactHref}\n className=\"mt-6 inline-flex items-center justify-center gap-2 rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md\"\n >\n {contactLabel}\n </a>\n </div>\n </>\n ) : null}\n </div>\n </section>\n </div>\n );\n}\n\n// ============================================================================\n// CaseStudyPage (detail)\n// ============================================================================\n\nexport function CaseStudyPage(props: CaseStudyPageProps) {\n const {\n productName,\n caseStudiesListUrl = \"/case-studies\",\n backLabel = \"Back to Case Studies\",\n contactHref = \"/contact\",\n contactLabel = \"Get in touch\",\n className = \"\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const productLabel = product?.name || productName || \"our team\";\n\n const [post, setPost] = useState<ContentPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // Get slug from URL\n const slug =\n typeof window !== \"undefined\"\n ? window.location.pathname.split(\"/\").pop() || \"\"\n : \"\";\n\n useEffect(() => {\n if (!slug || !resolvedProductId) return;\n\n async function fetchPost() {\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPage: ContentPageData | null;\n }>(CASE_STUDY_QUERY, {\n slug,\n productId: resolvedProductId,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load case study\");\n return;\n }\n\n setPost(result.data?.publicContentPage ?? null);\n setError(null);\n } catch {\n setError(\"Failed to load case study\");\n } finally {\n setLoading(false);\n }\n }\n\n fetchPost();\n }, [client, slug, resolvedProductId]);\n\n if (loading) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"mx-auto max-w-4xl px-4 py-24 sm:px-6 lg:px-8\">\n <div className=\"animate-pulse space-y-6\">\n <div className=\"h-8 w-2/3 rounded bg-muted\" />\n <div className=\"h-4 w-1/3 rounded bg-muted\" />\n <div className=\"aspect-[16/9] rounded-xl bg-muted\" />\n <div className=\"space-y-3\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-4 rounded bg-muted\" />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (error || !post) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"mx-auto max-w-2xl px-4 py-24 text-center sm:px-6 lg:px-8\">\n <div className=\"mx-auto flex h-16 w-16 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <svg\n className=\"h-8 w-8\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\"\n />\n </svg>\n </div>\n <h1 className=\"mt-6 text-2xl font-bold text-foreground\">\n Case study not found\n </h1>\n <p className=\"mx-auto mt-3 max-w-md text-muted-foreground\">\n This story isn’t available yet — but there’s plenty more to explore,\n and we’re always happy to talk through what {productLabel} can do.\n </p>\n <div className=\"mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row\">\n <a\n href={caseStudiesListUrl}\n className=\"inline-flex items-center justify-center rounded-lg border px-5 py-2.5 text-sm font-semibold text-foreground transition-colors hover:bg-muted\"\n >\n ← {backLabel}\n </a>\n <a\n href={contactHref}\n className=\"inline-flex items-center justify-center rounded-lg bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground transition-all hover:opacity-90\"\n >\n {contactLabel}\n </a>\n </div>\n </div>\n </div>\n );\n }\n\n const formattedDate = formatDate(post.publishedAt || post.lastUpdated);\n\n return (\n <div className={`w-full ${className}`}>\n <PageHead\n title={post.seoTitle || post.title}\n description={post.seoDescription || post.excerpt || \"\"}\n productName={productName}\n keywords={post.seoKeywords || \"\"}\n />\n\n <article className=\"mx-auto max-w-4xl px-4 py-16 sm:px-6 sm:py-20 lg:px-8\">\n {/* Back link */}\n <a\n href={caseStudiesListUrl}\n className=\"mb-8 inline-flex items-center gap-1 text-sm text-muted-foreground transition-colors hover:text-foreground\"\n >\n ← {backLabel}\n </a>\n\n {/* Category */}\n {post.category && (\n <span className=\"mb-4 inline-block rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary\">\n {post.category}\n </span>\n )}\n\n {/* Title */}\n <h1 className=\"mb-4 text-3xl font-bold tracking-tight text-foreground sm:text-4xl md:text-5xl\">\n {post.title}\n </h1>\n\n {/* Meta */}\n <div className=\"mb-8 flex flex-wrap items-center gap-3 text-sm text-muted-foreground\">\n {post.author && (\n <span className=\"font-medium text-foreground\">{post.author}</span>\n )}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime ? (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n ) : null}\n </div>\n\n {/* Hero image */}\n {post.thumbnail && (\n <div className=\"mb-10 aspect-[16/9] overflow-hidden rounded-xl\">\n <img\n src={post.thumbnail}\n alt={post.title}\n className=\"h-full w-full object-cover\"\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"prose prose-gray max-w-none dark:prose-invert\">\n <ContentRenderer content={post.content} format={post.contentFormat} />\n </div>\n\n {/* Closing CTA */}\n <div className=\"mt-14 rounded-2xl border bg-gradient-to-br from-primary/10 via-card to-card p-8 text-center\">\n <h2 className=\"text-xl font-bold text-foreground\">\n Curious what {productLabel} could do for you?\n </h2>\n <p className=\"mx-auto mt-2 max-w-lg text-sm text-muted-foreground\">\n We’re happy to walk you through it — no pressure, just a\n conversation about your goals.\n </p>\n <a\n href={contactHref}\n className=\"mt-6 inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md\"\n >\n {contactLabel}\n </a>\n </div>\n </article>\n </div>\n );\n}\n","/**\n * Utility function to merge Tailwind CSS classes\n * Combines clsx and tailwind-merge for optimal class handling\n */\n\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge multiple class names intelligently\n * - Handles conditional classes via clsx\n * - Deduplicates and resolves Tailwind conflicts via tailwind-merge\n *\n * @example\n * ```ts\n * cn('px-4 py-2', 'bg-blue-500', { 'text-white': isActive })\n * // => 'px-4 py-2 bg-blue-500 text-white' (if isActive is true)\n * ```\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils/cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"../utils/cn\";\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","\"use client\";\n\n/**\n * Changelog Component\n *\n * CMS-powered changelog. Sources ProductContentPage records tagged \"changelog\"\n * and renders them as a newest-first version timeline (hero + version cards +\n * optional CTA). Each entry's markdown body is rendered inline. Replaces the\n * older per-site static `data/changelog.ts` arrays so releases are managed in\n * the product CMS instead of code.\n *\n * Also supports a prop-driven mode via the `entries` prop for sites that want\n * to source changelog data locally or from another provider. In that mode the\n * component adds search, category filters, and pagination on top of the\n * timeline UI.\n *\n * @example\n * ```tsx\n * import { ChangelogPage } from '@burdenoff/website-sdk'\n *\n * // CMS-powered\n * <Route path=\"/changelog\" element={<ChangelogPage productName=\"VibeControls\" />} />\n *\n * // Prop-driven\n * <ChangelogPage\n * productName=\"VibeControls\"\n * entries={[...]}\n * pageSize={10}\n * />\n * ```\n */\n\nimport { useState, useEffect, useCallback, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { Search, History, ChevronLeft, ChevronRight } from \"lucide-react\";\n\nimport { ContentRenderer } from \"./content-provider\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { cn } from \"../utils/cn\";\n\nimport type { ContentPageData, ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ChangelogEntry {\n /** Release date as an ISO string. */\n date: string;\n /** Version identifier, e.g. \"1.2.0\". */\n version: string;\n /** Entry headline. */\n title: string;\n /** Category used for filtering, e.g. \"feature\", \"fix\", \"improvement\". */\n category: string;\n /** Entry body — plain text, markdown, or a React node. */\n content: ReactNode | string;\n /** Optional tags for search and filtering. */\n tags?: string[];\n}\n\nexport interface ChangelogPageProps {\n productName?: string;\n heroEyebrow?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n /** Optional bottom CTA. Rendered only when ctaHref + ctaLabel are provided. */\n ctaTitle?: string;\n ctaSubtitle?: string;\n ctaHref?: string;\n ctaLabel?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n /**\n * Optional prop-driven entries. When provided, the component skips the CMS\n * fetch and renders these entries with search, category filters, and\n * pagination.\n */\n entries?: ChangelogEntry[];\n /** Number of entries per page in prop-driven mode. Defaults to 10. */\n pageSize?: number;\n}\n\n/** A list item plus its resolved full body. */\ninterface ResolvedChangelogEntry extends ContentPageListItem {\n content?: string;\n contentFormat?: string;\n}\n\n// ============================================================================\n// Queries\n// ============================================================================\n\n/** Tag that marks a ProductContentPage as a changelog entry. */\nconst CHANGELOG_TAG = \"changelog\";\n\nconst CHANGELOG_LIST_QUERY = `\n query ChangelogList($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n excerpt\n seoDescription\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\nconst CHANGELOG_ENTRY_QUERY = `\n query ChangelogEntry($slug: String!, $productId: String) {\n publicContentPage(slug: $slug, productId: $productId) {\n content\n contentFormat\n }\n }\n`;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatDate(value?: string | null): string {\n if (!value) return \"\";\n return new Date(value).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n}\n\nfunction sortByDateDesc(\n a: ResolvedChangelogEntry,\n b: ResolvedChangelogEntry,\n): number {\n const da = new Date(a.publishedAt || a.lastUpdated || 0).getTime();\n const db = new Date(b.publishedAt || b.lastUpdated || 0).getTime();\n return db - da;\n}\n\nfunction normalize(value: string): string {\n return value.toLowerCase().trim();\n}\n\nfunction paginate<T>(items: T[], page: number, pageSize: number): T[] {\n const start = (page - 1) * pageSize;\n return items.slice(start, start + pageSize);\n}\n\nfunction parseEntryDate(date: string): number {\n return new Date(date).getTime();\n}\n\n// ============================================================================\n// CMS-Powered Changelog\n// ============================================================================\n\nfunction useCmsChangelog() {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n\n const [entries, setEntries] = useState<ResolvedChangelogEntry[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchEntries = useCallback(async () => {\n if (!resolvedProductId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n try {\n const listResult = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n };\n }>(CHANGELOG_LIST_QUERY, {\n productId: resolvedProductId,\n limit: 50,\n offset: 0,\n });\n\n if (listResult.errors?.length) {\n setError(listResult.errors[0]?.message ?? \"Failed to load changelog\");\n return;\n }\n\n const changelogItems = (listResult.data?.publicContentPages?.items || [])\n .filter((p) => p.tags?.includes(CHANGELOG_TAG))\n .sort(sortByDateDesc);\n\n // Resolve each entry's full markdown body (list items omit `content`).\n const resolved = await Promise.all(\n changelogItems.map(async (item) => {\n try {\n const detail = await client.query<{\n publicContentPage: Pick<\n ContentPageData,\n \"content\" | \"contentFormat\"\n > | null;\n }>(CHANGELOG_ENTRY_QUERY, {\n slug: item.slug,\n productId: resolvedProductId,\n });\n const page = detail.data?.publicContentPage;\n return {\n ...item,\n content: page?.content,\n contentFormat: page?.contentFormat,\n } as ResolvedChangelogEntry;\n } catch {\n return { ...item } as ResolvedChangelogEntry;\n }\n }),\n );\n\n setEntries(resolved);\n setError(null);\n } catch {\n setError(\"Failed to load changelog\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId]);\n\n useEffect(() => {\n fetchEntries();\n }, [fetchEntries]);\n\n return { entries, loading, error };\n}\n\nfunction CmsTimeline(props: {\n entries: ResolvedChangelogEntry[];\n loading: boolean;\n error: string | null;\n}) {\n const { entries, loading, error } = props;\n\n if (loading) {\n return (\n <div className=\"max-w-3xl mx-auto space-y-12\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"rounded-2xl border border-border/40 bg-card overflow-hidden animate-pulse\"\n >\n <div className=\"p-6 sm:p-8 space-y-4\">\n <div className=\"h-3 bg-muted rounded w-1/3\" />\n <div className=\"h-6 bg-muted rounded w-2/3\" />\n <div className=\"h-4 bg-muted rounded\" />\n <div className=\"h-4 bg-muted rounded w-5/6\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">{error}</p>\n </div>\n );\n }\n\n if (entries.length === 0) {\n return (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No changelog entries yet. Check back soon!\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"max-w-3xl mx-auto space-y-12\">\n {entries.map((entry) => (\n <article\n key={entry.id}\n id={entry.slug}\n className=\"rounded-2xl border border-border/40 bg-card overflow-hidden scroll-mt-24\"\n >\n {entry.thumbnail && (\n <img\n src={entry.thumbnail}\n alt=\"\"\n width={1024}\n height={576}\n loading=\"lazy\"\n decoding=\"async\"\n className=\"w-full aspect-video object-cover border-b border-border/40\"\n />\n )}\n <div className=\"p-6 sm:p-8\">\n <p className=\"text-xs text-muted-foreground mb-2\">\n {entry.publishedAt && (\n <time dateTime={entry.publishedAt}>\n {formatDate(entry.publishedAt || entry.lastUpdated)}\n </time>\n )}\n {entry.author && (\n <>\n {\" · \"}\n {entry.author}\n </>\n )}\n </p>\n <h2 className=\"text-xl sm:text-2xl font-bold text-foreground mb-4\">\n {entry.title}\n </h2>\n {entry.content ? (\n <div className=\"prose prose-sm prose-gray dark:prose-invert max-w-none\">\n <ContentRenderer\n content={entry.content}\n format={entry.contentFormat}\n />\n </div>\n ) : (\n entry.excerpt && (\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {entry.excerpt}\n </p>\n )\n )}\n </div>\n </article>\n ))}\n </div>\n );\n}\n\n// ============================================================================\n// Prop-Driven Changelog\n// ============================================================================\n\nfunction EntryContent({ content }: { content: ReactNode | string }) {\n if (typeof content === \"string\") {\n return (\n <div className=\"prose prose-sm prose-gray dark:prose-invert max-w-none\">\n <ContentRenderer content={content} format=\"markdown\" />\n </div>\n );\n }\n return <div className=\"prose prose-sm max-w-none\">{content}</div>;\n}\n\nfunction EntriesTimeline(props: {\n entries: ChangelogEntry[];\n pageSize: number;\n productName?: string;\n}) {\n const { entries, pageSize, productName } = props;\n const [query, setQuery] = useState(\"\");\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [page, setPage] = useState(1);\n\n const categories = useMemo(\n () => Array.from(new Set(entries.map((e) => e.category))).sort(),\n [entries],\n );\n\n const filtered = useMemo(() => {\n const normalized = normalize(query);\n return entries\n .filter((entry) => {\n if (selectedCategory && entry.category !== selectedCategory) {\n return false;\n }\n if (!normalized) return true;\n const haystack = [\n entry.title,\n entry.version,\n entry.category,\n ...(entry.tags ?? []),\n typeof entry.content === \"string\" ? entry.content : \"\",\n ]\n .join(\" \")\n .toLowerCase();\n return haystack.includes(normalized);\n })\n .sort((a, b) => parseEntryDate(b.date) - parseEntryDate(a.date));\n }, [entries, query, selectedCategory]);\n\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const safePage = Math.min(page, totalPages);\n const pageItems = paginate(filtered, safePage, pageSize);\n\n // Reset to first page when filters change.\n useEffect(() => {\n setPage(1);\n }, [query, selectedCategory]);\n\n if (entries.length === 0) {\n return (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No changelog entries yet. Check back soon!\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"max-w-3xl mx-auto\">\n {/* Controls */}\n <div className=\"mb-8 space-y-4\">\n <div className=\"relative\">\n <Search\n className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n <Input\n type=\"search\"\n placeholder=\"Search releases, features, fixes…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"pl-9\"\n aria-label=\"Search changelog\"\n />\n </div>\n\n {categories.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n onClick={() => setSelectedCategory(null)}\n className={cn(\n \"px-3 py-1 rounded-full text-xs font-medium border transition-colors\",\n selectedCategory === null\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground border-border/60 hover:border-primary/40\",\n )}\n >\n All\n </button>\n {categories.map((category) => (\n <button\n key={category}\n type=\"button\"\n onClick={() => setSelectedCategory(category)}\n className={cn(\n \"px-3 py-1 rounded-full text-xs font-medium border transition-colors\",\n selectedCategory === category\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground border-border/60 hover:border-primary/40\",\n )}\n >\n {category}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Timeline */}\n <div className=\"relative\">\n {/* Vertical timeline line */}\n <div\n className=\"absolute left-[1.125rem] top-3 bottom-3 w-px bg-border/60 hidden sm:block\"\n aria-hidden=\"true\"\n />\n\n <div className=\"space-y-8\">\n {pageItems.map((entry) => (\n <article\n key={`${entry.version}-${entry.date}`}\n className=\"relative sm:pl-12\"\n >\n {/* Timeline dot */}\n <div\n className=\"hidden sm:flex absolute left-2 top-2 h-5 w-5 items-center justify-center rounded-full border-2 border-background bg-primary ring-1 ring-border/40\"\n aria-hidden=\"true\"\n >\n <span className=\"h-2 w-2 rounded-full bg-primary-foreground\" />\n </div>\n\n <div className=\"rounded-2xl border border-border/40 bg-card overflow-hidden\">\n <div className=\"p-6 sm:p-8\">\n <div className=\"flex flex-wrap items-center gap-2 mb-3\">\n <span className=\"inline-flex items-center rounded-md bg-primary/10 px-2 py-1 text-xs font-medium text-primary\">\n {entry.category}\n </span>\n <span className=\"inline-flex items-center rounded-md bg-muted px-2 py-1 text-xs font-mono font-medium text-muted-foreground\">\n v{entry.version}\n </span>\n <time\n className=\"text-xs text-muted-foreground\"\n dateTime={entry.date}\n >\n {formatDate(entry.date)}\n </time>\n </div>\n\n {entry.tags && entry.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mb-3\">\n {entry.tags.map((tag) => (\n <span\n key={tag}\n className=\"text-[10px] uppercase tracking-wide text-muted-foreground bg-background border border-border/40 px-1.5 py-0.5 rounded\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n\n <h2 className=\"text-xl sm:text-2xl font-bold text-foreground mb-4\">\n {entry.title}\n </h2>\n\n <EntryContent content={entry.content} />\n </div>\n </div>\n </article>\n ))}\n </div>\n </div>\n\n {/* Empty state after filtering */}\n {pageItems.length === 0 && (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No entries match your filters.\n </p>\n </div>\n )}\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"mt-10 flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">\n Page {safePage} of {totalPages} · {filtered.length} entries\n </p>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.max(1, p - 1))}\n disabled={safePage <= 1}\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.min(totalPages, p + 1))}\n disabled={safePage >= totalPages}\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )}\n\n {productName && pageItems.length > 0 && (\n <script type=\"application/ld+json\">\n {JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"ItemList\",\n name: `${productName} Changelog`,\n itemListElement: pageItems.map((entry, index) => ({\n \"@type\": \"ListItem\",\n position: (safePage - 1) * pageSize + index + 1,\n name: entry.title,\n description:\n typeof entry.content === \"string\"\n ? entry.content.slice(0, 200)\n : undefined,\n datePublished: entry.date,\n })),\n })}\n </script>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// ChangelogPage\n// ============================================================================\n\nexport function ChangelogPage(props: ChangelogPageProps) {\n const {\n productName,\n heroEyebrow = \"What's new\",\n heroTitle = \"Changelog\",\n heroSubtitle = \"Platform updates, improvements, and announcements — newest first.\",\n ctaTitle,\n ctaSubtitle,\n ctaHref,\n ctaLabel,\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n entries,\n pageSize = 10,\n } = props;\n\n const { product } = useProduct();\n const resolvedProductName = productName || product?.name;\n const cms = useCmsChangelog();\n const showCta = Boolean(ctaHref && ctaLabel);\n const isPropDriven = entries != null;\n\n return (\n <div className={`w-full ${className}`}>\n <PageHead\n title={seoTitle || heroTitle}\n description={seoDescription || heroSubtitle}\n productName={resolvedProductName}\n keywords={seoKeywords}\n />\n\n {/* Hero */}\n <section className=\"py-16 md:py-20 px-4 sm:px-6 lg:px-8 text-center\">\n <div className=\"max-w-3xl mx-auto\">\n <div className=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-primary/10 border border-primary/20 text-xs font-medium text-primary mb-6\">\n <History className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {heroEyebrow}\n </div>\n <h1 className=\"text-4xl sm:text-5xl font-bold text-foreground mb-4\">\n {heroTitle}\n </h1>\n <p className=\"text-lg text-muted-foreground\">{heroSubtitle}</p>\n </div>\n </section>\n\n {/* Timeline */}\n <section className=\"px-4 sm:px-6 lg:px-8 pb-20\">\n {isPropDriven ? (\n <EntriesTimeline\n entries={entries}\n pageSize={pageSize}\n productName={resolvedProductName}\n />\n ) : (\n <CmsTimeline\n entries={cms.entries}\n loading={cms.loading}\n error={cms.error}\n />\n )}\n </section>\n\n {/* CTA (optional) */}\n {showCta && (\n <section className=\"py-14 px-4 sm:px-6 lg:px-8 bg-primary/5 border-t border-border/40\">\n <div className=\"max-w-2xl mx-auto text-center\">\n {ctaTitle && (\n <h2 className=\"text-2xl font-bold text-foreground mb-3\">\n {ctaTitle}\n </h2>\n )}\n {ctaSubtitle && (\n <p className=\"text-muted-foreground mb-7\">{ctaSubtitle}</p>\n )}\n <a\n href={ctaHref}\n className=\"inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:opacity-90 transition-opacity\"\n >\n {ctaLabel}\n </a>\n </div>\n </section>\n )}\n </div>\n );\n}\n","/**\n * Shared content helpers.\n *\n * Used by the file-download content lists (press kit, contracts, …) so that\n * formatting and download behaviour — and any bug fixes — live in one place.\n */\n\n/** Human-readable byte size (e.g. \"1.2 MB\"); empty string when unknown. */\nexport function formatBytes(bytes?: number | null): string {\n if (bytes == null) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n}\n\n/** Minimal shape needed to derive an extension / trigger a download. */\nexport interface DownloadableFile {\n fileUrl: string;\n fileName?: string | null;\n title?: string | null;\n}\n\n/** Uppercased file extension (e.g. \"PDF\"); \"FILE\" when none can be derived. */\nexport function fileExt(file: DownloadableFile): string {\n const name =\n file.fileName || file.fileUrl.split(\"/\").pop()?.split(\"?\")[0] || \"\";\n const ext = name.split(\".\").pop();\n return ext && ext !== name ? ext.toUpperCase() : \"FILE\";\n}\n\n// The HTML `download` attribute is ignored by browsers for cross-origin URLs\n// (files are served from S3/CDN). To actually save the file we fetch it as a\n// blob and trigger a real save; if that's blocked (CORS / network) we fall\n// back to opening it in a new tab — never worse than before.\nexport async function downloadFile(\n e: { preventDefault: () => void },\n file: DownloadableFile,\n): Promise<void> {\n e.preventDefault();\n const openInTab = () =>\n window.open(file.fileUrl, \"_blank\", \"noopener,noreferrer\");\n const name =\n file.fileName ||\n file.fileUrl.split(\"/\").pop()?.split(\"?\")[0] ||\n file.title ||\n \"download\";\n try {\n const res = await fetch(file.fileUrl, { mode: \"cors\" });\n if (!res.ok) {\n openInTab();\n return;\n }\n const blob = await res.blob();\n const objUrl = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = objUrl;\n a.download = name;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(objUrl);\n } catch {\n openInTab();\n }\n}\n","\"use client\";\n\n/**\n * Press Kit Component\n *\n * CMS-powered public press/media kit. Lists downloadable assets (logos,\n * banners, brochures, documents, brand guides) grouped by category, with a\n * media-contact block. Mirrors the BlogListPage architecture.\n *\n * @example\n * ```tsx\n * import { PressKitPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/press\" element={<PressKitPage productName=\"VibeControls\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport { formatBytes, downloadFile } from \"./utils\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type PressKitAssetCategory =\n | \"LOGO\"\n | \"BANNER\"\n | \"SCREENSHOT\"\n | \"BROCHURE\"\n | \"DOCUMENT\"\n | \"PRESS_RELEASE\"\n | \"BRAND_GUIDE\";\n\nexport interface PressKitAsset {\n id: string;\n category: PressKitAssetCategory;\n title: string;\n slug: string;\n description?: string | null;\n fileUrl: string;\n fileName?: string | null;\n fileSize?: number | null;\n mimeType?: string | null;\n thumbnailUrl?: string | null;\n version?: string | null;\n tags: string[];\n sortOrder: number;\n updatedAt: string;\n}\n\nexport interface PressKitPageProps {\n productName?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n /** Media/press contact email shown in the contact block */\n mediaContactEmail?: string;\n /** Optional URL for a \"Download brand kit\" hero CTA (e.g. a zip asset) */\n brandKitUrl?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n /**\n * Show a \"Press Releases\" section (published content pages tagged\n * \"press\") above the downloadable assets. Self-hides when there are\n * none. Default: true.\n */\n showPressReleases?: boolean;\n /**\n * Base path for press-release detail links — `${basePath}/${slug}`.\n * Default: \"/press\".\n */\n pressReleaseBasePath?: string;\n /** Heading for the press-releases section. Default: \"Press Releases\". */\n pressReleasesTitle?: string;\n}\n\n// ============================================================================\n// Query\n// ============================================================================\n\nconst PRESS_KIT_QUERY = `\n query PublicPressKit($productId: String!, $limit: Int, $offset: Int) {\n publicPressKitAssets(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n category\n title\n slug\n description\n fileUrl\n fileName\n fileSize\n mimeType\n thumbnailUrl\n version\n tags\n sortOrder\n updatedAt\n }\n total\n hasMore\n }\n }\n`;\n\n// Press releases are ProductContentPages with primary tag \"press\"\n// (published + public). publicContentPages already filters to\n// isPublished + visibility=PUBLIC server-side; we filter by tag client-side.\nconst PRESS_RELEASES_QUERY = `\n query PublicPressReleases($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n seoDescription\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\nconst CATEGORY_ORDER: PressKitAssetCategory[] = [\n \"LOGO\",\n \"BANNER\",\n \"SCREENSHOT\",\n \"BRAND_GUIDE\",\n \"BROCHURE\",\n \"DOCUMENT\",\n \"PRESS_RELEASE\",\n];\n\nconst CATEGORY_LABELS: Record<PressKitAssetCategory, string> = {\n LOGO: \"Logos\",\n BANNER: \"Banners\",\n SCREENSHOT: \"Screenshots\",\n BRAND_GUIDE: \"Brand Guides\",\n BROCHURE: \"Brochures\",\n DOCUMENT: \"Documents\",\n PRESS_RELEASE: \"Press Releases\",\n};\n\nfunction isImageAsset(a: PressKitAsset): boolean {\n return (a.mimeType || \"\").startsWith(\"image/\");\n}\n\n// ============================================================================\n// PressKitLightbox — image preview modal (Esc / backdrop / ✕ to close,\n// Download inside). Image assets open this; other types open the file.\n// ============================================================================\n\nfunction PressKitLightbox({\n asset,\n onClose,\n}: {\n asset: PressKitAsset | null;\n onClose: () => void;\n}) {\n useEffect(() => {\n if (!asset) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n const prevOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.body.style.overflow = prevOverflow;\n };\n }, [asset, onClose]);\n\n if (!asset) return null;\n const ext =\n (asset.mimeType || \"file\").split(\"/\").pop()?.toUpperCase() || \"FILE\";\n const size = formatBytes(asset.fileSize);\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`${asset.title} preview`}\n onClick={onClose}\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/80 p-4 sm:p-8\"\n >\n <div\n onClick={(e) => e.stopPropagation()}\n className=\"relative flex max-h-full w-full max-w-4xl flex-col overflow-hidden rounded-xl border bg-card shadow-2xl\"\n >\n <div className=\"flex items-start justify-between gap-4 border-b p-4\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">\n {asset.title}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {ext}\n {size ? ` · ${size}` : \"\"}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close preview\"\n className=\"shrink-0 rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <svg\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"flex flex-1 items-center justify-center overflow-auto bg-muted/20 p-4\">\n <img\n src={asset.fileUrl}\n alt={asset.title}\n className=\"max-h-[70vh] w-auto max-w-full object-contain\"\n />\n </div>\n\n <div className=\"flex justify-end border-t p-4\">\n <a\n href={asset.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download\n onClick={(e) => {\n void downloadFile(e, asset);\n }}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90\"\n >\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Download\n </a>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// AssetCard\n// ============================================================================\n\nfunction AssetCard({\n asset,\n onPreview,\n}: {\n asset: PressKitAsset;\n onPreview?: (a: PressKitAsset) => void;\n}) {\n const date = asset.updatedAt\n ? new Date(asset.updatedAt).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })\n : \"\";\n const ext =\n (asset.mimeType || \"file\").split(\"/\").pop()?.toUpperCase() || \"FILE\";\n const size = formatBytes(asset.fileSize);\n // Dead/unreachable thumbnail URLs (stale data, expired CDN, etc.) must\n // degrade to the placeholder instead of a broken-image glyph.\n const [imgError, setImgError] = useState(false);\n\n const thumb =\n asset.thumbnailUrl && !imgError ? (\n <div className=\"aspect-[16/9] overflow-hidden bg-muted/30\">\n <img\n src={asset.thumbnailUrl}\n alt={asset.title}\n className=\"w-full h-full object-contain group-hover:scale-105 transition-transform duration-300\"\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n </div>\n ) : (\n <div className=\"aspect-[16/9] bg-muted/50 flex items-center justify-center\">\n <svg\n className=\"w-12 h-12 text-muted-foreground/20\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\"\n />\n </svg>\n </div>\n );\n\n return (\n <div className=\"group flex flex-col bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300\">\n {/* Image assets open a preview modal; other types open the file. */}\n {onPreview && isImageAsset(asset) ? (\n <button\n type=\"button\"\n onClick={() => onPreview(asset)}\n aria-label={`Preview ${asset.title}`}\n className=\"block w-full text-left cursor-zoom-in\"\n >\n {thumb}\n </button>\n ) : (\n <a\n href={asset.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Open ${asset.title}`}\n className=\"block\"\n >\n {thumb}\n </a>\n )}\n\n <div className=\"flex flex-col flex-1 p-5\">\n <span className=\"inline-block self-start text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-3\">\n {CATEGORY_LABELS[asset.category] ?? asset.category}\n </span>\n <h3 className=\"text-base font-semibold text-foreground mb-1 line-clamp-2\">\n {asset.title}\n </h3>\n {asset.description && (\n <p className=\"text-sm text-muted-foreground mb-3 line-clamp-2\">\n {asset.description}\n </p>\n )}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">{ext}</span>\n {size && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{size}</span>\n </>\n )}\n {date && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{date}</span>\n </>\n )}\n </div>\n <a\n href={asset.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download\n onClick={(e) => {\n void downloadFile(e, asset);\n }}\n className=\"inline-flex items-center gap-1.5 text-sm font-medium text-primary hover:underline\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Download\n </a>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// PressReleaseCard\n// ============================================================================\n\nfunction PressReleaseCard({\n release,\n basePath,\n}: {\n release: ContentPageListItem;\n basePath: string;\n}) {\n const date = release.publishedAt || release.lastUpdated;\n const formattedDate = date\n ? new Date(date).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })\n : \"\";\n // Dead/unreachable thumbnail → placeholder, never a broken-image glyph.\n const [imgError, setImgError] = useState(false);\n\n return (\n <a\n href={`${basePath}/${release.slug}`}\n className=\"group flex flex-col bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300\"\n >\n {release.thumbnail && !imgError ? (\n <div className=\"aspect-[16/9] overflow-hidden bg-muted/30\">\n <img\n src={release.thumbnail}\n alt={release.title}\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n </div>\n ) : (\n <div className=\"aspect-[16/9] bg-muted/50 flex items-center justify-center\">\n <svg\n className=\"w-12 h-12 text-muted-foreground/20\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m-1 13a2 2 0 01-2-2V7m3 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z\"\n />\n </svg>\n </div>\n )}\n\n <div className=\"flex flex-col flex-1 p-5 sm:p-6\">\n {release.category && (\n <span className=\"inline-block self-start text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-3\">\n {release.category}\n </span>\n )}\n <h3 className=\"text-lg font-semibold text-foreground mb-2 group-hover:text-primary transition-colors line-clamp-2\">\n {release.title}\n </h3>\n <p className=\"text-sm text-muted-foreground mb-4 line-clamp-3\">\n {release.excerpt || release.seoDescription || \"\"}\n </p>\n <div className=\"mt-auto flex items-center gap-3 text-xs text-muted-foreground\">\n {release.author && (\n <span className=\"font-medium\">{release.author}</span>\n )}\n {release.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {release.readingTime ? (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{release.readingTime} min read</span>\n </>\n ) : null}\n </div>\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// PressKitPage\n// ============================================================================\n\nexport function PressKitPage(props: PressKitPageProps) {\n const {\n productName,\n heroTitle = \"Press & Media Kit\",\n heroSubtitle = \"Official logos, brand assets, and media resources. Everything you need to write about us.\",\n mediaContactEmail,\n brandKitUrl,\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n showPressReleases = true,\n pressReleaseBasePath = \"/press\",\n pressReleasesTitle = \"Press Releases\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const contactEmail = mediaContactEmail || product?.contactEmail || undefined;\n\n const [assets, setAssets] = useState<PressKitAsset[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [activeCategory, setActiveCategory] = useState<\n PressKitAssetCategory | \"ALL\"\n >(\"ALL\");\n const [releases, setReleases] = useState<ContentPageListItem[]>([]);\n const [releasesLoading, setReleasesLoading] = useState(true);\n const [preview, setPreview] = useState<PressKitAsset | null>(null);\n\n const fetchAssets = useCallback(async () => {\n if (!resolvedProductId) {\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const PAGE_SIZE = 100;\n // Page through every asset instead of hard-capping at one request —\n // products can have more than a single page — but bound the loop so a\n // stuck `hasMore: true` can't spin into unbounded requests.\n const MAX_PAGES = 10;\n const all: PressKitAsset[] = [];\n let offset = 0;\n for (let pageNum = 0; pageNum < MAX_PAGES; pageNum++) {\n const result = await client.query<{\n publicPressKitAssets: { items: PressKitAsset[]; hasMore: boolean };\n }>(PRESS_KIT_QUERY, {\n productId: resolvedProductId,\n limit: PAGE_SIZE,\n offset,\n });\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load press kit\");\n return;\n }\n const page = result.data?.publicPressKitAssets;\n const items = page?.items || [];\n all.push(...items);\n if (!page?.hasMore || items.length === 0) break;\n offset += PAGE_SIZE;\n }\n setAssets(all);\n setError(null);\n } catch {\n setError(\"Failed to load press kit\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId]);\n\n useEffect(() => {\n fetchAssets();\n }, [fetchAssets]);\n\n // Press releases — published content pages tagged \"press\". Failure here\n // must NOT break the press-kit assets page, so errors are swallowed and\n // the section simply self-hides (releases stays empty).\n const fetchReleases = useCallback(async () => {\n if (!resolvedProductId || !showPressReleases) {\n setReleasesLoading(false);\n return;\n }\n setReleasesLoading(true);\n try {\n const PAGE_SIZE = 100;\n // Safety cap: publicContentPages has no server-side tag filter yet,\n // so this pages through ALL content pages then filters \"press\"\n // client-side. Bound it to avoid a runaway loop (stuck hasMore) and\n // unbounded over-fetch on products with many content pages.\n // TODO(follow-up): add a `tags` arg to publicContentPages and drop this.\n const MAX_PAGES = 10;\n const all: ContentPageListItem[] = [];\n let offset = 0;\n for (let pageNum = 0; pageNum < MAX_PAGES; pageNum++) {\n const result = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n hasMore: boolean;\n };\n }>(PRESS_RELEASES_QUERY, {\n productId: resolvedProductId,\n limit: PAGE_SIZE,\n offset,\n });\n if (result.errors?.length) {\n // Clear stale releases so the section self-hides instead of\n // showing outdated cards from a prior product/context.\n setReleases([]);\n return;\n }\n const page = result.data?.publicContentPages;\n const items = page?.items || [];\n all.push(...items);\n if (!page?.hasMore || items.length === 0) break;\n offset += PAGE_SIZE;\n }\n const pressOnly = all\n .filter((p) => p.tags?.includes(\"press\"))\n .sort((a, b) => {\n const da = new Date(a.publishedAt || a.lastUpdated || 0).getTime();\n const db = new Date(b.publishedAt || b.lastUpdated || 0).getTime();\n return db - da; // newest first\n });\n setReleases(pressOnly);\n } catch {\n // Non-fatal — clear stale and let the section self-hide.\n setReleases([]);\n } finally {\n setReleasesLoading(false);\n }\n }, [client, resolvedProductId, showPressReleases]);\n\n useEffect(() => {\n fetchReleases();\n }, [fetchReleases]);\n\n const presentCategories = CATEGORY_ORDER.filter((c) =>\n assets.some((a) => a.category === c),\n );\n const visibleAssets =\n activeCategory === \"ALL\"\n ? assets\n : assets.filter((a) => a.category === activeCategory);\n\n const grouped = (\n activeCategory === \"ALL\" ? presentCategories : [activeCategory]\n )\n .map((cat) => ({\n cat,\n items: visibleAssets\n .filter((a) => a.category === cat)\n .sort((a, b) => a.sortOrder - b.sortOrder),\n }))\n .filter((g) => g.items.length > 0);\n\n return (\n <div className={`w-full ${className}`}>\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n />\n )}\n\n {/* Hero */}\n <section className=\"py-16 sm:py-20 md:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center max-w-3xl mx-auto\">\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground\">\n {heroTitle}\n </h1>\n <p className=\"mt-4 text-lg text-muted-foreground\">{heroSubtitle}</p>\n {(brandKitUrl || contactEmail) && (\n <div className=\"mt-8 flex flex-wrap items-center justify-center gap-4\">\n {brandKitUrl && (\n <a\n href={brandKitUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-2 px-6 py-3 rounded-lg bg-primary text-primary-foreground font-medium hover:opacity-90 transition-opacity\"\n >\n Download brand kit\n </a>\n )}\n {contactEmail && (\n <a\n href={`mailto:${contactEmail}`}\n className=\"inline-flex items-center gap-2 px-6 py-3 rounded-lg border font-medium text-foreground hover:bg-muted transition-colors\"\n >\n Media inquiries\n </a>\n )}\n </div>\n )}\n </div>\n </div>\n </section>\n\n {/* Press Releases — shows a skeleton while loading (no layout shift),\n then the cards; self-hides when there are none. */}\n {showPressReleases && (releasesLoading || releases.length > 0) && (\n <section className=\"pb-16 sm:pb-20\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <h2 className=\"text-xl font-semibold text-foreground mb-6\">\n {pressReleasesTitle}\n </h2>\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n {releasesLoading\n ? [1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"bg-card border rounded-xl overflow-hidden animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"p-5 space-y-3\">\n <div className=\"h-4 bg-muted rounded w-1/4\" />\n <div className=\"h-5 bg-muted rounded w-3/4\" />\n <div className=\"h-4 bg-muted rounded w-1/2\" />\n </div>\n </div>\n ))\n : releases.map((r) => (\n <PressReleaseCard\n key={r.id}\n release={r}\n basePath={pressReleaseBasePath}\n />\n ))}\n </div>\n </div>\n </section>\n )}\n\n {/* Assets */}\n <section className=\"pb-16 sm:pb-20\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n {loading ? (\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"bg-card border rounded-xl overflow-hidden animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"p-5 space-y-3\">\n <div className=\"h-4 bg-muted rounded w-1/4\" />\n <div className=\"h-5 bg-muted rounded w-3/4\" />\n <div className=\"h-4 bg-muted rounded w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n ) : error ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">{error}</p>\n </div>\n ) : assets.length === 0 ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n Press materials are coming soon. For media inquiries\n {contactEmail ? (\n <>\n {\", contact \"}\n <a\n href={`mailto:${contactEmail}`}\n className=\"text-primary hover:underline\"\n >\n {contactEmail}\n </a>\n </>\n ) : (\n \" please reach out to our team\"\n )}\n .\n </p>\n </div>\n ) : (\n <>\n {/* Category tabs */}\n {presentCategories.length > 1 && (\n <div className=\"flex flex-wrap gap-2 mb-10 justify-center\">\n {([\"ALL\", ...presentCategories] as const).map((c) => {\n const active = activeCategory === c;\n return (\n <button\n key={c}\n type=\"button\"\n onClick={() => setActiveCategory(c)}\n className={`px-4 py-2 rounded-full text-sm font-medium transition-colors ${\n active\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground hover:text-foreground\"\n }`}\n >\n {c === \"ALL\"\n ? \"All\"\n : (CATEGORY_LABELS[c as PressKitAssetCategory] ?? c)}\n </button>\n );\n })}\n </div>\n )}\n\n {grouped.map((group) => (\n <div key={group.cat} className=\"mb-12\">\n <h2 className=\"text-xl font-semibold text-foreground mb-5\">\n {CATEGORY_LABELS[group.cat] ?? group.cat}\n </h2>\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n {group.items.map((a) => (\n <AssetCard key={a.id} asset={a} onPreview={setPreview} />\n ))}\n </div>\n </div>\n ))}\n\n {/* Media contact */}\n {contactEmail && (\n <div className=\"mt-8 border-t pt-10 text-center\">\n <h2 className=\"text-lg font-semibold text-foreground mb-2\">\n Media Contact\n </h2>\n <p className=\"text-muted-foreground\">\n For interviews, partnerships, and press inquiries:{\" \"}\n <a\n href={`mailto:${contactEmail}`}\n className=\"text-primary hover:underline\"\n >\n {contactEmail}\n </a>\n </p>\n </div>\n )}\n </>\n )}\n </div>\n </section>\n\n <PressKitLightbox asset={preview} onClose={() => setPreview(null)} />\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Contracts Component\n *\n * CMS-powered public list of downloadable legal contracts. Contracts are\n * stored as press-kit assets with `category: CONTRACT` (files-only, no rich\n * body) and served from the public CDN — same pipeline as the press kit.\n * Renders a simple download list (title + description + download), no preview.\n *\n * @example\n * ```tsx\n * import { ContractsPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/contracts\" element={<ContractsPage productName=\"Burdenoff\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport { formatBytes, fileExt, downloadFile } from \"./utils\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ContractAsset {\n id: string;\n title: string;\n slug: string;\n description?: string | null;\n fileUrl: string;\n fileName?: string | null;\n fileSize?: number | null;\n mimeType?: string | null;\n version?: string | null;\n tags: string[];\n sortOrder: number;\n updatedAt: string;\n}\n\nexport interface ContractsPageProps {\n productName?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n}\n\n// ============================================================================\n// Query — press-kit assets filtered to the CONTRACT category (server-side)\n// ============================================================================\n\nconst CONTRACTS_QUERY = `\n query PublicContracts($productId: String!, $limit: Int, $offset: Int) {\n publicPressKitAssets(productId: $productId, category: CONTRACT, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n description\n fileUrl\n fileName\n fileSize\n mimeType\n version\n tags\n sortOrder\n updatedAt\n }\n hasMore\n }\n }\n`;\n\n// ============================================================================\n// ContractsPage\n// ============================================================================\n\nexport function ContractsPage(props: ContractsPageProps) {\n const {\n productName,\n heroTitle = \"Contracts & Legal Agreements\",\n heroSubtitle = \"Download our standard legal agreements and policies.\",\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const displayName = productName ?? product?.name ?? config.productId;\n\n const [contracts, setContracts] = useState<ContractAsset[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchContracts = useCallback(async () => {\n if (!resolvedProductId) {\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const PAGE_SIZE = 100;\n // Upper bound so a stuck `hasMore: true` (API bug / malformed cursor)\n // can never spin into unbounded requests — mirrors press-kit's guard.\n const MAX_PAGES = 10;\n const all: ContractAsset[] = [];\n let offset = 0;\n for (let pageNum = 0; pageNum < MAX_PAGES; pageNum++) {\n const result = await client.query<{\n publicPressKitAssets: { items: ContractAsset[]; hasMore: boolean };\n }>(CONTRACTS_QUERY, {\n productId: resolvedProductId,\n limit: PAGE_SIZE,\n offset,\n });\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load contracts\");\n return;\n }\n const page = result.data?.publicPressKitAssets;\n const items = page?.items || [];\n all.push(...items);\n if (!page?.hasMore || items.length === 0) break;\n offset += PAGE_SIZE;\n }\n all.sort(\n (a, b) => a.sortOrder - b.sortOrder || a.title.localeCompare(b.title),\n );\n setContracts(all);\n setError(null);\n } catch {\n setError(\"Failed to load contracts\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId]);\n\n useEffect(() => {\n fetchContracts();\n }, [fetchContracts]);\n\n return (\n <div className={`min-h-screen bg-background ${className}`}>\n <PageHead\n title={seoTitle || `Contracts — ${displayName}`}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n />\n\n {/* Hero */}\n <section className=\"border-b border-border bg-muted/30\">\n <div className=\"max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-16 text-center\">\n <h1 className=\"text-4xl md:text-5xl font-bold text-foreground mb-4\">\n {heroTitle}\n </h1>\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto\">\n {heroSubtitle}\n </p>\n </div>\n </section>\n\n <section className=\"max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12\">\n {loading ? (\n <div className=\"flex justify-center py-20\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n ) : error ? (\n <div className=\"text-center py-16\">\n <p className=\"text-sm text-muted-foreground\">{error}</p>\n </div>\n ) : contracts.length === 0 ? (\n <div className=\"text-center py-16\">\n <p className=\"text-base text-muted-foreground\">\n No contracts are available yet.\n </p>\n </div>\n ) : (\n <ul className=\"divide-y divide-border rounded-xl border border-border overflow-hidden bg-card\">\n {contracts.map((c) => {\n const ext = fileExt(c);\n const size = formatBytes(c.fileSize);\n return (\n <li\n key={c.id}\n className=\"flex items-center justify-between gap-4 p-5 hover:bg-muted/40 transition-colors\"\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h3 className=\"text-base font-semibold text-foreground truncate\">\n {c.title}\n </h3>\n {c.version && (\n <span className=\"text-xs font-medium text-primary bg-primary/10 px-2 py-0.5 rounded-full\">\n {c.version}\n </span>\n )}\n </div>\n {c.description && (\n <p className=\"text-sm text-muted-foreground mt-1 line-clamp-2\">\n {c.description}\n </p>\n )}\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">{ext}</span>\n {size && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{size}</span>\n </>\n )}\n </div>\n </div>\n <a\n href={c.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download\n aria-label={`Download ${c.title}`}\n onClick={(e) => {\n void downloadFile(e, c);\n }}\n className=\"flex-shrink-0 inline-flex items-center gap-1.5 text-sm font-medium text-primary-foreground bg-primary hover:opacity-90 px-4 py-2 rounded-lg transition-opacity\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Download\n </a>\n </li>\n );\n })}\n </ul>\n )}\n </section>\n </div>\n );\n}\n"]}
|