From 07dc3923c45def662dc86934f85fa8e8242e0fa4 Mon Sep 17 00:00:00 2001 From: Jake Jarvis Date: Sat, 14 Mar 2026 10:39:37 -0400 Subject: [PATCH] feat: add docs app with Fumadocs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add `docs/` — Next.js 15 app powered by Fumadocs with a landing page, docs layout, search, OG image generation, and LLM text routes - Cover getting started, configuration, integrations (Plex, Emby, Jellyfin, Radarr, Sonarr), mobile app setup, and telemetry in MDX - Exclude `docs/` from root Biome config since it has its own `biome.json` --- biome.json | 3 +- docs/.gitignore | 26 + docs/README.md | 45 + docs/biome.json | 40 + docs/bun.lock | 834 ++++++++++++++++++ docs/content/docs/configuration.mdx | 173 ++++ docs/content/docs/index.mdx | 136 +++ docs/content/docs/integrations/emby.mdx | 44 + docs/content/docs/integrations/index.mdx | 42 + docs/content/docs/integrations/jellyfin.mdx | 45 + docs/content/docs/integrations/meta.json | 4 + docs/content/docs/integrations/plex.mdx | 45 + docs/content/docs/integrations/radarr.mdx | 43 + docs/content/docs/integrations/sonarr.mdx | 45 + docs/content/docs/meta.json | 3 + docs/content/docs/mobile-app.mdx | 84 ++ docs/content/docs/telemetry.mdx | 125 +++ docs/next.config.mjs | 23 + docs/package.json | 36 + docs/postcss.config.mjs | 7 + docs/public/web-app-manifest-192x192.png | Bin 0 -> 18572 bytes docs/public/web-app-manifest-512x512.png | Bin 0 -> 84084 bytes docs/source.config.ts | 23 + docs/src/app/(home)/layout.tsx | 6 + docs/src/app/(home)/page.tsx | 258 ++++++ docs/src/app/api/search/route.ts | 7 + docs/src/app/apple-icon.png | Bin 0 -> 17082 bytes docs/src/app/docs/[[...slug]]/page.tsx | 66 ++ docs/src/app/docs/layout.tsx | 11 + docs/src/app/global.css | 104 +++ docs/src/app/icon.svg | 1 + docs/src/app/layout.tsx | 38 + docs/src/app/llms-full.txt/route.ts | 10 + .../app/llms.mdx/docs/[[...slug]]/route.ts | 23 + docs/src/app/llms.txt/route.ts | 8 + docs/src/app/og/docs/[...slug]/route.tsx | 35 + docs/src/components/mdx.tsx | 15 + docs/src/components/scroll-indicator.tsx | 55 ++ docs/src/components/sofa-logo.tsx | 20 + docs/src/components/tmdb-logo.tsx | 29 + docs/src/lib/cn.ts | 1 + docs/src/lib/layout.shared.tsx | 25 + docs/src/lib/source.ts | 27 + docs/tsconfig.json | 36 + 44 files changed, 2600 insertions(+), 1 deletion(-) create mode 100644 docs/.gitignore create mode 100644 docs/README.md create mode 100644 docs/biome.json create mode 100644 docs/bun.lock create mode 100644 docs/content/docs/configuration.mdx create mode 100644 docs/content/docs/index.mdx create mode 100644 docs/content/docs/integrations/emby.mdx create mode 100644 docs/content/docs/integrations/index.mdx create mode 100644 docs/content/docs/integrations/jellyfin.mdx create mode 100644 docs/content/docs/integrations/meta.json create mode 100644 docs/content/docs/integrations/plex.mdx create mode 100644 docs/content/docs/integrations/radarr.mdx create mode 100644 docs/content/docs/integrations/sonarr.mdx create mode 100644 docs/content/docs/meta.json create mode 100644 docs/content/docs/mobile-app.mdx create mode 100644 docs/content/docs/telemetry.mdx create mode 100644 docs/next.config.mjs create mode 100644 docs/package.json create mode 100644 docs/postcss.config.mjs create mode 100755 docs/public/web-app-manifest-192x192.png create mode 100755 docs/public/web-app-manifest-512x512.png create mode 100644 docs/source.config.ts create mode 100644 docs/src/app/(home)/layout.tsx create mode 100644 docs/src/app/(home)/page.tsx create mode 100644 docs/src/app/api/search/route.ts create mode 100755 docs/src/app/apple-icon.png create mode 100644 docs/src/app/docs/[[...slug]]/page.tsx create mode 100644 docs/src/app/docs/layout.tsx create mode 100644 docs/src/app/global.css create mode 100644 docs/src/app/icon.svg create mode 100644 docs/src/app/layout.tsx create mode 100644 docs/src/app/llms-full.txt/route.ts create mode 100644 docs/src/app/llms.mdx/docs/[[...slug]]/route.ts create mode 100644 docs/src/app/llms.txt/route.ts create mode 100644 docs/src/app/og/docs/[...slug]/route.tsx create mode 100644 docs/src/components/mdx.tsx create mode 100644 docs/src/components/scroll-indicator.tsx create mode 100644 docs/src/components/sofa-logo.tsx create mode 100644 docs/src/components/tmdb-logo.tsx create mode 100644 docs/src/lib/cn.ts create mode 100644 docs/src/lib/layout.shared.tsx create mode 100644 docs/src/lib/source.ts create mode 100644 docs/tsconfig.json diff --git a/biome.json b/biome.json index b44e2cb..0928c6e 100644 --- a/biome.json +++ b/biome.json @@ -17,7 +17,8 @@ "!**/routeTree.gen.ts", "!apps/native/.expo/types/**/*.ts", "!apps/native/expo-env.d.ts", - "!apps/native/uniwind-types.d.ts" + "!apps/native/uniwind-types.d.ts", + "!docs" ] }, "css": { diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..9e429e4 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,26 @@ +# deps +/node_modules + +# generated content +.source + +# test & build +/coverage +/.next/ +/out/ +/build +*.tsbuildinfo + +# misc +.DS_Store +*.pem +/.pnp +.pnp.js +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# others +.env*.local +.vercel +next-env.d.ts \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..24c000c --- /dev/null +++ b/docs/README.md @@ -0,0 +1,45 @@ +# sofa-docs + +This is a Next.js application generated with +[Create Fumadocs](https://github.com/fuma-nama/fumadocs). + +Run development server: + +```bash +npm run dev +# or +pnpm dev +# or +yarn dev +``` + +Open http://localhost:3000 with your browser to see the result. + +## Explore + +In the project, you can see: + +- `lib/source.ts`: Code for content source adapter, [`loader()`](https://fumadocs.dev/docs/headless/source-api) provides the interface to access your content. +- `lib/layout.shared.tsx`: Shared options for layouts, optional but preferred to keep. + +| Route | Description | +| ------------------------- | ------------------------------------------------------ | +| `app/(home)` | The route group for your landing page and other pages. | +| `app/docs` | The documentation layout and pages. | +| `app/api/search/route.ts` | The Route Handler for search. | + +### Fumadocs MDX + +A `source.config.ts` config file has been included, you can customise different options like frontmatter schema. + +Read the [Introduction](https://fumadocs.dev/docs/mdx) for further details. + +## Learn More + +To learn more about Next.js and Fumadocs, take a look at the following +resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js + features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +- [Fumadocs](https://fumadocs.dev) - learn about Fumadocs diff --git a/docs/biome.json b/docs/biome.json new file mode 100644 index 0000000..0c6c2a4 --- /dev/null +++ b/docs/biome.json @@ -0,0 +1,40 @@ +{ + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": true, + "includes": ["**", "!node_modules", "!.next", "!dist", "!build", "!.source"] + }, + "css": { + "parser": { + "cssModules": true, + "tailwindDirectives": true + } + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + }, + "domains": { + "next": "recommended", + "react": "recommended" + } + }, + "assist": { + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/docs/bun.lock b/docs/bun.lock new file mode 100644 index 0000000..2b3791e --- /dev/null +++ b/docs/bun.lock @@ -0,0 +1,834 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "sofa-docs", + "dependencies": { + "@takumi-rs/image-response": "^0.73.0", + "fumadocs-core": "16.6.17", + "fumadocs-mdx": "14.2.10", + "fumadocs-ui": "16.6.17", + "lucide-react": "^0.577.0", + "next": "16.1.6", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "tailwind-merge": "^3.5.0", + }, + "devDependencies": { + "@biomejs/biome": "^2.4.7", + "@tailwindcss/postcss": "^4.2.1", + "@types/mdx": "^2.0.13", + "@types/node": "^25.5.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.1", + "typescript": "^5.9.3", + }, + }, + }, + "packages": { + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@biomejs/biome": ["@biomejs/biome@2.4.7", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.4.7", "@biomejs/cli-darwin-x64": "2.4.7", "@biomejs/cli-linux-arm64": "2.4.7", "@biomejs/cli-linux-arm64-musl": "2.4.7", "@biomejs/cli-linux-x64": "2.4.7", "@biomejs/cli-linux-x64-musl": "2.4.7", "@biomejs/cli-win32-arm64": "2.4.7", "@biomejs/cli-win32-x64": "2.4.7" }, "bin": { "biome": "bin/biome" } }, "sha512-vXrgcmNGZ4lpdwZSpMf1hWw1aWS6B+SyeSYKTLrNsiUsAdSRN0J4d/7mF3ogJFbIwFFSOL3wT92Zzxia/d5/ng=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.4.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Oo0cF5mHzmvDmTXw8XSjhCia8K6YrZnk7aCS54+/HxyMdZMruMO3nfpDsrlar/EQWe41r1qrwKiCa2QDYHDzWA=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.4.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-I+cOG3sd/7HdFtvDSnF9QQPrWguUH7zrkIMMykM3PtfWU9soTcS2yRb9Myq6MHmzbeCT08D1UmY+BaiMl5CcoQ=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.4.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-om6FugwmibzfP/6ALj5WRDVSND4H2G9X0nkI1HZpp2ySf9lW2j0X68oQSaHEnls6666oy4KDsc5RFjT4m0kV0w=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.4.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-I2NvM9KPb09jWml93O2/5WMfNR7Lee5Latag1JThDRMURVhPX74p9UDnyTw3Ae6cE1DgXfw7sqQgX7rkvpc0vw=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.4.7", "", { "os": "linux", "cpu": "x64" }, "sha512-bV8/uo2Tj+gumnk4sUdkerWyCPRabaZdv88IpbmDWARQQoA/Q0YaqPz1a+LSEDIL7OfrnPi9Hq1Llz4ZIGyIQQ=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.4.7", "", { "os": "linux", "cpu": "x64" }, "sha512-00kx4YrBMU8374zd2wHuRV5wseh0rom5HqRND+vDldJPrWwQw+mzd/d8byI9hPx926CG+vWzq6AeiT7Yi5y59g=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.4.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-hOUHBMlFCvDhu3WCq6vaBoG0dp0LkWxSEnEEsxxXvOa9TfT6ZBnbh72A/xBM7CBYB7WgwqboetzFEVDnMxelyw=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.4.7", "", { "os": "win32", "cpu": "x64" }, "sha512-qEpGjSkPC3qX4ycbMUthXvi9CkRq7kZpkqMY1OyhmYlYLnANnooDQ7hDerM8+0NJ+DZKVnsIc07h30XOpt7LtQ=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.4", "", { "os": "android", "cpu": "arm" }, "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.4", "", { "os": "android", "cpu": "arm64" }, "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.4", "", { "os": "android", "cpu": "x64" }, "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.4", "", { "os": "linux", "cpu": "arm" }, "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.4", "", { "os": "linux", "cpu": "x64" }, "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.4", "", { "os": "none", "cpu": "x64" }, "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.4", "", { "os": "win32", "cpu": "x64" }, "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg=="], + + "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], + + "@formatjs/fast-memoize": ["@formatjs/fast-memoize@3.1.0", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg=="], + + "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.8.1", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.0", "tslib": "^2.8.1" } }, "sha512-xwEuwQFdtSq1UKtQnyTZWC+eHdv7Uygoa+H2k/9uzBVQjDyp9r20LNDNKedWXll7FssT3GRHvqsdJGYSUWqYFA=="], + + "@fumadocs/tailwind": ["@fumadocs/tailwind@0.0.3", "", { "dependencies": { "postcss-selector-parser": "^7.1.1" }, "peerDependencies": { "tailwindcss": "^4.0.0" }, "optionalPeers": ["tailwindcss"] }, "sha512-/FWcggMz9BhoX+13xBoZLX+XX9mYvJ50dkTqy3IfocJqua65ExcsKfxwKH8hgTO3vA5KnWv4+4jU7LaW2AjAmQ=="], + + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], + + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], + + "@next/env": ["@next/env@16.1.6", "", {}, "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ=="], + + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.1.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw=="], + + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.1.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ=="], + + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.1.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw=="], + + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.1.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ=="], + + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.1.6", "", { "os": "linux", "cpu": "x64" }, "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ=="], + + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.1.6", "", { "os": "linux", "cpu": "x64" }, "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg=="], + + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.1.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw=="], + + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.1.6", "", { "os": "win32", "cpu": "x64" }, "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A=="], + + "@orama/orama": ["@orama/orama@3.1.18", "", {}, "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA=="], + + "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], + + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], + + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], + + "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w=="], + + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="], + + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.10", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="], + + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + + "@shikijs/core": ["@shikijs/core@4.0.2", "", { "dependencies": { "@shikijs/primitive": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg=="], + + "@shikijs/langs": ["@shikijs/langs@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg=="], + + "@shikijs/primitive": ["@shikijs/primitive@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw=="], + + "@shikijs/rehype": ["@shikijs/rehype@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@types/hast": "^3.0.4", "hast-util-to-string": "^3.0.1", "shiki": "4.0.2", "unified": "^11.0.5", "unist-util-visit": "^5.1.0" } }, "sha512-cmPlKLD8JeojasNFoY64162ScpEdEdQUMuVodPCrv1nx1z3bjmGwoKWDruQWa/ejSznImlaeB0Ty6Q3zPaVQAA=="], + + "@shikijs/themes": ["@shikijs/themes@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA=="], + + "@shikijs/transformers": ["@shikijs/transformers@4.0.2", "", { "dependencies": { "@shikijs/core": "4.0.2", "@shikijs/types": "4.0.2" } }, "sha512-1+L0gf9v+SdDXs08vjaLb3mBFa8U7u37cwcBQIv/HCocLwX69Tt6LpUCjtB+UUTvQxI7BnjZKhN/wMjhHBcJGg=="], + + "@shikijs/types": ["@shikijs/types@4.0.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.2.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.1" } }, "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.1", "@tailwindcss/oxide-darwin-arm64": "4.2.1", "@tailwindcss/oxide-darwin-x64": "4.2.1", "@tailwindcss/oxide-freebsd-x64": "4.2.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", "@tailwindcss/oxide-linux-x64-musl": "4.2.1", "@tailwindcss/oxide-wasm32-wasi": "4.2.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" } }, "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.1", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.1", "", { "os": "win32", "cpu": "x64" }, "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ=="], + + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.2.1", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "postcss": "^8.5.6", "tailwindcss": "4.2.1" } }, "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw=="], + + "@takumi-rs/core": ["@takumi-rs/core@0.73.0", "", { "dependencies": { "@takumi-rs/helpers": "0.73.0" }, "optionalDependencies": { "@takumi-rs/core-darwin-arm64": "0.73.0", "@takumi-rs/core-darwin-x64": "0.73.0", "@takumi-rs/core-linux-arm64-gnu": "0.73.0", "@takumi-rs/core-linux-arm64-musl": "0.73.0", "@takumi-rs/core-linux-x64-gnu": "0.73.0", "@takumi-rs/core-linux-x64-musl": "0.73.0", "@takumi-rs/core-win32-arm64-msvc": "0.73.0", "@takumi-rs/core-win32-x64-msvc": "0.73.0" } }, "sha512-7Ax4WgXw7pSkIlo2SMU4h9iOfAxJrqhrVEXgbaXK9rHtVYZadRQ2slMcqSkFa/HggUzpD4Qk8ptapCyBJqiOIw=="], + + "@takumi-rs/core-darwin-arm64": ["@takumi-rs/core-darwin-arm64@0.73.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-PVpQsBpQPGZkw5IC2Z5tlYODOA5xUB8uvcdZpwyeGQ9C2/MgMnW0UxbjGpShssikY0PzDUJnIFOv74k8A8cQpw=="], + + "@takumi-rs/core-darwin-x64": ["@takumi-rs/core-darwin-x64@0.73.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-vi/p8Qk/P76nOYcxAC4DFJGJmVLe+xadXfykIz7iCIaqjws3/W2OglXxBhLNyRrJAW9QpU5c/HUdRjdWAzB+HA=="], + + "@takumi-rs/core-linux-arm64-gnu": ["@takumi-rs/core-linux-arm64-gnu@0.73.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-tChMSJP1Brm7Y0xQqKxMi/ueN7L2JtJvoV9yKn1k8VRuX6iiQAYeujhmC1nKUqtzYl14Ep8akU40ad40ZbrGCg=="], + + "@takumi-rs/core-linux-arm64-musl": ["@takumi-rs/core-linux-arm64-musl@0.73.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-b7gpZADJ3VUJ6RjTn1CGh1tsh0A3m6sp7oNkeApv7m3j3Id18p/YSvzp8GSLhPW0EAMnM7f4OyLibOhwLWVqUQ=="], + + "@takumi-rs/core-linux-x64-gnu": ["@takumi-rs/core-linux-x64-gnu@0.73.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Wf4kt+5UwtlWjl1FLrXcR2iE5X67VVszTeG6v1hpc/JHapm2myKHuUJimYHhQOm2Ch6iW6V8PQihx0ivD+WN6Q=="], + + "@takumi-rs/core-linux-x64-musl": ["@takumi-rs/core-linux-x64-musl@0.73.0", "", { "os": "linux", "cpu": "x64" }, "sha512-2iWQScG3L/x6nZAaFY50rW5WczOhcNFFRAd2Owq1fEwU4RazXhrMs8MCQztNZ1Gh4kzgQJlzhw4r5agS+n8AJQ=="], + + "@takumi-rs/core-win32-arm64-msvc": ["@takumi-rs/core-win32-arm64-msvc@0.73.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-pwRdgOugwlx0FKNbvfJzJSR1zVmQ1jqr0/N0cB1PrxPrYxothUPUNRecBjIxIaE9Gv7J2J+kgp3O9hXIKctiow=="], + + "@takumi-rs/core-win32-x64-msvc": ["@takumi-rs/core-win32-x64-msvc@0.73.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Lhkymd/czpKYd02DFLCnzSGJ+y7t6d3MeYPmOy8lGxXBUgIHCzlm/Dnhj3TOecELR7BM1zyX6vrWNHV8hMccKA=="], + + "@takumi-rs/helpers": ["@takumi-rs/helpers@0.73.0", "", {}, "sha512-BjWuEHVPzukIo5n//oXARo0isXp3/XCl7Z48TDtARZO/bBEj68Yz6cN7lD81ZUNqCmbhVQbrpz8lxvC8anXD0Q=="], + + "@takumi-rs/image-response": ["@takumi-rs/image-response@0.73.0", "", { "dependencies": { "@takumi-rs/core": "0.73.0", "@takumi-rs/helpers": "0.73.0", "@takumi-rs/wasm": "0.73.0" } }, "sha512-mgp8TmmpT6UP25sRPCOKRWM3FBeSfLkaXFFo/EjtGlZmC/oCJ4R2gHWQO/ttzj1eSe3zrZdvi/QsdaVCbY6xpQ=="], + + "@takumi-rs/wasm": ["@takumi-rs/wasm@0.73.0", "", { "dependencies": { "@takumi-rs/helpers": "0.73.0" } }, "sha512-ecAJy4xhx58367lcPoEVOTaWNnFg1GyEcCvA0scbWIQk1VLXHpbJ/i80AcmS0i6hBYa1mClWWmTgN+yH6uHq5Q=="], + + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="], + + "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], + + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], + + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.7", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001778", "", {}, "sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "enhanced-resolve": ["enhanced-resolve@5.20.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ=="], + + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + + "esbuild": ["esbuild@0.27.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.4", "@esbuild/android-arm": "0.27.4", "@esbuild/android-arm64": "0.27.4", "@esbuild/android-x64": "0.27.4", "@esbuild/darwin-arm64": "0.27.4", "@esbuild/darwin-x64": "0.27.4", "@esbuild/freebsd-arm64": "0.27.4", "@esbuild/freebsd-x64": "0.27.4", "@esbuild/linux-arm": "0.27.4", "@esbuild/linux-arm64": "0.27.4", "@esbuild/linux-ia32": "0.27.4", "@esbuild/linux-loong64": "0.27.4", "@esbuild/linux-mips64el": "0.27.4", "@esbuild/linux-ppc64": "0.27.4", "@esbuild/linux-riscv64": "0.27.4", "@esbuild/linux-s390x": "0.27.4", "@esbuild/linux-x64": "0.27.4", "@esbuild/netbsd-arm64": "0.27.4", "@esbuild/netbsd-x64": "0.27.4", "@esbuild/openbsd-arm64": "0.27.4", "@esbuild/openbsd-x64": "0.27.4", "@esbuild/openharmony-arm64": "0.27.4", "@esbuild/sunos-x64": "0.27.4", "@esbuild/win32-arm64": "0.27.4", "@esbuild/win32-ia32": "0.27.4", "@esbuild/win32-x64": "0.27.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ=="], + + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-value-to-estree": ["estree-util-value-to-estree@3.5.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "framer-motion": ["framer-motion@12.36.0", "", { "dependencies": { "motion-dom": "^12.36.0", "motion-utils": "^12.36.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-4PqYHAT7gev0ke0wos+PyrcFxI0HScjm3asgU8nSYa8YzJFuwgIvdj3/s3ZaxLq0bUSboIn19A2WS/MHwLCvfw=="], + + "fumadocs-core": ["fumadocs-core@16.6.17", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.8.1", "@orama/orama": "^3.1.18", "@shikijs/rehype": "^4.0.2", "@shikijs/transformers": "^4.0.2", "estree-util-value-to-estree": "^3.5.0", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", "image-size": "^2.0.2", "mdast-util-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", "negotiator": "^1.0.0", "npm-to-yarn": "^3.0.1", "path-to-regexp": "^8.3.0", "remark": "^15.0.1", "remark-gfm": "^4.0.1", "remark-rehype": "^11.1.2", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^4.0.2", "tinyglobby": "^0.2.15", "unified": "^11.0.5", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "@mdx-js/mdx": "*", "@mixedbread/sdk": "^0.46.0", "@orama/core": "1.x.x", "@oramacloud/client": "2.x.x", "@tanstack/react-router": "1.x.x", "@types/estree-jsx": "*", "@types/hast": "*", "@types/mdast": "*", "@types/react": "*", "algoliasearch": "5.x.x", "flexsearch": "*", "lucide-react": "*", "next": "16.x.x", "react": "^19.2.0", "react-dom": "^19.2.0", "react-router": "7.x.x", "waku": "^0.26.0 || ^0.27.0 || ^1.0.0", "zod": "4.x.x" }, "optionalPeers": ["@mdx-js/mdx", "@mixedbread/sdk", "@orama/core", "@oramacloud/client", "@tanstack/react-router", "@types/estree-jsx", "@types/hast", "@types/mdast", "@types/react", "algoliasearch", "flexsearch", "lucide-react", "next", "react", "react-dom", "react-router", "waku", "zod"] }, "sha512-ssHz9a7+ZZSkHjB4/sfHq9rO2fPW8jtw2fPeDVzkPJd34DqOPbxuaP0TQ6CEs1Pei99Fky9CzE8ENS3H8WFxnQ=="], + + "fumadocs-mdx": ["fumadocs-mdx@14.2.10", "", { "dependencies": { "@mdx-js/mdx": "^3.1.1", "@standard-schema/spec": "^1.1.0", "chokidar": "^5.0.0", "esbuild": "^0.27.3", "estree-util-value-to-estree": "^3.5.0", "js-yaml": "^4.1.1", "mdast-util-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", "picocolors": "^1.1.1", "picomatch": "^4.0.3", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3", "zod": "^4.3.6" }, "peerDependencies": { "@fumadocs/mdx-remote": "^1.4.0", "@types/mdast": "*", "@types/mdx": "*", "@types/react": "*", "fumadocs-core": "^15.0.0 || ^16.0.0", "mdast-util-directive": "*", "next": "^15.3.0 || ^16.0.0", "react": "*", "vite": "6.x.x || 7.x.x || 8.x.x" }, "optionalPeers": ["@fumadocs/mdx-remote", "@types/mdast", "@types/mdx", "@types/react", "mdast-util-directive", "next", "react", "vite"], "bin": { "fumadocs-mdx": "dist/bin.js" } }, "sha512-0gITZiJb92c7xJwSMdcGBEY2+pFcRvklSNwxIAMTy4gjnuLZANjaXKw+qJ6E5+s9dO0IGlimHv5zyMYLjReg0w=="], + + "fumadocs-ui": ["fumadocs-ui@16.6.17", "", { "dependencies": { "@fumadocs/tailwind": "0.0.3", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-direction": "^1.1.1", "@radix-ui/react-navigation-menu": "^1.2.14", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-presence": "^1.1.5", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-tabs": "^1.1.13", "class-variance-authority": "^0.7.1", "lucide-react": "^0.577.0", "motion": "^12.36.0", "next-themes": "^0.4.6", "react-medium-image-zoom": "^5.4.1", "react-remove-scroll": "^2.7.2", "rehype-raw": "^7.0.0", "scroll-into-view-if-needed": "^3.1.0", "tailwind-merge": "^3.5.0", "unist-util-visit": "^5.1.0" }, "peerDependencies": { "@takumi-rs/image-response": "*", "@types/mdx": "*", "@types/react": "*", "fumadocs-core": "16.6.17", "next": "16.x.x", "react": "^19.2.0", "react-dom": "^19.2.0" }, "optionalPeers": ["@takumi-rs/image-response", "@types/mdx", "@types/react", "next"] }, "sha512-RLr1Dsujq3YoOEi4cLu52mZkT8fBJUl1rq4DtVoQWhvk20WYl1aDxlBhMr4guAvG5Malwh6Vy1QJ5KbE/k2E6w=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], + + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], + + "hast-util-to-string": ["hast-util-to-string@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "image-size": ["image-size@2.0.2", "", { "bin": { "image-size": "bin/image-size.js" } }, "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="], + + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + + "lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.31.1", "", { "os": "android", "cpu": "arm64" }, "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.31.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.31.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.31.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.31.1", "", { "os": "linux", "cpu": "arm" }, "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.31.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "lucide-react": ["lucide-react@0.577.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], + + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "motion": ["motion@12.36.0", "", { "dependencies": { "framer-motion": "^12.36.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5BMQuktYUX8aEByKWYx5tR4X3G08H2OMgp46wTxZ4o7CDDstyy4A0fe9RLNMjZiwvntCWGDvs16sC87/emz4Yw=="], + + "motion-dom": ["motion-dom@12.36.0", "", { "dependencies": { "motion-utils": "^12.36.0" } }, "sha512-Ep1pq8P88rGJ75om8lTCA13zqd7ywPGwCqwuWwin6BKc0hMLkVfcS6qKlRqEo2+t0DwoUcgGJfXwaiFn4AOcQA=="], + + "motion-utils": ["motion-utils@12.36.0", "", {}, "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "next": ["next@16.1.6", "", { "dependencies": { "@next/env": "16.1.6", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.1.6", "@next/swc-darwin-x64": "16.1.6", "@next/swc-linux-arm64-gnu": "16.1.6", "@next/swc-linux-arm64-musl": "16.1.6", "@next/swc-linux-x64-gnu": "16.1.6", "@next/swc-linux-x64-musl": "16.1.6", "@next/swc-win32-arm64-msvc": "16.1.6", "@next/swc-win32-x64-msvc": "16.1.6", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw=="], + + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], + + "npm-to-yarn": ["npm-to-yarn@3.0.1", "", {}, "sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A=="], + + "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="], + + "oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="], + + "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], + + "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], + + "react-medium-image-zoom": ["react-medium-image-zoom@5.4.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-DD2iZYaCfAwiQGR8AN62r/cDJYoXhezlYJc5HY4TzBUGuGge43CptG0f7m0PEIM72aN6GfpjohvY1yYdtCJB7g=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], + + "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], + + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], + + "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], + + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], + + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], + + "remark": ["remark@15.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ=="], + + "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + + "shiki": ["shiki@4.0.2", "", { "dependencies": { "@shikijs/core": "4.0.2", "@shikijs/engine-javascript": "4.0.2", "@shikijs/engine-oniguruma": "4.0.2", "@shikijs/langs": "4.0.2", "@shikijs/themes": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ=="], + + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], + + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + + "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + + "tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="], + + "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="], + + "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], + + "tinyexec": ["tinyexec@1.0.4", "", {}, "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw=="], + + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-popover/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], + + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + } +} diff --git a/docs/content/docs/configuration.mdx b/docs/content/docs/configuration.mdx new file mode 100644 index 0000000..6b41db5 --- /dev/null +++ b/docs/content/docs/configuration.mdx @@ -0,0 +1,173 @@ +--- +title: Configuration +description: Environment variables and server settings. +--- + +## Required Variables + +These three environment variables must be set for Sofa to start: + +| Variable | Description | Example | +|---|---|---| +| `TMDB_API_READ_ACCESS_TOKEN` | TMDB API authentication token | [Get one here](https://www.themoviedb.org/settings/api) | +| `BETTER_AUTH_SECRET` | Session encryption secret (min 32 chars) | `openssl rand -base64 32` | +| `BETTER_AUTH_URL` | Public URL of your instance | `https://sofa.example.com` | + +`BETTER_AUTH_URL` is critical when using a reverse proxy or OIDC — it must match the URL users access in their browser. + +## Data & Storage + +| Variable | Default | Description | +|---|---|---| +| `DATA_DIR` | `/data` (Docker) or `./data` (dev) | Root directory for all persistent data | +| `DATABASE_URL` | `${DATA_DIR}/sqlite.db` | SQLite database file path | +| `CACHE_DIR` | `${DATA_DIR}/images` | Image cache directory | + +`DATABASE_URL` and `CACHE_DIR` are derived from `DATA_DIR` by default but can be overridden independently. + +The database uses SQLite with WAL (Write-Ahead Logging) mode for concurrent read access. Migrations run automatically on every startup. + +## Image Caching + +| Variable | Default | Description | +|---|---|---| +| `IMAGE_CACHE_ENABLED` | `true` | Cache TMDB images locally | + +When enabled, Sofa downloads poster, backdrop, and other images from TMDB and serves them from disk. This improves load times and reduces external requests but uses disk space. + +Cached images are stored in subdirectories under `CACHE_DIR`: + +``` +images/ +├── posters/ # 500px wide +├── backdrops/ # 1280px wide +├── stills/ # 1280px wide (episode stills) +├── logos/ # 92px wide (provider logos) +└── profiles/ # 185px wide (cast photos) +``` + +Set `IMAGE_CACHE_ENABLED=false` to serve images directly from TMDB's CDN instead. + +## Logging + +| Variable | Default | Options | +|---|---|---| +| `LOG_LEVEL` | `info` | `error`, `warn`, `info`, `debug`, `trace` | + +Sofa uses structured JSON logging via [Pino](https://getpino.io/). Set to `debug` for troubleshooting. + +## OIDC / SSO + +Sofa supports any OpenID Connect provider (Authentik, Keycloak, Authelia, Google Workspace, etc.). OIDC is enabled when all three of `OIDC_CLIENT_ID`, `OIDC_CLIENT_SECRET`, and `OIDC_ISSUER_URL` are set. + +| Variable | Default | Description | +|---|---|---| +| `OIDC_CLIENT_ID` | — | Client ID from your identity provider | +| `OIDC_CLIENT_SECRET` | — | Client secret from your identity provider | +| `OIDC_ISSUER_URL` | — | Issuer discovery URL | +| `OIDC_PROVIDER_NAME` | `SSO` | Label shown on the login button | +| `OIDC_AUTO_REGISTER` | `true` | Auto-create accounts on first OIDC login | +| `DISABLE_PASSWORD_LOGIN` | `false` | Hide the email/password form (requires OIDC) | + +### Callback URL + +Configure this redirect URI in your identity provider: + +``` +https://your-sofa-url.com/api/auth/oauth2/callback/oidc +``` + +Replace `https://your-sofa-url.com` with your `BETTER_AUTH_URL` value. + +### Example: Authentik + +1. In Authentik, create a new **OAuth2/OpenID Provider** +2. Set the redirect URI to `https://sofa.example.com/api/auth/oauth2/callback/oidc` +3. Note the Client ID and Client Secret +4. Add to your `.env`: + +```bash +OIDC_CLIENT_ID=your_client_id +OIDC_CLIENT_SECRET=your_client_secret +OIDC_ISSUER_URL=https://authentik.example.com/application/o/sofa +OIDC_PROVIDER_NAME=Authentik +``` + +### Example: Keycloak + +1. In Keycloak, create a new **OpenID Connect** client in your realm +2. Set the Valid Redirect URI to `https://sofa.example.com/api/auth/oauth2/callback/oidc` +3. Add to your `.env`: + +```bash +OIDC_CLIENT_ID=sofa +OIDC_CLIENT_SECRET=your_client_secret +OIDC_ISSUER_URL=https://keycloak.example.com/realms/your-realm +OIDC_PROVIDER_NAME=Keycloak +``` + +### Disabling Password Login + +To enforce SSO-only login, set `DISABLE_PASSWORD_LOGIN=true`. This only takes effect when OIDC is configured. The admin account created during setup will still work via OIDC. + +## TMDB Overrides + +| Variable | Default | Description | +|---|---|---| +| `TMDB_API_BASE_URL` | `https://api.themoviedb.org/3` | Override TMDB API endpoint | +| `TMDB_IMAGE_BASE_URL` | `https://image.tmdb.org/t/p` | Override TMDB image CDN | + +These are only needed if you're proxying TMDB requests or using an alternative endpoint. + +## Network + +| Variable | Default | Description | +|---|---|---| +| `CORS_ORIGIN` | `http://localhost:3000` | Allowed CORS origin | +| `PORT` | `3000` | Server listening port | + +Set `CORS_ORIGIN` to your public URL when using a reverse proxy. + +## Update Checks + +Sofa checks for new versions every 6 hours by contacting the public API. + +| Variable | Default | Description | +|---|---|---| +| `PUBLIC_API_URL` | `https://public-api.sofa.watch` | Endpoint for version checks | + +Update checks can be disabled in **Settings → Admin → Update Checks**. When a new version is available, a notification appears in the admin settings. + +## Telemetry + +Sofa includes opt-in anonymous telemetry. It is **disabled by default**. See the [Telemetry](/docs/telemetry) page for full details on what is and isn't collected. + +## Scheduled Backups + +Automatic backups can be enabled in **Settings → Admin → Backups**. Configuration options: + +| Setting | Default | Options | +|---|---|---| +| Frequency | Every day | `6h`, `12h`, `1d`, `7d` | +| Time | 02:00 | Any `HH:MM` | +| Day of week | Sunday | (for weekly backups) | +| Retention | 7 | Number of scheduled backups to keep | + +Backups are SQLite database dumps stored in the `backups/` directory inside `DATA_DIR`. Old backups beyond the retention count are automatically deleted. + +## Background Jobs + +Sofa runs several background jobs automatically: + +| Job | Schedule | Description | +|---|---|---| +| Library refresh | Daily at 3:00 AM | Refreshes metadata for tracked titles | +| Streaming availability | Every 6 hours | Updates where titles are available to stream | +| Recommendations | Every 12 hours | Refreshes personalized recommendations | +| New episodes | Every 12 hours | Checks for new episodes of tracked TV shows | +| Image caching | Twice daily | Caches images for tracked titles | +| Credits refresh | Daily at 2:00 AM | Updates cast and crew information | +| Update check | Every 6 hours | Checks for new Sofa versions | +| Telemetry | Daily at 12:30 AM | Sends anonymized usage data (if enabled) | + +All schedules are in UTC. TMDB API calls are rate-limited with a 300ms delay between requests per title to stay within API limits. diff --git a/docs/content/docs/index.mdx b/docs/content/docs/index.mdx new file mode 100644 index 0000000..9694d86 --- /dev/null +++ b/docs/content/docs/index.mdx @@ -0,0 +1,136 @@ +--- +title: Getting Started +description: Deploy Sofa with Docker in under a minute. +--- + +## Prerequisites + +- [Docker](https://docs.docker.com/get-docker/) and Docker Compose installed +- A free TMDB API Read Access Token — [get one here](https://www.themoviedb.org/settings/api) + +## Quick Start + +Create a `docker-compose.yml`: + +```yaml title="docker-compose.yml" +services: + sofa: + image: ghcr.io/jakejarvis/sofa:edge + container_name: sofa + restart: unless-stopped + ports: + - "3000:3000" + volumes: + - sofa-data:/data + environment: + - TMDB_API_READ_ACCESS_TOKEN=${TMDB_API_READ_ACCESS_TOKEN} + - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET} + - BETTER_AUTH_URL=${BETTER_AUTH_URL:-http://localhost:3000} + +volumes: + sofa-data: +``` + +Create a `.env` file next to it with your configuration: + +```bash title=".env" +# Get a token at https://www.themoviedb.org/settings/api +TMDB_API_READ_ACCESS_TOKEN=your_token_here + +# Random secret for session encryption (min 32 chars) +BETTER_AUTH_SECRET=your_secret_here + +# Public URL of your instance +BETTER_AUTH_URL=http://localhost:3000 +``` + +Generate a secure secret: + +```bash +openssl rand -base64 32 +``` + +Start the container: + +```bash +docker compose up -d +``` + +Open [http://localhost:3000](http://localhost:3000) and create your account. + +## First Account + +The first account you create automatically becomes the **admin**. After that, registration closes by default. You can reopen it in **Settings → Admin → Registration**. + +## Reverse Proxy + +If you're running Sofa behind a reverse proxy (Caddy, nginx, Traefik, etc.), make sure to: + +1. Set `BETTER_AUTH_URL` to your public URL (e.g. `https://sofa.example.com`) +2. Set `CORS_ORIGIN` to the same URL if your proxy uses a different origin +3. Forward the `Host` header and WebSocket connections + +Example with Caddy: + +```txt title="Caddyfile" +sofa.example.com { + reverse_proxy localhost:3000 +} +``` + +Example with nginx: + +```nginx title="nginx.conf" +server { + listen 443 ssl; + server_name sofa.example.com; + + location / { + proxy_pass http://localhost:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +``` + +## Updating + +Pull the latest image and recreate the container: + +```bash +docker compose pull && docker compose up -d +``` + +Database migrations run automatically on startup — no manual steps needed. + +## Health Check + +Sofa exposes a health endpoint at `GET /api/health`: + +```json +{ + "status": "healthy", + "instanceId": "..." +} +``` + +The Docker image includes a built-in health check that polls this endpoint every 30 seconds. + +## Data Directory + +All persistent data lives in the `/data` volume: + +``` +/data/ +├── sqlite.db # SQLite database +├── backups/ # Manual and scheduled backups +├── images/ # Cached TMDB images (if enabled) +└── avatars/ # User profile pictures +``` + +To back up your instance, you can either: + +- Use Sofa's built-in backup system (Settings → Admin → Backups) +- Copy the Docker volume directly: `docker cp sofa:/data ./sofa-backup` diff --git a/docs/content/docs/integrations/emby.mdx b/docs/content/docs/integrations/emby.mdx new file mode 100644 index 0000000..990ccf1 --- /dev/null +++ b/docs/content/docs/integrations/emby.mdx @@ -0,0 +1,44 @@ +--- +title: Emby +description: Automatically log watches from Emby. +--- + +Sofa can automatically log movies and episodes when you finish watching them on Emby. + +## Requirements + +- [Emby Premiere](https://emby.media/premiere.html) license +- Emby Server **4.7.9** or later + +## Setup + +1. In Sofa, go to **Settings → Integrations** and click **Connect** next to Emby +2. Copy the generated webhook URL +3. In Emby, go to **Settings → Webhooks** +4. Add a new webhook and paste the URL +5. Enable the **Playback** event category +6. Save + +The webhook URL looks like: + +``` +https://your-sofa-server.com/api/webhooks/{token} +``` + +## How It Works + +When you finish watching something on Emby, it sends a `playback.stop` event to Sofa. Sofa only processes events where `PlayedToCompletion` is `true`. + +Sofa resolves titles using TMDB, IMDB, or TVDB IDs from Emby's provider metadata. + +## Deduplication + +Duplicate events within 5 minutes are automatically ignored. + +## Troubleshooting + +Check the event log in **Settings → Integrations → Emby**: + +- **No events appearing** — verify you have Emby Premiere active and are running Emby Server 4.7.9+. Webhooks require Premiere. +- **Events show as "ignored"** — the content wasn't played to completion. +- **"Could not resolve TMDB ID"** — ensure the title has provider IDs configured in Emby's metadata settings. diff --git a/docs/content/docs/integrations/index.mdx b/docs/content/docs/integrations/index.mdx new file mode 100644 index 0000000..96d0a37 --- /dev/null +++ b/docs/content/docs/integrations/index.mdx @@ -0,0 +1,42 @@ +--- +title: Integrations +description: Connect Sofa to your media stack. +--- + +Sofa integrates with popular media servers and the *arr stack to automate your tracking workflow. + +## Webhook Integrations + +Webhook integrations automatically log what you watch. When you finish a movie or episode on your media server, Sofa records it — no manual input needed. + +- [Plex](/docs/integrations/plex) — requires Plex Pass +- [Jellyfin](/docs/integrations/jellyfin) — requires the Webhook plugin +- [Emby](/docs/integrations/emby) — requires Emby Premiere 4.7.9+ + +## Import List Integrations + +Import list integrations export your Sofa watchlist so Sonarr and Radarr can automatically grab new content. + +- [Sonarr](/docs/integrations/sonarr) — exports TV shows from your watchlist +- [Radarr](/docs/integrations/radarr) — exports movies from your watchlist + +## Setup + +All integrations are managed in **Settings → Integrations**. The general flow: + +1. Click **Connect** next to the integration you want +2. A unique URL is generated for your account +3. Copy the URL and paste it into your media server's configuration +4. Sofa will start receiving events or serving your watchlist + +Each integration URL contains a unique token for authentication. You can regenerate the token at any time if it's compromised — just update the URL in your media server. + +## Event Log + +Every webhook event is logged and visible in the integration settings. The event log shows: + +- Whether the event was processed successfully, ignored, or caused an error +- The media title and type (movie or episode) +- A timestamp for each event + +This makes it easy to troubleshoot if something isn't being tracked as expected. diff --git a/docs/content/docs/integrations/jellyfin.mdx b/docs/content/docs/integrations/jellyfin.mdx new file mode 100644 index 0000000..a2f5947 --- /dev/null +++ b/docs/content/docs/integrations/jellyfin.mdx @@ -0,0 +1,45 @@ +--- +title: Jellyfin +description: Automatically log watches from Jellyfin. +--- + +Sofa can automatically log movies and episodes when you finish watching them on Jellyfin. + +## Requirements + +- The [Webhook plugin](https://github.com/jellyfin/jellyfin-plugin-webhook) installed from the Jellyfin plugin catalog + +## Setup + +1. Install the Webhook plugin: **Dashboard → Plugins → Catalog → Webhook** and restart Jellyfin +2. In Sofa, go to **Settings → Integrations** and click **Connect** next to Jellyfin +3. Copy the generated webhook URL +4. In Jellyfin, go to **Dashboard → Plugins → Webhook** +5. Click **Add Generic Destination** +6. Paste the webhook URL +7. Enable the **Playback Stop** notification type +8. Save + +The webhook URL looks like: + +``` +https://your-sofa-server.com/api/webhooks/{token} +``` + +## How It Works + +When you finish watching something on Jellyfin, the Webhook plugin sends a `PlaybackStop` event to Sofa. Sofa only processes events where `PlayedToCompletion` is `true` — partially watched content is ignored. + +Sofa resolves titles using TMDB, IMDB, or TVDB IDs from Jellyfin's provider metadata. + +## Deduplication + +Duplicate events within 5 minutes are automatically ignored. + +## Troubleshooting + +Check the event log in **Settings → Integrations → Jellyfin**: + +- **No events appearing** — make sure the Webhook plugin is installed and the **Playback Stop** notification type is enabled. +- **Events show as "ignored"** — the content wasn't played to completion. Jellyfin only reports `PlayedToCompletion: true` when the full runtime is watched. +- **"Could not resolve TMDB ID"** — ensure the title has provider IDs configured in Jellyfin (TMDB, IMDB, or TVDB). diff --git a/docs/content/docs/integrations/meta.json b/docs/content/docs/integrations/meta.json new file mode 100644 index 0000000..ebee39b --- /dev/null +++ b/docs/content/docs/integrations/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Integrations", + "pages": ["index", "plex", "jellyfin", "emby", "sonarr", "radarr"] +} diff --git a/docs/content/docs/integrations/plex.mdx b/docs/content/docs/integrations/plex.mdx new file mode 100644 index 0000000..6c3aca3 --- /dev/null +++ b/docs/content/docs/integrations/plex.mdx @@ -0,0 +1,45 @@ +--- +title: Plex +description: Automatically log watches from Plex. +--- + +Sofa can automatically log movies and episodes when you finish watching them on Plex. + +## Requirements + +- An active [Plex Pass](https://www.plex.tv/plex-pass/) subscription (required for webhooks) + +## Setup + +1. In Sofa, go to **Settings → Integrations** and click **Connect** next to Plex +2. Copy the generated webhook URL +3. Open [Plex Webhook Settings](https://app.plex.tv/desktop/#!/settings/webhooks) +4. Click **Add Webhook** and paste the URL + +The webhook URL looks like: + +``` +https://your-sofa-server.com/api/webhooks/{token} +``` + +## How It Works + +When you finish watching something on Plex, it sends a `media.scrobble` event to Sofa. Sofa then: + +1. Extracts the media IDs (TMDB, IMDB, or TVDB) from the webhook payload +2. Resolves the title in the TMDB database +3. Logs the watch to your Sofa account with a `plex` source tag + +For TV shows, Sofa matches the specific season and episode number to track your progress accurately. + +## Deduplication + +If Plex sends the same event multiple times within 5 minutes (which can happen with some clients), Sofa ignores the duplicates. + +## Troubleshooting + +If watches aren't being logged, check the event log in **Settings → Integrations → Plex**: + +- **"Could not resolve TMDB ID"** — the media's external IDs don't map to a TMDB entry. This is rare but can happen with obscure titles. +- **"Season/episode not found"** — the show's season data hasn't been loaded yet. Try searching for the show in Sofa first. +- **No events appearing** — verify the webhook URL is correct in Plex settings and that your Sofa server is reachable from the Plex server. diff --git a/docs/content/docs/integrations/radarr.mdx b/docs/content/docs/integrations/radarr.mdx new file mode 100644 index 0000000..c605e08 --- /dev/null +++ b/docs/content/docs/integrations/radarr.mdx @@ -0,0 +1,43 @@ +--- +title: Radarr +description: Export your movie watchlist to Radarr. +--- + +Sofa can export your movie watchlist as a custom import list that Radarr polls automatically. + +## Setup + +1. In Sofa, go to **Settings → Integrations** and click **Connect** next to Radarr +2. Copy the generated list URL +3. In Radarr, go to **Settings → Import Lists** +4. Click **+** and select **Custom Lists** +5. Paste the URL into the **List URL** field +6. Configure your preferred quality profile and root folder +7. Save + +The list URL looks like: + +``` +https://your-sofa-server.com/api/lists/{token} +``` + +Radarr polls the list periodically (default: every 12 hours) and adds any new movies it finds. + +## Status Filtering + +By default, the list exports titles with a **watchlist** status. You can customize which statuses are included by appending a query parameter: + +``` +# Only watchlist items (default) +https://your-sofa-server.com/api/lists/{token}?status=watchlist + +# Watchlist and in-progress items +https://your-sofa-server.com/api/lists/{token}?status=watchlist,in_progress + +# All tracked items +https://your-sofa-server.com/api/lists/{token}?status=watchlist,in_progress,completed +``` + +## How It Works + +When Radarr polls the list, Sofa returns all matching movies in Radarr's custom list format with TMDB IDs. Only movies are included — TV shows are filtered out. diff --git a/docs/content/docs/integrations/sonarr.mdx b/docs/content/docs/integrations/sonarr.mdx new file mode 100644 index 0000000..1883580 --- /dev/null +++ b/docs/content/docs/integrations/sonarr.mdx @@ -0,0 +1,45 @@ +--- +title: Sonarr +description: Export your TV watchlist to Sonarr. +--- + +Sofa can export your TV show watchlist as a custom import list that Sonarr polls automatically. + +## Setup + +1. In Sofa, go to **Settings → Integrations** and click **Connect** next to Sonarr +2. Copy the generated list URL +3. In Sonarr, go to **Settings → Import Lists** +4. Click **+** and select **Custom Lists** +5. Paste the URL into the **List URL** field +6. Configure your preferred quality profile and root folder +7. Save + +The list URL looks like: + +``` +https://your-sofa-server.com/api/lists/{token} +``` + +Sonarr polls the list periodically (default: every 6 hours) and adds any new shows it finds. + +## Status Filtering + +By default, the list exports titles with a **watchlist** status. You can customize which statuses are included by appending a query parameter: + +``` +# Only watchlist items (default) +https://your-sofa-server.com/api/lists/{token}?status=watchlist + +# Watchlist and in-progress items +https://your-sofa-server.com/api/lists/{token}?status=watchlist,in_progress + +# All tracked items +https://your-sofa-server.com/api/lists/{token}?status=watchlist,in_progress,completed +``` + +## How It Works + +When Sonarr polls the list, Sofa returns all matching TV shows in Sonarr's custom list format with TVDB IDs. Only TV shows are included — movies are filtered out. + +If a show in your watchlist doesn't have a TVDB ID cached, Sofa fetches it from TMDB on the fly and caches it for future requests. diff --git a/docs/content/docs/meta.json b/docs/content/docs/meta.json new file mode 100644 index 0000000..d9a9845 --- /dev/null +++ b/docs/content/docs/meta.json @@ -0,0 +1,3 @@ +{ + "pages": ["index", "configuration", "integrations", "mobile-app", "telemetry"] +} diff --git a/docs/content/docs/mobile-app.mdx b/docs/content/docs/mobile-app.mdx new file mode 100644 index 0000000..4555e28 --- /dev/null +++ b/docs/content/docs/mobile-app.mdx @@ -0,0 +1,84 @@ +--- +title: Mobile App +description: Set up the iOS and Android app. +--- + +Sofa has a native mobile app for iOS and Android built with [Expo](https://expo.dev/) and React Native. It connects to your self-hosted Sofa server and provides the same core features as the web app. + + +The mobile app is not currently available on the App Store or Google Play. You'll need to build it from source. + + +## Features + +The mobile app includes: + +- **Home** — dashboard with stats, continue watching, and recommendations +- **Explore** — trending and popular movies and TV shows, genre browsing +- **Search** — full-text search for movies, TV shows, and people +- **Settings** — account management, integrations, and admin controls +- Episode-level tracking, ratings, and watchlist management +- Media server integration management (Plex, Jellyfin, Emby, Sonarr, Radarr) + +## Building from Source + +### Prerequisites + +- [Node.js](https://nodejs.org/) 22+ +- [Bun](https://bun.sh/) runtime +- [Xcode](https://developer.apple.com/xcode/) (for iOS) or [Android Studio](https://developer.android.com/studio) (for Android) +- An Apple Developer account (for running on a physical iOS device) + +### Steps + +Clone the repository and install dependencies: + +```bash +git clone https://github.com/jakejarvis/sofa.git +cd sofa +bun install +``` + +Generate native projects: + +```bash +cd apps/native +bun prebuild +``` + +Run on your target platform: + +```bash +# iOS Simulator +bun ios + +# Android Emulator +bun android +``` + +For physical devices, follow the [Expo development build guide](https://docs.expo.dev/develop/development-builds/create-a-build/). + +## Connecting to Your Server + +On first launch, the app will ask for your Sofa server URL: + +1. Enter the URL of your self-hosted instance (e.g. `https://sofa.example.com`) +2. The app validates the connection by checking the `/api/health` endpoint +3. Once connected, log in with the same credentials you use on the web + +The server URL is stored locally on the device. You can change it at any time from the login screen by tapping **Change server**. + +### Connection Requirements + +- Your server must be reachable from the device's network +- HTTPS is recommended, especially when connecting over the internet +- If using a self-signed certificate, you may need to trust it on the device + +## Authentication + +The mobile app uses the same authentication system as the web app: + +- **Email & password** — standard login +- **OIDC / SSO** — if configured on your server, the SSO button appears on the login screen + +Auth tokens are stored in the platform's secure storage (iOS Keychain / Android Keystore) and scoped per server instance, so you can connect to multiple Sofa servers without conflicts. diff --git a/docs/content/docs/telemetry.mdx b/docs/content/docs/telemetry.mdx new file mode 100644 index 0000000..2f08055 --- /dev/null +++ b/docs/content/docs/telemetry.mdx @@ -0,0 +1,125 @@ +--- +title: Telemetry +description: How Sofa collects anonymous usage statistics. +--- + +Sofa includes optional, privacy-focused telemetry to help understand how the project is used. Both systems are **opt-in** and can be disabled at any time. + +## What We Collect + +Sofa has two separate telemetry systems depending on the platform: + +| | Server | Mobile App | Web App | +|---|---|---|---| +| **System** | Custom reporting | PostHog | None | +| **Default** | Disabled | Disabled | N/A | +| **Opt-in** | Admin toggle | User toggle + ATT | N/A | + +The web app has **zero analytics** — no tracking scripts, no third-party services. + +--- + +## Server Telemetry + +The self-hosted server can send a small, anonymous report once every 24 hours. It is **disabled by default** and must be explicitly enabled by an admin. + +### Enabling + +Toggle telemetry in **Settings → Admin → Telemetry**. + +### What Gets Sent + +A single JSON payload is sent to `https://public-api.sofa.watch/v1/telemetry`: + +```json +{ + "instanceId": "a1b2c3d4-...", + "version": "1.2.0", + "arch": "linux-arm64", + "users": "2-5", + "titles": "51-200", + "features": { + "imageCache": true, + "oidc": false, + "scheduledBackups": true + } +} +``` + +| Field | Description | +|---|---| +| `instanceId` | A random UUID generated once per server instance. Not tied to any user or IP. | +| `version` | The Sofa version running on your server. | +| `arch` | OS and CPU architecture (e.g. `linux-x64`, `darwin-arm64`). | +| `users` | User count in a bucketed range: `1`, `2-5`, `6-10`, `11-25`, or `26+`. | +| `titles` | Tracked title count in a bucketed range: `0`, `1-50`, `51-200`, `201-500`, or `501+`. | +| `features` | Which optional features are enabled — not how they're used, just whether they're on. | + +User and title counts are bucketed into ranges so we can understand general adoption without knowing exact numbers. + +### What Is NOT Sent + +- No personal data (names, emails, IP addresses) +- No watch history, ratings, or library contents +- No API keys or credentials +- No information about individual users +- No tracking of feature usage patterns — only whether features are enabled + +### How It Works + +- Reports are sent at most **once every 24 hours** (cron job at 12:30 AM UTC) +- The instance ID is generated with `Bun.randomUUIDv7()` on first use and stored locally in your database — it is never tied to your identity +- If the report fails (network error, timeout), it is silently skipped — telemetry never blocks normal operation +- The `PUBLIC_API_URL` environment variable controls where reports are sent (default: `https://public-api.sofa.watch`) + +--- + +## Mobile App Analytics + +The native iOS and Android app uses [PostHog](https://posthog.com/) for anonymous usage analytics. It is **disabled by default** and requires explicit user consent. + +### Consent Flow + +On iOS, the app follows Apple's App Tracking Transparency (ATT) framework: + +1. On first launch, iOS prompts you to allow or deny tracking +2. If you allow, analytics is enabled by default (you can still disable it in settings) +3. If you deny, analytics stays disabled + +On Android, analytics starts disabled and can be toggled on in settings. + +Regardless of platform, you can change your preference at any time in **Settings → Anonymous Usage Reporting**. + +### What Gets Tracked + +When analytics is enabled: + +- **Screen views** — which screens you navigate to (e.g. "home", "search", "title detail"), without any content identifiers +- **App lifecycle** — when the app is opened or backgrounded +- **Errors** — uncaught JavaScript exceptions for crash reporting + +### What Is NOT Tracked + +- No personal data (name, email, watch history, ratings) +- No media library contents or search queries +- No passwords or authentication tokens +- No user profiles are created in PostHog (`personProfiles: "never"`) + +### Identification + +When analytics is enabled, the app uses your device's platform advertising ID (IDFA on iOS, AAID on Android) as an anonymous identifier. This is the same ID managed by your device's privacy settings — if you've disabled ad tracking at the OS level, the app won't attempt to use it. + +No other identifying information is sent. + +### Disabling + +Toggle analytics off in **Settings → Anonymous Usage Reporting**. This immediately opts out of PostHog and stops all event collection. Your explicit preference persists even if ATT permissions change later. + +--- + +## Source Code + +Both telemetry implementations are fully open source: + +- Server telemetry: [`packages/core/src/telemetry.ts`](https://github.com/jakejarvis/sofa/blob/main/packages/core/src/telemetry.ts) +- Mobile analytics: [`apps/native/src/lib/posthog.ts`](https://github.com/jakejarvis/sofa/blob/main/apps/native/src/lib/posthog.ts) diff --git a/docs/next.config.mjs b/docs/next.config.mjs new file mode 100644 index 0000000..3ea13fa --- /dev/null +++ b/docs/next.config.mjs @@ -0,0 +1,23 @@ +import { createMDX } from "fumadocs-mdx/next"; + +const withMDX = createMDX(); + +/** @type {import('next').NextConfig} */ +const config = { + serverExternalPackages: ["@takumi-rs/image-response"], + reactStrictMode: true, + turbopack: { + // docs site is essentially self-contained from the rest of the monorepo + root: import.meta.dirname, + }, + async rewrites() { + return [ + { + source: "/docs/:path*.mdx", + destination: "/llms.mdx/docs/:path*", + }, + ]; + }, +}; + +export default withMDX(config); diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..5501bba --- /dev/null +++ b/docs/package.json @@ -0,0 +1,36 @@ +{ + "name": "sofa-docs", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "next build", + "dev": "next dev", + "start": "next start", + "lint": "biome check", + "format": "biome format --write", + "check-types": "fumadocs-mdx && next typegen && tsc --noEmit", + "postinstall": "fumadocs-mdx" + }, + "dependencies": { + "@takumi-rs/image-response": "^0.73.0", + "fumadocs-core": "16.6.17", + "fumadocs-mdx": "14.2.10", + "fumadocs-ui": "16.6.17", + "lucide-react": "^0.577.0", + "next": "16.1.6", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "tailwind-merge": "^3.5.0" + }, + "devDependencies": { + "@biomejs/biome": "^2.4.7", + "@tailwindcss/postcss": "^4.2.1", + "@types/mdx": "^2.0.13", + "@types/node": "^25.5.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.1", + "typescript": "^5.9.3" + } +} diff --git a/docs/postcss.config.mjs b/docs/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/docs/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/docs/public/web-app-manifest-192x192.png b/docs/public/web-app-manifest-192x192.png new file mode 100755 index 0000000000000000000000000000000000000000..9731c654b10dc295dbfad29f26206db93555d1cb GIT binary patch literal 18572 zcmV)qK$^daP)v-dgs4FBQYcOSg- z_S$Q$Z+&a+efHkxKiqo@cFsTdoZTt8fbmMsJ7@QTQWP(Jx6dW#+}#V$n~?JvTPPQi z7v#L%i_V{s3m9KPE+%(UEcI(cur_ls7Qx%Kz>x!k97 zcQ53=EtYszE{eK5I~NcO(mQ*8)_R!EVnNd&*b3koA098We4Dut;kvc1ek{S&pLSL_(kP8%how3!7RmV;vDsN0y zn*sdDY^xS{sTS12+JG|C|Ju1RQMUe z@aos-`^qq&oi4HjU%n2!zO`m7txJGRxOQ^=12$CM70Xbs~_h8vA zCW14?@@u4S4cA_?ctI)5OsyV(icmS3-!nQ=XN^*Nf!bBRB%qzuTs4IyfjruaA{ixA z0W$N!sse>$oQ~0#P_>#uQ_{-mV{`fG4JYS?1mo=Bf|1Jr-J=BEMYMAYOSq(f+NMa7 zb~K`apk5NeX*EKu;o55!EGUKP)cgQcfy!}SqYEVUk^w=WWDuwUQ6vGCB?+GQb}f5E0&Jui=@P0|)5OSv zOX|_QRHc+ANnj$$Zc0b!tR}GoM~F2nuS;oK1*I_I4?qdT^=Q`Uz>pF84$anRAT!+P zXtE>@4?BeCPAPG(gW!Noi!kJ zzzC^>JF83TS)}arpoU8p(a_USEBCt!C^!^RBq7pS!H@k29HYKz$)47|LUJi=gEW8T zEKq$Fl-uXZ7uP2tN2EfG0i&OU=5$NMmY&G$(+AW@&|GDfarsFS?!LMNL@h`)cv}%k zN|9ub>si()p$l}@_&CG)1#XwySs^m)cXXEf($TsC;v8o{dY5peBTm(9&ShkmGv0L_ z{^%*&tVg&5-Ko3GC7f)UMN<(;gk)0KIBLWSL0>V29FGKPfYBt5Pa4Oj*JJ~d2BOzKTR_cj&fG#oSbJ>zbJq#0^Y9k3HEL$>F zW)M??qzFVesv;1~a>D~hy(GkQFG!MsU<62gPa1B>P_Jc|UQJZeGh~$FyU_vWzB9Yd zXiBKc79guKd`+xm1v^7BBmrhGM?!O98?XmJDl{5Mgj&ziJ3^fZ{vJU4Qi!>2ldr~J z#Cf!$4tbqly)0BqO-|XEKbgyTT`MG;*EBj3Dm9rDHjfHQk}zpu(h>}q0r3NY@)Fy~ zHi8l=HJMSOA_p$WS1Z!T`hHIKT4mHD32-NLRxtynUiV@$24c*Rgn;(JXiBJZlP_@~ z8}6|)uR$ZU{(g=48q4=JWHoy0&S0-b&Momq1&1=n(8{ac0m7S)r>)f4D4P+j{%9Or zJgj`NYLUY`6d)lQ6|KzXM~QgfDj<})50tSe-lDJ!|%pF#*-LCgnUA)%mJ zVRvR5_4o>*ajI8h*D>7kj6kjFT^^%M7a`1`fUX6(}Le1hYeT2;I@$}aYaLo zQf?DnM%iRYVEjkF*HkY_laTpFs}#De7Ad)Ak7GWFAt~^p$G&Usvw)Fg38q1a9u47A z^agDV?-5H{X|pt3P+k?I3=FAdbUckLo6aS}n|YtR?g8ipGGi5EqQ*psBlMy@mxO$C zjgZ1FgBSre#zIenb!1C`Z~&+Q2ytP@23>vaBnFIzQI}1%Bqb(WJac}(2hmdc@!+F( zX$(mT8y)j%Zm>i0kS?Q<^4zAcmM}2GD9BgsA;t{-t3x`g&!ImE4giuu8;>wP8DxA( zD{6EPz=Fh(7y6R!h<7F0*%Kj>rlTaprI*$JVcdK!VzyCBsGv(5Z!{!S-Yf;(gL{T} z(J&&Ch`2KL5~|!R@}xl5DS#h2c+x$haR0Wo8JnF#_}#Lohh zA!Jw%pn`~3sT2ac5~H2z3P}=2n=4;J-mq~GMq*8P01kjW#CU|1 z(V(T7lQhvR#CDdj^+g9`#8?Q8Ya&E;FWPfSXpY#RiP~`^!HAe5?9%4aL}@E5G4P+s z3L;ZN7+`{I33$;Jpc3dJ4-_+_qCf)n@XOe{sG|)=%mw)}S`sR6W440ETxp4^iy}LT zQ|MSSBBxRldy#mSjHKs*#PpG~v)HgjdDWjow`%L&M#Wkg0aK1F=~}}3i7>_cvz#dD z^sW=rdg<~F0o)CWJrVdtgUwBK#+YpwE;pIYxe8g{t~f*U(6H;{^iv&?>B3975lrvt*SrWAmsBR;X(%t^0+rVi#axP< zm;%RRlDPxF1O->9Ip$rMhMVd<;vE7V@rqdVg34G}JGl}C!+6OPLg~3gmbXFf02r+m zX2dgl(WbW1as@j^o=zw@=sTuDzK}8ssToC}Z$@HNj22dB5?AYh&O*3_ z2uMi;x<m!gk8&*Axy7fK?9D_QQQR(1bELtPiKUN^QoNzxXLaKk0V@k zAs;l@q;f!ha1ihaL~p4kPb!B*n9^(xs>>^=lY|N(&edac#6tn~-W+waun=q| z0l`MNEGYICaHGi<70e7qUrky9#|$QrLKhNshTW4B4c8M7<3ss zifU2?hfMbgu+amB7D4t%7hRgh7?ql#vt`joygIY96bdzDN$QvoiKE`hlSC&fA(asK zJ+8p1&-qMX>(SS6$BRrn0LRh%PiXw;>Na+{l)DJir|P#nX5!RZ9~DAwjrYrB-*+Sz zh1^ghGZq}mrMhrn4>We;GjYV&2ofQjXMY5`EOOrd$3f7_; z?Xw^r3ye*SXK^~0`To-YYL;m=e*l{G>$@7{Hgg87HZYp&f$_V?1;G2*NePw~ z$(Uzmpi*=3j+mLbiQ*!JDJiHhI%e!$5Pa~;5RKp>QegZS8zX?3L09N$(J&Yd#2$VH z#Le7wSZC#6Hq7f-^5ednqX~?fKeO~bj&5IBA4qLsG#f#1{M*NWMTLD`@pW93$6) z>pfl9>M~A)O;9Bj=8kt22XS1CT&;`|D&dYTOG0qiMg#D*4IjVCG%KCju0yp~F?*q& zTTz1(KFtL?^~_=m-fnN{av+4OempjeSgvcahFP$@XJ?TSV0i{X@@WBd%z_18ZmN?g z=Au9+3Y9_%lBkl=ksy*>AzWrg!(i&Y1MOgV2naqQHs~@7miOK{3KFsG%1I4+j8U=W zco?!o(ow6ioDhvcbO1!6t1j4C9;myKpk7>R;!56bn>{jEo1D;CE9cT+OVMo7U`ue` zzY_Cc0k|1dFZAJ{nfAj%F*R=r%68hvx z8zTm=r_jiGfMebhWP>hgGZGn9PZfSDdtC$9HWqKaBb|(*jw_WcFbTlBLEBtLc`2xONbc-2!6D|%gl%&2y~e` z7ZYkw4_!vfWMpZ0v0kRQQS%(~ZVdMzN287uDG8B9ZNQxe!gyoVJ>NTL)DM6|!>*&3 zu^!rUOXecG$e;XCS@-aEWqTO+u8X;4c~Q)L4E+=U7z<9QWAup`{4xuMdNX6pzz#G) z3uZ=vU&fv;eG4K#iGf%l00;#MNiZ`Q!bKBi!E;5^U;rKV&}9}Zsc0#z5RCuaP-p6p zk?2Bs7`e(=;)`0@y?szTNwueCQX;IP2l)d4L!=m>2zGxCO;Gcf6jV2bO^K5l-B`|$ z%E2=jv%>$8S4LY#nN`|}o3Nx4o^;w&i_2vUn5joZf{qZeB1SNHfur6mAnJ{5(3duJ z7a_ui!9NDrhzG7wNkGt`e+1afOg#}QHus20(hJds>l)#S*KptF*%D^ZI^4b+aFrKl=_Kl4n<4Z}L62qRu)@X6tCtiK@f<)^7ed zo_DKH>G@vLyI!E>CSKCwB%7K|2+{${+EI2Su+e~X6qnG0F2za_1`tt;0$wyBSmHK- zP^Z(-m4kAkw6GXLiY0%EZXAXHg?^=)KE8KLMjmnosRLk`(?G%lP~^&tx8rpAZj5!a zgt0{7!{iR>EHSfW*qZBYnHY@$0Ok>7123Z&8_bLd5PE6r>>`%X2$2&I122MRMhu{G zp#?w~#b|i|Ae3dtak=_^2ptBUMw3k*gGNmSz|5e_6-|Tw2?5Luy3`v?CL%;_Fh@Wg zEh?i2U8XKdX%k8{Xyz6uq0ivJ2=UN|V0Xq!G{hG7E2dWT=!6F#ju^4D6cO#K#OmW~ z`Ygw`W^yAf7K^GT6ks-Kuw|ax>`bd*0X7SUlv!shYGz;qjEx2rs3>l^4!+_P7=ka| zi9mW%IAr9x82ld-*k}tkcHUq{8$jr(>9awXSwyKUGE9LeZhMCq#po4j!}w@mNbMtj z@N#}O`m_~&!(2jtB%g}jb{^t~MUT}^8+rucc8&|XsU zI7+32yRc&`YvnxQObQPGjb*JhTZF~MDp$MCq6&@F3aT8;&Mnc)0|Z?$AlyxMY>K#8 zS=k(dxUvj}*dWZzVCXKo=nD#hOf!QSMQH{Y|9Ni+SBlXykI`Ur+u(>94e;_^jyBx{ z(`4&#I#nA)3ZO8%oF>?Xr>)hJ$Ju41w8Q9q#Fr+7;ERT_tDiZ>8^dFMRG1zN)s=Hf zG(N$L>*OLd*t}Fc3ByuWlr^V@&Ja@o^X8q=2{+#}C~>@o;9Ey(W$#ksIw{${ygMRhY`QbZ8I&eI3Y6u-wM{&q306|&A z$OA8eW)Y*Cn$d7!43uC4(&`C8mzf33rmkmc!#8-5kcq* zwt7iGEbvVp5Duon0JzQ0%wPx?O_*6vVvNenz@Qpv0qg}q7XdaQ@~GhgT?$A`lo0)> zAfjwZcEBqD3ezc@4KORi4SO^`8fX+*5gL>p0OJMy0qFRhHJ%b8)67Pc5L-wt`ib+5 z{^~ooRRrPkcrd;1`(VNRuA>72UcGwR%?3HKWylS7Y#xf*SidT3j1rKd1)3Ct|1%)? zQNv&+fnTPcK4`GXLvW)P6aI(fTCu6vy5o)I`8|3U8HJrpoxm9FR18)zVrs;woN6Y^ z5S3$q0WN@)$7q-dcSv3^XdzuW9(W0M9b+XOmBSo1ta+`RIciBB5A8IuLyjMU;+cE+5c4EE)Dqc;$T{S`xQEFJdMD$DG>(rajND!gbKPirS_U)2`RAU6M?UPU@T{ji z9xs00Gw`=>crIS`lIP*IFS{16eff2iYw_QG=k+eHefjnHKF6-ZYhM=R#+P1)*Sz#v z+?eGWyqfl_UUDt#(0<7^u3y#E*E;vcmtGU~wXs&H?PGAf@8h^Ww&p?6++O43U(4Fh z!*}2CP52wvJOj^u>f`aKuYL$F;60hyg5@eXrM)0^g3{X47FLy5Vfg&fwk$Bn9{}k7 z9GZ!mP)isZv=*<#F!RKg1(oM?H_8ZYVr(>umVs;(!NT;gcM+t`CMPPHE~lM#2#zVWXn6Fyj#(F`X0*$3H z%Q?J|bJE;i{Jf|6T)&HRzL5{u54`F{c+>y#-FOS{>F@B~9{;F^;q=oE`#mq}dJENa zyAr*CyWWYCjc_dJvMI1oEFTZ$wWL+3#p`1`t;CG+fnm$;Y6dgeR?CTO%`%#<`o4oB z-3T{KCG=(Hj_u&dkG~2(^&_vrTmSbP@i(t|I_M{J67Y z;bRbAMRzD>#&-*xc;OD3Sv9vqJLYpfW23PiCsJyU&000mGNklJ3CqAIB#;{Ty<}U z5AEP_UvmZC^gn+We(VSSTU`B!heGcNisd!R25V=VMw8UzkT&0Tc`kS7X^Fvc*^;-R zj+Nr@y$4{!+Buzruw{3~=%{g4P5xA@OelC=;YbLv^UpmSH+;)e@DKmqEAX@@Jc?gz zMO5s|M-K5_;;CPE75=Zk_nmn0w?38Md(O^lq*aJcPmM=v;skHmx7E6wwug^Q4Q|IP z9snO@P<7%~2HXUAj&}(Ox&e7$4EJEKE4l3%cL^mop%RG*0692GxJ-Rf_+@RM6ptYNlMIZf^2T~ zyD5J>r#m@2`P)USk}52bDz_`1YZo%02V9f+<)pcI=Ws2qdB)e{M_>0+|L)`K*6X+`HBtiE z?(Kb@fqWkNcHU;NSIa&%{ON@oinC11ffa=5--|Yy92M zer&std|*(=oG%#;-$0Ggvk8C#*P zQpV3{ueNTXgi61&wFSWoeaP7D6+Hi(v+$yCdNL02XWl&d+#IsSIVH1ep*4HqbDoF` z{hc$cuX?S#w1lfkWjsp3qC;DKkPdD8Li-$HW3tNG8mr-WQK)+WJhJ~?YXNGk_QDK{ zI|x9tf8leV1ihX6uBgmOE4<$mF!u}i0`g*i7icbT1U0c}4%AeP&)|T+|G)`<0Q_){ z-FIBSr~<2U2=)C4opt8vc)_#(s;{!%84ik+Uv^7-dVc!I!q;BDb4~NM&-u1zJ^|;P zbw+!e`fK0!xfkt31t={(;r(oDJOF$(;tYp#A0nhJYTVax-bC3HO4^G==c=gwHC3ukkc z%>3ujtt3r)D14Rim5?s8!r((b&md{Ssd`PQgq)yqymmWJR=0Tam_o%yqx(GiME+7| z2lPqa?^n$|A8#M;NxS+K{_>EE%Uutvte#U4)L{hK98*`GjuH>C)GH#9--(bh$t+Eb zj>f5lXUXwS(;c)_e`gR`2k^~ilu^$a}cKD_D36Hu$$DgY}OuKbTxE6dj z)L?H8g}d?tyn3-Zt@c*0##?98{tR-7 z>s7VFi3L9zQ3*Tq^wV(Zh3B$V{n~KK<1@g6zv?<%a=|$`>x|R1v_bM(M-hj@}fFi_U%jW2VaXWlRGB0oF;%hUFi>1#DLA_;7n!M%0+Y<>Yg`;61I6Q@Lr zvZ0)H`eA+%=6d?-c3rvl9a>wNlZ`sQHE+%O`2kobUpbQDO|((*6p_g8i*QMam%d)P zQmn*z$`kDRjMEN7AA|I+aZ0#qd;m6ChaEHjk7l&EEG5;whI1p>98<^9q+Ci|fP9JU zz6h7}@hM+?NsD7GFk)rSPQFj#I?MGYpS&k zqP3O;FZA*y!5j99C8?uAYh>J88d+L1JOE-ZmDUU*_wkm0^&b4-Py7}9Zc=XtDJaF_V?mhAV zZvOP`xapVPhZp=$Z^l3Tr|-h2Z@Ux6jvnKFlB|MT6aJ)SYqhpLw_&|w$ByAMpSu(P z=%2kCFXY<%1Yhkx@t2?THPhN1J$f8kOMg+)+Kz~BxfM#g&yicrk`l z742iU+=@5+{5$dg@nJY}{{uWT$~hRq$*>LQLXd5U>w#HSjy&)H{>88VuCKwzKK0q~ zD$lj?R;-o$;1&y7nA)4lRYDR^R8*3{pod7n_q$*H0np4P+nT9r?dsPpTFSbphXl!> zmXgqPa6 z0K*#FLE_}2s%i$Tf`Y@q;hh~k?dmJ=<2PQ9cl`aAufzXM|7ZV)8}N&- ze<}XYS9~)b|J4t!ew)cuuknR@kMIHbE&S`>`p>>;egb$1PmEsg`-2|XRp$HeKJbTl z>pT8EKk^*mJ$v)DP^UkGe%!;p0{_R~`X>D1-+w87?tgrducg-X?SJArz0&`8l(baJTS?O5uaFd8!d6I_pq91r15kn!xqBO$T9{&`McdgiJmM=a#v5OG z4SxJJ&&M+#|8QKycL4pyQojd~oTc9g^S7ASKIu_->-WC^uYbw2a0y?*5O3B?ve*NB z^?%F1{0;mGe_XoiVOr(j?G@K_BMar@pSl%4{x9Bx`}G3=z6|sB;TPBB;&ac!4|0uu z`gJeBbx(dYF6G*34Yih%v-k_K3(0xL*M2qhg7cJq-NFxiX5jz!s`(<#Ti z>#$9%-l%Jp;sc-=)zW<+NqDPvhz+>`53eh$*sU>om^PW4rW^l;uXzaG_`TQQ*LHhc@9<923^mu=@BSiw?%)1L+`}KC>LFMp{7KUy z9_PK7w-+_z`1jmH|cKkSg@1vi@AO6{2@P)ekC_G!En%+r&=w;9L?@z0&rkUP_FY&$j+J`+j z92~ACo61(gDTKJAErtj7r7K6z4}eBiU?}x#ym+My`Qbj7;$^Ln84zEvVCG&m^`-Vl zcz~~b(1kpx{GvtT?uw#UyYGFT{%f%_bq<2CxLz6G|Dlihk4ATSV1gXuILA+VxsSgK z`S-lH+wQuD_Yzi`w~PzUIRoGGyeImX-Q5+}G4U_I^aA|w%btUa`0+?J!-f@BXEIbd zVeKQT$g0BBs@3`R*-f!Bp?Uzyz+!uqmyE?l1Cjd?jG}+x(;tgRU;dy1S>4nZy(d5V zay*G|-I~4@MpcgSlsc7BbvmCmMx5bCqLr-4qyF`9pgRmX4UK7pLo^f zc*>)%;OF?wj>01!aw%?j#^caks?G;Z19jkmvv}7V&T#AL;|28!^BqsUnv1yJD}Q>$ zl0Ns$)A8J|e+14u>vZ3xH0mw4-ht2Fepmg<#JyDfpb8hHo-cv^TyN!%e06UOIad$3 z*5KKH<>9^tT9ZwLi->Q3>SJ)p`Dbg0MWQ*561nE1u`LF6cEh)qiITgFb<$ac8*QC= zr+|{X=W+bKiSoB07xH&5kL8+bue59uJs7og z9;Z;W-pS$87r{wW)FfT?4jD@pgYN)i;q`D8T`#khRaet5w$3>x=oL<82&%)zIENn!h-k zdQH{1X%4j>kJP;FdOO=Kw^=nUfuyb?WEaMt`(Jj!+5D_(d_mq_QI0qHrybgf4}j@- zxoGUq-}6Q1>mk^N9OoQe3Kgd-2Zw1(WmY%yhiHv_A);Frybt$dp*vFYEwD1 z6V`LbR9$23s>@P)89t%LfqDR@R$_;1s$a(Flx=zs))}-ohqGvIQ)Nw?Y7ot9gKw!^F_ssn?>6P z+_2m0^c|n4R%1^3GnwOW5KpQ7A@z}DYnv4}n2&}Jv#W(578E_&+aBvg);rGc5WFSc zF7Hh@neLk4*5<`Av_~AotEVpSXEOFer@@k5IL5(z2hiksmM?f8000mGNkl-` z&3$f|FY>l@DDA!1PlrR!my*Og)GfK`9ldR>W30o9UO9Ey&qj)Ds`W0jX$|0DJ^;mi zRqMt@*6WvEXtpKc)vp^+<7te5)6$qO$NAhzO6(-E`C#kb(w*{_ct7Ch|LqA^170)^ zQjQm)EvoHQKe!J-aev9w0_%&~Em)wJ-mp=fy3CVuWUgJe^#ctO(jgP{tUiNCumn?1>>#>(D z^>O|f^sWE;1Ng~b{cYSdkPqOkzZ!)c@#f^G$XiF|>gITy&rQ@f4d(mX5bsZUPh7IN zd*Ob$oLIh|%wd6fzOQ2Fe1JIQeyB8_^uqC$KLDv97a^O;*c06=%A4XAtgvC+1I~4B z!&q=I(4T+i4!r$czl)#ww;#mMyt9+H(SF-Ie}@?5T>%f+2T|&`llOMUle~?!){&I& znl;NYO8aLx*3WQWnw#))&bo)UbNo;6p12~sSFNHe{xAcWlus(+KYyA9FeMCjmYn%jA(bGPk`x8QAbxanzR(4usKGAc-Q1-q2ata&2&<{9?jemrWziMM#4*?ha3n|^&!VW zoOkvac>2{3A z?7*7u7uVrDxFMv6`O@(DRU?q2iBi}Yfj{uycij_l#btU2;LdDmJ;UClQG(`5aLm2y zd3RcYD76=6Agn#UB76XtyJ}PARdd$lmqT%XxzXA%-Vhz%>x#BYNsAVq^@*lfImefid)k}6U$JRYO;o%SV zd;Brp>oQ-KIBFN#!&!i$GjI@~tpvbbqJ^`lQX7%5)N}m!QGaa@ADLfq0XO4t}(-u4c@ou6j zr`~|d@K$Z^HSW9rD31G|1@i##8`tiaqVPsf*84in{m@^X>Nmn$-TaAS(`RrxsinN`UNc&r7q=0UYg^dfA&u3f8BZcD&9gXYcqT&)?>obz%?8@x8f+l|DXge+_TD>xgM~8lu zRnZiF?LU12_dUSx0ov?+6n(KfvF{qiD>gq<9GJPpJ<$Ky?!WtkKLg!Wwsdc}Iw%V( z`vb6;FJh8~18kf2m!JOv-uVZAsw1$kq7R!qg8Mq==y*J3qp=e-!*_q^6Zq7L`U0HJ zWYP-`ov5Pu10Z8HVLDsNDa-_|p_ixp?5}+|eiz`eszRe77ErwfLv7`8DmY z(QS9#i?{vSf8qvmGuZD(8;&$YmdqnR07_pft-?!lx52yZ?tAf1f8!(kym>zlH(v|6 zBV!*4NMM`hjOCuf=hyAtBlqJM-uDrF=1%@_!v7N+K0rJm+t}x+8XRKKruh9>O3n{J z0+whM^V@BIiqeDke*h1Xx@p8(liaZFp0 z@Bg*I!OYp^z5n4SZ^O^M=fk+0dl9$gq*H4@0RG_VcC#U88?vk*UwrWw{6hT3U-=+D z_UX^_A>exwQ-vQ`;aNVgb6auk{`50<;7wfnTW$~ke*@dt`IT#M&MW8i5_ZCyhbm1; zFDtsrO~T_xbaxA%0$C>gN4orpMyfle^{e+c{Ne|2^w=>z1e^^|*zQ(kkA7)Y&haF( zwbnn%HNW|`ySQ1qCq%f@JRPa$6q;>%ZpvQx4xmEK5eDFL<{-5LRxEPI7mh%miRTXf zdOyqOqj!=W(7AQkG_JMQA0~Dib`Y&)hiKsgFn@!~hMTW5&Y1eXpl5j(I^a{Hjh~92 zip{T~)@YZny?j|1->N;1Z1b%71F)>%1ZyI+y|tJgM2Gv7@M!MSyVdsgb;U~Qb#U@H zOa^_x#PA2ekwu--N~x0+sgeEjbolutfGUMnc z*1P=AcJ=+?M2dcMy1(O(-?!F8Yoj&#=fC+;{Kf5eH`h|@>TA7!TU(8!t*roexaav@ zNw$NFx)mRQe$CYe>t}D%=TGIhH@i*IcZ6U0-9N<}-tj@a?q}bNSHJbw@T#AD_nykD zS-+B--i=rHX35|C3Q0_6d%b%J1=5PWnUCu>c;*Rl`Noxt~A6rLO9dDg6l(XtMk*_t$ zYs8NkyL4LX=or_UVZKA~AnftJmgDgDx-mKQpsg{N{0^YpLBTPgB3I5>#-8Ka7=1x& ziDFxufNnR*MA1YUXad?us&a4nYRkPP$X4SVLm1U~6CuesYjH%c@S0<5Ero4$Jr~ca zMbu44yf7m&s!D2p07lts1j+%{NMDvx3?fsTGAe$gmY4NlBR<9yd~mHEn`9brXB$ z*NYs!YaC}dZwJZYL+5=rXS&T6){T7Lz|d}{>@%o)T7AfVR`md^Tu#+o*s+!QJ+};P z-G1PKz?xf49;k4 zqwF*uiVcdh8rud1)=vHSXYa%te);$D+kf(DeD0q6aNFJY;eCH}3x4z+zl)psYBpP# zn`mY*>j`W&H4(&|6b4xyv%-R;VoVrb)QlC(*k{>+nE`B=xjy;1d$@MLhxdNu7Ov&J zT+<`Iwr}|5-@~8ifBIx5e^0`Gw!GU)c~#okN~Kst1>MYsd;8MyMG7DP%$@iL@Ay5u z@}~FTm2drZyy;gzgj;U^f`2rsCb7!=cv#E~W^)2^u;&-2;p3P!=7Soe+ndkw8`no2 zy?g%SfAb;udfxQwzP2Cx^qv0IpjUWn?&u6-AgZm6=MR92O14o|Z%?X~WE(YCt)aJP zevcbZv+>aS5fwF^l3+Hx^bZe1^Ty;&QZ|n7ZjPHsER~1e*k1i z5-59P*=n(kXLGO$d>PGVE5~3fMZ%)@OH~hmD1Cyk)upS_S*uq$m2vW~K>rnel{>1> zPVKEyCvo-ZB-u&x0Z`#}C6#Gu*3<`c{%9x+OrLi6!QCnQ)H+O`fqZ7-8ET!d4x6sk zt+g_0E*}7awTMz98+fr;R2vlfQcXQ*D|6!KlV^~PWqUvMZZlS@`2Z{%POP!AitW9e z*wMFje^cAGtua=qbI|59H}~!obXJ`+bw{HQz*w=mw7dn(NO9$z@-~;L8{544sS10s z0&_L<@yJFmquTT_QpySBkzav2X}$j*K;u?ICx2F>?Vt6%e%D1<%EK~FN%!&e)LMk! zFQj$oPENF9K<6wALlJJDDF)fvF)lr0qwfGL?RnCRg#`mwPhNHcRP^JKf;4Aph&j%w z_(`(@(`TZH7Uq(ho1*IoO+Eli1{iRBMDG|%nx?nT?<^0j-mO|dcf0y1CvV0{bidPE zSwstSTN^X`0IW4;l~g+Qu9T5&-Oy;AeI0Cc7W)_2)BD}9cySCCS6WQ$mUu~u|1q41 zNxJmTO0ktR$@!xi?Xk~ODRfHnGbxw6TZjCUa9_F(@AFQCZ=21DH^b&Nc*}K*fpB)X z2K3z~i>Bu+)l3<*e(vl$z@Wlf0B;0L)aX>F+L9G0UM82&zl1p9n1p_>Z)@-XXjsYi z2aZ*v+J605@yqwz#0A(ZwbvWRdFLUrL2x@w6(#*@g9jiHM3y9f8(Q^T*sIF{9jC{)neD>8m$DNJtqAEL5Df}XAB)ASdf7FU;MN>+$&UoP~AjbYe9;dE@ zw*u8(k30J^@!59(&7zv4fQ_Z7*fv)fAv|(LnH6&PiF#_7$+%(X000OPNklH*t%KZF7_2r*b!5f$;9SaTyjUwl{rhC8}0M1Z*U$R^tPp6pDV^ z;NQV%Z%y~_rL~~Nc*PvTZw`vs*5-7oW;lWSw+_`_7JD4#(LWzR}J-$j*`DI-H#Y5?zvS;>$3%`eJ)Z8l$IoSsDA)rE3qx&9XqRnwU-k3o9 z0ca3gkj8J}ZA|P!s#&))`lzz|nET~B@+irf``nci+qz|`_ok_M78+_4Uzxob@k_sI zy?xdFYH2HAFC7lneZrB$!Kn6fZ&jY7%r_FlM<5#W?C``a;RVhneVCB?ym*_GJC$3l zz{Imr@iua}dD=UwSf;ZguqSHqD3KT*08J$VJyUKaq9v&UTX!@{C@L#0rrU&*rg^HJ zz!gaQP-!}B#jI+t2yDev^(2c5iX4gE0}uhJrLPc09i{DoXaq?tEmIO*DY+8aCxe_! za~-T_F?pGiDNgvz&}0qL)&(}LUOxb9R9houjeG5l(sNZ%kVN)DmZdK)2l5^`d9ATz zFh7Bk9H^X(Zqrz6gkDnp0BCk4fj2B@PRf)y?)vfGC_OjT9f8A(Q6invYpuZYwH;-y zHEt_utq~eY!v{d4C1TRTW@H8GOr@!?MoB_mVbaSj!O|IA_%LVwCdQXguGTQg;I^tj za-;{$tpaO}Fp|`M05si^1ckKD zMuC!Q$N^AAx9O}k(nOM8bHf85%V#>l_V}`HJ5`pAHP|GjjZ8qWM3jvruUAo}SGeaE z#Di;U&XVQ~n}H_SOkV`H)-@(>d8Aks2oFGZEnC^p$dU{!GuB91R=CO1Xp$l*S5iR9 z6r3bs8|&WE_1uli?^S`c4${pr6p&Ow0g?*b+!-l30#A>pB*`>O4}e&6!YcYrl>h#E zj@!lcS09q_D&67pKF3?DHOA1qlQib9`6Zd3SEGKT=0UHM?pL}w*R)>J&HEeQoaxAF z>!Df9Ot0iM^YYCscR|eT;$Bvvu^Nid<&DPvo81utlgVJCd z)LDwPYWK0FwK|@jeMx=xJu+&&9X-RPvmdtQPDP@L!!o%fU zWzSAXB*`psUkF>B$xJbQ_L+YGblWq9L|G~-C0WYf^!xGrIGRlV2OS0v1Tbh;1XlA7dn~^eH zrtXDZjYnGBebNRbX zKa+l|AmORD`U9Y9YYe2cDcOUPQ^RdBrkS^7i$i#+))>M(cv5v!v!04g-sGBz>pcLP zi3XI&-jb-CWGm&iR%kezWu?X1rlfgn^ctCpoDiK>W2=L2SakUVFt+ZRz*g_5`>URf z%8t!C?w{^!sC`Cq?? z|E=EtX88Z>JpT#!zuP&p#s3DlfBInmQ}BQEJpS$Qo8LR$`@i)4`3(Qm`;X84;(KX+ zkFNgz(EIiu;^xn<|0Uh~`0mf^f7w^B@^-h|mA8d&A0-ts3=C?H2LG1#)n@lkz*um< z0womy{}(`O@C&V2n|#Zo z5f+R2O-1&?zi!&^QG;Ll z8vN07U`Feazqg0~>RxoK*SDiqIw5mjp`AnOOHUK$L#c1)@E6R_P|BC*y{Gxgp8yoy z3Xst^m^o~{5CHhF_#b0!Mhr${q7@^1(~AZnCl3D?En|TBQ>~u)g`eT%=i4u|ynCn^ zo%K5|=WqEmX~H5uqtVSM>Cd@^?gy7`DpppT=ts;(rEbC+9Te zvc)&cuLXSj(#158+Yy7z{fW=ez}E&w!?4kq*o+<6UtD<*K6p5nk{w2y$PUK*F6}!P z?W0rn8wUjl!{UDeYQORUfJWf-V5bSH{y&^Of&F6(Rv!V+3ZL-N?n%wRi}uFZc~eIg zI6pdy^XxyBiBpA*bF6Xj|Abx75^>mkrX82_f8(E@f=q`TtzSRVU(ERRoA3e0J2^5g z{BN>-={p!An``sQY^N`hl z*lL#3EExQN`QsrnU05LZcNarIOv!$5H!NjfNQurcRA2EJbJBnz@+P$u5TtM!2y~=NkZj;gd%HD2vDx|xTe$R`A`#Lm3&zs#& ztv$ZDi&uEu^mai^-W8C8#}+F^um$2w9BT{H)st4O&jdub`E zD1P$d73>*K{>BzV=pBAoxSNQQu=}#ehTW?kvC%498W783GDJOEk3RsMcIOnQ$xjo% z_(v_D9_{0L9vt|%(P;4HcBAp$i*aH1st2q$(%0Or>f~ylR{e*$ChFfJ;K<-t4#N+U z4ozSXkn8WQZi68BHq=|o{0!>tezqdWiTd_ZX9M5v`<;H97iduaJQRHC@X;phcg}yK z%hw0e5ZsvkA1Tq-{I|{>k1gyQbE4$-2LNV)DC~Ai_UxNZG{pw?t**2C8fT*r>%{MF zjL9&6JA<)yWxr9Mm@l{69fc8KmwSt&8Svunm_I6QC83e_Ph3Sq&!E)BqKY*31^fp` z)8GS2JIE2N7VfWbGMlpo^fj~FFkR78?q-oa!$$rmRMGvd5Y=Y$gP>F&18Q{KuX0DV zk9b(J>2ib0L$ZIPbT7$G@Jqj!q5>fE`-?$=htpn{g#t_Su=u|Rrhu4`{ot~_{Q-cN zaYk>ll55`N@Waj4R@qp(A4+pODh>wFKlPxM@>>Hr;46WUoZnVGT!XI{cw?6=k67x@M zmM=bL08Rmq5AeT=*G*A?M`IrsJnFs`*OBZQNY@zdA!tEK{(2Dq5*QbV5o;X$ZQC07 zFOn)El(F&RgUPUV?YNful36FL@#`^Epu#TThPlaX@mHV$lt(MdY$j8;fxn*E9Uingl<&grHHAVZcNv2=2^E z(${ZmqJJMKXUB>5ABczh3<3)f?m^p(z3NLWgJ^YT$vGs@a#tI!LmPJ!Q0mrFnZLSs zwl|<@55D9u@Jp@sZ5R-!iaDy>U+v6(GV3=U`IGtI(&j!dKLF&L#s|59e?tdB5=8vA zr3r`z_#k5Qu`^RSdvehLJgND*HV%Ldd@zI-lw$)CXN&&_h$CQck3-C_PlA>KbB+#j zIzimvoP4FVo9j(i#B%ShCnabribfWVSm5VsTr(2d1Y0h2P^*OtthqG~9d^w{OfC@I zY9o(bb8Czyu;wDpdAKb^=I53kR*_#}@=R9|erZMPgAF3)Dvt9umk=1I!~u5iQVXga z_bR@mVlb_;#Ru>ogGPbcjHr71{Z)Qnb(5tzxG6`r%83EF0T>WW_Je!F(gsk91^5kw zpoO9dy)W-H4m@m~&%1B2vcwOEd_lgSIyZj#0U+f0ri1$( z%OtRN-*HuQo~ilEk3tlKCjD*0C~!UJwc@&d$O@WZujFj9H2i6 zfd3|F1t_N#!2d-s0(?3mj$Qu=YDN4;wQZ_tO8akE*sM`1hoAT#wc=bEyMvq!IOBIc z{!_TKdphIuv%`P$K51Y4$1e>E+jqg)K%WuqnWY4;;XtH5v~&g^ws~F75P(v*;@@xh z@8XAMfCl@9kwx(*_+TKVV1Ldvv%lYc?RVJq1aw_-`2pZ%gO`GJ+}$`DW5Ka*&mMKB z%*PE*JGaCV%{c(2Rtsu*>tRk3z zEoSoeuxHoQN&yeSp*Gmf9H}N&N?*lUcW-S)Dj@T_iy;{wPrGhLc8r*#!GF>FaKw2z znE>a-$9@qnTE0lz=?8#Ug%4k=5AT?F@$(a$XKsw47~GJ4B8mS}9izbLMYLjMAA7mg z>^Vd0*j))jy06fb1Y5Sc@KQO_5JXPCQX)tqTj7T`Dfn}(kgfCq!!LIdGt zkWB~<`eS7f_oQijy>jfftfvItq98sD8<8+stIqLjm*(i+>kI z!VHD#Xb$_0YaRB{jNA;rHp8p<`Mvw7qw3DE>bGT7@QJR>m zj!E{udp_Vi^ZvBos678tlL23vN-OZCc5542gOz_L{+a#^@#HJXFu;JY_+JLo!OOP4 zc?J#u+98tLnE!sJ-=myY9|S&r^fwyl7{B`iCeDBjTzpyQ?~x1Pi`0!#FFL$Pe|^At zLozQ;^PMy=h7USjmtSW;7+XuW(IkI3%6|79 z%>4S+{qP0{#=pnGizUOy)pT?Hb3;giyR@&w;{=y&A{p(l!F|Efj^~Q~Lc9OC7TmZ0 zweYu3?v3v?9a6lr8gk$)pLk?}poznuUd$xowTLC|!nYk>Q*RgFE&P)q^)P=p%07KB zy*}%8)_(C~@~-{i1HhTE7rzupc}FAJah(^QXO3OA%*PFC*H>-GgR0)`WWg@?2KU8Q zyXmwCyWBUp<6GXsEa9`6=f$`031P;w1Kd*6{+95+nTY!aU%xGy25vM*dM-PE4V~At z%%OB9Ml`%u`LW@iz{icQ8hmvC&A@&j8L-cOnf-9kb@_GnqdR%gdY7I)0PFshLIalARugAPrj7cv%T7eg`cha;CyilJmGha(P)Z>e47>u%$MSTVA1dH%=Tt>?jitK)yaqIfQ0`9is`TjkNoyuWC$B6TB0 zSTwZA0WxX91QIR1Ic&Z{8g|MCSuJ~{i+WWA^Br5%CLs6w>+8*Fcz(?5?0Mbe41>Vq z!dh@$dY!Eu-rP@H*M4ide*jn$Ri5^jf~0-yo;N?w+!#VJxFP*iay^DD_;iZuX#?c` z#`?w9Ixc_ADU()w5IANeBDq5Jyh1RurZ-ee7x#q{YO*8(B)gZ&8CK3ze~?2}y??e)Z~3_WO8!Pan*r zIryN(D5Vh?O!m$*S@k9VgJIXD*V&Iw|DttH`v-tbYzMy-Y^!dP=grSEH(GyGe4~Gp zFb1@6W3IECf;~kWu+M(X(i(i+=%PXKAIc>u@PR2)t#RQ7b}^hP+_(*K*qT{)|A8#Y zWLMF{Sna$5+abqict)FIKc?K@UNLI6#m5&7{}gKR`zsE~^M+Ml000mGNkl6l` zhhl|(FLJ-K=to2EPXJCkliVQ{3i=o1bTH%>JnOM*k*xJ?6EdwYoM_ zn+LxmypYm1aD9O9Wb<$NMQ?o^udJdOyMa&hIIooCWP$Q{tIX96mNR#0?<(CipPmUq=Q^jX4C!(cA&IKUg;i`Jz7#dg~IGI?5c zGjZPhJaeP@C zD+`ek`NoBj)jDk(Rd=oT(xzqo>;yCj8-B#ACEt)!_&YS|O|$C&m&=K-a7UXp`1Hdb zLFN?>RTKmnepqH0(H~pk<~72NLO_HZ3dqpG~k|zltUR zncrDoX-*TcKjL|2uYa5UV9<5xb@uJ^Qs}L5_Bj6&fER`Pc6ZtH=I5Cky+10x(O(iq z0J)n*25eGKC|ZCgH8-^1Z%N0Zx2&S+Gm2OfN|9IO2@2(yb!)mZ-xHbK_@dO-kYhpi zl_s=17g}^!hc^1{(3?s_&1tOUP6C%V zOHKG;;R2j%$4CC$QU#6**cC_B!f=o?EK+(e)Z>sIycYd6^SJuFfLn-c_^ahF4Jtyp z+NfCh^O*ZN&wiNsTJ!Tp=a~=Bp38r2$nP}f=zOTet~h=G_|h5nZO++!WgIDDm=k+&`~8EgI+(>IW_bjk6Vk1nHs z%7cue@Uz7agibc7u%g-uW@nq^!caweXW>B3<8SZ96KUHPrabPdiI`kM&{#kU3&O|V z2bDXF4r_K~nwJGo#M$B}kj_Y{Qx|?G8b}$=HGn8~kVX zyWN(v&>Si({#!V2aGrT<(7uQvV4uBYugk8pmyKT~H?8Ln02{%pp7-;=+Wh`8-cVkj z{5pGk+?U#{^M0o-AB|4X==iNDtpA2YZaN^uGw|mPE2fq&g2OZsTK<1P*h?V@vJGE6 z&orR$WKr-wxJQ1w!}9+tfj_{=O>d}3VLMVHxjj8O5@`7>w@QYUTNgwIY>t2QV~&&m zDDe%b&B=oj6@_Xw`ZSpW$g3SG%&!oVZGBHyyG`GB{#ioLyA2T3Px82f|*g&HWCjW+q z_8|Cxpx-Oh_E`m!`Mt$U`btuQG=Bb1LUR!6G-$gx=j0edzyle8=p5h&wM;|G++oA%x&+oj2H3k zP7j4?aQy&~h=;9i$j_UfXI`|W5WJ9mnm!*v27EYy7U07+xtw+&bHC>^3G65EAvR;L zI$>!W*holi=ttCPk4RvJxQ9p0Z;I(%r5dCkjl>oF-d{NrZ~t*uJ^PQ&UQvIst+!Eg z)&HISM{WH-^1~?kItKf%AVzGPlLXu3o{Y1*-AfuvW6;81G)w_sAMur@Gy%uc?b)O5 zW9H34*Jan)J7+%CwATOn&2J35Xx`@AqoKfWlj=>6r%Vg8wdZ5B!H1V~dVbmTF?K&@DXAG{J?THlV>Q^RF%BrVe_=Ms`9Ki~p^H5(Ey2 z_`-G>PN3-to0|+QNYpR6zcPiU;Nvszo9x+-haDTdIq16VI(t0C14ga?^+5hms_rKh z=b4j&px-Wx2KVgwnDflN&cCDLRN!~IuU+?(w!f_;a$mLfR!mJZ?y>=Kw|hv-LJ#oo zfH43qf0cXqt5y;ZQTwf@DD4M^$=dy^ND5?5SI*;efF0HbI}IE?LYw{IvLz2Pci|(g zD0&WMQO2KuEcBg_b0_%MQguPey|p+IxFv3)u5ZIIEtUTWq*FVm*Wd)2kg&NM)2DB8 z-=mlUzSr@ao%Sc&v)`QCdc8U5y6igJCU4AZ>X$wMoFDi+^Wv~?7ryA5(u@F!O73|k ziLPB*fNRyG?3de}%w|g9L;}4^6#H*oRa*Rqg4b&!GBNhzD#{1s-d-Bv-Kq5= zoE4t9yVc^Nu0>msBnX>=jKxO-kiaG$9y9@aW)dr<8itewd z!@jO6YA@&orRBb9H?G3=8ps^JB|UKp_b#HqUhyrKDc|bleP{?g_+;BRfd!v*zE%6? zkn6JR?5%TcM8EU_U^7Y7+qdv`p@!aE*CVd8w?=%SMV>=Dkh$;sOaM1K^Xmzq1l%l} zWYi1Ca*_R4@=<{V_3!bULql!gzv+nYR)FWip z1u@86_qQEpvUG7#qA1D`b-IcfgB@n3@Chi}>EXSVHm#lHdz=O^Z*92aR?R-n4Q+c# zq0-V}@&d5cx9h7Yy?`?Zq9w7EFITi0!eFq2#e?y_?ufavO6S$3a_A9=^B!z2c3*{V z|8jf$X=Og#SB^{*Ft;Y!vt+)AH;0^;kpbU3;}<^woF8n>+2Bs}6}VY)AzM2|+-x(`n@j4J(}_NJDNq&zD`MxC=xsjTVw*yR;<2T>%j zB(VU00W=7@`s^Us)n4UnI(L4}*o%v^fV|d~g5a2Y~&+?;X|ro5#L*ouBPI zb9?+3TI5+@Zl~6K3XS^@uY6X1VJ+PGQEosxhZ7M6c34E8CQ2l%7k zK6l$B=53QABVX;y^B@DN>~o0&@WK*`F@LSsdmg@>UUY~g{%?a>%)st(b#^L2uOwJO zGC2GbFlYSJb*~D@pEM%Xz-tAZC@*PV6QGJ{X!=@KYkt)eyURvO@OiTRbwch1CV384 z|FTbrFGY`%%N;(d-HN}`aNlIlZcp*&`g$Ns3WYu||J9sbs;7#@T+ zeBy5*dJemO`_6AK%pKa3oX(E!TcF*`nI8>f!g~$gue_QUU8}8oJb|maeU5st&pu;o zpSqjg+U?GT9Nf?%12?4qQ4;P6+&Xj!!@ex4!lJK7d8xe?P!FzEue0@Cq;~qzxoQRR zPj$br)9w8>pH;_QoZ0u!byBJ0p3U0vJI?fV$b9(rqK>#s++J2$R>kGL~!SurKv3pVX`=gYF}-x<2=XD4@OcP|bBnm)Ooc5WS?y?tl)e|@?-1H% zix(6rD~iVo-4;1O=4_D`v?j$GPsu4jSv0LUTX%O48@c>_KztBg5a=^p3gOP(jRG+A zb2NCos~q`nA?B=h`mZ~_IqXMYoi|H+S)40~H4c8Vw?y;%{Lj>24UP>fv+72?_VW(_ zk&fhQBR^Y4ftk(G+9%>ujoR%rp^seH;NP{;=cm0Oem0GQTWyy5i&DguM(M}vPQO(X zF~h-O{14-t@iSPP%S+AlMQ>OG+n zUONCm?SuCOYVt(>EiGdMw|i1B#Bsl87Ufwkcr@R_+VjqPZq%%{o@sx-HTQg9XPm`+ zUq<&+O$csT?gN~QV@_5CH+=xe0$KvNu=o{6rt%-`4_ZEu-Z;>Q-8SVL>c%;~C&}~i zLG6wQYV>knq=evQ-6EidH&U>qwjp}+?-aa%-M+lSw>u>v#8y3CMrE}_%J|W+04@Wr zA=BA!>BWR1=o%Ld>nLWW6hYRk+H$le&U8s?SCGWlm4=+rPr%IC|-UOHd(~0B(1$(h^hn%Cyl_TSgb`r@z&e`2000mGNkldlu3*d$n}L^{0Bhs_+-0Gp49vnozH>~+ALg9!{P1Y%C7rb zwdQ+#LwG~d+pX`7k7`Gk$(wrQ*J$=z#iVWA(NK6~4-Cz~A+aM6g8IkN)vLa%8Ts!5 zKhT?---GVXt$O^W)wsut^FfhE6$Qfc|~!Y|%iqH>Lc|C-eRj@+NS;_%@k zoagP?S(75Q{m;I974>UlEv%?zxk}ubRZ45kimEFo zDl_fp>BuyBgkc+PinTDo+_1Hx?l#wMN$b~(bk~K0KK#j&026r@AOs^%d9!JUY%z@v}$$;2x2J%{fl!jq(|F>yxef>q+r-^A7+N1%bZ@3W2{+0Q^P6^q*E!4(>xlm;D*uU}-p&LA;Op zZ>8U<&qLAY_@RGMeoVy||CpJkA_EgSf{Roap#hz^a?){dZ`Zx*Ni#IthDY+qP%MxD za$^yK7!kbnH*d0bekrYG{)6pYbvxs|q^|bIunPat#Toeb+^e;(ovA-F8r#){ATV@4 z!=1gOwC73npgS8jD29Nped>(j;oa-O5x_n53)Ra;$J4=pwX<_v><0e9jr=*NI?uk5NpCXAZH<_=qNVPbW5ZTO z&*~xpHF~|Hr5d0PYj=OdsezV#R#p5qAnNavt=Ji#Q48~=pU9D;fIC$MKC7X zXFs^xmg4a&)${>?guf1OUg5UzRik6RwqExdAJrEOB_K=I zIOlHoAC{*H4?5kJ-VnOPw{(`H`%3XDKXq(k4487;V6TD&y@UXCA{@woo&U%V3D)X` z3y82q)d7=l`6?~IHpCA-6*)j=UC_YxmDVprpb@yBg^vxjzze(M z(dG6^N*-J`A$d!L@CE1tUdX zw;S>aYJ7HjtIf|_Rkw<0z2a8kFNruyeOh$@F{qJtzWPA!pRO;?obKoHCQyP)QGQ%5 ztVdF=sJ6<+(w`tZH_88cCy?MHe)FE-eLaB;w&hP zoEw)p+((D0dzsk#N{QP#t+{o!*5ty_A6!UAikUzRH35ab*4W8E-r@||{@M{3@``Y&fQbtE&&&)Es3gU{Z-MOoV4{KS-Nz}7DX9d6{PZc1s%5KB3x}t zAG*5EHz~4JXnVC;=c{Mw$}PfA>0fhW)@siOuF4#%Du?p<4PU0;IlfeV5uafy3Q?~N zClX=BC)az3VnJigNg`m!3%UW51#?Uk7%G?%E#75vXjfT|@dKk`=OvX~Ex+@f@)q}~ z!I>C-o_1vB{8ytlht)E6z=^N`{}(`O@S^o9=^p^r#A%=Pr_8DFy#&Aa=MlHhwHuck z?ecGMv;@Ggu796RybBDh_^hq}8W}ERZAO60V?ei1> z8y6v{3?5K~SzdHd%Cxm48@rlZ6aUHDRr4s$4KE6_?Chjjb8JNwXc@#nAuN#l$7?^8 zV}UpfDiHD4><3N%qTi{sABphc+Yu2`s?h;e&@&+tD11sCs!H`OHo}lE9Ss zZor81j$}b7@Il1MLW7|2LBtO&rKPavLgK*SgTW5==#dA`dN;dq4`ht z;=ZyS_mkPxmntZ^tO&8hE8xMzLu4o!pG?S_Kl&!rw6G=i5!Yq0Z;U2fJ3U zI7R{gS3=~_$HDfh_=CJgd3B7z0w*Ks!R_sC6}mtl$&?;MwoGq+NE}5wkjV=QWG;Mo z5b@rk0N2@b#lG$(OGEHVhz5L1_o~m5XEa#oB}4%hx`ku{jp`Brd2ayoP2f zZ~NDdy}oGkS~V+r4X@#hS#}!r`cuV4g7=P?$z2oE5L}dPn>W6Iz0*ru-5LlRdYM0S;p9 zveV@21mzV)->MZRufojq>Al0uirEBvafSX;hNuf#(B>9RD?NA5K@W~<*oxwP>z;Lt zRmv)gnLBkSvbYEWjf*gBqq_+n>uufXX)}fcBLQr>U^1rUogj)Yv?1wM4oBKTeU!G- zoRV6$LS_3E!hQCXjk2(Np|Ww%ED-Gn6qj5@^NJj{X9xl!!^JAp!V|P&hDcvQ6(xYl z4%p!;2j&$~)KQ3g#zskz17xli5^$v|T75&mOK@rt=gWM}pw;(TXmnw{m| z;AscUU-s3TeS7cX9zd?9J;*hXzw8sH1-%pObQ=ac)Exba$7A%mvUF5)&gaD1i z4Vd><dOImQ+?rNQ15mZq6U|Bi@&KtFuJdY!U{@&aBBkv8 zMIVQ6s>90s`MNu|=`ewBoRwb3KKdFsi3J|?jT+F2#UU41Qav19@qkh%MJ+1<3lTO! z0caZ?5E!*66Sxicndd_)v>+Z`!+CkoW>Gm*YvotfoMx!^0?+MK4r{n98#d>x#b zrq~tmzmNML05-4Z?;Y<)pBsO^*DgAJ@yz#I{nPgmC*>RsqWJA29?M;;vb)lzQ-zlC zYoId(?%dj3?OT%f4-=JJ)6O2qK@3ky1zLKo$$zoXT}x1aqiW9{b+4G-r#r7Ip5`Ak z=B0GE{nB;`?{<-HuAC#K{VOTfU)-`#8=Pl`7!B~2gI>dwIl5jy(F>zcYf`)pqC#H) zT))@XRiU6H{JYjic%f$Y-y$GD?J~R?ANH4mL&Xgu&T}pO>gY|g4Rw8>CCh(0dwfjc zo)*Ew@F0J1!22Hn4pY8IjPri+VT`69AM|;v^*)F*9vtcU@I&*$M|#k|nGcdL5bdCG zn|)R%9?qa2n9Jza8PcE=;h_4_oA-|sNO)7jI`LwAshgTHqk_8r+2_TKHSM(`vsGxi z344A;m#a!NlX>gQ` znVx3@N8u^+P;UO7M3LZcpca=1Pey#SuJA2#1mO=0>%H9xo*?{cVT#YJySp`Yxff-D z%zlvsEsI;!JYe!!cJnIIIed#?u?oiu;b6`@lsQK{w&bkqd?HAvF|^==WWjCO!9AuLXQ|ke4H7XJ2rQ^qrcRAwOO6?otCxNVW&AbBxd6J z1Hg?2bGv^cS`N8{pPcBt)twh68W1Nq?-q(~Z%XM7dYwCi>1_t(it)!!E!>zx$wo6# z`mG`QKCK;p%Fl_x)VT)GphjsQ(?|o0w`&EXx4pbZr;Sv-?Kn!y000mGNkl5<9ki!Ts<<# zz+j$v^D*D-L=$j(bQUuc+%BGkxzm(*C-`c!cMkAI&5JW%e*k!6-g!x!B&@Y>1xwe+ zCGv%vUL5a~pLD-&b)Bs(LxTmCeYro7(rYI#da{KizybIU0^q^v_F9oj5vO-OLem*4 z>~Ph5r70^HT2fV0^?9eRh$s>jS(B|W!-WHO<3b0jw0W3-Cu&gCyeJOHy}kTiREV96 zM9#z}3JtcR_*r(lwG4I-YgdsyM`?Zb)|8!Lx{B~>4GqsC;O$Oy`U|w za-<@)u|*shMMS_FRovR<;(kt(N>J&VP3=q-g+&!IzKVHpueeI>?xo&YN+@V~A8Wg% zYvdAn<|01J9rzHh_8?3|XcHxO&nofG`nVYlKpj538r$X>+r{;1>ih%1@nj#)iXYU~ z&h3f72O~Z#kIA$F5$|oihkY(sG_N~_+Q04(mLCKZ2?KanFC-c)fK_&um7?5WWI?sJz_ zvFM_wTPAB_>>t1Cnas~p{o=m)ReaxX%h#-lsEB8UZS*Ze?N&$vq-RVBw)%xc2L>Hc zy$2#N^3`*W4OD90_1Z6``12}rW*ZeL`Lmjuth1~CrZ+uvy;&HGOL@{V!E_4;I?)}m zt*DuvIdfET80`d!UQ`42qGaj(3r9jfhwKaGCQVWCX>~XE?bTHz_)BQq)hg}O)z;m_ z*~2TIBlb>dk*H`6Fxd*LSCIiSu?RuLSJuyf7_7Zj2o2=+MeOjc)762)qp_gnU7?QX zVriO>0Y~wHxhYeflv;93gDPxXq`+XR2M20&WB)zz00t$o2be*{B=T#kz}M)xH%nu8C5&J*{(n6z{AHj$4(Me!nKK!gLkkdd2hgvTLbl z=?KgV@PJtlZCqr)VD=swFnSPyp(g@^sUBRvhe|EG6cT6|Sdvp%tp3krSw=xIGhpq? zz9>Q<_r*d5kjZM9_m`t(8AuXxYW0(>x~qV=W;Q#?70BSQ_wl^qr1!^-qCvHFKbiGQ z^!x#U6M$bDHn--FI%ejV#{Obk?t%7U@o(Uv{6@zU$(IHlzD!U1(g19ZDVq0|O~xsu z-5xd)f|kD@9r6pY)j>|WK@4va90LhCzsxar!4#dkC=Xe*pOry)~W&;~t3awt1|hIY@=`2Y{6Lw!6$#`y(Ur z{`#;y5Bg%O-1Z}%mqg%JqYz`$-*wi%CwKBzn}di_kP|)bPR`E0{+@F>PR_OmPZzMJ zS~}CiUkgU&o=5YO9;EIyF?*slUFAu|$@$dASMlAvWBB$57qh^vQE?A13P_iScT#R0 zpo(T~97;J{Aos1+Yv&2k3l>Bi_C;Cyw%t`m2P|EH{AT3UMGR{6#va9C)gu1wgG7lv zUC1&{g(O0V{|9*WWFH;j<7RV%IeK)G$KpTx0Py%^R|Q{uLSJlkb>cbq+e71AWz9Vw}B>=%q>YYpo?VogWFmDSv^0~E}6J(Kjxyr0{Q5G+?NX-U_S4Q z*sCJ6fKg$u^t~SiKw|0w|1RISah_~-)b<0+z1eTn&TyNx5BpBhI0@sKqXaE;Y0v@V zgNAzaXKcr->W=)xsK?MLn38iabd~R~-IKBtx)%4na3?h?G86&1>k2yTnxA4GF2Zh= zC6@WM#rc1&`M&X2M}D>0{=75$L6puq-bWJoLF;YlvGtMJ7VgLoO4oMZYegrpPT0gZ zWmF;s_-7yw&hpOlXNkar{YDQ!HZ1-G5)Bv|Z$Eatin7JD+1Y4i&B12%N^T_%JBs3U zzLkSuB3`7e_9!yN?p&yVYjFg>KUwF}R=jK7O+F}Audp?0dyum9oX{j;;{90Cp#I#R z&4!=O?nFBtesfooQ$^1!u?1Ru zWRB*>A4jeEzn*;~emb^IeYeer<#Df{wi(BN(CLAc{txAp>@hVW0987?8nYibhyVhi zhU^M5gA>PRc42o8>TRZx-eak# zDeb#t(iR=Mq}bg9;jEO^#y-o4K+7h#F>jg2Z5|ao5}%&`J6+WN<3=Ah&>?Ovjr!M3 z>02`OPjz#Y68GE>%YBGGihiSw_d0wlRd%~S9Qsh+N9y*vzds%dP-Vlb@w;~|O=%Xnf6yEV_0sRz2imLW4Gr(XGrN!YkEMWZ)*Fq? z5{|?RFY2oOvBEPE{Qrd!GU~G*+*6x-;A>9I<362IPwbEElSK{aH3Xm&+4-@UXY%ao zQV*>wMbFW*zE(SBYx~>1^lT2jY`(U=5}8~tDN6(<((=qr z*6v))1b4Kq`8~0>-))aZ?ivL5aih^-c+njDJ^b1SfUh3>OU=I2Mo<4ir-#x9a-Cx= z>VPvie5YbNfdc{XXKdMtEdD+a`&_N4{e&c66k1c8E@F@Zp?G$7)EC={riBnN`C$$mDtV^_x;;q)y92aRou%$Z9 z)WD>vu*<7hDMbn(<1714*paEcCzRB3x3V>=yNQ>lWt*$itTIK=!T`DJ+S9NAb+efE zUeb)Fkbe)fyIuKv;?pBM8hP49iLW)XkDj-^xPIjW!13OX%!_klw}q38NMklLRy4@M4LIuX1a>P3I(UjN0gS%Hhgs< zTV#RBTE2>c!0am8EyQM}lm;_7Gi+Q%E|8fP+!-d}8^KxM;B(6zx89F#RaB|S#a5<> z04Ct+9*_+br2@fWiz#7#$;H;$c;_f80w!x*MH`Tb6=B%my#!K&v_vbAQ#_$?S!IcP zm=Z;`Wl9uhia5141-4$~Oo<{GSJ4)b8!ISmaBgV~YGCHRRBlaIvEsY7Wx+4hHbe)u z$(6huNWwZ9TaaOc zm-Pe6vPc8`OEi(6Pr??;`_5YX5oa((u@+xMqS<;vG?x3rD*W1ter|nJ>(z?dEo6Xm z?ed2g3t|bI>1k1~7e#`W@wGagxpYDg)ogt&w*cO;#_dZGbXeD}8_Bh+xZU|gduJ^7 z;CA$j5Ib0TL3E3gAp9 zwe@eps_!pBf4SU=`Jnp2F{aWx^R6}HKBmUI;K5htfpjt0<_jug%95Cf6rAPY1Qu=2CMRafjTNbg-9k1k zuBndz%s?~0ad6vTRkP0piw4xVdhDQb`@N2psyYXeG6uGZb`Ld&3e<>wN<+Mfx$BE2 zH^rRoM|bw4cAr4yUtRB=W&8}H{?h}|BQX65K#0gT19PXC zxwUq!=V^2{l;n8wNdj+L+CC|cK@lbN*NMWhl<+Qt=^m*Y=MDW&^r0@uWPg%BxuFk1 z*hy4_L+U_`U!ZCQdknBRp}oFFP1bJ4<@E5I5CcZyk3HQ6^RF;YB=HFT#M_=r$AEwT z0BZ1l@$}1gZZmxV$cgv;&klO_YW}e68@F>lF=z03gS@V&boBLShXZ)EVZqX8 zLrDQEXesa)40eKY+^ft)n-8{r9rH>h5*LWwteWwiEwCt|7ixr_EX%1zI=qsd9t3Hs zFAiI;B0}(IfmOI$#jA@_4b6y{R?uOmWDY{m?3iELq-sr(^{dF+LG-lHKwvWlSJZbx zG2;v-JHhtXOIa6Gr>H5|bt@vlzu17{b(ORFB4q3gD5EVqAMrnrx`MpG6aHypEic3#$x0#MH-RgDi zb@uMeyE>+UgMLdMR2Rg@4Gz73;RC>7#(m=Z_jiBxyUK@W=6mVgQP1j_6nIvNdUsnp z4sC$^_`|ATpW2`48@vAQGxuQ5%%n(3E%o>j8IZdyG){HLBj1Xui+fQYR-_VIQpi79 zQ$7Oz`HZCRbmF#d6V^ApqPf6iEnRWGu#qAT|6QAV;AhmHMW&+YTtexDiLkRP%Vv#c zL{f?5DmpIDvrQ@W@Q<-SeuU!tB1C%^)tse&)C!#C zE5GaUQ&Vs3R0di(VRQd+lWz9k=~z6M)AOV=qx+|^{Q&U(8Q-tW4}vZL4h!)A4*Q9) zfOBAZQ^tP+>YnIdX^Y+#ii_&*E}I_?4nUZc6*gVu1uX>4ObX{o%&ek8&fbWqbu@L# zh*?*u(jp$nSY<4(P6vU7bd;tpumTpy)xrz7kU)H_A`(Pwip{TLrst_;^6cy)S5Oow z4&p+lLyG+>q6IIy1^@OMzkCtyMGh`lJ}UK(L; z?RdFPG}f{R!W+ProU!#n2CAqi9gwS4lmK$aDslxaWzAvz3KpWYT(RcZdMUF~HExM& z>RuDaeaaq!O4L1S=LmK@10wU|q5?e_j>SbDL~Nn)hE^{Zl$I%#`{MqzBS)hqaDEgN z=h<&(m_(># zCG83I-!NP3U9<1RvbCFNW=YmiIj!m+cKVaWlKg+z-bVe?gWPX!MP_CcIq93;l;Rv= zm2aymTCg!AAGN{A*0rgsl+v1A{rX=kYJM|QzHyV0z~9KQ>LioWah^oEJ5+e5P=elS zYfnL)%1_IzU#NPJoN;y(9pNNpb|a1LydOsWL~8k&dTw#ZyTBciII6|fp9&ODdN8)K zbsI^t*4NjlXegO=ozUhZmF)F)^HR-GS{o_;TSg+#1>K3vVxxbuy(GA$<9OIc0Uak^tn^e z*{y>#V=H=07QLU8T7}`wQOqE!XN_}-<*PBxM20YYEHS{}qh?E+W9BcXAuU^XkjX3b z;64hZZ#W%CMkyx?l|pGmwxYCPWK5y~8&~NGxWZN;w;!o8X)mg(FnKJ8Z^gLS0saKY zhEj?uiqZkOV(fq;qf!GFr8{dMUb~)+W41#h8s$e(sFj(c@61}Ps&%=plPz*nG^@ho z*>V-dV5B?>R&>OoVnG4L&B%)dQ&GISm~nnPUdkLvXUG)ee;%G}W#u-gsA562{yId_P*sJ=}olX_yS>IA8V?d2|`*n6#@h+Dq;e+05 z3Oak?tf}V>r~q^d`!D~+Q6E*p>H~89YgciXK3%>9W(O{3zBQ1i2>`G00nW7OC)szvMLNnh=+iPSeR}o*N1adD|Q8pm= ztE>1KzRtwRi)QRkqpRe*Sk5I z70ot>ZLcC0$kg{^cjk>eu+u*KY-Md+5a6`WkWStYMZi>v&9Kidz77H%y^;L>UV7%c zux`|4RMvD((?v$+&N`d*CLcfNuy@Aa)?A)PNv(K(K3g$%`IYVVxFme=FjG}_b(S3d z1ODgtupavR9rJ{EVyn%X>W896I+a%S$G%c)Je1*~h|Xan_rw-`Lq@%9Io58dCMw1+ zAuW(mz4llooUjm}#l=eVFryaM!A2^fsHUXY-lp z$kyhoNK`}>x9rxuy*0nk0lU{l-DN0l*!lu;RDkVaT75K^0vZp1HcY$g=&ejvo;sFoxwk5N`^ejzR?wft3 z`U@}f_<=J`@aU?4<2cq1Wcj+TOZ~5fb8FX93z!xbKf!e=b~m(PoxHhG1CWQspRpb5 zlKOpIKLj|j-)Mc_L^TLx`qvk~AyNvHtEjF++XGQ`^G+uqw*O?V_fp>%$N}Xq)^-$S z4Hz$%qvh_Cjhc+8g$v*OPcV8kI|#wdejI(hB@MxYlZ71Xe*%E>pngcN9^g>j_I59d zx6hWR<|f&9&2DOaDSP_Gc4*i1@SufmBKH4yNd%sGZ}S$uQQsYcj$qyHZ?$W`>M-!d zJS3pbl~}9#ulHFxM_1K*Wo3Q$?W#k|wIBYk?!9$w9~U9?sU_J%w#PE#F=YYBsP z>-W+H-Kjb4FhH)++F=%^+sahs+|&9+HsB;eA#?biOPeGH5+xU9McvJ?#)Y#&{Du;{ zu2r>({V?LSOuiPT!8xDxot5Xw6L2{VS#Zb z7Z$t@Td!i~GK))u+`5~EHLez50?-vRGxw~D*k`3!2u;EOF{g|CRc~v3?8QZ&odh1_ zTq%`d2RUb&m*G;0wCwFm#ok8^{!V^sJD06qt1Gx}Y^QzNQ)WSp6LM&mc+L@!Wo~vn7I=P2ry!o`mxoN^JH1>N*(sQ-Q)+r`MQO8Fxh9#7_w~*B;d$6M`hreuoXdP`e5p~-CX-he zf4EBxsLZ-6qhH&#{QoCO(JFWpdmmNMCqvZB- zZ{*_){sDji&mMu)TJv`bUA_xOeB5!{WJ^A}oqdPbr+xKCcGV%zEPmRul?RJuUP;=r zt(ZyI_%`!7D&8|Q$uD-ARm!-kWd|_#!2ML^s0$AZJl`GLoMj|OKkFCSfRl)T0(hC@ zQUZxg%i)0*$`AoR5DpN}3KtuIw=9kUA!ycV`C6{Fc14VB)NMmeAc`W6c|NR@QjwTQ zTO#v|5_i}L1WILG4_z@cL@scrD)QcG92!cDizX~SAa)6X!x{J3h_H?pG?OX$m1Up% zDfMbmq%(%h!w8z~TsUD{9#c{e;sc7kQW%$H7)MdX_5Bnx35pfB)-FZOduG(iz^>|5 z&sX`}^IUtL$@NeDU+Ee@y*Ug6fcXaV5?R?l0KBZ41UiA%_-)+-DX>6p|J=5V;R3U^ zvURWh@n;RuE#x~r6de0jhCPEq;%ckMo>6n`^~~(+KNv$+HNLbFKEzxV{f|w$PWRt^ zeLWOPJQxLsRW%2CBC00(gq4H@kbAaJ2Y5=m|8UM(?eR5EC+{+soSq>PweIW_=l}>s4BvM!hdAN{A~Se7%p(s&=0ou2pzVv zhyBj|_oC=?v@msc_3C^IiO(##P0nA}!As*0P8RAR`~$$Fd-RuxDzwaf)8#?4*%x)9 z`Eh=)Ej?G%0LVC(E&c_fY?43%$SX@OP_;EG?G#01hQgMy)%rUOTGJ)#OPiv1R*C-V zTTU9lEA3f)ccQM_%5L{jv`w4$2vM`m*ozBUQGF@J44ABqYmO4Hgq8?)Ah*>L0hmU) z%hvgxfGOsq5iBUgBm-9TKXX{ViUPr9a_bV|N~~26H^as?(>ao_WxV^LfB*mx07*na zRK0nzqOyS8f7=yjES$LLnCTu2u46=&FRu|H+e>?m$mYAJ4UJPOi6y$Z^0W+*td@b6 z?1r@U3<@w9i>uPEY;MaCRj|9DWwId$2B%2N`~bzuNF2N=*8`ji_Crx7B+$yt#;=Of zPJ%5`aXhTt?JASLY&EaQq8`jKS@Wy-Zd1JDOxNIx^uT1zuj0FHV{!r0m3@V=pu@kk zAw1g3uxHSW_{?7AqDC5jaI*a#$z20A3jaUT!np;n`my?3o2-8he$Uo_{pDD@=S>${ znLEqRxf9ak1pcY&B=^C6`d^Sy-}={2fxENa<$m;K)(!rg=#`RSN&blX5eH;GShTO7 zUg-tqX5_)lE>U|H3#&7(jAEJrxpgrU)M!dgfi3-N4c{xkmWxtQi>h{!j8H(f^=LL~>O{4Y1mVB(OV|>Xv7+tJ=3yE$=VFKELa9 z#*JR%d%S6B4qCXH;&&bOYxZ7T-y79~X909i;~e7uEWUT%bJhN=`=4!lZQS>58_%np zpK8q@^*;ev6Fo*jfCb@We*tv_J7547gpW;#6cm1d_$l~0Y--+W=|$RjS7|8v1}Vk& z&6I1ZC|yx^wXzNym)bi$nCelrdNrPR>bDJMS&Qf@XhjWfOKy$leLJQPGz5^e8F?%s zU@^8jm9n_zP?2s(dM`8rZl(GnnSJL^XA9nQmZd>*%bd5QU&+ zx|)$U797X2y7dHn4{#uW{AQXrMkWN1!15v z?2Xaaw0T}n<_xaWrV`g;-RT8NI&s&UtF2#m>q6HG6>51e&g5vRGt>15D5%v$jw$cV zypgx1#&p30xzn1t5e;vWd*{jw#qgAAulW#8xgaH*`TDz@XkT-VDB$VTrN((j>2aLH zgU))i-Oz(=GL!TIc07mbYsU5$N&lMGG-35_?&{C?ChwV`SGD)l9(RX=9vmFzgGgjQ zxJyg>9dgmjrn8_&-O0_e|GuJedMC;Xfvy7H(4 zLo-K%KYA!ZdnO2Khdmrkgi!Bs$c>2HYQl(HG;cKLA`5K6uB!>T;6fJ2b!@gnuGGqbWPf-QYhgZxcqB;_n=VS9V2H zyfUhgM7vhB5HYPtP2?d!bs%pM$I6+RqgO3w^&E}bJzv?nOWPg!T1)6m`h`UCShJR> z_~RXl;g#Vw52noe(o!%F@!1_@Gg5n9r&; z@T~?EfzR$i)9)?D+*2M@?|%R|w0fW5QO(udQDDwIilRl>N5$V3>(i`0HF1>Qc?vpv zaF79&A94o*A!v!@Hs(EZ+2=B8`lhyVEq|1E{MuLP{!P59>t1#FnM}N=OP#$rU-5j~ zTF^`*hp9gdMr`Ve7Fb*Kz(XK@0WX&t7k^r(2G?T=Q>3u}H7(-n-Y zR;TBTqRo=NJ{vjyMa2$Xk8r?9wK0j5TYDu@bCs%IcdXUh;i{6lM{O%msVCPGtBrflg^KVD6P4HKSkr^M& zrO~m$8()rNlP@sue*pN>9qik{W_;mJY4@PbL;0pN9RM!?Yz4cEaexO`8=_L*q{>kT z1*S|QhC94Ty9OH>6d2Man!_QJH>VV7iT0ITk7IM*w_vc9s5@~(BbsR>ri^D+hzELz z<3A}%)eeb!q<{y$742o#7N@kC^MuwfqGI$YMYi*^Qxpa)9PAuSk*8I6x)8j8j${FQ zp*@|W#IDq$p${xGAl&#|5?QxYG!b!2IjY>)A9x=$dhY|k2Lm76mZZD@ zWIkOF&-+k*<8|c;MR{IW;ztD@NA6HBIb^wh?DEdYGIHe`H^Ht)LlxNW3Vh z>CnF_Kvyf;o`~eOim?o))k2cQxo% zEPu$irsr4((eghrz>ee`4gNhZJ=S{-9v7Uo&G(W0s{h)UHyge80id4!WHoh9*>iUzg#xu`cpfX%a(B0loII_p zS;C$g_lqK6FZHLGZox`0kNn2!bu^GW(E$-sf8dok4A6|$stSGIBWc6^g%%RL~ zNo8Pc9(h>3R3$>obCo4(o?PbCsP3YgR$fcWYh2aD-qH$Dm}{zM^-4i*T{F@M%5Hf!O-9x-;Aob?oxEe4sTJ;kQcPD6uS}D})A{K@BnX3TVtvomCdsmb9+7=|U_*M$0vd4$E`Ck;1{6>qlhf zgjpD~wKGN1zS@5SSY|?Zg|IE zV7+M9$2s3z@^7;}KGNfYSGRh6h+iA=Mx*B+0AAhSjr{SPFyKb*)ZW}pyTA@j9P;Q;~ zjj%feekbm*wNx`=@PJ%aa;MNAD9Pge3dsc0H6#--*BTcTR!DA(#MCwP%H*ZA`HZ?L z1!Kk@uzUq6tF_UsEOBly`(zn?iMeDGc^C27+H^KD#)Sj$8wdlHYLOqxypNq+D60Su zRN?Rx69`%gSa<<5##p*iM(iAknAWI0(Lt-C8F{e=GkQd>+M%eiS!L>OZ(OBySW1gx zAoF?^^(aGz3kK7@9qpWNAtL}059`k*Qdlt3&4UCjeA7Jc@VMaWU^D}>W@hHxZ${5P z0DOGPvj%)B3dHRahyTDb0z4>rCZ##Js3M&qsfXIM6zvw7qHj2>D0aA@z##$A6Gim^ zl4l6;DX2(Suc5rT-_ieQFJ>*Q?T;62g*sXdtDR2ShCOI&`{i&xH;t5VXr z<6Ej9V$L?c7dE;|ZE9O$v^sc`g8OSkGY36{=hy&*L-*mfY|h~civ;&m?Che?k4sD2 zU0HljTP4^*O4KTmTJF~zQT6f;JDtY~DZ{mq8QpEO=P{ z>;u5Fqioba=|!+f|3lQnXLfPQALRrsIn#my6WN1t0@sYNE1o*uXHyid&+?m+KcV7W z>#&KRf>mk8n}?w_q0JW=ft4_8 zelPO-o#ra=6CYUIOHAG6^tF^aU+9Tf*ea4+ z3E%gur`TG$8JGz^`z$#r72MTH`qt7Lf!154qv%G5!+jhGZ$~HKLEfBX13B@Yzn}hI zuj{J&=Z!O6_xo=4{s(|BobFzWcwku#2X5T_O<8oxQ-Zs;3;;V7-GFjPfL#AaT(PGJ zp#&-?0*d+)-Tkf83vhnotxQrXe`McX)B^gn9)!)^nWWsMZ*V6Awsa-^P4%pEI#6=Y z)XsNZcPu?qtCwSGP4meFHie6_$4&Xb>QsAby4K^d)0#5xXP1zsc8pjx)xD+1EFrkH!5Zcbs+kX zB?kD{$WN<{@s%==go)GdCZ@CjkFXTGl^2bm}mC&mLqVPL)f7u>OZN zRKyuD4f!!~v_@Z;+ARxUavVN9h`8Rh^=|{)T(cg*PuKqtf_!M=hWMuGy2j7(Pw&^# z)u`uB_1gY3bjmf-&5!S~{dC<=P|5laiK%|5x!SJIxc$duii*{lP4+InFG}NKXONAg~EgAW_-%6n|Wv$&K&2Fzz(ard=+cs0&@?F%zhcmQ@q=O>2%tm+h}^q86Q?v8g4580>#_z4>-Wt)3G$iFiF zK13rNhw893OVA+mPppgc&&LU&-;7dW<-S~B62uW+w7d5K;6;-=>6_-bN@S(< z$cAU`k5tW+%C=paV&;L>i?Di@XxL(<6els3F0m=9F5DI(sn0NR=7efxwQ4BdedrU2 zzFcZyrmYlhI1Z;QE;8YJT7;In@Ws7?>!8($oa$Rai=Z(@7Rb~^AQW_tL8q{i+PkhO zXe+sual$u`@jwsUsax?Or3TvZ(s9Mii@bS_`Bh_g4_o9$zhID7zwX3$F)HwQFQF1Y z9Sf?%b3K|Ja=_Wi>4CRBzXx={JA8Hfovs`)cMd-+`E%S;o!39fy#4_2m#66`kC$90 zx^tfCl3UJaw{_(iN@K3w(`*LOTE`@&<&fMfL0>YZd12u{r26)^ZkCr)+ zY!(Bm^m=!lZ>PF;+oyR?v=*50wHwjkTZmy~Q}=X6l!REj@vMi|_7?)M$<`Tj0%_*);bxT` zPS!QuF~63uaywEPXdrj{M!;D-mp2uR?;!;}SAT=gjHecYaPAA^%Dy?n20A-CkqVo$ zopZ-GrNhc)E#Y_oBmkoCW4`wn{U3>=SDZa;@JIVq=EhmCKLFfl@YMrvo83IbP1$zD zuaF!l!|EGGP?jz@!uAn3LZ}@s^C>x8JTP~I0nT>Eqmylj+EKTYfY@xt5joyv3@Bx*NTWFE>MgCa_dsj6j#=F=Y1nAnhNj}ihMy!dHH<> zBg<;&X*r^_TdyO|@Py81J6KlYk3QyCJG8agaar5 zz9muTJTY%crbH;KWd}-(bs$EndI&&``o5uhPEJl|Un%RcJKD5tu;!OIEqBdx5rwsX zkL&hvZVM0h^?v2j>P4gL4**NAcf%KFxM=%+{XOHCikkM=8m%~|M`BebJ>2q%QU_WO&N*gR#IQ116MP(z9+lWvduKQ znM77b?ak3LJ5!ZrZrQv*4z{wkUdnoAwdhuEjnNz-74sZ5E5@C$9xR*7C&38tfFCr~ zIp=ZnFoKq|d2`OU!A{|MFbWRdC>q`>8kyk@4czXv3O`i$yj>r!oSG4wDqX&ANA(?M z?K0k1j@354v>b2wGe$dHxkL63!mkj1q$izj7u*(_*^>i&NBip^0N%g-2bI4gee(%( z7?8`0@#beGbNCPd-;QaUuc4gz9yLKTowiNqqsFFd&R<2N3>D~%2fl4iP*wh1s@wK5 zYl~L8EY#WOCPhGt-e5m66B zZdX^jqYW|eNuxv=XI48D&%L!5@!UlWXX&u%47RyKT2rd`iV=C3=;00z4NI9WAvyCZ*D)YWv|NxR1eASNU-xsyaePcc9-t8)YkjyV{x2ycg@ zc6chD0>uy4D3_;Y>1$wI;{291?v=@nCcY)82TeU0^Z}Q<5N61TGDc?c zvgnDww25$S5q!1Ea#kQhksn{~VIcuEF_d_f)1HFi;t4E4s%bejHqUwJp0*ZLQ+KiT zoFjy)9DC!N@m$}wWXrZ31~j&tasQn8*R&M?tnTFieZBdTQfDPdu29Fm6#NY>*}mKMWv-C z+OEeet_5z$0|m)6S0qbOT?7;8HwcLo)V(EuukSJ z60&|iSwDa@;Xbj{MxU^7YB#Oib51BjAw~%q?Z@Sko~#Z#a5WB4fB|x~s^|5J^772s zJmsN#+FDRe-Nn}1Q>aDgsJ?bBh-Ru5qW^JrWGv-ubD;y9RHBAL-i`l@J*iSP?va7* z;QRSfLK2wYPxb8bx}%{1y3)HAs2NZKUt5>?Cc^D3{dUBZ+dUtNZ+Gp&ueCpEwEqCm z$G`8K%)4kv1-OvBnW8IrvwSJrb%GPL*4O8eni-;Hz?Z^LJMZiF?0V#D74JK9#YUf~ z;a1Pz6y^pgs+vS>+^VVjChe56b$JwIFY}gQ&E2r^Y76 za*NY|lH+UCbdixctYY)o7eN_uayuDZ*q%5zRZ;gt@`M=b;hjiN>Gvy7TOJb305yRJ zYNVY2$Thf|^}cyjDHhE}uBpMcjgB8e1do*&j_~x28(BsRN02 z|40tfZxW34e#|BSPQ2J&>7w6@HfQNWd-Ze9x3j7TJg=?R3#0a%;=!WX2t=U)a#>B7 z7}x}5{DmW%*n>;D^{P1tP@}^>Y1b@u87Y5RXa3{aUS7F(_EVu~9{G4H5;1}##El&O z=Xi08^MFTU&N-L=lhMC8PR7lz-pe!Rp7;IwA9M-*>5xYcyuOD=&sR3jM4RJ-e|nCZ z;0@oO=aWXEtt}2CPl-$YNiyimnISrzd`x&h)oC4*X8v5PU0qYGH0sKDt@p30V@)~q z@tP{vUIaU8EM2*v%020>Z-hAI&?hq3ic(G6)6tzF3%rrf^=Qs{q>WS{Ld9Atue-^c zVPCk8y`9mfRlmV-z%mUAbeekvBH)4Cx)f;n9dx2a@Rb|;;F>3+wG)`NnWk&fO!3Gh zxfEueSxHNmzOXgz%9LpCL{EVWYOTAQO?vg;BwkReONyz*6eLl1=h{wx;!HDZ|GICQ zqE%9Ble|ySW>v%8!CH42zc}caH~)+a{*}F)eKX15BCT@{e*&-y*7)YEugKQf5r3um zNt2j?MS=|wParW7bHJxpBs};z(;{9p2>4X%VgdmluE{WB7X~%~fkH2poy8;piTZx+ z9uy!5i$8%xgN)XcJq`RId$qG{pf{L;&K{gaHiZQKo6=GR-zfsniH)PYpMRgK>`(on zP=m{zH+R0&F6xe5)+d>*7dd*){LdV2BCiwQtsE_*m)n+;8H>b-nm5mi`j#}?*4Vgs zwl6fE_HCXunpDpv@nS!dG7nU7Ej;WLgF_+_%4-ENwIlGHZy~AnKrMtqj#tI&u4LTb zn%c$4U5^8HqQ<3ka+M?ka$_mfs&5|dL}Iq2z@AmcZ!~OeH*0IednQsTD{*s2pFvrU z@!@_0^gct(BOm^6So)vA=kYpqr*88HfF+3}C@g^c9o*~Ao6Yacf8CV_`&!lR0|Qjh zjJ##h(38F?*{t7W^TozGGLdPv_ftHH34nMl_t=19U)gtpt&!d3eVi7s>xtM3;X+2 zVRR!mrics3wQIHg)0aQ;7l+_>>~J6UwTu3MhFE}qhVcR5mGZ2^AM?C+{&?hrap@tZ zgC_UbizFX)Jwt#K7XKl(rH~-?A_R##x=ql`F<+T}*OP7vs*oKT;CKAY-x5DPk(?iC zG)XJS?*0VRogfxl)FV;F=9u4{_|?PaOR`FIr-peye)AXOhiBH{7i~bMu2u*KDmix2 zATiAyYCMN;EsY_@euCUXzLq~T>}X2_76u9odZ{H@zh-zKN!>krhTg~(bz5uK7}eTq z)vPf!N7VE3QX#k26hBzgAP6L?IJXdlz;k0eXq%?;LwE38=i4DQ5lFym^8DBJsrD>b zh7js~4|7)0`APKh&U@KkJJT^=4*#3`*q$kk9v=Xf1ET@ZVex+l_a^X0cu)CHp0dqu z2gQKKPUeg^e-p9kI@eAz;~C9NL?<1fL6ar-zJVqAAFIt4?=o$iAT1`us{Lnp2Gb1zGJ}Q$!Z2+-MuC4A+bz0S?%5DdmzuqXLz| zbND6>E3;dq-odVyrABc^sG%hSmBB;jb(Qknc|4L10$XKHpmir@o%7B5RXktJjaeA$ zmr}N{E9J4ZO94k~k()w&ad*FY&bOYQqo9xMkxAO~WQg3(=bekDXbQYEZTsY&O=Xv^ zsv>bQ zEBzbp8wdPGkL$aAcfwiSfjRS_y4=o6&iKn_O1@L~PK`$0Ui+Uz*Hf>vw@1G(ynTS%!uQW| zR@p|^4*(lc%WpD&M{$OXzneTyiZje?j!>kyh0UbIa8GlmiBWszotK_x;*T=vc~n)V z?oxC|{@L;H&2FiI$SE=k^imi-siI&m69$f6%lDega2QfucKsIBOgaS#n z`vJX3l3MQO9tFru{-hix#J|5!1w2!cU)&i zjGd}@0Rtz=0uSoe!e%O$c6iV!dV&55pRz7HGEPt1tceH$pUzs#9kL`YwKs~(h%tA`Xqi_pUBAXT}#lNcV6)!uE#kO!8oQeZ$Oho@M9R&}(qYK%8f zqIsiAv%|oE%DCrSjq83O=vq^0?<&p>TCVdg?na3rQ_vGO_a_CcUda_f1mw0VA^>xR zy+*8mVvyxgwW$&g9mFS<+udBnf| z?uq2F5B>Gj56kb!d0m3g;)960g#?{=<{V0Y!~lL3U;inkXRU2~E!ESwumFDnG&p^> zB(45~Y`CX7t5@7ZjrRMi9*6wTxTV%{m8`ML64~7!&+NA@TGGy!`3%M8*y<(Pa>8Td zlIL$umec0fNGVj16ht1nqqG)oz#Jw$U9>|znM*9vaWD$wfTOGjcY$yzgc-&yMC-)k4$7%UlY zDOE*Ky~9ol91=l9GHmc~T7QpIFYW=PHeyrs#8su%t^yiFF8jg#llC8-t=GxF{6)f3 z5%_upGJo6WZq%piiBF;Fn_MpMes@&xZC@>~R*V~(Bhz#HTk7d>=n(#7N$>@j$a?{$ z{@m}$4=S%euuuQN-xm+yY)H&~l@Hy!_QmnuYg>*#pf-)lO%B;k3qQ~l%>=)ML4VaA zW^|%EkLK}n{!u{_*J*Wcl->G5*tnMJkvQ=ly*wq>Qm3a=RC2lQ_p9@d&CYm~b8e2v z^B%KdJ@sy-gn1Q?JU|wtB5$T)4$;IIid~rMcK174Kt`F#wKhiWfPkYn_Ox3D^(r^e3d|a zm5z#YX4@F@N8PHOiW7x9<#Iq0ByI`)(*pO-BoC6dyHgQCpevF?H$pVn1t+v_bP-y{ul9s=oFbvI7y^q`yY+ZLYQ7 zz2XF8O58u0a`P-@ly5xG`nE}G9M7|+>yB!8L_k8!F#)S5*zz9P^|@!M_3MmRcgBLQ z#hLU3fP|1-MQL%jKlOY+iI%&B_1o@1O4wFU;ef_tYRDddO@L0}YnK9n*C}{ia8Ge~ zsB@Vn&IC~=@dM<(glLJ4me)rO)yC2!ut`6q&d#y@0KnWlfcUII)^$I`tL=hoC(1$< zaoFHLw$Tt9pea5!;Yh&%iJFmDze#akAeAI#WBac~El!Fvw=27om6a@hx-t^DKnw=R zZL3CghtjKH1Q6cM9p9AHlB)3voL@GleUq+QlV`g6ZOdmx7XJVxOVPF@obk=n6^9d< zDPY;*@*e1HlP`@c=2tWBD>FiQTJX)7(N~DLSh2W78!$_p=~C#ttRi2yz(T8_YKoO2 zm|3yo1*fzDve=5^Tq)QL6Hkmaza+6D4=Xb*=fz+R0Zzb*{$~!0tC(e(^{Z6Abi%@Q zOOY6S;3_#qTw9`wP?yWAOIlvb%|^UgDUGyoIpZ7Lj}`q74^!j-nZ8O{nMjG(iYV+V zFEs8+IYl_EE$OO5CJ0$A*I1eX2aKyb1m>#ZyXh*zW{K9?B+jU&jvEh~CQRi-m&+K`nXY$)5Z$!HjsT6}YtWtTzByo3k}dO9vhWsl&ZE1 z2!V)Z!Bp#er@Q0yyj|t2y-{p5?F-2XEM1N6 zOn)|O0)?K#jwUs*%wEE|{>Sor=bRfI-6NUA$yNGCU}c+qayDks%S>@|?07{ctaZn- zYxx?In4PoPSKj~LICJu8pp-l<90w-;M~4Ta{U z9p^+le=VbEWBY6xf}!bAcQ!e_TMTx1wB3{qfjsg+u2%CXRAgcC1+qZyt;KV=64DDC zG?0Kq*z9Kx{!K)iu({33<(#eGDIq?yc75@jq7-HJi367(0768w@ZYi@H>gu-18Ve3 zI|IPd9tzm{g{q{zb5ROx?P0NxQ zvAwvE7O#}>tf^8K8nfyZTP_iGExbbUR;#RE2hItbk5H_rpcL&|a(#6d2RJ)6C`vL@ z)XBLb7BtgbMOp{|uCQCAJJhpk=yDD+=32a0kW!MEVauhIGgx2<%{||%CkakNnKPD3 zB&@4zO2pOr4kr{V9`-GTrRR!;E6@7nLwhtF7qNjx%hhT@7%^HYs;+asDGn=lS|yGo zwg_6y$XixUWPg$MFf?I%qB_s$%bJ=T`)J*~W`+Wh@^?*wm4fTly(5I-+_bB#)<=G1$hysENgbtx4A-&vs&ilT9 zt$$|Cnzg3va@w7p`PSdQ|6gUVnLWGQlT;NK3G-ZC^Z3GEnAdUA^^DW3Tt)h6Ri~B4 zOzXGqWyHba&SD!gi|}M7fhgD*3dbnScCu#D@GnqQ9iwXLW0<_#TR zz^~6W2rN+T>N9%-Fx{9Et6Fo_jKN*ZmYwOYN70H>X>qlDBxY82Yfc$-ifgOfl-9** z#2b!g)qf$3DVI9#yarpj`vWED^d z>WV_!vMCVfVUEHSN;R~hRifTs;nIsTtV+$)ghF|RMuP?pANEc-B4+7CLqG2bdlr(^by_^fq_GWinvEWcMik~Kop{nLR;U!z~K!i!Wsqg z3g;H6!bfSVQM2fAH195)rGBb~(|lXdC9V;D6xyPpLO>0Vx~m9NOIlHCp;9<*5&FdW zBzi=gFzQ17rNJ3t7<$qPzoh$;)PprVC{h&oT0)4XkM|V<3C4&lq z+N<*fsjEcm4M10Nqdz9ZC`k;I#vp~6#Gs@cnT0|`yf9?CqtJ4iwt*R_8tT)ebKvEb zi_lXIHj23xO3P8E)Huux5d`VZnhbhS1Uyq~?y~cm*QidGAu0uCSHMp=;WZdMU};V2 z4)8cdTUvw~+SKWc5gI~YPP!I;B||!gi>t|o@Bs>#IH&>C030x)15RHTS`~w#ZtVpI zBwL7*Lz@sfNhU;SN$mlDQ55hOaEE}2Lp^9f5s(}t_W-dZQP1!g@?c%B24v?cP^&1= z0znX7Q3(Bn6vBsVsR1x>I7Q=ykV?Q=9tAaZsz$2<{Dl;-2?!p6Du@*Tr3$G(ilTsn zfCvxoD#D~9Bv3C9EvO^_KWZ0X)PhB5(J;VIwGz<6gFyf_V{d4y4o;!{7BC42e-!F3 z4X-#+s97T*e@8~Q5W zVNL1I4s}t#)ElKk)>^5xDUQXKXk(^g%pn-7kC>kRV2u#W zWIclVbkJ;VkZ%%d>agBhX(XkRr}WLaTzwR+6RA_%#*w@M7*M^Fu_+1f zo?ciHN+MCo7Kve^PHB4T@mVbPOrXXL-PBWkJ(RSg9yhO(x!4eYj;lR1g2DI@!=W^5 z$`^3&h~wT}iJ)BNbXp@<9oi^CHEjeJ;btKp68Feh-d&)A8PfPus5QOg%0BCbh(9f8G!5-6x4H0IM{1zLkZC!)0}L>SOCi5~?+!dMt7%%B3` z5W?Ivob6irsfBfDOGT9U;o`A3wEa91#IT<*BdMcISR&NPk8Qh2W~@X>qO!(Wm7%&( zxs!FmaHO+xhj0jChk3D=WMH;1n_S9ezCR4_s-y;r%HYv0zL!^9RJf|~{sKx0p z1Od7NGpR=Zx~9Qt)Mz*wDWVi@>am6k4t)nyr>TWdbnQ?NVtz})#E+r)3IG5Q07*na zQ~`U2!AcOB$%KzkCA`@XeV)2TJ{^X#q8lCErE7rF$is7D>5S!I z9F-{&1N2kQ0G1%?C4xcL19^)@2r?)Qw0nXnDQa*7P*J8BVybrJtLj$)^W~&ty79Dg z9Md??nnzpUe7#e2Cf^e-9NV@gw)4ieZQHhO+qP}nnQ&rzCU!EJ@BMx2{BO?1x$4zx z^~K)1ySnOms_H3?otp@FtW}AFdJ^=bT=aLnGujC}SP2nr(v{2G zsFW13fQ`+D_|zTVK3WYMc?yNK^KA}BwF&@w@vmcWU}cj!P3{OgEe=k2x7^4dbqUy? zJXe*{QGmiInGG_b6cI6SCuK@KH(sv)Nicao9To@R83iu$$Vq?~+V%YA!a6It@*j&vpb z+E&zggJ*JU2J@H{LqNKqEYloCjZOLlH-?H@Lbvt3pGhuZHWS50SR5P;u(wuT&lf(yh#i=|b5*|A6Z!zaj1RGJIg{Bn-^1SPwv2bZe~91)lpzxt^Vq(+AD zlk%XnN(fP5^;EwJ+z)VI<6k;fC)|{yla=kJ)KLUo&N4N?omY3;Gmzcaia{@xmLQSI zh~}KfX0>wvG7#!kCEc*_L%)}R8r>CR^$$;$fpg4+c~w=2cD)ZN**0Q?j-H&qIi?ms zBq5tp)<%NGfI7VfiPOd!I~|f35hQZrU|3idOm`+SHqBz(S+(9yG5URP7einWl^Q-x zMogG2VQO7Tp2x9ejekL^pcd7Bif!p|FFjY1Vz;IU);;SzR18GY z8&)<6SE1{XkH}|H>3g*n9Fq zbTU?Vue_{`^rO1E6S&c+TMM;fe~Af&zi^j&J5O<$gAwa<8$F&sHaQsZMyM)T)KKvk zUbCK3qy_3P^>(sqjRjnGf6S&2%F1d@qmyt&cJ1usNoZ<%uxis{CeS+VU?RP;AQBR^ z$k--|9EfKd!}z^->Ckp|Vu3B#)nC za8Gupg!xkej;8Eesk29~45YNE9uYHma=0A<1OR~y2R@gLTq{n)1F%7AK=8(vRW?%jv0!${7g8jwDeH ziR_W-1xo6CAX0S0t%M6F3Ae*a#Kah~YTfiBm| zv5dh(;H6pZPkuIpqn*QAWQ>%oXuKNi4ao48dMegZY9MSctARWZ@1r>O~dF;;VTorxYe8$P+NF?(6Bn&FiJYFf1*P z&Mvs_MzV@g5sHL*km@2eR~(MkO3egUGW8r!XdISiO4P;=F~2y@+p;)e>v(b^SAUKe#}bN6($)E^o&t~kkYJrzo0%TqphM_!LI%C z_m;9z;dX-XA+8f58HTs|n*cF*QzEX_t;A(0xXIN@-6$g7;Us`o@np&p%C(rrqJl|F z%t1C)B0Y2}UapSxR+d-(Cdr`3CU$hMekg_vEEf)t7hXKo1;F9 zF?;|IOT-RBu%|5ripZ`!UReDU&5r|d!KNkUYDEGPv#LA<1tC;KEf*tHPf|UZgW-g3 zV)lz~RWkf80)48C{6%Iw2OzPDk*krf1ff`kfJC=Do`5-#jdG&pPb zemUB7pB>$JYQnHYD(s&o9Mj|_XL(x}`2f{SIm)_DnMQW($4pGi)ll1o&B{Nbe?~7? zHrVq7{9g~X_D>0Q{KuViZQ|aijO1<_dP?nvZjCay7EZ)li)M$fvfcI$?PUYLCVJYv zv?mk0+H_m>l)42Ly=T_F^>uk{WiaVDR!a>aG*e14j^l^4Ym}V4LeTXhXEY(y_49md z?`oK@4B6=lSBaidRg$)a;_+}GpFpUCL=j+)j0nIatCLCE;OtRdBvIiklVrN0Y&lBe zTer88G>SSy%#b;}&ig2Kh(^9`sYtd)XeQT2gu{V)(D*3e z?FM!-waSfo(tmQ+i?ltln61AdXNe6qD3KV;QllbU3bwOn>nl79!hqfrl zRcK2$mJ1zO)q(jlChEZWz)vz2p`-XGD)>lKFG>E?>4?ja$-miYsF&=aKRK{6H$N)x zRjZRZfKiK$2@H=C-P2!Ii1X zw$qfaT7_3Znoa$v6Y-a7aQ2nSpz>MnwWh}^nW1(Bfz!{XWlq(2vy&Og^%oz+Xc2j; zMf z>BPO(E(4>swcy6^2T!I`wQX&pIqyp6yjthnouR*`ne@U+|1d?Z`GA&oR-IbyZ35rG ztI`UtL9e)Xxf(U0LJt+4Y!zifSl$L1psX>*fhLHuj#A!aEsPU$9i^z?Zt5-L9PcPj zD}G0vUE+Q~lQ<--aayV24TcA9+Jh4}mZ;7WZQ*_oA}10)6pD{#D9+Mp z}C2-#%DtY7oKqQA0cJF55Jv_=_)a9Sl2@KC@nqtoD=kO#IuE}7Z;OgivvFG0>F}YO zLIHNwX=#nWD;R!Z(ZSP8-TQA8Waf|#Ta$$n8RK4sVQJCjaKOi>$y;gktmx^gs24Xb z)r4=YFR@x>f$~sq3nf4s=Jny3V^G6lB;!}~)Ijk8yoVw~b+GU(D+`J}L|z*lg28Si zwLsSdZ-Xs4-KF{=xDKxb3#hqSXL<6!AxIBho?Ae%JJx^d)nZdM>g4SQp(yQ&FCe7iU2JQmOuqo@aa{kD&|>X?IC-fDt?My2kuPk5?&>(pj0U-tvSRXx zBXs>mmFS~GIb8$;Gpu6eZR35`5t+AAoL4CYnO_)(f|c}*#QGzP;5Gdn+Lc~0*M)l} z)>61YkMco5sZC=!nK@uCQ*8v}QRWv%@l_rRC%o5o_iiAkJAPUW^Z#4OuKFglu9#Ed z(ufK56)Ed<7HsGh2bVKHe~hFB$AVo^N!k`l1BHC5X*cD$@~F+4`Dc5^Uo^%@9iR+l z@eDg+D(ozx`(wHJ-);q08-ol=n+0tItRFRaKM_H|-NE?TjPL3!uMnpR1VP=WhA~Ps z6HsYjGsWb&D%qer=Nc(E2-+`5Ld&CcQaqJV+O=YT9&i#cavysLcaR(uRlvBri^($@ z*f%5ma7x9`YUe_U3)jE0WNKz3_u{XU)U;bUN9iYKu+5B7bIkrzj>6(8bqqQf21~Y3 zQkb+F8VuIQ13?6BEdbXALZCDPPDD@~+0)~<(t&kyB#H_ber!{+HD3|)%)j`=jR2>P zY3Hw>gn#2Oi|%cvPx!5hS> zqs6G5o|U`vOJqtm%&G;aYJJISmC0iwErt+RgOXpMAk;qx@l}25tzQoK8W5|T4yXz5 zc>ug-X=<<=$$aM4KfKc5p5CO!4roV0gzyf*{}z)9+9 z>EjODD6BXnf>RAb84oF3#|r)pG)qZLuBE~i+X<7*Dq5txOOjNCXhZ3%G)d$sDCrH< zaM9;Q(ELte2$Ks3;-iyQj8oMvHU??wq0;+6&BrO7RL=UR5*L zPQ9k0N-esyJ!_R%nV$7}htu|ItfM6E6dqY$P=ijHPBzpiEv3ky__Eq$lwE@?!hHPq zCfyijWve}b5BL&2%ZjR6daD8LB3N5I9^EGg#7anQKqlT88tp~9XEBEi3c@NL1^d)A zHhi{$CD`G-*4S;qQP(EDa8`aQqQdOAm6NOZVWYFIO~@8N#HSu9%NW7Jd#sPuD2B@G zu)o{JdeEo+{xaBTm&~X60N!=?RKT7(Npr$#Xn`os*Xyvltq+c+I`?Az84~j68S2mS zBM!17qVz&ncY*3tU9r1+xD#wVg+p>y$~V>53-)z- zrDxPfuA6LU>$Q!YQpTp`wZPJsbj$P&3D_f-+ox^Yh!8UGGs6&Ttb-`C#UfAISVDKeJL{Z01J?+h- z=gb5VF(pFzAr8=0PTcz2BFB(!&#J)=(DR%)$l_xMZw;9LjO=~-U}+gVZR|n+#|3~u z`(r?WF~d_8aU}ZGF@y0k_fyJ7v|*$_pe|jis^aT-kEQ*(Da2*|#HLAIrm=R+Hj7zq zV^P%a2)h!qG%rNMPSC-aMCGnzZI9!0=E-Ldov%R;(p?P%dt_k90z@Vz1OJA}s^zD3liVeh-gY_fD^bD9(1 zBIr)LBIoHQ;sVo=^i+fP*-^DcKug$ukgT}Fz77w$BdIPQK+rnOWoa;^EH@|t(i>7dQk zZKXtt-UijH^&$v-baO4r4t;u8@PiO_UMmPj`xuPOU!CUAVhM#Y6n=m8x)spAOT6U7|RSUhdn+}&EWJ0 zu@7Mh-6~KdwgsauzI71_H%NR z=d<)a@{^qtwX;6zj>=?tqqhX}4>`B8W<{-3yvsY_ZaGJ3E}?$%#^i$=N>Jh|oR*+> zf~fgPn!nM`d<<@S;UXWmM2*HHvWrG`NfVBtJe2E(zUNkQ=;W}E6w{HUD>6U@^CLS< z*2NW7K#IJID>;rm&ke;nV8$}9Bg>gnZhd~Dl<^Qusp0v*X#1QGe6r>71-JOn!1t|YdhITm*D1EzMK@=lo{MkFJH zvZb$&oL4i${5%13v)?xI_jaqS!d9mwQeK;;f}r^z0pGJ3H#p$&N%h3TGLN#8_fc)U z+fvBqv#(V#b9?^=pYWcrgJveLorY6gH~e zw;Nla8mj$7j@h~^jO+<}m{Nc1y0Q#{r@k%9izJw5_;k`chh}<$-hn@$0$7~YBJICl z9D}V61ffyepN#|x6y4|WMYZ#mCb<5O~{+kFUsB-AOWcXTxT|#*eCUuaGX#oGXz0q#~We}qJ z?eKh-$@`0}>?pE;Y4A>TvGy)>i9dko;XLrJyTohU^^}9AkKj8qu(uEDt((Xz{vkQF z>iO}`+HlK}BVp@}dC!pi>&;$(_Aei|WhD00brTXr(|4n4AIdeP5uzb+vCbp*bfeMV z{h;%ZMd(6o--5Ti`|e}csq+WTz~AFN4UNODUst#9Snt8-{`Gv<(#V-igNx-ZmArYi zTri)nzf%aiNcGMTL0{yQF_yg`eCd_&+c+glZFGwz=FDq#b2|!9W}Wmf$Gleo9HBq) zyrOHl@g(Y9o_h$=;&I~PXd+)`@!;42DjQR34i~a7gzF_ll&eqcM)BP!p}Xj=^a9O3 z^3&zZj=3}L4lWkNu)fo4<%LE}_RHe{4UHeYR8Y&0>e^F5{E8fk1*FTRPRKIcAe~O- z*%}cTa!%+CZh~j>%-MkSzbn{(5fxARLF07uv?PVH}Cw@Hm z&a@W3SiLuA^2-_|;wN!^|Mr}2Je;_dG65<_mV-qSqfVuuD-%GRGrOL8%o>BmIiNwf1?kv!fr_oMhi20}TS)XLmG!f}0 z)TOfbv~sU;@q4a`s1@wM!yR#nE&nEItC;J81KLs|l2mz4BrV#>l)r^<(k<}3EBxfs z385p*wWdPes1^^fhJ=spTK}2}g*ozRYa-u>%A1jS`UEU>3uWpRGk9T8OxZZfzhF8h zJoOCRPCZFR?(5wlBF23z4G8!$yulaHJWXwns0n&^VLe$KY2NW(gTKyl@E=<~N^_pG zn=sL$&md(=$li@)3*$BAzX>Mvnq0&Wf4om$7`^e;^uFX0MCF29%ryK?#-5rTc&uF_X}70gKL-kJGg%|3tNqjJYQYwT!pKb70g3*&E2j?Rfsic;>&|@7js+HCGbLJ7M68|!@WaAVc?7Ore zR&wyCj33%G*L7eO$}Sa@o0#^g#R`Tq3H~ST!T#aSt@1i`2A$tI^I5@uS83>+yUafM z(vC>(XGiqch5T7WGglemaURTx2r?lbZBDOo4KV?DLm~@vNYTb2s{}Y3xrYyH)eB~Q zXRrk6I@UAc(V}Zj)qYEQm3R^5th>xI5G!sLrejy@lvOA8Ofy1Os!TB=fkW;KxRo=< zL>}3F54;78jo$^1DV6@Gp{FC;`J}!cw@H|Nt;dl30?IQbrK}A?7LZ+*U7lT$FTb~f z8H3E!;S%? z)I&;bC_MN%28?IZU`&*ii>AK_cI)I4i&NWFLLm!a6W0?=jr0gv(@l1X(;z-YXE20H z(7dv303bsks8MXn==ErT3Ecgg#Wa}tbp#xYwEvk`IR$>}O?5cg#jBC=BpE2PK1*B} zj5FAn&o;zlXjJ+A zq~{Uc-L+O=0MNQ4R--3izi~kTAk+wm9aQ3nc8K>E3uV zoq%89t}=xG+IjV__1iTiuH!1-Dcz}^P7PCpfe#yc#Kx^ROK=;5pK78ulGnmAy!-vW)Jr`6zYprV?97RB{g*3(Rnzk@h_ae*1ooG<zH#~4-D0_+Km&(D`%)E8 z*W^H_gc1IGtC`Fba7*vKutLPp=y$&{d-~d2O91e04ERg#x}U=jmm<B{%$d8ad4O|rfrvq)CYPLW)n?(J+pKaGW+?HP5vL=hZf%6NM20-mJZ*^S_IBkog2 zK;xQ?e)|U7-)kWbltZ!`l!F%{+S@Kd$w#>t=0g3H<%NN=!A-z)f!S~-h>s94No9?% zr2c|@*inpj)2lc{RXn2u+^I)#3A2g%mOC&WAdu(d`+3 zTSz(yWf2K2FUjEK&@_UmdHCg2Px79*`F7hy>{BRvS~+lye>$DmRrsCj_YDPdSnoY| zUALRly8lvowzt!1*~xcPoH<=P_=*2qm|xK6nD`wFx_cGixPc`C&XLHL5&&@iMROSy zt-);t6i*%6uRF}Mn}xuG0#u8LLH85o6>7EzMBsMkYo7_zTnlZ8P!hUZ&DxzQ;aRqzLr(-=g_Eg)Vqi^Trg= zIDP%)7q_H?^rvaYHMn6Z;LXoTR_aT*a*@tPAqb_s`2arhGVc*==~3 zxkhhM>)$hXN=BBU7;nk(Ojy2xH7tD9Skjq;6M%*yHDKx`5}NfB69nC|DfLrfc}tu@ zfzT0e{4(o^Un=V*QQ(@YnQ(ho$D%`ZU{?@LlY!}iA~bLKCv2?A`hKE>wz@5Zlzhx= zA?1vt8dzPW&WYO@V0Ixbp{=c*ADk~L4m%u zPD-SnM|9tJWC7jl@CG=qhDOu&uHtr4SLkBt%9Z`Xts-6kkAWf#{TUj8*g->e+y((| zD4%GAi97?2DWAxV6`2#G0OHkxyrD@|Er#znHKy~xH7x;b=R7UObtMz}6q z24za>-rewEHHu;!^p+R4iYcv;m{&K)wd@{jknBa0i0|L?jPx?>Ul!LJE6>x-no26ErCTOjqoS_hfM#`gdJF%Bqn%XKGlGH+mnAPT=G6 zX7tXuvrT{QFBq+ArQN(+>JGn0w$OPU@Y-^3jp)26%54v?a)GQH z|Kfhenb1|VHqDYO)QENI@!4VD8POOv8_?kjeWo8o-tKZXNC!><>8$3?u+3FI2PSjt zAIIxsyEL8xyM4E&KTmWEzMO!eo`A4|V3T2tG%8j63v4@B2XDuBS!@Z)w;`qB-P7b$ zr@$$y3(vsbks!s%TuLiKo`Sh7$tb*4b|?fHp+oG6X@ds8LM%)pO+uy(AsZ&F|62R9 zwQ=3x!T^FZ*5BsFS)zg!_2$4l|H+HO-TAzCD4{R+oY1)5$Kqf8NFCSQ92M5Qo|u*M z2@e(w>&g3pdxYU7#>i~FHoeM>@{}XDQiY%Gi7AbNJE7)_H~A_U`rV@vtSyt6zb-JT zV?_RGEv*ne3cWk-Kd8Gb468m(2A3dvGFIi-g*=ifrLH2K7r7}aBrZVneq0m2SJ}PN9$EP~=gc}|zNAwj*K>QF zsC!>Wy+*NkO$kN!QO`$*4IM?rcI5)`5Xp(tw(mI2BHwt*BcEhWGxeKwoEoDyO<0?n zP9k=aLmU--(iy;|EEU1^90voHG^c7~HK0vU%TAw&(%D*?0fq2nhrPSDMJ=cGO0}W? zfcXV9=hq^pG0zge`~B_~1SX^j$u4pHHl$yVp>O=_co_b0=lYq?SlYSIogg0cOxJ@5 zUYD&ziHgGt8PR{w!cEUVRzawc`~_?RESXQ(+c>~IyhtKO|1>TYE~j6B{nA&cZU-e* zvc+&T8;uqkIjwy{&uK(_OM}Wf{rD-#8}@F3>q6d-MiJg^yH}#Xk@19kq-B>1UHAeg z-Rh1cb757&le(4HMrF@aW2clQ`UA>MFsYz1P6Y69FOM@F-}#`a^Y8Env?QJ3@z$!f z)4ho2^4{)8=wRgDIU4ZSJ5q3_7$6Zx=VVe3^77!rW!}^Mt8hFuEtCMn>id>g!;w-{%Sujj!jQ)j-r0 zJw#8&d%QpGc;!6U*FR@&FP#pQMyC<>A=5WDgJM^Dkn5*~8P74G&>EO`WH<1(f{0|h zB8ZHm8}#BMVT&7vFLSyO{#??M#!f@1d4hwOXZ+ZaC>D^NzjWEHtH1+Sh4tW52c<+B zqyIaXqKlM@PMP;Zz2(yNtHSWeReJ=Q3GF}9>hEnpGvDLAAtUeog5f{%nC}wEHHm26 zDrZ8@qe*Z4T`EVgf|sh#+0om;>bqA^KFtx=%GGB6olQ+2vT`Cw{us@Q*ynT2Y}k2B zSqPslv~F08Ven6f^AAX#90))6{&w@@5f(o@d%A z<_ctVKvThEnd5P?B4U|X?bIu2gT9IZDTIjn5KG&3ztO0 z&JVL)VorHK%X8_;*b_*SbE`Py-L9vmO}Dd(HrOMy=#F3FgQWi#J*?W<7=t+Z-|99 z5_0uPAd_?3wzRP)1L1)Fz^iT{_2=u&gY!hy8M$eMHXy^coq8Tyb^-xNRK!Lun=}*5 zumtE$+Qq8oFlEGzM{!$3@;#2To@5cZ&UFCF-%X~q;<8LVrq~SWMH4Pr{`cU2wuGO^ znvgx8HSA~I?fI(k-ryJzqUZOm{qYZJ>5;`7uVQ-(djHDF)WmgQk z%-Gk*W2_N4;T}bh16N{2rAtiRHZ+Kbz95WR;b@_F z?b!CvgxHd#)Ym`Bj$R|8Ckf|;)qfupaj(O{5s~!3ovK9@b`=XjGm%i7#emM}3~)v@ zX*8gvllR}Qv=Cx}hcM343fweS?El3`@SbEjH2=RI#GT7bohZ!0%UI&k$P+9RGI=Cp3f%qJM$9%qJoZsefv9pD>Ni4>1r`0(3?B>MwcedqVC|aLHh3A&-|Kmk6uE!P_%H>%gINgS_Sg4(u1Mk) z_!&>Z(aTdlG|e&&zq@e#oee&0J9edu3-?Jl|7wVTFYi>_X&=pQa4%qP)wje_Ztfe8 z&8XS3%EBv_Sd8!saZ7EFWdnx~4wRo-J2QfbjqG`^NFwYaE52UpWbFW3dr947EEtuFst3jpW)k7&9bC#cOL?SyHEbl1#}Q@T)Bm0!@o zE(RC#l=!WvIX6JK?2~BY!^TfO>Dn*#GL$ndbg>Gy6=twD-|M*O;QhTJpt8XKsOAZ4 ze2D7xBODWN!&onJj_9EMJukF!>T&Q!*#+n;0G?0#vlrdzc1`&y-%GGa2}>)h(j<7v z6)O>YMIGE(X7@#AMLKP&HVK@l=>lXfi@S2q#saD9)^@pp{pIna2G>6W-N8Xj*F*6= z*YR=$+m?L#5ECZNVxvJPNxLElTQRaIxY%aA(@vPOZ#^a-p9=rh({~QWP9vDQCDJ*K zGz>i~r|5ZP!k-Fc?g?vXaDIGQ8=$V1&L>q;OTny?V#evpA~%fVHA1ejbyobQ^_kDs zg(eI?=o3D6hGCr zNrq^`uphUy0i(sYKpyE1dKFRN9L=`zKwju@!F3)v6E>S5H`L=Pxz~Txy`|vk;Yj1p zH_0}hg$XyDN_=nwrF^h?yJui%mFM#FU6s#E+1sg~#atjIQ?3@{ zs)SIsUl2c1I;>LgOr>nEKmBQW7X)YA!gBeG{{(~Py{6mbEYW;m`Rm7er+P&E25)Oc zYE^NxpGp<_70%Mre6v7Hxj!jW3p*4m!N76gRR1l#p~tXxi`pB*L_oG_O3(k# z*{t+~3(Mo{A;MvS(DRJF@%0MDXPrE8!t+YxcBUwial2~^QzRdm=H%CboRe|)LEXwJ z&?~dQ(+CMc^19wlUx?40EY8k5o7uF7E#pcJEk_M}i=6YPU9|`&j=at`qwLkeenjWA z&Pq|0_3O8zSdxLRA$hu=*<}0+*zu61uEx)j;iqzCdGH;P!O0J$oNJIy5oMO*{V(*v z`Ga!ulT&(kR1XIk={8S6i)MGI9W4%JLEC!aW}h`x%ChXo6BuAwI~bebpSSP<2KVuh z^uyewpq9st*2L-*4okyO7uZVOPy(UsL)@f*6wm+(9m6^nkTJA|x2F5BfC|*&M%B(R&graR z$m;X5#7oLUm>(f+1puO4URge!Rg@+#%%~5V@DQj(`W8jYd#|5xRzyPO}<>lLPFeNav-Gi5q zbIq9>Sn=}bYn=awfC3*p*Q=>a%~4I4VP07dHFP4?`OaO58Vx+p^it3FJtTr#FNUN) zPkthI<3Z36Kyw=`1(*m8Y6a(g;)WNTc{@d! z^W!~&z_%nwUqSpq7;&nyyy)NcBZ4Vh>U9g1f&dgG#-cHBMI2nx*G2D%F9$LdT}qs*gSMT;z$$x@fvpf%85 zwBdzsz>I|3*vD(ew&BQ;NwG-t!=fQbF#8fMZ_BxB`Y zt{dn6rdOfTs_yZGiiON}NZ}FYh58%zDtfTA&#%n7485zzitq<>dWP-y=p<#Rw-|wO z#DIN#2zxY7VF5?B9Gv%5{|z~IzHh`;j^Jyq^u~skuU;g&Ir2eU%HtxBI*~`AteN$Q zY)9Y?O$a&*tACiK3!4aXahZxTyd^zhSgS3=4#1|NPna^<5+S+?&2W%fpNJy_%N#Ba zm)_xpkKCq-eyk}}T7OFOcfkDoc?9ZB#nK)~zA7n{$2^9K(U#vO0mxykPr735>l4-= z?g8eS_D7+tYvt!{jSN%T7_j~K#wk-GH{{K3*6+oDt##YDcsgb`$c)SkU`PKzqO9mvl3T6(4Vn( znGUy{h2YtfXd3D<{tCcVgf57DHh66weAf0XQ2h$D_S<~7>{i@((<`;*B~#t)!z%m2 zYojC+t7um9STk)H&VS3vu%k6#)pK3%VxOUo$1!)hk-2Iw-}x8n+v<$0kY_9M2t~p@ z>-~c3DU_R4l1Q^saY2(jvVbU@#h7IvbnTg>xcUoGl7Xj}rSikC|NJ#gvFD5R@ZZn4 z!Ola5SsxQj%Ojr`t{0AmA)f}2MVjyE10V!97!hn4cXfDyA0nfhyF5ZeZq~?aMn7QR*;7{FGDy%EI6e5l}wa{R&n>< z)C((|48{I{%d$p`ds|B4e3rVP1(Fi$|3q*7D-pe46E^}nsR`6T227{NB?Jo=jp`?! ze+@lr{n>bh@B~Hfx*l)w1QNnCJ60^LSIufLEvlOU=1u2C6ouyuq++J`)DOAw>U1%5X;%GP8uAqX}U}ERgTbfAe z0zirj{0ZL;v^wdk&%Jf6!J1ofj=Afm3^0a)U!905HKTc~=eegNRW+$ppU7%9wCHTYMlv z)?Aeu9te2pWaqW=F2%GR`7u4@+MYI19i~@bgQvZ;Th&t9eq~!yk?kNj2j|Q?a@!_E zC}V`*`TmpK`?q{QPmt*~)`g7K2YustDgF@%dx8v(Pi1y+z`T=+3NT$uUe&EmuK;C# zy3n*)`XrtM<8{ryS4P2dZsI}RP+KU984ix^>~n@#D`(wajc&nZn1`zj zm5YP00PB3Y)X)RdU%>`P7|Ez7aVw(+_JFn}mLB0Jy6y%8WN)6^4}wL zi@#AR79J8778)0huUdW30n_yJve=!6fZQQDh>`#c1UAL$m?*5*OptE~|3b2 zdf^FIuXJE8OfBAUOHE*DT(7zMSQaww2W`5JlzzkZYkKu@v{1$az+9zqkmqwukc`e` zo4Hi2G>n$yN%E((35`;nPAdggK5q(|@@Mto?EXD^{A&EiqP(qNI!5@1r+)H^=b3HP zRc9{g`g`o`tnk<;K2q2h78~C-w8;QKN3aUSheW0 zl&yo6!)-^xByQObtVP1*nU6)}2Rci}Yw}l!AiWlWl+{c`>-goLLkOC3{ zq}2YZ_m}z2S9wn*piVHeg?S^g-#T5wTcKXGr^{%vY4GQ~&_ zi^vjL)wys)q(Sb(oB(S57}N&WLd8rmn*^r3wb@ExYTP{hx};X(G1WzDSF1Jdm2#iT zQZsXtCKgvU7l>QbAO$c7|7fq3ebHc32Np`(a|v%=_NnN*0uI|1oO9;kWlQA??MXNS zjH{=8J&!-9QZ26S*WI)0Us-(hf*Cr&ppk!Psw!@s3wY=HJmtQR9si1|ri#=|OwjYi z{9VK`Dz9i$1}Pzwq+dizqJzX5g*Agv+~QIlC3ocGs+U^DPKRHjG|!&Ut63AyIn?xX zwYQ@4##-kj3?!6NY`;`kamSboP<U=k9$WU$%Y7l*G2;2r>` zOyYcv4tjNLJA(72M|K==W#}lXM01oC za)w?y>>aC&({aJrh2T_w7y{$xR&nIYnf?oPvo^7i%g0T)(@ej*5;n0a*$wG&V^Lk_ zki5@g&509EpAKIR?OuEi3FJCiCjYOJ4MG>WPAz%{1>DIw3;Kw05pHeTleW}X4K5G_ zBnh`0CXzrWWOFb~le?msu+5fPRz!+xDL1W)+N}1?Id@o$i|`=o#4SV+E(6?6l5#xJ z^0f%G#UiY{!C_^T6-^5d5YGfrxkn z)&^vwRunfAZ3$&()fC&bqqaEFx12iOk9R;Vn{FDGQGN)sy$}oc$ zSu)fQ@O}!6rlJ%W44yZMlD8aXSaO#nuK zFdRZ~(669Tp9*pd{1A0!Zrygbm!Yjb6e@U%E3OFVX3-0q`Q(3Jd#(PYq@yeN#SwDH$yP^_JLA?I2MYUiTq6{R)4w5H5fKYPuM zjW8((f#sliqJ+T_oNxYF9Zy}oN3ZFjIWGfIuYzabfUzTKmsi8gFYdqXe>4syq?^;k zTq#aeNEDqnrOF{YA(Sf>A)@PN2-BNlCK6svxy?e8G_`O z9{%ofQ7{yus;Ahrg{20N1G63A_32ndCuGjeWC&iMg|8^xlww+39iv(Xp4tu1^mt)h zm8gun?cHA;Rk7V28HG+P3S5C-ovxFtH<)jJ@i_m{JkNT;`heHFkHr-h#DX&AFvf(R z`r7_U3l&%V%|@JPPGiYS4v1`0Z(%~uL~!SSdQNz;-jUj1E$4gf8z%!cn2pklG*a*g zx>QR_j`t@%UY&Gnr%a`c0=zWR`>nc_DRMz((K`=GW03@p8L%Ha_>Inl6Ydwy z&|Wup1V`O&bPF^Ex_pyf4flDy-xb>@)C=-+KJa;@_oj26=MTX7#gr=g#-5~dbC#)C2vnyQ-$fVt++VDx))w|av_$&4=LBcG z>xR}1c5@y0$pzo&0;w1OP4A~*_kaAGk^Og`d-@r0`Fctf__%nw@$ba`;r!nh==&X& zAk&6kAi4t_(sXjEq_b#KOn9q3_sqw*qh2DqH^0V)hI0bJitFhXzC#9`z+cGsT+cwI zfIo@*l!DK?fuw?WJ%UNMW84$2f4l|n2TxBMKmEHwxpsCq0M+YPA2}9VZF28u;FbE`*cFrA@zr3!l4BSrt?Lbq&L~% z%X_ye`T-#M1$_VXk?)B6zL~BuMKEv@`h>&r9p8J?HbB?lfz2^R^ZSZ;*756d`&4o7 z<@Vtv@LyCP@j1?7yQ1F>UiU-I^~q9l>5bVFL#E=!;hFw&q z$aC<3Iok+rQZ&DaA7KvIp)x;mvvBGa<#2XpY?qG@GT7Vqi=EEun1%cAkk;^$L3kZ` zDXJCV$~t>D$Jy3FHx6QN^sZzgkPhR5hou{CdxiD;r<$h`4i)m&z!mI|+Qwek^GW5uS%v2qn&EU}VLbMtlems;pv&rW&s;?) zRdwP*`S(VcCKIf#@=TMew5|+;NhUz6U33To<79b!|HWT@s^U5cf32gQqvTwQ8TEDBFUBg7yCCi&W3d-Z`XI+-tuES6RhsQ!ydQ1Dr0QU0{qCc zOV0H-1SIdcOFT`T8n9H6;@sDH6x?y{Bs%M)1BU|Dh6G1&5Rc>yR-5vnm5yIRn%W;- z2tx`i43{@e=Er!a!;-im{x zF$v~8P6Icb;Tnb<)DprSPjv)vCGF3f)O0+MjW~BG7Oi{3J$vq;6KzdK()T$|j*q`A zgc|PkDd7bPf?j6bM+vbq0 zH-Y_{Z<9KF8@=ajd}W`Hj_G1JRvc>`E4lmKrsrYB8pRjq+YGI;GwxB2HOk%P>_K0@ zYj8Vjp?_TQNG%yI^54O%wfTtshtX2}jhflb#}tcCf4`soxGAY}pJbu@t=wQETn<3e zH8I3<`1#B5`rokhFvBG4X7WXomCM%ke~;>$r%fovo1yN6i*%s2A*QSyzo!kc!BXFA zmF>XnyNt6&RM)O;Y2XXZRIObiccOW3o36GYx-P@>1CF86)iX_xr&D;K_aV;Qq3AAc zJbr~1`JFZSST}8!>Sx8aI8M)--^Ourhk7I% z)J4R;>|e0bSc-3hTQu<+H5+kya2;vaawmS`i0{Na^i(`KBz-s6s{ zw*lYr4l5}m&$r-u1T?X3&wFpScPimb_u+2Op=Z%JN^a-Vac0~Voy}!Pw{LGx);jij z=3D&Up1Q-qL43D$_COjm9=9SA0H#3l`^EMAtC_>mH+w8w>JgKq=9vgdpYeE#(O;o=gp7~Z#actz{GZGAW)FlZ`2(i654j(^+w z=EJ9T?*TMq(#74suUz8Qx_Iz(Bn#(IXS@_SHz6)1yUGJmRS^2&bpsK!+L}3K^sub@ zh8G_)REjv<&k)1uw3=ceMreJ9H5SSr{^F&$2&c^}6BN_2Wbi&xoRpy;nDUg6h^!+KUQe^@LU@_2#ekET!oS&Th+~Vo0)Vy<+y#m~ zi-c$Q2*Eq<=LimNp9FDn3m4m{iK%f@*M29#rt|Xgg0tXlMG#3vsBv87h8roTPDc9QSl~yxN2^7Kf0a(==WMCq%2e zwfovkZeJL^XubUnL5%&NG6=5d7)ke{YW^4T!?ho3mfuNRy1f8%$0G*32vG1y#@4VV zKuy%>#~M~Rpsy}MJ!ebkm_Ry~j#b5zy5Cf91Fp%kDLh&U208-9xYL9@_MAmMlOG_N;@4N)P@7F)8MOsw$Y_BmV5Ef*@SQ%BW6D+!X*<)N>TJ=Nek?2#9fLh=pEEj0X;Ato%BImGkehr9x&7Omr_ zPUP2q+8GbgWN}X|ZUdPRA<6cG*xRIRSOa*VvhC{Kh0q!t_r5JzOw#vuM@8%2Ykcj( zMVF6&*B-RJjHLe@@FItyz6z!-LevMEMbl#rl@_>Yj zeGq%{gUiFek?4Cn{VD&6hC6>%*26cPm78Ix-knYc|vJ&b>)3Vbk8j2{JF-*a^Iunl~jZhJt@(A%R)9BFXcod_@gP+KUGD3oriWDWc^nqTseBH86X zLNUK&Vrn}D_x52*w(t}%j#@Ix%=bbOBIk@N5H%Xx$_9pHQ%fcZ?d_GF-bK-fvBUQ` zR`cOT;XSfZ&<68Bn$O6p+?_|l)X8Mq8jgnN86GnLQT5edz&6oS<$_{;6uQj2; zHg-W-2yYg!Fu)BdyFIhnuaR09(U5sG(D{CaBY{lp-2Vc7wFurhwc{sxdw$W2v8*#D z>e6wx%s%7OFmVy4;7MKx=<@aN2$`0ac7mc&}Qk>@kTMW%{x%;S(k7Ms{F zH!6aT2b%2+L_Nmm?v*hb09_$I%(qUgOV(Rj?Xw#HI7<>suL!|7#BH)N| z`)69AcEltMQ5i^w!;G%svtX*v>NTH4Z0BUi?N9ZlE_WZNR1hAc-nMPBEcn+8Ciio{ z5ev6hS&|6z!X%l4FC!R;@XJOa%3Z&^{cp_Gt!XZ9P8J!gHl*Rh9Ee2b`T+qV3l{Ze z(9QcAbtj7~^MjXb#b<_VS>B}PjwK0}s5r92{93(gp7<3Cy_7Dwm*=ncnM~mku8;bm zJ2e0#J2?~oro#+juDKklFA2O=5GbM(tbK)fEGw)c$A zUfjb%R}4-ZXNx^!*MrRia1-X)Dj%^ zME+c|AeYH~>C*zxCA6Le|FsMb)3S3 z*Y1Uy4jLru{SLux2ZF&Nk`B}iPW*1;Y0(_}R+%+MSvN5)gEmg_kB@JbjZU1qC~C;| za3M7P9_(nvZC|rmghOxF(cm{$v@uq~kF*zQdm`e7KSfX6Tc(0L$c(u}z_y=$Fvs8~ zD;I(^Z5PAdE0F;)WxmwN`3Jf51qf~}lYSA@YA7E*!uwP)FY)9pLLVAxKKwtm0Mf-l zbkgYE*_+-xnZc{S0>y$?=Y6SS%$}Q19I@F?H{ikAv$3rRM51;q(ZVNLWvsOmXMWN= z2SBp7NsP2=dj<{0SldClCXxP27HRAEA%0h>ldR)M{NrwRhsLs4hpsdQOGFWS--K?0 z*5g1Wq#`T~ZV{<5J_9VH12D!c_Pb@l=Q#Aqr4d;NQ!q%6mhQ z^~bH2%cYGezIN?PX(|&)R&3$nutUwikz>CmT(h+~Ii} zx_wM{N8awd8EGlK7bl2A3F7~g7o9&SrM%ciOn1AcVR&68JNSB!u2<-p2H0_~d~NtD zcoj3l?abWcK!cV|?ChFgt`gg|jE%RQ)VO^#Fz%0v8l|#RxgPRV;@o76?Au`Mzy1Ay z+K8WX^S00EBh}@@a`u19;|E@k_GBOMZ)M3w>$S?j6W{%oKv-ImID~G0cw7T%OU2$V zHsX-c-pzRt{gVRUC_a**iamdbP6Dck$t5MTESO9Ks%!P3>h?n3QqM;;a0VmL4f+$X zYbO6!8PS&KNCSqZme$T8)FDaCW9ea~pLBP zvq#uPw1Yh5cfGG}gOV(X5xE6m99It;^>Dpz!fyC$vk-pL#cE|LRhs%U(Fjc(sMPUg(e9u9vl6jP)Ps_eMg()gKU-6A|^!`8j2bZfxQui<-? zPRI1vMGs#vQQPkC)iHjxtm?@qxKw{ez~2lsMYjvctdr}FzkLC)_T&c3VDewr}Xa`}rqxHL<3lz$69cX7*Z@MywdX79zb+T4Ax8H1) z^+Ak}OoS>s4-eDMRGyxnyu=t`D#~07-*Gf4E5ZI~nl5Z6D%oylukH=KcU-f>Av4h% zrThKg;}MyT&u0(qHzpVB3LKsDNxJ9>=_U$8U;f@vBK#F4^Q0;@9^kmCwB!3T0Foy2 zn}yge{yMu)|G=r!gtLul{~7C8ceVa3R|-c0HRsmfXg(9JLo7~3DTdNlO%Lg4?-N`U zq%S>^{kl>M2i!!i8JuZFzjOTd)R&`LM(nQ-A_s51MF(pF+H+6~I!pQ9p02SP-AzVn%QmLXmh=G1PG&;*-6v`P zvx7Ks3azyO%P-;BGPxK~w=!pV7x}q4DZD$Yn%j;pr0{+1d&a?hL7h7wO))Q`X!c)Wt>0N#4NY7jh z&s5gF?_;PmVDUV+0!Z-48?Q=`y696M6oImsMFQi_`MPD&*<@5fJKJuWZ0uti+fH-4 zRZ>7C%cfE-Q)rBZW*2C1638QV>s|KiM`ZiJIyvfAo(!Kwxr-7j5q0}QhgYORRoii| zGx_k*v1-j0NW+_!`gSwI4tC?)kc|g@9m!Vt>?{B3_~R~gQ@!JsQ~>p;$!s9-(}hw6 zw+-RC%HLF-JTPuflTN)a0(Tg_>qJw}Ts!XpHZ1{ev~B`$T#v4;)3xW^Ps*`HO1;O@ z&%jPGzdb)JzxreLF6JomInz5@{@G%9LBJ@n zo0dK4J=;SvKdN(t*@Y~_>Gv})Wa_*)_|nW(P;O{)Yp!R(N7sA~I6^dJ&cMVRh*wx$ z7=J>M#oNgB7T6m+njOPcZ-1#Pdqw4t)7p&KM^GNG%#WuK9@Z^k?33%|)~D{6dy;Z3 z)ppNq{>ovYQYjCM=-4elKGMz_U^;P%)%R`0v9S17tZ7+GiBP3aXjm`uFjl15Tebwc z(@7Oy3+P|l5QoeK`Q>K%6(3(3HH&lb=S5hH5rD7dDj_p~Wi~(fD(m){+H;dpg?iPT z@g^p9;*bK6>s^pogHQj??X=&e(W?zPBPT$51A3 zHgnyu$?BQJZMKye%d}#Pq3SQ7AFZ?cKW@HV*co}Gp3TAQ1{bi`weM9D+P6yS^8AW| zT=^Rv@$);rNNGCtHSLDzZTrwQscUMjbj;xcWqevHKUGm!rW_*XjK@8&7)L9XwgJu! z(J(51+{^(Y-3>2?D^!K5EY@lmvoxho3@VINB)+~cK&%KS-p}HHMUtKH-{+O`C)nE&e<|{kyjC#U1HIc3Q+@8s{(0A4TtuKa-=@%j-OiISzVajW~?7sW^Y96l+U7&HKBS5Aa$oLbhg6_20jkJ`>JA=%n9Zo9l1L z)1dKCXc(o~EttqoEseRj97?+&xH=aNsj5R@bmC2zrwxACG(PQ0l2(J7lv#qG*Q4Rw zv5ENtB7Nah_B9{1tT9%Dy;mepS*$WzRaju6%znh3jGn)(nY!svpXU(Tla_%SvE-Xq zAlEn3L1a7&92**W1irBF=Hxn@qYu<2A(7>c;pHZUq|U~0+WSSs#@Dri4aZPH5|%WP z>~!pY)y9z|be@g3l~&U*9t$K1yHReYIKDrgxQ@QbR`J`7(NPSExzxAEV}w+F9>8`9 zcd!_|Cp-qy2U=Twd&ScptJY@K6F!RFehNRtFl5BIIqvVX;-V_tbF?hT^f~nP*k55! z*s-wvT86QPS~T!wmYlMEs(B+x@*<11qL)g_g`PLzZD(IF&Wm1CD&)xjNch|-9B(3J z1#rO5I{y<%=;IRz;kRt)dpDXKzfEqrpibQV z*I;Klh;+TE_83>8S0HG26uo2L8}=y7j<~EGTzj8|02vXu_>3kSy?>;`AnB{J!Ag#V z&N{T~i!(wj69%{&49#=*0!t5tNh7Ix#tk9bEK3V!KlZT|9pkcoyU``DJxQb*$KFeT z600N9Q)QPg@i(8pQ)>2Pa~XC{2=j!5z-^&{*)WM+_)E-yg55lHA8y1@eBP1lhUcUE z5Q9yZroQxY)$;CBA;{N-#VNsNO}YaB#ES%_zs#!3nb#06`e+B=JFCmJe{=q~xe^mS z7kCnXXVe?9LHs=@!o%WrjKrf?gd>h-SOL`7Td3*&dbwn8{l#2-sJ^GyMmC3GfML3O zvOiRX%!0cQV9KVSL%3o_pU#Hhl!FnE6zCEQKhMXwpOG7Z_QI%xtXj@TTO2V!d&Tk} z=vyE7f1RHGHq{oJU9*hKK!N*qy?!LGIa?wj`_ex1U5~8)j<*vm>J~{Y>KQS2M&xeV z#LfirT6Ef;ce)=))Eb^JD{XeD`Y{-Yp!%=GGd{wO@vUgaPoJCIcpHML#{A(4DFB|< zhO5lq72$k7+`rp<%ZC*dx%6{XRa8E*jgKnN6?r|8)SpmWI;n=-jHF1nh?v<(2@pu~ zZqA$WS@a#|BGlZ$W*ZNk_QPkl{uVgOsiBp!o5=?d(v(6P4&iwGe zySx-k4q>uPpHJ@GF{klpd$@*8S8bCShv?UceD(W>+Ab!=!Zrc zqGy!=_45fp#V32TcE=SZ=S#cLb4J58^SWOjqeD)^S{V2H2y zPY{mj8LW-cvhO*fb}HLBPD_p(;l+~@eJm>UzH-p)-QsOw|3+m0oDp7IlusyAOdKT} z>8LqADd$dR^cEtt^=hFJ=Tvmv>@7x+kh0guLo>)sPPXk3A34~(ukSX`QIijs`Y&SJ z(Xx}!A5GaKToe0>`ii>8t%>e_Waey=awBWPiKcmW!z{Z^CW;o~^JsJ|q=m6GO!we= znlPoZSW2puD*v{4&v;os!*?qsk0X>JgPmP0cni*H{q1F&c@>b^3wgBsv-OGD5VsMBHe)WxLv%sFRC06S%t2Ni2~nG(KIsYc*C-NxwPMICegGv@9E zwaJ5g@o$`_hEpZ~QwvCUE)4{3Qk%*d0a7fGsNPq+Q(eaH{*w8IjwCDNw*8K}WC@>D zfw&18Y;_Sq&;`gDo_dqx`%B9Q>R6wP+l zbw2^?kC#gd^Q9l^K2Qm|U(nuK^#yCCU#IuOZW>ZN>LGtcnp23HN`Otsj`<-C!sWj_ zX+=Uj&24n-fK}uca2<;DILFj!%r3bmpob3JRg}Yc2@h=-+~H7Fqu3kiJg!_KkEY4O7F<_Q*IGoc^81)ke(=#i~9aHJ~6Nmw)<2&5YRHA^E@1yEV) z(7QujK6ZU}5`Azx{Q*Fd2Ae|>k^}h!vo_>khMbe)P9+s66VK1xb zxUnJq*5f+yvE^l3Of6OyBjN~OO>VcWKk{hu0g-cRYD&2uM4bDQNDCv(s+FP`qEhXg z-+uSwp-@PBBr=HiWXWDRfdXe-ytX+~+|G=bX&kk+O zCja^tFM~I^hxytyMy{@wl)@l;F@vdEwC(!TVlrFMfn_XCQBLNUqPt#GVY(GJPGw|w zG?=$Le2MSH9!PkCqFL*qSNUwhGsudT$a8dTFviA{3P8r)G4qGVNcjdK6V%O^WDGcs zs37uN|1lSaAOF)3_{AFj-Qwosy#2-**bjVdgrxm)kRnEcGh!65!Lkyvm-Vn35kG<) z4+)kLJIxHzW9oPX?eINv>Shru@{pO=z?>~mdM7bT|EAMyUO!T4p^d+lb`l+U!|Yb}M0Ch^zA2TSI%{>g+9> zP=oBZVXl0+=0wu~6zIyEJ^3$BlZ^X+amCk6tMUCXI$1i8%{?_f%JVQSP4zUre6o~f znHb$oC(sXs8Et7dp!q<{>7tY8Z(OPlg4m)QUNoSQTIq+LxQqke&VSNw=nRm@P%D{F zZm!Bl&E(ItFPHVj;rl&jWxKt9$C-b_lwm9suV$vPcGGF@0*WiF%8~B z8hRi`>|vgv6ovJVTJbTS_Q;`1l|chc)9gmOU#mxi{rDCcFZ&ykqZG=r*?4n!Rw#kZ ztI|ZNj;Wy^(Yqs=cE{~w*8hm1FaKZPM#){}bE+8Xhr4Er0+^z=c0nZ{zIv<|ihnAP zLZoWF0%}Wk?I_z2vATS&ceQ0-V%nQf+A1YQ+LPXm8(jXv7&rgnx%m?HXu%hCyfJr- z!j@a2l|94oC|9WiW0YKUnxTa4JF|wptfRfl8Ou*@yjC8(Ri!C|u>(iadcpl@H7kDB z-Er4gPX)gS!5$s1(1!47J($@v#n@pF12C% z#5Dr(A?e-cOR#sQmM43aYbP6aaL<&L>1HLxDukals#}nrcPbSy+M=M`#KI=DglPW+ zzHyNu;~?Hc;{H34sf%pDX{SD62L&dZjHP21P^7}XsT0!9IH6Ipj+;S1PqPD8QJ|l0 z1SG)s+;vN?qUgc7ncSR1bHDuGUFKBEW~L^E+eorG{t0hGUOx&$Q#Mve-d!Zj2$DOb z{Xx-MD)}?A=gE}px9>@v&o<@WR1HeXJHsslz4oob!3SJ810Z6T045S~g z?9_jZL3^HR47#i`=6Htq9G?+w*Z?Q!0sWZme0dvA^I;ED#Eo;r&6c!K zX~kJKEZL832!wy_GA`1M-g#jSWu6`}u^G@vaae8??Ka< zy=EZge?t6)voID);?IIqWyF(QTa#zf4nnBOP-i_{L4a=M_p-W3Cq{_KgZ%7;H`KGq zP9|w;(vG|^OXOCSo2rK#pb@dBZ7+QAb^idb(r!8|tN60OF3eM(&eT89U<9u-0Hdw* zdOl_HWQYMa7xRK(k#Iwtj0mRePJbKz>db6SU;VJssROIT4~Fs^HP6@r3_}iCb}nC7o>=gUb_11D*C4Ny`7a5v@4yZ z0*fd#(ki?~aZ zNiT|>9iBIRa?F%)ysLYMxDsCHA5rw!hX~ITw1*$fzSPRmDLLTjFqyTmfWh zv)#A-Bq>mAM+YL^x-Zl3shU+@BoN$X3uv?hrulCmFmEd9(wyR#N8*WP#z)jgFNAaS{i4&71 z)GHJ{-61E6R*2oG`9QM?7NYkZgnsi&&s-n15xqeSq!mSDG~=ff{vi+J_Dg;7bmGI$ z&im9VnvFtbld0U*-!aw*PB6|00JKxmXJc`LOKgHw0L4Q}4F1_hi1RM%?e96}OZ1Ya zh7jC2)@eN%qlsC^$iq()M5h(&6rfL@c7`NE(0wTy)+TC7*4fXJ8VsjPnIO+f@Q5 z?c+`^4u8yjwEPJ!b$=rBML9#13KJmuK9Vo9HR0D6sinG(yr$~{_RY$<&tCz*E*Qj! zC2Xnu$ z=b_>0rz3>Xm+5Z$mse;}$NocP@Q3~$9oui`!PS$QR_Toy6$}~QhsgQ?ifha?OR%7i z)Ra$u+vt6K?2#7H*UmM4GH3tV1*Nm{v41}EE}N+w6=(j^WNv;D-MZcB=G8i18IZ9} zZ|n;;AeQfblnWDf{{GV;@>3`~1_$*b#}1{ar!uO44WtUua%j7XPi>aK^iWUw-Q57g zG=|WdL53W6e)L1?P`Sfzj#21WgUz%fcxpyWj>J#31iPy5wOKbOPWja<=zIjo0n3ug z;P~x?KT7ujXRcp>8e{j3Ta+V$Z`w~brsj2q^DZC6i2nI-xG1{SrpOj^vkZ|dh>2vG zj81YIXdW{>C+-e-4ao_MI8Z;JAk(Uzr~M=oc_;3MTl%7TRa;~4sJ6K7ni@Cx z?Gjy})aO5Tm`{N&w%u6*h`W!WQiWIVzK`&&Kmy?J@bzCzO1Ylu4;q?-UP#rya4EgW zl@fh5c}1yJ=-lHOO=f~(Ahi#j9NZfYljqq%bl$M65O`a__zp#34R)^#Cx>p8FcjpllrN|W9Z zx-M6T#ESA2sv00pgi;|cn~D=`09xcx4Z$xO!)Otf*c05JMSIYq!Nd2>`70R|l`Eil z;YB}^U-9nCtHn-ftiNrl%~k`gWAWBd9KWJ5_b$9tg<@nPHEtskjYKDEED0>jOQZDxl}IOUg-e57@wYc=lq%Q~ zK{!(U!)-0`i)MHx;j<{bsLT%WHjWkVlS)qc+0`Mn13xCe&oGD7ga}mrHOGQso(6Uz zW4Nnc)hjkR76;WGMiwGdINn|hP-5aW`bSTjJHZDQm zAg$K7q3tQ#{?)N>{<{cE-A0nkbX8GIWr2F35@wkp)<)vxi#q8s-lFo;eq#sOcc8a) z!rv-|H)+X+UfQEGdmE3z-jl*wPgWbfa+$fhykmI$ombWmz3B12E`016u8MKvq6|18 zG_hqd2+!&A_n$cxY=z(vu%e>L#!U@mepCHgLnoor{#!~{E-0V}FYZHs`4^Xx*_jxf zbgPg4Y_o3=?n^G*_3<`$0mDa#U=@K--8z7NiFC))aZ~DmJh51dULUNQ-E0i+y+Hr@ z#Ez0Fi6t}|BRP~b;}lLBCBi);0O~Pp$Zof>kjrw1BRnV^f(S|**^+yo?NDqs2L03Ql zlU4sE&#!*$DZF?_w2;M^Asqsvr4(`-8dNN7o()0zFq<7!1J#Wamp{65K1r35mJnDT z3jcS=yW3SX43)S&u@g~e^!B72JB@`Tb*-qdXpHqUYT;C z7L~9+qW?LRf8h`iOrRW7BQd4XCu28`oq?n%yUX@cMjxlWiIZe(cFRS=R$q(amcvr%>tQV$!h1YGbu$2}^O5MR}5YanH zYet%q1gN@4Mu)?&uz}3`Ou5!JN8q5k4jAd>S4PT?_X_tqQuLmKj|`u_uk_sAah_Nx9K!eh(C3~w z5^;>p7R1iCXXUBU{FMbfzRfeo3g+tgKTG!9>0E*L&Xev56!?Jh3c4-){sNN2x|S|n z)P-qa4Mh(g(jXMoEe_N!vEtFs*NAdZFYg89ZOHXQQ11#)mR_%2k+>ym`9X8HrBy(c z%W&n!_)COkL3yczs(Qs4dlN%_zD2=QtSRX7RA!mb`2feRFgw6AXxOE_UGO2o$#_lq z3L?l-OvR6m>b2w(t2~DR!hScVmDW1j^z?NKT2jcv{2>EM(~*R za}5dy-kbglJd!SLlmAO~B9ffSac1OWPHs~pjmxS8KHBe6P9W~;vMeY3PV1wTE|+~Z zANcSZRYaU|o#?8S43B^fpZ|)rH=mVhY@gq@@I_LJ!+XL`eX(EzO;r@tBLCRqC;$6raqn5o&gD* zIG(6)UWwUxKKgVhvh#15uK)vNUF>&mturNQH*OqA!jCu<;NQd-acrDm;pU&~y8hnr3F! z83E$v0$E@fY}%A`B2>s3R{7KGyFvJr=;sKZYNhW-!wWtjAAxP6ruLDw(GB0tmg=?^ z%_}I9Vcz}9QS!#a!ZrE>jZ=v)KosJleYzL>5dW5FvR}`!PO&sFl`|KJHs4X1Wb5qfN!1s@y;A>*qbyNLL!q>dp=6sL;#SM@ujq# zr^%{O^eu8q8@y!wll@|3ee^?}2oSm9EU!OMSPwtD$WA%oG0~HzakGn=W(Vxu>?_16 zdFxl~dxKjYnU$8OvW2XuE6@2wH9m@~m!un*GV3+bXcYelOilzNZU~gfWZ)dN1m2uu z@%cSwTM*FxM~e$=FO32gz4%e_2Eq*dO@&l|7kYx1Ewi$2uq1Q#E#=l6q!~aQ{)blL zF;KMRZ(dfQ6YzX|EmSCoJBTWZX|_CSke_x@l3x;JLRY<7_}>U|#PtP-o6jtSpT$l@ z!x_^G6EKr}Ult{IS-9QGubF<0xyVwS{FcLaMvU&YgOn%Qkc(uBU=Z!!im24I3pqK> z)J^oCJ>jus$C=xLiIfPjbdn__xWTfMmcYQD*Skojh=}KkXl#cxn(p2|tK((BY^WJ8 z%rVq4#L*7--8UD-0{&g9Zi?=D*t-S99bF?r%@Nm*EXICIfHF*A$BO3sxKd9cVpKL|yZL&9 zc+FC~Xp&NY-IALQxu(5FH1rtGCq|`c368a6P;1u7K%Msz?wYur<>!OEZL$qHkWDQ4gqZHET9J*x?tOn$ zRo_gfG#6_X>1mLy?1t^|{rQNaS*=>T?U1-kY>}n6b59O#8ffWnn(p_)S$01U>*h5T zMz8EVsx&YAgnJ^G&KZiZ=}W47_)<%=h(V7fX?v|htaHY;him0@0t8hgl#Z9i| zNlq{RAlg3(<*OKWHB6qV|0>{p1u8rA=mDAo&2nYQvhb*J?1m1yu!Fv0x?JML13}1` zr=N?6d(gRRtc;NDgLA=}JG+vy*H?KWri;T|qKCa2A1l`CpnzRFa9ab69>U7&JAk54;d6#MhfE2&FZcakEF6)_l%9Q5DQR2vIp&qyI=R|?$c84 zfXL8~kbQeaPN?)1Kiaqs|7CJMy3_Q4M|;@D1rDduVdqNy7Wc#6PRoW}rS#x^S~9>i z>-~Xh&cbDI6PDO_TPEw|Z0NI94hoqNRO^~+C3ZR4YPHhwciO9~TurubR*Iq)Du5fs z5Y`izY`9`>T8oQem5v`A zr<&{5gUhJA-b}SQ&*_B^Kr*0l{$r5wUb*4#MU-wf$vR$VsHj(D*`ZZxQrAo#tpe6pb+sZroGg)l3Di%IH+Q@fTdo>q<6JBo6HE8&~_?E zk`I3pg4Gqued=kFU7$zz-}L;_ih|$%kj?hp_Z{LVAX92v20DaUOX7_eJKe(k=!|?FkLd+{+i1 z=c#k4o?#@Gsz#5(vj^z(yhO_5F~7JI933KTH1JqjUU={MeP~Ct(HK|DYGS&pizL78 z0%2ILqK4wr#d8??DO_QFx>5hpjRD#jk}jgiC&NZ%Sl8V%>pq!lf_#`aIP^*x1>kuj z(KpfvuxPC~hWnya-OKPtS^wjwG%RAD)%tU+c&9IW-t8ydA+KxdtwmCwzNmb~y+-3Y zo8lVMDs(Lw0u!c3H*F%E@&ph$-fl-R6d2B}gCkXC@W~qy;?=5z758dWm)!)}b zdb59Be+tDV%(z1!_(S% z5bUxZh23R)B-qFsh)!tguF#rhEblVX@{c8=drW&2_Y3>d!N~akpbT9MkXK>e7l%~a zuylf9%{wGx12U_EF+Q-(sy8BN6Dy5fA1qI_Um7c8Hbl}1?RbvQbo0Ffc2}ZWM|Zwy z;$Q1`A)hnhK1TNLWJ&)fTwF~p*3JTlO>hjv=7PEOGo&;Oll$x3(eBccB{~&?4{+Yr zmLPIxms8&ZO&M}rzAzJ(=b1Y;mzfva9dEyJIc?sob*5=YUw?xFIx=h5Z~HIEqxJ~7 zy=9fnOfE8TE(&2nV}_skt8A@^-5~IppZU(K&n44+!&2nxM*K~3f@p}!$v&pRDv;A)mFu11ooxjOB!@<88U_lD3B1gHg7 z2J^Mcf3r6PudgY)gNs}^Ko|d03qXTWn21f|jTB_X+i?vu{J(jz{_Ug7fKz{SFP0o0 z{&>RyGU+7OYmKBz-1V2jdeis4p{p@E)*2E?nXhPY-81%XMs z_RWU2a+Cs`aEy@MhKdb=;hma`d=Xz6m?~xV@6^mDDe~q+Kj^O$sJk z%16X?XU2{pWGobJ_NUYVq_lb$4SyZlPxr!f7#EGw`+&{7U@( zu^zCcAyI+WAiX&t`*M3C(GZ#46tl`&B0<(R*rhTrW%S)0$+9gx}&r{6rT+0g!Cd9#b_(%D@=|N6Kq?u)lb#xNeiy}jw zekC#F-?RmLd2!zHTPbT(-x)nnRn0~wFfmL$+3JNvB>!-I{j~( z%Yk*XT@4WNvV!T0ub=f6St9ICQmOR}NPJ1o(i+=kE1EZE&smI#PyRT4-oh>eW1sm^ zx{fL}4%xsr+b-^*_6u=-S5_jk-*!cFl7j{^njYEE_(t)NP7xMt7Vg~}J>=);08!v* zuwu~j#BUdWh+V- z4%Jsv$4Io-wrNyIW0k&Euh=yH!~skjNY=r=vQae2x4w_>J+{PrRP9Ba6^-sJO9d^X z|AAdJwUJksmqUPAVlc0z(25^$@c0Lh$QA6;Q7+AJJ--99&!8e`-2HGzeips@ zq~`U~uepl;Qol|h7j__fz);M&XDof0wXDsYqrLHggYzh z9yYyiAFSi;s`(rL)BNh@AC$^gBl=a4Q7&La}0j z0!4~DMT!=8cXxLvQoOhnDNr1OyS2ExTXE;6-?``Nx%b!3lV>m8Yvi4oHFLL%<)<)n z_6bl~a$AAFX=vZmNVrKpm+0lc%Q?Q^;l0Xm)ga{kdRg4w_E6gPw*=fNn|9QF+&#Z? z<&1Ru`J+KuofwR}IOvns5Uop>waoVuxIqb`Ye0>2F=ECUUF`iuFrN!k%GWMM+QF8V zpYD%q?`GXwUk&fWY3=Us6mWhIKVEEX=zm!Vjj(iwd!r32pp`IJ9bmTZQ_m!sN+Oby4ds>B@cM8tSmMD5%TZGnL}j3q{A7aUEV-m zFB*ktA4*T#zf(IAn1dR0k)dkEJenk5`M7BI(`y~0l6h=Q95Ef5$R&>UJv#Dt>C7NFiwv|*EM(m)+zSYqra1GJ9 zrv>jjRs%zST;`{UY%LnN{q|OZJee!8|6k&vi%OWg0^4I#`UCC-L2S5W_IYon?{y&j zoKuT;bYgs|VeW(niAj#MBi#02=e*t!6Jgx!@7aXHZ78Hi0rPC=8AV;D#Nll_X*wfm znpxrH#oipnIl3!=kt*Xkj#IVp3ErUgv=3wKxg0M4l=VJ>IfOUtdICh}w4;BgSviE% z8F2GRbk^1372-`xW)ok#PKzFr{;WqG`eymlt~6n`9YII2^)vzJpWLpV*2sO*S^Yd2 zL%~`VLxx260YW50aA7w@zN7z|VAmOBP&JawF)@q~SKWZ*>J<33uc*8KrMWaO7FY45 z5quK1v*d~g>u)eAV|?!QcrGDX+K%A-x^*|vtyp@_{ao!*R8DaZQSc(0p+ z|KG514%djF?T6GyVvlrtKqPbU)M*_^vJL0DIQzul;dlJ4T@x7BJ-j7i7ax5);NRxl zW~^1{R|s7mu&%-Y5%>ScwAEw7hx;X$m9?VRnam(!>7q6QzS z=W9?-!i~>{<=rijZ9E)0M(Mab{cv0!4f_WW;)rJrv`+&5$@m-S&EtcxN6h2sgD~qq zF1?-l{OEH|)A68im%Vx~>2cWMqZ3R1Ug!@$QFg<2Q)};AvC(zgR)%)kx31z2cBZu& z2gxLt-g#xqfNC{KEtMU_Yw_w#=>rhE3B1C?>nY5=pB$mR0!u9OW1xNqq~`4j4xL+D zIMx~A_T)PI$BJ8@*O^b2C&-ij?W``JH+&!=>hk{+8-3acB!egu{*Q; zRsMd9AgjAb>?Zy&vV+=l$2;wj(`yBv)z;P}*G*UaGgZ$1UAx0tN z6uMxg$3nzAJawDI3t-x??v8x(d#uwFZF5If>NoDmB=<6!J^!oDmTQkMm~79w`CoD> zWvla8HsZ$5HWt7*M7&Kq$C{kB;YMF$ENR**JB zIj5ZNwy>KT?*^$x#-tr-FUTr9gg22d3XLhoUT23%h`}8keA;EBL5P_Uu7#3`Dt+ho zMSDnH zcR`agD3+Wq$W8LB=5_1sRyo)jnteRh2R1%C#K4OyUu-tvT>c=6{o=Kk`O-S+1hU;g zS~3>f#GB%$J^3QW;30;Jw@jQl(iH$6YSA1aF#TcIxP*gZ-Xdis`wgX~bo%;vGK}D; zmN0ky$Ar#`hnkBf{@$OLkM`{E*S3cWVaO>BIaO=&CuNqN!d4U{^Z1ZEXWeYX_zicN8067Vryw& z-x@!Pp2;I)C^pluxOZ4j?)}=*s{iUp+{s~o@*OiKtTPthptItt39#sc0L#F?WcWYs zix<=SAaDLIS^Y2w|8-=}=}2p360OG0Gji*O54t-_W2{I>m0)9R8|Xqng!wxj&G zbTT~CIy=J@Yrl6LCR0xD4r5cFdMrGF{G!A{E2E7A51|?!{BD}J`_`GV`!(sW$}Ey(9lP4 z{SZg8izKt=RCo%lmgr8AvNB8%5MGj^ppWC;J4{WsBu*YoSKG1iup^&L@1gBt^}m;^ zFlwqWV%PsK`=wz9nHU+@;zlxD@;YKdBA)}b;)^%g&hvvEYdXEOVs8RSV?k%KQ8*#FuY!LTMwd+1syIw^6- z2#M65k)&9Di!U#yIgh5l>tl{YO1<3RV0DrfUrLMo!Ph?=y~cbU1!I`MfuY?x@QR%J z{3JW3eA`x3O*s9_0QPDr&Ei2JVvH}e_i_~5&6R-E>=x5(%_&5_86BIxaCU`^+;Q3~ zc@QbS3B;R7vQbg>pe8f!Q84Xm9H;0<{dmQKyA0ESL(n?sZ!u{l-U<4VSQBlQ9dM17 zMu4g9?pi$1n&(8F0xP@U5p7B=IiOioX1NyI3LcPC^tyQ&LH=un^kH4-!mO)xqwhsm zXeAayCr~MLv202E~8@K{n{FX>R2C@dthw z4+mSR~93?$a7pbN*<&VWc}*x0DoX&PC4q_Ij7 zSoBftppPn^FV3(|TwYSZysa)P&#tUwep|eHvEn6pPU^&VwcP!Ed##@3>&`k(ASA=t z-!?8!)-XD-s)Iz}S#(`AW(2Yfh#nD$u_^-=Ga1*4-wld2)7yFTpZJA$aI=!zr94N6 z6wuzJQ9W5i*HY5*Q*$(vg9U~D%o6=zNqQtU`$PBiOgs!pJT+^z)?OHE&7sI&@sXU^ zdGFOQxr@u-X1v%$qvjS%)+l*B?3`hTNzV(&;0_2835nG})28|p6r3D7sQfPd8cFTl zmO1-*P9OzrcjdUf{*MRO4aJe6(IX&&@-4sHsSe4&x?;;=d-v$xj`RH|M3d`!cI?LX z2<0g+;j&QamH%lAXs$tp2aGBr+r~0HMch8t6c1zAZ3W&GPY{vbY_&MPj`7s_TRiCg zBCb1bS@6L?iN+P1%Pf5m6Tsnw(5W3$AwO<9U-7mdVd@az)=Au_L7p*xcgw!7c5|+l z1uLT=i3{+8hDlpqF`{#Qy*8XG= zA^Xy3PnJ_ZHRPI3kTTZb@!(9k`AvR#JOp=qpyx+&JVNM z3-hKvkFoGsdZj*Qx3KqqjKHY(Uhf=yk$H^NQMLlN z&$ul3^JMH}>wzV$0#MCUS)Gmz4tI^#`z^d1W)_0XGz!0a=u5G%R+`nem>gc%_{X>j zj-YU>SZOgzpOJ`~Z-;D0hdu_;7~+n=#_xGOMW{YdSKkfic>6K@p|LF1v>bVI-1OH$ zKhH{qWMdV2_KgI8j*C;6VYTJ7zkR?29M+~2R~qK4q3mf4H7w}eaoO7X&Xf9=$xl{1 zNlX|iRSq&k*8D;*I>UYf<5QI$Hp_Jog)r3Du7(eHC{|wvd~CO9S>F^{fEYj$yb@s? z^U5ix!ekdD8eS={g#0nOo?C1q-^aJ^L1?8JLZ~IZn6iE>hc($l2?NO-V)=B)w2D)| zyD5iHbRjt#JKX(rxluK~wMTvG`~?#st~NOEK?C+paBd$Z8S^>7vU4v_+=OpSJao_Q zHoMwiCK)iP9wg)Lm{BGeDJBaky1+l6}Dv2WbZ4%gv@!{Orhbp$C#E(6@{lA&|pY0UvIvIC&I!v|gGl zNJes6uWT>Y`*R4ro`n(=pL5!tY%iEryG$zVlIb98MK~2t(TUiy>iST#8DxJ_caDPU zil+E3OLJz_WAwgY-T^F&-z}OH?plu>`cJ<+9+t5}YM$L$g-P1)#vVo$SMF_Q&~4@; z9i3d*HZU)P>+>Y?GpV zi!)956<5-Beg}yuNi;U?+edGOw|pUg4L5oHE_^Rkg{rrMygG5QRDEey+kH+?R}Uh(l!m zvjINiJ{36in|s`j^PNBArrqRTV@R)hUK`!dKOCTVUeVGWn%de+#mH< zWETl2IHuG~0z=1jZ$6GA>fH34$@|tlNkY!sY-FLhpWoB97oQDS5oVZzyuG>ahwcCi&jU(|7T##ioJNVx@$riTh1-Z-xlR3Zc7?{115MQYF^`t z4B6txM60HCE1yU;PH|$nGF?3fDW>)DDSQ~hB!x4-;lssA zc^ql>cAKSv?&kF^OOM0j zPZAe!f~Z(8AJm}mJMb;rHMtlp&f$6F7H+4zowgG;7h=%of36+(&A*F$T%jQ4ozIKf z+S#Xyd;m0ZH)tco%%Si(y9_6`ux9+as#siuI_FQh;CXFM@J%j#>&r{OS}iiphWL8E zlv8v}KRS672|d(P@N~qFa*q>a1YF;F9cN2q59)W^l-=d{JzebR57gf0ylk9;|E_mf zbn|E*^)5q~L|IC4pX4Y{|M-H=sI!o%??FpH3eqXTPmJ z{juZrdz_|trypNM^m3UYY$5bU*y8c<<$iQ0$9t!I)Gyf%-S>W`<)l!JCn-pLvy^0Q zX33VseC?ehxujF@%VlR-^053yEOl{CR|Jo$q5kn&(6gCc2SW$=_QQqZHpzp=%k~S8 z-|eoj`E!e)m!MzH!#!5U>O)sU#_C;u74OUS#i~OG)IbbY>s7CJq%ywdVUBX#G}-v5O!{Yw3nG zXFGO6=FdlVev@YeFQ#Ub#^{#v|(Qsk99&P~3Oi zuL02Ut>2nFb_F0oA`W*|(S}`Ut7jR!1OR`yD*?)xFBSH7`XtmI25!{8@%PY@@j;RE zxCalYGD{xNnD)5LjWr2_awBN4GD=g4Jw8%tbJTk|tNsAZ01y3LV9@wkppZBMJw1w$ zk^e18l>Gy6nuLM?9&)u#3P6=)HQ;1RbaQv`JDq-dI}&rs^T= z&oHvmI0oEgcd^n^oZXj>nW35sEAsEW8Llj^V@LkhOyc{&q+)Gy7Esf>)jx4JWA;nC||@_ z0NMoR4DbcXV7VGB4uw~d@W#TFoF=S?`Jn9a?O}dD!xQGA>{cb;I-&U_?g+wGpwu)M zSiZ%T$gDg}ss6XjJ%1Y^yqNic$BCD)@o<#xkLj%XrV4#SL_GWZ-|*>Hk+HtsdBDDM0QTklNg%9u4o&0RG}Fr13z&@5HRm z8j$uA&-S_bd7J6S!(sRso5y9GN92|w8smcSEE8ExhOJMv*V_Im(1Sz^3trJ?&x@SD zgy~k!+{bah9Ma!dYzz_!X{L~o=8MFaJU&y4leUKFLFXyc8weJzY=54}r?h&ggmyX{ z_T?RoC`gO z<_pb7^;sv@Ge_^Y$IoLU>qfU(Cyu4Q+}C`PsxPD^>wO(NHmxaDAA*}heHmi3O(m8S z`fsa(!>9hEE8ETuEDI$8jw{jjVpxaSfQ2n%G3 z*zN^Yq35S|o`)yqklpBJ!!zG8OB`d>hx}v+$Gz{WQM#vruahDC`>$kt8NUkne1y^% zEzt`b;s1vih3B!7bt}X71B0#Zzu}2u*F%2UV@TrMcX6~%5XP=Eisr;l$Ej({bSc9d z>%@epX*2$1f^U&JIp^g*agL}BQ>owg;wnT1l1$CTb^ z>>p;M>EY!&vH<>>V7~FCVx~*M)E>_If26bzs1mClKdAXMNG~3p`in#0IL6D=4zTeh zMN^u$Cz0=PH&}~ZkK)PzC&f?Kv09V`atJepRENC%4P4n5y8p?39rOdA5VOYC<~wUd z^(L}`bTh#YEi{!~LkcGP8KvSMt&98s)2?nyOa72M=+RZ}+rWfL2 zYr>vomkvJ(x?eij9$mjEje*g)0r&W0>CFA8-i9aUClws1h%k7?{$+#p&fLimH-oxs zdleaWWY}qh{q;BC2%NQYi;I#JaKQAc7*|uJ6L;@FoVc#(F#td0-e_>jX-!r$1cDh{$sL(I$**0$oy;gBlkjuGZlnYuu<|J{@80x9@&P0j2zB_;A{gv z74*W}<=q4+ofEEC68(GAxlxF}>84l@be_$~T_I5?&n`N~C^%T$QW*RTe*IvHgf&A~ zjx~-m<2E}$0sYKtQH{Q`W*O_1f_5BBbh<~Ib+hKX!XtMgV3$7QGE1#W-D|Ihpuj&->;xw0NN<4-dWqCs(-1BUa!W9(-Tm z+zh^}kkJTkvMgE3X;s`nbY?xkgpVgBB$ZDws(hXw!z#|u-Z^H$aclWVLx?H59-@V?u6>4duFDHnz z09H)}^qXzUOzXC%$RMS(zme%LS986qPUt%9NYeTMGs8F&HtSi!@>#BG&DkW~Jq*qf ze)Ha_7nw3!X6c)PK~2~T6VBQp0pWHLz(*wdDYsFD*YmG4Ywmx7s_`RAV5%K^g;IV4 zLJkKkUCEeVC=B}P<21Ozczy2;4Aa;EkwIMrkLEiKKqB!KN0#9 z)Y1_Jo+psCR6x091Ul`oY|S+5mRkc7xo6DP=Scb}zafGtlz+3(Oq$BG|AY@?zXaAa zE#4Pta$`$?N$ocVD1O24UL3r%B=sM?$F*f94yr&`rXS{1{)x+z_}{wR@4?AlyQUvE zxR8z}?nW?(Ow?^a)r=W*Np%9A4#Yu6nzaLiB_`i#yED4s^15UdsJ)H|ncLPK{=SCz zl%8ZbjVW^F`!}yD*K#@`I>~>HMmlr5MDMi1I@%h(22GU8>45W7%@-$;E2;4*f+QSI zCe=I7u=F-%FW?4Im=5A|LZMJ4qvN|Lih<++vXfO@%i*uD6h0vEmN**fiYWzoSp8(ps_yq+`RziOuj1;K{8yov#s8MAZZaCVfEuxZfAb z=n(o7dp}x#{ht5Jeg7?)$^@!$1EpCUT^Zy*wQWsH05*JXVYz#}n)krszE4MbGq!sp z_OL1I95Vhst&-_J5q}vO&>LoL{!oJyTn+!k^SenC-st_ z?N(KNx&1Kz#`Dk+#r`yU;Uwjc#pLJ0$US6#PlB$5oYb%mu~{tp2ll$b-#74W|-QI6x10KTPd!A1GNuY!(Rr# zzVrho0;;&$X>}6V9(Q&Vx3!f2Nu}=~({^`6pS7D@?WtOrt|0!aEW+?9Z=v#Yw>*oSb zwlFW>pG@`)(ryS3ArI!lF?B!^N}wm&Af||QmvUtE_OF?bHfV;+Tfe?o>!VD>lp7p4 zG|FVD_m6;ypQIr6Y%83va3bCKCnpj#LiK5&#N}>|ptTOpNdlt}<9q0bmi>+?`Bf;8 zOJvot>44Jyb)9L=Uo!!+t_Gt5DNVUn(T_`P!bA0-kz9!Gp`0!n^QQc6Tum=~6Ob}K z5YRq$8!0uD=B!hLuAbzwCJi+((Q5|XFQ}*MvgG8>Z}~*{+UzyWi^H?!iI~ixK*~pS zk4gj&S_fanZ{}8J98vZ5S0Ny~h9m!{z8gUJn{3F3; zux1y-DXhDN7<6jQP{>z+>XwVXW#4VaUw9B>3#em~Lx?V>&EyKY$DaxiieJVIvF}g| z1W>*b{PfWkPA^lymX<1K?s2{0HCtoKv(@4AtRHWbN3d{7?PKwB9$&*1+xkKoxZ%El zzW0a)pSn+=AqMS~fPJG+%urt18~G6CA&{$2o81s-ytBh+jbeDJy1LWhbt=KQY0Ka8 zQ9?*&Mis6qJJKaVJuAXI-vk8tP3 z4U?tVab3++zn8%(#Aw${Kb~Z^vi{TamjnzJI-xKDPDCa{F(?M|*zc^w*fBpLoN`7} z?ax{Xc7Q%Yw)CSp=;D0|8e+L2LO}YLuIS-^n*TptNf+hzOQ~vDU@9Z=XOm!@aL>Ga zPl=x*EkNu-(^clMs`PvDBXJX)+Hdg&)YVNtKqyDB-jgMe>#dgR#u&m>6>gj4R5di_S4G{chTn3ZQNU9HTjQoELz61}+9)X<=&9p^+HscK zUaJ7L6O-+;`uijjH!YW8QRy@g+X&3N-?BDtx zMXY-WEPg*Yt|X*hY4GPi1PHSbSnEKaq(F;k6{FxY9XJ)47>B3T5{~AefMPqVKV_w7 zke19B{1XC3DAxO8uKsSc_Jb~`3dL9o(*6D}eVsF3-`fJ1O-0P@`_Pk8oxVdkhS#6_ zw$nzmyEXp@uWE%5d!dw#x3T2Yb%jF}>?-uMj05^HVaPVoTQ!|!rF8dCrjhJ_vP<56 zxehW@@^0RTw}brzlNqV+Ym9T0y&k1Lgrw5aLGrD>aV-bjA{zt=*;R`-9|RPCq>o5@ zRhy%L+*_Ps3;!ya^&rLTYO}8y@VCv{?t@y(HBvPx+kuqzJ%~D?nPA%2Y3vU;d4N^Z zX84knN{Nw>W9%$1W;+scXyps<>{2W50;x zq2*l|$nt-oDn|EqVyTe*rigtdZ@D`kTg>;GtH%>vE}@yOsi>02 zd+_jdm8Su?8u)+WxBnOXq$H3$hNDoC-TyUi)!AU2B9ytJ5rd;)IR1sI3#-^Lr4I+7 zs5nez!ynFi|2ITSB;y@9;YLwjBqwz8S@%8lwz-X`dXP-L9i7pkA!v*JKaG6b{mCq< z@}kkS0SMzj@Ows;*X7#pmd{1jqMP6L*Tk+bk9OesW%7T)Uzsjz!I0|YayQCD z-LDd5*_PEJM_fQs)DozUW`CDO^FiH+4y7Fk=9mu5d)xVVrjv}HVqATZ8I5eLJ0SSynBfa^VU=qkujaHZ_z(#0ua1MWJA&~OrvXO`!X7U znk@_NtYaA+h;nO19t_rKF_40zt`1V{zmkQmCBRd+gSl(c;jxfvvm>LKq=v*}boK&G! z=t&}A%k{8l6K6u0BqE6KX?QrAK$WV@*_t$<&t1kRBsDCdI*Ny?4-LO6r%}pFC$2J| z+7l$p4nF8M13U?X3qr!7-lq{CV*Bpss{f=)6B+hCe$k`h54Reu@di~J*LRO;RsYdu zFLb?IGOM4hzWq193)i*y(=>_GjT&jAb}QY7Zactr)4KDtNazic?JxI}Yy(?<;EsV*=o4|$#uiQD}TU;NC2{yRtAmS5NsuHy#mo{811%c1@0s|aU16qx? z&0o9WP7cyv!*gYlY^F3o^7a3?WEp})NL)w{BqifM{8Xwf2@1+$BqlZjA@m%%ST9!c zCfGt?`(N`)?%&z__a_~`3}`4k z__cUlo=&G%bnul5NV)Ip^pJtV^PGXvDifR~TGn_lY z0|EzupR}ZB0v^F~9ci-!Qz(0#5d$%b~-AcwW#~gkq_iz1{A+!TH5>5p> zH5PB|k$Ncy$RQV(%_Y|VlSU~wodPhcI(dg3uY?G+qClPry0OonM-5kqk7AjBh*NzP zJ;mesgzbuLTFAq&-J|g7_3DY|sqx>H&lwy4(-yGwa{LOpQSCeFe|8+07IdPm#eF%i zjMj&jFvKnQq3d-}D;|H(k(|Ok10SrRG#0XVyXBaqVw}KxX{VOis^71m?^cv|`7_08 zGB%h-a`QP8oe)_n2u|4S9UvZ~ATX_-N>;jCy6ST2leHw0k0TV-MA7}N#G+EYrB=Zc zvcDpQl1shU8D?rTTXW$KQMeGo^KIlJ(&4pcqr%lzN@Fztdw;Ovsy?*18-&0doL5i;)ubHIO~3_`%aBV7 z?IdpeP^!A|B^n;(`WDKo<@k!jX%Ky4e?eYo3(1>~FyKLw#rFIbHF%COvkj*O20nx- z3&3o=rj}T$Tp(*t@`weZtBO)Lv5BOBdFRt#sS2F!%eK_ExCr6)VO0X%Ch&aEN|v2- zpV+AJe#pZIF^(6@+E_#RTv1hi{5cU#ps}h)JeB4iOG=dNe$0uj)f|yKTTiCm2Xil%S3H@?&v>XY!k@BB#tuNqK)?PO zp(~)K=|It1v#%)ow`5zcJUJ`!orV60AlK6cwNWw6;@}AxhL`rpNoG^=G|-WVGy9+3 z2uEg9o#tR{>NN<`LK9A)m&M?N9ICs7&U4y@mU=4#9SA2@P52edjcQbf~Yk*fm5Q7KP+kl#%AS6dv@ve&F#BKreK0&=H&fGQ6Pit zFKf!18$fVXmDz4+lJSolj_ivhm~jiBinB9xTRFm=EB7fT{jMX60A~VM!-l#WJ->#o zeDv|XJ`85r4;p*K7I2$NGe|L$Z2ZkO4MB7*hZXMD(LgFac@Z8LUOIfLxI+k%bIVe% zjg9Ofxuh`6KE?DpHSD6GOv3sTffO;a3b3CiWa+8< z%_sG`aQHJ0TP;m`U5z+eFfqEF&>`$MSa7+Odfd=8-g?8Lvilo_Io6+;kO-DVfV~CL z+kvS>cr!ZL&m?bZX(sS#-kjSPuyc;;%mko2`wP6>n#7x6B&8o-#AVWo4bY1UVWz0p zJL~=JtB^9jL(X+47zS0A_}zUE%a)cDNu{+znNl(Yk$m@A zB_3xFuN1X7P}|3w-k~*K!^_t0kl~%N0f47MK!uLE3_+D}qoQ=kZ;}=~p*2ipj!~c! z#=kXdqAV335L4}ET(B^^VUO^B-&BjJwCCY(@_Ukuq2Kp+MsmQYkTYFI_9v{6^T#f< z&sCH8s>V1LJtl&Lu3^fo$+ujjg)-y3M(eaIOf>?CLO13d0JBGBLavT_nsw7jeCXfL zJY10iz7t9Xv(x=+o~+7_oCQp$GE*|bNe3GW)oQ^dvIk_11i|A7(MlaKK#6l0F?!X) zxtWnCI+#2UzXXCW6Ru?CkgGP6qVh#(8Ay_s7l2_I+2t$|Y2T zFh&YM{W+j02~{&gqgS;B!B~~qIl6vy2B>JMe(Y`Hf+BvZq0UF3Qm?R8optuNYB2Sk zZ{qS*VQ#UXHoqjU_#6y~JQ9%`pcjVxRa$1sl$*x{G<;k~eAR@HB4c9l>g(<#6}u71 zolO?*nsPO7VE9s0%B+8&#Pi;gZ(`|l+Zr&sfxriy&ZX2XS^C2v2; z6|ErWF4Z&QmKtJ3ZMkJqatRAdH@NY-oK2V)a|`gMzB52e$C~ z$%8?KP6HVo@{tNmpNF?R=zW;=*6me?(_fY#eDFH$6f{w^(vKqzit}72 z-SamiRvsm@R~n}p#tH4JVTP{nRmM~)bcWSHQ(;?{^*;x=GkmhBt(-<>dq^UvNd48E z&=yL67&O-Bh3>P<1bkI#XA*EC;HbQR%Tj+NN@vMuoEJ~Hg9eeBWfy1uvA5;B>-)@m(-|Gz7v=WOOk#>$?R%0d+l?iSuy9j0!(Q5LF5V<4?rs=W&p$>BgxW{F%th4)j~0K^Y_9Y$>!q;@HdEd;-@$j7x}_G86d3gBg3hP z<2b!CRBYv<{Y${E0cg+!a`jC6Z7)7_)0THH`sz&`$2E?lXwIo*2V>n);I@U-S0pj* z5+`SaKP*>5s#?x}nLk9CYBCasSTZ_O%#nm~nxgYR6YJuP*&J(r5P%MNYzF^Y222>C zA?~4k$a0=@2~I%Va@np_>Y9`Q?pfiU!%txP!6X4&;XE;` zFKzXjG1pn;zF^}>O+jGViAhzM?CYWB2^n$72>a)N{DK0<*a;%OXy>AegK1c#=DU0P zY=2+g0p6BHs?|GZoOAAXa6aQ*+{ zPLi`nzTqa5fV-Z)7UMpUOuoO5QZ4q)s_=|;Cevztd4$1@dh(pkvnYeFjm{@$KVPyA zqHgsBpoms3R8t^*OOhFl;xG`T|I6gq2#VF|fbUKPX@GHe;ZzalC54^06R#_jZNK8- zP~7c~lb8#SLS?O#(^K#a#U3krf!vI5I7&b3zC>Uv?8kh~M4on^_gyPGbDd-#g}hntvjIt~MFF8TlS zr+ZO=0%HF;wF`|Ey>WZ}ik`A>n^z+zDmTd##!Zwdla^XAnARrj&?X3=Y;aqCwhgGA zFU!q#^VzDOO=0$reZfrnPpSBaZ#LJ*nqtMY75|6dF>l-kuoPG84yb^@e)GFa#YkiI zEri-DLukx4)}`a`#zK>!;uw|VbDDdxQEIo3V}u+o+1CN*PpVM7bxI!tQ2Q}<^9v$5 zHI-}^H2wrIjvdZXJublvKS?MMKI63qM;ASrdxa$IW2&U>w3j}IB-&sZHQ8xK+nq8x!Z|PqNMNB9&32Q^h>?+pbp~$PD zZR}lVETju)Y)yh>gRD6=TycK_iU)(um|PbPt7Z@}$=_C7SA=vA%5@=|A{lP1fA|!p zkcjy7Yq;?VS)`UQNcB^5=U;^{p6j>nBylF<*OYw`^EJTR0OQn{!2s2MhqBBq^EHF( z$wkUFrHIP#`HcrRQ%2HKSS75eS^5yh;kczD2U@i2ly*?o4`qis(!OIdQvUA#fq>V&a$D=R2Wz#r(4_*9uoCj(}q z)hbUJncjofM`OJ!agzeo`C(PKU?XG6CiLBSD%|h|NVl>X8P1tl^u(wMByAda@6m&J9&UYuL>#hI^Nv zH|MxjX(_p0YQr2{_PY4dLze89dc*AiP&2l=-z(J}qB4{z(nI8%LT$%0F6cn>aG6VT z<$QNMw-k3rEb1Vg_P^QfpkiCV4OCNK{9ryxTmuicx>4w1FLV-YKCDu}MuE#1qA>K{eon?e_j+;b0ky$nYaHTr1SJUN3UPI~#wY8`v-JeU`S) zBw&B}z2$*Fh5p77)t$3P7AHX6ocw*(E3sX`mrVC6eO54^8`v+=>;P3IQ*jVbih3*eFcEnvt>`~?l=}q!(a^V*YDfS2R$-R=Af%(gPJ*e z@nV(qmNX)Mtk_}qRzl0%m$B0W&sCmh-m+Dy?~ji}#UM5|B^CyzJ0!MYPX6Y#J6`p~@4x25x}S)tXAfL^r5C1`!!iudVi9&kiUX#8NwMm-b zR8^u?Y^9U}ewbrCryTh$fpj9jx{Js|6d8K3e!}o(w$fXtPm0of;7m#?nl*BDx#gQP zPlc-B4^O=l{jepD7pI3uD{|Msv49EkSSP;qOzKTh^wfEPl5$=!YCWCQVtiIjh(L1v(1JQLXU5v`BA6WW7iGD7I+T%pq^(%*i01&`bi zB5Fg{EZizcfTHj9kmGBTwm! z;Ze(Ll0c6h%2~HAOx-2;UNc1PjuD|fr zy!#m7VKvMc-<1@SyBUcoGh3);TV25F;1AxrQg4!$X(o0|LbAcxhZQ#K=A}VN0T!(f zTr2}g`J&^BD+%fQY_^nm1YEN^GPB#>P47}h->e4E;XGND-Y4=!?d$~(NC2&W!)?lC zhhHO0;pn&Pt6Z}&i(>{b1(~ae_>+Lr)*@MR)dY-GT33Dhlz*GgbBw1w{6Cj-`(>{Rm>J`cLvA-YH?F@NgMr5zR<*5iTJs6d51a*vqPCWdB}X#$Xf6 zAWo5EmrBU$DWxZdGeE!*=*;Yh796%Idx=L~98E`-<>3=ut z%n26?t?>US<18YOVV^TB$3be`I*RNs%EKI9Xt^m`IA#0E)Z5oEFcPth=1qVJU|lR? z)V>0oJkZxM#?;mW4I-`yp)7$c!(&TRJsIpYM_fq(m1m(LH9GQ2XeCX37daN7av0i3Q00se2qS0a8Pkl9$&mf;y$%sInDWfeSZ69Ns-MZIvboON7bN4^A_a z*xhIf5Y&w$``ezXvCH-+)V|0&F{1PsWwZ3Ei$0-re`KAY5|^F+GVi`SfB(VVlDqz4kk+~-`j+h>habieZ8B-@cDq6 z;g|;2xke+;t%j2NHwkx5qS~ivSISW*BMynzGCsKZmy>|fOCifjRUqG-Pgo{x)2!#e zAZtUmEgQ(?%J_2zrKNOm*b7!!Qv0iY_XDEs;#uW#gr;%m%~^dVIR6cuud#Uzp^&UO z7~X#&o&Ig4eq&vs#>4lE#@|djbz2)Ih4*1?w}ymg29U&h|vS2=CwYY{W*5en9f zN!^G2X&qM3+) { + return {children}; +} diff --git a/docs/src/app/(home)/page.tsx b/docs/src/app/(home)/page.tsx new file mode 100644 index 0000000..24a3b20 --- /dev/null +++ b/docs/src/app/(home)/page.tsx @@ -0,0 +1,258 @@ +import { + ArrowRightLeft, + Container, + ExternalLinkIcon, + HardDrive, + InfoIcon, + ListChecks, + MonitorPlay, + Smartphone, +} from "lucide-react"; +import Link from "next/link"; +import { ScrollIndicator } from "@/components/scroll-indicator"; +import { SofaLogo } from "@/components/sofa-logo"; +import { TmdbLogo } from "@/components/tmdb-logo"; + +const features = [ + { + title: "Episode Tracking", + description: + "Track progress at the episode level. Pick up any series exactly where you left off.", + icon: ListChecks, + }, + { + title: "Media Server Sync", + description: + "Automatically log watches from Plex, Jellyfin, or Emby via webhooks.", + icon: MonitorPlay, + }, + { + title: "Sonarr & Radarr", + description: "Export your watchlist as import lists for your *arr stack.", + icon: ArrowRightLeft, + }, + { + title: "Self-Hosted", + description: + "Your data lives on your server. Single-file database, local image cache, built-in backups.", + icon: HardDrive, + }, + { + title: "Web + Mobile", + description: + "Native iOS and Android app alongside the web interface. Same account, synced everywhere.", + icon: Smartphone, + }, + { + title: "One Container", + description: + "Deploy with a single Docker image. No external database, no sidecar services.", + icon: Container, + }, +]; + +const steps = [ + { + step: "1", + title: "Get a TMDB API token", + content: ( + + ), + }, + { + step: "2", + title: "Set three environment variables", + content: ( +
+        {`TMDB_API_READ_ACCESS_TOKEN=...
+BETTER_AUTH_SECRET=...
+BETTER_AUTH_URL=https://your-domain.com`}
+      
+ ), + }, + { + step: "3", + title: "Start the container", + content: ( +
+        docker compose up -d
+      
+ ), + }, +]; + +export default function HomePage() { + return ( +
+ {/* Ambient glows — positioned outside hero so they bleed into features */} +
+
+ + {/* ── Hero ── */} +
+
+

+ Self-hosted movie & TV tracker +

+ +
+ +
+ +

+ Your watchlist belongs to you. +

+ +

+ Sofa lives on your own server and seamlessly plugs into your + existing home media stack. +

+ +
+ + Get Started + + + GitHub + +
+
+ + +
+ + {/* ── Features ── */} +
+
+ {features.map((feature, i) => ( +
+ +

{feature.title}

+

+ {feature.description} +

+
+ ))} +
+
+ + {/* ── Quick Start ── */} +
+

+ Deploy in minutes +

+ +
+ {steps.map((s) => ( +
+
+ + {s.step} + +

{s.title}

+
+
{s.content}
+
+ ))} +
+ +

+ + The first registered account becomes admin. +

+ +
+ + Read the full setup guide → + +
+
+ + {/* ── Footer ── */} +
+
+
+ MIT License + · + + GitHub + + · + + Docs + +
+
+ + + +

+ This product uses the TMDB API but is not endorsed or certified by + TMDB. +

+
+
+
+
+ ); +} diff --git a/docs/src/app/api/search/route.ts b/docs/src/app/api/search/route.ts new file mode 100644 index 0000000..ec6bc8d --- /dev/null +++ b/docs/src/app/api/search/route.ts @@ -0,0 +1,7 @@ +import { createFromSource } from "fumadocs-core/search/server"; +import { source } from "@/lib/source"; + +export const { GET } = createFromSource(source, { + // https://docs.orama.com/docs/orama-js/supported-languages + language: "english", +}); diff --git a/docs/src/app/apple-icon.png b/docs/src/app/apple-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..23651fad3358278f4e8fdb09bc83681e623f6cf0 GIT binary patch literal 17082 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 { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + const MDX = page.data.body; + + return ( + + {page.data.title} + + {page.data.description} + +
+ + +
+ + + +
+ ); +} + +export async function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata( + props: PageProps<"/docs/[[...slug]]">, +): Promise { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + return { + title: page.data.title, + description: page.data.description, + openGraph: { + images: getPageImage(page).url, + }, + }; +} diff --git a/docs/src/app/docs/layout.tsx b/docs/src/app/docs/layout.tsx new file mode 100644 index 0000000..efeef54 --- /dev/null +++ b/docs/src/app/docs/layout.tsx @@ -0,0 +1,11 @@ +import { DocsLayout } from "fumadocs-ui/layouts/docs"; +import { baseOptions } from "@/lib/layout.shared"; +import { source } from "@/lib/source"; + +export default function Layout({ children }: LayoutProps<"/docs">) { + return ( + + {children} + + ); +} diff --git a/docs/src/app/global.css b/docs/src/app/global.css new file mode 100644 index 0000000..e2f4fa2 --- /dev/null +++ b/docs/src/app/global.css @@ -0,0 +1,104 @@ +@import "tailwindcss"; +@import "fumadocs-ui/css/neutral.css"; +@import "fumadocs-ui/css/preset.css"; + +@theme inline { + --font-display: var(--font-dm-serif); + --font-sans: var(--font-dm-sans); +} + +/* Dark cinema palette — matching Sofa web app */ +.dark { + --color-fd-background: oklch(0.13 0.006 55); + --color-fd-foreground: oklch(0.93 0.015 80); + --color-fd-card: oklch(0.19 0.008 55); + --color-fd-card-foreground: oklch(0.93 0.015 80); + --color-fd-popover: oklch(0.21 0.008 55); + --color-fd-popover-foreground: oklch(0.93 0.015 80); + --color-fd-primary: oklch(0.8 0.14 65); + --color-fd-primary-foreground: oklch(0.13 0.006 55); + --color-fd-secondary: oklch(0.22 0.008 55); + --color-fd-secondary-foreground: oklch(0.85 0.02 80); + --color-fd-muted: oklch(0.22 0.008 55); + --color-fd-muted-foreground: oklch(0.63 0.02 80); + --color-fd-accent: oklch(0.25 0.01 55); + --color-fd-accent-foreground: oklch(0.93 0.015 80); + --color-fd-border: oklch(1 0.015 65 / 10%); + --color-fd-ring: oklch(0.8 0.14 65); + --color-fd-overlay: oklch(0 0 0 / 40%); +} + +/* Neutral sidebar overrides for dark cinema */ +.dark #nd-sidebar { + --color-fd-muted: oklch(0.18 0.006 55); + --color-fd-secondary: oklch(0.2 0.008 55); + --color-fd-muted-foreground: oklch(0.63 0.02 80); +} + +@layer base { + /* Film grain texture overlay */ + body::before { + content: ""; + position: fixed; + inset: 0; + z-index: 1; + pointer-events: none; + opacity: 0.015; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); + } + + /* Scrollbar styling */ + ::-webkit-scrollbar { + width: 6px; + height: 6px; + } + ::-webkit-scrollbar-track { + background: transparent; + } + ::-webkit-scrollbar-thumb { + background: oklch(1 0 0 / 15%); + border-radius: 3px; + } + ::-webkit-scrollbar-thumb:hover { + background: oklch(1 0 0 / 25%); + } +} + +@layer utilities { + .animate-stagger-item { + animation: stagger-fade-in 0.35s ease-out both; + animation-delay: calc(var(--stagger-index, 0) * 0.04s); + } + + .animate-scroll-bounce { + animation: scroll-bounce 2s ease-in-out 1.4s infinite; + } +} + +@keyframes stagger-fade-in { + from { + opacity: 0; + transform: translateY(8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes scroll-bounce { + 0%, + 100% { + transform: translateY(0); + } + 50% { + transform: translateY(4px); + } +} + +@media (prefers-reduced-motion: reduce) { + .animate-stagger-item, + .animate-scroll-bounce { + animation: none; + } +} diff --git a/docs/src/app/icon.svg b/docs/src/app/icon.svg new file mode 100644 index 0000000..20cddf6 --- /dev/null +++ b/docs/src/app/icon.svg @@ -0,0 +1 @@ + diff --git a/docs/src/app/layout.tsx b/docs/src/app/layout.tsx new file mode 100644 index 0000000..c89d1f5 --- /dev/null +++ b/docs/src/app/layout.tsx @@ -0,0 +1,38 @@ +import { RootProvider } from "fumadocs-ui/provider/next"; +import type { Metadata } from "next"; +import { DM_Sans, DM_Serif_Display } from "next/font/google"; +import "./global.css"; + +export const metadata: Metadata = { + title: { + default: "Sofa — Self-hosted movie & TV tracker", + template: "%s | Sofa", + }, + description: + "Track movies and TV shows on your own server. Episode-level progress, media server sync, and a single Docker container.", +}; + +const dmSans = DM_Sans({ + subsets: ["latin"], + variable: "--font-dm-sans", +}); + +const dmSerifDisplay = DM_Serif_Display({ + weight: "400", + subsets: ["latin"], + variable: "--font-dm-serif", +}); + +export default function Layout({ children }: LayoutProps<"/">) { + return ( + + + {children} + + + ); +} diff --git a/docs/src/app/llms-full.txt/route.ts b/docs/src/app/llms-full.txt/route.ts new file mode 100644 index 0000000..fcccaee --- /dev/null +++ b/docs/src/app/llms-full.txt/route.ts @@ -0,0 +1,10 @@ +import { getLLMText, source } from "@/lib/source"; + +export const revalidate = false; + +export async function GET() { + const scan = source.getPages().map(getLLMText); + const scanned = await Promise.all(scan); + + return new Response(scanned.join("\n\n")); +} diff --git a/docs/src/app/llms.mdx/docs/[[...slug]]/route.ts b/docs/src/app/llms.mdx/docs/[[...slug]]/route.ts new file mode 100644 index 0000000..a43e922 --- /dev/null +++ b/docs/src/app/llms.mdx/docs/[[...slug]]/route.ts @@ -0,0 +1,23 @@ +import { notFound } from "next/navigation"; +import { getLLMText, source } from "@/lib/source"; + +export const revalidate = false; + +export async function GET( + _req: Request, + { params }: RouteContext<"/llms.mdx/docs/[[...slug]]">, +) { + const { slug } = await params; + const page = source.getPage(slug); + if (!page) notFound(); + + return new Response(await getLLMText(page), { + headers: { + "Content-Type": "text/markdown", + }, + }); +} + +export function generateStaticParams() { + return source.generateParams(); +} diff --git a/docs/src/app/llms.txt/route.ts b/docs/src/app/llms.txt/route.ts new file mode 100644 index 0000000..775be71 --- /dev/null +++ b/docs/src/app/llms.txt/route.ts @@ -0,0 +1,8 @@ +import { llms } from "fumadocs-core/source"; +import { source } from "@/lib/source"; + +export const revalidate = false; + +export function GET() { + return new Response(llms(source).index()); +} diff --git a/docs/src/app/og/docs/[...slug]/route.tsx b/docs/src/app/og/docs/[...slug]/route.tsx new file mode 100644 index 0000000..c63b7a7 --- /dev/null +++ b/docs/src/app/og/docs/[...slug]/route.tsx @@ -0,0 +1,35 @@ +import { ImageResponse } from "@takumi-rs/image-response"; +import { generate as DefaultImage } from "fumadocs-ui/og/takumi"; +import { notFound } from "next/navigation"; +import { getPageImage, source } from "@/lib/source"; + +export const revalidate = false; + +export async function GET( + _req: Request, + { params }: RouteContext<"/og/docs/[...slug]">, +) { + const { slug } = await params; + const page = source.getPage(slug.slice(0, -1)); + if (!page) notFound(); + + return new ImageResponse( + , + { + width: 1200, + height: 630, + format: "webp", + }, + ); +} + +export function generateStaticParams() { + return source.getPages().map((page) => ({ + lang: page.locale, + slug: getPageImage(page).segments, + })); +} diff --git a/docs/src/components/mdx.tsx b/docs/src/components/mdx.tsx new file mode 100644 index 0000000..62ce6e5 --- /dev/null +++ b/docs/src/components/mdx.tsx @@ -0,0 +1,15 @@ +import defaultMdxComponents from "fumadocs-ui/mdx"; +import type { MDXComponents } from "mdx/types"; + +export function getMDXComponents(components?: MDXComponents) { + return { + ...defaultMdxComponents, + ...components, + } satisfies MDXComponents; +} + +export const useMDXComponents = getMDXComponents; + +declare global { + type MDXProvidedComponents = ReturnType; +} diff --git a/docs/src/components/scroll-indicator.tsx b/docs/src/components/scroll-indicator.tsx new file mode 100644 index 0000000..0b8c47b --- /dev/null +++ b/docs/src/components/scroll-indicator.tsx @@ -0,0 +1,55 @@ +"use client"; + +import { ArrowDown } from "lucide-react"; +import { useEffect, useRef, useState } from "react"; + +export function ScrollIndicator() { + const [shown, setShown] = useState(false); + const [scrolled, setScrolled] = useState(false); + const [fits, setFits] = useState(true); + const ref = useRef(null); + + // Delayed entrance matching the stagger animation timing + useEffect(() => { + const timer = setTimeout(() => setShown(true), 800); + return () => clearTimeout(timer); + }, []); + + // Hide if the hero content overlaps the indicator position + useEffect(() => { + const check = () => { + if (!ref.current) return; + const indicatorRect = ref.current.getBoundingClientRect(); + const content = ref.current.previousElementSibling; + if (!content) return; + const contentBottom = content.getBoundingClientRect().bottom; + setFits(contentBottom < indicatorRect.top); + }; + + check(); + window.addEventListener("resize", check, { passive: true }); + return () => window.removeEventListener("resize", check); + }, []); + + useEffect(() => { + const onScroll = () => { + setScrolled(window.scrollY > 32); + }; + + window.addEventListener("scroll", onScroll, { passive: true }); + return () => window.removeEventListener("scroll", onScroll); + }, []); + + return ( +
+
+ ); +} diff --git a/docs/src/components/sofa-logo.tsx b/docs/src/components/sofa-logo.tsx new file mode 100644 index 0000000..0e0dde4 --- /dev/null +++ b/docs/src/components/sofa-logo.tsx @@ -0,0 +1,20 @@ +export function SofaLogo({ className }: { className?: string }) { + return ( + + + + + ); +} diff --git a/docs/src/components/tmdb-logo.tsx b/docs/src/components/tmdb-logo.tsx new file mode 100644 index 0000000..5703a61 --- /dev/null +++ b/docs/src/components/tmdb-logo.tsx @@ -0,0 +1,29 @@ +export function TmdbLogo({ className }: { className?: string }) { + return ( + + + + + + + + + + + ); +} diff --git a/docs/src/lib/cn.ts b/docs/src/lib/cn.ts new file mode 100644 index 0000000..8e473da --- /dev/null +++ b/docs/src/lib/cn.ts @@ -0,0 +1 @@ +export { twMerge as cn } from "tailwind-merge"; diff --git a/docs/src/lib/layout.shared.tsx b/docs/src/lib/layout.shared.tsx new file mode 100644 index 0000000..822286b --- /dev/null +++ b/docs/src/lib/layout.shared.tsx @@ -0,0 +1,25 @@ +import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared"; +import { SofaLogo } from "@/components/sofa-logo"; + +export const gitConfig = { + user: "jakejarvis", + repo: "sofa", + branch: "main", +}; + +export function baseOptions(): BaseLayoutProps { + return { + nav: { + title: ( + <> + + Sofa + + ), + transparentMode: "top", + }, + links: [{ text: "Docs", url: "/docs" }], + githubUrl: "https://github.com/jakejarvis/sofa", + themeSwitch: { enabled: false }, + }; +} diff --git a/docs/src/lib/source.ts b/docs/src/lib/source.ts new file mode 100644 index 0000000..7e01aba --- /dev/null +++ b/docs/src/lib/source.ts @@ -0,0 +1,27 @@ +import { docs } from "collections/server"; +import { type InferPageType, loader } from "fumadocs-core/source"; +import { lucideIconsPlugin } from "fumadocs-core/source/lucide-icons"; + +// See https://fumadocs.dev/docs/headless/source-api for more info +export const source = loader({ + baseUrl: "/docs", + source: docs.toFumadocsSource(), + plugins: [lucideIconsPlugin()], +}); + +export function getPageImage(page: InferPageType) { + const segments = [...page.slugs, "image.webp"]; + + return { + segments, + url: `/og/docs/${segments.join("/")}`, + }; +} + +export async function getLLMText(page: InferPageType) { + const processed = await page.data.getText("processed"); + + return `# ${page.data.title} + +${processed}`; +} diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 0000000..29529ab --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "target": "ESNext", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "paths": { + "@/*": ["./src/*"], + "collections/*": [".source/*"] + }, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": ["node_modules"] +}

+ Create a free account at{" "} + + themoviedb.org + + +