[
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"extends\": [\"next/core-web-vitals\", \"next/typescript\"]\n}\n"
  },
  {
    "path": ".example.env",
    "content": "TOGETHER_API_KEY=\nDATABASE_URL=\n\nS3_UPLOAD_KEY=\nS3_UPLOAD_SECRET=\nS3_UPLOAD_BUCKET=\nS3_UPLOAD_REGION=\n"
  },
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.*\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/versions\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# env files (can opt-in for committing if needed)\n.env*\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n.env*.local\n"
  },
  {
    "path": ".node-version",
    "content": "20.12.1\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"plugins\": [\"prettier-plugin-tailwindcss\"]\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Hassan El Mghari\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "<a href=\"https://github.com/Nutlope/smartpdfs\">\n  <img alt=\"SmartPDF\" src=\"./public/og.jpg\">\n  <h1 align=\"center\">SmartPDF</h1>\n</a>\n\n<p align=\"center\">\n  Instantly summarize and section your PDFs with AI. Powered by Llama 3.3 on Together AI.\n</p>\n\n## Tech stack\n\n- [Together AI](https://togetherai.link) for inference\n- [Llama 3.3](https://togetherai.link/llama-3.3) for the LLM\n- Next.js with Tailwind & TypeScript\n- Prisma ORM with Neon (Postgres)\n- Helicone for observability\n- Plausible for analytics\n- S3 for PDF storage\n\n## Cloning & running\n\n1. Clone the repo: `git clone https://github.com/Nutlope/smartpdfs`\n2. Create a `.env` file and add your environment variables (see `.example.env`):\n   - `TOGETHER_API_KEY=`\n   - `DATABASE_URL=`\n   - `S3_UPLOAD_KEY=`\n   - `S3_UPLOAD_SECRET=`\n   - `S3_UPLOAD_BUCKET=`\n   - `S3_UPLOAD_REGION=us-east-1`\n   - `HELICONE_API_KEY=` (optional, for observability)\n3. Run `pnpm install` to install dependencies\n4. Run `pnpm prisma generate` to generate the Prisma client\n5. Run `pnpm dev` to start the development server\n\n## Roadmap\n\n- [ ] Add some rate limiting by IP address\n- [ ] Integrate OCR for image parsing in PDFs\n- [ ] Add a bit more polish (make the link icon nicer) & add a \"powered by Together\" sign\n- [ ] Implement additional revision steps for improved summaries\n- [ ] Add a demo PDF for new users to be able to see it in action\n- [ ] Add feedback system with thumbs up/down feature\n"
  },
  {
    "path": "components.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema.json\",\n  \"style\": \"new-york\",\n  \"rsc\": true,\n  \"tsx\": true,\n  \"tailwind\": {\n    \"config\": \"tailwind.config.ts\",\n    \"css\": \"src/app/globals.css\",\n    \"baseColor\": \"neutral\",\n    \"cssVariables\": true,\n    \"prefix\": \"\"\n  },\n  \"aliases\": {\n    \"components\": \"@/components\",\n    \"utils\": \"@/lib/utils\",\n    \"ui\": \"@/components/ui\",\n    \"lib\": \"@/lib\",\n    \"hooks\": \"@/hooks\"\n  },\n  \"iconLibrary\": \"lucide\"\n}"
  },
  {
    "path": "next.config.ts",
    "content": "import type { NextConfig } from \"next\";\n\nconst nextConfig: NextConfig = {\n  images: {\n    remotePatterns: [\n      {\n        protocol: \"https\",\n        hostname: \"napkinsdev.s3.us-east-1.amazonaws.com\",\n      },\n      {\n        protocol: \"https\",\n        hostname: \"api.together.ai\",\n      },\n    ],\n  },\n};\n\nexport default nextConfig;\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"pdf-summary\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"build\": \"next build\",\n    \"postinstall\": \"prisma generate\",\n    \"start\": \"next start\",\n    \"lint\": \"next lint\",\n    \"update:all\": \"pnpm update --interactive --latest\"\n  },\n  \"dependencies\": {\n    \"@ai-sdk/togetherai\": \"^2.0.37\",\n    \"@aws-sdk/client-s3\": \"^3.797.0\",\n    \"@neondatabase/serverless\": \"^1.0.0\",\n    \"@prisma/adapter-neon\": \"^6.6.0\",\n    \"@prisma/client\": \"^6.6.0\",\n    \"@radix-ui/react-select\": \"^2.1.2\",\n    \"@radix-ui/react-slot\": \"^1.1.0\",\n    \"@radix-ui/react-toast\": \"^1.2.2\",\n    \"@tailwindcss/typography\": \"^0.5.16\",\n    \"ai\": \"^6.0.108\",\n    \"class-variance-authority\": \"^0.7.0\",\n    \"clsx\": \"^2.1.1\",\n    \"dedent\": \"^1.5.3\",\n    \"lucide-react\": \"^0.503.0\",\n    \"nanoid\": \"^5.1.5\",\n    \"next\": \"16.1.6\",\n    \"next-plausible\": \"^3.12.5\",\n    \"next-s3-upload\": \"^0.3.4\",\n    \"pdfjs-dist\": \"^4.8.69\",\n    \"react\": \"19.2.4\",\n    \"react-dom\": \"19.2.4\",\n    \"react-dropzone\": \"^14.3.5\",\n    \"tailwind-merge\": \"^2.5.4\",\n    \"tailwindcss-animate\": \"^1.0.7\",\n    \"together-ai\": \"^0.37.0\",\n    \"ws\": \"^8.18.0\",\n    \"zod\": \"^4.3.6\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^22.15.3\",\n    \"@types/react\": \"^19.2.14\",\n    \"@types/react-dom\": \"^19.2.3\",\n    \"@types/ws\": \"^8.5.13\",\n    \"eslint\": \"9.25.1\",\n    \"eslint-config-next\": \"15.3.1\",\n    \"postcss\": \"^8\",\n    \"prettier\": \"^3.3.3\",\n    \"prettier-plugin-tailwindcss\": \"^0.6.8\",\n    \"prisma\": \"^6.6.0\",\n    \"tailwindcss\": \"^3.4.1\",\n    \"typescript\": \"^5\"\n  },\n  \"engines\": {\n    \"node\": \"22.x\"\n  },\n  \"pnpm\": {\n    \"onlyBuiltDependencies\": [\n      \"@prisma/client\"\n    ]\n  }\n}\n"
  },
  {
    "path": "postcss.config.mjs",
    "content": "/** @type {import('postcss-load-config').Config} */\nconst config = {\n  plugins: {\n    tailwindcss: {},\n  },\n};\n\nexport default config;\n"
  },
  {
    "path": "prisma/schema.prisma",
    "content": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n  provider = \"prisma-client-js\"\n}\n\ndatasource db {\n  provider = \"postgresql\"\n  url      = env(\"DATABASE_URL\")\n}\n\nmodel SmartPDF {\n  id        String   @id @default(nanoid(5))\n  createdAt DateTime @default(now())\n  imageUrl  String\n  pdfUrl    String\n  pdfName   String\n\n  sections Section[]\n}\n\nmodel Section {\n  id       String @id @default(nanoid(5))\n  type     String\n  title    String\n  summary  String\n  position Int\n\n  SmartPDF   SmartPDF @relation(fields: [smartPDFId], references: [id])\n  smartPDFId String\n}\n"
  },
  {
    "path": "src/app/actions.ts",
    "content": "\"use server\";\n\nimport { nanoid } from \"nanoid\";\nimport client from \"@/lib/prisma\";\nimport { redirect } from \"next/navigation\";\n\nconst slugify = (text: string) => {\n  return text\n    .toLowerCase()\n    .replace(/ /g, \"-\")\n    .replace(/[^\\w-]+/g, \"\")\n    .replace(/--+/g, \"-\")\n    .replace(/^-+/, \"\")\n    .replace(/-+$/, \"\")\n    .slice(0, 20);\n};\n\nexport async function sharePdf({\n  pdfName,\n  pdfUrl,\n  imageUrl,\n  sections,\n}: {\n  pdfName: string;\n  pdfUrl: string;\n  imageUrl: string;\n  sections: {\n    type: string;\n    title: string;\n    summary: string;\n    position: number;\n  }[];\n}) {\n  const smartPdf = await client.smartPDF.create({\n    data: {\n      id: `${slugify(sections[0].title)}-${nanoid(4)}`,\n      pdfName,\n      pdfUrl,\n      imageUrl,\n      sections: {\n        createMany: {\n          data: sections,\n        },\n      },\n    },\n  });\n\n  redirect(`/pdf/${smartPdf.id}`);\n}\n"
  },
  {
    "path": "src/app/api/image/route.ts",
    "content": "import dedent from \"dedent\";\nimport { togetheraiBaseClient, togetheraiClient } from \"@/lib/ai\";\nimport { ImageGenerationResponse } from \"@/lib/summarize\";\nimport { awsS3Client } from \"@/lib/s3client\";\nimport { PutObjectCommand } from \"@aws-sdk/client-s3\";\nimport { generateText } from \"ai\";\n\nexport async function POST(req: Request) {\n  const json = await req.json();\n  const text = \"text\" in json ? json.text : \"\";\n\n  const start = new Date();\n\n  const truncatedText = text.slice(0, 2000);\n\n  const { text: visualDescription } = await generateText({\n    model: togetheraiClient(\n      \"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\",\n    ),\n    prompt: dedent`\n      Based on the following content, describe a single visual scene that represents its essence. \n      The scene should be suitable for a painting or illustration.\n      Do NOT include any text, words, or writing in your description.\n      Just describe what you would see: objects, colors, atmosphere, lighting, mood.\n      Keep it to 2-3 sentences.\n\n      Content: ${truncatedText}\n\n      Visual scene description:\n    `,\n  });\n\n  const prompt = dedent`\n    ${visualDescription}\n\n    Oil painting, fine art, museum quality, artistic brushstrokes. \n    No text, no words, no letters, no writing, no documents, no signs.\n    Pure visual illustration only.\n  `;\n\n  const generatedImage = await togetheraiBaseClient.images.generate({\n    model: \"black-forest-labs/FLUX.2-dev\",\n    width: 1280,\n    height: 720,\n    prompt: prompt,\n  });\n\n  const end = new Date();\n  console.log(`Image generation took ${end.getTime() - start.getTime()}ms`);\n\n  const imageData = generatedImage.data[0];\n  if (!imageData) throw new Error(\"No image data generated\");\n\n  if (imageData.url === undefined)\n    throw new Error(\"Expected URL response format\");\n\n  const imageUrl = imageData.url;\n\n  if (!imageUrl) throw new Error(\"No image URL returned\");\n\n  const imageFetch = await fetch(imageUrl);\n  const imageBlob = await imageFetch.blob();\n  const imageBuffer = Buffer.from(await imageBlob.arrayBuffer());\n\n  const coverImageKey = `pdf-cover-${generatedImage.id}.jpg`;\n\n  const uploadedFile = await awsS3Client.send(\n    new PutObjectCommand({\n      Bucket: process.env.S3_UPLOAD_BUCKET || \"\",\n      Key: coverImageKey,\n      Body: imageBuffer,\n      ContentType: \"image/jpeg\",\n    }),\n  );\n\n  if (!uploadedFile) {\n    throw new Error(\"Failed to upload enhanced image to S3\");\n  }\n\n  return Response.json({\n    url: `https://${process.env.S3_UPLOAD_BUCKET}.s3.${\n      process.env.S3_UPLOAD_REGION || \"us-east-1\"\n    }.amazonaws.com/${coverImageKey}`,\n  } as ImageGenerationResponse);\n}\n\nexport const runtime = \"edge\";\n"
  },
  {
    "path": "src/app/api/s3-upload/route.ts",
    "content": "export { POST } from \"next-s3-upload/route\";\n"
  },
  {
    "path": "src/app/api/summarize/route.ts",
    "content": "import { togetheraiBaseClient } from \"@/lib/ai\";\nimport assert from \"assert\";\nimport dedent from \"dedent\";\nimport { z } from \"zod\";\n\nexport async function POST(req: Request) {\n  const { text, language } = await req.json();\n\n  assert.ok(typeof text === \"string\");\n  assert.ok(typeof language === \"string\");\n\n  const systemPrompt = dedent`\n    You are an expert at summarizing text.\n\n    Your task:\n    1. Read the document excerpt I will provide\n    2. Create a concise summary in ${language}\n    3. Generate a short, descriptive title in ${language}\n\n    Guidelines for the summary:\n    - Format the summary in HTML\n    - Use <p> tags for paragraphs (2-3 sentences each)\n    - Use <ul> and <li> tags for bullet points\n    - Use <h3> tags for subheadings when needed but don't repeat the initial title in the first paragraph\n    - Ensure proper spacing with appropriate HTML tags\n\n    The summary should be well-structured and easy to scan, while maintaining accuracy and completeness.\n    Please analyze the text thoroughly before starting the summary.\n\n    IMPORTANT: Output ONLY valid JSON matching the schema. Output ONLY valid HTML without any markdown or plain text line breaks.\n  `;\n\n  const summarySchema = z.object({\n    title: z.string().describe(\"A title for the summary\"),\n    summary: z\n      .string()\n      .describe(\n        \"The actual summary of the text containing new lines breaks between paragraphs or phrases for better readability.\",\n      ),\n  });\n\n  const jsonSchema = z.toJSONSchema(summarySchema, {\n    target: \"openapi-3.0\",\n    io: \"output\",\n  });\n\n  const summaryResponse = await togetheraiBaseClient.chat.completions.create({\n    model: \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n    messages: [\n      {\n        role: \"system\",\n        content: systemPrompt,\n      },\n      {\n        role: \"user\",\n        content: text,\n      },\n    ],\n    response_format: {\n      type: \"json_schema\",\n      json_schema: {\n        name: \"summary\",\n        schema: jsonSchema,\n      },\n    } as any,\n  });\n\n  const content = summaryResponse.choices[0]?.message?.content;\n\n  if (!content) {\n    console.log(\"Content was blank\", JSON.stringify(summaryResponse, null, 2));\n    return Response.json({ error: \"No content generated\" }, { status: 500 });\n  }\n\n  const parsed = summarySchema.parse(JSON.parse(content));\n\n  return Response.json(parsed);\n}\n\nexport const runtime = \"edge\";\n"
  },
  {
    "path": "src/app/globals.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\nbody {\n  font-family: Arial, Helvetica, sans-serif;\n}\n\n@layer base {\n  :root {\n    --background: 37 27% 94%;\n    --foreground: 0 0% 3.9%;\n    --card: 0 0% 100%;\n    --card-foreground: 0 0% 3.9%;\n    --popover: 0 0% 100%;\n    --popover-foreground: 0 0% 3.9%;\n    --primary: 0 2.44% 24.12%;\n    --primary-foreground: 0 0% 98%;\n    --secondary: 0 0% 96.1%;\n    --secondary-foreground: 0 0% 9%;\n    --muted: 0 0% 96.1%;\n    --muted-foreground: 0 0% 45.1%;\n    --accent: 0 0% 96.1%;\n    --accent-foreground: 0 0% 9%;\n    --destructive: 0 84.2% 60.2%;\n    --destructive-foreground: 0 0% 98%;\n    --border: 0 0% 89.8%;\n    --input: 0 0% 89.8%;\n    --ring: 0 0% 3.9%;\n    --chart-1: 12 76% 61%;\n    --chart-2: 173 58% 39%;\n    --chart-3: 197 37% 24%;\n    --chart-4: 43 74% 66%;\n    --chart-5: 27 87% 67%;\n    --radius: 0.5rem;\n  }\n}\n\n@layer base {\n  * {\n    @apply border-border;\n  }\n  body {\n    @apply bg-background text-foreground;\n  }\n}\n"
  },
  {
    "path": "src/app/layout.tsx",
    "content": "import GithubIcon from \"@/components/icons/github\";\nimport XIcon from \"@/components/icons/x\";\nimport Logo from \"@/components/ui/logo\";\nimport type { Metadata } from \"next\";\nimport { Plus_Jakarta_Sans } from \"next/font/google\";\nimport \"./globals.css\";\nimport { Toaster } from \"@/components/ui/toaster\";\nimport Link from \"next/link\";\nimport PlausibleProvider from \"next-plausible\";\n\nconst font = Plus_Jakarta_Sans({\n  subsets: [\"latin\"],\n  display: \"swap\",\n  variable: \"--font-plus-jakarta-sans\",\n});\n\nexport const metadata: Metadata = {\n  title: \"Smart PDFs | Summarize PDFs in seconds\",\n  description:\n    \"Upload a PDF to get a quick, clear, and shareable summary with AI for free!\",\n  openGraph: {\n    images: \"https://smartpdfs.vercel.app/og.jpg\",\n  },\n};\n\nexport default function RootLayout({\n  children,\n}: Readonly<{\n  children: React.ReactNode;\n}>) {\n  return (\n    <html lang=\"en\" className=\"h-full\">\n      <head>\n        <PlausibleProvider domain=\"smartpdfs.ai\" />\n      </head>\n      <body\n        className={`${font.variable} flex min-h-full flex-col bg-gray-100 font-[family-name:var(--font-plus-jakarta-sans)] text-gray-900 antialiased`}\n      >\n        <header className=\"py-6 text-center\">\n          <Link href=\"/\" className=\"inline-flex justify-center\">\n            <Logo />\n          </Link>\n        </header>\n\n        <main className=\"grow overflow-hidden\">{children}</main>\n        <Toaster />\n        <footer className=\"mx-auto mt-14 flex w-full max-w-7xl items-center justify-between px-4 py-6 md:mt-0\">\n          <p className=\"text-xs text-gray-300 md:text-sm\">\n            Powered by Llama 3.3 on{\" \"}\n            <a\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"text-gray-400 underline transition hover:text-gray-900\"\n              href=\"https://togetherai.link/\"\n            >\n              Together AI\n            </a>\n          </p>\n\n          <div className=\"flex items-center gap-2 md:gap-3\">\n            <a\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"inline-flex items-center gap-1 rounded-lg border border-gray-250 bg-white px-2 py-1.5 text-xs text-gray-300 shadow transition hover:bg-white/75 md:rounded-xl md:px-4 md:text-sm\"\n              href=\"https://github.com/nutlope/smartpdfs\"\n            >\n              <GithubIcon className=\"size-4\" />\n              GitHub\n            </a>\n            <a\n              href=\"https://x.com/nutlope\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"inline-flex items-center gap-1 rounded-lg border border-gray-250 bg-white px-2 py-1.5 text-xs text-gray-300 shadow transition hover:bg-white/75 md:rounded-xl md:px-4 md:text-sm\"\n            >\n              <XIcon className=\"size-3\" />\n              Twitter\n            </a>\n          </div>\n        </footer>\n      </body>\n    </html>\n  );\n}\n"
  },
  {
    "path": "src/app/page.tsx",
    "content": "\"use client\";\n\nimport { useS3Upload } from \"next-s3-upload\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  Chunk,\n  chunkPdf,\n  generateImage,\n  generateQuickSummary,\n  summarizeStream,\n} from \"@/lib/summarize\";\nimport { getDocument } from \"pdfjs-dist/legacy/build/pdf.mjs\";\nimport { FormEvent, useState } from \"react\";\nimport \"pdfjs-dist/legacy/build/pdf.worker.mjs\";\nimport { MenuIcon, SquareArrowOutUpRight } from \"lucide-react\";\nimport { sharePdf } from \"@/app/actions\";\nimport ActionButton from \"@/components/ui/action-button\";\nimport Link from \"next/link\";\nimport { useToast } from \"@/hooks/use-toast\";\nimport { HomeLandingDrop } from \"@/components/HomeLandingDrop\";\nimport SummaryContent from \"@/components/ui/summary-content\";\nimport TableOfContents from \"@/components/ui/table-of-contents\";\n\nexport type StatusApp = \"idle\" | \"parsing\" | \"generating\";\n\nexport default function Home() {\n  const [status, setStatus] = useState<StatusApp>(\"idle\");\n  const [file, setFile] = useState<File>();\n  const [fileUrl, setFileUrl] = useState(\"\");\n  const [chunks, setChunks] = useState<Chunk[]>([]);\n  const [activeChunkIndex, setActiveChunkIndex] = useState<\n    number | \"quick-summary\" | null\n  >(null);\n  const [quickSummary, setQuickSummary] = useState<{\n    title: string;\n    summary: string;\n  }>();\n  const [image, setImage] = useState<string>();\n  const [showMobileContents, setShowMobileContents] = useState(true);\n  const { uploadToS3 } = useS3Upload();\n\n  const { toast } = useToast();\n\n  async function handleSubmit(e: FormEvent<HTMLFormElement>) {\n    e.preventDefault();\n    const language = new FormData(e.currentTarget).get(\"language\");\n\n    if (!file || typeof language !== \"string\") return;\n\n    setStatus(\"parsing\");\n\n    const uploadedPdfPromise = uploadToS3(file);\n\n    const arrayBuffer = await file.arrayBuffer();\n    const pdf = await getDocument({ data: arrayBuffer }).promise;\n    if (pdf.numPages > 500) {\n      toast({\n        variant: \"destructive\",\n        title: \"PDF too large (500 pages max)\",\n        description: \"That PDF has too many pages. Please use a smaller PDF.\",\n      });\n      setStatus(\"idle\");\n      return;\n    }\n\n    const localChunks = await chunkPdf(pdf);\n    const totalText = localChunks.reduce(\n      (acc, chunk) => acc + chunk.text.length,\n      0,\n    );\n\n    if (totalText < 500) {\n      toast({\n        variant: \"destructive\",\n        title: \"Unable to process PDF\",\n        description:\n          \"The PDF appears to be a scanned document or contains too little text to process. Please ensure the PDF contains searchable text.\",\n      });\n      setFile(undefined);\n      setStatus(\"idle\");\n      return;\n    }\n\n    setChunks(localChunks);\n    setStatus(\"generating\");\n\n    const summarizedChunks: Chunk[] = [];\n\n    const writeStream = new WritableStream({\n      write(chunk) {\n        summarizedChunks.push(chunk);\n        setChunks((chunks) => {\n          return chunks.map((c) =>\n            c.text === chunk.text ? { ...c, ...chunk } : c,\n          );\n        });\n      },\n    });\n\n    const streamPromise = summarizeStream(localChunks, language);\n    const imagePromise = generateImage(localChunks[0]?.text ?? \"\");\n\n    const [stream] = await Promise.all([streamPromise]);\n    const controller = new AbortController();\n    await stream.pipeTo(writeStream, { signal: controller.signal });\n\n    const quickSummary = await generateQuickSummary(summarizedChunks, language);\n    const imageUrl = await imagePromise;\n\n    setQuickSummary(quickSummary);\n    setImage(imageUrl);\n\n    const uploadedPdf = await uploadedPdfPromise;\n    setFileUrl(uploadedPdf.url);\n\n    setActiveChunkIndex((activeChunkIndex) =>\n      activeChunkIndex === null ? \"quick-summary\" : activeChunkIndex,\n    );\n\n    await sharePdf({\n      pdfName: file.name,\n      pdfUrl: uploadedPdf.url,\n      imageUrl: imageUrl,\n      sections: [\n        {\n          type: \"quick-summary\",\n          title: quickSummary.title,\n          summary: quickSummary.summary,\n          position: 0,\n        },\n        ...summarizedChunks.map((chunk, index) => ({\n          type: \"summary\",\n          title: chunk?.title ?? \"\",\n          summary: chunk?.summary ?? \"\",\n          position: index + 1,\n        })),\n      ],\n    });\n  }\n\n  return (\n    <div>\n      {status === \"idle\" || status === \"parsing\" ? (\n        <HomeLandingDrop\n          status={status}\n          file={file}\n          setFile={(file) => file && setFile(file)}\n          handleSubmit={handleSubmit}\n        />\n      ) : (\n        <div className=\"mt-6 px-4 md:mt-10\">\n          <div className=\"mx-auto max-w-3xl\">\n            <div className=\"flex items-center justify-between rounded-lg border border-gray-250 px-4 py-2 md:px-6 md:py-3\">\n              <div className=\"inline-flex items-center gap-4\">\n                <p className=\"md:text-lg\">{file?.name}</p>\n              </div>\n\n              <div className=\"flex flex-row gap-2\">\n                {fileUrl && (\n                  <Link href={fileUrl} target=\"_blank\">\n                    <ActionButton>\n                      <SquareArrowOutUpRight size={14} />\n                      <span>Original PDF</span>\n                    </ActionButton>\n                  </Link>\n                )}\n              </div>\n            </div>\n\n            <div className=\"mt-8 rounded-lg bg-gray-200 px-4 py-2 shadow md:hidden\">\n              <Button\n                onClick={() => setShowMobileContents(!showMobileContents)}\n                className=\"w-full text-gray-500 hover:bg-transparent\"\n                variant=\"ghost\"\n              >\n                <MenuIcon />\n                {showMobileContents ? \"Hide\" : \"Show\"} contents\n              </Button>\n\n              {showMobileContents && (\n                <div className=\"mt-4\">\n                  <TableOfContents\n                    activeChunkIndex={activeChunkIndex}\n                    setActiveChunkIndex={setActiveChunkIndex}\n                    quickSummary={quickSummary}\n                    chunks={chunks}\n                  />\n                </div>\n              )}\n            </div>\n\n            <div className=\"mt-4 flex gap-4\">\n              <div className=\"w-full grow rounded-lg bg-white p-5 text-gray-500 shadow\">\n                {activeChunkIndex === \"quick-summary\" ? (\n                  <SummaryContent\n                    title={quickSummary?.title}\n                    summary={quickSummary?.summary}\n                    imageUrl={image}\n                  />\n                ) : activeChunkIndex !== null ? (\n                  <SummaryContent\n                    title={chunks[activeChunkIndex].title}\n                    summary={chunks[activeChunkIndex].summary}\n                  />\n                ) : (\n                  <div className=\"flex animate-pulse items-center justify-center py-4 text-lg md:py-8\">\n                    Generating your Smart PDF&hellip;\n                  </div>\n                )}\n              </div>\n\n              <div className=\"hidden w-full max-w-60 shrink-0 md:flex\">\n                <TableOfContents\n                  activeChunkIndex={activeChunkIndex}\n                  setActiveChunkIndex={setActiveChunkIndex}\n                  quickSummary={quickSummary}\n                  chunks={chunks}\n                />\n              </div>\n            </div>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/app/pdf/[id]/page.tsx",
    "content": "import SmartPDFViewer from \"@/app/pdf/[id]/smart-pdf-viewer\";\nimport client from \"@/lib/prisma\";\nimport { notFound } from \"next/navigation\";\nimport { unstable_cache } from \"next/cache\";\nimport { Metadata, ResolvingMetadata } from \"next\";\n\nconst getSmartPDF = unstable_cache(\n  async (id: string) => {\n    return client.smartPDF.findUnique({\n      where: { id },\n      include: { sections: true },\n    });\n  },\n  [\"smart-pdf-query\"],\n  { revalidate: false },\n);\n\nexport async function generateMetadata(\n  {\n    params,\n  }: {\n    params: Promise<{ id: string }>;\n  },\n  parent: ResolvingMetadata,\n): Promise<Metadata> {\n  // read route params\n  const { id } = await params;\n  const parentData = await parent;\n\n  // fetch data\n  const smartPdf = await getSmartPDF(id);\n\n  if (!smartPdf) notFound();\n\n  return {\n    title: `${smartPdf.sections[0].title.slice(0, 60)} | ${parentData.title?.absolute}`,\n    description: `${smartPdf.sections[0].summary\n      .replace(/<[^>]*>/g, \"\")\n      .slice(0, 160)}...`,\n    openGraph: {\n      images: [smartPdf.imageUrl],\n    },\n  };\n}\n\nexport default async function Home({\n  params,\n}: {\n  params: Promise<{ id: string }>;\n}) {\n  const id = (await params).id;\n  const smartPdf = await getSmartPDF(id);\n\n  if (!smartPdf) notFound();\n\n  return <SmartPDFViewer smartPdf={smartPdf} />;\n}\n"
  },
  {
    "path": "src/app/pdf/[id]/smart-pdf-viewer.tsx",
    "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Section, SmartPDF } from \"@prisma/client\";\nimport { LinkIcon, MenuIcon, SquareArrowOutUpRight } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { useState } from \"react\";\nimport TableOfContents from \"@/components/ui/table-of-contents\";\nimport SummaryContent from \"@/components/ui/summary-content\";\nimport ActionButton from \"@/components/ui/action-button\";\nimport { useToast } from \"@/hooks/use-toast\";\n\nexport default function SmartPDFViewer({\n  smartPdf,\n}: {\n  smartPdf: SmartPDF & { sections: Section[] };\n}) {\n  const { toast } = useToast();\n  const [showMobileContents, setShowMobileContents] = useState(true);\n  const [activeSection, setActiveSection] = useState<number | \"quick-summary\">(\n    \"quick-summary\",\n  );\n\n  const handleShare = () => {\n    toast({\n      title: \"Copied to Clipboard 📋\",\n      description:\n        \"Share link has been copied. Ready to share your PDF summary! 🔗\",\n    });\n    navigator.clipboard.writeText(window.location.href);\n  };\n\n  const quickSummary = smartPdf.sections[0];\n  const pdfSections = smartPdf.sections.slice(1);\n\n  return (\n    <div className=\"mt-6 px-4 md:mt-10\">\n      <div className=\"mx-auto max-w-3xl\">\n        <div className=\"flex flex-col items-center justify-between gap-4 rounded-lg border border-gray-250 px-4 py-2 text-center sm:flex-row md:px-6 md:py-3\">\n          <p className=\"w-[-webkit-fill-available] max-w-96 truncate md:text-lg md:leading-9\">\n            {smartPdf.pdfName}\n          </p>\n          <div className=\"flex flex-row gap-2\">\n            <Link href={smartPdf.pdfUrl} target=\"_blank\">\n              <ActionButton>\n                <SquareArrowOutUpRight size={14} />\n                <span>Original PDF</span>\n              </ActionButton>\n            </Link>\n            <div className=\"md:hidden\">\n              <ActionButton onClick={handleShare} size=\"icon\">\n                <LinkIcon />\n              </ActionButton>\n            </div>\n            <div className=\"hidden md:block\" onClick={handleShare}>\n              <ActionButton type=\"submit\">\n                <LinkIcon />\n                <span>Share Summary</span>\n              </ActionButton>\n            </div>\n          </div>\n        </div>\n\n        <div className=\"mt-8 rounded-lg bg-gray-200 px-4 py-2 shadow md:hidden\">\n          <Button\n            onClick={() => setShowMobileContents(!showMobileContents)}\n            className=\"w-full text-gray-500 hover:bg-transparent\"\n            variant=\"ghost\"\n          >\n            <MenuIcon />\n            {showMobileContents ? \"Hide\" : \"Show\"} contents\n          </Button>\n\n          {showMobileContents && (\n            <div className=\"mt-4\">\n              <TableOfContents\n                activeChunkIndex={activeSection}\n                setActiveChunkIndex={(idx) =>\n                  idx !== null && setActiveSection(idx)\n                }\n                quickSummary={smartPdf.sections[0]}\n                chunks={smartPdf.sections.slice(1).map((section) => ({\n                  ...section,\n                  text: section.summary,\n                }))}\n              />\n            </div>\n          )}\n        </div>\n\n        <div className=\"mt-4 flex gap-4\">\n          <div className=\"w-full grow rounded-lg bg-white p-5 text-gray-500 shadow\">\n            {activeSection === \"quick-summary\" ? (\n              <SummaryContent\n                title={quickSummary.title}\n                summary={quickSummary.summary}\n                imageUrl={smartPdf.imageUrl}\n              />\n            ) : activeSection !== null ? (\n              <SummaryContent\n                title={pdfSections[activeSection].title}\n                summary={pdfSections[activeSection].summary}\n              />\n            ) : (\n              <div className=\"flex animate-pulse items-center justify-center py-4 text-lg md:py-8\">\n                Generating your Smart PDF&hellip;\n              </div>\n            )}\n          </div>\n\n          <div className=\"hidden w-full max-w-60 shrink-0 md:flex\">\n            <TableOfContents\n              activeChunkIndex={activeSection}\n              setActiveChunkIndex={(idx) =>\n                idx !== null && setActiveSection(idx)\n              }\n              quickSummary={smartPdf.sections[0]}\n              chunks={smartPdf.sections.slice(1).map((section) => ({\n                ...section,\n                text: section.summary,\n              }))}\n            />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/components/HomeLandingDrop.tsx",
    "content": "\"use client\";\n\nimport { SparklesIcon } from \"lucide-react\";\nimport { Button } from \"./ui/button\";\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from \"./ui/select\";\nimport Dropzone from \"react-dropzone\";\nimport HomepageImage1 from \"./images/homepage-image-1\";\nimport HomepageImage2 from \"./images/homepage-image-2\";\nimport { StatusApp } from \"@/app/page\";\nimport { useToast } from \"@/hooks/use-toast\";\n\nexport const HomeLandingDrop = ({\n  status,\n  file,\n  setFile,\n  handleSubmit,\n}: {\n  status: StatusApp;\n  file?: File | null;\n  setFile: (file: File | null) => void;\n  handleSubmit: (e: React.FormEvent<HTMLFormElement>) => void;\n}) => {\n  const { toast } = useToast();\n  return (\n    <div className=\"mx-auto mt-6 max-w-lg md:mt-10\">\n      <h1 className=\"text-center text-4xl font-bold md:text-5xl\">\n        Summarize PDFs\n        <br /> in seconds\n      </h1>\n      <p className=\"mx-auto mt-6 max-w-md text-balance text-center leading-snug md:text-lg md:leading-snug\">\n        Upload a <strong>PDF</strong> to get a quick, clear, and shareable\n        summary.\n      </p>\n\n      <form\n        onSubmit={handleSubmit}\n        className=\"relative mx-auto mt-20 max-w-md px-4 md:mt-16\"\n      >\n        <div className=\"pointer-events-none absolute left-[-40px] top-[-185px] flex w-[200px] items-center md:-left-[calc(min(30vw,350px))] md:-top-20 md:w-[390px]\">\n          <HomepageImage1 />\n        </div>\n        <div className=\"pointer-events-none absolute right-[20px] top-[-110px] flex w-[70px] justify-center md:-right-[calc(min(30vw,350px))] md:-top-5 md:w-[390px]\">\n          <HomepageImage2 />\n        </div>\n\n        <div className=\"relative\">\n          <div className=\"flex flex-col rounded-xl bg-white px-6 py-6 shadow md:px-12 md:py-8\">\n            <label className=\"text-gray-500\" htmlFor=\"file\">\n              Upload PDF\n            </label>\n            <Dropzone\n              multiple={false}\n              accept={{\n                \"application/pdf\": [\".pdf\"],\n              }}\n              onDrop={(acceptedFiles) => {\n                const file = acceptedFiles[0];\n                if (file.size > 15 * 1024 * 1024) {\n                  // 10MB in bytes\n                  toast({\n                    title: \"📁 File Too Large\",\n                    description: \"⚠️ File size must be less than 15MB\",\n                  });\n                  return;\n                }\n                setFile(file);\n              }}\n            >\n              {({ getRootProps, getInputProps, isDragAccept }) => (\n                <div\n                  className={`mt-2 flex aspect-video cursor-pointer items-center justify-center rounded-lg border border-dashed bg-gray-100 ${isDragAccept ? \"border-blue-500\" : \"border-gray-250\"}`}\n                  {...getRootProps()}\n                >\n                  <input required={!file} {...getInputProps()} />\n                  <div className=\"text-center\">\n                    {file ? (\n                      <p>{file.name}</p>\n                    ) : (\n                      <Button type=\"button\" className=\"md:text-base\">\n                        Select PDF\n                      </Button>\n                    )}\n                  </div>\n                </div>\n              )}\n            </Dropzone>\n            <label className=\"mt-8 text-gray-500\" htmlFor=\"language\">\n              Language\n            </label>\n            <Select defaultValue=\"english\" name=\"language\">\n              <SelectTrigger className=\"mt-2 bg-gray-100\" id=\"language\">\n                <SelectValue />\n              </SelectTrigger>\n              <SelectContent>\n                {[\n                  { label: \"English\", value: \"english\" },\n                  { label: \"German\", value: \"german\" },\n                  { label: \"French\", value: \"french\" },\n                  { label: \"Italian\", value: \"italian\" },\n                  { label: \"Portuguese\", value: \"portuguese\" },\n                  { label: \"Hindi\", value: \"hindi\" },\n                  { label: \"Spanish\", value: \"spanish\" },\n                  { label: \"Thai\", value: \"thai\" },\n                ].map((language) => (\n                  <SelectItem key={language.value} value={language.value}>\n                    {language.label}\n                  </SelectItem>\n                ))}\n              </SelectContent>\n            </Select>\n          </div>\n          <div className=\"mt-8 text-center\">\n            <Button\n              type=\"submit\"\n              variant=\"secondary\"\n              className=\"w-60 border bg-white/80 text-base font-semibold hover:bg-white md:w-auto\"\n              disabled={status === \"parsing\"}\n            >\n              <SparklesIcon />\n              Generate\n            </Button>\n          </div>\n        </div>\n      </form>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/components/icons/github.tsx",
    "content": "import { ComponentProps } from \"react\";\n\nexport default function GithubIcon(props: ComponentProps<\"svg\">) {\n  return (\n    <svg\n      width={11}\n      height={12}\n      viewBox=\"0 0 11 12\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M5.5.5C2.462.5 0 3.024 0 6.14c0 2.49 1.576 4.605 3.761 5.35.275.052.376-.122.376-.272 0-.133-.005-.489-.008-.959-1.53.34-1.853-.756-1.853-.756-.25-.652-.61-.825-.61-.825-.5-.35.038-.343.038-.343.552.04.842.581.842.581.49.862 1.288.613 1.6.469.051-.364.193-.613.35-.753-1.22-.143-2.505-.627-2.505-2.788 0-.615.214-1.119.566-1.513-.057-.143-.245-.716.054-1.492 0 0 .462-.152 1.512.578a5.147 5.147 0 011.377-.19 5.16 5.16 0 011.377.19c1.05-.73 1.511-.579 1.511-.579.3.777.111 1.35.055 1.493.352.394.565.898.565 1.513 0 2.167-1.286 2.644-2.51 2.783.197.174.372.518.372 1.044 0 .754-.007 1.362-.007 1.547 0 .15.1.327.379.271a5.522 5.522 0 002.722-2.055A5.731 5.731 0 0011 6.14C11 3.024 8.537.5 5.5.5z\"\n        fill=\"#B7B7B7\"\n      />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "src/components/icons/sparkles.tsx",
    "content": "import { ComponentProps } from \"react\";\n\nexport default function SparklesIcon(props: ComponentProps<\"svg\">) {\n  return (\n    <svg\n      width={14}\n      height={14}\n      viewBox=\"0 0 14 14\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n      {...props}\n    >\n      <path\n        opacity={0.8}\n        fill=\"url(#pattern0_136_130632)\"\n        d=\"M0 -0.000244141H14V13.999755859H0z\"\n      />\n      <defs>\n        <pattern\n          id=\"pattern0_136_130632\"\n          patternContentUnits=\"objectBoundingBox\"\n          width={1}\n          height={1}\n        >\n          <use xlinkHref=\"#image0_136_130632\" transform=\"scale(.00195)\" />\n        </pattern>\n        <image\n          id=\"image0_136_130632\"\n          width={512}\n          height={512}\n          xlinkHref=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAAAXNSR0IArs4c6QAAIABJREFUeAHt3QnYHVWd5/EfSSALkJUAAcK+SMIS2VEEkdioyKMO0IpiXIkwqIF2QbvphkFURluRpkdEZeyJtvpERxyBoYdNlM2whSXshJAAgeyBLCQkpOf9d1eRN/e9975V99Zylm89T54k73vvrXM+9T/n/KvuqVMSGwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIINBLYLKk30u6XtIpvX7OPxFAAAEEEEAgUIE9Ja2R9O/JnzckHRVoXakWAggggAACCCQCv+41+KdJwN2StkAIAQQQQAABBMIUOFzSxiYJgCUCHwyzytQKAQQQQAABBG5pMfhbAvCEpC0hQgABBBBAAIGwBE5uM/inXwWcHVaVqQ0CCCCAAAJxCwyUNDtDArBQ0vC4qag9AggggAAC4QicmWHwT68CXBROtakJAggggAAC8QoMlfR8jgRglaRx8XJRcwQQQAABBMIQuCDH4J9eBfhRGFWnFggggAACCMQpMFbSKx0kABskTYyTjFojgAACCCDgv8AVHQz+6VUAWyqYDQEEEEAAAQQ8E7Alf9d1kQBYInC8Z3WmuAgggAACCEQv8JsuB39LAGayRHD0cQQAAggggIBHAke0WfI3vcSf9e/TPKo3RUUAAQQQQCBqgdsLOPtPE4RnJQ2OWpPKI4AAAggg4IGAPdQnHbyL+vuLHtSbIiKAAAIIIBCtgC35+2gJCcBiSSOiVaXiCCCAAAIIOC5wVgmDf3oV4ZuO153iIYAAAgggEKXANpIWlJgArJE0PkpZKo0AAggggIDDAheWOPinVwGudrj+FA0BBBBAAIHoBLbvcMnfdGDP+vcbkiZFp0uFEUAAAQQQcFTghxWc/adJwvWOGlAsBBBAAAEEohLYV9Lr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\"\n        />\n      </defs>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "src/components/icons/x.tsx",
    "content": "import { ComponentProps } from \"react\";\n\nexport default function XIcon(props: ComponentProps<\"svg\">) {\n  return (\n    <svg\n      width={10}\n      height={10}\n      viewBox=\"0 0 10 10\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M6.717 10L4.302 6.404 1.279 10H0l3.734-4.44L0 0h3.283L5.56 3.388 8.411 0H9.69L6.129 4.235 10 10H6.717zM8.14 8.986H7.28L1.83 1.013h.861l2.182 3.193.378.554L8.14 8.986z\"\n        fill=\"#B7B7B7\"\n      />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "src/components/images/homepage-image-1.tsx",
    "content": "import { ComponentProps } from \"react\";\n\nexport default function HomepageImage1(props: ComponentProps<\"svg\">) {\n  return (\n    <svg\n      width={379}\n      height={341}\n      viewBox=\"0 0 379 341\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n      {...props}\n    >\n      <g clipPath=\"url(#clip0_136_130388)\">\n        <rect\n          opacity={0.2}\n          x={350.017}\n          y={105.134}\n          width={8.22857}\n          height={1.37143}\n          rx={0.685714}\n          transform=\"rotate(-9.807 350.017 105.134)\"\n          fill=\"#E1E1E1\"\n        />\n        <rect\n          opacity={0.2}\n          x={364.967}\n          y={191.623}\n          width={8.22857}\n          height={1.37143}\n          rx={0.685714}\n          transform=\"rotate(-9.807 364.967 191.623)\"\n          fill=\"#E1E1E1\"\n        />\n        <rect\n          opacity={0.2}\n          x={375.778}\n          y={189.754}\n          width={8.22857}\n          height={1.37143}\n          rx={0.685714}\n          transform=\"rotate(-9.807 375.778 189.754)\"\n          fill=\"#E1E1E1\"\n        />\n        <mask\n          id=\"a\"\n          style={{\n            maskType: \"alpha\",\n          }}\n          maskUnits=\"userSpaceOnUse\"\n          x={-19}\n          y={24}\n          width={417}\n          height={285}\n        >\n          <path\n            transform=\"rotate(-9.807 -18.712 89.538)\"\n            fill=\"url(#paint0_linear_136_130388)\"\n            d=\"M-18.7124 89.5377H365.2876V311.7087H-18.7124z\"\n          />\n        </mask>\n        <g mask=\"url(#a)\">\n          <rect\n            x={123.228}\n            y={126.749}\n            width={104.6}\n            height={370.657}\n            rx={5.5}\n            transform=\"rotate(-9.807 123.228 126.749)\"\n            fill=\"#fff\"\n            stroke=\"#B7B7B7\"\n          />\n          <path\n            transform=\"rotate(-9.807 136.031 139.338)\"\n            fill=\"#E1E1E1\"\n            d=\"M136.031 139.338H219.68810000000002V140.70943H136.031z\"\n          />\n          <rect\n            x={148.177}\n            y={209.61}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 148.177 209.61)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={160.324}\n            y={279.882}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 160.324 279.882)\"\n            fill=\"#E1E1E1\"\n          />\n          <path\n            transform=\"rotate(-9.807 136.965 144.743)\"\n            fill=\"#E1E1E1\"\n            d=\"M136.965 144.743H220.6221V146.11443H136.965z\"\n          />\n          <rect\n            x={149.112}\n            y={215.015}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 149.112 215.015)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={161.258}\n            y={285.288}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 161.258 285.288)\"\n            fill=\"#E1E1E1\"\n          />\n          <path\n            transform=\"rotate(-9.807 137.899 150.149)\"\n            fill=\"#E1E1E1\"\n            d=\"M137.899 150.149H221.55610000000001V151.52043H137.899z\"\n          />\n          <rect\n            x={150.046}\n            y={220.421}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 150.046 220.421)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={162.192}\n            y={290.693}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 162.192 290.693)\"\n            fill=\"#E1E1E1\"\n          />\n          <path\n            transform=\"rotate(-9.807 138.834 155.554)\"\n            fill=\"#E1E1E1\"\n            d=\"M138.834 155.554H222.49110000000002V156.92543H138.834z\"\n          />\n          <rect\n            x={150.98}\n            y={225.826}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 150.98 225.826)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={163.127}\n            y={296.099}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 163.127 296.099)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={139.768}\n            y={160.96}\n            width={60.3429}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 139.768 160.96)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={151.915}\n            y={231.232}\n            width={60.3429}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 151.915 231.232)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={164.061}\n            y={301.504}\n            width={60.3429}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 164.061 301.504)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={142.104}\n            y={174.474}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 142.104 174.474)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={154.251}\n            y={244.746}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 154.251 244.746)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={166.397}\n            y={315.018}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 166.397 315.018)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={143.038}\n            y={179.879}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 143.038 179.879)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={155.185}\n            y={250.151}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 155.185 250.151)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={167.331}\n            y={320.424}\n            width={83.6571}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 167.331 320.424)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={143.973}\n            y={185.285}\n            width={75.4286}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 143.973 185.285)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={156.119}\n            y={255.557}\n            width={75.4286}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 156.119 255.557)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={144.907}\n            y={190.69}\n            width={67.2}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 144.907 190.69)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={157.054}\n            y={260.963}\n            width={67.2}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 157.054 260.963)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={145.841}\n            y={196.096}\n            width={39.7714}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 145.841 196.096)\"\n            fill=\"#E1E1E1\"\n          />\n          <rect\n            x={157.988}\n            y={266.368}\n            width={39.7714}\n            height={1.37143}\n            rx={0.685714}\n            transform=\"rotate(-9.807 157.988 266.368)\"\n            fill=\"#E1E1E1\"\n          />\n          <g opacity={0.2}>\n            <rect\n              x={220.961}\n              y={31.9166}\n              width={104.6}\n              height={370.657}\n              rx={5.5}\n              transform=\"rotate(-9.807 220.961 31.917)\"\n              fill=\"#fff\"\n              stroke=\"#B7B7B7\"\n            />\n            <rect\n              x={233.764}\n              y={44.5057}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 233.764 44.506)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={245.91}\n              y={114.778}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 245.91 114.778)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={258.057}\n              y={185.05}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 258.057 185.05)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={270.203}\n              y={255.322}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 270.203 255.322)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={234.698}\n              y={49.9113}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 234.698 49.911)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={246.845}\n              y={120.184}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 246.845 120.184)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={258.991}\n              y={190.456}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 258.991 190.456)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={271.138}\n              y={260.728}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 271.138 260.728)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={235.633}\n              y={55.3168}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 235.633 55.317)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={247.779}\n              y={125.589}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 247.779 125.589)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={259.926}\n              y={195.861}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 259.926 195.861)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={272.072}\n              y={266.134}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 272.072 266.134)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={236.567}\n              y={60.7224}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 236.567 60.722)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={248.713}\n              y={130.995}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 248.713 130.995)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={260.86}\n              y={201.267}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 260.86 201.267)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={273.006}\n              y={271.539}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 273.006 271.539)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={237.501}\n              y={66.1279}\n              width={60.3429}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 237.501 66.128)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={249.648}\n              y={136.4}\n              width={60.3429}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 249.648 136.4)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={261.794}\n              y={206.672}\n              width={60.3429}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 261.794 206.672)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={273.941}\n              y={276.945}\n              width={60.3429}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 273.941 276.945)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={239.837}\n              y={79.6418}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 239.837 79.642)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={251.984}\n              y={149.914}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 251.984 149.914)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={264.13}\n              y={220.186}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 264.13 220.186)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={276.277}\n              y={290.459}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 276.277 290.459)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={240.771}\n              y={85.0474}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 240.771 85.047)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={252.918}\n              y={155.32}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 252.918 155.32)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={265.064}\n              y={225.592}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 265.064 225.592)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={277.211}\n              y={295.864}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 277.211 295.864)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={241.706}\n              y={90.4529}\n              width={75.4286}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 241.706 90.453)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={253.852}\n              y={160.725}\n              width={75.4286}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 253.852 160.725)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={265.999}\n              y={230.997}\n              width={75.4286}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 265.999 230.997)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={278.145}\n              y={301.27}\n              width={75.4286}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 278.145 301.27)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={242.64}\n              y={95.8585}\n              width={67.2}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 242.64 95.859)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={254.787}\n              y={166.131}\n              width={67.2}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 254.787 166.131)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={266.933}\n              y={236.403}\n              width={67.2}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 266.933 236.403)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={279.08}\n              y={306.675}\n              width={67.2}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 279.08 306.675)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={243.575}\n              y={101.264}\n              width={39.7714}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 243.575 101.264)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={255.721}\n              y={171.536}\n              width={39.7714}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 255.721 171.536)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={267.867}\n              y={241.809}\n              width={39.7714}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 267.867 241.809)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={280.014}\n              y={312.081}\n              width={39.7714}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 280.014 312.081)\"\n              fill=\"#E1E1E1\"\n            />\n          </g>\n          <g opacity={0.2}>\n            <rect\n              x={58.5247}\n              y={-247.586}\n              width={104.6}\n              height={370.657}\n              rx={5.5}\n              transform=\"rotate(-9.807 58.525 -247.586)\"\n              fill=\"#fff\"\n              stroke=\"#B7B7B7\"\n            />\n            <rect\n              x={119.913}\n              y={46.0917}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 119.913 46.092)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={120.848}\n              y={51.4973}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 120.848 51.497)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={121.782}\n              y={56.9028}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 121.782 56.903)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={122.716}\n              y={62.3084}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 122.716 62.308)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={123.651}\n              y={67.7139}\n              width={60.3429}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 123.651 67.714)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={125.987}\n              y={81.2278}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 125.987 81.228)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={126.921}\n              y={86.6334}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 126.921 86.633)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={127.855}\n              y={92.0389}\n              width={75.4286}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 127.855 92.039)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={116.643}\n              y={27.1722}\n              width={67.2}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 116.643 27.172)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={128.79}\n              y={97.4445}\n              width={67.2}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 128.79 97.445)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={117.577}\n              y={32.5778}\n              width={39.7714}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 117.577 32.578)\"\n              fill=\"#E1E1E1\"\n            />\n            <path\n              transform=\"rotate(-9.807 129.724 102.85)\"\n              fill=\"#E1E1E1\"\n              d=\"M129.724 102.85H169.4954V104.22143H129.724z\"\n            />\n          </g>\n          <g opacity={0.2}>\n            <rect\n              x={-8.37503}\n              y={25.6289}\n              width={104.6}\n              height={370.657}\n              rx={4.5}\n              transform=\"rotate(-9.807 -8.375 25.629)\"\n              fill=\"#fff\"\n              stroke=\"#B7B7B7\"\n            />\n            <rect\n              x={4.42767}\n              y={38.218}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 4.428 38.218)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={16.5742}\n              y={108.49}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 16.574 108.49)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={28.7207}\n              y={178.763}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 28.72 178.763)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={40.8672}\n              y={249.035}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 40.867 249.035)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={53.0136}\n              y={319.307}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 53.014 319.307)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={5.36206}\n              y={43.6235}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 5.362 43.623)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={17.5085}\n              y={113.896}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 17.509 113.896)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={29.655}\n              y={184.168}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 29.655 184.168)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={41.8015}\n              y={254.44}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 41.801 254.44)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={6.29639}\n              y={49.0291}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 6.296 49.03)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={18.4429}\n              y={119.301}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 18.443 119.301)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={30.5894}\n              y={189.574}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 30.59 189.574)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={42.7358}\n              y={259.846}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 42.736 259.846)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={7.23071}\n              y={54.4346}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 7.23 54.435)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={19.3772}\n              y={124.707}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 19.377 124.707)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={31.5237}\n              y={194.979}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 31.524 194.979)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={43.6702}\n              y={265.251}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 43.67 265.251)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={8.1651}\n              y={59.8402}\n              width={60.3429}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 8.165 59.84)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={20.3116}\n              y={130.112}\n              width={60.3429}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 20.312 130.112)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={32.458}\n              y={200.385}\n              width={60.3429}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 32.458 200.385)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={44.6045}\n              y={270.657}\n              width={60.3429}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 44.605 270.657)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={10.5009}\n              y={73.3541}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 10.5 73.354)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={22.6474}\n              y={143.626}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 22.647 143.626)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={34.7939}\n              y={213.899}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 34.794 213.899)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={46.9404}\n              y={284.171}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 46.94 284.171)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={11.4353}\n              y={78.7596}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 11.435 78.76)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={23.5818}\n              y={149.032}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 23.582 149.032)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={35.7283}\n              y={219.304}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 35.728 219.304)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={47.8748}\n              y={289.576}\n              width={83.6571}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 47.875 289.576)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={12.3696}\n              y={84.1652}\n              width={75.4286}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 12.37 84.165)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={24.5161}\n              y={154.438}\n              width={75.4286}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 24.516 154.438)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={36.6626}\n              y={224.71}\n              width={75.4286}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 36.663 224.71)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={48.8091}\n              y={294.982}\n              width={75.4286}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 48.81 294.982)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={13.304}\n              y={89.5708}\n              width={67.2}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 13.304 89.57)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={25.4505}\n              y={159.843}\n              width={67.2}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 25.45 159.843)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={37.597}\n              y={230.115}\n              width={67.2}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 37.597 230.115)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={49.7434}\n              y={300.388}\n              width={67.2}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 49.743 300.388)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={14.2383}\n              y={94.9763}\n              width={39.7714}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 14.238 94.976)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={26.3848}\n              y={165.249}\n              width={39.7714}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 26.385 165.249)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={38.5313}\n              y={235.521}\n              width={39.7714}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 38.531 235.521)\"\n              fill=\"#E1E1E1\"\n            />\n            <rect\n              x={50.6778}\n              y={305.793}\n              width={39.7714}\n              height={1.37143}\n              rx={0.685714}\n              transform=\"rotate(-9.807 50.678 305.793)\"\n              fill=\"#E1E1E1\"\n            />\n          </g>\n        </g>\n        <g\n          style={{\n            mixBlendMode: \"color-burn\",\n          }}\n          filter=\"url(#filter0_f_136_130388)\"\n        >\n          <path\n            transform=\"rotate(-9.807 141.637 171.771)\"\n            fill=\"#3F3C3C\"\n            d=\"M141.637 171.771H223.92270000000002V199.19959999999998H141.637z\"\n          />\n        </g>\n        <g filter=\"url(#filter1_f_136_130388)\">\n          <path\n            transform=\"rotate(-9.807 129.641 126.524)\"\n            fill=\"#B7B7B7\"\n            d=\"M129.641 126.524H216.041V219.78109999999998H129.641z\"\n          />\n        </g>\n        <g\n          style={{\n            mixBlendMode: \"color-burn\",\n          }}\n          opacity={0.4}\n          filter=\"url(#filter2_f_136_130388)\"\n        >\n          <path\n            transform=\"rotate(-9.807 145.841 196.096)\"\n            fill=\"#3F3C3C\"\n            fillOpacity={0.36}\n            d=\"M145.841 196.096H228.12670000000003V223.5246H145.841z\"\n          />\n        </g>\n        <path\n          transform=\"rotate(-9.807 130.575 131.93)\"\n          fill=\"url(#pattern0_136_130388)\"\n          d=\"M130.575 131.93H212.8607V214.21570000000003H130.575z\"\n        />\n      </g>\n      <defs>\n        <filter\n          id=\"filter0_f_136_130388\"\n          x={129.637}\n          y={145.756}\n          width={109.755}\n          height={65.043}\n          filterUnits=\"userSpaceOnUse\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feFlood floodOpacity={0} result=\"BackgroundImageFix\" />\n          <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n          <feGaussianBlur\n            stdDeviation={6}\n            result=\"effect1_foregroundBlur_136_130388\"\n          />\n        </filter>\n        <filter\n          id=\"filter1_f_136_130388\"\n          x={81.6407}\n          y={63.8085}\n          width={197.021}\n          height={202.61}\n          filterUnits=\"userSpaceOnUse\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feFlood floodOpacity={0} result=\"BackgroundImageFix\" />\n          <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n          <feGaussianBlur\n            stdDeviation={24}\n            result=\"effect1_foregroundBlur_136_130388\"\n          />\n        </filter>\n        <filter\n          id=\"filter2_f_136_130388\"\n          x={117.841}\n          y={154.081}\n          width={141.755}\n          height={97.043}\n          filterUnits=\"userSpaceOnUse\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feFlood floodOpacity={0} result=\"BackgroundImageFix\" />\n          <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n          <feGaussianBlur\n            stdDeviation={14}\n            result=\"effect1_foregroundBlur_136_130388\"\n          />\n        </filter>\n        <pattern\n          id=\"pattern0_136_130388\"\n          patternContentUnits=\"objectBoundingBox\"\n          width={1}\n          height={1}\n        >\n          <use xlinkHref=\"#image0_136_130388\" transform=\"scale(.00195)\" />\n        </pattern>\n        <linearGradient\n          id=\"paint0_linear_136_130388\"\n          x1={173.288}\n          y1={66.9091}\n          x2={173.288}\n          y2={311.709}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#fff\" stopOpacity={0} />\n          <stop offset={0.44} stopColor=\"#F6F6F6\" stopOpacity={0.935} />\n          <stop offset={1} stopColor=\"#737373\" stopOpacity={0} />\n        </linearGradient>\n        <clipPath id=\"clip0_136_130388\">\n          <path\n            fill=\"#fff\"\n            transform=\"rotate(-9.807 331.558 28.444)\"\n            d=\"M0 0H334V288H0z\"\n          />\n        </clipPath>\n        <image\n          id=\"image0_136_130388\"\n          width={512}\n          height={512}\n          xlinkHref=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAAAXNSR0IArs4c6QAAIABJREFUeAHtnQuUHNV95id2Hk7YPbvrTQ67RPPoma4edbVQcIQTcBzA2LGxY/zGD0xMHDs2uziAF8cmwcYGJ46xHT8SPxNDdHDixI4TDrZh9EYCPZAQbwQIEHpMV0sIJB56S6O5e+6Yxk2rZrqq61b1/d/7m3Ok7q65XX3v/373+35V3VPd18cPFSi4Ajvmzj1uvBL+TqMcvrceVC+PyrV/bAS1n0ZBuCYKwkeiSrh76l8QHomCUPGPGkjTwOrBkSUFLytejgpQASpgVwXUGWf84vZK7eWNcvWSqBL+IArCh6MgPCrN0OkvEJJGA2P9JbVmcGSxXauR3lABKkAFcq5Ao1QdrAfhBVEQ3hAF4Z40xklbgtYFDWgAAAJyNhp2TwWogB0VaAyHA/VKeGk9CNe5YOCMARDJooEmAAABdvgTvaACVMBwBVRf34ujoPqaRiX8YRTUJrIYJs8lcF3SQCsA6PurB8tLDS8/dkcFqAAVKL4C47XaS6c+vFcJt7tk2owFCDGlgXYA4ExA8T7FK1IBKmCwAttGR0+IgvBrURDuNWWU7IfQdVEDcQAABBg0I3ZFBahAMRXYXi7/RqMcfikKavtdNGvGBISY1sB0AAAEFONZvAoVoAIZK7B+3rxfagTVi6MgfMq0QbI/QtdlDcwEAPp3fCYgoznxdCpABfKrQL0SvjoqhxtdNmnGBoTkpYFOAMCZgPy8iz1TASrQZQU2DQ//t3oQficKwsm8zJH9EryuayAJAHAmoEuT4mlUgAqYr0AUVP8gCsLIdXNmfABI3hpICgCcCTDvY+yRClCBFBV4pFz+lUal+mWO+gnGvIPRl/2nAQAgIIVZ0ZQKUAFzFaiX586KgvA2X4yZcQI5RWggLQDo9nww0JyvsScqQAU6VKA+UntVFIQ7izBEXoPg9UkD3QAAZwI6GBa/pgJUwEwFGkHt3EYQHvbJlBkrEFKUBroFAM4EmPE39kIFqMA0FYgq4Uf4Sl7CsKgw9PF1sgAAEDCNcbGZClCB7iug+vp+IaqEn/HRkBkzwFOkBrICABDQvc/xTCpABdoqoL+577m/71dFGiGvRfD6qAETAAAEtJkYD6kAFUhfAX3kX6/UrvPRiBkzANILDZgCAL2fNYMji9Ovep5BBagAFejr6/vZF/kQBL0IAl7TT92ZBADOBGDjVIAKdFWBqFz7BCHkZwgx772bd9MAAAR0ZX88iQr4W4FGOTyPq/v1LgQIYH9rnwcAAAH+ejkjpwKpKlAPqn8YBeERQsjfEGLuezf3eQGA3i+fCUhlhTSmAn5VoDEcDkRBuIsA6F0AUHu/a58nAHAmwC8/Z7RUIHEF1s+b90tREK4mgPwOIOa/t/OfNwAAAYktkYZUwJ8K1IPaVzH/3po/9af+RQAAEOCPrzNSKtCxAvVgzhv50B/hA4D0XgNFAQAQ0NEWaUAF3K9Ao1QdjCrhbsy/9+bPHDAHRQKAfi0+GOi+xzNCKjBtBaIgXEDwEDxowA4NFA0AnAmY1hr5BRVwuwL1Su18jN8O42cemAetgV4AABDgts8zOipwTAXGa7WXRkH4JMFD8KABezTQKwDQr8vbAcfYJBuogJsViMrVr2P89hg/c8FcaA30EgB+diZgZImbjseoqAAVmKpAI5hTbQThYUKH0EEDdmmg1wAABBASVMDxCkRB+GOM3y7jZz6YD60BGwBA92HNUHmR4zbI8KiAfxVojM45mb/5J2wADjs1YAsAcCbAv2xgxB5UgD/7s9P4CWTmxaYzAE0Q4UyAB6HAEP2oQGNk9jyChqBBA/ZqoBm8Nt2uHuSDgX4kBKN0ugJRUP0+5m+v+TM3zI1Nwd/aFyDA6WhgcK5XIBqZ0x8F4RFChpBBA/ZqoDV0bbvP2wGupwTjc7YCjaB6FcZvr/EzN8yN1oBtod/eH84EOBsRDMzVCqgzzvjFKAjrhAwhgwbs1kB74Nr4GAhwNSkYl5MViMq1szF+u42f+WF+tAZsDPy4PvF2gJNRwaBcrEBUCX9AwBAwaMB+DcSFra3bOBPgYlowJqcq0Dhh3q9FQbgX87ff/Jkj5sjWsJ+uX0CAU3HBYFyrQL0cnkOwECxoQIYGpgtam7ev4rLBrsUG43GlAvVK7TrMX4b5M0/Mk81BP1PfOBPgSmIwDmcqoPr6XhQF4Q6ChWBBAzI0MFPI2v47IMCZ6GAgLlSAS//KMH3CmXlqasD2kO/UP94OcCE5GIMTFahXwkubxsItIYMG7NdAp4CV8HvOBDgRHwxCegWioPafmL79ps8cMUdNDUgI+CR9BAKkpwf9F1+BqBJubxoLt4QMGrBfA0nCVUob3g4QHyEMQGoF6uW5szB8+w2fOWKOWjUgJdyT9pMzAVIThH6LrkA9qP5hq7Fwn6BBA/ZrIGmwSmoHBIiOEjovsQKNSvgXGL79hs8cMUetGpAU7Gn6CgRITBH6LLYCjaA6v9VYuE/QoAH7NZAmVKW15TMBYuOEjkurQBSEKzB8+w2fOWKOWjUgLdTT9pczAdKShP6KrEAUhFtbjYX7BA0asF8DaQNVYnsgQGSk0GkpFfjZJYBrExi+/YbPHDFHrRqQGOjd9Jm3A6SkCf0UV4FGpfLrrabCfUIGDcjQQDdhKvU5nAkQFy10WEIFotHRUQxfhuEzT8xTqwakhnm3/QYCJCQKfRRVgXp59qmtpsJ9QgYNyNBAt0Eq+Xm8HSAqXuis7RWoj9bOxPBlGD7zxDy1akBykGfpO2cCbE8V+iemAo2R2lmtpsJ9QgYNyNBAlhCV/lwgQEzE0FGbKxCVa2/C8GUYPvPEPLVqQHqIZ+0/bwfYnCz0TUQFGpXqW1tNhfuEDBqQoYGsAerC8zkTICJm6KStFQAAZJg9ocw8tWvAhQA3MQYgwNZ0oV/WVwAAIFjag4XHMjRhIjxd2QcQYH3U0EEbKwAAyDB7Qpl5ateAK+FtahxAgI0JQ5+srgAAQLC0BwuPZWjCVHC6tB8gwOq4oXO2VQAAkGH2hDLz1K4Bl4Lb5FiAANtShv5YWwEAgGBpDxYey9CEydB0bV9AgLWRQ8dsqgAAIMPsCWXmqV0DroW26fEAATYlDX2xsgIAAMHSHiw8lqEJ04Hp4v6AACtjh07ZUgEAQIbZE8rMU7sGXAzsPMYEBNiSNvTDugoAAARLe7DwWIYm8ghLV/cJBFgXPXTIhgoAADLMnlBmnto14GpY5zWu1YMji23wXPpABaypAABAsLQHC49laCKvoHR5v0CANdFDR2yoAAAgw+wJZeapXQMuB3WeYwMCbEge+mBFBQAAgqU9WHgsQxN5hqTr+wYCrIgfOtHrCgAAMsyeUGae2jXgekjnPT4goNfpw+v3vAIAAMHSHiw8lqGJvAPSh/0DAT2PIDrQywoAADLMnlBmnto14ENAFzFGIKCXCcRr97QCAADB0h4sPJahiSLC0ZfXAAJ6GkO8eK8qAADIMHtCmXlq14Av4VzUOIGAXqUQr9uzCgAABEt7sPBYhiaKCkafXgcI6FkU8cK9qAAAIMPsCWXmqV0DPgVzkWMFAnqRRLxmTyoAABAs7cHCYxmaKDIUfXstIKAnccSLFl0BAECG2RPKzFO7BnwL5aLHCwQUnUa8XuEVAAAIlvZg4bEMTRQdiD6+HhBQeCTxgkVWAACQYfaEMvPUrgEfA7kXYwYCikwkXqvQCgAABEt7sPBYhiZ6EYa+viYQUGgs8WJFVQAAkGH2hDLz1K4BX8O4V+MGAopKJV6nsAoAAARLe7DwWIYmehWEPr8uEFBYNPFCRVQAAJBh9oQy89SuAZ+DuJdjBwKKSCZeo5AKAAAES3uw8FiGJnoZgr6/NhBQSDzxInlXAACQYfaEMvPUrgHfQ7jX4wcC8k4n9p97BQAAgqU9WHgsQxO9DkBev6SAgNwjihfIswIAgAyzJ5SZp3YNEMAlZUMNgIA8E4p951oBAIBgaQ8WHsvQhA3hRx9+BiFAQK4xxc7zqgAAIMPsCWXmqV0DhK8dZwCa8wAE5JVS7De3CgAABEt7sPBYhiaawcOtPSAABOQWVew4jwoAADLMnlBmnto1QPDbE/ytcwEE5JFU7DOXCgAABEt7sPBYhiZaQ4f7dsEAEJBLXLFT0xUAAGSYPaHMPLVrgNC3K/Tb5wMIMJ1W7M94BQAAgqU9WHgsQxPtgcNj+4AACDAeWezQZAUAABlmTygzT+0aIPDtC/y4OQECTCYW+zJaAQCAYGkPFh7L0ERc2LDNTigAAozGFjszVQEAQIbZE8rMU7sGCHs7w366eQECTKUW+zFWAQCAYGkPFh7L0MR0QcN2e8EACDAWXezIRAUAABlmTygzT+0aIOjtDfqZ5gYIMJFc7MNIBQAAgqU9WHgsQxMzhQy/sxsOgAAj8cVOslYAAJBh9oQy89SuAULe7pDvND9AQNb04vmZKwAAECztwcJjGZroFDD83n5AAAIyRxg7yFIBAECG2RPKzFO7Bgh4+wM+yRwBAVkSjOdmqgAAQLC0BwuPZWgiSbjQRgYkAAGZYownd1sBAECG2RPKzFO7Bgh3GeGedJ6AgG5TjOd1XQEAgGBpDxYey9BE0mChnRxQAAK6jjKe2E0FAAAZZk8oM0/tGiDY5QR7mrkCArpJMp7TVQUAAIKlPVh4LEMTaUKFtrJgAQjoKs54UtoKAAAyzJ5QZp7aNUCoywr1tPO1Zqi8KK2f054KpKoAAECwtAcLj2VoIm2g0F4eMAABqeKMxmkrAADIMHtCmXlq1wCBLi/Qu5kzICBtqtE+cQUAAIKlPVh4LEMT3YQJz5EJDUBA4kijYZoKAAAyzJ5QZp7aNUCYywzzbucNCEiTbLRNVAEAgGBpDxYey9BEt0HC8+SCAxCQKNZolLQCAIAMsyeUmad2DRDkcoM8y9wBAUnTjXYdKwAAECztwcJjGZrIEiI8VzY8AAEdo40GSSoAAMgwe0KZeWrXACEuO8Szzh8QkCThaDNjBQAAgqU9WHgsQxNZA4TnywcIIGDGeOOXnSoAAMgwe0KZeWrXAAEuP8BNzCEQ0Cnl+P20FQAACJb2YOGxDE2YCA/24QZEAAHTRhy/mKkCAIAMsyeUmad2DRDeboS3qXkEAmZKOn4XWwEAgGBpDxYey9CEqeBgP+6ABBAQG3NsnK4CAIAMsyeUmad2DRDc7gS3ybkEAqZLO7YfUwEAgGBpDxYey9CEydBgX27BBBBwTNSxIa4CAIAMsyeUmadWDdTLoSK03Qpt0/O5dqg8Fuf5bKMCz1cAACBYWoOF+3L0sKCfADQdmq7tjzMBz0cdd+IqAADIMXzCmblq1cCSgWHOAgBBHTVw21D5pjjvZxsV6AMACJXWUOG+HD3cMljuaP6uHdEynu7O+gABhH1sBQAAOYZPODNXrRq4YygAADgDkFgDvB0QG4F+bwQACJXWUOG+HD08PDKa2Pw5cu7uyNm1unEmwO+8P2b0AIAcwyecmatWDdSDUPE5AII9LaRwJuCYGPR3AwBAqLSGCvdl6eGuUoWzALwNkFoDQIC/mf+CkQMAsgyfgGa+WjWwLQjV4n7+GiDtUTDtS4q3A14QhX4+AAAIlNZA4b48Pdw/zGcBCPTu3goBAvzM/edHDQDIM3xCmjlr18CaIf4kEAjoDgJ4O+D5OPTvDgBAmLSHCY/laWJbOVQrBkdSvxdMaHYXmq7VjTMB/mX/1IgBAHlmT0AzZ3Ea2FoO1XKuDggEdfmhSCDAQwgAAAiTuDBhm0xd6DMBq3k7AAgAAjxM8y6GDADINHoCmnmbSQP3lUbVIs4GAAJdgABnAroIUqlPAQAIkpmChN/J1ce2clXdUaqoxQO8z+3ae/Z5jwcIkJroKfsNAMg1eMKZuUuiAX3FwIdGRtW6UqCWD4yohQABZwYSnBkAAlKGqcTmAAAhkiREaOOWTsaDqtrGP2rQQQONE+b9msRco88JKwAAuGXsBDXziQbQgCkN7Jg797iEUUIziRUAADALU2bBftASGnBLAwCAxFRP0WcAwK0FiwEzn2gADZjSAACQIkwlNgUAMAtTZsF+0BIacEsDAIDEVE/RZwDArQWLATOfaAANmNIAAJAiTCU2BQAwC1NmwX7QEhpwSwMAgMRUT9FnAMCtBYsBM59oAA2Y0gAAkCJMJTYFADALU2bBftASGnBLAwCAxFRP0WcAwK0FiwEzn2gADZjSAACQIkwlNgUAMAtTZsF+0BIacEsDAIDEVE/RZwDArQWLATOfaAANmNIAAJAiTCU2BQAwC1NmwX7QEhpwSwMAgMRUT9FnAMCtBYsBM59oAA2Y0gAAkCJMJTYFADALU2bBftASGnBLAwCAxFRP0WcAwK0FiwEzn2gADZjSAACQIkwlNgUAMAtTZsF+0BIacEsDAIDEVE/RZwDArQWLATOfaAANmNIAAJAiTCU2BQAwC1NmwX7QEhpwSwMAgMRUT9FnAMCtBYsBM59oAA2Y0gAAkCJMJTYFADALU2bBftASGnBLAwCAxFRP0WcAwK0FiwEzn2gADZjSAACQIkwlNgUAMAtTZsF+0BIacEsDAIDEVE/RZwDArQWLATOfaAANmNIAAJAiTCU2BQAwC1NmwX7QEhpwSwMAgMRUT9FnAMCtBYsBM59oAA2Y0gAAkCJMJTYFADALU2bBftASGnBLAwCAxFRP0WcAwK0FiwEzn2gADZjSAACQIkwlNgUAMAtTZsF+0BIacEsDAIDEVE/RZwDArQWLATOfaAANmNIAAJAiTCU2BQAwC1NmwX7QEhpwSwMAgMRUT9FnAMCtBYsBM59oAA2Y0gAAkCJMJTYFADALU2bBftASGnBLAwCAxFRP0WcAwK0FiwEzn2gADZjSAACQIkwlNgUAMAtTZsF+0BIacEsDAIDEVE/RZwDArQWLATOfaAANmNIAAJAiTCU2BQAwC1NmwX7QEhpwSwMAgMRUT9FnAMCtBYsBM59oAA2Y0gAAkCJMJTYFADALU2bBftASGnBLAwCAxFRP0WcAwK0FiwEzn2gADZjSAACQIkwlNgUAMAtTZsF+0BIacEsDAIDEVE/RZwDArQWLATOfaAANmNIAAJAiTCU2BQAwC1NmwX7QEhpwSwMAgMRUT9FnAMCtBYsBM59oAA2Y0gAAkCJMJTYFADALU2bBftASGnBLAwCAxFRP0WcAwK0FiwEzn2gADZjSAACQIkwlNgUAMAtTZsF+0BIacEsDAIDEVE/RZwDArQWLATOfaAANmNIAAJAiTCU2BQAwC1NmwX7QEhpwSwMAgMRUT9FnAMCtBYsBM59oAA2Y0gAAkCJMJTYFADALU2bBftASGnBLAwCAxFRP0WcAwK0FiwEzn2gADZjSAACQIkwlNgUAMAtTZsF+0BIacEsDAIDEVE/RZwDArQWLATOfaAANmNIAAJAiTCU2BQAwC1NmwX7QEhpwSwMAgMRUT9FnAMCtBYsBM59oAA2Y0gAAkCJMJTYFADALU2bBftASGnBLAwCAxFRP0WcAwK0FiwEzn2gADZjSAACQIkwlNgUAMAtTZsF+0BIacEsDAIDEVE/RZwDArQWLATOfaAANmNIAAJAiTCU2BQAwC1NmwX7QEhpwSwMAgMRUT9FnAMCtBYsBM59oAA2Y0gAAkCJMJTYFADALU2bBftASGnBLAwCAxFRP0WcAwK0FiwEzn2gADZjSAACQIkwlNgUAMAtTZsF+0BIacEsDogDgxlJpcGxg6KKx/tKPx/pLd4/1l7aP9Zcmx/pLin/UAA2gATRQvAYW9w+rmwdH1MrBsrp7uKI2l6sKUJABCiIAYOHgyCsW9JdWsLiLX9zUnJqjATSQVgO3DI6oh0dmAwKB3SBgNQAsmDXrpTcNlH6UVny0x7DQABpAA73XwOqhstpatjsEfT5bYS0ALJo1HIzNKj3IIu79ImYOmAM0gAa61cCygRG1ibcFrDwbYiUA3DQwEI71l3Z3Kzieh1mhATSABuzRwKL+ktrEWwLWQYB1AKBP+4/1lx5h8dqzeJkL5gINoIGsGljaP6y2cibAKgiwDgCe+4Q/n+rnLxvQABpAA45pQP+lgM/vuds2dqsA4KZZQ6dnpUyez5EKGkADaMBeDTw0MgoEWPLXAVYBwFh/aS0L196Fy9wwN2gADWTVwPLBEQAAAHjhdfUWDJRrWYXF8zEnNIAG0ID9GniUDwRaAUHWnAG4qb90OQvX/oXLHDFHaAANZNXAnaWKFQFo23vyRffHGgAY6y/dnFVUPB9jQgNoAA3Yr4EVA7wNUHTYx72eTQDwGAvX/oXLHDFHaAANZNXAkoFhzgBY8DkAmwBgf1ZR8XyMCQ2gATRgvwYW9JdU3YIAjDsq9mmbFQDwkxNO+DUWrf2LljlijtAAGjClgW1cFKjnZ0GsAICFxx9/nClRsR8MCg2gATRgvwYAgN5/SRIA4NiVtjA++42POWKO0EBJAQAAwNTFADgDgCFiiGgADfilAQAAAAAAOAPB9d7RABrwUAMAAAAAAHi48DnS8+tIj/lmvuM0AAAAAAAAAMDRHxpAAx5qAAAAAAAADxd+3NEA2zhKRAN+aQAAAAAAAACAoz80gAY81AAAAAAAAB4ufI70/DrSY76Z7zgNAAAAAAAAAHD0hwbQgIcaAAAAAADAw4UfdzTANo4S0YBfGgAAAAAAIAEALH/FaWrDX35SPfbNb6tt//L9wv5tueZatenvv6E2fu5qdd/HL1Nrz3m3WnrSyU4era34/TPUhk99Wj327X8orL56Ljd/9xr16N99/Wc1/tjH1W1vO0ctPWmekzXWAb9wuKJuP+989fCXvqy2zr+u0FoXtXYe+9Z31IbLP6VW/N7pzs6jCVgDAAAAAGAGALj1Na9TO5fdrGz7OfzMM2rn0mXqwav+Sq06641qweCIWKPT/X9y1WrbSqwO796tHl+0WD3w6avUyj84S40NDIutsQ6LBaWyevAzn1WHdu22rtZ5duiJFbeola99vei5MxH2cfsAAAAAAGAaALjrw/9XTezfn6c3Gdv3gXo0dabgljNeI8ro7r3kUnX00CFjdchzR/u3bVOPfOVrSp+piDNTm7ctrp6odBD6+nP04EF190cuEjdveWsKAAAAAIAYAFj3nvPU5JEJkX65e93tav373m+92d3xJ3+qJo8elVfjycmpMxbr3v1e62usA0Qf+fsc/k2BTU5MiFgXeYd+6/4BAAAAAGgDgEWjNXXw8cebviH29pn77lPr//gDVobUktpvqcNPPSW2ts2OP3XHnWrduX9kZY2bRq/fwuDnZxU49OQupc+GNGvj+y0AAAAAAG0A8OBn/9opv3x88RKlP8Rok9k98uWvOlXj7T+9Ud38O6daVWM93/oDfzr0+Pl5BTZe/UXr5qlXaxMAAAAAgDYAePquu3/uFo7c059lePDKz1rzQbY9Dz/sSGV/PoyJvfvU/ZddblW43P7e9/28g9ybqsAz92+wao56Ff76dQEAAAAAaAEA/Wl6qe/9J/F3fTZgyYkv66kBLqqESboqts2OsQVKv8XRS2NvvvbDX/iS2Drm1vHJyakzI80a+XwLAAAAAEALAOi//3b9Z3+9rvSfN/bK+PTbEa7/7Htss1px2qt6VuPm3G65dr7rpe5qfDa+XdOcsyJvAQAAAABoAYCbX35qV4Yi7Un6OgK3vf2dPQmoW854tbRyddVffR2BNW9+W09q3AyRbd/756767vqTFs2u9XRemvPT61sAAAAAADwEAG3wEwcOqPXnF//ngr4AgK7xkT171dp3vqdnYQMAHIsyB3fs6Nl89Drw218fAAAAAABPAaAJAbe99R2FGqJPANCEgFWvP7vQGjeNHgA4FgD05Yib9fH9FgAAAAAAjwFgKqCefVatfN0bCjNF3wBA11hfflePu+jAAQBeCAD6YkC3nvnawueh6HlP+noAAAAAAHgOANoi9QcDi/rrAB8BQNd476Ob1OLqnELDBwB4IQBs+sa3Cq1/0iDuVTsAAAAAAACAKZfUX3xTxBfe+AoAusiN628oNIAAgJ8DQOPHP1ELhsqF1r9XwZ70dQEAAAAAAACed8mpiwW11COpkaRp5zMA6ELrr3VOU68sbQEApfQFmvTXaRcBt1nmqhfPBQAAAACgJfBM/Bmgvure4aefNvJPf1K/yB/9enl/h7oJAJjYt89IffU86W+KK/LnyJ49atnJpxQCAZkBYHLSWJ1NrYkk+9m3Zat6cuUq9dBf/41a9tu/U0itexHgWV8TAAAAAADDAPDAFZ8xajgLSoG65fQz1Z0fukBtufaf1L7NW3LNq51Llhrtf7tJmQCAey/9c6N91NfM11+lfNcFF6qt869T+8fHc61x44YfG+1/e42bj7MCwJFnny2kn83+clsqtN4AAAAAAFgOAHGmuOYtb1fbf/LT3L5OV39Vb9zrmthmIwAcM66BYbX2He9SOxYsVGpyMhcYWPuuc3OrcXM8AECxgdqsu5RbAAAAAAAEAkDTYPQlfXfdttZ4QE19YcrAcC4BJQIAWjSx6qw3Kv21v6Z/dq+7PZf6NrWhbwEAAKBVD+33AQAAAABoMXsTnwEw/RZA+6I95vHAsHrwM59VRw8fNppR6//4A7kElDQA0PXWXxK18fNfMP5FUWvPeXcuNW5qBAAAAJpaiLsFAAAAAEA6ADzXf31tf/0BKVM/T62/I5dwkggATfNcd+4fTV3e11SNn1i+IpcaN/sLAAAATS3E3QIAAAAA4AgA6AWur+hnEgJufbX5q6ZJBgBd49Vnv8UcBExOquWnvDI3CAAAAIC44G9uAwAAAADAIQDQC/u2t51j7O2ATd80f+U06QCga6zPBEwemTByIuDhL3wJAGhZg81w4jZ/eAEAAAAAoMV8RH4GoKX/TdN84NNXGQmnA43tU+9/N/dr4tYFANB10MFt4kdfIthEXeP2wRmA/EM0ru5StgEAAAAA0BKgrgCANqBdq1abyCdl+ptK+5zOAAAfxUlEQVTsXAEA/cHAp+68y0iN9XUe8ggNAAAAmElXAAAAAAA4CgD6TwT1t59l/dFXU5vJRNL+zhUA0OPWnwcwcZ2ADX/5SaM1bs4JAAAANLUQdwsAAAAAgKMAoBe8/gKUrD87l91sNJxcAgBd451Ll2Utsdr+0xuN1rhp9gAAANDUQtwtAAAAAAAOA8CaN78tcziZvhysawCw7j3nZa7xwR07AICWdRgXVmwzDzMAAAAAALQYj0ufAWga5r7HNmcOKJNfXuMaAOjPAhzYvj1zjRdXTzQOAZwBMB+azXXlwi0AAAAAAI4DwJZrrs0cTmvf+R5j4eQaAOggGP/XH2Su8eo/fJOxGjfDCQAAAJpaiLsFAAAAAMBxALjzgx/OHE73X3a5sXByEQDuufijmWt8z0WXGKtx0+wBAACgqYW4WwAAAAAAHAeAFae9KnM4bbz6i8bCyUUA0F8YlPXngSuuNFbjptkDAABAUwtxtwAAAAAAOA4AC0rlzH+qtukb5q4I6CIA6Pfvs/7kcUVAAAAAiAv+5jYAAAAAABwHAL3YJ/buy5RPW+dfZ+zo1EUAGBsYVpNHj2aqcR6XXQYAAIBm2MfdAgAAAADgAQAceuKJTOFU/8G/AwAtOokz04l92SBry7XzjdW42T8AAABoaiHuFgAAAACAFmN38c8A9cI/9OSuTACgP+UeZyDdbHPyDIA+ywIAGNNIN7riOelhBwAAAAAADwDg6KFDmQBg83evMWbuAED8VHAGIH2AEfrZagYAAAAAgOMAsGh2LT5xUmx99Gt/DwC06CQueDgDkC2M4mrKtnxrCgAAAABAi7G7+BaA/ja/rD8Pfe7zAECLTuKCyUUA0B8eXfWGs638d+uZr1VLar9lTJdxc+r6NgAAAAAAWozdRQC47+OXZc1/dfefXWzMaHkLIH46bHwLIL6ndm3d++ij6pEvf1UtDuca06jrwd8cHwAAAAAAjgNA44YfZ3ZsfRTYNI2stwBA/HQAAPF1Sbr10K7d6vbzzjem06w6l/B8AAAAAAAcBoBFQVUd2bMnqYfGt5ucVIurc4wZKwAQX2YAIL4uabZOTkyoOz90gTGtSgjxLH0EAAAAAMBhADBxjfr94+NGDRUAiI80ACC+Lmm36s9i6MtfZwlGX54LAAAAAICrADAwrJ598KG0/nlM+/oPzV0ESBsrAHBMiac2AADxdelm644bxwCAFl+bDmgAAAAAAGhZKC59CNDE0b8233su/n9GzRQAiI80ACC+Lt1s1W8FLD1pnlHdTheikrcDAAAAAOAgACw58WXq4M6d3XjnC58zOak0FJk0OQDghSVuPgIAmpUwc3v3hRcZ1a3JNWDLvgAAAAAAcA0ABobVjgULjbjo7tvXGzdRACB+agCA+Lp0u3Xj5642rl1bgttUPwAAAAAAcAwAHv27r3frmcc87/7LLjduogDAMWWe2gAAxNel260br/6ice2aCl5b9gMAAAAAgEMAoK/YZ+pHf3/AkjknGTdRACB+hgCA+Lp0u/XeSy41rl1bgttUPwAAAAAAcAAAFpTKass113brlbHPG//+v+VioABAbLkVABBfl6626s+unPJ7uejXVPjasB8AAAAAAIQDwIpXnq70e/UmfyaPTCi93zxMCgCInykAIL4u3WzdtXpNLtrNYz30cp8AAAAAAAgFAH16Xn9L39GDB7vxyBmfE/3H9bkZKAAQX3oAIL4uabfqPwFcffZbctNvLwPb9GsDAAAAACAJAAaGp8xNh0XmS/xO46wTBw6o5a84LTcDBQDiCw8AxNcl7dYHr/xsbto1HcC93h8AAAAAAIYBYOv869S695xn5N8df/Kn6p6LLlGP/O1X1Paf3qgOPfFkWj9M3f7hL305VwMFAOKnBACIr0vSrZNHjqgNl38qV+32OrBNvz4AAAAAAIYBIKlh2dhu76bH1MKR0VxNFACIn3kAIL4unbbqa/83rr9B3XL6mbnq1nT42rA/AAAAAAAAgCmPPXr4cCHvnQIA8ZFmIwBM7N+v7rrgQiv/3fnBD6s1b3qr0t94aUOYSuwDAAAAAAAAwFQiPfDpqwoxUgBADgAcefbZQjQhMTxd6DMAAAAAAACA2n7jTWpsYLgQswcAAAAXwtOFMQAAAAAA4DkAPHXHnWpRJSwk/LVpAgAAgAvh6cIYAAAAAADwGAD2PLQxl8v9zmSOAAAAMJM++F2pMBgHAAAAAMBTAHjm3vvU0pNOLsxsmsYOAAAATS1wW1zYx9UaAAAAAAAPAWDXqtVqcfXEwsNfmxAAAADEhRHbiocBAAAAAAA8A4Bt//J9tXC40pPwBwDiw19vtfHPAPkrgOJDuUgQAgAAAADAEwA4smevuvvPLu5Z8DeNjTMA8RAAALgdtk3923QLAAAAAIAHAPDkqtVqxWmv6nn4a/MDAAAAm0LQ574AAAAAAOAwABzcuVPde8mlhf2NfxIzBQAAgCQ6oU3+Z0QAAAAAAHAQAA498YR66K//Ri2aXbPiqL/VzAEAAKBVD9zPP+inqzEAAAAAAA4BwLMbHlAbPnmF1ddHBwAAgOkCie3FwgAAAAAAAMIBYO+jj6rHvv0PauUfnGXd0X6coQMAAECcLthWbPjregMAAAAAIAgADu7YofTf8G/73j+rey7+qFp28ikiQr/V3J0FgP3745M94dYt1/6T8bnUOsnyw58BFh/KrWsl7/sAAAAAABgGgK3zr1Pr3nOekX9r3vL2qSP75a84TS0ate/9/G4MykUAWDA4otTkZJasVZu+8S0AoGUtdqMtnpMOWAAAAAAAaDGdm19+aiYT109+4IrPGDdyl4zNRQBYcuLLMutm49VfNK4bzgCkC0SX1lmSsQAAAAAAAAAYD56ZzMdFAFh99lsyA8CGT33a+DwAAADATGsRAAAAAAAAwHjwzGQ6LgLAfX/+icwAcNf/+YjxeQAAAICZ1iIAAAAAAACA8eCZyXRcBIDG9TdkBoCVr3uD8XkAAACAmdYiAAAAAAAAgPHgmcl0XAMA/cVKh596KhMATB49qhZVQuPzAAAAADOtRQAAAAAAAADjwTOT6bgGAHd+6IJM4a+fvH/btlzmAAAAAGZaiwAAAAAAAAC5hM90xuMaAOy+fX1mAKj/+49ymQMAAACYbh3q7QAAAAAAAAC5hM90xuMSAKw///2Zw1/v4N6PfiyXOQAAAIDp1iEA0Pvwj4JQ7Zg797ipEO7lfwuPP/64mYTiy++4DkD+hukKACwsz1b7Nm8xAgA3/+4rAIAWEPfFb3o9Ts4A9B4CAACLFj4AAAAkNeWsR9dNcnj6nntzCX89jqx95FLA+a+HpHrLox0AAADwFkALgAAA+RueC2cA7vvYx5v5nfn2gSuuBABa1mAeQcc+49c1AAAAAAAt5gMAxBuFSQOVDgB3fvDDavLIRObg1zuYPHJELT3pZACgZQ2a1Br7mnk9AwAAAADQYj4AwMyGYcJQJQPA/Z/4C2PhrwGg8eOf5Bb+eq54CyB/PZtYE73aBwAAAAAAAECuIdRubhIBQH8T4/i//dDIUf/zO5mcVCtf+/pcaw8AAADt66/1MQAAAAAAAECuIdRqOPq+KAAYGFZ3XXChOhA1ns9tU3ceX7go97oDAABA+/prfQwAAAAAAACQexC1mo4EAFhcPVHpD/o9++BDpvL+BfvRnyHI49r/rXXW9wEAAKBdE62PAQAAAAAAAMQBwIZPXqGWzDnJyL9l835X3XLGa9T68/9Ebfybq9UTy1eoiQMHXhDYph9suebaQmoOAAAArYHffh8AAAAAAACgkDBqmo+JMwCmA7nI/R3cuVMtqf1WITUHAACA5rqLuwUAAAAAAAAoJIyaBuQ1AExOqvV//IHC6g0AAADNdRd3CwAAAAAAAFBYIGkT8hkAHvvmtwutNQAAAMQFf3MbAAAAAAAAQKGh5CsA6G8NXFAKCq01AAAANMM+7hYAAAAAAACg0FDyEQD0lwYtfdnLC62zNnwAAACIC/7mNgAAAAAAAIBCg8k3ADi4Y4dafurvF1rj5w3+e/+c6fONfBmQ2wABAAAAAAAAUGg4+QQAB7ZvV7e++rWF1rcZ/vqWMwBuB3jrXHdzHwAAAAAAAKDQgPIFAPY++qi6+ZTfK7S27SEAAAAA7ZpofQwAAAAAQAsALJn725lOmeon3/fxy3pq+q0L3Mb7y095ZeYa276DXWtuU1pLva6/vuBQlp9DTzzR8zH0uoYuvz4AAAAAAC0AMDYwrI4eOpTFM9X689+PabbWtO3+wpFRpSYnM9XY1idPHj2qHv27r6sFQ2UrNPDQ5z6fqVTP3HefFeNwOYR7OTYAAAAAANoCateq1V2bpr7Guw1Hfr00lSSv/fTd93RdY1ufuL9eV+vO/SOrAvO2t74jU7m2XDvfqvEk0RZtkr/tAQAAAABAGwDo73zv9mfn0psxzLZ6xhnyg1d+ttsSW/e8o4cPq01f/6ZaVAmtm/sFgyNq//h41zVb85a3WzemOD2xLXnot9YKAAAAAIC2wNIXa9m76bHUpjk5MaFWnfVGDLOtnq2G07y/KKiqA/UodY1teoI+2xP9x/XqltPPtHrO77nokq7K9vjiJVaPq6klbrsLf103AAAAAABiAkt/VevE3n2pjPOhv/ochhlTy+kMes2b36aOHjyYqsY2NJ7Yt09t+5d/VSteebqY+a7/+49SlU7D2dKTThYzvuk0xvaZ4QAAAAAAgGlCS5/+1J+C7vSjj/z1h60wm5nNJq4+6951rjq8e3enEvf89/po/8lbV6p7L7lULZpdEzfXC4crU9CSpJB7Nj4sCm7idMW2ZGsRAAAAAIBpAECbiD4K2jr/OjWxf/8x3qk/8f3kylVq9RvfLC4QbDLIZSefMhVOEwcOHFPjXm04smePevquu9Xmf7xm6tv7FldPdGKO73j/B9Uz92+ILasGsYe/+LdWfpbBJr261BcAAAAAAGYAgOZi1+9Z337e+er+v/ikeuDTV6m7LrhQLZv3u06EQnOMvb5dNFpT69/3frXhLz+pNn7u6sL+PXDFleq+j318ak7XnvNuL+Z1xWmvUvqzAQ9e9VdTY1/7jndZ86eLvdahT68PAAAAAEACAPDJFBhrstOn1Ik6SdcAAAAAAAAAAGcy0AAa8FADAAAAAAB4uPClH7nQf46+0UB2DQAAAAAAAABw9IcG0ICHGgAAAAAAwMOFz9FT9qMnakgNpWsAAAAAAAAAgKM/NIAGPNQAAAAAAAAeLnzpRy70n6NvNJBdAwAAAAAAAAAc/aEBNOChBgAAAAAA8HDhc/SU/eiJGlJD6RoAAAAAAAAA4OgPDaABDzUAAAAAAICHC1/6kQv95+gbDWTXAAAAAEwBwA9nzfpVFlT2BUUNqSEaQANSNLAtqKoo6H0I+tyHHXPnHjcVwr3+b6y/tEeKcOknJosG0AAayKaBOuHfcwCyCQAeYUFlW1DUj/qhATQgQQNL+4d7Hn4+H/k3x24NANzUX1okQbj0EYNFA2gADWTTwK2DIwCABWdArAGAsf7hj7Kosi0q6kf90AAakKCBu0sVAAAA+PknD8aGhoYkCJc+YrBoAA2ggWwaeGyEDwA2T8P38taaMwAaBcZmlZawsLItLOpH/dAAGrBZA5z+t+cvH6wCgBt/c+iksf7SUZvFS98wVzSABtBA9xp4pDyb0/8WnP7XZx6sAoCpswD9pfksru4XF7WjdmgADdiqgTVDZcLfkvC3EgCeuyjQOlsFTL8wVzSABtBAeg3cPDCitlkUfr18792W17buDIA+C7DwhJH+sf7SOIss/SKjZtQMDaAB2zSweGBYbS7zwT9bgr/ZDysBQEPAgsHB/72gv3SbbUKmP5grGkADaCC5BpYPjhD+lp75sBYANATcPDT0kptmDX91rL90iAWXfMFRK2qFBtCADRpYVwrUuKXh1zwK9vnWagDQEKB/buovj4z1D31/rL90wAZR0wfMFQ2gATQQr4EF/SWlP+zH3/rb8+d+00GOCAB4jgP6Fh5//HELZg2//ab+4W/dNKv0k7FZpTvH+kub+Dd9DRYNDO9YNjCi+EcN0AAayEMD+hT/ysERtXYoUA+MjKrxsv3BN10g+rZdFAA0QYDb5BVoVKpv9U3UjBcDRgNoAA101gAAkDxLRbYEADovAoyCGqEBNOCjBgAAkbGevNMAAMbmo7ExZnSPBjprAABInqUiWwIAnRcBRkGN0AAa8FEDAIDIWE/eaQAAY/PR2BgzukcDnTUAACTPUpEtAYDOiwCjoEZoAA34qAEAQGSsJ+80AICx+WhsjBndo4HOGgAAkmepyJYAQOdFgFFQIzSABnzUAAAgMtaTdxoAwNh8NDbGjO7RQGcNAADJs1RkSwCg8yLAKKgRGkADPmoAABAZ68k7DQBgbD4aG2NG92igswYAgORZKrIlANB5EWAU1AgNoAEfNQAAiIz15J0GADA2H42NMaN7NNBZAwBA8iwV2RIA6LwIMApqhAbQgI8aAABExnryTgMAGJuPxsaY0T0a6KwBACB5lopsCQB0XgQYBTVCA2jARw0AACJjPXmnAQCMzUdjY8zoHg101gAAkDxLRbYEADovAoyCGqEBNOCjBgAAkbGevNMAAMbmo7ExZnSPBjprAABInqUiWwIAnRcBRkGN0AAa8FEDAIDIWE/eaQAAY/PR2BgzukcDnTUAACTPUpEtAYDOiwCjoEZoAA34qAEAQGSsJ+80AICx+WhsjBndo4HOGgAAkmepyJYAQOdFgFFQIzSABnzUAAAgMtaTdxoAwNh8NDbGjO7RQGcNAADJs1RkSwCg8yLAKKgRGkADPmoAABAZ68k7DQBgbD4aG2NG92igswYAgORZKrIlANB5EWAU1AgNoAEfNQAAiIz15J0GADA2H42NMaN7NNBZAwBA8iwV2RIA6LwIMApqhAbQgI8aAABExnryTgMAGJuPxsaY0T0a6KwBACB5lopsCQB0XgQYBTVCA2jARw0AACJjPXmnAQCMzUdjY8zoHg101gAAkDxLRbYEADovAoyCGqEBNOCjBgAAkbGevNMAAMbmo7ExZnSPBjprAABInqUiWwIAnRcBRkGN0AAa8FEDAIDIWE/eaQAAY/PR2BgzukcDnTUAACTPUpEtAYDOiwCjoEZoAA34qAEAQGSsJ+80AICx+WhsjBndo4HOGgAAkmepyJYAQOdFgFFQIzSABnzUAAAgMtaTdxoAwNh8NDbGjO7RQGcNAADJs1RkSwCg8yLAKKgRGkADPmoAABAZ68k7DQBgbD4aG2NG92igswYAgORZKrIlANB5EWAU1AgNoAEfNQAAiIz15J0GADA2H42NMaN7NNBZAwBA8iwV2RIA6LwIMApqhAbQgI8aAABExnryTgMAGJuPxsaY0T0a6KwBACB5lopsCQB0XgQYBTVCA2jARw0AACJjPXmnAQCMzUdjY8zoHg101gAAkDxLRbYEADovAoyCGqEBNOCjBgAAkbGevNMAAMbmo7ExZnSPBjprAABInqUiWwIAnRcBRkGN0AAa8FEDAIDIWE/eaQAAY/PR2BgzukcDnTUAACTPUpEtAYDOiwCjoEZoAA34qAEAQGSsJ+80AICx+WhsjBndo4HOGgAAkmepyJYAQOdFgFFQIzSABnzUAAAgMtaTdxoAwNh8NDbGjO7RQGcNAADJs1RkSwCg8yLAKKgRGkADPmoAABAZ68k7DQBgbD4aG2NG92igswYAgORZKrIlANB5EWAU1AgNoAEfNQAAiIz15J0GADA2H42NMaN7NNBZAwBA8iwV2RIA6LwIMApqhAbQgI8aAABExnryTgMAGJuPxsaY0T0a6KwBACB5lopsCQB0XgQYBTVCA2jARw0AACJjPXmnAQCMzUdjY8zoHg101gAAkDxLRbYEADovAoyCGqEBNOCjBgAAkbGevNMAAMbmo7ExZnSPBjprAABInqUiWwIAnRcBRkGN0AAa8FEDAIDIWE/eaQAAY/PR2BgzukcDnTUAACTPUpEtAYDOiwCjoEZoAA34qAEAQGSsJ+80AICx+WhsjBndo4HOGgAAkmepyJZRufYmFkLnhUCNqBEaQAO+aWDz0NBLRAYbnU5WgcZI7SzfRM14MXI0gAbQQGcNqL6+X0iWJLQSWYH6aO1MFkLnhUCNqBEaQAOeaeCQyFCj08krUC/PPtUzUSvGi5GjATSABmbWQCMIn06eJLQUWYH67NkVFsLMC4H6UB80gAZ800A9CDeJDDU6nbwC9dmz/6dvwma8mDkaQANoYGYNNIJwbfIkoaXICqi+vhdFQW2CxTDzYqA+1AcNoAGfNFAvhzeJDDU6na4CURBu9UnYjBUjRwNoAA3MrIF6EH47XZLQWmQFoiBcwWKYeTFQH+qDBtCAVxoo1z4hMtDodLoKNILqfK+EHWBkzDcaQANoYCYN1MvhO9MlCa1FVqBRDi+bSQj8DqNAA2gADfilgfHZs08UGWh0Ol0FtlfC17O4/VrczDfzjQbQwHQaaATh4Q1h+MvpkoTWIiswXqn85nRCYDsmgQbQABrwTQPVe0SGGZ3urgJRJdzOIvdtkTNeNI8G0ECsBq7tLkl4lsgK1IPwRyyE2IXApYP50CQaQAN+aaBc/YDIIKPT3VWgXq59FAAAANAAGkADaCAaHR3tLkl4lsgKROXqb7PwWfhoAA2gAb810AjCBl8DLDLGu++0nnA98Sx+vxc/88/8owHvNcD7/91HqdxnckEg7xe+X+9z8r42840GjtFAvRyeIzfF6HnXFWgEtbdD/0AAGkADaMBbDRzaPHTSf+86RHii3ApsHhp6SRSEz7D4vV38xxwNoAW0gAa80sANchOMnmeuQBRUv8+C92rBE/qcBkYDaGBKA42gdm7mEGEHcitQD+a8EQAAANAAGkAD3mlgzxOjo/9VbnrR88wVUH19L46CcCuL37vFz1EgR4FowGcNVGrfzRwg7EB+BaJKeCUAAACgATSABvzRQL1cPUV+ejGCzBWol+fO0t8GxeL3Z/Ez18w1GvBaA3dmDg524E4F6pXwexiC14bA6WCfTwczdq/0z4f/3MluIyMZH50zNwrCSSAACEADaAANOK2B8fXz5v2SkeBgJ+5UoBGEN7LwnV74Xh3loGW0jAZiNFAJP+JOajESYxVojMyex1mAmAXD6VHAAQ2gATc0sPWRcvlXjIUGO3KrAlE5vB5qBgLQABpAA+5poFGp/albicVojFZgfKRWjoLwAIvfvcXPnDKnaMBrDWzgvX+jcenmzhpB9SqMwmuj4HSvG6d7mUfm8XkNNMq117mZWIzKaAXGZ8361XoQbgICgAA0gAbQgAMaKIfXGw0JduZ2BTQtsvAdWPgcAT1/BISe0bOnGng2GpnT73ZiMTrjFYiC2n96umAIDcABDaABNzRQqV1oPBzYofsV0JcIjoJwFxDAkRMaQANoQJ4GGpVwmerre5H7acUIc6nAeKX6Bq4NIG/hY9bMGRrwXgOPbxsdPSGXYGCn/lSgUQ6/hJl4byZunA7ltDbz6IcGjjbKc17rT0ox0twqoM444xejcrgSCAAC0AAaQAMCNFAJr8wtENixfxXQnyKNgvBJFr+Axe/HEQ5HsswzGojRQD0Il6u+vhf7l1KMONcKNEZqZzWC8DAQAASgATSABqzUwOadQ+H/yjUI2Lm/FdDfIx0F4VEWv5WLnyOimCMitIpWPdHAE43KibP9TSdGXkgFokr4EU8WFIFKoKIBNCBBA/vq5dmnFhIAvAgViILwC0AAR1ZoAA2ggd5qQL8tq9+eJZWoQGEVUH19v9AIqvNZ/L1d/NSf+qMBrzVwtFEO31uY8fNCVKBZAf1J03oQfhsD8tqAJJwepY+cxndRA0eiIHx/04+5pQI9qUBUrn0CCAAC0AAaQAOFaWDv9kr4+p4YPi9KBdorEFVqF/LXAYUtfhePZhgTR+loIJkGdvGBv/YE4nHPK9CoVN8aBeEBjgIAATSABtBADhooh1ui0dHRnps9HaACcRVoVMJXRkE4zuLPYfEnOzrgKIo6oQEXNVAOl3KRn7jUYZtVFWhUKr/eCMIbgQAgAA2gATSQWQOTUVD9PJf3tSrm6MxMFXjuzwQv5tLBmRc/R3MuHs0xJnSdTAM7G+Xa62byWn5HBaytQKMS/j5vCQABHAWiATSQWgNLOOVvbbTRsaQV2DF37nFRJfxMFISHMIHUJsCRUrIjJepEnVzRwK5GUL1Y9fW9KKnH0o4KWF+B8dE5c6NKdRUQAASgATSABo7RwGS9Urtue7n8G9abOR2kAt1UQH82oF6pvi8Kwp0YwDEG4MoRDOPgaBwNpNPAXfxtfzeJwnNEVmC8Vnup/mRrFIR7AQFAAA2gAU818Ji+nC+f8BcZY3Q6awUeL805vlGpfjkKwj2eGgBHSumOlKgX9RKvgXoQbqoH4Yc3hOEvZ/VQnk8FxFdg68CJ/6NRDi+LgjACBDgaRANowEUN1INwXb0cvpMjfvGRxQDyqID+5GsUVF/TqIQ/jIJQf9uVeNpnDMwhGvBaA8/Ug/A7jZHZ8/LwTPZJBZyswHNXFPxQVA5XRkE4iYl6baKAIDAsSQMHoqD6E/2B551h+F+cNGgGRQWKqsB4pfKbUaX6wXpQ/Y8oCJ8BBoABNIAGLNPA5kYQfisq196kr31SlDfyOlTAqwro98+icviyKAj/LApq/xoF4YNRUJuwzAwkHa3QV46u0UA6DezT7+c3gto3G+XwvY1SddArE2awVMCmCozPmvWr+j22qFJ9l/4woX7PTZ+Ci4JwdVQON0ZB+GRUCXdzNUKOGgFFNDCDBvZO+UQl3B4F4f1REK6oB+GP6kHtK40gvCgq184eH64GXKVvevf//6Sr887EQcwEAAAAAElFTkSuQmCC\"\n        />\n      </defs>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "src/components/images/homepage-image-2.tsx",
    "content": "import { ComponentProps } from \"react\";\n\nexport default function HomepageImage2(props: ComponentProps<\"svg\">) {\n  return (\n    <svg\n      width={130}\n      height={190}\n      viewBox=\"0 0 130 190\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M74.005 37.846l4.568 14.42 14.468 4.426-12.304 8.792.274 15.122-12.172-8.985-14.3 4.937 4.78-14.349-9.113-12.068 15.13.1 8.669-12.395z\"\n        fill=\"#3F3C3C\"\n      />\n      <path\n        d=\"M113.565 65.814l-8.567-1.31m-8.612 29.68l-5.132-6.983M36.461 54.023l-8.567-1.31m22.309-21.387l-5.131-6.984m30.898.653l1.31-8.567m21.386 22.31l6.984-5.131m-41.472 68.492l1.31-8.567M35.808 84.92l6.984-5.131m31.214-41.943l4.568 14.42 14.468 4.426-12.304 8.792.274 15.122-12.172-8.985-14.3 4.937 4.78-14.349-9.113-12.068 15.13.1 8.669-12.395z\"\n        stroke=\"#3F3C3C\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <g filter=\"url(#filter0_f_136_130610)\">\n        <rect\n          x={26.2013}\n          y={69.6304}\n          width={83.8367}\n          height={97.6327}\n          rx={6}\n          transform=\"rotate(8.695 26.201 69.63)\"\n          fill=\"#B7B7B7\"\n        />\n      </g>\n      <rect\n        x={29.3711}\n        y={62.5384}\n        width={79.7143}\n        height={95.6327}\n        rx={5}\n        transform=\"rotate(8.695 29.371 62.538)\"\n        fill=\"#fff\"\n        stroke=\"url(#paint0_linear_136_130610)\"\n        strokeWidth={2}\n      />\n      <rect\n        x={35.1612}\n        y={74.2214}\n        width={64.7347}\n        height={2.12245}\n        rx={1.06122}\n        transform=\"rotate(8.695 35.161 74.221)\"\n        fill=\"url(#paint1_linear_136_130610)\"\n      />\n      <rect\n        x={34.5195}\n        y={78.4175}\n        width={64.7347}\n        height={2.12245}\n        rx={1.06122}\n        transform=\"rotate(8.695 34.52 78.418)\"\n        fill=\"url(#paint2_linear_136_130610)\"\n      />\n      <rect\n        x={33.8778}\n        y={82.6136}\n        width={64.7347}\n        height={2.12245}\n        rx={1.06122}\n        transform=\"rotate(8.695 33.878 82.614)\"\n        fill=\"url(#paint3_linear_136_130610)\"\n      />\n      <rect\n        x={33.236}\n        y={86.8098}\n        width={64.7347}\n        height={2.12245}\n        rx={1.06122}\n        transform=\"rotate(8.695 33.236 86.81)\"\n        fill=\"url(#paint4_linear_136_130610)\"\n      />\n      <rect\n        x={32.5943}\n        y={91.0059}\n        width={46.6939}\n        height={2.12245}\n        rx={1.06122}\n        transform=\"rotate(8.695 32.594 91.006)\"\n        fill=\"url(#paint5_linear_136_130610)\"\n      />\n      <rect\n        x={30.9899}\n        y={101.496}\n        width={64.7347}\n        height={2.12245}\n        rx={1.06122}\n        transform=\"rotate(8.695 30.99 101.496)\"\n        fill=\"url(#paint6_linear_136_130610)\"\n      />\n      <rect\n        x={30.3482}\n        y={105.692}\n        width={64.7347}\n        height={2.12245}\n        rx={1.06122}\n        transform=\"rotate(8.695 30.348 105.692)\"\n        fill=\"url(#paint7_linear_136_130610)\"\n      />\n      <rect\n        x={29.7064}\n        y={109.888}\n        width={58.3673}\n        height={2.12245}\n        rx={1.06122}\n        transform=\"rotate(8.695 29.706 109.888)\"\n        fill=\"url(#paint8_linear_136_130610)\"\n      />\n      <rect\n        x={29.0647}\n        y={114.084}\n        width={52}\n        height={2.12245}\n        rx={1.06122}\n        transform=\"rotate(8.695 29.065 114.084)\"\n        fill=\"url(#paint9_linear_136_130610)\"\n      />\n      <rect\n        x={28.423}\n        y={118.281}\n        width={30.7755}\n        height={2.12245}\n        rx={1.06122}\n        transform=\"rotate(8.695 28.423 118.281)\"\n        fill=\"url(#paint10_linear_136_130610)\"\n      />\n      <defs>\n        <filter\n          id=\"filter0_f_136_130610\"\n          x={0.278534}\n          y={58.4677}\n          width={119.959}\n          height={131.51}\n          filterUnits=\"userSpaceOnUse\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feFlood floodOpacity={0} result=\"BackgroundImageFix\" />\n          <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n          <feGaussianBlur\n            stdDeviation={6}\n            result=\"effect1_foregroundBlur_136_130610\"\n          />\n        </filter>\n        <linearGradient\n          id=\"paint0_linear_136_130610\"\n          x1={17.3909}\n          y1={120.827}\n          x2={112.371}\n          y2={82.0926}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"silver\" />\n          <stop offset={1} />\n        </linearGradient>\n        <linearGradient\n          id=\"paint1_linear_136_130610\"\n          x1={57.447}\n          y1={74.2456}\n          x2={57.6648}\n          y2={78.1289}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#1D1D1D\" />\n          <stop offset={1} stopColor=\"#838383\" />\n        </linearGradient>\n        <linearGradient\n          id=\"paint2_linear_136_130610\"\n          x1={56.8052}\n          y1={78.4417}\n          x2={57.0231}\n          y2={82.325}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#1D1D1D\" />\n          <stop offset={1} stopColor=\"#838383\" />\n        </linearGradient>\n        <linearGradient\n          id=\"paint3_linear_136_130610\"\n          x1={56.1635}\n          y1={82.6378}\n          x2={56.3814}\n          y2={86.5211}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#1D1D1D\" />\n          <stop offset={1} stopColor=\"#838383\" />\n        </linearGradient>\n        <linearGradient\n          id=\"paint4_linear_136_130610\"\n          x1={55.5217}\n          y1={86.8339}\n          x2={55.7396}\n          y2={90.7172}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#1D1D1D\" />\n          <stop offset={1} stopColor=\"#838383\" />\n        </linearGradient>\n        <linearGradient\n          id=\"paint5_linear_136_130610\"\n          x1={48.6692}\n          y1={91.03}\n          x2={48.9704}\n          y2={94.9021}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#1D1D1D\" />\n          <stop offset={1} stopColor=\"#838383\" />\n        </linearGradient>\n        <linearGradient\n          id=\"paint6_linear_136_130610\"\n          x1={53.2756}\n          y1={101.52}\n          x2={53.4935}\n          y2={105.404}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#1D1D1D\" />\n          <stop offset={1} stopColor=\"#838383\" />\n        </linearGradient>\n        <linearGradient\n          id=\"paint7_linear_136_130610\"\n          x1={52.6339}\n          y1={105.716}\n          x2={52.8518}\n          y2={109.6}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#1D1D1D\" />\n          <stop offset={1} stopColor=\"#838383\" />\n        </linearGradient>\n        <linearGradient\n          id=\"paint8_linear_136_130610\"\n          x1={49.8001}\n          y1={109.912}\n          x2={50.0416}\n          y2={113.793}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#1D1D1D\" />\n          <stop offset={1} stopColor=\"#838383\" />\n        </linearGradient>\n        <linearGradient\n          id=\"paint9_linear_136_130610\"\n          x1={46.9663}\n          y1={114.109}\n          x2={47.2371}\n          y2={117.985}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#1D1D1D\" />\n          <stop offset={1} stopColor=\"#838383\" />\n        </linearGradient>\n        <linearGradient\n          id=\"paint10_linear_136_130610\"\n          x1={39.0178}\n          y1={118.305}\n          x2={39.4712}\n          y2={122.147}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#1D1D1D\" />\n          <stop offset={1} stopColor=\"#838383\" />\n        </linearGradient>\n      </defs>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "src/components/ui/action-button.tsx",
    "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport Spinner from \"@/components/ui/spinner\";\nimport { ComponentProps } from \"react\";\nimport { useFormStatus } from \"react-dom\";\n\nexport default function ActionButton({\n  children,\n  className,\n  ...rest\n}: ComponentProps<typeof Button>) {\n  const { pending } = useFormStatus();\n\n  return (\n    <span className=\"relative\">\n      <Button\n        className={`${className} ${pending ? \"*:invisible\" : \"\"}`}\n        disabled={pending}\n        {...rest}\n      >\n        {children}\n      </Button>\n      <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center text-white\">\n        <Spinner loading={pending} className=\"size-4\" />\n      </div>\n    </span>\n  );\n}\n"
  },
  {
    "path": "src/components/ui/button.tsx",
    "content": "import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\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 text-base border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n        \"outline-active\":\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 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"
  },
  {
    "path": "src/components/ui/logo.tsx",
    "content": "export default function Logo(props: React.ComponentProps<\"svg\">) {\n  return (\n    <svg\n      width={165}\n      height={30}\n      viewBox=\"0 0 165 30\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <g filter=\"url(#filter0_f_136_195792)\">\n        <path\n          d=\"M5.583 6.471c2.363 2.62 8.823 1.765 12.907.892 1.848-.395 3.711.853 3.875 2.736.514 5.932 1.273 16.838-.34 14.604-1.538-2.133-9.02-1.271-13.342-.568-1.694.275-3.324-.847-3.56-2.547-.831-5.96-2.255-18.127.46-15.117z\"\n          fill=\"#B7B7B7\"\n        />\n      </g>\n      <path\n        d=\"M5.583 5.471c2.908 3.224 12.02 1.186 15.274.327.609-.16 1.227.247 1.287.874.425 4.452 1.756 19.63-.118 17.03-1.834-2.541-12.107-.83-15.416-.203a1.002 1.002 0 01-1.186-.829c-.652-4.329-2.937-20.632.16-17.199z\"\n        fill=\"url(#paint0_linear_136_195792)\"\n      />\n      <path\n        d=\"M18.245 14.756S12.985 10.208 14 14.5c1.015 4.291-4.244-.257-4.244-.257\"\n        stroke=\"#E1E1E1\"\n        strokeWidth={1.5}\n        strokeLinecap=\"square\"\n      />\n      <path\n        d=\"M31.04 18.046h2.34c.182 2.444 2.08 4.056 4.862 4.056 2.444 0 4.186-1.118 4.186-3.094 0-2.262-2.236-2.73-4.992-3.198-2.938-.494-5.954-1.456-5.954-4.992 0-3.094 2.522-5.174 6.214-5.174 4.056 0 6.552 2.262 6.76 5.538h-2.34c-.26-2.106-1.95-3.484-4.42-3.484-2.366 0-3.952 1.04-3.952 2.99 0 2.184 2.21 2.626 4.94 3.094 2.964.494 6.006 1.482 6.006 5.018 0 3.146-2.652 5.356-6.474 5.356-4.446 0-7.046-2.522-7.176-6.11zm31.003-7.462c2.756 0 5.018 1.586 5.018 5.772V24h-2.132v-7.514c0-2.6-1.144-3.952-3.146-3.952-2.21 0-3.562 1.664-3.562 4.368V24h-2.132v-7.514c0-2.6-1.17-3.952-3.198-3.952-2.184 0-3.51 1.82-3.51 4.472V24h-2.132V10.74h1.846l.286 1.82c.702-.962 1.82-1.976 3.874-1.976 1.846 0 3.432.832 4.186 2.522.806-1.43 2.236-2.522 4.602-2.522zM81.522 22.05h.676V24h-1.17c-1.768 0-2.366-.754-2.392-2.054-.832 1.196-2.158 2.21-4.446 2.21-2.912 0-4.888-1.456-4.888-3.874 0-2.652 1.846-4.134 5.33-4.134h3.9v-.91c0-1.716-1.222-2.756-3.302-2.756-1.872 0-3.12.884-3.38 2.236h-2.132c.312-2.6 2.418-4.134 5.616-4.134 3.38 0 5.33 1.69 5.33 4.784v5.798c0 .702.26.884.858.884zm-2.99-3.458v-.65h-4.108c-1.898 0-2.964.702-2.964 2.21 0 1.3 1.118 2.184 2.886 2.184 2.652 0 4.186-1.534 4.186-3.744zm11.44-7.852h.599v2.08h-1.066c-2.782 0-3.536 2.314-3.536 4.42V24h-2.132V10.74h1.846l.286 2.002c.624-1.014 1.638-2.002 4.004-2.002zm3.867 9.802V12.69h-2.392v-1.95h2.391V7.022h2.133v3.718h3.431v1.95h-3.431v7.826c0 1.118.39 1.534 1.533 1.534h2.106V24h-2.314c-2.547 0-3.458-1.118-3.458-3.458z\"\n        fill=\"#3F3C3C\"\n      />\n      <path\n        d=\"M104.364 24l3.224-18.2h6.682c3.9 0 6.188 2.34 6.188 5.356 0 4.342-3.172 6.734-7.566 6.734h-3.536L108.264 24h-3.9zm9.516-14.95h-2.99l-.962 5.59h3.016c2.132 0 3.562-1.118 3.562-3.172 0-1.586-.988-2.418-2.626-2.418zM127.195 24h-6.708l3.224-18.2h5.538c5.486 0 8.684 3.146 8.684 7.852 0 6.318-4.004 10.348-10.738 10.348zm-.182-14.95l-2.054 11.7h2.678c4.082 0 6.37-2.99 6.37-6.916 0-3.042-1.872-4.784-4.992-4.784h-2.002zM138.667 24l3.224-18.2h11.882l-.598 3.354h-7.982l-.754 4.264h6.526l-.572 3.198h-6.526l-1.3 7.384h-3.9zm19.69-13.546c3.224 0 5.746 1.482 5.746 4.368h-3.458c0-1.144-.858-1.768-2.314-1.768-1.56 0-2.496.546-2.496 1.404 0 .78.936 1.066 2.262 1.248 2.522.338 5.356.988 5.356 3.848 0 3.224-2.938 4.602-6.422 4.602-3.406 0-5.824-1.534-5.824-4.654h3.406c.052 1.404 1.118 2.028 2.522 2.028 1.69 0 2.704-.494 2.704-1.534 0-.832-.91-1.118-2.496-1.378-2.496-.416-5.07-1.04-5.07-3.718 0-2.86 2.496-4.446 6.084-4.446z\"\n        fill=\"url(#paint1_linear_136_195792)\"\n      />\n      <defs>\n        <filter\n          id=\"filter0_f_136_195792\"\n          x={0}\n          y={2}\n          width={27}\n          height={27}\n          filterUnits=\"userSpaceOnUse\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feFlood floodOpacity={0} result=\"BackgroundImageFix\" />\n          <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n          <feGaussianBlur\n            stdDeviation={2}\n            result=\"effect1_foregroundBlur_136_195792\"\n          />\n        </filter>\n        <linearGradient\n          id=\"paint0_linear_136_195792\"\n          x1={13.8044}\n          y1={5.47122}\n          x2={13.8044}\n          y2={23.7029}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#3F3C3C\" />\n          <stop offset={1} />\n        </linearGradient>\n        <linearGradient\n          id=\"paint1_linear_136_195792\"\n          x1={110.952}\n          y1={10.8909}\n          x2={170.317}\n          y2={28.5703}\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop />\n          <stop offset={1} stopColor=\"#3F3C3C\" />\n        </linearGradient>\n      </defs>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "src/components/ui/select.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Trigger\n    ref={ref}\n    className={cn(\n      \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <SelectPrimitive.Icon asChild>\n      <ChevronDown className=\"h-4 w-4 opacity-50\" />\n    </SelectPrimitive.Icon>\n  </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.ScrollUpButton\n    ref={ref}\n    className={cn(\n      \"flex cursor-default items-center justify-center py-1\",\n      className\n    )}\n    {...props}\n  >\n    <ChevronUp className=\"h-4 w-4\" />\n  </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.ScrollDownButton\n    ref={ref}\n    className={cn(\n      \"flex cursor-default items-center justify-center py-1\",\n      className\n    )}\n    {...props}\n  >\n    <ChevronDown className=\"h-4 w-4\" />\n  </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n  SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n  <SelectPrimitive.Portal>\n    <SelectPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n        position === \"popper\" &&\n          \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n        className\n      )}\n      position={position}\n      {...props}\n    >\n      <SelectScrollUpButton />\n      <SelectPrimitive.Viewport\n        className={cn(\n          \"p-1\",\n          position === \"popper\" &&\n            \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n        )}\n      >\n        {children}\n      </SelectPrimitive.Viewport>\n      <SelectScrollDownButton />\n    </SelectPrimitive.Content>\n  </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.Label\n    ref={ref}\n    className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n    {...props}\n  />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <SelectPrimitive.ItemIndicator>\n        <Check className=\"h-4 w-4\" />\n      </SelectPrimitive.ItemIndicator>\n    </span>\n    <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n  </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.Separator\n    ref={ref}\n    className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n    {...props}\n  />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n  Select,\n  SelectGroup,\n  SelectValue,\n  SelectTrigger,\n  SelectContent,\n  SelectLabel,\n  SelectItem,\n  SelectSeparator,\n  SelectScrollUpButton,\n  SelectScrollDownButton,\n}\n"
  },
  {
    "path": "src/components/ui/spinner.tsx",
    "content": "import { ReactNode } from \"react\";\n\nexport default function Spinner({\n  loading = true,\n  children,\n  className = \"\",\n}: {\n  loading?: boolean;\n  children?: ReactNode;\n  className?: string;\n}) {\n  if (!loading) return children;\n\n  const spinner = (\n    <>\n      <style jsx>\n        {`\n          @keyframes spinner {\n            from {\n              opacity: 1;\n            }\n            to {\n              opacity: 0.25;\n            }\n          }\n        `}\n      </style>\n      <span className={`relative inline-flex size-4 ${className}`}>\n        {Array.from(Array(8).keys()).map((i) => (\n          <span\n            key={i}\n            className=\"absolute left-[calc(50%-12.5%/2)] top-0 h-[100%] w-[12.5%] animate-[spinner_800ms_linear_infinite] before:block before:h-[30%] before:w-[100%] before:rounded-full before:bg-current\"\n            style={{\n              transform: `rotate(${45 * i}deg)`,\n              animationDelay: `calc(-${8 - i} / 8 * 800ms)`,\n            }}\n          />\n        ))}\n      </span>\n    </>\n  );\n\n  if (!children) return spinner;\n\n  return (\n    <span className=\"relative flex h-full items-center justify-center\">\n      <span className=\"invisible flex\">{children}</span>\n\n      <span className=\"absolute inset-0 flex items-center justify-center\">\n        {spinner}\n      </span>\n    </span>\n  );\n}\n"
  },
  {
    "path": "src/components/ui/summary-content.tsx",
    "content": "\"use client\";\n\nimport Image from \"next/image\";\n\ninterface SummaryContentProps {\n  title?: string;\n  summary?: string;\n  imageUrl?: string;\n}\n\nexport default function SummaryContent({\n  title,\n  summary,\n  imageUrl,\n}: SummaryContentProps) {\n  return (\n    <div>\n      {imageUrl && (\n        <>\n          <Image\n            className=\"rounded-md\"\n            src={imageUrl}\n            width={1280}\n            height={720}\n            alt=\"\"\n          />\n          <hr className=\"-mx-5 my-8\" />\n        </>\n      )}\n      <h2 className=\"text-xl font-semibold text-gray-900\">{title}</h2>\n      <div\n        className=\"prose mt-4 text-sm\"\n        dangerouslySetInnerHTML={{\n          __html: summary || \"\",\n        }}\n      />\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/components/ui/table-of-contents.tsx",
    "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport Spinner from \"@/components/ui/spinner\";\nimport { Chunk } from \"@/lib/summarize\";\n\ninterface TableOfContentsProps {\n  activeChunkIndex: number | \"quick-summary\" | null;\n  setActiveChunkIndex: (index: number | \"quick-summary\" | null) => void;\n  quickSummary: { title: string; summary: string } | undefined;\n  chunks: Chunk[];\n}\n\nexport default function TableOfContents({\n  activeChunkIndex,\n  setActiveChunkIndex,\n  quickSummary,\n  chunks,\n}: TableOfContentsProps) {\n  return (\n    <div className=\"flex w-full min-w-0 flex-col gap-4\">\n      <Button\n        variant=\"outline\"\n        className={`${activeChunkIndex === \"quick-summary\" ? \"bg-white hover:bg-white\" : \"hover:bg-gray-200\"} inline-flex w-full justify-between border-gray-250 px-4 py-6 text-base font-semibold shadow-sm`}\n        onClick={() => setActiveChunkIndex(\"quick-summary\")}\n        disabled={!quickSummary}\n      >\n        Quick summary\n        <Spinner loading={!quickSummary} />\n      </Button>\n      <hr />\n      <div className=\"flex flex-col gap-2\">\n        {chunks.map((chunk, i) => (\n          <Button\n            key={i}\n            variant=\"outline\"\n            className={`${activeChunkIndex === i ? \"bg-white hover:bg-white\" : \"hover:bg-gray-200\"} inline-flex h-auto w-full justify-between border-gray-250 px-4 py-3 text-base shadow-sm transition disabled:cursor-not-allowed`}\n            disabled={!chunk.summary}\n            onClick={() => setActiveChunkIndex(i)}\n          >\n            <span className=\"flex h-full min-w-0 flex-col justify-start text-left\">\n              <span className=\"text-xs font-medium uppercase text-gray-500\">\n                Section {i + 1}\n              </span>\n              <span className=\"truncate text-sm\">\n                {chunk.title ?? <>&hellip;</>}\n              </span>\n            </span>\n            <Spinner loading={!chunk.summary} />\n          </Button>\n        ))}\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/components/ui/toast.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as ToastPrimitives from \"@radix-ui/react-toast\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ToastProvider = ToastPrimitives.Provider\n\nconst ToastViewport = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Viewport>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\n>(({ className, ...props }, ref) => (\n  <ToastPrimitives.Viewport\n    ref={ref}\n    className={cn(\n      \"fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]\",\n      className\n    )}\n    {...props}\n  />\n))\nToastViewport.displayName = ToastPrimitives.Viewport.displayName\n\nconst toastVariants = cva(\n  \"group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full\",\n  {\n    variants: {\n      variant: {\n        default: \"border bg-background text-foreground\",\n        destructive:\n          \"destructive group border-destructive bg-destructive text-destructive-foreground\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nconst Toast = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Root>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &\n    VariantProps<typeof toastVariants>\n>(({ className, variant, ...props }, ref) => {\n  return (\n    <ToastPrimitives.Root\n      ref={ref}\n      className={cn(toastVariants({ variant }), className)}\n      {...props}\n    />\n  )\n})\nToast.displayName = ToastPrimitives.Root.displayName\n\nconst ToastAction = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Action>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\n>(({ className, ...props }, ref) => (\n  <ToastPrimitives.Action\n    ref={ref}\n    className={cn(\n      \"inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium transition-colors hover:bg-secondary focus:outline-none focus:ring-1 focus:ring-ring disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive\",\n      className\n    )}\n    {...props}\n  />\n))\nToastAction.displayName = ToastPrimitives.Action.displayName\n\nconst ToastClose = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Close>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\n>(({ className, ...props }, ref) => (\n  <ToastPrimitives.Close\n    ref={ref}\n    className={cn(\n      \"absolute right-1 top-1 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-1 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600\",\n      className\n    )}\n    toast-close=\"\"\n    {...props}\n  >\n    <X className=\"h-4 w-4\" />\n  </ToastPrimitives.Close>\n))\nToastClose.displayName = ToastPrimitives.Close.displayName\n\nconst ToastTitle = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Title>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\n>(({ className, ...props }, ref) => (\n  <ToastPrimitives.Title\n    ref={ref}\n    className={cn(\"text-sm font-semibold [&+div]:text-xs\", className)}\n    {...props}\n  />\n))\nToastTitle.displayName = ToastPrimitives.Title.displayName\n\nconst ToastDescription = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Description>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\n>(({ className, ...props }, ref) => (\n  <ToastPrimitives.Description\n    ref={ref}\n    className={cn(\"text-sm opacity-90\", className)}\n    {...props}\n  />\n))\nToastDescription.displayName = ToastPrimitives.Description.displayName\n\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>\n\ntype ToastActionElement = React.ReactElement<typeof ToastAction>\n\nexport {\n  type ToastProps,\n  type ToastActionElement,\n  ToastProvider,\n  ToastViewport,\n  Toast,\n  ToastTitle,\n  ToastDescription,\n  ToastClose,\n  ToastAction,\n}\n"
  },
  {
    "path": "src/components/ui/toaster.tsx",
    "content": "\"use client\"\n\nimport { useToast } from \"@/hooks/use-toast\"\nimport {\n  Toast,\n  ToastClose,\n  ToastDescription,\n  ToastProvider,\n  ToastTitle,\n  ToastViewport,\n} from \"@/components/ui/toast\"\n\nexport function Toaster() {\n  const { toasts } = useToast()\n\n  return (\n    <ToastProvider>\n      {toasts.map(function ({ id, title, description, action, ...props }) {\n        return (\n          <Toast key={id} {...props}>\n            <div className=\"grid gap-1\">\n              {title && <ToastTitle>{title}</ToastTitle>}\n              {description && (\n                <ToastDescription>{description}</ToastDescription>\n              )}\n            </div>\n            {action}\n            <ToastClose />\n          </Toast>\n        )\n      })}\n      <ToastViewport />\n    </ToastProvider>\n  )\n}\n"
  },
  {
    "path": "src/hooks/use-toast.ts",
    "content": "\"use client\";\n\n// Inspired by react-hot-toast library\nimport * as React from \"react\";\n\nimport type { ToastActionElement, ToastProps } from \"@/components/ui/toast\";\n\nconst TOAST_LIMIT = 1;\nconst TOAST_REMOVE_DELAY = 1000000;\n\ntype ToasterToast = ToastProps & {\n  id: string;\n  title?: React.ReactNode;\n  description?: React.ReactNode;\n  action?: ToastActionElement;\n};\n\ntype ActionTypes = {\n  ADD_TOAST: \"ADD_TOAST\";\n  UPDATE_TOAST: \"UPDATE_TOAST\";\n  DISMISS_TOAST: \"DISMISS_TOAST\";\n  REMOVE_TOAST: \"REMOVE_TOAST\";\n};\n\nlet count = 0;\n\nfunction genId() {\n  count = (count + 1) % Number.MAX_SAFE_INTEGER;\n  return count.toString();\n}\n\ntype Action =\n  | {\n      type: ActionTypes[\"ADD_TOAST\"];\n      toast: ToasterToast;\n    }\n  | {\n      type: ActionTypes[\"UPDATE_TOAST\"];\n      toast: Partial<ToasterToast>;\n    }\n  | {\n      type: ActionTypes[\"DISMISS_TOAST\"];\n      toastId?: ToasterToast[\"id\"];\n    }\n  | {\n      type: ActionTypes[\"REMOVE_TOAST\"];\n      toastId?: ToasterToast[\"id\"];\n    };\n\ninterface State {\n  toasts: ToasterToast[];\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\nconst addToRemoveQueue = (toastId: string) => {\n  if (toastTimeouts.has(toastId)) {\n    return;\n  }\n\n  const timeout = setTimeout(() => {\n    toastTimeouts.delete(toastId);\n    dispatch({\n      type: \"REMOVE_TOAST\",\n      toastId: toastId,\n    });\n  }, TOAST_REMOVE_DELAY);\n\n  toastTimeouts.set(toastId, timeout);\n};\n\nexport const reducer = (state: State, action: Action): State => {\n  switch (action.type) {\n    case \"ADD_TOAST\":\n      return {\n        ...state,\n        toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n      };\n\n    case \"UPDATE_TOAST\":\n      return {\n        ...state,\n        toasts: state.toasts.map((t) =>\n          t.id === action.toast.id ? { ...t, ...action.toast } : t,\n        ),\n      };\n\n    case \"DISMISS_TOAST\": {\n      const { toastId } = action;\n\n      // ! Side effects ! - This could be extracted into a dismissToast() action,\n      // but I'll keep it here for simplicity\n      if (toastId) {\n        addToRemoveQueue(toastId);\n      } else {\n        state.toasts.forEach((toast) => {\n          addToRemoveQueue(toast.id);\n        });\n      }\n\n      return {\n        ...state,\n        toasts: state.toasts.map((t) =>\n          t.id === toastId || toastId === undefined\n            ? {\n                ...t,\n                open: false,\n              }\n            : t,\n        ),\n      };\n    }\n    case \"REMOVE_TOAST\":\n      if (action.toastId === undefined) {\n        return {\n          ...state,\n          toasts: [],\n        };\n      }\n      return {\n        ...state,\n        toasts: state.toasts.filter((t) => t.id !== action.toastId),\n      };\n  }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [] };\n\nfunction dispatch(action: Action) {\n  memoryState = reducer(memoryState, action);\n  listeners.forEach((listener) => {\n    listener(memoryState);\n  });\n}\n\ntype Toast = Omit<ToasterToast, \"id\">;\n\nfunction toast({ ...props }: Toast) {\n  const id = genId();\n\n  const update = (props: ToasterToast) =>\n    dispatch({\n      type: \"UPDATE_TOAST\",\n      toast: { ...props, id },\n    });\n  const dismiss = () => dispatch({ type: \"DISMISS_TOAST\", toastId: id });\n\n  dispatch({\n    type: \"ADD_TOAST\",\n    toast: {\n      ...props,\n      id,\n      open: true,\n      onOpenChange: (open) => {\n        if (!open) dismiss();\n      },\n    },\n  });\n\n  return {\n    id: id,\n    dismiss,\n    update,\n  };\n}\n\nfunction useToast() {\n  const [state, setState] = React.useState<State>(memoryState);\n\n  React.useEffect(() => {\n    listeners.push(setState);\n    return () => {\n      const index = listeners.indexOf(setState);\n      if (index > -1) {\n        listeners.splice(index, 1);\n      }\n    };\n  }, [state]);\n\n  return {\n    ...state,\n    toast,\n    dismiss: (toastId?: string) => dispatch({ type: \"DISMISS_TOAST\", toastId }),\n  };\n}\n\nexport { useToast, toast };\n"
  },
  {
    "path": "src/lib/ai.ts",
    "content": "import { createTogetherAI } from \"@ai-sdk/togetherai\";\nimport Together from \"together-ai\";\n\nexport const togetheraiClient = createTogetherAI({\n  apiKey: process.env.TOGETHER_API_KEY ?? \"\",\n  baseURL: \"https://together.helicone.ai/v1\",\n  headers: {\n    \"Helicone-Auth\": `Bearer ${process.env.HELICONE_API_KEY}`,\n    \"Helicone-Property-AppName\": \"SmartPDF\",\n  },\n});\n\nexport const togetheraiBaseClient = new Together({\n  apiKey: process.env.TOGETHER_API_KEY ?? \"\",\n});\n"
  },
  {
    "path": "src/lib/prisma.ts",
    "content": "import { PrismaClient } from \"@prisma/client\";\n\ndeclare global {\n  // eslint-disable-next-line no-var\n  var prisma: PrismaClient | undefined;\n}\n\nconst client = globalThis.prisma || new PrismaClient();\nif (process.env.NODE_ENV !== \"production\") globalThis.prisma = client;\n\nexport default client;\n"
  },
  {
    "path": "src/lib/s3client.ts",
    "content": "import { S3Client } from \"@aws-sdk/client-s3\";\n\nexport const awsS3Client = new S3Client({\n  region: process.env.S3_UPLOAD_REGION || \"us-east-1\",\n  credentials: {\n    accessKeyId: process.env.S3_UPLOAD_KEY || \"\",\n    secretAccessKey: process.env.S3_UPLOAD_SECRET || \"\",\n  },\n});\n"
  },
  {
    "path": "src/lib/summarize.ts",
    "content": "import { PDFDocumentProxy } from \"pdfjs-dist\";\nimport assert from \"assert\";\n\nexport type Chunk = {\n  text: string;\n  summary?: string;\n  title?: string;\n};\n\nexport async function getPdfText(pdf: PDFDocumentProxy) {\n  const numPages = pdf.numPages;\n  let fullText = \"\";\n\n  for (let pageNum = 1; pageNum <= numPages; pageNum++) {\n    const page = await pdf.getPage(pageNum);\n    const textContent = await page.getTextContent();\n\n    let lastY = null;\n    let pageText = \"\";\n\n    // Process each text item\n    for (const item of textContent.items) {\n      if (\"str\" in item) {\n        // Check for new line based on Y position\n        if (lastY !== null && lastY !== item.transform[5]) {\n          pageText += \"\\n\";\n\n          // Add extra line break if there's significant vertical space\n          if (lastY - item.transform[5] > 12) {\n            // Adjust this threshold as needed\n            pageText += \"\\n\";\n          }\n        }\n\n        pageText += item.str;\n        lastY = item.transform[5];\n      }\n    }\n\n    fullText += pageText + \"\\n\\n\"; // Add double newline between pages\n  }\n\n  return fullText;\n}\n\nexport async function chunkPdf(pdf: PDFDocumentProxy) {\n  // const chunkCharSize = 6000; // 100k\n  // const chunkCharSize = 100_000;\n  const maxChunkSize = 50_000;\n  // ideally have at least 4 chunks\n  // chunk size = total chars / 4 OR 100k, whichever is smaller\n\n  const fullText = await getPdfText(pdf);\n\n  const chunks: Chunk[] = [];\n  const chunkCharSize = Math.min(maxChunkSize, Math.ceil(fullText.length / 4));\n\n  for (let i = 0; i < fullText.length; i += chunkCharSize) {\n    const text = fullText.slice(i, i + chunkCharSize);\n    chunks.push({ text });\n  }\n\n  return chunks;\n}\n\nexport async function summarizeStream(chunks: Chunk[], language: string) {\n  let reading = true;\n  const stream = new ReadableStream({\n    async start(controller) {\n      const promises = chunks.map(async (chunk) => {\n        const text = chunk.text;\n        const response = await fetch(\"/api/summarize\", {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application/json\",\n          },\n          body: JSON.stringify({ text, language }),\n        });\n        let data;\n        try {\n          data = await response.json();\n          if (reading) {\n            controller.enqueue({\n              ...chunk,\n              summary: data.summary,\n              title: data.title,\n            });\n          }\n        } catch (e) {\n          console.log(e);\n        }\n      });\n\n      await Promise.all(promises);\n      controller.close();\n    },\n\n    cancel() {\n      console.log(\"read stream canceled\");\n      reading = false;\n    },\n  });\n\n  return stream;\n}\n\nexport async function generateQuickSummary(chunks: Chunk[], language: string) {\n  const allSummaries = chunks.map((chunk) => chunk.summary).join(\"\\n\\n\");\n\n  const response = await fetch(\"/api/summarize\", {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n    body: JSON.stringify({ text: allSummaries, language }),\n  });\n\n  const { title, summary } = await response.json();\n\n  console.log(\"title\", title);\n  assert.ok(typeof title === \"string\");\n  assert.ok(typeof summary === \"string\");\n\n  return { title, summary };\n}\n\nexport type ImageGenerationResponse = {\n  url: string;\n};\n\nexport async function generateImage(text: string) {\n  const response = await fetch(\"/api/image\", {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n    body: JSON.stringify({ text }),\n  });\n\n  const data: ImageGenerationResponse = await response.json();\n\n  return data.url;\n}\n"
  },
  {
    "path": "src/lib/utils.ts",
    "content": "import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}\n"
  },
  {
    "path": "tailwind.config.ts",
    "content": "import type { Config } from \"tailwindcss\";\nimport tailwindcssAnimate from \"tailwindcss-animate\";\n\nexport default {\n  darkMode: [\"class\"],\n  content: [\n    \"./src/pages/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./src/components/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./src/app/**/*.{js,ts,jsx,tsx,mdx}\",\n  ],\n  theme: {\n    extend: {\n      borderRadius: {\n        lg: \"var(--radius)\",\n        md: \"calc(var(--radius) - 2px)\",\n        sm: \"calc(var(--radius) - 4px)\",\n      },\n      colors: {\n        gray: {\n          \"100\": \"#F4F1EC\",\n          \"200\": \"#FAF8F5\",\n          \"250\": \"#E1E1E1\",\n          \"300\": \"#B7B7B7\",\n          \"500\": \"#9A9A9A\",\n          \"900\": \"#3F3C3C\",\n        },\n        background: \"hsl(var(--background))\",\n        foreground: \"hsl(var(--foreground))\",\n        card: {\n          DEFAULT: \"hsl(var(--card))\",\n          foreground: \"hsl(var(--card-foreground))\",\n        },\n        popover: {\n          DEFAULT: \"hsl(var(--popover))\",\n          foreground: \"hsl(var(--popover-foreground))\",\n        },\n        primary: {\n          DEFAULT: \"hsl(var(--primary))\",\n          foreground: \"hsl(var(--primary-foreground))\",\n        },\n        secondary: {\n          DEFAULT: \"hsl(var(--secondary))\",\n          foreground: \"hsl(var(--secondary-foreground))\",\n        },\n        muted: {\n          DEFAULT: \"hsl(var(--muted))\",\n          foreground: \"hsl(var(--muted-foreground))\",\n        },\n        accent: {\n          DEFAULT: \"hsl(var(--accent))\",\n          foreground: \"hsl(var(--accent-foreground))\",\n        },\n        destructive: {\n          DEFAULT: \"hsl(var(--destructive))\",\n          foreground: \"hsl(var(--destructive-foreground))\",\n        },\n        border: \"hsl(var(--border))\",\n        input: \"hsl(var(--input))\",\n        ring: \"hsl(var(--ring))\",\n        chart: {\n          \"1\": \"hsl(var(--chart-1))\",\n          \"2\": \"hsl(var(--chart-2))\",\n          \"3\": \"hsl(var(--chart-3))\",\n          \"4\": \"hsl(var(--chart-4))\",\n          \"5\": \"hsl(var(--chart-5))\",\n        },\n      },\n    },\n  },\n  plugins: [tailwindcssAnimate, require(\"@tailwindcss/typography\")],\n} satisfies Config;\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2017\",\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      \"esnext\"\n    ],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"bundler\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"react-jsx\",\n    \"incremental\": true,\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ],\n    \"paths\": {\n      \"@/*\": [\n        \"./src/*\"\n      ]\n    }\n  },\n  \"include\": [\n    \"next-env.d.ts\",\n    \"**/*.ts\",\n    \"**/*.tsx\",\n    \".next/types/**/*.ts\",\n    \".next/dev/types/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}\n"
  }
]